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/01 21:45:40 UTC

[ignite-teamcity-bot] branch master updated: TC Bot refactoring: tcbot-common and -teamcity modules extracted

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 dc45d34  TC Bot refactoring: tcbot-common and -teamcity modules extracted
dc45d34 is described below

commit dc45d34da1b02e02e312737953ebd1b8e8c05572
Author: Dmitriy Pavlov <dp...@apache.org>
AuthorDate: Sun Jun 2 00:45:10 2019 +0300

    TC Bot refactoring: tcbot-common and -teamcity modules extracted
---
 README.md                                          |   2 +-
 build.gradle                                       |   6 +
 ignite-tc-helper-web/build.gradle                  |   3 +
 .../java/org/apache/ignite/ci/HelperConfig.java    |  38 +---
 .../ignite/ci/IAnalyticsEnabledTeamcity.java       |   2 +
 .../apache/ignite/ci/IgnitePersistentTeamcity.java |  47 +++--
 .../apache/ignite/ci/analysis/FullChainRunCtx.java |   4 +-
 .../ignite/ci/analysis/IMultTestOccurrence.java    |   2 +-
 .../apache/ignite/ci/analysis/LogCheckTask.java    |   2 +-
 .../apache/ignite/ci/analysis/MultBuildRunCtx.java |   8 +-
 .../ignite/ci/analysis/SingleBuildRunCtx.java      |  17 +-
 .../ignite/ci/analysis/TestCompactedMult.java      |   2 +-
 .../java/org/apache/ignite/ci/db/DbMigrations.java |   2 +-
 .../java/org/apache/ignite/ci/db/Ignite1Init.java  |   6 +-
 .../org/apache/ignite/ci/db/Ignite2Configurer.java |   7 +-
 .../org/apache/ignite/ci/di/IgniteTcBotModule.java |   3 +-
 .../ignite/ci/di/MonitoredTaskInterceptor.java     |   2 +-
 .../ci/github/ignited/GitHubConnIgnitedImpl.java   |   2 +-
 .../ci/github/ignited/GitHubIgnitedProvImpl.java   |   2 +-
 .../ci/github/pure/GitHubCachingProvider.java      |   2 +-
 .../ci/github/pure/GitHubConnectionImpl.java       |   4 +-
 .../java/org/apache/ignite/ci/issue/Issue.java     |   2 +-
 .../ci/jira/ignited/JiraIgnitedProvider.java       |   2 +-
 .../ignite/ci/jira/ignited/JiraTicketDao.java      |   2 +-
 .../java/org/apache/ignite/ci/jira/pure/Jira.java  |   4 +-
 .../ci/jira/pure/JiraIntegrationProvider.java      |   2 +-
 .../org/apache/ignite/ci/jobs/CheckQueueJob.java   |  12 +-
 .../org/apache/ignite/ci/logs/LogMsgToWarn.java    |   2 +-
 .../apache/ignite/ci/observer/BuildObserver.java   |   2 +-
 .../org/apache/ignite/ci/observer/BuildsInfo.java  |   2 +-
 .../apache/ignite/ci/observer/ObserverTask.java    |   2 +-
 .../runners/IgniteTeamcityHelperRunnerExample.java |  12 +-
 .../ignite/ci/runners/RemoteClientTmpHelper.java   |   6 +-
 .../ci/tcbot/TcBotBusinessServicesModule.java      |   5 +
 .../ignite/ci/tcbot/chain/BuildChainProcessor.java | 137 ++++++++++----
 .../ignite/ci/tcbot/chain/PrChainsProcessor.java   |   8 +-
 .../tcbot/chain/TrackedBranchChainsProcessor.java  |   2 +-
 .../ignite/ci/tcbot/conf/BuildParameterSpec.java   |   6 +-
 .../apache/ignite/ci/tcbot/conf/ITcBotConfig.java  |   7 +-
 .../ci/tcbot/conf/LocalFilesBasedConfig.java       |   4 +-
 .../ignite/ci/tcbot/conf/ParameterValueSpec.java   |   4 +-
 .../ignite/ci/tcbot/conf/TcServerConfig.java       |   4 +-
 .../ignite/ci/tcbot/issue/IssueDetector.java       |   4 +-
 .../apache/ignite/ci/tcbot/issue/Notification.java |   2 +-
 .../ci/tcbot/trends/MasterTrendsService.java       |   6 +-
 .../tcbot/visa/TcBotTriggerAndSignOffService.java  |  10 +-
 .../ci/teamcity/ignited/BuildRefCompacted.java     |   4 +-
 .../ci/teamcity/ignited/ITeamcityIgnited.java      |   8 +-
 .../teamcity/ignited/ITeamcityIgnitedProvider.java |   2 +-
 .../ci/teamcity/ignited/IgniteStringCompactor.java |   6 +-
 .../teamcity/ignited/TcIgnitedCachingProvider.java |   6 +-
 .../ci/teamcity/ignited/TeamcityIgnitedImpl.java   |  20 +-
 .../ci/teamcity/ignited/TeamcityIgnitedModule.java |   2 +-
 .../ci/teamcity/ignited/buildref/BuildRefDao.java  |   4 +-
 .../ci/teamcity/ignited/buildref/BuildRefSync.java |   6 +-
 .../ignited/buildtype/BuildTypeCompacted.java      |   8 +-
 .../teamcity/ignited/buildtype/BuildTypeDao.java   |   4 +-
 .../ignited/buildtype/BuildTypeRefCompacted.java   |   2 +-
 .../ignited/buildtype/BuildTypeRefDao.java         |   2 +-
 .../teamcity/ignited/buildtype/BuildTypeSync.java  |  10 +-
 .../ignited/buildtype/ParametersCompacted.java     |   4 +-
 .../buildtype/SnapshotDependencyCompacted.java     |   2 +-
 .../teamcity/ignited/change/ChangeCompacted.java   |   2 +-
 .../ci/teamcity/ignited/change/ChangeDao.java      |   2 +-
 .../ci/teamcity/ignited/change/ChangeSync.java     |   8 +-
 .../teamcity/ignited/change/RevisionCompacted.java |   4 +-
 .../ignited/fatbuild/FatBuildCompacted.java        |  32 ++--
 .../ci/teamcity/ignited/fatbuild/FatBuildDao.java  |  12 +-
 .../ignited/fatbuild/ProactiveFatBuildSync.java    |  20 +-
 .../ignited/fatbuild/ProblemCompacted.java         |   4 +-
 .../ignited/fatbuild/StatisticsCompacted.java      |   4 +-
 .../teamcity/ignited/fatbuild/TestCompacted.java   |   9 +-
 .../ignite/ci/teamcity/ignited/mute/MuteDao.java   |   4 +-
 .../teamcity/ignited/mute/MuteInfoCompacted.java   |  10 +-
 .../teamcity/ignited/mute/MuteScopeCompacted.java  |   6 +-
 .../ignite/ci/teamcity/ignited/mute/MuteSync.java  |   4 +-
 .../ignited/runhist/RunHistCompactedDao.java       |   2 +-
 .../ci/teamcity/ignited/runhist/RunHistSync.java   |  10 +-
 .../restcached/InitializingServerFactory.java      |   2 +-
 .../ci/teamcity/restcached/TcRestCachedModule.java |   4 +-
 .../restcached/TcServerCachingProvider.java        |   2 +-
 .../org/apache/ignite/ci/user/TcHelperUser.java    |   2 +-
 .../java/org/apache/ignite/ci/util/FutureUtil.java |   2 +
 .../java/org/apache/ignite/ci/util/ZipUtil.java    |   5 +-
 .../java/org/apache/ignite/ci/web/CtxListener.java |   2 +-
 .../java/org/apache/ignite/ci/web/Launcher.java    |   2 +-
 .../apache/ignite/ci/web/TcApplicationResCfg.java  |   2 +-
 .../ignite/ci/web/auth/AuthenticationFilter.java   |   6 +-
 .../model/current/ChainAtServerCurrentStatus.java  |   2 +-
 .../ci/web/model/current/SuiteCurrentStatus.java   |   2 +-
 .../ignite/ci/web/model/current/TestFailure.java   |   2 +-
 .../ignite/ci/web/model/long_running/LRTest.java   |   2 +-
 .../model/long_running/SuiteLRTestsSummary.java    |   2 +-
 .../web/model/trends/BuildStatisticsSummary.java   |  14 +-
 .../ignite/ci/web/model/trends/BuildsHistory.java  |   3 +-
 .../ignite/ci/web/rest/GetChainResultsAsHtml.java  |   2 +-
 .../ignite/ci/web/rest/build/CompareBuilds.java    |   2 +-
 .../ci/web/rest/build/GetBuildTestFailures.java    |   4 +-
 .../web/rest/exception/ExeptionsTraceLogger.java   |   2 +-
 ...ava => ServiceUnauthorizedExceptionMapper.java} |  15 +-
 .../org/apache/ignite/ci/web/rest/login/Login.java |   6 +-
 .../ignite/ci/web/rest/login/UserService.java      |   4 +-
 .../long_running/BuildsLongRunningTestsReport.java |   2 +-
 .../ignite/ci/web/rest/monitoring/HotSpot.java     |   2 +-
 .../rest/tracked/GetTrackedBranchTestResults.java  |   2 +-
 .../ignite/ci/web/rest/visa/TcBotVisaService.java  |   1 -
 .../ci/tcbot/chain/BuildChainProcessorTest.java    |   8 +-
 .../ci/tcbot/chain/MockBasedTcBotModule.java       |  30 ++-
 .../ci/tcbot/chain/PrChainsProcessorTest.java      |  16 +-
 .../ci/tcbot/chain/TrackedBranchProcessorTest.java |   2 +-
 .../ignite/ci/tcbot/issue/IssueDetectorTest.java   |   4 +-
 .../ignited/IgnitedTcInMemoryIntegrationTest.java  |  44 ++---
 .../ci/teamcity/ignited/TeamcityIgnitedMock.java   |   3 +-
 .../ci/teamcity/pure/BuildHistoryEmulator.java     |   6 +-
 .../org/apache/ignite/ci/user/LoginAuthTest.java   |   6 +-
 settings.gradle                                    |   5 +-
 tcbot-common/build.gradle                          |  45 +++++
 {tc-bot-server => tcbot-common}/header.txt         |   0
 .../tcbot/common/conf/IBuildParameterSpec.java     |  13 +-
 .../tcbot/common/conf/IParameterValueSpec.java     |  12 +-
 .../ignite/tcbot/common}/conf/ITcServerConfig.java |  22 ++-
 .../tcbot/common/conf/ITcServerConfigSupplier.java |  10 +-
 .../tcbot/common/conf}/TcBotSystemProperties.java  |   2 +-
 .../ignite/tcbot/common/conf/TcBotWorkDir.java     |  46 +++++
 .../tcbot/common/exeption}/ExceptionUtil.java      |   7 +-
 .../exeption/ServiceBadRequestException.java       |   8 +-
 .../common/exeption/ServiceConflictException.java  |   6 +-
 .../exeption}/ServiceUnauthorizedException.java    |  16 +-
 .../tcbot/common/interceptor}/AutoProfiling.java   |   2 +-
 .../ignite/tcbot/common}/util/Base64Util.java      |   9 +-
 .../apache/ignite/tcbot/common}/util/HttpUtil.java |  19 +-
 .../ignite/tcbot/common}/util/ObjectInterner.java  |   4 +-
 .../apache/ignite/tcbot/common}/util/TimeUtil.java |   4 +-
 {tc-bot-server => tcbot-server}/build.gradle       |   4 +
 {tc-bot-server => tcbot-server}/header.txt         |   0
 .../ignite/ci/TcBotIgniteServerLauncher.java       |   4 +-
 .../build.gradle                                   |  24 +--
 {tc-bot-server => tcbot-teamcity}/header.txt       |   0
 .../org/apache/ignite/tcservice}/ITeamcity.java    |  20 +-
 .../apache/ignite/tcservice}/ITeamcityConn.java    |  32 ++--
 .../tcservice}/IgniteTeamcityConnection.java       | 205 ++++++---------------
 .../ignite/tcservice}/TcRealConnectionModule.java  |  13 +-
 .../tcservice/http}/FileRecordingInputStream.java  |   6 +-
 .../tcservice/http}/ITeamcityHttpConnection.java   |   7 +-
 .../ignite/tcservice/http}/TeamcityRecorder.java   |  12 +-
 .../http}/TeamcityRecordingConnection.java         |   4 +-
 .../apache/ignite/tcservice/login}/ITcLogin.java   |   4 +-
 .../ignite/tcservice/login}/TcLoginImpl.java       |  11 +-
 .../ignite/tcservice/model}/ParameterType.java     |   2 +-
 .../apache/ignite/tcservice/model}/Properties.java |   2 +-
 .../apache/ignite/tcservice/model}/Property.java   |   2 +-
 .../ignite/tcservice/model}/agent/Agent.java       |   6 +-
 .../tcservice/model}/agent/AgentPoolRef.java       |   2 +-
 .../ignite/tcservice/model}/agent/AgentRef.java    |   4 +-
 .../ignite/tcservice/model}/agent/AgentsRef.java   |   2 +-
 .../ignite/tcservice/model}/changes/Change.java    |  11 +-
 .../ignite/tcservice/model}/changes/ChangeRef.java |   8 +-
 .../tcservice/model}/changes/ChangesList.java      |   4 +-
 .../tcservice/model}/changes/ChangesListRef.java   |   4 +-
 .../ignite/tcservice/model}/conf/BuildType.java    |   4 +-
 .../ignite/tcservice/model}/conf/Project.java      |   2 +-
 .../ignite/tcservice/model}/conf/ProjectsList.java |   9 +-
 .../tcservice/model}/conf/bt/BuildTypeFull.java    |   6 +-
 .../tcservice/model}/conf/bt/Parameters.java       |   7 +-
 .../ignite/tcservice/model}/conf/bt/Property.java  |   4 +-
 .../model}/conf/bt/SnapshotDependencies.java       |   2 +-
 .../model}/conf/bt/SnapshotDependency.java         |   4 +-
 .../ignite/tcservice/model}/hist/BuildRef.java     |   4 +-
 .../ignite/tcservice/model}/hist/Builds.java       |   2 +-
 .../tcservice/model}/mute/MuteAssignment.java      |   4 +-
 .../ignite/tcservice/model}/mute/MuteInfo.java     |   7 +-
 .../ignite/tcservice/model}/mute/MuteScope.java    |   6 +-
 .../ignite/tcservice/model}/mute/MuteTarget.java   |   4 +-
 .../apache/ignite/tcservice/model}/mute/Mutes.java |   4 +-
 .../tcservice/model}/result/AbstractRef.java       |   2 +-
 .../ignite/tcservice/model}/result/Build.java      |  25 +--
 .../tcservice/model}/result/Configurations.java    |   5 +-
 .../model}/result/ProblemOccurrencesRef.java       |   2 +-
 .../tcservice/model}/result/RelatedIssuesRef.java  |   2 +-
 .../tcservice/model}/result/StatisticsRef.java     |   2 +-
 .../model}/result/TestOccurrencesRef.java          |   2 +-
 .../ignite/tcservice/model}/result/Triggered.java  |   6 +-
 .../model}/result/problems/ProblemOccurrence.java  |   6 +-
 .../model}/result/problems/ProblemOccurrences.java |   6 +-
 .../tcservice/model}/result/stat/Statistics.java   |   5 +-
 .../model}/result/tests/TestOccurrence.java        |   2 +-
 .../model}/result/tests/TestOccurrenceFull.java    |   4 +-
 .../model}/result/tests/TestOccurrences.java       |   4 +-
 .../model}/result/tests/TestOccurrencesFull.java   |   4 +-
 .../tcservice/model}/result/tests/TestRef.java     |   4 +-
 .../apache/ignite/tcservice/model}/user/User.java  |   6 +-
 .../ignite/tcservice/model}/user/UserRef.java      |   2 +-
 .../apache/ignite/tcservice/model}/user/Users.java |   2 +-
 .../ignite/tcservice/model}/vcs/Revision.java      |   2 +-
 .../ignite/tcservice/model}/vcs/Revisions.java     |   2 +-
 .../tcservice/model}/vcs/VcsRootInstance.java      |   2 +-
 .../tcservice/util}/TcConnectionStaticLinker.java  |   5 +-
 .../org/apache/ignite/tcservice}/util/XmlUtil.java |   5 +-
 198 files changed, 854 insertions(+), 797 deletions(-)

diff --git a/README.md b/README.md
index 3a3edfe..7eadef2 100644
--- a/README.md
+++ b/README.md
@@ -20,7 +20,7 @@ Should you have any questions, please contact Ignite Developers at dev@ignite.ap
 Locally code can be set up using IntelliJ idea and gradle project import.
 Locally it can be run using org.apache.ignite.ci.web.Launcher.main() method.
 The bot will create necessary configs in ~/.ignite-teamcity-helper - it is bot Home directory.
-In can be changed with org.apache.ignite.ci.tcbot.TcBotSystemProperties.TEAMCITY_HELPER_HOME system property.
+In can be changed with TcBotSystemProperties.TEAMCITY_HELPER_HOME system property.
 
 Examples of configs can be found in [conf](conf) directory. 
 Main config file is [conf/branches.json](conf/branches.json). This file needs to be placed to work directory, (under user home by default).
