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/09 17:02:55 UTC

[ignite-teamcity-bot] branch master updated: TC Bot engine module introduced: refactoring of TC Bot config

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 6b72596  TC Bot engine module introduced: refactoring of TC Bot config
6b72596 is described below

commit 6b725961e58c576a2aaef4681b22a6eadcd79a49
Author: Dmitriy Pavlov <dp...@apache.org>
AuthorDate: Sun Jun 9 20:02:48 2019 +0300

    TC Bot engine module introduced: refactoring of TC Bot config
---
 conf/mail.auth.properties                          |   2 +-
 .../java/org/apache/ignite/ci/HelperConfig.java    |  43 -------
 .../ci/github/ignited/GitHubConnIgnitedImpl.java   |   2 +-
 .../ci/github/ignited/IGitHubConnIgnited.java      |   4 +-
 .../ci/github/pure/GitHubConnectionImpl.java       |   4 +-
 .../ignite/ci/github/pure/IGitHubConnection.java   |   2 +-
 .../ignite/ci/jira/ignited/IJiraIgnited.java       |   2 +-
 .../apache/ignite/ci/jira/ignited/JiraIgnited.java |   2 +-
 .../ignite/ci/jira/ignited/JiraTicketSync.java     |   2 +-
 .../ignite/ci/jira/pure/IJiraIntegration.java      |   2 +-
 .../java/org/apache/ignite/ci/jira/pure/Jira.java  |   4 +-
 .../org/apache/ignite/ci/jobs/CheckQueueJob.java   | 142 ++++++++++-----------
 .../org/apache/ignite/ci/mail/EmailSender.java     |   2 +-
 .../org/apache/ignite/ci/mail/SlackSender.java     |   4 +-
 .../ci/tcbot/TcBotBusinessServicesModule.java      |   6 +-
 .../tcbot/chain/TrackedBranchChainsProcessor.java  |  36 +++---
 .../apache/ignite/ci/tcbot/conf/BranchTracked.java |  10 +-
 .../apache/ignite/ci/tcbot/conf/ChainAtServer.java |   8 +-
 .../ignite/ci/tcbot/conf/ChainAtServerTracked.java |  37 ++++--
 .../apache/ignite/ci/tcbot/conf/GitHubConfig.java  |   2 +
 .../ignite/ci/tcbot/conf/JiraServerConfig.java     |   2 +
 .../ci/tcbot/conf/LocalFilesBasedConfig.java       |  41 +++++-
 .../{BranchesTracked.java => TcBotJsonConfig.java} |  39 ++----
 .../ignite/ci/tcbot/conf/TcServerConfig.java       |   1 -
 .../ignite/ci/tcbot/issue/IssueDetector.java       |  65 ++++------
 .../ci/tcbot/trends/MasterTrendsService.java       |   2 +-
 .../ignite/ci/tcbot/visa/BranchTicketMatcher.java  |   6 +-
 .../tcbot/visa/TcBotTriggerAndSignOffService.java  |  14 +-
 .../org/apache/ignite/ci/user/TcHelperUser.java    |   4 +-
 .../ignite/ci/web/auth/AuthenticationFilter.java   |   2 +-
 .../ignite/ci/web/model/trends/BuildsHistory.java  |   2 +-
 .../ignite/ci/web/rest/GetTrackedBranches.java     |  27 ++--
 .../apache/ignite/ci/web/rest/TriggerBuilds.java   |   4 +-
 .../ci/web/rest/build/GetBuildTestFailures.java    |   2 +-
 .../org/apache/ignite/ci/web/rest/login/Login.java |   4 +-
 .../ignite/ci/web/rest/login/UserService.java      |  11 +-
 .../rest/tracked/GetTrackedBranchTestResults.java  |   2 +-
 .../org/apache/ignite/ci/di/DiContextTest.java     |   2 +-
 .../ci/tcbot/chain/MockBasedTcBotModule.java       |  21 +--
 .../ci/tcbot/chain/TrackedBranchProcessorTest.java |   4 +-
 .../ignite/ci/tcbot/issue/IssueDetectorTest.java   |   4 +-
 .../IgnitedTcInMemoryIntegrationTest.java          |  10 +-
 .../tcbot/common/conf/IBuildParameterSpec.java     |   3 +
 ...pplier.java => IDataSourcesConfigSupplier.java} |   6 +-
 .../ignite/tcbot/common}/conf/IGitHubConfig.java   |   2 +-
 .../tcbot/common}/conf/IJiraServerConfig.java      |   5 +-
 .../ignite/tcbot/common/conf/ITcServerConfig.java  |   5 +
 .../ignite/tcbot/common}/conf/PasswordEncoder.java |  26 ++--
 .../ignite/tcbot/common}/util/CryptUtil.java       |   6 +-
 .../ignite/tcbot/engine}/conf/EmailSettings.java   |   2 +-
 .../tcbot/engine}/conf/INotificationChannel.java   |   2 +-
 .../tcbot/engine/conf/INotificationsConfig.java    |   7 +-
 .../ignite/tcbot/engine}/conf/ITcBotConfig.java    |  20 +--
 .../ignite/tcbot/engine/conf/ITrackedBranch.java   |  19 ++-
 .../tcbot/engine/conf/ITrackedBranchesConfig.java  |  23 +++-
 .../ignite/tcbot/engine/conf/ITrackedChain.java    |  29 ++++-
 .../tcbot/engine}/conf/NotificationChannel.java    |   2 +-
 .../tcbot/engine}/conf/NotificationsConfig.java    |  59 +++++++--
 .../ignite/tcignited/TcIgnitedCachingProvider.java |   4 +-
 .../ignite/tcignited/history/RunHistSync.java      |   4 +-
 .../tcservice/TeamcityServiceConnection.java       |   5 +-
 61 files changed, 445 insertions(+), 369 deletions(-)

diff --git a/conf/mail.auth.properties b/conf/mail.auth.properties
index cb3a6b6..de96546 100644
--- a/conf/mail.auth.properties
+++ b/conf/mail.auth.properties
@@ -2,7 +2,7 @@
 #Enter email to send messages from, dev-list subsricption may be required
 username=
 
-#Use org.apache.ignite.ci.tcbot.conf.PasswordEncoder to encode password
+#Use org.apache.ignite.tcbot.common.conf.PasswordEncoder to encode password
 encoded_password=
 
 #Specify slack Auth token
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 4b0e55a..33683f6 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
@@ -18,21 +18,14 @@
 package org.apache.ignite.ci;
 
 import com.google.common.base.Preconditions;
-import com.google.gson.Gson;
 import java.io.File;
 import java.io.FileReader;
 import java.io.IOException;
 import java.io.UncheckedIOException;
 import java.util.Properties;
 
-import org.apache.ignite.ci.tcbot.conf.BranchesTracked;
-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;
 
