You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@ignite.apache.org by dp...@apache.org on 2019/06/02 11:24:53 UTC

[ignite-teamcity-bot] branch master updated: IGNITE-10989: TC Bot refactoring: extracted module Teamcity Ignited, tcbot-persistence

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

dpavlov pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/ignite-teamcity-bot.git


The following commit(s) were added to refs/heads/master by this push:
     new a2d52d5  IGNITE-10989: TC Bot refactoring: extracted module Teamcity Ignited, tcbot-persistence
a2d52d5 is described below

commit a2d52d565f14e7f80d8296b6abfa27c1dd45aa3b
Author: Dmitriy Pavlov <dp...@apache.org>
AuthorDate: Sun Jun 2 14:24:44 2019 +0300

    IGNITE-10989: TC Bot refactoring: extracted module Teamcity Ignited, tcbot-persistence
---
 ignite-tc-helper-web/build.gradle                  |  6 +-
 .../apache/ignite/ci/IgnitePersistentTeamcity.java | 10 +--
 .../ignite/ci/analysis/IMultTestOccurrence.java    |  2 +-
 .../apache/ignite/ci/analysis/LogCheckResult.java  |  4 +-
 .../apache/ignite/ci/analysis/MultBuildRunCtx.java |  4 +-
 .../ignite/ci/analysis/SingleBuildRunCtx.java      |  4 +-
 .../apache/ignite/ci/analysis/SuiteInBranch.java   | 75 ----------------------
 .../ignite/ci/analysis/TestCompactedMult.java      |  4 +-
 .../apache/ignite/ci/analysis/TestInBranch.java    | 71 --------------------
 .../ignite/ci/analysis/TestLogCheckResult.java     |  2 +-
 .../java/org/apache/ignite/ci/db/Ignite1Init.java  |  2 +-
 .../java/org/apache/ignite/ci/db/TcHelperDb.java   | 26 +-------
 .../org/apache/ignite/ci/di/IgniteTcBotModule.java |  1 +
 .../ignite/ci/di/MonitoredTaskInterceptor.java     |  1 +
 .../ignite/ci/di/cache/GuavaCachedInterceptor.java |  1 +
 .../ignite/ci/di/cache/GuavaCachedModule.java      |  1 +
 .../ignite/ci/di/scheduler/SchedulerModule.java    |  1 +
 .../ignite/ci/di/scheduler/TcBotScheduler.java     |  3 +-
 .../org/apache/ignite/ci/github/GitHubBranch.java  |  2 +-
 .../apache/ignite/ci/github/GitHubBranchKey.java   |  2 +-
 .../apache/ignite/ci/github/GitHubBranchShort.java |  2 +-
 .../org/apache/ignite/ci/github/GitHubCommit.java  |  2 +-
 .../org/apache/ignite/ci/github/GitHubUser.java    |  2 +-
 .../org/apache/ignite/ci/github/PullRequest.java   |  5 +-
 .../ci/github/ignited/GitHubConnIgnitedImpl.java   |  4 +-
 .../org/apache/ignite/ci/issue/EventTemplate.java  |  4 +-
 .../org/apache/ignite/ci/issue/EventTemplates.java |  8 +--
 .../java/org/apache/ignite/ci/issue/Issue.java     |  2 +-
 .../java/org/apache/ignite/ci/issue/IssueKey.java  |  2 +-
 .../apache/ignite/ci/jira/ignited/JiraIgnited.java |  2 +-
 .../ignite/ci/jira/ignited/JiraTicketDao.java      |  4 +-
 .../ignite/ci/jira/ignited/JiraTicketSync.java     |  6 +-
 .../ignite/ci/jira/ignited/TicketCompacted.java    |  2 +-
 .../org/apache/ignite/ci/jobs/CheckQueueJob.java   | 14 ++--
 .../apache/ignite/ci/observer/BuildObserver.java   | 14 ++--
 .../org/apache/ignite/ci/observer/BuildsInfo.java  | 10 +--
 .../ignite/ci/observer/CompactBuildsInfo.java      |  2 +-
 .../apache/ignite/ci/observer/ObserverTask.java    | 12 ++--
 .../runners/IgniteTeamcityHelperRunnerExample.java |  6 +-
 .../ignite/ci/runners/RemoteClientTmpHelper.java   |  8 +--
 .../org/apache/ignite/ci/tcbot/ITcBotBgAuth.java   |  6 +-
 .../apache/ignite/ci/tcbot/TcBotBgAuthImpl.java    |  8 +--
 .../ci/tcbot/builds/CompareBuildsService.java      | 10 +--
 .../ignite/ci/tcbot/chain/BuildChainProcessor.java |  9 +--
 .../ignite/ci/tcbot/chain/PrChainsProcessor.java   | 27 ++++----
 .../tcbot/chain/TrackedBranchChainsProcessor.java  | 17 +++--
 .../ci/tcbot/conf/LocalFilesBasedConfig.java       |  2 +-
 .../ignite/ci/tcbot/issue/IssueDetector.java       | 35 +++++-----
 .../ci/tcbot/trends/MasterTrendsService.java       | 16 ++---
 .../ignite/ci/tcbot/visa/BranchTicketMatcher.java  |  2 +-
 .../tcbot/visa/TcBotTriggerAndSignOffService.java  | 32 ++++-----
 .../ci/teamcity/restcached/ITcServerProvider.java  |  5 +-
 .../restcached/InitializingServerFactory.java      |  7 +-
 .../restcached/TcServerCachingProvider.java        |  5 +-
 .../ITcBotUserCreds.java}                          | 28 ++++----
 .../org/apache/ignite/ci/user/TcHelperUser.java    |  5 +-
 .../org/apache/ignite/ci/user/UserSession.java     |  2 +-
 .../java/org/apache/ignite/ci/util/ZipUtil.java    | 72 ---------------------
 .../java/org/apache/ignite/ci/web/CtxListener.java | 15 ++---
 .../ignite/ci/web/auth/AuthenticationFilter.java   |  8 +--
 .../ci/web/model/CompactContributionKey.java       |  2 +-
 .../apache/ignite/ci/web/model/CompactVisa.java    |  2 +-
 .../ignite/ci/web/model/CompactVisaRequest.java    |  2 +-
 .../ignite/ci/web/model/ContributionKey.java       |  2 +-
 .../model/current/ChainAtServerCurrentStatus.java  |  4 +-
 .../ci/web/model/current/SuiteCurrentStatus.java   | 17 ++---
 .../ignite/ci/web/model/current/TestFailure.java   | 13 ++--
 .../ignite/ci/web/model/hist/TestHistory.java      |  2 +-
 .../ci/web/model/hist/VisasHistoryStorage.java     |  2 +-
 .../web/model/trends/BuildStatisticsSummary.java   |  2 +-
 .../ignite/ci/web/model/trends/BuildsHistory.java  |  2 +-
 .../ignite/ci/web/rest/GetChainResultsAsHtml.java  | 14 ++--
 .../ignite/ci/web/rest/GetTrackedBranches.java     | 10 +--
 .../apache/ignite/ci/web/rest/TriggerBuilds.java   | 10 +--
 .../ignite/ci/web/rest/build/CompareBuilds.java    |  6 +-
 .../ci/web/rest/build/GetBuildTestFailures.java    | 19 +++---
 .../org/apache/ignite/ci/web/rest/login/Login.java |  2 +-
 .../ignite/ci/web/rest/login/UserService.java      | 16 ++---
 .../long_running/BuildsLongRunningTestsReport.java |  4 +-
 .../ignite/ci/web/rest/pr/GetPrTestFailures.java   |  6 +-
 .../rest/tracked/GetTrackedBranchTestResults.java  | 12 ++--
 .../ignite/ci/web/rest/visa/TcBotVisaService.java  | 12 ++--
 .../org/apache/ignite/ci/di/DiContextTest.java     |  7 +-
 .../org/apache/ignite/ci/di/cache/CachingTest.java |  2 +
 .../ci/di/scheduler/DirectExecNoWaitScheduler.java |  4 +-
 .../ci/tcbot/chain/BuildChainProcessorTest.java    |  9 ++-
 .../ci/tcbot/chain/MockBasedTcBotModule.java       | 10 +--
 .../ci/tcbot/chain/PrChainsProcessorTest.java      | 12 ++--
 .../ci/tcbot/chain/TrackedBranchProcessorTest.java | 10 +--
 .../ignite/ci/tcbot/issue/IssueDetectorTest.java   |  8 +--
 .../ci/teamcity/ignited/BuildKeyUnitTest.java      |  1 +
 .../ignited/IgnitedTcInMemoryIntegrationTest.java  | 46 +++++++------
 .../teamcity/ignited/InMemoryStringCompactor.java  |  2 +
 .../ci/teamcity/ignited/TeamcityIgnitedMock.java   | 15 +++--
 .../ignited/TeamcityIgnitedProviderMock.java       | 17 +++--
 .../org/apache/ignite/ci/user/LoginAuthTest.java   |  2 +-
 settings.gradle                                    |  1 +
 .../tcbot/common/interceptor}/GuavaCached.java     |  4 +-
 .../tcbot/common/interceptor}/MonitoredTask.java   |  2 +-
 .../ignite/tcbot/common}/util/NumberUtil.java      |  2 +-
 .../build.gradle                                   |  5 +-
 .../ci/tcbot/common/StringFieldCompacted.java      | 12 +++-
 .../ci/teamcity/ignited/IgniteStringCompactor.java | 38 +++++++++++
 .../ignite/tcbot/persistence/CacheConfigs.java     | 37 ++++++-----
 .../tcbot/persistence}/IStringCompactor.java       |  2 +-
 .../tcbot/persistence}/IVersionedEntity.java       |  2 +-
 .../tcbot/persistence}/IgniteStringCompactor.java  | 73 +++++----------------
 .../ignite/tcbot/persistence}/Persisted.java       |  2 +-
 .../tcbot/persistence}/scheduler/IScheduler.java   |  5 +-
 tcbot-teamcity-ignited/build.gradle                |  2 +-
 .../ci/teamcity/ignited/BuildRefCompacted.java     | 12 ++--
 .../teamcity/ignited/TcIgnitedCachingProvider.java | 22 ++++---
 .../ci/teamcity/ignited/TeamcityIgnitedImpl.java   | 39 +++++------
 .../ci/teamcity/ignited/TeamcityIgnitedModule.java | 21 +++---
 .../ignited/buildcondition/BuildCondition.java     |  0
 .../buildcondition/BuildConditionCompacted.java    |  4 +-
 .../ignited/buildcondition/BuildConditionDao.java  |  4 +-
 .../ci/teamcity/ignited/buildref/BuildRefDao.java  | 17 ++---
 .../ci/teamcity/ignited/buildref/BuildRefSync.java |  8 +--
 .../ignited/buildtype/BuildTypeCompacted.java      | 12 ++--
 .../teamcity/ignited/buildtype/BuildTypeDao.java   | 14 ++--
 .../ignited/buildtype/BuildTypeRefCompacted.java   | 14 ++--
 .../ignited/buildtype/BuildTypeRefDao.java         | 14 ++--
 .../teamcity/ignited/buildtype/BuildTypeSync.java  |  8 +--
 .../ignited/buildtype/ParametersCompacted.java     |  5 +-
 .../buildtype/SnapshotDependencyCompacted.java     |  2 +-
 .../teamcity/ignited/change/ChangeCompacted.java   |  8 ++-
 .../ci/teamcity/ignited/change/ChangeDao.java      |  6 +-
 .../ci/teamcity/ignited/change/ChangeSync.java     |  6 +-
 .../teamcity/ignited/change/RevisionCompacted.java |  6 +-
 .../ignited/fatbuild/FatBuildCompacted.java        | 15 +++--
 .../ci/teamcity/ignited/fatbuild/FatBuildDao.java  | 14 ++--
 .../ignited/fatbuild/ProactiveFatBuildSync.java    | 18 +++---
 .../ignited/fatbuild/ProblemCompacted.java         |  2 +-
 .../ignited/fatbuild/StatisticsCompacted.java      |  5 +-
 .../teamcity/ignited/fatbuild/TestCompacted.java   |  9 ++-
 .../ignited/fatbuild/TriggeredCompacted.java       |  0
 .../ignite/ci/teamcity/ignited/mute/MuteDao.java   |  6 +-
 .../teamcity/ignited/mute/MuteInfoCompacted.java   |  2 +-
 .../teamcity/ignited/mute/MuteScopeCompacted.java  |  2 +-
 .../ignite/ci/teamcity/ignited/mute/MuteSync.java  |  5 +-
 .../ci/teamcity/ignited/runhist/Invocation.java    |  5 +-
 .../teamcity/ignited/runhist/InvocationData.java   |  9 ++-
 .../teamcity/ignited/runhist/RunHistCompacted.java | 13 ++--
 .../ignited/runhist/RunHistCompactedDao.java       | 22 +++----
 .../ci/teamcity/ignited/runhist/RunHistKey.java    |  0
 .../ci/teamcity/ignited/runhist/RunHistSync.java   | 35 +++++-----
 .../apache/ignite/tcignited}/ITeamcityIgnited.java | 20 +++---
 .../tcignited}/ITeamcityIgnitedProvider.java       |  4 +-
 .../org/apache/ignite/tcignited}/SyncMode.java     |  2 +-
 .../ignite/tcignited/creds}/ICredentialsProv.java  | 17 +----
 .../ignite/tcignited/history}/ChangesState.java    |  2 +-
 .../ignite/tcignited/history/IEventTemplate.java   | 12 ++--
 .../ignite/tcignited/history}/IRunHistory.java     |  5 +-
 .../apache/ignite/tcignited/history}/IRunStat.java |  2 +-
 .../ignite/tcignited/history}/RunStatus.java       |  2 +-
 ...nection.java => TeamcityServiceConnection.java} |  7 +-
 .../apache/ignite/tcservice/login/TcLoginImpl.java |  6 +-
 .../tcservice/util/TcConnectionStaticLinker.java   |  6 +-
 159 files changed, 697 insertions(+), 909 deletions(-)

