You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@servicecomb.apache.org by zh...@apache.org on 2022/04/02 17:20:15 UTC

[servicecomb-pack] branch SCB-2425 created (now 5d2fe2c)

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

zhanglei pushed a change to branch SCB-2425
in repository https://gitbox.apache.org/repos/asf/servicecomb-pack.git.


      at 5d2fe2c  Rename module alpha-spec-saga-fsm to alpha-spec-saga-akka

This branch includes the following new commits:

     new 7d51b15  Refactoring the Alpha module using Spring SPI
     new 5d2fe2c  Rename module alpha-spec-saga-fsm to alpha-spec-saga-akka

The 2 revisions listed above as "new" are entirely new to this
repository and will be described in separate emails.  The revisions
listed as "add" were already present in the repository and have only
been added to this reference.


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

Posted by zh...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

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

commit 7d51b1540d3a8c7093274958c2bcac96b1e10459
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 59453b2..88e9066 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 8faed9a..e48816b 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>
@@ -52,29 +52,6 @@
             <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>
                   <run>
@@ -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 2f7c861..ce15e97 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 4869e18..54c0d39 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 c425582..9d25566 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 4b03b15..3b3e2dc 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 2e7c5d5..b8b3151 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 09c6182..e7b360c 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 e29b90c..0f2ca47 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 617a6af..7162cef 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 bff689d..bf8b33f 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 67ebcc5..4dfc72a 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 1622f13..4c44483
--- 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 aeef923..0000000
--- 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 7ad7878..0000000
--- 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 e4d8ea5..64868cc 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 9b86862..663a56a 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>
@@ -91,15 +99,6 @@
       <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>
     </dependency>
@@ -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 57302aa..7ef7686 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 40b010b..059a596 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 523783f..0799426 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 5e05e2d..6ec5a72 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 49966bc..484bf7a 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 454f6df..2f4e8d6 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 da3e6e7..53b1326 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 9644b76..00f5eb2 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 09c1c9e..19ecc43 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 9aada8a..49203d4 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 c0106e8..dfed27b 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 61661cd..10dfbbb 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 abd0f5f..45d6cc6 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 4d66ff7..a275a54 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 514565c..10b025f 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 b768de2..c07756e 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 a9f2e98..992d939 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 add543d..45613c8 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 e1c6e11..44e2ab7 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 cea33d8..393ec4e 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 617a6af..81a8970 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 0000000..1ecb1ba
--- /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 60fd28b..7eb5d94 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 97b7b61..45e0f48 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 8263de5..4141d3d 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 339321a..7f347ae 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 649ebb0..f16275d 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 f35c386..389998d 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 5569d36..9f32890 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 6e84383..fbad266 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 1584952..0f034ec 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 67ebcc5..c28ed0e 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 edd7b78..eed744b 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 a81f3a2..4933586 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 20e1afe..9d199ca 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 1622f13..39621f2 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 3a15a59..038140c 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 ab386b8..a40036b 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 1bd6aa1..56461e1 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 e7302d4..faf63ec 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 35d53ed..4079245 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 43cf0f7..931110c 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 c160d83..a8d6f92 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 bb47b8c..af59421 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 f66826d..cae39ea 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 4a88890..5689915 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 aa085fc..a6ced13 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 a4a0a6a..98e3b45 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 021cbae..cdb0922 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 7f691ab..603a2bf 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 ff42cdd..4ad6b20 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 afd041b..64a4e0c 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 60bbb59..e2e5abf 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 0000000..aa15af2
--- /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 5ecd7e4..97da312 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 -->
@@ -53,6 +53,10 @@
     <!-- 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>
     </dependency>
     <dependency>
@@ -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 0000000..d4ca777
--- /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 188cc16..cdaf29e 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 dcc7eea..9f27f95 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 e4d25b9..82552d0 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 5d0d6d8..6298cbe 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 396e708..a6dd52e 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 edd7b78..8a03086 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 d5222b5..dfdd744 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 f463f16..1e30415 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 a441749..8a2c82a 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 87f5237..9d72b94 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 20abdec..e023bb0 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 3bc8cb4..7d15967 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 f19e768..b9cb31e 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 0abca9d..9cbe70b 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 af7195a..a60a438 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 4a88890..1896980 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 92e873d..3295d67 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 1622f13..2f76334
--- 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 b6bbaeb..157e348 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 aa085fc..3afd653 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 188cc16..317356f 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 188cc16..7b235a8 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 021cbae..dc327e4 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 0dc7593..2b5eea3 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 9e1f0c7..1c9e242 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 566694d..31c12a5 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 62e6fb3..b91c27a 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 44113e1..a430355 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 f18c6a5..e43b611 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 7c14000..52cb449 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 a94760b..3d53fc0 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 8b3a7e4..76745f9 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 bb9b3b5..887f487 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 0000000..1d5dc6b
--- /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 2ffb16a..c647dd6 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 4437da8..4a99444 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 1f0d792..48d4c69 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 8bffff8..865b1f4 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 0000000..b2f62eb
--- /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 2c00932..d7330c4 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 67ebcc5..0087b37 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 edd7b78..a2ff755 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 5aaa4f0..88052b2 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 3de4966..c7c8c3f 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 7d57d8e..11b4c9e 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 fb5d37f..6ce604f 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 61a509c..0485a63 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 5bf3362..fcc0e31 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 a248e04..5b303ba 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 3748d3d..6193c65 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 96c8055..9b48af1 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 3dc172d..9d169cf 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 e669c4e..1029050 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 88cd4c1..798ecb0 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 5237838..4cf70e4 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 4b865dc..c5ea380 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 343f0fe..b0e9130 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 4a88890..34fbab4 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 aa085fc..33dbc88 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 021cbae..2943f9a 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 3fadb53..6d69609 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 5841ce9..4697abe 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 5812414..e5e97d4 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 f6478dc..34b85ec 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 f0a8f19..4706e9c 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 238969b..2cfdaae 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 ff42cdd..60803c7 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 c1c8066..76bb504 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 25e18c3..7f13aef 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 5993dab..2c04067 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 69dbf91..68b673a 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 aac174e..c6a96e2 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 028de4e..79818bd 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 bc7da43..baa89d4 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 69dbf91..c4eba6f 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 1261a10..4e9b742 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 214fe12..7f26e75 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 69dbf91..a318676 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 dc2bf58..2b28d76 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 7b64b75..d3b8d34 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 69dbf91..64f6d0b 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 246e951..2e5a8fd 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 021cbae..f9676d7 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 5f54972..704ff8b 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
@@ -88,11 +82,6 @@ class OmegaSpringConfig {
   }
 
   @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){
     return AlphaClusterDiscovery.builder().addresses(addresses).build();
@@ -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 5f54972..4e7b583 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 0138783..f15b668 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 b9f5527..87a4bf2 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 018d08c..6884ba5 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 69dbf91..7f9221d 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 375ae71..0a6bb30 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 69c9f9e..cbac372 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 ba7e04a..6ba6177 100644
--- a/pack-dependencies/pom.xml
+++ b/pack-dependencies/pom.xml
@@ -269,7 +269,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>
@@ -315,7 +330,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 5fba82b..e78f784 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>
 

[servicecomb-pack] 02/02: Rename module alpha-spec-saga-fsm to alpha-spec-saga-akka

Posted by zh...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

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

commit 5d2fe2ce4bd625cc3f57d1037aac08f5c7174988
Author: Lei Zhang <zh...@apache.org>
AuthorDate: Sun Apr 3 01:17:52 2022 +0800

    Rename module alpha-spec-saga-fsm to alpha-spec-saga-akka
---
 alpha/alpha-benchmark/pom.xml                      |   2 +-
 .../jpa/EclipseLinkJpaConfiguration.java           |  54 ++++++++
 alpha/alpha-server/pom.xml                         |   2 +-
 .../src/main/resources/application.yaml            |   3 +
 ...a => AlphaIntegrationWithSpecSagaAkkaTest.java} |   7 +-
 .../README.md                                      |   0
 .../pom.xml                                        |   4 +-
 .../akka/AlphaSpecSagaAkkaAutoConfiguration.java}  |  81 +++++------
 .../saga/akka}/CompensateAckCountDownLatch.java    |   2 +-
 .../alpha/spec/saga/akka}/GrpcOmegaCallback.java   |   2 +-
 .../spec/saga/akka}/GrpcSagaEventService.java      |   2 +-
 .../pack/alpha/spec/saga/akka}/SagaActor.java      |  20 +--
 .../pack/alpha/spec/saga/akka}/SagaActorState.java |   2 +-
 .../spec/saga/akka}/SagaShardRegionActor.java      |   2 +-
 .../saga/akka/api/SagaAkkaAPIv1Controller.java}    |   4 +-
 .../spec/saga/akka/api/SagaAkkaAPIv1Impl.java}     |   6 +-
 .../akka}/channel/AbstractActorEventChannel.java   |   5 +-
 .../saga/akka}/channel/AbstractEventConsumer.java  |   4 +-
 .../akka/channel/kafka/KafkaActorEventChannel.java |  84 +++++++++++
 .../akka}/channel/kafka/KafkaMessagePublisher.java |  17 ++-
 .../channel/kafka/KafkaSagaEventConsumer.java      |  10 +-
 .../channel/memory/MemoryActorEventChannel.java    |   6 +-
 .../channel/memory/MemorySagaEventConsumer.java    |   6 +-
 .../channel/rabbit/RabbitActorEventChannel.java    |   6 +-
 .../rabbit/RabbitChannelAutoConfiguration.java     |   8 +-
 .../akka}/channel/rabbit/RabbitMessageChannel.java |   2 +-
 .../channel/rabbit/RabbitMessagePublisher.java     |   2 +-
 .../channel/rabbit/RabbitSagaEventConsumer.java    |   8 +-
 .../akka}/channel/redis/MessageSerializer.java     |   2 +-
 .../channel/redis/RedisActorEventChannel.java      |   6 +-
 .../redis/RedisChannelAutoConfiguration.java       |   6 +-
 .../akka}/channel/redis/RedisMessagePublisher.java |   2 +-
 .../channel/redis/RedisSagaEventConsumer.java      |   6 +-
 .../spec/saga/akka}/domain/AddTxEventDomain.java   |   2 +-
 .../alpha/spec/saga/akka}/domain/DomainEvent.java  |   2 +-
 .../spec/saga/akka}/domain/SagaEndedDomain.java    |   4 +-
 .../spec/saga/akka}/domain/SagaStartedDomain.java  |   2 +-
 .../saga/akka}/domain/UpdateTxEventDomain.java     |   2 +-
 .../akka}/metrics/AlphaMetricsEndpointImpl.java    |   2 +-
 .../spec/saga/akka}/metrics/MetricsService.java    |   2 +-
 .../pack/alpha/spec/saga/akka}/model/SagaData.java |   4 +-
 .../alpha/spec/saga/akka}/model/TxEntities.java    |   2 +-
 .../pack/alpha/spec/saga/akka}/model/TxEntity.java |   2 +-
 .../akka/properties/ChannelKafkaProperties.java    |  76 ++++++++++
 .../akka}/properties/ChannelMemoryProperties.java  |   2 +-
 .../saga/akka}/properties/ChannelProperties.java   |  12 +-
 .../akka}/properties/ElasticsearchProperties.java  |   2 +-
 .../akka}/properties/RepositoryProperties.java     |   2 +-
 .../akka}/properties/SpecSagaAkkaProperties.java   |   2 +-
 .../AbstractTransactionRepositoryChannel.java      |   4 +-
 .../repository/NoneTransactionRepository.java      |   2 +-
 .../akka}/repository/TransactionRepository.java    |   2 +-
 .../repository/TransactionRepositoryChannel.java   |   2 +-
 .../DefaultTransactionRepositoryChannel.java       |  11 +-
 .../ElasticsearchTransactionRepository.java        |   8 +-
 .../elasticsearch/GlobalTransactionDocument.java   |   2 +-
 .../integration/akka/AkkaClusterListener.java      |   2 +-
 .../akka/AkkaConfigPropertyAdapter.java            |   2 +-
 .../spring/integration/akka/SagaDataExtension.java |  12 +-
 .../integration/akka/SpringAkkaExtension.java      |   6 +-
 .../saga/akka}/test/FsmSagaDataController.java     |   6 +-
 .../src/main/resources/META-INF/spring.factories   |   2 +-
 .../alpha/spec/saga/akka/it/SagaApplication.java   |   0
 .../spec/saga/akka/it/SagaIntegrationTest.java     |  10 +-
 .../alpha/spec/saga/akka/ut/SagaActorTest.java     |  22 +--
 .../spec/saga/akka/ut/api/APIv1ControllerTest.java |  10 +-
 .../spec/saga/akka/ut/api/TestConfiguration.java   |  18 +--
 .../spec/saga/akka/ut/model/TxEntitiesTest.java    |   4 +-
 .../ElasticsearchTransactionRepositoryTest.java    |  10 +-
 .../alpha/spec/saga/akka/util/SagaEventSender.java |   0
 .../src/test/resources/application.yaml            |   0
 .../src/test/resources/log4j2.xml                  |   0
 .../fsm/channel/kafka/KafkaActorEventChannel.java  |  37 -----
 .../kafka/KafkaChannelAutoConfiguration.java       | 153 ---------------------
 .../fsm/properties/ChannelKafkaProperties.java     |  21 ---
 alpha/pom.xml                                      |   2 +-
 .../pack/omega/spring/OmegaSagaSpringConfig.java   |  87 ++++++++++++
 pack-dependencies/pom.xml                          |   2 +-
 78 files changed, 524 insertions(+), 406 deletions(-)

diff --git a/alpha/alpha-benchmark/pom.xml b/alpha/alpha-benchmark/pom.xml
index 7162cef..877745d 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-spec-saga-fsm</artifactId>
+      <artifactId>alpha-spec-saga-akka</artifactId>
       <exclusions>
         <exclusion>
           <artifactId>log4j-slf4j-impl</artifactId>