diff --git a/build.gradle b/build.gradle
index d360d4b..79edd89 100644
--- a/build.gradle
+++ b/build.gradle
@@ -38,7 +38,11 @@ subprojects {
 }
 
 allprojects {
+
     ext {
+        sourceCompatibility = '1.8'
+        targetCompatibility = '1.8'
+
         jettyVer = '9.4.12.v20180830'
 
         // ignVer = '2.7.0'
@@ -52,6 +56,8 @@ allprojects {
 
         // MIT/X11 license, category A;
         slf4jVer = '1.7.25'
+
+        gsonVer = '2.8.2'
     }
 
     repositories {
diff --git a/ignite-tc-helper-web/build.gradle b/ignite-tc-helper-web/build.gradle
index 2f25688..c89468e 100644
--- a/ignite-tc-helper-web/build.gradle
+++ b/ignite-tc-helper-web/build.gradle
@@ -28,6 +28,9 @@ repositories {
 
 // https://www.apache.org/legal/resolved.html#category-a
 dependencies {
+    compile (project(":tcbot-common"));
+    compile (project(":tcbot-teamcity"));
+
     compile group: 'com.google.guava', name: 'guava', version: guavaVer
 
     compile group: 'org.apache.ignite', name: 'ignite-core', version: ignVer
diff --git a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/HelperConfig.java b/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/HelperConfig.java
index ba9a6af..97085f9 100644
--- a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/HelperConfig.java
+++ b/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/HelperConfig.java
@@ -24,10 +24,11 @@ import java.io.FileReader;
 import java.io.IOException;
 import java.io.UncheckedIOException;
 import java.util.Properties;
-import org.apache.ignite.ci.tcbot.TcBotSystemProperties;
+
 import org.apache.ignite.ci.tcbot.conf.BranchesTracked;
-import org.apache.ignite.ci.util.Base64Util;
-import org.apache.ignite.ci.util.ExceptionUtil;
+import org.apache.ignite.tcbot.common.util.Base64Util;
+import org.apache.ignite.tcbot.common.conf.TcBotWorkDir;
+import org.apache.ignite.tcbot.common.exeption.ExceptionUtil;
 import org.jetbrains.annotations.NotNull;
 import org.jetbrains.annotations.Nullable;
 
@@ -68,7 +69,6 @@ public class HelperConfig {
     @Deprecated
     public static final String SLACK_CHANNEL = "slack.channel";
     public static final String LOGS = "logs";
-    public static final String ENDL = String.format("%n");
 
     public static Properties loadAuthProperties(File workDir, String cfgFileName) {
         try {
@@ -107,28 +107,6 @@ public class HelperConfig {
         return isNullOrEmpty(tcName) ? name : (tcName + "." + name);
     }
 
-    public static File ensureDirExist(File workDir) {
-        if (!workDir.exists())
-            checkState(workDir.mkdirs(), "Unable to make directory [" + workDir + "]");
-
-        return workDir;
-    }
-
-    public static File resolveWorkDir() {
-        File workDir = null;
-        String property = System.getProperty(TcBotSystemProperties.TEAMCITY_HELPER_HOME);
-        if (isNullOrEmpty(property)) {
-            String conf = ".ignite-teamcity-helper";
-            String prop = System.getProperty("user.home");
-            //relative in work dir
-            workDir = isNullOrEmpty(prop) ? new File(conf) : new File(prop, conf);
-        }
-        else
-            workDir = new File(property);
-
-        return ensureDirExist(workDir);
-    }
-
     @NotNull public static String userPwdToToken(String user, String pwd) {
         return Base64Util.encodeUtf8String(user + ":" + pwd);
     }
@@ -141,7 +119,7 @@ public class HelperConfig {
     }
 
     public static BranchesTracked getTrackedBranches() {
-        final File workDir = resolveWorkDir();
+        final File workDir = TcBotWorkDir.resolveWorkDir();
         final File file = new File(workDir, "branches.json");
 
         try (FileReader json = new FileReader(file)) {
@@ -155,7 +133,7 @@ public class HelperConfig {
     public static Properties loadEmailSettings() {
         try {
             String respConf = prefixedWithServerName(null, MAIL_PROPS);
-            final File workDir = resolveWorkDir();
+            final File workDir = TcBotWorkDir.resolveWorkDir();
             File file = new File(workDir, respConf);
             return loadProps(file);
         }
@@ -165,8 +143,4 @@ public class HelperConfig {
         }
     }
 
-    @NotNull static File resolveLogs(File workDir, String logsProp) {
-        final File logsDirFileConfigured = new File(logsProp);
-        return logsDirFileConfigured.isAbsolute() ? logsDirFileConfigured : new File(workDir, logsProp);
-    }
 }
diff --git a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/IAnalyticsEnabledTeamcity.java b/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/IAnalyticsEnabledTeamcity.java
index 00e524b..47eda4d 100644
--- a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/IAnalyticsEnabledTeamcity.java
+++ b/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/IAnalyticsEnabledTeamcity.java
@@ -17,6 +17,8 @@
 
 package org.apache.ignite.ci;
 
+import org.apache.ignite.tcservice.ITeamcity;
+
 /**
  * Combination of REST data and persisted statistics.
  */
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 f83c455..cd20e73 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
@@ -32,25 +32,25 @@ 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.analysis.SingleBuildRunCtx;
 import org.apache.ignite.ci.db.DbMigrations;
 import org.apache.ignite.ci.db.TcHelperDb;
-import org.apache.ignite.ci.di.AutoProfiling;
-import org.apache.ignite.ci.tcbot.conf.ITcServerConfig;
-import org.apache.ignite.ci.tcmodel.agent.Agent;
-import org.apache.ignite.ci.tcmodel.changes.Change;
-import org.apache.ignite.ci.tcmodel.changes.ChangesList;
-import org.apache.ignite.ci.tcmodel.conf.BuildType;
-import org.apache.ignite.ci.tcmodel.conf.Project;
-import org.apache.ignite.ci.tcmodel.conf.bt.BuildTypeFull;
-import org.apache.ignite.ci.tcmodel.hist.BuildRef;
-import org.apache.ignite.ci.tcmodel.mute.MuteInfo;
-import org.apache.ignite.ci.tcmodel.result.Build;
-import org.apache.ignite.ci.tcmodel.result.problems.ProblemOccurrences;
-import org.apache.ignite.ci.tcmodel.result.stat.Statistics;
-import org.apache.ignite.ci.tcmodel.result.tests.TestOccurrencesFull;
-import org.apache.ignite.ci.tcmodel.user.User;
-import org.apache.ignite.ci.util.ObjectInterner;
+import org.apache.ignite.tcbot.common.interceptor.AutoProfiling;
+import org.apache.ignite.tcbot.common.conf.ITcServerConfig;
+import org.apache.ignite.tcservice.ITeamcity;
+import org.apache.ignite.tcservice.model.agent.Agent;
+import org.apache.ignite.tcservice.model.changes.Change;
+import org.apache.ignite.tcservice.model.changes.ChangesList;
+import org.apache.ignite.tcservice.model.conf.BuildType;
+import org.apache.ignite.tcservice.model.conf.Project;
+import org.apache.ignite.tcservice.model.conf.bt.BuildTypeFull;
+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.apache.ignite.tcservice.model.result.problems.ProblemOccurrences;
+import org.apache.ignite.tcservice.model.result.stat.Statistics;
+import org.apache.ignite.tcservice.model.result.tests.TestOccurrencesFull;
+import org.apache.ignite.tcservice.model.user.User;
+import org.apache.ignite.tcbot.common.util.ObjectInterner;
 import org.apache.ignite.ci.web.model.hist.VisasHistoryStorage;
 import org.jetbrains.annotations.NotNull;
 
@@ -140,20 +140,15 @@ public class IgnitePersistentTeamcity implements IAnalyticsEnabledTeamcity, ITea
     }
 
     /** {@inheritDoc} */
-    @Override public CompletableFuture<File> unzipFirstFile(CompletableFuture<File> fut) {
-        return teamcity.unzipFirstFile(fut);
-    }
-
-    /** {@inheritDoc} */
     @Override public CompletableFuture<File> downloadBuildLogZip(int id) {
         return teamcity.downloadBuildLogZip(id);
     }
 
     /** {@inheritDoc} */
-    @Override public CompletableFuture<LogCheckResult> analyzeBuildLog(Integer buildId, SingleBuildRunCtx ctx) {
-        return loadFutureIfAbsentVers(logCheckResultCache(), buildId,
-            k -> teamcity.analyzeBuildLog(buildId, ctx));
-    }
+//    @Override public CompletableFuture<LogCheckResult> analyzeBuildLog(Integer buildId, SingleBuildRunCtx ctx) {
+//        return loadFutureIfAbsentVers(logCheckResultCache(), buildId,
+//            k -> teamcity.analyzeBuildLog(buildId, ctx));
+//    }
 
 
     @AutoProfiling
diff --git a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/analysis/FullChainRunCtx.java b/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/analysis/FullChainRunCtx.java
index b298e6c..56395db 100644
--- a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/analysis/FullChainRunCtx.java
+++ b/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/analysis/FullChainRunCtx.java
@@ -22,8 +22,8 @@ import java.util.List;
 import java.util.Objects;
 import java.util.concurrent.Future;
 import java.util.stream.Stream;
-import org.apache.ignite.ci.tcmodel.result.Build;
-import org.apache.ignite.ci.util.TimeUtil;
+import org.apache.ignite.tcservice.model.result.Build;
+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/analysis/IMultTestOccurrence.java b/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/analysis/IMultTestOccurrence.java
index 0a16487..ea39bad 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
@@ -17,7 +17,7 @@
 
 package org.apache.ignite.ci.analysis;
 
-import org.apache.ignite.ci.tcmodel.result.tests.TestOccurrenceFull;
+import org.apache.ignite.tcservice.model.result.tests.TestOccurrenceFull;
 import org.apache.ignite.ci.teamcity.ignited.IRunHistory;
 
 /**
diff --git a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/analysis/LogCheckTask.java b/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/analysis/LogCheckTask.java
index a536444..eedb5d2 100644
--- a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/analysis/LogCheckTask.java
+++ b/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/analysis/LogCheckTask.java
@@ -22,7 +22,7 @@ import org.apache.ignite.ci.logs.BuildLogStreamChecker;
 import org.apache.ignite.ci.logs.handlers.TestLogHandler;
 import org.apache.ignite.ci.logs.handlers.ThreadDumpInMemoryHandler;
 
-import static org.apache.ignite.ci.tcmodel.result.problems.ProblemOccurrence.JAVA_LEVEL_DEADLOCK;
+import static org.apache.ignite.tcservice.model.result.problems.ProblemOccurrence.JAVA_LEVEL_DEADLOCK;
 
 /**
  *
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 da9af4e..2e8c8da 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
@@ -32,10 +32,10 @@ import java.util.concurrent.Future;
 import java.util.stream.Collectors;
 import java.util.stream.Stream;
 import javax.annotation.Nonnull;
-import org.apache.ignite.ci.tcbot.conf.ITcServerConfig;
-import org.apache.ignite.ci.tcmodel.hist.BuildRef;
-import org.apache.ignite.ci.tcmodel.result.problems.ProblemOccurrence;
-import org.apache.ignite.ci.tcmodel.result.stat.Statistics;
+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.ci.teamcity.ignited.change.ChangeCompacted;
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 7970606..348a817 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
@@ -32,10 +32,13 @@ import java.util.concurrent.Future;
 import java.util.regex.Pattern;
 import java.util.stream.Stream;
 import javax.annotation.Nonnull;
-import org.apache.ignite.ci.ITeamcity;
+
+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.ci.tcbot.conf.ITcServerConfig;
-import org.apache.ignite.ci.tcmodel.result.tests.TestOccurrenceFull;
+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.ci.teamcity.ignited.buildtype.ParametersCompacted;
 import org.apache.ignite.ci.teamcity.ignited.change.ChangeCompacted;
@@ -275,16 +278,16 @@ public class SingleBuildRunCtx implements ISuiteResults {
 
     public void addTagsFromParameters(ParametersCompacted parameters, ITcServerConfig tcCfg,
         IStringCompactor compactor) {
-        for (BuildParameterSpec parm : tcCfg.filteringParameters()) {
-            if (!parm.isFilled())
+        for (IBuildParameterSpec parm0 : tcCfg.filteringParameters()) {
+            if (!parm0.isFilled())
                 continue;
 
-            String propVal = getPropertyOrSpecialValue(parameters, compactor, parm.name());
+            String propVal = getPropertyOrSpecialValue(parameters, compactor, parm0.name());
 
             if (Strings.isNullOrEmpty(propVal))
                 continue;
 
-            parm.selection().stream()
+            parm0.selection().stream()
                 .filter(pvs -> {
                     String valRegExp = pvs.valueRegExp();
 
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 409d948..585c2c2 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
@@ -21,7 +21,7 @@ import java.util.ArrayList;
 import java.util.List;
 import java.util.Objects;
 import java.util.stream.Collectors;
-import org.apache.ignite.ci.tcmodel.result.tests.TestOccurrenceFull;
+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.ci.teamcity.ignited.fatbuild.TestCompacted;
diff --git a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/db/DbMigrations.java b/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/db/DbMigrations.java
index f7a154b..a907529 100644
--- a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/db/DbMigrations.java
+++ b/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/db/DbMigrations.java
@@ -35,7 +35,7 @@ import org.apache.ignite.ci.issue.Issue;
 import org.apache.ignite.ci.issue.IssueKey;
 import org.apache.ignite.ci.issue.IssuesStorage;
 import org.apache.ignite.ci.observer.CompactBuildsInfo;
-import org.apache.ignite.ci.tcmodel.result.Build;
+import org.apache.ignite.tcservice.model.result.Build;
 import org.apache.ignite.ci.web.model.CompactContributionKey;
 import org.apache.ignite.ci.web.model.CompactVisa;
 import org.apache.ignite.ci.web.model.CompactVisaRequest;
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 7fa2473..f4316d0 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
@@ -26,8 +26,8 @@ import java.util.concurrent.atomic.AtomicReference;
 import java.util.stream.Collectors;
 import org.apache.ignite.Ignite;
 import org.apache.ignite.Ignition;
-import org.apache.ignite.ci.HelperConfig;
-import org.apache.ignite.ci.di.AutoProfiling;
+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.ci.web.model.Version;
 import org.apache.ignite.cluster.BaselineNode;
@@ -101,7 +101,7 @@ public class Ignite1Init {
 
     @NotNull
     private IgniteConfiguration getIgniteConfiguration() {
-        final File workDir = HelperConfig.resolveWorkDir();
+        final File workDir = TcBotWorkDir.resolveWorkDir();
         Ignite2Configurer.configLogger(workDir, "tcbot_logs");
 
         final IgniteConfiguration cfg = new IgniteConfiguration();
diff --git a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/db/Ignite2Configurer.java b/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/db/Ignite2Configurer.java
index 0091c59..6b0257c 100644
--- a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/db/Ignite2Configurer.java
+++ b/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/db/Ignite2Configurer.java
@@ -24,12 +24,13 @@ import ch.qos.logback.core.rolling.RollingFileAppender;
 import ch.qos.logback.core.rolling.TimeBasedRollingPolicy;
 import java.io.File;
 import java.io.IOException;
-import org.apache.ignite.ci.HelperConfig;
-import org.apache.ignite.ci.tcbot.TcBotSystemProperties;
+
+import org.apache.ignite.tcbot.common.conf.TcBotSystemProperties;
 import org.apache.ignite.configuration.DataRegionConfiguration;
 import org.apache.ignite.configuration.DataStorageConfiguration;
 import org.apache.ignite.configuration.IgniteConfiguration;
 import org.apache.ignite.configuration.WALMode;
+import org.apache.ignite.tcbot.common.conf.TcBotWorkDir;
 import org.jetbrains.annotations.NotNull;
 import org.slf4j.LoggerFactory;
 
@@ -49,7 +50,7 @@ public class Ignite2Configurer {
         rollingFa.setAppend(true);
 
         final File logs = new File(workDir, subdir);
-        HelperConfig.ensureDirExist(logs);
+        TcBotWorkDir.ensureDirExist(logs);
 
         TimeBasedRollingPolicy logFilePolicy = new TimeBasedRollingPolicy();
         logFilePolicy.setContext(logCtx);
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 f7004f4..29df2e1 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
@@ -36,10 +36,11 @@ import org.apache.ignite.ci.observer.ObserverTask;
 import org.apache.ignite.ci.tcbot.TcBotBusinessServicesModule;
 import org.apache.ignite.ci.tcbot.issue.IssueDetector;
 import org.apache.ignite.ci.teamcity.ignited.TeamcityIgnitedModule;
-import org.apache.ignite.ci.util.ExceptionUtil;
+import org.apache.ignite.tcbot.common.exeption.ExceptionUtil;
 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;
 
 /**
  *
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 5e42f57..9940ab0 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,7 +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.ci.util.TimeUtil;
+import org.apache.ignite.tcbot.common.util.TimeUtil;
 import org.jetbrains.annotations.NotNull;
 
 public class MonitoredTaskInterceptor implements MethodInterceptor {
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 f80d6b5..d6f2d24 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
@@ -31,7 +31,7 @@ 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.ci.di.AutoProfiling;
+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.ci.github.GitHubBranchKey;
diff --git a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/github/ignited/GitHubIgnitedProvImpl.java b/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/github/ignited/GitHubIgnitedProvImpl.java
index fe23792..cf8fbb0 100644
--- a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/github/ignited/GitHubIgnitedProvImpl.java
+++ b/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/github/ignited/GitHubIgnitedProvImpl.java
@@ -26,7 +26,7 @@ import javax.inject.Inject;
 import javax.inject.Provider;
 import org.apache.ignite.ci.github.pure.IGitHubConnection;
 import org.apache.ignite.ci.github.pure.IGitHubConnectionProvider;
-import org.apache.ignite.ci.util.ExceptionUtil;
+import org.apache.ignite.tcbot.common.exeption.ExceptionUtil;
 
 class GitHubIgnitedProvImpl implements IGitHubConnIgnitedProvider {
     @Inject IGitHubConnectionProvider pureConnProv;
diff --git a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/github/pure/GitHubCachingProvider.java b/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/github/pure/GitHubCachingProvider.java
index 2a082df..ea73be2 100644
--- a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/github/pure/GitHubCachingProvider.java
+++ b/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/github/pure/GitHubCachingProvider.java
@@ -24,7 +24,7 @@ import java.util.concurrent.ExecutionException;
 import java.util.concurrent.TimeUnit;
 import javax.inject.Inject;
 import javax.inject.Provider;
-import org.apache.ignite.ci.util.ExceptionUtil;
+import org.apache.ignite.tcbot.common.exeption.ExceptionUtil;
 
 class GitHubCachingProvider implements IGitHubConnectionProvider {
     @Inject private Provider<IGitHubConnection> factory;
diff --git a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/github/pure/GitHubConnectionImpl.java b/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/github/pure/GitHubConnectionImpl.java
index 4cf6347..c3696f6 100644
--- a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/github/pure/GitHubConnectionImpl.java
+++ b/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/github/pure/GitHubConnectionImpl.java
@@ -20,12 +20,12 @@ import com.google.common.base.Preconditions;
 import com.google.common.base.Strings;
 import com.google.gson.Gson;
 import com.google.gson.reflect.TypeToken;
-import org.apache.ignite.ci.di.AutoProfiling;
+import org.apache.ignite.tcbot.common.interceptor.AutoProfiling;
 import org.apache.ignite.ci.github.GitHubBranchShort;
 import org.apache.ignite.ci.github.PullRequest;
 import org.apache.ignite.ci.tcbot.conf.IGitHubConfig;
 import org.apache.ignite.ci.tcbot.conf.ITcBotConfig;
-import org.apache.ignite.ci.util.HttpUtil;
+import org.apache.ignite.tcbot.common.util.HttpUtil;
 import org.jetbrains.annotations.NotNull;
 import org.jetbrains.annotations.Nullable;
 import org.slf4j.Logger;
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 edddad8..00b0899 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
@@ -24,7 +24,7 @@ import java.util.List;
 import java.util.Set;
 import java.util.TreeSet;
 import org.apache.ignite.ci.db.Persisted;
-import org.apache.ignite.ci.util.TimeUtil;
+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/jira/ignited/JiraIgnitedProvider.java b/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/jira/ignited/JiraIgnitedProvider.java
index b08d095..50852fe 100644
--- a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/jira/ignited/JiraIgnitedProvider.java
+++ b/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/jira/ignited/JiraIgnitedProvider.java
@@ -25,7 +25,7 @@ import java.util.concurrent.TimeUnit;
 import javax.inject.Inject;
 import org.apache.ignite.ci.jira.pure.IJiraIntegration;
 import org.apache.ignite.ci.jira.pure.IJiraIntegrationProvider;
-import org.apache.ignite.ci.util.ExceptionUtil;
+import org.apache.ignite.tcbot.common.exeption.ExceptionUtil;
 
 /**
  *
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 231efd8..62617d4 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
@@ -29,7 +29,7 @@ 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.ci.di.AutoProfiling;
+import org.apache.ignite.tcbot.common.interceptor.AutoProfiling;
 import org.apache.ignite.ci.di.cache.GuavaCached;
 import org.apache.ignite.ci.jira.pure.Ticket;
 import org.apache.ignite.ci.teamcity.ignited.IStringCompactor;
diff --git a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/jira/pure/Jira.java b/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/jira/pure/Jira.java
index 8bc948c..5e80a9b 100644
--- a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/jira/pure/Jira.java
+++ b/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/jira/pure/Jira.java
@@ -19,11 +19,11 @@ package org.apache.ignite.ci.jira.pure;
 
 import com.google.common.base.Preconditions;
 import com.google.gson.Gson;
-import org.apache.ignite.ci.di.AutoProfiling;
+import org.apache.ignite.tcbot.common.interceptor.AutoProfiling;
 import org.apache.ignite.ci.jira.Tickets;
 import org.apache.ignite.ci.tcbot.conf.IJiraServerConfig;
 import org.apache.ignite.ci.tcbot.conf.ITcBotConfig;
-import org.apache.ignite.ci.util.HttpUtil;
+import org.apache.ignite.tcbot.common.util.HttpUtil;
 import org.checkerframework.checker.nullness.qual.Nullable;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
diff --git a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/jira/pure/JiraIntegrationProvider.java b/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/jira/pure/JiraIntegrationProvider.java
index 0aaac76..fcfd473 100644
--- a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/jira/pure/JiraIntegrationProvider.java
+++ b/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/jira/pure/JiraIntegrationProvider.java
@@ -24,7 +24,7 @@ import com.google.inject.Provider;
 import java.util.concurrent.ExecutionException;
 import java.util.concurrent.TimeUnit;
 import javax.inject.Inject;
-import org.apache.ignite.ci.util.ExceptionUtil;
+import org.apache.ignite.tcbot.common.exeption.ExceptionUtil;
 
 /**
  * Class for providing {@link IJiraIntegration} instance for specified Jira server. Instance for each server is cached
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 d513e26..9d9fefe 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
@@ -28,20 +28,20 @@ import java.util.stream.Collectors;
 import javax.inject.Inject;
 import org.apache.ignite.ci.tcbot.conf.BranchTracked;
 import org.apache.ignite.ci.tcbot.conf.ChainAtServerTracked;
-import org.apache.ignite.ci.di.AutoProfiling;
+import org.apache.ignite.tcbot.common.interceptor.AutoProfiling;
 import org.apache.ignite.ci.di.MonitoredTask;
 import org.apache.ignite.ci.tcbot.conf.ITcBotConfig;
-import org.apache.ignite.ci.tcmodel.agent.Agent;
-import org.apache.ignite.ci.tcmodel.result.Build;
-import org.apache.ignite.ci.tcmodel.result.Triggered;
-import org.apache.ignite.ci.tcmodel.user.User;
+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.ci.teamcity.ignited.fatbuild.FatBuildCompacted;
 import org.apache.ignite.ci.user.ICredentialsProv;
-import org.apache.ignite.ci.util.ExceptionUtil;
+import org.apache.ignite.tcbot.common.exeption.ExceptionUtil;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
diff --git a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/logs/LogMsgToWarn.java b/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/logs/LogMsgToWarn.java
index 309e7e7..bd302df 100644
--- a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/logs/LogMsgToWarn.java
+++ b/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/logs/LogMsgToWarn.java
@@ -18,7 +18,7 @@
 package org.apache.ignite.ci.logs;
 
 import javax.annotation.Nullable;
-import org.apache.ignite.ci.tcmodel.result.problems.ProblemOccurrence;
+import org.apache.ignite.tcservice.model.result.problems.ProblemOccurrence;
 
 /**
  *
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 c1ee9b4..bb54c53 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
@@ -21,7 +21,7 @@ import java.util.Objects;
 import java.util.Timer;
 import javax.inject.Inject;
 import org.apache.ignite.ci.tcbot.ITcBotBgAuth;
-import org.apache.ignite.ci.tcmodel.result.Build;
+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;
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 82ef057..2b79935 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
@@ -24,7 +24,7 @@ import java.util.Collections;
 import java.util.Date;
 import java.util.List;
 import java.util.Objects;
-import org.apache.ignite.ci.tcmodel.result.Build;
+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.fatbuild.FatBuildCompacted;
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 24bd6c7..1e5e927 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
@@ -27,7 +27,7 @@ import java.util.TimerTask;
 import java.util.concurrent.ConcurrentHashMap;
 import java.util.concurrent.locks.ReentrantLock;
 import javax.inject.Inject;
-import org.apache.ignite.ci.di.AutoProfiling;
+import org.apache.ignite.tcbot.common.interceptor.AutoProfiling;
 import org.apache.ignite.ci.di.MonitoredTask;
 import org.apache.ignite.ci.tcbot.ITcBotBgAuth;
 import org.apache.ignite.ci.tcbot.visa.TcBotTriggerAndSignOffService;
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 85118e0..9df64b7 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
@@ -17,20 +17,18 @@
 
 package org.apache.ignite.ci.runners;
 
-import java.util.Collection;
 import java.util.Collections;
-import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
 import java.util.Set;
 import java.util.StringTokenizer;
 import java.util.TreeMap;
 import java.util.TreeSet;
-import org.apache.ignite.ci.IgniteTeamcityConnection;
-import org.apache.ignite.ci.tcmodel.conf.BuildType;
-import org.apache.ignite.ci.tcmodel.conf.bt.BuildTypeFull;
-import org.apache.ignite.ci.tcmodel.conf.bt.SnapshotDependency;
-import org.apache.ignite.ci.teamcity.pure.TcConnectionStaticLinker;
+import org.apache.ignite.tcservice.IgniteTeamcityConnection;
+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;
+import org.apache.ignite.tcservice.util.TcConnectionStaticLinker;
 
 /**
  * Local class for running specific checks
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 032a496..67c4586 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
@@ -31,8 +31,8 @@ import org.apache.ignite.Ignite;
 import org.apache.ignite.IgniteCache;
 import org.apache.ignite.Ignition;
 import org.apache.ignite.ci.tcbot.user.UserAndSessionsStorage;
-import org.apache.ignite.ci.tcmodel.hist.BuildRef;
-import org.apache.ignite.ci.tcmodel.result.Build;
+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;
@@ -41,7 +41,7 @@ import org.apache.ignite.ci.teamcity.ignited.fatbuild.FatBuildCompacted;
 import org.apache.ignite.ci.teamcity.ignited.fatbuild.FatBuildDao;
 import org.apache.ignite.ci.teamcity.ignited.runhist.RunHistCompactedDao;
 import org.apache.ignite.ci.user.TcHelperUser;
-import org.apache.ignite.ci.util.XmlUtil;
+import org.apache.ignite.tcservice.util.XmlUtil;
 import org.apache.ignite.configuration.IgniteConfiguration;
 import org.apache.ignite.logger.slf4j.Slf4jLogger;
 import org.apache.ignite.spi.discovery.tcp.TcpDiscoverySpi;
diff --git a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/tcbot/TcBotBusinessServicesModule.java b/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/tcbot/TcBotBusinessServicesModule.java
index 45076b6..dcd1252 100644
--- a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/tcbot/TcBotBusinessServicesModule.java
+++ b/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/tcbot/TcBotBusinessServicesModule.java
@@ -19,12 +19,14 @@ package org.apache.ignite.ci.tcbot;
 import com.google.inject.AbstractModule;
 import com.google.inject.internal.SingletonScope;
 import org.apache.ignite.ci.issue.IssuesStorage;
+import org.apache.ignite.ci.tcbot.chain.BuildChainProcessor;
 import org.apache.ignite.ci.tcbot.conf.ITcBotConfig;
 import org.apache.ignite.ci.tcbot.conf.LocalFilesBasedConfig;
 import org.apache.ignite.ci.tcbot.issue.IIssuesStorage;
 import org.apache.ignite.ci.tcbot.trends.MasterTrendsService;
 import org.apache.ignite.ci.tcbot.user.IUserStorage;
 import org.apache.ignite.ci.tcbot.user.UserAndSessionsStorage;
+import org.apache.ignite.tcbot.common.conf.ITcServerConfigSupplier;
 
 /**
  * TC Bot self services mapping (without 3rd party integrations configuration.
@@ -33,9 +35,12 @@ public class TcBotBusinessServicesModule extends AbstractModule {
     /** {@inheritDoc} */
     @Override protected void configure() {
         bind(ITcBotConfig.class).to(LocalFilesBasedConfig.class).in(new SingletonScope());
+        //todo remove
+        bind(ITcServerConfigSupplier.class).to(LocalFilesBasedConfig.class).in(new SingletonScope());
         bind(IUserStorage.class).to(UserAndSessionsStorage.class).in(new SingletonScope());
         bind(IIssuesStorage.class).to(IssuesStorage.class).in(new SingletonScope());
         bind(MasterTrendsService.class).in(new SingletonScope());
         bind(ITcBotBgAuth.class).to(TcBotBgAuthImpl.class).in(new SingletonScope());
+        bind(BuildChainProcessor.class).in(new SingletonScope());
     }
 }
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 c876da4..4c0c342 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
@@ -18,40 +18,14 @@
 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 java.util.ArrayList;
-import java.util.Collection;
-import java.util.Collections;
-import java.util.Comparator;
-import java.util.HashSet;
-import java.util.List;
-import java.util.Map;
-import java.util.Objects;
-import java.util.Optional;
-import java.util.Set;
-import java.util.concurrent.ConcurrentHashMap;
-import java.util.concurrent.Future;
-import java.util.function.Function;
-import java.util.stream.Collectors;
-import java.util.stream.IntStream;
-import java.util.stream.Stream;
-import javax.annotation.Nonnull;
-import javax.inject.Inject;
 import org.apache.ignite.ci.IAnalyticsEnabledTeamcity;
-import org.apache.ignite.ci.analysis.FullChainRunCtx;
-import org.apache.ignite.ci.analysis.MultBuildRunCtx;
-import org.apache.ignite.ci.analysis.SingleBuildRunCtx;
-import org.apache.ignite.ci.analysis.SuiteInBranch;
+import org.apache.ignite.ci.analysis.*;
 import org.apache.ignite.ci.analysis.mode.LatestRebuildMode;
 import org.apache.ignite.ci.analysis.mode.ProcessLogsMode;
-import org.apache.ignite.ci.di.AutoProfiling;
-import org.apache.ignite.ci.tcmodel.hist.BuildRef;
-import org.apache.ignite.ci.tcmodel.result.Build;
-import org.apache.ignite.ci.teamcity.ignited.BuildRefCompacted;
-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.SyncMode;
+import org.apache.ignite.ci.logs.BuildLogStreamChecker;
+import org.apache.ignite.ci.teamcity.ignited.*;
 import org.apache.ignite.ci.teamcity.ignited.buildtype.ParametersCompacted;
 import org.apache.ignite.ci.teamcity.ignited.fatbuild.FatBuildCompacted;
 import org.apache.ignite.ci.teamcity.ignited.runhist.RunHistSync;
@@ -59,11 +33,33 @@ import org.apache.ignite.ci.util.FutureUtil;
 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.tcservice.model.hist.BuildRef;
+import org.apache.ignite.tcservice.model.result.Build;
 import org.jetbrains.annotations.NotNull;
 import org.jetbrains.annotations.Nullable;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
+import javax.annotation.Nonnull;
+import javax.inject.Inject;
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.IOException;
+import java.io.UncheckedIOException;
+import java.util.*;
+import java.util.concurrent.CompletableFuture;
+import java.util.concurrent.ConcurrentHashMap;
+import java.util.concurrent.Future;
+import java.util.concurrent.TimeUnit;
+import java.util.function.Function;
+import java.util.stream.Collectors;
+import java.util.stream.IntStream;
+import java.util.stream.Stream;
+import java.util.zip.ZipEntry;
+import java.util.zip.ZipInputStream;
+
 /**
  * Process whole Build Chain, E.g. runAll at particular server, including all builds involved
  */
@@ -77,6 +73,11 @@ public class BuildChainProcessor {
     /** Compactor. */
     @Inject private IStringCompactor compactor;
 
+
+    /** Build logger processing running. */
+    private ConcurrentHashMap<Integer, CompletableFuture<LogCheckTask>> buildLogProcessingRunning = new ConcurrentHashMap<>();
+
+
     /**
      * Collects data about all long-running tests (run time more than one minute) across all suites in RunAll chain in
      * master branch.
@@ -363,13 +364,85 @@ public class BuildChainProcessor {
 
     @SuppressWarnings("WeakerAccess")
     @AutoProfiling
-    protected void analyzeTests(MultBuildRunCtx outCtx, IAnalyticsEnabledTeamcity teamcity,
+    protected void analyzeTests(MultBuildRunCtx outCtx, ITeamcity teamcity,
         ProcessLogsMode procLog) {
         for (SingleBuildRunCtx ctx : outCtx.getBuilds()) {
             if ((procLog == ProcessLogsMode.SUITE_NOT_COMPLETE && ctx.hasSuiteIncompleteFailure())
                 || procLog == ProcessLogsMode.ALL)
-                ctx.setLogCheckResFut(teamcity.analyzeBuildLog(ctx.buildId(), ctx));
+                ctx.setLogCheckResFut(analyzeBuildLog(teamcity, ctx.buildId(), ctx));
+        }
+    }
+
+    private CompletableFuture<LogCheckTask> checkBuildLogNoCache(ITeamcity teamcity, int buildId, ISuiteResults ctx) {
+        final CompletableFuture<File> zipFut = teamcity.downloadBuildLogZip(buildId);
+        boolean dumpLastTest = ctx.hasSuiteIncompleteFailure();
+
+        if (zipFut == null)
+            return null;
+
+        return zipFut.thenApplyAsync(zipFile -> runCheckForZippedLog(dumpLastTest, zipFile),
+                teamcity.getExecutor());
+    }
+
+
+    @SuppressWarnings("WeakerAccess")
+    @AutoProfiling
+    @NotNull protected LogCheckTask runCheckForZippedLog(boolean dumpLastTest, File zipFile) {
+        LogCheckTask task = new LogCheckTask(zipFile);
+
+        try {
+            //get the zip file content
+            try (ZipInputStream zis = new ZipInputStream(new FileInputStream(zipFile))) {
+                ZipEntry ze = zis.getNextEntry();    //get the zipped file list entry
+
+                while (ze != null) {
+                    BuildLogStreamChecker checker = task.createChecker();
+                    checker.apply(zis, zipFile);
+                    task.finalize(dumpLastTest);
+
+                    ze = zis.getNextEntry();
+                }
+                zis.closeEntry();
+            }
+        }
+        catch (IOException | UncheckedIOException e) {
+            final String msg = "Failed to process ZIPed entry " + zipFile;
+
+            System.err.println(msg);
+            e.printStackTrace();
+
+            logger.error(msg, e);
         }
+
+        return task;
+    }
+
+    //todo implement persistent cache for build results
+    @AutoProfiling
+    public CompletableFuture<LogCheckResult> analyzeBuildLog(ITeamcity teamcity, Integer buildId, SingleBuildRunCtx ctx) {
+        final Stopwatch started = Stopwatch.createStarted();
+
+        CompletableFuture<LogCheckTask> fut = buildLogProcessingRunning.computeIfAbsent(buildId,
+                k -> checkBuildLogNoCache(teamcity, k, ctx)
+        );
+
+        if (fut == null)
+            return null;
+
+        return fut
+                .thenApply(task -> {
+                    buildLogProcessingRunning.remove(buildId, fut);
+
+                    return task;
+                })
+                .thenApply(task -> {
+                    logger.info(Thread.currentThread().getName()
+                            + ": processBuildLog required: " + started.elapsed(TimeUnit.MILLISECONDS)
+                            + "ms for " + ctx.suiteId());
+
+                    return task;
+                })
+                .thenApply(LogCheckTask::getResult);
     }
 
     /**
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 86a7641..2e183b0 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
@@ -23,16 +23,15 @@ 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.ci.ITeamcity;
+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.ci.di.AutoProfiling;
+import org.apache.ignite.tcbot.common.interceptor.AutoProfiling;
 import org.apache.ignite.ci.github.ignited.IGitHubConnIgnited;
 import org.apache.ignite.ci.github.ignited.IGitHubConnIgnitedProvider;
-import org.apache.ignite.ci.github.pure.IGitHubConnectionProvider;
 import org.apache.ignite.ci.jira.ignited.IJiraIgnited;
 import org.apache.ignite.ci.jira.ignited.IJiraIgnitedProvider;
 import org.apache.ignite.ci.tcbot.visa.BranchTicketMatcher;
@@ -64,9 +63,6 @@ public class PrChainsProcessor {
     /** Tc server provider. */
     @Inject private ITeamcityIgnitedProvider tcIgnitedProvider;
 
-    /** Git hub connection provider. */
-    @Inject private IGitHubConnectionProvider gitHubConnProvider;
-
     /** */
     @Inject private IGitHubConnIgnitedProvider gitHubConnIgnitedProvider;
 
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 9e57a67..b1b2693 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
@@ -25,7 +25,7 @@ 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.tcbot.conf.BranchTracked;
-import org.apache.ignite.ci.di.AutoProfiling;
+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;
diff --git a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/tcbot/conf/BuildParameterSpec.java b/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/tcbot/conf/BuildParameterSpec.java
index 1a8796a..a775e1d 100644
--- a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/tcbot/conf/BuildParameterSpec.java
+++ b/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/tcbot/conf/BuildParameterSpec.java
@@ -18,11 +18,13 @@
 package org.apache.ignite.ci.tcbot.conf;
 
 import com.google.common.base.Strings;
+import org.apache.ignite.tcbot.common.conf.IBuildParameterSpec;
+import org.apache.ignite.tcbot.common.conf.IParameterValueSpec;
 import org.jetbrains.annotations.Nullable;
 
 import java.util.*;
 
-public class BuildParameterSpec {
+public class BuildParameterSpec implements IBuildParameterSpec {
     /** Parameter (property) Name. */
     private String name;
 
@@ -84,7 +86,7 @@ public class BuildParameterSpec {
         return !Strings.isNullOrEmpty(name);
     }
 
-    public List<ParameterValueSpec> selection() {
+    public List<? extends IParameterValueSpec> selection() {
         return (selection == null || selection.isEmpty())
             ? Collections.emptyList()
             : Collections.unmodifiableList(selection);
diff --git a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/tcbot/conf/ITcBotConfig.java b/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/tcbot/conf/ITcBotConfig.java
index 7d8ea83..9703287 100644
--- a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/tcbot/conf/ITcBotConfig.java
+++ b/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/tcbot/conf/ITcBotConfig.java
@@ -16,13 +16,16 @@
  */
 package org.apache.ignite.ci.tcbot.conf;
 
+import org.apache.ignite.tcbot.common.conf.ITcServerConfig;
+import org.apache.ignite.tcbot.common.conf.ITcServerConfigSupplier;
+
 import java.util.Collection;
 import java.util.List;
 
 /**
- * Teamcity Bot configuration access inteface.
+ * Teamcity Bot configuration access interface.
  */
-public interface ITcBotConfig {
+public interface ITcBotConfig extends ITcServerConfigSupplier {
     /** Default server code. */
     public String DEFAULT_SERVER_CODE = "apache";
 
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 d20647b..56215b8 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
@@ -23,6 +23,8 @@ 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.conf.ITcServerConfig;
+import org.apache.ignite.tcbot.common.conf.TcBotWorkDir;
 
 /**
  *
@@ -88,7 +90,7 @@ public class LocalFilesBasedConfig implements ITcBotConfig {
 
     @GuavaCached(softValues = true, expireAfterWriteSecs = 3 * 60)
     protected Properties loadOldAuthProps(String srvCode) {
-        File workDir = HelperConfig.resolveWorkDir();
+        File workDir = TcBotWorkDir.resolveWorkDir();
 
         String cfgName = HelperConfig.prepareConfigName(srvCode);
 
diff --git a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/tcbot/conf/ParameterValueSpec.java b/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/tcbot/conf/ParameterValueSpec.java
index e5b1ee0..56ee5d3 100644
--- a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/tcbot/conf/ParameterValueSpec.java
+++ b/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/tcbot/conf/ParameterValueSpec.java
@@ -17,12 +17,14 @@
 
 package org.apache.ignite.ci.tcbot.conf;
 
+import org.apache.ignite.tcbot.common.conf.IParameterValueSpec;
+
 import java.util.Objects;
 
 /**
  * Some parameter value, which label may be used in UI.
  */
-public class ParameterValueSpec {
+public class ParameterValueSpec implements IParameterValueSpec {
     private String value;
     private String label;
     private String valueRegExp;
diff --git a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/tcbot/conf/TcServerConfig.java b/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/tcbot/conf/TcServerConfig.java
index 118319d..a29e6ac 100644
--- a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/tcbot/conf/TcServerConfig.java
+++ b/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/tcbot/conf/TcServerConfig.java
@@ -24,6 +24,8 @@ import java.util.List;
 import java.util.Properties;
 import javax.annotation.Nonnull;
 import org.apache.ignite.ci.HelperConfig;
+import org.apache.ignite.tcbot.common.conf.IBuildParameterSpec;
+import org.apache.ignite.tcbot.common.conf.ITcServerConfig;
 import org.jetbrains.annotations.NotNull;
 import org.jetbrains.annotations.Nullable;
 
@@ -114,7 +116,7 @@ public class TcServerConfig implements ITcServerConfig {
     }
 
     /** {@inheritDoc} */
-    @NotNull @Override public Collection<BuildParameterSpec> filteringParameters() {
+    @NotNull @Override public Collection<? extends IBuildParameterSpec> filteringParameters() {
         if (filteringParameters == null || filteringParameters.isEmpty())
             return Collections.emptySet();
 
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 9c3a32b..681736d 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
@@ -34,7 +34,7 @@ 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.ci.di.AutoProfiling;
+import org.apache.ignite.tcbot.common.interceptor.AutoProfiling;
 import org.apache.ignite.ci.di.MonitoredTask;
 import org.apache.ignite.ci.issue.EventTemplate;
 import org.apache.ignite.ci.issue.EventTemplates;
@@ -47,7 +47,7 @@ import org.apache.ignite.ci.mail.SlackSender;
 import org.apache.ignite.ci.tcbot.chain.TrackedBranchChainsProcessor;
 import org.apache.ignite.ci.tcbot.conf.INotificationChannel;
 import org.apache.ignite.ci.tcbot.conf.ITcBotConfig;
-import org.apache.ignite.ci.tcbot.conf.ITcServerConfig;
+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;
diff --git a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/tcbot/issue/Notification.java b/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/tcbot/issue/Notification.java
index 29e3162..2818799 100644
--- a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/tcbot/issue/Notification.java
+++ b/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/tcbot/issue/Notification.java
@@ -24,7 +24,7 @@ import java.util.List;
 import java.util.Map;
 import java.util.TreeMap;
 import org.apache.ignite.ci.issue.Issue;
-import org.apache.ignite.ci.util.TimeUtil;
+import org.apache.ignite.tcbot.common.util.TimeUtil;
 import org.apache.ignite.ci.web.model.Version;
 
 import static org.apache.ignite.ci.web.model.Version.GITHUB_REF;
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 6f2dca1..99cf724 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
@@ -39,12 +39,12 @@ import java.util.stream.Stream;
 import javax.annotation.Nonnull;
 import javax.inject.Inject;
 import javax.inject.Provider;
-import org.apache.ignite.ci.di.AutoProfiling;
+import org.apache.ignite.tcbot.common.interceptor.AutoProfiling;
 import org.apache.ignite.ci.di.cache.GuavaCached;
 import org.apache.ignite.ci.tcbot.chain.BuildChainProcessor;
 import org.apache.ignite.ci.tcbot.conf.ITcBotConfig;
-import org.apache.ignite.ci.tcmodel.hist.BuildRef;
-import org.apache.ignite.ci.tcmodel.result.tests.TestOccurrence;
+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;
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 279fdce..eac7b66 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
@@ -37,7 +37,7 @@ import java.util.stream.Stream;
 import javax.annotation.Nonnull;
 import javax.inject.Inject;
 import javax.ws.rs.QueryParam;
-import org.apache.ignite.ci.ITeamcity;
+import org.apache.ignite.tcservice.ITeamcity;
 import org.apache.ignite.ci.github.GitHubBranch;
 import org.apache.ignite.ci.github.GitHubUser;
 import org.apache.ignite.ci.github.PullRequest;
@@ -53,9 +53,9 @@ import org.apache.ignite.ci.tcbot.chain.PrChainsProcessor;
 import org.apache.ignite.ci.tcbot.conf.IGitHubConfig;
 import org.apache.ignite.ci.tcbot.conf.IJiraServerConfig;
 import org.apache.ignite.ci.tcbot.conf.ITcBotConfig;
-import org.apache.ignite.ci.tcbot.conf.ITcServerConfig;
-import org.apache.ignite.ci.tcmodel.mute.MuteInfo;
-import org.apache.ignite.ci.tcmodel.result.Build;
+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;
@@ -83,7 +83,7 @@ import org.slf4j.LoggerFactory;
 import static org.apache.ignite.ci.observer.BuildsInfo.CANCELLED_STATUS;
 import static org.apache.ignite.ci.observer.BuildsInfo.FINISHED_STATUS;
 import static org.apache.ignite.ci.observer.BuildsInfo.RUNNING_STATUS;
-import static org.apache.ignite.ci.util.XmlUtil.xmlEscapeText;
+import static org.apache.ignite.tcservice.util.XmlUtil.xmlEscapeText;
 
 /**
  * TC Bot Visa Facade. Provides method for TC Bot Visa obtaining. Contains features for adding comment to the ticket
diff --git a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/teamcity/ignited/BuildRefCompacted.java b/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/teamcity/ignited/BuildRefCompacted.java
index 599a4cb..05db429 100644
--- a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/teamcity/ignited/BuildRefCompacted.java
+++ b/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/teamcity/ignited/BuildRefCompacted.java
@@ -20,11 +20,11 @@ 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.ci.tcmodel.hist.BuildRef;
+import org.apache.ignite.tcservice.model.hist.BuildRef;
 import org.jetbrains.annotations.NotNull;
 import org.jetbrains.annotations.Nullable;
 
-import static org.apache.ignite.ci.tcmodel.hist.BuildRef.*;
+import static org.apache.ignite.tcservice.model.hist.BuildRef.*;
 
 @Persisted
 public class BuildRefCompacted {
diff --git a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/teamcity/ignited/ITeamcityIgnited.java b/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/teamcity/ignited/ITeamcityIgnited.java
index 35e44a5..c76279f 100644
--- a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/teamcity/ignited/ITeamcityIgnited.java
+++ b/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/teamcity/ignited/ITeamcityIgnited.java
@@ -26,10 +26,10 @@ import java.util.Set;
 import javax.annotation.Nullable;
 import org.apache.ignite.ci.analysis.SuiteInBranch;
 import org.apache.ignite.ci.analysis.TestInBranch;
-import org.apache.ignite.ci.tcbot.conf.ITcServerConfig;
-import org.apache.ignite.ci.tcmodel.agent.Agent;
-import org.apache.ignite.ci.tcmodel.mute.MuteInfo;
-import org.apache.ignite.ci.tcmodel.result.Build;
+import org.apache.ignite.tcbot.common.conf.ITcServerConfig;
+import org.apache.ignite.tcservice.model.agent.Agent;
+import org.apache.ignite.tcservice.model.mute.MuteInfo;
+import org.apache.ignite.tcservice.model.result.Build;
 import org.apache.ignite.ci.teamcity.ignited.buildcondition.BuildCondition;
 import org.apache.ignite.ci.teamcity.ignited.buildtype.BuildTypeCompacted;
 import org.apache.ignite.ci.teamcity.ignited.buildtype.BuildTypeRefCompacted;
diff --git a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/teamcity/ignited/ITeamcityIgnitedProvider.java b/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/teamcity/ignited/ITeamcityIgnitedProvider.java
index f4c5920..52cd845 100644
--- a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/teamcity/ignited/ITeamcityIgnitedProvider.java
+++ b/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/teamcity/ignited/ITeamcityIgnitedProvider.java
@@ -18,7 +18,7 @@ package org.apache.ignite.ci.teamcity.ignited;
 
 import javax.annotation.Nullable;
 import org.apache.ignite.ci.user.ICredentialsProv;
-import org.apache.ignite.ci.web.rest.exception.ServiceUnauthorizedException;
+import org.apache.ignite.tcbot.common.exeption.ServiceUnauthorizedException;
 
 /**
  * Provides instance of particular cache-based teamcity connection.
diff --git a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/teamcity/ignited/IgniteStringCompactor.java b/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/teamcity/ignited/IgniteStringCompactor.java
index 015ac50..0b26546 100644
--- a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/teamcity/ignited/IgniteStringCompactor.java
+++ b/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/teamcity/ignited/IgniteStringCompactor.java
@@ -33,10 +33,10 @@ 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.ci.di.AutoProfiling;
+import org.apache.ignite.tcbot.common.interceptor.AutoProfiling;
 import org.apache.ignite.ci.di.cache.GuavaCached;
-import org.apache.ignite.ci.util.ExceptionUtil;
-import org.apache.ignite.ci.util.ObjectInterner;
+import org.apache.ignite.tcbot.common.exeption.ExceptionUtil;
+import org.apache.ignite.tcbot.common.util.ObjectInterner;
 import org.apache.ignite.configuration.CacheConfiguration;
 import org.jetbrains.annotations.NotNull;
 import org.slf4j.Logger;
diff --git a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/teamcity/ignited/TcIgnitedCachingProvider.java b/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/teamcity/ignited/TcIgnitedCachingProvider.java
index 6fe237e..dee0339 100644
--- a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/teamcity/ignited/TcIgnitedCachingProvider.java
+++ b/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/teamcity/ignited/TcIgnitedCachingProvider.java
@@ -24,12 +24,12 @@ import java.util.concurrent.TimeUnit;
 import javax.annotation.Nullable;
 import javax.inject.Inject;
 import javax.inject.Provider;
-import org.apache.ignite.ci.ITeamcity;
+import org.apache.ignite.tcservice.ITeamcity;
 import org.apache.ignite.ci.tcbot.conf.ITcBotConfig;
-import org.apache.ignite.ci.tcbot.conf.ITcServerConfig;
+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.ci.util.ExceptionUtil;
+import org.apache.ignite.tcbot.common.exeption.ExceptionUtil;
 
 /**
  *
diff --git a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/teamcity/ignited/TeamcityIgnitedImpl.java b/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/teamcity/ignited/TeamcityIgnitedImpl.java
index cabb443..3cde6b8 100644
--- a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/teamcity/ignited/TeamcityIgnitedImpl.java
+++ b/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/teamcity/ignited/TeamcityIgnitedImpl.java
@@ -34,20 +34,20 @@ import java.util.concurrent.atomic.AtomicBoolean;
 import java.util.stream.Collectors;
 import javax.annotation.Nullable;
 import javax.inject.Inject;
-import org.apache.ignite.ci.ITeamcity;
+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.di.AutoProfiling;
+import org.apache.ignite.tcbot.common.interceptor.AutoProfiling;
 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.conf.ITcServerConfig;
+import org.apache.ignite.tcbot.common.conf.ITcServerConfig;
 import org.apache.ignite.ci.tcbot.trends.MasterTrendsService;
-import org.apache.ignite.ci.tcmodel.agent.Agent;
-import org.apache.ignite.ci.tcmodel.conf.Project;
-import org.apache.ignite.ci.tcmodel.hist.BuildRef;
-import org.apache.ignite.ci.tcmodel.mute.MuteInfo;
-import org.apache.ignite.ci.tcmodel.result.Build;
+import org.apache.ignite.tcservice.model.agent.Agent;
+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.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;
@@ -67,13 +67,13 @@ 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.teamcity.pure.ITeamcityConn;
+import org.apache.ignite.tcservice.ITeamcityConn;
 import org.apache.ignite.ci.user.ICredentialsProv;
 import org.jetbrains.annotations.NotNull;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
-import static org.apache.ignite.ci.tcmodel.hist.BuildRef.STATUS_UNKNOWN;
+import static org.apache.ignite.tcservice.model.hist.BuildRef.STATUS_UNKNOWN;
 
 /**
  *
diff --git a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/teamcity/ignited/TeamcityIgnitedModule.java b/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/teamcity/ignited/TeamcityIgnitedModule.java
index 1dd0fe5..281dc0b 100644
--- a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/teamcity/ignited/TeamcityIgnitedModule.java
+++ b/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/teamcity/ignited/TeamcityIgnitedModule.java
@@ -34,7 +34,7 @@ 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.teamcity.pure.ITeamcityHttpConnection;
+import org.apache.ignite.tcservice.http.ITeamcityHttpConnection;
 import org.apache.ignite.ci.teamcity.restcached.TcRestCachedModule;
 import org.jetbrains.annotations.Nullable;
 
diff --git a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/teamcity/ignited/buildref/BuildRefDao.java b/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/teamcity/ignited/buildref/BuildRefDao.java
index 608bb48..51cfd36 100644
--- a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/teamcity/ignited/buildref/BuildRefDao.java
+++ b/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/teamcity/ignited/buildref/BuildRefDao.java
@@ -31,9 +31,9 @@ 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.ci.di.AutoProfiling;
+import org.apache.ignite.tcbot.common.interceptor.AutoProfiling;
 import org.apache.ignite.ci.di.cache.GuavaCached;
-import org.apache.ignite.ci.tcmodel.hist.BuildRef;
+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.configuration.CacheConfiguration;
diff --git a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/teamcity/ignited/buildref/BuildRefSync.java b/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/teamcity/ignited/buildref/BuildRefSync.java
index 94a4d1a..f84d76e 100644
--- a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/teamcity/ignited/buildref/BuildRefSync.java
+++ b/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/teamcity/ignited/buildref/BuildRefSync.java
@@ -16,12 +16,12 @@
  */
 package org.apache.ignite.ci.teamcity.ignited.buildref;
 
-import org.apache.ignite.ci.di.AutoProfiling;
+import org.apache.ignite.tcbot.common.interceptor.AutoProfiling;
 import org.apache.ignite.ci.di.MonitoredTask;
-import org.apache.ignite.ci.tcmodel.hist.BuildRef;
+import org.apache.ignite.tcservice.model.hist.BuildRef;
 import org.apache.ignite.ci.teamcity.ignited.ITeamcityIgnited;
 import org.apache.ignite.ci.teamcity.ignited.fatbuild.ProactiveFatBuildSync;
-import org.apache.ignite.ci.teamcity.pure.ITeamcityConn;
+import org.apache.ignite.tcservice.ITeamcityConn;
 import org.jetbrains.annotations.NotNull;
 
 import javax.annotation.Nullable;
diff --git a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/teamcity/ignited/buildtype/BuildTypeCompacted.java b/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/teamcity/ignited/buildtype/BuildTypeCompacted.java
index 92e2d1f..9325b97 100644
--- a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/teamcity/ignited/buildtype/BuildTypeCompacted.java
+++ b/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/teamcity/ignited/buildtype/BuildTypeCompacted.java
@@ -24,10 +24,10 @@ 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.ci.tcmodel.conf.bt.BuildTypeFull;
-import org.apache.ignite.ci.tcmodel.conf.bt.Parameters;
-import org.apache.ignite.ci.tcmodel.conf.bt.SnapshotDependencies;
-import org.apache.ignite.ci.tcmodel.conf.bt.SnapshotDependency;
+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;
diff --git a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/teamcity/ignited/buildtype/BuildTypeDao.java b/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/teamcity/ignited/buildtype/BuildTypeDao.java
index 124a874..b4c298d 100644
--- a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/teamcity/ignited/buildtype/BuildTypeDao.java
+++ b/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/teamcity/ignited/buildtype/BuildTypeDao.java
@@ -27,8 +27,8 @@ import java.util.stream.StreamSupport;
 import javax.inject.Inject;
 import org.apache.ignite.Ignite;
 import org.apache.ignite.IgniteCache;
-import org.apache.ignite.ci.di.AutoProfiling;
-import org.apache.ignite.ci.tcmodel.conf.bt.BuildTypeFull;
+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;
diff --git a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/teamcity/ignited/buildtype/BuildTypeRefCompacted.java b/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/teamcity/ignited/buildtype/BuildTypeRefCompacted.java
index 05dbf82..da04bdc 100644
--- a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/teamcity/ignited/buildtype/BuildTypeRefCompacted.java
+++ b/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/teamcity/ignited/buildtype/BuildTypeRefCompacted.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.ci.db.Persisted;
-import org.apache.ignite.ci.tcmodel.conf.BuildType;
+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;
diff --git a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/teamcity/ignited/buildtype/BuildTypeRefDao.java b/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/teamcity/ignited/buildtype/BuildTypeRefDao.java
index 9929d71..98178b9 100644
--- a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/teamcity/ignited/buildtype/BuildTypeRefDao.java
+++ b/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/teamcity/ignited/buildtype/BuildTypeRefDao.java
@@ -33,7 +33,7 @@ import javax.inject.Inject;
 import javax.validation.constraints.NotNull;
 import org.apache.ignite.Ignite;
 import org.apache.ignite.IgniteCache;
-import org.apache.ignite.ci.tcmodel.conf.BuildType;
+import org.apache.ignite.tcservice.model.conf.BuildType;
 import org.apache.ignite.ci.teamcity.ignited.IStringCompactor;
 import org.jetbrains.annotations.Nullable;
 
diff --git a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/teamcity/ignited/buildtype/BuildTypeSync.java b/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/teamcity/ignited/buildtype/BuildTypeSync.java
index 46ca440..3ab4545 100644
--- a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/teamcity/ignited/buildtype/BuildTypeSync.java
+++ b/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/teamcity/ignited/buildtype/BuildTypeSync.java
@@ -26,13 +26,13 @@ import java.util.Set;
 import java.util.concurrent.TimeUnit;
 import java.util.stream.Collectors;
 import javax.inject.Inject;
-import org.apache.ignite.ci.di.AutoProfiling;
+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.ci.tcmodel.conf.BuildType;
-import org.apache.ignite.ci.tcmodel.conf.bt.BuildTypeFull;
-import org.apache.ignite.ci.teamcity.pure.ITeamcityConn;
-import org.apache.ignite.ci.util.ExceptionUtil;
+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;
diff --git a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/teamcity/ignited/buildtype/ParametersCompacted.java b/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/teamcity/ignited/buildtype/ParametersCompacted.java
index e969fd5..0887bfb 100644
--- a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/teamcity/ignited/buildtype/ParametersCompacted.java
+++ b/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/teamcity/ignited/buildtype/ParametersCompacted.java
@@ -25,8 +25,8 @@ import java.util.Objects;
 import java.util.function.BiConsumer;
 import javax.annotation.Nullable;
 import org.apache.ignite.ci.db.Persisted;
-import org.apache.ignite.ci.tcmodel.conf.bt.Parameters;
-import org.apache.ignite.ci.tcmodel.conf.bt.Property;
+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.internal.util.GridIntList;
 
diff --git a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/teamcity/ignited/buildtype/SnapshotDependencyCompacted.java b/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/teamcity/ignited/buildtype/SnapshotDependencyCompacted.java
index 085de7b..caaf9e4 100644
--- a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/teamcity/ignited/buildtype/SnapshotDependencyCompacted.java
+++ b/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/teamcity/ignited/buildtype/SnapshotDependencyCompacted.java
@@ -19,7 +19,7 @@ package org.apache.ignite.ci.teamcity.ignited.buildtype;
 
 import com.google.common.base.MoreObjects;
 import java.util.Objects;
-import org.apache.ignite.ci.tcmodel.conf.bt.SnapshotDependency;
+import org.apache.ignite.tcservice.model.conf.bt.SnapshotDependency;
 import org.apache.ignite.ci.teamcity.ignited.IStringCompactor;
 
 public class SnapshotDependencyCompacted {
diff --git a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/teamcity/ignited/change/ChangeCompacted.java b/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/teamcity/ignited/change/ChangeCompacted.java
index 73a35a4..fad5f58 100644
--- a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/teamcity/ignited/change/ChangeCompacted.java
+++ b/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/teamcity/ignited/change/ChangeCompacted.java
@@ -23,7 +23,7 @@ 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.ci.tcmodel.changes.Change;
+import org.apache.ignite.tcservice.model.changes.Change;
 import org.apache.ignite.ci.teamcity.ignited.IStringCompactor;
 import org.apache.ignite.ci.teamcity.ignited.fatbuild.FatBuildDao;
 import org.slf4j.Logger;
diff --git a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/teamcity/ignited/change/ChangeDao.java b/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/teamcity/ignited/change/ChangeDao.java
index 14040ca..d5cde84 100644
--- a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/teamcity/ignited/change/ChangeDao.java
+++ b/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/teamcity/ignited/change/ChangeDao.java
@@ -25,7 +25,7 @@ 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.ci.di.AutoProfiling;
+import org.apache.ignite.tcbot.common.interceptor.AutoProfiling;
 import org.apache.ignite.ci.teamcity.ignited.IStringCompactor;
 import org.apache.ignite.configuration.CacheConfiguration;
 
diff --git a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/teamcity/ignited/change/ChangeSync.java b/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/teamcity/ignited/change/ChangeSync.java
index 55f74a6..9ac9adf 100644
--- a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/teamcity/ignited/change/ChangeSync.java
+++ b/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/teamcity/ignited/change/ChangeSync.java
@@ -17,11 +17,11 @@
 package org.apache.ignite.ci.teamcity.ignited.change;
 
 import com.google.common.base.Throwables;
-import org.apache.ignite.ci.di.AutoProfiling;
-import org.apache.ignite.ci.tcmodel.changes.Change;
+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.ci.teamcity.pure.ITeamcityConn;
-import org.apache.ignite.ci.util.ExceptionUtil;
+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;
diff --git a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/teamcity/ignited/change/RevisionCompacted.java b/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/teamcity/ignited/change/RevisionCompacted.java
index c7de5fc..a34f4f4 100644
--- a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/teamcity/ignited/change/RevisionCompacted.java
+++ b/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/teamcity/ignited/change/RevisionCompacted.java
@@ -23,8 +23,8 @@ 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.ci.tcmodel.vcs.Revision;
-import org.apache.ignite.ci.tcmodel.vcs.VcsRootInstance;
+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.ci.teamcity.ignited.fatbuild.FatBuildDao;
 import org.slf4j.Logger;
diff --git a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/teamcity/ignited/fatbuild/FatBuildCompacted.java b/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/teamcity/ignited/fatbuild/FatBuildCompacted.java
index 59feae2..329c93f 100644
--- a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/teamcity/ignited/fatbuild/FatBuildCompacted.java
+++ b/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/teamcity/ignited/fatbuild/FatBuildCompacted.java
@@ -30,24 +30,24 @@ 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.ci.ITeamcity;
+import org.apache.ignite.tcservice.ITeamcity;
 import org.apache.ignite.ci.analysis.IVersionedEntity;
 import org.apache.ignite.ci.db.Persisted;
-import org.apache.ignite.ci.tcmodel.conf.BuildType;
-import org.apache.ignite.ci.tcmodel.conf.bt.Parameters;
-import org.apache.ignite.ci.tcmodel.conf.bt.Property;
-import org.apache.ignite.ci.tcmodel.hist.BuildRef;
-import org.apache.ignite.ci.tcmodel.result.Build;
-import org.apache.ignite.ci.tcmodel.result.TestOccurrencesRef;
-import org.apache.ignite.ci.tcmodel.result.Triggered;
-import org.apache.ignite.ci.tcmodel.result.problems.ProblemOccurrence;
-import org.apache.ignite.ci.tcmodel.result.stat.Statistics;
-import org.apache.ignite.ci.tcmodel.result.tests.TestOccurrenceFull;
-import org.apache.ignite.ci.tcmodel.result.tests.TestOccurrencesFull;
-import org.apache.ignite.ci.tcmodel.user.User;
-import org.apache.ignite.ci.tcmodel.vcs.Revision;
-import org.apache.ignite.ci.tcmodel.vcs.Revisions;
-import org.apache.ignite.ci.tcmodel.vcs.VcsRootInstance;
+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;
+import org.apache.ignite.tcservice.model.hist.BuildRef;
+import org.apache.ignite.tcservice.model.result.Build;
+import org.apache.ignite.tcservice.model.result.TestOccurrencesRef;
+import org.apache.ignite.tcservice.model.result.Triggered;
+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.TestOccurrenceFull;
+import org.apache.ignite.tcservice.model.result.tests.TestOccurrencesFull;
+import org.apache.ignite.tcservice.model.user.User;
+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.ci.teamcity.ignited.buildtype.ParametersCompacted;
diff --git a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/teamcity/ignited/fatbuild/FatBuildDao.java b/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/teamcity/ignited/fatbuild/FatBuildDao.java
index 6a3381d..dc29eba 100644
--- a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/teamcity/ignited/fatbuild/FatBuildDao.java
+++ b/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/teamcity/ignited/fatbuild/FatBuildDao.java
@@ -34,12 +34,12 @@ 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.ci.di.AutoProfiling;
-import org.apache.ignite.ci.tcmodel.changes.ChangesList;
-import org.apache.ignite.ci.tcmodel.result.Build;
-import org.apache.ignite.ci.tcmodel.result.problems.ProblemOccurrence;
-import org.apache.ignite.ci.tcmodel.result.stat.Statistics;
-import org.apache.ignite.ci.tcmodel.result.tests.TestOccurrencesFull;
+import org.apache.ignite.tcbot.common.interceptor.AutoProfiling;
+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.slf4j.Logger;
 import org.slf4j.LoggerFactory;
diff --git a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/teamcity/ignited/fatbuild/ProactiveFatBuildSync.java b/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/teamcity/ignited/fatbuild/ProactiveFatBuildSync.java
index 8c72f3e..8739a62 100644
--- a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/teamcity/ignited/fatbuild/ProactiveFatBuildSync.java
+++ b/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/teamcity/ignited/fatbuild/ProactiveFatBuildSync.java
@@ -19,14 +19,14 @@ package org.apache.ignite.ci.teamcity.ignited.fatbuild;
 import com.google.common.base.Strings;
 import com.google.common.base.Throwables;
 import java.util.stream.Stream;
-import org.apache.ignite.ci.di.AutoProfiling;
+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.ci.tcmodel.changes.ChangesList;
-import org.apache.ignite.ci.tcmodel.result.Build;
-import org.apache.ignite.ci.tcmodel.result.problems.ProblemOccurrence;
-import org.apache.ignite.ci.tcmodel.result.stat.Statistics;
-import org.apache.ignite.ci.tcmodel.result.tests.TestOccurrencesFull;
+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.BuildRefCompacted;
 import org.apache.ignite.ci.teamcity.ignited.buildref.BuildRefDao;
 import org.apache.ignite.ci.teamcity.ignited.IStringCompactor;
@@ -34,9 +34,9 @@ import org.apache.ignite.ci.teamcity.ignited.ITeamcityIgnited;
 import org.apache.ignite.ci.teamcity.ignited.SyncMode;
 import org.apache.ignite.ci.teamcity.ignited.change.ChangeSync;
 import org.apache.ignite.ci.teamcity.ignited.runhist.RunHistSync;
-import org.apache.ignite.ci.teamcity.pure.ITeamcityConn;
-import org.apache.ignite.ci.util.ExceptionUtil;
-import org.apache.ignite.ci.web.rest.exception.ConflictException;
+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;
@@ -385,7 +385,7 @@ public class ProactiveFatBuildSync {
         catch (Exception e) {
             Throwable cause = Throwables.getRootCause(e);
 
-            if (cause instanceof FileNotFoundException || cause instanceof ConflictException) {
+            if (cause instanceof FileNotFoundException || cause instanceof ServiceConflictException) {
                 logger.info("Loading build [" + buildId + "] for server [" + srvName + "] failed:" + e.getMessage(), e);
 
                 if (existingBuild != null) {
diff --git a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/teamcity/ignited/fatbuild/ProblemCompacted.java b/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/teamcity/ignited/fatbuild/ProblemCompacted.java
index 5ea9994..fc1a73f 100644
--- a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/teamcity/ignited/fatbuild/ProblemCompacted.java
+++ b/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/teamcity/ignited/fatbuild/ProblemCompacted.java
@@ -20,8 +20,8 @@ package org.apache.ignite.ci.teamcity.ignited.fatbuild;
 import com.google.common.base.MoreObjects;
 import com.google.common.base.Objects;
 import com.google.common.base.Strings;
-import org.apache.ignite.ci.tcmodel.hist.BuildRef;
-import org.apache.ignite.ci.tcmodel.result.problems.ProblemOccurrence;
+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.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/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/teamcity/ignited/fatbuild/StatisticsCompacted.java
index 1d66c5b..9388fc6 100644
--- a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/teamcity/ignited/fatbuild/StatisticsCompacted.java
+++ b/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/teamcity/ignited/fatbuild/StatisticsCompacted.java
@@ -20,8 +20,8 @@ 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.ci.tcmodel.conf.bt.Property;
-import org.apache.ignite.ci.tcmodel.result.stat.Statistics;
+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.internal.util.GridIntList;
 import org.apache.ignite.internal.util.GridLongList;
diff --git a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/teamcity/ignited/fatbuild/TestCompacted.java b/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/teamcity/ignited/fatbuild/TestCompacted.java
index d1eb5e9..633e2de 100644
--- a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/teamcity/ignited/fatbuild/TestCompacted.java
+++ b/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/teamcity/ignited/fatbuild/TestCompacted.java
@@ -27,15 +27,14 @@ 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.ci.tcmodel.hist.BuildRef;
-import org.apache.ignite.ci.tcmodel.result.tests.TestOccurrence;
-import org.apache.ignite.ci.tcmodel.result.tests.TestOccurrenceFull;
-import org.apache.ignite.ci.tcmodel.result.tests.TestRef;
+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.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.NotNull;
 import org.jetbrains.annotations.Nullable;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
diff --git a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/teamcity/ignited/mute/MuteDao.java b/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/teamcity/ignited/mute/MuteDao.java
index 7dfb017..cceab39 100644
--- a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/teamcity/ignited/mute/MuteDao.java
+++ b/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/teamcity/ignited/mute/MuteDao.java
@@ -28,8 +28,8 @@ 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.ci.di.AutoProfiling;
-import org.apache.ignite.ci.tcmodel.mute.MuteInfo;
+import org.apache.ignite.tcbot.common.interceptor.AutoProfiling;
+import org.apache.ignite.tcservice.model.mute.MuteInfo;
 import org.apache.ignite.ci.teamcity.ignited.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/teamcity/ignited/mute/MuteInfoCompacted.java b/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/teamcity/ignited/mute/MuteInfoCompacted.java
index e0991b1..cfc3725 100644
--- a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/teamcity/ignited/mute/MuteInfoCompacted.java
+++ b/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/teamcity/ignited/mute/MuteInfoCompacted.java
@@ -20,12 +20,12 @@ package org.apache.ignite.ci.teamcity.ignited.mute;
 import com.google.common.base.Objects;
 import java.util.ArrayList;
 import java.util.List;
-import org.apache.ignite.ci.tcmodel.mute.MuteAssignment;
-import org.apache.ignite.ci.tcmodel.mute.MuteInfo;
-import org.apache.ignite.ci.tcmodel.mute.MuteTarget;
-import org.apache.ignite.ci.tcmodel.result.tests.TestRef;
+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.ci.util.TimeUtil;
+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/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/teamcity/ignited/mute/MuteScopeCompacted.java
index 9f0067c..51ea944 100644
--- a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/teamcity/ignited/mute/MuteScopeCompacted.java
+++ b/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/teamcity/ignited/mute/MuteScopeCompacted.java
@@ -19,9 +19,9 @@ package org.apache.ignite.ci.teamcity.ignited.mute;
 
 import java.util.ArrayList;
 import java.util.List;
-import org.apache.ignite.ci.tcmodel.conf.BuildType;
-import org.apache.ignite.ci.tcmodel.conf.Project;
-import org.apache.ignite.ci.tcmodel.mute.MuteScope;
+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.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/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/teamcity/ignited/mute/MuteSync.java
index 8c40542..591d51c 100644
--- a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/teamcity/ignited/mute/MuteSync.java
+++ b/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/teamcity/ignited/mute/MuteSync.java
@@ -23,8 +23,8 @@ 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.ci.tcmodel.mute.MuteInfo;
-import org.apache.ignite.ci.teamcity.pure.ITeamcityConn;
+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/RunHistCompactedDao.java b/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/teamcity/ignited/runhist/RunHistCompactedDao.java
index 393c8fa..c99af4d 100644
--- a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/teamcity/ignited/runhist/RunHistCompactedDao.java
+++ b/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/teamcity/ignited/runhist/RunHistCompactedDao.java
@@ -31,7 +31,7 @@ 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.ci.di.AutoProfiling;
+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;
diff --git a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/teamcity/ignited/runhist/RunHistSync.java b/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/teamcity/ignited/runhist/RunHistSync.java
index 199f8d3..1e4e197 100644
--- a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/teamcity/ignited/runhist/RunHistSync.java
+++ b/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/teamcity/ignited/runhist/RunHistSync.java
@@ -32,12 +32,12 @@ import java.util.function.BiPredicate;
 import java.util.stream.Collectors;
 import javax.annotation.concurrent.GuardedBy;
 import javax.inject.Inject;
-import org.apache.ignite.ci.ITeamcity;
-import org.apache.ignite.ci.di.AutoProfiling;
+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.ci.tcbot.TcBotSystemProperties;
-import org.apache.ignite.ci.tcbot.conf.BuildParameterSpec;
+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;
@@ -165,7 +165,7 @@ public class RunHistSync {
         cfg.getTeamcityConfig(srvCode)
             .filteringParameters()
             .stream()
-            .map(BuildParameterSpec::name)
+            .map(IBuildParameterSpec::name)
             .forEach(importantParameters::add);
 
         return importantParameters.stream().map(k -> compactor.getStringId(k)).collect(Collectors.toSet());
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 06a6f4a..f7827d1 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,7 +20,7 @@ import com.google.common.base.Strings;
 import javax.inject.Inject;
 import javax.inject.Provider;
 import org.apache.ignite.ci.IAnalyticsEnabledTeamcity;
-import org.apache.ignite.ci.IgniteTeamcityConnection;
+import org.apache.ignite.tcservice.IgniteTeamcityConnection;
 import org.apache.ignite.ci.web.TcUpdatePool;
 
  class InitializingServerFactory implements ITcServerFactory {
diff --git a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/teamcity/restcached/TcRestCachedModule.java b/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/teamcity/restcached/TcRestCachedModule.java
index 897d97e..60f1577 100644
--- a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/teamcity/restcached/TcRestCachedModule.java
+++ b/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/teamcity/restcached/TcRestCachedModule.java
@@ -20,8 +20,8 @@ import com.google.inject.AbstractModule;
 import com.google.inject.internal.SingletonScope;
 import org.apache.ignite.ci.IAnalyticsEnabledTeamcity;
 import org.apache.ignite.ci.IgnitePersistentTeamcity;
-import org.apache.ignite.ci.teamcity.pure.ITeamcityHttpConnection;
-import org.apache.ignite.ci.teamcity.pure.TcRealConnectionModule;
+import org.apache.ignite.tcservice.http.ITeamcityHttpConnection;
+import org.apache.ignite.tcservice.TcRealConnectionModule;
 import org.jetbrains.annotations.Nullable;
 
 /**
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 42ab9ad..e4c1715 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
@@ -21,7 +21,7 @@ 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.util.ExceptionUtil;
+import org.apache.ignite.tcbot.common.exeption.ExceptionUtil;
 
 import javax.annotation.Nullable;
 import javax.inject.Inject;
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 2003dec..7e4e22d 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
@@ -27,7 +27,7 @@ import java.util.TreeSet;
 import org.apache.ignite.ci.analysis.IVersionedEntity;
 import org.apache.ignite.ci.db.Persisted;
 import org.apache.ignite.ci.tcbot.conf.INotificationChannel;
-import org.apache.ignite.ci.tcmodel.user.User;
+import org.apache.ignite.tcservice.model.user.User;
 import org.apache.ignite.ci.util.CryptUtil;
 import org.jetbrains.annotations.Nullable;
 
diff --git a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/util/FutureUtil.java b/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/util/FutureUtil.java
index 17d695d..ef490f0 100644
--- a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/util/FutureUtil.java
+++ b/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/util/FutureUtil.java
@@ -21,6 +21,8 @@ import java.util.Collection;
 import java.util.concurrent.ExecutionException;
 import java.util.concurrent.Future;
 import java.util.stream.Stream;
+
+import org.apache.ignite.tcbot.common.exeption.ExceptionUtil;
 import org.jetbrains.annotations.NotNull;
 import org.jetbrains.annotations.Nullable;
 import org.slf4j.Logger;
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
index f95f6d6..3532db9 100644
--- 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
@@ -27,7 +27,8 @@ import java.util.ArrayList;
 import java.util.List;
 import java.util.zip.ZipEntry;
 import java.util.zip.ZipInputStream;
-import org.apache.ignite.ci.HelperConfig;
+
+import org.apache.ignite.tcbot.common.conf.TcBotWorkDir;
 
 /** Unzips files to specified folder */
 public class ZipUtil {
@@ -53,7 +54,7 @@ public class ZipUtil {
                     else {
                         System.out.println("file unzip : " + newFile.getAbsoluteFile());
 
-                        HelperConfig.ensureDirExist(new File(newFile.getParent()));
+                        TcBotWorkDir.ensureDirExist(new File(newFile.getParent()));
                         Files.copy(zis, newFile.toPath(), StandardCopyOption.REPLACE_EXISTING);
                     }
                     result.add(newFile);
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 bce83c5..1b78823 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
@@ -31,7 +31,7 @@ import org.apache.ignite.ci.di.IgniteTcBotModule;
 import org.apache.ignite.ci.di.scheduler.IScheduler;
 import org.apache.ignite.ci.observer.BuildObserver;
 import org.apache.ignite.ci.tcbot.issue.IssueDetector;
-import org.apache.ignite.ci.teamcity.pure.TeamcityRecorder;
+import org.apache.ignite.tcservice.http.TeamcityRecorder;
 import org.apache.ignite.ci.teamcity.restcached.ITcServerProvider;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
diff --git a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/web/Launcher.java b/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/web/Launcher.java
index 2d29ff0..c9c00b4 100644
--- a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/web/Launcher.java
+++ b/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/web/Launcher.java
@@ -23,7 +23,7 @@ import java.io.File;
 import java.io.IOException;
 import java.io.Reader;
 import org.apache.ignite.ci.db.TcHelperDb;
-import org.apache.ignite.ci.tcbot.TcBotSystemProperties;
+import org.apache.ignite.tcbot.common.conf.TcBotSystemProperties;
 import org.eclipse.jetty.server.Server;
 import org.eclipse.jetty.server.ServerConnector;
 import org.eclipse.jetty.webapp.WebAppContext;
diff --git a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/web/TcApplicationResCfg.java b/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/web/TcApplicationResCfg.java
index ea9657a..301bde2 100644
--- a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/web/TcApplicationResCfg.java
+++ b/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/web/TcApplicationResCfg.java
@@ -20,7 +20,7 @@ package org.apache.ignite.ci.web;
 import org.apache.ignite.ci.web.auth.AuthenticationFilter;
 import org.apache.ignite.ci.web.rest.exception.ExeptionsTraceLogger;
 import org.apache.ignite.ci.web.rest.exception.ServiceStartingException;
-import org.apache.ignite.ci.web.rest.exception.ServiceUnauthorizedException;
+import org.apache.ignite.tcbot.common.exeption.ServiceUnauthorizedException;
 import org.glassfish.jersey.logging.LoggingFeature;
 import org.glassfish.jersey.server.ResourceConfig;
 
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 948a4d1..06a09fe 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
@@ -42,11 +42,11 @@ import org.apache.ignite.ci.tcbot.user.IUserStorage;
 import org.apache.ignite.ci.user.ICredentialsProv;
 import org.apache.ignite.ci.user.TcHelperUser;
 import org.apache.ignite.ci.user.UserSession;
-import org.apache.ignite.ci.util.Base64Util;
+import org.apache.ignite.tcbot.common.util.Base64Util;
 import org.apache.ignite.ci.util.CryptUtil;
-import org.apache.ignite.ci.util.ExceptionUtil;
+import org.apache.ignite.tcbot.common.exeption.ExceptionUtil;
 import org.apache.ignite.ci.web.CtxListener;
-import org.apache.ignite.ci.web.rest.exception.ServiceUnauthorizedException;
+import org.apache.ignite.tcbot.common.exeption.ServiceUnauthorizedException;
 import org.jetbrains.annotations.NotNull;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
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 b617177..7a7c956 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
@@ -33,7 +33,7 @@ import org.apache.ignite.ci.github.ignited.IGitHubConnIgnited;
 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.ci.tcmodel.conf.BuildType;
+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.ci.util.CollectionUtil;
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 136f71d..6998a80 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
@@ -44,7 +44,7 @@ import org.apache.ignite.ci.web.rest.GetBuildLog;
 import org.jetbrains.annotations.NotNull;
 
 import static org.apache.ignite.ci.teamcity.ignited.runhist.RunHistSync.normalizeBranch;
-import static org.apache.ignite.ci.util.TimeUtil.millisToDurationPrintable;
+import static org.apache.ignite.tcbot.common.util.TimeUtil.millisToDurationPrintable;
 import static org.apache.ignite.ci.util.UrlUtil.escape;
 
 /**
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 90bf9bb..8227e50 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
@@ -37,7 +37,7 @@ import org.apache.ignite.ci.web.model.hist.TestHistory;
 import org.jetbrains.annotations.NotNull;
 
 import static org.apache.ignite.ci.teamcity.ignited.runhist.RunHistSync.normalizeBranch;
-import static org.apache.ignite.ci.util.TimeUtil.millisToDurationPrintable;
+import static org.apache.ignite.tcbot.common.util.TimeUtil.millisToDurationPrintable;
 import static org.apache.ignite.ci.util.UrlUtil.escape;
 
 /**
diff --git a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/web/model/long_running/LRTest.java b/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/web/model/long_running/LRTest.java
index e1f57e0..93f5e3b 100644
--- a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/web/model/long_running/LRTest.java
+++ b/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/web/model/long_running/LRTest.java
@@ -16,7 +16,7 @@
  */
 package org.apache.ignite.ci.web.model.long_running;
 
-import static org.apache.ignite.ci.util.TimeUtil.millisToDurationPrintable;
+import static org.apache.ignite.tcbot.common.util.TimeUtil.millisToDurationPrintable;
 
 /**
  *
diff --git a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/web/model/long_running/SuiteLRTestsSummary.java b/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/web/model/long_running/SuiteLRTestsSummary.java
index 2ae2b0c..683bb02 100644
--- a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/web/model/long_running/SuiteLRTestsSummary.java
+++ b/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/web/model/long_running/SuiteLRTestsSummary.java
@@ -18,7 +18,7 @@ package org.apache.ignite.ci.web.model.long_running;
 
 import java.util.List;
 
-import static org.apache.ignite.ci.util.TimeUtil.millisToDurationPrintable;
+import static org.apache.ignite.tcbot.common.util.TimeUtil.millisToDurationPrintable;
 
 /**
  *
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 310ce47..91920e1 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
@@ -27,18 +27,18 @@ import java.util.Objects;
 import java.util.concurrent.ConcurrentHashMap;
 import java.util.stream.Collectors;
 import java.util.stream.Stream;
-import org.apache.ignite.ci.tcmodel.hist.BuildRef;
-import org.apache.ignite.ci.tcmodel.result.TestOccurrencesRef;
-import org.apache.ignite.ci.tcmodel.result.tests.TestOccurrence;
+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.ci.teamcity.ignited.fatbuild.FatBuildCompacted;
 import org.apache.ignite.ci.teamcity.ignited.fatbuild.ProblemCompacted;
 import org.apache.ignite.internal.util.typedef.T2;
 
-import static org.apache.ignite.ci.tcmodel.result.problems.ProblemOccurrence.TC_EXECUTION_TIMEOUT;
-import static org.apache.ignite.ci.tcmodel.result.problems.ProblemOccurrence.TC_EXIT_CODE;
-import static org.apache.ignite.ci.tcmodel.result.problems.ProblemOccurrence.TC_JVM_CRASH;
-import static org.apache.ignite.ci.tcmodel.result.problems.ProblemOccurrence.TC_OOME;
+import static org.apache.ignite.tcservice.model.result.problems.ProblemOccurrence.TC_EXECUTION_TIMEOUT;
+import static org.apache.ignite.tcservice.model.result.problems.ProblemOccurrence.TC_EXIT_CODE;
+import static org.apache.ignite.tcservice.model.result.problems.ProblemOccurrence.TC_JVM_CRASH;
+import static org.apache.ignite.tcservice.model.result.problems.ProblemOccurrence.TC_OOME;
 
 /**
  * Summary of build statistics.
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 a8793a7..048975d 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
@@ -28,8 +28,7 @@ import java.util.List;
 import java.util.Map;
 import java.util.concurrent.ConcurrentHashMap;
 
-import javax.inject.Provider;
-import org.apache.ignite.ci.ITeamcity;
+import org.apache.ignite.tcservice.ITeamcity;
 import org.apache.ignite.ci.tcbot.conf.ITcBotConfig;
 import org.apache.ignite.ci.teamcity.ignited.IStringCompactor;
 
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 bb4ae26..58ea700 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
@@ -31,7 +31,7 @@ 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.ci.ITeamcity;
+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;
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 ca86338..d5a3600 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
@@ -34,7 +34,7 @@ import org.apache.ignite.ci.teamcity.ignited.ITeamcityIgnitedProvider;
 import org.apache.ignite.ci.util.Diff;
 import org.apache.ignite.ci.user.ICredentialsProv;
 import org.apache.ignite.ci.web.CtxListener;
-import org.apache.ignite.ci.web.rest.exception.ServiceUnauthorizedException;
+import org.apache.ignite.tcbot.common.exeption.ServiceUnauthorizedException;
 
 /**
  * Compare builds (by ID) tests' sets.
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 055d4df..7d3f55d 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
@@ -28,7 +28,7 @@ import org.apache.ignite.ci.teamcity.ignited.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.ci.ITeamcity;
+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;
@@ -42,7 +42,7 @@ import org.apache.ignite.ci.web.CtxListener;
 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.current.UpdateInfo;
-import org.apache.ignite.ci.web.rest.exception.ServiceUnauthorizedException;
+import org.apache.ignite.tcbot.common.exeption.ServiceUnauthorizedException;
 import org.jetbrains.annotations.NotNull;
 import org.jetbrains.annotations.Nullable;
 
diff --git a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/web/rest/exception/ExeptionsTraceLogger.java b/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/web/rest/exception/ExeptionsTraceLogger.java
index 20958fa..bf37b80 100644
--- a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/web/rest/exception/ExeptionsTraceLogger.java
+++ b/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/web/rest/exception/ExeptionsTraceLogger.java
@@ -19,7 +19,7 @@ package org.apache.ignite.ci.web.rest.exception;
 import javax.ws.rs.ext.ExceptionMapper;
 import javax.ws.rs.ext.Provider;
 import javax.ws.rs.core.Response;
-import org.apache.ignite.ci.tcbot.TcBotSystemProperties;
+import org.apache.ignite.tcbot.common.conf.TcBotSystemProperties;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
diff --git a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/web/rest/exception/ServiceUnauthorizedException.java b/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/web/rest/exception/ServiceUnauthorizedExceptionMapper.java
similarity index 73%
copy from ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/web/rest/exception/ServiceUnauthorizedException.java
copy to ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/web/rest/exception/ServiceUnauthorizedExceptionMapper.java
index 2978e6a..6b78aef 100644
--- a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/web/rest/exception/ServiceUnauthorizedException.java
+++ b/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/web/rest/exception/ServiceUnauthorizedExceptionMapper.java
@@ -17,26 +17,21 @@
 
 package org.apache.ignite.ci.web.rest.exception;
 
+import org.apache.ignite.tcbot.common.exeption.ServiceUnauthorizedException;
+
 import javax.ws.rs.core.Response;
 import javax.ws.rs.ext.ExceptionMapper;
 import javax.ws.rs.ext.Provider;
 
 /**
- * Exception is thrown if 3rd party service returned 401 - unauthorized.
+ * Exception mapper for case is thrown if 3rd party service returned 401 - unauthorized.
  */
 @Provider
-public class ServiceUnauthorizedException extends RuntimeException
+public class ServiceUnauthorizedExceptionMapper
         implements ExceptionMapper<ServiceUnauthorizedException> {
-    public ServiceUnauthorizedException(String message) {
-        super(message);
-    }
 
     @SuppressWarnings("unused")
-    public ServiceUnauthorizedException() {
-    }
-
-    public static ServiceUnauthorizedException noCreds(String srvId) {
-        return new ServiceUnauthorizedException("Service [" + srvId + "] is not available for current user");
+    public ServiceUnauthorizedExceptionMapper() {
     }
 
     @Override
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 f508aeb..6084edd 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
@@ -21,11 +21,11 @@ import com.google.common.base.Preconditions;
 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.ci.tcmodel.user.User;
+import org.apache.ignite.tcservice.model.user.User;
 import org.apache.ignite.ci.teamcity.ignited.ITeamcityIgnitedProvider;
-import org.apache.ignite.ci.teamcity.pure.ITcLogin;
+import org.apache.ignite.tcservice.login.ITcLogin;
 import org.apache.ignite.ci.user.TcHelperUser;
-import org.apache.ignite.ci.util.Base64Util;
+import org.apache.ignite.tcbot.common.util.Base64Util;
 import org.apache.ignite.ci.util.CryptUtil;
 import org.apache.ignite.ci.web.CtxListener;
 import org.apache.ignite.ci.user.LoginResponse;
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 22ee2f5..90ccc4b 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
@@ -36,8 +36,8 @@ import org.apache.ignite.ci.tcbot.conf.ITcBotConfig;
 import org.apache.ignite.ci.tcbot.issue.IssueDetector;
 import org.apache.ignite.ci.tcbot.user.IUserStorage;
 import org.apache.ignite.ci.tcbot.visa.TcBotTriggerAndSignOffService;
-import org.apache.ignite.ci.tcmodel.user.User;
-import org.apache.ignite.ci.teamcity.pure.ITcLogin;
+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.TcHelperUser;
 import org.apache.ignite.ci.web.CtxListener;
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 42d29f9..3b82bd2 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
@@ -51,6 +51,6 @@ public class BuildsLongRunningTestsReport {
 
         final TrackedBranchChainsProcessor tbProc = CtxListener.getInjector(ctx).getInstance(TrackedBranchChainsProcessor.class);
 
-        return tbProc.getTrackedBranchLongRunningTestsSummary(null, creds);
+        return tbProc.getTrackedBranchLongRunningTestsSummary(branchOrNull, creds);
     }
 }
diff --git a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/web/rest/monitoring/HotSpot.java b/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/web/rest/monitoring/HotSpot.java
index 3165eb6..de9d16c 100644
--- a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/web/rest/monitoring/HotSpot.java
+++ b/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/web/rest/monitoring/HotSpot.java
@@ -16,7 +16,7 @@
  */
 package org.apache.ignite.ci.web.rest.monitoring;
 
-import org.apache.ignite.ci.util.TimeUtil;
+import org.apache.ignite.tcbot.common.util.TimeUtil;
 
 @SuppressWarnings("WeakerAccess")
 public class HotSpot {
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 a344b5a..8d0fe4e 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
@@ -30,7 +30,7 @@ import javax.ws.rs.core.MediaType;
 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.ci.tcmodel.mute.MuteInfo;
+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;
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 be40c29..9ded876 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
@@ -39,7 +39,6 @@ import org.apache.ignite.ci.teamcity.ignited.ITeamcityIgnitedProvider;
 import org.apache.ignite.ci.user.ICredentialsProv;
 import org.apache.ignite.ci.web.CtxListener;
 import org.apache.ignite.ci.web.model.ContributionKey;
-import org.apache.ignite.ci.web.rest.exception.ServiceUnauthorizedException;
 import org.jetbrains.annotations.NotNull;
 import org.jetbrains.annotations.Nullable;
 
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 6a099d8..75cb7e3 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
@@ -26,15 +26,15 @@ import java.util.List;
 import java.util.Map;
 import java.util.stream.Collectors;
 import org.apache.ignite.ci.IAnalyticsEnabledTeamcity;
-import org.apache.ignite.ci.ITeamcity;
+import org.apache.ignite.tcservice.ITeamcity;
 import org.apache.ignite.ci.analysis.FullChainRunCtx;
 import org.apache.ignite.ci.analysis.IMultTestOccurrence;
 import org.apache.ignite.ci.analysis.MultBuildRunCtx;
 import org.apache.ignite.ci.analysis.mode.LatestRebuildMode;
 import org.apache.ignite.ci.analysis.mode.ProcessLogsMode;
-import org.apache.ignite.ci.tcmodel.hist.BuildRef;
-import org.apache.ignite.ci.tcmodel.result.tests.TestOccurrence;
-import org.apache.ignite.ci.tcmodel.result.tests.TestOccurrenceFull;
+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.ci.teamcity.ignited.InMemoryStringCompactor;
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 36e4f00..a9147d7 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
@@ -36,7 +36,7 @@ import org.apache.ignite.ci.tcbot.conf.BranchesTracked;
 import org.apache.ignite.ci.tcbot.conf.IGitHubConfig;
 import org.apache.ignite.ci.tcbot.conf.IJiraServerConfig;
 import org.apache.ignite.ci.tcbot.conf.ITcBotConfig;
-import org.apache.ignite.ci.tcbot.conf.ITcServerConfig;
+import org.apache.ignite.tcbot.common.conf.ITcServerConfig;
 import org.apache.ignite.ci.tcbot.conf.NotificationsConfig;
 import org.apache.ignite.ci.tcbot.conf.TcServerConfig;
 import org.apache.ignite.ci.tcbot.issue.IIssuesStorage;
@@ -47,6 +47,8 @@ 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;
 
 import static org.mockito.ArgumentMatchers.any;
@@ -92,40 +94,48 @@ public class MockBasedTcBotModule extends AbstractModule {
 
         bind(ITcServerProvider.class).toInstance(tcSrvOldProv);
 
-        bind(ITcBotConfig.class).toInstance(new ITcBotConfig() {
-            @Override public String primaryServerCode() {
+        final ITcBotConfig cfg = new ITcBotConfig() {
+            @Override
+            public String primaryServerCode() {
                 return ITcBotConfig.DEFAULT_SERVER_CODE;
             }
 
-            @Override public BranchesTracked getTrackedBranches() {
+            @Override
+            public BranchesTracked getTrackedBranches() {
                 return tracked;
             }
 
             /** {@inheritDoc} */
-            @Override public ITcServerConfig getTeamcityConfig(String srvCode) {
+            @Override
+            public ITcServerConfig getTeamcityConfig(String srvCode) {
                 return new TcServerConfig().code(srvCode).properties(loadOldProps(srvCode));
             }
 
-            @Override public IJiraServerConfig getJiraConfig(String srvCode) {
+            @Override
+            public IJiraServerConfig getJiraConfig(String srvCode) {
                 return jiraCfg;
             }
 
-            @Override public IGitHubConfig getGitConfig(String srvCode) {
+            @Override
+            public IGitHubConfig getGitConfig(String srvCode) {
                 return ghCfg;
             }
 
-            @Override public NotificationsConfig notifications() {
+            @Override
+            public NotificationsConfig notifications() {
                 return new NotificationsConfig();
             }
 
             private Properties loadOldProps(String srvCode) {
-                File workDir = HelperConfig.resolveWorkDir();
+                File workDir = TcBotWorkDir.resolveWorkDir();
 
                 String cfgName = HelperConfig.prepareConfigName(srvCode);
 
                 return HelperConfig.loadAuthProperties(workDir, cfgName);
             }
-        });
+        };
+        bind(ITcBotConfig.class).toInstance(cfg);
+        bind(ITcServerConfigSupplier.class).toInstance(cfg);
 
         bind(IIssuesStorage.class).toInstance(Mockito.mock(IIssuesStorage.class));
         bind(IUserStorage.class).toInstance(Mockito.mock(IUserStorage.class));
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 898f34d..ec92e2b 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
@@ -27,14 +27,14 @@ import java.util.Optional;
 import java.util.concurrent.ConcurrentHashMap;
 import java.util.concurrent.TimeUnit;
 import java.util.function.Predicate;
-import org.apache.ignite.ci.ITeamcity;
-import org.apache.ignite.ci.tcmodel.conf.BuildType;
-import org.apache.ignite.ci.tcmodel.hist.BuildRef;
-import org.apache.ignite.ci.tcmodel.result.Build;
-import org.apache.ignite.ci.tcmodel.result.problems.ProblemOccurrence;
-import org.apache.ignite.ci.tcmodel.result.tests.TestOccurrence;
-import org.apache.ignite.ci.tcmodel.result.tests.TestOccurrenceFull;
-import org.apache.ignite.ci.tcmodel.result.tests.TestRef;
+import org.apache.ignite.tcservice.ITeamcity;
+import org.apache.ignite.tcservice.model.conf.BuildType;
+import org.apache.ignite.tcservice.model.hist.BuildRef;
+import org.apache.ignite.tcservice.model.result.Build;
+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.ci.teamcity.ignited.TeamcityIgnitedProviderMock;
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 80b6fe9..dbdb431 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
@@ -25,7 +25,7 @@ import com.google.inject.Injector;
 import java.util.Map;
 import java.util.Optional;
 import java.util.concurrent.ConcurrentHashMap;
-import org.apache.ignite.ci.ITeamcity;
+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;
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 f689542..64016e8 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
@@ -27,12 +27,12 @@ import java.util.Map;
 import java.util.OptionalInt;
 import java.util.TreeMap;
 import java.util.concurrent.ConcurrentHashMap;
-import org.apache.ignite.ci.ITeamcity;
+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.chain.MockBasedTcBotModule;
 import org.apache.ignite.ci.tcbot.conf.BranchesTracked;
-import org.apache.ignite.ci.tcmodel.result.tests.TestOccurrenceFull;
+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.ci.teamcity.ignited.TeamcityIgnitedImpl;
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 a68f667..8656f22 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,7 +40,7 @@ import javax.xml.bind.JAXBException;
 import org.apache.ignite.Ignite;
 import org.apache.ignite.IgniteCache;
 import org.apache.ignite.Ignition;
-import org.apache.ignite.ci.ITeamcity;
+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;
@@ -50,22 +50,22 @@ 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.ci.tcbot.conf.ITcServerConfig;
-import org.apache.ignite.ci.tcmodel.changes.ChangesList;
-import org.apache.ignite.ci.tcmodel.conf.BuildType;
-import org.apache.ignite.ci.tcmodel.conf.Project;
-import org.apache.ignite.ci.tcmodel.conf.bt.BuildTypeFull;
-import org.apache.ignite.ci.tcmodel.hist.BuildRef;
-import org.apache.ignite.ci.tcmodel.mute.MuteInfo;
-import org.apache.ignite.ci.tcmodel.mute.Mutes;
-import org.apache.ignite.ci.tcmodel.result.Build;
-import org.apache.ignite.ci.tcmodel.result.Triggered;
-import org.apache.ignite.ci.tcmodel.result.problems.ProblemOccurrence;
-import org.apache.ignite.ci.tcmodel.result.problems.ProblemOccurrences;
-import org.apache.ignite.ci.tcmodel.result.stat.Statistics;
-import org.apache.ignite.ci.tcmodel.result.tests.TestOccurrencesFull;
-import org.apache.ignite.ci.tcmodel.vcs.Revision;
-import org.apache.ignite.ci.tcmodel.vcs.Revisions;
+import org.apache.ignite.tcbot.common.conf.ITcServerConfig;
+import org.apache.ignite.tcservice.model.changes.ChangesList;
+import org.apache.ignite.tcservice.model.conf.BuildType;
+import org.apache.ignite.tcservice.model.conf.Project;
+import org.apache.ignite.tcservice.model.conf.bt.BuildTypeFull;
+import org.apache.ignite.tcservice.model.hist.BuildRef;
+import org.apache.ignite.tcservice.model.mute.MuteInfo;
+import org.apache.ignite.tcservice.model.mute.Mutes;
+import org.apache.ignite.tcservice.model.result.Build;
+import org.apache.ignite.tcservice.model.result.Triggered;
+import org.apache.ignite.tcservice.model.result.problems.ProblemOccurrence;
+import org.apache.ignite.tcservice.model.result.problems.ProblemOccurrences;
+import org.apache.ignite.tcservice.model.result.stat.Statistics;
+import org.apache.ignite.tcservice.model.result.tests.TestOccurrencesFull;
+import org.apache.ignite.tcservice.model.vcs.Revision;
+import org.apache.ignite.tcservice.model.vcs.Revisions;
 import org.apache.ignite.ci.teamcity.ignited.buildref.BuildRefDao;
 import org.apache.ignite.ci.teamcity.ignited.buildtype.BuildTypeRefCompacted;
 import org.apache.ignite.ci.teamcity.ignited.fatbuild.FatBuildCompacted;
@@ -74,13 +74,14 @@ import org.apache.ignite.ci.teamcity.ignited.fatbuild.ProactiveFatBuildSync;
 import org.apache.ignite.ci.teamcity.ignited.runhist.RunHistCompactedDao;
 import org.apache.ignite.ci.teamcity.ignited.runhist.RunHistSync;
 import org.apache.ignite.ci.teamcity.pure.BuildHistoryEmulator;
-import org.apache.ignite.ci.teamcity.pure.ITeamcityConn;
-import org.apache.ignite.ci.teamcity.pure.ITeamcityHttpConnection;
+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.util.XmlUtil;
+import org.apache.ignite.tcservice.util.XmlUtil;
 import org.apache.ignite.configuration.IgniteConfiguration;
 import org.apache.ignite.spi.discovery.tcp.TcpDiscoverySpi;
+import org.apache.ignite.tcbot.common.conf.ITcServerConfigSupplier;
 import org.jetbrains.annotations.NotNull;
 import org.junit.AfterClass;
 import org.junit.Before;
@@ -94,7 +95,7 @@ import static junit.framework.TestCase.assertFalse;
 import static junit.framework.TestCase.assertNotNull;
 import static junit.framework.TestCase.assertNull;
 import static junit.framework.TestCase.assertTrue;
-import static org.apache.ignite.ci.HelperConfig.ensureDirExist;
+import static org.apache.ignite.tcbot.common.conf.TcBotWorkDir.ensureDirExist;
 import static org.apache.ignite.ci.teamcity.ignited.IgniteStringCompactor.STRINGS_CACHE;
 import static org.mockito.ArgumentMatchers.anyString;
 import static org.mockito.Mockito.mock;
@@ -753,6 +754,7 @@ public class IgnitedTcInMemoryIntegrationTest {
             when(cfg.getTrackedBranches()).thenReturn(new BranchesTracked());
 
             bind(ITcBotConfig.class).toInstance(cfg);
+            bind(ITcServerConfigSupplier.class).toInstance(cfg);
         }
     }
 }
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 8eeea93..aceb8df 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
@@ -23,7 +23,7 @@ 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.ci.tcbot.conf.ITcServerConfig;
+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;
@@ -123,6 +123,7 @@ public class TeamcityIgnitedMock {
         ITcServerConfig mock = mock(ITcServerConfig.class);
         when(tcIgnited.config()).thenReturn(mock);
 
+
         return tcIgnited;
     }
 
diff --git a/ignite-tc-helper-web/src/test/java/org/apache/ignite/ci/teamcity/pure/BuildHistoryEmulator.java b/ignite-tc-helper-web/src/test/java/org/apache/ignite/ci/teamcity/pure/BuildHistoryEmulator.java
index 7cecc57..db61d33 100644
--- a/ignite-tc-helper-web/src/test/java/org/apache/ignite/ci/teamcity/pure/BuildHistoryEmulator.java
+++ b/ignite-tc-helper-web/src/test/java/org/apache/ignite/ci/teamcity/pure/BuildHistoryEmulator.java
@@ -23,9 +23,9 @@ import java.util.List;
 import java.util.regex.Matcher;
 import java.util.regex.Pattern;
 import javax.xml.bind.JAXBException;
-import org.apache.ignite.ci.tcmodel.hist.BuildRef;
-import org.apache.ignite.ci.tcmodel.hist.Builds;
-import org.apache.ignite.ci.util.XmlUtil;
+import org.apache.ignite.tcservice.model.hist.BuildRef;
+import org.apache.ignite.tcservice.model.hist.Builds;
+import org.apache.ignite.tcservice.util.XmlUtil;
 import org.jetbrains.annotations.Nullable;
 
 import static java.nio.charset.StandardCharsets.UTF_8;
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 be85137..574a1d3 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
@@ -23,9 +23,9 @@ import java.util.Map;
 import java.util.concurrent.atomic.AtomicReference;
 import javax.ws.rs.container.ContainerRequestContext;
 import org.apache.ignite.ci.tcbot.user.UserAndSessionsStorage;
-import org.apache.ignite.ci.tcmodel.user.User;
-import org.apache.ignite.ci.teamcity.pure.ITcLogin;
-import org.apache.ignite.ci.util.Base64Util;
+import org.apache.ignite.tcservice.model.user.User;
+import org.apache.ignite.tcservice.login.ITcLogin;
+import org.apache.ignite.tcbot.common.util.Base64Util;
 import org.apache.ignite.ci.web.auth.AuthenticationFilter;
 import org.apache.ignite.ci.web.rest.login.Login;
 import org.jetbrains.annotations.NotNull;
diff --git a/settings.gradle b/settings.gradle
index 742a6f5..11730ae 100644
--- a/settings.gradle
+++ b/settings.gradle
@@ -1,4 +1,7 @@
 include 'ignite-tc-helper-web'
 include 'jetty-launcher'
-include 'tc-bot-server'
+include 'tcbot-server'
+include 'tcbot-common'
+include 'tcbot-teamcity'
+include 'tcbot-teamcity-ignited'
 
diff --git a/tcbot-common/build.gradle b/tcbot-common/build.gradle
new file mode 100644
index 0000000..c45f8e8
--- /dev/null
+++ b/tcbot-common/build.gradle
@@ -0,0 +1,45 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+apply plugin: 'java'
+apply plugin: 'war'
+
+repositories {
+    mavenCentral()
+    mavenLocal()
+}
+
+dependencies {
+    compile group: 'com.google.guava', name: 'guava', version: guavaVer
+
+    compile group: 'org.slf4j', name: 'slf4j-api', version: slf4jVer
+    //Apache License Version 2.0
+    compile group: 'com.google.code.gson', name: 'gson', version: gsonVer
+
+    testCompile group: 'junit', name: 'junit', version: '4.12'
+    testCompile group: 'org.mockito', name: 'mockito-core', version: '2.22.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/tc-bot-server/header.txt b/tcbot-common/header.txt
similarity index 100%
copy from tc-bot-server/header.txt
copy to tcbot-common/header.txt
diff --git a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/tcmodel/changes/ChangesListRef.java b/tcbot-common/src/main/java/org/apache/ignite/tcbot/common/conf/IBuildParameterSpec.java
similarity index 78%
copy from ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/tcmodel/changes/ChangesListRef.java
copy to tcbot-common/src/main/java/org/apache/ignite/tcbot/common/conf/IBuildParameterSpec.java
index 592f9f8..4e7f34d 100644
--- a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/tcmodel/changes/ChangesListRef.java
+++ b/tcbot-common/src/main/java/org/apache/ignite/tcbot/common/conf/IBuildParameterSpec.java
@@ -14,13 +14,14 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
+package org.apache.ignite.tcbot.common.conf;
 
-package org.apache.ignite.ci.tcmodel.changes;
+import java.util.Collection;
 
-import org.apache.ignite.ci.tcmodel.result.AbstractRef;
+public interface IBuildParameterSpec {
+    String name();
 
-/**
- * Reference to list of changes.
- */
-public class ChangesListRef extends AbstractRef {
+    boolean isFilled();
+
+    Collection<? extends IParameterValueSpec> selection();
 }
diff --git a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/tcmodel/result/RelatedIssuesRef.java b/tcbot-common/src/main/java/org/apache/ignite/tcbot/common/conf/IParameterValueSpec.java
similarity index 84%
copy from ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/tcmodel/result/RelatedIssuesRef.java
copy to tcbot-common/src/main/java/org/apache/ignite/tcbot/common/conf/IParameterValueSpec.java
index 81e1157..187c7e5 100644
--- a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/tcmodel/result/RelatedIssuesRef.java
+++ b/tcbot-common/src/main/java/org/apache/ignite/tcbot/common/conf/IParameterValueSpec.java
@@ -14,12 +14,12 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
+package org.apache.ignite.tcbot.common.conf;
 
-package org.apache.ignite.ci.tcmodel.result;
+public interface IParameterValueSpec {
+    String valueRegExp();
 
-/**
- * Related issues reference.
- */
-public class RelatedIssuesRef extends AbstractRef {
-}
+    String value();
 
+    String label();
+}
diff --git a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/tcbot/conf/ITcServerConfig.java b/tcbot-common/src/main/java/org/apache/ignite/tcbot/common/conf/ITcServerConfig.java
similarity index 76%
rename from ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/tcbot/conf/ITcServerConfig.java
rename to tcbot-common/src/main/java/org/apache/ignite/tcbot/common/conf/ITcServerConfig.java
index e55d18a..a7b421b 100644
--- a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/tcbot/conf/ITcServerConfig.java
+++ b/tcbot-common/src/main/java/org/apache/ignite/tcbot/common/conf/ITcServerConfig.java
@@ -14,11 +14,12 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-package org.apache.ignite.ci.tcbot.conf;
+package org.apache.ignite.tcbot.common.conf;
 
-import java.util.Collection;
-import org.jetbrains.annotations.NotNull;
-import org.jetbrains.annotations.Nullable;
+import org.checkerframework.checker.nullness.qual.NonNull;
+
+import javax.annotation.Nullable;
+import java.util.Collection; 
 
 /**
  * Teamcity Server configuration.
@@ -27,32 +28,33 @@ public interface ITcServerConfig {
     /**
      * @return Another TC Server (service) config name to use settings from. Filled only for server aliases.
      */
-    @Nullable public String reference();
+    @Nullable
+    public String reference();
 
     /**
      * @return Normalized Host address, ends with '/'.
      */
-    @NotNull public String host();
+    @NonNull public String host();
 
     /**
      * @return Directory for downloading build logs (will contain ZIP files).
      */
-    @NotNull public String logsDirectory();
+    @NonNull public String logsDirectory();
 
     /**
      * @return internal naming of default tracked branch for this server.
      */
-    @NotNull public String defaultTrackedBranch();
+    @NonNull public String defaultTrackedBranch();
 
     /**
      * Provides build parameters, whichi could be used for filtering builds in RunHist/Invocations and tagging in UI.
      *
      * @return set of build parameters specifications.
      */
-    @NotNull public Collection<BuildParameterSpec> filteringParameters();
+    @NonNull public Collection<? extends IBuildParameterSpec> filteringParameters();
 
     /**
      * @return set of suite codes (build type IDs), failures in which should be threated as critical and notified.
      */
-    @NotNull public Collection<String> trustedSuites();
+    @NonNull public Collection<String> trustedSuites();
 }
diff --git a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/tcmodel/result/RelatedIssuesRef.java b/tcbot-common/src/main/java/org/apache/ignite/tcbot/common/conf/ITcServerConfigSupplier.java
similarity index 83%
copy from ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/tcmodel/result/RelatedIssuesRef.java
copy to tcbot-common/src/main/java/org/apache/ignite/tcbot/common/conf/ITcServerConfigSupplier.java
index 81e1157..4a20a7e 100644
--- a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/tcmodel/result/RelatedIssuesRef.java
+++ b/tcbot-common/src/main/java/org/apache/ignite/tcbot/common/conf/ITcServerConfigSupplier.java
@@ -15,11 +15,9 @@
  * limitations under the License.
  */
 
-package org.apache.ignite.ci.tcmodel.result;
+package org.apache.ignite.tcbot.common.conf;
 
-/**
- * Related issues reference.
- */
-public class RelatedIssuesRef extends AbstractRef {
+@Deprecated
+public interface ITcServerConfigSupplier {
+    public ITcServerConfig getTeamcityConfig(String srvCode);
 }
-
diff --git a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/tcbot/TcBotSystemProperties.java b/tcbot-common/src/main/java/org/apache/ignite/tcbot/common/conf/TcBotSystemProperties.java
similarity index 97%
rename from ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/tcbot/TcBotSystemProperties.java
rename to tcbot-common/src/main/java/org/apache/ignite/tcbot/common/conf/TcBotSystemProperties.java
index 49a55b4..3ad5a90 100644
--- a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/tcbot/TcBotSystemProperties.java
+++ b/tcbot-common/src/main/java/org/apache/ignite/tcbot/common/conf/TcBotSystemProperties.java
@@ -15,7 +15,7 @@
  * limitations under the License.
  */
 
-package org.apache.ignite.ci.tcbot;
+package org.apache.ignite.tcbot.common.conf;
 
 /**
  * Apache Ignite Teamcity Bot properties.
diff --git a/tcbot-common/src/main/java/org/apache/ignite/tcbot/common/conf/TcBotWorkDir.java b/tcbot-common/src/main/java/org/apache/ignite/tcbot/common/conf/TcBotWorkDir.java
new file mode 100644
index 0000000..1434bd5
--- /dev/null
+++ b/tcbot-common/src/main/java/org/apache/ignite/tcbot/common/conf/TcBotWorkDir.java
@@ -0,0 +1,46 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.ignite.tcbot.common.conf;
+
+import java.io.File;
+
+import static com.google.common.base.Preconditions.checkState;
+import static com.google.common.base.Strings.isNullOrEmpty;
+
+public class TcBotWorkDir {
+    public static File ensureDirExist(File workDir) {
+        if (!workDir.exists())
+            checkState(workDir.mkdirs(), "Unable to make directory [" + workDir + "]");
+
+        return workDir;
+    }
+
+    public static File resolveWorkDir() {
+        File workDir = null;
+        String property = System.getProperty(TcBotSystemProperties.TEAMCITY_HELPER_HOME);
+        if (isNullOrEmpty(property)) {
+            String conf = ".ignite-teamcity-helper";
+            String prop = System.getProperty("user.home");
+            //relative in work dir
+            workDir = isNullOrEmpty(prop) ? new File(conf) : new File(prop, conf);
+        }
+        else
+            workDir = new File(property);
+
+        return ensureDirExist(workDir);
+    }
+}
diff --git a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/util/ExceptionUtil.java b/tcbot-common/src/main/java/org/apache/ignite/tcbot/common/exeption/ExceptionUtil.java
similarity index 90%
rename from ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/util/ExceptionUtil.java
rename to tcbot-common/src/main/java/org/apache/ignite/tcbot/common/exeption/ExceptionUtil.java
index ef9e83a..fb2ec30 100644
--- a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/util/ExceptionUtil.java
+++ b/tcbot-common/src/main/java/org/apache/ignite/tcbot/common/exeption/ExceptionUtil.java
@@ -15,11 +15,10 @@
  * limitations under the License.
  */
 
-package org.apache.ignite.ci.util;
+package org.apache.ignite.tcbot.common.exeption;
 
 import com.google.common.base.Throwables;
 
-import javax.ws.rs.ext.ExceptionMapper;
 import java.util.Optional;
 
 /**
@@ -43,8 +42,8 @@ public class ExceptionUtil {
     public static void throwIfRest(Exception e) {
         final Optional<Throwable> any = Throwables.getCausalChain(e)
             .stream()
-            .filter(th ->
-                    (th instanceof ExceptionMapper)).findAny();
+            .filter(th ->false).findAny();
+                   //todo (th instanceof ExceptionMapper)).findAny();
 
         final RuntimeException eRest = (RuntimeException) any.orElse(null);
         if (eRest != null)
diff --git a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/web/rest/exception/ConflictException.java b/tcbot-common/src/main/java/org/apache/ignite/tcbot/common/exeption/ServiceBadRequestException.java
similarity index 80%
copy from ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/web/rest/exception/ConflictException.java
copy to tcbot-common/src/main/java/org/apache/ignite/tcbot/common/exeption/ServiceBadRequestException.java
index f46b3f7..b6bdc46 100644
--- a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/web/rest/exception/ConflictException.java
+++ b/tcbot-common/src/main/java/org/apache/ignite/tcbot/common/exeption/ServiceBadRequestException.java
@@ -15,18 +15,18 @@
  * limitations under the License.
  */
 
-package org.apache.ignite.ci.web.rest.exception;
+package org.apache.ignite.tcbot.common.exeption;
 
 /**
  * The request could not be completed due to a conflict with the current state of the target resource.
  *
- * This exception is thrown in case HTTP 409-Conflict is returned.
+ * This exception is thrown in case HTTP 400-Bad request is returned.
  */
-public class ConflictException extends RuntimeException {
+public class ServiceBadRequestException extends RuntimeException {
     /**
      * @param msg Message.
      */
-    public ConflictException(String msg) {
+    public ServiceBadRequestException(String msg) {
         super(msg);
     }
 }
diff --git a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/web/rest/exception/ConflictException.java b/tcbot-common/src/main/java/org/apache/ignite/tcbot/common/exeption/ServiceConflictException.java
similarity index 86%
rename from ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/web/rest/exception/ConflictException.java
rename to tcbot-common/src/main/java/org/apache/ignite/tcbot/common/exeption/ServiceConflictException.java
index f46b3f7..28dde9b 100644
--- a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/web/rest/exception/ConflictException.java
+++ b/tcbot-common/src/main/java/org/apache/ignite/tcbot/common/exeption/ServiceConflictException.java
@@ -15,18 +15,18 @@
  * limitations under the License.
  */
 
-package org.apache.ignite.ci.web.rest.exception;
+package org.apache.ignite.tcbot.common.exeption;
 
 /**
  * The request could not be completed due to a conflict with the current state of the target resource.
  *
  * This exception is thrown in case HTTP 409-Conflict is returned.
  */
-public class ConflictException extends RuntimeException {
+public class ServiceConflictException extends RuntimeException {
     /**
      * @param msg Message.
      */
-    public ConflictException(String msg) {
+    public ServiceConflictException(String msg) {
         super(msg);
     }
 }
diff --git a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/web/rest/exception/ServiceUnauthorizedException.java b/tcbot-common/src/main/java/org/apache/ignite/tcbot/common/exeption/ServiceUnauthorizedException.java
similarity index 74%
rename from ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/web/rest/exception/ServiceUnauthorizedException.java
rename to tcbot-common/src/main/java/org/apache/ignite/tcbot/common/exeption/ServiceUnauthorizedException.java
index 2978e6a..e096d22 100644
--- a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/web/rest/exception/ServiceUnauthorizedException.java
+++ b/tcbot-common/src/main/java/org/apache/ignite/tcbot/common/exeption/ServiceUnauthorizedException.java
@@ -15,18 +15,13 @@
  * limitations under the License.
  */
 
-package org.apache.ignite.ci.web.rest.exception;
-
-import javax.ws.rs.core.Response;
-import javax.ws.rs.ext.ExceptionMapper;
-import javax.ws.rs.ext.Provider;
+package org.apache.ignite.tcbot.common.exeption;
+;
 
 /**
  * Exception is thrown if 3rd party service returned 401 - unauthorized.
  */
-@Provider
-public class ServiceUnauthorizedException extends RuntimeException
-        implements ExceptionMapper<ServiceUnauthorizedException> {
+public class ServiceUnauthorizedException extends RuntimeException {
     public ServiceUnauthorizedException(String message) {
         super(message);
     }
@@ -39,9 +34,4 @@ public class ServiceUnauthorizedException extends RuntimeException
         return new ServiceUnauthorizedException("Service [" + srvId + "] is not available for current user");
     }
 
-    @Override
-    public Response toResponse(ServiceUnauthorizedException exception) {
-        return Response.status(424).entity(exception.getMessage())
-                .type("text/plain").build();
-    }
 }
diff --git a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/di/AutoProfiling.java b/tcbot-common/src/main/java/org/apache/ignite/tcbot/common/interceptor/AutoProfiling.java
similarity index 95%
rename from ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/di/AutoProfiling.java
rename to tcbot-common/src/main/java/org/apache/ignite/tcbot/common/interceptor/AutoProfiling.java
index e524fb9..e6146ee 100644
--- a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/di/AutoProfiling.java
+++ b/tcbot-common/src/main/java/org/apache/ignite/tcbot/common/interceptor/AutoProfiling.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/Base64Util.java b/tcbot-common/src/main/java/org/apache/ignite/tcbot/common/util/Base64Util.java
similarity index 93%
rename from ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/util/Base64Util.java
rename to tcbot-common/src/main/java/org/apache/ignite/tcbot/common/util/Base64Util.java
index 506c8aa..4dbee30 100644
--- a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/util/Base64Util.java
+++ b/tcbot-common/src/main/java/org/apache/ignite/tcbot/common/util/Base64Util.java
@@ -15,10 +15,9 @@
  * limitations under the License.
  */
 
-package org.apache.ignite.ci.util;
-
-import org.jetbrains.annotations.NotNull;
+package org.apache.ignite.tcbot.common.util;
 
+import javax.annotation.Nonnull;
 import java.nio.charset.Charset;
 import java.nio.charset.StandardCharsets;
 import java.util.Base64;
@@ -33,13 +32,13 @@ public class Base64Util {
         return encodeBytesToString(data.getBytes(CHARSET));
     }
 
-    @NotNull
+    @Nonnull
     public static String encodeBytesToString(byte[] bytes) {
         final byte[] encode = Base64.getEncoder().encode(bytes);
         return new String(encode, CHARSET);
     }
 
-    @NotNull
+    @Nonnull
     public static byte[] decodeString(String string) {
         return Base64.getDecoder().decode(string.getBytes(CHARSET));
     }
diff --git a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/util/HttpUtil.java b/tcbot-common/src/main/java/org/apache/ignite/tcbot/common/util/HttpUtil.java
similarity index 94%
rename from ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/util/HttpUtil.java
rename to tcbot-common/src/main/java/org/apache/ignite/tcbot/common/util/HttpUtil.java
index b39a4b4..ef5bc4c 100644
--- a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/util/HttpUtil.java
+++ b/tcbot-common/src/main/java/org/apache/ignite/tcbot/common/util/HttpUtil.java
@@ -15,7 +15,7 @@
  * limitations under the License.
  */
 
-package org.apache.ignite.ci.util;
+package org.apache.ignite.tcbot.common.util;
 
 import com.google.common.base.Stopwatch;
 import java.io.BufferedReader;
@@ -33,13 +33,14 @@ import java.nio.file.Files;
 import java.nio.file.StandardCopyOption;
 import java.util.Map;
 import java.util.concurrent.TimeUnit;
-import org.apache.ignite.ci.web.rest.exception.ConflictException;
-import org.apache.ignite.ci.web.rest.exception.ServiceUnauthorizedException;
-import org.jetbrains.annotations.Nullable;
+
+import org.apache.ignite.tcbot.common.exeption.ServiceUnauthorizedException;
+import org.apache.ignite.tcbot.common.exeption.ServiceBadRequestException;
+import org.apache.ignite.tcbot.common.exeption.ServiceConflictException;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
-import javax.ws.rs.BadRequestException;
+import javax.annotation.Nullable;
 
 /**
  * Methods for sending HTTP requests
@@ -75,7 +76,7 @@ public class HttpUtil {
      * @return Input stream from connection.
      * @throws IOException If failed.
      * @throws FileNotFoundException If not found (404) was returned from service.
-     * @throws ConflictException If conflict (409) was returned from service.
+     * @throws ServiceConflictException If conflict (409) was returned from service.
      * @throws IllegalStateException if some unexpected HTTP error returned.
      */
     public static InputStream sendGetWithBasicAuth(String basicAuthTok, String url) throws IOException {
@@ -177,7 +178,7 @@ public class HttpUtil {
      * @return Input stream from connection.
      * @throws IOException If communication failed.
      * @throws FileNotFoundException If not found (404) was returned from service.
-     * @throws ConflictException If conflict (409) was returned from service.
+     * @throws ServiceConflictException If conflict (409) was returned from service.
      * @throws IllegalStateException if some unexpected HTTP error returned.
      */
     private static InputStream getInputStream(HttpURLConnection con) throws IOException {
@@ -190,7 +191,7 @@ public class HttpUtil {
         String detailsFromResponeText = readIsToString(con.getErrorStream());
 
         if (resCode == 400)
-            throw new BadRequestException(detailsFromResponeText);
+            throw new ServiceBadRequestException(detailsFromResponeText);
 
         if (resCode == 401)
             throw new ServiceUnauthorizedException("Service " + con.getURL() + " returned forbidden error.");
@@ -199,7 +200,7 @@ public class HttpUtil {
             throw new FileNotFoundException("Service " + con.getURL() + " returned not found error. " + detailsFromResponeText);
 
         if (resCode == 409)
-            throw new ConflictException("Service " + con.getURL() + " returned Conflict Response Code :\n" + detailsFromResponeText);
+            throw new ServiceConflictException("Service " + con.getURL() + " returned Conflict Response Code :\n" + detailsFromResponeText);
 
         throw new IllegalStateException("Service " + con.getURL() + " returned Invalid Response Code : " + resCode + ":\n"
                 + detailsFromResponeText);
diff --git a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/util/ObjectInterner.java b/tcbot-common/src/main/java/org/apache/ignite/tcbot/common/util/ObjectInterner.java
similarity index 97%
rename from ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/util/ObjectInterner.java
rename to tcbot-common/src/main/java/org/apache/ignite/tcbot/common/util/ObjectInterner.java
index 9834d5c..4d997be 100644
--- a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/util/ObjectInterner.java
+++ b/tcbot-common/src/main/java/org/apache/ignite/tcbot/common/util/ObjectInterner.java
@@ -15,11 +15,13 @@
  * limitations under the License.
  */
 
-package org.apache.ignite.ci.util;
+package org.apache.ignite.tcbot.common.util;
 
 import com.google.common.cache.CacheBuilder;
 import com.google.common.cache.CacheLoader;
 import com.google.common.cache.LoadingCache;
+import org.apache.ignite.tcbot.common.exeption.ExceptionUtil;
+
 import java.lang.reflect.Field;
 import java.lang.reflect.Modifier;
 import java.util.Collection;
diff --git a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/util/TimeUtil.java b/tcbot-common/src/main/java/org/apache/ignite/tcbot/common/util/TimeUtil.java
similarity index 97%
rename from ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/util/TimeUtil.java
rename to tcbot-common/src/main/java/org/apache/ignite/tcbot/common/util/TimeUtil.java
index 36291ba..82ae16e 100644
--- a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/util/TimeUtil.java
+++ b/tcbot-common/src/main/java/org/apache/ignite/tcbot/common/util/TimeUtil.java
@@ -15,14 +15,14 @@
  * limitations under the License.
  */
 
-package org.apache.ignite.ci.util;
+package org.apache.ignite.tcbot.common.util;
 
 import java.text.ParseException;
 import java.text.SimpleDateFormat;
 import java.time.Duration;
 import java.util.Date;
 
-import org.jetbrains.annotations.Nullable;
+import javax.annotation.Nullable;
 
 /**
  * Time and duration util.
diff --git a/tc-bot-server/build.gradle b/tcbot-server/build.gradle
similarity index 97%
rename from tc-bot-server/build.gradle
rename to tcbot-server/build.gradle
index 2d6e2e3..3ffcf74 100644
--- a/tc-bot-server/build.gradle
+++ b/tcbot-server/build.gradle
@@ -47,6 +47,10 @@ distributions {
 }
 
 dependencies {
+    compile (project(":tcbot-common")) {
+        transitive = false
+    }
+
     compile (project(":ignite-tc-helper-web"))  {
         transitive = false
     }
diff --git a/tc-bot-server/header.txt b/tcbot-server/header.txt
similarity index 100%
copy from tc-bot-server/header.txt
copy to tcbot-server/header.txt
diff --git a/tc-bot-server/src/main/java/org/apache/ignite/ci/TcBotIgniteServerLauncher.java b/tcbot-server/src/main/java/org/apache/ignite/ci/TcBotIgniteServerLauncher.java
similarity index 95%
rename from tc-bot-server/src/main/java/org/apache/ignite/ci/TcBotIgniteServerLauncher.java
rename to tcbot-server/src/main/java/org/apache/ignite/ci/TcBotIgniteServerLauncher.java
index 0070dc9..c7011f4 100644
--- a/tc-bot-server/src/main/java/org/apache/ignite/ci/TcBotIgniteServerLauncher.java
+++ b/tcbot-server/src/main/java/org/apache/ignite/ci/TcBotIgniteServerLauncher.java
@@ -20,19 +20,19 @@ package org.apache.ignite.ci;
 import org.apache.ignite.Ignite;
 import org.apache.ignite.Ignition;
 import org.apache.ignite.ci.db.Ignite2Configurer;
-import org.apache.ignite.ci.db.TcHelperDb;
 import org.apache.ignite.configuration.DataRegionConfiguration;
 import org.apache.ignite.configuration.DataStorageConfiguration;
 import org.apache.ignite.configuration.IgniteConfiguration;
 import org.apache.ignite.configuration.WALMode;
 import org.apache.ignite.logger.slf4j.Slf4jLogger;
+import org.apache.ignite.tcbot.common.conf.TcBotWorkDir;
 
 import java.io.File;
 import java.io.IOException;
 
 public class TcBotIgniteServerLauncher {
     public static void main(String[] args) throws IOException {
-        final File workDir = HelperConfig.resolveWorkDir();
+        final File workDir = TcBotWorkDir.resolveWorkDir();
         Ignite2Configurer.configLogger(workDir, "tcbot_srv_logs");
 
         final IgniteConfiguration cfg = new IgniteConfiguration();
diff --git a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/tcmodel/result/ProblemOccurrencesRef.java b/tcbot-teamcity/build.gradle
similarity index 66%
copy from ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/tcmodel/result/ProblemOccurrencesRef.java
copy to tcbot-teamcity/build.gradle
index a382ddb..3ad28b8 100644
--- a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/tcmodel/result/ProblemOccurrencesRef.java
+++ b/tcbot-teamcity/build.gradle
@@ -15,18 +15,20 @@
  * limitations under the License.
  */
 
-package org.apache.ignite.ci.tcmodel.result;
+apply plugin: 'java'
+apply plugin: 'war'
 
-import javax.xml.bind.annotation.XmlAttribute;
-
-/**
- * Problem occurrences reference, short version with only reference
- */
-public class ProblemOccurrencesRef {
-    /** Href without host name to obtain full problems list. */
-    @XmlAttribute public String href;
+repositories {
+    mavenCentral()
+    mavenLocal()
+}
 
-    @XmlAttribute public long count;
+dependencies {
+    compile (project(":tcbot-common"));
 
-    @XmlAttribute public long newFailed;
+    /// 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'
 }
+ 
\ No newline at end of file
diff --git a/tc-bot-server/header.txt b/tcbot-teamcity/header.txt
similarity index 100%
rename from tc-bot-server/header.txt
rename to tcbot-teamcity/header.txt
diff --git a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/ITeamcity.java b/tcbot-teamcity/src/main/java/org/apache/ignite/tcservice/ITeamcity.java
similarity index 81%
rename from ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/ITeamcity.java
rename to tcbot-teamcity/src/main/java/org/apache/ignite/tcservice/ITeamcity.java
index 5757239..787b257 100644
--- a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/ITeamcity.java
+++ b/tcbot-teamcity/src/main/java/org/apache/ignite/tcservice/ITeamcity.java
@@ -15,19 +15,17 @@
  * limitations under the License.
  */
 
-package org.apache.ignite.ci;
+package org.apache.ignite.tcservice;
 
 import com.google.common.collect.Sets;
+import org.apache.ignite.tcbot.common.util.Base64Util;
+import org.apache.ignite.tcservice.model.user.User;
+
 import java.io.File;
 import java.util.Set;
 import java.util.concurrent.CompletableFuture;
 import java.util.concurrent.Executor;
 import java.util.concurrent.ExecutorService;
-import org.apache.ignite.ci.analysis.LogCheckResult;
-import org.apache.ignite.ci.analysis.SingleBuildRunCtx;
-import org.apache.ignite.ci.tcmodel.user.User;
-import org.apache.ignite.ci.teamcity.pure.ITeamcityConn;
-import org.apache.ignite.ci.util.Base64Util;
 
 /**
  * API for calling methods from REST service:
@@ -55,18 +53,8 @@ public interface ITeamcity extends ITeamcityConn {
     /** Fake property for addressing 'Suite Name'. */
     public String SUITE_NAME_PROPERTY = "_suiteName";
 
-    CompletableFuture<File> unzipFirstFile(CompletableFuture<File> fut);
-
     CompletableFuture<File> downloadBuildLogZip(int id);
 
-    /**
-     * Returns log analysis. Does not keep not zipped logs on disk.
-     * @param buildId Build ID.
-     * @param ctx Build results.
-     * @return
-     */
-    CompletableFuture<LogCheckResult> analyzeBuildLog(Integer buildId, SingleBuildRunCtx ctx);
-
     void setExecutor(ExecutorService pool);
 
     Executor getExecutor();
diff --git a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/teamcity/pure/ITeamcityConn.java b/tcbot-teamcity/src/main/java/org/apache/ignite/tcservice/ITeamcityConn.java
similarity index 83%
rename from ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/teamcity/pure/ITeamcityConn.java
rename to tcbot-teamcity/src/main/java/org/apache/ignite/tcservice/ITeamcityConn.java
index 934b58f..24738fc 100644
--- a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/teamcity/pure/ITeamcityConn.java
+++ b/tcbot-teamcity/src/main/java/org/apache/ignite/tcservice/ITeamcityConn.java
@@ -15,7 +15,7 @@
  * limitations under the License.
  */
 
-package org.apache.ignite.ci.teamcity.pure;
+package org.apache.ignite.tcservice;
 
 import java.io.FileNotFoundException;
 import java.io.UncheckedIOException;
@@ -25,20 +25,20 @@ import java.util.SortedSet;
 import java.util.concurrent.atomic.AtomicReference;
 import javax.annotation.Nonnull;
 import javax.annotation.Nullable;
-import org.apache.ignite.ci.tcbot.conf.ITcServerConfig;
-import org.apache.ignite.ci.tcmodel.agent.Agent;
-import org.apache.ignite.ci.tcmodel.changes.Change;
-import org.apache.ignite.ci.tcmodel.changes.ChangesList;
-import org.apache.ignite.ci.tcmodel.conf.BuildType;
-import org.apache.ignite.ci.tcmodel.conf.Project;
-import org.apache.ignite.ci.tcmodel.conf.bt.BuildTypeFull;
-import org.apache.ignite.ci.tcmodel.hist.BuildRef;
-import org.apache.ignite.ci.tcmodel.mute.MuteInfo;
-import org.apache.ignite.ci.tcmodel.result.Build;
-import org.apache.ignite.ci.tcmodel.result.problems.ProblemOccurrences;
-import org.apache.ignite.ci.tcmodel.result.stat.Statistics;
-import org.apache.ignite.ci.tcmodel.result.tests.TestOccurrencesFull;
-import org.apache.ignite.ci.web.rest.exception.ConflictException;
+import org.apache.ignite.tcservice.model.agent.Agent;
+import org.apache.ignite.tcservice.model.changes.Change;
+import org.apache.ignite.tcservice.model.changes.ChangesList;
+import org.apache.ignite.tcservice.model.conf.BuildType;
+import org.apache.ignite.tcservice.model.conf.Project;
+import org.apache.ignite.tcservice.model.conf.bt.BuildTypeFull;
+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.apache.ignite.tcservice.model.result.problems.ProblemOccurrences;
+import org.apache.ignite.tcservice.model.result.stat.Statistics;
+import org.apache.ignite.tcservice.model.result.tests.TestOccurrencesFull;
+import org.apache.ignite.tcbot.common.exeption.ServiceConflictException;
+import org.apache.ignite.tcbot.common.conf.ITcServerConfig;
 
 /**
  * Pure Teamcity Connection API for calling methods from REST service: <br>
@@ -47,7 +47,7 @@ import org.apache.ignite.ci.web.rest.exception.ConflictException;
  *
  * HTTP methods return following errors in case HTTP communication failures:
  * <ul><li>{@link UncheckedIOException} caused by {@link FileNotFoundException} - If not found (404) was returned from service.</li>
- * <li>{@link ConflictException} If conflict (409) was returned from service.</li>
+ * <li>{@link ServiceConflictException} If conflict (409) was returned from service.</li>
  * <li>{@link IllegalStateException} if some unexpected HTTP error returned.</li>
  * <li>{@link UncheckedIOException} in case communication failed.</ul>
  */
diff --git a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/IgniteTeamcityConnection.java b/tcbot-teamcity/src/main/java/org/apache/ignite/tcservice/IgniteTeamcityConnection.java
similarity index 66%
rename from ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/IgniteTeamcityConnection.java
rename to tcbot-teamcity/src/main/java/org/apache/ignite/tcservice/IgniteTeamcityConnection.java
index 314a923..af8cbac 100644
--- a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/IgniteTeamcityConnection.java
+++ b/tcbot-teamcity/src/main/java/org/apache/ignite/tcservice/IgniteTeamcityConnection.java
@@ -15,78 +15,54 @@
  * limitations under the License.
  */
 
-package org.apache.ignite.ci;
+package org.apache.ignite.tcservice;
 
-import com.google.common.base.Preconditions;
-import com.google.common.base.Stopwatch;
 import com.google.common.base.Strings;
 import com.google.common.util.concurrent.MoreExecutors;
-import java.io.File;
-import java.io.FileInputStream;
-import java.io.IOException;
-import java.io.InputStream;
-import java.io.InputStreamReader;
-import java.io.StringReader;
-import java.io.UncheckedIOException;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-import java.util.Objects;
-import java.util.SortedSet;
+import org.apache.ignite.tcservice.model.agent.Agent;
+import org.apache.ignite.tcservice.model.agent.AgentsRef;
+import org.apache.ignite.tcservice.model.changes.Change;
+import org.apache.ignite.tcservice.model.changes.ChangesList;
+import org.apache.ignite.tcservice.model.conf.BuildType;
+import org.apache.ignite.tcservice.model.conf.Project;
+import org.apache.ignite.tcservice.model.conf.ProjectsList;
+import org.apache.ignite.tcservice.model.conf.bt.BuildTypeFull;
+import org.apache.ignite.tcservice.model.hist.BuildRef;
+import org.apache.ignite.tcservice.model.hist.Builds;
+import org.apache.ignite.tcservice.model.mute.MuteInfo;
+import org.apache.ignite.tcservice.model.mute.Mutes;
+import org.apache.ignite.tcservice.model.result.Build;
+import org.apache.ignite.tcservice.model.result.problems.ProblemOccurrences;
+import org.apache.ignite.tcservice.model.result.stat.Statistics;
+import org.apache.ignite.tcservice.model.result.tests.TestOccurrencesFull;
+import org.apache.ignite.tcservice.model.user.User;
+import org.apache.ignite.tcservice.model.user.Users;
+import org.apache.ignite.tcservice.http.ITeamcityHttpConnection;
+import org.apache.ignite.tcservice.util.XmlUtil;
+import org.apache.ignite.tcbot.common.conf.ITcServerConfig;
+import org.apache.ignite.tcbot.common.conf.ITcServerConfigSupplier;
+import org.apache.ignite.tcbot.common.conf.TcBotWorkDir;
+import org.apache.ignite.tcbot.common.exeption.ExceptionUtil;
+import org.apache.ignite.tcbot.common.exeption.ServiceConflictException;
+import org.apache.ignite.tcbot.common.interceptor.AutoProfiling;
+import org.apache.ignite.tcbot.common.util.HttpUtil;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import javax.annotation.Nonnull;
+import javax.annotation.Nullable;
+import javax.inject.Inject;
+import javax.xml.bind.JAXBException;
+import java.io.*;
+import java.util.*;
 import java.util.concurrent.CompletableFuture;
-import java.util.concurrent.ConcurrentHashMap;
 import java.util.concurrent.Executor;
 import java.util.concurrent.ExecutorService;
-import java.util.concurrent.TimeUnit;
 import java.util.concurrent.atomic.AtomicReference;
 import java.util.function.Supplier;
 import java.util.stream.Collectors;
-import java.util.zip.ZipEntry;
-import java.util.zip.ZipInputStream;
-import javax.annotation.Nonnull;
-import javax.annotation.Nullable;
-import javax.inject.Inject;
-import javax.xml.bind.JAXBException;
-import org.apache.ignite.ci.analysis.ISuiteResults;
-import org.apache.ignite.ci.analysis.LogCheckResult;
-import org.apache.ignite.ci.analysis.LogCheckTask;
-import org.apache.ignite.ci.analysis.SingleBuildRunCtx;
-import org.apache.ignite.ci.di.AutoProfiling;
-import org.apache.ignite.ci.logs.BuildLogStreamChecker;
-import org.apache.ignite.ci.tcbot.conf.ITcBotConfig;
-import org.apache.ignite.ci.tcbot.conf.ITcServerConfig;
-import org.apache.ignite.ci.tcmodel.agent.Agent;
-import org.apache.ignite.ci.tcmodel.agent.AgentsRef;
-import org.apache.ignite.ci.tcmodel.changes.Change;
-import org.apache.ignite.ci.tcmodel.changes.ChangesList;
-import org.apache.ignite.ci.tcmodel.conf.BuildType;
-import org.apache.ignite.ci.tcmodel.conf.Project;
-import org.apache.ignite.ci.tcmodel.conf.ProjectsList;
-import org.apache.ignite.ci.tcmodel.conf.bt.BuildTypeFull;
-import org.apache.ignite.ci.tcmodel.hist.BuildRef;
-import org.apache.ignite.ci.tcmodel.hist.Builds;
-import org.apache.ignite.ci.tcmodel.mute.MuteInfo;
-import org.apache.ignite.ci.tcmodel.mute.Mutes;
-import org.apache.ignite.ci.tcmodel.result.Build;
-import org.apache.ignite.ci.tcmodel.result.problems.ProblemOccurrences;
-import org.apache.ignite.ci.tcmodel.result.stat.Statistics;
-import org.apache.ignite.ci.tcmodel.result.tests.TestOccurrencesFull;
-import org.apache.ignite.ci.tcmodel.user.User;
-import org.apache.ignite.ci.tcmodel.user.Users;
-import org.apache.ignite.ci.teamcity.pure.ITeamcityConn;
-import org.apache.ignite.ci.teamcity.pure.ITeamcityHttpConnection;
-import org.apache.ignite.ci.util.ExceptionUtil;
-import org.apache.ignite.ci.util.HttpUtil;
-import org.apache.ignite.ci.util.XmlUtil;
-import org.apache.ignite.ci.util.ZipUtil;
-import org.apache.ignite.ci.web.rest.exception.ConflictException;
-import org.jetbrains.annotations.NotNull;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
 
 import static java.util.concurrent.CompletableFuture.supplyAsync;
-import static org.apache.ignite.ci.HelperConfig.ensureDirExist;
-import static org.apache.ignite.ci.util.XmlUtil.xmlEscapeText;
 
 /**
  * Class for access to Teamcity REST API without any caching.
@@ -108,13 +84,10 @@ public class IgniteTeamcityConnection implements ITeamcity {
     /** Teamcity http connection. */
     @Inject private ITeamcityHttpConnection teamcityHttpConn;
 
-    @Inject private ITcBotConfig cfg;
+    @Inject private ITcServerConfigSupplier cfg;
 
     private String srvCode;
 
-    /** Build logger processing running. */
-    private ConcurrentHashMap<Integer, CompletableFuture<LogCheckTask>> buildLogProcessingRunning = new ConcurrentHashMap<>();
-
     public Executor getExecutor() {
         return executor;
     }
@@ -154,12 +127,11 @@ public class IgniteTeamcityConnection implements ITeamcity {
 
     @AutoProfiling
     public CompletableFuture<File> downloadBuildLogZip(int buildId) {
-        boolean archive = true;
         Supplier<File> supplier = () -> {
             String buildIdStr = Integer.toString(buildId);
-            final File buildDir = ensureDirExist(new File(logsDir(), "buildId" + buildIdStr));
+            final File buildDir = TcBotWorkDir.ensureDirExist(new File(logsDir(), "buildId" + buildIdStr));
             final File file = new File(buildDir,
-                "build.log" + (archive ? ".zip" : ""));
+                "build.log.zip");
             if (file.exists() && file.canRead() && file.length() > 0) {
                 logger.info("Nothing to do, file is cached locally: [" + file + "]");
 
@@ -179,43 +151,25 @@ public class IgniteTeamcityConnection implements ITeamcity {
         return supplyAsync(supplier, executor);
     }
 
+    private static File resolveLogs(File workDir, String logsProp) {
+        final File logsDirFileConfigured = new File(logsProp);
+        return logsDirFileConfigured.isAbsolute() ? logsDirFileConfigured : new File(workDir, logsProp);
+    }
+
     private File logsDir() {
-        File logsDirFile = HelperConfig.resolveLogs(
-                HelperConfig.resolveWorkDir(),
+        File logsDirFile = resolveLogs(
+                TcBotWorkDir.resolveWorkDir(),
                 config().logsDirectory());
 
-        return ensureDirExist(logsDirFile);
+        return TcBotWorkDir.ensureDirExist(logsDirFile);
     }
 
-    @AutoProfiling
-    @Override public CompletableFuture<LogCheckResult> analyzeBuildLog(Integer buildId, SingleBuildRunCtx ctx) {
-        final Stopwatch started = Stopwatch.createStarted();
-
-        CompletableFuture<LogCheckTask> fut = buildLogProcessingRunning.computeIfAbsent(buildId,
-            k -> checkBuildLogNoCache(k, ctx)
-        );
-
-        return fut
-            .thenApply(task -> {
-                buildLogProcessingRunning.remove(buildId, fut);
-
-                return task;
-            })
-            .thenApply(task -> {
-                logger.info(Thread.currentThread().getName()
-                    + ": processBuildLog required: " + started.elapsed(TimeUnit.MILLISECONDS)
-                    + "ms for " + ctx.suiteId());
-
-                return task;
-            })
-            .thenApply(LogCheckTask::getResult);
-    }
 
     /** {@inheritDoc} */
     @AutoProfiling
     @Override public Build triggerBuild(
         String buildTypeId,
-        @NotNull @Nonnull String branchName,
+        @Nonnull String branchName,
         boolean cleanRebuild,
         boolean queueAtTop,
         @Nullable Map<String, Object> buildParms
@@ -235,10 +189,10 @@ public class IgniteTeamcityConnection implements ITeamcity {
         if (buildParms != null)
             props.putAll(buildParms);
 
-        props.put(TCBOT_TRIGGER_TIME, System.currentTimeMillis()); //
+        props.put(ITeamcity.TCBOT_TRIGGER_TIME, System.currentTimeMillis()); //
 
         StringBuilder sb = new StringBuilder();
-        sb.append("<build branchName=\"").append(xmlEscapeText(branchName)).append("\">\n");
+        sb.append("<build branchName=\"").append(XmlUtil.xmlEscapeText(branchName)).append("\">\n");
         sb.append(" <buildType id=\"").append(buildTypeId).append("\"/>\n");
         sb.append(comments);
         sb.append(triggeringOptions);
@@ -246,7 +200,7 @@ public class IgniteTeamcityConnection implements ITeamcity {
 
         props.forEach((k, v) -> {
             sb.append("  <property name=\"").append(k).append("\"");
-            sb.append(" value=\"").append(xmlEscapeText(Objects.toString(v))).append("\"/>\n");
+            sb.append(" value=\"").append(XmlUtil.xmlEscapeText(Objects.toString(v))).append("\"/>\n");
         });
 
         sb.append(" </properties>\n");
@@ -302,19 +256,6 @@ public class IgniteTeamcityConnection implements ITeamcity {
         return getJaxbUsingHref(href, Change.class);
     }
 
-    private CompletableFuture<List<File>> unzip(CompletableFuture<File> zipFileFut) {
-        return zipFileFut.thenApplyAsync(ZipUtil::unZipToSameFolder, executor);
-    }
-
-    @AutoProfiling
-    public CompletableFuture<File> unzipFirstFile(CompletableFuture<File> fut) {
-        final CompletableFuture<List<File>> clearFileF = unzip(fut);
-        return clearFileF.thenApplyAsync(files -> {
-            Preconditions.checkState(!files.isEmpty(), "ZIP file can't be empty");
-            return files.get(0);
-        }, executor);
-    }
-
     /** {@inheritDoc} */
     @Override public List<Project> getProjects() {
         return sendGetXmlParseJaxb(host() + "app/rest/latest/projects", ProjectsList.class).projects();
@@ -331,7 +272,7 @@ public class IgniteTeamcityConnection implements ITeamcity {
      * @param rootElem Root elem.
      *
      * @throws UncheckedIOException caused by FileNotFoundException - If not found (404) was returned from service.
-     * @throws ConflictException If conflict (409) was returned from service.
+     * @throws ServiceConflictException If conflict (409) was returned from service.
      * @throws IllegalStateException if some unexpected HTTP error returned.
      * @throws UncheckedIOException in case communication failed.
      */
@@ -383,44 +324,6 @@ public class IgniteTeamcityConnection implements ITeamcity {
         return srvCode;
     }
 
-    private CompletableFuture<LogCheckTask> checkBuildLogNoCache(int buildId, ISuiteResults ctx) {
-        final CompletableFuture<File> zipFut = downloadBuildLogZip(buildId);
-        boolean dumpLastTest = ctx.hasSuiteIncompleteFailure();
-
-        return zipFut.thenApplyAsync(zipFile -> runCheckForZippedLog(dumpLastTest, zipFile), executor);
-    }
-
-    @SuppressWarnings("WeakerAccess")
-    @AutoProfiling
-    @NotNull protected LogCheckTask runCheckForZippedLog(boolean dumpLastTest, File zipFile) {
-        LogCheckTask task = new LogCheckTask(zipFile);
-
-        try {
-            //get the zip file content
-            try (ZipInputStream zis = new ZipInputStream(new FileInputStream(zipFile))) {
-                ZipEntry ze = zis.getNextEntry();    //get the zipped file list entry
-
-                while (ze != null) {
-                    BuildLogStreamChecker checker = task.createChecker();
-                    checker.apply(zis, zipFile);
-                    task.finalize(dumpLastTest);
-
-                    ze = zis.getNextEntry();
-                }
-                zis.closeEntry();
-            }
-        }
-        catch (IOException | UncheckedIOException e) {
-            final String msg = "Failed to process ZIPed entry " + zipFile;
-
-            System.err.println(msg);
-            e.printStackTrace();
-
-            logger.error(msg, e);
-        }
-
-        return task;
-    }
 
     /** {@inheritDoc} */
     @AutoProfiling
@@ -488,7 +391,7 @@ public class IgniteTeamcityConnection implements ITeamcity {
      * @param buildId Build id.
      * @param testDtls request test details string
      */
-    @NotNull
+    @Nonnull
     private String testsStartHref(int buildId, boolean testDtls) {
         String fieldList = "id,name," +
             (testDtls ? "details," : "") +
diff --git a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/teamcity/pure/TcRealConnectionModule.java b/tcbot-teamcity/src/main/java/org/apache/ignite/tcservice/TcRealConnectionModule.java
similarity index 82%
rename from ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/teamcity/pure/TcRealConnectionModule.java
rename to tcbot-teamcity/src/main/java/org/apache/ignite/tcservice/TcRealConnectionModule.java
index 14f2b89..5575330 100644
--- a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/teamcity/pure/TcRealConnectionModule.java
+++ b/tcbot-teamcity/src/main/java/org/apache/ignite/tcservice/TcRealConnectionModule.java
@@ -14,12 +14,15 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-package org.apache.ignite.ci.teamcity.pure;
+package org.apache.ignite.tcservice;
 
 import com.google.inject.AbstractModule;
 import com.google.inject.internal.SingletonScope;
-import org.apache.ignite.ci.ITeamcity;
-import org.apache.ignite.ci.IgniteTeamcityConnection;
+import org.apache.ignite.tcservice.http.ITeamcityHttpConnection;
+import org.apache.ignite.tcservice.http.TeamcityRecorder;
+import org.apache.ignite.tcservice.http.TeamcityRecordingConnection;
+import org.apache.ignite.tcservice.login.ITcLogin;
+import org.apache.ignite.tcservice.login.TcLoginImpl;
 
 /**
  * Guice module to setup real connected server and all related implementations.
@@ -29,9 +32,6 @@ public class TcRealConnectionModule extends AbstractModule {
 
     /** {@inheritDoc} */
     @Override protected void configure() {
-        //Simple connection
-        bind(ITeamcity.class).to(IgniteTeamcityConnection.class);
-
         if (conn != null)
             bind(ITeamcityHttpConnection.class).toInstance(conn);
         else
@@ -42,7 +42,6 @@ public class TcRealConnectionModule extends AbstractModule {
     }
 
     public void overrideHttp(ITeamcityHttpConnection conn) {
-
         this.conn = conn;
     }
 }
diff --git a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/teamcity/pure/FileRecordingInputStream.java b/tcbot-teamcity/src/main/java/org/apache/ignite/tcservice/http/FileRecordingInputStream.java
similarity index 95%
rename from ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/teamcity/pure/FileRecordingInputStream.java
rename to tcbot-teamcity/src/main/java/org/apache/ignite/tcservice/http/FileRecordingInputStream.java
index 45d1cdf..416399e 100644
--- a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/teamcity/pure/FileRecordingInputStream.java
+++ b/tcbot-teamcity/src/main/java/org/apache/ignite/tcservice/http/FileRecordingInputStream.java
@@ -15,12 +15,12 @@
  * limitations under the License.
  */
 
-package org.apache.ignite.ci.teamcity.pure;
+package org.apache.ignite.tcservice.http;
 
 import com.google.common.base.Charsets;
 import com.google.common.base.Preconditions;
-import org.jetbrains.annotations.NotNull;
 
+import javax.annotation.Nonnull;
 import java.io.FilterInputStream;
 import java.io.IOException;
 import java.io.InputStream;
@@ -64,7 +64,7 @@ public class FileRecordingInputStream extends FilterInputStream {
     }
 
     /** {@inheritDoc} */
-    @Override public int read(@NotNull byte[] buf, int off, int cnt) throws IOException {
+    @Override public int read(@Nonnull byte[] buf, int off, int cnt) throws IOException {
         Preconditions.checkState(!closeGuard.get());
 
         int readBytes = super.read(buf, off, cnt);
diff --git a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/teamcity/pure/ITeamcityHttpConnection.java b/tcbot-teamcity/src/main/java/org/apache/ignite/tcservice/http/ITeamcityHttpConnection.java
similarity index 86%
rename from ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/teamcity/pure/ITeamcityHttpConnection.java
rename to tcbot-teamcity/src/main/java/org/apache/ignite/tcservice/http/ITeamcityHttpConnection.java
index 950f7a5..9b222b5 100644
--- a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/teamcity/pure/ITeamcityHttpConnection.java
+++ b/tcbot-teamcity/src/main/java/org/apache/ignite/tcservice/http/ITeamcityHttpConnection.java
@@ -15,19 +15,20 @@
  * limitations under the License.
  */
 
-package org.apache.ignite.ci.teamcity.pure;
+package org.apache.ignite.tcservice.http;
+
+import org.apache.ignite.tcbot.common.exeption.ServiceConflictException;
 
 import java.io.FileNotFoundException;
 import java.io.IOException;
 import java.io.InputStream;
-import org.apache.ignite.ci.web.rest.exception.ConflictException;
 
 public interface ITeamcityHttpConnection {
     /**
      * @param basicAuthTok Basic auth token.
      * @param url Url.
      * @throws FileNotFoundException If not found (404) was returned from service.
-     * @throws ConflictException If conflict (409) was returned from service.
+     * @throws ServiceConflictException If conflict (409) was returned from service.
      * @throws IllegalStateException if some unexpected HTTP error returned.
      */
     public InputStream sendGet(String basicAuthTok, String url) throws IOException;
diff --git a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/teamcity/pure/TeamcityRecorder.java b/tcbot-teamcity/src/main/java/org/apache/ignite/tcservice/http/TeamcityRecorder.java
similarity index 90%
rename from ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/teamcity/pure/TeamcityRecorder.java
rename to tcbot-teamcity/src/main/java/org/apache/ignite/tcservice/http/TeamcityRecorder.java
index 4bd0b81..61d0b4a 100644
--- a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/teamcity/pure/TeamcityRecorder.java
+++ b/tcbot-teamcity/src/main/java/org/apache/ignite/tcservice/http/TeamcityRecorder.java
@@ -15,16 +15,16 @@
  * limitations under the License.
  */
 
-package org.apache.ignite.ci.teamcity.pure;
+package org.apache.ignite.tcservice.http;
 
 import com.google.common.base.Charsets;
+import org.apache.ignite.tcbot.common.conf.TcBotSystemProperties;
 
-import java.io.*;
-import java.util.ArrayList;
-import java.util.List;
-import java.util.concurrent.ConcurrentLinkedQueue;
+import java.io.FileOutputStream;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.OutputStream;
 import java.util.concurrent.locks.ReentrantLock;
-import org.apache.ignite.ci.tcbot.TcBotSystemProperties;
 
 /**
  *
diff --git a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/teamcity/pure/TeamcityRecordingConnection.java b/tcbot-teamcity/src/main/java/org/apache/ignite/tcservice/http/TeamcityRecordingConnection.java
similarity index 92%
rename from ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/teamcity/pure/TeamcityRecordingConnection.java
rename to tcbot-teamcity/src/main/java/org/apache/ignite/tcservice/http/TeamcityRecordingConnection.java
index 4b0306c..7a93b4e 100644
--- a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/teamcity/pure/TeamcityRecordingConnection.java
+++ b/tcbot-teamcity/src/main/java/org/apache/ignite/tcservice/http/TeamcityRecordingConnection.java
@@ -14,9 +14,9 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-package org.apache.ignite.ci.teamcity.pure;
+package org.apache.ignite.tcservice.http;
 
-import org.apache.ignite.ci.util.HttpUtil;
+import org.apache.ignite.tcbot.common.util.HttpUtil;
 
 import javax.inject.Inject;
 import java.io.IOException;
diff --git a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/teamcity/pure/ITcLogin.java b/tcbot-teamcity/src/main/java/org/apache/ignite/tcservice/login/ITcLogin.java
similarity index 92%
rename from ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/teamcity/pure/ITcLogin.java
rename to tcbot-teamcity/src/main/java/org/apache/ignite/tcservice/login/ITcLogin.java
index 7fb46b2..458c094 100644
--- a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/teamcity/pure/ITcLogin.java
+++ b/tcbot-teamcity/src/main/java/org/apache/ignite/tcservice/login/ITcLogin.java
@@ -14,9 +14,9 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-package org.apache.ignite.ci.teamcity.pure;
+package org.apache.ignite.tcservice.login;
 
-import org.apache.ignite.ci.tcmodel.user.User;
+import org.apache.ignite.tcservice.model.user.User;
 
 /**
  * Teamcity Login implementation.
diff --git a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/teamcity/pure/TcLoginImpl.java b/tcbot-teamcity/src/main/java/org/apache/ignite/tcservice/login/TcLoginImpl.java
similarity index 88%
rename from ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/teamcity/pure/TcLoginImpl.java
rename to tcbot-teamcity/src/main/java/org/apache/ignite/tcservice/login/TcLoginImpl.java
index 0ae875b..2c25f55 100644
--- a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/teamcity/pure/TcLoginImpl.java
+++ b/tcbot-teamcity/src/main/java/org/apache/ignite/tcservice/login/TcLoginImpl.java
@@ -14,12 +14,11 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-package org.apache.ignite.ci.teamcity.pure;
+package org.apache.ignite.tcservice.login;
 
-import org.apache.ignite.ci.ITeamcity;
-import org.apache.ignite.ci.IgniteTeamcityConnection;
-import org.apache.ignite.ci.tcmodel.user.User;
-import org.apache.ignite.ci.web.rest.exception.ServiceUnauthorizedException;
+import org.apache.ignite.tcservice.IgniteTeamcityConnection;
+import org.apache.ignite.tcservice.model.user.User;
+import org.apache.ignite.tcbot.common.exeption.ServiceUnauthorizedException;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
@@ -29,7 +28,7 @@ import javax.inject.Provider;
 /**
  * Real implementation of login based on getting current user preferences from the server.
  */
-class TcLoginImpl implements ITcLogin {
+public class TcLoginImpl implements ITcLogin {
     /** Logger. */
     private static final Logger logger = LoggerFactory.getLogger(TcLoginImpl.class);
 
diff --git a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/tcmodel/ParameterType.java b/tcbot-teamcity/src/main/java/org/apache/ignite/tcservice/model/ParameterType.java
similarity index 98%
rename from ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/tcmodel/ParameterType.java
rename to tcbot-teamcity/src/main/java/org/apache/ignite/tcservice/model/ParameterType.java
index bdfd766..9c4df28 100644
--- a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/tcmodel/ParameterType.java
+++ b/tcbot-teamcity/src/main/java/org/apache/ignite/tcservice/model/ParameterType.java
@@ -15,7 +15,7 @@
  * limitations under the License.
  */
 
-package org.apache.ignite.ci.tcmodel;
+package org.apache.ignite.tcservice.model;
 
 import javax.xml.bind.annotation.XmlAccessType;
 import javax.xml.bind.annotation.XmlAccessorType;
diff --git a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/tcmodel/Properties.java b/tcbot-teamcity/src/main/java/org/apache/ignite/tcservice/model/Properties.java
similarity index 98%
rename from ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/tcmodel/Properties.java
rename to tcbot-teamcity/src/main/java/org/apache/ignite/tcservice/model/Properties.java
index 192ec42..145167d 100644
--- a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/tcmodel/Properties.java
+++ b/tcbot-teamcity/src/main/java/org/apache/ignite/tcservice/model/Properties.java
@@ -15,7 +15,7 @@
  * limitations under the License.
  */
 
-package org.apache.ignite.ci.tcmodel;
+package org.apache.ignite.tcservice.model;
 
 import java.util.ArrayList;
 import java.util.List;
diff --git a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/tcmodel/Property.java b/tcbot-teamcity/src/main/java/org/apache/ignite/tcservice/model/Property.java
similarity index 98%
rename from ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/tcmodel/Property.java
rename to tcbot-teamcity/src/main/java/org/apache/ignite/tcservice/model/Property.java
index 2b30a92..3383384 100644
--- a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/tcmodel/Property.java
+++ b/tcbot-teamcity/src/main/java/org/apache/ignite/tcservice/model/Property.java
@@ -15,7 +15,7 @@
  * limitations under the License.
  */
 
-package org.apache.ignite.ci.tcmodel;
+package org.apache.ignite.tcservice.model;
 
 import javax.xml.bind.annotation.XmlAccessType;
 import javax.xml.bind.annotation.XmlAccessorType;
diff --git a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/tcmodel/agent/Agent.java b/tcbot-teamcity/src/main/java/org/apache/ignite/tcservice/model/agent/Agent.java
similarity index 98%
rename from ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/tcmodel/agent/Agent.java
rename to tcbot-teamcity/src/main/java/org/apache/ignite/tcservice/model/agent/Agent.java
index b082cff..e1ff564 100644
--- a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/tcmodel/agent/Agent.java
+++ b/tcbot-teamcity/src/main/java/org/apache/ignite/tcservice/model/agent/Agent.java
@@ -15,15 +15,15 @@
  * limitations under the License.
  */
 
-package org.apache.ignite.ci.tcmodel.agent;
+package org.apache.ignite.tcservice.model.agent;
 
 import javax.xml.bind.annotation.XmlAccessType;
 import javax.xml.bind.annotation.XmlAccessorType;
 import javax.xml.bind.annotation.XmlAttribute;
 import javax.xml.bind.annotation.XmlElement;
 import javax.xml.bind.annotation.XmlRootElement;
-import org.apache.ignite.ci.tcmodel.Properties;
-import org.apache.ignite.ci.tcmodel.hist.BuildRef;
+import org.apache.ignite.tcservice.model.Properties;
+import org.apache.ignite.tcservice.model.hist.BuildRef;
 
 /**
  * <p>Java class for agent complex type.
diff --git a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/tcmodel/agent/AgentPoolRef.java b/tcbot-teamcity/src/main/java/org/apache/ignite/tcservice/model/agent/AgentPoolRef.java
similarity index 98%
rename from ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/tcmodel/agent/AgentPoolRef.java
rename to tcbot-teamcity/src/main/java/org/apache/ignite/tcservice/model/agent/AgentPoolRef.java
index d3a6988..c1994a9 100644
--- a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/tcmodel/agent/AgentPoolRef.java
+++ b/tcbot-teamcity/src/main/java/org/apache/ignite/tcservice/model/agent/AgentPoolRef.java
@@ -15,7 +15,7 @@
  * limitations under the License.
  */
 
-package org.apache.ignite.ci.tcmodel.agent;
+package org.apache.ignite.tcservice.model.agent;
 
 import javax.xml.bind.annotation.XmlAccessType;
 import javax.xml.bind.annotation.XmlAccessorType;
diff --git a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/tcmodel/agent/AgentRef.java b/tcbot-teamcity/src/main/java/org/apache/ignite/tcservice/model/agent/AgentRef.java
similarity index 98%
rename from ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/tcmodel/agent/AgentRef.java
rename to tcbot-teamcity/src/main/java/org/apache/ignite/tcservice/model/agent/AgentRef.java
index d2f3b38..63696b4 100644
--- a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/tcmodel/agent/AgentRef.java
+++ b/tcbot-teamcity/src/main/java/org/apache/ignite/tcservice/model/agent/AgentRef.java
@@ -15,13 +15,13 @@
  * limitations under the License.
  */
 
-package org.apache.ignite.ci.tcmodel.agent;
+package org.apache.ignite.tcservice.model.agent;
 
 import javax.xml.bind.annotation.XmlAccessType;
 import javax.xml.bind.annotation.XmlAccessorType;
 import javax.xml.bind.annotation.XmlAttribute;
 import javax.xml.bind.annotation.XmlType;
-import org.apache.ignite.ci.tcmodel.Properties;
+import org.apache.ignite.tcservice.model.Properties;
 
 /**
  * <p>Java class for agent complex type.
diff --git a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/tcmodel/agent/AgentsRef.java b/tcbot-teamcity/src/main/java/org/apache/ignite/tcservice/model/agent/AgentsRef.java
similarity index 98%
rename from ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/tcmodel/agent/AgentsRef.java
rename to tcbot-teamcity/src/main/java/org/apache/ignite/tcservice/model/agent/AgentsRef.java
index 092d9f4..651de3d 100644
--- a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/tcmodel/agent/AgentsRef.java
+++ b/tcbot-teamcity/src/main/java/org/apache/ignite/tcservice/model/agent/AgentsRef.java
@@ -15,7 +15,7 @@
  * limitations under the License.
  */
 
-package org.apache.ignite.ci.tcmodel.agent;
+package org.apache.ignite.tcservice.model.agent;
 
 import java.util.ArrayList;
 import java.util.List;
diff --git a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/tcmodel/changes/Change.java b/tcbot-teamcity/src/main/java/org/apache/ignite/tcservice/model/changes/Change.java
similarity index 83%
rename from ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/tcmodel/changes/Change.java
rename to tcbot-teamcity/src/main/java/org/apache/ignite/tcservice/model/changes/Change.java
index 5cfc364..ae66cb9 100644
--- a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/tcmodel/changes/Change.java
+++ b/tcbot-teamcity/src/main/java/org/apache/ignite/tcservice/model/changes/Change.java
@@ -15,24 +15,23 @@
  * limitations under the License.
  */
 
-package  org.apache.ignite.ci.tcmodel.changes;
+package org.apache.ignite.tcservice.model.changes;
 
+import javax.annotation.Nullable;
 import javax.xml.bind.annotation.XmlElement;
 import javax.xml.bind.annotation.XmlRootElement;
-import org.apache.ignite.ci.db.Persisted;
-import org.apache.ignite.ci.tcmodel.user.UserRef;
-import org.jetbrains.annotations.Nullable;
+import org.apache.ignite.tcservice.model.user.UserRef;
 
 /**
  * VCS change reported by Teamcity
  */
 @XmlRootElement(name = "change")
-@Persisted
 public class Change extends ChangeRef {
     /** Comment text */
     @XmlElement public String comment;
 
-    @Nullable @XmlElement public UserRef user;
+    @Nullable
+    @XmlElement public UserRef user;
 
     public boolean isFakeStub() {
         return getId() == null;
diff --git a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/tcmodel/changes/ChangeRef.java b/tcbot-teamcity/src/main/java/org/apache/ignite/tcservice/model/changes/ChangeRef.java
similarity index 90%
rename from ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/tcmodel/changes/ChangeRef.java
rename to tcbot-teamcity/src/main/java/org/apache/ignite/tcservice/model/changes/ChangeRef.java
index a66dbc2..dc92901 100644
--- a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/tcmodel/changes/ChangeRef.java
+++ b/tcbot-teamcity/src/main/java/org/apache/ignite/tcservice/model/changes/ChangeRef.java
@@ -15,7 +15,7 @@
  * limitations under the License.
  */
 
-package org.apache.ignite.ci.tcmodel.changes;
+package org.apache.ignite.tcservice.model.changes;
 
 import com.google.common.base.Strings;
 import java.text.ParseException;
@@ -24,15 +24,13 @@ import javax.xml.bind.annotation.XmlAccessType;
 import javax.xml.bind.annotation.XmlAccessorType;
 import javax.xml.bind.annotation.XmlAttribute;
 import javax.xml.bind.annotation.XmlTransient;
-import org.apache.ignite.ci.db.Persisted;
-import org.apache.ignite.ci.tcmodel.result.AbstractRef;
+import org.apache.ignite.tcservice.model.result.AbstractRef;
 
-import static org.apache.ignite.ci.util.ExceptionUtil.propagateException;
+import static org.apache.ignite.tcbot.common.exeption.ExceptionUtil.propagateException;
 
 /**
  * Change short version.
  */
-@Persisted
 @XmlAccessorType(XmlAccessType.FIELD)
 public class ChangeRef extends AbstractRef {
     @XmlAttribute public String id;
diff --git a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/tcmodel/changes/ChangesList.java b/tcbot-teamcity/src/main/java/org/apache/ignite/tcservice/model/changes/ChangesList.java
similarity index 93%
rename from ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/tcmodel/changes/ChangesList.java
rename to tcbot-teamcity/src/main/java/org/apache/ignite/tcservice/model/changes/ChangesList.java
index 8ca0ed2..c080f92 100644
--- a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/tcmodel/changes/ChangesList.java
+++ b/tcbot-teamcity/src/main/java/org/apache/ignite/tcservice/model/changes/ChangesList.java
@@ -15,19 +15,17 @@
  * limitations under the License.
  */
 
-package org.apache.ignite.ci.tcmodel.changes;
+package org.apache.ignite.tcservice.model.changes;
 
 import java.util.Collections;
 import java.util.List;
 import javax.xml.bind.annotation.XmlElement;
 import javax.xml.bind.annotation.XmlRootElement;
-import org.apache.ignite.ci.db.Persisted;
 
 /**
  * List of changes from TC.
  */
 @XmlRootElement(name = "changes")
-@Persisted
 public class ChangesList extends ChangesListRef {
     @XmlElement(name = "change")
     public List<ChangeRef> changes;
diff --git a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/tcmodel/changes/ChangesListRef.java b/tcbot-teamcity/src/main/java/org/apache/ignite/tcservice/model/changes/ChangesListRef.java
similarity index 88%
rename from ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/tcmodel/changes/ChangesListRef.java
rename to tcbot-teamcity/src/main/java/org/apache/ignite/tcservice/model/changes/ChangesListRef.java
index 592f9f8..53f9fec 100644
--- a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/tcmodel/changes/ChangesListRef.java
+++ b/tcbot-teamcity/src/main/java/org/apache/ignite/tcservice/model/changes/ChangesListRef.java
@@ -15,9 +15,9 @@
  * limitations under the License.
  */
 
-package org.apache.ignite.ci.tcmodel.changes;
+package org.apache.ignite.tcservice.model.changes;
 
-import org.apache.ignite.ci.tcmodel.result.AbstractRef;
+import org.apache.ignite.tcservice.model.result.AbstractRef;
 
 /**
  * Reference to list of changes.
diff --git a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/tcmodel/conf/BuildType.java b/tcbot-teamcity/src/main/java/org/apache/ignite/tcservice/model/conf/BuildType.java
similarity index 96%
rename from ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/tcmodel/conf/BuildType.java
rename to tcbot-teamcity/src/main/java/org/apache/ignite/tcservice/model/conf/BuildType.java
index 3f7a0ef..ba40e5a 100644
--- a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/tcmodel/conf/BuildType.java
+++ b/tcbot-teamcity/src/main/java/org/apache/ignite/tcservice/model/conf/BuildType.java
@@ -15,13 +15,13 @@
  * limitations under the License.
  */
 
-package org.apache.ignite.ci.tcmodel.conf;
+package org.apache.ignite.tcservice.model.conf;
 
 import java.util.Objects;
 import javax.xml.bind.annotation.XmlAccessType;
 import javax.xml.bind.annotation.XmlAccessorType;
 import javax.xml.bind.annotation.XmlAttribute;
-import org.apache.ignite.ci.tcmodel.result.AbstractRef;
+import org.apache.ignite.tcservice.model.result.AbstractRef;
 
 /**
  * Build type reference
diff --git a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/tcmodel/conf/Project.java b/tcbot-teamcity/src/main/java/org/apache/ignite/tcservice/model/conf/Project.java
similarity index 97%
rename from ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/tcmodel/conf/Project.java
rename to tcbot-teamcity/src/main/java/org/apache/ignite/tcservice/model/conf/Project.java
index e27736d..ec47b43 100644
--- a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/tcmodel/conf/Project.java
+++ b/tcbot-teamcity/src/main/java/org/apache/ignite/tcservice/model/conf/Project.java
@@ -15,7 +15,7 @@
  * limitations under the License.
  */
 
-package org.apache.ignite.ci.tcmodel.conf;
+package org.apache.ignite.tcservice.model.conf;
 
 import java.util.Collections;
 import java.util.List;
diff --git a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/tcmodel/conf/ProjectsList.java b/tcbot-teamcity/src/main/java/org/apache/ignite/tcservice/model/conf/ProjectsList.java
similarity index 87%
rename from ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/tcmodel/conf/ProjectsList.java
rename to tcbot-teamcity/src/main/java/org/apache/ignite/tcservice/model/conf/ProjectsList.java
index 1a9594a..2af7a78 100644
--- a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/tcmodel/conf/ProjectsList.java
+++ b/tcbot-teamcity/src/main/java/org/apache/ignite/tcservice/model/conf/ProjectsList.java
@@ -15,14 +15,14 @@
  * limitations under the License.
  */
 
-package org.apache.ignite.ci.tcmodel.conf;
+package org.apache.ignite.tcservice.model.conf;
 
 import java.util.Collections;
 import java.util.List;
 import javax.xml.bind.annotation.XmlElement;
 import javax.xml.bind.annotation.XmlRootElement;
-import org.apache.ignite.ci.tcmodel.changes.ChangesListRef;
-import org.jetbrains.annotations.NotNull;
+import org.apache.ignite.tcservice.model.changes.ChangesListRef;
+import org.checkerframework.checker.nullness.qual.NonNull;
 
 /**
  * List of Projects available at TC.
@@ -44,7 +44,8 @@ public class ProjectsList extends ChangesListRef {
     }
 
     /** */
-    @NotNull public List<Project> projects() {
+    @NonNull
+    public List<Project> projects() {
         return projects == null ? Collections.emptyList() : Collections.unmodifiableList(projects);
     }
 }
diff --git a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/tcmodel/conf/bt/BuildTypeFull.java b/tcbot-teamcity/src/main/java/org/apache/ignite/tcservice/model/conf/bt/BuildTypeFull.java
similarity index 93%
rename from ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/tcmodel/conf/bt/BuildTypeFull.java
rename to tcbot-teamcity/src/main/java/org/apache/ignite/tcservice/model/conf/bt/BuildTypeFull.java
index 73360be..587e709 100644
--- a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/tcmodel/conf/bt/BuildTypeFull.java
+++ b/tcbot-teamcity/src/main/java/org/apache/ignite/tcservice/model/conf/bt/BuildTypeFull.java
@@ -15,22 +15,22 @@
  * limitations under the License.
  */
 
-package org.apache.ignite.ci.tcmodel.conf.bt;
+package org.apache.ignite.tcservice.model.conf.bt;
 
 import java.util.Collections;
 import java.util.List;
+import javax.annotation.Nullable;
 import javax.xml.bind.annotation.XmlAccessType;
 import javax.xml.bind.annotation.XmlAccessorType;
 import javax.xml.bind.annotation.XmlElement;
 import javax.xml.bind.annotation.XmlRootElement;
-import org.jetbrains.annotations.Nullable;
 
 /**
  * Full build type settings.
  */
 @XmlRootElement(name = "buildType")
 @XmlAccessorType(XmlAccessType.FIELD)
-public class BuildTypeFull extends org.apache.ignite.ci.tcmodel.conf.BuildType {
+public class BuildTypeFull extends org.apache.ignite.tcservice.model.conf.BuildType {
     @XmlElement(name = "settings")
     Parameters settings;
 
diff --git a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/tcmodel/conf/bt/Parameters.java b/tcbot-teamcity/src/main/java/org/apache/ignite/tcservice/model/conf/bt/Parameters.java
similarity index 95%
rename from ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/tcmodel/conf/bt/Parameters.java
rename to tcbot-teamcity/src/main/java/org/apache/ignite/tcservice/model/conf/bt/Parameters.java
index 9f92e33..1c6ff7f 100644
--- a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/tcmodel/conf/bt/Parameters.java
+++ b/tcbot-teamcity/src/main/java/org/apache/ignite/tcservice/model/conf/bt/Parameters.java
@@ -15,7 +15,7 @@
  * limitations under the License.
  */
 
-package org.apache.ignite.ci.tcmodel.conf.bt;
+package org.apache.ignite.tcservice.model.conf.bt;
 
 import com.google.common.base.MoreObjects;
 import java.util.ArrayList;
@@ -23,10 +23,10 @@ import java.util.Collections;
 import java.util.List;
 import java.util.Objects;
 import java.util.Optional;
+import javax.annotation.Nullable;
 import javax.xml.bind.annotation.XmlAccessType;
 import javax.xml.bind.annotation.XmlAccessorType;
 import javax.xml.bind.annotation.XmlElement;
-import org.jetbrains.annotations.Nullable;
 
 /**
  * Collection of parameters in build
@@ -46,7 +46,8 @@ public class Parameters {
     /**
      * @param key Key of parameter.
      */
-    @Nullable public String getParameter(String key) {
+    @Nullable
+    public String getParameter(String key) {
         if (properties == null)
             return null;
 
diff --git a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/tcmodel/conf/bt/Property.java b/tcbot-teamcity/src/main/java/org/apache/ignite/tcservice/model/conf/bt/Property.java
similarity index 96%
rename from ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/tcmodel/conf/bt/Property.java
rename to tcbot-teamcity/src/main/java/org/apache/ignite/tcservice/model/conf/bt/Property.java
index 3f87d0a..c9aec3d 100644
--- a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/tcmodel/conf/bt/Property.java
+++ b/tcbot-teamcity/src/main/java/org/apache/ignite/tcservice/model/conf/bt/Property.java
@@ -15,14 +15,14 @@
  * limitations under the License.
  */
 
-package org.apache.ignite.ci.tcmodel.conf.bt;
+package org.apache.ignite.tcservice.model.conf.bt;
 
 import com.google.common.base.MoreObjects;
 import java.util.Objects;
+import javax.annotation.Nullable;
 import javax.xml.bind.annotation.XmlAccessType;
 import javax.xml.bind.annotation.XmlAccessorType;
 import javax.xml.bind.annotation.XmlAttribute;
-import org.jetbrains.annotations.Nullable;
 
 /**
  * Any property in builds or other configs.
diff --git a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/tcmodel/conf/bt/SnapshotDependencies.java b/tcbot-teamcity/src/main/java/org/apache/ignite/tcservice/model/conf/bt/SnapshotDependencies.java
similarity index 97%
rename from ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/tcmodel/conf/bt/SnapshotDependencies.java
rename to tcbot-teamcity/src/main/java/org/apache/ignite/tcservice/model/conf/bt/SnapshotDependencies.java
index f35629c..6d29b00 100644
--- a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/tcmodel/conf/bt/SnapshotDependencies.java
+++ b/tcbot-teamcity/src/main/java/org/apache/ignite/tcservice/model/conf/bt/SnapshotDependencies.java
@@ -15,7 +15,7 @@
  * limitations under the License.
  */
 
-package org.apache.ignite.ci.tcmodel.conf.bt;
+package org.apache.ignite.tcservice.model.conf.bt;
 
 import com.google.common.base.MoreObjects;
 import java.util.ArrayList;
diff --git a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/tcmodel/conf/bt/SnapshotDependency.java b/tcbot-teamcity/src/main/java/org/apache/ignite/tcservice/model/conf/bt/SnapshotDependency.java
similarity index 96%
rename from ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/tcmodel/conf/bt/SnapshotDependency.java
rename to tcbot-teamcity/src/main/java/org/apache/ignite/tcservice/model/conf/bt/SnapshotDependency.java
index 983a9b4..730ce1a 100644
--- a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/tcmodel/conf/bt/SnapshotDependency.java
+++ b/tcbot-teamcity/src/main/java/org/apache/ignite/tcservice/model/conf/bt/SnapshotDependency.java
@@ -15,7 +15,7 @@
  * limitations under the License.
  */
 
-package org.apache.ignite.ci.tcmodel.conf.bt;
+package org.apache.ignite.tcservice.model.conf.bt;
 
 import com.google.common.base.MoreObjects;
 import java.util.Objects;
@@ -23,7 +23,7 @@ import javax.xml.bind.annotation.XmlAccessType;
 import javax.xml.bind.annotation.XmlAccessorType;
 import javax.xml.bind.annotation.XmlAttribute;
 import javax.xml.bind.annotation.XmlElement;
-import org.apache.ignite.ci.tcmodel.conf.BuildType;
+import org.apache.ignite.tcservice.model.conf.BuildType;
 
 /**
  * Snapshot dependency.
diff --git a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/tcmodel/hist/BuildRef.java b/tcbot-teamcity/src/main/java/org/apache/ignite/tcservice/model/hist/BuildRef.java
similarity index 98%
rename from ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/tcmodel/hist/BuildRef.java
rename to tcbot-teamcity/src/main/java/org/apache/ignite/tcservice/model/hist/BuildRef.java
index 491a062..14cec20 100644
--- a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/tcmodel/hist/BuildRef.java
+++ b/tcbot-teamcity/src/main/java/org/apache/ignite/tcservice/model/hist/BuildRef.java
@@ -15,14 +15,14 @@
  * limitations under the License.
  */
 
-package org.apache.ignite.ci.tcmodel.hist;
+package org.apache.ignite.tcservice.model.hist;
 
 import com.google.common.base.MoreObjects;
 import java.util.Objects;
 import javax.xml.bind.annotation.XmlAccessType;
 import javax.xml.bind.annotation.XmlAccessorType;
 import javax.xml.bind.annotation.XmlAttribute;
-import org.apache.ignite.ci.tcmodel.result.AbstractRef;
+import org.apache.ignite.tcservice.model.result.AbstractRef;
 
 /**
  * Actual result of build execution from build history,
diff --git a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/tcmodel/hist/Builds.java b/tcbot-teamcity/src/main/java/org/apache/ignite/tcservice/model/hist/Builds.java
similarity index 97%
rename from ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/tcmodel/hist/Builds.java
rename to tcbot-teamcity/src/main/java/org/apache/ignite/tcservice/model/hist/Builds.java
index 0de40d5..5878ce2 100644
--- a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/tcmodel/hist/Builds.java
+++ b/tcbot-teamcity/src/main/java/org/apache/ignite/tcservice/model/hist/Builds.java
@@ -15,7 +15,7 @@
  * limitations under the License.
  */
 
-package org.apache.ignite.ci.tcmodel.hist;
+package org.apache.ignite.tcservice.model.hist;
 
 import java.util.Collections;
 import java.util.List;
diff --git a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/tcmodel/mute/MuteAssignment.java b/tcbot-teamcity/src/main/java/org/apache/ignite/tcservice/model/mute/MuteAssignment.java
similarity index 93%
rename from ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/tcmodel/mute/MuteAssignment.java
rename to tcbot-teamcity/src/main/java/org/apache/ignite/tcservice/model/mute/MuteAssignment.java
index d70f894..11c279a 100644
--- a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/tcmodel/mute/MuteAssignment.java
+++ b/tcbot-teamcity/src/main/java/org/apache/ignite/tcservice/model/mute/MuteAssignment.java
@@ -15,11 +15,11 @@
  * limitations under the License.
  */
 
-package org.apache.ignite.ci.tcmodel.mute;
+package org.apache.ignite.tcservice.model.mute;
 
 import javax.xml.bind.annotation.XmlElement;
 import javax.xml.bind.annotation.XmlRootElement;
-import org.apache.ignite.ci.util.TimeUtil;
+import org.apache.ignite.tcbot.common.util.TimeUtil;
 
 /**
  * Mute additional information. Contains mute date and it's comment.
diff --git a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/tcmodel/mute/MuteInfo.java b/tcbot-teamcity/src/main/java/org/apache/ignite/tcservice/model/mute/MuteInfo.java
similarity index 93%
rename from ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/tcmodel/mute/MuteInfo.java
rename to tcbot-teamcity/src/main/java/org/apache/ignite/tcservice/model/mute/MuteInfo.java
index 61a153b..f56d971 100644
--- a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/tcmodel/mute/MuteInfo.java
+++ b/tcbot-teamcity/src/main/java/org/apache/ignite/tcservice/model/mute/MuteInfo.java
@@ -15,15 +15,16 @@
  * limitations under the License.
  */
 
-package org.apache.ignite.ci.tcmodel.mute;
+package org.apache.ignite.tcservice.model.mute;
 
 import com.google.common.base.Objects;
+
+import javax.annotation.Nonnull;
 import javax.xml.bind.annotation.XmlAccessType;
 import javax.xml.bind.annotation.XmlAccessorType;
 import javax.xml.bind.annotation.XmlAttribute;
 import javax.xml.bind.annotation.XmlElement;
 import javax.xml.bind.annotation.XmlRootElement;
-import org.jetbrains.annotations.NotNull;
 
 /**
  * TeamCity mute.
@@ -65,7 +66,7 @@ public class MuteInfo implements Comparable<MuteInfo> {
     }
 
     /** {@inheritDoc} */
-    @Override public int compareTo(@NotNull MuteInfo o) {
+    @Override public int compareTo(@Nonnull MuteInfo o) {
         return Integer.compare(id, o.id);
     }
 }
diff --git a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/tcmodel/mute/MuteScope.java b/tcbot-teamcity/src/main/java/org/apache/ignite/tcservice/model/mute/MuteScope.java
similarity index 89%
rename from ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/tcmodel/mute/MuteScope.java
rename to tcbot-teamcity/src/main/java/org/apache/ignite/tcservice/model/mute/MuteScope.java
index e2137d6..fe63cd9 100644
--- a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/tcmodel/mute/MuteScope.java
+++ b/tcbot-teamcity/src/main/java/org/apache/ignite/tcservice/model/mute/MuteScope.java
@@ -15,15 +15,15 @@
  * limitations under the License.
  */
 
-package org.apache.ignite.ci.tcmodel.mute;
+package org.apache.ignite.tcservice.model.mute;
 
 import java.util.List;
 import javax.xml.bind.annotation.XmlAccessType;
 import javax.xml.bind.annotation.XmlAccessorType;
 import javax.xml.bind.annotation.XmlElement;
 import javax.xml.bind.annotation.XmlElementWrapper;
-import org.apache.ignite.ci.tcmodel.conf.BuildType;
-import org.apache.ignite.ci.tcmodel.conf.Project;
+import org.apache.ignite.tcservice.model.conf.BuildType;
+import org.apache.ignite.tcservice.model.conf.Project;
 
 /**
  * Mute additional information. Contains project or build types - scope affected by mute.
diff --git a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/tcmodel/mute/MuteTarget.java b/tcbot-teamcity/src/main/java/org/apache/ignite/tcservice/model/mute/MuteTarget.java
similarity index 92%
rename from ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/tcmodel/mute/MuteTarget.java
rename to tcbot-teamcity/src/main/java/org/apache/ignite/tcservice/model/mute/MuteTarget.java
index cd52735..69f4272 100644
--- a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/tcmodel/mute/MuteTarget.java
+++ b/tcbot-teamcity/src/main/java/org/apache/ignite/tcservice/model/mute/MuteTarget.java
@@ -15,14 +15,14 @@
  * limitations under the License.
  */
 
-package org.apache.ignite.ci.tcmodel.mute;
+package org.apache.ignite.tcservice.model.mute;
 
 import java.util.List;
 import javax.xml.bind.annotation.XmlAccessType;
 import javax.xml.bind.annotation.XmlAccessorType;
 import javax.xml.bind.annotation.XmlElement;
 import javax.xml.bind.annotation.XmlElementWrapper;
-import org.apache.ignite.ci.tcmodel.result.tests.TestRef;
+import org.apache.ignite.tcservice.model.result.tests.TestRef;
 
 /**
  * Mute additional information. Contains what was muted (tests, problems).
diff --git a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/tcmodel/mute/Mutes.java b/tcbot-teamcity/src/main/java/org/apache/ignite/tcservice/model/mute/Mutes.java
similarity index 95%
rename from ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/tcmodel/mute/Mutes.java
rename to tcbot-teamcity/src/main/java/org/apache/ignite/tcservice/model/mute/Mutes.java
index c8177b4..ed9236b 100644
--- a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/tcmodel/mute/Mutes.java
+++ b/tcbot-teamcity/src/main/java/org/apache/ignite/tcservice/model/mute/Mutes.java
@@ -15,7 +15,7 @@
  * limitations under the License.
  */
 
-package org.apache.ignite.ci.tcmodel.mute;
+package org.apache.ignite.tcservice.model.mute;
 
 import java.util.Collections;
 import java.util.Set;
@@ -26,7 +26,7 @@ import javax.xml.bind.annotation.XmlAccessorType;
 import javax.xml.bind.annotation.XmlAttribute;
 import javax.xml.bind.annotation.XmlElement;
 import javax.xml.bind.annotation.XmlRootElement;
-import org.apache.ignite.ci.tcmodel.result.AbstractRef;
+import org.apache.ignite.tcservice.model.result.AbstractRef;
 
 /**
  * Mute entities from TeamCity. On TeamCity this object represent page with several mutes.
diff --git a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/tcmodel/result/AbstractRef.java b/tcbot-teamcity/src/main/java/org/apache/ignite/tcservice/model/result/AbstractRef.java
similarity index 95%
rename from ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/tcmodel/result/AbstractRef.java
rename to tcbot-teamcity/src/main/java/org/apache/ignite/tcservice/model/result/AbstractRef.java
index 4459623..bae7f2e 100644
--- a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/tcmodel/result/AbstractRef.java
+++ b/tcbot-teamcity/src/main/java/org/apache/ignite/tcservice/model/result/AbstractRef.java
@@ -15,7 +15,7 @@
  * limitations under the License.
  */
 
-package org.apache.ignite.ci.tcmodel.result;
+package org.apache.ignite.tcservice.model.result;
 
 import javax.xml.bind.annotation.XmlAttribute;
 
diff --git a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/tcmodel/result/Build.java b/tcbot-teamcity/src/main/java/org/apache/ignite/tcservice/model/result/Build.java
similarity index 88%
rename from ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/tcmodel/result/Build.java
rename to tcbot-teamcity/src/main/java/org/apache/ignite/tcservice/model/result/Build.java
index a3871e0..8b6d693 100644
--- a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/tcmodel/result/Build.java
+++ b/tcbot-teamcity/src/main/java/org/apache/ignite/tcservice/model/result/Build.java
@@ -15,7 +15,7 @@
  * limitations under the License.
  */
 
-package org.apache.ignite.ci.tcmodel.result;
+package org.apache.ignite.tcservice.model.result;
 
 import com.google.common.base.Strings;
 import java.text.ParseException;
@@ -23,22 +23,22 @@ import java.text.SimpleDateFormat;
 import java.util.Collections;
 import java.util.Date;
 import java.util.List;
+import javax.annotation.Nullable;
 import javax.xml.bind.annotation.XmlAccessType;
 import javax.xml.bind.annotation.XmlAccessorType;
 import javax.xml.bind.annotation.XmlElement;
 import javax.xml.bind.annotation.XmlElementWrapper;
 import javax.xml.bind.annotation.XmlRootElement;
 import javax.xml.bind.annotation.XmlTransient;
-import org.apache.ignite.ci.tcmodel.changes.ChangesListRef;
-import org.apache.ignite.ci.tcmodel.conf.BuildType;
-import org.apache.ignite.ci.tcmodel.conf.bt.Parameters;
-import org.apache.ignite.ci.tcmodel.hist.BuildRef;
-import org.apache.ignite.ci.tcmodel.vcs.Revision;
-import org.apache.ignite.ci.tcmodel.vcs.Revisions;
-import org.jetbrains.annotations.NotNull;
-import org.jetbrains.annotations.Nullable;
+import org.apache.ignite.tcservice.model.changes.ChangesListRef;
+import org.apache.ignite.tcservice.model.conf.BuildType;
+import org.apache.ignite.tcservice.model.conf.bt.Parameters;
+import org.apache.ignite.tcservice.model.hist.BuildRef;
+import org.apache.ignite.tcservice.model.vcs.Revision;
+import org.apache.ignite.tcservice.model.vcs.Revisions;
+import org.checkerframework.checker.nullness.qual.NonNull;
 
-import static org.apache.ignite.ci.util.ExceptionUtil.propagateException;
+import static org.apache.ignite.tcbot.common.exeption.ExceptionUtil.propagateException;
 
 /**
  * Build from history with test and problems references
@@ -75,9 +75,10 @@ public class Build extends BuildRef {
     @XmlElement(name = "revisions") private Revisions revisions;
 
     /** Build parameters. */
-    @Nullable @XmlElement(name = "properties") private Parameters properties;
+    @Nullable
+    @XmlElement(name = "properties") private Parameters properties;
 
-    @NotNull public static Build createFakeStub() {
+    @NonNull  public static Build createFakeStub() {
         return new Build();
     }
 
diff --git a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/tcmodel/result/Configurations.java b/tcbot-teamcity/src/main/java/org/apache/ignite/tcservice/model/result/Configurations.java
similarity index 90%
rename from ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/tcmodel/result/Configurations.java
rename to tcbot-teamcity/src/main/java/org/apache/ignite/tcservice/model/result/Configurations.java
index eb62c46..05035ab 100644
--- a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/tcmodel/result/Configurations.java
+++ b/tcbot-teamcity/src/main/java/org/apache/ignite/tcservice/model/result/Configurations.java
@@ -15,14 +15,13 @@
  * limitations under the License.
  */
 
-package org.apache.ignite.ci.tcmodel.result;
+package org.apache.ignite.tcservice.model.result;
 
 import java.util.ArrayList;
 import java.util.List;
 import javax.xml.bind.annotation.XmlElement;
-import javax.xml.bind.annotation.XmlElementWrapper;
 import javax.xml.bind.annotation.XmlRootElement;
-import org.apache.ignite.ci.tcmodel.hist.BuildRef;
+import org.apache.ignite.tcservice.model.hist.BuildRef;
 
 /**
  */
diff --git a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/tcmodel/result/ProblemOccurrencesRef.java b/tcbot-teamcity/src/main/java/org/apache/ignite/tcservice/model/result/ProblemOccurrencesRef.java
similarity index 95%
rename from ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/tcmodel/result/ProblemOccurrencesRef.java
rename to tcbot-teamcity/src/main/java/org/apache/ignite/tcservice/model/result/ProblemOccurrencesRef.java
index a382ddb..3f23101 100644
--- a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/tcmodel/result/ProblemOccurrencesRef.java
+++ b/tcbot-teamcity/src/main/java/org/apache/ignite/tcservice/model/result/ProblemOccurrencesRef.java
@@ -15,7 +15,7 @@
  * limitations under the License.
  */
 
-package org.apache.ignite.ci.tcmodel.result;
+package org.apache.ignite.tcservice.model.result;
 
 import javax.xml.bind.annotation.XmlAttribute;
 
diff --git a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/tcmodel/result/RelatedIssuesRef.java b/tcbot-teamcity/src/main/java/org/apache/ignite/tcservice/model/result/RelatedIssuesRef.java
similarity index 94%
rename from ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/tcmodel/result/RelatedIssuesRef.java
rename to tcbot-teamcity/src/main/java/org/apache/ignite/tcservice/model/result/RelatedIssuesRef.java
index 81e1157..4297c06 100644
--- a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/tcmodel/result/RelatedIssuesRef.java
+++ b/tcbot-teamcity/src/main/java/org/apache/ignite/tcservice/model/result/RelatedIssuesRef.java
@@ -15,7 +15,7 @@
  * limitations under the License.
  */
 
-package org.apache.ignite.ci.tcmodel.result;
+package org.apache.ignite.tcservice.model.result;
 
 /**
  * Related issues reference.
diff --git a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/tcmodel/result/StatisticsRef.java b/tcbot-teamcity/src/main/java/org/apache/ignite/tcservice/model/result/StatisticsRef.java
similarity index 95%
rename from ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/tcmodel/result/StatisticsRef.java
rename to tcbot-teamcity/src/main/java/org/apache/ignite/tcservice/model/result/StatisticsRef.java
index 94535b7..9741d01 100644
--- a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/tcmodel/result/StatisticsRef.java
+++ b/tcbot-teamcity/src/main/java/org/apache/ignite/tcservice/model/result/StatisticsRef.java
@@ -15,7 +15,7 @@
  * limitations under the License.
  */
 
-package org.apache.ignite.ci.tcmodel.result;
+package org.apache.ignite.tcservice.model.result;
 
 import javax.xml.bind.annotation.XmlAttribute;
 
diff --git a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/tcmodel/result/TestOccurrencesRef.java b/tcbot-teamcity/src/main/java/org/apache/ignite/tcservice/model/result/TestOccurrencesRef.java
similarity index 96%
rename from ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/tcmodel/result/TestOccurrencesRef.java
rename to tcbot-teamcity/src/main/java/org/apache/ignite/tcservice/model/result/TestOccurrencesRef.java
index b250e98..ebf5222 100644
--- a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/tcmodel/result/TestOccurrencesRef.java
+++ b/tcbot-teamcity/src/main/java/org/apache/ignite/tcservice/model/result/TestOccurrencesRef.java
@@ -15,7 +15,7 @@
  * limitations under the License.
  */
 
-package org.apache.ignite.ci.tcmodel.result;
+package org.apache.ignite.tcservice.model.result;
 
 import javax.xml.bind.annotation.XmlAttribute;
 
diff --git a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/tcmodel/result/Triggered.java b/tcbot-teamcity/src/main/java/org/apache/ignite/tcservice/model/result/Triggered.java
similarity index 95%
rename from ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/tcmodel/result/Triggered.java
rename to tcbot-teamcity/src/main/java/org/apache/ignite/tcservice/model/result/Triggered.java
index 4006fa0..180c65b 100644
--- a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/tcmodel/result/Triggered.java
+++ b/tcbot-teamcity/src/main/java/org/apache/ignite/tcservice/model/result/Triggered.java
@@ -15,14 +15,14 @@
  * limitations under the License.
  */
 
-package org.apache.ignite.ci.tcmodel.result;
+package org.apache.ignite.tcservice.model.result;
 
 import javax.xml.bind.annotation.XmlAccessType;
 import javax.xml.bind.annotation.XmlAccessorType;
 import javax.xml.bind.annotation.XmlAttribute;
 import javax.xml.bind.annotation.XmlElement;
-import org.apache.ignite.ci.tcmodel.hist.BuildRef;
-import org.apache.ignite.ci.tcmodel.user.User;
+import org.apache.ignite.tcservice.model.hist.BuildRef;
+import org.apache.ignite.tcservice.model.user.User;
 
 /**
  * <p>Java class for triggeredBy complex type.
diff --git a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/tcmodel/result/problems/ProblemOccurrence.java b/tcbot-teamcity/src/main/java/org/apache/ignite/tcservice/model/result/problems/ProblemOccurrence.java
similarity index 95%
rename from ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/tcmodel/result/problems/ProblemOccurrence.java
rename to tcbot-teamcity/src/main/java/org/apache/ignite/tcservice/model/result/problems/ProblemOccurrence.java
index 7b5afb4..8fa6a9f 100644
--- a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/tcmodel/result/problems/ProblemOccurrence.java
+++ b/tcbot-teamcity/src/main/java/org/apache/ignite/tcservice/model/result/problems/ProblemOccurrence.java
@@ -15,11 +15,11 @@
  * limitations under the License.
  */
 
-package org.apache.ignite.ci.tcmodel.result.problems;
+package org.apache.ignite.tcservice.model.result.problems;
 
+import javax.annotation.Nullable;
 import javax.xml.bind.annotation.XmlAttribute;
-import org.apache.ignite.ci.tcmodel.hist.BuildRef;
-import org.jetbrains.annotations.Nullable;
+import org.apache.ignite.tcservice.model.hist.BuildRef;
 
 /**
  * One build problem. Contains its type.
diff --git a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/tcmodel/result/problems/ProblemOccurrences.java b/tcbot-teamcity/src/main/java/org/apache/ignite/tcservice/model/result/problems/ProblemOccurrences.java
similarity index 89%
rename from ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/tcmodel/result/problems/ProblemOccurrences.java
rename to tcbot-teamcity/src/main/java/org/apache/ignite/tcservice/model/result/problems/ProblemOccurrences.java
index 43d2e82..d84b5f3 100644
--- a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/tcmodel/result/problems/ProblemOccurrences.java
+++ b/tcbot-teamcity/src/main/java/org/apache/ignite/tcservice/model/result/problems/ProblemOccurrences.java
@@ -15,14 +15,14 @@
  * limitations under the License.
  */
 
-package org.apache.ignite.ci.tcmodel.result.problems;
+package org.apache.ignite.tcservice.model.result.problems;
 
 import java.util.Collections;
 import java.util.List;
+import javax.annotation.Nullable;
 import javax.xml.bind.annotation.XmlElement;
 import javax.xml.bind.annotation.XmlRootElement;
-import org.apache.ignite.ci.tcmodel.result.ProblemOccurrencesRef;
-import org.jetbrains.annotations.Nullable;
+import org.apache.ignite.tcservice.model.result.ProblemOccurrencesRef;
 
 /**
  * List of problems associated with build.
diff --git a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/tcmodel/result/stat/Statistics.java b/tcbot-teamcity/src/main/java/org/apache/ignite/tcservice/model/result/stat/Statistics.java
similarity index 92%
rename from ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/tcmodel/result/stat/Statistics.java
rename to tcbot-teamcity/src/main/java/org/apache/ignite/tcservice/model/result/stat/Statistics.java
index f7929a3..2250b1f 100644
--- a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/tcmodel/result/stat/Statistics.java
+++ b/tcbot-teamcity/src/main/java/org/apache/ignite/tcservice/model/result/stat/Statistics.java
@@ -15,13 +15,12 @@
  * limitations under the License.
  */
 
-package org.apache.ignite.ci.tcmodel.result.stat;
+package org.apache.ignite.tcservice.model.result.stat;
 
 import javax.xml.bind.annotation.XmlAccessType;
 import javax.xml.bind.annotation.XmlAccessorType;
 import javax.xml.bind.annotation.XmlRootElement;
-import org.apache.ignite.ci.tcmodel.conf.bt.Parameters;
-import org.jetbrains.annotations.Nullable;
+import org.apache.ignite.tcservice.model.conf.bt.Parameters;
 
 /**
  * Build statistics reported by TC, data is stored in properties
diff --git a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/tcmodel/result/tests/TestOccurrence.java b/tcbot-teamcity/src/main/java/org/apache/ignite/tcservice/model/result/tests/TestOccurrence.java
similarity index 98%
rename from ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/tcmodel/result/tests/TestOccurrence.java
rename to tcbot-teamcity/src/main/java/org/apache/ignite/tcservice/model/result/tests/TestOccurrence.java
index 72cc174..02ffa15 100644
--- a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/tcmodel/result/tests/TestOccurrence.java
+++ b/tcbot-teamcity/src/main/java/org/apache/ignite/tcservice/model/result/tests/TestOccurrence.java
@@ -15,7 +15,7 @@
  * limitations under the License.
  */
 
-package org.apache.ignite.ci.tcmodel.result.tests;
+package org.apache.ignite.tcservice.model.result.tests;
 
 import javax.xml.bind.annotation.XmlAccessType;
 import javax.xml.bind.annotation.XmlAccessorType;
diff --git a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/tcmodel/result/tests/TestOccurrenceFull.java b/tcbot-teamcity/src/main/java/org/apache/ignite/tcservice/model/result/tests/TestOccurrenceFull.java
similarity index 92%
rename from ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/tcmodel/result/tests/TestOccurrenceFull.java
rename to tcbot-teamcity/src/main/java/org/apache/ignite/tcservice/model/result/tests/TestOccurrenceFull.java
index 87bf4ec..56dd420 100644
--- a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/tcmodel/result/tests/TestOccurrenceFull.java
+++ b/tcbot-teamcity/src/main/java/org/apache/ignite/tcservice/model/result/tests/TestOccurrenceFull.java
@@ -15,11 +15,11 @@
  * limitations under the License.
  */
 
-package org.apache.ignite.ci.tcmodel.result.tests;
+package org.apache.ignite.tcservice.model.result.tests;
 
 import javax.xml.bind.annotation.XmlElement;
 import javax.xml.bind.annotation.XmlRootElement;
-import org.apache.ignite.ci.tcmodel.hist.BuildRef;
+import org.apache.ignite.tcservice.model.hist.BuildRef;
 
 /**
  * Full test occurrence optionally with text details returned by REST,
diff --git a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/tcmodel/result/tests/TestOccurrences.java b/tcbot-teamcity/src/main/java/org/apache/ignite/tcservice/model/result/tests/TestOccurrences.java
similarity index 93%
rename from ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/tcmodel/result/tests/TestOccurrences.java
rename to tcbot-teamcity/src/main/java/org/apache/ignite/tcservice/model/result/tests/TestOccurrences.java
index eba259f..b7b8de4 100644
--- a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/tcmodel/result/tests/TestOccurrences.java
+++ b/tcbot-teamcity/src/main/java/org/apache/ignite/tcservice/model/result/tests/TestOccurrences.java
@@ -15,7 +15,7 @@
  * limitations under the License.
  */
 
-package org.apache.ignite.ci.tcmodel.result.tests;
+package org.apache.ignite.tcservice.model.result.tests;
 
 import java.util.Collections;
 import java.util.List;
@@ -24,7 +24,7 @@ import javax.xml.bind.annotation.XmlAccessorType;
 import javax.xml.bind.annotation.XmlAttribute;
 import javax.xml.bind.annotation.XmlElement;
 import javax.xml.bind.annotation.XmlRootElement;
-import org.apache.ignite.ci.tcmodel.result.TestOccurrencesRef;
+import org.apache.ignite.tcservice.model.result.TestOccurrencesRef;
 
 /**
  * Full tests occurrences, may have reference to next occurrences
diff --git a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/tcmodel/result/tests/TestOccurrencesFull.java b/tcbot-teamcity/src/main/java/org/apache/ignite/tcservice/model/result/tests/TestOccurrencesFull.java
similarity index 93%
rename from ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/tcmodel/result/tests/TestOccurrencesFull.java
rename to tcbot-teamcity/src/main/java/org/apache/ignite/tcservice/model/result/tests/TestOccurrencesFull.java
index 1329faf..1f6fe7c 100644
--- a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/tcmodel/result/tests/TestOccurrencesFull.java
+++ b/tcbot-teamcity/src/main/java/org/apache/ignite/tcservice/model/result/tests/TestOccurrencesFull.java
@@ -15,7 +15,7 @@
  * limitations under the License.
  */
 
-package org.apache.ignite.ci.tcmodel.result.tests;
+package org.apache.ignite.tcservice.model.result.tests;
 
 import java.util.Collections;
 import java.util.List;
@@ -24,7 +24,7 @@ import javax.xml.bind.annotation.XmlAccessorType;
 import javax.xml.bind.annotation.XmlAttribute;
 import javax.xml.bind.annotation.XmlElement;
 import javax.xml.bind.annotation.XmlRootElement;
-import org.apache.ignite.ci.tcmodel.result.TestOccurrencesRef;
+import org.apache.ignite.tcservice.model.result.TestOccurrencesRef;
 
 /**
  * Full tests occurrences, may have reference to next occurrences
diff --git a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/tcmodel/result/tests/TestRef.java b/tcbot-teamcity/src/main/java/org/apache/ignite/tcservice/model/result/tests/TestRef.java
similarity index 90%
rename from ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/tcmodel/result/tests/TestRef.java
rename to tcbot-teamcity/src/main/java/org/apache/ignite/tcservice/model/result/tests/TestRef.java
index 9752963..3df64a0 100644
--- a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/tcmodel/result/tests/TestRef.java
+++ b/tcbot-teamcity/src/main/java/org/apache/ignite/tcservice/model/result/tests/TestRef.java
@@ -15,11 +15,11 @@
  * limitations under the License.
  */
 
-package org.apache.ignite.ci.tcmodel.result.tests;
+package org.apache.ignite.tcservice.model.result.tests;
 
 import javax.xml.bind.annotation.XmlAttribute;
 import javax.xml.bind.annotation.XmlRootElement;
-import org.apache.ignite.ci.tcmodel.result.AbstractRef;
+import org.apache.ignite.tcservice.model.result.AbstractRef;
 
 /**
  * Reference to particular test
diff --git a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/tcmodel/user/User.java b/tcbot-teamcity/src/main/java/org/apache/ignite/tcservice/model/user/User.java
similarity index 90%
rename from ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/tcmodel/user/User.java
rename to tcbot-teamcity/src/main/java/org/apache/ignite/tcservice/model/user/User.java
index 2ced609..37efa89 100644
--- a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/tcmodel/user/User.java
+++ b/tcbot-teamcity/src/main/java/org/apache/ignite/tcservice/model/user/User.java
@@ -15,12 +15,12 @@
  * limitations under the License.
  */
 
-package org.apache.ignite.ci.tcmodel.user;
+package org.apache.ignite.tcservice.model.user;
 
 
-import org.apache.ignite.ci.tcmodel.conf.bt.Parameters;
-import org.jetbrains.annotations.Nullable;
+import org.apache.ignite.tcservice.model.conf.bt.Parameters;
 
+import javax.annotation.Nullable;
 import javax.xml.bind.annotation.XmlAttribute;
 import javax.xml.bind.annotation.XmlElement;
 import javax.xml.bind.annotation.XmlRootElement;
diff --git a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/tcmodel/user/UserRef.java b/tcbot-teamcity/src/main/java/org/apache/ignite/tcservice/model/user/UserRef.java
similarity index 95%
rename from ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/tcmodel/user/UserRef.java
rename to tcbot-teamcity/src/main/java/org/apache/ignite/tcservice/model/user/UserRef.java
index b3f26d6..00bba76 100644
--- a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/tcmodel/user/UserRef.java
+++ b/tcbot-teamcity/src/main/java/org/apache/ignite/tcservice/model/user/UserRef.java
@@ -15,7 +15,7 @@
  * limitations under the License.
  */
 
-package org.apache.ignite.ci.tcmodel.user;
+package org.apache.ignite.tcservice.model.user;
 
 import javax.xml.bind.annotation.XmlAttribute;
 
diff --git a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/tcmodel/user/Users.java b/tcbot-teamcity/src/main/java/org/apache/ignite/tcservice/model/user/Users.java
similarity index 96%
rename from ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/tcmodel/user/Users.java
rename to tcbot-teamcity/src/main/java/org/apache/ignite/tcservice/model/user/Users.java
index 5e01947..b9f2571 100644
--- a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/tcmodel/user/Users.java
+++ b/tcbot-teamcity/src/main/java/org/apache/ignite/tcservice/model/user/Users.java
@@ -15,7 +15,7 @@
  * limitations under the License.
  */
 
-package org.apache.ignite.ci.tcmodel.user;
+package org.apache.ignite.tcservice.model.user;
 
 import javax.xml.bind.annotation.XmlElement;
 import javax.xml.bind.annotation.XmlRootElement;
diff --git a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/tcmodel/vcs/Revision.java b/tcbot-teamcity/src/main/java/org/apache/ignite/tcservice/model/vcs/Revision.java
similarity index 97%
rename from ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/tcmodel/vcs/Revision.java
rename to tcbot-teamcity/src/main/java/org/apache/ignite/tcservice/model/vcs/Revision.java
index ae2ffd7..8552468 100644
--- a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/tcmodel/vcs/Revision.java
+++ b/tcbot-teamcity/src/main/java/org/apache/ignite/tcservice/model/vcs/Revision.java
@@ -15,7 +15,7 @@
  * limitations under the License.
  */
 
-package org.apache.ignite.ci.tcmodel.vcs;
+package org.apache.ignite.tcservice.model.vcs;
 
 import javax.xml.bind.annotation.XmlAccessType;
 import javax.xml.bind.annotation.XmlAccessorType;
diff --git a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/tcmodel/vcs/Revisions.java b/tcbot-teamcity/src/main/java/org/apache/ignite/tcservice/model/vcs/Revisions.java
similarity index 97%
rename from ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/tcmodel/vcs/Revisions.java
rename to tcbot-teamcity/src/main/java/org/apache/ignite/tcservice/model/vcs/Revisions.java
index c869aa0..d07424e 100644
--- a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/tcmodel/vcs/Revisions.java
+++ b/tcbot-teamcity/src/main/java/org/apache/ignite/tcservice/model/vcs/Revisions.java
@@ -15,7 +15,7 @@
  * limitations under the License.
  */
 
-package org.apache.ignite.ci.tcmodel.vcs;
+package org.apache.ignite.tcservice.model.vcs;
 
 import java.util.Collections;
 import java.util.List;
diff --git a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/tcmodel/vcs/VcsRootInstance.java b/tcbot-teamcity/src/main/java/org/apache/ignite/tcservice/model/vcs/VcsRootInstance.java
similarity index 96%
rename from ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/tcmodel/vcs/VcsRootInstance.java
rename to tcbot-teamcity/src/main/java/org/apache/ignite/tcservice/model/vcs/VcsRootInstance.java
index c3aa4b3..2e14ca7 100644
--- a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/tcmodel/vcs/VcsRootInstance.java
+++ b/tcbot-teamcity/src/main/java/org/apache/ignite/tcservice/model/vcs/VcsRootInstance.java
@@ -15,7 +15,7 @@
  * limitations under the License.
  */
 
-package org.apache.ignite.ci.tcmodel.vcs;
+package org.apache.ignite.tcservice.model.vcs;
 
 import javax.xml.bind.annotation.XmlAccessType;
 import javax.xml.bind.annotation.XmlAccessorType;
diff --git a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/teamcity/pure/TcConnectionStaticLinker.java b/tcbot-teamcity/src/main/java/org/apache/ignite/tcservice/util/TcConnectionStaticLinker.java
similarity index 87%
rename from ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/teamcity/pure/TcConnectionStaticLinker.java
rename to tcbot-teamcity/src/main/java/org/apache/ignite/tcservice/util/TcConnectionStaticLinker.java
index aafbe4f..fad728c 100644
--- a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/teamcity/pure/TcConnectionStaticLinker.java
+++ b/tcbot-teamcity/src/main/java/org/apache/ignite/tcservice/util/TcConnectionStaticLinker.java
@@ -14,9 +14,10 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-package org.apache.ignite.ci.teamcity.pure;
+package org.apache.ignite.tcservice.util;
 
-import org.apache.ignite.ci.IgniteTeamcityConnection;
+import org.apache.ignite.tcservice.IgniteTeamcityConnection;
+import org.apache.ignite.tcservice.http.TeamcityRecordingConnection;
 
 /**
  * Factory for non-guice creation of TC Connection instance.
diff --git a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/util/XmlUtil.java b/tcbot-teamcity/src/main/java/org/apache/ignite/tcservice/util/XmlUtil.java
similarity index 96%
rename from ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/util/XmlUtil.java
rename to tcbot-teamcity/src/main/java/org/apache/ignite/tcservice/util/XmlUtil.java
index 958edeb..b0a03b5 100644
--- a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/util/XmlUtil.java
+++ b/tcbot-teamcity/src/main/java/org/apache/ignite/tcservice/util/XmlUtil.java
@@ -15,7 +15,9 @@
  * limitations under the License.
  */
 
-package org.apache.ignite.ci.util;
+package org.apache.ignite.tcservice.util;
+
+import org.apache.ignite.tcbot.common.util.ObjectInterner;
 
 import java.io.Reader;
 import java.io.StringWriter;
@@ -26,7 +28,6 @@ import javax.xml.bind.Marshaller;
 import javax.xml.bind.Unmarshaller;
 
 /**
- * Created by dpavlov on 27.07.2017
  */
 public class XmlUtil {
     /** Cached context to save time on creation ctx each time. */