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/01/22 09:58:12 UTC

[ignite-teamcity-bot] branch master updated: IGNITE-10989 Triggering info saved into fat build; removed queued builds methods, builds cache and run history caches. - Fixes #109.

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 2476674  IGNITE-10989 Triggering info saved into fat build; removed queued builds methods, builds cache and run history caches. - Fixes #109.
2476674 is described below

commit 2476674ed51ce15230e9384634f99e59f8d5ad46
Author: Dmitriy Pavlov <dp...@apache.org>
AuthorDate: Tue Jan 22 12:58:02 2019 +0300

    IGNITE-10989 Triggering info saved into fat build; removed queued builds methods, builds cache and run history caches. - Fixes #109.
    
    Signed-off-by: Dmitriy Pavlov <dp...@apache.org>
---
 .../java/org/apache/ignite/ci/ITcAnalytics.java    |  21 --
 .../main/java/org/apache/ignite/ci/ITeamcity.java  |  19 --
 .../apache/ignite/ci/IgnitePersistentTeamcity.java | 264 +--------------------
 .../apache/ignite/ci/IgniteTeamcityConnection.java |  90 -------
 .../ignite/ci/analysis/IMultTestOccurrence.java    |   4 +-
 .../org/apache/ignite/ci/analysis/RunStat.java     |   9 +-
 .../java/org/apache/ignite/ci/db/DbMigrations.java | 118 +--------
 .../org/apache/ignite/ci/jobs/CheckQueueJob.java   |  85 +++----
 .../ignite/ci/runners/RemoteClientTmpHelper.java   |   9 +-
 .../ci/tcbot/builds/CompareBuildsService.java      |  44 ++--
 .../ignite/ci/tcbot/chain/BuildChainProcessor.java |  10 +-
 .../ignite/ci/tcbot/chain/PrChainsProcessor.java   |   2 +-
 .../tcbot/chain/TrackedBranchChainsProcessor.java  |   5 +-
 .../ignite/ci/tcbot/issue/IssueDetector.java       |  27 +--
 .../org/apache/ignite/ci/tcmodel/result/Build.java |  20 +-
 .../ci/teamcity/ignited/IStringCompactor.java      |   4 +-
 .../ci/teamcity/ignited/ITeamcityIgnited.java      |  23 +-
 .../ci/teamcity/ignited/TeamcityIgnitedImpl.java   |  25 ++
 .../ignited/fatbuild/FatBuildCompacted.java        |  50 ++++
 .../ignited/fatbuild/ProactiveFatBuildSync.java    |   2 +-
 .../ignited/fatbuild/TriggeredCompacted.java       |  72 ++++++
 .../ignited/runhist/RunHistCompactedDao.java       |  13 +-
 .../ignite/ci/teamcity/pure/ITeamcityConn.java     |  20 +-
 .../model/current/ChainAtServerCurrentStatus.java  |  25 +-
 .../ci/web/model/current/SuiteCurrentStatus.java   |  64 ++---
 .../ignite/ci/web/model/current/TestFailure.java   |  16 +-
 .../ignite/ci/web/rest/GetChainResultsAsHtml.java  |   2 +-
 .../ci/web/rest/build/GetBuildTestFailures.java    |   2 +-
 .../ci/tcbot/chain/BuildChainProcessorTest.java    |   5 +-
 .../ci/tcbot/chain/PrChainsProcessorTest.java      |  19 +-
 .../ignited/IgnitedTcInMemoryIntegrationTest.java  |  13 +
 31 files changed, 343 insertions(+), 739 deletions(-)

diff --git a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/ITcAnalytics.java b/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/ITcAnalytics.java
index 71a1d83..c4e8155 100644
--- a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/ITcAnalytics.java
+++ b/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/ITcAnalytics.java
@@ -17,28 +17,7 @@
 
 package org.apache.ignite.ci;
 
-import java.util.List;
-import java.util.function.Function;
-import org.apache.ignite.ci.analysis.RunStat;
-import org.apache.ignite.ci.analysis.SingleBuildRunCtx;
-import org.apache.ignite.ci.analysis.SuiteInBranch;
-import org.apache.ignite.ci.analysis.TestInBranch;
-
 @Deprecated
 public interface ITcAnalytics {
-    /**
-     * Return build statistics for default branch provider
-     *
-     * @return map from suite ID to its run statistics
-     */
-    @Deprecated
-    Function<SuiteInBranch, RunStat> getBuildFailureRunStatProvider();
-
-    /**
-     * @return map from test full name (suite: suite.test) and its branch to its run statistics
-     */
-    @Deprecated
-    Function<TestInBranch, RunStat> getTestRunStatProvider();
-
     String getThreadDumpCached(Integer buildId);
 }
diff --git a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/ITeamcity.java b/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/ITeamcity.java
index 4ce064d..a22d1c6 100644
--- a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/ITeamcity.java
+++ b/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/ITeamcity.java
@@ -49,16 +49,6 @@ public interface ITeamcity extends ITeamcityConn {
     @Deprecated
     long DEFAULT_BUILDS_COUNT = 1000;
 
-    /** Temporary feature toggle: Use New run stat in PR analysis, issue detection. */
-    boolean NEW_RUN_STAT = true;
-
-    /**   */
-    @Deprecated
-    CompletableFuture<List<BuildRef>> getQueuedBuilds(@Nullable String branch);
-
-    @Deprecated
-    Build getBuild(String href);
-
     @NotNull public static String buildHref(int id) {
         return "app/rest/latest/builds/id:" + id;
     }
@@ -96,15 +86,6 @@ public interface ITeamcity extends ITeamcityConn {
                 Base64Util.encodeUtf8String(user + ":" + pwd));
     }
 
-    /**
-     * Get list of teamcity agents.
-     *
-     * @param connected Connected flag.
-     * @param authorized Authorized flag.
-     * @return List of teamcity agents.
-     */
-    List<Agent> agents(boolean connected, boolean authorized);
-
     void init(String serverId);
 
     User getUserByUsername(String username);
diff --git a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/IgnitePersistentTeamcity.java b/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/IgnitePersistentTeamcity.java
index bfa6376..7e757cc 100644
--- a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/IgnitePersistentTeamcity.java
+++ b/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/IgnitePersistentTeamcity.java
@@ -75,14 +75,8 @@ import static org.apache.ignite.ci.teamcity.ignited.runhist.RunHistSync.normaliz
 public class IgnitePersistentTeamcity implements IAnalyticsEnabledTeamcity, ITeamcity, ITcAnalytics {
     //V2 caches, 32 parts (V1 caches were 1024 parts)
     @Deprecated
-    private static final String TESTS_RUN_STAT = "testsRunStat";
-    @Deprecated
     private static final String LOG_CHECK_RESULT = "logCheckResult";
 
-    //todo need separate cache or separate key for 'execution time' because it is placed in statistics
-    private static final String BUILDS_FAILURE_RUN_STAT = "buildsFailureRunStat";
-    public static final String BUILDS = "builds";
-
     @Inject
     private Ignite ignite;
 
@@ -98,13 +92,7 @@ public class IgnitePersistentTeamcity implements IAnalyticsEnabledTeamcity, ITea
     @Nullable
     private String serverId;
 
-    /** cached running builds for branch. */
-    private ConcurrentMap<String, Expirable<List<BuildRef>>> queuedBuilds = new ConcurrentHashMap<>();
-
-    /** cached loads of queued builds for branch. */
-    private ConcurrentMap<String, CompletableFuture<List<BuildRef>>> queuedBuildsFuts = new ConcurrentHashMap<>();
-
-    //todo: not good code to keep it static
+    //todo: remove triggering dependency from getTrackedBranch processing, use TC Bot DB data.
     @Deprecated
     private static long lastTriggerMs = System.currentTimeMillis();
 
@@ -114,10 +102,7 @@ public class IgnitePersistentTeamcity implements IAnalyticsEnabledTeamcity, ITea
 
         DbMigrations migrations = new DbMigrations(ignite, conn.serverId());
 
-        migrations.dataMigration(
-            buildsCache(), this::addBuildOccurrenceToFailuresStat,
-                buildsFailureRunStatCache(), testRunStatCache(),
-                visasHistStorage.visas());
+        migrations.dataMigration(visasHistStorage.visas());
     }
 
     /** {@inheritDoc} */
@@ -142,25 +127,6 @@ public class IgnitePersistentTeamcity implements IAnalyticsEnabledTeamcity, ITea
         return cache;
     }
 
-    /**
-     * Creates transactional cache with 32 parts.
-     * @param name Cache name.
-     */
-    private <K, V> IgniteCache<K, V> getOrCreateCacheV2Tx(String name) {
-        final IgniteCache<K, V> cache = ignite.getOrCreateCache(TcHelperDb.getCacheV2TxConfig(name));
-
-        cache.enableStatistics(true);
-
-        return cache;
-    }
-
-    /**
-     * @return {@link Build}s cache, 32 parts.
-     */
-    private IgniteCache<String, Build> buildsCache() {
-        return getOrCreateCacheV2(ignCacheNme(BUILDS));
-    }
-
     /** {@inheritDoc} */
     @AutoProfiling
     @Override public List<BuildType> getBuildTypes(String projectId) {
@@ -172,151 +138,10 @@ public class IgnitePersistentTeamcity implements IAnalyticsEnabledTeamcity, ITea
         return serverId;
     }
 