-import static com.google.common.base.Preconditions.checkState;
 import static com.google.common.base.Strings.isNullOrEmpty;
 
 /**
@@ -40,10 +33,7 @@ import static com.google.common.base.Strings.isNullOrEmpty;
  */
 public class HelperConfig {
     public static final String CONFIG_FILE_NAME = "auth.properties";
-    public static final String MAIL_PROPS = "mail.auth.properties";
     public static final String HOST = "host";
-    public static final String USERNAME = "username";
-    public static final String ENCODED_PASSWORD = "encoded_password";
 
     /** GitHub authorization token property name. */
     public static final String GITHUB_AUTH_TOKEN = "github.auth_token";
@@ -64,10 +54,6 @@ public class HelperConfig {
     @Deprecated
     public static final String JIRA_TICKET_TEMPLATE = "jira.ticket_template";
 
-    /** Slack authorization token property name. */
-    public static final String SLACK_AUTH_TOKEN = "slack.auth_token";
-    @Deprecated
-    public static final String SLACK_CHANNEL = "slack.channel";
     public static final String LOGS = "logs";
 
     public static Properties loadAuthProperties(File workDir, String cfgFileName) {
@@ -107,33 +93,4 @@ public class HelperConfig {
         return isNullOrEmpty(tcName) ? name : (tcName + "." + name);
     }
 
-    @NotNull public static String userPwdToToken(String user, String pwd) {
-        return Base64Util.encodeUtf8String(user + ":" + pwd);
-    }
-
-    public static BranchesTracked getTrackedBranches() {
-        final File workDir = TcBotWorkDir.resolveWorkDir();
-        final File file = new File(workDir, "branches.json");
-
-        try (FileReader json = new FileReader(file)) {
-            return new Gson().fromJson(json, BranchesTracked.class);
-        }
-        catch (IOException e) {
-            throw ExceptionUtil.propagateException(e);
-        }
-    }
-
-    public static Properties loadEmailSettings() {
-        try {
-            String respConf = prefixedWithServerName(null, MAIL_PROPS);
-            final File workDir = TcBotWorkDir.resolveWorkDir();
-            File file = new File(workDir, respConf);
-            return loadProps(file);
-        }
-        catch (IOException e) {
-            e.printStackTrace();
-            return new Properties();
-        }
-    }
-
 }
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 96f50a3..3415a83 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
@@ -38,7 +38,7 @@ import org.apache.ignite.ci.github.GitHubBranchKey;
 import org.apache.ignite.ci.github.GitHubBranchShort;
 import org.apache.ignite.ci.github.PullRequest;
 import org.apache.ignite.ci.github.pure.IGitHubConnection;
-import org.apache.ignite.ci.tcbot.conf.IGitHubConfig;
+import org.apache.ignite.tcbot.common.conf.IGitHubConfig;
 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/github/ignited/IGitHubConnIgnited.java b/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/github/ignited/IGitHubConnIgnited.java
index e40800a..125cc37 100644
--- a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/github/ignited/IGitHubConnIgnited.java
+++ b/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/github/ignited/IGitHubConnIgnited.java
@@ -18,8 +18,8 @@ package org.apache.ignite.ci.github.ignited;
 
 import java.util.List;
 import org.apache.ignite.ci.github.PullRequest;
-import org.apache.ignite.ci.tcbot.conf.IGitHubConfig;
-import org.apache.ignite.ci.tcbot.conf.IJiraServerConfig;
+import org.apache.ignite.tcbot.common.conf.IGitHubConfig;
+import org.apache.ignite.tcbot.common.conf.IJiraServerConfig;
 
 /**
  *
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 c3696f6..8d5a41e 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
@@ -23,8 +23,8 @@ import com.google.gson.reflect.TypeToken;
 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.tcbot.common.conf.IGitHubConfig;
+import org.apache.ignite.tcbot.engine.conf.ITcBotConfig;
 import org.apache.ignite.tcbot.common.util.HttpUtil;
 import org.jetbrains.annotations.NotNull;
 import org.jetbrains.annotations.Nullable;
diff --git a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/github/pure/IGitHubConnection.java b/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/github/pure/IGitHubConnection.java
index 0866703..8f8f420 100644
--- a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/github/pure/IGitHubConnection.java
+++ b/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/github/pure/IGitHubConnection.java
@@ -22,7 +22,7 @@ import java.util.Objects;
 import java.util.concurrent.atomic.AtomicReference;
 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.tcbot.common.conf.IGitHubConfig;
 import org.jetbrains.annotations.Nullable;
 
 import javax.annotation.Nonnull;
diff --git a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/jira/ignited/IJiraIgnited.java b/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/jira/ignited/IJiraIgnited.java
index 0934ab4..24a3086 100644
--- a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/jira/ignited/IJiraIgnited.java
+++ b/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/jira/ignited/IJiraIgnited.java
@@ -19,7 +19,7 @@ package org.apache.ignite.ci.jira.ignited;
 import java.io.IOException;
 import java.util.Set;
 import org.apache.ignite.ci.jira.pure.Ticket;
-import org.apache.ignite.ci.tcbot.conf.IJiraServerConfig;
+import org.apache.ignite.tcbot.common.conf.IJiraServerConfig;
 
 /**
  *
diff --git a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/jira/ignited/JiraIgnited.java b/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/jira/ignited/JiraIgnited.java
index f7d6750..38190e1 100644
--- a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/jira/ignited/JiraIgnited.java
+++ b/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/jira/ignited/JiraIgnited.java
@@ -21,7 +21,7 @@ import java.util.Set;
 import javax.inject.Inject;
 import org.apache.ignite.ci.jira.pure.IJiraIntegration;
 import org.apache.ignite.ci.jira.pure.Ticket;
-import org.apache.ignite.ci.tcbot.conf.IJiraServerConfig;
+import org.apache.ignite.tcbot.common.conf.IJiraServerConfig;
 import org.apache.ignite.tcignited.ITeamcityIgnited;
 
 /**
diff --git a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/jira/ignited/JiraTicketSync.java b/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/jira/ignited/JiraTicketSync.java
index 4a8ca25..0813879 100644
--- a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/jira/ignited/JiraTicketSync.java
+++ b/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/jira/ignited/JiraTicketSync.java
@@ -30,7 +30,7 @@ import org.apache.ignite.ci.jira.pure.Fields;
 import org.apache.ignite.ci.jira.pure.IJiraIntegration;
 import org.apache.ignite.ci.jira.pure.IJiraIntegrationProvider;
 import org.apache.ignite.ci.jira.pure.Ticket;
-import org.apache.ignite.ci.tcbot.conf.IJiraServerConfig;
+import org.apache.ignite.tcbot.common.conf.IJiraServerConfig;
 import org.apache.ignite.tcignited.ITeamcityIgnited;
 import org.apache.ignite.internal.util.typedef.F;
 import org.jetbrains.annotations.NotNull;
diff --git a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/jira/pure/IJiraIntegration.java b/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/jira/pure/IJiraIntegration.java
index 2b9a0dc..cfced3c 100644
--- a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/jira/pure/IJiraIntegration.java
+++ b/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/jira/pure/IJiraIntegration.java
@@ -19,7 +19,7 @@ package org.apache.ignite.ci.jira.pure;
 
 import java.io.IOException;
 import org.apache.ignite.ci.jira.Tickets;
-import org.apache.ignite.ci.tcbot.conf.IJiraServerConfig;
+import org.apache.ignite.tcbot.common.conf.IJiraServerConfig;
 
 /**
  * Reperesents methods to provide interaction with Jira servers.
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 5e80a9b..cdef647 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
@@ -21,8 +21,8 @@ import com.google.common.base.Preconditions;
 import com.google.gson.Gson;
 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.tcbot.common.conf.IJiraServerConfig;
+import org.apache.ignite.tcbot.engine.conf.ITcBotConfig;
 import org.apache.ignite.tcbot.common.util.HttpUtil;
 import org.checkerframework.checker.nullness.qual.Nullable;
 import org.slf4j.Logger;
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 9a808ea..d77b915 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
@@ -17,34 +17,32 @@
 
 package org.apache.ignite.ci.jobs;
 
-import java.text.MessageFormat;
-import java.util.ArrayList;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-import java.util.Objects;
-import java.util.concurrent.TimeUnit;
-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.teamcity.ignited.BuildRefCompacted;
+import org.apache.ignite.ci.teamcity.ignited.fatbuild.FatBuildCompacted;
+import org.apache.ignite.ci.user.ITcBotUserCreds;
+import org.apache.ignite.tcbot.common.exeption.ExceptionUtil;
 import org.apache.ignite.tcbot.common.interceptor.AutoProfiling;
 import org.apache.ignite.tcbot.common.interceptor.MonitoredTask;
-import org.apache.ignite.ci.tcbot.conf.ITcBotConfig;
+import org.apache.ignite.tcbot.engine.conf.ITcBotConfig;
+import org.apache.ignite.tcbot.engine.conf.ITrackedBranch;
+import org.apache.ignite.tcbot.engine.conf.ITrackedChain;
+import org.apache.ignite.tcbot.persistence.IStringCompactor;
+import org.apache.ignite.tcignited.ITeamcityIgnited;
+import org.apache.ignite.tcignited.ITeamcityIgnitedProvider;
 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.tcbot.persistence.IStringCompactor;
-import org.apache.ignite.tcignited.ITeamcityIgnited;
-import org.apache.ignite.tcignited.ITeamcityIgnitedProvider;
-import org.apache.ignite.ci.teamcity.ignited.fatbuild.FatBuildCompacted;
-import org.apache.ignite.ci.user.ITcBotUserCreds;
-import org.apache.ignite.tcbot.common.exeption.ExceptionUtil;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
+import javax.inject.Inject;
+import java.text.MessageFormat;
+import java.util.*;
+import java.util.concurrent.TimeUnit;
+import java.util.stream.Collectors;
+import java.util.stream.Stream;
+
 /**
  * Trigger build if half of agents are available and there is no self-triggered builds in build queue.
  */
@@ -72,7 +70,7 @@ public class CheckQueueJob implements Runnable {
     @Inject private ITcBotConfig cfg;
 
     /** */
-    private final Map<ChainAtServerTracked, Long> startTimes = new HashMap<>();
+    private final Map<ITrackedChain, Long> startTimes = new HashMap<>();
 
     /**
      * @param creds Background credentials provider.
@@ -104,25 +102,23 @@ public class CheckQueueJob implements Runnable {
             return msg;
         }
 
-        List<BranchTracked> tracked = cfg.getTrackedBranches().getBranches();
+        Stream<ITrackedBranch> tracked = cfg.getTrackedBranches().branchesStream();
+
+        int srvsChecked = 0, chainsChecked = 0;
 
-        if (tracked == null || tracked.isEmpty()) {
+        Map<String, List<ITrackedChain>> chainsBySrv = mapChainsByServer(tracked);
+        if (chainsBySrv.isEmpty()) {
             final String msg = "Background check queue skipped - no config set for tracked branches.";
             logger.info(msg);
 
             return msg;
         }
+        for (Map.Entry<String, List<ITrackedChain>> entry : chainsBySrv.entrySet()) {
+            String srvCode = entry.getKey();
 
-        int srvsChecked = 0, chainsChecked = 0;
-
-        Map<String, List<ChainAtServerTracked>> chainsBySrv = mapChainsByServer(tracked);
-
-        for (Map.Entry<String, List<ChainAtServerTracked>> entry : chainsBySrv.entrySet()) {
-            String srvId = entry.getKey();
-
-            List<ChainAtServerTracked> chainsAll = entry.getValue();
-            List<ChainAtServerTracked> chains = chainsAll.stream()
-                    .filter(c -> Objects.equals(c.serverId, srvId))
+            List<ITrackedChain> chainsAll = entry.getValue();
+            List<ITrackedChain> chains = chainsAll.stream()
+                    .filter(c -> Objects.equals(c.serverCode(), srvCode))
                     .collect(Collectors.toList());
 
             srvsChecked++;
@@ -130,7 +126,7 @@ public class CheckQueueJob implements Runnable {
             chainsChecked += chainsAll.size();
 
             try {
-                checkQueue(srvId, chains);
+                checkQueue(srvCode, chains);
             }
             catch (Exception e) {
                 logger.error("Unable to check queue: " + e.getMessage(), e);
@@ -149,9 +145,7 @@ public class CheckQueueJob implements Runnable {
     @SuppressWarnings({"WeakerAccess", "UnusedReturnValue"})
     @AutoProfiling
     @MonitoredTask(name = "Check Server Queue", nameExtArgIndex = 0)
-    protected String checkQueue(String srvId,
-        List<ChainAtServerTracked> chains) {
-
+    protected String checkQueue(String srvId, List<ITrackedChain> chains) {
         ITeamcityIgnited tcIgn = tcIgnitedProv.server(srvId, creds);
 
         List<Agent> agents = tcIgn.agents(true, true);
@@ -180,13 +174,13 @@ public class CheckQueueJob implements Runnable {
 
         StringBuilder res = new StringBuilder();
 
-        for (ChainAtServerTracked chain : chains) {
-            if(!Objects.equals(chain.serverId, srvId))
+        for (ITrackedChain chain : chains) {
+            if(!Objects.equals(chain.serverCode(), srvId))
                 continue;
 
             boolean trigger = true;
 
-            List<BuildRefCompacted> buildsForBr = tcIgn.getQueuedBuildsCompacted(chain.branchForRest);
+            List<BuildRefCompacted> buildsForBr = tcIgn.getQueuedBuildsCompacted(chain.tcBranch());
 
             for (BuildRefCompacted refComp : buildsForBr) {
                 Integer buildId = refComp.getId();
@@ -217,7 +211,7 @@ public class CheckQueueJob implements Runnable {
                     final String msg
                             = MessageFormat.format("Queued build {0} was early triggered " +
                             "(user {1}, branch {2}, suite {3})." +
-                            " Will not start Ignite build.", buildId, login, chain.branchForRest, build.buildTypeId);
+                            " Will not start Ignite build.", buildId, login, chain.tcBranch(), build.buildTypeId);
 
                     logger.info(msg);
 
@@ -233,7 +227,7 @@ public class CheckQueueJob implements Runnable {
                 continue;
 
             long curr = System.currentTimeMillis();
-            long delay = chain.getTriggerBuildQuietPeriod();
+            long delay = chain.triggerBuildQuietPeriod();
 
             if (delay > 0) {
                 Long lastStart = startTimes.get(chain);
@@ -245,8 +239,8 @@ public class CheckQueueJob implements Runnable {
 
                     final String msg = MessageFormat.format("Skip triggering build, timeout has not expired " +
                                     "(server={0}, suite={1}, branch={2}, delay={3} mins, passed={4} mins)",
-                            chain.getServerId(), chain.getSuiteIdMandatory(), chain.getBranchForRestMandatory(),
-                            chain.getTriggerBuildQuietPeriod(), minsPassed);
+                            chain.serverCode(), chain.tcSuiteId(), chain.tcBranch(),
+                            chain.triggerBuildQuietPeriod(), minsPassed);
                     logger.info(msg);
 
                     res.append(msg).append("; ");
@@ -257,10 +251,10 @@ public class CheckQueueJob implements Runnable {
 
             startTimes.put(chain, curr);
 
-            Map<String, Object> parms = chain.buildParameters();
-            tcIgn.triggerBuild(chain.suiteId, chain.branchForRest(), true, false, parms);
+            tcIgn.triggerBuild(chain.tcSuiteId(), chain.tcBranch(), true, false,
+                    chain.generateBuildParameters());
 
-            res.append(chain.branchForRest).append(" ").append(chain.suiteId).append(" triggered; ");
+            res.append(chain.tcBranch()).append(" ").append(chain.tcBranch()).append(" triggered; ");
         }
 
         return res.toString();
@@ -270,32 +264,36 @@ public class CheckQueueJob implements Runnable {
      * @param branchesTracked Tracked branches.
      * @return Mapped chains to server identifier.
      */
-    private Map<String, List<ChainAtServerTracked>> mapChainsByServer(List<BranchTracked> branchesTracked) {
-        Map<String, List<ChainAtServerTracked>> chainsBySrv = new HashMap<>();
-
-        for(BranchTracked branchTracked: branchesTracked) {
-            for (ChainAtServerTracked chain : branchTracked.getChains()) {
-                String srv = chain.serverId;
-
-                if (!tcIgnitedProv.hasAccess(srv, creds)) {
-                    logger.warn("Background operations credentials does not grant access to server \"{}\"," +
-                        " build queue trigger will not work.", srv);
-
-                    continue;
-                }
-
-                if (!chain.isTriggerBuild()) {
-                    logger.info("Build triggering disabled for server={}, suite={}, branch={}",
-                            srv, chain.getSuiteIdMandatory(), chain.getBranchForRestMandatory());
-
-                    continue;
-                }
-
-                logger.info("Checking queue for server {}.", srv);
-
-                chainsBySrv.computeIfAbsent(srv, v -> new ArrayList<>()).add(chain);
-            }
-        }
+    private Map<String, List<ITrackedChain>> mapChainsByServer(Stream<ITrackedBranch> branchesTracked) {
+        Map<String, List<ITrackedChain>> chainsBySrv = new HashMap<>();
+
+        branchesTracked.flatMap(ITrackedBranch::chainsStream)
+                .filter(chain -> {
+                    String srv = chain.serverCode();
+
+                    if (!tcIgnitedProv.hasAccess(srv, creds)) {
+                        logger.warn("Background operations credentials does not grant access to server \"{}\"," +
+                                " build queue trigger will not work.", srv);
+
+                        return false;
+                    }
+
+                    return true;
+                })
+                .filter(chain -> {
+                    if (!chain.triggerBuild()) {
+                        logger.info("Build triggering disabled for server={}, suite={}, branch={}",
+                                chain.serverCode(), chain.tcBranch(), chain.tcBranch());
+
+                        return false;
+                    }
+                    return true;
+                })
+                .forEach(chain -> {
+                    logger.info("Checking queue for server {}.", chain.serverCode());
+
+                    chainsBySrv.computeIfAbsent(chain.serverCode(), v -> new ArrayList<>()).add(chain);
+                });
 
         return chainsBySrv;
     }
diff --git a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/mail/EmailSender.java b/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/mail/EmailSender.java
index f047312..3f8f075 100644
--- a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/mail/EmailSender.java
+++ b/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/mail/EmailSender.java
@@ -29,7 +29,7 @@ import javax.mail.internet.InternetAddress;
 import javax.mail.internet.MimeBodyPart;
 import javax.mail.internet.MimeMessage;
 import javax.mail.internet.MimeMultipart;
-import org.apache.ignite.ci.tcbot.conf.NotificationsConfig;
+import org.apache.ignite.tcbot.engine.conf.NotificationsConfig;
 
 /**
  * Class for sending email with configured credentials.
diff --git a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/mail/SlackSender.java b/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/mail/SlackSender.java
index b190a67..d15d337 100644
--- a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/mail/SlackSender.java
+++ b/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/mail/SlackSender.java
@@ -25,8 +25,8 @@ import com.ullink.slack.simpleslackapi.SlackUser;
 import com.ullink.slack.simpleslackapi.impl.SlackSessionFactory;
 import com.ullink.slack.simpleslackapi.replies.SlackMessageReply;
 import java.io.IOException;
-import org.apache.ignite.ci.HelperConfig;
-import org.apache.ignite.ci.tcbot.conf.NotificationsConfig;
+
+import org.apache.ignite.tcbot.engine.conf.NotificationsConfig;
 
 import static com.google.common.base.Strings.isNullOrEmpty;
 
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 dcd1252..aaedf62 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
@@ -20,13 +20,13 @@ 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.tcbot.engine.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;
+import org.apache.ignite.tcbot.common.conf.IDataSourcesConfigSupplier;
 
 /**
  * TC Bot self services mapping (without 3rd party integrations configuration.
@@ -36,7 +36,7 @@ public class TcBotBusinessServicesModule extends AbstractModule {
     @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(IDataSourcesConfigSupplier.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());
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 1f1c8b4..c46b097 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
@@ -21,13 +21,13 @@ import java.util.List;
 import java.util.concurrent.atomic.AtomicInteger;
 import javax.inject.Inject;
 
+import org.apache.ignite.tcbot.common.conf.ITcServerConfig;
 import org.apache.ignite.tcbot.engine.chain.FullChainRunCtx;
 import org.apache.ignite.tcbot.engine.chain.LatestRebuildMode;
 import org.apache.ignite.tcbot.engine.chain.ProcessLogsMode;
-import org.apache.ignite.ci.tcbot.conf.BranchTracked;
 import org.apache.ignite.tcbot.common.interceptor.AutoProfiling;
-import org.apache.ignite.ci.tcbot.conf.ITcBotConfig;
-import org.apache.ignite.ci.tcbot.conf.TcServerConfig;
+import org.apache.ignite.tcbot.engine.conf.ITcBotConfig;
+import org.apache.ignite.tcbot.engine.conf.ITrackedBranch;
 import org.apache.ignite.tcbot.persistence.IStringCompactor;
 import org.apache.ignite.tcignited.ITeamcityIgnited;
 import org.apache.ignite.tcignited.ITeamcityIgnitedProvider;
@@ -68,20 +68,20 @@ public class TrackedBranchChainsProcessor {
         final TestFailuresSummary res = new TestFailuresSummary();
         final AtomicInteger runningUpdates = new AtomicInteger();
 
-        final String branchNn = isNullOrEmpty(branch) ? TcServerConfig.DEFAULT_TRACKED_BRANCH_NAME : branch;
+        final String branchNn = isNullOrEmpty(branch) ? ITcServerConfig.DEFAULT_TRACKED_BRANCH_NAME : branch;
         res.setTrackedBranch(branchNn);
 
-        final BranchTracked tracked = tcBotCfg.getTrackedBranches().getBranchMandatory(branchNn);
+        final ITrackedBranch tracked = tcBotCfg.getTrackedBranches().getBranchMandatory(branchNn);
 
-        tracked.chains.stream()
-            .filter(chainTracked -> tcIgnitedProv.hasAccess(chainTracked.serverId, creds))
+        tracked.chainsStream()
+            .filter(chainTracked -> tcIgnitedProv.hasAccess(chainTracked.serverCode(), creds))
             .map(chainTracked -> {
-                final String srvCode = chainTracked.serverId;
+                final String srvCode = chainTracked.serverCode();
 
-                final String branchForTc = chainTracked.getBranchForRestMandatory();
+                final String branchForTc = chainTracked.tcBranch();
 
                 //branch is tracked, so fail rate should be taken from this branch data (otherwise it is specified).
-                final String baseBranchTc = chainTracked.getBaseBranchForTc().orElse(branchForTc);
+                final String baseBranchTc = chainTracked.tcBaseBranch().orElse(branchForTc);
 
                 ITeamcityIgnited tcIgnited = tcIgnitedProv.server(srvCode, creds);
 
@@ -91,7 +91,7 @@ public class TrackedBranchChainsProcessor {
 
                 chainStatus.baseBranchForTc = baseBranchTc;
 
-                String suiteIdMandatory = chainTracked.getSuiteIdMandatory();
+                String suiteIdMandatory = chainTracked.tcSuiteId();
 
                 List<Integer> chains = tcIgnited.getLastNBuildsFromHistory(suiteIdMandatory, branchForTc, buildResMergeCnt);
 
@@ -143,19 +143,19 @@ public class TrackedBranchChainsProcessor {
         ITcBotUserCreds creds) {
         FullLRTestsSummary summary = new FullLRTestsSummary();
 
-        final String branchNn = isNullOrEmpty(branch) ? TcServerConfig.DEFAULT_TRACKED_BRANCH_NAME : branch;
-        final BranchTracked tracked = tcBotCfg.getTrackedBranches().getBranchMandatory(branchNn);
+        final String branchNn = isNullOrEmpty(branch) ? ITcServerConfig.DEFAULT_TRACKED_BRANCH_NAME : branch;
+        final ITrackedBranch tracked = tcBotCfg.getTrackedBranches().getBranchMandatory(branchNn);
 
-        tracked.chains.stream()
-            .filter(chainTracked -> tcIgnitedProv.hasAccess(chainTracked.serverId, creds))
+        tracked.chainsStream()
+            .filter(chainTracked -> tcIgnitedProv.hasAccess(chainTracked.serverCode(), creds))
             .map(chainTracked -> {
-                final String srvId = chainTracked.serverId;
+                final String srvId = chainTracked.serverCode();
 
-                final String branchForTc = chainTracked.getBranchForRestMandatory();
+                final String branchForTc = chainTracked.tcBranch();
 
                 ITeamcityIgnited tcIgnited = tcIgnitedProv.server(srvId, creds);
 
-                List<Integer> hist = tcIgnited.getLastNBuildsFromHistory(chainTracked.getSuiteIdMandatory(), branchForTc, 1);
+                List<Integer> hist = tcIgnited.getLastNBuildsFromHistory(chainTracked.tcSuiteId(), branchForTc, 1);
 
                 return chainProc.loadLongRunningTestsSummary(tcIgnited, hist);
             })
diff --git a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/tcbot/conf/BranchTracked.java b/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/tcbot/conf/BranchTracked.java
index 20eff29..8f87e96 100644
--- a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/tcbot/conf/BranchTracked.java
+++ b/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/tcbot/conf/BranchTracked.java
@@ -23,12 +23,14 @@ import java.util.List;
 import java.util.stream.Stream;
 import javax.validation.constraints.NotNull;
 import org.apache.ignite.ci.issue.IssueType;
+import org.apache.ignite.tcbot.engine.conf.ITrackedBranch;
+import org.apache.ignite.tcbot.engine.conf.ITrackedChain;
 import org.jetbrains.annotations.Nullable;
 
 /**
  * One tracked branch, probably on several servers
  */
-public class BranchTracked {
+public class BranchTracked implements ITrackedBranch {
     /** ID for internal REST and for config file. */
     public String id;
 
@@ -42,7 +44,7 @@ public class BranchTracked {
     /**
      * @return internal identifier of the branch.
      */
-    public String getId() {
+    public String name() {
         return id;
     }
 
@@ -52,8 +54,8 @@ public class BranchTracked {
     }
 
     /** */
-    public Stream<ChainAtServerTracked> getChainsStream() {
-        return getChains().stream();
+    public Stream<ITrackedChain> chainsStream() {
+        return chains.stream().map(t->t);
     }
 
     /**
diff --git a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/tcbot/conf/ChainAtServer.java b/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/tcbot/conf/ChainAtServer.java
index 9daccb7..72f42f1 100644
--- a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/tcbot/conf/ChainAtServer.java
+++ b/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/tcbot/conf/ChainAtServer.java
@@ -17,6 +17,8 @@
 
 package org.apache.ignite.ci.tcbot.conf;
 
+import org.apache.ignite.tcbot.engine.conf.ITrackedChain;
+
 import java.util.Objects;
 import javax.annotation.Nonnull;
 import javax.annotation.Nullable;
@@ -36,9 +38,9 @@ public class ChainAtServer {
 
     }
 
-    public ChainAtServer(ChainAtServer o) {
-        this.serverId = o.serverId;
-        this.suiteId = o.suiteId;
+    public ChainAtServer(ITrackedChain o) {
+        this.serverId = o.serverCode();
+        this.suiteId = o.tcSuiteId();
     }
 
     /** {@inheritDoc} */
diff --git a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/tcbot/conf/ChainAtServerTracked.java b/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/tcbot/conf/ChainAtServerTracked.java
index f60cd2e..585e5db 100644
--- a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/tcbot/conf/ChainAtServerTracked.java
+++ b/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/tcbot/conf/ChainAtServerTracked.java
@@ -27,6 +27,8 @@ import java.util.Optional;
 import java.util.stream.Stream;
 import javax.annotation.Nonnull;
 import javax.annotation.Nullable;
+
+import org.apache.ignite.tcbot.engine.conf.ITrackedChain;
 import org.jetbrains.annotations.NotNull;
 
 import static com.google.common.base.Preconditions.checkState;
@@ -36,7 +38,7 @@ import static com.google.common.base.Strings.isNullOrEmpty;
  * Chain on particular TC server, which is tracked by the Bot.
  */
 @SuppressWarnings("PublicField")
-public class ChainAtServerTracked extends ChainAtServer {
+public class ChainAtServerTracked extends ChainAtServer implements ITrackedChain {
     /** Branch identifier by TC identification for REST API. */
     @Nonnull public String branchForRest;
 
@@ -49,7 +51,7 @@ public class ChainAtServerTracked extends ChainAtServer {
     /** Automatic build triggering quiet period in minutes. */
     @Nullable private Integer triggerBuildQuietPeriod;
 
-    /** Build parameters for Triggerring. */
+    /** Build parameters for Triggering. */
     @Nullable private List<BuildParameterSpec> triggerParameters;
 
     /** @return {@link #suiteId} */
@@ -68,14 +70,13 @@ public class ChainAtServerTracked extends ChainAtServer {
     }
 
     /**
-     * @return base (etalon) branch in TC indentification t builds
+     * @return base (etalon) branch in TC identification t builds
      */
-    @Nonnull
-    public Optional<String> getBaseBranchForTc() {
+    @Nonnull public Optional<String> tcBaseBranch() {
         if (Strings.isNullOrEmpty(baseBranchForTc))
             return Optional.empty();
 
-        return Optional.ofNullable(baseBranchForTc);
+        return Optional.of(baseBranchForTc);
     }
 
     /** {@inheritDoc} */
@@ -102,21 +103,26 @@ public class ChainAtServerTracked extends ChainAtServer {
     /**
      * @return {@code True} If automatic build triggering enabled.
      */
-    public boolean isTriggerBuild() {
+    public boolean triggerBuild() {
         return triggerBuild == null ? false : triggerBuild;
     }
 
     /**
      * @return Quiet period in minutes between triggering builds or zero if period is not set and should be ignored.
      */
-    public int getTriggerBuildQuietPeriod() {
+    public int triggerBuildQuietPeriod() {
         return triggerBuildQuietPeriod == null ? 0 : triggerBuildQuietPeriod;
     }
 
+    @Override
+    public String tcSuiteId() {
+        return suiteId;
+    }
+
     /**
      * @return Map with parameter values for current run.
      */
-    @NotNull public Map<String, Object> buildParameters() {
+    @Nonnull public Map<String, Object> generateBuildParameters() {
         if (triggerParameters == null || triggerParameters.isEmpty())
             return Collections.emptyMap();
 
@@ -142,8 +148,17 @@ public class ChainAtServerTracked extends ChainAtServer {
         return triggerParameters.stream().map(BuildParameterSpec::name);
     }
 
-    /** */
-    public String branchForRest() {
+    @Override
+    public String tcBranch() {
         return branchForRest;
     }
+
+    /**
+     * @return Server ID to access configs within IDataSourceCfgSupplier.
+     */
+    @Override
+    public String serverCode() {
+        return serverId;
+    }
+
 }
diff --git a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/tcbot/conf/GitHubConfig.java b/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/tcbot/conf/GitHubConfig.java
index eff42da..a5daac4 100644
--- a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/tcbot/conf/GitHubConfig.java
+++ b/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/tcbot/conf/GitHubConfig.java
@@ -20,6 +20,8 @@ import com.google.common.base.Strings;
 import java.util.Properties;
 import javax.annotation.Nullable;
 import org.apache.ignite.ci.HelperConfig;
+import org.apache.ignite.tcbot.common.conf.IGitHubConfig;
+import org.apache.ignite.tcbot.common.conf.PasswordEncoder;
 import org.jetbrains.annotations.NotNull;
 
 import static com.google.common.base.Strings.isNullOrEmpty;
diff --git a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/tcbot/conf/JiraServerConfig.java b/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/tcbot/conf/JiraServerConfig.java
index 43441df..0de7cd5 100644
--- a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/tcbot/conf/JiraServerConfig.java
+++ b/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/tcbot/conf/JiraServerConfig.java
@@ -20,6 +20,8 @@ import com.google.common.base.Strings;
 import java.util.Properties;
 import org.apache.ignite.ci.HelperConfig;
 import org.apache.ignite.ci.jira.pure.Ticket;
+import org.apache.ignite.tcbot.common.conf.IJiraServerConfig;
+import org.apache.ignite.tcbot.common.conf.PasswordEncoder;
 import org.jetbrains.annotations.Nullable;
 
 import static com.google.common.base.Strings.isNullOrEmpty;
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 11f72ff..e684c25 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
@@ -19,26 +19,48 @@ package org.apache.ignite.ci.tcbot.conf;
 import com.google.common.base.Preconditions;
 import com.google.common.base.Strings;
 import java.io.File;
+import java.io.FileReader;
+import java.io.IOException;
 import java.util.Objects;
 import java.util.Properties;
+
+import com.google.gson.Gson;
 import org.apache.ignite.ci.HelperConfig;
+import org.apache.ignite.tcbot.common.conf.IGitHubConfig;
+import org.apache.ignite.tcbot.common.conf.IJiraServerConfig;
+import org.apache.ignite.tcbot.common.exeption.ExceptionUtil;
 import org.apache.ignite.tcbot.common.interceptor.GuavaCached;
 import org.apache.ignite.tcbot.common.conf.ITcServerConfig;
 import org.apache.ignite.tcbot.common.conf.TcBotWorkDir;
+import org.apache.ignite.tcbot.engine.conf.ITcBotConfig;
+import org.apache.ignite.tcbot.engine.conf.ITrackedBranchesConfig;
+import org.apache.ignite.tcbot.engine.conf.NotificationsConfig;
 
 /**
  *
  */
 public class LocalFilesBasedConfig implements ITcBotConfig {
+    private static TcBotJsonConfig reloadConfig() {
+        final File workDir = TcBotWorkDir.resolveWorkDir();
+        final File file = new File(workDir, "branches.json");
+
+        try (FileReader json = new FileReader(file)) {
+            return new Gson().fromJson(json, TcBotJsonConfig.class);
+        }
+        catch (IOException e) {
+            throw ExceptionUtil.propagateException(e);
+        }
+    }
+
     /** {@inheritDoc} */
     @GuavaCached(softValues = true, expireAfterWriteSecs = 3 * 60)
-    @Override public BranchesTracked getTrackedBranches() {
-        return HelperConfig.getTrackedBranches();
+    protected TcBotJsonConfig getConfig() {
+        return reloadConfig();
     }
 
     /** {@inheritDoc} */
     @Override public ITcServerConfig getTeamcityConfig(String srvCode) {
-        return getTrackedBranches().getTcConfig(srvCode)
+        return getConfig().getTcConfig(srvCode)
             .orElseGet(() -> {
                 TcServerConfig tcCfg = new TcServerConfig();
 
@@ -54,7 +76,7 @@ public class LocalFilesBasedConfig implements ITcBotConfig {
 
     /** {@inheritDoc} */
     @Override public IJiraServerConfig getJiraConfig(String srvCode) {
-        return getTrackedBranches().getJiraConfig(srvCode)
+        return getConfig().getJiraConfig(srvCode)
             .orElseGet(() -> new JiraServerConfig()
                 .code(srvCode)
                 .properties(loadOldAuthProps(srvCode)));
@@ -62,7 +84,7 @@ public class LocalFilesBasedConfig implements ITcBotConfig {
 
     /** {@inheritDoc} */
     @Override public IGitHubConfig getGitConfig(String srvCode) {
-        GitHubConfig cfg = getTrackedBranches().getGitHubConfig(srvCode)
+        GitHubConfig cfg = getConfig().getGitHubConfig(srvCode)
             .orElseGet(() -> new GitHubConfig()
                 .code(srvCode)
                 .properties(loadOldAuthProps(srvCode)));
@@ -74,7 +96,7 @@ public class LocalFilesBasedConfig implements ITcBotConfig {
 
     /** {@inheritDoc} */
     @Override public NotificationsConfig notifications() {
-        NotificationsConfig notifications = getTrackedBranches().notifications();
+        NotificationsConfig notifications = getConfig().notifications();
         if (notifications != null && !notifications.isEmpty())
             return notifications;
 
@@ -83,11 +105,16 @@ public class LocalFilesBasedConfig implements ITcBotConfig {
 
     /** {@inheritDoc} */
     @Override public String primaryServerCode() {
-        String srvCode = getTrackedBranches().primaryServerCode();
+        String srvCode = getConfig().primaryServerCode();
 
         return Strings.isNullOrEmpty(srvCode) ? ITcBotConfig.DEFAULT_SERVER_CODE : srvCode;
     }
 
+    @Override
+    public ITrackedBranchesConfig getTrackedBranches() {
+        return getConfig();
+    }
+
     @GuavaCached(softValues = true, expireAfterWriteSecs = 3 * 60)
     protected Properties loadOldAuthProps(String srvCode) {
         File workDir = TcBotWorkDir.resolveWorkDir();
diff --git a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/tcbot/conf/BranchesTracked.java b/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/tcbot/conf/TcBotJsonConfig.java
similarity index 74%
rename from ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/tcbot/conf/BranchesTracked.java
rename to ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/tcbot/conf/TcBotJsonConfig.java
index f5dbf3d..95c2ed3 100644
--- a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/tcbot/conf/BranchesTracked.java
+++ b/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/tcbot/conf/TcBotJsonConfig.java
@@ -17,6 +17,11 @@
 
 package org.apache.ignite.ci.tcbot.conf;
 
+import org.apache.ignite.tcbot.engine.conf.ITrackedBranch;
+import org.apache.ignite.tcbot.engine.conf.ITrackedBranchesConfig;
+import org.apache.ignite.tcbot.engine.conf.ITrackedChain;
+import org.apache.ignite.tcbot.engine.conf.NotificationsConfig;
+
 import java.util.ArrayList;
 import java.util.Collections;
 import java.util.List;
@@ -30,7 +35,7 @@ import javax.annotation.Nullable;
  * TC Bot main JSON config file, Historically.
  * Config file for tracked branches.
  */
-public class BranchesTracked {
+public class TcBotJsonConfig implements ITrackedBranchesConfig {
     /** Branches. */
     private List<BranchTracked> branches = new ArrayList<>();
 
@@ -49,38 +54,18 @@ public class BranchesTracked {
     /** Notifications settings & tokens. */
     private NotificationsConfig notifications = new NotificationsConfig();
 
-    /**
-     * @return list of internal identifiers of branch.
-     */
-    public List<String> getIds() {
-        return branches.stream().map(BranchTracked::getId).collect(Collectors.toList());
-    }
-
-    /**
-     * Get Unique suites involved into tracked branches
-     */
-    public Set<ChainAtServer> getSuitesUnique() {
-        return branches.stream()
-            .flatMap(BranchTracked::getChainsStream)
-            .map(ChainAtServer::new) // to produce object with another equals
-            .collect(Collectors.toSet());
-    }
-
-    public Optional<BranchTracked> get(String branch) {
-        return branches.stream().filter(b -> branch.equals(b.getId())).findAny();
-    }
-
-    public BranchTracked getBranchMandatory(String branch) {
-        return get(branch).orElseThrow(() -> new RuntimeException("Branch not found: " + branch));
+    @Override
+    public Stream<ITrackedBranch> branchesStream() {
+        return branches.stream().map(t->t);
     }
 
     /**
      *
      */
     public Set<String> getServerIds() {
-        Stream<String> srvsInTracked = branches.stream()
-            .flatMap(BranchTracked::getChainsStream)
-            .map(ChainAtServer::getServerId);
+        Stream<String> srvsInTracked = branchesStream()
+            .flatMap(ITrackedBranch::chainsStream)
+            .map(ITrackedChain::serverCode);
 
         return Stream.concat(srvsInTracked,
             tcServers.stream().map(TcServerConfig::getCode))
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 a29e6ac..fbd72b7 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
@@ -33,7 +33,6 @@ import org.jetbrains.annotations.Nullable;
  * Teamcity connection configuration or reference to another config.
  */
 public class TcServerConfig implements ITcServerConfig {
-    public static final String DEFAULT_TRACKED_BRANCH_NAME = "master";
     private static final String DEFAULT_HOST = "https://ci.ignite.apache.org/";
 
     /** TC server name. */
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 d309443..b74487d 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
@@ -19,42 +19,12 @@ package org.apache.ignite.ci.tcbot.issue;
 
 import com.google.common.base.Preconditions;
 import com.google.common.base.Strings;
-import java.io.IOException;
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-import java.util.Set;
-import java.util.concurrent.Executors;
-import java.util.concurrent.ScheduledExecutorService;
-import java.util.concurrent.TimeUnit;
-import java.util.concurrent.atomic.AtomicBoolean;
-import java.util.concurrent.atomic.AtomicInteger;
-import javax.annotation.Nonnull;
-import javax.inject.Inject;
-import javax.inject.Provider;
-
-import org.apache.ignite.tcbot.common.interceptor.AutoProfiling;
-import org.apache.ignite.tcbot.common.interceptor.MonitoredTask;
-import org.apache.ignite.ci.issue.EventTemplate;
-import org.apache.ignite.ci.issue.EventTemplates;
-import org.apache.ignite.ci.issue.Issue;
-import org.apache.ignite.ci.issue.IssueKey;
-import org.apache.ignite.ci.issue.IssueType;
+import org.apache.ignite.ci.issue.*;
 import org.apache.ignite.ci.jobs.CheckQueueJob;
 import org.apache.ignite.ci.mail.EmailSender;
 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.NotificationsConfig;
 import org.apache.ignite.ci.tcbot.user.IUserStorage;
-import org.apache.ignite.tcignited.history.IRunHistory;
-import org.apache.ignite.tcbot.persistence.IStringCompactor;
-import org.apache.ignite.tcignited.ITeamcityIgnited;
-import org.apache.ignite.tcignited.ITeamcityIgnitedProvider;
-import org.apache.ignite.tcignited.SyncMode;
 import org.apache.ignite.ci.teamcity.ignited.change.ChangeCompacted;
 import org.apache.ignite.ci.teamcity.ignited.fatbuild.FatBuildCompacted;
 import org.apache.ignite.ci.teamcity.ignited.runhist.InvocationData;
@@ -64,10 +34,31 @@ import org.apache.ignite.ci.web.model.current.ChainAtServerCurrentStatus;
 import org.apache.ignite.ci.web.model.current.SuiteCurrentStatus;
 import org.apache.ignite.ci.web.model.current.TestFailure;
 import org.apache.ignite.ci.web.model.current.TestFailuresSummary;
+import org.apache.ignite.tcbot.common.interceptor.AutoProfiling;
+import org.apache.ignite.tcbot.common.interceptor.MonitoredTask;
+import org.apache.ignite.tcbot.engine.conf.INotificationChannel;
+import org.apache.ignite.tcbot.engine.conf.ITcBotConfig;
+import org.apache.ignite.tcbot.engine.conf.NotificationsConfig;
+import org.apache.ignite.tcbot.persistence.IStringCompactor;
+import org.apache.ignite.tcignited.ITeamcityIgnited;
+import org.apache.ignite.tcignited.ITeamcityIgnitedProvider;
+import org.apache.ignite.tcignited.SyncMode;
+import org.apache.ignite.tcignited.history.IRunHistory;
 import org.jetbrains.annotations.NotNull;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
+import javax.annotation.Nonnull;
+import javax.inject.Inject;
+import javax.inject.Provider;
+import java.io.IOException;
+import java.util.*;
+import java.util.concurrent.Executors;
+import java.util.concurrent.ScheduledExecutorService;
+import java.util.concurrent.TimeUnit;
+import java.util.concurrent.atomic.AtomicBoolean;
+import java.util.concurrent.atomic.AtomicInteger;
+
 import static org.apache.ignite.tcignited.history.RunHistSync.normalizeBranch;
 
 /**
@@ -472,19 +463,15 @@ public class IssueDetector {
      *
      */
     private void checkFailures() {
-        List<String> ids = cfg.getTrackedBranchesIds();
-
-        for (String tbranchName : ids) {
+        cfg.getTrackedBranches().branchesStream().forEach(tb -> {
             try {
-                checkFailuresEx(tbranchName);
-            }
-            catch (Exception e) {
+                checkFailuresEx(tb.name());
+            } catch (Exception e) {
                 e.printStackTrace();
 
                 logger.error("Failure periodic check failed: " + e.getMessage(), e);
             }
-        }
-
+        });
     }
 
     /**
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 599c2a4..dfc4f5f 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
@@ -42,7 +42,7 @@ import javax.inject.Provider;
 import org.apache.ignite.tcbot.common.interceptor.AutoProfiling;
 import org.apache.ignite.tcbot.common.interceptor.GuavaCached;
 import org.apache.ignite.ci.tcbot.chain.BuildChainProcessor;
-import org.apache.ignite.ci.tcbot.conf.ITcBotConfig;
+import org.apache.ignite.tcbot.engine.conf.ITcBotConfig;
 import org.apache.ignite.tcservice.model.hist.BuildRef;
 import org.apache.ignite.tcservice.model.result.tests.TestOccurrence;
 import org.apache.ignite.ci.teamcity.ignited.BuildRefCompacted;
diff --git a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/tcbot/visa/BranchTicketMatcher.java b/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/tcbot/visa/BranchTicketMatcher.java
index 7c927c1..390e71b 100644
--- a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/tcbot/visa/BranchTicketMatcher.java
+++ b/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/tcbot/visa/BranchTicketMatcher.java
@@ -25,9 +25,9 @@ import org.apache.ignite.ci.github.pure.IGitHubConnection;
 import org.apache.ignite.ci.jira.ignited.IJiraIgnitedProvider;
 import org.apache.ignite.ci.jira.ignited.TicketCompacted;
 import org.apache.ignite.ci.jira.pure.Ticket;
-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.tcbot.common.conf.IGitHubConfig;
+import org.apache.ignite.tcbot.common.conf.IJiraServerConfig;
+import org.apache.ignite.tcbot.engine.conf.ITcBotConfig;
 import org.jetbrains.annotations.NotNull;
 import org.jetbrains.annotations.Nullable;
 
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 594c111..a742f7d 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
@@ -50,9 +50,9 @@ import org.apache.ignite.ci.observer.BuildObserver;
 import org.apache.ignite.ci.observer.BuildsInfo;
 import org.apache.ignite.ci.tcbot.ITcBotBgAuth;
 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.tcbot.common.conf.IGitHubConfig;
+import org.apache.ignite.tcbot.common.conf.IJiraServerConfig;
+import org.apache.ignite.tcbot.engine.conf.ITcBotConfig;
 import org.apache.ignite.tcbot.common.conf.ITcServerConfig;
 import org.apache.ignite.tcservice.model.mute.MuteInfo;
 import org.apache.ignite.tcservice.model.result.Build;
@@ -635,11 +635,11 @@ public class TcBotTriggerAndSignOffService {
         cfg.getTrackedBranches()
             .get(trBranch)
             .ifPresent(
-                b -> b.getChainsStream()
-                    .filter(c -> Objects.equals(realTcId, c.serverId))
-                    .filter(c -> c.branchForRest.equals(ITeamcity.DEFAULT))
+                b -> b.chainsStream()
+                    .filter(c -> Objects.equals(realTcId, c.serverCode()))
+                    .filter(c -> ITeamcity.DEFAULT.equals(c.tcBranch()))
                     .findFirst()
-                    .ifPresent(ch -> buildTypeId.append(ch.suiteId)));
+                    .ifPresent(ch -> buildTypeId.append(ch.tcSuiteId())));
 
         return buildTypeId.toString();
     }
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 f79cdd1..52b6b26 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
@@ -28,9 +28,9 @@ import java.util.TreeSet;
 import javax.annotation.Nullable;
 import org.apache.ignite.tcbot.persistence.IVersionedEntity;
 import org.apache.ignite.tcbot.persistence.Persisted;
-import org.apache.ignite.ci.tcbot.conf.INotificationChannel;
+import org.apache.ignite.tcbot.engine.conf.INotificationChannel;
 import org.apache.ignite.tcservice.model.user.User;
-import org.apache.ignite.ci.util.CryptUtil;
+import org.apache.ignite.tcbot.common.util.CryptUtil;
 
 import static javax.xml.bind.DatatypeConverter.printHexBinary;
 
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 32ece86..92d08b1 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
@@ -43,7 +43,7 @@ import org.apache.ignite.ci.user.ITcBotUserCreds;
 import org.apache.ignite.ci.user.TcHelperUser;
 import org.apache.ignite.ci.user.UserSession;
 import org.apache.ignite.tcbot.common.util.Base64Util;
-import org.apache.ignite.ci.util.CryptUtil;
+import org.apache.ignite.tcbot.common.util.CryptUtil;
 import org.apache.ignite.tcbot.common.exeption.ExceptionUtil;
 import org.apache.ignite.ci.web.CtxListener;
 import org.apache.ignite.tcbot.common.exeption.ServiceUnauthorizedException;
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 cd2554b..3fa1f95 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
@@ -29,7 +29,7 @@ import java.util.Map;
 import java.util.concurrent.ConcurrentHashMap;
 
 import org.apache.ignite.tcservice.ITeamcity;
-import org.apache.ignite.ci.tcbot.conf.ITcBotConfig;
+import org.apache.ignite.tcbot.engine.conf.ITcBotConfig;
 import org.apache.ignite.tcbot.persistence.IStringCompactor;
 
 import static com.google.common.base.Strings.isNullOrEmpty;
diff --git a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/web/rest/GetTrackedBranches.java b/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/web/rest/GetTrackedBranches.java
index 0e07f95..e0af5c6 100644
--- a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/web/rest/GetTrackedBranches.java
+++ b/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/web/rest/GetTrackedBranches.java
@@ -33,10 +33,11 @@ import javax.ws.rs.QueryParam;
 import javax.ws.rs.core.Context;
 import javax.ws.rs.core.MediaType;
 
-import org.apache.ignite.ci.tcbot.conf.BranchTracked;
 import org.apache.ignite.ci.tcbot.conf.ChainAtServer;
 import org.apache.ignite.ci.tcbot.TcBotGeneralService;
-import org.apache.ignite.ci.tcbot.conf.ITcBotConfig;
+import org.apache.ignite.tcbot.engine.conf.ITcBotConfig;
+import org.apache.ignite.tcbot.engine.conf.ITrackedBranch;
+import org.apache.ignite.tcbot.engine.conf.ITrackedBranchesConfig;
 import org.apache.ignite.tcignited.ITeamcityIgnitedProvider;
 import org.apache.ignite.ci.user.ITcBotUserCreds;
 import org.apache.ignite.ci.web.CtxListener;
@@ -71,14 +72,25 @@ public class GetTrackedBranches {
         ITcBotConfig cfg = injector.getInstance(ITcBotConfig.class);
         ITeamcityIgnitedProvider tcProv = injector.getInstance(ITeamcityIgnitedProvider.class);
 
-        return cfg.getTrackedBranches().getBranches()
-                .stream()
+        return cfg.getTrackedBranches().branchesStream()
                 .filter(bt ->
-                        bt.getChains().stream().anyMatch(chain-> tcProv.hasAccess(chain.serverId, prov)))
-                .map(BranchTracked::getId)
+                        bt.chainsStream().anyMatch(chain-> tcProv.hasAccess(chain.serverCode(), prov)))
+                .map(ITrackedBranch::name)
                 .collect(Collectors.toList());
     }
 
+
+    /**
+     * Get Unique suites involved into tracked branches
+     * @param trackedBranches
+     */
+    public Set<ChainAtServer> getSuitesUnique(ITrackedBranchesConfig trackedBranches) {
+        return trackedBranches.branchesStream()
+                .flatMap(ITrackedBranch::chainsStream)
+                .map(ChainAtServer::new) // to produce object with another equals
+                .collect(Collectors.toSet());
+    }
+
     /**
      * Return all suites involved into tracked branches.
      *
@@ -92,8 +104,7 @@ public class GetTrackedBranches {
         ITcBotConfig cfg = injector.getInstance(ITcBotConfig.class);
         ITeamcityIgnitedProvider tcProv = injector.getInstance(ITeamcityIgnitedProvider.class);
 
-        return cfg.getTrackedBranches()
-            .getSuitesUnique()
+        return getSuitesUnique(cfg.getTrackedBranches())
             .stream()
             .filter(chainAtSrv ->
                 Strings.isNullOrEmpty(srvId)
diff --git a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/web/rest/TriggerBuilds.java b/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/web/rest/TriggerBuilds.java
index 10baad3..54de527 100644
--- a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/web/rest/TriggerBuilds.java
+++ b/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/web/rest/TriggerBuilds.java
@@ -33,8 +33,8 @@ import javax.ws.rs.core.Context;
 import javax.ws.rs.core.MediaType;
 import org.apache.ignite.ci.github.pure.IGitHubConnection;
 import org.apache.ignite.ci.github.pure.IGitHubConnectionProvider;
-import org.apache.ignite.ci.tcbot.conf.IJiraServerConfig;
-import org.apache.ignite.ci.tcbot.conf.ITcBotConfig;
+import org.apache.ignite.tcbot.common.conf.IJiraServerConfig;
+import org.apache.ignite.tcbot.engine.conf.ITcBotConfig;
 import org.apache.ignite.ci.tcbot.trigger.TriggerResult;
 import org.apache.ignite.tcignited.ITeamcityIgnitedProvider;
 import org.apache.ignite.ci.user.ITcBotUserCreds;
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 4d57e58..c88cc31 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
@@ -34,7 +34,7 @@ import org.apache.ignite.tcbot.engine.chain.FullChainRunCtx;
 import org.apache.ignite.tcbot.engine.chain.LatestRebuildMode;
 import org.apache.ignite.tcbot.engine.chain.ProcessLogsMode;
 import org.apache.ignite.ci.tcbot.chain.BuildChainProcessor;
-import org.apache.ignite.ci.tcbot.conf.ITcBotConfig;
+import org.apache.ignite.tcbot.engine.conf.ITcBotConfig;
 import org.apache.ignite.ci.tcbot.trends.MasterTrendsService;
 import org.apache.ignite.ci.teamcity.ignited.buildcondition.BuildCondition;
 import org.apache.ignite.ci.user.ITcBotUserCreds;
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 74333b3..37337bf 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
@@ -19,14 +19,14 @@ package org.apache.ignite.ci.web.rest.login;
 
 import com.google.common.base.Preconditions;
 import com.google.inject.Injector;
-import org.apache.ignite.ci.tcbot.conf.ITcBotConfig;
+import org.apache.ignite.tcbot.engine.conf.ITcBotConfig;
 import org.apache.ignite.ci.tcbot.user.IUserStorage;
 import org.apache.ignite.tcservice.model.user.User;
 import org.apache.ignite.tcignited.ITeamcityIgnitedProvider;
 import org.apache.ignite.tcservice.login.ITcLogin;
 import org.apache.ignite.ci.user.TcHelperUser;
 import org.apache.ignite.tcbot.common.util.Base64Util;
-import org.apache.ignite.ci.util.CryptUtil;
+import org.apache.ignite.tcbot.common.util.CryptUtil;
 import org.apache.ignite.ci.web.CtxListener;
 import org.apache.ignite.ci.user.LoginResponse;
 import org.apache.ignite.ci.user.UserSession;
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 17beee2..dfaf340 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
@@ -32,10 +32,11 @@ import javax.ws.rs.core.Context;
 import javax.ws.rs.core.Form;
 import javax.ws.rs.core.MediaType;
 import org.apache.ignite.ci.tcbot.ITcBotBgAuth;
-import org.apache.ignite.ci.tcbot.conf.ITcBotConfig;
+import org.apache.ignite.tcbot.engine.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.tcbot.engine.conf.ITrackedBranch;
 import org.apache.ignite.tcservice.model.user.User;
 import org.apache.ignite.tcservice.login.ITcLogin;
 import org.apache.ignite.ci.user.ITcBotUserCreds;
@@ -48,6 +49,8 @@ import org.apache.ignite.ci.web.model.UserMenuResult;
 import org.jetbrains.annotations.NotNull;
 import org.jetbrains.annotations.Nullable;
 
+import java.util.stream.Collectors;
+
 
 @Path(UserService.USER)
 @Produces(MediaType.APPLICATION_JSON)
@@ -118,7 +121,11 @@ public class UserService {
         IUserStorage users = injector.getInstance(IUserStorage.class);
         final TcHelperUser user = users.getUser(login);
 
-        final TcHelperUserUi tcHelperUserUi = new TcHelperUserUi(user, cfg.getTrackedBranchesIds());
+        //todo can filter accessibliity
+        final TcHelperUserUi tcHelperUserUi = new TcHelperUserUi(user,
+                cfg.getTrackedBranches().branchesStream()
+                        .map(ITrackedBranch::name)
+                        .collect(Collectors.toList()) );
 
         //if principal is not null, can do only brief check of credentials.
 
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 a1961f3..a02a798 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
@@ -28,7 +28,7 @@ import javax.ws.rs.QueryParam;
 import javax.ws.rs.core.Context;
 import javax.ws.rs.core.MediaType;
 import org.apache.ignite.ci.tcbot.chain.TrackedBranchChainsProcessor;
-import org.apache.ignite.ci.tcbot.conf.ITcBotConfig;
+import org.apache.ignite.tcbot.engine.conf.ITcBotConfig;
 import org.apache.ignite.ci.tcbot.visa.TcBotTriggerAndSignOffService;
 import org.apache.ignite.ci.user.ITcBotUserCreds;
 import org.apache.ignite.ci.web.CtxListener;
diff --git a/ignite-tc-helper-web/src/test/java/org/apache/ignite/ci/di/DiContextTest.java b/ignite-tc-helper-web/src/test/java/org/apache/ignite/ci/di/DiContextTest.java
index c9c009c..12c6e04 100644
--- a/ignite-tc-helper-web/src/test/java/org/apache/ignite/ci/di/DiContextTest.java
+++ b/ignite-tc-helper-web/src/test/java/org/apache/ignite/ci/di/DiContextTest.java
@@ -27,7 +27,7 @@ import org.apache.ignite.ci.observer.BuildObserver;
 import org.apache.ignite.ci.observer.ObserverTask;
 import org.apache.ignite.ci.tcbot.ITcBotBgAuth;
 import org.apache.ignite.ci.tcbot.chain.BuildChainProcessor;
-import org.apache.ignite.ci.tcbot.conf.ITcBotConfig;
+import org.apache.ignite.tcbot.engine.conf.ITcBotConfig;
 import org.apache.ignite.ci.web.TcUpdatePool;
 import org.apache.ignite.configuration.CacheConfiguration;
 import org.apache.ignite.tcbot.common.interceptor.MonitoredTask;
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 be1b4aa..8755a59 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
@@ -31,12 +31,13 @@ import org.apache.ignite.ci.jira.ignited.IJiraIgnited;
 import org.apache.ignite.ci.jira.ignited.IJiraIgnitedProvider;
 import org.apache.ignite.ci.jira.pure.IJiraIntegration;
 import org.apache.ignite.ci.jira.pure.IJiraIntegrationProvider;
-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.TcBotJsonConfig;
+import org.apache.ignite.tcbot.common.conf.IGitHubConfig;
+import org.apache.ignite.tcbot.common.conf.IJiraServerConfig;
+import org.apache.ignite.tcbot.engine.conf.ITcBotConfig;
 import org.apache.ignite.tcbot.common.conf.ITcServerConfig;
-import org.apache.ignite.ci.tcbot.conf.NotificationsConfig;
+import org.apache.ignite.tcbot.engine.conf.ITrackedBranchesConfig;
+import org.apache.ignite.tcbot.engine.conf.NotificationsConfig;
 import org.apache.ignite.ci.tcbot.conf.TcServerConfig;
 import org.apache.ignite.ci.tcbot.issue.IIssuesStorage;
 import org.apache.ignite.ci.tcbot.user.IUserStorage;
@@ -44,7 +45,7 @@ import org.apache.ignite.tcbot.persistence.IStringCompactor;
 import org.apache.ignite.tcignited.ITeamcityIgnitedProvider;
 import org.apache.ignite.ci.teamcity.ignited.InMemoryStringCompactor;
 import org.apache.ignite.ci.teamcity.ignited.TeamcityIgnitedProviderMock;
-import org.apache.ignite.tcbot.common.conf.ITcServerConfigSupplier;
+import org.apache.ignite.tcbot.common.conf.IDataSourcesConfigSupplier;
 import org.apache.ignite.tcbot.common.conf.TcBotWorkDir;
 import org.apache.ignite.tcignited.buildlog.IBuildLogProcessor;
 import org.mockito.Mockito;
@@ -59,9 +60,9 @@ import static org.mockito.Mockito.when;
  * Setup TC bot context with Ignited services mocks: - TC: {@link TeamcityIgnitedProviderMock}
  */
 public class MockBasedTcBotModule extends AbstractModule {
-    private BranchesTracked tracked = new BranchesTracked();
+    private TcBotJsonConfig tracked = new TcBotJsonConfig();
 
-    public MockBasedTcBotModule(BranchesTracked tracked) {
+    public MockBasedTcBotModule(TcBotJsonConfig tracked) {
         this.tracked = tracked;
     }
 
@@ -94,7 +95,7 @@ public class MockBasedTcBotModule extends AbstractModule {
             }
 
             @Override
-            public BranchesTracked getTrackedBranches() {
+            public ITrackedBranchesConfig getTrackedBranches() {
                 return tracked;
             }
 
@@ -128,7 +129,7 @@ public class MockBasedTcBotModule extends AbstractModule {
             }
         };
         bind(ITcBotConfig.class).toInstance(cfg);
-        bind(ITcServerConfigSupplier.class).toInstance(cfg);
+        bind(IDataSourcesConfigSupplier.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/TrackedBranchProcessorTest.java b/ignite-tc-helper-web/src/test/java/org/apache/ignite/ci/tcbot/chain/TrackedBranchProcessorTest.java
index 40ad6b4..a1a21fa 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
@@ -28,7 +28,7 @@ import java.util.concurrent.ConcurrentHashMap;
 import org.apache.ignite.tcservice.ITeamcity;
 import org.apache.ignite.ci.tcbot.conf.BranchTracked;
 import org.apache.ignite.ci.tcbot.conf.ChainAtServerTracked;
-import org.apache.ignite.ci.tcbot.conf.BranchesTracked;
+import org.apache.ignite.ci.tcbot.conf.TcBotJsonConfig;
 import org.apache.ignite.tcbot.persistence.IStringCompactor;
 import org.apache.ignite.tcignited.ITeamcityIgnitedProvider;
 import org.apache.ignite.tcignited.SyncMode;
@@ -66,7 +66,7 @@ public class TrackedBranchProcessorTest {
     private Map<Integer, FatBuildCompacted> apacheBuilds = new ConcurrentHashMap<>();
 
     /** Branches tracked. */
-    private BranchesTracked branchesTracked = new BranchesTracked();
+    private TcBotJsonConfig branchesTracked = new TcBotJsonConfig();
     /**
      * Injector.
      */
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 b62568c..c48106c 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
@@ -31,7 +31,7 @@ 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.tcbot.conf.TcBotJsonConfig;
 import org.apache.ignite.tcservice.model.result.tests.TestOccurrenceFull;
 import org.apache.ignite.tcbot.persistence.IStringCompactor;
 import org.apache.ignite.tcignited.ITeamcityIgnitedProvider;
@@ -61,7 +61,7 @@ public class IssueDetectorTest {
     private Map<Integer, FatBuildCompacted> apacheBuilds = new ConcurrentHashMap<>();
 
     /** Config Branches tracked. */
-    private BranchesTracked branchesTracked = new BranchesTracked();
+    private TcBotJsonConfig branchesTracked = new TcBotJsonConfig();
     /**
      * Injector.
      */
diff --git a/ignite-tc-helper-web/src/test/java/org/apache/ignite/tcignited/IgnitedTcInMemoryIntegrationTest.java b/ignite-tc-helper-web/src/test/java/org/apache/ignite/tcignited/IgnitedTcInMemoryIntegrationTest.java
index 6bd753f..6afa380 100644
--- a/ignite-tc-helper-web/src/test/java/org/apache/ignite/tcignited/IgnitedTcInMemoryIntegrationTest.java
+++ b/ignite-tc-helper-web/src/test/java/org/apache/ignite/tcignited/IgnitedTcInMemoryIntegrationTest.java
@@ -28,8 +28,8 @@ import org.apache.ignite.ci.db.TcHelperDb;
 import org.apache.ignite.ci.di.scheduler.DirectExecNoWaitScheduler;
 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.TcBotJsonConfig;
+import org.apache.ignite.tcbot.engine.conf.ITcBotConfig;
 import org.apache.ignite.ci.teamcity.ignited.BuildRefCompacted;
 import org.apache.ignite.tcignited.buildref.BuildRefDao;
 import org.apache.ignite.ci.teamcity.ignited.buildtype.BuildTypeRefCompacted;
@@ -41,7 +41,7 @@ import org.apache.ignite.ci.user.ITcBotUserCreds;
 import org.apache.ignite.configuration.IgniteConfiguration;
 import org.apache.ignite.spi.discovery.tcp.TcpDiscoverySpi;
 import org.apache.ignite.tcbot.common.conf.ITcServerConfig;
-import org.apache.ignite.tcbot.common.conf.ITcServerConfigSupplier;
+import org.apache.ignite.tcbot.common.conf.IDataSourcesConfigSupplier;
 import org.apache.ignite.tcbot.persistence.IStringCompactor;
 import org.apache.ignite.tcbot.persistence.IgniteStringCompactor;
 import org.apache.ignite.tcbot.persistence.TcBotPersistenceModule;
@@ -739,10 +739,10 @@ public class IgnitedTcInMemoryIntegrationTest {
             when(tcCfg.host()).thenReturn("http://ci.ignite.apache.org/");
             when(tcCfg.trustedSuites()).thenReturn(new ArrayList<>());
             when(cfg.getTeamcityConfig(anyString())).thenReturn(tcCfg);
-            when(cfg.getTrackedBranches()).thenReturn(new BranchesTracked());
+            when(cfg.getTrackedBranches()).thenReturn(new TcBotJsonConfig());
 
             bind(ITcBotConfig.class).toInstance(cfg);
-            bind(ITcServerConfigSupplier.class).toInstance(cfg);
+            bind(IDataSourcesConfigSupplier.class).toInstance(cfg);
 
             install(new TcBotPersistenceModule());
         }
diff --git a/tcbot-common/src/main/java/org/apache/ignite/tcbot/common/conf/IBuildParameterSpec.java b/tcbot-common/src/main/java/org/apache/ignite/tcbot/common/conf/IBuildParameterSpec.java
index 4e7f34d..6d1223e 100644
--- a/tcbot-common/src/main/java/org/apache/ignite/tcbot/common/conf/IBuildParameterSpec.java
+++ b/tcbot-common/src/main/java/org/apache/ignite/tcbot/common/conf/IBuildParameterSpec.java
@@ -18,6 +18,9 @@ package org.apache.ignite.tcbot.common.conf;
 
 import java.util.Collection;
 
+/**
+ * Teamcity build parameter for filtering and for triggering specification.
+ */
 public interface IBuildParameterSpec {
     String name();
 
diff --git a/tcbot-common/src/main/java/org/apache/ignite/tcbot/common/conf/ITcServerConfigSupplier.java b/tcbot-common/src/main/java/org/apache/ignite/tcbot/common/conf/IDataSourcesConfigSupplier.java
similarity index 88%
copy from tcbot-common/src/main/java/org/apache/ignite/tcbot/common/conf/ITcServerConfigSupplier.java
copy to tcbot-common/src/main/java/org/apache/ignite/tcbot/common/conf/IDataSourcesConfigSupplier.java
index 4a20a7e..9ef5b1f 100644
--- a/tcbot-common/src/main/java/org/apache/ignite/tcbot/common/conf/ITcServerConfigSupplier.java
+++ b/tcbot-common/src/main/java/org/apache/ignite/tcbot/common/conf/IDataSourcesConfigSupplier.java
@@ -17,7 +17,9 @@
 
 package org.apache.ignite.tcbot.common.conf;
 
-@Deprecated
-public interface ITcServerConfigSupplier {
+/**
+ * 3rd party data sources (services/servers) configurations.
+ */
+public interface IDataSourcesConfigSupplier {
     public ITcServerConfig getTeamcityConfig(String srvCode);
 }
diff --git a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/tcbot/conf/IGitHubConfig.java b/tcbot-common/src/main/java/org/apache/ignite/tcbot/common/conf/IGitHubConfig.java
similarity index 97%
rename from ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/tcbot/conf/IGitHubConfig.java
rename to tcbot-common/src/main/java/org/apache/ignite/tcbot/common/conf/IGitHubConfig.java
index 63580d3..8016983 100644
--- a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/tcbot/conf/IGitHubConfig.java
+++ b/tcbot-common/src/main/java/org/apache/ignite/tcbot/common/conf/IGitHubConfig.java
@@ -14,7 +14,7 @@
  * 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 javax.annotation.Nonnull;
 import javax.annotation.Nullable;
diff --git a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/tcbot/conf/IJiraServerConfig.java b/tcbot-common/src/main/java/org/apache/ignite/tcbot/common/conf/IJiraServerConfig.java
similarity index 96%
rename from ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/tcbot/conf/IJiraServerConfig.java
rename to tcbot-common/src/main/java/org/apache/ignite/tcbot/common/conf/IJiraServerConfig.java
index b4d719b..33b8276 100644
--- a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/tcbot/conf/IJiraServerConfig.java
+++ b/tcbot-common/src/main/java/org/apache/ignite/tcbot/common/conf/IJiraServerConfig.java
@@ -14,10 +14,11 @@
  * 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 com.google.common.base.Strings;
-import org.jetbrains.annotations.Nullable;
+
+import javax.annotation.Nullable;
 
 import static com.google.common.base.Strings.isNullOrEmpty;
 
diff --git a/tcbot-common/src/main/java/org/apache/ignite/tcbot/common/conf/ITcServerConfig.java b/tcbot-common/src/main/java/org/apache/ignite/tcbot/common/conf/ITcServerConfig.java
index a7b421b..918868a 100644
--- a/tcbot-common/src/main/java/org/apache/ignite/tcbot/common/conf/ITcServerConfig.java
+++ b/tcbot-common/src/main/java/org/apache/ignite/tcbot/common/conf/ITcServerConfig.java
@@ -26,6 +26,11 @@ import java.util.Collection;
  */
 public interface ITcServerConfig {
     /**
+     * Default tracked branch in case it was not specified.
+     */
+    String DEFAULT_TRACKED_BRANCH_NAME = "master";
+
+    /**
      * @return Another TC Server (service) config name to use settings from. Filled only for server aliases.
      */
     @Nullable
diff --git a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/tcbot/conf/PasswordEncoder.java b/tcbot-common/src/main/java/org/apache/ignite/tcbot/common/conf/PasswordEncoder.java
similarity index 85%
rename from ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/tcbot/conf/PasswordEncoder.java
rename to tcbot-common/src/main/java/org/apache/ignite/tcbot/common/conf/PasswordEncoder.java
index fa693ee..e86801b 100644
--- a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/tcbot/conf/PasswordEncoder.java
+++ b/tcbot-common/src/main/java/org/apache/ignite/tcbot/common/conf/PasswordEncoder.java
@@ -15,17 +15,18 @@
  * limitations under the License.
  */
 
-package org.apache.ignite.ci.tcbot.conf;
+package org.apache.ignite.tcbot.common.conf;
 
 import com.google.common.base.Preconditions;
 import com.google.common.base.Strings;
+import org.apache.ignite.tcbot.common.util.Base64Util;
+import org.apache.ignite.tcbot.common.util.CryptUtil;
+
 import java.security.SecureRandom;
+import javax.annotation.Nonnull;
 import javax.crypto.Cipher;
 import javax.crypto.spec.SecretKeySpec;
 import javax.xml.bind.DatatypeConverter;
-import org.apache.ignite.ci.HelperConfig;
-import org.apache.ignite.ci.util.CryptUtil;
-import org.jetbrains.annotations.NotNull;
 
 import static javax.xml.bind.DatatypeConverter.parseHexBinary;
 import static javax.xml.bind.DatatypeConverter.printHexBinary;
@@ -68,7 +69,7 @@ public class PasswordEncoder {
         return CryptUtil.aesEcbPkcs5PaddedCrypt(k(), data, Cipher.DECRYPT_MODE);
     }
 
-    @NotNull private static SecretKeySpec k() {
+    @Nonnull private static SecretKeySpec k() {
         int reqBytes = 128 / 8;
         String ptrn = "Ignite";
         byte[] raw = Strings.repeat(ptrn, reqBytes / ptrn.length() + 1).substring(0, reqBytes).getBytes();
@@ -90,7 +91,12 @@ public class PasswordEncoder {
     public static void main0(String[] args) {
         String pass = "324aadfe23....";
         String encode = encode(pass);
-        System.err.println("Encoded: " + HelperConfig.GITHUB_AUTH_TOKEN + "=" + encode);
+        System.err.println("Encoded: " +
+                "\"gitHubConfigs\": [\n" +
+                        "    {\n" +
+                        "      \"authTok\": \"\",\n" +
+                             "" + encode +   "    }\n" +
+                "  ],");
         String decode = decode(encode);
         Preconditions.checkState(decode.equals(pass));
     }
@@ -116,10 +122,14 @@ public class PasswordEncoder {
     }
 
     public static void encodeJiraTok(String user, String pwd) {
-        String tok = HelperConfig.userPwdToToken(user, pwd);
+        String tok =  userPwdToToken(user, pwd);
         String encode = encode(tok);
-        System.err.println("Encoded: " + HelperConfig.JIRA_AUTH_TOKEN + "=" + encode);
+        System.err.println("Encoded: "  + "=" + encode);
         String decode = decode(encode);
         Preconditions.checkState(decode.equals(tok));
     }
+
+    @Nonnull public static String userPwdToToken(String user, String pwd) {
+        return Base64Util.encodeUtf8String(user + ":" + pwd);
+    }
 }
diff --git a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/util/CryptUtil.java b/tcbot-common/src/main/java/org/apache/ignite/tcbot/common/util/CryptUtil.java
similarity index 97%
rename from ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/util/CryptUtil.java
rename to tcbot-common/src/main/java/org/apache/ignite/tcbot/common/util/CryptUtil.java
index d6e8467..b56f44d 100644
--- a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/util/CryptUtil.java
+++ b/tcbot-common/src/main/java/org/apache/ignite/tcbot/common/util/CryptUtil.java
@@ -15,11 +15,11 @@
  * limitations under the License.
  */
 
-package org.apache.ignite.ci.util;
+package org.apache.ignite.tcbot.common.util;
 
 import com.google.common.base.Throwables;
-import org.jetbrains.annotations.NotNull;
 
+import javax.annotation.Nonnull;
 import javax.crypto.*;
 import javax.crypto.spec.SecretKeySpec;
 import java.nio.charset.Charset;
@@ -92,7 +92,7 @@ public class CryptUtil {
         return aesEcbPkcs5PaddedCrypt(aesKey(userKey), data, Cipher.DECRYPT_MODE);
     }
 
-    @NotNull
+    @Nonnull
     private static SecretKeySpec aesKey(byte[] userKey) {
         return new SecretKeySpec(userKey, "AES");
     }
diff --git a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/tcbot/conf/EmailSettings.java b/tcbot-engine/src/main/java/org/apache/ignite/tcbot/engine/conf/EmailSettings.java
similarity index 97%
rename from ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/tcbot/conf/EmailSettings.java
rename to tcbot-engine/src/main/java/org/apache/ignite/tcbot/engine/conf/EmailSettings.java
index 55b028e..0c130f9 100644
--- a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/tcbot/conf/EmailSettings.java
+++ b/tcbot-engine/src/main/java/org/apache/ignite/tcbot/engine/conf/EmailSettings.java
@@ -14,7 +14,7 @@
  * 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.engine.conf;
 
 public class EmailSettings {
     /** Email to send notifications from. */
diff --git a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/tcbot/conf/INotificationChannel.java b/tcbot-engine/src/main/java/org/apache/ignite/tcbot/engine/conf/INotificationChannel.java
similarity index 97%
rename from ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/tcbot/conf/INotificationChannel.java
rename to tcbot-engine/src/main/java/org/apache/ignite/tcbot/engine/conf/INotificationChannel.java
index 9dc19d8..fc2157e 100644
--- a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/tcbot/conf/INotificationChannel.java
+++ b/tcbot-engine/src/main/java/org/apache/ignite/tcbot/engine/conf/INotificationChannel.java
@@ -14,7 +14,7 @@
  * 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.engine.conf;
 
 import javax.annotation.Nullable;
 
diff --git a/tcbot-common/src/main/java/org/apache/ignite/tcbot/common/conf/ITcServerConfigSupplier.java b/tcbot-engine/src/main/java/org/apache/ignite/tcbot/engine/conf/INotificationsConfig.java
similarity index 83%
rename from tcbot-common/src/main/java/org/apache/ignite/tcbot/common/conf/ITcServerConfigSupplier.java
rename to tcbot-engine/src/main/java/org/apache/ignite/tcbot/engine/conf/INotificationsConfig.java
index 4a20a7e..61c9fe2 100644
--- a/tcbot-common/src/main/java/org/apache/ignite/tcbot/common/conf/ITcServerConfigSupplier.java
+++ b/tcbot-engine/src/main/java/org/apache/ignite/tcbot/engine/conf/INotificationsConfig.java
@@ -14,10 +14,7 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
+package org.apache.ignite.tcbot.engine.conf;
 
-package org.apache.ignite.tcbot.common.conf;
-
-@Deprecated
-public interface ITcServerConfigSupplier {
-    public ITcServerConfig getTeamcityConfig(String srvCode);
+public interface INotificationsConfig {
 }
diff --git a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/tcbot/conf/ITcBotConfig.java b/tcbot-engine/src/main/java/org/apache/ignite/tcbot/engine/conf/ITcBotConfig.java
similarity index 77%
rename from ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/tcbot/conf/ITcBotConfig.java
rename to tcbot-engine/src/main/java/org/apache/ignite/tcbot/engine/conf/ITcBotConfig.java
index 9703287..3c9af9a 100644
--- a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/tcbot/conf/ITcBotConfig.java
+++ b/tcbot-engine/src/main/java/org/apache/ignite/tcbot/engine/conf/ITcBotConfig.java
@@ -14,18 +14,19 @@
  * 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.engine.conf;
 
+import org.apache.ignite.tcbot.common.conf.IGitHubConfig;
+import org.apache.ignite.tcbot.common.conf.IJiraServerConfig;
 import org.apache.ignite.tcbot.common.conf.ITcServerConfig;
-import org.apache.ignite.tcbot.common.conf.ITcServerConfigSupplier;
+import org.apache.ignite.tcbot.common.conf.IDataSourcesConfigSupplier;
 
 import java.util.Collection;
-import java.util.List;
 
 /**
  * Teamcity Bot configuration access interface.
  */
-public interface ITcBotConfig extends ITcServerConfigSupplier {
+public interface ITcBotConfig extends IDataSourcesConfigSupplier {
     /** Default server code. */
     public String DEFAULT_SERVER_CODE = "apache";
 
@@ -35,17 +36,10 @@ public interface ITcBotConfig extends ITcServerConfigSupplier {
     /**
      * @return Tracked branches configuration for TC Bot.
      */
-    public BranchesTracked getTrackedBranches();
+    public ITrackedBranchesConfig getTrackedBranches();
 
     /**
-     * @return list of internal TC Bot identifiers of all tracked branches.
-     */
-    public default List<String> getTrackedBranchesIds() {
-        return getTrackedBranches().getIds();
-    }
-
-    /**
-     * @return list of servers (services) identifiers involved into tracked branhes processing.
+     * @return list of servers (services) identifiers involved into tracked branches processing.
      */
     public default Collection<String> getServerIds() {
         return getTrackedBranches().getServerIds();
diff --git a/tcbot-common/src/main/java/org/apache/ignite/tcbot/common/conf/IBuildParameterSpec.java b/tcbot-engine/src/main/java/org/apache/ignite/tcbot/engine/conf/ITrackedBranch.java
similarity index 68%
copy from tcbot-common/src/main/java/org/apache/ignite/tcbot/common/conf/IBuildParameterSpec.java
copy to tcbot-engine/src/main/java/org/apache/ignite/tcbot/engine/conf/ITrackedBranch.java
index 4e7f34d..5c5c986 100644
--- a/tcbot-common/src/main/java/org/apache/ignite/tcbot/common/conf/IBuildParameterSpec.java
+++ b/tcbot-engine/src/main/java/org/apache/ignite/tcbot/engine/conf/ITrackedBranch.java
@@ -14,14 +14,19 @@
  * 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.tcbot.engine.conf;
 
-import java.util.Collection;
+import javax.annotation.Nonnull;
+import java.util.List;
+import java.util.stream.Stream;
 
-public interface IBuildParameterSpec {
-    String name();
-
-    boolean isFilled();
+/**
+ *
+ */
+public interface ITrackedBranch {
+    public String name();
+    public Stream<ITrackedChain> chainsStream();
 
-    Collection<? extends IParameterValueSpec> selection();
+    /** Disable notifications for the following issue types.   */
+    @Nonnull public List<String> disableIssueTypes();
 }
diff --git a/tcbot-common/src/main/java/org/apache/ignite/tcbot/common/conf/IBuildParameterSpec.java b/tcbot-engine/src/main/java/org/apache/ignite/tcbot/engine/conf/ITrackedBranchesConfig.java
similarity index 59%
copy from tcbot-common/src/main/java/org/apache/ignite/tcbot/common/conf/IBuildParameterSpec.java
copy to tcbot-engine/src/main/java/org/apache/ignite/tcbot/engine/conf/ITrackedBranchesConfig.java
index 4e7f34d..64a1154 100644
--- a/tcbot-common/src/main/java/org/apache/ignite/tcbot/common/conf/IBuildParameterSpec.java
+++ b/tcbot-engine/src/main/java/org/apache/ignite/tcbot/engine/conf/ITrackedBranchesConfig.java
@@ -14,14 +14,27 @@
  * 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.tcbot.engine.conf;
 
 import java.util.Collection;
+import java.util.Optional;
+import java.util.stream.Stream;
+
+/**
+ *
+ */
+public interface ITrackedBranchesConfig {
+    Stream<ITrackedBranch> branchesStream();
+
+    Collection<String> getServerIds();
+
+    public default Optional<ITrackedBranch> get(String branch) {
+        return branchesStream().filter(b -> branch.equals(b.name())).findAny();
+    }
 
-public interface IBuildParameterSpec {
-    String name();
 
-    boolean isFilled();
+    public default ITrackedBranch getBranchMandatory(String branch) {
+        return get(branch).orElseThrow(() -> new RuntimeException("Branch not found: " + branch));
+    }
 
-    Collection<? extends IParameterValueSpec> selection();
 }
diff --git a/tcbot-common/src/main/java/org/apache/ignite/tcbot/common/conf/IBuildParameterSpec.java b/tcbot-engine/src/main/java/org/apache/ignite/tcbot/engine/conf/ITrackedChain.java
similarity index 59%
copy from tcbot-common/src/main/java/org/apache/ignite/tcbot/common/conf/IBuildParameterSpec.java
copy to tcbot-engine/src/main/java/org/apache/ignite/tcbot/engine/conf/ITrackedChain.java
index 4e7f34d..e88c042 100644
--- a/tcbot-common/src/main/java/org/apache/ignite/tcbot/common/conf/IBuildParameterSpec.java
+++ b/tcbot-engine/src/main/java/org/apache/ignite/tcbot/engine/conf/ITrackedChain.java
@@ -14,14 +14,31 @@
  * 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.tcbot.engine.conf;
 
-import java.util.Collection;
+import javax.annotation.Nonnull;
+import java.util.Map;
+import java.util.Optional;
 
-public interface IBuildParameterSpec {
-    String name();
+/**
+ *
+ */
+public interface ITrackedChain {
+    public String serverCode();
+
+    public String tcBranch();
+
+    @Nonnull public Optional<String> tcBaseBranch();
+
+    /**
+     * @return trigger build quiet period, milliseconds.
+     */
+    public int triggerBuildQuietPeriod();
+
+    @Nonnull
+    public Map<String, Object> generateBuildParameters();
 
-    boolean isFilled();
+    public String tcSuiteId();
 
-    Collection<? extends IParameterValueSpec> selection();
+    public boolean triggerBuild();
 }
diff --git a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/tcbot/conf/NotificationChannel.java b/tcbot-engine/src/main/java/org/apache/ignite/tcbot/engine/conf/NotificationChannel.java
similarity index 98%
rename from ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/tcbot/conf/NotificationChannel.java
rename to tcbot-engine/src/main/java/org/apache/ignite/tcbot/engine/conf/NotificationChannel.java
index d3b524b..181753b 100644
--- a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/tcbot/conf/NotificationChannel.java
+++ b/tcbot-engine/src/main/java/org/apache/ignite/tcbot/engine/conf/NotificationChannel.java
@@ -14,7 +14,7 @@
  * 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.engine.conf;
 
 import com.google.common.base.MoreObjects;
 import com.google.common.base.Strings;
diff --git a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/tcbot/conf/NotificationsConfig.java b/tcbot-engine/src/main/java/org/apache/ignite/tcbot/engine/conf/NotificationsConfig.java
similarity index 62%
rename from ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/tcbot/conf/NotificationsConfig.java
rename to tcbot-engine/src/main/java/org/apache/ignite/tcbot/engine/conf/NotificationsConfig.java
index 31b6fa3..7927c29 100644
--- a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/tcbot/conf/NotificationsConfig.java
+++ b/tcbot-engine/src/main/java/org/apache/ignite/tcbot/engine/conf/NotificationsConfig.java
@@ -15,25 +15,30 @@
  * limitations under the License.
  */
 
-package org.apache.ignite.ci.tcbot.conf;
+package org.apache.ignite.tcbot.engine.conf;
 
 import com.google.common.base.Preconditions;
 import com.google.common.base.Strings;
+import org.apache.ignite.tcbot.common.conf.ITcServerConfig;
+import org.apache.ignite.tcbot.common.conf.PasswordEncoder;
+import org.apache.ignite.tcbot.common.conf.TcBotWorkDir;
+
+import java.io.File;
+import java.io.FileReader;
+import java.io.IOException;
 import java.util.ArrayList;
 import java.util.Collection;
 import java.util.Collections;
 import java.util.List;
 import java.util.Properties;
 import javax.annotation.Nonnull;
-import org.apache.ignite.ci.HelperConfig;
-import org.jetbrains.annotations.NotNull;
 
 import static com.google.common.base.Strings.isNullOrEmpty;
 
 /**
  * Notifications Config
  */
-public class NotificationsConfig {
+public class NotificationsConfig implements INotificationsConfig {
     /** (Source) Email. */
     private EmailSettings email = new EmailSettings();
 
@@ -43,28 +48,58 @@ public class NotificationsConfig {
     /** Channels to send notifications to. */
     private List<NotificationChannel> channels = new ArrayList<>();
 
-    @NotNull static NotificationsConfig backwardConfig() {
-        Properties cfgProps = HelperConfig.loadEmailSettings();
+    private static final String MAIL_PROPS = "mail.auth.properties";
+    private static final String USERNAME = "username";
+    private static final String ENCODED_PASSWORD = "encoded_password";
+    /** Slack authorization token property name. */
+    private static final String SLACK_AUTH_TOKEN = "slack.auth_token";
+    @Deprecated
+    private static final String SLACK_CHANNEL = "slack.channel";
+
+    @Nonnull
+    public static NotificationsConfig backwardConfig() {
+        Properties cfgProps = loadEmailSettings();
 
         NotificationsConfig cfg = new NotificationsConfig();
 
-        cfg.slackAuthTok = cfgProps.getProperty(HelperConfig.SLACK_AUTH_TOKEN);
+        cfg.slackAuthTok = cfgProps.getProperty(SLACK_AUTH_TOKEN);
 
-        cfg.email.username(cfgProps.getProperty(HelperConfig.USERNAME));
+        cfg.email.username(cfgProps.getProperty(USERNAME));
 
-        cfg.email.password(cfgProps.getProperty(HelperConfig.ENCODED_PASSWORD));
+        cfg.email.password(cfgProps.getProperty(ENCODED_PASSWORD));
 
-        String slackCh = cfgProps.getProperty(HelperConfig.SLACK_CHANNEL);
+        String slackCh = cfgProps.getProperty(SLACK_CHANNEL);
         if (!Strings.isNullOrEmpty(slackCh)) {
             NotificationChannel ch = new NotificationChannel();
             ch.slack("#" + slackCh);
-            ch.subscribe(TcServerConfig.DEFAULT_TRACKED_BRANCH_NAME);
+            ch.subscribe(ITcServerConfig.DEFAULT_TRACKED_BRANCH_NAME);
             cfg.channels.add(ch);
         }
 
         return cfg;
     }
 
+    public static Properties loadEmailSettings() {
+        try {
+            return loadProps(new File(TcBotWorkDir.resolveWorkDir(), MAIL_PROPS));
+        }
+        catch (IOException e) {
+            e.printStackTrace();
+            return new Properties();
+        }
+    }
+
+    private static Properties loadProps(File file) throws IOException {
+        Properties props = new Properties();
+
+        try (FileReader reader = new FileReader(file)) {
+            props.load(reader);
+        }
+
+        return props;
+    }
+
+
     public boolean isEmpty() {
         return (email == null || Strings.isNullOrEmpty(email.username()))
             && (email == null || Strings.isNullOrEmpty(email.password()))
@@ -104,7 +139,7 @@ public class NotificationsConfig {
         return PasswordEncoder.decode(email.password());
     }
 
-    public Collection<NotificationChannel> channels() {
+    public Collection<? extends INotificationChannel> channels() {
         if (channels == null)
             return Collections.emptyList();
 
diff --git a/tcbot-teamcity-ignited/src/main/java/org/apache/ignite/tcignited/TcIgnitedCachingProvider.java b/tcbot-teamcity-ignited/src/main/java/org/apache/ignite/tcignited/TcIgnitedCachingProvider.java
index 123da3d..4f06f8f 100644
--- a/tcbot-teamcity-ignited/src/main/java/org/apache/ignite/tcignited/TcIgnitedCachingProvider.java
+++ b/tcbot-teamcity-ignited/src/main/java/org/apache/ignite/tcignited/TcIgnitedCachingProvider.java
@@ -20,7 +20,7 @@ import com.google.common.base.Strings;
 import com.google.common.cache.Cache;
 import com.google.common.cache.CacheBuilder;
 import org.apache.ignite.tcbot.common.conf.ITcServerConfig;
-import org.apache.ignite.tcbot.common.conf.ITcServerConfigSupplier;
+import org.apache.ignite.tcbot.common.conf.IDataSourcesConfigSupplier;
 import org.apache.ignite.tcbot.common.exeption.ExceptionUtil;
 import org.apache.ignite.tcignited.creds.ICredentialsProv;
 import org.apache.ignite.tcservice.TeamcityServiceConnection;
@@ -39,7 +39,7 @@ class TcIgnitedCachingProvider implements ITeamcityIgnitedProvider {
     @Inject private Provider<TeamcityServiceConnection> srvFactory;
 
     /** Config. */
-    @Inject private ITcServerConfigSupplier cfg;
+    @Inject private IDataSourcesConfigSupplier cfg;
 
     @Inject private Provider<TeamcityIgnitedImpl> provider;
 
diff --git a/tcbot-teamcity-ignited/src/main/java/org/apache/ignite/tcignited/history/RunHistSync.java b/tcbot-teamcity-ignited/src/main/java/org/apache/ignite/tcignited/history/RunHistSync.java
index edd603d..a0a90f4 100644
--- a/tcbot-teamcity-ignited/src/main/java/org/apache/ignite/tcignited/history/RunHistSync.java
+++ b/tcbot-teamcity-ignited/src/main/java/org/apache/ignite/tcignited/history/RunHistSync.java
@@ -37,7 +37,7 @@ import javax.inject.Inject;
 import org.apache.ignite.ci.teamcity.ignited.runhist.Invocation;
 import org.apache.ignite.ci.teamcity.ignited.runhist.InvocationData;
 import org.apache.ignite.ci.teamcity.ignited.runhist.RunHistKey;
-import org.apache.ignite.tcbot.common.conf.ITcServerConfigSupplier;
+import org.apache.ignite.tcbot.common.conf.IDataSourcesConfigSupplier;
 import org.apache.ignite.tcbot.common.interceptor.MonitoredTask;
 import org.apache.ignite.tcbot.persistence.scheduler.IScheduler;
 import org.apache.ignite.tcservice.ITeamcity;
@@ -78,7 +78,7 @@ public class RunHistSync {
     @Inject private FatBuildDao fatBuildDao;
 
     /** Config. */
-    @Inject private ITcServerConfigSupplier cfg;
+    @Inject private IDataSourcesConfigSupplier cfg;
 
     /** Build to save to history. */
     @GuardedBy("this")
diff --git a/tcbot-teamcity/src/main/java/org/apache/ignite/tcservice/TeamcityServiceConnection.java b/tcbot-teamcity/src/main/java/org/apache/ignite/tcservice/TeamcityServiceConnection.java
index d8d0f45..c0037fe 100644
--- a/tcbot-teamcity/src/main/java/org/apache/ignite/tcservice/TeamcityServiceConnection.java
+++ b/tcbot-teamcity/src/main/java/org/apache/ignite/tcservice/TeamcityServiceConnection.java
@@ -18,9 +18,8 @@
 package org.apache.ignite.tcservice;
 
 import com.google.common.base.Strings;
-import com.google.common.util.concurrent.MoreExecutors;
 import org.apache.ignite.tcbot.common.conf.ITcServerConfig;
-import org.apache.ignite.tcbot.common.conf.ITcServerConfigSupplier;
+import org.apache.ignite.tcbot.common.conf.IDataSourcesConfigSupplier;
 import org.apache.ignite.tcbot.common.conf.TcBotWorkDir;
 import org.apache.ignite.tcbot.common.exeption.ExceptionUtil;
 import org.apache.ignite.tcbot.common.exeption.ServiceConflictException;
@@ -77,7 +76,7 @@ public class TeamcityServiceConnection implements ITeamcity {
     /** Teamcity http connection. */
     @Inject private ITeamcityHttpConnection teamcityHttpConn;
 
-    @Inject private ITcServerConfigSupplier cfg;
+    @Inject private IDataSourcesConfigSupplier cfg;
 
     private String srvCode;