diff --git a/alpha/alpha-persistence-jpa/src/main/java/org/apache/servicecomb/pack/persistence/jpa/EclipseLinkJpaConfiguration.java b/alpha/alpha-persistence-jpa/src/main/java/org/apache/servicecomb/pack/persistence/jpa/EclipseLinkJpaConfiguration.java
new file mode 100644
index 0000000..572667b
--- /dev/null
+++ b/alpha/alpha-persistence-jpa/src/main/java/org/apache/servicecomb/pack/persistence/jpa/EclipseLinkJpaConfiguration.java
@@ -0,0 +1,54 @@
+/*
+ * 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.persistence.jpa;
+
+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;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.orm.jpa.vendor.AbstractJpaVendorAdapter;
+import org.springframework.orm.jpa.vendor.EclipseLinkJpaVendorAdapter;
+import org.springframework.transaction.jta.JtaTransactionManager;
+
+@Configuration
+public class EclipseLinkJpaConfiguration extends JpaBaseConfiguration {
+
+  EclipseLinkJpaConfiguration(DataSource dataSource,
+      JpaProperties properties,
+      ObjectProvider<JtaTransactionManager> jtaTransactionManagerProvider) {
+    super(dataSource, properties, jtaTransactionManagerProvider);
+  }
+
+  @Override
+  protected AbstractJpaVendorAdapter createJpaVendorAdapter() {
+    return new EclipseLinkJpaVendorAdapter();
+  }
+
+  @Override
+  protected Map<String, Object> getVendorProperties() {
+    Map<String, Object> props = new HashMap<>();
+    props.put("eclipselink.weaving", "false");
+    props.put("eclipselink.logging.logger", "JavaLogger");
+    return props;
+  }
+}
diff --git a/alpha/alpha-server/pom.xml b/alpha/alpha-server/pom.xml
index 663a56a..b194a69 100644
--- a/alpha/alpha-server/pom.xml
+++ b/alpha/alpha-server/pom.xml
@@ -48,7 +48,7 @@
     </dependency>
     <dependency>
       <groupId>org.apache.servicecomb.pack</groupId>
-      <artifactId>alpha-spec-saga-fsm</artifactId>
+      <artifactId>alpha-spec-saga-akka</artifactId>
     </dependency>
     <dependency>
       <groupId>org.apache.servicecomb.pack</groupId>
diff --git a/alpha/alpha-server/src/main/resources/application.yaml b/alpha/alpha-server/src/main/resources/application.yaml
index 059a596..59ed23f 100644
--- a/alpha/alpha-server/src/main/resources/application.yaml
+++ b/alpha/alpha-server/src/main/resources/application.yaml
@@ -33,9 +33,12 @@ alpha:
           kafka:
             topic: servicecomb-pack-actor-event
             bootstrap-servers: 127.0.0.1:9092
+            numPartitions: 6
+            replicationFactor: 1
             consumer:
               group-id: servicecomb-pack
               auto.offset.reset: earliest
+              enable.auto.commit: false
             producer:
               batch-size: 16384
               retries: 0
diff --git a/alpha/alpha-server/src/test/java/org/apache/servicecomb/pack/alpha/spec/saga/akka/AlphaIntegrationFsmTest.java b/alpha/alpha-server/src/test/java/org/apache/servicecomb/pack/alpha/spec/saga/akka/AlphaIntegrationWithSpecSagaAkkaTest.java
similarity index 99%
rename from alpha/alpha-server/src/test/java/org/apache/servicecomb/pack/alpha/spec/saga/akka/AlphaIntegrationFsmTest.java
rename to alpha/alpha-server/src/test/java/org/apache/servicecomb/pack/alpha/spec/saga/akka/AlphaIntegrationWithSpecSagaAkkaTest.java
index 484bf7a..e56714a 100644
--- a/alpha/alpha-server/src/test/java/org/apache/servicecomb/pack/alpha/spec/saga/akka/AlphaIntegrationFsmTest.java
+++ b/alpha/alpha-server/src/test/java/org/apache/servicecomb/pack/alpha/spec/saga/akka/AlphaIntegrationWithSpecSagaAkkaTest.java
@@ -31,9 +31,8 @@ import java.util.Map;
 import java.util.UUID;
 import org.apache.servicecomb.pack.alpha.core.OmegaCallback;
 import org.apache.servicecomb.pack.alpha.core.fsm.TxState;
-import org.apache.servicecomb.pack.alpha.fsm.SagaActorState;
-import org.apache.servicecomb.pack.alpha.fsm.model.SagaData;
-import org.apache.servicecomb.pack.alpha.fsm.spring.integration.akka.SagaDataExtension;
+import org.apache.servicecomb.pack.alpha.spec.saga.akka.model.SagaData;
+import org.apache.servicecomb.pack.alpha.spec.saga.akka.spring.integration.akka.SagaDataExtension;
 import org.apache.servicecomb.pack.alpha.server.AlphaApplication;
 import org.apache.servicecomb.pack.alpha.server.AlphaConfig;
 import org.apache.servicecomb.pack.common.AlphaMetaKeys;
@@ -71,7 +70,7 @@ import org.springframework.test.context.junit4.SpringRunner;
         "akkaConfig.akka.persistence.snapshot-store.plugin=akka.persistence.snapshot-store.local",
         "akkaConfig.akka.persistence.snapshot-store.local.dir=target/example/snapshots"
        })
-public class AlphaIntegrationFsmTest {
+public class AlphaIntegrationWithSpecSagaAkkaTest {
   private static final OmegaEventSender omegaEventSender = OmegaEventSender.builder().build();
   private static final int port = 8090;
 
diff --git a/alpha/alpha-spec-saga-fsm/README.md b/alpha/alpha-spec-saga-akka/README.md
similarity index 100%
rename from alpha/alpha-spec-saga-fsm/README.md
rename to alpha/alpha-spec-saga-akka/README.md
diff --git a/alpha/alpha-spec-saga-fsm/pom.xml b/alpha/alpha-spec-saga-akka/pom.xml
similarity index 98%
rename from alpha/alpha-spec-saga-fsm/pom.xml
rename to alpha/alpha-spec-saga-akka/pom.xml
index 97da312..a7617b9 100644
--- a/alpha/alpha-spec-saga-fsm/pom.xml
+++ b/alpha/alpha-spec-saga-akka/pom.xml
@@ -26,8 +26,8 @@
   </parent>
   <modelVersion>4.0.0</modelVersion>
 
-  <artifactId>alpha-spec-saga-fsm</artifactId>
-  <name>Pack::Alpha::Specification::Saga::FSM</name>
+  <artifactId>alpha-spec-saga-akka</artifactId>
+  <name>Pack::Alpha::Specification::Saga::Akka</name>
 
   <dependencies>
     <!-- spring boot -->
diff --git a/alpha/alpha-spec-saga-fsm/src/main/java/org/apache/servicecomb/pack/alpha/fsm/AlphaSpecSagaFsmAutoConfiguration.java b/alpha/alpha-spec-saga-akka/src/main/java/org/apache/servicecomb/pack/alpha/spec/saga/akka/AlphaSpecSagaAkkaAutoConfiguration.java
similarity index 66%
rename from alpha/alpha-spec-saga-fsm/src/main/java/org/apache/servicecomb/pack/alpha/fsm/AlphaSpecSagaFsmAutoConfiguration.java
rename to alpha/alpha-spec-saga-akka/src/main/java/org/apache/servicecomb/pack/alpha/spec/saga/akka/AlphaSpecSagaAkkaAutoConfiguration.java
index d4ca777..d02f7d8 100644
--- a/alpha/alpha-spec-saga-fsm/src/main/java/org/apache/servicecomb/pack/alpha/fsm/AlphaSpecSagaFsmAutoConfiguration.java
+++ b/alpha/alpha-spec-saga-akka/src/main/java/org/apache/servicecomb/pack/alpha/spec/saga/akka/AlphaSpecSagaAkkaAutoConfiguration.java
@@ -15,10 +15,7 @@
  * 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;
+package org.apache.servicecomb.pack.alpha.spec.saga.akka;
 
 import akka.actor.ActorRef;
 import akka.actor.ActorSystem;
@@ -32,21 +29,25 @@ 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.alpha.spec.saga.akka.api.SagaAkkaAPIv1Controller;
+import org.apache.servicecomb.pack.alpha.spec.saga.akka.api.SagaAkkaAPIv1Impl;
+import org.apache.servicecomb.pack.alpha.spec.saga.akka.channel.AbstractEventConsumer;
+import org.apache.servicecomb.pack.alpha.spec.saga.akka.channel.kafka.KafkaActorEventChannel;
+import org.apache.servicecomb.pack.alpha.spec.saga.akka.channel.kafka.KafkaSagaEventConsumer;
+import org.apache.servicecomb.pack.alpha.spec.saga.akka.channel.memory.MemoryActorEventChannel;
+import org.apache.servicecomb.pack.alpha.spec.saga.akka.channel.memory.MemorySagaEventConsumer;
+import org.apache.servicecomb.pack.alpha.spec.saga.akka.metrics.AlphaMetricsEndpointImpl;
+import org.apache.servicecomb.pack.alpha.spec.saga.akka.metrics.MetricsService;
+import org.apache.servicecomb.pack.alpha.spec.saga.akka.properties.SpecSagaAkkaProperties;
+import org.apache.servicecomb.pack.alpha.spec.saga.akka.repository.NoneTransactionRepository;
+import org.apache.servicecomb.pack.alpha.spec.saga.akka.repository.TransactionRepository;
+import org.apache.servicecomb.pack.alpha.spec.saga.akka.repository.TransactionRepositoryChannel;
+import org.apache.servicecomb.pack.alpha.spec.saga.akka.repository.channel.DefaultTransactionRepositoryChannel;
+import org.apache.servicecomb.pack.alpha.spec.saga.akka.repository.elasticsearch.ElasticsearchTransactionRepository;
+import org.apache.servicecomb.pack.alpha.spec.saga.akka.spring.integration.akka.AkkaConfigPropertyAdapter;
+import org.apache.servicecomb.pack.alpha.spec.saga.akka.spring.integration.akka.SagaDataExtension;
+import org.apache.servicecomb.pack.alpha.spec.saga.akka.spring.integration.akka.SpringAkkaExtension;
+import org.apache.servicecomb.pack.alpha.spec.saga.akka.test.FsmSagaDataController;
 import org.apache.servicecomb.pack.common.AlphaMetaKeys;
 import org.apache.servicecomb.pack.contract.grpc.ServerMeta;
 import org.elasticsearch.client.RestClient;
@@ -57,7 +58,6 @@ 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;
@@ -68,11 +68,11 @@ import org.springframework.data.elasticsearch.core.ElasticsearchRestTemplate;
 @Configuration
 @ImportAutoConfiguration({SpecSagaAkkaProperties.class})
 @ConditionalOnExpression("'${alpha.spec.names}'.contains('saga-akka')")
-public class AlphaSpecSagaFsmAutoConfiguration {
+public class AlphaSpecSagaAkkaAutoConfiguration {
 
   private static final Logger LOG = LoggerFactory.getLogger(MethodHandles.lookup().lookupClass());
 
-  public AlphaSpecSagaFsmAutoConfiguration() {
+  public AlphaSpecSagaAkkaAutoConfiguration() {
     System.setProperty("es.set.netty.runtime.available.processors", "false");
     LOG.info("Alpha Specification Saga Akka");
   }
@@ -89,9 +89,10 @@ public class AlphaSpecSagaFsmAutoConfiguration {
     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);
+    SpringAkkaExtension.SPRING_EXTENSION_PROVIDER.get(system).initialize(applicationContext);
+    SagaDataExtension.SAGA_DATA_EXTENSION_PROVIDER.get(system)
+        .setRepositoryChannel(repositoryChannel);
+    SagaDataExtension.SAGA_DATA_EXTENSION_PROVIDER.get(system).setMetricsService(metricsService);
     return system;
   }
 
@@ -141,12 +142,10 @@ public class AlphaSpecSagaFsmAutoConfiguration {
   }
 
   @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());
+    if (specSagaAkkaProperties.getChannel().getName().equals("kafka")) {
+      return new KafkaActorEventChannel(specSagaAkkaProperties, metricsService);
     } else {
       return new MemoryActorEventChannel(metricsService,
           specSagaAkkaProperties.getChannel().getMemory().getMaxLength());
@@ -159,9 +158,12 @@ public class AlphaSpecSagaFsmAutoConfiguration {
       @Qualifier("sagaShardRegionActor") ActorRef sagaShardRegionActor,
       MetricsService metricsService,
       ActorEventChannel actorEventChannel) {
-    if (specSagaAkkaProperties.getChannel().getName().equals("memory")) {
-      return new MemorySagaEventConsumer(actorSystem, sagaShardRegionActor, metricsService,
-          (MemoryActorEventChannel) actorEventChannel);
+    if (specSagaAkkaProperties.getChannel().getName().equals("kafka")) {
+      return new KafkaSagaEventConsumer(actorSystem,
+          sagaShardRegionActor, metricsService,
+          specSagaAkkaProperties.getChannel().getKafka().getBootstrapServers(),
+          specSagaAkkaProperties.getChannel().getKafka().getTopic(),
+          specSagaAkkaProperties.getChannel().getKafka().getConsumer());
     } else {
       return new MemorySagaEventConsumer(actorSystem, sagaShardRegionActor, metricsService,
           (MemoryActorEventChannel) actorEventChannel);
@@ -169,30 +171,31 @@ public class AlphaSpecSagaFsmAutoConfiguration {
   }
 
   @Bean
-  GrpcSagaEventService grpcSagaEventService(ActorEventChannel actorEventChannel, Map<String, Map<String, OmegaCallback>> omegaCallbacks){
+  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();
+  SagaAkkaAPIv1Impl apIv1() {
+    return new SagaAkkaAPIv1Impl();
   }
 
   @Bean
-  APIv1Controller apIv1Controller(){
-    return new APIv1Controller();
+  SagaAkkaAPIv1Controller apIv1Controller() {
+    return new SagaAkkaAPIv1Controller();
   }
 
   @Bean
-  AlphaMetricsEndpoint alphaMetricsEndpoint(){
+  AlphaMetricsEndpoint alphaMetricsEndpoint() {
     return new AlphaMetricsEndpointImpl();
   }
 
   @Bean
   @Profile("test")
-  FsmSagaDataController fsmSagaDataController(){
+  FsmSagaDataController fsmSagaDataController() {
     return new FsmSagaDataController();
   }
 }
diff --git a/alpha/alpha-spec-saga-fsm/src/main/java/org/apache/servicecomb/pack/alpha/fsm/CompensateAckCountDownLatch.java b/alpha/alpha-spec-saga-akka/src/main/java/org/apache/servicecomb/pack/alpha/spec/saga/akka/CompensateAckCountDownLatch.java
similarity index 95%
rename from alpha/alpha-spec-saga-fsm/src/main/java/org/apache/servicecomb/pack/alpha/fsm/CompensateAckCountDownLatch.java
rename to alpha/alpha-spec-saga-akka/src/main/java/org/apache/servicecomb/pack/alpha/spec/saga/akka/CompensateAckCountDownLatch.java
index cdaf29e..87da93c 100644
--- a/alpha/alpha-spec-saga-fsm/src/main/java/org/apache/servicecomb/pack/alpha/fsm/CompensateAckCountDownLatch.java
+++ b/alpha/alpha-spec-saga-akka/src/main/java/org/apache/servicecomb/pack/alpha/spec/saga/akka/CompensateAckCountDownLatch.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;
 
 import java.util.concurrent.CountDownLatch;
 import org.apache.servicecomb.pack.alpha.core.fsm.CompensateAckType;
diff --git a/alpha/alpha-spec-saga-fsm/src/main/java/org/apache/servicecomb/pack/alpha/fsm/GrpcOmegaCallback.java b/alpha/alpha-spec-saga-akka/src/main/java/org/apache/servicecomb/pack/alpha/spec/saga/akka/GrpcOmegaCallback.java
similarity index 98%
rename from alpha/alpha-spec-saga-fsm/src/main/java/org/apache/servicecomb/pack/alpha/fsm/GrpcOmegaCallback.java
rename to alpha/alpha-spec-saga-akka/src/main/java/org/apache/servicecomb/pack/alpha/spec/saga/akka/GrpcOmegaCallback.java
index 9f27f95..d21d333 100644
--- a/alpha/alpha-spec-saga-fsm/src/main/java/org/apache/servicecomb/pack/alpha/fsm/GrpcOmegaCallback.java
+++ b/alpha/alpha-spec-saga-akka/src/main/java/org/apache/servicecomb/pack/alpha/spec/saga/akka/GrpcOmegaCallback.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;
 
 import com.google.protobuf.ByteString;
 import io.grpc.stub.StreamObserver;
diff --git a/alpha/alpha-spec-saga-fsm/src/main/java/org/apache/servicecomb/pack/alpha/fsm/GrpcSagaEventService.java b/alpha/alpha-spec-saga-akka/src/main/java/org/apache/servicecomb/pack/alpha/spec/saga/akka/GrpcSagaEventService.java
similarity index 99%
rename from alpha/alpha-spec-saga-fsm/src/main/java/org/apache/servicecomb/pack/alpha/fsm/GrpcSagaEventService.java
rename to alpha/alpha-spec-saga-akka/src/main/java/org/apache/servicecomb/pack/alpha/spec/saga/akka/GrpcSagaEventService.java
index 82552d0..21ddf0a 100644
--- a/alpha/alpha-spec-saga-fsm/src/main/java/org/apache/servicecomb/pack/alpha/fsm/GrpcSagaEventService.java
+++ b/alpha/alpha-spec-saga-akka/src/main/java/org/apache/servicecomb/pack/alpha/spec/saga/akka/GrpcSagaEventService.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;
 
 import static java.util.Collections.emptyMap;
 
diff --git a/alpha/alpha-spec-saga-fsm/src/main/java/org/apache/servicecomb/pack/alpha/fsm/SagaActor.java b/alpha/alpha-spec-saga-akka/src/main/java/org/apache/servicecomb/pack/alpha/spec/saga/akka/SagaActor.java
similarity index 97%
rename from alpha/alpha-spec-saga-fsm/src/main/java/org/apache/servicecomb/pack/alpha/fsm/SagaActor.java
rename to alpha/alpha-spec-saga-akka/src/main/java/org/apache/servicecomb/pack/alpha/spec/saga/akka/SagaActor.java
index 9033683..124d205 100644
--- a/alpha/alpha-spec-saga-fsm/src/main/java/org/apache/servicecomb/pack/alpha/fsm/SagaActor.java
+++ b/alpha/alpha-spec-saga-akka/src/main/java/org/apache/servicecomb/pack/alpha/spec/saga/akka/SagaActor.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;
 
 import akka.actor.PoisonPill;
 import akka.actor.Props;
@@ -44,15 +44,15 @@ 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.fsm.event.internal.CompensateAckTimeoutEvent;
 import org.apache.servicecomb.pack.alpha.core.fsm.event.internal.ComponsitedCheckEvent;
-import org.apache.servicecomb.pack.alpha.fsm.domain.AddTxEventDomain;
-import org.apache.servicecomb.pack.alpha.fsm.domain.DomainEvent;
-import org.apache.servicecomb.pack.alpha.fsm.domain.SagaEndedDomain;
-import org.apache.servicecomb.pack.alpha.fsm.domain.SagaStartedDomain;
-import org.apache.servicecomb.pack.alpha.fsm.domain.UpdateTxEventDomain;
-import org.apache.servicecomb.pack.alpha.fsm.model.SagaData;
-import org.apache.servicecomb.pack.alpha.fsm.model.TxEntity;
-import org.apache.servicecomb.pack.alpha.fsm.spring.integration.akka.SagaDataExtension;
-import org.apache.servicecomb.pack.alpha.fsm.spring.integration.akka.SpringAkkaExtension;
+import org.apache.servicecomb.pack.alpha.spec.saga.akka.domain.AddTxEventDomain;
+import org.apache.servicecomb.pack.alpha.spec.saga.akka.domain.DomainEvent;
+import org.apache.servicecomb.pack.alpha.spec.saga.akka.domain.SagaEndedDomain;
+import org.apache.servicecomb.pack.alpha.spec.saga.akka.domain.SagaStartedDomain;
+import org.apache.servicecomb.pack.alpha.spec.saga.akka.domain.UpdateTxEventDomain;
+import org.apache.servicecomb.pack.alpha.spec.saga.akka.model.SagaData;
+import org.apache.servicecomb.pack.alpha.spec.saga.akka.model.TxEntity;
+import org.apache.servicecomb.pack.alpha.spec.saga.akka.spring.integration.akka.SagaDataExtension;
+import org.apache.servicecomb.pack.alpha.spec.saga.akka.spring.integration.akka.SpringAkkaExtension;
 import org.apache.servicecomb.pack.common.Environment;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
diff --git a/alpha/alpha-spec-saga-fsm/src/main/java/org/apache/servicecomb/pack/alpha/fsm/SagaActorState.java b/alpha/alpha-spec-saga-akka/src/main/java/org/apache/servicecomb/pack/alpha/spec/saga/akka/SagaActorState.java
similarity index 94%
rename from alpha/alpha-spec-saga-fsm/src/main/java/org/apache/servicecomb/pack/alpha/fsm/SagaActorState.java
rename to alpha/alpha-spec-saga-akka/src/main/java/org/apache/servicecomb/pack/alpha/spec/saga/akka/SagaActorState.java
index 7c7c6ad..7082761 100644
--- a/alpha/alpha-spec-saga-fsm/src/main/java/org/apache/servicecomb/pack/alpha/fsm/SagaActorState.java
+++ b/alpha/alpha-spec-saga-akka/src/main/java/org/apache/servicecomb/pack/alpha/spec/saga/akka/SagaActorState.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;
 
 import akka.persistence.fsm.PersistentFSM;
 
diff --git a/alpha/alpha-spec-saga-fsm/src/main/java/org/apache/servicecomb/pack/alpha/fsm/SagaShardRegionActor.java b/alpha/alpha-spec-saga-akka/src/main/java/org/apache/servicecomb/pack/alpha/spec/saga/akka/SagaShardRegionActor.java
similarity index 98%
rename from alpha/alpha-spec-saga-fsm/src/main/java/org/apache/servicecomb/pack/alpha/fsm/SagaShardRegionActor.java
rename to alpha/alpha-spec-saga-akka/src/main/java/org/apache/servicecomb/pack/alpha/spec/saga/akka/SagaShardRegionActor.java
index 6298cbe..03886da 100644
--- a/alpha/alpha-spec-saga-fsm/src/main/java/org/apache/servicecomb/pack/alpha/fsm/SagaShardRegionActor.java
+++ b/alpha/alpha-spec-saga-akka/src/main/java/org/apache/servicecomb/pack/alpha/spec/saga/akka/SagaShardRegionActor.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;
 
 import akka.actor.AbstractActor;
 import akka.actor.ActorRef;
diff --git a/alpha/alpha-spec-saga-fsm/src/main/java/org/apache/servicecomb/pack/alpha/fsm/api/APIv1Controller.java b/alpha/alpha-spec-saga-akka/src/main/java/org/apache/servicecomb/pack/alpha/spec/saga/akka/api/SagaAkkaAPIv1Controller.java
similarity index 96%
rename from alpha/alpha-spec-saga-fsm/src/main/java/org/apache/servicecomb/pack/alpha/fsm/api/APIv1Controller.java
rename to alpha/alpha-spec-saga-akka/src/main/java/org/apache/servicecomb/pack/alpha/spec/saga/akka/api/SagaAkkaAPIv1Controller.java
index a6dd52e..30a8dfd 100644
--- a/alpha/alpha-spec-saga-fsm/src/main/java/org/apache/servicecomb/pack/alpha/fsm/api/APIv1Controller.java
+++ b/alpha/alpha-spec-saga-akka/src/main/java/org/apache/servicecomb/pack/alpha/spec/saga/akka/api/SagaAkkaAPIv1Controller.java
@@ -15,7 +15,7 @@
  * limitations under the License.
  */
 