-    @Deprecated
-    private <K, V> CompletableFuture<V> loadAsyncIfAbsentOrExpired(ConcurrentMap<K, Expirable<V>> cache,
-                                                                   K key,
-                                                                   ConcurrentMap<K, CompletableFuture<V>> cachedComputations,
-                                                                   Function<K, CompletableFuture<V>> realLoadFunction,
-                                                                   int maxAgeSecs,
-                                                                   boolean alwaysProvidePersisted) {
-        @Nullable final Expirable<V> persistedVal = cache.get(key);
-
-        if (persistedVal != null && persistedVal.isAgeLessThanSecs(maxAgeSecs))
-            return CompletableFuture.completedFuture(persistedVal.getData());
-
-        AtomicReference<CompletableFuture<V>> submitRef = new AtomicReference<>();
-
-        CompletableFuture<V> loadFut = cachedComputations.computeIfAbsent(key,
-                k -> {
-                    CompletableFuture<V> future = realLoadFunction.apply(k)
-                            .thenApplyAsync(valueLoaded -> {
-                                final Expirable<V> cached = new Expirable<>(valueLoaded);
-
-                                ObjectInterner.internFields(cached);
-
-                                cache.put(k, cached);
-
-                                return valueLoaded;
-                            });
-
-                    submitRef.set(future);
-
-                    return future;
-                }
-        ).thenApply(res -> {
-            CompletableFuture<V> f = submitRef.get();
-
-            if (f != null)
-                cachedComputations.remove(key, f);
-
-            return res;
-        });
-
-        if (alwaysProvidePersisted && persistedVal != null)
-            return CompletableFuture.completedFuture(persistedVal.getData());
-
-        return loadFut;
-    }
-
-
     public static int getTriggerRelCacheValidSecs(int defaultSecs) {
         long msSinceTrigger = System.currentTimeMillis() - lastTriggerMs;
         long secondsSinceTrigger = TimeUnit.MILLISECONDS.toSeconds(msSinceTrigger);
-        return Math.min((int)secondsSinceTrigger, defaultSecs);
-    }
-
-    /** {@inheritDoc} */
-    @Override public CompletableFuture<List<BuildRef>> getQueuedBuilds(@Nullable final String branch) {
-        int defaultSecs = 60;
-        int secondsUseCached = getTriggerRelCacheValidSecs(defaultSecs);
-
-        return loadAsyncIfAbsentOrExpired(
-            queuedBuilds,
-            Strings.nullToEmpty(branch),
-            queuedBuildsFuts,
-            teamcity::getQueuedBuilds,
-            secondsUseCached,
-            secondsUseCached == defaultSecs);
-    }
-
-    /** {@inheritDoc} */
-    @Nullable
-    @AutoProfiling
-    @Override public Build getBuild(String href) {
-        final IgniteCache<String, Build> cache = buildsCache();
-
-        @Nullable final Build persistedBuild = cache.get(href);
-
-        int fields = ObjectInterner.internFields(persistedBuild);
-
-        if (persistedBuild != null) {
-            if (!persistedBuild.isOutdatedEntityVersion())
-                return persistedBuild;
-        }
-
-        final Build loaded = realLoadBuild(href);
-        //can't reload, but cached has value
-        if (loaded.isFakeStub() && persistedBuild != null && persistedBuild.isOutdatedEntityVersion()) {
-            persistedBuild._version = persistedBuild.latestVersion();
-            cache.put(href, persistedBuild);
-
-            return persistedBuild;
-        }
-
-        if (loaded.isFakeStub() || loaded.hasFinishDate()) {
-            cache.put(href, loaded);
-
-            addBuildOccurrenceToFailuresStat(loaded);
-        }
-
-        return loaded;
-    }
-
-    private void addBuildOccurrenceToFailuresStat(Build loaded) {
-        if (loaded.isFakeStub())
-            return;
-
-        String suiteId = loaded.suiteId();
-        if (Strings.isNullOrEmpty(suiteId))
-            return;
-
-        SuiteInBranch key = keyForBuild(loaded);
-
-        buildsFailureRunStatCache().invoke(key, (entry, arguments) -> {
-            SuiteInBranch suiteInBranch = entry.getKey();
-
-            Build build = (Build)arguments[0];
-
-            RunStat val = entry.getValue();
-
-            if (val == null)
-                val = new RunStat(suiteInBranch.getSuiteId());
-
-            val.addBuildRun(build);
-
-            entry.setValue(val);
-
-            return null;
-        }, loaded);
-    }
-
-    @NotNull private SuiteInBranch keyForBuild(Build loaded) {
-        return new SuiteInBranch(loaded.suiteId(), normalizeBranch(loaded.branchName));
-    }
-
-    @Deprecated
-    private Build realLoadBuild(String href1) {
-        try {
-            return teamcity.getBuild(href1);
-        }
-        catch (Exception e) {
-            if (Throwables.getRootCause(e) instanceof FileNotFoundException) {
-                System.err.println("Exception " + e.getClass().getSimpleName() + ": " + e.getMessage());
-                return Build.createFakeStub();// save null result, because persistence may refer to some non-existent build on TC
-            }
-            else
-                throw e;
-        }
+        return Math.min((int) secondsSinceTrigger, defaultSecs);
     }
 
     @NotNull private String ignCacheNme(String cache) {
@@ -337,79 +162,6 @@ public class IgnitePersistentTeamcity implements IAnalyticsEnabledTeamcity, ITea
         return teamcity.getBuild(buildId);
     }
 
-    @Deprecated
-    private void registerCriticalBuildProblemInStat(BuildRef build, ProblemOccurrences problems) {
-        boolean criticalFail = problems.getProblemsNonNull().stream().anyMatch(occurrence ->
-            occurrence.isExecutionTimeout()
-                || occurrence.isJvmCrash()
-                || occurrence.isFailureOnMetric()
-                || occurrence.isCompilationError());
-
-        String suiteId = build.suiteId();
-        Integer buildId = build.getId();
-
-        if (!criticalFail)
-            return;
-
-        if (buildId != null && !Strings.isNullOrEmpty(suiteId)) {
-            SuiteInBranch key = new SuiteInBranch(suiteId, normalizeBranch(build.branchName));
-
-            buildsFailureRunStatCache().invoke(key, (entry, arguments) -> {
-                SuiteInBranch suiteInBranch = entry.getKey();
-
-                Integer bId = (Integer)arguments[0];
-
-                RunStat val = entry.getValue();
-
-                if (val == null)
-                    val = new RunStat(suiteInBranch.getSuiteId());
-
-                val.setBuildCriticalError(bId);
-
-                entry.setValue(val);
-
-                return null;
-            }, buildId);
-        }
-    }
-
-    /** {@inheritDoc} */
-    @Override public Function<TestInBranch, RunStat> getTestRunStatProvider() {
-        return key -> key == null ? null : getRunStatForTest(key);
-    }
-
-    @SuppressWarnings("WeakerAccess")
-    @AutoProfiling
-    @GuavaCached(maximumSize = 200, expireAfterAccessSecs = 30, softValues = true)
-    protected RunStat getRunStatForTest(TestInBranch key) {
-        return testRunStatCache().get(key);
-    }
-
-    @Deprecated
-    private IgniteCache<TestInBranch, RunStat> testRunStatCache() {
-        return getOrCreateCacheV2(ignCacheNme(TESTS_RUN_STAT));
-    }
-
-    /** {@inheritDoc} */
-    @Override public Function<SuiteInBranch, RunStat> getBuildFailureRunStatProvider() {
-        return key -> key == null ? null : getRunStatForSuite(key);
-    }
-
-
-    @SuppressWarnings("WeakerAccess")
-    @AutoProfiling
-    @GuavaCached(maximumSize = 500, expireAfterAccessSecs = 90, softValues = true)
-    protected RunStat getRunStatForSuite(SuiteInBranch key) {
-        return buildsFailureRunStatCache().get(key);
-    }
-
-    /**
-     * @return cache from suite name to its failure statistics
-     */
-    private IgniteCache<SuiteInBranch, RunStat> buildsFailureRunStatCache() {
-        return getOrCreateCacheV2(ignCacheNme(BUILDS_FAILURE_RUN_STAT));
-    }
-
     private IgniteCache<Integer, LogCheckResult> logCheckResultCache() {
         return getOrCreateCacheV2(ignCacheNme(LOG_CHECK_RESULT));
     }
@@ -498,16 +250,6 @@ public class IgnitePersistentTeamcity implements IAnalyticsEnabledTeamcity, ITea
     }
 
     /** {@inheritDoc} */
-    @Deprecated
-    @Override public ProblemOccurrences getProblemsAndRegisterCritical(BuildRef build) {
-        ProblemOccurrences problems = teamcity.getProblems(build.getId());
-
-        registerCriticalBuildProblemInStat(build, problems);
-
-        return problems;
-    }
-
-    /** {@inheritDoc} */
     @Override public List<Project> getProjects() {
         return teamcity.getProjects();
     }
diff --git a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/IgniteTeamcityConnection.java b/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/IgniteTeamcityConnection.java
index 6a75fc8..ca621d8 100644
--- a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/IgniteTeamcityConnection.java
+++ b/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/IgniteTeamcityConnection.java
@@ -272,13 +272,6 @@ public class IgniteTeamcityConnection implements ITeamcity {
     }
 
     /** {@inheritDoc} */