diff --git a/ignite-tc-helper-web/build.gradle b/ignite-tc-helper-web/build.gradle
index c89468e..27fe1a7 100644
--- a/ignite-tc-helper-web/build.gradle
+++ b/ignite-tc-helper-web/build.gradle
@@ -30,6 +30,7 @@ repositories {
 dependencies {
     compile (project(":tcbot-common"));
     compile (project(":tcbot-teamcity"));
+    compile (project(":tcbot-teamcity-ignited"));
 
     compile group: 'com.google.guava', name: 'guava', version: guavaVer
 
@@ -70,15 +71,10 @@ dependencies {
 
     compile group: 'com.ullink.slack', name: 'simpleslackapi', version: '1.2.0'
 
-    compile group: 'javax.inject', name: 'javax.inject', version: '1'
     compile group: 'com.google.inject', name: 'guice', version: '4.2.0'
 
     compile group: 'org.xerial.snappy', name: 'snappy-java', version: '1.1.7.2'
 
-    /// JAXB replacement for Java 11
-    compile group: 'javax.xml.bind', name: 'jaxb-api', version: '2.3.1'
-    compile group: 'com.sun.xml.bind', name: 'jaxb-impl', version: '2.3.0'
-    compile group: 'com.sun.xml.bind', name: 'jaxb-core', version: '2.3.0'
 
 }
 
diff --git a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/IgnitePersistentTeamcity.java b/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/IgnitePersistentTeamcity.java
index 76c93d0..bf7e077 100644
--- a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/IgnitePersistentTeamcity.java
+++ b/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/IgnitePersistentTeamcity.java
@@ -29,12 +29,12 @@ import javax.annotation.Nullable;
 import javax.inject.Inject;
 import org.apache.ignite.Ignite;
 import org.apache.ignite.IgniteCache;
-import org.apache.ignite.ci.analysis.IVersionedEntity;
 import org.apache.ignite.ci.analysis.LogCheckResult;
 import org.apache.ignite.ci.db.DbMigrations;
-import org.apache.ignite.ci.db.TcHelperDb;
 import org.apache.ignite.tcbot.common.interceptor.AutoProfiling;
 import org.apache.ignite.tcbot.common.conf.ITcServerConfig;
+import org.apache.ignite.tcbot.persistence.CacheConfigs;
+import org.apache.ignite.tcbot.persistence.IVersionedEntity;
 import org.apache.ignite.tcservice.ITeamcity;
 import org.apache.ignite.tcservice.model.agent.Agent;
 import org.apache.ignite.tcservice.model.changes.Change;
@@ -98,7 +98,7 @@ public class IgnitePersistentTeamcity implements IAnalyticsEnabledTeamcity, ITea
      * @param name Cache name.
      */
     private <K, V> IgniteCache<K, V> getOrCreateCacheV2(String name) {
-        final IgniteCache<K, V> cache = ignite.getOrCreateCache(TcHelperDb.getCacheV2Config(name));
+        final IgniteCache<K, V> cache = ignite.getOrCreateCache(CacheConfigs.getCacheV2Config(name));
 
         cache.enableStatistics(true);
 
@@ -174,8 +174,8 @@ public class IgnitePersistentTeamcity implements IAnalyticsEnabledTeamcity, ITea
      * @return
      */
     public <K, V extends IVersionedEntity> CompletableFuture<V> loadFutureIfAbsentVers(IgniteCache<K, V> cache,
-        K key,
-        Function<K, CompletableFuture<V>> submitFunction) {
+                                                                                       K key,
+                                                                                       Function<K, CompletableFuture<V>> submitFunction) {
         @Nullable final V persistedVal = cache.get(key);
 
         if (persistedVal != null && !persistedVal.isOutdatedEntityVersion()) {
diff --git a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/analysis/IMultTestOccurrence.java b/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/analysis/IMultTestOccurrence.java
index ea39bad..095301c 100644
--- a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/analysis/IMultTestOccurrence.java
+++ b/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/analysis/IMultTestOccurrence.java
@@ -18,7 +18,7 @@
 package org.apache.ignite.ci.analysis;
 
 import org.apache.ignite.tcservice.model.result.tests.TestOccurrenceFull;
-import org.apache.ignite.ci.teamcity.ignited.IRunHistory;
+import org.apache.ignite.tcignited.history.IRunHistory;
 
 /**
  * Multiple test occurrence. For single build context - max 1 failure
diff --git a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/analysis/LogCheckResult.java b/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/analysis/LogCheckResult.java
index 29e36e3..6bdce53 100644
--- a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/analysis/LogCheckResult.java
+++ b/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/analysis/LogCheckResult.java
@@ -25,7 +25,9 @@ import java.util.Set;
 import java.util.TreeMap;
 import java.util.TreeSet;
 import javax.annotation.Nonnull;
-import org.apache.ignite.ci.db.Persisted;
+
+import org.apache.ignite.tcbot.persistence.IVersionedEntity;
+import org.apache.ignite.tcbot.persistence.Persisted;
 import org.jetbrains.annotations.Nullable;
 
 /**
diff --git a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/analysis/MultBuildRunCtx.java b/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/analysis/MultBuildRunCtx.java
index 2e8c8da..2c73d68 100644
--- a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/analysis/MultBuildRunCtx.java
+++ b/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/analysis/MultBuildRunCtx.java
@@ -36,8 +36,8 @@ import org.apache.ignite.tcbot.common.conf.ITcServerConfig;
 import org.apache.ignite.tcservice.model.hist.BuildRef;
 import org.apache.ignite.tcservice.model.result.problems.ProblemOccurrence;
 import org.apache.ignite.tcservice.model.result.stat.Statistics;
-import org.apache.ignite.ci.teamcity.ignited.IRunHistory;
-import org.apache.ignite.ci.teamcity.ignited.IStringCompactor;
+import org.apache.ignite.tcignited.history.IRunHistory;
+import org.apache.ignite.tcbot.persistence.IStringCompactor;
 import org.apache.ignite.ci.teamcity.ignited.change.ChangeCompacted;
 import org.apache.ignite.ci.teamcity.ignited.fatbuild.ProblemCompacted;
 import org.apache.ignite.ci.teamcity.ignited.fatbuild.TestCompacted;
diff --git a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/analysis/SingleBuildRunCtx.java b/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/analysis/SingleBuildRunCtx.java
index 348a817..8cbc24d 100644
--- a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/analysis/SingleBuildRunCtx.java
+++ b/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/analysis/SingleBuildRunCtx.java
@@ -33,13 +33,11 @@ import java.util.regex.Pattern;
 import java.util.stream.Stream;
 import javax.annotation.Nonnull;
 
-import org.apache.ignite.tcbot.common.conf.IParameterValueSpec;
 import org.apache.ignite.tcservice.ITeamcity;
-import org.apache.ignite.ci.tcbot.conf.BuildParameterSpec;
 import org.apache.ignite.tcbot.common.conf.IBuildParameterSpec;
 import org.apache.ignite.tcbot.common.conf.ITcServerConfig;
 import org.apache.ignite.tcservice.model.result.tests.TestOccurrenceFull;
-import org.apache.ignite.ci.teamcity.ignited.IStringCompactor;
+import org.apache.ignite.tcbot.persistence.IStringCompactor;
 import org.apache.ignite.ci.teamcity.ignited.buildtype.ParametersCompacted;
 import org.apache.ignite.ci.teamcity.ignited.change.ChangeCompacted;
 import org.apache.ignite.ci.teamcity.ignited.fatbuild.FatBuildCompacted;
diff --git a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/analysis/SuiteInBranch.java b/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/analysis/SuiteInBranch.java
deleted file mode 100644
index 8a0a761..0000000
--- a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/analysis/SuiteInBranch.java
+++ /dev/null
@@ -1,75 +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.ignite.ci.analysis;
-
-import org.apache.ignite.ci.db.Persisted;
-
-/**
- *
- */
-@Persisted
-public class SuiteInBranch implements Comparable<SuiteInBranch> {
-    public String id;
-    public String branch;
-
-    public SuiteInBranch(String id, String branch) {
-        this.id = id;
-        this.branch = branch;
-    }
-
-    @Override public boolean equals(Object o) {
-        if (this == o)
-            return true;
-        if (o == null || getClass() != o.getClass())
-            return false;
-
-        SuiteInBranch id = (SuiteInBranch)o;
-
-        if (this.id != null ? !this.id.equals(id.id) : id.id != null)
-            return false;
-        return branch != null ? branch.equals(id.branch) : id.branch == null;
-    }
-
-    @Override public int hashCode() {
-        int result = id != null ? id.hashCode() : 0;
-        result = 31 * result + (branch != null ? branch.hashCode() : 0);
-        return result;
-    }
-
-    @Override public int compareTo(SuiteInBranch o) {
-        int runConfCompare = id.compareTo(o.id);
-        if (runConfCompare != 0)
-            return runConfCompare;
-        return branch.compareTo(o.branch);
-    }
-
-    @Override public String toString() {
-        return "{" +
-            "id='" + id + '\'' +
-            ", branch='" + branch + '\'' +
-            '}';
-    }
-
-    public String getBranch() {
-        return branch;
-    }
-
-    public String getSuiteId() {
-        return id;
-    }
-}
diff --git a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/analysis/TestCompactedMult.java b/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/analysis/TestCompactedMult.java
index 585c2c2..f0dece6 100644
--- a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/analysis/TestCompactedMult.java
+++ b/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/analysis/TestCompactedMult.java
@@ -22,8 +22,8 @@ import java.util.List;
 import java.util.Objects;
 import java.util.stream.Collectors;
 import org.apache.ignite.tcservice.model.result.tests.TestOccurrenceFull;
-import org.apache.ignite.ci.teamcity.ignited.IRunHistory;
-import org.apache.ignite.ci.teamcity.ignited.IStringCompactor;
+import org.apache.ignite.tcignited.history.IRunHistory;
+import org.apache.ignite.tcbot.persistence.IStringCompactor;
 import org.apache.ignite.ci.teamcity.ignited.fatbuild.TestCompacted;
 
 public class TestCompactedMult implements IMultTestOccurrence {
diff --git a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/analysis/TestInBranch.java b/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/analysis/TestInBranch.java
deleted file mode 100644
index d871a06..0000000
--- a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/analysis/TestInBranch.java
+++ /dev/null
@@ -1,71 +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.ignite.ci.analysis;
-
-import com.google.common.base.MoreObjects;
-import java.util.Objects;
-
-public class TestInBranch implements Comparable<TestInBranch> {
-    public String name;
-
-    public String branch;
-
-    public TestInBranch(String name, String branch) {
-        this.name = name;
-        this.branch = branch;
-    }
-
-    /** {@inheritDoc} */
-    @Override public int compareTo(TestInBranch o) {
-        int runConfCompare = name.compareTo(o.name);
-        if (runConfCompare != 0)
-            return runConfCompare;
-        return branch.compareTo(o.branch);
-    }
-
-    /** {@inheritDoc} */
-    @Override public boolean equals(Object o) {
-        if (this == o)
-            return true;
-
-        if (o == null || getClass() != o.getClass())
-            return false;
-
-        TestInBranch branch1 = (TestInBranch)o;
-
-        return Objects.equals(name, branch1.name) &&
-            Objects.equals(branch, branch1.branch);
-    }
-
-    /** {@inheritDoc} */
-    @Override public int hashCode() {
-        return Objects.hash(name, branch);
-    }
-
-    /** {@inheritDoc} */
-    @Override public String toString() {
-        return MoreObjects.toStringHelper(this)
-            .add("name", name)
-            .add("branch", branch)
-            .toString();
-    }
-
-    public String getName() {
-        return name;
-    }
-}
diff --git a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/analysis/TestLogCheckResult.java b/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/analysis/TestLogCheckResult.java
index 9da55e9..51413e1 100644
--- a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/analysis/TestLogCheckResult.java
+++ b/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/analysis/TestLogCheckResult.java
@@ -22,7 +22,7 @@ import java.util.Collections;
 import java.util.List;
 import javax.annotation.Nullable;
 import javax.validation.constraints.NotNull;
-import org.apache.ignite.ci.db.Persisted;
+import org.apache.ignite.tcbot.persistence.Persisted;
 
 @Persisted
 public class TestLogCheckResult {
diff --git a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/db/Ignite1Init.java b/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/db/Ignite1Init.java
index f4316d0..74f4f34 100644
--- a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/db/Ignite1Init.java
+++ b/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/db/Ignite1Init.java
@@ -28,7 +28,7 @@ import org.apache.ignite.Ignite;
 import org.apache.ignite.Ignition;
 import org.apache.ignite.tcbot.common.conf.TcBotWorkDir;
 import org.apache.ignite.tcbot.common.interceptor.AutoProfiling;
-import org.apache.ignite.ci.di.MonitoredTask;
+import org.apache.ignite.tcbot.common.interceptor.MonitoredTask;
 import org.apache.ignite.ci.web.model.Version;
 import org.apache.ignite.cluster.BaselineNode;
 import org.apache.ignite.configuration.DataRegionConfiguration;
diff --git a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/db/TcHelperDb.java b/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/db/TcHelperDb.java
index 9f5a224..14642cc 100644
--- a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/db/TcHelperDb.java
+++ b/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/db/TcHelperDb.java
@@ -32,6 +32,7 @@ import org.apache.ignite.spi.IgniteSpiContext;
 import org.apache.ignite.spi.IgniteSpiException;
 import org.apache.ignite.spi.discovery.tcp.TcpDiscoverySpi;
 import org.apache.ignite.spi.discovery.tcp.ipfinder.TcpDiscoveryIpFinder;
+import org.apache.ignite.tcbot.persistence.CacheConfigs;
 import org.jetbrains.annotations.NotNull;
 
 import static org.apache.ignite.ci.web.Launcher.waitStopSignal;
@@ -105,31 +106,8 @@ public class TcHelperDb {
         return TcHelperDb.<K, V>getCacheV3Config(name).setAtomicityMode(CacheAtomicityMode.TRANSACTIONAL);
     }
 
-    @NotNull
-    public static <K, V> CacheConfiguration<K, V> getCacheV2Config(String name) {
-        CacheConfiguration<K, V> ccfg = new CacheConfiguration<>(name);
-
-        ccfg.setAffinity(new RendezvousAffinityFunction(false, 32));
-
-        /*
-        ccfg.setInterceptor(new CacheInterceptorAdapter<K, V>(){
-            @Nullable @Override public V onGet(K key, V val) {
-                V v = super.onGet(key, val);
-
-                int i = ObjectInterner.internFields(v);
-
-                if(i>0)
-                    System.out.println("cache.get: Strings saved: " + i);
-
-                return v;
-            }
-        });*/
-
-        return ccfg;
-    }
-
     public static <K, V> CacheConfiguration<K, V> getCacheV2TxConfig(String name) {
-        return TcHelperDb.<K, V>getCacheV2Config(name).setAtomicityMode(CacheAtomicityMode.TRANSACTIONAL);
+        return CacheConfigs.<K, V>getCacheV2Config(name).setAtomicityMode(CacheAtomicityMode.TRANSACTIONAL);
 
     }
 
diff --git a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/di/IgniteTcBotModule.java b/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/di/IgniteTcBotModule.java
index 29df2e1..e28a968 100644
--- a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/di/IgniteTcBotModule.java
+++ b/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/di/IgniteTcBotModule.java
@@ -41,6 +41,7 @@ import org.apache.ignite.ci.web.TcUpdatePool;
 import org.apache.ignite.ci.web.model.hist.VisasHistoryStorage;
 import org.apache.ignite.ci.web.rest.exception.ServiceStartingException;
 import org.apache.ignite.tcbot.common.interceptor.AutoProfiling;
+import org.apache.ignite.tcbot.common.interceptor.MonitoredTask;
 
 /**
  *
diff --git a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/di/MonitoredTaskInterceptor.java b/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/di/MonitoredTaskInterceptor.java
index 9940ab0..85a6519 100644
--- a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/di/MonitoredTaskInterceptor.java
+++ b/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/di/MonitoredTaskInterceptor.java
@@ -28,6 +28,7 @@ import java.util.concurrent.atomic.AtomicLong;
 import java.util.concurrent.atomic.AtomicReference;
 import org.aopalliance.intercept.MethodInterceptor;
 import org.aopalliance.intercept.MethodInvocation;
+import org.apache.ignite.tcbot.common.interceptor.MonitoredTask;
 import org.apache.ignite.tcbot.common.util.TimeUtil;
 import org.jetbrains.annotations.NotNull;
 
diff --git a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/di/cache/GuavaCachedInterceptor.java b/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/di/cache/GuavaCachedInterceptor.java
index 202913e..5629694 100644
--- a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/di/cache/GuavaCachedInterceptor.java
+++ b/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/di/cache/GuavaCachedInterceptor.java
@@ -30,6 +30,7 @@ import java.util.concurrent.ConcurrentMap;
 import java.util.concurrent.TimeUnit;
 import org.aopalliance.intercept.MethodInterceptor;
 import org.aopalliance.intercept.MethodInvocation;
+import org.apache.ignite.tcbot.common.interceptor.GuavaCached;
 import org.jetbrains.annotations.NotNull;
 
 public class GuavaCachedInterceptor implements MethodInterceptor {
diff --git a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/di/cache/GuavaCachedModule.java b/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/di/cache/GuavaCachedModule.java
index 3a3bfc0..393ebb8 100644
--- a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/di/cache/GuavaCachedModule.java
+++ b/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/di/cache/GuavaCachedModule.java
@@ -19,6 +19,7 @@ package org.apache.ignite.ci.di.cache;
 
 import com.google.inject.AbstractModule;
 import com.google.inject.matcher.Matchers;
+import org.apache.ignite.tcbot.common.interceptor.GuavaCached;
 
 /**
  *
diff --git a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/di/scheduler/SchedulerModule.java b/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/di/scheduler/SchedulerModule.java
index 6379fbd..81cd86e 100644
--- a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/di/scheduler/SchedulerModule.java
+++ b/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/di/scheduler/SchedulerModule.java
@@ -19,6 +19,7 @@ package org.apache.ignite.ci.di.scheduler;
 
 import com.google.inject.AbstractModule;
 import com.google.inject.internal.SingletonScope;
+import org.apache.ignite.tcbot.persistence.scheduler.IScheduler;
 
 public class SchedulerModule extends AbstractModule {
     /** {@inheritDoc} */
diff --git a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/di/scheduler/TcBotScheduler.java b/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/di/scheduler/TcBotScheduler.java
index 3b1937a..791ae21 100644
--- a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/di/scheduler/TcBotScheduler.java
+++ b/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/di/scheduler/TcBotScheduler.java
@@ -29,7 +29,8 @@ import java.util.concurrent.ThreadLocalRandom;
 import java.util.concurrent.TimeUnit;
 import java.util.concurrent.atomic.AtomicBoolean;
 import java.util.concurrent.atomic.AtomicInteger;
-import org.apache.ignite.ci.di.MonitoredTask;
+import org.apache.ignite.tcbot.common.interceptor.MonitoredTask;
+import org.apache.ignite.tcbot.persistence.scheduler.IScheduler;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
diff --git a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/github/GitHubBranch.java b/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/github/GitHubBranch.java
index 98e0d07..804fe65 100644
--- a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/github/GitHubBranch.java
+++ b/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/github/GitHubBranch.java
@@ -17,7 +17,7 @@
 package org.apache.ignite.ci.github;
 
 import java.util.Objects;
-import org.apache.ignite.ci.db.Persisted;
+import org.apache.ignite.tcbot.persistence.Persisted;
 
 @Persisted
 public class GitHubBranch {
diff --git a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/github/GitHubBranchKey.java b/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/github/GitHubBranchKey.java
index 2eb1d00..e3abf77 100644
--- a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/github/GitHubBranchKey.java
+++ b/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/github/GitHubBranchKey.java
@@ -18,7 +18,7 @@ package org.apache.ignite.ci.github;
 
 import com.google.common.base.Strings;
 import java.util.Objects;
-import org.apache.ignite.ci.db.Persisted;
+import org.apache.ignite.tcbot.persistence.Persisted;
 import org.jetbrains.annotations.NotNull;
 
 @Persisted
diff --git a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/github/GitHubBranchShort.java b/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/github/GitHubBranchShort.java
index e2ee268..496b4ce 100644
--- a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/github/GitHubBranchShort.java
+++ b/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/github/GitHubBranchShort.java
@@ -17,7 +17,7 @@
 package org.apache.ignite.ci.github;
 
 import java.util.Objects;
-import org.apache.ignite.ci.db.Persisted;
+import org.apache.ignite.tcbot.persistence.Persisted;
 
 /**
  *
diff --git a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/github/GitHubCommit.java b/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/github/GitHubCommit.java
index e13e8e0..7cad8cf 100644
--- a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/github/GitHubCommit.java
+++ b/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/github/GitHubCommit.java
@@ -17,7 +17,7 @@
 package org.apache.ignite.ci.github;
 
 import java.util.Objects;
-import org.apache.ignite.ci.db.Persisted;
+import org.apache.ignite.tcbot.persistence.Persisted;
 
 @Persisted
 public class GitHubCommit {
diff --git a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/github/GitHubUser.java b/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/github/GitHubUser.java
index d43b0a2..767dd8f 100644
--- a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/github/GitHubUser.java
+++ b/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/github/GitHubUser.java
@@ -18,7 +18,7 @@ package org.apache.ignite.ci.github;
 
 import com.google.gson.annotations.SerializedName;
 import java.util.Objects;
-import org.apache.ignite.ci.db.Persisted;
+import org.apache.ignite.tcbot.persistence.Persisted;
 
 @Persisted
 public class GitHubUser {
diff --git a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/github/PullRequest.java b/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/github/PullRequest.java
index 3f71962..24a1364 100644
--- a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/github/PullRequest.java
+++ b/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/github/PullRequest.java
@@ -21,8 +21,9 @@ import com.google.common.base.MoreObjects;
 import com.google.common.base.Strings;
 import com.google.gson.annotations.SerializedName;
 import java.util.Objects;
-import org.apache.ignite.ci.analysis.IVersionedEntity;
-import org.apache.ignite.ci.db.Persisted;
+
+import org.apache.ignite.tcbot.persistence.IVersionedEntity;
+import org.apache.ignite.tcbot.persistence.Persisted;
 import org.jetbrains.annotations.Nullable;
 
 /**
diff --git a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/github/ignited/GitHubConnIgnitedImpl.java b/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/github/ignited/GitHubConnIgnitedImpl.java
index d6f2d24..96f50a3 100644
--- a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/github/ignited/GitHubConnIgnitedImpl.java
+++ b/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/github/ignited/GitHubConnIgnitedImpl.java
@@ -32,8 +32,8 @@ import org.apache.ignite.Ignite;
 import org.apache.ignite.IgniteCache;
 import org.apache.ignite.ci.db.TcHelperDb;
 import org.apache.ignite.tcbot.common.interceptor.AutoProfiling;
-import org.apache.ignite.ci.di.MonitoredTask;
-import org.apache.ignite.ci.di.scheduler.IScheduler;
+import org.apache.ignite.tcbot.common.interceptor.MonitoredTask;
+import org.apache.ignite.tcbot.persistence.scheduler.IScheduler;
 import org.apache.ignite.ci.github.GitHubBranchKey;
 import org.apache.ignite.ci.github.GitHubBranchShort;
 import org.apache.ignite.ci.github.PullRequest;
diff --git a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/issue/EventTemplate.java b/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/issue/EventTemplate.java
index 04227fe..3bd7a8e 100644
--- a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/issue/EventTemplate.java
+++ b/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/issue/EventTemplate.java
@@ -17,7 +17,9 @@
 
 package org.apache.ignite.ci.issue;
 
-public class EventTemplate {
+import org.apache.ignite.tcignited.history.IEventTemplate;
+
+public class EventTemplate implements IEventTemplate {
     private final int[] beforeEvent;
     private final int[] eventAndAfter;
     private boolean shouldBeFirst;
diff --git a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/issue/EventTemplates.java b/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/issue/EventTemplates.java
index 49d4ece..e76b5ba 100644
--- a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/issue/EventTemplates.java
+++ b/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/issue/EventTemplates.java
@@ -20,10 +20,10 @@ package org.apache.ignite.ci.issue;
 import com.google.common.collect.Lists;
 import java.util.ArrayList;
 
-import static org.apache.ignite.ci.teamcity.ignited.runhist.RunStatus.RES_CRITICAL_FAILURE;
-import static org.apache.ignite.ci.teamcity.ignited.runhist.RunStatus.RES_FAILURE;
-import static org.apache.ignite.ci.teamcity.ignited.runhist.RunStatus.RES_OK;
-import static org.apache.ignite.ci.teamcity.ignited.runhist.RunStatus.RES_OK_OR_FAILURE;
+import static org.apache.ignite.tcignited.history.RunStatus.RES_CRITICAL_FAILURE;
+import static org.apache.ignite.tcignited.history.RunStatus.RES_FAILURE;
+import static org.apache.ignite.tcignited.history.RunStatus.RES_OK;
+import static org.apache.ignite.tcignited.history.RunStatus.RES_OK_OR_FAILURE;
 
 public class EventTemplates {
     private static final int OK = RES_OK.getCode();
diff --git a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/issue/Issue.java b/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/issue/Issue.java
index 00b0899..ed80fa0 100644
--- a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/issue/Issue.java
+++ b/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/issue/Issue.java
@@ -23,7 +23,7 @@ import java.util.Iterator;
 import java.util.List;
 import java.util.Set;
 import java.util.TreeSet;
-import org.apache.ignite.ci.db.Persisted;
+import org.apache.ignite.tcbot.persistence.Persisted;
 import org.apache.ignite.tcbot.common.util.TimeUtil;
 import org.jetbrains.annotations.Nullable;
 
diff --git a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/issue/IssueKey.java b/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/issue/IssueKey.java
index 8acf9d5..348a623 100644
--- a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/issue/IssueKey.java
+++ b/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/issue/IssueKey.java
@@ -18,7 +18,7 @@
 package org.apache.ignite.ci.issue;
 
 import com.google.common.base.MoreObjects;
-import org.apache.ignite.ci.db.Persisted;
+import org.apache.ignite.tcbot.persistence.Persisted;
 
 @Persisted
 public class IssueKey {
diff --git a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/jira/ignited/JiraIgnited.java b/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/jira/ignited/JiraIgnited.java
index 790a76d..f7d6750 100644
--- a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/jira/ignited/JiraIgnited.java
+++ b/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/jira/ignited/JiraIgnited.java
@@ -22,7 +22,7 @@ import javax.inject.Inject;
 import org.apache.ignite.ci.jira.pure.IJiraIntegration;
 import org.apache.ignite.ci.jira.pure.Ticket;
 import org.apache.ignite.ci.tcbot.conf.IJiraServerConfig;
-import org.apache.ignite.ci.teamcity.ignited.ITeamcityIgnited;
+import org.apache.ignite.tcignited.ITeamcityIgnited;
 
 /**
  *
diff --git a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/jira/ignited/JiraTicketDao.java b/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/jira/ignited/JiraTicketDao.java
index 62617d4..361860f 100644
--- a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/jira/ignited/JiraTicketDao.java
+++ b/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/jira/ignited/JiraTicketDao.java
@@ -30,9 +30,9 @@ import org.apache.ignite.Ignite;
 import org.apache.ignite.IgniteCache;
 import org.apache.ignite.ci.db.TcHelperDb;
 import org.apache.ignite.tcbot.common.interceptor.AutoProfiling;
-import org.apache.ignite.ci.di.cache.GuavaCached;
+import org.apache.ignite.tcbot.common.interceptor.GuavaCached;
 import org.apache.ignite.ci.jira.pure.Ticket;
-import org.apache.ignite.ci.teamcity.ignited.IStringCompactor;
+import org.apache.ignite.tcbot.persistence.IStringCompactor;
 import org.apache.ignite.internal.util.typedef.F;
 import org.apache.ignite.internal.util.typedef.internal.U;
 
diff --git a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/jira/ignited/JiraTicketSync.java b/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/jira/ignited/JiraTicketSync.java
index f6ed20c..4a8ca25 100644
--- a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/jira/ignited/JiraTicketSync.java
+++ b/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/jira/ignited/JiraTicketSync.java
@@ -23,15 +23,15 @@ import java.util.Collection;
 import java.util.concurrent.TimeUnit;
 import java.util.stream.Collectors;
 import javax.inject.Inject;
-import org.apache.ignite.ci.di.MonitoredTask;
-import org.apache.ignite.ci.di.scheduler.IScheduler;
+import org.apache.ignite.tcbot.common.interceptor.MonitoredTask;
+import org.apache.ignite.tcbot.persistence.scheduler.IScheduler;
 import org.apache.ignite.ci.jira.Tickets;
 import org.apache.ignite.ci.jira.pure.Fields;
 import org.apache.ignite.ci.jira.pure.IJiraIntegration;
 import org.apache.ignite.ci.jira.pure.IJiraIntegrationProvider;
 import org.apache.ignite.ci.jira.pure.Ticket;
 import org.apache.ignite.ci.tcbot.conf.IJiraServerConfig;
-import org.apache.ignite.ci.teamcity.ignited.ITeamcityIgnited;
+import org.apache.ignite.tcignited.ITeamcityIgnited;
 import org.apache.ignite.internal.util.typedef.F;
 import org.jetbrains.annotations.NotNull;
 import org.slf4j.Logger;
diff --git a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/jira/ignited/TicketCompacted.java b/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/jira/ignited/TicketCompacted.java
index 7496795..1f2a699 100644
--- a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/jira/ignited/TicketCompacted.java
+++ b/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/jira/ignited/TicketCompacted.java
@@ -22,7 +22,7 @@ import org.apache.ignite.ci.jira.pure.Fields;
 import org.apache.ignite.ci.jira.pure.Status;
 import org.apache.ignite.ci.jira.pure.Ticket;
 import org.apache.ignite.ci.tcbot.common.StringFieldCompacted;
-import org.apache.ignite.ci.teamcity.ignited.IStringCompactor;
+import org.apache.ignite.tcbot.persistence.IStringCompactor;
 import org.jetbrains.annotations.Nullable;
 
 /**
diff --git a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/jobs/CheckQueueJob.java b/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/jobs/CheckQueueJob.java
index 9d9fefe..9a808ea 100644
--- a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/jobs/CheckQueueJob.java
+++ b/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/jobs/CheckQueueJob.java
@@ -29,18 +29,18 @@ import javax.inject.Inject;
 import org.apache.ignite.ci.tcbot.conf.BranchTracked;
 import org.apache.ignite.ci.tcbot.conf.ChainAtServerTracked;
 import org.apache.ignite.tcbot.common.interceptor.AutoProfiling;
-import org.apache.ignite.ci.di.MonitoredTask;
+import org.apache.ignite.tcbot.common.interceptor.MonitoredTask;
 import org.apache.ignite.ci.tcbot.conf.ITcBotConfig;
 import org.apache.ignite.tcservice.model.agent.Agent;
 import org.apache.ignite.tcservice.model.result.Build;
 import org.apache.ignite.tcservice.model.result.Triggered;
 import org.apache.ignite.tcservice.model.user.User;
 import org.apache.ignite.ci.teamcity.ignited.BuildRefCompacted;
-import org.apache.ignite.ci.teamcity.ignited.IStringCompactor;
-import org.apache.ignite.ci.teamcity.ignited.ITeamcityIgnited;
-import org.apache.ignite.ci.teamcity.ignited.ITeamcityIgnitedProvider;
+import org.apache.ignite.tcbot.persistence.IStringCompactor;
+import org.apache.ignite.tcignited.ITeamcityIgnited;
+import org.apache.ignite.tcignited.ITeamcityIgnitedProvider;
 import org.apache.ignite.ci.teamcity.ignited.fatbuild.FatBuildCompacted;
-import org.apache.ignite.ci.user.ICredentialsProv;
+import org.apache.ignite.ci.user.ITcBotUserCreds;
 import org.apache.ignite.tcbot.common.exeption.ExceptionUtil;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -60,7 +60,7 @@ public class CheckQueueJob implements Runnable {
         Integer.getInteger("CHECK_QUEUE_MIN_FREE_AGENTS_PERCENT", 50);
 
     /** */
-    private ICredentialsProv creds;
+    private ITcBotUserCreds creds;
 
     /** */
     @Inject private ITeamcityIgnitedProvider tcIgnitedProv;
@@ -77,7 +77,7 @@ public class CheckQueueJob implements Runnable {
     /**
      * @param creds Background credentials provider.
      */
-    public void init(ICredentialsProv creds) {
+    public void init(ITcBotUserCreds creds) {
         this.creds = creds;
     }
 
diff --git a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/observer/BuildObserver.java b/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/observer/BuildObserver.java
index bb54c53..c2f3028 100644
--- a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/observer/BuildObserver.java
+++ b/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/observer/BuildObserver.java
@@ -22,10 +22,10 @@ import java.util.Timer;
 import javax.inject.Inject;
 import org.apache.ignite.ci.tcbot.ITcBotBgAuth;
 import org.apache.ignite.tcservice.model.result.Build;
-import org.apache.ignite.ci.teamcity.ignited.IStringCompactor;
-import org.apache.ignite.ci.teamcity.ignited.ITeamcityIgnited;
-import org.apache.ignite.ci.teamcity.ignited.ITeamcityIgnitedProvider;
-import org.apache.ignite.ci.user.ICredentialsProv;
+import org.apache.ignite.tcbot.persistence.IStringCompactor;
+import org.apache.ignite.tcignited.ITeamcityIgnited;
+import org.apache.ignite.tcignited.ITeamcityIgnitedProvider;
+import org.apache.ignite.ci.user.ITcBotUserCreds;
 import org.apache.ignite.ci.web.model.ContributionKey;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -97,8 +97,8 @@ public class BuildObserver {
      * @param branchForTc Branch for TC.
      * @param ticket JIRA ticket name.
      */
-    public void observe(String srvId, ICredentialsProv prov, String ticket, String branchForTc, String parentSuiteId,
-        Build... builds) {
+    public void observe(String srvId, ITcBotUserCreds prov, String ticket, String branchForTc, String parentSuiteId,
+                        Build... builds) {
         BuildsInfo buildsInfo = new BuildsInfo(srvId, prov, ticket, branchForTc, parentSuiteId, builds);
 
         observerTask.addInfo(buildsInfo);
@@ -112,7 +112,7 @@ public class BuildObserver {
 
         BuildsInfo buildsInfo = observerTask.getInfo(key);
 
-        ICredentialsProv creds = tcBotBgAuth.getServerAuthorizerCreds();
+        ITcBotUserCreds creds = tcBotBgAuth.getServerAuthorizerCreds();
 
         ITeamcityIgnited teamcity = teamcityIgnitedProvider.server(key.srvId, creds);
 
diff --git a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/observer/BuildsInfo.java b/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/observer/BuildsInfo.java
index 2b79935..3fbb3ea 100644
--- a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/observer/BuildsInfo.java
+++ b/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/observer/BuildsInfo.java
@@ -25,10 +25,10 @@ import java.util.Date;
 import java.util.List;
 import java.util.Objects;
 import org.apache.ignite.tcservice.model.result.Build;
-import org.apache.ignite.ci.teamcity.ignited.IStringCompactor;
-import org.apache.ignite.ci.teamcity.ignited.ITeamcityIgnited;
+import org.apache.ignite.tcbot.persistence.IStringCompactor;
+import org.apache.ignite.tcignited.ITeamcityIgnited;
 import org.apache.ignite.ci.teamcity.ignited.fatbuild.FatBuildCompacted;
-import org.apache.ignite.ci.user.ICredentialsProv;
+import org.apache.ignite.ci.user.ITcBotUserCreds;
 import org.apache.ignite.ci.web.model.ContributionKey;
 
 /**
@@ -86,8 +86,8 @@ public class BuildsInfo {
      * @param ticket Ticket.
      * @param builds Builds.
      */
-    public BuildsInfo(String srvId, ICredentialsProv prov, String ticket, String branchForTc, String parentSuiteId,
-        Build... builds) {
+    public BuildsInfo(String srvId, ITcBotUserCreds prov, String ticket, String branchForTc, String parentSuiteId,
+                      Build... builds) {
         this.userName = prov.getUser(srvId);
         this.date = Calendar.getInstance().getTime();
         this.srvId = srvId;
diff --git a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/observer/CompactBuildsInfo.java b/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/observer/CompactBuildsInfo.java
index 66f2458..9a526f6 100644
--- a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/observer/CompactBuildsInfo.java
+++ b/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/observer/CompactBuildsInfo.java
@@ -22,7 +22,7 @@ import java.util.Collections;
 import java.util.Date;
 import java.util.List;
 import java.util.Objects;
-import org.apache.ignite.ci.teamcity.ignited.IStringCompactor;
+import org.apache.ignite.tcbot.persistence.IStringCompactor;
 
 /**
  * Representation of {@link BuildsInfo} with compacted properties for more effective cache storing.
diff --git a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/observer/ObserverTask.java b/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/observer/ObserverTask.java
index 1e5e927..b45c5d2 100644
--- a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/observer/ObserverTask.java
+++ b/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/observer/ObserverTask.java
@@ -28,13 +28,13 @@ import java.util.concurrent.ConcurrentHashMap;
 import java.util.concurrent.locks.ReentrantLock;
 import javax.inject.Inject;
 import org.apache.ignite.tcbot.common.interceptor.AutoProfiling;
-import org.apache.ignite.ci.di.MonitoredTask;
+import org.apache.ignite.tcbot.common.interceptor.MonitoredTask;
 import org.apache.ignite.ci.tcbot.ITcBotBgAuth;
 import org.apache.ignite.ci.tcbot.visa.TcBotTriggerAndSignOffService;
-import org.apache.ignite.ci.teamcity.ignited.IStringCompactor;
-import org.apache.ignite.ci.teamcity.ignited.ITeamcityIgnited;
-import org.apache.ignite.ci.teamcity.ignited.ITeamcityIgnitedProvider;
-import org.apache.ignite.ci.user.ICredentialsProv;
+import org.apache.ignite.tcbot.persistence.IStringCompactor;
+import org.apache.ignite.tcignited.ITeamcityIgnited;
+import org.apache.ignite.tcignited.ITeamcityIgnitedProvider;
+import org.apache.ignite.ci.user.ITcBotUserCreds;
 import org.apache.ignite.ci.web.model.ContributionKey;
 import org.apache.ignite.ci.web.model.Visa;
 import org.apache.ignite.ci.web.model.VisaRequest;
@@ -150,7 +150,7 @@ public class ObserverTask extends TimerTask {
             if (!tcBotBgAuth.isServerAuthorized())
                 return "Server authorization required.";
 
-            ICredentialsProv creds = tcBotBgAuth.getServerAuthorizerCreds();
+            ITcBotUserCreds creds = tcBotBgAuth.getServerAuthorizerCreds();
 
             int checkedBuilds = 0;
             int notFinishedBuilds = 0;
diff --git a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/runners/IgniteTeamcityHelperRunnerExample.java b/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/runners/IgniteTeamcityHelperRunnerExample.java
index 9df64b7..e35ad76 100644
--- a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/runners/IgniteTeamcityHelperRunnerExample.java
+++ b/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/runners/IgniteTeamcityHelperRunnerExample.java
@@ -24,7 +24,7 @@ import java.util.Set;
 import java.util.StringTokenizer;
 import java.util.TreeMap;
 import java.util.TreeSet;
-import org.apache.ignite.tcservice.IgniteTeamcityConnection;
+import org.apache.ignite.tcservice.TeamcityServiceConnection;
 import org.apache.ignite.tcservice.model.conf.BuildType;
 import org.apache.ignite.tcservice.model.conf.bt.BuildTypeFull;
 import org.apache.ignite.tcservice.model.conf.bt.SnapshotDependency;
@@ -40,7 +40,7 @@ public class IgniteTeamcityHelperRunnerExample {
         String serverIdPriv = "private";
         String serverIdPub = "apache";
 
-        final IgniteTeamcityConnection helper = TcConnectionStaticLinker.create(serverIdPub);
+        final TeamcityServiceConnection helper = TcConnectionStaticLinker.create(serverIdPub);
 
         int k = 0;
         if (k > 0) {
@@ -66,7 +66,7 @@ public class IgniteTeamcityHelperRunnerExample {
         }
     }
 
-    private static void checkBuildTypes(IgniteTeamcityConnection helper) {
+    private static void checkBuildTypes(TeamcityServiceConnection helper) {
         Map<String, Set<String>> duplicates = new TreeMap<>();
         Map<String, String> suiteToBt = new TreeMap<>();
         List<BuildType> buildTypes = helper.getBuildTypes("Ignite20Tests");
diff --git a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/runners/RemoteClientTmpHelper.java b/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/runners/RemoteClientTmpHelper.java
index 67c4586..e949bc5 100644
--- a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/runners/RemoteClientTmpHelper.java
+++ b/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/runners/RemoteClientTmpHelper.java
@@ -34,8 +34,8 @@ import org.apache.ignite.ci.tcbot.user.UserAndSessionsStorage;
 import org.apache.ignite.tcservice.model.hist.BuildRef;
 import org.apache.ignite.tcservice.model.result.Build;
 import org.apache.ignite.ci.teamcity.ignited.BuildRefCompacted;
-import org.apache.ignite.ci.teamcity.ignited.ITeamcityIgnited;
-import org.apache.ignite.ci.teamcity.ignited.IgniteStringCompactor;
+import org.apache.ignite.tcignited.ITeamcityIgnited;
+import org.apache.ignite.tcbot.persistence.IgniteStringCompactor;
 import org.apache.ignite.ci.teamcity.ignited.buildref.BuildRefDao;
 import org.apache.ignite.ci.teamcity.ignited.fatbuild.FatBuildCompacted;
 import org.apache.ignite.ci.teamcity.ignited.fatbuild.FatBuildDao;
@@ -138,8 +138,8 @@ public class RemoteClientTmpHelper {
         String apacheSrvName = "apache";
         int apache = ITeamcityIgnited.serverIdToInt(apacheSrvName);
 
-        IgniteCache<String, IgniteStringCompactor.CompactorEntity> strings = ignite.cache(IgniteStringCompactor.STRINGS_CACHE);
-        IgniteStringCompactor.CompactorEntity queuedEnt = strings.get(BuildRef.STATE_QUEUED);
+        IgniteCache<String, org.apache.ignite.ci.teamcity.ignited.IgniteStringCompactor.CompactorEntity> strings = ignite.cache(IgniteStringCompactor.STRINGS_CACHE);
+        org.apache.ignite.ci.teamcity.ignited.IgniteStringCompactor.CompactorEntity queuedEnt = strings.get(BuildRef.STATE_QUEUED);
         int stateQ = queuedEnt.id();
         IgniteCache<Long, BuildRefCompacted> cacheRef = ignite.cache(BuildRefDao.TEAMCITY_BUILD_CACHE_NAME);
         IgniteCache<Long, FatBuildCompacted> cacheFat = ignite.cache(FatBuildDao.TEAMCITY_FAT_BUILD_CACHE_NAME);
diff --git a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/tcbot/ITcBotBgAuth.java b/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/tcbot/ITcBotBgAuth.java
index 69db701..66bc42a 100644
--- a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/tcbot/ITcBotBgAuth.java
+++ b/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/tcbot/ITcBotBgAuth.java
@@ -16,7 +16,7 @@
  */
 package org.apache.ignite.ci.tcbot;
 
-import org.apache.ignite.ci.user.ICredentialsProv;
+import org.apache.ignite.ci.user.ITcBotUserCreds;
 import org.jetbrains.annotations.Nullable;
 
 /**
@@ -24,10 +24,10 @@ import org.jetbrains.annotations.Nullable;
  */
 public interface ITcBotBgAuth {
     /** */
-    public void setServerAuthorizerCreds(ICredentialsProv creds);
+    public void setServerAuthorizerCreds(ITcBotUserCreds creds);
 
     /** */
-    @Nullable public ICredentialsProv getServerAuthorizerCreds();
+    @Nullable public ITcBotUserCreds getServerAuthorizerCreds();
 
     /** */
     public default boolean isServerAuthorized() {
diff --git a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/tcbot/TcBotBgAuthImpl.java b/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/tcbot/TcBotBgAuthImpl.java
index bf0365c..bb065cd 100644
--- a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/tcbot/TcBotBgAuthImpl.java
+++ b/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/tcbot/TcBotBgAuthImpl.java
@@ -16,7 +16,7 @@
  */
 package org.apache.ignite.ci.tcbot;
 
-import org.apache.ignite.ci.user.ICredentialsProv;
+import org.apache.ignite.ci.user.ITcBotUserCreds;
 import org.jetbrains.annotations.Nullable;
 
 /**
@@ -24,15 +24,15 @@ import org.jetbrains.annotations.Nullable;
  */
 class TcBotBgAuthImpl implements ITcBotBgAuth {
     /** Server authorizer credentials. */
-    private ICredentialsProv srvAuthorizerCreds;
+    private ITcBotUserCreds srvAuthorizerCreds;
 
     /** {@inheritDoc} */
-    @Override public void setServerAuthorizerCreds(ICredentialsProv creds) {
+    @Override public void setServerAuthorizerCreds(ITcBotUserCreds creds) {
         this.srvAuthorizerCreds = creds;
     }
 
     /** {@inheritDoc} */
-    @Nullable @Override public ICredentialsProv getServerAuthorizerCreds() {
+    @Nullable @Override public ITcBotUserCreds getServerAuthorizerCreds() {
         return srvAuthorizerCreds;
     }
 }
diff --git a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/tcbot/builds/CompareBuildsService.java b/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/tcbot/builds/CompareBuildsService.java
index aa452e9..95c1fa1 100644
--- a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/tcbot/builds/CompareBuildsService.java
+++ b/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/tcbot/builds/CompareBuildsService.java
@@ -22,11 +22,11 @@ import java.util.List;
 import javax.inject.Inject;
 import org.apache.ignite.ci.analysis.MultBuildRunCtx;
 import org.apache.ignite.ci.tcbot.chain.BuildChainProcessor;
-import org.apache.ignite.ci.teamcity.ignited.IStringCompactor;
-import org.apache.ignite.ci.teamcity.ignited.ITeamcityIgnited;
-import org.apache.ignite.ci.teamcity.ignited.ITeamcityIgnitedProvider;
+import org.apache.ignite.tcbot.persistence.IStringCompactor;
+import org.apache.ignite.tcignited.ITeamcityIgnited;
+import org.apache.ignite.tcignited.ITeamcityIgnitedProvider;
 import org.apache.ignite.ci.teamcity.ignited.fatbuild.FatBuildCompacted;
-import org.apache.ignite.ci.user.ICredentialsProv;
+import org.apache.ignite.ci.user.ITcBotUserCreds;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
@@ -44,7 +44,7 @@ public class CompareBuildsService {
      * @param prov Credentials provider.
      * @return List of build tests.
      */
-    public List<String> tests0(String srvId, Integer buildId, ICredentialsProv prov) {
+    public List<String> tests0(String srvId, Integer buildId, ITcBotUserCreds prov) {
         ITeamcityIgnited srv = tcIgnitedProv.server(srvId, prov);
 
         return tests0(srv, buildId, bcp);
diff --git a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/tcbot/chain/BuildChainProcessor.java b/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/tcbot/chain/BuildChainProcessor.java
index 40c4f15..d06cdef 100644
--- a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/tcbot/chain/BuildChainProcessor.java
+++ b/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/tcbot/chain/BuildChainProcessor.java
@@ -20,7 +20,6 @@ package org.apache.ignite.ci.tcbot.chain;
 import com.google.common.base.Preconditions;
 import com.google.common.base.Stopwatch;
 import com.google.common.util.concurrent.Futures;
-import org.apache.ignite.ci.IAnalyticsEnabledTeamcity;
 import org.apache.ignite.ci.analysis.*;
 import org.apache.ignite.ci.analysis.mode.LatestRebuildMode;
 import org.apache.ignite.ci.analysis.mode.ProcessLogsMode;
@@ -34,7 +33,10 @@ import org.apache.ignite.ci.web.TcUpdatePool;
 import org.apache.ignite.ci.web.model.long_running.LRTest;
 import org.apache.ignite.ci.web.model.long_running.SuiteLRTestsSummary;
 import org.apache.ignite.tcbot.common.interceptor.AutoProfiling;
-import org.apache.ignite.tcservice.ITeamcity;
+import org.apache.ignite.tcbot.persistence.IStringCompactor;
+import org.apache.ignite.tcignited.ITeamcityIgnited;
+import org.apache.ignite.tcignited.SyncMode;
+import org.apache.ignite.tcignited.history.IRunHistory;
 import org.apache.ignite.tcservice.model.hist.BuildRef;
 import org.apache.ignite.tcservice.model.result.Build;
 import org.jetbrains.annotations.NotNull;
@@ -196,10 +198,9 @@ public class BuildChainProcessor {
         });
 
         Function<MultBuildRunCtx, Float> function = ctx -> {
-            SuiteInBranch key = new SuiteInBranch(ctx.suiteId(), RunHistSync.normalizeBranch(failRateBranch));
 
             //todo cache RunStat instance into suite context to compare
-            IRunHistory runStat = tcIgn.getSuiteRunHist(key);
+            IRunHistory runStat = tcIgn.getSuiteRunHist(ctx.suiteId(), RunHistSync.normalizeBranch(failRateBranch));
 
             if (runStat == null)
                 return 0f;
diff --git a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/tcbot/chain/PrChainsProcessor.java b/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/tcbot/chain/PrChainsProcessor.java
index 1e5f8e1..6048b2d 100644
--- a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/tcbot/chain/PrChainsProcessor.java
+++ b/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/tcbot/chain/PrChainsProcessor.java
@@ -22,11 +22,9 @@ import java.util.Objects;
 import java.util.concurrent.atomic.AtomicInteger;
 import java.util.stream.Collectors;
 import javax.inject.Inject;
-import org.apache.ignite.ci.IAnalyticsEnabledTeamcity;
+
 import org.apache.ignite.tcservice.ITeamcity;
 import org.apache.ignite.ci.analysis.FullChainRunCtx;
-import org.apache.ignite.ci.analysis.SuiteInBranch;
-import org.apache.ignite.ci.analysis.TestInBranch;
 import org.apache.ignite.ci.analysis.mode.LatestRebuildMode;
 import org.apache.ignite.ci.analysis.mode.ProcessLogsMode;
 import org.apache.ignite.tcbot.common.interceptor.AutoProfiling;
@@ -35,14 +33,13 @@ import org.apache.ignite.ci.github.ignited.IGitHubConnIgnitedProvider;
 import org.apache.ignite.ci.jira.ignited.IJiraIgnited;
 import org.apache.ignite.ci.jira.ignited.IJiraIgnitedProvider;
 import org.apache.ignite.ci.tcbot.visa.BranchTicketMatcher;
-import org.apache.ignite.ci.teamcity.ignited.IRunHistory;
-import org.apache.ignite.ci.teamcity.ignited.IStringCompactor;
-import org.apache.ignite.ci.teamcity.ignited.ITeamcityIgnited;
-import org.apache.ignite.ci.teamcity.ignited.ITeamcityIgnitedProvider;
-import org.apache.ignite.ci.teamcity.ignited.SyncMode;
+import org.apache.ignite.tcignited.history.IRunHistory;
+import org.apache.ignite.tcbot.persistence.IStringCompactor;
+import org.apache.ignite.tcignited.ITeamcityIgnited;
+import org.apache.ignite.tcignited.ITeamcityIgnitedProvider;
+import org.apache.ignite.tcignited.SyncMode;
 import org.apache.ignite.ci.teamcity.ignited.runhist.RunHistSync;
-import org.apache.ignite.ci.teamcity.restcached.ITcServerProvider;
-import org.apache.ignite.ci.user.ICredentialsProv;
+import org.apache.ignite.ci.user.ITcBotUserCreds;
 import org.apache.ignite.ci.web.model.current.ChainAtServerCurrentStatus;
 import org.apache.ignite.ci.web.model.current.SuiteCurrentStatus;
 import org.apache.ignite.ci.web.model.current.TestFailure;
@@ -84,7 +81,7 @@ public class PrChainsProcessor {
      */
     @AutoProfiling
     public TestFailuresSummary getTestFailuresSummary(
-        ICredentialsProv creds,
+        ITcBotUserCreds creds,
         String srvCode,
         String suiteId,
         String branchForTc,
@@ -175,13 +172,13 @@ public class PrChainsProcessor {
     @Nullable public List<SuiteCurrentStatus> getBlockersSuitesStatuses(String buildTypeId,
         String branchForTc,
         String srvId,
-        ICredentialsProv prov) {
+        ITcBotUserCreds prov) {
         return getBlockersSuitesStatuses(buildTypeId, branchForTc, srvId, prov, SyncMode.RELOAD_QUEUED);
     }
 
     @Nullable
     public List<SuiteCurrentStatus> getBlockersSuitesStatuses(String buildTypeId, String branchForTc, String srvId,
-        ICredentialsProv prov, SyncMode syncMode) {
+                                                              ITcBotUserCreds prov, SyncMode syncMode) {
         //using here non persistent TC allows to skip update statistic
         ITeamcityIgnited tcIgnited = tcIgnitedProvider.server(srvId, prov);
 
@@ -217,12 +214,12 @@ public class PrChainsProcessor {
             .failedChildSuites()
             .map((ctx) -> {
                 String normalizedBaseBranch = RunHistSync.normalizeBranch(baseBranch);
-                IRunHistory statInBaseBranch = tcIgnited.getSuiteRunHist(new SuiteInBranch(ctx.suiteId(), normalizedBaseBranch));
+                IRunHistory statInBaseBranch = tcIgnited.getSuiteRunHist(ctx.suiteId(), normalizedBaseBranch);
 
                 String suiteComment = ctx.getPossibleBlockerComment(compactor, statInBaseBranch, tcIgnited.config());
 
                 List<TestFailure> failures =  ctx.getFailedTests().stream().map(occurrence -> {
-                    IRunHistory stat = tcIgnited.getTestRunHist(new TestInBranch(occurrence.getName(), normalizedBaseBranch));
+                    IRunHistory stat = tcIgnited.getTestRunHist(occurrence.getName(), normalizedBaseBranch);
 
                     String testBlockerComment = occurrence.getPossibleBlockerComment(stat);
 
diff --git a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/tcbot/chain/TrackedBranchChainsProcessor.java b/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/tcbot/chain/TrackedBranchChainsProcessor.java
index d0ad75f..09869c3 100644
--- a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/tcbot/chain/TrackedBranchChainsProcessor.java
+++ b/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/tcbot/chain/TrackedBranchChainsProcessor.java
@@ -20,7 +20,7 @@ import java.util.Comparator;
 import java.util.List;
 import java.util.concurrent.atomic.AtomicInteger;
 import javax.inject.Inject;
-import org.apache.ignite.ci.IAnalyticsEnabledTeamcity;
+
 import org.apache.ignite.ci.analysis.FullChainRunCtx;
 import org.apache.ignite.ci.analysis.mode.LatestRebuildMode;
 import org.apache.ignite.ci.analysis.mode.ProcessLogsMode;
@@ -28,12 +28,11 @@ import org.apache.ignite.ci.tcbot.conf.BranchTracked;
 import org.apache.ignite.tcbot.common.interceptor.AutoProfiling;
 import org.apache.ignite.ci.tcbot.conf.ITcBotConfig;
 import org.apache.ignite.ci.tcbot.conf.TcServerConfig;
-import org.apache.ignite.ci.teamcity.ignited.IStringCompactor;
-import org.apache.ignite.ci.teamcity.ignited.ITeamcityIgnited;
-import org.apache.ignite.ci.teamcity.ignited.ITeamcityIgnitedProvider;
-import org.apache.ignite.ci.teamcity.ignited.SyncMode;
-import org.apache.ignite.ci.teamcity.restcached.ITcServerProvider;
-import org.apache.ignite.ci.user.ICredentialsProv;
+import org.apache.ignite.tcbot.persistence.IStringCompactor;
+import org.apache.ignite.tcignited.ITeamcityIgnited;
+import org.apache.ignite.tcignited.ITeamcityIgnitedProvider;
+import org.apache.ignite.tcignited.SyncMode;
+import org.apache.ignite.ci.user.ITcBotUserCreds;
 import org.apache.ignite.ci.web.model.current.ChainAtServerCurrentStatus;
 import org.apache.ignite.ci.web.model.current.TestFailuresSummary;
 import org.apache.ignite.ci.web.model.long_running.FullLRTestsSummary;
@@ -63,7 +62,7 @@ public class TrackedBranchChainsProcessor {
         @Nullable String branch,
         @Nullable Boolean checkAllLogs,
         int buildResMergeCnt,
-        ICredentialsProv creds,
+        ITcBotUserCreds creds,
         SyncMode syncMode) {
         final TestFailuresSummary res = new TestFailuresSummary();
         final AtomicInteger runningUpdates = new AtomicInteger();
@@ -138,7 +137,7 @@ public class TrackedBranchChainsProcessor {
      * @return
      */
     public FullLRTestsSummary getTrackedBranchLongRunningTestsSummary(@Nullable String branch,
-        ICredentialsProv creds) {
+        ITcBotUserCreds creds) {
         FullLRTestsSummary summary = new FullLRTestsSummary();
 
         final String branchNn = isNullOrEmpty(branch) ? TcServerConfig.DEFAULT_TRACKED_BRANCH_NAME : branch;
diff --git a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/tcbot/conf/LocalFilesBasedConfig.java b/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/tcbot/conf/LocalFilesBasedConfig.java
index 56215b8..11f72ff 100644
--- a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/tcbot/conf/LocalFilesBasedConfig.java
+++ b/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/tcbot/conf/LocalFilesBasedConfig.java
@@ -22,7 +22,7 @@ import java.io.File;
 import java.util.Objects;
 import java.util.Properties;
 import org.apache.ignite.ci.HelperConfig;
-import org.apache.ignite.ci.di.cache.GuavaCached;
+import org.apache.ignite.tcbot.common.interceptor.GuavaCached;
 import org.apache.ignite.tcbot.common.conf.ITcServerConfig;
 import org.apache.ignite.tcbot.common.conf.TcBotWorkDir;
 
diff --git a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/tcbot/issue/IssueDetector.java b/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/tcbot/issue/IssueDetector.java
index 681736d..43fb196 100644
--- a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/tcbot/issue/IssueDetector.java
+++ b/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/tcbot/issue/IssueDetector.java
@@ -32,10 +32,9 @@ import java.util.concurrent.atomic.AtomicBoolean;
 import java.util.concurrent.atomic.AtomicInteger;
 import javax.inject.Inject;
 import javax.inject.Provider;
-import org.apache.ignite.ci.analysis.SuiteInBranch;
-import org.apache.ignite.ci.analysis.TestInBranch;
+
 import org.apache.ignite.tcbot.common.interceptor.AutoProfiling;
-import org.apache.ignite.ci.di.MonitoredTask;
+import org.apache.ignite.tcbot.common.interceptor.MonitoredTask;
 import org.apache.ignite.ci.issue.EventTemplate;
 import org.apache.ignite.ci.issue.EventTemplates;
 import org.apache.ignite.ci.issue.Issue;
@@ -50,15 +49,15 @@ import org.apache.ignite.ci.tcbot.conf.ITcBotConfig;
 import org.apache.ignite.tcbot.common.conf.ITcServerConfig;
 import org.apache.ignite.ci.tcbot.conf.NotificationsConfig;
 import org.apache.ignite.ci.tcbot.user.IUserStorage;
-import org.apache.ignite.ci.teamcity.ignited.IRunHistory;
-import org.apache.ignite.ci.teamcity.ignited.IStringCompactor;
-import org.apache.ignite.ci.teamcity.ignited.ITeamcityIgnited;
-import org.apache.ignite.ci.teamcity.ignited.ITeamcityIgnitedProvider;
-import org.apache.ignite.ci.teamcity.ignited.SyncMode;
+import org.apache.ignite.tcignited.history.IRunHistory;
+import org.apache.ignite.tcbot.persistence.IStringCompactor;
+import org.apache.ignite.tcignited.ITeamcityIgnited;
+import org.apache.ignite.tcignited.ITeamcityIgnitedProvider;
+import org.apache.ignite.tcignited.SyncMode;
 import org.apache.ignite.ci.teamcity.ignited.change.ChangeCompacted;
 import org.apache.ignite.ci.teamcity.ignited.fatbuild.FatBuildCompacted;
 import org.apache.ignite.ci.teamcity.ignited.runhist.InvocationData;
-import org.apache.ignite.ci.user.ICredentialsProv;
+import org.apache.ignite.ci.user.ITcBotUserCreds;
 import org.apache.ignite.ci.user.TcHelperUser;
 import org.apache.ignite.ci.web.model.current.ChainAtServerCurrentStatus;
 import org.apache.ignite.ci.web.model.current.SuiteCurrentStatus;
@@ -84,7 +83,7 @@ public class IssueDetector {
     @Inject private IUserStorage userStorage;
 
     private final AtomicBoolean init = new AtomicBoolean();
-    private ICredentialsProv backgroundOpsCreds;
+    private ITcBotUserCreds backgroundOpsCreds;
     @Deprecated //todo use scheduler
     private ScheduledExecutorService executorService;
 
@@ -106,7 +105,7 @@ public class IssueDetector {
     private final AtomicBoolean sndNotificationGuard = new AtomicBoolean();
 
     private String registerIssuesAndNotifyLater(TestFailuresSummary res,
-        ICredentialsProv creds) {
+        ITcBotUserCreds creds) {
 
         if (creds == null)
             return null;
@@ -246,7 +245,7 @@ public class IssueDetector {
     @SuppressWarnings({"WeakerAccess", "UnusedReturnValue"})
     @AutoProfiling
     @MonitoredTask(name = "Register new issues")
-    protected String registerNewIssues(TestFailuresSummary res, ICredentialsProv creds) {
+    protected String registerNewIssues(TestFailuresSummary res, ITcBotUserCreds creds) {
         int newIssues = 0;
 
         for (ChainAtServerCurrentStatus next : res.servers) {
@@ -292,9 +291,7 @@ public class IssueDetector {
 
         String suiteId = suiteFailure.suiteId;
 
-        SuiteInBranch key = new SuiteInBranch(suiteId, normalizeBranch);
-
-        IRunHistory runStat = tcIgnited.getSuiteRunHist(key);
+        IRunHistory runStat = tcIgnited.getSuiteRunHist(suiteId, normalizeBranch);
 
         if (runStat == null)
             return false;
@@ -365,11 +362,9 @@ public class IssueDetector {
         String normalizeBranch,
         TestFailure testFailure,
         String trackedBranch) {
-
         String name = testFailure.name;
-        TestInBranch testInBranch = new TestInBranch(name, normalizeBranch);
 
-        IRunHistory runStat = tcIgnited.getTestRunHist(testInBranch);
+        IRunHistory runStat = tcIgnited.getTestRunHist(name, normalizeBranch);
 
         if (runStat == null)
             return false;
@@ -435,7 +430,7 @@ public class IssueDetector {
         return backgroundOpsCreds != null;
     }
 
-    public void startBackgroundCheck(ICredentialsProv prov) {
+    public void startBackgroundCheck(ITcBotUserCreds prov) {
         try {
             if (init.compareAndSet(false, true)) {
                 this.backgroundOpsCreds = prov;
@@ -489,7 +484,7 @@ public class IssueDetector {
     protected String checkFailuresEx(String brachName) {
         int buildsToQry = EventTemplates.templates.stream().mapToInt(EventTemplate::cntEvents).max().getAsInt();
 
-        ICredentialsProv creds = Preconditions.checkNotNull(backgroundOpsCreds, "Server should be authorized");
+        ITcBotUserCreds creds = Preconditions.checkNotNull(backgroundOpsCreds, "Server should be authorized");
 
         tbProc.getTrackedBranchTestFailures(
             brachName,
diff --git a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/tcbot/trends/MasterTrendsService.java b/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/tcbot/trends/MasterTrendsService.java
index 99cf724..71c32a6 100644
--- a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/tcbot/trends/MasterTrendsService.java
+++ b/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/tcbot/trends/MasterTrendsService.java
@@ -40,19 +40,19 @@ import javax.annotation.Nonnull;
 import javax.inject.Inject;
 import javax.inject.Provider;
 import org.apache.ignite.tcbot.common.interceptor.AutoProfiling;
-import org.apache.ignite.ci.di.cache.GuavaCached;
+import org.apache.ignite.tcbot.common.interceptor.GuavaCached;
 import org.apache.ignite.ci.tcbot.chain.BuildChainProcessor;
 import org.apache.ignite.ci.tcbot.conf.ITcBotConfig;
 import org.apache.ignite.tcservice.model.hist.BuildRef;
 import org.apache.ignite.tcservice.model.result.tests.TestOccurrence;
 import org.apache.ignite.ci.teamcity.ignited.BuildRefCompacted;
-import org.apache.ignite.ci.teamcity.ignited.IStringCompactor;
-import org.apache.ignite.ci.teamcity.ignited.ITeamcityIgnited;
-import org.apache.ignite.ci.teamcity.ignited.ITeamcityIgnitedProvider;
-import org.apache.ignite.ci.teamcity.ignited.SyncMode;
+import org.apache.ignite.tcbot.persistence.IStringCompactor;
+import org.apache.ignite.tcignited.ITeamcityIgnited;
+import org.apache.ignite.tcignited.ITeamcityIgnitedProvider;
+import org.apache.ignite.tcignited.SyncMode;
 import org.apache.ignite.ci.teamcity.ignited.fatbuild.FatBuildCompacted;
 import org.apache.ignite.ci.teamcity.ignited.fatbuild.ProblemCompacted;
-import org.apache.ignite.ci.user.ICredentialsProv;
+import org.apache.ignite.ci.user.ITcBotUserCreds;
 import org.apache.ignite.ci.util.FutureUtil;
 import org.apache.ignite.ci.web.model.trends.BuildStatisticsSummary;
 import org.apache.ignite.ci.web.model.trends.BuildsHistory;
@@ -186,7 +186,7 @@ public class MasterTrendsService {
         @Nullable String sinceDate,
         @Nullable String untilDate,
         @Nullable String skipTests,
-        ICredentialsProv prov) throws ParseException {
+        ITcBotUserCreds prov) throws ParseException {
 
         String srvCode = Strings.isNullOrEmpty(srvCodeParm) ? cfg.primaryServerCode() : srvCodeParm;
 
@@ -216,7 +216,7 @@ public class MasterTrendsService {
      * @param skipTests
      */
     public void initializeBuildTrends(BuildsHistory buildsHist, String srvCode,
-        ICredentialsProv prov, boolean skipTests) {
+                                      ITcBotUserCreds prov, boolean skipTests) {
         ITeamcityIgnited ignitedTeamcity = tcIgnitedProv.server(srvCode, prov);
 
         buildsHist.tcHost = ignitedTeamcity.host();
diff --git a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/tcbot/visa/BranchTicketMatcher.java b/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/tcbot/visa/BranchTicketMatcher.java
index 0c472d8..7c927c1 100644
--- a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/tcbot/visa/BranchTicketMatcher.java
+++ b/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/tcbot/visa/BranchTicketMatcher.java
@@ -18,7 +18,7 @@
 package org.apache.ignite.ci.tcbot.visa;
 
 import com.google.common.base.Strings;
-import org.apache.ignite.ci.di.cache.GuavaCached;
+import org.apache.ignite.tcbot.common.interceptor.GuavaCached;
 import org.apache.ignite.ci.github.PullRequest;
 import org.apache.ignite.ci.github.ignited.IGitHubConnIgnitedProvider;
 import org.apache.ignite.ci.github.pure.IGitHubConnection;
diff --git a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/tcbot/visa/TcBotTriggerAndSignOffService.java b/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/tcbot/visa/TcBotTriggerAndSignOffService.java
index eac7b66..594c111 100644
--- a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/tcbot/visa/TcBotTriggerAndSignOffService.java
+++ b/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/tcbot/visa/TcBotTriggerAndSignOffService.java
@@ -57,14 +57,14 @@ import org.apache.ignite.tcbot.common.conf.ITcServerConfig;
 import org.apache.ignite.tcservice.model.mute.MuteInfo;
 import org.apache.ignite.tcservice.model.result.Build;
 import org.apache.ignite.ci.teamcity.ignited.BuildRefCompacted;
-import org.apache.ignite.ci.teamcity.ignited.IStringCompactor;
-import org.apache.ignite.ci.teamcity.ignited.ITeamcityIgnited;
-import org.apache.ignite.ci.teamcity.ignited.ITeamcityIgnitedProvider;
-import org.apache.ignite.ci.teamcity.ignited.SyncMode;
+import org.apache.ignite.tcbot.persistence.IStringCompactor;
+import org.apache.ignite.tcignited.ITeamcityIgnited;
+import org.apache.ignite.tcignited.ITeamcityIgnitedProvider;
+import org.apache.ignite.tcignited.SyncMode;
 import org.apache.ignite.ci.teamcity.ignited.buildtype.BuildTypeCompacted;
 import org.apache.ignite.ci.teamcity.ignited.buildtype.BuildTypeRefCompacted;
 import org.apache.ignite.ci.teamcity.ignited.fatbuild.FatBuildCompacted;
-import org.apache.ignite.ci.user.ICredentialsProv;
+import org.apache.ignite.ci.user.ITcBotUserCreds;
 import org.apache.ignite.ci.web.model.ContributionKey;
 import org.apache.ignite.ci.web.model.JiraCommentResponse;
 import org.apache.ignite.ci.web.model.SimpleResult;
@@ -141,7 +141,7 @@ public class TcBotTriggerAndSignOffService {
     }
 
     /** */
-    public List<VisaStatus> getVisasStatus(String srvId, ICredentialsProv prov) {
+    public List<VisaStatus> getVisasStatus(String srvId, ITcBotUserCreds prov) {
         List<VisaStatus> visaStatuses = new ArrayList<>();
 
         ITeamcityIgnited ignited = tcIgnitedProv.server(srvId, prov);
@@ -199,10 +199,10 @@ public class TcBotTriggerAndSignOffService {
      * @param creds Credentials.
      * @return Mutes for given server-project pair.
      */
-    public Set<MuteInfo> getMutes(String srvId, String projectId, ICredentialsProv creds) {
+    public Set<MuteInfo> getMutes(String srvId, String projectId, ITcBotUserCreds creds) {
         ITeamcityIgnited ignited = tcIgnitedProv.server(srvId, creds);
 
-        Set<MuteInfo> mutes = ignited.getMutes(projectId, creds);
+        Set<MuteInfo> mutes = ignited.getMutes(projectId);
 
         IJiraIgnited jiraIgn = jiraIgnProv.server(srvId);
 
@@ -254,7 +254,7 @@ public class TcBotTriggerAndSignOffService {
         @Nullable Boolean observe,
         @Nullable String ticketId,
         @Nullable String prNum,
-        @Nullable ICredentialsProv prov) {
+        @Nullable ITcBotUserCreds prov) {
         String jiraRes = "";
 
         ITeamcityIgnited teamcity = tcIgnitedProv.server(srvId, prov);
@@ -303,7 +303,7 @@ public class TcBotTriggerAndSignOffService {
         String srvId,
         String branchForTc,
         @Nullable String ticketFullName,
-        ICredentialsProv prov,
+        ITcBotUserCreds prov,
         String parentSuiteId,
         Build... builds
     ) {
@@ -338,7 +338,7 @@ public class TcBotTriggerAndSignOffService {
         @QueryParam("branchName") @Nullable String branchForTc,
         @QueryParam("suiteId") @Nullable String suiteId,
         @QueryParam("ticketId") @Nullable String ticketFullName,
-        ICredentialsProv prov) {
+        ITcBotUserCreds prov) {
 
         try {
             ticketFullName = ticketMatcher.resolveTicketFromBranch(srvId, ticketFullName, branchForTc);
@@ -369,7 +369,7 @@ public class TcBotTriggerAndSignOffService {
      * @param credsProv Credentials
      */
     public List<ContributionToCheck> getContributionsToCheck(String srvCodeOrAlias,
-        ICredentialsProv credsProv) {
+        ITcBotUserCreds credsProv) {
         IJiraIgnited jiraIntegration = jiraIgnProv.server(srvCodeOrAlias);
 
         IGitHubConnIgnited gitHubConnIgnited = gitHubConnIgnitedProvider.server(srvCodeOrAlias);
@@ -562,7 +562,7 @@ public class TcBotTriggerAndSignOffService {
      * @param prId Pr id from {@link ContributionToCheck#prNumber}. Negative value imples branch number (with
      * appropriate prefix from GH config).
      */
-    public Set<ContributionCheckStatus> contributionStatuses(String srvCode, ICredentialsProv prov,
+    public Set<ContributionCheckStatus> contributionStatuses(String srvCode, ITcBotUserCreds prov,
         String prId) {
         Set<ContributionCheckStatus> statuses = new LinkedHashSet<>();
 
@@ -718,8 +718,8 @@ public class TcBotTriggerAndSignOffService {
         return teamcity.host() + "viewQueued.html?itemId=" + ref.id();
     }
 
-    public CurrentVisaStatus currentVisaStatus(String srvCode, ICredentialsProv prov, String buildTypeId,
-        String tcBranch) {
+    public CurrentVisaStatus currentVisaStatus(String srvCode, ITcBotUserCreds prov, String buildTypeId,
+                                               String tcBranch) {
         CurrentVisaStatus status = new CurrentVisaStatus();
 
         List<SuiteCurrentStatus> suitesStatuses
@@ -746,7 +746,7 @@ public class TcBotTriggerAndSignOffService {
      */
     public Visa notifyJira(
         String srvId,
-        ICredentialsProv prov,
+        ITcBotUserCreds prov,
         String buildTypeId,
         String branchForTc,
         String ticket
diff --git a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/teamcity/restcached/ITcServerProvider.java b/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/teamcity/restcached/ITcServerProvider.java
index 4b785b7..837be85 100644
--- a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/teamcity/restcached/ITcServerProvider.java
+++ b/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/teamcity/restcached/ITcServerProvider.java
@@ -16,8 +16,7 @@
  */
 package org.apache.ignite.ci.teamcity.restcached;
 
-import org.apache.ignite.ci.IAnalyticsEnabledTeamcity;
-import org.apache.ignite.ci.user.ICredentialsProv;
+import org.apache.ignite.ci.user.ITcBotUserCreds;
 import org.apache.ignite.tcservice.ITeamcity;
 
 import javax.annotation.Nullable;
@@ -30,5 +29,5 @@ public interface ITcServerProvider {
      * @param srvId Server id.
      * @param prov Prov.
      */
-    public ITeamcity server(String srvId, @Nullable ICredentialsProv prov);
+    public ITeamcity server(String srvId, @Nullable ITcBotUserCreds prov);
 }
diff --git a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/teamcity/restcached/InitializingServerFactory.java b/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/teamcity/restcached/InitializingServerFactory.java
index f7827d1..1b94cab 100644
--- a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/teamcity/restcached/InitializingServerFactory.java
+++ b/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/teamcity/restcached/InitializingServerFactory.java
@@ -20,22 +20,23 @@ import com.google.common.base.Strings;
 import javax.inject.Inject;
 import javax.inject.Provider;
 import org.apache.ignite.ci.IAnalyticsEnabledTeamcity;
-import org.apache.ignite.tcservice.IgniteTeamcityConnection;
+import org.apache.ignite.tcservice.TeamcityServiceConnection;
 import org.apache.ignite.ci.web.TcUpdatePool;
 
+@Deprecated
  class InitializingServerFactory implements ITcServerFactory {
     @Inject
     Provider<IAnalyticsEnabledTeamcity> tcPersistProv;
 
     @Inject
-    Provider<IgniteTeamcityConnection> tcConnProv;
+    Provider<TeamcityServiceConnection> tcConnProv;
 
     @Inject
     private TcUpdatePool tcUpdatePool;
 
     /** {@inheritDoc} */
     @Override public IAnalyticsEnabledTeamcity createServer(String srvId) {
-        IgniteTeamcityConnection tcConn = tcConnProv.get();
+        TeamcityServiceConnection tcConn = tcConnProv.get();
         tcConn.init(Strings.emptyToNull(srvId));
 
         IAnalyticsEnabledTeamcity instance = tcPersistProv.get();
diff --git a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/teamcity/restcached/TcServerCachingProvider.java b/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/teamcity/restcached/TcServerCachingProvider.java
index c36debb..5540551 100644
--- a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/teamcity/restcached/TcServerCachingProvider.java
+++ b/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/teamcity/restcached/TcServerCachingProvider.java
@@ -19,8 +19,7 @@ package org.apache.ignite.ci.teamcity.restcached;
 import com.google.common.base.Strings;
 import com.google.common.cache.Cache;
 import com.google.common.cache.CacheBuilder;
-import org.apache.ignite.ci.IAnalyticsEnabledTeamcity;
-import org.apache.ignite.ci.user.ICredentialsProv;
+import org.apache.ignite.ci.user.ITcBotUserCreds;
 import org.apache.ignite.tcbot.common.exeption.ExceptionUtil;
 import org.apache.ignite.tcservice.ITeamcity;
 
@@ -46,7 +45,7 @@ class TcServerCachingProvider implements ITcServerProvider {
         .build();
 
     /** {@inheritDoc} */
-    @Override public ITeamcity server(String srvId, @Nullable ICredentialsProv prov) {
+    @Override public ITeamcity server(String srvId, @Nullable ITcBotUserCreds prov) {
         String fullKey = Strings.nullToEmpty(prov == null ? null : prov.getUser(srvId)) + ":" + Strings.nullToEmpty(srvId);
 
         try {
diff --git a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/di/scheduler/NoOpScheduler.java b/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/user/ITcBotUserCreds.java
similarity index 59%
rename from ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/di/scheduler/NoOpScheduler.java
rename to ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/user/ITcBotUserCreds.java
index 18d4362..95283ba 100644
--- a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/di/scheduler/NoOpScheduler.java
+++ b/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/user/ITcBotUserCreds.java
@@ -14,26 +14,24 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-package org.apache.ignite.ci.di.scheduler;
 
-import java.util.concurrent.TimeUnit;
+package org.apache.ignite.ci.user;
 
-/**
- * Sheduler which never waits
- */
-public class NoOpScheduler implements IScheduler {
-    /** {@inheritDoc} */
-    @Override public void invokeLater(Runnable cmd, long delay, TimeUnit unit) {
+import com.google.common.base.Strings;
+import org.apache.ignite.tcignited.creds.ICredentialsProv;
 
-    }
+import javax.servlet.http.HttpServletRequest;
 
-    /** {@inheritDoc} */
-    @Override public void sheduleNamed(String fullName, Runnable cmd, long queitPeriod, TimeUnit unit) {
+public interface ITcBotUserCreds extends ICredentialsProv {
+    /** Key for context attribute. */
+    public String _KEY = ITcBotUserCreds.class.getName();
 
+    //note it will not work for PermitAll Methods
+    public static ITcBotUserCreds get(HttpServletRequest req) {
+        return (ITcBotUserCreds) req.getAttribute(_KEY);
     }
+  
+    String getPrincipalId();
 
-    /** {@inheritDoc} */
-    @Override public void stop() {
-
-    }
+    byte[] getUserKey();
 }
diff --git a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/user/TcHelperUser.java b/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/user/TcHelperUser.java
index 7e4e22d..39b9706 100644
--- a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/user/TcHelperUser.java
+++ b/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/user/TcHelperUser.java
@@ -24,8 +24,9 @@ import java.util.LinkedHashSet;
 import java.util.List;
 import java.util.Set;
 import java.util.TreeSet;
-import org.apache.ignite.ci.analysis.IVersionedEntity;
-import org.apache.ignite.ci.db.Persisted;
+
+import org.apache.ignite.tcbot.persistence.IVersionedEntity;
+import org.apache.ignite.tcbot.persistence.Persisted;
 import org.apache.ignite.ci.tcbot.conf.INotificationChannel;
 import org.apache.ignite.tcservice.model.user.User;
 import org.apache.ignite.ci.util.CryptUtil;
diff --git a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/user/UserSession.java b/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/user/UserSession.java
index c4eba7c..4922586 100644
--- a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/user/UserSession.java
+++ b/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/user/UserSession.java
@@ -17,7 +17,7 @@
 
 package org.apache.ignite.ci.user;
 
-import org.apache.ignite.ci.db.Persisted;
+import org.apache.ignite.tcbot.persistence.Persisted;
 
 @Persisted
 public class UserSession {
diff --git a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/util/ZipUtil.java b/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/util/ZipUtil.java
deleted file mode 100644
index 3532db9..0000000
--- a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/util/ZipUtil.java
+++ /dev/null
@@ -1,72 +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.ignite.ci.util;
-
-import java.io.File;
-import java.io.FileInputStream;
-import java.io.IOException;
-import java.io.UncheckedIOException;
-import java.nio.file.Files;
-import java.nio.file.StandardCopyOption;
-import java.util.ArrayList;
-import java.util.List;
-import java.util.zip.ZipEntry;
-import java.util.zip.ZipInputStream;
-
-import org.apache.ignite.tcbot.common.conf.TcBotWorkDir;
-
-/** Unzips files to specified folder */
-public class ZipUtil {
-
-    public static List<File> unZipToSameFolder(File zipFile) {
-        return unZip(zipFile, zipFile.getParentFile());
-    }
-
-    public static List<File> unZip(File zipFile, File outputFolder) {
-        List<File> result = new ArrayList<>();
-        try {
-            //get the zip file content
-            try (ZipInputStream zis =
-                     new ZipInputStream(new FileInputStream(zipFile))){
-                //get the zipped file list entry
-                ZipEntry ze = zis.getNextEntry();
-
-                while (ze != null) {
-                    String fileName = ze.getName();
-                    File newFile = new File(outputFolder + File.separator + fileName);
-                    if(newFile.exists() && newFile.canRead())
-                        System.out.println("file unzip skipped (file already exist): " + newFile.getAbsoluteFile());
-                    else {
-                        System.out.println("file unzip : " + newFile.getAbsoluteFile());
-
-                        TcBotWorkDir.ensureDirExist(new File(newFile.getParent()));
-                        Files.copy(zis, newFile.toPath(), StandardCopyOption.REPLACE_EXISTING);
-                    }
-                    result.add(newFile);
-                    ze = zis.getNextEntry();
-                }
-                zis.closeEntry();
-            }  
-            return result;
-        }
-        catch (IOException e) {
-            throw new UncheckedIOException(e);
-        }
-
-    }
-}
diff --git a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/web/CtxListener.java b/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/web/CtxListener.java
index 1b78823..81d5e59 100644
--- a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/web/CtxListener.java
+++ b/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/web/CtxListener.java
@@ -17,10 +17,10 @@
 
 package org.apache.ignite.ci.web;
 
-import com.google.common.base.Preconditions;
 import com.google.inject.Guice;
 import com.google.inject.Injector;
 import java.io.IOException;
+import java.util.logging.Handler;
 import javax.annotation.Nullable;
 import javax.servlet.ServletContext;
 import javax.servlet.ServletContextEvent;
@@ -28,11 +28,10 @@ import javax.servlet.ServletContextListener;
 import org.apache.ignite.Ignite;
 import org.apache.ignite.ci.db.TcHelperDb;
 import org.apache.ignite.ci.di.IgniteTcBotModule;
-import org.apache.ignite.ci.di.scheduler.IScheduler;
+import org.apache.ignite.tcbot.persistence.scheduler.IScheduler;
 import org.apache.ignite.ci.observer.BuildObserver;
 import org.apache.ignite.ci.tcbot.issue.IssueDetector;
 import org.apache.ignite.tcservice.http.TeamcityRecorder;
-import org.apache.ignite.ci.teamcity.restcached.ITcServerProvider;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
@@ -40,7 +39,8 @@ import org.slf4j.LoggerFactory;
  */
 public class CtxListener implements ServletContextListener {
     /** Javax.Injector property code for servlet context. */
-    public static final String INJECTOR = "injector";
+    private static final String INJECTOR = "injector";
+
     @Nullable private static volatile Logger logger;
 
     public static Injector getInjector(ServletContext ctx) {
@@ -55,9 +55,6 @@ public class CtxListener implements ServletContextListener {
 
         Injector injector = igniteTcBotModule.startIgniteInit(injectorPreCreated);
 
-        ITcServerProvider instance = injector.getInstance(ITcServerProvider.class);
-        Preconditions.checkState(instance == injector.getInstance(ITcServerProvider.class));
-
         final ServletContext ctx = sctxEvt.getServletContext();
 
         ctx.setAttribute(INJECTOR, injector);
@@ -70,8 +67,8 @@ public class CtxListener implements ServletContextListener {
         java.util.logging.Logger rootLog = java.util.logging.LogManager.getLogManager().getLogger("");
         java.util.logging.Handler[] handlers = rootLog.getHandlers();
 
-        for (int i = 0; i < handlers.length; i++)
-            rootLog.removeHandler(handlers[i]);
+        for (Handler handler : handlers)
+            rootLog.removeHandler(handler);
 
         org.slf4j.bridge.SLF4JBridgeHandler.install();
 
diff --git a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/web/auth/AuthenticationFilter.java b/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/web/auth/AuthenticationFilter.java
index 06a09fe..32ece86 100644
--- a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/web/auth/AuthenticationFilter.java
+++ b/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/web/auth/AuthenticationFilter.java
@@ -39,7 +39,7 @@ import javax.ws.rs.core.Response;
 import javax.ws.rs.ext.Provider;
 import org.apache.ignite.Ignite;
 import org.apache.ignite.ci.tcbot.user.IUserStorage;
-import org.apache.ignite.ci.user.ICredentialsProv;
+import org.apache.ignite.ci.user.ITcBotUserCreds;
 import org.apache.ignite.ci.user.TcHelperUser;
 import org.apache.ignite.ci.user.UserSession;
 import org.apache.ignite.tcbot.common.util.Base64Util;
@@ -209,14 +209,14 @@ public class AuthenticationFilter implements ContainerRequestFilter {
 
         users.putSession(sessId, ses);
 
-        reqCtx.setProperty(ICredentialsProv._KEY, createCredsProv(user, userKey));
+        reqCtx.setProperty(ITcBotUserCreds._KEY, createCredsProv(user, userKey));
 
         return true;
     }
 
     @NotNull
-    private ICredentialsProv createCredsProv(TcHelperUser user, byte[] userKey) {
-        return new ICredentialsProv() {
+    private ITcBotUserCreds createCredsProv(TcHelperUser user, byte[] userKey) {
+        return new ITcBotUserCreds() {
             @Override public String getUser(String srvCode) {
                 TcHelperUser.Credentials creds = user.getCredentials(srvCode);
                 if (creds == null)
diff --git a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/web/model/CompactContributionKey.java b/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/web/model/CompactContributionKey.java
index c838c52..7360cb8 100644
--- a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/web/model/CompactContributionKey.java
+++ b/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/web/model/CompactContributionKey.java
@@ -18,7 +18,7 @@
 package org.apache.ignite.ci.web.model;
 
 import java.util.Objects;
-import org.apache.ignite.ci.teamcity.ignited.IStringCompactor;
+import org.apache.ignite.tcbot.persistence.IStringCompactor;
 
 /**
  * Representation of {@link ContributionKey} with compacted properties for more effective cache storing.
diff --git a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/web/model/CompactVisa.java b/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/web/model/CompactVisa.java
index 9b2c957..906ffae 100644
--- a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/web/model/CompactVisa.java
+++ b/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/web/model/CompactVisa.java
@@ -17,7 +17,7 @@
 
 package org.apache.ignite.ci.web.model;
 
-import org.apache.ignite.ci.teamcity.ignited.IStringCompactor;
+import org.apache.ignite.tcbot.persistence.IStringCompactor;
 import org.jetbrains.annotations.Nullable;
 
 /**
diff --git a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/web/model/CompactVisaRequest.java b/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/web/model/CompactVisaRequest.java
index 5c85e76..9aaab05 100644
--- a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/web/model/CompactVisaRequest.java
+++ b/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/web/model/CompactVisaRequest.java
@@ -18,7 +18,7 @@
 package org.apache.ignite.ci.web.model;
 
 import org.apache.ignite.ci.observer.CompactBuildsInfo;
-import org.apache.ignite.ci.teamcity.ignited.IStringCompactor;
+import org.apache.ignite.tcbot.persistence.IStringCompactor;
 
 /**
  * Representation of {@link CompactVisaRequest} with compacted properties for more effective cache storing.
diff --git a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/web/model/ContributionKey.java b/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/web/model/ContributionKey.java
index 2e2c6b2..c88a74f 100644
--- a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/web/model/ContributionKey.java
+++ b/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/web/model/ContributionKey.java
@@ -18,7 +18,7 @@
 package org.apache.ignite.ci.web.model;
 
 import java.util.Objects;
-import org.apache.ignite.ci.teamcity.ignited.IStringCompactor;
+import org.apache.ignite.tcbot.persistence.IStringCompactor;
 
 /**
  * Class which is used as a key to determine Server and TC branch info.
diff --git a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/web/model/current/ChainAtServerCurrentStatus.java b/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/web/model/current/ChainAtServerCurrentStatus.java
index 7a7c956..b9df193 100644
--- a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/web/model/current/ChainAtServerCurrentStatus.java
+++ b/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/web/model/current/ChainAtServerCurrentStatus.java
@@ -34,8 +34,8 @@ import org.apache.ignite.ci.github.pure.IGitHubConnection;
 import org.apache.ignite.ci.jira.ignited.IJiraIgnited;
 import org.apache.ignite.ci.tcbot.visa.BranchTicketMatcher;
 import org.apache.ignite.tcservice.model.conf.BuildType;
-import org.apache.ignite.ci.teamcity.ignited.IStringCompactor;
-import org.apache.ignite.ci.teamcity.ignited.ITeamcityIgnited;
+import org.apache.ignite.tcbot.persistence.IStringCompactor;
+import org.apache.ignite.tcignited.ITeamcityIgnited;
 import org.apache.ignite.ci.util.CollectionUtil;
 import org.apache.ignite.internal.util.typedef.T2;
 
diff --git a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/web/model/current/SuiteCurrentStatus.java b/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/web/model/current/SuiteCurrentStatus.java
index 876cddb..9c1fd82 100644
--- a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/web/model/current/SuiteCurrentStatus.java
+++ b/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/web/model/current/SuiteCurrentStatus.java
@@ -31,14 +31,12 @@ import javax.annotation.Nonnull;
 import javax.annotation.Nullable;
 import org.apache.ignite.ci.analysis.IMultTestOccurrence;
 import org.apache.ignite.ci.analysis.MultBuildRunCtx;
-import org.apache.ignite.ci.analysis.SuiteInBranch;
-import org.apache.ignite.ci.analysis.TestInBranch;
 import org.apache.ignite.ci.analysis.TestLogCheckResult;
 import org.apache.ignite.ci.issue.EventTemplates;
 import org.apache.ignite.ci.issue.ProblemRef;
-import org.apache.ignite.ci.teamcity.ignited.IRunHistory;
-import org.apache.ignite.ci.teamcity.ignited.IStringCompactor;
-import org.apache.ignite.ci.teamcity.ignited.ITeamcityIgnited;
+import org.apache.ignite.tcignited.history.IRunHistory;
+import org.apache.ignite.tcbot.persistence.IStringCompactor;
+import org.apache.ignite.tcignited.ITeamcityIgnited;
 import org.apache.ignite.ci.web.model.hist.FailureSummary;
 import org.apache.ignite.ci.web.rest.GetBuildLog;
 import org.jetbrains.annotations.NotNull;
@@ -168,9 +166,7 @@ import static org.apache.ignite.ci.util.UrlUtil.escape;
         if (includeTests) {
             List<IMultTestOccurrence> tests = suite.getFailedTests();
             Function<IMultTestOccurrence, Float> function = foccur -> {
-                TestInBranch testInBranch = new TestInBranch(foccur.getName(), failRateNormalizedBranch);
-
-                IRunHistory apply = tcIgnited.getTestRunHist(testInBranch);
+                IRunHistory apply = tcIgnited.getTestRunHist(foccur.getName(), failRateNormalizedBranch);
 
                 return apply == null ? 0f : apply.getFailRate();
             };
@@ -242,7 +238,7 @@ import static org.apache.ignite.ci.util.UrlUtil.escape;
         if (Strings.isNullOrEmpty(suiteId))
             return null;
 
-        final IRunHistory statInBaseBranch = tcIgnited.getSuiteRunHist(new SuiteInBranch(suiteId, failRateNormalizedBranch));
+        final IRunHistory statInBaseBranch = tcIgnited.getSuiteRunHist(suiteId, failRateNormalizedBranch);
 
         if (statInBaseBranch != null) {
             failures = statInBaseBranch.getFailuresCount();
@@ -262,9 +258,8 @@ import static org.apache.ignite.ci.util.UrlUtil.escape;
 
         IRunHistory latestRunsSrc = null;
         if (!failRateNormalizedBranch.equals(curBranchNormalized)) {
-            SuiteInBranch keyForStripe = new SuiteInBranch(suiteId, curBranchNormalized);
 
-            final IRunHistory statForStripe = tcIgnited.getSuiteRunHist(keyForStripe);
+            final IRunHistory statForStripe = tcIgnited.getSuiteRunHist(suiteId, curBranchNormalized);
 
             latestRunsSrc = statForStripe;
             latestRuns = statForStripe != null ? statForStripe.getLatestRunResults() : null;
diff --git a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/web/model/current/TestFailure.java b/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/web/model/current/TestFailure.java
index 8227e50..2c32b4b 100644
--- a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/web/model/current/TestFailure.java
+++ b/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/web/model/current/TestFailure.java
@@ -26,12 +26,11 @@ import java.util.regex.Pattern;
 import javax.annotation.Nonnull;
 import javax.annotation.Nullable;
 import org.apache.ignite.ci.analysis.IMultTestOccurrence;
-import org.apache.ignite.ci.analysis.TestInBranch;
 import org.apache.ignite.ci.issue.EventTemplates;
 import org.apache.ignite.ci.issue.ProblemRef;
 import org.apache.ignite.ci.logs.LogMsgToWarn;
-import org.apache.ignite.ci.teamcity.ignited.IRunHistory;
-import org.apache.ignite.ci.teamcity.ignited.ITeamcityIgnited;
+import org.apache.ignite.tcignited.history.IRunHistory;
+import org.apache.ignite.tcignited.ITeamcityIgnited;
 import org.apache.ignite.ci.web.model.hist.FailureSummary;
 import org.apache.ignite.ci.web.model.hist.TestHistory;
 import org.jetbrains.annotations.NotNull;
@@ -145,7 +144,7 @@ import static org.apache.ignite.ci.util.UrlUtil.escape;
                     webUrlBaseBranch = buildWebLink(tcIgn, full.test.id, projectId, baseBranchName);
         });
 
-        final IRunHistory stat = tcIgn.getTestRunHist(new TestInBranch(name, normalizeBranch(baseBranchName)));
+        final IRunHistory stat = tcIgn.getTestRunHist(name, normalizeBranch(baseBranchName));
 
         blockerComment = failure.getPossibleBlockerComment(stat);
     }
@@ -200,16 +199,14 @@ import static org.apache.ignite.ci.util.UrlUtil.escape;
         String failRateNormalizedBranch,
         String curBranchNormalized) {
 
-        final IRunHistory stat = tcIgnited.getTestRunHist(new TestInBranch(name, failRateNormalizedBranch));
+        final IRunHistory stat = tcIgnited.getTestRunHist(name, failRateNormalizedBranch);
 
         histBaseBranch.init(stat);
 
         IRunHistory statForProblemsDetection = null;
 
         if (!curBranchNormalized.equals(failRateNormalizedBranch)) {
-            TestInBranch testInBranchS = new TestInBranch(name, curBranchNormalized);
-
-            statForProblemsDetection = tcIgnited.getTestRunHist(testInBranchS);
+            statForProblemsDetection = tcIgnited.getTestRunHist(name, curBranchNormalized);
 
             if (statForProblemsDetection != null) {
                 histCurBranch = new TestHistory();
diff --git a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/web/model/hist/TestHistory.java b/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/web/model/hist/TestHistory.java
index 888ecce..a6fd120 100644
--- a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/web/model/hist/TestHistory.java
+++ b/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/web/model/hist/TestHistory.java
@@ -20,7 +20,7 @@ package org.apache.ignite.ci.web.model.hist;
 import java.util.List;
 import java.util.Objects;
 import javax.annotation.Nullable;
-import org.apache.ignite.ci.teamcity.ignited.IRunHistory;
+import org.apache.ignite.tcignited.history.IRunHistory;
 
 /**
  * Summary of failures - all history and recent runs for suite or for suite.
diff --git a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/web/model/hist/VisasHistoryStorage.java b/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/web/model/hist/VisasHistoryStorage.java
index 46a0ef2..29904e7 100644
--- a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/web/model/hist/VisasHistoryStorage.java
+++ b/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/web/model/hist/VisasHistoryStorage.java
@@ -28,7 +28,7 @@ import javax.cache.Cache;
 import javax.inject.Inject;
 import org.apache.ignite.Ignite;
 import org.apache.ignite.ci.db.TcHelperDb;
-import org.apache.ignite.ci.teamcity.ignited.IStringCompactor;
+import org.apache.ignite.tcbot.persistence.IStringCompactor;
 import org.apache.ignite.ci.web.model.CompactContributionKey;
 import org.apache.ignite.ci.web.model.CompactVisaRequest;
 import org.apache.ignite.ci.web.model.ContributionKey;
diff --git a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/web/model/trends/BuildStatisticsSummary.java b/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/web/model/trends/BuildStatisticsSummary.java
index 91920e1..837abf0 100644
--- a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/web/model/trends/BuildStatisticsSummary.java
+++ b/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/web/model/trends/BuildStatisticsSummary.java
@@ -30,7 +30,7 @@ import java.util.stream.Stream;
 import org.apache.ignite.tcservice.model.hist.BuildRef;
 import org.apache.ignite.tcservice.model.result.TestOccurrencesRef;
 import org.apache.ignite.tcservice.model.result.tests.TestOccurrence;
-import org.apache.ignite.ci.teamcity.ignited.IStringCompactor;
+import org.apache.ignite.tcbot.persistence.IStringCompactor;
 import org.apache.ignite.ci.teamcity.ignited.fatbuild.FatBuildCompacted;
 import org.apache.ignite.ci.teamcity.ignited.fatbuild.ProblemCompacted;
 import org.apache.ignite.internal.util.typedef.T2;
diff --git a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/web/model/trends/BuildsHistory.java b/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/web/model/trends/BuildsHistory.java
index 048975d..cd2554b 100644
--- a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/web/model/trends/BuildsHistory.java
+++ b/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/web/model/trends/BuildsHistory.java
@@ -30,7 +30,7 @@ import java.util.concurrent.ConcurrentHashMap;
 
 import org.apache.ignite.tcservice.ITeamcity;
 import org.apache.ignite.ci.tcbot.conf.ITcBotConfig;
-import org.apache.ignite.ci.teamcity.ignited.IStringCompactor;
+import org.apache.ignite.tcbot.persistence.IStringCompactor;
 
 import static com.google.common.base.Strings.isNullOrEmpty;
 
diff --git a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/web/rest/GetChainResultsAsHtml.java b/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/web/rest/GetChainResultsAsHtml.java
index 9a8acd6..fa755f9 100644
--- a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/web/rest/GetChainResultsAsHtml.java
+++ b/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/web/rest/GetChainResultsAsHtml.java
@@ -30,17 +30,16 @@ import javax.ws.rs.core.Context;
 
 import com.google.inject.Injector;
 import org.apache.ignite.ci.tcbot.chain.BuildChainProcessor;
-import org.apache.ignite.ci.IAnalyticsEnabledTeamcity;
 import org.apache.ignite.tcservice.ITeamcity;
 import org.apache.ignite.ci.analysis.FullChainRunCtx;
 import org.apache.ignite.ci.analysis.mode.LatestRebuildMode;
 import org.apache.ignite.ci.analysis.mode.ProcessLogsMode;
-import org.apache.ignite.ci.teamcity.ignited.IStringCompactor;
-import org.apache.ignite.ci.teamcity.ignited.ITeamcityIgnited;
-import org.apache.ignite.ci.teamcity.ignited.ITeamcityIgnitedProvider;
-import org.apache.ignite.ci.teamcity.ignited.SyncMode;
+import org.apache.ignite.tcbot.persistence.IStringCompactor;
+import org.apache.ignite.tcignited.ITeamcityIgnited;
+import org.apache.ignite.tcignited.ITeamcityIgnitedProvider;
+import org.apache.ignite.tcignited.SyncMode;
 import org.apache.ignite.ci.teamcity.restcached.ITcServerProvider;
-import org.apache.ignite.ci.user.ICredentialsProv;
+import org.apache.ignite.ci.user.ITcBotUserCreds;
 import org.apache.ignite.ci.util.FutureUtil;
 import org.apache.ignite.ci.web.CtxListener;
 import org.apache.ignite.ci.web.model.current.ChainAtServerCurrentStatus;
@@ -73,8 +72,7 @@ public class GetChainResultsAsHtml {
 
         String failRateBranch = ITeamcity.DEFAULT;
 
-        ITcServerProvider tcHelper = injector.getInstance(ITcServerProvider.class);
-        final ICredentialsProv creds = ICredentialsProv.get(req);
+        ITcBotUserCreds creds = ITcBotUserCreds.get(req);
         ITeamcityIgnited tcIgn = injector.getInstance(ITeamcityIgnitedProvider.class).server(srvId, creds);
 
         final FullChainRunCtx ctx = buildChainProcessor.loadFullChainContext(
diff --git a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/web/rest/GetTrackedBranches.java b/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/web/rest/GetTrackedBranches.java
index 3611068..0e07f95 100644
--- a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/web/rest/GetTrackedBranches.java
+++ b/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/web/rest/GetTrackedBranches.java
@@ -37,8 +37,8 @@ import org.apache.ignite.ci.tcbot.conf.BranchTracked;
 import org.apache.ignite.ci.tcbot.conf.ChainAtServer;
 import org.apache.ignite.ci.tcbot.TcBotGeneralService;
 import org.apache.ignite.ci.tcbot.conf.ITcBotConfig;
-import org.apache.ignite.ci.teamcity.ignited.ITeamcityIgnitedProvider;
-import org.apache.ignite.ci.user.ICredentialsProv;
+import org.apache.ignite.tcignited.ITeamcityIgnitedProvider;
+import org.apache.ignite.ci.user.ITcBotUserCreds;
 import org.apache.ignite.ci.web.CtxListener;
 import org.apache.ignite.ci.web.model.Version;
 
@@ -66,7 +66,7 @@ public class GetTrackedBranches {
     @GET
     @Path("getIds")
     public List<String> getIdsIfAccessible() {
-        ICredentialsProv prov = ICredentialsProv.get(req);
+        ITcBotUserCreds prov = ITcBotUserCreds.get(req);
         Injector injector = CtxListener.getInjector(ctx);
         ITcBotConfig cfg = injector.getInstance(ITcBotConfig.class);
         ITeamcityIgnitedProvider tcProv = injector.getInstance(ITeamcityIgnitedProvider.class);
@@ -87,7 +87,7 @@ public class GetTrackedBranches {
     @GET
     @Path("suites")
     public Set<ChainAtServer> getSuites(@Nullable @QueryParam("server") String srvId) {
-        ICredentialsProv prov = ICredentialsProv.get(req);
+        ITcBotUserCreds prov = ITcBotUserCreds.get(req);
         Injector injector = CtxListener.getInjector(ctx);
         ITcBotConfig cfg = injector.getInstance(ITcBotConfig.class);
         ITeamcityIgnitedProvider tcProv = injector.getInstance(ITeamcityIgnitedProvider.class);
@@ -108,7 +108,7 @@ public class GetTrackedBranches {
     @GET
     @Path("getServerIds")
     public Set<String> getServerIds() {
-        ICredentialsProv prov = ICredentialsProv.get(req);
+        ITcBotUserCreds prov = ITcBotUserCreds.get(req);
         Injector injector = CtxListener.getInjector(ctx);
         ITcBotConfig cfg = injector.getInstance(ITcBotConfig.class);
         ITeamcityIgnitedProvider tcProv = injector.getInstance(ITeamcityIgnitedProvider.class);
diff --git a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/web/rest/TriggerBuilds.java b/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/web/rest/TriggerBuilds.java
index 727a286..10baad3 100644
--- a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/web/rest/TriggerBuilds.java
+++ b/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/web/rest/TriggerBuilds.java
@@ -36,8 +36,8 @@ import org.apache.ignite.ci.github.pure.IGitHubConnectionProvider;
 import org.apache.ignite.ci.tcbot.conf.IJiraServerConfig;
 import org.apache.ignite.ci.tcbot.conf.ITcBotConfig;
 import org.apache.ignite.ci.tcbot.trigger.TriggerResult;
-import org.apache.ignite.ci.teamcity.ignited.ITeamcityIgnitedProvider;
-import org.apache.ignite.ci.user.ICredentialsProv;
+import org.apache.ignite.tcignited.ITeamcityIgnitedProvider;
+import org.apache.ignite.ci.user.ITcBotUserCreds;
 import org.apache.ignite.ci.tcbot.visa.TcBotTriggerAndSignOffService;
 import org.apache.ignite.ci.web.CtxListener;
 import org.apache.ignite.ci.web.model.SimpleResult;
@@ -69,7 +69,7 @@ public class TriggerBuilds {
         @Nullable @QueryParam("ticketId") String ticketId,
         @Nullable @QueryParam("prNum") String prNum
     ) {
-        ICredentialsProv prov = ICredentialsProv.get(req);
+        ITcBotUserCreds prov = ITcBotUserCreds.get(req);
         Injector injector = CtxListener.getInjector(ctx);
 
         injector.getInstance(ITeamcityIgnitedProvider.class).checkAccess(srvCode, prov);
@@ -98,7 +98,7 @@ public class TriggerBuilds {
         @Nullable @QueryParam("suiteId") String suiteId,
         @Nullable @QueryParam("ticketId") String ticketId
     ) {
-        ICredentialsProv prov = ICredentialsProv.get(req);
+        ITcBotUserCreds prov = ITcBotUserCreds.get(req);
 
         Injector injector = CtxListener.getInjector(ctx);
 
@@ -112,7 +112,7 @@ public class TriggerBuilds {
     @GET
     @Path("integrationUrls")
     public Set<ServerIntegrationLinks> getIntegrationUrls(@NotNull @QueryParam("serverIds") String srvCodes) {
-        ICredentialsProv prov = ICredentialsProv.get(req);
+        ITcBotUserCreds prov = ITcBotUserCreds.get(req);
 
         Injector injector = CtxListener.getInjector(ctx);
 
diff --git a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/web/rest/build/CompareBuilds.java b/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/web/rest/build/CompareBuilds.java
index d5a3600..f1cd42a 100644
--- a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/web/rest/build/CompareBuilds.java
+++ b/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/web/rest/build/CompareBuilds.java
@@ -30,9 +30,9 @@ import javax.ws.rs.QueryParam;
 import javax.ws.rs.core.Context;
 import javax.ws.rs.core.MediaType;
 import org.apache.ignite.ci.tcbot.builds.CompareBuildsService;
-import org.apache.ignite.ci.teamcity.ignited.ITeamcityIgnitedProvider;
+import org.apache.ignite.tcignited.ITeamcityIgnitedProvider;
 import org.apache.ignite.ci.util.Diff;
-import org.apache.ignite.ci.user.ICredentialsProv;
+import org.apache.ignite.ci.user.ITcBotUserCreds;
 import org.apache.ignite.ci.web.CtxListener;
 import org.apache.ignite.tcbot.common.exeption.ServiceUnauthorizedException;
 
@@ -120,7 +120,7 @@ public class CompareBuilds {
     private List<String> tests(String srvCode, Integer buildId) {
         Injector injector = CtxListener.getInjector(ctx);
 
-        ICredentialsProv prov = ICredentialsProv.get(req);
+        ITcBotUserCreds prov = ITcBotUserCreds.get(req);
 
         injector.getInstance(ITeamcityIgnitedProvider.class).checkAccess(srvCode, prov);
 
diff --git a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/web/rest/build/GetBuildTestFailures.java b/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/web/rest/build/GetBuildTestFailures.java
index 2afb63d..a8cc782 100644
--- a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/web/rest/build/GetBuildTestFailures.java
+++ b/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/web/rest/build/GetBuildTestFailures.java
@@ -23,19 +23,17 @@ import java.text.ParseException;
 import com.google.inject.Injector;
 import org.apache.ignite.ci.tcbot.conf.ITcBotConfig;
 import org.apache.ignite.ci.tcbot.trends.MasterTrendsService;
-import org.apache.ignite.ci.teamcity.ignited.IStringCompactor;
-import org.apache.ignite.ci.teamcity.ignited.SyncMode;
+import org.apache.ignite.tcbot.persistence.IStringCompactor;
+import org.apache.ignite.tcignited.SyncMode;
 import org.apache.ignite.ci.teamcity.ignited.buildcondition.BuildCondition;
 import org.apache.ignite.ci.tcbot.chain.BuildChainProcessor;
-import org.apache.ignite.ci.IAnalyticsEnabledTeamcity;
 import org.apache.ignite.tcservice.ITeamcity;
 import org.apache.ignite.ci.analysis.FullChainRunCtx;
 import org.apache.ignite.ci.analysis.mode.LatestRebuildMode;
 import org.apache.ignite.ci.analysis.mode.ProcessLogsMode;
-import org.apache.ignite.ci.teamcity.ignited.ITeamcityIgnited;
-import org.apache.ignite.ci.teamcity.ignited.ITeamcityIgnitedProvider;
-import org.apache.ignite.ci.teamcity.restcached.ITcServerProvider;
-import org.apache.ignite.ci.user.ICredentialsProv;
+import org.apache.ignite.tcignited.ITeamcityIgnited;
+import org.apache.ignite.tcignited.ITeamcityIgnitedProvider;
+import org.apache.ignite.ci.user.ITcBotUserCreds;
 import org.apache.ignite.ci.web.model.trends.BuildStatisticsSummary;
 import org.apache.ignite.ci.web.model.trends.BuildsHistory;
 import org.apache.ignite.ci.web.CtxListener;
@@ -112,10 +110,9 @@ public class GetBuildTestFailures {
     @NotNull public TestFailuresSummary collectBuildCtxById(@QueryParam("serverId") String srvCode,
         @QueryParam("buildId") Integer buildId,
         @QueryParam("checkAllLogs") @Nullable Boolean checkAllLogs, SyncMode syncMode) {
-        final ICredentialsProv prov = ICredentialsProv.get(req);
+        final ITcBotUserCreds prov = ITcBotUserCreds.get(req);
         final Injector injector = CtxListener.getInjector(ctx);
         ITeamcityIgnitedProvider tcIgnitedProv = injector.getInstance(ITeamcityIgnitedProvider.class);
-        ITcServerProvider tcSrvProvider = injector.getInstance(ITcServerProvider.class);
         final BuildChainProcessor buildChainProcessor = injector.getInstance(BuildChainProcessor.class);
 
         final TestFailuresSummary res = new TestFailuresSummary();
@@ -179,7 +176,7 @@ public class GetBuildTestFailures {
 
         ITeamcityIgnitedProvider tcIgnitedProv = injector.getInstance(ITeamcityIgnitedProvider.class);
 
-        ICredentialsProv prov = ICredentialsProv.get(req);
+        ITcBotUserCreds prov = ITcBotUserCreds.get(req);
 
         tcIgnitedProv.checkAccess(srvCode, prov);
 
@@ -216,7 +213,7 @@ public class GetBuildTestFailures {
 
 
         BuildsHistory buildsHist =
-            instance.getBuildTrends(srvCode, buildType, branch, sinceDate, untilDate, skipTests, ICredentialsProv.get(req));
+            instance.getBuildTrends(srvCode, buildType, branch, sinceDate, untilDate, skipTests, ITcBotUserCreds.get(req));
 
         if (MasterTrendsService.DEBUG)
             System.out.println("MasterTrendsService: Responding");
diff --git a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/web/rest/login/Login.java b/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/web/rest/login/Login.java
index 6084edd..74333b3 100644
--- a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/web/rest/login/Login.java
+++ b/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/web/rest/login/Login.java
@@ -22,7 +22,7 @@ import com.google.inject.Injector;
 import org.apache.ignite.ci.tcbot.conf.ITcBotConfig;
 import org.apache.ignite.ci.tcbot.user.IUserStorage;
 import org.apache.ignite.tcservice.model.user.User;
-import org.apache.ignite.ci.teamcity.ignited.ITeamcityIgnitedProvider;
+import org.apache.ignite.tcignited.ITeamcityIgnitedProvider;
 import org.apache.ignite.tcservice.login.ITcLogin;
 import org.apache.ignite.ci.user.TcHelperUser;
 import org.apache.ignite.tcbot.common.util.Base64Util;
diff --git a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/web/rest/login/UserService.java b/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/web/rest/login/UserService.java
index 90ccc4b..17beee2 100644
--- a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/web/rest/login/UserService.java
+++ b/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/web/rest/login/UserService.java
@@ -38,7 +38,7 @@ import org.apache.ignite.ci.tcbot.user.IUserStorage;
 import org.apache.ignite.ci.tcbot.visa.TcBotTriggerAndSignOffService;
 import org.apache.ignite.tcservice.model.user.User;
 import org.apache.ignite.tcservice.login.ITcLogin;
-import org.apache.ignite.ci.user.ICredentialsProv;
+import org.apache.ignite.ci.user.ITcBotUserCreds;
 import org.apache.ignite.ci.user.TcHelperUser;
 import org.apache.ignite.ci.web.CtxListener;
 import org.apache.ignite.ci.web.model.CredentialsUi;
@@ -63,7 +63,7 @@ public class UserService {
     @GET
     @Path("currentUserName")
     public SimpleResult currentUserName() {
-        final ICredentialsProv prov = ICredentialsProv.get(req);
+        final ITcBotUserCreds prov = ITcBotUserCreds.get(req);
         if (prov == null)
             return new SimpleResult("");
 
@@ -74,7 +74,7 @@ public class UserService {
             injector.getInstance(IssueDetector.class));
     }
 
-    @NotNull public SimpleResult userMenu(ICredentialsProv prov, IUserStorage users, IssueDetector issueDetector) {
+    @NotNull public SimpleResult userMenu(ITcBotUserCreds prov, IUserStorage users, IssueDetector issueDetector) {
         final TcHelperUser user = users.getUser(prov.getPrincipalId());
 
         if (user == null)
@@ -90,7 +90,7 @@ public class UserService {
     @POST
     @Path("authorize")
     public SimpleResult setAuthorizedState() {
-        final ICredentialsProv prov = ICredentialsProv.get(req);
+        final ITcBotUserCreds prov = ITcBotUserCreds.get(req);
 
         Injector injector = CtxListener.getInjector(ctx);
 
@@ -110,7 +110,7 @@ public class UserService {
     @GET
     @Path("get")
     public TcHelperUserUi getUserData(@Nullable @QueryParam("login") final String loginParm) {
-        final String currUserLogin = ICredentialsProv.get(req).getPrincipalId();
+        final String currUserLogin = ITcBotUserCreds.get(req).getPrincipalId();
         final String login = Strings.isNullOrEmpty(loginParm) ? currUserLogin : loginParm;
         Injector injector = CtxListener.getInjector(ctx);
         ITcBotConfig cfg = injector.getInstance(ITcBotConfig.class);
@@ -141,7 +141,7 @@ public class UserService {
     @POST
     @Path("resetCredentials")
     public SimpleResult resetCredentials(@Nullable @FormParam("login") final String loginParm) {
-        final String currUserLogin = ICredentialsProv.get(req).getPrincipalId();
+        final String currUserLogin = ITcBotUserCreds.get(req).getPrincipalId();
         final String login = Strings.isNullOrEmpty(loginParm) ? currUserLogin : loginParm;
         //todo check admin
 
@@ -164,7 +164,7 @@ public class UserService {
         Preconditions.checkState(!Strings.isNullOrEmpty(svcLogin));
         Preconditions.checkState(!Strings.isNullOrEmpty(svcPwd));
 
-        final ICredentialsProv prov = ICredentialsProv.get(req);
+        final ITcBotUserCreds prov = ITcBotUserCreds.get(req);
         final String currUserLogin = prov.getPrincipalId();
         final Injector injector = CtxListener.getInjector(ctx);
         final ITcLogin tcLogin = injector.getInstance(ITcLogin.class);
@@ -198,7 +198,7 @@ public class UserService {
         @Nullable @FormParam("fullName") final String fullName,
         Form form) {
 
-        final String login = ICredentialsProv.get(req).getPrincipalId(); //todo check admin Strings.isNullOrEmpty(loginParm) ? currUserLogin : loginParm;
+        final String login = ITcBotUserCreds.get(req).getPrincipalId(); //todo check admin Strings.isNullOrEmpty(loginParm) ? currUserLogin : loginParm;
 
         final IUserStorage users = CtxListener.getInjector(ctx).getInstance(IUserStorage.class);
         final TcHelperUser user = users.getUser(login);
diff --git a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/web/rest/long_running/BuildsLongRunningTestsReport.java b/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/web/rest/long_running/BuildsLongRunningTestsReport.java
index 3b82bd2..34f04af 100644
--- a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/web/rest/long_running/BuildsLongRunningTestsReport.java
+++ b/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/web/rest/long_running/BuildsLongRunningTestsReport.java
@@ -25,7 +25,7 @@ import javax.ws.rs.QueryParam;
 import javax.ws.rs.core.Context;
 import javax.ws.rs.core.MediaType;
 import org.apache.ignite.ci.tcbot.chain.TrackedBranchChainsProcessor;
-import org.apache.ignite.ci.user.ICredentialsProv;
+import org.apache.ignite.ci.user.ITcBotUserCreds;
 import org.apache.ignite.ci.web.CtxListener;
 import org.apache.ignite.ci.web.model.long_running.FullLRTestsSummary;
 import org.jetbrains.annotations.Nullable;
@@ -47,7 +47,7 @@ public class BuildsLongRunningTestsReport {
     @Path("summary")
     @Produces(MediaType.APPLICATION_JSON)
     public FullLRTestsSummary getBranch(@Nullable @QueryParam("branch") String branchOrNull) {
-        final ICredentialsProv creds = ICredentialsProv.get(req);
+        final ITcBotUserCreds creds = ITcBotUserCreds.get(req);
 
         final TrackedBranchChainsProcessor tbProc = CtxListener.getInjector(ctx).getInstance(TrackedBranchChainsProcessor.class);
 
diff --git a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/web/rest/pr/GetPrTestFailures.java b/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/web/rest/pr/GetPrTestFailures.java
index 9a7bbba..52454d4 100644
--- a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/web/rest/pr/GetPrTestFailures.java
+++ b/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/web/rest/pr/GetPrTestFailures.java
@@ -34,8 +34,8 @@ import org.apache.ignite.ci.github.ignited.IGitHubConnIgnited;
 import org.apache.ignite.ci.github.ignited.IGitHubConnIgnitedProvider;
 import org.apache.ignite.ci.github.pure.IGitHubConnection;
 import org.apache.ignite.ci.tcbot.chain.PrChainsProcessor;
-import org.apache.ignite.ci.teamcity.ignited.SyncMode;
-import org.apache.ignite.ci.user.ICredentialsProv;
+import org.apache.ignite.tcignited.SyncMode;
+import org.apache.ignite.ci.user.ITcBotUserCreds;
 import org.apache.ignite.ci.web.CtxListener;
 import org.apache.ignite.ci.web.model.current.TestFailuresSummary;
 import org.apache.ignite.ci.web.model.current.UpdateInfo;
@@ -92,7 +92,7 @@ public class GetPrTestFailures {
         @QueryParam("baseBranchForTc") @Nullable String baseBranchForTc,
         @QueryParam("checkAllLogs") @Nullable Boolean checkAllLogs,
         SyncMode mode) {
-        final ICredentialsProv creds = ICredentialsProv.get(req);
+        final ITcBotUserCreds creds = ITcBotUserCreds.get(req);
         final Injector injector = CtxListener.getInjector(ctx);
         final PrChainsProcessor prChainsProcessor = injector.getInstance(PrChainsProcessor.class);
 
diff --git a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/web/rest/tracked/GetTrackedBranchTestResults.java b/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/web/rest/tracked/GetTrackedBranchTestResults.java
index 8d0fe4e..a1ab103 100644
--- a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/web/rest/tracked/GetTrackedBranchTestResults.java
+++ b/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/web/rest/tracked/GetTrackedBranchTestResults.java
@@ -31,9 +31,9 @@ import org.apache.ignite.ci.tcbot.chain.TrackedBranchChainsProcessor;
 import org.apache.ignite.ci.tcbot.conf.ITcBotConfig;
 import org.apache.ignite.ci.tcbot.visa.TcBotTriggerAndSignOffService;
 import org.apache.ignite.tcservice.model.mute.MuteInfo;
-import org.apache.ignite.ci.teamcity.ignited.ITeamcityIgnitedProvider;
-import org.apache.ignite.ci.teamcity.ignited.SyncMode;
-import org.apache.ignite.ci.user.ICredentialsProv;
+import org.apache.ignite.tcignited.ITeamcityIgnitedProvider;
+import org.apache.ignite.tcignited.SyncMode;
+import org.apache.ignite.ci.user.ITcBotUserCreds;
 import org.apache.ignite.ci.web.CtxListener;
 import org.apache.ignite.ci.web.model.current.TestFailuresSummary;
 import org.apache.ignite.ci.web.model.current.UpdateInfo;
@@ -93,7 +93,7 @@ public class GetTrackedBranchTestResults {
         @QueryParam("branch") @Nullable String branch,
         @QueryParam("checkAllLogs") @Nullable Boolean checkAllLogs,
         SyncMode mode) {
-        ICredentialsProv creds = ICredentialsProv.get(req);
+        ITcBotUserCreds creds = ITcBotUserCreds.get(req);
 
         Injector injector = CtxListener.getInjector(ctx);
 
@@ -131,7 +131,7 @@ public class GetTrackedBranchTestResults {
         @QueryParam("count") Integer cnt,
         @QueryParam("checkAllLogs") @Nullable Boolean checkAllLogs,
         SyncMode mode) {
-        ICredentialsProv creds = ICredentialsProv.get(req);
+        ITcBotUserCreds creds = ITcBotUserCreds.get(req);
         int cntLimit = cnt == null ? FullQueryParams.DEFAULT_COUNT : cnt;
         Injector injector = CtxListener.getInjector(ctx);
 
@@ -150,7 +150,7 @@ public class GetTrackedBranchTestResults {
         @Nullable @QueryParam("serverId") String srvCode,
         @Nullable @QueryParam("projectId") String projectId
     ) {
-        ICredentialsProv creds = ICredentialsProv.get(req);
+        ITcBotUserCreds creds = ITcBotUserCreds.get(req);
 
         Injector injector = CtxListener.getInjector(ctx);
         ITcBotConfig cfg = injector.getInstance(ITcBotConfig.class);
diff --git a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/web/rest/visa/TcBotVisaService.java b/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/web/rest/visa/TcBotVisaService.java
index 9ded876..fc997fe 100644
--- a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/web/rest/visa/TcBotVisaService.java
+++ b/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/web/rest/visa/TcBotVisaService.java
@@ -35,8 +35,8 @@ import org.apache.ignite.ci.tcbot.visa.ContributionToCheck;
 import org.apache.ignite.ci.tcbot.visa.CurrentVisaStatus;
 import org.apache.ignite.ci.tcbot.visa.TcBotTriggerAndSignOffService;
 import org.apache.ignite.ci.tcbot.visa.VisaStatus;
-import org.apache.ignite.ci.teamcity.ignited.ITeamcityIgnitedProvider;
-import org.apache.ignite.ci.user.ICredentialsProv;
+import org.apache.ignite.tcignited.ITeamcityIgnitedProvider;
+import org.apache.ignite.ci.user.ITcBotUserCreds;
 import org.apache.ignite.ci.web.CtxListener;
 import org.apache.ignite.ci.web.model.ContributionKey;
 import org.jetbrains.annotations.NotNull;
@@ -71,7 +71,7 @@ public class TcBotVisaService {
     public Collection<VisaStatus> history(@Nullable @QueryParam("serverId") String srvId) {
         return CtxListener.getInjector(ctx)
             .getInstance(TcBotTriggerAndSignOffService.class)
-            .getVisasStatus(srvId, ICredentialsProv.get(req));
+            .getVisasStatus(srvId, ITcBotUserCreds.get(req));
     }
 
     /**
@@ -81,7 +81,7 @@ public class TcBotVisaService {
     @GET
     @Path("contributions")
     public List<ContributionToCheck> contributions(@Nullable @QueryParam("serverId") String srvCode) {
-        ICredentialsProv credsProv = ICredentialsProv.get(req);
+        ITcBotUserCreds credsProv = ITcBotUserCreds.get(req);
 
         Injector injector = CtxListener.getInjector(ctx);
 
@@ -94,7 +94,7 @@ public class TcBotVisaService {
     @Path("contributionStatus")
     public Set<ContributionCheckStatus> contributionStatus(@Nullable @QueryParam("serverId") String srvCode,
         @QueryParam("prId") String prId) {
-        ICredentialsProv prov = ICredentialsProv.get(req);
+        ITcBotUserCreds prov = ITcBotUserCreds.get(req);
 
         Injector injector = CtxListener.getInjector(ctx);
 
@@ -110,7 +110,7 @@ public class TcBotVisaService {
         @QueryParam("tcBranch") String tcBranch) {
         Injector injector = CtxListener.getInjector(ctx);
 
-        ICredentialsProv prov = ICredentialsProv.get(req);
+        ITcBotUserCreds prov = ITcBotUserCreds.get(req);
 
         injector.getInstance(ITeamcityIgnitedProvider.class).checkAccess(srvCode, prov);
 
diff --git a/ignite-tc-helper-web/src/test/java/org/apache/ignite/ci/di/DiContextTest.java b/ignite-tc-helper-web/src/test/java/org/apache/ignite/ci/di/DiContextTest.java
index 766e626..52f2565 100644
--- a/ignite-tc-helper-web/src/test/java/org/apache/ignite/ci/di/DiContextTest.java
+++ b/ignite-tc-helper-web/src/test/java/org/apache/ignite/ci/di/DiContextTest.java
@@ -26,11 +26,14 @@ import org.apache.ignite.IgniteCache;
 import org.apache.ignite.ci.observer.BuildObserver;
 import org.apache.ignite.ci.observer.ObserverTask;
 import org.apache.ignite.ci.tcbot.ITcBotBgAuth;
+import org.apache.ignite.ci.tcbot.chain.BuildChainProcessor;
 import org.apache.ignite.ci.tcbot.conf.ITcBotConfig;
 import org.apache.ignite.ci.teamcity.restcached.ITcServerFactory;
 import org.apache.ignite.ci.teamcity.restcached.ITcServerProvider;
 import org.apache.ignite.ci.web.TcUpdatePool;
 import org.apache.ignite.configuration.CacheConfiguration;
+import org.apache.ignite.tcbot.common.interceptor.MonitoredTask;
+import org.apache.ignite.tcignited.ITeamcityIgnitedProvider;
 import org.junit.Test;
 import org.mockito.Mockito;
 
@@ -48,9 +51,9 @@ public class DiContextTest {
     public void checkSingletons() {
         Injector injector = getInjector();
 
-        validateInstanceCachedFor(injector, ITcServerProvider.class);
-        validateInstanceCachedFor(injector, ITcServerFactory.class);
+        validateInstanceCachedFor(injector, ITeamcityIgnitedProvider.class);
         validateInstanceCachedFor(injector, ObserverTask.class);
+        validateInstanceCachedFor(injector, BuildChainProcessor.class);
     }
 
     public Injector getInjector() {
diff --git a/ignite-tc-helper-web/src/test/java/org/apache/ignite/ci/di/cache/CachingTest.java b/ignite-tc-helper-web/src/test/java/org/apache/ignite/ci/di/cache/CachingTest.java
index 25682a2..ede1feb 100644
--- a/ignite-tc-helper-web/src/test/java/org/apache/ignite/ci/di/cache/CachingTest.java
+++ b/ignite-tc-helper-web/src/test/java/org/apache/ignite/ci/di/cache/CachingTest.java
@@ -19,6 +19,8 @@ package org.apache.ignite.ci.di.cache;
 import com.google.inject.Guice;
 import com.google.inject.Injector;
 import java.util.concurrent.atomic.AtomicInteger;
+
+import org.apache.ignite.tcbot.common.interceptor.GuavaCached;
 import org.junit.Test;
 
 import static org.junit.Assert.assertEquals;
diff --git a/ignite-tc-helper-web/src/test/java/org/apache/ignite/ci/di/scheduler/DirectExecNoWaitScheduler.java b/ignite-tc-helper-web/src/test/java/org/apache/ignite/ci/di/scheduler/DirectExecNoWaitScheduler.java
index 0b034fa..b2ccc54 100644
--- a/ignite-tc-helper-web/src/test/java/org/apache/ignite/ci/di/scheduler/DirectExecNoWaitScheduler.java
+++ b/ignite-tc-helper-web/src/test/java/org/apache/ignite/ci/di/scheduler/DirectExecNoWaitScheduler.java
@@ -16,10 +16,12 @@
  */
 package org.apache.ignite.ci.di.scheduler;
 
+import org.apache.ignite.tcbot.persistence.scheduler.IScheduler;
+
 import java.util.concurrent.TimeUnit;
 
 /**
- * Sheduler which never waits
+ * Scheduler which never waits
  */
 public class DirectExecNoWaitScheduler implements IScheduler {
     /** {@inheritDoc} */
diff --git a/ignite-tc-helper-web/src/test/java/org/apache/ignite/ci/tcbot/chain/BuildChainProcessorTest.java b/ignite-tc-helper-web/src/test/java/org/apache/ignite/ci/tcbot/chain/BuildChainProcessorTest.java
index 324bc90..5a8d5ff 100644
--- a/ignite-tc-helper-web/src/test/java/org/apache/ignite/ci/tcbot/chain/BuildChainProcessorTest.java
+++ b/ignite-tc-helper-web/src/test/java/org/apache/ignite/ci/tcbot/chain/BuildChainProcessorTest.java
@@ -25,7 +25,7 @@ import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
 import java.util.stream.Collectors;
-import org.apache.ignite.ci.IAnalyticsEnabledTeamcity;
+
 import org.apache.ignite.tcservice.ITeamcity;
 import org.apache.ignite.ci.analysis.FullChainRunCtx;
 import org.apache.ignite.ci.analysis.IMultTestOccurrence;
@@ -35,15 +35,14 @@ import org.apache.ignite.ci.analysis.mode.ProcessLogsMode;
 import org.apache.ignite.tcservice.model.hist.BuildRef;
 import org.apache.ignite.tcservice.model.result.tests.TestOccurrence;
 import org.apache.ignite.tcservice.model.result.tests.TestOccurrenceFull;
-import org.apache.ignite.ci.teamcity.ignited.IStringCompactor;
-import org.apache.ignite.ci.teamcity.ignited.ITeamcityIgnited;
+import org.apache.ignite.tcbot.persistence.IStringCompactor;
+import org.apache.ignite.tcignited.ITeamcityIgnited;
 import org.apache.ignite.ci.teamcity.ignited.InMemoryStringCompactor;
-import org.apache.ignite.ci.teamcity.ignited.SyncMode;
+import org.apache.ignite.tcignited.SyncMode;
 import org.apache.ignite.ci.teamcity.ignited.TeamcityIgnitedMock;
 import org.apache.ignite.ci.teamcity.ignited.fatbuild.FatBuildCompacted;
 import org.jetbrains.annotations.NotNull;
 import org.junit.Test;
-import org.mockito.Mockito;
 
 import static junit.framework.TestCase.assertEquals;
 import static junit.framework.TestCase.assertTrue;
diff --git a/ignite-tc-helper-web/src/test/java/org/apache/ignite/ci/tcbot/chain/MockBasedTcBotModule.java b/ignite-tc-helper-web/src/test/java/org/apache/ignite/ci/tcbot/chain/MockBasedTcBotModule.java
index 8bb49f7..9fe5822 100644
--- a/ignite-tc-helper-web/src/test/java/org/apache/ignite/ci/tcbot/chain/MockBasedTcBotModule.java
+++ b/ignite-tc-helper-web/src/test/java/org/apache/ignite/ci/tcbot/chain/MockBasedTcBotModule.java
@@ -22,7 +22,6 @@ import com.google.inject.internal.SingletonScope;
 import java.io.File;
 import java.util.Properties;
 import org.apache.ignite.ci.HelperConfig;
-import org.apache.ignite.ci.IAnalyticsEnabledTeamcity;
 import org.apache.ignite.ci.github.PullRequest;
 import org.apache.ignite.ci.github.ignited.IGitHubConnIgnited;
 import org.apache.ignite.ci.github.ignited.IGitHubConnIgnitedProvider;
@@ -41,12 +40,11 @@ import org.apache.ignite.ci.tcbot.conf.NotificationsConfig;
 import org.apache.ignite.ci.tcbot.conf.TcServerConfig;
 import org.apache.ignite.ci.tcbot.issue.IIssuesStorage;
 import org.apache.ignite.ci.tcbot.user.IUserStorage;
-import org.apache.ignite.ci.teamcity.ignited.IStringCompactor;
-import org.apache.ignite.ci.teamcity.ignited.ITeamcityIgnitedProvider;
+import org.apache.ignite.tcbot.persistence.IStringCompactor;
+import org.apache.ignite.tcignited.ITeamcityIgnitedProvider;
 import org.apache.ignite.ci.teamcity.ignited.InMemoryStringCompactor;
 import org.apache.ignite.ci.teamcity.ignited.TeamcityIgnitedProviderMock;
 import org.apache.ignite.ci.teamcity.restcached.ITcServerProvider;
-import org.apache.ignite.ci.user.ICredentialsProv;
 import org.apache.ignite.tcbot.common.conf.ITcServerConfigSupplier;
 import org.apache.ignite.tcbot.common.conf.TcBotWorkDir;
 import org.mockito.Mockito;
@@ -87,10 +85,6 @@ public class MockBasedTcBotModule extends AbstractModule {
 
         bind(ITeamcityIgnitedProvider.class).to(TeamcityIgnitedProviderMock.class).in(new SingletonScope());
 
-        final ITcServerProvider tcSrvOldProv = Mockito.mock(ITcServerProvider.class);
-
-        bind(ITcServerProvider.class).toInstance(tcSrvOldProv);
-
         final ITcBotConfig cfg = new ITcBotConfig() {
             @Override
             public String primaryServerCode() {
diff --git a/ignite-tc-helper-web/src/test/java/org/apache/ignite/ci/tcbot/chain/PrChainsProcessorTest.java b/ignite-tc-helper-web/src/test/java/org/apache/ignite/ci/tcbot/chain/PrChainsProcessorTest.java
index ec92e2b..50df573 100644
--- a/ignite-tc-helper-web/src/test/java/org/apache/ignite/ci/tcbot/chain/PrChainsProcessorTest.java
+++ b/ignite-tc-helper-web/src/test/java/org/apache/ignite/ci/tcbot/chain/PrChainsProcessorTest.java
@@ -35,12 +35,12 @@ import org.apache.ignite.tcservice.model.result.problems.ProblemOccurrence;
 import org.apache.ignite.tcservice.model.result.tests.TestOccurrence;
 import org.apache.ignite.tcservice.model.result.tests.TestOccurrenceFull;
 import org.apache.ignite.tcservice.model.result.tests.TestRef;
-import org.apache.ignite.ci.teamcity.ignited.IStringCompactor;
-import org.apache.ignite.ci.teamcity.ignited.ITeamcityIgnitedProvider;
+import org.apache.ignite.tcbot.persistence.IStringCompactor;
+import org.apache.ignite.tcignited.ITeamcityIgnitedProvider;
 import org.apache.ignite.ci.teamcity.ignited.TeamcityIgnitedProviderMock;
 import org.apache.ignite.ci.teamcity.ignited.fatbuild.FatBuildCompacted;
 import org.apache.ignite.ci.teamcity.ignited.runhist.InvocationData;
-import org.apache.ignite.ci.user.ICredentialsProv;
+import org.apache.ignite.ci.user.ITcBotUserCreds;
 import org.apache.ignite.ci.web.model.current.SuiteCurrentStatus;
 import org.apache.ignite.ci.web.model.current.TestFailure;
 import org.jetbrains.annotations.NotNull;
@@ -114,7 +114,7 @@ public class PrChainsProcessorTest {
 
         PrChainsProcessor prcp = injector.getInstance(PrChainsProcessor.class);
         final List<SuiteCurrentStatus> blockers = prcp.getBlockersSuitesStatuses(btId,
-            branch, SRV_ID, mock(ICredentialsProv.class));
+            branch, SRV_ID, mock(ITcBotUserCreds.class));
 
         System.out.println(blockers);
         assertNotNull(blockers);
@@ -161,7 +161,7 @@ public class PrChainsProcessorTest {
 
         PrChainsProcessor prcp = injector.getInstance(PrChainsProcessor.class);
         final List<SuiteCurrentStatus> blockers = prcp.getBlockersSuitesStatuses(btId,
-            branch, SRV_ID, mock(ICredentialsProv.class));
+            branch, SRV_ID, mock(ITcBotUserCreds.class));
 
         System.out.println(blockers);
 
@@ -438,7 +438,7 @@ public class PrChainsProcessorTest {
 
         PrChainsProcessor prcp = injector.getInstance(PrChainsProcessor.class);
 
-        final List<SuiteCurrentStatus> blockers = prcp.getBlockersSuitesStatuses(btId, branch, SRV_ID, mock(ICredentialsProv.class));
+        final List<SuiteCurrentStatus> blockers = prcp.getBlockersSuitesStatuses(btId, branch, SRV_ID, mock(ITcBotUserCreds.class));
 
         System.out.println(blockers);
 
diff --git a/ignite-tc-helper-web/src/test/java/org/apache/ignite/ci/tcbot/chain/TrackedBranchProcessorTest.java b/ignite-tc-helper-web/src/test/java/org/apache/ignite/ci/tcbot/chain/TrackedBranchProcessorTest.java
index dbdb431..578e211 100644
--- a/ignite-tc-helper-web/src/test/java/org/apache/ignite/ci/tcbot/chain/TrackedBranchProcessorTest.java
+++ b/ignite-tc-helper-web/src/test/java/org/apache/ignite/ci/tcbot/chain/TrackedBranchProcessorTest.java
@@ -29,12 +29,12 @@ import org.apache.ignite.tcservice.ITeamcity;
 import org.apache.ignite.ci.tcbot.conf.BranchTracked;
 import org.apache.ignite.ci.tcbot.conf.ChainAtServerTracked;
 import org.apache.ignite.ci.tcbot.conf.BranchesTracked;
-import org.apache.ignite.ci.teamcity.ignited.IStringCompactor;
-import org.apache.ignite.ci.teamcity.ignited.ITeamcityIgnitedProvider;
-import org.apache.ignite.ci.teamcity.ignited.SyncMode;
+import org.apache.ignite.tcbot.persistence.IStringCompactor;
+import org.apache.ignite.tcignited.ITeamcityIgnitedProvider;
+import org.apache.ignite.tcignited.SyncMode;
 import org.apache.ignite.ci.teamcity.ignited.TeamcityIgnitedProviderMock;
 import org.apache.ignite.ci.teamcity.ignited.fatbuild.FatBuildCompacted;
-import org.apache.ignite.ci.user.ICredentialsProv;
+import org.apache.ignite.ci.user.ITcBotUserCreds;
 import org.apache.ignite.ci.web.model.current.ChainAtServerCurrentStatus;
 import org.apache.ignite.ci.web.model.current.SuiteCurrentStatus;
 import org.apache.ignite.ci.web.model.current.TestFailure;
@@ -112,7 +112,7 @@ public class TrackedBranchProcessorTest {
 
         TrackedBranchChainsProcessor tbProc = injector.getInstance(TrackedBranchChainsProcessor.class);
 
-        ICredentialsProv mock = mock(ICredentialsProv.class);
+        ITcBotUserCreds mock = mock(ITcBotUserCreds.class);
         when(mock.hasAccess(anyString())).thenReturn(true);
         TestFailuresSummary failures = tbProc.getTrackedBranchTestFailures(BRACH_NAME,
             false,
diff --git a/ignite-tc-helper-web/src/test/java/org/apache/ignite/ci/tcbot/issue/IssueDetectorTest.java b/ignite-tc-helper-web/src/test/java/org/apache/ignite/ci/tcbot/issue/IssueDetectorTest.java
index 64016e8..f8afff5 100644
--- a/ignite-tc-helper-web/src/test/java/org/apache/ignite/ci/tcbot/issue/IssueDetectorTest.java
+++ b/ignite-tc-helper-web/src/test/java/org/apache/ignite/ci/tcbot/issue/IssueDetectorTest.java
@@ -33,12 +33,12 @@ import org.apache.ignite.ci.tcbot.conf.ChainAtServerTracked;
 import org.apache.ignite.ci.tcbot.chain.MockBasedTcBotModule;
 import org.apache.ignite.ci.tcbot.conf.BranchesTracked;
 import org.apache.ignite.tcservice.model.result.tests.TestOccurrenceFull;
-import org.apache.ignite.ci.teamcity.ignited.IStringCompactor;
-import org.apache.ignite.ci.teamcity.ignited.ITeamcityIgnitedProvider;
+import org.apache.ignite.tcbot.persistence.IStringCompactor;
+import org.apache.ignite.tcignited.ITeamcityIgnitedProvider;
 import org.apache.ignite.ci.teamcity.ignited.TeamcityIgnitedImpl;
 import org.apache.ignite.ci.teamcity.ignited.TeamcityIgnitedProviderMock;
 import org.apache.ignite.ci.teamcity.ignited.fatbuild.FatBuildCompacted;
-import org.apache.ignite.ci.user.ICredentialsProv;
+import org.apache.ignite.ci.user.ITcBotUserCreds;
 import org.jetbrains.annotations.NotNull;
 import org.junit.Before;
 import org.junit.Test;
@@ -113,7 +113,7 @@ public class IssueDetectorTest {
 
         IssueDetector issueDetector = injector.getInstance(IssueDetector.class);
 
-        ICredentialsProv mock = mock(ICredentialsProv.class);
+        ITcBotUserCreds mock = mock(ITcBotUserCreds.class);
         when(mock.hasAccess(anyString())).thenReturn(true);
         issueDetector.startBackgroundCheck(mock);
 
diff --git a/ignite-tc-helper-web/src/test/java/org/apache/ignite/ci/teamcity/ignited/BuildKeyUnitTest.java b/ignite-tc-helper-web/src/test/java/org/apache/ignite/ci/teamcity/ignited/BuildKeyUnitTest.java
index 774af90..d479e90 100644
--- a/ignite-tc-helper-web/src/test/java/org/apache/ignite/ci/teamcity/ignited/BuildKeyUnitTest.java
+++ b/ignite-tc-helper-web/src/test/java/org/apache/ignite/ci/teamcity/ignited/BuildKeyUnitTest.java
@@ -19,6 +19,7 @@ package org.apache.ignite.ci.teamcity.ignited;
 
 import org.apache.ignite.ci.teamcity.ignited.buildref.BuildRefDao;
 import org.apache.ignite.ci.teamcity.ignited.fatbuild.FatBuildDao;
+import org.apache.ignite.tcignited.ITeamcityIgnited;
 import org.junit.Test;
 
 import static junit.framework.TestCase.assertEquals;
diff --git a/ignite-tc-helper-web/src/test/java/org/apache/ignite/ci/teamcity/ignited/IgnitedTcInMemoryIntegrationTest.java b/ignite-tc-helper-web/src/test/java/org/apache/ignite/ci/teamcity/ignited/IgnitedTcInMemoryIntegrationTest.java
index 8656f22..6967990 100644
--- a/ignite-tc-helper-web/src/test/java/org/apache/ignite/ci/teamcity/ignited/IgnitedTcInMemoryIntegrationTest.java
+++ b/ignite-tc-helper-web/src/test/java/org/apache/ignite/ci/teamcity/ignited/IgnitedTcInMemoryIntegrationTest.java
@@ -40,17 +40,22 @@ import javax.xml.bind.JAXBException;
 import org.apache.ignite.Ignite;
 import org.apache.ignite.IgniteCache;
 import org.apache.ignite.Ignition;
+import org.apache.ignite.tcbot.persistence.IStringCompactor;
+import org.apache.ignite.tcbot.persistence.IgniteStringCompactor;
+import org.apache.ignite.tcignited.ITeamcityIgnited;
+import org.apache.ignite.tcignited.ITeamcityIgnitedProvider;
+import org.apache.ignite.tcignited.history.IRunHistory;
+import org.apache.ignite.tcignited.history.IRunStat;
 import org.apache.ignite.tcservice.ITeamcity;
-import org.apache.ignite.ci.analysis.SuiteInBranch;
-import org.apache.ignite.ci.analysis.TestInBranch;
 import org.apache.ignite.ci.db.TcHelperDb;
 import org.apache.ignite.ci.di.scheduler.DirectExecNoWaitScheduler;
-import org.apache.ignite.ci.di.scheduler.IScheduler;
+import org.apache.ignite.tcbot.persistence.scheduler.IScheduler;
 import org.apache.ignite.ci.jira.pure.IJiraIntegrationProvider;
 import org.apache.ignite.ci.tcbot.chain.PrChainsProcessorTest;
 import org.apache.ignite.ci.tcbot.conf.BranchesTracked;
 import org.apache.ignite.ci.tcbot.conf.ITcBotConfig;
 import org.apache.ignite.tcbot.common.conf.ITcServerConfig;
+import org.apache.ignite.tcservice.TeamcityServiceConnection;
 import org.apache.ignite.tcservice.model.changes.ChangesList;
 import org.apache.ignite.tcservice.model.conf.BuildType;
 import org.apache.ignite.tcservice.model.conf.Project;
@@ -77,7 +82,7 @@ import org.apache.ignite.ci.teamcity.pure.BuildHistoryEmulator;
 import org.apache.ignite.tcservice.ITeamcityConn;
 import org.apache.ignite.tcservice.http.ITeamcityHttpConnection;
 import org.apache.ignite.ci.teamcity.restcached.ITcServerFactory;
-import org.apache.ignite.ci.user.ICredentialsProv;
+import org.apache.ignite.ci.user.ITcBotUserCreds;
 import org.apache.ignite.tcservice.util.XmlUtil;
 import org.apache.ignite.configuration.IgniteConfiguration;
 import org.apache.ignite.spi.discovery.tcp.TcpDiscoverySpi;
@@ -96,7 +101,7 @@ import static junit.framework.TestCase.assertNotNull;
 import static junit.framework.TestCase.assertNull;
 import static junit.framework.TestCase.assertTrue;
 import static org.apache.ignite.tcbot.common.conf.TcBotWorkDir.ensureDirExist;
-import static org.apache.ignite.ci.teamcity.ignited.IgniteStringCompactor.STRINGS_CACHE;
+import static org.apache.ignite.tcbot.persistence.IgniteStringCompactor.STRINGS_CACHE;
 import static org.mockito.ArgumentMatchers.anyString;
 import static org.mockito.Mockito.mock;
 import static org.mockito.Mockito.when;
@@ -381,8 +386,8 @@ public class IgnitedTcInMemoryIntegrationTest {
     /**
      *
      */
-    @NotNull public ICredentialsProv creds() {
-        ICredentialsProv mock = Mockito.mock(ICredentialsProv.class);
+    @NotNull public ITcBotUserCreds creds() {
+        ITcBotUserCreds mock = Mockito.mock(ITcBotUserCreds.class);
 
         when(mock.hasAccess(anyString())).thenReturn(true);
         when(mock.getUser(anyString())).thenReturn("mtcga");
@@ -584,13 +589,13 @@ public class IgnitedTcInMemoryIntegrationTest {
         buildsMap.forEach((id, build) -> histSync.saveToHistoryLater(srvId, build));
 
         final ITeamcityIgnitedProvider inst = injector.getInstance(ITeamcityIgnitedProvider.class);
-        final ITeamcityIgnited srv = inst.server(srvId, Mockito.mock(ICredentialsProv.class));
-        final IRunHistory testRunHist = srv.getTestRunHist(new TestInBranch(PrChainsProcessorTest.TEST_FLAKY_IN_MASTER, branch));
+        final ITeamcityIgnited srv = inst.server(srvId, Mockito.mock(ITcBotUserCreds.class));
+        final IRunHistory testRunHist = srv.getTestRunHist(PrChainsProcessorTest.TEST_FLAKY_IN_MASTER, branch);
 
         assertNotNull(testRunHist);
         assertEquals(0.5, testRunHist.getFailRate(), 0.1);
 
-        final IRunHistory cache1Hist = srv.getSuiteRunHist(new SuiteInBranch(PrChainsProcessorTest.CACHE_1, branch));
+        final IRunHistory cache1Hist = srv.getSuiteRunHist(PrChainsProcessorTest.CACHE_1, branch);
 
         assertNotNull(cache1Hist);
         assertEquals(1.0, cache1Hist.getFailRate(), 0.1);
@@ -617,7 +622,7 @@ public class IgnitedTcInMemoryIntegrationTest {
         final String branch = ITeamcity.DEFAULT;
 
         final ITeamcityIgnitedProvider inst = injector.getInstance(ITeamcityIgnitedProvider.class);
-        final ITeamcityIgnited srv = inst.server(srvId, Mockito.mock(ICredentialsProv.class));
+        final ITeamcityIgnited srv = inst.server(srvId, Mockito.mock(ITcBotUserCreds.class));
 
         FatBuildDao fatBuildDao = injector.getInstance(FatBuildDao.class);
         fatBuildDao.init();
@@ -641,7 +646,7 @@ public class IgnitedTcInMemoryIntegrationTest {
         final RunHistSync histSync = injector.getInstance(RunHistSync.class);
         histSync.invokeLaterFindMissingHistory(srvId);
 
-        final IRunHistory testRunHist = srv.getTestRunHist(new TestInBranch(PrChainsProcessorTest.TEST_FLAKY_IN_MASTER, branch));
+        final IRunHistory testRunHist = srv.getTestRunHist(PrChainsProcessorTest.TEST_FLAKY_IN_MASTER, branch);
 
         assertNotNull(testRunHist);
         assertEquals(0.5, testRunHist.getFailRate(), 0.1);
@@ -650,10 +655,8 @@ public class IgnitedTcInMemoryIntegrationTest {
     @Test
     public void testQueuedBuildsRemoved() {
         TeamcityIgnitedModule module = new TeamcityIgnitedModule();
-        module.overrideHttp(new ITeamcityHttpConnection() {
-            @Override public InputStream sendGet(String basicAuthTok, String url) throws IOException {
-                throw new FileNotFoundException(url);
-            }
+        module.overrideHttp((basicAuthTok, url) -> {
+            throw new FileNotFoundException(url);
         });
         Injector injector = Guice.createInjector(module, new IgniteAndSchedulerTestModule());
 
@@ -675,9 +678,10 @@ public class IgnitedTcInMemoryIntegrationTest {
         refR.state = BuildRef.STATE_RUNNING;
         refR.setId(buildIdR);
 
-        String srvId = APACHE;
-        int srvIdInt = ITeamcityIgnited.serverIdToInt(srvId);
-        ITeamcityConn srvConn = injector.getInstance(ITcServerFactory.class).createServer(srvId);
+        String srvCode = APACHE;
+        int srvIdInt = ITeamcityIgnited.serverIdToInt(srvCode);
+        final TeamcityServiceConnection srvConn = injector.getInstance(TeamcityServiceConnection.class);
+        srvConn.init(srvCode);
 
         buildRefDao.saveChunk(srvIdInt, Lists.newArrayList(refQ, refR));
 
@@ -687,7 +691,7 @@ public class IgnitedTcInMemoryIntegrationTest {
         System.out.println("Running builds (before sync): " + printRefs(c, running));
 
         ProactiveFatBuildSync buildSync = injector.getInstance(ProactiveFatBuildSync.class);
-        buildSync.ensureActualizationRequested(srvId, srvConn);
+        buildSync.ensureActualizationRequested(srvCode, srvConn);
 
         FatBuildCompacted fatBuild = fatBuildDao.getFatBuild(srvIdInt, buildIdQ);
         System.out.println(fatBuild);
@@ -711,7 +715,7 @@ public class IgnitedTcInMemoryIntegrationTest {
         putOldFashionFakeBuild(c, fatBuildDao, buildIdQ, srvIdInt);
         putOldFashionFakeBuild(c, fatBuildDao, buildIdR, srvIdInt);
 
-        buildSync.ensureActualizationRequested(srvId, srvConn);
+        buildSync.ensureActualizationRequested(srvCode, srvConn);
 
         List<BuildRefCompacted> running4 = buildRefDao.getQueuedAndRunning(srvIdInt);
         System.out.println("Running builds (before with fake builds): " + printRefs(c, running4));
diff --git a/ignite-tc-helper-web/src/test/java/org/apache/ignite/ci/teamcity/ignited/InMemoryStringCompactor.java b/ignite-tc-helper-web/src/test/java/org/apache/ignite/ci/teamcity/ignited/InMemoryStringCompactor.java
index ac1a23b..0ffea79 100644
--- a/ignite-tc-helper-web/src/test/java/org/apache/ignite/ci/teamcity/ignited/InMemoryStringCompactor.java
+++ b/ignite-tc-helper-web/src/test/java/org/apache/ignite/ci/teamcity/ignited/InMemoryStringCompactor.java
@@ -16,6 +16,8 @@
  */
 package org.apache.ignite.ci.teamcity.ignited;
 
+import org.apache.ignite.tcbot.persistence.IStringCompactor;
+
 import java.util.Map;
 import java.util.concurrent.ConcurrentHashMap;
 import java.util.concurrent.atomic.AtomicInteger;
diff --git a/ignite-tc-helper-web/src/test/java/org/apache/ignite/ci/teamcity/ignited/TeamcityIgnitedMock.java b/ignite-tc-helper-web/src/test/java/org/apache/ignite/ci/teamcity/ignited/TeamcityIgnitedMock.java
index aceb8df..f5f3bca 100644
--- a/ignite-tc-helper-web/src/test/java/org/apache/ignite/ci/teamcity/ignited/TeamcityIgnitedMock.java
+++ b/ignite-tc-helper-web/src/test/java/org/apache/ignite/ci/teamcity/ignited/TeamcityIgnitedMock.java
@@ -22,12 +22,15 @@ import java.util.Comparator;
 import java.util.Map;
 import java.util.concurrent.ConcurrentHashMap;
 import java.util.stream.Collectors;
-import org.apache.ignite.ci.analysis.TestInBranch;
+
 import org.apache.ignite.tcbot.common.conf.ITcServerConfig;
 import org.apache.ignite.ci.teamcity.ignited.fatbuild.FatBuildCompacted;
 import org.apache.ignite.ci.teamcity.ignited.runhist.Invocation;
 import org.apache.ignite.ci.teamcity.ignited.runhist.RunHistCompacted;
 import org.apache.ignite.ci.teamcity.ignited.runhist.RunHistKey;
+import org.apache.ignite.tcbot.persistence.IStringCompactor;
+import org.apache.ignite.tcignited.ITeamcityIgnited;
+import org.apache.ignite.tcignited.SyncMode;
 import org.jetbrains.annotations.NotNull;
 import org.mockito.Mockito;
 import org.mockito.stubbing.Answer;
@@ -41,7 +44,7 @@ import static org.mockito.Mockito.when;
 public class TeamcityIgnitedMock {
     @NotNull
     public static ITeamcityIgnited getMutableMapTeamcityIgnited(Map<Integer, FatBuildCompacted> builds,
-        IStringCompactor c) {
+                                                                IStringCompactor c) {
         ITeamcityIgnited tcIgnited = Mockito.mock(ITeamcityIgnited.class);
         Map<RunHistKey, RunHistCompacted> histCache = new ConcurrentHashMap<>();
         final int srvId = 0;
@@ -86,12 +89,10 @@ public class TeamcityIgnitedMock {
                     .collect(Collectors.toList());
             });
 
-        when(tcIgnited.getTestRunHist(any(TestInBranch.class)))
+        when(tcIgnited.getTestRunHist(anyString(), anyString()))
             .thenAnswer((inv) -> {
-                final TestInBranch t = inv.getArgument(0);
-                final String name = t.name;
-                final String branch = t.branch;
-
+                final String name = inv.getArgument(0);
+                final String branch = inv.getArgument(1);
                 // System.out.println("Search history " + name + " in " + branch + ": " );
 
                 if (histCache.isEmpty()) {
diff --git a/ignite-tc-helper-web/src/test/java/org/apache/ignite/ci/teamcity/ignited/TeamcityIgnitedProviderMock.java b/ignite-tc-helper-web/src/test/java/org/apache/ignite/ci/teamcity/ignited/TeamcityIgnitedProviderMock.java
index 97c4382..d7f8b2b 100644
--- a/ignite-tc-helper-web/src/test/java/org/apache/ignite/ci/teamcity/ignited/TeamcityIgnitedProviderMock.java
+++ b/ignite-tc-helper-web/src/test/java/org/apache/ignite/ci/teamcity/ignited/TeamcityIgnitedProviderMock.java
@@ -17,16 +17,21 @@
 
 package org.apache.ignite.ci.teamcity.ignited;
 
-import java.util.Map;
-import java.util.concurrent.ConcurrentHashMap;
+import org.apache.ignite.ci.teamcity.ignited.fatbuild.FatBuildCompacted;
+import org.apache.ignite.tcbot.persistence.IStringCompactor;
+import org.apache.ignite.tcignited.ITeamcityIgnited;
+import org.apache.ignite.tcignited.ITeamcityIgnitedProvider;
+import org.apache.ignite.tcignited.creds.ICredentialsProv;
+
 import javax.annotation.Nullable;
 import javax.inject.Inject;
-import org.apache.ignite.ci.teamcity.ignited.fatbuild.FatBuildCompacted;
-import org.apache.ignite.ci.user.ICredentialsProv;
+import java.util.Map;
+import java.util.concurrent.ConcurrentHashMap;
 
 public class TeamcityIgnitedProviderMock implements ITeamcityIgnitedProvider {
     /** Compactor. */
-    @Inject IStringCompactor compactor;
+    @Inject
+    IStringCompactor compactor;
 
     private Map<String, Map<Integer, FatBuildCompacted>> tcBuildsData = new ConcurrentHashMap<>();
 
@@ -36,7 +41,7 @@ public class TeamcityIgnitedProviderMock implements ITeamcityIgnitedProvider {
 
     /** {@inheritDoc} */
     @Override public boolean hasAccess(String srvCode, @Nullable ICredentialsProv prov) {
-        return prov.hasAccess(srvCode);
+        return prov != null && prov.hasAccess(srvCode);
     }
 
     /** {@inheritDoc} */
diff --git a/ignite-tc-helper-web/src/test/java/org/apache/ignite/ci/user/LoginAuthTest.java b/ignite-tc-helper-web/src/test/java/org/apache/ignite/ci/user/LoginAuthTest.java
index 574a1d3..483cafc 100644
--- a/ignite-tc-helper-web/src/test/java/org/apache/ignite/ci/user/LoginAuthTest.java
+++ b/ignite-tc-helper-web/src/test/java/org/apache/ignite/ci/user/LoginAuthTest.java
@@ -125,7 +125,7 @@ public class LoginAuthTest {
 
         assertTrue(authenticationFilter.authenticate(ctx, loginResponse.fullToken, storage));
 
-        ICredentialsProv creds = (ICredentialsProv)ctx.getProperty(ICredentialsProv._KEY);
+        ITcBotUserCreds creds = (ITcBotUserCreds)ctx.getProperty(ITcBotUserCreds._KEY);
 
         assertNotNull(creds);
 
diff --git a/settings.gradle b/settings.gradle
index 11730ae..9e31c91 100644
--- a/settings.gradle
+++ b/settings.gradle
@@ -2,6 +2,7 @@ include 'ignite-tc-helper-web'
 include 'jetty-launcher'
 include 'tcbot-server'
 include 'tcbot-common'
+include 'tcbot-persistence'
 include 'tcbot-teamcity'
 include 'tcbot-teamcity-ignited'
 
diff --git a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/di/cache/GuavaCached.java b/tcbot-common/src/main/java/org/apache/ignite/tcbot/common/interceptor/GuavaCached.java
similarity index 91%
rename from ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/di/cache/GuavaCached.java
rename to tcbot-common/src/main/java/org/apache/ignite/tcbot/common/interceptor/GuavaCached.java
index 126ed93..9a5f2c9 100644
--- a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/di/cache/GuavaCached.java
+++ b/tcbot-common/src/main/java/org/apache/ignite/tcbot/common/interceptor/GuavaCached.java
@@ -14,7 +14,7 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-package org.apache.ignite.ci.di.cache;
+package org.apache.ignite.tcbot.common.interceptor;
 
 import java.lang.annotation.ElementType;
 import java.lang.annotation.Retention;
@@ -22,7 +22,7 @@ import java.lang.annotation.RetentionPolicy;
 import java.lang.annotation.Target;
 
 /**
- * <b>Note: </b> this cachind annotation ignores object called, may be used only for siglenton-scope classes.
+ * <b>Note: </b> this caching annotation ignores object called, may be used only for singleton-scope classes.
  */
 @Retention(RetentionPolicy.RUNTIME) @Target(ElementType.METHOD)
 public @interface GuavaCached {
diff --git a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/di/MonitoredTask.java b/tcbot-common/src/main/java/org/apache/ignite/tcbot/common/interceptor/MonitoredTask.java
similarity index 96%
rename from ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/di/MonitoredTask.java
rename to tcbot-common/src/main/java/org/apache/ignite/tcbot/common/interceptor/MonitoredTask.java
index 0381cb2..724982b 100644
--- a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/di/MonitoredTask.java
+++ b/tcbot-common/src/main/java/org/apache/ignite/tcbot/common/interceptor/MonitoredTask.java
@@ -14,7 +14,7 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-package org.apache.ignite.ci.di;
+package org.apache.ignite.tcbot.common.interceptor;
 
 import java.lang.annotation.ElementType;
 import java.lang.annotation.Retention;
diff --git a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/util/NumberUtil.java b/tcbot-common/src/main/java/org/apache/ignite/tcbot/common/util/NumberUtil.java
similarity index 96%
rename from ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/util/NumberUtil.java
rename to tcbot-common/src/main/java/org/apache/ignite/tcbot/common/util/NumberUtil.java
index e02bb49..90c52f3 100644
--- a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/util/NumberUtil.java
+++ b/tcbot-common/src/main/java/org/apache/ignite/tcbot/common/util/NumberUtil.java
@@ -15,7 +15,7 @@
  * limitations under the License.
  */
 
-package org.apache.ignite.ci.util;
+package org.apache.ignite.tcbot.common.util;
 
 import javax.annotation.Nullable;
 
diff --git a/tcbot-teamcity-ignited/build.gradle b/tcbot-persistence/build.gradle
similarity index 84%
copy from tcbot-teamcity-ignited/build.gradle
copy to tcbot-persistence/build.gradle
index 03d6bc2..c6118a8 100644
--- a/tcbot-teamcity-ignited/build.gradle
+++ b/tcbot-persistence/build.gradle
@@ -23,7 +23,10 @@ repositories {
 }
 
 dependencies {
-    compile (project(":tcbot-teamcity"));
+    compile (project(":tcbot-common"));
 
+    compile (group: 'org.apache.ignite', name: 'ignite-core', version: ignVer) {
+        exclude group: 'org.jetbrains'
+    }
 }
  
\ No newline at end of file
diff --git a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/tcbot/common/StringFieldCompacted.java b/tcbot-persistence/src/main/java/org/apache/ignite/ci/tcbot/common/StringFieldCompacted.java
similarity index 94%
rename from ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/tcbot/common/StringFieldCompacted.java
rename to tcbot-persistence/src/main/java/org/apache/ignite/ci/tcbot/common/StringFieldCompacted.java
index 739b471..46af408 100644
--- a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/tcbot/common/StringFieldCompacted.java
+++ b/tcbot-persistence/src/main/java/org/apache/ignite/ci/tcbot/common/StringFieldCompacted.java
@@ -26,11 +26,18 @@ import java.nio.charset.StandardCharsets;
 import java.util.Arrays;
 import java.util.zip.GZIPInputStream;
 import java.util.zip.GZIPOutputStream;
-import org.jetbrains.annotations.NotNull;
+
+import org.apache.ignite.tcbot.persistence.Persisted;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.xerial.snappy.Snappy;
 
+import javax.annotation.Nonnull;
+
+/**
+ * Field is included into bigger entries, so it is placed in backward compatible package.
+ */
+@Persisted
 public class StringFieldCompacted {
     /** Logger. */
     private static final Logger logger = LoggerFactory.getLogger(StringFieldCompacted.class);
@@ -68,7 +75,8 @@ public class StringFieldCompacted {
             return null;
     }
 
-    @NotNull public static String unzipToString(byte[] data) throws IOException {
+    @Nonnull
+    public static String unzipToString(byte[] data) throws IOException {
         final ByteArrayInputStream in = new ByteArrayInputStream(data);
         ByteArrayOutputStream bos = new ByteArrayOutputStream();
         try (final GZIPInputStream gzi = new GZIPInputStream(in)) {
diff --git a/tcbot-persistence/src/main/java/org/apache/ignite/ci/teamcity/ignited/IgniteStringCompactor.java b/tcbot-persistence/src/main/java/org/apache/ignite/ci/teamcity/ignited/IgniteStringCompactor.java
new file mode 100644
index 0000000..5dc6cb4
--- /dev/null
+++ b/tcbot-persistence/src/main/java/org/apache/ignite/ci/teamcity/ignited/IgniteStringCompactor.java
@@ -0,0 +1,38 @@
+package org.apache.ignite.ci.teamcity.ignited;
+//public  org.apache.ignite.ci.teamcity.ignited.IgniteStringCompactor$CompactorEntity
+import com.google.common.base.MoreObjects;
+import org.apache.ignite.cache.query.annotations.QuerySqlField;
+import org.apache.ignite.tcbot.persistence.Persisted;
+
+/**
+ * Backward compatible holder for entry persisted.
+ */
+public class IgniteStringCompactor {
+    @Persisted
+    public static class CompactorEntity {
+        @QuerySqlField
+        String val;
+        @QuerySqlField(index = true)
+        int id;
+
+        public CompactorEntity(int candidate, String val) {
+            this.id = candidate;
+            this.val = val;
+        }
+
+        @Override public String toString() {
+            return MoreObjects.toStringHelper(this)
+                .add("val", val)
+                .add("id", id)
+                .toString();
+        }
+
+        public int id() {
+            return id;
+        }
+
+        public String val() {
+            return val;
+        }
+    }
+}
diff --git a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/teamcity/ignited/IRunStat.java b/tcbot-persistence/src/main/java/org/apache/ignite/tcbot/persistence/CacheConfigs.java
similarity index 51%
copy from ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/teamcity/ignited/IRunStat.java
copy to tcbot-persistence/src/main/java/org/apache/ignite/tcbot/persistence/CacheConfigs.java
index 34ddf36..7b9d757 100644
--- a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/teamcity/ignited/IRunStat.java
+++ b/tcbot-persistence/src/main/java/org/apache/ignite/tcbot/persistence/CacheConfigs.java
@@ -14,33 +14,32 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-package org.apache.ignite.ci.teamcity.ignited;
+package org.apache.ignite.tcbot.persistence;
+
+import org.apache.ignite.cache.affinity.rendezvous.RendezvousAffinityFunction;
+import org.apache.ignite.configuration.CacheConfiguration;
+
+import javax.annotation.Nonnull;
 
 /**
- * Abstract runs statistics,
+ * Set of Ignite cache configs used
  */
-public interface IRunStat {
-    public int getRunsCount();
-    public int getFailuresCount();
+public class CacheConfigs {
+    @Nonnull
+    public static <K, V> CacheConfiguration<K, V> getCache8PartsConfig(String name) {
+        CacheConfiguration<K, V> ccfg = new CacheConfiguration<>(name);
 
-    /**
-     * @return fail rate as float.
-     */
-    public default float getFailRate() {
-        int runs = getRunsCount();
+        ccfg.setAffinity(new RendezvousAffinityFunction(false, 8));
 
-        if (runs == 0)
-            return 0.0f;
-
-        return 1.0f * getFailuresCount() / runs;
+        return ccfg;
     }
 
-    public default String getFailPercentPrintable() {
-        return getPercentPrintable(getFailRate() * 100.0f);
-    }
+    @Nonnull
+    public static <K, V> CacheConfiguration<K, V> getCacheV2Config(String name) {
+        CacheConfiguration<K, V> ccfg = new CacheConfiguration<>(name);
 
+        ccfg.setAffinity(new RendezvousAffinityFunction(false, 32));
 
-    public static String getPercentPrintable(float percent) {
-        return String.format("%.1f", percent).replace(".", ",");
+        return ccfg;
     }
 }
diff --git a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/teamcity/ignited/IStringCompactor.java b/tcbot-persistence/src/main/java/org/apache/ignite/tcbot/persistence/IStringCompactor.java
similarity index 96%
rename from ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/teamcity/ignited/IStringCompactor.java
rename to tcbot-persistence/src/main/java/org/apache/ignite/tcbot/persistence/IStringCompactor.java
index 57e3c15..bf4097a 100644
--- a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/teamcity/ignited/IStringCompactor.java
+++ b/tcbot-persistence/src/main/java/org/apache/ignite/tcbot/persistence/IStringCompactor.java
@@ -14,7 +14,7 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-package org.apache.ignite.ci.teamcity.ignited;
+package org.apache.ignite.tcbot.persistence;
 
 /**
  *
diff --git a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/analysis/IVersionedEntity.java b/tcbot-persistence/src/main/java/org/apache/ignite/tcbot/persistence/IVersionedEntity.java
similarity index 96%
rename from ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/analysis/IVersionedEntity.java
rename to tcbot-persistence/src/main/java/org/apache/ignite/tcbot/persistence/IVersionedEntity.java
index 817222f..9539817 100644
--- a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/analysis/IVersionedEntity.java
+++ b/tcbot-persistence/src/main/java/org/apache/ignite/tcbot/persistence/IVersionedEntity.java
@@ -15,7 +15,7 @@
  * limitations under the License.
  */
 
-package org.apache.ignite.ci.analysis;
+package org.apache.ignite.tcbot.persistence;
 
 /**
  * Versioned entry, if entry of previous version cached it may be reloaded from source
diff --git a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/teamcity/ignited/IgniteStringCompactor.java b/tcbot-persistence/src/main/java/org/apache/ignite/tcbot/persistence/IgniteStringCompactor.java
similarity index 64%
rename from ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/teamcity/ignited/IgniteStringCompactor.java
rename to tcbot-persistence/src/main/java/org/apache/ignite/tcbot/persistence/IgniteStringCompactor.java
index 0b26546..0f1918c 100644
--- a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/teamcity/ignited/IgniteStringCompactor.java
+++ b/tcbot-persistence/src/main/java/org/apache/ignite/tcbot/persistence/IgniteStringCompactor.java
@@ -14,9 +14,8 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-package org.apache.ignite.ci.teamcity.ignited;
+package org.apache.ignite.tcbot.persistence;
 
-import com.google.common.base.MoreObjects;
 import java.util.Collections;
 import java.util.Iterator;
 import java.util.concurrent.CountDownLatch;
@@ -28,17 +27,13 @@ import org.apache.ignite.Ignite;
 import org.apache.ignite.IgniteAtomicSequence;
 import org.apache.ignite.IgniteCache;
 import org.apache.ignite.cache.QueryEntity;
-import org.apache.ignite.cache.affinity.rendezvous.RendezvousAffinityFunction;
 import org.apache.ignite.cache.query.QueryCursor;
 import org.apache.ignite.cache.query.SqlQuery;
-import org.apache.ignite.cache.query.annotations.QuerySqlField;
-import org.apache.ignite.ci.db.Persisted;
 import org.apache.ignite.tcbot.common.interceptor.AutoProfiling;
-import org.apache.ignite.ci.di.cache.GuavaCached;
 import org.apache.ignite.tcbot.common.exeption.ExceptionUtil;
+import org.apache.ignite.tcbot.common.interceptor.GuavaCached;
 import org.apache.ignite.tcbot.common.util.ObjectInterner;
 import org.apache.ignite.configuration.CacheConfiguration;
-import org.jetbrains.annotations.NotNull;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
@@ -53,41 +48,17 @@ public class IgniteStringCompactor implements IStringCompactor {
     public static final String STRINGS_CACHE = "stringsCache";
 
     /** Strings sequence. */
-    public static final String STRINGS_SEQ = "stringsSeq";
+    private static final String STRINGS_SEQ = "stringsSeq";
 
     /** Ignite provider. */
     @Inject private Provider<Ignite> igniteProvider;
 
     /** Builds cache. */
-    private IgniteCache<String, CompactorEntity> stringsCache;
+    private IgniteCache<String, org.apache.ignite.ci.teamcity.ignited.IgniteStringCompactor.CompactorEntity> stringsCache;
 
     /** Sequence. */
     private IgniteAtomicSequence seq;
 
-    @Persisted
-    public static class CompactorEntity {
-        @QuerySqlField
-        String val;
-        @QuerySqlField(index = true)
-        int id;
-
-        public CompactorEntity(int candidate, String val) {
-            this.id = candidate;
-            this.val = val;
-        }
-
-        @Override public String toString() {
-            return MoreObjects.toStringHelper(this)
-                .add("val", val)
-                .add("id", id)
-                .toString();
-        }
-
-        public int id() {
-            return id;
-        }
-    }
-
     private void initIfNeeded() {
         if (initGuard.compareAndSet(false, true)) {
             init();
@@ -109,9 +80,9 @@ public class IgniteStringCompactor implements IStringCompactor {
      */
     public void init() {
         Ignite ignite = igniteProvider.get();
-        CacheConfiguration<String, CompactorEntity> cfg = getCache8PartsConfig(STRINGS_CACHE);
+        CacheConfiguration<String, org.apache.ignite.ci.teamcity.ignited.IgniteStringCompactor.CompactorEntity> cfg = CacheConfigs.getCache8PartsConfig(STRINGS_CACHE);
 
-        cfg.setQueryEntities(Collections.singletonList(new QueryEntity(String.class, CompactorEntity.class)));
+        cfg.setQueryEntities(Collections.singletonList(new QueryEntity(String.class, org.apache.ignite.ci.teamcity.ignited.IgniteStringCompactor.CompactorEntity.class)));
 
         stringsCache = ignite.getOrCreateCache(cfg);
 
@@ -127,15 +98,15 @@ public class IgniteStringCompactor implements IStringCompactor {
 
         initIfNeeded();
 
-        CompactorEntity entity = stringsCache.get(val);
+        org.apache.ignite.ci.teamcity.ignited.IgniteStringCompactor.CompactorEntity entity = stringsCache.get(val);
         if (entity != null)
-            return entity.id;
+            return entity.id();
 
         int codeCandidate = (int)seq.incrementAndGet();
 
-        boolean valWasSet = stringsCache.putIfAbsent(val, new CompactorEntity(codeCandidate, val));
+        boolean valWasSet = stringsCache.putIfAbsent(val, new org.apache.ignite.ci.teamcity.ignited.IgniteStringCompactor.CompactorEntity(codeCandidate, val));
 
-        return valWasSet ? codeCandidate : stringsCache.get(val).id;
+        return valWasSet ? codeCandidate : stringsCache.get(val).id();
     }
 
     /** {@inheritDoc} */
@@ -147,10 +118,10 @@ public class IgniteStringCompactor implements IStringCompactor {
 
         initIfNeeded();
 
-        QueryCursor<Cache.Entry<String, CompactorEntity>> qryCursor
-            = stringsCache.query(new SqlQuery<String, CompactorEntity>(CompactorEntity.class, "id = ?").setArgs(id));
+        QueryCursor<Cache.Entry<String, org.apache.ignite.ci.teamcity.ignited.IgniteStringCompactor.CompactorEntity>> qryCursor
+            = stringsCache.query(new SqlQuery<String, org.apache.ignite.ci.teamcity.ignited.IgniteStringCompactor.CompactorEntity>(org.apache.ignite.ci.teamcity.ignited.IgniteStringCompactor.CompactorEntity.class, "id = ?").setArgs(id));
 
-        Iterator<Cache.Entry<String, CompactorEntity>> iter = qryCursor.iterator();
+        Iterator<Cache.Entry<String, org.apache.ignite.ci.teamcity.ignited.IgniteStringCompactor.CompactorEntity>> iter = qryCursor.iterator();
 
         if (!iter.hasNext()) {
             System.err.println("Not found string by id " + id);
@@ -158,11 +129,11 @@ public class IgniteStringCompactor implements IStringCompactor {
             return null;
         }
 
-        Cache.Entry<String, CompactorEntity> next = iter.next();
+        Cache.Entry<String, org.apache.ignite.ci.teamcity.ignited.IgniteStringCompactor.CompactorEntity> next = iter.next();
 
         qryCursor.close();
 
-        return ObjectInterner.internString(next.getValue().val);
+        return ObjectInterner.internString(next.getValue().val());
     }
 
     /** {@inheritDoc} */
@@ -173,21 +144,11 @@ public class IgniteStringCompactor implements IStringCompactor {
 
         initIfNeeded();
 
-        CompactorEntity entity = stringsCache.get(val);
+        org.apache.ignite.ci.teamcity.ignited.IgniteStringCompactor.CompactorEntity entity = stringsCache.get(val);
 
         if (entity != null)
-            return entity.id;
+            return entity.id();
 
         return null;
-
-    }
-
-    @NotNull
-    public static <K, V> CacheConfiguration<K, V> getCache8PartsConfig(String name) {
-        CacheConfiguration<K, V> ccfg = new CacheConfiguration<>(name);
-
-        ccfg.setAffinity(new RendezvousAffinityFunction(false, 8));
-
-        return ccfg;
     }
 }
diff --git a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/db/Persisted.java b/tcbot-persistence/src/main/java/org/apache/ignite/tcbot/persistence/Persisted.java
similarity index 95%
copy from ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/db/Persisted.java
copy to tcbot-persistence/src/main/java/org/apache/ignite/tcbot/persistence/Persisted.java
index ed5e251..f0656cf 100644
--- a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/db/Persisted.java
+++ b/tcbot-persistence/src/main/java/org/apache/ignite/tcbot/persistence/Persisted.java
@@ -15,7 +15,7 @@
  * limitations under the License.
  */
 
-package org.apache.ignite.ci.db;
+package org.apache.ignite.tcbot.persistence;
 
 /**
  * Marker interface for objects saved into a cache.
diff --git a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/di/scheduler/IScheduler.java b/tcbot-persistence/src/main/java/org/apache/ignite/tcbot/persistence/scheduler/IScheduler.java
similarity index 91%
rename from ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/di/scheduler/IScheduler.java
rename to tcbot-persistence/src/main/java/org/apache/ignite/tcbot/persistence/scheduler/IScheduler.java
index a10d4f8..c9e46ac 100644
--- a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/di/scheduler/IScheduler.java
+++ b/tcbot-persistence/src/main/java/org/apache/ignite/tcbot/persistence/scheduler/IScheduler.java
@@ -14,11 +14,14 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-package org.apache.ignite.ci.di.scheduler;
+package org.apache.ignite.tcbot.persistence.scheduler;
 
 import java.util.concurrent.RejectedExecutionException;
 import java.util.concurrent.TimeUnit;
 
+/**
+ * Scheduler is a way to run background syncs between Ignite DB and REST services.
+ */
 public interface IScheduler {
     /**
      * Creates and executes a one-shot action that becomes enabled after the given delay.
diff --git a/tcbot-teamcity-ignited/build.gradle b/tcbot-teamcity-ignited/build.gradle
index 03d6bc2..41593b3 100644
--- a/tcbot-teamcity-ignited/build.gradle
+++ b/tcbot-teamcity-ignited/build.gradle
@@ -24,6 +24,6 @@ repositories {
 
 dependencies {
     compile (project(":tcbot-teamcity"));
-
+    compile (project(":tcbot-persistence"));
 }
  
\ No newline at end of file
diff --git a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/teamcity/ignited/BuildRefCompacted.java b/tcbot-teamcity-ignited/src/main/java/org/apache/ignite/ci/teamcity/ignited/BuildRefCompacted.java
similarity index 96%
rename from ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/teamcity/ignited/BuildRefCompacted.java
rename to tcbot-teamcity-ignited/src/main/java/org/apache/ignite/ci/teamcity/ignited/BuildRefCompacted.java
index 05db429..b9c2d5d 100644
--- a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/teamcity/ignited/BuildRefCompacted.java
+++ b/tcbot-teamcity-ignited/src/main/java/org/apache/ignite/ci/teamcity/ignited/BuildRefCompacted.java
@@ -19,10 +19,13 @@ package org.apache.ignite.ci.teamcity.ignited;
 import com.google.common.base.MoreObjects;
 import com.google.common.base.Objects;
 import org.apache.ignite.cache.query.annotations.QuerySqlField;
-import org.apache.ignite.ci.db.Persisted;
+
+import org.apache.ignite.tcbot.persistence.IStringCompactor;
+import org.apache.ignite.tcbot.persistence.Persisted;
 import org.apache.ignite.tcservice.model.hist.BuildRef;
-import org.jetbrains.annotations.NotNull;
-import org.jetbrains.annotations.Nullable;
+
+import javax.annotation.Nonnull;
+import javax.annotation.Nullable;
 
 import static org.apache.ignite.tcservice.model.hist.BuildRef.*;
 
@@ -114,7 +117,8 @@ public class BuildRefCompacted {
         return compactor.getStringFromId(branchName);
     }
 
-    @NotNull protected static String getHrefForId(int id) {
+    @Nonnull
+    protected static String getHrefForId(int id) {
         return "/app/rest/latest/builds/id:" + id;
     }
 
diff --git a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/teamcity/ignited/TcIgnitedCachingProvider.java b/tcbot-teamcity-ignited/src/main/java/org/apache/ignite/ci/teamcity/ignited/TcIgnitedCachingProvider.java
similarity index 80%
rename from ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/teamcity/ignited/TcIgnitedCachingProvider.java
rename to tcbot-teamcity-ignited/src/main/java/org/apache/ignite/ci/teamcity/ignited/TcIgnitedCachingProvider.java
index dee0339..8abf79b 100644
--- a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/teamcity/ignited/TcIgnitedCachingProvider.java
+++ b/tcbot-teamcity-ignited/src/main/java/org/apache/ignite/ci/teamcity/ignited/TcIgnitedCachingProvider.java
@@ -24,23 +24,24 @@ import java.util.concurrent.TimeUnit;
 import javax.annotation.Nullable;
 import javax.inject.Inject;
 import javax.inject.Provider;
-import org.apache.ignite.tcservice.ITeamcity;
-import org.apache.ignite.ci.tcbot.conf.ITcBotConfig;
+
+import org.apache.ignite.tcbot.common.conf.ITcServerConfigSupplier;
+import org.apache.ignite.tcignited.ITeamcityIgnited;
+import org.apache.ignite.tcignited.ITeamcityIgnitedProvider;
+import org.apache.ignite.tcignited.creds.ICredentialsProv;
 import org.apache.ignite.tcbot.common.conf.ITcServerConfig;
-import org.apache.ignite.ci.teamcity.restcached.ITcServerProvider;
-import org.apache.ignite.ci.user.ICredentialsProv;
 import org.apache.ignite.tcbot.common.exeption.ExceptionUtil;
+import org.apache.ignite.tcservice.TeamcityServiceConnection;
 
 /**
  *
  */
 class TcIgnitedCachingProvider implements ITeamcityIgnitedProvider {
     /** Server factory. */
-    @Inject
-    private ITcServerProvider srvFactory;
+    @Inject private Provider<TeamcityServiceConnection> srvFactory;
 
     /** Config. */
-    @Inject private ITcBotConfig cfg;
+    @Inject private ITcServerConfigSupplier cfg;
 
     @Inject private Provider<TeamcityIgnitedImpl> provider;
 
@@ -72,18 +73,19 @@ class TcIgnitedCachingProvider implements ITeamcityIgnitedProvider {
 
         try {
             return srvs.get(fullKey, () -> {
-                ITeamcity tcRealConn = srvFactory.server(realSrvCode, prov);
+                final TeamcityServiceConnection teamcityServiceConnection = srvFactory.get();
+                teamcityServiceConnection.init(realSrvCode);
 
                 if (prov != null) {
                     String user = prov.getUser(realSrvCode);
                     String pwd = prov.getPassword(realSrvCode);
 
-                    tcRealConn.setAuthData(user, pwd);
+                    teamcityServiceConnection.setAuthData(user, pwd);
                 }
 
                 TeamcityIgnitedImpl impl = provider.get();
 
-                impl.init(tcRealConn);
+                impl.init(teamcityServiceConnection);
 
                 return impl;
             });
diff --git a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/teamcity/ignited/TeamcityIgnitedImpl.java b/tcbot-teamcity-ignited/src/main/java/org/apache/ignite/ci/teamcity/ignited/TeamcityIgnitedImpl.java
similarity index 95%
rename from ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/teamcity/ignited/TeamcityIgnitedImpl.java
rename to tcbot-teamcity-ignited/src/main/java/org/apache/ignite/ci/teamcity/ignited/TeamcityIgnitedImpl.java
index 162f6dd..5201c5f 100644
--- a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/teamcity/ignited/TeamcityIgnitedImpl.java
+++ b/tcbot-teamcity-ignited/src/main/java/org/apache/ignite/ci/teamcity/ignited/TeamcityIgnitedImpl.java
@@ -18,12 +18,6 @@ package org.apache.ignite.ci.teamcity.ignited;
 
 import com.google.common.collect.Lists;
 import com.google.common.collect.Sets;
-import org.apache.ignite.ci.analysis.SuiteInBranch;
-import org.apache.ignite.ci.analysis.TestInBranch;
-import org.apache.ignite.ci.di.MonitoredTask;
-import org.apache.ignite.ci.di.cache.GuavaCached;
-import org.apache.ignite.ci.di.scheduler.IScheduler;
-import org.apache.ignite.ci.tcbot.trends.MasterTrendsService;
 import org.apache.ignite.ci.teamcity.ignited.buildcondition.BuildCondition;
 import org.apache.ignite.ci.teamcity.ignited.buildcondition.BuildConditionDao;
 import org.apache.ignite.ci.teamcity.ignited.buildref.BuildRefDao;
@@ -39,9 +33,16 @@ import org.apache.ignite.ci.teamcity.ignited.mute.MuteDao;
 import org.apache.ignite.ci.teamcity.ignited.mute.MuteSync;
 import org.apache.ignite.ci.teamcity.ignited.runhist.RunHistCompactedDao;
 import org.apache.ignite.ci.teamcity.ignited.runhist.RunHistSync;
-import org.apache.ignite.ci.user.ICredentialsProv;
 import org.apache.ignite.tcbot.common.conf.ITcServerConfig;
 import org.apache.ignite.tcbot.common.interceptor.AutoProfiling;
+import org.apache.ignite.tcbot.common.interceptor.GuavaCached;
+import org.apache.ignite.tcbot.common.interceptor.MonitoredTask;
+import org.apache.ignite.tcbot.persistence.IStringCompactor;
+import org.apache.ignite.tcbot.persistence.scheduler.IScheduler;
+import org.apache.ignite.tcignited.ITeamcityIgnited;
+import org.apache.ignite.tcignited.SyncMode;
+import org.apache.ignite.tcignited.history.IRunHistory;
+import org.apache.ignite.tcignited.history.IRunStat;
 import org.apache.ignite.tcservice.ITeamcity;
 import org.apache.ignite.tcservice.ITeamcityConn;
 import org.apache.ignite.tcservice.model.agent.Agent;
@@ -49,10 +50,10 @@ import org.apache.ignite.tcservice.model.conf.Project;
 import org.apache.ignite.tcservice.model.hist.BuildRef;
 import org.apache.ignite.tcservice.model.mute.MuteInfo;
 import org.apache.ignite.tcservice.model.result.Build;
-import org.jetbrains.annotations.NotNull;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
+import javax.annotation.Nonnull;
 import javax.annotation.Nullable;
 import javax.inject.Inject;
 import java.io.File;
@@ -158,7 +159,7 @@ public class TeamcityIgnitedImpl implements ITeamcityIgnited {
      * @param taskName Task name.
      * @return Task name concatenated with server name.
      */
-    @NotNull
+    @Nonnull
     private String taskName(String taskName) {
         return ITeamcityIgnited.class.getSimpleName() +"." + taskName + "." + srvCode;
     }
@@ -351,20 +352,17 @@ public class TeamcityIgnitedImpl implements ITeamcityIgnited {
 
 
     /** {@inheritDoc} */
-    @Override public Set<MuteInfo> getMutes(String projectId, ICredentialsProv creds) {
+    @Override public Set<MuteInfo> getMutes(String projectId) {
         muteSync.ensureActualizeMutes(taskName("actualizeMutes"), projectId, srvIdMaskHigh, conn);
 
-        SortedSet<MuteInfo> mutes = muteDao.getMutes(srvIdMaskHigh);
-
-
-        return mutes;
+        return muteDao.getMutes(srvIdMaskHigh);
     }
 
 
 
     /** {@inheritDoc} */
     @AutoProfiling
-    @Override @NotNull public List<Integer> getLastNBuildsFromHistory(String btId, String branchForTc, int cnt) {
+    @Override @Nonnull public List<Integer> getLastNBuildsFromHistory(String btId, String branchForTc, int cnt) {
         List<BuildRefCompacted> hist = getAllBuildsCompacted(btId, branchForTc);
 
         List<Integer> chains = hist.stream()
@@ -393,15 +391,15 @@ public class TeamcityIgnitedImpl implements ITeamcityIgnited {
     /** {@inheritDoc} */
     @Nullable
     @AutoProfiling
-    @Override public IRunHistory getTestRunHist(TestInBranch testInBranch) {
-        return runHistCompactedDao.getTestRunHist(srvIdMaskHigh, testInBranch.name, testInBranch.branch);
+    @Override public IRunHistory getTestRunHist(String testName, @Nullable String branch) {
+        return runHistCompactedDao.getTestRunHist(srvIdMaskHigh, testName, branch);
     }
 
     /** {@inheritDoc} */
     @Nullable
     @AutoProfiling
-    @Override public IRunHistory getSuiteRunHist(SuiteInBranch suiteInBranch) {
-        return runHistCompactedDao.getSuiteRunHist(srvIdMaskHigh, suiteInBranch.getSuiteId(), suiteInBranch.branch);
+    @Override public IRunHistory getSuiteRunHist(String suiteId, @Nullable String branch){
+        return runHistCompactedDao.getSuiteRunHist(srvIdMaskHigh, suiteId, branch);
     }
 
     /** {@inheritDoc} */
@@ -513,9 +511,6 @@ public class TeamcityIgnitedImpl implements ITeamcityIgnited {
 
         String msg = "Loading build [" + buildId + "] start date";
 
-        if (MasterTrendsService.DEBUG)
-            System.out.println(msg);
-
         logger.info(msg);
 
         FatBuildCompacted highBuild = getFatBuild(buildId, SyncMode.LOAD_NEW);
diff --git a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/teamcity/ignited/TeamcityIgnitedModule.java b/tcbot-teamcity-ignited/src/main/java/org/apache/ignite/ci/teamcity/ignited/TeamcityIgnitedModule.java
similarity index 87%
rename from ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/teamcity/ignited/TeamcityIgnitedModule.java
rename to tcbot-teamcity-ignited/src/main/java/org/apache/ignite/ci/teamcity/ignited/TeamcityIgnitedModule.java
index 1c0e2f8..446dc17 100644
--- a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/teamcity/ignited/TeamcityIgnitedModule.java
+++ b/tcbot-teamcity-ignited/src/main/java/org/apache/ignite/ci/teamcity/ignited/TeamcityIgnitedModule.java
@@ -18,14 +18,12 @@ package org.apache.ignite.ci.teamcity.ignited;
 
 import com.google.inject.AbstractModule;
 import com.google.inject.internal.SingletonScope;
-import org.apache.ignite.ci.jira.ignited.JiraTicketDao;
-import org.apache.ignite.ci.jira.ignited.JiraTicketSync;
 import org.apache.ignite.ci.teamcity.ignited.buildcondition.BuildConditionDao;
 import org.apache.ignite.ci.teamcity.ignited.buildref.BuildRefDao;
 import org.apache.ignite.ci.teamcity.ignited.buildref.BuildRefSync;
+import org.apache.ignite.ci.teamcity.ignited.buildtype.BuildTypeDao;
 import org.apache.ignite.ci.teamcity.ignited.buildtype.BuildTypeRefDao;
 import org.apache.ignite.ci.teamcity.ignited.buildtype.BuildTypeSync;
-import org.apache.ignite.ci.teamcity.ignited.buildtype.BuildTypeDao;
 import org.apache.ignite.ci.teamcity.ignited.change.ChangeDao;
 import org.apache.ignite.ci.teamcity.ignited.change.ChangeSync;
 import org.apache.ignite.ci.teamcity.ignited.fatbuild.FatBuildDao;
@@ -34,16 +32,21 @@ import org.apache.ignite.ci.teamcity.ignited.mute.MuteDao;
 import org.apache.ignite.ci.teamcity.ignited.mute.MuteSync;
 import org.apache.ignite.ci.teamcity.ignited.runhist.RunHistCompactedDao;
 import org.apache.ignite.ci.teamcity.ignited.runhist.RunHistSync;
+import org.apache.ignite.tcbot.persistence.IStringCompactor;
+import org.apache.ignite.tcbot.persistence.IgniteStringCompactor;
+import org.apache.ignite.tcignited.ITeamcityIgnitedProvider;
+import org.apache.ignite.tcservice.TcRealConnectionModule;
 import org.apache.ignite.tcservice.http.ITeamcityHttpConnection;
-import org.apache.ignite.ci.teamcity.restcached.TcRestCachedModule;
-import org.jetbrains.annotations.Nullable;
+
+import javax.annotation.Nullable;
 
 /**
  * Guice module to setup real connected server and all related implementations.
  */
 public class TeamcityIgnitedModule extends AbstractModule {
     /** Connection. */
-    @Nullable private ITeamcityHttpConnection conn;
+    @Nullable
+    private ITeamcityHttpConnection conn;
 
     /** {@inheritDoc} */
     @Override protected void configure() {
@@ -65,8 +68,10 @@ public class TeamcityIgnitedModule extends AbstractModule {
 
         bind(IStringCompactor.class).to(IgniteStringCompactor.class).in(new SingletonScope());
 
-        TcRestCachedModule module = new TcRestCachedModule();
-        module.overrideHttp(conn);
+        TcRealConnectionModule module = new TcRealConnectionModule();
+        if (conn != null)
+            module.overrideHttp(conn);
+
         install(module);
     }
 
diff --git a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/teamcity/ignited/buildcondition/BuildCondition.java b/tcbot-teamcity-ignited/src/main/java/org/apache/ignite/ci/teamcity/ignited/buildcondition/BuildCondition.java
similarity index 100%
rename from ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/teamcity/ignited/buildcondition/BuildCondition.java
rename to tcbot-teamcity-ignited/src/main/java/org/apache/ignite/ci/teamcity/ignited/buildcondition/BuildCondition.java
diff --git a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/teamcity/ignited/buildcondition/BuildConditionCompacted.java b/tcbot-teamcity-ignited/src/main/java/org/apache/ignite/ci/teamcity/ignited/buildcondition/BuildConditionCompacted.java
similarity index 94%
rename from ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/teamcity/ignited/buildcondition/BuildConditionCompacted.java
rename to tcbot-teamcity-ignited/src/main/java/org/apache/ignite/ci/teamcity/ignited/buildcondition/BuildConditionCompacted.java
index b4e5713..645d0f3 100644
--- a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/teamcity/ignited/buildcondition/BuildConditionCompacted.java
+++ b/tcbot-teamcity-ignited/src/main/java/org/apache/ignite/ci/teamcity/ignited/buildcondition/BuildConditionCompacted.java
@@ -18,8 +18,10 @@
 package org.apache.ignite.ci.teamcity.ignited.buildcondition;
 
 import java.util.Date;
-import org.apache.ignite.ci.teamcity.ignited.IStringCompactor;
+import org.apache.ignite.tcbot.persistence.IStringCompactor;
+import org.apache.ignite.tcbot.persistence.Persisted;
 
+@Persisted
 public class BuildConditionCompacted {
     /** Build id. */
     int buildId = -1;
diff --git a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/teamcity/ignited/buildcondition/BuildConditionDao.java b/tcbot-teamcity-ignited/src/main/java/org/apache/ignite/ci/teamcity/ignited/buildcondition/BuildConditionDao.java
similarity index 94%
rename from ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/teamcity/ignited/buildcondition/BuildConditionDao.java
rename to tcbot-teamcity-ignited/src/main/java/org/apache/ignite/ci/teamcity/ignited/buildcondition/BuildConditionDao.java
index 5862b14..0092037 100644
--- a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/teamcity/ignited/buildcondition/BuildConditionDao.java
+++ b/tcbot-teamcity-ignited/src/main/java/org/apache/ignite/ci/teamcity/ignited/buildcondition/BuildConditionDao.java
@@ -21,9 +21,9 @@ import javax.inject.Inject;
 import javax.inject.Provider;
 import org.apache.ignite.Ignite;
 import org.apache.ignite.IgniteCache;
-import org.apache.ignite.ci.teamcity.ignited.IStringCompactor;
+import org.apache.ignite.tcbot.persistence.IStringCompactor;
 
-import static org.apache.ignite.ci.teamcity.ignited.IgniteStringCompactor.getCache8PartsConfig;
+import static org.apache.ignite.tcbot.persistence.CacheConfigs.getCache8PartsConfig;
 
 public class BuildConditionDao {
     /** Cache name*/
diff --git a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/teamcity/ignited/buildref/BuildRefDao.java b/tcbot-teamcity-ignited/src/main/java/org/apache/ignite/ci/teamcity/ignited/buildref/BuildRefDao.java
similarity index 93%
rename from ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/teamcity/ignited/buildref/BuildRefDao.java
rename to tcbot-teamcity-ignited/src/main/java/org/apache/ignite/ci/teamcity/ignited/buildref/BuildRefDao.java
index 51cfd36..bbd0cdc 100644
--- a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/teamcity/ignited/buildref/BuildRefDao.java
+++ b/tcbot-teamcity-ignited/src/main/java/org/apache/ignite/ci/teamcity/ignited/buildref/BuildRefDao.java
@@ -21,6 +21,7 @@ import java.util.*;
 import java.util.stream.Collectors;
 import java.util.stream.Stream;
 import java.util.stream.StreamSupport;
+import javax.annotation.Nonnull;
 import javax.annotation.Nullable;
 import javax.cache.Cache;
 import javax.inject.Inject;
@@ -30,15 +31,14 @@ import org.apache.ignite.IgniteCache;
 import org.apache.ignite.cache.QueryEntity;
 import org.apache.ignite.cache.query.QueryCursor;
 import org.apache.ignite.cache.query.SqlQuery;
-import org.apache.ignite.ci.db.TcHelperDb;
 import org.apache.ignite.tcbot.common.interceptor.AutoProfiling;
-import org.apache.ignite.ci.di.cache.GuavaCached;
+import org.apache.ignite.tcbot.common.interceptor.GuavaCached;
+import org.apache.ignite.tcbot.persistence.CacheConfigs;
 import org.apache.ignite.tcservice.model.hist.BuildRef;
 import org.apache.ignite.ci.teamcity.ignited.BuildRefCompacted;
-import org.apache.ignite.ci.teamcity.ignited.IStringCompactor;
+import org.apache.ignite.tcbot.persistence.IStringCompactor;
 import org.apache.ignite.configuration.CacheConfiguration;
 import org.apache.ignite.internal.util.GridIntList;
-import org.jetbrains.annotations.NotNull;
 
 /**
  *
@@ -58,7 +58,7 @@ public class BuildRefDao {
 
     /** */
     public BuildRefDao init() {
-        CacheConfiguration<Long, BuildRefCompacted> cfg = TcHelperDb.getCacheV2Config(TEAMCITY_BUILD_CACHE_NAME);
+        CacheConfiguration<Long, BuildRefCompacted> cfg = CacheConfigs.getCacheV2Config(TEAMCITY_BUILD_CACHE_NAME);
 
         cfg.setQueryEntities(Collections.singletonList(new QueryEntity(Long.class, BuildRefCompacted.class)));
 
@@ -71,7 +71,8 @@ public class BuildRefDao {
      * @param srvId Server id.
      * @return all builds for a server, full scan.
      */
-    @NotNull public Stream<BuildRefCompacted> compactedBuildsForServer(int srvId) {
+    @Nonnull
+    public Stream<BuildRefCompacted> compactedBuildsForServer(int srvId) {
         return StreamSupport.stream(buildRefsCache.spliterator(), false)
             .filter(entry -> isKeyForServer(entry.getKey(), srvId))
             .map(javax.cache.Cache.Entry::getValue);
@@ -140,7 +141,7 @@ public class BuildRefDao {
      * @param bracnhNameQry Bracnh name query.
      */
     @AutoProfiling
-    @NotNull public List<BuildRefCompacted> getAllBuildsCompacted(int srvId,
+    @Nonnull public List<BuildRefCompacted> getAllBuildsCompacted(int srvId,
                                                                   @Nullable String buildTypeId,
                                                                   List<String> bracnhNameQry) {
 
@@ -240,7 +241,7 @@ public class BuildRefDao {
         return res.array();
     }
 
-    @NotNull public Stream<Cache.Entry<Long, BuildRefCompacted>> getAllBuildRefs(int srvId) {
+    @Nonnull public Stream<Cache.Entry<Long, BuildRefCompacted>> getAllBuildRefs(int srvId) {
         return StreamSupport.stream(buildRefsCache.spliterator(), false)
                 .filter(entry -> isKeyForServer(entry.getKey(), srvId));
     }
diff --git a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/teamcity/ignited/buildref/BuildRefSync.java b/tcbot-teamcity-ignited/src/main/java/org/apache/ignite/ci/teamcity/ignited/buildref/BuildRefSync.java
similarity index 96%
rename from ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/teamcity/ignited/buildref/BuildRefSync.java
rename to tcbot-teamcity-ignited/src/main/java/org/apache/ignite/ci/teamcity/ignited/buildref/BuildRefSync.java
index f84d76e..bf35c19 100644
--- a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/teamcity/ignited/buildref/BuildRefSync.java
+++ b/tcbot-teamcity-ignited/src/main/java/org/apache/ignite/ci/teamcity/ignited/buildref/BuildRefSync.java
@@ -17,13 +17,13 @@
 package org.apache.ignite.ci.teamcity.ignited.buildref;
 
 import org.apache.ignite.tcbot.common.interceptor.AutoProfiling;
-import org.apache.ignite.ci.di.MonitoredTask;
+import org.apache.ignite.tcbot.common.interceptor.MonitoredTask;
 import org.apache.ignite.tcservice.model.hist.BuildRef;
-import org.apache.ignite.ci.teamcity.ignited.ITeamcityIgnited;
+import org.apache.ignite.tcignited.ITeamcityIgnited;
 import org.apache.ignite.ci.teamcity.ignited.fatbuild.ProactiveFatBuildSync;
 import org.apache.ignite.tcservice.ITeamcityConn;
-import org.jetbrains.annotations.NotNull;
 
+import javax.annotation.Nonnull;
 import javax.annotation.Nullable;
 import javax.inject.Inject;
 import java.util.Collection;
@@ -111,7 +111,7 @@ public class BuildRefSync {
     }
 
 
-    @NotNull
+    @Nonnull
     private List<Integer> cacheKeysToBuildIds(Collection<Long> cacheKeysUpdated) {
         return cacheKeysUpdated.stream().map(BuildRefDao::cacheKeyToBuildId).collect(Collectors.toList());
     }
diff --git a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/teamcity/ignited/buildtype/BuildTypeCompacted.java b/tcbot-teamcity-ignited/src/main/java/org/apache/ignite/ci/teamcity/ignited/buildtype/BuildTypeCompacted.java
similarity index 96%
rename from ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/teamcity/ignited/buildtype/BuildTypeCompacted.java
rename to tcbot-teamcity-ignited/src/main/java/org/apache/ignite/ci/teamcity/ignited/buildtype/BuildTypeCompacted.java
index 9325b97..25e1e7e 100644
--- a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/teamcity/ignited/buildtype/BuildTypeCompacted.java
+++ b/tcbot-teamcity-ignited/src/main/java/org/apache/ignite/ci/teamcity/ignited/buildtype/BuildTypeCompacted.java
@@ -22,15 +22,17 @@ import java.util.ArrayList;
 import java.util.Collections;
 import java.util.List;
 import java.util.Objects;
-import org.apache.ignite.ci.analysis.IVersionedEntity;
-import org.apache.ignite.ci.db.Persisted;
+
+import org.apache.ignite.tcbot.common.util.NumberUtil;
+import org.apache.ignite.tcbot.persistence.IVersionedEntity;
+import org.apache.ignite.tcbot.persistence.Persisted;
 import org.apache.ignite.tcservice.model.conf.bt.BuildTypeFull;
 import org.apache.ignite.tcservice.model.conf.bt.Parameters;
 import org.apache.ignite.tcservice.model.conf.bt.SnapshotDependencies;
 import org.apache.ignite.tcservice.model.conf.bt.SnapshotDependency;
-import org.apache.ignite.ci.teamcity.ignited.IStringCompactor;
-import org.apache.ignite.ci.util.NumberUtil;
-import org.jetbrains.annotations.Nullable;
+import org.apache.ignite.tcbot.persistence.IStringCompactor;
+
+import javax.annotation.Nullable;
 
 @Persisted
 public class BuildTypeCompacted extends BuildTypeRefCompacted implements IVersionedEntity {
diff --git a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/teamcity/ignited/buildtype/BuildTypeDao.java b/tcbot-teamcity-ignited/src/main/java/org/apache/ignite/ci/teamcity/ignited/buildtype/BuildTypeDao.java
similarity index 95%
rename from ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/teamcity/ignited/buildtype/BuildTypeDao.java
rename to tcbot-teamcity-ignited/src/main/java/org/apache/ignite/ci/teamcity/ignited/buildtype/BuildTypeDao.java
index b4c298d..517d494 100644
--- a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/teamcity/ignited/buildtype/BuildTypeDao.java
+++ b/tcbot-teamcity-ignited/src/main/java/org/apache/ignite/ci/teamcity/ignited/buildtype/BuildTypeDao.java
@@ -24,16 +24,16 @@ import java.util.List;
 import java.util.stream.Collectors;
 import java.util.stream.Stream;
 import java.util.stream.StreamSupport;
+import javax.annotation.Nonnull;
+import javax.annotation.Nullable;
 import javax.inject.Inject;
 import org.apache.ignite.Ignite;
 import org.apache.ignite.IgniteCache;
 import org.apache.ignite.tcbot.common.interceptor.AutoProfiling;
 import org.apache.ignite.tcservice.model.conf.bt.BuildTypeFull;
-import org.apache.ignite.ci.teamcity.ignited.IStringCompactor;
-import javax.validation.constraints.NotNull;
-import org.jetbrains.annotations.Nullable;
+import org.apache.ignite.tcbot.persistence.IStringCompactor;
 
-import static org.apache.ignite.ci.teamcity.ignited.IgniteStringCompactor.getCache8PartsConfig;
+import static org.apache.ignite.tcbot.persistence.CacheConfigs.getCache8PartsConfig;
 
 public class BuildTypeDao {
     /** Cache name*/
@@ -59,7 +59,7 @@ public class BuildTypeDao {
      * @return Fat BuildType saved (if modifications detected), otherwise null.
      */
     public BuildTypeCompacted saveBuildType(int srvIdMaskHigh,
-        @NotNull BuildTypeFull buildType,
+        @Nonnull BuildTypeFull buildType,
         @Nullable BuildTypeCompacted existingBuildType) {
         Preconditions.checkNotNull(buildType, "buildType can't be null");
 
@@ -102,7 +102,7 @@ public class BuildTypeDao {
      * @param buildTypeId BuildType id.
      * @return Saved fat buildType.
      */
-    public BuildTypeCompacted getFatBuildType(int srvIdMaskHigh, @NotNull String buildTypeId) {
+    public BuildTypeCompacted getFatBuildType(int srvIdMaskHigh, @Nonnull String buildTypeId) {
         Preconditions.checkNotNull(buildTypesCache(), "init() was not called");
 
         return buildTypesCache().get(buildTypeIdToCacheKey(srvIdMaskHigh, buildTypeId));
@@ -181,7 +181,7 @@ public class BuildTypeDao {
      * @param srvIdMaskHigh Server id mask high.
      * @return All buildTypes for a server, full scan.
      */
-    @NotNull protected Stream<BuildTypeCompacted> compactedFatBuildTypesStreamForServer(int srvIdMaskHigh) {
+    @Nonnull protected Stream<BuildTypeCompacted> compactedFatBuildTypesStreamForServer(int srvIdMaskHigh) {
         return StreamSupport.stream(buildTypesCache().spliterator(), false)
             .filter(entry -> isKeyForServer(entry.getKey(), srvIdMaskHigh))
             .map(javax.cache.Cache.Entry::getValue);
diff --git a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/teamcity/ignited/buildtype/BuildTypeRefCompacted.java b/tcbot-teamcity-ignited/src/main/java/org/apache/ignite/ci/teamcity/ignited/buildtype/BuildTypeRefCompacted.java
similarity index 94%
rename from ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/teamcity/ignited/buildtype/BuildTypeRefCompacted.java
rename to tcbot-teamcity-ignited/src/main/java/org/apache/ignite/ci/teamcity/ignited/buildtype/BuildTypeRefCompacted.java
index da04bdc..5772683 100644
--- a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/teamcity/ignited/buildtype/BuildTypeRefCompacted.java
+++ b/tcbot-teamcity-ignited/src/main/java/org/apache/ignite/ci/teamcity/ignited/buildtype/BuildTypeRefCompacted.java
@@ -19,11 +19,13 @@ package org.apache.ignite.ci.teamcity.ignited.buildtype;
 
 import com.google.common.base.MoreObjects;
 import java.util.Objects;
-import org.apache.ignite.ci.db.Persisted;
+
+import org.apache.ignite.tcbot.persistence.Persisted;
 import org.apache.ignite.tcservice.model.conf.BuildType;
-import org.apache.ignite.ci.teamcity.ignited.IStringCompactor;
-import org.jetbrains.annotations.NotNull;
-import org.jetbrains.annotations.Nullable;
+import org.apache.ignite.tcbot.persistence.IStringCompactor;
+
+import javax.annotation.Nonnull;
+import javax.annotation.Nullable;
 
 @Persisted
 public class BuildTypeRefCompacted {
@@ -158,7 +160,7 @@ public class BuildTypeRefCompacted {
      * @param buildTypeId BuildType id.
      * @return URL for GET request to Teamcity REST API.
      */
-    @NotNull protected static String getHrefForId(String buildTypeId) {
+    @Nonnull protected static String getHrefForId(String buildTypeId) {
         return "/app/rest/latest/builds/id:" + buildTypeId;
     }
 
@@ -167,7 +169,7 @@ public class BuildTypeRefCompacted {
      * @param buildTypeId BuildType id.
      * @return URL to BuildType on Teamcity.
      */
-    @NotNull protected static String getWebUrlForId(String host, String buildTypeId) {
+    @Nonnull protected static String getWebUrlForId(String host, String buildTypeId) {
         return host + "viewType.html?buildTypeId=" + buildTypeId;
     }
 
diff --git a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/teamcity/ignited/buildtype/BuildTypeRefDao.java b/tcbot-teamcity-ignited/src/main/java/org/apache/ignite/ci/teamcity/ignited/buildtype/BuildTypeRefDao.java
similarity index 96%
rename from ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/teamcity/ignited/buildtype/BuildTypeRefDao.java
rename to tcbot-teamcity-ignited/src/main/java/org/apache/ignite/ci/teamcity/ignited/buildtype/BuildTypeRefDao.java
index 98178b9..c74a32f 100644
--- a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/teamcity/ignited/buildtype/BuildTypeRefDao.java
+++ b/tcbot-teamcity-ignited/src/main/java/org/apache/ignite/ci/teamcity/ignited/buildtype/BuildTypeRefDao.java
@@ -28,16 +28,16 @@ import java.util.TreeSet;
 import java.util.stream.Collectors;
 import java.util.stream.Stream;
 import java.util.stream.StreamSupport;
+import javax.annotation.Nonnull;
+import javax.annotation.Nullable;
 import javax.cache.Cache;
 import javax.inject.Inject;
-import javax.validation.constraints.NotNull;
 import org.apache.ignite.Ignite;
 import org.apache.ignite.IgniteCache;
 import org.apache.ignite.tcservice.model.conf.BuildType;
-import org.apache.ignite.ci.teamcity.ignited.IStringCompactor;
-import org.jetbrains.annotations.Nullable;
+import org.apache.ignite.tcbot.persistence.IStringCompactor;
 
-import static org.apache.ignite.ci.teamcity.ignited.IgniteStringCompactor.getCache8PartsConfig;
+import static org.apache.ignite.tcbot.persistence.CacheConfigs.getCache8PartsConfig;
 import static org.apache.ignite.ci.teamcity.ignited.buildtype.BuildTypeDao.buildTypeStringIdToCacheKey;
 
 public class BuildTypeRefDao {
@@ -64,7 +64,7 @@ public class BuildTypeRefDao {
      * @return BuildTypes references saved (if modifications detected), otherwise null.
      */
     public BuildTypeRefCompacted saveBuildTypeRef(int srvIdMaskHigh,
-        @NotNull BuildType buildTypeRef,
+        @Nonnull BuildType buildTypeRef,
         @Nullable BuildTypeRefCompacted existingBuildTypeRef) {
         Preconditions.checkNotNull(buildTypeRef, "buildType can't be null");
 
@@ -153,7 +153,7 @@ public class BuildTypeRefDao {
      * @param buildTypeId BuildType id.
      * @return Saved reference to buildType.
      */
-    public BuildTypeRefCompacted getBuildTypeRef(int srvIdMaskHigh, @NotNull String buildTypeId) {
+    public BuildTypeRefCompacted getBuildTypeRef(int srvIdMaskHigh, @Nonnull String buildTypeId) {
         return buildTypesCache().get(buildTypeIdToCacheKey(srvIdMaskHigh, buildTypeId));
     }
 
@@ -216,7 +216,7 @@ public class BuildTypeRefDao {
      * @param srvIdMaskHigh Server id mask high.
      * @return all buildTypes for a server, full scan.
      */
-    @NotNull protected Stream<BuildTypeRefCompacted> compactedBuildTypeRefsStreamForServer(int srvIdMaskHigh) {
+    @Nonnull protected Stream<BuildTypeRefCompacted> compactedBuildTypeRefsStreamForServer(int srvIdMaskHigh) {
         return StreamSupport.stream(buildTypesCache().spliterator(), false)
             .filter(entry -> isKeyForServer(entry.getKey(), srvIdMaskHigh))
             .map(javax.cache.Cache.Entry::getValue);
diff --git a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/teamcity/ignited/buildtype/BuildTypeSync.java b/tcbot-teamcity-ignited/src/main/java/org/apache/ignite/ci/teamcity/ignited/buildtype/BuildTypeSync.java
similarity index 98%
rename from ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/teamcity/ignited/buildtype/BuildTypeSync.java
rename to tcbot-teamcity-ignited/src/main/java/org/apache/ignite/ci/teamcity/ignited/buildtype/BuildTypeSync.java
index 3ab4545..887393e 100644
--- a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/teamcity/ignited/buildtype/BuildTypeSync.java
+++ b/tcbot-teamcity-ignited/src/main/java/org/apache/ignite/ci/teamcity/ignited/buildtype/BuildTypeSync.java
@@ -25,15 +25,15 @@ import java.util.Map;
 import java.util.Set;
 import java.util.concurrent.TimeUnit;
 import java.util.stream.Collectors;
+import javax.annotation.Nonnull;
 import javax.inject.Inject;
 import org.apache.ignite.tcbot.common.interceptor.AutoProfiling;
-import org.apache.ignite.ci.di.MonitoredTask;
-import org.apache.ignite.ci.di.scheduler.IScheduler;
+import org.apache.ignite.tcbot.common.interceptor.MonitoredTask;
+import org.apache.ignite.tcbot.persistence.scheduler.IScheduler;
 import org.apache.ignite.tcservice.model.conf.BuildType;
 import org.apache.ignite.tcservice.model.conf.bt.BuildTypeFull;
 import org.apache.ignite.tcservice.ITeamcityConn;
 import org.apache.ignite.tcbot.common.exeption.ExceptionUtil;
-import org.jetbrains.annotations.NotNull;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
@@ -243,7 +243,7 @@ public class BuildTypeSync {
      * @param srvName Server name.
      * @param prjName Project name.
      */
-    @NotNull
+    @Nonnull
     private String taskName(String taskName, String srvName, String prjName) {
         return BuildTypeSync.class.getSimpleName() + "." + taskName + "." + srvName + "." + prjName;
     }
diff --git a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/teamcity/ignited/buildtype/ParametersCompacted.java b/tcbot-teamcity-ignited/src/main/java/org/apache/ignite/ci/teamcity/ignited/buildtype/ParametersCompacted.java
similarity index 97%
rename from ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/teamcity/ignited/buildtype/ParametersCompacted.java
rename to tcbot-teamcity-ignited/src/main/java/org/apache/ignite/ci/teamcity/ignited/buildtype/ParametersCompacted.java
index 0887bfb..2308ddb 100644
--- a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/teamcity/ignited/buildtype/ParametersCompacted.java
+++ b/tcbot-teamcity-ignited/src/main/java/org/apache/ignite/ci/teamcity/ignited/buildtype/ParametersCompacted.java
@@ -24,10 +24,11 @@ import java.util.List;
 import java.util.Objects;
 import java.util.function.BiConsumer;
 import javax.annotation.Nullable;
-import org.apache.ignite.ci.db.Persisted;
+
+import org.apache.ignite.tcbot.persistence.Persisted;
 import org.apache.ignite.tcservice.model.conf.bt.Parameters;
 import org.apache.ignite.tcservice.model.conf.bt.Property;
-import org.apache.ignite.ci.teamcity.ignited.IStringCompactor;
+import org.apache.ignite.tcbot.persistence.IStringCompactor;
 import org.apache.ignite.internal.util.GridIntList;
 
 /**
diff --git a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/teamcity/ignited/buildtype/SnapshotDependencyCompacted.java b/tcbot-teamcity-ignited/src/main/java/org/apache/ignite/ci/teamcity/ignited/buildtype/SnapshotDependencyCompacted.java
similarity index 98%
rename from ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/teamcity/ignited/buildtype/SnapshotDependencyCompacted.java
rename to tcbot-teamcity-ignited/src/main/java/org/apache/ignite/ci/teamcity/ignited/buildtype/SnapshotDependencyCompacted.java
index caaf9e4..377519e 100644
--- a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/teamcity/ignited/buildtype/SnapshotDependencyCompacted.java
+++ b/tcbot-teamcity-ignited/src/main/java/org/apache/ignite/ci/teamcity/ignited/buildtype/SnapshotDependencyCompacted.java
@@ -20,7 +20,7 @@ package org.apache.ignite.ci.teamcity.ignited.buildtype;
 import com.google.common.base.MoreObjects;
 import java.util.Objects;
 import org.apache.ignite.tcservice.model.conf.bt.SnapshotDependency;
-import org.apache.ignite.ci.teamcity.ignited.IStringCompactor;
+import org.apache.ignite.tcbot.persistence.IStringCompactor;
 
 public class SnapshotDependencyCompacted {
     /** Id. */
diff --git a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/teamcity/ignited/change/ChangeCompacted.java b/tcbot-teamcity-ignited/src/main/java/org/apache/ignite/ci/teamcity/ignited/change/ChangeCompacted.java
similarity index 96%
rename from ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/teamcity/ignited/change/ChangeCompacted.java
rename to tcbot-teamcity-ignited/src/main/java/org/apache/ignite/ci/teamcity/ignited/change/ChangeCompacted.java
index fad5f58..0c114ba 100644
--- a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/teamcity/ignited/change/ChangeCompacted.java
+++ b/tcbot-teamcity-ignited/src/main/java/org/apache/ignite/ci/teamcity/ignited/change/ChangeCompacted.java
@@ -21,10 +21,12 @@ import java.util.Arrays;
 import java.util.Objects;
 import javax.annotation.Nullable;
 import javax.xml.bind.DatatypeConverter;
-import org.apache.ignite.ci.analysis.IVersionedEntity;
-import org.apache.ignite.ci.db.Persisted;
+
+
+import org.apache.ignite.tcbot.persistence.IVersionedEntity;
+import org.apache.ignite.tcbot.persistence.Persisted;
 import org.apache.ignite.tcservice.model.changes.Change;
-import org.apache.ignite.ci.teamcity.ignited.IStringCompactor;
+import org.apache.ignite.tcbot.persistence.IStringCompactor;
 import org.apache.ignite.ci.teamcity.ignited.fatbuild.FatBuildDao;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
diff --git a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/teamcity/ignited/change/ChangeDao.java b/tcbot-teamcity-ignited/src/main/java/org/apache/ignite/ci/teamcity/ignited/change/ChangeDao.java
similarity index 93%
rename from ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/teamcity/ignited/change/ChangeDao.java
rename to tcbot-teamcity-ignited/src/main/java/org/apache/ignite/ci/teamcity/ignited/change/ChangeDao.java
index d5cde84..e75c365 100644
--- a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/teamcity/ignited/change/ChangeDao.java
+++ b/tcbot-teamcity-ignited/src/main/java/org/apache/ignite/ci/teamcity/ignited/change/ChangeDao.java
@@ -24,9 +24,9 @@ import javax.inject.Inject;
 import javax.inject.Provider;
 import org.apache.ignite.Ignite;
 import org.apache.ignite.IgniteCache;
-import org.apache.ignite.ci.db.TcHelperDb;
 import org.apache.ignite.tcbot.common.interceptor.AutoProfiling;
-import org.apache.ignite.ci.teamcity.ignited.IStringCompactor;
+import org.apache.ignite.tcbot.persistence.CacheConfigs;
+import org.apache.ignite.tcbot.persistence.IStringCompactor;
 import org.apache.ignite.configuration.CacheConfiguration;
 
 public class ChangeDao {
@@ -44,7 +44,7 @@ public class ChangeDao {
 
     /** */
     public void init() {
-        CacheConfiguration<Long, ChangeCompacted> cfg = TcHelperDb.getCacheV2Config(TEAMCITY_CHANGE_CACHE_NAME);
+        CacheConfiguration<Long, ChangeCompacted> cfg = CacheConfigs.getCacheV2Config(TEAMCITY_CHANGE_CACHE_NAME);
 
         changesCache = igniteProvider.get().getOrCreateCache(cfg);
     }
diff --git a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/teamcity/ignited/change/ChangeSync.java b/tcbot-teamcity-ignited/src/main/java/org/apache/ignite/ci/teamcity/ignited/change/ChangeSync.java
similarity index 96%
rename from ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/teamcity/ignited/change/ChangeSync.java
rename to tcbot-teamcity-ignited/src/main/java/org/apache/ignite/ci/teamcity/ignited/change/ChangeSync.java
index 9ac9adf..79cddef 100644
--- a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/teamcity/ignited/change/ChangeSync.java
+++ b/tcbot-teamcity-ignited/src/main/java/org/apache/ignite/ci/teamcity/ignited/change/ChangeSync.java
@@ -19,14 +19,14 @@ package org.apache.ignite.ci.teamcity.ignited.change;
 import com.google.common.base.Throwables;
 import org.apache.ignite.tcbot.common.interceptor.AutoProfiling;
 import org.apache.ignite.tcservice.model.changes.Change;
-import org.apache.ignite.ci.teamcity.ignited.IStringCompactor;
+import org.apache.ignite.tcbot.persistence.IStringCompactor;
 import org.apache.ignite.tcservice.ITeamcityConn;
 import org.apache.ignite.tcbot.common.exeption.ExceptionUtil;
-import org.jetbrains.annotations.NotNull;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.xml.sax.SAXParseException;
 
+import javax.annotation.Nonnull;
 import javax.inject.Inject;
 import java.io.FileNotFoundException;
 
@@ -48,7 +48,7 @@ public class ChangeSync {
         return reloadChange(srvId, changeId, conn);
     }
 
-    @NotNull
+    @Nonnull
     @AutoProfiling
     public ChangeCompacted reloadChange(int srvId, int changeId, ITeamcityConn conn) {
         Change change;
diff --git a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/teamcity/ignited/change/RevisionCompacted.java b/tcbot-teamcity-ignited/src/main/java/org/apache/ignite/ci/teamcity/ignited/change/RevisionCompacted.java
similarity index 96%
rename from ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/teamcity/ignited/change/RevisionCompacted.java
rename to tcbot-teamcity-ignited/src/main/java/org/apache/ignite/ci/teamcity/ignited/change/RevisionCompacted.java
index a34f4f4..6b3e8e4 100644
--- a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/teamcity/ignited/change/RevisionCompacted.java
+++ b/tcbot-teamcity-ignited/src/main/java/org/apache/ignite/ci/teamcity/ignited/change/RevisionCompacted.java
@@ -21,11 +21,11 @@ import java.util.Arrays;
 import java.util.Objects;
 import javax.annotation.Nullable;
 import javax.xml.bind.DatatypeConverter;
-import org.apache.ignite.ci.analysis.IVersionedEntity;
-import org.apache.ignite.ci.db.Persisted;
+import org.apache.ignite.tcbot.persistence.IVersionedEntity;
+import org.apache.ignite.tcbot.persistence.Persisted;
 import org.apache.ignite.tcservice.model.vcs.Revision;
 import org.apache.ignite.tcservice.model.vcs.VcsRootInstance;
-import org.apache.ignite.ci.teamcity.ignited.IStringCompactor;
+import org.apache.ignite.tcbot.persistence.IStringCompactor;
 import org.apache.ignite.ci.teamcity.ignited.fatbuild.FatBuildDao;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
diff --git a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/teamcity/ignited/fatbuild/FatBuildCompacted.java b/tcbot-teamcity-ignited/src/main/java/org/apache/ignite/ci/teamcity/ignited/fatbuild/FatBuildCompacted.java
similarity index 98%
rename from ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/teamcity/ignited/fatbuild/FatBuildCompacted.java
rename to tcbot-teamcity-ignited/src/main/java/org/apache/ignite/ci/teamcity/ignited/fatbuild/FatBuildCompacted.java
index 329c93f..e8a9d27 100644
--- a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/teamcity/ignited/fatbuild/FatBuildCompacted.java
+++ b/tcbot-teamcity-ignited/src/main/java/org/apache/ignite/ci/teamcity/ignited/fatbuild/FatBuildCompacted.java
@@ -30,9 +30,10 @@ import java.util.concurrent.atomic.AtomicBoolean;
 import java.util.function.BiPredicate;
 import java.util.stream.Collectors;
 import java.util.stream.Stream;
+
+import org.apache.ignite.tcbot.persistence.IVersionedEntity;
+import org.apache.ignite.tcbot.persistence.Persisted;
 import org.apache.ignite.tcservice.ITeamcity;
-import org.apache.ignite.ci.analysis.IVersionedEntity;
-import org.apache.ignite.ci.db.Persisted;
 import org.apache.ignite.tcservice.model.conf.BuildType;
 import org.apache.ignite.tcservice.model.conf.bt.Parameters;
 import org.apache.ignite.tcservice.model.conf.bt.Property;
@@ -49,13 +50,14 @@ import org.apache.ignite.tcservice.model.vcs.Revision;
 import org.apache.ignite.tcservice.model.vcs.Revisions;
 import org.apache.ignite.tcservice.model.vcs.VcsRootInstance;
 import org.apache.ignite.ci.teamcity.ignited.BuildRefCompacted;
-import org.apache.ignite.ci.teamcity.ignited.IStringCompactor;
+import org.apache.ignite.tcbot.persistence.IStringCompactor;
 import org.apache.ignite.ci.teamcity.ignited.buildtype.ParametersCompacted;
 import org.apache.ignite.ci.teamcity.ignited.change.RevisionCompacted;
 import org.apache.ignite.ci.teamcity.ignited.runhist.Invocation;
 import org.apache.ignite.ci.teamcity.ignited.runhist.InvocationData;
-import org.jetbrains.annotations.NotNull;
-import org.jetbrains.annotations.Nullable;
+
+import javax.annotation.Nonnull;
+import javax.annotation.Nullable;
 
 /**
  * Composed data from {@link Build} and other classes, compressed for storage.
@@ -541,7 +543,7 @@ public class FatBuildCompacted extends BuildRefCompacted implements IVersionedEn
     }
 
     public void addProblems(IStringCompactor compactor,
-                            @NotNull List<ProblemOccurrence> occurrences) {
+                            @Nonnull List<ProblemOccurrence> occurrences) {
         if (occurrences.isEmpty())
             return;
 
@@ -655,6 +657,7 @@ public class FatBuildCompacted extends BuildRefCompacted implements IVersionedEn
                 if (paramsFilter.test(k, v))
                     importantParms.put(k, v);
             });
+            //todo save parameters
         }
 
         return invocation;
diff --git a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/teamcity/ignited/fatbuild/FatBuildDao.java b/tcbot-teamcity-ignited/src/main/java/org/apache/ignite/ci/teamcity/ignited/fatbuild/FatBuildDao.java
similarity index 93%
rename from ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/teamcity/ignited/fatbuild/FatBuildDao.java
rename to tcbot-teamcity-ignited/src/main/java/org/apache/ignite/ci/teamcity/ignited/fatbuild/FatBuildDao.java
index dc29eba..dd341e8 100644
--- a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/teamcity/ignited/fatbuild/FatBuildDao.java
+++ b/tcbot-teamcity-ignited/src/main/java/org/apache/ignite/ci/teamcity/ignited/fatbuild/FatBuildDao.java
@@ -26,21 +26,21 @@ import java.util.Set;
 import java.util.stream.Collectors;
 import java.util.stream.Stream;
 import java.util.stream.StreamSupport;
+import javax.annotation.Nonnull;
 import javax.annotation.Nullable;
 import javax.cache.Cache;
 import javax.inject.Inject;
 import javax.inject.Provider;
-import javax.validation.constraints.NotNull;
 import org.apache.ignite.Ignite;
 import org.apache.ignite.IgniteCache;
-import org.apache.ignite.ci.db.TcHelperDb;
 import org.apache.ignite.tcbot.common.interceptor.AutoProfiling;
+import org.apache.ignite.tcbot.persistence.CacheConfigs;
 import org.apache.ignite.tcservice.model.changes.ChangesList;
 import org.apache.ignite.tcservice.model.result.Build;
 import org.apache.ignite.tcservice.model.result.problems.ProblemOccurrence;
 import org.apache.ignite.tcservice.model.result.stat.Statistics;
 import org.apache.ignite.tcservice.model.result.tests.TestOccurrencesFull;
-import org.apache.ignite.ci.teamcity.ignited.IStringCompactor;
+import org.apache.ignite.tcbot.persistence.IStringCompactor;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
@@ -67,7 +67,7 @@ public class FatBuildDao {
      *
      */
     public FatBuildDao init() {
-        buildsCache = igniteProvider.get().getOrCreateCache(TcHelperDb.getCacheV2Config(TEAMCITY_FAT_BUILD_CACHE_NAME));
+        buildsCache = igniteProvider.get().getOrCreateCache(CacheConfigs.getCacheV2Config(TEAMCITY_FAT_BUILD_CACHE_NAME));
 
         return this;
     }
@@ -85,8 +85,8 @@ public class FatBuildDao {
      */
     @Nullable public FatBuildCompacted saveBuild(int srvIdMaskHigh,
                                        int buildId,
-                                       @NotNull Build build,
-                                       @NotNull List<TestOccurrencesFull> tests,
+                                       @Nonnull Build build,
+                                       @Nonnull List<TestOccurrencesFull> tests,
                                        @Nullable List<ProblemOccurrence> problems,
                                        @Nullable Statistics statistics,
                                        @Nullable ChangesList changesList,
@@ -122,7 +122,7 @@ public class FatBuildDao {
         buildsCache.put(buildIdToCacheKey(srvIdMaskHigh, buildId), newBuild);
     }
 
-    public static int[] extractChangeIds(@NotNull ChangesList changesList) {
+    public static int[] extractChangeIds(@Nonnull ChangesList changesList) {
         return changesList.changes().stream().mapToInt(
                         ch -> {
                             try {
diff --git a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/teamcity/ignited/fatbuild/ProactiveFatBuildSync.java b/tcbot-teamcity-ignited/src/main/java/org/apache/ignite/ci/teamcity/ignited/fatbuild/ProactiveFatBuildSync.java
similarity index 97%
rename from ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/teamcity/ignited/fatbuild/ProactiveFatBuildSync.java
rename to tcbot-teamcity-ignited/src/main/java/org/apache/ignite/ci/teamcity/ignited/fatbuild/ProactiveFatBuildSync.java
index 8739a62..b0925e3 100644
--- a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/teamcity/ignited/fatbuild/ProactiveFatBuildSync.java
+++ b/tcbot-teamcity-ignited/src/main/java/org/apache/ignite/ci/teamcity/ignited/fatbuild/ProactiveFatBuildSync.java
@@ -20,8 +20,8 @@ import com.google.common.base.Strings;
 import com.google.common.base.Throwables;
 import java.util.stream.Stream;
 import org.apache.ignite.tcbot.common.interceptor.AutoProfiling;
-import org.apache.ignite.ci.di.MonitoredTask;
-import org.apache.ignite.ci.di.scheduler.IScheduler;
+import org.apache.ignite.tcbot.common.interceptor.MonitoredTask;
+import org.apache.ignite.tcbot.persistence.scheduler.IScheduler;
 import org.apache.ignite.tcservice.model.changes.ChangesList;
 import org.apache.ignite.tcservice.model.result.Build;
 import org.apache.ignite.tcservice.model.result.problems.ProblemOccurrence;
@@ -29,19 +29,19 @@ import org.apache.ignite.tcservice.model.result.stat.Statistics;
 import org.apache.ignite.tcservice.model.result.tests.TestOccurrencesFull;
 import org.apache.ignite.ci.teamcity.ignited.BuildRefCompacted;
 import org.apache.ignite.ci.teamcity.ignited.buildref.BuildRefDao;
-import org.apache.ignite.ci.teamcity.ignited.IStringCompactor;
-import org.apache.ignite.ci.teamcity.ignited.ITeamcityIgnited;
-import org.apache.ignite.ci.teamcity.ignited.SyncMode;
+import org.apache.ignite.tcbot.persistence.IStringCompactor;
+import org.apache.ignite.tcignited.ITeamcityIgnited;
+import org.apache.ignite.tcignited.SyncMode;
 import org.apache.ignite.ci.teamcity.ignited.change.ChangeSync;
 import org.apache.ignite.ci.teamcity.ignited.runhist.RunHistSync;
 import org.apache.ignite.tcservice.ITeamcityConn;
 import org.apache.ignite.tcbot.common.exeption.ExceptionUtil;
 import org.apache.ignite.tcbot.common.exeption.ServiceConflictException;
 import org.apache.ignite.internal.util.GridConcurrentHashSet;
-import org.jetbrains.annotations.NotNull;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
+import javax.annotation.Nonnull;
 import javax.annotation.Nullable;
 import javax.annotation.concurrent.GuardedBy;
 import javax.inject.Inject;
@@ -116,7 +116,7 @@ public class ProactiveFatBuildSync {
 
     }
 
-    @NotNull
+    @Nonnull
     public synchronized SyncTask getSyncTask(ITeamcityConn conn) {
         final SyncTask syncTask = buildToLoad.computeIfAbsent(conn.serverCode(), s -> new SyncTask());
 
@@ -232,7 +232,7 @@ public class ProactiveFatBuildSync {
         return "Builds updated " + ld.get() + " from " + load.size() + " requested, errors: " + err;
     }
 
-    @NotNull
+    @Nonnull
     private String taskName(String taskName, String srvName) {
         return ProactiveFatBuildSync.class.getSimpleName() +"." + taskName + "." + srvName;
     }
@@ -425,7 +425,7 @@ public class ProactiveFatBuildSync {
     }
 
     @Nullable
-    public FatBuildCompacted transformV5Build(int srvIdMask, int buildId, @NotNull FatBuildCompacted existingBuild) {
+    public FatBuildCompacted transformV5Build(int srvIdMask, int buildId, @Nonnull FatBuildCompacted existingBuild) {
         if (Objects.equals(buildId, existingBuild.id())) {
             existingBuild.setVersion(FatBuildCompacted.LATEST_VERSION);
 
diff --git a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/teamcity/ignited/fatbuild/ProblemCompacted.java b/tcbot-teamcity-ignited/src/main/java/org/apache/ignite/ci/teamcity/ignited/fatbuild/ProblemCompacted.java
similarity index 99%
rename from ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/teamcity/ignited/fatbuild/ProblemCompacted.java
rename to tcbot-teamcity-ignited/src/main/java/org/apache/ignite/ci/teamcity/ignited/fatbuild/ProblemCompacted.java
index fc1a73f..0ee2faf 100644
--- a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/teamcity/ignited/fatbuild/ProblemCompacted.java
+++ b/tcbot-teamcity-ignited/src/main/java/org/apache/ignite/ci/teamcity/ignited/fatbuild/ProblemCompacted.java
@@ -22,7 +22,7 @@ import com.google.common.base.Objects;
 import com.google.common.base.Strings;
 import org.apache.ignite.tcservice.model.hist.BuildRef;
 import org.apache.ignite.tcservice.model.result.problems.ProblemOccurrence;
-import org.apache.ignite.ci.teamcity.ignited.IStringCompactor;
+import org.apache.ignite.tcbot.persistence.IStringCompactor;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
diff --git a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/teamcity/ignited/fatbuild/StatisticsCompacted.java b/tcbot-teamcity-ignited/src/main/java/org/apache/ignite/ci/teamcity/ignited/fatbuild/StatisticsCompacted.java
similarity index 97%
rename from ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/teamcity/ignited/fatbuild/StatisticsCompacted.java
rename to tcbot-teamcity-ignited/src/main/java/org/apache/ignite/ci/teamcity/ignited/fatbuild/StatisticsCompacted.java
index 9388fc6..12a0f67 100644
--- a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/teamcity/ignited/fatbuild/StatisticsCompacted.java
+++ b/tcbot-teamcity-ignited/src/main/java/org/apache/ignite/ci/teamcity/ignited/fatbuild/StatisticsCompacted.java
@@ -19,10 +19,11 @@ package org.apache.ignite.ci.teamcity.ignited.fatbuild;
 
 import com.google.common.base.Strings;
 import java.util.List;
-import org.apache.ignite.ci.db.Persisted;
+
+import org.apache.ignite.tcbot.persistence.Persisted;
 import org.apache.ignite.tcservice.model.conf.bt.Property;
 import org.apache.ignite.tcservice.model.result.stat.Statistics;
-import org.apache.ignite.ci.teamcity.ignited.IStringCompactor;
+import org.apache.ignite.tcbot.persistence.IStringCompactor;
 import org.apache.ignite.internal.util.GridIntList;
 import org.apache.ignite.internal.util.GridLongList;
 import org.slf4j.Logger;
diff --git a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/teamcity/ignited/fatbuild/TestCompacted.java b/tcbot-teamcity-ignited/src/main/java/org/apache/ignite/ci/teamcity/ignited/fatbuild/TestCompacted.java
similarity index 99%
rename from ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/teamcity/ignited/fatbuild/TestCompacted.java
rename to tcbot-teamcity-ignited/src/main/java/org/apache/ignite/ci/teamcity/ignited/fatbuild/TestCompacted.java
index 633e2de..053d4db 100644
--- a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/teamcity/ignited/fatbuild/TestCompacted.java
+++ b/tcbot-teamcity-ignited/src/main/java/org/apache/ignite/ci/teamcity/ignited/fatbuild/TestCompacted.java
@@ -26,20 +26,22 @@ import java.util.BitSet;
 import java.util.Objects;
 import java.util.TreeMap;
 import java.util.function.BiPredicate;
+
 import org.apache.ignite.ci.tcbot.common.StringFieldCompacted;
 import org.apache.ignite.tcservice.model.hist.BuildRef;
 import org.apache.ignite.tcservice.model.result.tests.TestOccurrence;
 import org.apache.ignite.tcservice.model.result.tests.TestOccurrenceFull;
 import org.apache.ignite.tcservice.model.result.tests.TestRef;
-import org.apache.ignite.ci.teamcity.ignited.IStringCompactor;
+import org.apache.ignite.tcbot.persistence.IStringCompactor;
 import org.apache.ignite.ci.teamcity.ignited.buildtype.ParametersCompacted;
 import org.apache.ignite.ci.teamcity.ignited.runhist.Invocation;
 import org.apache.ignite.ci.teamcity.ignited.runhist.InvocationData;
-import org.jetbrains.annotations.Nullable;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.xerial.snappy.Snappy;
 
+import javax.annotation.Nullable;
+
 /**
  *
  */
@@ -71,7 +73,8 @@ public class TestCompacted {
     private int actualBuildId = -1;
 
     /** Uncompressesd/ZIP/Snappy compressed test log Details. */
-    @Nullable private byte[] details;
+    @Nullable
+    private byte[] details;
 
     /** Logger. */
     private static final Logger logger = LoggerFactory.getLogger(TestCompacted.class);
diff --git a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/teamcity/ignited/fatbuild/TriggeredCompacted.java b/tcbot-teamcity-ignited/src/main/java/org/apache/ignite/ci/teamcity/ignited/fatbuild/TriggeredCompacted.java
similarity index 100%
rename from ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/teamcity/ignited/fatbuild/TriggeredCompacted.java
rename to tcbot-teamcity-ignited/src/main/java/org/apache/ignite/ci/teamcity/ignited/fatbuild/TriggeredCompacted.java
diff --git a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/teamcity/ignited/mute/MuteDao.java b/tcbot-teamcity-ignited/src/main/java/org/apache/ignite/ci/teamcity/ignited/mute/MuteDao.java
similarity index 94%
rename from ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/teamcity/ignited/mute/MuteDao.java
rename to tcbot-teamcity-ignited/src/main/java/org/apache/ignite/ci/teamcity/ignited/mute/MuteDao.java
index cceab39..e8c2401 100644
--- a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/teamcity/ignited/mute/MuteDao.java
+++ b/tcbot-teamcity-ignited/src/main/java/org/apache/ignite/ci/teamcity/ignited/mute/MuteDao.java
@@ -27,10 +27,10 @@ import javax.inject.Inject;
 import javax.inject.Provider;
 import org.apache.ignite.Ignite;
 import org.apache.ignite.IgniteCache;
-import org.apache.ignite.ci.db.TcHelperDb;
 import org.apache.ignite.tcbot.common.interceptor.AutoProfiling;
+import org.apache.ignite.tcbot.persistence.CacheConfigs;
 import org.apache.ignite.tcservice.model.mute.MuteInfo;
-import org.apache.ignite.ci.teamcity.ignited.IStringCompactor;
+import org.apache.ignite.tcbot.persistence.IStringCompactor;
 import org.apache.ignite.internal.util.typedef.F;
 import org.apache.ignite.internal.util.typedef.internal.U;
 
@@ -54,7 +54,7 @@ public class MuteDao {
      *
      */
     public void init() {
-        muteCache = igniteProvider.get().getOrCreateCache(TcHelperDb.getCacheV2Config(TEAMCITY_MUTE_CACHE_NAME));
+        muteCache = igniteProvider.get().getOrCreateCache(CacheConfigs.getCacheV2Config(TEAMCITY_MUTE_CACHE_NAME));
     }
 
     /**
diff --git a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/teamcity/ignited/mute/MuteInfoCompacted.java b/tcbot-teamcity-ignited/src/main/java/org/apache/ignite/ci/teamcity/ignited/mute/MuteInfoCompacted.java
similarity index 98%
rename from ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/teamcity/ignited/mute/MuteInfoCompacted.java
rename to tcbot-teamcity-ignited/src/main/java/org/apache/ignite/ci/teamcity/ignited/mute/MuteInfoCompacted.java
index cfc3725..82e2703 100644
--- a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/teamcity/ignited/mute/MuteInfoCompacted.java
+++ b/tcbot-teamcity-ignited/src/main/java/org/apache/ignite/ci/teamcity/ignited/mute/MuteInfoCompacted.java
@@ -24,7 +24,7 @@ import org.apache.ignite.tcservice.model.mute.MuteAssignment;
 import org.apache.ignite.tcservice.model.mute.MuteInfo;
 import org.apache.ignite.tcservice.model.mute.MuteTarget;
 import org.apache.ignite.tcservice.model.result.tests.TestRef;
-import org.apache.ignite.ci.teamcity.ignited.IStringCompactor;
+import org.apache.ignite.tcbot.persistence.IStringCompactor;
 import org.apache.ignite.tcbot.common.util.TimeUtil;
 import org.apache.ignite.internal.util.typedef.F;
 
diff --git a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/teamcity/ignited/mute/MuteScopeCompacted.java b/tcbot-teamcity-ignited/src/main/java/org/apache/ignite/ci/teamcity/ignited/mute/MuteScopeCompacted.java
similarity index 97%
rename from ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/teamcity/ignited/mute/MuteScopeCompacted.java
rename to tcbot-teamcity-ignited/src/main/java/org/apache/ignite/ci/teamcity/ignited/mute/MuteScopeCompacted.java
index 51ea944..ffaf473 100644
--- a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/teamcity/ignited/mute/MuteScopeCompacted.java
+++ b/tcbot-teamcity-ignited/src/main/java/org/apache/ignite/ci/teamcity/ignited/mute/MuteScopeCompacted.java
@@ -22,7 +22,7 @@ import java.util.List;
 import org.apache.ignite.tcservice.model.conf.BuildType;
 import org.apache.ignite.tcservice.model.conf.Project;
 import org.apache.ignite.tcservice.model.mute.MuteScope;
-import org.apache.ignite.ci.teamcity.ignited.IStringCompactor;
+import org.apache.ignite.tcbot.persistence.IStringCompactor;
 import org.apache.ignite.ci.teamcity.ignited.buildtype.BuildTypeRefCompacted;
 import org.apache.ignite.internal.util.typedef.F;
 
diff --git a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/teamcity/ignited/mute/MuteSync.java b/tcbot-teamcity-ignited/src/main/java/org/apache/ignite/ci/teamcity/ignited/mute/MuteSync.java
similarity index 96%
rename from ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/teamcity/ignited/mute/MuteSync.java
rename to tcbot-teamcity-ignited/src/main/java/org/apache/ignite/ci/teamcity/ignited/mute/MuteSync.java
index 591d51c..df4ed73 100644
--- a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/teamcity/ignited/mute/MuteSync.java
+++ b/tcbot-teamcity-ignited/src/main/java/org/apache/ignite/ci/teamcity/ignited/mute/MuteSync.java
@@ -21,8 +21,9 @@ import java.util.SortedSet;
 import java.util.concurrent.TimeUnit;
 import java.util.concurrent.atomic.AtomicReference;
 import javax.inject.Inject;
-import org.apache.ignite.ci.di.MonitoredTask;
-import org.apache.ignite.ci.di.scheduler.IScheduler;
+
+import org.apache.ignite.tcbot.common.interceptor.MonitoredTask;
+import org.apache.ignite.tcbot.persistence.scheduler.IScheduler;
 import org.apache.ignite.tcservice.model.mute.MuteInfo;
 import org.apache.ignite.tcservice.ITeamcityConn;
 import org.apache.ignite.internal.util.typedef.F;
diff --git a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/teamcity/ignited/runhist/Invocation.java b/tcbot-teamcity-ignited/src/main/java/org/apache/ignite/ci/teamcity/ignited/runhist/Invocation.java
similarity index 97%
rename from ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/teamcity/ignited/runhist/Invocation.java
rename to tcbot-teamcity-ignited/src/main/java/org/apache/ignite/ci/teamcity/ignited/runhist/Invocation.java
index f3fbbe0..3f5edb6 100644
--- a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/teamcity/ignited/runhist/Invocation.java
+++ b/tcbot-teamcity-ignited/src/main/java/org/apache/ignite/ci/teamcity/ignited/runhist/Invocation.java
@@ -20,9 +20,12 @@ package org.apache.ignite.ci.teamcity.ignited.runhist;
 import com.google.common.base.MoreObjects;
 import com.google.common.base.Objects;
 import com.google.common.base.Preconditions;
+import org.apache.ignite.tcbot.persistence.Persisted;
+import org.apache.ignite.tcignited.history.ChangesState;
+
 import java.util.Map;
 import javax.annotation.Nullable;
-import org.apache.ignite.ci.db.Persisted;
+
 
 /**
  * Run history element: invocation of build or test.
diff --git a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/teamcity/ignited/runhist/InvocationData.java b/tcbot-teamcity-ignited/src/main/java/org/apache/ignite/ci/teamcity/ignited/runhist/InvocationData.java
similarity index 96%
rename from ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/teamcity/ignited/runhist/InvocationData.java
rename to tcbot-teamcity-ignited/src/main/java/org/apache/ignite/ci/teamcity/ignited/runhist/InvocationData.java
index 279aa9c..f02d286 100644
--- a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/teamcity/ignited/runhist/InvocationData.java
+++ b/tcbot-teamcity-ignited/src/main/java/org/apache/ignite/ci/teamcity/ignited/runhist/InvocationData.java
@@ -25,9 +25,12 @@ import java.util.Objects;
 import java.util.TreeMap;
 import java.util.stream.Collectors;
 import java.util.stream.Stream;
-import org.apache.ignite.ci.db.Persisted;
+
 import org.apache.ignite.internal.util.typedef.internal.U;
-import org.jetbrains.annotations.NotNull;
+import org.apache.ignite.tcbot.persistence.Persisted;
+import org.apache.ignite.tcignited.history.RunStatus;
+
+import javax.annotation.Nonnull;
 
 /**
  *
@@ -126,7 +129,7 @@ public class InvocationData {
     /**
      *
      */
-    @NotNull public Stream<Invocation> invocations() {
+    @Nonnull public Stream<Invocation> invocations() {
         return invocationMap.values()
             .stream()
             .filter(this::isActual);
diff --git a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/teamcity/ignited/runhist/RunHistCompacted.java b/tcbot-teamcity-ignited/src/main/java/org/apache/ignite/ci/teamcity/ignited/runhist/RunHistCompacted.java
similarity index 94%
rename from ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/teamcity/ignited/runhist/RunHistCompacted.java
rename to tcbot-teamcity-ignited/src/main/java/org/apache/ignite/ci/teamcity/ignited/runhist/RunHistCompacted.java
index 32259b0..75f5abc 100644
--- a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/teamcity/ignited/runhist/RunHistCompacted.java
+++ b/tcbot-teamcity-ignited/src/main/java/org/apache/ignite/ci/teamcity/ignited/runhist/RunHistCompacted.java
@@ -22,10 +22,13 @@ import java.util.List;
 import java.util.Objects;
 import java.util.stream.Collectors;
 import javax.annotation.Nullable;
-import org.apache.ignite.ci.analysis.IVersionedEntity;
-import org.apache.ignite.ci.db.Persisted;
-import org.apache.ignite.ci.issue.EventTemplate;
-import org.apache.ignite.ci.teamcity.ignited.IRunHistory;
+
+import org.apache.ignite.tcignited.history.ChangesState;
+import org.apache.ignite.tcignited.history.IEventTemplate;
+import org.apache.ignite.tcignited.history.IRunHistory;
+import org.apache.ignite.tcbot.persistence.IVersionedEntity;
+import org.apache.ignite.tcbot.persistence.Persisted;
+import org.apache.ignite.tcignited.history.RunStatus;
 
 /**
  *
@@ -132,7 +135,7 @@ public class RunHistCompacted implements IVersionedEntity, IRunHistory {
     }
 
     @Nullable
-    public Integer detectTemplate(EventTemplate t) {
+    public Integer detectTemplate(IEventTemplate t) {
         if (data == null)
             return null;
 
diff --git a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/teamcity/ignited/runhist/RunHistCompactedDao.java b/tcbot-teamcity-ignited/src/main/java/org/apache/ignite/ci/teamcity/ignited/runhist/RunHistCompactedDao.java
similarity index 91%
rename from ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/teamcity/ignited/runhist/RunHistCompactedDao.java
rename to tcbot-teamcity-ignited/src/main/java/org/apache/ignite/ci/teamcity/ignited/runhist/RunHistCompactedDao.java
index c99af4d..1891e97 100644
--- a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/teamcity/ignited/runhist/RunHistCompactedDao.java
+++ b/tcbot-teamcity-ignited/src/main/java/org/apache/ignite/ci/teamcity/ignited/runhist/RunHistCompactedDao.java
@@ -20,6 +20,8 @@ package org.apache.ignite.ci.teamcity.ignited.runhist;
 import java.util.Collections;
 import java.util.List;
 import java.util.concurrent.atomic.AtomicInteger;
+import javax.annotation.Nonnull;
+import javax.annotation.Nullable;
 import javax.cache.Cache;
 import javax.cache.processor.MutableEntry;
 import javax.inject.Inject;
@@ -30,15 +32,13 @@ import org.apache.ignite.IgniteCluster;
 import org.apache.ignite.cache.QueryEntity;
 import org.apache.ignite.cache.query.QueryCursor;
 import org.apache.ignite.cache.query.SqlQuery;
-import org.apache.ignite.ci.db.TcHelperDb;
 import org.apache.ignite.tcbot.common.interceptor.AutoProfiling;
-import org.apache.ignite.ci.di.cache.GuavaCached;
-import org.apache.ignite.ci.teamcity.ignited.IRunHistory;
-import org.apache.ignite.ci.teamcity.ignited.IRunStat;
-import org.apache.ignite.ci.teamcity.ignited.IStringCompactor;
+import org.apache.ignite.tcignited.history.IRunHistory;
+import org.apache.ignite.tcignited.history.IRunStat;
+import org.apache.ignite.tcbot.persistence.IStringCompactor;
 import org.apache.ignite.configuration.CacheConfiguration;
-import org.jetbrains.annotations.NotNull;
-import org.jetbrains.annotations.Nullable;
+import org.apache.ignite.tcbot.common.interceptor.GuavaCached;
+import org.apache.ignite.tcbot.persistence.CacheConfigs;
 
 import static org.apache.ignite.ci.teamcity.ignited.runhist.RunHistSync.normalizeBranch;
 
@@ -77,19 +77,19 @@ public class RunHistCompactedDao {
     public void init() {
         Ignite ignite = igniteProvider.get();
 
-        final CacheConfiguration<RunHistKey, RunHistCompacted> cfg = TcHelperDb.getCacheV2Config(TEST_HIST_CACHE_NAME);
+        final CacheConfiguration<RunHistKey, RunHistCompacted> cfg = CacheConfigs.getCacheV2Config(TEST_HIST_CACHE_NAME);
 
         cfg.setQueryEntities(Collections.singletonList(new QueryEntity(RunHistKey.class, RunHistCompacted.class)));
 
         testHistCache = ignite.getOrCreateCache(cfg);
 
-        final CacheConfiguration<RunHistKey, RunHistCompacted> cfg2 = TcHelperDb.getCache8PartsConfig(SUITE_HIST_CACHE_NAME);
+        final CacheConfiguration<RunHistKey, RunHistCompacted> cfg2 = CacheConfigs.getCache8PartsConfig(SUITE_HIST_CACHE_NAME);
 
         cfg2.setQueryEntities(Collections.singletonList(new QueryEntity(RunHistKey.class, RunHistCompacted.class)));
 
         suiteHistCache = ignite.getOrCreateCache(cfg2);
 
-        buildStartTime = ignite.getOrCreateCache(TcHelperDb.getCacheV2Config(BUILD_START_TIME_CACHE_NAME));
+        buildStartTime = ignite.getOrCreateCache(CacheConfigs.getCacheV2Config(BUILD_START_TIME_CACHE_NAME));
     }
 
     @GuavaCached(maximumSize = 200, expireAfterAccessSecs = 30, softValues = true)
@@ -151,7 +151,7 @@ public class RunHistCompactedDao {
         return suiteHistCache.invoke(histKey, RunHistCompactedDao::processEntry, list);
     }
 
-    @NotNull public static Integer processEntry(MutableEntry<RunHistKey, RunHistCompacted> entry, Object[] parms) {
+    @Nonnull public static Integer processEntry(MutableEntry<RunHistKey, RunHistCompacted> entry, Object[] parms) {
         int cnt = 0;
 
         RunHistCompacted hist = entry.getValue();
diff --git a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/teamcity/ignited/runhist/RunHistKey.java b/tcbot-teamcity-ignited/src/main/java/org/apache/ignite/ci/teamcity/ignited/runhist/RunHistKey.java
similarity index 100%
rename from ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/teamcity/ignited/runhist/RunHistKey.java
rename to tcbot-teamcity-ignited/src/main/java/org/apache/ignite/ci/teamcity/ignited/runhist/RunHistKey.java
diff --git a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/teamcity/ignited/runhist/RunHistSync.java b/tcbot-teamcity-ignited/src/main/java/org/apache/ignite/ci/teamcity/ignited/runhist/RunHistSync.java
similarity index 93%
rename from ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/teamcity/ignited/runhist/RunHistSync.java
rename to tcbot-teamcity-ignited/src/main/java/org/apache/ignite/ci/teamcity/ignited/runhist/RunHistSync.java
index 1e4e197..99708c5 100644
--- a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/teamcity/ignited/runhist/RunHistSync.java
+++ b/tcbot-teamcity-ignited/src/main/java/org/apache/ignite/ci/teamcity/ignited/runhist/RunHistSync.java
@@ -23,30 +23,29 @@ import java.util.HashMap;
 import java.util.HashSet;
 import java.util.List;
 import java.util.Map;
-import java.util.Objects;
 import java.util.Set;
 import java.util.concurrent.ThreadLocalRandom;
 import java.util.concurrent.TimeUnit;
 import java.util.concurrent.atomic.AtomicInteger;
 import java.util.function.BiPredicate;
 import java.util.stream.Collectors;
+import javax.annotation.Nonnull;
+import javax.annotation.Nullable;
 import javax.annotation.concurrent.GuardedBy;
 import javax.inject.Inject;
+
+import org.apache.ignite.tcbot.common.conf.ITcServerConfigSupplier;
+import org.apache.ignite.tcbot.common.interceptor.MonitoredTask;
+import org.apache.ignite.tcbot.persistence.scheduler.IScheduler;
 import org.apache.ignite.tcservice.ITeamcity;
 import org.apache.ignite.tcbot.common.conf.IBuildParameterSpec;
 import org.apache.ignite.tcbot.common.interceptor.AutoProfiling;
-import org.apache.ignite.ci.di.MonitoredTask;
-import org.apache.ignite.ci.di.scheduler.IScheduler;
 import org.apache.ignite.tcbot.common.conf.TcBotSystemProperties;
-import org.apache.ignite.ci.tcbot.conf.ChainAtServerTracked;
-import org.apache.ignite.ci.tcbot.conf.ITcBotConfig;
-import org.apache.ignite.ci.teamcity.ignited.IStringCompactor;
-import org.apache.ignite.ci.teamcity.ignited.ITeamcityIgnited;
+import org.apache.ignite.tcbot.persistence.IStringCompactor;
+import org.apache.ignite.tcignited.ITeamcityIgnited;
 import org.apache.ignite.ci.teamcity.ignited.buildref.BuildRefDao;
 import org.apache.ignite.ci.teamcity.ignited.fatbuild.FatBuildCompacted;
 import org.apache.ignite.ci.teamcity.ignited.fatbuild.FatBuildDao;
-import org.jetbrains.annotations.NotNull;
-import org.jetbrains.annotations.Nullable;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
@@ -75,7 +74,7 @@ public class RunHistSync {
     @Inject private FatBuildDao fatBuildDao;
 
     /** Config. */
-    @Inject private ITcBotConfig cfg;
+    @Inject private ITcServerConfigSupplier cfg;
 
     /** Build to save to history. */
     @GuardedBy("this")
@@ -84,7 +83,8 @@ public class RunHistSync {
     /**
      * @param branchName Branch name.
      */
-    @NotNull public static String normalizeBranch(@Nullable String branchName) {
+    @Nonnull
+    public static String normalizeBranch(@Nullable String branchName) {
         String branch = branchName == null ? ITeamcity.DEFAULT : branchName;
 
         if (ITeamcity.REFS_HEADS_MASTER.equals(branch))
@@ -154,13 +154,16 @@ public class RunHistSync {
         }
     }
 
-    @NotNull public Set<Integer> getFilteringParameters(String srvCode) {
-        Set<String> importantParameters = cfg.getTrackedBranches().getBranches().stream().flatMap(
+    @Nonnull public Set<Integer> getFilteringParameters(String srvCode) {
+        Set<String> importantParameters = new HashSet<>();
+
+        //is it really needed to take tracked branches triggering into history?
+        /*cfg.getTrackedBranches().getBranches().stream().flatMap(
             b -> b.getChainsStream()
                 .filter(ChainAtServerTracked::isTriggerBuild)
                 .filter(chain -> Objects.equals(chain.getServerId(), srvCode))
                 .flatMap(ChainAtServerTracked::buildParametersKeys)
-        ).collect(Collectors.toSet());
+        ).collect(Collectors.toSet());*/
 
         cfg.getTeamcityConfig(srvCode)
             .filteringParameters()
@@ -193,7 +196,7 @@ public class RunHistSync {
     }
 
     @AutoProfiling
-    @NotNull protected String saveInvocationsMap(
+    @Nonnull protected String saveInvocationsMap(
         Map<RunHistKey, List<Invocation>> buildsSaveThisRun,
         Map<RunHistKey, List<Invocation>> testsSaveThisRun) {
 
@@ -291,7 +294,7 @@ public class RunHistSync {
             () -> findMissingHistFromBuildRef(srvName), 12, TimeUnit.HOURS);
     }
 
-    @NotNull
+    @Nonnull
     private String taskName(String taskName, String srvName) {
         return RunHistSync.class.getSimpleName() + "." + taskName + "." + srvName;
     }
diff --git a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/teamcity/ignited/ITeamcityIgnited.java b/tcbot-teamcity-ignited/src/main/java/org/apache/ignite/tcignited/ITeamcityIgnited.java
similarity index 93%
rename from ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/teamcity/ignited/ITeamcityIgnited.java
rename to tcbot-teamcity-ignited/src/main/java/org/apache/ignite/tcignited/ITeamcityIgnited.java
index e9d0c7c..17c8248 100644
--- a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/teamcity/ignited/ITeamcityIgnited.java
+++ b/tcbot-teamcity-ignited/src/main/java/org/apache/ignite/tcignited/ITeamcityIgnited.java
@@ -14,7 +14,7 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-package org.apache.ignite.ci.teamcity.ignited;
+package org.apache.ignite.tcignited;
 
 import com.google.common.base.Strings;
 
@@ -26,10 +26,13 @@ import java.util.List;
 import java.util.Optional;
 import java.util.Set;
 import java.util.concurrent.CompletableFuture;
+import javax.annotation.Nonnull;
 import javax.annotation.Nullable;
-import org.apache.ignite.ci.analysis.SuiteInBranch;
-import org.apache.ignite.ci.analysis.TestInBranch;
+
+import org.apache.ignite.ci.teamcity.ignited.BuildRefCompacted;
 import org.apache.ignite.tcbot.common.conf.ITcServerConfig;
+import org.apache.ignite.tcignited.history.IRunHistory;
+import org.apache.ignite.tcignited.history.IRunStat;
 import org.apache.ignite.tcservice.model.agent.Agent;
 import org.apache.ignite.tcservice.model.mute.MuteInfo;
 import org.apache.ignite.tcservice.model.result.Build;
@@ -39,8 +42,6 @@ import org.apache.ignite.ci.teamcity.ignited.buildtype.BuildTypeRefCompacted;
 import org.apache.ignite.ci.teamcity.ignited.change.ChangeCompacted;
 import org.apache.ignite.ci.teamcity.ignited.change.RevisionCompacted;
 import org.apache.ignite.ci.teamcity.ignited.fatbuild.FatBuildCompacted;
-import org.apache.ignite.ci.user.ICredentialsProv;
-import org.jetbrains.annotations.NotNull;
 
 /**
  *
@@ -82,10 +83,9 @@ public interface ITeamcityIgnited {
 
     /**
      * @param projectId Project id.
-     * @param creds Credentials.
      * @return Mutes for associated server and given project pair.
      */
-    public Set<MuteInfo> getMutes(String projectId, ICredentialsProv creds);
+    public Set<MuteInfo> getMutes(String projectId);
 
     /**
      * Return all builds for branch and suite with finish status.
@@ -169,7 +169,7 @@ public interface ITeamcityIgnited {
      * @param branchForTc Branch for tc.
      * @param cnt Count.
      */
-    @NotNull public List<Integer> getLastNBuildsFromHistory(String btId, String branchForTc, int cnt);
+    @Nonnull public List<Integer> getLastNBuildsFromHistory(String btId, String branchForTc, int cnt);
 
     /**
      * Return list of composite suite ids sorted by number of snapshot dependency.
@@ -200,9 +200,9 @@ public interface ITeamcityIgnited {
      */
     public BuildTypeCompacted getBuildType(String buildTypeId);
 
-    @Nullable public IRunHistory getTestRunHist(TestInBranch testInBranch);
+    @Nullable public IRunHistory getTestRunHist(String testName, @Nullable String branch);
 
-    @Nullable public IRunHistory getSuiteRunHist(SuiteInBranch branch);
+    @Nullable public IRunHistory getSuiteRunHist(String suiteId, @Nullable String branch);
 
     /**
      * @param suiteBuildTypeId Suite id.
diff --git a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/teamcity/ignited/ITeamcityIgnitedProvider.java b/tcbot-teamcity-ignited/src/main/java/org/apache/ignite/tcignited/ITeamcityIgnitedProvider.java
similarity index 93%
rename from ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/teamcity/ignited/ITeamcityIgnitedProvider.java
rename to tcbot-teamcity-ignited/src/main/java/org/apache/ignite/tcignited/ITeamcityIgnitedProvider.java
index 52cd845..ec3f3aa 100644
--- a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/teamcity/ignited/ITeamcityIgnitedProvider.java
+++ b/tcbot-teamcity-ignited/src/main/java/org/apache/ignite/tcignited/ITeamcityIgnitedProvider.java
@@ -14,11 +14,11 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-package org.apache.ignite.ci.teamcity.ignited;
+package org.apache.ignite.tcignited;
 
 import javax.annotation.Nullable;
-import org.apache.ignite.ci.user.ICredentialsProv;
 import org.apache.ignite.tcbot.common.exeption.ServiceUnauthorizedException;
+import org.apache.ignite.tcignited.creds.ICredentialsProv;
 
 /**
  * Provides instance of particular cache-based teamcity connection.
diff --git a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/teamcity/ignited/SyncMode.java b/tcbot-teamcity-ignited/src/main/java/org/apache/ignite/tcignited/SyncMode.java
similarity index 95%
rename from ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/teamcity/ignited/SyncMode.java
rename to tcbot-teamcity-ignited/src/main/java/org/apache/ignite/tcignited/SyncMode.java
index f88a11c..d028709 100644
--- a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/teamcity/ignited/SyncMode.java
+++ b/tcbot-teamcity-ignited/src/main/java/org/apache/ignite/tcignited/SyncMode.java
@@ -14,7 +14,7 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-package org.apache.ignite.ci.teamcity.ignited;
+package org.apache.ignite.tcignited;
 
 public enum SyncMode {
     /** All: Entity version updated, queued builds re-check, absent entry. */
diff --git a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/user/ICredentialsProv.java b/tcbot-teamcity-ignited/src/main/java/org/apache/ignite/tcignited/creds/ICredentialsProv.java
similarity index 75%
rename from ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/user/ICredentialsProv.java
rename to tcbot-teamcity-ignited/src/main/java/org/apache/ignite/tcignited/creds/ICredentialsProv.java
index 9455210..908abcd 100644
--- a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/user/ICredentialsProv.java
+++ b/tcbot-teamcity-ignited/src/main/java/org/apache/ignite/tcignited/creds/ICredentialsProv.java
@@ -14,22 +14,11 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-
-package org.apache.ignite.ci.user;
+package org.apache.ignite.tcignited.creds;
 
 import com.google.common.base.Strings;
 
-import javax.servlet.http.HttpServletRequest;
-
 public interface ICredentialsProv {
-    /** Key for context attribute. */
-    public String _KEY = ICredentialsProv.class.getName();
-
-    //note it will not work for PermitAll Methods
-    public static ICredentialsProv get(HttpServletRequest req) {
-        return (ICredentialsProv) req.getAttribute(_KEY);
-    }
-
     /**
      * Gets username for particular service
      * @param srvCode Server Id.
@@ -45,8 +34,4 @@ public interface ICredentialsProv {
     default boolean hasAccess(String srvCode) {
         return !Strings.isNullOrEmpty(getUser(srvCode)) && !Strings.isNullOrEmpty(getPassword(srvCode));
     }
-
-    String getPrincipalId();
-
-    byte[] getUserKey();
 }
diff --git a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/teamcity/ignited/runhist/ChangesState.java b/tcbot-teamcity-ignited/src/main/java/org/apache/ignite/tcignited/history/ChangesState.java
similarity index 94%
rename from ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/teamcity/ignited/runhist/ChangesState.java
rename to tcbot-teamcity-ignited/src/main/java/org/apache/ignite/tcignited/history/ChangesState.java
index 13a0257..aeaa137 100644
--- a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/teamcity/ignited/runhist/ChangesState.java
+++ b/tcbot-teamcity-ignited/src/main/java/org/apache/ignite/tcignited/history/ChangesState.java
@@ -14,7 +14,7 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-package org.apache.ignite.ci.teamcity.ignited.runhist;
+package org.apache.ignite.tcignited.history;
 
 /** Changes state for run. */
 public enum ChangesState {
diff --git a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/db/Persisted.java b/tcbot-teamcity-ignited/src/main/java/org/apache/ignite/tcignited/history/IEventTemplate.java
similarity index 79%
rename from ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/db/Persisted.java
rename to tcbot-teamcity-ignited/src/main/java/org/apache/ignite/tcignited/history/IEventTemplate.java
index ed5e251..85b5a6f 100644
--- a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/db/Persisted.java
+++ b/tcbot-teamcity-ignited/src/main/java/org/apache/ignite/tcignited/history/IEventTemplate.java
@@ -14,11 +14,15 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-
-package org.apache.ignite.ci.db;
+package org.apache.ignite.tcignited.history;
 
 /**
- * Marker interface for objects saved into a cache.
+ * Event template to be detected in history
  */
-public @interface Persisted {
+public interface IEventTemplate {
+    int[] beforeEvent();
+
+    int[] eventAndAfter();
+
+    boolean shouldBeFirst();
 }
diff --git a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/teamcity/ignited/IRunHistory.java b/tcbot-teamcity-ignited/src/main/java/org/apache/ignite/tcignited/history/IRunHistory.java
similarity index 92%
rename from ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/teamcity/ignited/IRunHistory.java
rename to tcbot-teamcity-ignited/src/main/java/org/apache/ignite/tcignited/history/IRunHistory.java
index c8c99fc..6bd846a 100644
--- a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/teamcity/ignited/IRunHistory.java
+++ b/tcbot-teamcity-ignited/src/main/java/org/apache/ignite/tcignited/history/IRunHistory.java
@@ -14,11 +14,10 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-package org.apache.ignite.ci.teamcity.ignited;
+package org.apache.ignite.tcignited.history;
 
 import javax.annotation.Nullable;
 import java.util.List;
-import org.apache.ignite.ci.issue.EventTemplate;
 
 /**
  * Test or Build run statistics.
@@ -45,7 +44,7 @@ public interface IRunHistory extends IRunStat {
     @Nullable String getFlakyComments();
 
     @Nullable
-    public Integer detectTemplate(EventTemplate t);
+    public Integer detectTemplate(IEventTemplate t);
 
     public default String getCriticalFailPercentPrintable() {
         return IRunStat.getPercentPrintable(getCriticalFailRate() * 100.0f);
diff --git a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/teamcity/ignited/IRunStat.java b/tcbot-teamcity-ignited/src/main/java/org/apache/ignite/tcignited/history/IRunStat.java
similarity index 96%
rename from ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/teamcity/ignited/IRunStat.java
rename to tcbot-teamcity-ignited/src/main/java/org/apache/ignite/tcignited/history/IRunStat.java
index 34ddf36..c1e4123 100644
--- a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/teamcity/ignited/IRunStat.java
+++ b/tcbot-teamcity-ignited/src/main/java/org/apache/ignite/tcignited/history/IRunStat.java
@@ -14,7 +14,7 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-package org.apache.ignite.ci.teamcity.ignited;
+package org.apache.ignite.tcignited.history;
 
 /**
  * Abstract runs statistics,
diff --git a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/teamcity/ignited/runhist/RunStatus.java b/tcbot-teamcity-ignited/src/main/java/org/apache/ignite/tcignited/history/RunStatus.java
similarity index 97%
rename from ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/teamcity/ignited/runhist/RunStatus.java
rename to tcbot-teamcity-ignited/src/main/java/org/apache/ignite/tcignited/history/RunStatus.java
index ca1815d..f468a9f 100644
--- a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/teamcity/ignited/runhist/RunStatus.java
+++ b/tcbot-teamcity-ignited/src/main/java/org/apache/ignite/tcignited/history/RunStatus.java
@@ -15,7 +15,7 @@
  * limitations under the License.
  */
 
-package org.apache.ignite.ci.teamcity.ignited.runhist;
+package org.apache.ignite.tcignited.history;
 
 import java.util.Map;
 import java.util.stream.Collectors;
diff --git a/tcbot-teamcity/src/main/java/org/apache/ignite/tcservice/IgniteTeamcityConnection.java b/tcbot-teamcity/src/main/java/org/apache/ignite/tcservice/TeamcityServiceConnection.java
similarity index 98%
rename from tcbot-teamcity/src/main/java/org/apache/ignite/tcservice/IgniteTeamcityConnection.java
rename to tcbot-teamcity/src/main/java/org/apache/ignite/tcservice/TeamcityServiceConnection.java
index 3fe1e9b..04c74b8 100644
--- a/tcbot-teamcity/src/main/java/org/apache/ignite/tcservice/IgniteTeamcityConnection.java
+++ b/tcbot-teamcity/src/main/java/org/apache/ignite/tcservice/TeamcityServiceConnection.java
@@ -71,9 +71,9 @@ import static java.util.concurrent.CompletableFuture.supplyAsync;
  * https://confluence.jetbrains.com/display/TCD10/REST+API
  * https://developer.github.com/v3/
  */
-public class IgniteTeamcityConnection implements ITeamcity {
+public class TeamcityServiceConnection implements ITeamcity {
     /** Logger. */
-    private static final Logger logger = LoggerFactory.getLogger(IgniteTeamcityConnection.class);
+    private static final Logger logger = LoggerFactory.getLogger(TeamcityServiceConnection.class);
 
     /** Executor. */
     private Executor executor;
@@ -126,8 +126,7 @@ public class IgniteTeamcityConnection implements ITeamcity {
         Supplier<File> supplier = () -> {
             String buildIdStr = Integer.toString(buildId);
             final File buildDir = TcBotWorkDir.ensureDirExist(new File(logsDir(), "buildId" + buildIdStr));
-            final File file = new File(buildDir,
-                "build.log.zip");
+            final File file = new File(buildDir, "build.log.zip");
             if (file.exists() && file.canRead() && file.length() > 0) {
                 logger.info("Nothing to do, file is cached locally: [" + file + "]");
 
diff --git a/tcbot-teamcity/src/main/java/org/apache/ignite/tcservice/login/TcLoginImpl.java b/tcbot-teamcity/src/main/java/org/apache/ignite/tcservice/login/TcLoginImpl.java
index 2c25f55..1ddc8a6 100644
--- a/tcbot-teamcity/src/main/java/org/apache/ignite/tcservice/login/TcLoginImpl.java
+++ b/tcbot-teamcity/src/main/java/org/apache/ignite/tcservice/login/TcLoginImpl.java
@@ -16,7 +16,7 @@
  */
 package org.apache.ignite.tcservice.login;
 
-import org.apache.ignite.tcservice.IgniteTeamcityConnection;
+import org.apache.ignite.tcservice.TeamcityServiceConnection;
 import org.apache.ignite.tcservice.model.user.User;
 import org.apache.ignite.tcbot.common.exeption.ServiceUnauthorizedException;
 import org.slf4j.Logger;
@@ -33,12 +33,12 @@ public class TcLoginImpl implements ITcLogin {
     private static final Logger logger = LoggerFactory.getLogger(TcLoginImpl.class);
 
     /** Teamcity connection non-caching factory. */
-    @Inject private Provider<IgniteTeamcityConnection> tcFactory;
+    @Inject private Provider<TeamcityServiceConnection> tcFactory;
 
     /** {@inheritDoc} */
     @Override public User checkServiceUserAndPassword(String srvId, String username, String pwd) {
         try {
-            IgniteTeamcityConnection tcConn = tcFactory.get();
+            TeamcityServiceConnection tcConn = tcFactory.get();
 
             tcConn.init(srvId);
 
diff --git a/tcbot-teamcity/src/main/java/org/apache/ignite/tcservice/util/TcConnectionStaticLinker.java b/tcbot-teamcity/src/main/java/org/apache/ignite/tcservice/util/TcConnectionStaticLinker.java
index fad728c..a71bcf2 100644
--- a/tcbot-teamcity/src/main/java/org/apache/ignite/tcservice/util/TcConnectionStaticLinker.java
+++ b/tcbot-teamcity/src/main/java/org/apache/ignite/tcservice/util/TcConnectionStaticLinker.java
@@ -16,7 +16,7 @@
  */
 package org.apache.ignite.tcservice.util;
 
-import org.apache.ignite.tcservice.IgniteTeamcityConnection;
+import org.apache.ignite.tcservice.TeamcityServiceConnection;
 import org.apache.ignite.tcservice.http.TeamcityRecordingConnection;
 
 /**
@@ -26,8 +26,8 @@ public class TcConnectionStaticLinker {
     /**
      * @param srv Server ID.
      */
-    public static IgniteTeamcityConnection create(String srv) {
-        final IgniteTeamcityConnection conn = new IgniteTeamcityConnection();
+    public static TeamcityServiceConnection create(String srv) {
+        final TeamcityServiceConnection conn = new TeamcityServiceConnection();
 
         conn.setHttpConn(new TeamcityRecordingConnection());
         conn.init(srv);