-package org.apache.servicecomb.pack.alpha.fsm.api;
+package org.apache.servicecomb.pack.alpha.spec.saga.akka.api;
 
 import java.util.List;
 import java.util.Map;
@@ -31,7 +31,7 @@ import org.springframework.web.bind.annotation.RequestMapping;
 import org.springframework.web.bind.annotation.RequestParam;
 
 @RequestMapping("/alpha/api/v1")
-public class APIv1Controller {
+public class SagaAkkaAPIv1Controller {
 
   @Autowired
   APIv1 apIv1;
diff --git a/alpha/alpha-spec-saga-fsm/src/main/java/org/apache/servicecomb/pack/alpha/fsm/api/APIv1Impl.java b/alpha/alpha-spec-saga-akka/src/main/java/org/apache/servicecomb/pack/alpha/spec/saga/akka/api/SagaAkkaAPIv1Impl.java
similarity index 92%
rename from alpha/alpha-spec-saga-fsm/src/main/java/org/apache/servicecomb/pack/alpha/fsm/api/APIv1Impl.java
rename to alpha/alpha-spec-saga-akka/src/main/java/org/apache/servicecomb/pack/alpha/spec/saga/akka/api/SagaAkkaAPIv1Impl.java
index 8a03086..2124289 100644
--- a/alpha/alpha-spec-saga-fsm/src/main/java/org/apache/servicecomb/pack/alpha/fsm/api/APIv1Impl.java
+++ b/alpha/alpha-spec-saga-akka/src/main/java/org/apache/servicecomb/pack/alpha/spec/saga/akka/api/SagaAkkaAPIv1Impl.java
@@ -15,7 +15,7 @@
  * limitations under the License.
  */
 
-package org.apache.servicecomb.pack.alpha.fsm.api;
+package org.apache.servicecomb.pack.alpha.spec.saga.akka.api;
 
 import java.util.List;
 import java.util.Map;
@@ -24,10 +24,10 @@ import org.apache.servicecomb.pack.alpha.core.fsm.repository.model.GlobalTransac
 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.spec.saga.akka.repository.TransactionRepository;
 import org.springframework.beans.factory.annotation.Autowired;
 
-public class APIv1Impl implements APIv1 {
+public class SagaAkkaAPIv1Impl implements APIv1 {
 
   @Autowired
   AlphaMetricsEndpoint alphaMetricsEndpoint;
diff --git a/alpha/alpha-spec-saga-fsm/src/main/java/org/apache/servicecomb/pack/alpha/fsm/channel/AbstractActorEventChannel.java b/alpha/alpha-spec-saga-akka/src/main/java/org/apache/servicecomb/pack/alpha/spec/saga/akka/channel/AbstractActorEventChannel.java
similarity index 90%
rename from alpha/alpha-spec-saga-fsm/src/main/java/org/apache/servicecomb/pack/alpha/fsm/channel/AbstractActorEventChannel.java
rename to alpha/alpha-spec-saga-akka/src/main/java/org/apache/servicecomb/pack/alpha/spec/saga/akka/channel/AbstractActorEventChannel.java
index 61bbde5..be1df18 100644
--- a/alpha/alpha-spec-saga-fsm/src/main/java/org/apache/servicecomb/pack/alpha/fsm/channel/AbstractActorEventChannel.java
+++ b/alpha/alpha-spec-saga-akka/src/main/java/org/apache/servicecomb/pack/alpha/spec/saga/akka/channel/AbstractActorEventChannel.java
@@ -15,12 +15,11 @@
  * limitations under the License.
  */
 
-package org.apache.servicecomb.pack.alpha.fsm.channel;
+package org.apache.servicecomb.pack.alpha.spec.saga.akka.channel;
 
 import org.apache.servicecomb.pack.alpha.core.fsm.channel.ActorEventChannel;
 import org.apache.servicecomb.pack.alpha.core.fsm.event.base.BaseEvent;
-import org.apache.servicecomb.pack.alpha.fsm.metrics.MetricsService;
-import org.apache.servicecomb.pack.alpha.core.fsm.sink.ActorEventSink;
+import org.apache.servicecomb.pack.alpha.spec.saga.akka.metrics.MetricsService;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
diff --git a/alpha/alpha-spec-saga-fsm/src/main/java/org/apache/servicecomb/pack/alpha/fsm/channel/AbstractEventConsumer.java b/alpha/alpha-spec-saga-akka/src/main/java/org/apache/servicecomb/pack/alpha/spec/saga/akka/channel/AbstractEventConsumer.java
similarity index 78%
rename from alpha/alpha-spec-saga-fsm/src/main/java/org/apache/servicecomb/pack/alpha/fsm/channel/AbstractEventConsumer.java
rename to alpha/alpha-spec-saga-akka/src/main/java/org/apache/servicecomb/pack/alpha/spec/saga/akka/channel/AbstractEventConsumer.java
index 6869add..2e13b50 100644
--- a/alpha/alpha-spec-saga-fsm/src/main/java/org/apache/servicecomb/pack/alpha/fsm/channel/AbstractEventConsumer.java
+++ b/alpha/alpha-spec-saga-akka/src/main/java/org/apache/servicecomb/pack/alpha/spec/saga/akka/channel/AbstractEventConsumer.java
@@ -1,8 +1,8 @@
-package org.apache.servicecomb.pack.alpha.fsm.channel;
+package org.apache.servicecomb.pack.alpha.spec.saga.akka.channel;
 
 import akka.actor.ActorRef;
 import akka.actor.ActorSystem;
-import org.apache.servicecomb.pack.alpha.fsm.metrics.MetricsService;
+import org.apache.servicecomb.pack.alpha.spec.saga.akka.metrics.MetricsService;
 
 public abstract class AbstractEventConsumer {
 
diff --git a/alpha/alpha-spec-saga-akka/src/main/java/org/apache/servicecomb/pack/alpha/spec/saga/akka/channel/kafka/KafkaActorEventChannel.java b/alpha/alpha-spec-saga-akka/src/main/java/org/apache/servicecomb/pack/alpha/spec/saga/akka/channel/kafka/KafkaActorEventChannel.java
new file mode 100644
index 0000000..3916a0b
--- /dev/null
+++ b/alpha/alpha-spec-saga-akka/src/main/java/org/apache/servicecomb/pack/alpha/spec/saga/akka/channel/kafka/KafkaActorEventChannel.java
@@ -0,0 +1,84 @@
+/*
+ * 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.channel.kafka;
+
+import akka.actor.ActorRef;
+import akka.actor.ActorSystem;
+import java.lang.invoke.MethodHandles;
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.Map;
+import java.util.concurrent.ExecutionException;
+import org.apache.kafka.clients.admin.AdminClient;
+import org.apache.kafka.clients.admin.CreateTopicsResult;
+import org.apache.kafka.clients.admin.KafkaAdminClient;
+import org.apache.kafka.clients.admin.NewTopic;
+import org.apache.kafka.clients.producer.ProducerConfig;
+import org.apache.kafka.common.errors.TopicExistsException;
+import org.apache.servicecomb.pack.alpha.core.fsm.event.base.BaseEvent;
+import org.apache.servicecomb.pack.alpha.spec.saga.akka.channel.AbstractActorEventChannel;
+import org.apache.servicecomb.pack.alpha.spec.saga.akka.metrics.MetricsService;
+import org.apache.servicecomb.pack.alpha.spec.saga.akka.properties.SpecSagaAkkaProperties;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+public class KafkaActorEventChannel extends AbstractActorEventChannel {
+
+  private static final Logger LOG = LoggerFactory.getLogger(MethodHandles.lookup().lookupClass());
+  private final KafkaMessagePublisher kafkaMessagePublisher;
+
+  public KafkaActorEventChannel(SpecSagaAkkaProperties specSagaAkkaProperties, MetricsService metricsService) {
+    super(metricsService);
+    // init topic
+    Map props = new HashMap<>();
+    props.put(ProducerConfig.BOOTSTRAP_SERVERS_CONFIG,
+        specSagaAkkaProperties.getChannel().getKafka().getBootstrapServers());
+    props.put(ProducerConfig.MAX_BLOCK_MS_CONFIG, 50000);
+    try (final AdminClient adminClient = KafkaAdminClient.create(props)) {
+      try {
+        final NewTopic newTopic = new NewTopic(
+            specSagaAkkaProperties.getChannel().getKafka().getTopic(),
+            specSagaAkkaProperties.getChannel().getKafka().getNumPartitions(),
+            specSagaAkkaProperties.getChannel().getKafka().getReplicationFactor());
+        final CreateTopicsResult createTopicsResult = adminClient
+            .createTopics(Collections.singleton(newTopic));
+        createTopicsResult.values().get(specSagaAkkaProperties.getChannel().getKafka().getTopic())
+            .get();
+      } catch (InterruptedException | ExecutionException e) {
+        if (e.getCause() instanceof InterruptedException) {
+          Thread.currentThread().interrupt();
+        }
+        if (!(e.getCause() instanceof TopicExistsException)) {
+          throw new RuntimeException(e.getMessage(), e);
+        }
+      }
+    }
+
+    // create producer
+    this.kafkaMessagePublisher = new KafkaMessagePublisher(
+        specSagaAkkaProperties.getChannel().getKafka().getBootstrapServers(),
+        specSagaAkkaProperties.getChannel().getKafka().getTopic(),
+        specSagaAkkaProperties.getChannel().getKafka().getProducer());
+    LOG.info("Kafka Channel Init");
+  }
+
+  @Override
+  public void sendTo(BaseEvent event) {
+    kafkaMessagePublisher.publish(event);
+  }
+}
diff --git a/alpha/alpha-spec-saga-fsm/src/main/java/org/apache/servicecomb/pack/alpha/fsm/channel/kafka/KafkaMessagePublisher.java b/alpha/alpha-spec-saga-akka/src/main/java/org/apache/servicecomb/pack/alpha/spec/saga/akka/channel/kafka/KafkaMessagePublisher.java
similarity index 67%
rename from alpha/alpha-spec-saga-fsm/src/main/java/org/apache/servicecomb/pack/alpha/fsm/channel/kafka/KafkaMessagePublisher.java
rename to alpha/alpha-spec-saga-akka/src/main/java/org/apache/servicecomb/pack/alpha/spec/saga/akka/channel/kafka/KafkaMessagePublisher.java
index f156bc2..a5c88d7 100644
--- a/alpha/alpha-spec-saga-fsm/src/main/java/org/apache/servicecomb/pack/alpha/fsm/channel/kafka/KafkaMessagePublisher.java
+++ b/alpha/alpha-spec-saga-akka/src/main/java/org/apache/servicecomb/pack/alpha/spec/saga/akka/channel/kafka/KafkaMessagePublisher.java
@@ -15,14 +15,20 @@
  * limitations under the License.
  */
 
-package org.apache.servicecomb.pack.alpha.fsm.channel.kafka;
+package org.apache.servicecomb.pack.alpha.spec.saga.akka.channel.kafka;
 
+import com.google.common.collect.Maps;
+import java.util.Map;
 import java.util.concurrent.ExecutionException;
+import org.apache.kafka.clients.producer.ProducerConfig;
+import org.apache.kafka.common.serialization.StringSerializer;
 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.kafka.core.DefaultKafkaProducerFactory;
 import org.springframework.kafka.core.KafkaTemplate;
+import org.springframework.kafka.support.serializer.JsonSerializer;
 
 public class KafkaMessagePublisher implements MessagePublisher<BaseEvent> {
 
@@ -31,9 +37,14 @@ public class KafkaMessagePublisher implements MessagePublisher<BaseEvent> {
     private String topic;
     private KafkaTemplate<String, Object> kafkaTemplate;
 
-    public KafkaMessagePublisher(String topic, KafkaTemplate<String, Object> kafkaTemplate) {
+    public KafkaMessagePublisher(String bootstrap_servers, String topic, Map<String,String> producerConfigMap) {
         this.topic = topic;
-        this.kafkaTemplate = kafkaTemplate;
+        Map<String, Object> map = Maps.newHashMap();
+        producerConfigMap.forEach((k, v) -> map.put(k, v));
+        map.put(ProducerConfig.BOOTSTRAP_SERVERS_CONFIG,bootstrap_servers);
+        map.put(ProducerConfig.KEY_SERIALIZER_CLASS_CONFIG, StringSerializer.class);
+        map.put(ProducerConfig.VALUE_SERIALIZER_CLASS_CONFIG, JsonSerializer.class);
+        this.kafkaTemplate = new KafkaTemplate<>(new DefaultKafkaProducerFactory<>(map));
     }
 
     @Override
diff --git a/alpha/alpha-spec-saga-fsm/src/main/java/org/apache/servicecomb/pack/alpha/fsm/channel/kafka/KafkaSagaEventConsumer.java b/alpha/alpha-spec-saga-akka/src/main/java/org/apache/servicecomb/pack/alpha/spec/saga/akka/channel/kafka/KafkaSagaEventConsumer.java
similarity index 92%
rename from alpha/alpha-spec-saga-fsm/src/main/java/org/apache/servicecomb/pack/alpha/fsm/channel/kafka/KafkaSagaEventConsumer.java
rename to alpha/alpha-spec-saga-akka/src/main/java/org/apache/servicecomb/pack/alpha/spec/saga/akka/channel/kafka/KafkaSagaEventConsumer.java
index 8ee2d40..c39d98b 100644
--- a/alpha/alpha-spec-saga-fsm/src/main/java/org/apache/servicecomb/pack/alpha/fsm/channel/kafka/KafkaSagaEventConsumer.java
+++ b/alpha/alpha-spec-saga-akka/src/main/java/org/apache/servicecomb/pack/alpha/spec/saga/akka/channel/kafka/KafkaSagaEventConsumer.java
@@ -15,7 +15,7 @@
  * limitations under the License.
  */
 
-package org.apache.servicecomb.pack.alpha.fsm.channel.kafka;
+package org.apache.servicecomb.pack.alpha.spec.saga.akka.channel.kafka;
 
 import akka.actor.ActorRef;
 import akka.actor.ActorSystem;
@@ -31,14 +31,15 @@ import akka.util.Timeout;
 import com.fasterxml.jackson.databind.ObjectMapper;
 import com.typesafe.config.Config;
 import java.lang.invoke.MethodHandles;
+import java.util.Map;
 import java.util.concurrent.CompletableFuture;
 import java.util.concurrent.CompletionException;
 import java.util.concurrent.CompletionStage;
 import org.apache.kafka.clients.consumer.ConsumerConfig;
 import org.apache.kafka.common.serialization.StringDeserializer;
 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;
+import org.apache.servicecomb.pack.alpha.spec.saga.akka.channel.AbstractEventConsumer;
+import org.apache.servicecomb.pack.alpha.spec.saga.akka.metrics.MetricsService;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import scala.concurrent.Await;
@@ -52,7 +53,7 @@ public class KafkaSagaEventConsumer extends AbstractEventConsumer {
   final ObjectMapper jsonMapper = new ObjectMapper();
 
   public KafkaSagaEventConsumer(ActorSystem actorSystem, ActorRef sagaShardRegionActor,
-      MetricsService metricsService, String bootstrap_servers, String topic) {
+      MetricsService metricsService, String bootstrap_servers, String topic, Map<String,String> consumerConfigMap) {
     super(actorSystem, sagaShardRegionActor, metricsService);
 
 
@@ -68,6 +69,7 @@ public class KafkaSagaEventConsumer extends AbstractEventConsumer {
             .withProperty(ConsumerConfig.AUTO_OFFSET_RESET_CONFIG, "earliest")
             .withProperty(ConsumerConfig.KEY_DESERIALIZER_CLASS_CONFIG, "StringDeserializer.class")
             .withProperty(ConsumerConfig.VALUE_DESERIALIZER_CLASS_CONFIG, "StringDeserializer.class");
+    consumerConfigMap.forEach((k,v) -> consumerSettings.withProperty(k,v));
     Consumer.committableSource(consumerSettings, Subscriptions.topics(topic))
         .mapAsync(20, event -> {
           BaseEvent bean = jsonMapper.readValue(event.record().value(), BaseEvent.class);
diff --git a/alpha/alpha-spec-saga-fsm/src/main/java/org/apache/servicecomb/pack/alpha/fsm/channel/memory/MemoryActorEventChannel.java b/alpha/alpha-spec-saga-akka/src/main/java/org/apache/servicecomb/pack/alpha/spec/saga/akka/channel/memory/MemoryActorEventChannel.java
similarity index 87%
rename from alpha/alpha-spec-saga-fsm/src/main/java/org/apache/servicecomb/pack/alpha/fsm/channel/memory/MemoryActorEventChannel.java
rename to alpha/alpha-spec-saga-akka/src/main/java/org/apache/servicecomb/pack/alpha/spec/saga/akka/channel/memory/MemoryActorEventChannel.java
index dfdd744..519465c 100644
--- a/alpha/alpha-spec-saga-fsm/src/main/java/org/apache/servicecomb/pack/alpha/fsm/channel/memory/MemoryActorEventChannel.java
+++ b/alpha/alpha-spec-saga-akka/src/main/java/org/apache/servicecomb/pack/alpha/spec/saga/akka/channel/memory/MemoryActorEventChannel.java
@@ -15,13 +15,13 @@
  * limitations under the License.
  */
 
-package org.apache.servicecomb.pack.alpha.fsm.channel.memory;
+package org.apache.servicecomb.pack.alpha.spec.saga.akka.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.spec.saga.akka.channel.AbstractActorEventChannel;
+import org.apache.servicecomb.pack.alpha.spec.saga.akka.metrics.MetricsService;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
diff --git a/alpha/alpha-spec-saga-fsm/src/main/java/org/apache/servicecomb/pack/alpha/fsm/channel/memory/MemorySagaEventConsumer.java b/alpha/alpha-spec-saga-akka/src/main/java/org/apache/servicecomb/pack/alpha/spec/saga/akka/channel/memory/MemorySagaEventConsumer.java
similarity index 91%
rename from alpha/alpha-spec-saga-fsm/src/main/java/org/apache/servicecomb/pack/alpha/fsm/channel/memory/MemorySagaEventConsumer.java
rename to alpha/alpha-spec-saga-akka/src/main/java/org/apache/servicecomb/pack/alpha/spec/saga/akka/channel/memory/MemorySagaEventConsumer.java
index f2af56b..99f202b 100644
--- a/alpha/alpha-spec-saga-fsm/src/main/java/org/apache/servicecomb/pack/alpha/fsm/channel/memory/MemorySagaEventConsumer.java
+++ b/alpha/alpha-spec-saga-akka/src/main/java/org/apache/servicecomb/pack/alpha/spec/saga/akka/channel/memory/MemorySagaEventConsumer.java
@@ -15,14 +15,14 @@
  * limitations under the License.
  */
 
-package org.apache.servicecomb.pack.alpha.fsm.channel.memory;
+package org.apache.servicecomb.pack.alpha.spec.saga.akka.channel.memory;
 
 import akka.actor.ActorRef;
 import akka.actor.ActorSystem;
 import java.lang.invoke.MethodHandles;
 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;
+import org.apache.servicecomb.pack.alpha.spec.saga.akka.channel.AbstractEventConsumer;
+import org.apache.servicecomb.pack.alpha.spec.saga.akka.metrics.MetricsService;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
diff --git a/alpha/alpha-spec-saga-fsm/src/main/java/org/apache/servicecomb/pack/alpha/fsm/channel/rabbit/RabbitActorEventChannel.java b/alpha/alpha-spec-saga-akka/src/main/java/org/apache/servicecomb/pack/alpha/spec/saga/akka/channel/rabbit/RabbitActorEventChannel.java
similarity index 84%
rename from alpha/alpha-spec-saga-fsm/src/main/java/org/apache/servicecomb/pack/alpha/fsm/channel/rabbit/RabbitActorEventChannel.java
rename to alpha/alpha-spec-saga-akka/src/main/java/org/apache/servicecomb/pack/alpha/spec/saga/akka/channel/rabbit/RabbitActorEventChannel.java
index a6623ef..8e10d60 100644
--- a/alpha/alpha-spec-saga-fsm/src/main/java/org/apache/servicecomb/pack/alpha/fsm/channel/rabbit/RabbitActorEventChannel.java
+++ b/alpha/alpha-spec-saga-akka/src/main/java/org/apache/servicecomb/pack/alpha/spec/saga/akka/channel/rabbit/RabbitActorEventChannel.java
@@ -15,11 +15,11 @@
  * limitations under the License.
  */
 
-package org.apache.servicecomb.pack.alpha.fsm.channel.rabbit;
+package org.apache.servicecomb.pack.alpha.spec.saga.akka.channel.rabbit;
 
 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.spec.saga.akka.channel.AbstractActorEventChannel;
+import org.apache.servicecomb.pack.alpha.spec.saga.akka.metrics.MetricsService;
 
 public class RabbitActorEventChannel extends AbstractActorEventChannel {
 
diff --git a/alpha/alpha-spec-saga-fsm/src/main/java/org/apache/servicecomb/pack/alpha/fsm/channel/rabbit/RabbitChannelAutoConfiguration.java b/alpha/alpha-spec-saga-akka/src/main/java/org/apache/servicecomb/pack/alpha/spec/saga/akka/channel/rabbit/RabbitChannelAutoConfiguration.java
similarity index 89%
rename from alpha/alpha-spec-saga-fsm/src/main/java/org/apache/servicecomb/pack/alpha/fsm/channel/rabbit/RabbitChannelAutoConfiguration.java
rename to alpha/alpha-spec-saga-akka/src/main/java/org/apache/servicecomb/pack/alpha/spec/saga/akka/channel/rabbit/RabbitChannelAutoConfiguration.java
index 1e30415..e760f6f 100644
--- a/alpha/alpha-spec-saga-fsm/src/main/java/org/apache/servicecomb/pack/alpha/fsm/channel/rabbit/RabbitChannelAutoConfiguration.java
+++ b/alpha/alpha-spec-saga-akka/src/main/java/org/apache/servicecomb/pack/alpha/spec/saga/akka/channel/rabbit/RabbitChannelAutoConfiguration.java
@@ -15,13 +15,13 @@
  * limitations under the License.
  */
 
-package org.apache.servicecomb.pack.alpha.fsm.channel.rabbit;
+package org.apache.servicecomb.pack.alpha.spec.saga.akka.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.apache.servicecomb.pack.alpha.spec.saga.akka.metrics.MetricsService;
 import org.springframework.beans.factory.annotation.Qualifier;
 import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
 import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
@@ -36,7 +36,7 @@ import org.springframework.context.annotation.Lazy;
 @EnableBinding({RabbitMessageChannel.class})
 @Configuration
 @EnableConfigurationProperties(BindingServiceProperties.class)
-@ConditionalOnProperty(value = "alpha.feature.akka.channel.type", havingValue = "rabbit")
+@ConditionalOnProperty(value = "alpha.spec.saga.akka.channel.name", havingValue = "rabbit")
 public class RabbitChannelAutoConfiguration {
 
 
@@ -61,7 +61,7 @@ public class RabbitChannelAutoConfiguration {
     @ConditionalOnMissingBean(ActorEventChannel.class)
     public ActorEventChannel rabbitEventChannel(MetricsService metricsService,
                                                @Lazy RabbitMessagePublisher rabbitMessagePublisher) {
-        return new org.apache.servicecomb.pack.alpha.fsm.channel.rabbit.RabbitActorEventChannel(metricsService, rabbitMessagePublisher);
+        return new RabbitActorEventChannel(metricsService, rabbitMessagePublisher);
     }
 
 }
diff --git a/alpha/alpha-spec-saga-fsm/src/main/java/org/apache/servicecomb/pack/alpha/fsm/channel/rabbit/RabbitMessageChannel.java b/alpha/alpha-spec-saga-akka/src/main/java/org/apache/servicecomb/pack/alpha/spec/saga/akka/channel/rabbit/RabbitMessageChannel.java
similarity index 94%
rename from alpha/alpha-spec-saga-fsm/src/main/java/org/apache/servicecomb/pack/alpha/fsm/channel/rabbit/RabbitMessageChannel.java
rename to alpha/alpha-spec-saga-akka/src/main/java/org/apache/servicecomb/pack/alpha/spec/saga/akka/channel/rabbit/RabbitMessageChannel.java
index 3b04060..dbf5012 100644
--- a/alpha/alpha-spec-saga-fsm/src/main/java/org/apache/servicecomb/pack/alpha/fsm/channel/rabbit/RabbitMessageChannel.java
+++ b/alpha/alpha-spec-saga-akka/src/main/java/org/apache/servicecomb/pack/alpha/spec/saga/akka/channel/rabbit/RabbitMessageChannel.java
@@ -15,7 +15,7 @@
  * limitations under the License.
  */
 
-package org.apache.servicecomb.pack.alpha.fsm.channel.rabbit;
+package org.apache.servicecomb.pack.alpha.spec.saga.akka.channel.rabbit;
 
 import org.springframework.cloud.stream.annotation.Input;
 import org.springframework.cloud.stream.annotation.Output;
diff --git a/alpha/alpha-spec-saga-fsm/src/main/java/org/apache/servicecomb/pack/alpha/fsm/channel/rabbit/RabbitMessagePublisher.java b/alpha/alpha-spec-saga-akka/src/main/java/org/apache/servicecomb/pack/alpha/spec/saga/akka/channel/rabbit/RabbitMessagePublisher.java
similarity index 96%
rename from alpha/alpha-spec-saga-fsm/src/main/java/org/apache/servicecomb/pack/alpha/fsm/channel/rabbit/RabbitMessagePublisher.java
rename to alpha/alpha-spec-saga-akka/src/main/java/org/apache/servicecomb/pack/alpha/spec/saga/akka/channel/rabbit/RabbitMessagePublisher.java
index 8a2c82a..3ca10a2 100644
--- a/alpha/alpha-spec-saga-fsm/src/main/java/org/apache/servicecomb/pack/alpha/fsm/channel/rabbit/RabbitMessagePublisher.java
+++ b/alpha/alpha-spec-saga-akka/src/main/java/org/apache/servicecomb/pack/alpha/spec/saga/akka/channel/rabbit/RabbitMessagePublisher.java
@@ -15,7 +15,7 @@
  * limitations under the License.
  */
 
-package org.apache.servicecomb.pack.alpha.fsm.channel.rabbit;
+package org.apache.servicecomb.pack.alpha.spec.saga.akka.channel.rabbit;
 
 import java.lang.invoke.MethodHandles;
 import org.apache.servicecomb.pack.alpha.core.fsm.channel.MessagePublisher;
diff --git a/alpha/alpha-spec-saga-fsm/src/main/java/org/apache/servicecomb/pack/alpha/fsm/channel/rabbit/RabbitSagaEventConsumer.java b/alpha/alpha-spec-saga-akka/src/main/java/org/apache/servicecomb/pack/alpha/spec/saga/akka/channel/rabbit/RabbitSagaEventConsumer.java
similarity index 89%
rename from alpha/alpha-spec-saga-fsm/src/main/java/org/apache/servicecomb/pack/alpha/fsm/channel/rabbit/RabbitSagaEventConsumer.java
rename to alpha/alpha-spec-saga-akka/src/main/java/org/apache/servicecomb/pack/alpha/spec/saga/akka/channel/rabbit/RabbitSagaEventConsumer.java
index 9d72b94..b2abc4c 100644
--- a/alpha/alpha-spec-saga-fsm/src/main/java/org/apache/servicecomb/pack/alpha/fsm/channel/rabbit/RabbitSagaEventConsumer.java
+++ b/alpha/alpha-spec-saga-akka/src/main/java/org/apache/servicecomb/pack/alpha/spec/saga/akka/channel/rabbit/RabbitSagaEventConsumer.java
@@ -15,7 +15,7 @@
  * limitations under the License.
  */
 
-package org.apache.servicecomb.pack.alpha.fsm.channel.rabbit;
+package org.apache.servicecomb.pack.alpha.spec.saga.akka.channel.rabbit;
 
 import akka.actor.ActorRef;
 import akka.actor.ActorSystem;
@@ -26,8 +26,8 @@ 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;
+import org.apache.servicecomb.pack.alpha.spec.saga.akka.channel.AbstractEventConsumer;
+import org.apache.servicecomb.pack.alpha.spec.saga.akka.metrics.MetricsService;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.springframework.cloud.stream.annotation.StreamListener;
@@ -43,7 +43,7 @@ public class RabbitSagaEventConsumer extends AbstractEventConsumer {
 
     }
 
-    @StreamListener(org.apache.servicecomb.pack.alpha.fsm.channel.rabbit.RabbitMessageChannel.SERVICE_COMB_PACK_CONSUMER)
+    @StreamListener(RabbitMessageChannel.SERVICE_COMB_PACK_CONSUMER)
     public void receive(BaseEvent baseEvent) {
         sendSagaActor(baseEvent);
     }
diff --git a/alpha/alpha-spec-saga-fsm/src/main/java/org/apache/servicecomb/pack/alpha/fsm/channel/redis/MessageSerializer.java b/alpha/alpha-spec-saga-akka/src/main/java/org/apache/servicecomb/pack/alpha/spec/saga/akka/channel/redis/MessageSerializer.java
similarity index 97%
rename from alpha/alpha-spec-saga-fsm/src/main/java/org/apache/servicecomb/pack/alpha/fsm/channel/redis/MessageSerializer.java
rename to alpha/alpha-spec-saga-akka/src/main/java/org/apache/servicecomb/pack/alpha/spec/saga/akka/channel/redis/MessageSerializer.java
index 5665eee..641542a 100644
--- a/alpha/alpha-spec-saga-fsm/src/main/java/org/apache/servicecomb/pack/alpha/fsm/channel/redis/MessageSerializer.java
+++ b/alpha/alpha-spec-saga-akka/src/main/java/org/apache/servicecomb/pack/alpha/spec/saga/akka/channel/redis/MessageSerializer.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.fsm.channel.redis;
+package org.apache.servicecomb.pack.alpha.spec.saga.akka.channel.redis;
 
 import java.io.ByteArrayInputStream;
 import java.io.ByteArrayOutputStream;
diff --git a/alpha/alpha-spec-saga-fsm/src/main/java/org/apache/servicecomb/pack/alpha/fsm/channel/redis/RedisActorEventChannel.java b/alpha/alpha-spec-saga-akka/src/main/java/org/apache/servicecomb/pack/alpha/spec/saga/akka/channel/redis/RedisActorEventChannel.java
similarity index 86%
rename from alpha/alpha-spec-saga-fsm/src/main/java/org/apache/servicecomb/pack/alpha/fsm/channel/redis/RedisActorEventChannel.java
rename to alpha/alpha-spec-saga-akka/src/main/java/org/apache/servicecomb/pack/alpha/spec/saga/akka/channel/redis/RedisActorEventChannel.java
index e023bb0..4a053a0 100644
--- a/alpha/alpha-spec-saga-fsm/src/main/java/org/apache/servicecomb/pack/alpha/fsm/channel/redis/RedisActorEventChannel.java
+++ b/alpha/alpha-spec-saga-akka/src/main/java/org/apache/servicecomb/pack/alpha/spec/saga/akka/channel/redis/RedisActorEventChannel.java
@@ -15,12 +15,12 @@
  * limitations under the License.
  */
 
-package org.apache.servicecomb.pack.alpha.fsm.channel.redis;
+package org.apache.servicecomb.pack.alpha.spec.saga.akka.channel.redis;
 
 import java.lang.invoke.MethodHandles;
 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.spec.saga.akka.channel.AbstractActorEventChannel;
+import org.apache.servicecomb.pack.alpha.spec.saga.akka.metrics.MetricsService;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
diff --git a/alpha/alpha-spec-saga-fsm/src/main/java/org/apache/servicecomb/pack/alpha/fsm/channel/redis/RedisChannelAutoConfiguration.java b/alpha/alpha-spec-saga-akka/src/main/java/org/apache/servicecomb/pack/alpha/spec/saga/akka/channel/redis/RedisChannelAutoConfiguration.java
similarity index 95%
rename from alpha/alpha-spec-saga-fsm/src/main/java/org/apache/servicecomb/pack/alpha/fsm/channel/redis/RedisChannelAutoConfiguration.java
rename to alpha/alpha-spec-saga-akka/src/main/java/org/apache/servicecomb/pack/alpha/spec/saga/akka/channel/redis/RedisChannelAutoConfiguration.java
index 7d15967..6c9ab54 100644
--- a/alpha/alpha-spec-saga-fsm/src/main/java/org/apache/servicecomb/pack/alpha/fsm/channel/redis/RedisChannelAutoConfiguration.java
+++ b/alpha/alpha-spec-saga-akka/src/main/java/org/apache/servicecomb/pack/alpha/spec/saga/akka/channel/redis/RedisChannelAutoConfiguration.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.fsm.channel.redis;
+package org.apache.servicecomb.pack.alpha.spec.saga.akka.channel.redis;
 
 import akka.actor.ActorRef;
 import akka.actor.ActorSystem;
@@ -23,7 +23,7 @@ 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.fsm.metrics.MetricsService;
+import org.apache.servicecomb.pack.alpha.spec.saga.akka.metrics.MetricsService;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.springframework.beans.factory.annotation.Qualifier;
@@ -45,7 +45,7 @@ import org.springframework.data.redis.serializer.StringRedisSerializer;
 
 @Configuration
 @ConditionalOnClass(RedisConnection.class)
-@ConditionalOnProperty(value = "alpha.feature.akka.channel.type", havingValue = "redis")
+@ConditionalOnProperty(value = "alpha.spec.saga.akka.channel.name", havingValue = "redis")
 public class RedisChannelAutoConfiguration {
 
   private static final Logger LOG = LoggerFactory.getLogger(MethodHandles.lookup().lookupClass());
diff --git a/alpha/alpha-spec-saga-fsm/src/main/java/org/apache/servicecomb/pack/alpha/fsm/channel/redis/RedisMessagePublisher.java b/alpha/alpha-spec-saga-akka/src/main/java/org/apache/servicecomb/pack/alpha/spec/saga/akka/channel/redis/RedisMessagePublisher.java
similarity index 96%
rename from alpha/alpha-spec-saga-fsm/src/main/java/org/apache/servicecomb/pack/alpha/fsm/channel/redis/RedisMessagePublisher.java
rename to alpha/alpha-spec-saga-akka/src/main/java/org/apache/servicecomb/pack/alpha/spec/saga/akka/channel/redis/RedisMessagePublisher.java
index eca2af4..434aa4a 100644
--- a/alpha/alpha-spec-saga-fsm/src/main/java/org/apache/servicecomb/pack/alpha/fsm/channel/redis/RedisMessagePublisher.java
+++ b/alpha/alpha-spec-saga-akka/src/main/java/org/apache/servicecomb/pack/alpha/spec/saga/akka/channel/redis/RedisMessagePublisher.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.fsm.channel.redis;
+package org.apache.servicecomb.pack.alpha.spec.saga.akka.channel.redis;
 
 
 import java.lang.invoke.MethodHandles;
diff --git a/alpha/alpha-spec-saga-fsm/src/main/java/org/apache/servicecomb/pack/alpha/fsm/channel/redis/RedisSagaEventConsumer.java b/alpha/alpha-spec-saga-akka/src/main/java/org/apache/servicecomb/pack/alpha/spec/saga/akka/channel/redis/RedisSagaEventConsumer.java
similarity index 91%
rename from alpha/alpha-spec-saga-fsm/src/main/java/org/apache/servicecomb/pack/alpha/fsm/channel/redis/RedisSagaEventConsumer.java
rename to alpha/alpha-spec-saga-akka/src/main/java/org/apache/servicecomb/pack/alpha/spec/saga/akka/channel/redis/RedisSagaEventConsumer.java
index b9cb31e..340f0f5 100644
--- a/alpha/alpha-spec-saga-fsm/src/main/java/org/apache/servicecomb/pack/alpha/fsm/channel/redis/RedisSagaEventConsumer.java
+++ b/alpha/alpha-spec-saga-akka/src/main/java/org/apache/servicecomb/pack/alpha/spec/saga/akka/channel/redis/RedisSagaEventConsumer.java
@@ -15,15 +15,15 @@
  * limitations under the License.
  */
 
-package org.apache.servicecomb.pack.alpha.fsm.channel.redis;
+package org.apache.servicecomb.pack.alpha.spec.saga.akka.channel.redis;
 
 import akka.actor.ActorRef;
 import akka.actor.ActorSystem;
 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.metrics.MetricsService;
+import org.apache.servicecomb.pack.alpha.spec.saga.akka.channel.AbstractEventConsumer;
+import org.apache.servicecomb.pack.alpha.spec.saga.akka.metrics.MetricsService;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.springframework.data.redis.connection.Message;
diff --git a/alpha/alpha-spec-saga-fsm/src/main/java/org/apache/servicecomb/pack/alpha/fsm/domain/AddTxEventDomain.java b/alpha/alpha-spec-saga-akka/src/main/java/org/apache/servicecomb/pack/alpha/spec/saga/akka/domain/AddTxEventDomain.java
similarity index 97%
rename from alpha/alpha-spec-saga-fsm/src/main/java/org/apache/servicecomb/pack/alpha/fsm/domain/AddTxEventDomain.java
rename to alpha/alpha-spec-saga-akka/src/main/java/org/apache/servicecomb/pack/alpha/spec/saga/akka/domain/AddTxEventDomain.java
index f7ea638..5f69bcd 100644
--- a/alpha/alpha-spec-saga-fsm/src/main/java/org/apache/servicecomb/pack/alpha/fsm/domain/AddTxEventDomain.java
+++ b/alpha/alpha-spec-saga-akka/src/main/java/org/apache/servicecomb/pack/alpha/spec/saga/akka/domain/AddTxEventDomain.java
@@ -15,7 +15,7 @@
  * limitations under the License.
  */
 
-package org.apache.servicecomb.pack.alpha.fsm.domain;
+package org.apache.servicecomb.pack.alpha.spec.saga.akka.domain;
 
 import org.apache.servicecomb.pack.alpha.core.fsm.TxState;
 import org.apache.servicecomb.pack.alpha.core.fsm.event.TxStartedEvent;
diff --git a/alpha/alpha-spec-saga-fsm/src/main/java/org/apache/servicecomb/pack/alpha/fsm/domain/DomainEvent.java b/alpha/alpha-spec-saga-akka/src/main/java/org/apache/servicecomb/pack/alpha/spec/saga/akka/domain/DomainEvent.java
similarity index 93%
rename from alpha/alpha-spec-saga-fsm/src/main/java/org/apache/servicecomb/pack/alpha/fsm/domain/DomainEvent.java
rename to alpha/alpha-spec-saga-akka/src/main/java/org/apache/servicecomb/pack/alpha/spec/saga/akka/domain/DomainEvent.java
index b6bbaeb..0229b85 100644
--- a/alpha/alpha-spec-saga-fsm/src/main/java/org/apache/servicecomb/pack/alpha/fsm/domain/DomainEvent.java
+++ b/alpha/alpha-spec-saga-akka/src/main/java/org/apache/servicecomb/pack/alpha/spec/saga/akka/domain/DomainEvent.java
@@ -15,7 +15,7 @@
  * limitations under the License.
  */
 
-package org.apache.servicecomb.pack.alpha.fsm.domain;
+package org.apache.servicecomb.pack.alpha.spec.saga.akka.domain;
 
 import java.io.Serializable;
 import org.apache.servicecomb.pack.alpha.core.fsm.event.base.BaseEvent;
diff --git a/alpha/alpha-spec-saga-fsm/src/main/java/org/apache/servicecomb/pack/alpha/fsm/domain/SagaEndedDomain.java b/alpha/alpha-spec-saga-akka/src/main/java/org/apache/servicecomb/pack/alpha/spec/saga/akka/domain/SagaEndedDomain.java
similarity index 93%
rename from alpha/alpha-spec-saga-fsm/src/main/java/org/apache/servicecomb/pack/alpha/fsm/domain/SagaEndedDomain.java
rename to alpha/alpha-spec-saga-akka/src/main/java/org/apache/servicecomb/pack/alpha/spec/saga/akka/domain/SagaEndedDomain.java
index 9cbe70b..b194609 100644
--- a/alpha/alpha-spec-saga-fsm/src/main/java/org/apache/servicecomb/pack/alpha/fsm/domain/SagaEndedDomain.java
+++ b/alpha/alpha-spec-saga-akka/src/main/java/org/apache/servicecomb/pack/alpha/spec/saga/akka/domain/SagaEndedDomain.java
@@ -15,11 +15,11 @@
  * limitations under the License.
  */
 
-package org.apache.servicecomb.pack.alpha.fsm.domain;
+package org.apache.servicecomb.pack.alpha.spec.saga.akka.domain;
 
 import org.apache.servicecomb.pack.alpha.core.fsm.SuspendedType;
 import org.apache.servicecomb.pack.alpha.core.fsm.event.base.BaseEvent;
-import org.apache.servicecomb.pack.alpha.fsm.SagaActorState;
+import org.apache.servicecomb.pack.alpha.spec.saga.akka.SagaActorState;
 
 public class SagaEndedDomain implements DomainEvent {
 
diff --git a/alpha/alpha-spec-saga-fsm/src/main/java/org/apache/servicecomb/pack/alpha/fsm/domain/SagaStartedDomain.java b/alpha/alpha-spec-saga-akka/src/main/java/org/apache/servicecomb/pack/alpha/spec/saga/akka/domain/SagaStartedDomain.java
similarity index 96%
rename from alpha/alpha-spec-saga-fsm/src/main/java/org/apache/servicecomb/pack/alpha/fsm/domain/SagaStartedDomain.java
rename to alpha/alpha-spec-saga-akka/src/main/java/org/apache/servicecomb/pack/alpha/spec/saga/akka/domain/SagaStartedDomain.java
index ef599a0..a3c4df1 100644
--- a/alpha/alpha-spec-saga-fsm/src/main/java/org/apache/servicecomb/pack/alpha/fsm/domain/SagaStartedDomain.java
+++ b/alpha/alpha-spec-saga-akka/src/main/java/org/apache/servicecomb/pack/alpha/spec/saga/akka/domain/SagaStartedDomain.java
@@ -15,7 +15,7 @@
  * limitations under the License.
  */
 
-package org.apache.servicecomb.pack.alpha.fsm.domain;
+package org.apache.servicecomb.pack.alpha.spec.saga.akka.domain;
 
 import java.util.Calendar;
 import java.util.Date;
diff --git a/alpha/alpha-spec-saga-fsm/src/main/java/org/apache/servicecomb/pack/alpha/fsm/domain/UpdateTxEventDomain.java b/alpha/alpha-spec-saga-akka/src/main/java/org/apache/servicecomb/pack/alpha/spec/saga/akka/domain/UpdateTxEventDomain.java
similarity index 97%
rename from alpha/alpha-spec-saga-fsm/src/main/java/org/apache/servicecomb/pack/alpha/fsm/domain/UpdateTxEventDomain.java
rename to alpha/alpha-spec-saga-akka/src/main/java/org/apache/servicecomb/pack/alpha/spec/saga/akka/domain/UpdateTxEventDomain.java
index a60a438..c726988 100644
--- a/alpha/alpha-spec-saga-fsm/src/main/java/org/apache/servicecomb/pack/alpha/fsm/domain/UpdateTxEventDomain.java
+++ b/alpha/alpha-spec-saga-akka/src/main/java/org/apache/servicecomb/pack/alpha/spec/saga/akka/domain/UpdateTxEventDomain.java
@@ -15,7 +15,7 @@
  * limitations under the License.
  */
 
-package org.apache.servicecomb.pack.alpha.fsm.domain;
+package org.apache.servicecomb.pack.alpha.spec.saga.akka.domain;
 
 import org.apache.servicecomb.pack.alpha.core.fsm.TxState;
 import org.apache.servicecomb.pack.alpha.core.fsm.event.TxAbortedEvent;
diff --git a/alpha/alpha-spec-saga-fsm/src/main/java/org/apache/servicecomb/pack/alpha/fsm/metrics/AlphaMetricsEndpointImpl.java b/alpha/alpha-spec-saga-akka/src/main/java/org/apache/servicecomb/pack/alpha/spec/saga/akka/metrics/AlphaMetricsEndpointImpl.java
similarity index 96%
rename from alpha/alpha-spec-saga-fsm/src/main/java/org/apache/servicecomb/pack/alpha/fsm/metrics/AlphaMetricsEndpointImpl.java
rename to alpha/alpha-spec-saga-akka/src/main/java/org/apache/servicecomb/pack/alpha/spec/saga/akka/metrics/AlphaMetricsEndpointImpl.java
index 1896980..91375e3 100644
--- a/alpha/alpha-spec-saga-fsm/src/main/java/org/apache/servicecomb/pack/alpha/fsm/metrics/AlphaMetricsEndpointImpl.java
+++ b/alpha/alpha-spec-saga-akka/src/main/java/org/apache/servicecomb/pack/alpha/spec/saga/akka/metrics/AlphaMetricsEndpointImpl.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.akka.metrics;
 
 import org.apache.servicecomb.pack.alpha.core.NodeStatus;
 import org.apache.servicecomb.pack.alpha.core.NodeStatus.TypeEnum;
diff --git a/alpha/alpha-spec-saga-fsm/src/main/java/org/apache/servicecomb/pack/alpha/fsm/metrics/MetricsService.java b/alpha/alpha-spec-saga-akka/src/main/java/org/apache/servicecomb/pack/alpha/spec/saga/akka/metrics/MetricsService.java
similarity index 93%
rename from alpha/alpha-spec-saga-fsm/src/main/java/org/apache/servicecomb/pack/alpha/fsm/metrics/MetricsService.java
rename to alpha/alpha-spec-saga-akka/src/main/java/org/apache/servicecomb/pack/alpha/spec/saga/akka/metrics/MetricsService.java
index aa085fc..b2f2645 100644
--- a/alpha/alpha-spec-saga-fsm/src/main/java/org/apache/servicecomb/pack/alpha/fsm/metrics/MetricsService.java
+++ b/alpha/alpha-spec-saga-akka/src/main/java/org/apache/servicecomb/pack/alpha/spec/saga/akka/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.akka.metrics;
 
 import org.apache.servicecomb.pack.alpha.core.metrics.MetricsBean;
 
diff --git a/alpha/alpha-spec-saga-fsm/src/main/java/org/apache/servicecomb/pack/alpha/fsm/model/SagaData.java b/alpha/alpha-spec-saga-akka/src/main/java/org/apache/servicecomb/pack/alpha/spec/saga/akka/model/SagaData.java
similarity index 97%
rename from alpha/alpha-spec-saga-fsm/src/main/java/org/apache/servicecomb/pack/alpha/fsm/model/SagaData.java
rename to alpha/alpha-spec-saga-akka/src/main/java/org/apache/servicecomb/pack/alpha/spec/saga/akka/model/SagaData.java
index 3295d67..69c3bfd 100644
--- a/alpha/alpha-spec-saga-fsm/src/main/java/org/apache/servicecomb/pack/alpha/fsm/model/SagaData.java
+++ b/alpha/alpha-spec-saga-akka/src/main/java/org/apache/servicecomb/pack/alpha/spec/saga/akka/model/SagaData.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.model;
 
 import java.io.Serializable;
 import java.util.Date;
@@ -24,7 +24,7 @@ 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.core.fsm.event.base.BaseEvent;
-import org.apache.servicecomb.pack.alpha.fsm.SagaActorState;
+import org.apache.servicecomb.pack.alpha.spec.saga.akka.SagaActorState;
 
 public class SagaData implements Serializable {
   private String serviceName;
diff --git a/alpha/alpha-spec-saga-fsm/src/main/java/org/apache/servicecomb/pack/alpha/fsm/model/TxEntities.java b/alpha/alpha-spec-saga-akka/src/main/java/org/apache/servicecomb/pack/alpha/spec/saga/akka/model/TxEntities.java
similarity index 97%
rename from alpha/alpha-spec-saga-fsm/src/main/java/org/apache/servicecomb/pack/alpha/fsm/model/TxEntities.java
rename to alpha/alpha-spec-saga-akka/src/main/java/org/apache/servicecomb/pack/alpha/spec/saga/akka/model/TxEntities.java
index 8ba72fd..04ce561 100644
--- a/alpha/alpha-spec-saga-fsm/src/main/java/org/apache/servicecomb/pack/alpha/fsm/model/TxEntities.java
+++ b/alpha/alpha-spec-saga-akka/src/main/java/org/apache/servicecomb/pack/alpha/spec/saga/akka/model/TxEntities.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.model;
 
 import java.util.ArrayList;
 import java.util.LinkedHashMap;
diff --git a/alpha/alpha-spec-saga-fsm/src/main/java/org/apache/servicecomb/pack/alpha/fsm/model/TxEntity.java b/alpha/alpha-spec-saga-akka/src/main/java/org/apache/servicecomb/pack/alpha/spec/saga/akka/model/TxEntity.java
similarity index 98%
rename from alpha/alpha-spec-saga-fsm/src/main/java/org/apache/servicecomb/pack/alpha/fsm/model/TxEntity.java
rename to alpha/alpha-spec-saga-akka/src/main/java/org/apache/servicecomb/pack/alpha/spec/saga/akka/model/TxEntity.java
index 8c2ea04..79e833c 100644
--- a/alpha/alpha-spec-saga-fsm/src/main/java/org/apache/servicecomb/pack/alpha/fsm/model/TxEntity.java
+++ b/alpha/alpha-spec-saga-akka/src/main/java/org/apache/servicecomb/pack/alpha/spec/saga/akka/model/TxEntity.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.model;
 
 import java.io.Serializable;
 import java.util.Date;
diff --git a/alpha/alpha-spec-saga-akka/src/main/java/org/apache/servicecomb/pack/alpha/spec/saga/akka/properties/ChannelKafkaProperties.java b/alpha/alpha-spec-saga-akka/src/main/java/org/apache/servicecomb/pack/alpha/spec/saga/akka/properties/ChannelKafkaProperties.java
new file mode 100644
index 0000000..d426ee1
--- /dev/null
+++ b/alpha/alpha-spec-saga-akka/src/main/java/org/apache/servicecomb/pack/alpha/spec/saga/akka/properties/ChannelKafkaProperties.java
@@ -0,0 +1,76 @@
+/*
+ * 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.properties;
+
+import java.util.Map;
+
+public class ChannelKafkaProperties {
+  private String topic;
+  private String bootstrapServers;
+  private int numPartitions;
+  private short replicationFactor;
+  private Map<String,String> consumer;
+  private Map<String,String> producer;
+
+  public String getTopic() {
+    return topic;
+  }
+
+  public void setTopic(String topic) {
+    this.topic = topic;
+  }
+
+  public String getBootstrapServers() {
+    return bootstrapServers;
+  }
+
+  public void setBootstrapServers(String bootstrapServers) {
+    this.bootstrapServers = bootstrapServers;
+  }
+
+  public int getNumPartitions() {
+    return numPartitions;
+  }
+
+  public void setNumPartitions(int numPartitions) {
+    this.numPartitions = numPartitions;
+  }
+
+  public short getReplicationFactor() {
+    return replicationFactor;
+  }
+
+  public void setReplicationFactor(short replicationFactor) {
+    this.replicationFactor = replicationFactor;
+  }
+
+  public Map<String, String> getConsumer() {
+    return consumer;
+  }
+
+  public void setConsumer(Map<String, String> consumer) {
+    this.consumer = consumer;
+  }
+
+  public Map<String, String> getProducer() {
+    return producer;
+  }
+
+  public void setProducer(Map<String, String> producer) {
+    this.producer = producer;
+  }
+}
\ No newline at end of file
diff --git a/alpha/alpha-spec-saga-fsm/src/main/java/org/apache/servicecomb/pack/alpha/fsm/properties/ChannelMemoryProperties.java b/alpha/alpha-spec-saga-akka/src/main/java/org/apache/servicecomb/pack/alpha/spec/saga/akka/properties/ChannelMemoryProperties.java
similarity index 93%
rename from alpha/alpha-spec-saga-fsm/src/main/java/org/apache/servicecomb/pack/alpha/fsm/properties/ChannelMemoryProperties.java
rename to alpha/alpha-spec-saga-akka/src/main/java/org/apache/servicecomb/pack/alpha/spec/saga/akka/properties/ChannelMemoryProperties.java
index 157e348..a013a8e 100644
--- a/alpha/alpha-spec-saga-fsm/src/main/java/org/apache/servicecomb/pack/alpha/fsm/properties/ChannelMemoryProperties.java
+++ b/alpha/alpha-spec-saga-akka/src/main/java/org/apache/servicecomb/pack/alpha/spec/saga/akka/properties/ChannelMemoryProperties.java
@@ -15,7 +15,7 @@
  * limitations under the License.
  */
 
-package org.apache.servicecomb.pack.alpha.fsm.properties;
+package org.apache.servicecomb.pack.alpha.spec.saga.akka.properties;
 
 public class ChannelMemoryProperties {
   private int maxLength;
diff --git a/alpha/alpha-spec-saga-fsm/src/main/java/org/apache/servicecomb/pack/alpha/fsm/properties/ChannelProperties.java b/alpha/alpha-spec-saga-akka/src/main/java/org/apache/servicecomb/pack/alpha/spec/saga/akka/properties/ChannelProperties.java
similarity index 81%
rename from alpha/alpha-spec-saga-fsm/src/main/java/org/apache/servicecomb/pack/alpha/fsm/properties/ChannelProperties.java
rename to alpha/alpha-spec-saga-akka/src/main/java/org/apache/servicecomb/pack/alpha/spec/saga/akka/properties/ChannelProperties.java
index 3afd653..36e1a47 100644
--- a/alpha/alpha-spec-saga-fsm/src/main/java/org/apache/servicecomb/pack/alpha/fsm/properties/ChannelProperties.java
+++ b/alpha/alpha-spec-saga-akka/src/main/java/org/apache/servicecomb/pack/alpha/spec/saga/akka/properties/ChannelProperties.java
@@ -15,11 +15,12 @@
  * limitations under the License.
  */
 
-package org.apache.servicecomb.pack.alpha.fsm.properties;
+package org.apache.servicecomb.pack.alpha.spec.saga.akka.properties;
 
 public class ChannelProperties {
   private String name;
   private ChannelMemoryProperties memory;
+  private ChannelKafkaProperties kafka;
 
   public String getName() {
     return name;
@@ -36,4 +37,13 @@ public class ChannelProperties {
   public void setMemory(ChannelMemoryProperties memory) {
     this.memory = memory;
   }
+
+  public ChannelKafkaProperties getKafka() {
+    return kafka;
+  }
+
+  public void setKafka(
+      ChannelKafkaProperties kafka) {
+    this.kafka = kafka;
+  }
 }
\ No newline at end of file
diff --git a/alpha/alpha-spec-saga-fsm/src/main/java/org/apache/servicecomb/pack/alpha/fsm/properties/ElasticsearchProperties.java b/alpha/alpha-spec-saga-akka/src/main/java/org/apache/servicecomb/pack/alpha/spec/saga/akka/properties/ElasticsearchProperties.java
similarity index 95%
rename from alpha/alpha-spec-saga-fsm/src/main/java/org/apache/servicecomb/pack/alpha/fsm/properties/ElasticsearchProperties.java
rename to alpha/alpha-spec-saga-akka/src/main/java/org/apache/servicecomb/pack/alpha/spec/saga/akka/properties/ElasticsearchProperties.java
index 317356f..34996e1 100644
--- a/alpha/alpha-spec-saga-fsm/src/main/java/org/apache/servicecomb/pack/alpha/fsm/properties/ElasticsearchProperties.java
+++ b/alpha/alpha-spec-saga-akka/src/main/java/org/apache/servicecomb/pack/alpha/spec/saga/akka/properties/ElasticsearchProperties.java
@@ -15,7 +15,7 @@
  * limitations under the License.
  */
 
-package org.apache.servicecomb.pack.alpha.fsm.properties;
+package org.apache.servicecomb.pack.alpha.spec.saga.akka.properties;
 
 public class ElasticsearchProperties {
 
diff --git a/alpha/alpha-spec-saga-fsm/src/main/java/org/apache/servicecomb/pack/alpha/fsm/properties/RepositoryProperties.java b/alpha/alpha-spec-saga-akka/src/main/java/org/apache/servicecomb/pack/alpha/spec/saga/akka/properties/RepositoryProperties.java
similarity index 94%
rename from alpha/alpha-spec-saga-fsm/src/main/java/org/apache/servicecomb/pack/alpha/fsm/properties/RepositoryProperties.java
rename to alpha/alpha-spec-saga-akka/src/main/java/org/apache/servicecomb/pack/alpha/spec/saga/akka/properties/RepositoryProperties.java
index 7b235a8..9283d9d 100644
--- a/alpha/alpha-spec-saga-fsm/src/main/java/org/apache/servicecomb/pack/alpha/fsm/properties/RepositoryProperties.java
+++ b/alpha/alpha-spec-saga-akka/src/main/java/org/apache/servicecomb/pack/alpha/spec/saga/akka/properties/RepositoryProperties.java
@@ -15,7 +15,7 @@
  * limitations under the License.
  */
 
-package org.apache.servicecomb.pack.alpha.fsm.properties;
+package org.apache.servicecomb.pack.alpha.spec.saga.akka.properties;
 
 public class RepositoryProperties {
   private String name;
diff --git a/alpha/alpha-spec-saga-fsm/src/main/java/org/apache/servicecomb/pack/alpha/fsm/properties/SpecSagaAkkaProperties.java b/alpha/alpha-spec-saga-akka/src/main/java/org/apache/servicecomb/pack/alpha/spec/saga/akka/properties/SpecSagaAkkaProperties.java
similarity index 95%
rename from alpha/alpha-spec-saga-fsm/src/main/java/org/apache/servicecomb/pack/alpha/fsm/properties/SpecSagaAkkaProperties.java
rename to alpha/alpha-spec-saga-akka/src/main/java/org/apache/servicecomb/pack/alpha/spec/saga/akka/properties/SpecSagaAkkaProperties.java
index dc327e4..bee30ec 100644
--- a/alpha/alpha-spec-saga-fsm/src/main/java/org/apache/servicecomb/pack/alpha/fsm/properties/SpecSagaAkkaProperties.java
+++ b/alpha/alpha-spec-saga-akka/src/main/java/org/apache/servicecomb/pack/alpha/spec/saga/akka/properties/SpecSagaAkkaProperties.java
@@ -15,7 +15,7 @@
  * limitations under the License.
  */
 
-package org.apache.servicecomb.pack.alpha.fsm.properties;
+package org.apache.servicecomb.pack.alpha.spec.saga.akka.properties;
 
 import org.springframework.boot.context.properties.ConfigurationProperties;
 import org.springframework.context.annotation.Configuration;
diff --git a/alpha/alpha-spec-saga-fsm/src/main/java/org/apache/servicecomb/pack/alpha/fsm/repository/AbstractTransactionRepositoryChannel.java b/alpha/alpha-spec-saga-akka/src/main/java/org/apache/servicecomb/pack/alpha/spec/saga/akka/repository/AbstractTransactionRepositoryChannel.java
similarity index 90%
rename from alpha/alpha-spec-saga-fsm/src/main/java/org/apache/servicecomb/pack/alpha/fsm/repository/AbstractTransactionRepositoryChannel.java
rename to alpha/alpha-spec-saga-akka/src/main/java/org/apache/servicecomb/pack/alpha/spec/saga/akka/repository/AbstractTransactionRepositoryChannel.java
index 2b5eea3..d03a295 100644
--- a/alpha/alpha-spec-saga-fsm/src/main/java/org/apache/servicecomb/pack/alpha/fsm/repository/AbstractTransactionRepositoryChannel.java
+++ b/alpha/alpha-spec-saga-akka/src/main/java/org/apache/servicecomb/pack/alpha/spec/saga/akka/repository/AbstractTransactionRepositoryChannel.java
@@ -15,10 +15,10 @@
  * limitations under the License.
  */
 
-package org.apache.servicecomb.pack.alpha.fsm.repository;
+package org.apache.servicecomb.pack.alpha.spec.saga.akka.repository;
 
 import org.apache.servicecomb.pack.alpha.core.fsm.repository.model.GlobalTransaction;
-import org.apache.servicecomb.pack.alpha.fsm.metrics.MetricsService;
+import org.apache.servicecomb.pack.alpha.spec.saga.akka.metrics.MetricsService;
 
 public abstract class AbstractTransactionRepositoryChannel implements TransactionRepositoryChannel {
 
diff --git a/alpha/alpha-spec-saga-fsm/src/main/java/org/apache/servicecomb/pack/alpha/fsm/repository/NoneTransactionRepository.java b/alpha/alpha-spec-saga-akka/src/main/java/org/apache/servicecomb/pack/alpha/spec/saga/akka/repository/NoneTransactionRepository.java
similarity index 97%
rename from alpha/alpha-spec-saga-fsm/src/main/java/org/apache/servicecomb/pack/alpha/fsm/repository/NoneTransactionRepository.java
rename to alpha/alpha-spec-saga-akka/src/main/java/org/apache/servicecomb/pack/alpha/spec/saga/akka/repository/NoneTransactionRepository.java
index 900256e..5da7d5a 100644
--- a/alpha/alpha-spec-saga-fsm/src/main/java/org/apache/servicecomb/pack/alpha/fsm/repository/NoneTransactionRepository.java
+++ b/alpha/alpha-spec-saga-akka/src/main/java/org/apache/servicecomb/pack/alpha/spec/saga/akka/repository/NoneTransactionRepository.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.repository;
 
 import java.lang.invoke.MethodHandles;
 import java.util.List;
diff --git a/alpha/alpha-spec-saga-fsm/src/main/java/org/apache/servicecomb/pack/alpha/fsm/repository/TransactionRepository.java b/alpha/alpha-spec-saga-akka/src/main/java/org/apache/servicecomb/pack/alpha/spec/saga/akka/repository/TransactionRepository.java
similarity index 95%
rename from alpha/alpha-spec-saga-fsm/src/main/java/org/apache/servicecomb/pack/alpha/fsm/repository/TransactionRepository.java
rename to alpha/alpha-spec-saga-akka/src/main/java/org/apache/servicecomb/pack/alpha/spec/saga/akka/repository/TransactionRepository.java
index 825f1fc..1704d48 100644
--- a/alpha/alpha-spec-saga-fsm/src/main/java/org/apache/servicecomb/pack/alpha/fsm/repository/TransactionRepository.java
+++ b/alpha/alpha-spec-saga-akka/src/main/java/org/apache/servicecomb/pack/alpha/spec/saga/akka/repository/TransactionRepository.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.repository;
 
 import java.util.List;
 import java.util.Map;
diff --git a/alpha/alpha-spec-saga-fsm/src/main/java/org/apache/servicecomb/pack/alpha/fsm/repository/TransactionRepositoryChannel.java b/alpha/alpha-spec-saga-akka/src/main/java/org/apache/servicecomb/pack/alpha/spec/saga/akka/repository/TransactionRepositoryChannel.java
similarity index 93%
rename from alpha/alpha-spec-saga-fsm/src/main/java/org/apache/servicecomb/pack/alpha/fsm/repository/TransactionRepositoryChannel.java
rename to alpha/alpha-spec-saga-akka/src/main/java/org/apache/servicecomb/pack/alpha/spec/saga/akka/repository/TransactionRepositoryChannel.java
index b571911..e3d370a 100644
--- a/alpha/alpha-spec-saga-fsm/src/main/java/org/apache/servicecomb/pack/alpha/fsm/repository/TransactionRepositoryChannel.java
+++ b/alpha/alpha-spec-saga-akka/src/main/java/org/apache/servicecomb/pack/alpha/spec/saga/akka/repository/TransactionRepositoryChannel.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.repository;
 
 import org.apache.servicecomb.pack.alpha.core.fsm.repository.model.GlobalTransaction;
 
diff --git a/alpha/alpha-spec-saga-fsm/src/main/java/org/apache/servicecomb/pack/alpha/fsm/repository/channel/DefaultTransactionRepositoryChannel.java b/alpha/alpha-spec-saga-akka/src/main/java/org/apache/servicecomb/pack/alpha/spec/saga/akka/repository/channel/DefaultTransactionRepositoryChannel.java
similarity index 72%
rename from alpha/alpha-spec-saga-fsm/src/main/java/org/apache/servicecomb/pack/alpha/fsm/repository/channel/DefaultTransactionRepositoryChannel.java
rename to alpha/alpha-spec-saga-akka/src/main/java/org/apache/servicecomb/pack/alpha/spec/saga/akka/repository/channel/DefaultTransactionRepositoryChannel.java
index 25e31d8..596c5d4 100644
--- a/alpha/alpha-spec-saga-fsm/src/main/java/org/apache/servicecomb/pack/alpha/fsm/repository/channel/DefaultTransactionRepositoryChannel.java
+++ b/alpha/alpha-spec-saga-akka/src/main/java/org/apache/servicecomb/pack/alpha/spec/saga/akka/repository/channel/DefaultTransactionRepositoryChannel.java
@@ -15,16 +15,17 @@
  * limitations under the License.
  */
 
-package org.apache.servicecomb.pack.alpha.fsm.repository.channel;
+package org.apache.servicecomb.pack.alpha.spec.saga.akka.repository.channel;
 
 import org.apache.servicecomb.pack.alpha.core.fsm.repository.model.GlobalTransaction;
-import org.apache.servicecomb.pack.alpha.fsm.metrics.MetricsService;
-import org.apache.servicecomb.pack.alpha.fsm.repository.AbstractTransactionRepositoryChannel;
-import org.apache.servicecomb.pack.alpha.fsm.repository.TransactionRepository;
+import org.apache.servicecomb.pack.alpha.spec.saga.akka.metrics.MetricsService;
+import org.apache.servicecomb.pack.alpha.spec.saga.akka.repository.AbstractTransactionRepositoryChannel;
+import org.apache.servicecomb.pack.alpha.spec.saga.akka.repository.TransactionRepository;
 
 public class DefaultTransactionRepositoryChannel extends AbstractTransactionRepositoryChannel {
 
-  public DefaultTransactionRepositoryChannel(TransactionRepository repository, MetricsService metricsService) {
+  public DefaultTransactionRepositoryChannel(
+      TransactionRepository repository, MetricsService metricsService) {
     super(repository, metricsService);
   }
 
diff --git a/alpha/alpha-spec-saga-fsm/src/main/java/org/apache/servicecomb/pack/alpha/fsm/repository/elasticsearch/ElasticsearchTransactionRepository.java b/alpha/alpha-spec-saga-akka/src/main/java/org/apache/servicecomb/pack/alpha/spec/saga/akka/repository/elasticsearch/ElasticsearchTransactionRepository.java
similarity index 96%
rename from alpha/alpha-spec-saga-fsm/src/main/java/org/apache/servicecomb/pack/alpha/fsm/repository/elasticsearch/ElasticsearchTransactionRepository.java
rename to alpha/alpha-spec-saga-akka/src/main/java/org/apache/servicecomb/pack/alpha/spec/saga/akka/repository/elasticsearch/ElasticsearchTransactionRepository.java
index 1c9e242..aebe703 100644
--- a/alpha/alpha-spec-saga-fsm/src/main/java/org/apache/servicecomb/pack/alpha/fsm/repository/elasticsearch/ElasticsearchTransactionRepository.java
+++ b/alpha/alpha-spec-saga-akka/src/main/java/org/apache/servicecomb/pack/alpha/spec/saga/akka/repository/elasticsearch/ElasticsearchTransactionRepository.java
@@ -15,7 +15,7 @@
  * limitations under the License.
  */
 
-package org.apache.servicecomb.pack.alpha.fsm.repository.elasticsearch;
+package org.apache.servicecomb.pack.alpha.spec.saga.akka.repository.elasticsearch;
 
 import com.fasterxml.jackson.core.JsonProcessingException;
 import com.fasterxml.jackson.databind.ObjectMapper;
@@ -28,9 +28,9 @@ import java.util.Map;
 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.apache.servicecomb.pack.alpha.spec.saga.akka.metrics.MetricsService;
+import org.apache.servicecomb.pack.alpha.spec.saga.akka.properties.ElasticsearchProperties;
+import org.apache.servicecomb.pack.alpha.spec.saga.akka.repository.TransactionRepository;
 import org.elasticsearch.action.search.SearchType;
 import org.elasticsearch.index.query.QueryBuilders;
 import org.elasticsearch.search.aggregations.AggregationBuilders;
diff --git a/alpha/alpha-spec-saga-fsm/src/main/java/org/apache/servicecomb/pack/alpha/fsm/repository/elasticsearch/GlobalTransactionDocument.java b/alpha/alpha-spec-saga-akka/src/main/java/org/apache/servicecomb/pack/alpha/spec/saga/akka/repository/elasticsearch/GlobalTransactionDocument.java
similarity index 93%
rename from alpha/alpha-spec-saga-fsm/src/main/java/org/apache/servicecomb/pack/alpha/fsm/repository/elasticsearch/GlobalTransactionDocument.java
rename to alpha/alpha-spec-saga-akka/src/main/java/org/apache/servicecomb/pack/alpha/spec/saga/akka/repository/elasticsearch/GlobalTransactionDocument.java
index dd23ef7..efe8a0c 100644
--- a/alpha/alpha-spec-saga-fsm/src/main/java/org/apache/servicecomb/pack/alpha/fsm/repository/elasticsearch/GlobalTransactionDocument.java
+++ b/alpha/alpha-spec-saga-akka/src/main/java/org/apache/servicecomb/pack/alpha/spec/saga/akka/repository/elasticsearch/GlobalTransactionDocument.java
@@ -15,7 +15,7 @@
  * limitations under the License.
  */
 
-package org.apache.servicecomb.pack.alpha.fsm.repository.elasticsearch;
+package org.apache.servicecomb.pack.alpha.spec.saga.akka.repository.elasticsearch;
 
 import org.apache.servicecomb.pack.alpha.core.fsm.repository.model.GlobalTransaction;
 import org.springframework.data.elasticsearch.annotations.Document;
diff --git a/alpha/alpha-spec-saga-fsm/src/main/java/org/apache/servicecomb/pack/alpha/fsm/spring/integration/akka/AkkaClusterListener.java b/alpha/alpha-spec-saga-akka/src/main/java/org/apache/servicecomb/pack/alpha/spec/saga/akka/spring/integration/akka/AkkaClusterListener.java
similarity index 97%
rename from alpha/alpha-spec-saga-fsm/src/main/java/org/apache/servicecomb/pack/alpha/fsm/spring/integration/akka/AkkaClusterListener.java
rename to alpha/alpha-spec-saga-akka/src/main/java/org/apache/servicecomb/pack/alpha/spec/saga/akka/spring/integration/akka/AkkaClusterListener.java
index 418cd2e..7bfff88 100644
--- a/alpha/alpha-spec-saga-fsm/src/main/java/org/apache/servicecomb/pack/alpha/fsm/spring/integration/akka/AkkaClusterListener.java
+++ b/alpha/alpha-spec-saga-akka/src/main/java/org/apache/servicecomb/pack/alpha/spec/saga/akka/spring/integration/akka/AkkaClusterListener.java
@@ -15,7 +15,7 @@
  * limitations under the License.
  */
 
-package org.apache.servicecomb.pack.alpha.fsm.spring.integration.akka;
+package org.apache.servicecomb.pack.alpha.spec.saga.akka.spring.integration.akka;
 
 import akka.actor.AbstractActor;
 import akka.cluster.Cluster;
diff --git a/alpha/alpha-spec-saga-fsm/src/main/java/org/apache/servicecomb/pack/alpha/fsm/spring/integration/akka/AkkaConfigPropertyAdapter.java b/alpha/alpha-spec-saga-akka/src/main/java/org/apache/servicecomb/pack/alpha/spec/saga/akka/spring/integration/akka/AkkaConfigPropertyAdapter.java
similarity index 98%
rename from alpha/alpha-spec-saga-fsm/src/main/java/org/apache/servicecomb/pack/alpha/fsm/spring/integration/akka/AkkaConfigPropertyAdapter.java
rename to alpha/alpha-spec-saga-akka/src/main/java/org/apache/servicecomb/pack/alpha/spec/saga/akka/spring/integration/akka/AkkaConfigPropertyAdapter.java
index 31c12a5..909d204 100644
--- a/alpha/alpha-spec-saga-fsm/src/main/java/org/apache/servicecomb/pack/alpha/fsm/spring/integration/akka/AkkaConfigPropertyAdapter.java
+++ b/alpha/alpha-spec-saga-akka/src/main/java/org/apache/servicecomb/pack/alpha/spec/saga/akka/spring/integration/akka/AkkaConfigPropertyAdapter.java
@@ -15,7 +15,7 @@
  * limitations under the License.
  */
 
-package org.apache.servicecomb.pack.alpha.fsm.spring.integration.akka;
+package org.apache.servicecomb.pack.alpha.spec.saga.akka.spring.integration.akka;
 
 import java.lang.invoke.MethodHandles;
 import java.util.ArrayList;
diff --git a/alpha/alpha-spec-saga-fsm/src/main/java/org/apache/servicecomb/pack/alpha/fsm/spring/integration/akka/SagaDataExtension.java b/alpha/alpha-spec-saga-akka/src/main/java/org/apache/servicecomb/pack/alpha/spec/saga/akka/spring/integration/akka/SagaDataExtension.java
similarity index 89%
rename from alpha/alpha-spec-saga-fsm/src/main/java/org/apache/servicecomb/pack/alpha/fsm/spring/integration/akka/SagaDataExtension.java
rename to alpha/alpha-spec-saga-akka/src/main/java/org/apache/servicecomb/pack/alpha/spec/saga/akka/spring/integration/akka/SagaDataExtension.java
index b91c27a..c7676dd 100644
--- a/alpha/alpha-spec-saga-fsm/src/main/java/org/apache/servicecomb/pack/alpha/fsm/spring/integration/akka/SagaDataExtension.java
+++ b/alpha/alpha-spec-saga-akka/src/main/java/org/apache/servicecomb/pack/alpha/spec/saga/akka/spring/integration/akka/SagaDataExtension.java
@@ -15,7 +15,7 @@
  * limitations under the License.
  */
 
-package org.apache.servicecomb.pack.alpha.fsm.spring.integration.akka;
+package org.apache.servicecomb.pack.alpha.spec.saga.akka.spring.integration.akka;
 
 import akka.actor.AbstractExtensionId;
 import akka.actor.ExtendedActorSystem;
@@ -27,11 +27,11 @@ import java.util.concurrent.ConcurrentHashMap;
 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.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.apache.servicecomb.pack.alpha.spec.saga.akka.SagaActorState;
+import org.apache.servicecomb.pack.alpha.spec.saga.akka.metrics.MetricsService;
+import org.apache.servicecomb.pack.alpha.spec.saga.akka.model.SagaData;
+import org.apache.servicecomb.pack.alpha.spec.saga.akka.repository.TransactionRepositoryChannel;
+import org.apache.servicecomb.pack.alpha.spec.saga.akka.spring.integration.akka.SagaDataExtension.SagaDataExt;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
diff --git a/alpha/alpha-spec-saga-fsm/src/main/java/org/apache/servicecomb/pack/alpha/fsm/spring/integration/akka/SpringAkkaExtension.java b/alpha/alpha-spec-saga-akka/src/main/java/org/apache/servicecomb/pack/alpha/spec/saga/akka/spring/integration/akka/SpringAkkaExtension.java
similarity index 92%
rename from alpha/alpha-spec-saga-fsm/src/main/java/org/apache/servicecomb/pack/alpha/fsm/spring/integration/akka/SpringAkkaExtension.java
rename to alpha/alpha-spec-saga-akka/src/main/java/org/apache/servicecomb/pack/alpha/spec/saga/akka/spring/integration/akka/SpringAkkaExtension.java
index 6892a20..019f5c5 100644
--- a/alpha/alpha-spec-saga-fsm/src/main/java/org/apache/servicecomb/pack/alpha/fsm/spring/integration/akka/SpringAkkaExtension.java
+++ b/alpha/alpha-spec-saga-akka/src/main/java/org/apache/servicecomb/pack/alpha/spec/saga/akka/spring/integration/akka/SpringAkkaExtension.java
@@ -15,7 +15,7 @@
  * limitations under the License.
  */
 
-package org.apache.servicecomb.pack.alpha.fsm.spring.integration.akka;
+package org.apache.servicecomb.pack.alpha.spec.saga.akka.spring.integration.akka;
 
 import static org.apache.servicecomb.pack.common.EventType.TxCompensateEvent;
 
@@ -29,8 +29,8 @@ import java.util.concurrent.TimeUnit;
 import java.util.concurrent.TimeoutException;
 import org.apache.servicecomb.pack.alpha.core.OmegaCallback;
 import org.apache.servicecomb.pack.alpha.core.TxEvent;
-import org.apache.servicecomb.pack.alpha.fsm.model.TxEntity;
-import org.apache.servicecomb.pack.alpha.fsm.spring.integration.akka.SpringAkkaExtension.SpringExt;
+import org.apache.servicecomb.pack.alpha.spec.saga.akka.model.TxEntity;
+import org.apache.servicecomb.pack.alpha.spec.saga.akka.spring.integration.akka.SpringAkkaExtension.SpringExt;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.springframework.context.ApplicationContext;
diff --git a/alpha/alpha-spec-saga-fsm/src/main/java/org/apache/servicecomb/pack/alpha/fsm/test/FsmSagaDataController.java b/alpha/alpha-spec-saga-akka/src/main/java/org/apache/servicecomb/pack/alpha/spec/saga/akka/test/FsmSagaDataController.java
similarity index 92%
rename from alpha/alpha-spec-saga-fsm/src/main/java/org/apache/servicecomb/pack/alpha/fsm/test/FsmSagaDataController.java
rename to alpha/alpha-spec-saga-akka/src/main/java/org/apache/servicecomb/pack/alpha/spec/saga/akka/test/FsmSagaDataController.java
index a430355..a0e98f7 100644
--- a/alpha/alpha-spec-saga-fsm/src/main/java/org/apache/servicecomb/pack/alpha/fsm/test/FsmSagaDataController.java
+++ b/alpha/alpha-spec-saga-akka/src/main/java/org/apache/servicecomb/pack/alpha/spec/saga/akka/test/FsmSagaDataController.java
@@ -15,7 +15,7 @@
  * limitations under the License.
  */
 
-package org.apache.servicecomb.pack.alpha.fsm.test;
+package org.apache.servicecomb.pack.alpha.spec.saga.akka.test;
 
 import akka.actor.ActorSystem;
 import com.fasterxml.jackson.annotation.JsonAutoDetect;
@@ -27,8 +27,8 @@ import java.util.LinkedList;
 import java.util.List;
 import java.util.Map;
 import org.apache.servicecomb.pack.alpha.core.TxEvent;
-import org.apache.servicecomb.pack.alpha.fsm.model.SagaData;
-import org.apache.servicecomb.pack.alpha.fsm.spring.integration.akka.SagaDataExtension;
+import org.apache.servicecomb.pack.alpha.spec.saga.akka.model.SagaData;
+import org.apache.servicecomb.pack.alpha.spec.saga.akka.spring.integration.akka.SagaDataExtension;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.springframework.beans.factory.annotation.Autowired;
diff --git a/alpha/alpha-spec-saga-fsm/src/main/resources/META-INF/spring.factories b/alpha/alpha-spec-saga-akka/src/main/resources/META-INF/spring.factories
similarity index 92%
rename from alpha/alpha-spec-saga-fsm/src/main/resources/META-INF/spring.factories
rename to alpha/alpha-spec-saga-akka/src/main/resources/META-INF/spring.factories
index e43b611..6763e65 100644
--- a/alpha/alpha-spec-saga-fsm/src/main/resources/META-INF/spring.factories
+++ b/alpha/alpha-spec-saga-akka/src/main/resources/META-INF/spring.factories
@@ -15,4 +15,4 @@
 ## limitations under the License.
 ## ---------------------------------------------------------------------------
 org.springframework.boot.autoconfigure.EnableAutoConfiguration= \
-  org.apache.servicecomb.pack.alpha.fsm.AlphaSpecSagaFsmAutoConfiguration
+  org.apache.servicecomb.pack.alpha.spec.saga.akka.AlphaSpecSagaAkkaAutoConfiguration
diff --git a/alpha/alpha-spec-saga-fsm/src/test/java/org/apache/servicecomb/pack/alpha/spec/saga/akka/it/SagaApplication.java b/alpha/alpha-spec-saga-akka/src/test/java/org/apache/servicecomb/pack/alpha/spec/saga/akka/it/SagaApplication.java
similarity index 100%
rename from alpha/alpha-spec-saga-fsm/src/test/java/org/apache/servicecomb/pack/alpha/spec/saga/akka/it/SagaApplication.java
rename to alpha/alpha-spec-saga-akka/src/test/java/org/apache/servicecomb/pack/alpha/spec/saga/akka/it/SagaApplication.java
diff --git a/alpha/alpha-spec-saga-fsm/src/test/java/org/apache/servicecomb/pack/alpha/spec/saga/akka/it/SagaIntegrationTest.java b/alpha/alpha-spec-saga-akka/src/test/java/org/apache/servicecomb/pack/alpha/spec/saga/akka/it/SagaIntegrationTest.java
similarity index 97%
rename from alpha/alpha-spec-saga-fsm/src/test/java/org/apache/servicecomb/pack/alpha/spec/saga/akka/it/SagaIntegrationTest.java
rename to alpha/alpha-spec-saga-akka/src/test/java/org/apache/servicecomb/pack/alpha/spec/saga/akka/it/SagaIntegrationTest.java
index 3d53fc0..11479df 100644
--- a/alpha/alpha-spec-saga-fsm/src/test/java/org/apache/servicecomb/pack/alpha/spec/saga/akka/it/SagaIntegrationTest.java
+++ b/alpha/alpha-spec-saga-akka/src/test/java/org/apache/servicecomb/pack/alpha/spec/saga/akka/it/SagaIntegrationTest.java
@@ -27,12 +27,12 @@ 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.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;
-import org.apache.servicecomb.pack.alpha.fsm.spring.integration.akka.SagaDataExtension;
+import org.apache.servicecomb.pack.alpha.spec.saga.akka.channel.memory.MemoryActorEventChannel;
+import org.apache.servicecomb.pack.alpha.spec.saga.akka.metrics.MetricsService;
+import org.apache.servicecomb.pack.alpha.spec.saga.akka.model.SagaData;
+import org.apache.servicecomb.pack.alpha.spec.saga.akka.spring.integration.akka.SagaDataExtension;
 import org.junit.After;
 import org.junit.Before;
 import org.junit.Test;
diff --git a/alpha/alpha-spec-saga-fsm/src/test/java/org/apache/servicecomb/pack/alpha/spec/saga/akka/ut/SagaActorTest.java b/alpha/alpha-spec-saga-akka/src/test/java/org/apache/servicecomb/pack/alpha/spec/saga/akka/ut/SagaActorTest.java
similarity index 97%
rename from alpha/alpha-spec-saga-fsm/src/test/java/org/apache/servicecomb/pack/alpha/spec/saga/akka/ut/SagaActorTest.java
rename to alpha/alpha-spec-saga-akka/src/test/java/org/apache/servicecomb/pack/alpha/spec/saga/akka/ut/SagaActorTest.java
index 76745f9..55edace 100644
--- a/alpha/alpha-spec-saga-fsm/src/test/java/org/apache/servicecomb/pack/alpha/spec/saga/akka/ut/SagaActorTest.java
+++ b/alpha/alpha-spec-saga-akka/src/test/java/org/apache/servicecomb/pack/alpha/spec/saga/akka/ut/SagaActorTest.java
@@ -17,7 +17,7 @@
 
 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.apache.servicecomb.pack.alpha.spec.saga.akka.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;
@@ -38,17 +38,17 @@ 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.SagaActor;
+import org.apache.servicecomb.pack.alpha.spec.saga.akka.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;
-import org.apache.servicecomb.pack.alpha.fsm.repository.elasticsearch.ElasticsearchTransactionRepository;
-import org.apache.servicecomb.pack.alpha.fsm.spring.integration.akka.SagaDataExtension;
+import org.apache.servicecomb.pack.alpha.spec.saga.akka.metrics.MetricsService;
+import org.apache.servicecomb.pack.alpha.spec.saga.akka.model.SagaData;
+import org.apache.servicecomb.pack.alpha.spec.saga.akka.properties.ElasticsearchProperties;
+import org.apache.servicecomb.pack.alpha.spec.saga.akka.repository.TransactionRepository;
+import org.apache.servicecomb.pack.alpha.spec.saga.akka.repository.TransactionRepositoryChannel;
+import org.apache.servicecomb.pack.alpha.spec.saga.akka.repository.channel.DefaultTransactionRepositoryChannel;
+import org.apache.servicecomb.pack.alpha.spec.saga.akka.repository.elasticsearch.ElasticsearchTransactionRepository;
+import org.apache.servicecomb.pack.alpha.spec.saga.akka.spring.integration.akka.SagaDataExtension;
 import org.junit.After;
 import org.junit.AfterClass;
 import org.junit.Assert;
diff --git a/alpha/alpha-spec-saga-fsm/src/test/java/org/apache/servicecomb/pack/alpha/spec/saga/akka/ut/api/APIv1ControllerTest.java b/alpha/alpha-spec-saga-akka/src/test/java/org/apache/servicecomb/pack/alpha/spec/saga/akka/ut/api/APIv1ControllerTest.java
similarity index 97%
rename from alpha/alpha-spec-saga-fsm/src/test/java/org/apache/servicecomb/pack/alpha/spec/saga/akka/ut/api/APIv1ControllerTest.java
rename to alpha/alpha-spec-saga-akka/src/test/java/org/apache/servicecomb/pack/alpha/spec/saga/akka/ut/api/APIv1ControllerTest.java
index 887f487..ff589cf 100644
--- a/alpha/alpha-spec-saga-fsm/src/test/java/org/apache/servicecomb/pack/alpha/spec/saga/akka/ut/api/APIv1ControllerTest.java
+++ b/alpha/alpha-spec-saga-akka/src/test/java/org/apache/servicecomb/pack/alpha/spec/saga/akka/ut/api/APIv1ControllerTest.java
@@ -47,10 +47,10 @@ import org.apache.servicecomb.pack.alpha.core.fsm.repository.model.PagingGlobalT
 import org.apache.servicecomb.pack.alpha.core.fsm.repository.model.SagaSubTransaction;
 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.apache.servicecomb.pack.alpha.spec.saga.akka.api.SagaAkkaAPIv1Controller;
+import org.apache.servicecomb.pack.alpha.spec.saga.akka.metrics.MetricsService;
+import org.apache.servicecomb.pack.alpha.spec.saga.akka.SagaActorState;
+import org.apache.servicecomb.pack.alpha.spec.saga.akka.repository.TransactionRepository;
 import org.junit.Test;
 import org.junit.runner.RunWith;
 import org.springframework.beans.factory.annotation.Autowired;
@@ -64,7 +64,7 @@ import org.springframework.test.web.servlet.result.MockMvcResultMatchers;
 
 @RunWith(SpringRunner.class)
 @ContextConfiguration(classes = {TestConfiguration.class})
-@WebMvcTest(APIv1Controller.class)
+@WebMvcTest(SagaAkkaAPIv1Controller.class)
 public class APIv1ControllerTest {
 
   @Autowired
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-akka/src/test/java/org/apache/servicecomb/pack/alpha/spec/saga/akka/ut/api/TestConfiguration.java
similarity index 73%
rename from alpha/alpha-spec-saga-fsm/src/test/java/org/apache/servicecomb/pack/alpha/spec/saga/akka/ut/api/TestConfiguration.java
rename to alpha/alpha-spec-saga-akka/src/test/java/org/apache/servicecomb/pack/alpha/spec/saga/akka/ut/api/TestConfiguration.java
index 1d5dc6b..1f2b75d 100644
--- 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-akka/src/test/java/org/apache/servicecomb/pack/alpha/spec/saga/akka/ut/api/TestConfiguration.java
@@ -19,11 +19,11 @@ 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.apache.servicecomb.pack.alpha.spec.saga.akka.api.SagaAkkaAPIv1Controller;
+import org.apache.servicecomb.pack.alpha.spec.saga.akka.api.SagaAkkaAPIv1Impl;
+import org.apache.servicecomb.pack.alpha.spec.saga.akka.metrics.MetricsService;
+import org.apache.servicecomb.pack.alpha.spec.saga.akka.metrics.AlphaMetricsEndpointImpl;
+import org.apache.servicecomb.pack.alpha.spec.saga.akka.repository.TransactionRepository;
 import org.springframework.boot.test.mock.mockito.MockBean;
 import org.springframework.context.annotation.Bean;
 import org.springframework.context.annotation.Configuration;
@@ -49,12 +49,12 @@ public class TestConfiguration {
   }
 
   @Bean
-  APIv1Controller apIv1Controller(){
-    return new APIv1Controller();
+  SagaAkkaAPIv1Controller apIv1Controller(){
+    return new SagaAkkaAPIv1Controller();
   }
 
   @Bean
-  APIv1Impl apIv1(){
-    return new APIv1Impl();
+  SagaAkkaAPIv1Impl apIv1(){
+    return new SagaAkkaAPIv1Impl();
   }
 }
\ No newline at end of file
diff --git a/alpha/alpha-spec-saga-fsm/src/test/java/org/apache/servicecomb/pack/alpha/spec/saga/akka/ut/model/TxEntitiesTest.java b/alpha/alpha-spec-saga-akka/src/test/java/org/apache/servicecomb/pack/alpha/spec/saga/akka/ut/model/TxEntitiesTest.java
similarity index 93%
rename from alpha/alpha-spec-saga-fsm/src/test/java/org/apache/servicecomb/pack/alpha/spec/saga/akka/ut/model/TxEntitiesTest.java
rename to alpha/alpha-spec-saga-akka/src/test/java/org/apache/servicecomb/pack/alpha/spec/saga/akka/ut/model/TxEntitiesTest.java
index c647dd6..bcd8059 100644
--- a/alpha/alpha-spec-saga-fsm/src/test/java/org/apache/servicecomb/pack/alpha/spec/saga/akka/ut/model/TxEntitiesTest.java
+++ b/alpha/alpha-spec-saga-akka/src/test/java/org/apache/servicecomb/pack/alpha/spec/saga/akka/ut/model/TxEntitiesTest.java
@@ -26,8 +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.apache.servicecomb.pack.alpha.spec.saga.akka.model.TxEntities;
+import org.apache.servicecomb.pack.alpha.spec.saga.akka.model.TxEntity;
 import org.junit.Test;
 
 public class TxEntitiesTest {
diff --git a/alpha/alpha-spec-saga-fsm/src/test/java/org/apache/servicecomb/pack/alpha/spec/saga/akka/ut/repository/ElasticsearchTransactionRepositoryTest.java b/alpha/alpha-spec-saga-akka/src/test/java/org/apache/servicecomb/pack/alpha/spec/saga/akka/ut/repository/ElasticsearchTransactionRepositoryTest.java
similarity index 92%
rename from alpha/alpha-spec-saga-fsm/src/test/java/org/apache/servicecomb/pack/alpha/spec/saga/akka/ut/repository/ElasticsearchTransactionRepositoryTest.java
rename to alpha/alpha-spec-saga-akka/src/test/java/org/apache/servicecomb/pack/alpha/spec/saga/akka/ut/repository/ElasticsearchTransactionRepositoryTest.java
index 4a99444..0161b17 100644
--- a/alpha/alpha-spec-saga-fsm/src/test/java/org/apache/servicecomb/pack/alpha/spec/saga/akka/ut/repository/ElasticsearchTransactionRepositoryTest.java
+++ b/alpha/alpha-spec-saga-akka/src/test/java/org/apache/servicecomb/pack/alpha/spec/saga/akka/ut/repository/ElasticsearchTransactionRepositoryTest.java
@@ -28,11 +28,11 @@ import java.util.Date;
 import java.util.UUID;
 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.spec.saga.akka.SagaActorState;
+import org.apache.servicecomb.pack.alpha.spec.saga.akka.metrics.MetricsService;
+import org.apache.servicecomb.pack.alpha.spec.saga.akka.properties.ElasticsearchProperties;
+import org.apache.servicecomb.pack.alpha.spec.saga.akka.repository.TransactionRepository;
+import org.apache.servicecomb.pack.alpha.spec.saga.akka.repository.elasticsearch.ElasticsearchTransactionRepository;
 import org.junit.Before;
 import org.junit.Test;
 import org.junit.runner.RunWith;
diff --git a/alpha/alpha-spec-saga-fsm/src/test/java/org/apache/servicecomb/pack/alpha/spec/saga/akka/util/SagaEventSender.java b/alpha/alpha-spec-saga-akka/src/test/java/org/apache/servicecomb/pack/alpha/spec/saga/akka/util/SagaEventSender.java
similarity index 100%
rename from alpha/alpha-spec-saga-fsm/src/test/java/org/apache/servicecomb/pack/alpha/spec/saga/akka/util/SagaEventSender.java
rename to alpha/alpha-spec-saga-akka/src/test/java/org/apache/servicecomb/pack/alpha/spec/saga/akka/util/SagaEventSender.java
diff --git a/alpha/alpha-spec-saga-fsm/src/test/resources/application.yaml b/alpha/alpha-spec-saga-akka/src/test/resources/application.yaml
similarity index 100%
rename from alpha/alpha-spec-saga-fsm/src/test/resources/application.yaml
rename to alpha/alpha-spec-saga-akka/src/test/resources/application.yaml
diff --git a/alpha/alpha-spec-saga-fsm/src/test/resources/log4j2.xml b/alpha/alpha-spec-saga-akka/src/test/resources/log4j2.xml
similarity index 100%
rename from alpha/alpha-spec-saga-fsm/src/test/resources/log4j2.xml
rename to alpha/alpha-spec-saga-akka/src/test/resources/log4j2.xml
diff --git a/alpha/alpha-spec-saga-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
deleted file mode 100644
index 6e3cfe7..0000000
--- a/alpha/alpha-spec-saga-fsm/src/main/java/org/apache/servicecomb/pack/alpha/fsm/channel/kafka/KafkaActorEventChannel.java
+++ /dev/null
@@ -1,37 +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.kafka;
-
-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;
-
-public class KafkaActorEventChannel extends AbstractActorEventChannel {
-
-  private KafkaMessagePublisher kafkaMessagePublisher;
-
-  public KafkaActorEventChannel(MetricsService metricsService, KafkaMessagePublisher kafkaMessagePublisher) {
-    super(metricsService);
-    this.kafkaMessagePublisher = kafkaMessagePublisher;
-  }
-
-  @Override
-  public void sendTo(BaseEvent event){
-      kafkaMessagePublisher.publish(event);
-  }
-}
diff --git a/alpha/alpha-spec-saga-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
deleted file mode 100644
index a2a32b4..0000000
--- a/alpha/alpha-spec-saga-fsm/src/main/java/org/apache/servicecomb/pack/alpha/fsm/channel/kafka/KafkaChannelAutoConfiguration.java
+++ /dev/null
@@ -1,153 +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.kafka;
-
-import akka.actor.ActorRef;
-import akka.actor.ActorSystem;
-import com.google.common.collect.Maps;
-import java.lang.invoke.MethodHandles;
-import java.util.Collections;
-import java.util.HashMap;
-import java.util.Map;
-import java.util.concurrent.ExecutionException;
-import javax.annotation.PostConstruct;
-import org.apache.kafka.clients.admin.AdminClient;
-import org.apache.kafka.clients.admin.CreateTopicsResult;
-import org.apache.kafka.clients.admin.KafkaAdminClient;
-import org.apache.kafka.clients.admin.NewTopic;
-import org.apache.kafka.clients.producer.ProducerConfig;
-import org.apache.kafka.common.errors.TopicExistsException;
-import org.apache.kafka.common.serialization.StringSerializer;
-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.ConditionalOnClass;
-import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
-import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
-import org.springframework.boot.autoconfigure.kafka.KafkaProperties;
-import org.springframework.context.annotation.Bean;
-import org.springframework.context.annotation.Configuration;
-import org.springframework.context.annotation.Lazy;
-import org.springframework.kafka.core.DefaultKafkaProducerFactory;
-import org.springframework.kafka.core.KafkaTemplate;
-import org.springframework.kafka.support.serializer.JsonSerializer;
-
-@Configuration
-@ConditionalOnClass(KafkaProperties.class)
-@ConditionalOnProperty(value = "alpha.feature.akka.channel.type", havingValue = "kafka")
-public class KafkaChannelAutoConfiguration {
-
-  private static final Logger LOG = LoggerFactory.getLogger(MethodHandles.lookup().lookupClass());
-
-  @Value("${alpha.feature.akka.channel.kafka.topic:servicecomb-pack-actor-event}")
-  private String topic;
-
-  @Value("${spring.kafka.bootstrap-servers}")
-  private String bootstrap_servers;
-
-  @Value("${spring.kafka.consumer.group-id:servicecomb-pack}")
-  private String groupId;
-
-  @Value("${spring.kafka.consumer.properties.spring.json.trusted.packages:org.apache.servicecomb.pack.alpha.core.fsm.event,org.apache.servicecomb.pack.alpha.core.fsm.event.base,}org.apache.servicecomb.pack.alpha.core.fsm.event.internal")
-  private String trusted_packages;
-
-  @Value("${spring.kafka.producer.batch-size:16384}")
-  private int batchSize;
-
-  @Value("${spring.kafka.producer.retries:0}")
-  private int retries;
-
-  @Value("${spring.kafka.producer.buffer.memory:33554432}")
-  private long bufferMemory;
-
-  @Value("${spring.kafka.consumer.auto.offset.reset:earliest}")
-  private String autoOffsetReset;
-
-  @Value("${spring.kafka.consumer.enable.auto.commit:false}")
-  private boolean enableAutoCommit;
-
-  @Value("${spring.kafka.consumer.auto.commit.interval.ms:100}")
-  private int autoCommitIntervalMs;
-
-  @Value("${spring.kafka.listener.ackMode:MANUAL_IMMEDIATE}")
-  private String ackMode;
-
-  @Value("${spring.kafka.listener.pollTimeout:1500}")
-  private long poolTimeout;
-
-  @Value("${kafka.numPartitions:6}")
-  private int numPartitions;
-
-  @Value("${kafka.replicationFactor:1}")
-  private short replicationFactor;
-
-  @PostConstruct
-  public void init() {
-    Map props = new HashMap<>();
-    props.put(ProducerConfig.BOOTSTRAP_SERVERS_CONFIG, bootstrap_servers);
-    props.put(ProducerConfig.MAX_BLOCK_MS_CONFIG, 50000);
-    try (final AdminClient adminClient = KafkaAdminClient.create(props)) {
-      try {
-        final NewTopic newTopic = new NewTopic(topic, numPartitions, replicationFactor);
-        final CreateTopicsResult createTopicsResult = adminClient
-            .createTopics(Collections.singleton(newTopic));
-        createTopicsResult.values().get(topic).get();
-      } catch (InterruptedException | ExecutionException e) {
-        if (e.getCause() instanceof InterruptedException) {
-          Thread.currentThread().interrupt();
-        }
-        if (!(e.getCause() instanceof TopicExistsException)) {
-          throw new RuntimeException(e.getMessage(), e);
-        }
-      }
-    }
-    LOG.info("Kafka Channel Init");
-  }
-
-  @Bean
-  @ConditionalOnMissingBean
-  public KafkaMessagePublisher kafkaMessagePublisher() {
-    Map<String, Object> map = Maps.newHashMap();
-    map.put(ProducerConfig.BOOTSTRAP_SERVERS_CONFIG, bootstrap_servers);
-    map.put(ProducerConfig.KEY_SERIALIZER_CLASS_CONFIG, StringSerializer.class);
-    map.put(ProducerConfig.VALUE_SERIALIZER_CLASS_CONFIG, JsonSerializer.class);
-    map.put(ProducerConfig.RETRIES_CONFIG, retries);
-    map.put(ProducerConfig.BATCH_SIZE_CONFIG, batchSize);
-    map.put(ProducerConfig.BUFFER_MEMORY_CONFIG, bufferMemory);
-    return new KafkaMessagePublisher(topic,
-        new KafkaTemplate<>(new DefaultKafkaProducerFactory<>(map)));
-  }
-
-  @Bean
-  @ConditionalOnMissingBean(ActorEventChannel.class)
-  public ActorEventChannel kafkaEventChannel(MetricsService metricsService,
-      @Lazy KafkaMessagePublisher kafkaMessagePublisher) {
-    return new KafkaActorEventChannel(metricsService, kafkaMessagePublisher);
-  }
-
-  @Bean
-  KafkaSagaEventConsumer sagaEventKafkaConsumer(ActorSystem actorSystem,
-      @Qualifier("sagaShardRegionActor") ActorRef sagaShardRegionActor,
-      MetricsService metricsService) {
-    return new KafkaSagaEventConsumer(actorSystem, sagaShardRegionActor, metricsService,
-        bootstrap_servers, topic);
-  }
-}
diff --git a/alpha/alpha-spec-saga-fsm/src/main/java/org/apache/servicecomb/pack/alpha/fsm/properties/ChannelKafkaProperties.java b/alpha/alpha-spec-saga-fsm/src/main/java/org/apache/servicecomb/pack/alpha/fsm/properties/ChannelKafkaProperties.java
deleted file mode 100644
index 2f76334..0000000
--- a/alpha/alpha-spec-saga-fsm/src/main/java/org/apache/servicecomb/pack/alpha/fsm/properties/ChannelKafkaProperties.java
+++ /dev/null
@@ -1,21 +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.properties;
-
-public class ChannelKafkaProperties {
-
-}
\ No newline at end of file
diff --git a/alpha/pom.xml b/alpha/pom.xml
index 7f13aef..1f37b85 100644
--- a/alpha/pom.xml
+++ b/alpha/pom.xml
@@ -34,7 +34,7 @@
   <modules>
     <module>alpha-core</module>
     <module>alpha-persistence-jpa</module>
-    <module>alpha-spec-saga-fsm</module>
+    <module>alpha-spec-saga-akka</module>
     <module>alpha-spec-saga-db</module>
     <module>alpha-spec-tcc-db</module>
     <module>alpha-benchmark</module>
diff --git a/omega/omega-spring-starter/src/main/java/org/apache/servicecomb/pack/omega/spring/OmegaSagaSpringConfig.java b/omega/omega-spring-starter/src/main/java/org/apache/servicecomb/pack/omega/spring/OmegaSagaSpringConfig.java
new file mode 100644
index 0000000..7d0b0ac
--- /dev/null
+++ b/omega/omega-spring-starter/src/main/java/org/apache/servicecomb/pack/omega/spring/OmegaSagaSpringConfig.java
@@ -0,0 +1,87 @@
+/*
+ * 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.omega.spring;
+
+import com.google.common.collect.ImmutableList;
+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.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.transaction.CallbackContext;
+import org.apache.servicecomb.pack.omega.context.OmegaContext;
+import org.apache.servicecomb.pack.omega.context.ServiceConfig;
+import org.apache.servicecomb.pack.omega.transaction.SagaMessageSender;
+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.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+
+import java.lang.invoke.MethodHandles;
+
+@Configuration
+@ConditionalOnExpression("'${omega.spec.names}'.contains('saga')")
+class OmegaSagaSpringConfig {
+
+  private static final Logger LOG = LoggerFactory.getLogger(MethodHandles.lookup().lookupClass());
+
+  public OmegaSagaSpringConfig() {
+    LOG.info("Omega Specification Saga");
+  }
+
+  @Bean(name = {"compensationContext"})
+  CallbackContext compensationContext(OmegaContext omegaContext, SagaMessageSender sender) {
+    return new CallbackContext(omegaContext, sender);
+  }
+
+  @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;
+  }
+}
diff --git a/pack-dependencies/pom.xml b/pack-dependencies/pom.xml
index 6ba6177..057254c 100644
--- a/pack-dependencies/pom.xml
+++ b/pack-dependencies/pom.xml
@@ -269,7 +269,7 @@
       </dependency>
       <dependency>
         <groupId>org.apache.servicecomb.pack</groupId>
-        <artifactId>alpha-spec-saga-fsm</artifactId>
+        <artifactId>alpha-spec-saga-akka</artifactId>
         <version>${project.version}</version>
       </dependency>
       <dependency>