-    @Deprecated
-    @AutoProfiling
-    @Override public ProblemOccurrences getProblemsAndRegisterCritical(BuildRef build) {
-        return getProblems(build.getId());
-    }
-
-    /** {@inheritDoc} */
     @AutoProfiling
     @Override public ProblemOccurrences getProblems(int buildId) {
         return getJaxbUsingHref("app/rest/latest/problemOccurrences" +
@@ -368,49 +361,6 @@ public class IgniteTeamcityConnection implements ITeamcity {
         return XmlUtil.load(rootElem, reader);
     }
 
-    /**
-     * @param buildTypeId Build type id.
-     * @param branchName Branch name.
-     * @param dfltFilter Default filter.
-     * @param state State.
-     * @param sinceDate Since date.
-     * @param untilDate Until date.
-     * @param sinceBuildId Since build id. Value is ignored if dates filter is present.
-     */
-    @Deprecated
-    private List<BuildRef> getBuildHistory(@Nullable String buildTypeId,
-        @Nullable String branchName,
-        boolean dfltFilter,
-        @Nullable String state,
-        @Nullable Date sinceDate,
-        @Nullable Date untilDate,
-        @Nullable Integer sinceBuildId)  {
-        String btFilter = isNullOrEmpty(buildTypeId) ? "" : ",buildType:" + buildTypeId;
-        String stateFilter = isNullOrEmpty(state) ? "" : (",state:" + state);
-        String branchFilter = isNullOrEmpty(branchName) ? "" :",branch:" + branchName;
-        String sinceDateFilter = sinceDate == null ? "" : ",sinceDate:" + getDateYyyyMmDdTHhMmSsZ(sinceDate);
-        String untilDateFilter = untilDate == null ? "" : ",untilDate:" + getDateYyyyMmDdTHhMmSsZ(untilDate);
-        String buildNoFilter = sinceBuildId != null && sinceDateFilter.isEmpty() && untilDateFilter.isEmpty()
-            ? ",sinceBuild:(id:" + sinceBuildId + ")" : "";
-
-        return sendGetXmlParseJaxb(host + "app/rest/latest/builds"
-            + "?locator="
-            + "defaultFilter:" + dfltFilter
-            + btFilter
-            + stateFilter
-            + branchFilter
-            + buildNoFilter
-            + ",count:" + DEFAULT_BUILDS_COUNT
-            + sinceDateFilter
-            + untilDateFilter, Builds.class).getBuildsNonNull();
-    }
-
-    public String getDateYyyyMmDdTHhMmSsZ(Date date){
-        return new SimpleDateFormat("yyyyMMdd'T'HHmmssZ")
-            .format(date)
-            .replace("+", "%2B");
-    }
-
     /** {@inheritDoc} */
     @AutoProfiling
     @Override public BuildTypeFull getBuildType(String buildTypeId) {
@@ -418,12 +368,6 @@ public class IgniteTeamcityConnection implements ITeamcity {
             buildTypeId, BuildTypeFull.class);
     }
 
-    @Override
-    @AutoProfiling
-    public Build getBuild(String href) {
-        return getJaxbUsingHref(href, Build.class);
-    }
-
     /** {@inheritDoc} */
     @AutoProfiling
     @Override public Build getBuild(int buildId) {
@@ -439,40 +383,6 @@ public class IgniteTeamcityConnection implements ITeamcity {
     }
 
     /** {@inheritDoc} */
-    @Override
-    @AutoProfiling public CompletableFuture<List<BuildRef>> getQueuedBuilds(@Nullable String branch) {
-        return supplyAsync(() -> getBuildsInState(null, branch, BuildRef.STATE_QUEUED), executor);
-    }
-
-    @Deprecated
-    private List<BuildRef> getBuildsInState(
-            @Nullable final String projectId,
-            @Nullable final String branch,
-            @Nonnull final String state,
-            @Nullable final Integer sinceBuildId) {
-        List<BuildRef> finished = getBuildHistory(projectId,
-            UrlUtil.escape(branch),
-            false,
-            state,
-            null,
-            null,
-            sinceBuildId);
-        return finished.stream().filter(BuildRef::isNotCancelled).collect(Collectors.toList());
-    }
-
-
-    @SuppressWarnings("WeakerAccess")
-    @AutoProfiling
-    @Deprecated
-    protected List<BuildRef> getBuildsInState(
-            @Nullable final String projectId,
-            @Nullable final String branch,
-            @Nonnull final String state) {
-
-        return getBuildsInState(projectId, branch, state, null);
-    }
-
-    /** {@inheritDoc} */
     @Override public String serverId() {
         return tcName;
     }
diff --git a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/analysis/IMultTestOccurrence.java b/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/analysis/IMultTestOccurrence.java
index ec7cce2..4ae72ac 100644
--- a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/analysis/IMultTestOccurrence.java
+++ b/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/analysis/IMultTestOccurrence.java
@@ -23,9 +23,9 @@ import org.apache.ignite.ci.tcmodel.result.tests.TestOccurrenceFull;
  * Multiple test occurrence. For single build context - max 1 failure
  */
 public interface IMultTestOccurrence {
-    String getName();
+    public String getName();
 
-    boolean isInvestigated();
+    public boolean isInvestigated();
 
     public int failuresCount();
 
diff --git a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/analysis/RunStat.java b/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/analysis/RunStat.java
index ef7ad26..f4449dc 100644
--- a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/analysis/RunStat.java
+++ b/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/analysis/RunStat.java
@@ -186,16 +186,9 @@ public class RunStat implements IRunHistory {
         return (long)(1.0 * totalDurationMs / runsWithDuration);
     }
 
+    @Deprecated
     public void addBuildRun(Build build) {
         runs++;
-//        build.lastChanges
-
-        //todo ? add duration from statistics
-        /*
-        if (build.duration != null) {
-            totalDurationMs += testOccurrence.duration;
-            runsWithDuration++;
-        } */
 
         if (!build.isSuccess())
             failures++;
diff --git a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/db/DbMigrations.java b/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/db/DbMigrations.java
index 01e3420..42d91fb 100644
--- a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/db/DbMigrations.java
+++ b/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/db/DbMigrations.java
@@ -62,8 +62,6 @@ public class DbMigrations {
     private static final Logger logger = LoggerFactory.getLogger(DbMigrations.class);
 
     public static final String DONE_MIGRATIONS = "doneMigrations";
-    @Deprecated
-    private static final String BUILD_RESULTS = "buildResults";
 
     private static final String BUILD_STATISTICS = "buildStatistics";
 
@@ -130,6 +128,13 @@ public class DbMigrations {
 
         String CALCULATED_STATISTIC = "calculatedStatistic";
 
+        String BUILDS = "builds";
+
+        String BUILD_RESULTS = "buildResults";
+
+        String BUILDS_FAILURE_RUN_STAT = "buildsFailureRunStat";
+
+        String TESTS_RUN_STAT = "testsRunStat";
     }
 
     private final Ignite ignite;
@@ -141,11 +146,7 @@ public class DbMigrations {
         this.serverId = srvId;
     }
 
-    public void dataMigration(
-        Cache<String, Build> buildCache, Consumer<Build> saveBuildToStat,
-        IgniteCache<SuiteInBranch, RunStat> suiteHistCache,
-        IgniteCache<TestInBranch, RunStat> testHistCache,
-        Cache<CompactContributionKey, List<CompactVisaRequest>> visasCache) {
+    public void dataMigration(Cache<CompactContributionKey, List<CompactVisaRequest>> visasCache) {
 
         doneMigrations = doneMigrationsCache();
 
@@ -202,64 +203,6 @@ public class DbMigrations {
 
         applyMigration("InitialFillLatestRunsV3", () -> {});
 
-        String newBuildsCache = BUILD_RESULTS + "-to-" + IgnitePersistentTeamcity.BUILDS + "V2";
-
-        applyMigration("RemoveStatisticsFromBuildCache", ()->{
-            if(doneMigrations.containsKey(newBuildsCache))
-                return;
-
-            final IgniteCache<Object, Object> cache = ignite.getOrCreateCache(ignCacheNme(BUILD_RESULTS));
-            
-            for (Cache.Entry<Object, Object> next : cache) {
-                if(next.getValue() instanceof Statistics) {
-                    System.err.println("Removed incorrect entity: Statistics from build cache");
-                    
-                    cache.remove(next.getKey());
-                }
-            }
-        });
-
-        applyMigration(newBuildsCache, () -> {
-            IgniteCache<String, Build> oldBuilds = ignite.cache(ignCacheNme(BUILD_RESULTS));
-
-            if (oldBuilds == null)
-                return;
-
-            int size = oldBuilds.size();
-            if (size > 0) {
-                int i = 0;
-                for (Cache.Entry<String, Build> entry : oldBuilds) {
-                    System.out.println("Migrating build entry " + i + " from " + size + ": " + entry.getKey());
-
-                    Build val = entry.getValue();
-
-                    if (buildCache.putIfAbsent(entry.getKey(), val))
-                        saveBuildToStat.accept(val);
-
-                    i++;
-                }
-
-                oldBuilds.clear();
-
-                oldBuilds.destroy();
-            }
-        });
-
-        applyMigration("RemoveBuildsWithoutProjectId", () -> {
-            final IgniteCache<Object, Build> cache = ignite.getOrCreateCache(ignCacheNme(BUILD_RESULTS));
-
-            for (Cache.Entry<Object, Build> next : cache) {
-                Build results = next.getValue();
-                //non fake builds but without required data
-                if (results.getId() != null)
-                    if (results.getBuildType() == null || results.getBuildType().getProjectId() == null) {
-                        System.err.println("Removed incorrect entity: Build without filled parameters: " + next);
-
-                        cache.remove(next.getKey());
-                    }
-            }
-        });
-
         applyMigration("Remove-" + RUN_STAT_CACHE, ()->{
             IgniteCache<String, Build> oldBuilds = ignite.getOrCreateCache(ignCacheNme(RUN_STAT_CACHE));
 
@@ -268,47 +211,6 @@ public class DbMigrations {
             oldBuilds.destroy();
         });
 
-        applyMigration("ReplaceKeyTypeOf-" + suiteHistCache.getName(), () -> {
-            int i = 0;
-            int size = suiteHistCache.size();
-
-            for (Cache.Entry<?, RunStat> next : suiteHistCache) {
-                Object key = next.getKey();
-
-                if (key instanceof String) {
-                    SuiteInBranch suiteKey = new SuiteInBranch((String)key, ITeamcity.DEFAULT);
-
-                    suiteHistCache.put(suiteKey, next.getValue());
-                    ((Cache)suiteHistCache).remove(key);
-
-                    System.out.println("Migrating entry " + i + " from " + size + ": " + suiteKey);
-                }
-
-                i++;
-            }
-        });
-
-
-        applyMigration("ReplaceKeyTypeOf-" + testHistCache.getName(), () -> {
-            int i = 0;
-            int size = testHistCache.size();
-
-            for (Cache.Entry<?, RunStat> next : testHistCache) {
-                Object key = next.getKey();
-
-                if (key instanceof String) {
-                    TestInBranch testKey = new TestInBranch((String)key, ITeamcity.DEFAULT);
-
-                    testHistCache.put(testKey, next.getValue());
-                    ((Cache)testHistCache).remove(key);
-
-                    System.out.println("Migrating entry " + i + " from " + size + ": " + testKey);
-                }
-
-                i++;
-            }
-        });
-
         applyRemoveCache(GetTrackedBranchTestResults.ALL_TEST_FAILURES_SUMMARY);
 
         applyRemoveCache(GetTrackedBranchTestResults.TEST_FAILURES_SUMMARY_CACHE_NAME);
@@ -402,6 +304,10 @@ public class DbMigrations {
         applyDestroyCacheMigration(Old.BUILD_START_TIME_CACHE_NAME2);
 
         applyDestroyIgnCacheMigration(Old.CALCULATED_STATISTIC);
+        applyDestroyIgnCacheMigration(Old.BUILDS);
+        applyDestroyIgnCacheMigration(Old.BUILD_RESULTS);
+        applyDestroyIgnCacheMigration(Old.BUILDS_FAILURE_RUN_STAT);
+        applyDestroyIgnCacheMigration(Old.TESTS_RUN_STAT);
     }
 
     private void applyDestroyIgnCacheMigration(String cacheName) {
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 b20363b..0b54c5b 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,36 +17,31 @@
 
 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.ExecutionException;
-import java.util.concurrent.TimeUnit;
-import java.util.stream.Collectors;
-import java.util.stream.Stream;
-import javax.inject.Inject;
 import jersey.repackaged.com.google.common.base.Throwables;
 import org.apache.ignite.ci.HelperConfig;
-import org.apache.ignite.ci.teamcity.ignited.ITeamcityIgnited;
-import org.apache.ignite.ci.teamcity.ignited.ITeamcityIgnitedProvider;
-import org.apache.ignite.ci.teamcity.restcached.ITcServerProvider;
-import org.apache.ignite.ci.ITeamcity;
 import org.apache.ignite.ci.conf.BranchTracked;
 import org.apache.ignite.ci.conf.ChainAtServerTracked;
 import org.apache.ignite.ci.di.AutoProfiling;
 import org.apache.ignite.ci.di.MonitoredTask;
 import org.apache.ignite.ci.tcmodel.agent.Agent;
-import org.apache.ignite.ci.tcmodel.hist.BuildRef;
 import org.apache.ignite.ci.tcmodel.result.Build;
+import org.apache.ignite.ci.tcmodel.result.Triggered;
 import org.apache.ignite.ci.tcmodel.user.User;
+import org.apache.ignite.ci.teamcity.ignited.BuildRefCompacted;
+import org.apache.ignite.ci.teamcity.ignited.IStringCompactor;
+import org.apache.ignite.ci.teamcity.ignited.ITeamcityIgnited;
+import org.apache.ignite.ci.teamcity.ignited.ITeamcityIgnitedProvider;
+import org.apache.ignite.ci.teamcity.ignited.fatbuild.FatBuildCompacted;
 import org.apache.ignite.ci.user.ICredentialsProv;
-import org.apache.ignite.ci.web.rest.parms.FullQueryParams;
 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;
+
 /**
  * Trigger build if half of agents are available and there is no self-triggered builds in build queue.
  */
@@ -68,7 +63,7 @@ public class CheckQueueJob implements Runnable {
     @Inject private ITeamcityIgnitedProvider tcIgnitedProv;
 
     /** */
-    @Inject private ITcServerProvider tcPureProv;
+    @Inject private IStringCompactor compactor;
 
     /** */
     private final Map<ChainAtServerTracked, Long> startTimes = new HashMap<>();
@@ -131,17 +126,11 @@ public class CheckQueueJob implements Runnable {
             try {
                 checkQueue(srvId, chains);
             }
-            catch (RuntimeException | ExecutionException e) {
+            catch (Exception e) {
                 logger.error("Unable to check queue: " + e.getMessage(), e);
 
                 throw Throwables.propagate(e);
             }
-            catch (InterruptedException e) {
-                logger.error("Unable to check queue: " + e.getMessage(), e);
-
-                Thread.currentThread().interrupt();
-                throw Throwables.propagate(e);
-            }
         }
 
         return "Checked: " + srvsChecked + "servers, " + chainsChecked + " chains, "
@@ -155,10 +144,11 @@ public class CheckQueueJob implements Runnable {
     @AutoProfiling
     @MonitoredTask(name = "Check Server Queue", nameExtArgIndex = 0)
     protected String checkQueue(String srvId,
-        List<ChainAtServerTracked> chains) throws ExecutionException, InterruptedException {
-        ITeamcity teamcity = tcPureProv.server(srvId, creds);
+        List<ChainAtServerTracked> chains) {
+
+        ITeamcityIgnited tcIgn = tcIgnitedProv.server(srvId, creds);
 
-        List<Agent> agents = teamcity.agents(true, true);
+        List<Agent> agents = tcIgn.agents(true, true);
 
         int total = agents.size();
         int running = 0;
@@ -177,38 +167,51 @@ public class CheckQueueJob implements Runnable {
         if (free < CHECK_QUEUE_MIN_FREE_AGENTS_PERCENT)
             return "Min agent percent of free agents not met:" + agentStatus;
 
-        logger.info("There are more than half free agents (total={}, free={}).", total, total - running);
+        logger.info("There are more than {}% free agents (total={}, free={}).", CHECK_QUEUE_MIN_FREE_AGENTS_PERCENT,
+            total, total - running);
 
-        List<BuildRef> builds = teamcity.getQueuedBuilds(null).get();
-
-        String selfLogin = creds.getUser(teamcity.serverId());
+        String selfLogin = creds.getUser(srvId);
 
         StringBuilder res = new StringBuilder();
 
         for (ChainAtServerTracked chain : chains) {
-            if(!Objects.equals(chain.serverId, teamcity.serverId()))
+            if(!Objects.equals(chain.serverId, srvId))
                 continue;
 
             boolean trigger = true;
-            for (BuildRef ref : builds) {
-                Build build = teamcity.getBuild(ref.href);
+
+            List<BuildRefCompacted> buildsForBr = tcIgn.getQueuedBuildsCompacted(chain.branchForRest);
+
+            for (BuildRefCompacted refComp : buildsForBr) {
+                Integer buildId = refComp.getId();
+                if (buildId == null)
+                    continue; // should not occur;
+
+                final FatBuildCompacted fatBuild = tcIgn.getFatBuild(buildId);
+                final Build build = fatBuild.toBuild(compactor);
+                final Triggered triggered = build.getTriggered();
+
+                if (triggered == null) {
+                    logger.info("Unable to get triggering info for queued build {} (type={}).", buildId, build.buildTypeId);
+
+                    continue;
+                }
 
                 User user = build.getTriggered().getUser();
 
                 if (user == null) {
-                    logger.info("Unable to get username for queued build {} (type={}).", ref.getId(), ref.buildTypeId);
+                    logger.info("Unable to get username for queued build {} (type={}).", buildId, build.buildTypeId);
 
                     continue;
                 }
 
                 String login = user.username;
 
-                if (selfLogin.equalsIgnoreCase(login)
-                        && Objects.equals(ref.branchName, chain.branchForRest)) {
+                if (selfLogin.equalsIgnoreCase(login)) {
                     final String msg
                             = MessageFormat.format("Queued build {0} was early triggered " +
                             "(user {1}, branch {2}, suite {3})." +
-                            " Will not startIgnite build.", ref.getId(), login, ref.branchName, ref.buildTypeId);
+                            " Will not start Ignite build.", buildId, login, chain.branchForRest, build.buildTypeId);
 
                     logger.info(msg);
 
@@ -248,9 +251,7 @@ public class CheckQueueJob implements Runnable {
 
             startTimes.put(chain, curr);
 
-            ITeamcityIgnited srv = tcIgnitedProv.server(srvId, creds);
-
-            srv.triggerBuild(chain.suiteId, chain.branchForRest, true, false);
+            tcIgn.triggerBuild(chain.suiteId, chain.branchForRest, true, false);
 
             res.append(chain.branchForRest).append(" ").append(chain.suiteId).append(" triggered; ");
         }
diff --git a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/runners/RemoteClientTmpHelper.java b/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/runners/RemoteClientTmpHelper.java
index e938158..4b244b4 100644
--- a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/runners/RemoteClientTmpHelper.java
+++ b/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/runners/RemoteClientTmpHelper.java
@@ -30,7 +30,6 @@ import org.apache.ignite.Ignite;
 import org.apache.ignite.IgniteCache;
 import org.apache.ignite.Ignition;
 import org.apache.ignite.ci.ITeamcity;
-import org.apache.ignite.ci.IgnitePersistentTeamcity;
 import org.apache.ignite.ci.tcmodel.hist.BuildRef;
 import org.apache.ignite.ci.tcmodel.result.Build;
 import org.apache.ignite.ci.teamcity.ignited.BuildRefCompacted;
@@ -74,8 +73,6 @@ public class RemoteClientTmpHelper {
         IgniteCache<Long, BuildRefCompacted> cacheRef = ignite.cache(BuildRefDao.TEAMCITY_BUILD_CACHE_NAME);
         IgniteCache<Long, FatBuildCompacted> cacheFat = ignite.cache(FatBuildDao.TEAMCITY_FAT_BUILD_CACHE_NAME);
 
-        String cacheOldBuild = IgnitePersistentTeamcity.ignCacheNme(IgnitePersistentTeamcity.BUILDS, apacheSrvName);
-        IgniteCache<String, Build> buildCache = ignite.cache(cacheOldBuild);
         cacheRef.forEach(
             entry -> {
                 BuildRefCompacted buildRef = entry.getValue();
@@ -88,15 +85,11 @@ public class RemoteClientTmpHelper {
                     if (fat != null && fat.getId() != buildId) {
                         dumpBuildRef(buildId, buildRef);
                         dumpFatBuild(cacheFat, apache, buildId);
-                        String href = ITeamcity.buildHref(buildId);
-                        Build oldBuild = buildCache.get(href);
-                        if (oldBuild != null)
-                            dumpOldBuild(buildId, href, oldBuild);
 
                         inconsistent.incrementAndGet();
 
                         if(!fat.isOutdatedEntityVersion())
-                            Preconditions.checkState(false, oldBuild);
+                            Preconditions.checkState(false);
                     }
                 }
             }
diff --git a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/tcbot/builds/CompareBuildsService.java b/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/tcbot/builds/CompareBuildsService.java
index f513809..7d6b075 100644
--- a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/tcbot/builds/CompareBuildsService.java
+++ b/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/tcbot/builds/CompareBuildsService.java
@@ -17,29 +17,24 @@
 
 package org.apache.ignite.ci.tcbot.builds;
 
-import java.util.ArrayList;
-import java.util.List;
-import javax.inject.Inject;
-import org.apache.ignite.ci.IAnalyticsEnabledTeamcity;
-import org.apache.ignite.ci.ITeamcity;
 import org.apache.ignite.ci.analysis.MultBuildRunCtx;
 import org.apache.ignite.ci.tcbot.chain.BuildChainProcessor;
-import org.apache.ignite.ci.tcmodel.hist.BuildRef;
-import org.apache.ignite.ci.tcmodel.result.Build;
 import org.apache.ignite.ci.teamcity.ignited.IStringCompactor;
 import org.apache.ignite.ci.teamcity.ignited.ITeamcityIgnited;
 import org.apache.ignite.ci.teamcity.ignited.ITeamcityIgnitedProvider;
 import org.apache.ignite.ci.teamcity.ignited.fatbuild.FatBuildCompacted;
-import org.apache.ignite.ci.teamcity.restcached.ITcServerProvider;
 import org.apache.ignite.ci.user.ICredentialsProv;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
+import javax.inject.Inject;
+import java.util.ArrayList;
+import java.util.List;
+
 public class CompareBuildsService {
     /** */
     private static final Logger logger = LoggerFactory.getLogger(CompareBuildsService.class);
 
-    @Inject ITcServerProvider helper;
     @Inject BuildChainProcessor bcp;
     @Inject ITeamcityIgnitedProvider tcIgnitedProv;
     @Inject IStringCompactor compactor;
@@ -51,40 +46,31 @@ public class CompareBuildsService {
      * @return List of build tests.
      */
     public List<String> tests0(String srvId, Integer buildId, ICredentialsProv prov ) {
-        IAnalyticsEnabledTeamcity teamcity = helper.server(srvId, prov);
-
-        String hrefById = ITeamcity.buildHref(buildId);
-        BuildRef buildRef = new BuildRef();
-
-        buildRef.setId(buildId);
-        buildRef.href = hrefById;
-
         ITeamcityIgnited srv = tcIgnitedProv.server(srvId, prov);
 
-        return tests0(teamcity, srv, buildRef, bcp);
+        return tests0(srv, buildId, bcp);
     }
 
     /** */
-    private List<String> tests0(ITeamcity tc, ITeamcityIgnited tcIgnited,
-        BuildRef ref, BuildChainProcessor bcp) {
+    private List<String> tests0(ITeamcityIgnited tcIgnited,
+                                Integer buildId, BuildChainProcessor bcp) {
         List<String> tests = new ArrayList<>();
 
-        Build build = tc.getBuild(ref.href);
+        FatBuildCompacted fatBuild = tcIgnited.getFatBuild(buildId);
 
-        if (build.isComposite()) {
-            List<BuildRef> deps = build.getSnapshotDependenciesNonNull();
+        if (fatBuild.isComposite()) {
+            int[] deps = fatBuild.snapshotDependencies();
 
-            logger.info("Build {} is composite ({}).", build.getId(), deps.size());
+            logger.info("Build {} is composite ({}).", fatBuild.getId(), deps.length);
 
-            for (BuildRef ref0 : deps)
-                tests.addAll(tests0(tc, tcIgnited, ref0, bcp));
+            for (int ref0 : deps)
+                tests.addAll(tests0(tcIgnited, ref0, bcp));
         }
         else {
-            logger.info("Loading tests for build {}.", build.getId());
+            logger.info("Loading tests for build {}.", fatBuild.getId());
 
-            MultBuildRunCtx buildCtx = new MultBuildRunCtx(build, compactor);
+            MultBuildRunCtx buildCtx = new MultBuildRunCtx(fatBuild.toBuildRef(compactor), compactor);
 
-            final FatBuildCompacted fatBuild = tcIgnited.getFatBuild(build.getId());
             buildCtx.addBuild(bcp.loadChanges(fatBuild, tcIgnited));
 
             for (String testName : buildCtx.tests())
diff --git a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/tcbot/chain/BuildChainProcessor.java b/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/tcbot/chain/BuildChainProcessor.java
index 4c91d05..0375527 100644
--- a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/tcbot/chain/BuildChainProcessor.java
+++ b/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/tcbot/chain/BuildChainProcessor.java
@@ -38,7 +38,6 @@ import java.util.stream.Stream;
 import javax.annotation.Nonnull;
 import javax.inject.Inject;
 import org.apache.ignite.ci.IAnalyticsEnabledTeamcity;
-import org.apache.ignite.ci.ITeamcity;
 import org.apache.ignite.ci.analysis.FullChainRunCtx;
 import org.apache.ignite.ci.analysis.MultBuildRunCtx;
 import org.apache.ignite.ci.analysis.SingleBuildRunCtx;
@@ -199,13 +198,8 @@ public class BuildChainProcessor {
         Function<MultBuildRunCtx, Float> function = ctx -> {
             SuiteInBranch key = new SuiteInBranch(ctx.suiteId(), RunHistSync.normalizeBranch(failRateBranch));
 
-            //todo place RunStat into suite context to compare
-            Function<SuiteInBranch, ? extends IRunHistory> provider   =
-                ITeamcity.NEW_RUN_STAT
-                    ? tcIgn::getSuiteRunHist
-                    : teamcity.getBuildFailureRunStatProvider();
-
-            IRunHistory runStat = provider.apply(key);
+            //todo cache RunStat instance into suite context to compare
+            IRunHistory runStat = tcIgn.getSuiteRunHist(key);
 
             if (runStat == null)
                 return 0f;
diff --git a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/tcbot/chain/PrChainsProcessor.java b/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/tcbot/chain/PrChainsProcessor.java
index 8c280e9..595891c 100644
--- a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/tcbot/chain/PrChainsProcessor.java
+++ b/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/tcbot/chain/PrChainsProcessor.java
@@ -158,7 +158,7 @@ public class PrChainsProcessor {
                 runningUpdates.addAndGet(cnt0);
 
             //fail rate reference is always default (master)
-            chainStatus.initFromContext(tcIgnited, teamcity, ctx, teamcity, baseBranch);
+            chainStatus.initFromContext(tcIgnited, teamcity, ctx, baseBranch);
 
             chainStatus.initJiraAndGitInfo(tcIgnited, jiraIntegration, gitHubConnIgnited);
         }
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 8c187ec..137d802 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
@@ -16,12 +16,11 @@
  */
 package org.apache.ignite.ci.tcbot.chain;
 
-import com.google.common.base.Preconditions;
 import java.util.Comparator;
 import java.util.List;
 import java.util.concurrent.atomic.AtomicInteger;
 import javax.inject.Inject;
-import org.apache.ignite.ci.HelperConfig;
+
 import org.apache.ignite.ci.IAnalyticsEnabledTeamcity;
 import org.apache.ignite.ci.analysis.FullChainRunCtx;
 import org.apache.ignite.ci.analysis.mode.LatestRebuildMode;
@@ -119,7 +118,7 @@ public class TrackedBranchChainsProcessor {
                 if (cnt > 0)
                     runningUpdates.addAndGet(cnt);
 
-                chainStatus.initFromContext(tcIgnited, teamcity, ctx, teamcity, baseBranchTc);
+                chainStatus.initFromContext(tcIgnited, teamcity, ctx, baseBranchTc);
 
                 return chainStatus;
             })
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 be26ec3..c5b8233 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
@@ -31,12 +31,10 @@ import java.util.concurrent.ScheduledExecutorService;
 import java.util.concurrent.TimeUnit;
 import java.util.concurrent.atomic.AtomicBoolean;
 import java.util.concurrent.atomic.AtomicInteger;
-import java.util.function.Function;
 import javax.inject.Inject;
 import javax.inject.Provider;
 import org.apache.ignite.ci.HelperConfig;
 import org.apache.ignite.ci.IAnalyticsEnabledTeamcity;
-import org.apache.ignite.ci.ITeamcity;
 import org.apache.ignite.ci.analysis.SuiteInBranch;
 import org.apache.ignite.ci.analysis.TestInBranch;
 import org.apache.ignite.ci.di.AutoProfiling;
@@ -247,7 +245,7 @@ public class IssueDetector {
                 final String trackedBranch = res.getTrackedBranch();
 
                 for (TestFailure testFailure : suiteCurrentStatus.testFailures) {
-                    if(registerTestFailIssues(tcIgnited, teamcity, next.serverId, normalizeBranch, testFailure, trackedBranch))
+                    if(registerTestFailIssues(tcIgnited, next.serverId, normalizeBranch, testFailure, trackedBranch))
                         newIssues++;
                 }
 
@@ -269,12 +267,7 @@ public class IssueDetector {
 
         SuiteInBranch key = new SuiteInBranch(suiteId, normalizeBranch);
 
-        Function<SuiteInBranch, ? extends IRunHistory> provider   =
-            ITeamcity.NEW_RUN_STAT
-                ? tcIgnited::getSuiteRunHist
-                : teamcity.getBuildFailureRunStatProvider();
-
-        IRunHistory runStat = provider.apply(key);
+        IRunHistory runStat = tcIgnited.getSuiteRunHist(key);
 
         if (runStat == null)
             return false;
@@ -319,21 +312,15 @@ public class IssueDetector {
     }
 
     private boolean registerTestFailIssues(ITeamcityIgnited tcIgnited,
-                                           IAnalyticsEnabledTeamcity teamcity,
-                                           String srvId,
-                                           String normalizeBranch,
-                                           TestFailure testFailure,
-                                           String trackedBranch) {
+        String srvId,
+        String normalizeBranch,
+        TestFailure testFailure,
+        String trackedBranch) {
 
         String name = testFailure.name;
         TestInBranch testInBranch = new TestInBranch(name, normalizeBranch);
 
-        Function<TestInBranch, ? extends IRunHistory> function =
-            ITeamcity.NEW_RUN_STAT
-                ? tcIgnited::getTestRunHist
-                : teamcity.getTestRunStatProvider();
-
-        IRunHistory runStat = function.apply(testInBranch);
+        IRunHistory runStat = tcIgnited.getTestRunHist(testInBranch);
 
         if (runStat == null)
             return false;
diff --git a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/tcmodel/result/Build.java b/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/tcmodel/result/Build.java
index 12a1cae..59f9eae 100644
--- a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/tcmodel/result/Build.java
+++ b/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/tcmodel/result/Build.java
@@ -44,9 +44,7 @@ import static org.apache.ignite.ci.util.ExceptionUtil.propagateException;
  */
 @XmlRootElement(name = "build")
 @XmlAccessorType(XmlAccessType.FIELD)
-public class Build extends BuildRef implements IVersionedEntity {
-    public static final int LATEST_VERSION = 2;
-
+public class Build extends BuildRef {
     /** Format local. */
     @XmlTransient private static ThreadLocal<SimpleDateFormat> fmtLoc
         = ThreadLocal.withInitial(() -> new SimpleDateFormat("yyyyMMdd'T'HHmmssZ"));
@@ -67,20 +65,12 @@ public class Build extends BuildRef implements IVersionedEntity {
 
     @XmlElement(name = "statistics") public StatisticsRef statisticsRef;
 
-    @XmlElement(name = "relatedIssues") public RelatedIssuesRef relatedIssuesRef;
-
-    /** Changes not included into build.*/
-    @XmlElement(name = "lastChanges") public ChangesList lastChanges;
-
     /** Changes included into build.*/
     @XmlElement(name = "changes") public ChangesListRef changesRef;
 
     /** Information about build triggering. */
     @XmlElement(name = "triggered") private Triggered triggered;
 
-    @XmlTransient
-    @SuppressWarnings("FieldCanBeLocal") public Integer _version = LATEST_VERSION;
-
     @NotNull public static Build createFakeStub() {
         return new Build();
     }
@@ -156,14 +146,6 @@ public class Build extends BuildRef implements IVersionedEntity {
         return buildType;
     }
 
-    @Override public int version() {
-        return _version == null ? 0 : _version;
-    }
-
-    @Override public int latestVersion() {
-        return LATEST_VERSION;
-    }
-
     /**
      * @return Information about build triggering.
      */
diff --git a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/teamcity/ignited/IStringCompactor.java b/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/teamcity/ignited/IStringCompactor.java
index dfdc3b2..57e3c15 100644
--- a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/teamcity/ignited/IStringCompactor.java
+++ b/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/teamcity/ignited/IStringCompactor.java
@@ -21,12 +21,12 @@ package org.apache.ignite.ci.teamcity.ignited;
  */
 public interface IStringCompactor {
     /**
-     * @param val Value.
+     * @param val Value to be identified as integer.
      */
     public int getStringId(String val);
 
     /**
-     * @param id Id.
+     * @param id Id of string from {@link #getStringId(String)}. Negative value implies <code>null</code>.
      */
     public String getStringFromId(int id);
 
diff --git a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/teamcity/ignited/ITeamcityIgnited.java b/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/teamcity/ignited/ITeamcityIgnited.java
index 28b6ca4..df2099a 100644
--- a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/teamcity/ignited/ITeamcityIgnited.java
+++ b/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/teamcity/ignited/ITeamcityIgnited.java
@@ -23,6 +23,7 @@ import java.util.Set;
 import javax.annotation.Nullable;
 import org.apache.ignite.ci.analysis.SuiteInBranch;
 import org.apache.ignite.ci.analysis.TestInBranch;
+import org.apache.ignite.ci.tcmodel.agent.Agent;
 import org.apache.ignite.ci.tcmodel.mute.MuteInfo;
 import org.apache.ignite.ci.tcmodel.result.Build;
 import org.apache.ignite.ci.teamcity.ignited.buildcondition.BuildCondition;
@@ -59,6 +60,14 @@ public interface ITeamcityIgnited {
             @Nullable String branchName);
 
     /**
+     * Return queued builds for branch and suite, without relation to its status.
+     *
+     * @param branchName Branch name.
+     * @return list of builds in history, includes all statuses: queued, running, etc
+     */
+    public List<BuildRefCompacted> getQueuedBuildsCompacted(String branchName);
+
+    /**
      * @param projectId Project id.
      * @param creds Credentials.
      * @return Mutes for associated server and given project pair.
@@ -178,7 +187,17 @@ public interface ITeamcityIgnited {
      */
     @Nullable public IRunStat getSuiteRunStatAllBranches(String suiteBuildTypeId);
 
-    List<String> getAllProjectsIds();
+    public List<String> getAllProjectsIds();
 
-    String gitBranchPrefix();
+    public String gitBranchPrefix();
+
+
+    /**
+     * Get list of teamcity agents. Never cached, request goes directly to pure TC.
+     *
+     * @param connected Connected flag.
+     * @param authorized Authorized flag.
+     * @return List of teamcity agents.
+     */
+    public List<Agent> agents(boolean connected, boolean authorized);
 }
diff --git a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/teamcity/ignited/TeamcityIgnitedImpl.java b/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/teamcity/ignited/TeamcityIgnitedImpl.java
index 073f1a7..e17eddb 100644
--- a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/teamcity/ignited/TeamcityIgnitedImpl.java
+++ b/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/teamcity/ignited/TeamcityIgnitedImpl.java
@@ -43,7 +43,9 @@ import org.apache.ignite.ci.di.MonitoredTask;
 import org.apache.ignite.ci.di.cache.GuavaCached;
 import org.apache.ignite.ci.di.scheduler.IScheduler;
 import org.apache.ignite.ci.tcbot.trends.MasterTrendsService;
+import org.apache.ignite.ci.tcmodel.agent.Agent;
 import org.apache.ignite.ci.tcmodel.conf.Project;
+import org.apache.ignite.ci.tcmodel.hist.BuildRef;
 import org.apache.ignite.ci.tcmodel.mute.MuteInfo;
 import org.apache.ignite.ci.tcmodel.result.Build;
 import org.apache.ignite.ci.teamcity.ignited.buildcondition.BuildCondition;
@@ -340,6 +342,22 @@ public class TeamcityIgnitedImpl implements ITeamcityIgnited {
     }
 
     /** {@inheritDoc} */
+    @AutoProfiling
+    @Override public List<BuildRefCompacted> getQueuedBuildsCompacted(
+        @Nullable String branchName) {
+        ensureActualizeRequested();
+
+        Integer stateQueuedId = compactor.getStringIdIfPresent(BuildRef.STATE_QUEUED);
+        if (stateQueuedId == null)
+            return Collections.emptyList();
+
+        List<BuildRefCompacted> builds = buildRefDao.getBuildsForBranch(srvIdMaskHigh, branchForQuery(branchName));
+
+        return builds.stream().filter(b -> b.state() == stateQueuedId).collect(Collectors.toList());
+    }
+
+
+    /** {@inheritDoc} */
     @Override public Set<MuteInfo> getMutes(String projectId, ICredentialsProv creds) {
         muteSync.ensureActualizeMutes(taskName("actualizeMutes"), projectId, srvIdMaskHigh, conn);
 
@@ -381,12 +399,14 @@ public class TeamcityIgnitedImpl implements ITeamcityIgnited {
 
     /** {@inheritDoc} */
     @Nullable
+    @AutoProfiling
     @Override public IRunHistory getTestRunHist(TestInBranch testInBranch) {
         return runHistCompactedDao.getTestRunHist(srvIdMaskHigh, testInBranch.name, testInBranch.branch);
     }
 
     /** {@inheritDoc} */
     @Nullable
+    @AutoProfiling
     @Override public IRunHistory getSuiteRunHist(SuiteInBranch suiteInBranch) {
         return runHistCompactedDao.getSuiteRunHist(srvIdMaskHigh, suiteInBranch.getSuiteId(), suiteInBranch.branch);
     }
@@ -406,6 +426,11 @@ public class TeamcityIgnitedImpl implements ITeamcityIgnited {
         return conn.gitBranchPrefix();
     }
 
+    @Override
+    public List<Agent> agents(boolean connected, boolean authorized) {
+        return conn.agents(connected, authorized);
+    }
+
     /** {@inheritDoc} */
     @Override public List<String> getCompositeBuildTypesIdsSortedByBuildNumberCounter(String projectId) {
         return buildTypeSync.getCompositeBuildTypesIdsSortedByBuildNumberCounter(srvIdMaskHigh, projectId, conn);
diff --git a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/teamcity/ignited/fatbuild/FatBuildCompacted.java b/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/teamcity/ignited/fatbuild/FatBuildCompacted.java
index 91c8df4..360310e 100644
--- a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/teamcity/ignited/fatbuild/FatBuildCompacted.java
+++ b/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/teamcity/ignited/fatbuild/FatBuildCompacted.java
@@ -26,10 +26,12 @@ import org.apache.ignite.ci.tcmodel.conf.BuildType;
 import org.apache.ignite.ci.tcmodel.hist.BuildRef;
 import org.apache.ignite.ci.tcmodel.result.Build;
 import org.apache.ignite.ci.tcmodel.result.TestOccurrencesRef;
+import org.apache.ignite.ci.tcmodel.result.Triggered;
 import org.apache.ignite.ci.tcmodel.result.problems.ProblemOccurrence;
 import org.apache.ignite.ci.tcmodel.result.stat.Statistics;
 import org.apache.ignite.ci.tcmodel.result.tests.TestOccurrenceFull;
 import org.apache.ignite.ci.tcmodel.result.tests.TestOccurrencesFull;
+import org.apache.ignite.ci.tcmodel.user.User;
 import org.apache.ignite.ci.teamcity.ignited.BuildRefCompacted;
 import org.apache.ignite.ci.teamcity.ignited.IStringCompactor;
 import org.apache.ignite.ci.teamcity.ignited.runhist.Invocation;
@@ -106,6 +108,8 @@ public class FatBuildCompacted extends BuildRefCompacted implements IVersionedEn
 
     @Nullable private int changesIds[];
 
+    @Nullable private TriggeredCompacted triggered;
+
     /** {@inheritDoc} */
     @Override public int version() {
         return _ver;
@@ -166,6 +170,28 @@ public class FatBuildCompacted extends BuildRefCompacted implements IVersionedEn
 
         if (build.isFakeStub())
             setFakeStub(true);
+
+        final Triggered trigXml = build.getTriggered();
+
+        if (trigXml != null) {
+            triggered = new TriggeredCompacted();
+
+            triggered.type = compactor.getStringId(trigXml.getType());
+
+            final User trigXmlUser = trigXml.getUser();
+
+            if (trigXmlUser != null) {
+                triggered.userId = Integer.valueOf(trigXmlUser.id);
+                triggered.userUsername = compactor.getStringId(trigXmlUser.username);
+            } else {
+                triggered.userId = -1;
+                triggered.userUsername = -1;
+            }
+
+            final BuildRef trigBuildRef = trigXml.getBuild();
+
+            triggered.buildId = trigBuildRef != null ? trigBuildRef.getId() : -1;
+        }
     }
 
     public FatBuildCompacted setFakeStub(boolean val) {
@@ -240,6 +266,29 @@ public class FatBuildCompacted extends BuildRefCompacted implements IVersionedEn
         res.defaultBranch = getFlag(DEF_BR_F);
         res.composite = getFlag(COMPOSITE_F);
 
+        if (triggered != null) {
+            final Triggered trigXml = new Triggered();
+
+            trigXml.setType(compactor.getStringFromId(triggered.type));
+            trigXml.setDate(res.queuedDate);
+
+            if (triggered.userId > 0) {
+                final User trigUser = new User();
+                trigUser.id = Integer.toString(triggered.userId);
+                trigUser.username = compactor.getStringFromId(triggered.userUsername);
+                trigXml.setUser(trigUser);
+            }
+
+
+            if (triggered.buildId > 0) {
+                final BuildRef trigBuild = new BuildRef();
+                trigBuild.setId(triggered.buildId);
+                trigXml.setBuild(trigBuild);
+            }
+
+            res.setTriggered(trigXml);
+        }
+
     }
 
     /**
@@ -482,6 +531,7 @@ public class FatBuildCompacted extends BuildRefCompacted implements IVersionedEn
             .add("problems", problems)
             .add("statistics", statistics)
             .add("changesIds", changesIds)
+            .add("triggered", triggered)
             .toString();
     }
 
diff --git a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/teamcity/ignited/fatbuild/ProactiveFatBuildSync.java b/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/teamcity/ignited/fatbuild/ProactiveFatBuildSync.java
index 843d991..94a1970 100644
--- a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/teamcity/ignited/fatbuild/ProactiveFatBuildSync.java
+++ b/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/teamcity/ignited/fatbuild/ProactiveFatBuildSync.java
@@ -366,7 +366,7 @@ public class ProactiveFatBuildSync {
             }
 
             if (build.problemOccurrences != null)
-                problems = conn.getProblemsAndRegisterCritical(build).getProblemsNonNull();
+                problems = conn.getProblems(buildId).getProblemsNonNull();
 
             if (build.statisticsRef != null)
                 statistics = conn.getStatistics(buildId);
diff --git a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/teamcity/ignited/fatbuild/TriggeredCompacted.java b/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/teamcity/ignited/fatbuild/TriggeredCompacted.java
new file mode 100644
index 0000000..728615d
--- /dev/null
+++ b/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/teamcity/ignited/fatbuild/TriggeredCompacted.java
@@ -0,0 +1,72 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.ignite.ci.teamcity.ignited.fatbuild;
+
+import com.google.common.base.MoreObjects;
+import com.google.common.base.Objects;
+
+/**
+ * Triggered build information type/date/user
+ */
+public class TriggeredCompacted {
+    /**
+     * Type of triggering, for example:
+     * "snapshotDependency", ""
+     */
+    public int type;
+
+    /**
+     * User ID by teamcity identification.
+     */
+    public int userId;
+
+    /**
+     * User entity: Username compacted string Id.
+     */
+    public int userUsername;
+
+    /**
+     * Build ID, filled for snapshotDependencies triggering.
+     */
+    public int buildId;
+
+    @Override
+    public boolean equals(Object o) {
+        if (this == o) return true;
+        if (o == null || getClass() != o.getClass()) return false;
+        TriggeredCompacted that = (TriggeredCompacted) o;
+        return type == that.type &&
+                userId == that.userId &&
+                userUsername == that.userUsername &&
+                buildId == that.buildId;
+    }
+
+    @Override
+    public int hashCode() {
+        return Objects.hashCode(type, userId, userUsername, buildId);
+    }
+
+    @Override
+    public String toString() {
+        return MoreObjects.toStringHelper(this)
+                .add("type", type)
+                .add("userId", userId)
+                .add("userUsername", userUsername)
+                .add("buildId", buildId)
+                .toString();
+    }
+}
diff --git a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/teamcity/ignited/runhist/RunHistCompactedDao.java b/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/teamcity/ignited/runhist/RunHistCompactedDao.java
index 8ab9815..d22eb39 100644
--- a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/teamcity/ignited/runhist/RunHistCompactedDao.java
+++ b/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/teamcity/ignited/runhist/RunHistCompactedDao.java
@@ -28,6 +28,7 @@ import org.apache.ignite.cache.query.QueryCursor;
 import org.apache.ignite.cache.query.SqlQuery;
 import org.apache.ignite.ci.db.TcHelperDb;
 import org.apache.ignite.ci.di.AutoProfiling;
+import org.apache.ignite.ci.di.cache.GuavaCached;
 import org.apache.ignite.ci.teamcity.ignited.IRunHistory;
 import org.apache.ignite.ci.teamcity.ignited.IRunStat;
 import org.apache.ignite.ci.teamcity.ignited.IStringCompactor;
@@ -63,7 +64,7 @@ public class RunHistCompactedDao {
     private IgniteCache<RunHistKey, RunHistCompacted> testHistCache;
 
     /** Suite history cache. */
-    private IgniteCache<RunHistKey, RunHistCompacted> suiteHistCacheName;
+    private IgniteCache<RunHistKey, RunHistCompacted> suiteHistCache;
 
     /** Build start time. */
     private IgniteCache<Long, Long> buildStartTime;
@@ -87,11 +88,12 @@ public class RunHistCompactedDao {
 
         cfg2.setQueryEntities(Collections.singletonList(new QueryEntity(RunHistKey.class, RunHistCompacted.class)));
 
-        suiteHistCacheName = ignite.getOrCreateCache(cfg2);
+        suiteHistCache = ignite.getOrCreateCache(cfg2);
 
         buildStartTime = ignite.getOrCreateCache(TcHelperDb.getCacheV2Config(BUILD_START_TIME_CACHE_NAME));
     }
 
+    @GuavaCached(maximumSize = 200, expireAfterAccessSecs = 30, softValues = true)
     public IRunHistory getTestRunHist(int srvIdMaskHigh, String name, @Nullable String branch) {
         RunHistKey key = getKey(srvIdMaskHigh, name, branch);
         if (key == null)
@@ -148,7 +150,7 @@ public class RunHistCompactedDao {
         if (list.isEmpty())
             return 0;
 
-        return suiteHistCacheName.invoke(histKey, RunHistCompactedDao::processEntry, list);
+        return suiteHistCache.invoke(histKey, RunHistCompactedDao::processEntry, list);
     }
 
     @NotNull public static Integer processEntry(MutableEntry<RunHistKey, RunHistCompacted> entry, Object[] parms) {
@@ -179,12 +181,13 @@ public class RunHistCompactedDao {
      * @param suiteId Suite id.
      * @param branch Branch.
      */
+    @GuavaCached(maximumSize = 200, expireAfterAccessSecs = 30, softValues = true)
     public IRunHistory getSuiteRunHist(int srvId, String suiteId, @Nullable String branch) {
         RunHistKey key = getKey(srvId, suiteId, branch);
         if (key == null)
             return null;
 
-        return suiteHistCacheName.get(key);
+        return suiteHistCache.get(key);
     }
 
     public IRunStat getSuiteRunStatAllBranches(int srvIdMaskHigh, String btId) {
@@ -194,7 +197,7 @@ public class RunHistCompactedDao {
 
         AtomicInteger runs = new AtomicInteger();
         AtomicInteger failures = new AtomicInteger();
-        try (QueryCursor<Cache.Entry<RunHistKey, RunHistCompacted>> qryCursor = suiteHistCacheName.query(
+        try (QueryCursor<Cache.Entry<RunHistKey, RunHistCompacted>> qryCursor = suiteHistCache.query(
             new SqlQuery<RunHistKey, RunHistCompacted>(RunHistCompacted.class, "testOrSuiteName = ? and srvId = ?")
                 .setArgs(testName, srvIdMaskHigh))) {
 
diff --git a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/teamcity/pure/ITeamcityConn.java b/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/teamcity/pure/ITeamcityConn.java
index 4c69296..5af968f 100644
--- a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/teamcity/pure/ITeamcityConn.java
+++ b/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/teamcity/pure/ITeamcityConn.java
@@ -23,6 +23,7 @@ import java.util.concurrent.atomic.AtomicReference;
 import javax.annotation.Nonnull;
 import javax.annotation.Nullable;
 
+import org.apache.ignite.ci.tcmodel.agent.Agent;
 import org.apache.ignite.ci.tcmodel.changes.Change;
 import org.apache.ignite.ci.tcmodel.changes.ChangesList;
 import org.apache.ignite.ci.tcmodel.conf.BuildType;
@@ -36,13 +37,15 @@ import org.apache.ignite.ci.tcmodel.result.stat.Statistics;
 import org.apache.ignite.ci.tcmodel.result.tests.TestOccurrencesFull;
 
 /**
- * Pure Teamcity Connection API for calling methods from REST service: https://confluence.jetbrains.com/display/TCD10/REST+API
+ * Pure Teamcity Connection API for calling methods from REST service: <br>
+ * https://confluence.jetbrains.com/display/TCD10/REST+API
  */
 public interface ITeamcityConn {
     /**
      * @return Internal server ID as string
      */
-    @Nullable public String serverId();
+    @Nullable
+    public String serverId();
 
     /**
      * @return Normalized Host address, ends with '/'.
@@ -101,10 +104,6 @@ public interface ITeamcityConn {
      */
     BuildTypeFull getBuildType(String buildTypeId);
 
-    /** */
-    @Deprecated
-    ProblemOccurrences getProblemsAndRegisterCritical(BuildRef build);
-
     /**
      * @return List of all project available at Teamcity server.
      */
@@ -114,4 +113,13 @@ public interface ITeamcityConn {
      * @return Branch name mandatory prefix for all PR-less contributions, e.g. "ignite-".
      */
     public String gitBranchPrefix();
+
+    /**
+     * Get list of teamcity agents.
+     *
+     * @param connected Connected flag.
+     * @param authorized Authorized flag.
+     * @return List of teamcity agents.
+     */
+    List<Agent> agents(boolean connected, boolean authorized);
 }
diff --git a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/web/model/current/ChainAtServerCurrentStatus.java b/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/web/model/current/ChainAtServerCurrentStatus.java
index 5d4402b..29b9a19 100644
--- a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/web/model/current/ChainAtServerCurrentStatus.java
+++ b/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/web/model/current/ChainAtServerCurrentStatus.java
@@ -23,10 +23,9 @@ import java.util.ArrayList;
 import java.util.Comparator;
 import java.util.List;
 import java.util.Map;
-import java.util.function.Function;
 import java.util.stream.Stream;
 import javax.annotation.Nullable;
-import org.apache.ignite.ci.ITcAnalytics;
+
 import org.apache.ignite.ci.ITeamcity;
 import org.apache.ignite.ci.analysis.FullChainRunCtx;
 import org.apache.ignite.ci.analysis.IMultTestOccurrence;
@@ -37,8 +36,6 @@ import org.apache.ignite.ci.github.pure.IGitHubConnection;
 import org.apache.ignite.ci.jira.pure.IJiraIntegration;
 import org.apache.ignite.ci.tcbot.visa.TcBotTriggerAndSignOffService;
 import org.apache.ignite.ci.tcmodel.conf.BuildType;
-import org.apache.ignite.ci.analysis.TestInBranch;
-import org.apache.ignite.ci.teamcity.ignited.IRunHistory;
 import org.apache.ignite.ci.teamcity.ignited.ITeamcityIgnited;
 import org.apache.ignite.ci.util.CollectionUtil;
 import org.apache.ignite.internal.util.typedef.T2;
@@ -161,7 +158,6 @@ public class ChainAtServerCurrentStatus {
     public void initFromContext(ITeamcityIgnited tcIgnited,
                                 @Deprecated ITeamcity teamcity,
                                 FullChainRunCtx ctx,
-                                @Deprecated ITcAnalytics tcAnalytics,
                                 @Nullable String baseBranchTc) {
         failedTests = 0;
         failedToFinish = 0;
@@ -172,7 +168,7 @@ public class ChainAtServerCurrentStatus {
             suite -> {
                 final SuiteCurrentStatus suiteCurStatus = new SuiteCurrentStatus();
 
-                suiteCurStatus.initFromContext(tcIgnited, teamcity, suite, tcAnalytics, baseBranchTc);
+                suiteCurStatus.initFromContext(tcIgnited, suite, baseBranchTc);
 
                 failedTests += suiteCurStatus.failedTests;
                 if (suite.hasAnyBuildProblemExceptTestOrSnapshot() || suite.onlyCancelledBuilds())
@@ -184,8 +180,8 @@ public class ChainAtServerCurrentStatus {
         durationPrintable = ctx.getDurationPrintable();
         testsDurationPrintable = ctx.getTestsDurationPrintable();
         lostInTimeouts = ctx.getLostInTimeoutsPrintable();
-        webToHist = buildWebLink(teamcity, ctx);
-        webToBuild = buildWebLinkToBuild(teamcity, ctx);
+        webToHist = buildWebLink(tcIgnited, ctx);
+        webToBuild = buildWebLinkToBuild(tcIgnited, ctx);
 
         Stream<T2<MultBuildRunCtx, IMultTestOccurrence>> allLongRunning = ctx.suites().flatMap(
             suite -> suite.getTopLongRunning().map(t -> new T2<>(suite, t))
@@ -198,14 +194,7 @@ public class ChainAtServerCurrentStatus {
                 MultBuildRunCtx suite = pairCtxAndOccur.get1();
                 IMultTestOccurrence longRunningOccur = pairCtxAndOccur.get2();
 
-                Function<TestInBranch, ? extends IRunHistory> function =
-                    ITeamcity.NEW_RUN_STAT
-                        ? tcIgnited::getTestRunHist
-                        : tcAnalytics.getTestRunStatProvider();
-
-                TestFailure failure = createOrrucForLongRun(tcIgnited, suite, tcAnalytics, longRunningOccur,
-                    baseBranchTc,
-                    function);
+                TestFailure failure = createOrrucForLongRun(tcIgnited, suite, longRunningOccur, baseBranchTc);
 
                 failure.testName = "[" + suite.suiteName() + "] " + failure.testName; //may be separate field
 
@@ -233,11 +222,11 @@ public class ChainAtServerCurrentStatus {
         );
     }
 
-    private static String buildWebLinkToBuild(ITeamcity teamcity, FullChainRunCtx chain) {
+    private static String buildWebLinkToBuild(ITeamcityIgnited teamcity, FullChainRunCtx chain) {
         return teamcity.host() + "viewLog.html?buildId=" + chain.getSuiteBuildId();
     }
 
-    private static String buildWebLink(ITeamcity teamcity, FullChainRunCtx suite) {
+    private static String buildWebLink(ITeamcityIgnited teamcity, FullChainRunCtx suite) {
         final String branch = branchForLink(suite.branchName());
         return teamcity.host() + "viewType.html?buildTypeId=" + suite.suiteId()
             + "&branch=" + escape(branch)
diff --git a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/web/model/current/SuiteCurrentStatus.java b/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/web/model/current/SuiteCurrentStatus.java
index afe98b6..269bcb5 100644
--- a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/web/model/current/SuiteCurrentStatus.java
+++ b/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/web/model/current/SuiteCurrentStatus.java
@@ -28,7 +28,7 @@ import java.util.function.Function;
 import java.util.stream.Collectors;
 import javax.annotation.Nonnull;
 import javax.annotation.Nullable;
-import org.apache.ignite.ci.ITcAnalytics;
+
 import org.apache.ignite.ci.ITeamcity;
 import org.apache.ignite.ci.analysis.IMultTestOccurrence;
 import org.apache.ignite.ci.analysis.MultBuildRunCtx;
@@ -122,9 +122,7 @@ import static org.apache.ignite.ci.util.UrlUtil.escape;
     public Boolean possibleBlocker;
 
     public void initFromContext(ITeamcityIgnited tcIgnited,
-                                @Nonnull final ITeamcity teamcity,
                                 @Nonnull final MultBuildRunCtx suite,
-                                @NotNull final ITcAnalytics tcAnalytics,
                                 @Nullable final String baseBranch) {
 
         name = suite.suiteName();
@@ -132,19 +130,9 @@ import static org.apache.ignite.ci.util.UrlUtil.escape;
         String failRateNormalizedBranch = normalizeBranch(baseBranch);
         String curBranchNormalized = normalizeBranch(suite.branchName());
 
-        Function<TestInBranch, ? extends IRunHistory> testStatProv =
-            ITeamcity.NEW_RUN_STAT
-                ? tcIgnited::getTestRunHist
-                : tcAnalytics.getTestRunStatProvider();
-
         String suiteId = suite.suiteId();
 
-        Function<SuiteInBranch, ? extends IRunHistory> provider =
-            ITeamcity.NEW_RUN_STAT
-                ? tcIgnited::getSuiteRunHist
-                : tcAnalytics.getBuildFailureRunStatProvider();
-
-        initSuiteStat(provider, failRateNormalizedBranch, curBranchNormalized, suiteId);
+        initSuiteStat(tcIgnited, failRateNormalizedBranch, curBranchNormalized, suiteId);
 
         Set<String> collect = suite.lastChangeUsers().collect(Collectors.toSet());
 
@@ -156,15 +144,15 @@ import static org.apache.ignite.ci.util.UrlUtil.escape;
         failedTests = suite.failedTests();
         durationPrintable = millisToDurationPrintable(suite.getBuildDuration());
         testsDurationPrintable  = millisToDurationPrintable(suite.getAvgTestsDuration());
-        webToHist = buildWebLink(teamcity, suite);
-        webToHistBaseBranch = buildWebLink(teamcity, suite, baseBranch);
-        webToBuild = buildWebLinkToBuild(teamcity, suite);
+        webToHist = buildWebLink(tcIgnited, suite);
+        webToHistBaseBranch = buildWebLink(tcIgnited, suite, baseBranch);
+        webToBuild = buildWebLinkToBuild(tcIgnited, suite);
 
         List<IMultTestOccurrence> tests = suite.getFailedTests();
         Function<IMultTestOccurrence, Float> function = foccur -> {
             TestInBranch testInBranch = new TestInBranch(foccur.getName(), failRateNormalizedBranch);
 
-            IRunHistory apply = testStatProv.apply(testInBranch);
+            IRunHistory apply = tcIgnited.getTestRunHist(testInBranch);
 
             return apply == null ? 0f : apply.getFailRate();
         };
@@ -174,14 +162,14 @@ import static org.apache.ignite.ci.util.UrlUtil.escape;
         tests.forEach(occurrence -> {
             final TestFailure failure = new TestFailure();
             failure.initFromOccurrence(occurrence, tcIgnited, suite.projectId(), suite.branchName(), baseBranch);
-            failure.initStat(testStatProv, failRateNormalizedBranch, curBranchNormalized);
+            failure.initStat(tcIgnited, failRateNormalizedBranch, curBranchNormalized);
 
             testFailures.add(failure);
         });
 
         suite.getTopLongRunning().forEach(occurrence -> {
-            final TestFailure failure = createOrrucForLongRun(tcIgnited, suite, tcAnalytics,
-                occurrence, baseBranch, testStatProv);
+            final TestFailure failure = createOrrucForLongRun(tcIgnited, suite,
+                    occurrence, baseBranch);
 
             topLongRunning.add(failure);
         });
@@ -211,29 +199,29 @@ import static org.apache.ignite.ci.util.UrlUtil.escape;
 
         suite.getBuildsWithThreadDump().forEach(buildId -> {
             webUrlThreadDump = "/rest/" + GetBuildLog.GET_BUILD_LOG + "/" + GetBuildLog.THREAD_DUMP
-                + "?" + GetBuildLog.SERVER_ID + "=" + teamcity.serverId()
+                + "?" + GetBuildLog.SERVER_ID + "=" + tcIgnited.serverId()
                 + "&" + GetBuildLog.BUILD_NO + "=" + buildId
                 + "&" + GetBuildLog.FILE_IDX + "=" + -1;
         });
 
         runningBuildCount = suite.runningBuildCount();
         queuedBuildCount = suite.queuedBuildCount();
-        serverId = teamcity.serverId();
+        serverId = tcIgnited.serverId();
         this.suiteId = suite.suiteId();
         branchName = branchForLink(suite.branchName());
         // todo implement this logic in suite possibleBlocker = suite.hasPossibleBlocker();
     }
 
-    private void initSuiteStat(Function<SuiteInBranch, ? extends IRunHistory> suiteFailProv,
-        String failRateNormalizedBranch,
-        String curBranchNormalized,
-        String suiteId) {
+    private void initSuiteStat(ITeamcityIgnited tcIgnited,
+                               String failRateNormalizedBranch,
+                               String curBranchNormalized,
+                               String suiteId) {
         if (Strings.isNullOrEmpty(suiteId)  )
             return;
 
         SuiteInBranch key = new SuiteInBranch(suiteId, failRateNormalizedBranch);
 
-        final IRunHistory stat = suiteFailProv.apply(key);
+        final IRunHistory stat = tcIgnited.getSuiteRunHist(key);
 
         if (stat != null) {
             failures = stat.getFailuresCount();
@@ -255,7 +243,7 @@ import static org.apache.ignite.ci.util.UrlUtil.escape;
         if (!failRateNormalizedBranch.equals(curBranchNormalized)) {
             SuiteInBranch keyForStripe = new SuiteInBranch(suiteId, curBranchNormalized);
 
-            final IRunHistory statForStripe = suiteFailProv.apply(keyForStripe);
+            final IRunHistory statForStripe = tcIgnited.getSuiteRunHist(keyForStripe);
 
             latestRunsSrc = statForStripe;
             latestRuns = statForStripe != null ? statForStripe.getLatestRunResults() : null;
@@ -280,20 +268,16 @@ import static org.apache.ignite.ci.util.UrlUtil.escape;
     }
 
     @NotNull public static TestFailure createOrrucForLongRun(ITeamcityIgnited tcIgnited,
-        @Nonnull MultBuildRunCtx suite,
-        @Nullable final ITcAnalytics tcAnalytics,
-        final IMultTestOccurrence occurrence,
-        @Nullable final String failRateBranch,
-        Function<TestInBranch, ? extends IRunHistory> supplier) {
+                                                             @Nonnull MultBuildRunCtx suite,
+                                                             final IMultTestOccurrence occurrence,
+                                                             @Nullable final String failRateBranch) {
         final TestFailure failure = new TestFailure();
 
         failure.initFromOccurrence(occurrence, tcIgnited, suite.projectId(), suite.branchName(), failRateBranch);
 
-        if (tcAnalytics != null) {
-            failure.initStat(supplier,
+        failure.initStat(tcIgnited,
                 normalizeBranch(failRateBranch),
                 normalizeBranch(suite.branchName()));
-        }
 
         return failure;
     }
@@ -314,17 +298,17 @@ import static org.apache.ignite.ci.util.UrlUtil.escape;
         failure.warnings.addAll(logCheckRes.getWarns());
     }
 
-    private static String buildWebLinkToBuild(ITeamcity teamcity, MultBuildRunCtx suite) {
+    private static String buildWebLinkToBuild(ITeamcityIgnited teamcity, MultBuildRunCtx suite) {
         return teamcity.host() + "viewLog.html?buildId=" + Integer.toString(suite.getBuildId());
     }
 
-    private static String buildWebLink(ITeamcity teamcity, MultBuildRunCtx suite) {
+    private static String buildWebLink(ITeamcityIgnited teamcity, MultBuildRunCtx suite) {
         String branchName = suite.branchName();
 
         return buildWebLink(teamcity, suite, branchName);
     }
 
-    @NotNull private static String buildWebLink(ITeamcity teamcity, MultBuildRunCtx suite, String branchName) {
+    @NotNull private static String buildWebLink(ITeamcityIgnited teamcity, MultBuildRunCtx suite, String branchName) {
         final String branch = branchForLink(branchName);
         return teamcity.host() + "viewType.html?buildTypeId=" + suite.suiteId()
             + "&branch=" + escape(branch)
diff --git a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/web/model/current/TestFailure.java b/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/web/model/current/TestFailure.java
index 5a469a7..1448222 100644
--- a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/web/model/current/TestFailure.java
+++ b/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/web/model/current/TestFailure.java
@@ -21,13 +21,11 @@ import com.google.common.base.Objects;
 import com.google.common.base.Strings;
 import java.util.ArrayList;
 import java.util.List;
-import java.util.function.Function;
 import java.util.regex.Matcher;
 import java.util.regex.Pattern;
 import javax.annotation.Nonnull;
 import javax.annotation.Nullable;
 import org.apache.ignite.ci.analysis.IMultTestOccurrence;
-import org.apache.ignite.ci.analysis.RunStat;
 import org.apache.ignite.ci.analysis.TestInBranch;
 import org.apache.ignite.ci.issue.EventTemplates;
 import org.apache.ignite.ci.issue.ProblemRef;
@@ -189,19 +187,17 @@ import static org.apache.ignite.ci.web.model.current.SuiteCurrentStatus.branchFo
     }
 
     /**
-     * @param runStatSupplier Run stat supplier.
+     * @param tcIgnited TC service as Run stat supplier.
      * @param failRateNormalizedBranch Base branch: Fail rate and flakyness detection normalized branch.
      * @param curBranchNormalized Cur branch normalized.
      */
-    public void initStat(@Nullable final Function<TestInBranch, ? extends IRunHistory> runStatSupplier,
-        String failRateNormalizedBranch,
-        String curBranchNormalized) {
-        if (runStatSupplier == null)
-            return;
+    public void initStat(ITeamcityIgnited tcIgnited,
+                         String failRateNormalizedBranch,
+                         String curBranchNormalized) {
 
         TestInBranch testInBranch = new TestInBranch(name, failRateNormalizedBranch);
 
-        final IRunHistory stat = runStatSupplier.apply(testInBranch);
+        final IRunHistory stat = tcIgnited.getTestRunHist(testInBranch);
 
         histBaseBranch.init(stat);
 
@@ -210,7 +206,7 @@ import static org.apache.ignite.ci.web.model.current.SuiteCurrentStatus.branchFo
         if (!curBranchNormalized.equals(failRateNormalizedBranch)) {
             TestInBranch testInBranchS = new TestInBranch(name, curBranchNormalized);
 
-            statForProblemsDetection = runStatSupplier.apply(testInBranchS);
+            statForProblemsDetection = tcIgnited.getTestRunHist(testInBranchS);
 
             if(statForProblemsDetection!=null) {
                 histCurBranch = new TestHistory();
diff --git a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/web/rest/GetChainResultsAsHtml.java b/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/web/rest/GetChainResultsAsHtml.java
index 1b72d4c..7465e99 100644
--- a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/web/rest/GetChainResultsAsHtml.java
+++ b/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/web/rest/GetChainResultsAsHtml.java
@@ -92,7 +92,7 @@ public class GetChainResultsAsHtml {
 
         status.chainName = ctx.suiteName();
 
-        status.initFromContext(tcIgn, teamcity, ctx, teamcity, failRateBranch);
+        status.initFromContext(tcIgn, teamcity, ctx, failRateBranch);
 
         res.append(showChainAtServerData(status));
 
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 0ad6c3e..d87182b 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
@@ -150,7 +150,7 @@ public class GetBuildTestFailures {
         if (cnt > 0)
             runningUpdates.addAndGet(cnt);
 
-        chainStatus.initFromContext(tcIgnited, teamcity, ctx, teamcity, failRateBranch);
+        chainStatus.initFromContext(tcIgnited, teamcity, ctx, failRateBranch);
 
         res.addChainOnServer(chainStatus);
 
diff --git a/ignite-tc-helper-web/src/test/java/org/apache/ignite/ci/tcbot/chain/BuildChainProcessorTest.java b/ignite-tc-helper-web/src/test/java/org/apache/ignite/ci/tcbot/chain/BuildChainProcessorTest.java
index 8e6390c..eeebd72 100644
--- a/ignite-tc-helper-web/src/test/java/org/apache/ignite/ci/tcbot/chain/BuildChainProcessorTest.java
+++ b/ignite-tc-helper-web/src/test/java/org/apache/ignite/ci/tcbot/chain/BuildChainProcessorTest.java
@@ -194,10 +194,7 @@ public class BuildChainProcessorTest {
     }
 
     @NotNull public static IAnalyticsEnabledTeamcity tcOldMock() {
-        IAnalyticsEnabledTeamcity teamcity = Mockito.mock(IAnalyticsEnabledTeamcity.class);
-        when(teamcity.getBuildFailureRunStatProvider()).thenReturn(Mockito.mock(Function.class));
-        when(teamcity.getTestRunStatProvider()).thenReturn(Mockito.mock(Function.class));
-        return teamcity;
+        return Mockito.mock(IAnalyticsEnabledTeamcity.class);
     }
 
     @NotNull public ITeamcityIgnited tcIgnitedMock(Map<Integer, FatBuildCompacted> builds) {
diff --git a/ignite-tc-helper-web/src/test/java/org/apache/ignite/ci/tcbot/chain/PrChainsProcessorTest.java b/ignite-tc-helper-web/src/test/java/org/apache/ignite/ci/tcbot/chain/PrChainsProcessorTest.java
index 5e80e1f..3c07d25 100644
--- a/ignite-tc-helper-web/src/test/java/org/apache/ignite/ci/tcbot/chain/PrChainsProcessorTest.java
+++ b/ignite-tc-helper-web/src/test/java/org/apache/ignite/ci/tcbot/chain/PrChainsProcessorTest.java
@@ -130,25 +130,20 @@ public class PrChainsProcessorTest {
 
         assertTrue(containsTestFailure(blockers, TEST_WITH_HISTORY_PASSING_IN_MASTER));
 
-        if (ITeamcity.NEW_RUN_STAT) {
-            assertFalse(containsTestFailure(blockers, TEST_WITH_HISTORY_FAILING_IN_MASTER));
-            assertFalse(containsTestFailure(blockers, TEST_FLAKY_IN_MASTER));
-        }
+        assertFalse(containsTestFailure(blockers, TEST_WITH_HISTORY_FAILING_IN_MASTER));
+        assertFalse(containsTestFailure(blockers, TEST_FLAKY_IN_MASTER));
 
         Optional<TestFailure> testOpt = findBlockerTestFailure(blockers, TEST_WITH_HISTORY_PASSING_IN_MASTER);
         assertTrue(testOpt.isPresent());
 
-        if (ITeamcity.NEW_RUN_STAT) {
-            List<Integer> etalon = new ArrayList<>();
-            for (int i = 0; i < NUM_OF_TESTS_IN_MASTER; i++)
-                etalon.add(RunStat.RunStatus.RES_OK.getCode());
+        List<Integer> etalon = new ArrayList<>();
+        for (int i = 0; i < NUM_OF_TESTS_IN_MASTER; i++)
+            etalon.add(RunStat.RunStatus.RES_OK.getCode());
 
-            assertEquals(etalon, testOpt.get().histBaseBranch.latestRuns);
-        }
+        assertEquals(etalon, testOpt.get().histBaseBranch.latestRuns);
 
         assertTrue(containsTestFailure(blockers, TEST_WAS_FIXED_IN_MASTER));
-        if(ITeamcity.NEW_RUN_STAT)
-            assertFalse(containsTestFailure(blockers, TEST_WITH_HISTORY_FAILING_IN_MASTER));
+        assertFalse(containsTestFailure(blockers, TEST_WITH_HISTORY_FAILING_IN_MASTER));
         // otherwise this non-blocker will not be filtered out
 
         assertTrue(containsTestFailure(blockers, TEST_WITH_HISTORY_PASSING_IN_MASTER));
diff --git a/ignite-tc-helper-web/src/test/java/org/apache/ignite/ci/teamcity/ignited/IgnitedTcInMemoryIntegrationTest.java b/ignite-tc-helper-web/src/test/java/org/apache/ignite/ci/teamcity/ignited/IgnitedTcInMemoryIntegrationTest.java
index e768ceb..6ca6a82 100644
--- a/ignite-tc-helper-web/src/test/java/org/apache/ignite/ci/teamcity/ignited/IgnitedTcInMemoryIntegrationTest.java
+++ b/ignite-tc-helper-web/src/test/java/org/apache/ignite/ci/teamcity/ignited/IgnitedTcInMemoryIntegrationTest.java
@@ -56,6 +56,7 @@ import org.apache.ignite.ci.tcmodel.hist.BuildRef;
 import org.apache.ignite.ci.tcmodel.mute.MuteInfo;
 import org.apache.ignite.ci.tcmodel.mute.Mutes;
 import org.apache.ignite.ci.tcmodel.result.Build;
+import org.apache.ignite.ci.tcmodel.result.Triggered;
 import org.apache.ignite.ci.tcmodel.result.problems.ProblemOccurrence;
 import org.apache.ignite.ci.tcmodel.result.problems.ProblemOccurrences;
 import org.apache.ignite.ci.tcmodel.result.stat.Statistics;
@@ -470,6 +471,18 @@ public class IgnitedTcInMemoryIntegrationTest {
         assertEquals(refBuild.buildTypeId(), actBuild.buildTypeId());
         assertEquals(refBuild.getStartDate(), actBuild.getStartDate());
         assertEquals(refBuild.getFinishDate(), actBuild.getFinishDate());
+
+        final Triggered refTrig = refBuild.getTriggered();
+        final Triggered actTrig = actBuild.getTriggered();
+        assertNotNull(refTrig);
+        assertNotNull(actTrig);
+
+        assertNotNull(refTrig.getUser());
+        assertNotNull(actTrig.getUser());
+
+        assertEquals(refTrig.getUser().username, actTrig.getUser().username);
+        assertEquals(refTrig.getBuild().getId(), actTrig.getBuild().getId());
+
         BuildType refBt = refBuild.getBuildType();
         BuildType actBt = actBuild.getBuildType();
         assertEquals(refBt.getName(), actBt.getName());