diff --git a/bin/ignite-tf.sh b/bin/ignite-tf.sh
deleted file mode 100755
index af2b5d4..0000000
--- a/bin/ignite-tf.sh
+++ /dev/null
@@ -1,189 +0,0 @@
-#!/usr/bin/env bash
-if [ ! -z "${IGNITE_SCRIPT_STRICT_MODE:-}" ]
-then
-    set -o nounset
-    set -o errexit
-    set -o pipefail
-    set -o errtrace
-    set -o functrace
-fi
-
-#
-# 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.
-#
-
-#
-# Command line tool for Tensorflow cluster management.
-#
-
-#
-# Import common functions.
-#
-if [ "${IGNITE_HOME:-}" = "" ];
-    then IGNITE_HOME_TMP="$(dirname "$(cd "$(dirname "$0")"; "pwd")")";
-    else IGNITE_HOME_TMP=${IGNITE_HOME};
-fi
-
-#
-# Set SCRIPTS_HOME - base path to scripts.
-#
-SCRIPTS_HOME="${IGNITE_HOME_TMP}/bin"
-
-source "${SCRIPTS_HOME}"/include/functions.sh
-
-#
-# Discover path to Java executable and check it's version.
-#
-checkJava
-
-#
-# Discover IGNITE_HOME environment variable.
-#
-setIgniteHome
-
-if [ "${DEFAULT_CONFIG:-}" == "" ]; then
-    DEFAULT_CONFIG=config/default-config.xml
-fi
-
-#
-# Set IGNITE_LIBS.
-#
-. "${SCRIPTS_HOME}"/include/setenv.sh
-. "${SCRIPTS_HOME}"/include/build-classpath.sh # Will be removed in the binary release.
-IGNITE_OPT_LIBS=${IGNITE_HOME}/libs/optional/
-CP="${IGNITE_LIBS}:${IGNITE_OPT_LIBS}/ignite-tensorflow/*:${IGNITE_OPT_LIBS}/ignite-slf4j/*"
-
-RANDOM_NUMBER=$("$JAVA" -cp "${CP}" org.apache.ignite.startup.cmdline.CommandLineRandomNumberGenerator)
-
-RESTART_SUCCESS_FILE="${IGNITE_HOME}/work/ignite_success_${RANDOM_NUMBER}"
-RESTART_SUCCESS_OPT="-DIGNITE_SUCCESS_FILE=${RESTART_SUCCESS_FILE}"
-
-# Mac OS specific support to display correct name in the dock.
-osname=`uname`
-
-if [ "${DOCK_OPTS:-}" == "" ]; then
-    DOCK_OPTS="-Xdock:name=Ignite Node"
-fi
-
-#
-# JVM options. See http://java.sun.com/javase/technologies/hotspot/vmoptions.jsp for more details.
-#
-# ADD YOUR/CHANGE ADDITIONAL OPTIONS HERE
-#
-if [ -z "${JVM_OPTS:-}" ] ; then
-    JVM_OPTS="-Xms1g -Xmx1g -server -XX:MaxMetaspaceSize=256m"
-fi
-
-#
-# Uncomment the following GC settings if you see spikes in your throughput due to Garbage Collection.
-#
-# JVM_OPTS="$JVM_OPTS -XX:+UseG1GC"
-
-#
-# Uncomment if you get StackOverflowError.
-# On 64 bit systems this value can be larger, e.g. -Xss16m
-#
-# JVM_OPTS="${JVM_OPTS} -Xss4m"
-
-#
-# Uncomment to set preference for IPv4 stack.
-#
-# JVM_OPTS="${JVM_OPTS} -Djava.net.preferIPv4Stack=true"
-
-#
-# Assertions are disabled by default since version 3.5.
-# If you want to enable them - set 'ENABLE_ASSERTIONS' flag to '1'.
-#
-ENABLE_ASSERTIONS="1"
-
-#
-# Set '-ea' options if assertions are enabled.
-#
-if [ "${ENABLE_ASSERTIONS:-}" = "1" ]; then
-    JVM_OPTS="${JVM_OPTS} -ea"
-fi
-
-MAIN_CLASS=org.apache.ignite.tensorflow.submitter.JobSubmitter
-
-#
-# Remote debugging (JPDA).
-# Uncomment and change if remote debugging is required.
-#
-# JVM_OPTS="-agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=8787 ${JVM_OPTS}"
-
-#
-# Final JVM_OPTS for Java 9+ compatibility
-#
-if [ $version -eq 8 ] ; then
-    JVM_OPTS="\
-        -XX:+AggressiveOpts \
-         ${JVM_OPTS}"
-
-elif [ $version -gt 8 ] && [ $version -lt 11 ]; then
-    JVM_OPTS="\
-        -XX:+AggressiveOpts \
-        --add-exports=java.base/jdk.internal.misc=ALL-UNNAMED \
-        --add-exports=java.base/sun.nio.ch=ALL-UNNAMED \
-        --add-exports=java.management/com.sun.jmx.mbeanserver=ALL-UNNAMED \
-        --add-exports=jdk.internal.jvmstat/sun.jvmstat.monitor=ALL-UNNAMED \
-        --add-exports=java.base/sun.reflect.generics.reflectiveObjects=ALL-UNNAMED \
-        --illegal-access=permit \
-        --add-modules=java.xml.bind \
-        ${JVM_OPTS}"
-
-elif [ $version -ge 11 ] ; then
-    JVM_OPTS="\
-        --add-exports=java.base/jdk.internal.misc=ALL-UNNAMED \
-        --add-exports=java.base/sun.nio.ch=ALL-UNNAMED \
-        --add-exports=java.management/com.sun.jmx.mbeanserver=ALL-UNNAMED \
-        --add-exports=jdk.internal.jvmstat/sun.jvmstat.monitor=ALL-UNNAMED \
-        --add-exports=java.base/sun.reflect.generics.reflectiveObjects=ALL-UNNAMED \
-        --illegal-access=permit \
-        ${JVM_OPTS}"
-fi
-
-
-ERRORCODE="-1"
-
-QUIET="-DIGNITE_QUIET=false"
-
-while [ "${ERRORCODE}" -ne "130" ]
-do
-    case $osname in
-        Darwin*)
-            "$JAVA" ${JVM_OPTS:-} ${QUIET:-} "${DOCK_OPTS}" "${RESTART_SUCCESS_OPT}"  \
-             -DIGNITE_UPDATE_NOTIFIER=false -DIGNITE_HOME="${IGNITE_HOME}" \
-             -DIGNITE_PROG_NAME="$0" -cp "${CP}" ${MAIN_CLASS} "${CONFIG:-}" "$@"
-        ;;
-        *)
-            "$JAVA" ${JVM_OPTS:-} ${QUIET:-} "${RESTART_SUCCESS_OPT}" \
-             -DIGNITE_UPDATE_NOTIFIER=false -DIGNITE_HOME="${IGNITE_HOME}" \
-             -DIGNITE_PROG_NAME="$0" -cp "${CP}" ${MAIN_CLASS} "$@"
-        ;;
-    esac
-
-    ERRORCODE="$?"
-
-    if [ ! -f "${RESTART_SUCCESS_FILE}" ] ; then
-        break
-    else
-        rm -f "${RESTART_SUCCESS_FILE}"
-    fi
-done
-
-if [ -f "${RESTART_SUCCESS_FILE}" ] ; then
-    rm -f "${RESTART_SUCCESS_FILE}"
-fi
diff --git a/examples/pom-standalone-lgpl.xml b/examples/pom-standalone-lgpl.xml
index a52cf48..a2f56d6 100644
--- a/examples/pom-standalone-lgpl.xml
+++ b/examples/pom-standalone-lgpl.xml
@@ -111,12 +111,6 @@
         </dependency>
 
         <dependency>
-            <groupId>org.apache.ignite</groupId>
-            <artifactId>ignite-ml-tensorflow-model-parser</artifactId>
-            <version>to_be_replaced_by_ignite_version</version>
-        </dependency>
-
-        <dependency>
             <groupId>commons-cli</groupId>
             <artifactId>commons-cli</artifactId>
             <version>1.2</version>
@@ -155,12 +149,6 @@
                     <artifactId>ignite-spark</artifactId>
                     <version>to_be_replaced_by_ignite_version</version>
                 </dependency>
-
-                <dependency>
-                    <groupId>org.apache.ignite</groupId>
-                    <artifactId>ignite-ml-mleap-model-parser</artifactId>
-                    <version>to_be_replaced_by_ignite_version</version>
-                </dependency>
             </dependencies>
 
             <build>
@@ -248,12 +236,6 @@
                     <artifactId>ignite-spark-2.4</artifactId>
                     <version>to_be_replaced_by_ignite_version</version>
                 </dependency>
-
-                <dependency>
-                    <groupId>org.apache.ignite</groupId>
-                    <artifactId>ignite-ml-mleap-model-parser</artifactId>
-                    <version>to_be_replaced_by_ignite_version</version>
-                </dependency>
             </dependencies>
 
             <build>
diff --git a/examples/pom-standalone.xml b/examples/pom-standalone.xml
index 33e7817..5c1a08d 100644
--- a/examples/pom-standalone.xml
+++ b/examples/pom-standalone.xml
@@ -111,12 +111,6 @@
         </dependency>
 
         <dependency>
-            <groupId>org.apache.ignite</groupId>
-            <artifactId>ignite-ml-tensorflow-model-parser</artifactId>
-            <version>to_be_replaced_by_ignite_version</version>
-        </dependency>
-
-        <dependency>
             <groupId>commons-cli</groupId>
             <artifactId>commons-cli</artifactId>
             <version>1.2</version>
@@ -155,12 +149,6 @@
                     <artifactId>ignite-spark</artifactId>
                     <version>to_be_replaced_by_ignite_version</version>
                 </dependency>
-
-                <dependency>
-                    <groupId>org.apache.ignite</groupId>
-                    <artifactId>ignite-ml-mleap-model-parser</artifactId>
-                    <version>to_be_replaced_by_ignite_version</version>
-                </dependency>
             </dependencies>
 
             <build>
@@ -249,12 +237,6 @@
                     <artifactId>ignite-spark-2.4</artifactId>
                     <version>to_be_replaced_by_ignite_version</version>
                 </dependency>
-
-                <dependency>
-                    <groupId>org.apache.ignite</groupId>
-                    <artifactId>ignite-ml-mleap-model-parser</artifactId>
-                    <version>to_be_replaced_by_ignite_version</version>
-                </dependency>
             </dependencies>
 
             <build>
diff --git a/examples/pom.xml b/examples/pom.xml
index 55f2d4b..3e32690 100644
--- a/examples/pom.xml
+++ b/examples/pom.xml
@@ -102,12 +102,6 @@
         </dependency>
 
         <dependency>
-            <groupId>org.apache.ignite</groupId>
-            <artifactId>ignite-ml-tensorflow-model-parser</artifactId>
-            <version>${project.version}</version>
-        </dependency>
-
-        <dependency>
             <groupId>commons-cli</groupId>
             <artifactId>commons-cli</artifactId>
             <version>1.2</version>
@@ -208,12 +202,6 @@
                     <artifactId>ignite-spark</artifactId>
                     <version>${project.version}</version>
                 </dependency>
-
-                <dependency>
-                    <groupId>org.apache.ignite</groupId>
-                    <artifactId>ignite-ml-mleap-model-parser</artifactId>
-                    <version>${project.version}</version>
-                </dependency>
             </dependencies>
 
             <build>
@@ -287,12 +275,6 @@
                     <artifactId>ignite-spark-2.4</artifactId>
                     <version>${project.version}</version>
                 </dependency>
-
-                <dependency>
-                    <groupId>org.apache.ignite</groupId>
-                    <artifactId>ignite-ml-mleap-model-parser</artifactId>
-                    <version>${project.version}</version>
-                </dependency>
             </dependencies>
 
             <build>
diff --git a/examples/src/main/java/org/apache/ignite/examples/ml/clustering/CustomersClusterizationExample.java b/examples/src/main/java/org/apache/ignite/examples/ml/clustering/CustomersClusterizationExample.java
index ec2f3cc..5c0b8b1 100644
--- a/examples/src/main/java/org/apache/ignite/examples/ml/clustering/CustomersClusterizationExample.java
+++ b/examples/src/main/java/org/apache/ignite/examples/ml/clustering/CustomersClusterizationExample.java
@@ -27,6 +27,8 @@
 import org.apache.ignite.Ignition;
 import org.apache.ignite.cache.query.QueryCursor;
 import org.apache.ignite.cache.query.ScanQuery;
+import org.apache.ignite.examples.ml.util.MLSandboxDatasets;
+import org.apache.ignite.examples.ml.util.SandboxMLCache;
 import org.apache.ignite.lang.IgniteBiPredicate;
 import org.apache.ignite.ml.clustering.kmeans.KMeansModel;
 import org.apache.ignite.ml.clustering.kmeans.KMeansTrainer;
@@ -38,8 +40,6 @@
 import org.apache.ignite.ml.selection.split.TrainTestDatasetSplitter;
 import org.apache.ignite.ml.selection.split.TrainTestSplit;
 import org.apache.ignite.ml.structures.LabeledVector;
-import org.apache.ignite.ml.util.MLSandboxDatasets;
-import org.apache.ignite.ml.util.SandboxMLCache;
 
 /**
  * Example of using KMeans clusterization to determine the optimal count of clusters in data.
@@ -88,7 +88,8 @@
                 }
             }
             finally {
-                dataCache.destroy();
+                if (dataCache != null)
+                    dataCache.destroy();
             }
         }
         finally {
diff --git a/examples/src/main/java/org/apache/ignite/examples/ml/clustering/GmmClusterizationExample.java b/examples/src/main/java/org/apache/ignite/examples/ml/clustering/GmmClusterizationExample.java
index fa71eea..549f294 100644
--- a/examples/src/main/java/org/apache/ignite/examples/ml/clustering/GmmClusterizationExample.java
+++ b/examples/src/main/java/org/apache/ignite/examples/ml/clustering/GmmClusterizationExample.java
@@ -108,7 +108,8 @@
                 System.out.println(">>>");
             }
             finally {
-                dataCache.destroy();
+                if (dataCache != null)
+                    dataCache.destroy();
             }
         }
         finally {
diff --git a/examples/src/main/java/org/apache/ignite/examples/ml/clustering/KMeansClusterizationExample.java b/examples/src/main/java/org/apache/ignite/examples/ml/clustering/KMeansClusterizationExample.java
index 24b1b5c..beee4f6 100644
--- a/examples/src/main/java/org/apache/ignite/examples/ml/clustering/KMeansClusterizationExample.java
+++ b/examples/src/main/java/org/apache/ignite/examples/ml/clustering/KMeansClusterizationExample.java
@@ -24,14 +24,14 @@
 import org.apache.ignite.Ignition;
 import org.apache.ignite.cache.query.QueryCursor;
 import org.apache.ignite.cache.query.ScanQuery;
+import org.apache.ignite.examples.ml.util.MLSandboxDatasets;
+import org.apache.ignite.examples.ml.util.SandboxMLCache;
 import org.apache.ignite.ml.clustering.kmeans.KMeansModel;
 import org.apache.ignite.ml.clustering.kmeans.KMeansTrainer;
 import org.apache.ignite.ml.dataset.feature.extractor.Vectorizer;
 import org.apache.ignite.ml.dataset.feature.extractor.impl.DummyVectorizer;
 import org.apache.ignite.ml.math.Tracer;
 import org.apache.ignite.ml.math.primitives.vector.Vector;
-import org.apache.ignite.ml.util.MLSandboxDatasets;
-import org.apache.ignite.ml.util.SandboxMLCache;
 
 /**
  * Run KMeans clustering algorithm ({@link KMeansTrainer}) over distributed dataset.
@@ -97,7 +97,8 @@
                 }
             }
             finally {
-                dataCache.destroy();
+                if (dataCache != null)
+                    dataCache.destroy();
             }
         }
         finally {
diff --git a/examples/src/main/java/org/apache/ignite/examples/ml/environment/TrainingWithCustomPreprocessorsExample.java b/examples/src/main/java/org/apache/ignite/examples/ml/environment/TrainingWithCustomPreprocessorsExample.java
index 6cd0851..878fe3c 100644
--- a/examples/src/main/java/org/apache/ignite/examples/ml/environment/TrainingWithCustomPreprocessorsExample.java
+++ b/examples/src/main/java/org/apache/ignite/examples/ml/environment/TrainingWithCustomPreprocessorsExample.java
@@ -20,6 +20,8 @@
 import org.apache.ignite.Ignite;
 import org.apache.ignite.IgniteCache;
 import org.apache.ignite.Ignition;
+import org.apache.ignite.examples.ml.util.MLSandboxDatasets;
+import org.apache.ignite.examples.ml.util.SandboxMLCache;
 import org.apache.ignite.ml.dataset.DatasetBuilder;
 import org.apache.ignite.ml.dataset.feature.extractor.Vectorizer;
 import org.apache.ignite.ml.dataset.feature.extractor.impl.DummyVectorizer;
@@ -37,8 +39,6 @@
 import org.apache.ignite.ml.selection.scoring.metric.MetricName;
 import org.apache.ignite.ml.structures.LabeledVector;
 import org.apache.ignite.ml.tree.DecisionTreeClassificationTrainer;
-import org.apache.ignite.ml.util.MLSandboxDatasets;
-import org.apache.ignite.ml.util.SandboxMLCache;
 
 /**
  * This example demonstrates an ability of using custom client classes in cluster in case of absence of these classes on
@@ -58,40 +58,49 @@
      */
     public static void main(String[] args) throws Exception {
         try (Ignite ignite = Ignition.start("examples/config/example-ignite.xml")) {
-            IgniteCache<Integer, Vector> trainingSet = new SandboxMLCache(ignite)
-                .fillCacheWith(MLSandboxDatasets.BOSTON_HOUSE_PRICES);
+            IgniteCache<Integer, Vector> trainingSet = null;
+            try {
+                trainingSet = new SandboxMLCache(ignite).fillCacheWith(MLSandboxDatasets.BOSTON_HOUSE_PRICES);
 
-            Vectorizer<Integer, Vector, Integer, Double> basicVectorizer = new DummyVectorizer<Integer>()
-                .labeled(Vectorizer.LabelCoordinate.FIRST);
+                Vectorizer<Integer, Vector, Integer, Double> basicVectorizer = new DummyVectorizer<Integer>()
+                    .labeled(Vectorizer.LabelCoordinate.FIRST);
 
-            Preprocessor<Integer, Vector> imputingPreprocessor = new ImputerTrainer<Integer, Vector>()
-                .fit(ignite, trainingSet, basicVectorizer);
+                Preprocessor<Integer, Vector> imputingPreprocessor = new ImputerTrainer<Integer, Vector>()
+                    .fit(ignite, trainingSet, basicVectorizer);
 
-            // In-place definition of custom preprocessor by lambda expression.
-            Preprocessor<Integer, Vector> customPreprocessor = (k, v) -> {
-                LabeledVector res = imputingPreprocessor.apply(k, v);
-                double fifthFeature = res.features().get(5);
+                // In-place definition of custom preprocessor by lambda expression.
+                Preprocessor<Integer, Vector> customPreprocessor = (k, v) -> {
+                    LabeledVector res = imputingPreprocessor.apply(k, v);
+                    double fifthFeature = res.features().get(5);
 
-                Vector updatedVector = res.features().set(5, fifthFeature > 0 ? Math.log(fifthFeature) : -1);
-                return updatedVector.labeled(res.label());
-            };
+                    Vector updatedVector = res.features().set(5, fifthFeature > 0 ? Math.log(fifthFeature) : -1);
+                    return updatedVector.labeled(res.label());
+                };
 
-            Vectorizer9000 customVectorizer = new Vectorizer9000(customPreprocessor);
+                Vectorizer9000 customVectorizer = new Vectorizer9000(customPreprocessor);
 
-            PipelineMdl<Integer, Vector> mdl = new Pipeline<Integer, Vector, Integer, Double>()
-                .addVectorizer(customVectorizer)
-                .addPreprocessingTrainer(new MinMaxScalerTrainer<Integer, Vector>())
-                .addPreprocessingTrainer(new NormalizationTrainer<Integer, Vector>().withP(1))
-                .addPreprocessingTrainer(getCustomTrainer())
-                .addTrainer(new DecisionTreeClassificationTrainer(5, 0))
-                .fit(ignite, trainingSet);
+                PipelineMdl<Integer, Vector> mdl = new Pipeline<Integer, Vector, Integer, Double>()
+                    .addVectorizer(customVectorizer)
+                    .addPreprocessingTrainer(new MinMaxScalerTrainer<Integer, Vector>())
+                    .addPreprocessingTrainer(new NormalizationTrainer<Integer, Vector>().withP(1))
+                    .addPreprocessingTrainer(getCustomTrainer())
+                    .addTrainer(new DecisionTreeClassificationTrainer(5, 0))
+                    .fit(ignite, trainingSet);
 
-            System.out.println(">>> Perform scoring.");
-            double score = Evaluator.evaluate(trainingSet,
-                mdl, mdl.getPreprocessor(), MetricName.R2
-            );
+                System.out.println(">>> Perform scoring.");
+                double score = Evaluator.evaluate(trainingSet,
+                    mdl, mdl.getPreprocessor(), MetricName.R2
+                );
 
-            System.out.println(">>> R^2 score: " + score);
+                System.out.println(">>> R^2 score: " + score);
+            }
+            finally {
+                if (trainingSet != null)
+                    trainingSet.destroy();
+            }
+        }
+        finally {
+            System.out.flush();
         }
     }
 
diff --git a/examples/src/main/java/org/apache/ignite/examples/ml/genetic/change/Coin.java b/examples/src/main/java/org/apache/ignite/examples/ml/genetic/change/Coin.java
deleted file mode 100644
index 2ce5dbb..0000000
--- a/examples/src/main/java/org/apache/ignite/examples/ml/genetic/change/Coin.java
+++ /dev/null
@@ -1,111 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package org.apache.ignite.examples.ml.genetic.change;
-
-import java.io.Serializable;
-
-/**
- * POJO to model a coin.
- */
-public class Coin implements Serializable {
-    /**
-     * Define Coin Type.
-     */
-    public enum CoinType {
-        /**
-         *
-         */
-        PENNY,
-        /**
-         *
-         */
-        QUARTER,
-        /**
-         *
-         */
-        NICKEL,
-        /**
-         *
-         */
-        DIME
-    }
-
-    /**
-     * Number of coins.
-     */
-    private int numOfCoins;
-
-    /**
-     * Coin type.
-     */
-    private CoinType coinType;
-
-    /**
-     * Create instance.
-     *
-     * @param coinType   Type of coin.
-     * @param numOfCoins Number of coins.
-     */
-    Coin(CoinType coinType, int numOfCoins) {
-        this.coinType = coinType;
-        this.numOfCoins = numOfCoins;
-    }
-
-    /**
-     * Retrieve the number of coins.
-     *
-     * @return Number of coins.
-     */
-    public int getNumOfCoins() {
-        return numOfCoins;
-    }
-
-    /**
-     * Set the number of coins.
-     *
-     * @param numOfCoins Number of coins.
-     */
-    public void setNumOfCoins(int numOfCoins) {
-        this.numOfCoins = numOfCoins;
-    }
-
-    /**
-     * Retrieve Coin type.
-     *
-     * @return Coin type.
-     */
-    public CoinType getCoinType() {
-        return coinType;
-    }
-
-    /**
-     * Set Coin type.
-     *
-     * @param coinType Coin type.
-     */
-    public void setCoinType(CoinType coinType) {
-        this.coinType = coinType;
-    }
-
-    /**
-     * {@inheritDoc}
-     */
-    @Override public String toString() {
-        return "Coin [numOfCoins=" + numOfCoins + ", coinType=" + coinType + "]";
-    }
-}
diff --git a/examples/src/main/java/org/apache/ignite/examples/ml/genetic/change/OptimizeMakeChangeFitnessFunction.java b/examples/src/main/java/org/apache/ignite/examples/ml/genetic/change/OptimizeMakeChangeFitnessFunction.java
deleted file mode 100644
index 9bcc289..0000000
--- a/examples/src/main/java/org/apache/ignite/examples/ml/genetic/change/OptimizeMakeChangeFitnessFunction.java
+++ /dev/null
@@ -1,95 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package org.apache.ignite.examples.ml.genetic.change;
-
-import java.util.List;
-import org.apache.ignite.ml.genetic.Gene;
-import org.apache.ignite.ml.genetic.IFitnessFunction;
-
-/**
- * This example demonstrates how to create a {@link IFitnessFunction}.
- * <p>
- * Your fitness function will vary depending on your particular use case. For this fitness function, we simply want to
- * calculate the value of an individual solution relative to other solutions.</p>
- */
-public class OptimizeMakeChangeFitnessFunction implements IFitnessFunction {
-    /**
-     * Target amount.
-     */
-    private int targetAmount;
-
-    /**
-     * @param targetAmount Amount of change.
-     */
-    public OptimizeMakeChangeFitnessFunction(int targetAmount) {
-        this.targetAmount = targetAmount;
-    }
-
-    /**
-     * {@inheritDoc}
-     */
-    @Override public double evaluate(List<Gene> genes) {
-        int changeAmount = getAmountOfChange(genes);
-        int totalCoins = getTotalNumberOfCoins(genes);
-        int changeDifference = Math.abs(targetAmount - changeAmount);
-
-        double fitness = (99 - changeDifference);
-
-        if (changeAmount == targetAmount)
-            fitness += 100 - (10 * totalCoins);
-
-        return fitness;
-    }
-
-    /**
-     * Calculate amount of change.
-     *
-     * @param genes List of genes.
-     * @return Amount of change.
-     */
-    private int getAmountOfChange(List<Gene> genes) {
-        Gene quarterGene = genes.get(0);
-        Gene dimeGene = genes.get(1);
-        Gene nickelGene = genes.get(2);
-        Gene pennyGene = genes.get(3);
-
-        int numQuarters = ((Coin)quarterGene.getVal()).getNumOfCoins();
-        int numDimes = ((Coin)dimeGene.getVal()).getNumOfCoins();
-        int numNickels = ((Coin)nickelGene.getVal()).getNumOfCoins();
-        int numPennies = ((Coin)pennyGene.getVal()).getNumOfCoins();
-
-        return (numQuarters * 25) + (numDimes * 10) + (numNickels * 5) + numPennies;
-    }
-
-    /**
-     * Return the total number of coins.
-     *
-     * @param genes List of genes.
-     * @return Number of coins.
-     */
-    private int getTotalNumberOfCoins(List<Gene> genes) {
-        int totalNumOfCoins = 0;
-
-        for (Gene gene : genes) {
-            int numOfCoins = ((Coin)gene.getVal()).getNumOfCoins();
-            totalNumOfCoins += numOfCoins;
-        }
-
-        return totalNumOfCoins;
-    }
-}
diff --git a/examples/src/main/java/org/apache/ignite/examples/ml/genetic/change/OptimizeMakeChangeGAExample.java b/examples/src/main/java/org/apache/ignite/examples/ml/genetic/change/OptimizeMakeChangeGAExample.java
deleted file mode 100644
index e9415e0..0000000
--- a/examples/src/main/java/org/apache/ignite/examples/ml/genetic/change/OptimizeMakeChangeGAExample.java
+++ /dev/null
@@ -1,203 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package org.apache.ignite.examples.ml.genetic.change;
-
-import java.util.ArrayList;
-import java.util.List;
-import org.apache.ignite.Ignite;
-import org.apache.ignite.Ignition;
-import org.apache.ignite.ml.genetic.Chromosome;
-import org.apache.ignite.ml.genetic.GAGrid;
-import org.apache.ignite.ml.genetic.Gene;
-import org.apache.ignite.ml.genetic.parameter.ChromosomeCriteria;
-import org.apache.ignite.ml.genetic.parameter.GAConfiguration;
-import org.apache.ignite.ml.genetic.parameter.GAGridConstants;
-
-/**
- * This example demonstrates how to use the {@link GAGrid} framework. It is inspired by
- * <a href="https://github.com/martin-steghoefer/jgap/blob/master/examples/src/examples/MinimizingMakeChange.java">
- * JGAP's "Minimize Make Change"</a> example.
- * <p>
- * In this example, the objective is to calculate the minimum number of coins that equal user specified amount of change
- * ie: {@code -DAMOUNTCHANGE}.</p>
- * <p>
- * {@code mvn exec:java -Dexec.mainClass="org.apache.ignite.examples.ml.genetic.change.OptimizeMakeChangeGAExample"
- * -DAMOUNTCHANGE=75}</p>
- * <p>
- * Code in this example launches Ignite grid, prepares simple test data (gene pool) and configures GA grid.</p>
- * <p>
- * After that it launches the process of evolution on GA grid and outputs the progress and results.</p>
- * <p>
- * You can change the test data and parameters of GA grid used in this example and re-run it to explore this
- * functionality further.</p>
- * <p>
- * Remote nodes should always be started with special configuration file which enables P2P class loading: {@code
- * 'ignite.{sh|bat} examples/config/example-ignite.xml'}.</p>
- * <p>
- * Alternatively you can run ExampleNodeStartup in another JVM which will start node with {@code
- * examples/config/example-ignite.xml} configuration.</p>
- */
-public class OptimizeMakeChangeGAExample {
-    /**
-     * Executes example.
-     * <p>
-     * Specify value for {@code -DAMOUNTCHANGE} JVM system variable.
-     *
-     * @param args Command line arguments, none required.
-     */
-    public static void main(String args[]) {
-        System.out.println(">>> OptimizeMakeChange GA grid example started.");
-
-        String sAmountChange = "75";
-
-        StringBuilder sbErrorMsg = new StringBuilder();
-        sbErrorMsg.append("AMOUNTCHANGE System property not set. Please provide a valid value between 1 and 99. ");
-        sbErrorMsg.append(" ");
-        sbErrorMsg.append("IE: -DAMOUNTCHANGE=75");
-        sbErrorMsg.append("\n");
-        sbErrorMsg.append("Using default value: 75");
-
-        //Check if -DAMOUNTCHANGE JVM system variable is provided.
-        if (System.getProperty("AMOUNTCHANGE") == null)
-            System.out.println(sbErrorMsg);
-        else
-            sAmountChange = System.getProperty("AMOUNTCHANGE");
-
-        try {
-            // Create an Ignite instance as you would in any other use case.
-            Ignite ignite = Ignition.start("examples/config/example-ignite.xml");
-
-            // Create GAConfiguration.
-            GAConfiguration gaCfg = new GAConfiguration();
-
-            // Set Gene Pool.
-            List<Gene> genes = getGenePool();
-
-            // Set selection method.
-            gaCfg.setSelectionMtd(GAGridConstants.SELECTION_METHOD.SELECTION_METHOD_ELITISM);
-            gaCfg.setElitismCnt(10);
-
-            // Set the Chromosome Length to '4' since we have 4 coins.
-            gaCfg.setChromosomeLen(4);
-
-            // Set population size.
-            gaCfg.setPopulationSize(500);
-
-            // Initialize gene pool.
-            gaCfg.setGenePool(genes);
-
-            // Set Truncate Rate.
-            gaCfg.setTruncateRate(.10);
-
-            // Set Cross Over Rate.
-            gaCfg.setCrossOverRate(.50);
-
-            // Set Mutation Rate.
-            gaCfg.setMutationRate(.50);
-
-            // Create and set Fitness function.
-            OptimizeMakeChangeFitnessFunction function = new OptimizeMakeChangeFitnessFunction(new Integer(sAmountChange));
-            gaCfg.setFitnessFunction(function);
-
-            // Create and set TerminateCriteria.
-            OptimizeMakeChangeTerminateCriteria termCriteria = new OptimizeMakeChangeTerminateCriteria(ignite,
-                System.out::println);
-
-            ChromosomeCriteria chromosomeCriteria = new ChromosomeCriteria();
-
-            List<String> values = new ArrayList<>();
-
-            values.add("coinType=QUARTER");
-            values.add("coinType=DIME");
-            values.add("coinType=NICKEL");
-            values.add("coinType=PENNY");
-
-            chromosomeCriteria.setCriteria(values);
-
-            gaCfg.setChromosomeCriteria(chromosomeCriteria);
-            gaCfg.setTerminateCriteria(termCriteria);
-
-            // Initialize GAGrid.
-            GAGrid gaGrid = new GAGrid(gaCfg, ignite);
-
-            System.out.println("##########################################################################################");
-
-            System.out.println("Calculating optimal set of coins where amount of change is " + sAmountChange);
-
-            System.out.println("##########################################################################################");
-
-            Chromosome chromosome = gaGrid.evolve();
-
-            System.out.println(">>> Evolution result: " + chromosome);
-
-            Ignition.stop(true);
-
-            System.out.println(">>> OptimizeMakeChange GA grid example completed.");
-        }
-        catch (Exception e) {
-            System.out.println(e.getMessage());
-            e.printStackTrace();
-        }
-    }
-
-    /**
-     * Helper routine to initialize Gene pool.
-     * <p>
-     * In typical use case genes may be stored in database.
-     *
-     * @return List of Genes.
-     */
-    private static List<Gene> getGenePool() {
-        List<Gene> list = new ArrayList<>();
-
-        Gene quarterGene1 = new Gene(new Coin(Coin.CoinType.QUARTER, 3));
-        Gene quarterGene2 = new Gene(new Coin(Coin.CoinType.QUARTER, 2));
-        Gene quarterGene3 = new Gene(new Coin(Coin.CoinType.QUARTER, 1));
-        Gene quarterGene4 = new Gene(new Coin(Coin.CoinType.QUARTER, 0));
-
-        Gene dimeGene1 = new Gene(new Coin(Coin.CoinType.DIME, 2));
-        Gene dimeGene2 = new Gene(new Coin(Coin.CoinType.DIME, 1));
-        Gene dimeGene3 = new Gene(new Coin(Coin.CoinType.DIME, 0));
-
-        Gene nickelGene1 = new Gene(new Coin(Coin.CoinType.NICKEL, 1));
-        Gene nickelGene2 = new Gene(new Coin(Coin.CoinType.NICKEL, 0));
-
-        Gene pennyGene1 = new Gene(new Coin(Coin.CoinType.PENNY, 4));
-        Gene pennyGene2 = new Gene(new Coin(Coin.CoinType.PENNY, 3));
-        Gene pennyGene3 = new Gene(new Coin(Coin.CoinType.PENNY, 2));
-        Gene pennyGene4 = new Gene(new Coin(Coin.CoinType.PENNY, 1));
-        Gene pennyGene5 = new Gene(new Coin(Coin.CoinType.PENNY, 0));
-
-        list.add(quarterGene1);
-        list.add(quarterGene2);
-        list.add(quarterGene3);
-        list.add(quarterGene4);
-        list.add(dimeGene1);
-        list.add(dimeGene2);
-        list.add(dimeGene3);
-        list.add(nickelGene1);
-        list.add(nickelGene2);
-        list.add(pennyGene1);
-        list.add(pennyGene2);
-        list.add(pennyGene3);
-        list.add(pennyGene4);
-        list.add(pennyGene5);
-
-        return list;
-    }
-}
diff --git a/examples/src/main/java/org/apache/ignite/examples/ml/genetic/change/OptimizeMakeChangeTerminateCriteria.java b/examples/src/main/java/org/apache/ignite/examples/ml/genetic/change/OptimizeMakeChangeTerminateCriteria.java
deleted file mode 100644
index 267d334..0000000
--- a/examples/src/main/java/org/apache/ignite/examples/ml/genetic/change/OptimizeMakeChangeTerminateCriteria.java
+++ /dev/null
@@ -1,91 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package org.apache.ignite.examples.ml.genetic.change;
-
-import java.util.List;
-import java.util.function.Consumer;
-import org.apache.ignite.Ignite;
-import org.apache.ignite.ml.genetic.Chromosome;
-import org.apache.ignite.ml.genetic.Gene;
-import org.apache.ignite.ml.genetic.parameter.ITerminateCriteria;
-import org.apache.ignite.ml.genetic.utils.GAGridUtils;
-
-/**
- * Terminate Condition implementation for {@link OptimizeMakeChangeGAExample}.
- */
-public class OptimizeMakeChangeTerminateCriteria implements ITerminateCriteria {
-    /**
-     *
-     */
-    private final Ignite ignite;
-
-    /**
-     *
-     */
-    private final Consumer<String> logConsumer;
-
-    /**
-     * Create class instance.
-     *
-     * @param ignite      Ignite instance.
-     * @param logConsumer Logging consumer.
-     */
-    OptimizeMakeChangeTerminateCriteria(Ignite ignite, Consumer<String> logConsumer) {
-        this.ignite = ignite;
-        this.logConsumer = logConsumer;
-    }
-
-    /**
-     * {@inheritDoc}
-     */
-    @Override public boolean isTerminationConditionMet(Chromosome fittestChromosome, double averageFitnessScore,
-        int currGeneration) {
-        boolean isTerminate = true;
-
-        logConsumer.accept(
-            "\n##########################################################################################"
-                + "\n Generation: " + currGeneration
-                + "\n Fittest is Chromosome Key: " + fittestChromosome
-                + "\n Chromosome: " + fittestChromosome
-                + "\n" + reportCoins(GAGridUtils.getGenesInOrderForChromosome(ignite, fittestChromosome))
-                + "\nAvg Chromosome Fitness: " + averageFitnessScore
-                + "\n##########################################################################################");
-
-        if (!(currGeneration > 5))
-            isTerminate = false;
-
-        return isTerminate;
-    }
-
-    /**
-     * Helper to print change details.
-     *
-     * @param genes List if Genes.
-     * @return Details to print.
-     */
-    private String reportCoins(List<Gene> genes) {
-        StringBuilder sb = new StringBuilder();
-
-        for (Gene gene : genes) {
-            sb.append("\nCoin Type: ").append(((Coin)gene.getVal()).getCoinType().toString())
-                .append("\nNumber of Coins: ").append(((Coin)gene.getVal()).getNumOfCoins());
-        }
-
-        return sb.toString();
-    }
-}
diff --git a/examples/src/main/java/org/apache/ignite/examples/ml/genetic/helloworld/HelloWorldFitnessFunction.java b/examples/src/main/java/org/apache/ignite/examples/ml/genetic/helloworld/HelloWorldFitnessFunction.java
deleted file mode 100644
index 9311b78..0000000
--- a/examples/src/main/java/org/apache/ignite/examples/ml/genetic/helloworld/HelloWorldFitnessFunction.java
+++ /dev/null
@@ -1,49 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package org.apache.ignite.examples.ml.genetic.helloworld;
-
-import java.util.List;
-import org.apache.ignite.ml.genetic.Gene;
-import org.apache.ignite.ml.genetic.IFitnessFunction;
-
-/**
- * This example demonstrates how to create a {@link IFitnessFunction}.
- * <p>
- * Your fitness function will vary depending on your particular use case. For this fitness function, we simply want to
- * calculate the value of an individual solution relative to other solutions.
- * <p>
- * To do this, we increase fitness score by '1' for each character that is in correct position.</p>
- * <p>
- * For our solution, genetic algorithm will continue until we achieve a fitness score of '11', as 'HELLO WORLD' contains
- * 11 characters.</p>
- */
-public class HelloWorldFitnessFunction implements IFitnessFunction {
-    /**
-     * {@inheritDoc}
-     */
-    @Override public double evaluate(List<Gene> genes) {
-        double matches = 0;
-
-        for (int i = 0; i < genes.size(); i++) {
-            String targetStr = "HELLO WORLD";
-            if (genes.get(i).getVal().equals(targetStr.charAt(i)))
-                matches += 1;
-        }
-        return matches;
-    }
-}
diff --git a/examples/src/main/java/org/apache/ignite/examples/ml/genetic/helloworld/HelloWorldGAExample.java b/examples/src/main/java/org/apache/ignite/examples/ml/genetic/helloworld/HelloWorldGAExample.java
deleted file mode 100644
index 5a9ac62..0000000
--- a/examples/src/main/java/org/apache/ignite/examples/ml/genetic/helloworld/HelloWorldGAExample.java
+++ /dev/null
@@ -1,146 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package org.apache.ignite.examples.ml.genetic.helloworld;
-
-import java.util.ArrayList;
-import java.util.List;
-import java.util.concurrent.atomic.AtomicInteger;
-import org.apache.ignite.Ignite;
-import org.apache.ignite.Ignition;
-import org.apache.ignite.ml.genetic.Chromosome;
-import org.apache.ignite.ml.genetic.GAGrid;
-import org.apache.ignite.ml.genetic.Gene;
-import org.apache.ignite.ml.genetic.parameter.GAConfiguration;
-import org.apache.ignite.ml.genetic.parameter.GAGridConstants;
-
-/**
- * This example demonstrates how to use the {@link GAGrid} framework. In this example, we want to evolve a string of 11
- * characters such that the word 'HELLO WORLD' is found.
- * <p>
- * Code in this example launches Ignite grid, prepares simple test data (gene pool) and configures GA grid.</p>
- * <p>
- * After that it launches the process of evolution on GA grid and outputs the progress and results.</p>
- * <p>
- * You can change the test data and parameters of GA grid used in this example and re-run it to explore this
- * functionality further.</p>
- * <p>
- * For example, you may change the some basic genetic parameters on the GAConfiguration object:
- * <p>
- * Mutation Rate Crossover Rate Population Size Selection Method
- *
- * <p>
- * How to run from command line:</p>
- * <p>
- * {@code mvn exec:java -Dexec.mainClass="org.apache.ignite.examples.ml.genetic.helloworld.HelloWorldGAExample"}</p>
- * <p>
- * Remote nodes should always be started with special configuration file which enables P2P class loading: {@code
- * 'ignite.{sh|bat} examples/config/example-ignite.xml'}.</p>
- * <p>
- * Alternatively you can run ExampleNodeStartup in another JVM which will start node with {@code
- * examples/config/example-ignite.xml} configuration.</p>
- */
-public class HelloWorldGAExample {
-    /**
-     * Executes example.
-     *
-     * @param args Command line arguments, none required.
-     */
-    public static void main(String args[]) {
-        System.out.println(">>> HelloWorld GA grid example started.");
-
-        try {
-            // Create an Ignite instance as you would in any other use case.
-            Ignite ignite = Ignition.start("examples/config/example-ignite.xml");
-
-            // Create GAConfiguration.
-            GAConfiguration gaCfg = new GAConfiguration();
-
-            // Set Gene Pool.
-            List<Gene> genes = getGenePool();
-
-            // Set the Chromosome Length to '11' since 'HELLO WORLD' contains 11 characters.
-            gaCfg.setChromosomeLen(11);
-
-            // Initialize gene pool.
-            gaCfg.setGenePool(genes);
-
-            // Set CrossOver Rate.
-            gaCfg.setCrossOverRate(.05);
-
-            // Set Mutation Rate.
-            gaCfg.setMutationRate(.05);
-
-            // Set Selection Method.
-            gaCfg.setSelectionMtd(GAGridConstants.SELECTION_METHOD.SELECTION_METHOD_ROULETTE_WHEEL);
-
-            // Set Population Size.
-            gaCfg.setPopulationSize(2000);
-
-            // Create and set Fitness function.
-            HelloWorldFitnessFunction function = new HelloWorldFitnessFunction();
-            gaCfg.setFitnessFunction(function);
-
-            // Create and set TerminateCriteria.
-            AtomicInteger cnt = new AtomicInteger(0);
-            HelloWorldTerminateCriteria termCriteria = new HelloWorldTerminateCriteria(ignite,
-                msg -> {
-                    if (cnt.getAndIncrement() % 20 == 0)
-                        System.out.println(msg);
-                });
-
-            gaCfg.setTerminateCriteria(termCriteria);
-
-            GAGrid gaGrid = new GAGrid(gaCfg, ignite);
-
-            // Evolve the population.
-            Chromosome chromosome = gaGrid.evolve();
-
-            System.out.println(">>> Evolution result: " + chromosome);
-
-            Ignition.stop(true);
-
-            System.out.println(">>> HelloWorld GA grid example completed.");
-        }
-        catch (Exception e) {
-            System.out.println(e.getMessage());
-            e.printStackTrace();
-        }
-    }
-
-    /**
-     * Helper routine to initialize Gene pool.
-     * <p>
-     * In typical use case genes may be stored in database.
-     *
-     * @return List of Gene objects.
-     */
-    private static List<Gene> getGenePool() {
-        List<Gene> list = new ArrayList<>();
-
-        char[] chars = {
-            'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S',
-            'T', 'U', 'V', 'W', 'X', 'Y', 'Z', ' '};
-
-        for (char aChar : chars) {
-            Gene gene = new Gene(aChar);
-            list.add(gene);
-        }
-
-        return list;
-    }
-}
diff --git a/examples/src/main/java/org/apache/ignite/examples/ml/genetic/helloworld/HelloWorldTerminateCriteria.java b/examples/src/main/java/org/apache/ignite/examples/ml/genetic/helloworld/HelloWorldTerminateCriteria.java
deleted file mode 100644
index 66a8374..0000000
--- a/examples/src/main/java/org/apache/ignite/examples/ml/genetic/helloworld/HelloWorldTerminateCriteria.java
+++ /dev/null
@@ -1,91 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package org.apache.ignite.examples.ml.genetic.helloworld;
-
-import java.util.List;
-import java.util.function.Consumer;
-import org.apache.ignite.Ignite;
-import org.apache.ignite.ml.genetic.Chromosome;
-import org.apache.ignite.ml.genetic.Gene;
-import org.apache.ignite.ml.genetic.parameter.ITerminateCriteria;
-import org.apache.ignite.ml.genetic.utils.GAGridUtils;
-
-/**
- * Represents the terminate condition for {@link HelloWorldGAExample}.
- * <p>
- * Class terminates Genetic algorithm when fitness score is more than 10.</p>
- */
-public class HelloWorldTerminateCriteria implements ITerminateCriteria {
-    /**
-     * Ignite instance.
-     */
-    private final Ignite ignite;
-
-    /**
-     *
-     */
-    private final Consumer<String> logConsumer;
-
-    /**
-     * Create class instance.
-     *
-     * @param ignite      Ignite instance.
-     * @param logConsumer Logging consumer.
-     */
-    HelloWorldTerminateCriteria(Ignite ignite, Consumer<String> logConsumer) {
-        this.ignite = ignite;
-        this.logConsumer = logConsumer;
-    }
-
-    /**
-     * {@inheritDoc}
-     */
-    @Override public boolean isTerminationConditionMet(Chromosome fittestChromosome, double averageFitnessScore,
-        int currGeneration) {
-        boolean isTerminate = true;
-
-        logConsumer.accept(
-            "\n##########################################################################################"
-                + "\n Generation: " + currGeneration
-                + "\n Fittest is Chromosome Key: " + fittestChromosome
-                + "\n Chromosome: " + fittestChromosome
-                + "\n" + printPhrase(GAGridUtils.getGenesInOrderForChromosome(ignite, fittestChromosome))
-                + "\nAvg Chromosome Fitness: " + averageFitnessScore
-                + "\n##########################################################################################");
-
-        if (!(fittestChromosome.getFitnessScore() > 10))
-            isTerminate = false;
-
-        return isTerminate;
-    }
-
-    /**
-     * Helper to print phrase.
-     *
-     * @param genes List of Genes.
-     * @return Phrase to print.
-     */
-    private String printPhrase(List<Gene> genes) {
-        StringBuilder sbPhrase = new StringBuilder();
-
-        for (Gene gene : genes)
-            sbPhrase.append(((Character)gene.getVal()).toString());
-
-        return sbPhrase.toString();
-    }
-}
diff --git a/examples/src/main/java/org/apache/ignite/examples/ml/genetic/knapsack/Item.java b/examples/src/main/java/org/apache/ignite/examples/ml/genetic/knapsack/Item.java
deleted file mode 100644
index 6bf7947..0000000
--- a/examples/src/main/java/org/apache/ignite/examples/ml/genetic/knapsack/Item.java
+++ /dev/null
@@ -1,101 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package org.apache.ignite.examples.ml.genetic.knapsack;
-
-import java.io.Serializable;
-
-/**
- * POJO to model an Item.
- */
-public class Item implements Serializable {
-    /**
-     * Weight of item in lbs.
-     */
-    private double weight;
-
-    /**
-     * Value of item.
-     */
-    private double val;
-
-    /**
-     * Name of item.
-     */
-    private String name;
-
-    /**
-     * Get the weight.
-     *
-     * @return Weight.
-     */
-    public double getWeight() {
-        return weight;
-    }
-
-    /**
-     * Set the weight.
-     *
-     * @param weight Weight.
-     */
-    public void setWeight(double weight) {
-        this.weight = weight;
-    }
-
-    /**
-     * Get the value.
-     *
-     * @return Value.
-     */
-    public double getVal() {
-        return val;
-    }
-
-    /**
-     * Set the value.
-     *
-     * @param val Value.
-     */
-    public void setVal(double val) {
-        this.val = val;
-    }
-
-    /**
-     * Get the name.
-     *
-     * @return Name
-     */
-    public String getName() {
-        return name;
-    }
-
-    /**
-     * Set the name.
-     *
-     * @param name Name.
-     */
-    public void setName(String name) {
-        this.name = name;
-    }
-
-    /**
-     * {@inheritDoc}
-     */
-    @Override public String toString() {
-        return "Item [weight=" + weight + ", value=" + val + ", name=" + name + "]";
-    }
-}
diff --git a/examples/src/main/java/org/apache/ignite/examples/ml/genetic/knapsack/KnapsackFitnessFunction.java b/examples/src/main/java/org/apache/ignite/examples/ml/genetic/knapsack/KnapsackFitnessFunction.java
deleted file mode 100644
index fe3e24d..0000000
--- a/examples/src/main/java/org/apache/ignite/examples/ml/genetic/knapsack/KnapsackFitnessFunction.java
+++ /dev/null
@@ -1,59 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package org.apache.ignite.examples.ml.genetic.knapsack;
-
-import java.util.ArrayList;
-import java.util.List;
-import org.apache.ignite.ml.genetic.Gene;
-import org.apache.ignite.ml.genetic.IFitnessFunction;
-
-/**
- * This example demonstrates how to create a {@link IFitnessFunction}.
- * <p>
- * Your fitness function will vary depending on your particular use case. For this fitness function, we simply want to
- * calculate the weight and value of an individual solution relative to other solutions.</p>
- * <p>
- * To do this, we total the weights and values of all the genes within a chromosome.</p>
- */
-public class KnapsackFitnessFunction implements IFitnessFunction {
-    /**
-     * {@inheritDoc}
-     */
-    @Override public double evaluate(List<Gene> genes) {
-        double val = 0;
-        double weight = 0;
-
-        List<Long> duplicates = new ArrayList<>();
-        int badSolution = 1;
-
-        for (Gene gene : genes) {
-            weight += ((Item)(gene.getVal())).getWeight();
-            val += ((Item)(gene.getVal())).getVal();
-
-            double maximumWeight = 20;
-            if (duplicates.contains(gene.id()) || (weight > maximumWeight)) {
-                badSolution = 0;
-                break;
-            }
-            else
-                duplicates.add(gene.id());
-        }
-
-        return (val * badSolution);
-    }
-}
diff --git a/examples/src/main/java/org/apache/ignite/examples/ml/genetic/knapsack/KnapsackGAExample.java b/examples/src/main/java/org/apache/ignite/examples/ml/genetic/knapsack/KnapsackGAExample.java
deleted file mode 100644
index cd3cdfd4..0000000
--- a/examples/src/main/java/org/apache/ignite/examples/ml/genetic/knapsack/KnapsackGAExample.java
+++ /dev/null
@@ -1,328 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package org.apache.ignite.examples.ml.genetic.knapsack;
-
-import java.util.ArrayList;
-import java.util.List;
-import java.util.concurrent.atomic.AtomicInteger;
-import org.apache.ignite.Ignite;
-import org.apache.ignite.Ignition;
-import org.apache.ignite.ml.genetic.Chromosome;
-import org.apache.ignite.ml.genetic.GAGrid;
-import org.apache.ignite.ml.genetic.Gene;
-import org.apache.ignite.ml.genetic.parameter.GAConfiguration;
-
-/**
- * This example demonstrates how to use the {@link GAGrid} framework. It shows working with Knapsack Problem: Given a
- * set of 30 items, each with a weight and a value, pack 10 items in knapsack so that the total weight is less or equal
- * 20 lbs, and the total value is maximized.
- * <p>
- * Code in this example launches Ignite grid, prepares simple test data (gene pool) and configures GA grid.</p>
- * <p>
- * After that it launches the process of evolution on GA grid and outputs the progress and results.</p>
- * <p>
- * You can change the test data and parameters of GA grid used in this example and re-run it to explore this
- * functionality further.</p>
- * <p>
- * How to run from command line:</p>
- * <p>
- * {@code mvn exec:java -Dexec.mainClass="org.apache.ignite.examples.ml.genetic.knapsack.KnapsackGAExample"}</p>
- * <p>
- * Remote nodes should always be started with special configuration file which enables P2P class loading: {@code
- * 'ignite.{sh|bat} examples/config/example-ignite.xml'}.</p>
- * <p>
- * Alternatively you can run ExampleNodeStartup in another JVM which will start node with {@code
- * examples/config/example-ignite.xml} configuration.</p>
- */
-public class KnapsackGAExample {
-    /**
-     * @param args Command line arguments, none required.
-     */
-    public static void main(String args[]) {
-        System.out.println(">>> Knapsack GA grid example started.");
-
-        try {
-            // Create an Ignite instance as you would in any other use case.
-            Ignite ignite = Ignition.start("examples/config/example-ignite.xml");
-
-            // Create GAConfiguration.
-            GAConfiguration gaCfg = new GAConfiguration();
-
-            // Set Gene Pool.
-            List<Gene> genes = getGenePool();
-
-            // Set the Chromosome Length to '10' since our knapsack may contain a total of 10 items.
-            gaCfg.setChromosomeLen(10);
-
-            // Initialize gene pool.
-            gaCfg.setGenePool(genes);
-
-            // Create and set Fitness function.
-            KnapsackFitnessFunction function = new KnapsackFitnessFunction();
-            gaCfg.setFitnessFunction(function);
-
-            // Create and set TerminateCriteria.
-            AtomicInteger cnt = new AtomicInteger(0);
-            KnapsackTerminateCriteria termCriteria = new KnapsackTerminateCriteria(ignite,
-                msg -> {
-                    if (cnt.getAndIncrement() % 10 == 0)
-                        System.out.println(msg);
-                });
-            gaCfg.setTerminateCriteria(termCriteria);
-
-            GAGrid gaGrid = new GAGrid(gaCfg, ignite);
-
-            // Evolve the population.
-            Chromosome chromosome = gaGrid.evolve();
-
-            System.out.println(">>> Evolution result: " + chromosome);
-
-            Ignition.stop(true);
-
-            System.out.println(">>> Knapsack GA grid example completed.");
-        }
-        catch (Exception e) {
-            System.out.println(e.getMessage());
-            e.printStackTrace();
-        }
-    }
-
-    /**
-     * Helper routine to initialize Gene pool.
-     * <p>
-     * In typical use case genes may be stored in database.
-     *
-     * @return List of Gene objects.
-     */
-    private static List<Gene> getGenePool() {
-        List<Gene> list = new ArrayList<>();
-
-        Item item1 = new Item();
-        item1.setName("Swiss Army Knife");
-        item1.setWeight(0.08125);
-        item1.setVal(15);
-        Gene gene1 = new Gene(item1);
-
-        Item item2 = new Item();
-        item2.setName("Duct Tape");
-        item2.setWeight(1.3);
-        item2.setVal(3);
-        Gene gene2 = new Gene(item2);
-
-        Item item3 = new Item();
-        item3.setName("Rope (50 feet)");
-        item3.setWeight(7);
-        item3.setVal(10);
-        Gene gene3 = new Gene(item3);
-
-        Item item4 = new Item();
-        item4.setName("Satellite phone");
-        item4.setWeight(2);
-        item4.setVal(8);
-        Gene gene4 = new Gene(item4);
-
-        Item item5 = new Item();
-        item5.setName("Elmer's Glue");
-        item5.setWeight(0.25);
-        item5.setVal(2);
-        Gene gene5 = new Gene(item5);
-
-        Item item6 = new Item();
-        item6.setName("Toilet Paper Roll");
-        item6.setWeight(.5);
-        item6.setVal(4);
-        Gene gene6 = new Gene(item6);
-
-        Item item7 = new Item();
-        item7.setName("Binoculars");
-        item7.setWeight(3);
-        item7.setVal(5);
-        Gene gene7 = new Gene(item7);
-
-        Item item8 = new Item();
-        item8.setName("Compass");
-        item8.setWeight(0.0573202);
-        item8.setVal(15);
-        Gene gene8 = new Gene(item8);
-
-        Item item9 = new Item();
-        item9.setName("Jug (pre-filled with water)");
-        item9.setWeight(4);
-        item9.setVal(6);
-        Gene gene9 = new Gene(item9);
-
-        Item item10 = new Item();
-        item10.setName("Flashlight");
-        item10.setWeight(2);
-        item10.setVal(4);
-        Gene gene10 = new Gene(item10);
-
-        Item item11 = new Item();
-        item11.setName("Box of paper clips");
-        item11.setWeight(.9);
-        item11.setVal(2);
-        Gene gene11 = new Gene(item11);
-
-        Item item12 = new Item();
-        item12.setName("Gloves (1 pair)");
-        item12.setWeight(.8125);
-        item12.setVal(3);
-        Gene gene12 = new Gene(item12);
-
-        Item item13 = new Item();
-        item13.setName("Scissors");
-        item13.setWeight(0.2);
-        item13.setVal(2);
-        Gene gene13 = new Gene(item13);
-
-        Item item14 = new Item();
-        item14.setName("Signal Flair (4pk)");
-        item14.setWeight(4);
-        item14.setVal(5);
-        Gene gene14 = new Gene(item14);
-
-        Item item15 = new Item();
-        item15.setName("Water Purifying System");
-        item15.setWeight(0.5125);
-        item15.setVal(4);
-        Gene gene15 = new Gene(item15);
-
-        Item item16 = new Item();
-        item16.setName("Whistle");
-        item16.setWeight(0.075);
-        item16.setVal(2);
-        Gene gene16 = new Gene(item16);
-
-        Item item17 = new Item();
-        item17.setName("Sleeping Bag");
-        item17.setWeight(0.38125);
-        item17.setVal(4);
-        Gene gene17 = new Gene(item17);
-
-        Item item18 = new Item();
-        item18.setName("Insect Repellent");
-        item18.setWeight(1.15);
-        item18.setVal(3);
-        Gene gene18 = new Gene(item18);
-
-        Item item19 = new Item();
-        item19.setName("Trowel");
-        item19.setWeight(0.31875);
-        item19.setVal(3);
-        Gene gene19 = new Gene(item19);
-
-        Item item20 = new Item();
-        item20.setName("Lighter");
-        item20.setWeight(.2);
-        item20.setVal(4);
-        Gene gene20 = new Gene(item20);
-
-        Item item21 = new Item();
-        item21.setName("Safety Horn");
-        item21.setWeight(.21);
-        item21.setVal(3);
-        Gene gene21 = new Gene(item21);
-
-        Item item22 = new Item();
-        item22.setName("Headlamp");
-        item22.setWeight(.8);
-        item22.setVal(4);
-        Gene gene22 = new Gene(item22);
-
-        Item item23 = new Item();
-        item23.setName("Freeze Dried Food Kit");
-        item23.setWeight(2);
-        item23.setVal(6);
-        Gene gene23 = new Gene(item23);
-
-        Item item24 = new Item();
-        item24.setName("Sunscreen");
-        item24.setWeight(.5);
-        item24.setVal(4);
-        Gene gene24 = new Gene(item24);
-
-        Item item25 = new Item();
-        item25.setName("Trekking Pole (Adjustable)");
-        item25.setWeight(1.3);
-        item25.setVal(4);
-        Gene gene25 = new Gene(item25);
-
-        Item item26 = new Item();
-        item26.setName("Counter Assault Bear Spray");
-        item26.setWeight(.5);
-        item26.setVal(4);
-        Gene gene26 = new Gene(item26);
-
-        Item item27 = new Item();
-        item27.setName("Insect Spray");
-        item27.setWeight(.5);
-        item27.setVal(3);
-        Gene gene27 = new Gene(item27);
-
-        Item item28 = new Item();
-        item28.setName("Hand sanitizer");
-        item28.setWeight(.625);
-        item28.setVal(3);
-        Gene gene28 = new Gene(item28);
-
-        Item item29 = new Item();
-        item29.setName("Mirror");
-        item29.setWeight(.5);
-        item29.setVal(3);
-        Gene gene29 = new Gene(item29);
-
-        Item item30 = new Item();
-        item30.setName("First Aid Kit");
-        item30.setWeight(3);
-        item30.setVal(6);
-        Gene gene30 = new Gene(item30);
-
-        list.add(gene1);
-        list.add(gene2);
-        list.add(gene3);
-        list.add(gene4);
-        list.add(gene5);
-        list.add(gene6);
-        list.add(gene7);
-        list.add(gene8);
-        list.add(gene9);
-        list.add(gene10);
-        list.add(gene11);
-        list.add(gene12);
-        list.add(gene13);
-        list.add(gene14);
-        list.add(gene15);
-        list.add(gene16);
-        list.add(gene17);
-        list.add(gene18);
-        list.add(gene19);
-        list.add(gene20);
-        list.add(gene21);
-        list.add(gene22);
-        list.add(gene23);
-        list.add(gene24);
-        list.add(gene25);
-        list.add(gene26);
-        list.add(gene27);
-        list.add(gene28);
-        list.add(gene29);
-        list.add(gene30);
-
-        return list;
-    }
-}
diff --git a/examples/src/main/java/org/apache/ignite/examples/ml/genetic/knapsack/KnapsackTerminateCriteria.java b/examples/src/main/java/org/apache/ignite/examples/ml/genetic/knapsack/KnapsackTerminateCriteria.java
deleted file mode 100644
index 9bbeca5..0000000
--- a/examples/src/main/java/org/apache/ignite/examples/ml/genetic/knapsack/KnapsackTerminateCriteria.java
+++ /dev/null
@@ -1,111 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package org.apache.ignite.examples.ml.genetic.knapsack;
-
-import java.util.List;
-import java.util.function.Consumer;
-import org.apache.ignite.Ignite;
-import org.apache.ignite.ml.genetic.Chromosome;
-import org.apache.ignite.ml.genetic.Gene;
-import org.apache.ignite.ml.genetic.parameter.ITerminateCriteria;
-import org.apache.ignite.ml.genetic.utils.GAGridUtils;
-
-/**
- * Represents the terminate condition for {@link KnapsackGAExample}.
- * <p>
- * Class terminates Genetic algorithm when once GA Grid has performed 30 generations.</p>
- */
-public class KnapsackTerminateCriteria implements ITerminateCriteria {
-    /**
-     * Ignite instance.
-     */
-    private final Ignite ignite;
-
-    /**
-     *
-     */
-    private final Consumer<String> logConsumer;
-
-    /**
-     * Create class instance.
-     *
-     * @param ignite      Ignite instance.
-     * @param logConsumer Logging consumer.
-     */
-    KnapsackTerminateCriteria(Ignite ignite, Consumer<String> logConsumer) {
-        this.ignite = ignite;
-        this.logConsumer = logConsumer;
-    }
-
-    /**
-     * {@inheritDoc}
-     */
-    @Override public boolean isTerminationConditionMet(Chromosome fittestChromosome, double averageFitnessScore,
-        int currGeneration) {
-        boolean isTerminate = true;
-
-        logConsumer.accept(
-            "\n##########################################################################################"
-                + "\n Generation: " + currGeneration
-                + "\n Fittest is Chromosome Key: " + fittestChromosome
-                + "\nTotal value is: " + fittestChromosome.getFitnessScore()
-                + "\nTotal weight is: " + calculateTotalWeight(
-                GAGridUtils.getGenesInOrderForChromosome(ignite, fittestChromosome))
-                + "\nChromosome: " + fittestChromosome
-                + "\n" + reportItems(GAGridUtils.getGenesInOrderForChromosome(ignite, fittestChromosome))
-                + "\n##########################################################################################");
-
-        if (!(currGeneration > 29))
-            isTerminate = false;
-
-        return isTerminate;
-    }
-
-    /**
-     * Calculate total weight.
-     *
-     * @param genes List of Genes.
-     * @return Calculated value.
-     */
-    private double calculateTotalWeight(List<Gene> genes) {
-        double totalWeight = 0;
-        for (Gene gene : genes)
-            totalWeight += ((Item)gene.getVal()).getWeight();
-
-        return totalWeight;
-    }
-
-    /**
-     * Helper to print items in knapsack.
-     *
-     * @param genes List of Genes.
-     * @return Items to print.
-     */
-    private String reportItems(List<Gene> genes) {
-        StringBuilder sb = new StringBuilder();
-
-        for (Gene gene : genes) {
-            sb.append("\n------------------------------------------------------------------------------------------")
-                .append("\nName: ").append(((Item)gene.getVal()).getName())
-                .append("\nWeight: ").append(((Item)gene.getVal()).getWeight())
-                .append("\nValue: ").append(((Item)gene.getVal()).getVal());
-        }
-
-        return sb.toString();
-    }
-}
diff --git a/examples/src/main/java/org/apache/ignite/examples/ml/genetic/movie/Movie.java b/examples/src/main/java/org/apache/ignite/examples/ml/genetic/movie/Movie.java
deleted file mode 100644
index 2aa96d6..0000000
--- a/examples/src/main/java/org/apache/ignite/examples/ml/genetic/movie/Movie.java
+++ /dev/null
@@ -1,148 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package org.apache.ignite.examples.ml.genetic.movie;
-
-import java.util.List;
-
-/**
- * POJO to model a movie.
- */
-public class Movie {
-    /**
-     * Name of movie.
-     */
-    private String name;
-
-    /**
-     * Genre of movie.
-     */
-    private List genre;
-
-    /**
-     * Rating of movie.
-     */
-    private String rating;
-
-    /**
-     * IMDB rating.
-     */
-    private double imdbRating;
-
-    /**
-     * Year of movie.
-     */
-    private String year;
-
-    /**
-     * Get the year.
-     *
-     * @return Year.
-     */
-    public String getYear() {
-        return year;
-    }
-
-    /**
-     * Set the year.
-     *
-     * @param year Year.
-     */
-    public void setYear(String year) {
-        this.year = year;
-    }
-
-    /**
-     * Get the <a href="https://en.wikipedia.org/wiki/IMDb">IMDB rating</a>.
-     *
-     * @return IMDB rating.
-     */
-    public double getImdbRating() {
-        return imdbRating;
-    }
-
-    /**
-     * Set the IMDB rating.
-     *
-     * @param imdbRating IMDB rating.
-     */
-    public void setImdbRating(double imdbRating) {
-        this.imdbRating = imdbRating;
-    }
-
-    /**
-     * Get the name of movie.
-     *
-     * @return Name of movie.
-     */
-    public String getName() {
-        return name;
-    }
-
-    /**
-     * Set the name of movie.
-     *
-     * @param name Movie name.
-     */
-    public void setName(String name) {
-        this.name = name;
-    }
-
-    /**
-     * Get movie genres.
-     *
-     * @return List of genres.
-     */
-    public List getGenre() {
-        return genre;
-    }
-
-    /**
-     * Set the genre.
-     *
-     * @param genre List of genres of movie.
-     */
-    public void setGenre(List genre) {
-        this.genre = genre;
-    }
-
-    /**
-     * Get the rating of the movie.
-     *
-     * @return Movie rating.
-     */
-    public String getRating() {
-        return rating;
-    }
-
-    /**
-     * Set the rating of the movie.
-     *
-     * @param rating Movie rating.
-     */
-    public void setRating(String rating) {
-        this.rating = rating;
-    }
-
-    /**
-     * {@inheritDoc}
-     */
-    @Override public String toString() {
-        return "Movie [name=" + name + ", genre=" + genre + ", rating=" + rating + ", imdbRating=" + imdbRating
-            + ", year=" + year + "]";
-    }
-}
diff --git a/examples/src/main/java/org/apache/ignite/examples/ml/genetic/movie/MovieFitnessFunction.java b/examples/src/main/java/org/apache/ignite/examples/ml/genetic/movie/MovieFitnessFunction.java
deleted file mode 100644
index 197f3b6..0000000
--- a/examples/src/main/java/org/apache/ignite/examples/ml/genetic/movie/MovieFitnessFunction.java
+++ /dev/null
@@ -1,90 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package org.apache.ignite.examples.ml.genetic.movie;
-
-import java.util.ArrayList;
-import java.util.List;
-import org.apache.ignite.ml.genetic.Gene;
-import org.apache.ignite.ml.genetic.IFitnessFunction;
-
-/**
- * This example demonstrates how to create a {@link IFitnessFunction}.
- * <p>
- * Your fitness function will vary depending on your particular use case. For this fitness function, we want to
- * calculate the value of an individual solution relative to other solutions.</p>
- * <p>
- * To do this, we increase fitness score by number of times genre is found in list of movies. In addition, we increase
- * score by fictional IMDB rating.</p>
- * <p>
- * If there are duplicate movies in selection, we automatically apply a '0' fitness score.</p>
- */
-public class MovieFitnessFunction implements IFitnessFunction {
-    /**
-     * Genres.
-     */
-    private List<String> genres;
-
-    /**
-     * Create instance.
-     *
-     * @param genres List of genres.
-     */
-    public MovieFitnessFunction(List<String> genres) {
-        this.genres = genres;
-    }
-
-    /**
-     * {@inheritDoc}
-     */
-    @Override public double evaluate(List<Gene> genes) {
-        double score = 0;
-        List<String> duplicates = new ArrayList<>();
-        int badSolution = 1;
-
-        for (Gene gene : genes) {
-            Movie movie = (Movie)gene.getVal();
-            if (duplicates.contains(movie.getName()))
-                badSolution = 0;
-            else
-                duplicates.add(movie.getName());
-
-            double genreScore = getGenreScore(movie);
-            if (genreScore == 0)
-                badSolution = 0;
-
-            score = (score + movie.getImdbRating()) + (genreScore);
-        }
-        return (score * badSolution);
-    }
-
-    /**
-     * Helper to calculate genre score.
-     *
-     * @param movie Movie.
-     * @return Genre score.
-     */
-    private double getGenreScore(Movie movie) {
-        double genreScore = 0;
-
-        for (String genre : genres) {
-            if (movie.getGenre().contains(genre))
-                genreScore += 1;
-        }
-        return genreScore;
-    }
-}
diff --git a/examples/src/main/java/org/apache/ignite/examples/ml/genetic/movie/MovieGAExample.java b/examples/src/main/java/org/apache/ignite/examples/ml/genetic/movie/MovieGAExample.java
deleted file mode 100644
index 6fb60c9..0000000
--- a/examples/src/main/java/org/apache/ignite/examples/ml/genetic/movie/MovieGAExample.java
+++ /dev/null
@@ -1,269 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package org.apache.ignite.examples.ml.genetic.movie;
-
-import java.util.ArrayList;
-import java.util.List;
-import java.util.StringTokenizer;
-import org.apache.ignite.Ignite;
-import org.apache.ignite.Ignition;
-import org.apache.ignite.ml.genetic.Chromosome;
-import org.apache.ignite.ml.genetic.GAGrid;
-import org.apache.ignite.ml.genetic.Gene;
-import org.apache.ignite.ml.genetic.parameter.GAConfiguration;
-import org.apache.ignite.ml.genetic.parameter.GAGridConstants;
-
-/**
- * In this example, we utilize {@link GAGrid} framework to calculate an optimal set of movies based on our interests in
- * various genres (ie: Action, Comedy, and Romance).
- * <p>
- * Code in this example launches Ignite grid, prepares simple test data (gene pool) and configures GA grid.</p>
- * <p>
- * After that it launches the process of evolution on GA grid and outputs the progress and results.</p>
- * <p>
- * You can change the test data and parameters of GA grid used in this example and re-run it to explore this
- * functionality further.</p>
- * <p>
- * How to run from command line:</p>
- * <p>
- * {@code mvn exec:java -Dexec.mainClass="org.apache.ignite.examples.ml.genetic.movie.MovieGAExample"
- * -DGENRES=Action,Comedy}</p>
- * <p>
- * Remote nodes should always be started with special configuration file which enables P2P class loading: {@code
- * 'ignite.{sh|bat} examples/config/example-ignite.xml'}.</p>
- * <p>
- * Alternatively you can run ExampleNodeStartup in another JVM which will start node with {@code
- * examples/config/example-ignite.xml} configuration.</p>
- */
-public class MovieGAExample {
-    /**
-     * Executes example.
-     * <p>
-     * Specify value for {@code -DGENRES} JVM system variable.
-     *
-     * @param args Command line arguments, none required.
-     */
-    public static void main(String args[]) {
-        System.out.println(">>> Movie GA grid example started.");
-
-        List<String> genres = new ArrayList<>();
-        String sGenres = "Action,Comedy,Romance";
-
-        StringBuffer sbErrorMsg = new StringBuffer();
-        sbErrorMsg.append("GENRES System property not set. Please provide GENRES information.");
-        sbErrorMsg.append(" ");
-        sbErrorMsg.append("IE: -DGENRES=Action,Comedy,Romance");
-        sbErrorMsg.append("\n");
-        sbErrorMsg.append("Using default value: Action,Comedy,Romance");
-
-        if (System.getProperty("GENRES") == null)
-            System.out.println(sbErrorMsg);
-        else
-            sGenres = System.getProperty("GENRES");
-
-        StringTokenizer st = new StringTokenizer(sGenres, ",");
-
-        while (st.hasMoreElements()) {
-            String genre = st.nextToken();
-            genres.add(genre);
-        }
-
-        // Create GAConfiguration.
-        GAConfiguration gaCfg = new GAConfiguration();
-
-        // Set Gene Pool.
-        List<Gene> genes = getGenePool();
-
-        // Define Chromosome.
-        gaCfg.setChromosomeLen(3);
-        gaCfg.setPopulationSize(100);
-        gaCfg.setGenePool(genes);
-        gaCfg.setTruncateRate(.10);
-        gaCfg.setCrossOverRate(.50);
-        gaCfg.setMutationRate(.50);
-        gaCfg.setSelectionMtd(GAGridConstants.SELECTION_METHOD.SELECTION_METHOD_TRUNCATION);
-
-        // Create fitness function.
-        MovieFitnessFunction function = new MovieFitnessFunction(genres);
-
-        // Set fitness function.
-        gaCfg.setFitnessFunction(function);
-
-        try {
-            // Create an Ignite instance as you would in any other use case.
-            Ignite ignite = Ignition.start("examples/config/example-ignite.xml");
-
-            MovieTerminateCriteria termCriteria = new MovieTerminateCriteria(ignite, System.out::println);
-
-            gaCfg.setTerminateCriteria(termCriteria);
-
-            GAGrid gaGrid = new GAGrid(gaCfg, ignite);
-
-            Chromosome chromosome = gaGrid.evolve();
-
-            System.out.println(">>> Evolution result: " + chromosome);
-
-            Ignition.stop(true);
-
-            System.out.println(">>> Movie GA grid example completed.");
-        }
-        catch (Exception e) {
-            System.out.println(e.getMessage());
-            e.printStackTrace();
-        }
-    }
-
-    /**
-     *
-     */
-    private static List<Gene> getGenePool() {
-        List<Gene> list = new ArrayList<>();
-
-        Movie movie1 = new Movie();
-        movie1.setName("The Matrix");
-        movie1.setImdbRating(7);
-        List<String> genre1 = new ArrayList<>();
-        genre1.add("SciFi");
-        genre1.add("Action");
-        movie1.setGenre(genre1);
-        movie1.setRating("PG-13");
-        movie1.setYear("1999");
-
-        Gene gene1 = new Gene(movie1);
-
-        Movie movie2 = new Movie();
-        movie2.setName("The Dark Knight");
-        movie2.setImdbRating(9.6);
-        List<String> genre2 = new ArrayList<>();
-        genre2.add("Action");
-        movie2.setGenre(genre2);
-        movie2.setRating("PG-13");
-        movie2.setYear("2008");
-
-        Gene gene2 = new Gene(movie2);
-
-        Movie movie3 = new Movie();
-        movie3.setName("The Avengers");
-        movie3.setImdbRating(9.6);
-        movie3.setYear("2012");
-
-        List<String> genre3 = new ArrayList<>();
-        genre3.add("Action");
-        movie3.setGenre(genre3);
-        movie3.setRating("PG-13");
-
-        Gene gene3 = new Gene(movie3);
-
-        Movie movie4 = new Movie();
-        movie4.setName("The Hangover");
-        movie4.setImdbRating(7.6);
-        List<String> genre4 = new ArrayList<>();
-        genre4.add("Comedy");
-        movie4.setGenre(genre4);
-        movie4.setRating("R");
-        movie4.setYear("2009");
-
-        Gene gene4 = new Gene(movie4);
-
-        Movie movie5 = new Movie();
-        movie5.setName("The Hangover 2");
-        movie5.setImdbRating(9.6);
-        List<String> genre5 = new ArrayList<>();
-        genre5.add("Comedy");
-        movie5.setGenre(genre5);
-        movie5.setRating("R");
-        movie5.setYear("2012");
-
-        Gene gene5 = new Gene(movie5);
-
-        Movie movie6 = new Movie();
-        movie6.setName("This Means War");
-        movie6.setImdbRating(6.4);
-        List<String> genre6 = new ArrayList<>();
-        genre6.add("Comedy");
-        genre6.add("Action");
-        genre6.add("Romance");
-        movie6.setGenre(genre6);
-        movie6.setRating("PG-13");
-        movie6.setYear("2012");
-
-        Gene gene6 = new Gene(movie6);
-
-        Movie movie7 = new Movie();
-        movie7.setName("Hitch");
-        movie7.setImdbRating(10);
-        List<String> genre7 = new ArrayList<>();
-        genre7.add("Comedy");
-        genre7.add("Romance");
-        movie7.setGenre(genre7);
-        movie7.setRating("PG-13");
-        movie7.setYear("2005");
-
-        Gene gene7 = new Gene(movie7);
-
-        Movie movie8 = new Movie();
-        movie8.setName("21 Jump Street");
-        movie8.setImdbRating(6.7);
-        List<String> genre8 = new ArrayList<>();
-        genre8.add("Comedy");
-        genre8.add("Action");
-        movie8.setGenre(genre8);
-        movie8.setRating("R");
-        movie8.setYear("2012");
-
-        Gene gene8 = new Gene(movie8);
-
-        Movie movie9 = new Movie();
-        movie9.setName("Killers");
-        movie9.setImdbRating(5.1);
-        List<String> genre9 = new ArrayList<>();
-        genre9.add("Comedy");
-        genre9.add("Action");
-        genre9.add("Romance");
-        movie9.setGenre(genre9);
-        movie9.setRating("PG-13");
-        movie9.setYear("2010");
-
-        Gene gene9 = new Gene(movie9);
-
-        Movie movie10 = new Movie();
-        movie10.setName("What to Expect When You're Expecting");
-        movie10.setImdbRating(5.1);
-        List<String> genre10 = new ArrayList<>();
-        genre10.add("Comedy");
-        genre10.add("Romance");
-        movie10.setGenre(genre10);
-        movie10.setRating("PG-13");
-        movie10.setYear("2012");
-
-        Gene gene10 = new Gene(movie10);
-
-        list.add(gene1);
-        list.add(gene2);
-        list.add(gene3);
-        list.add(gene4);
-        list.add(gene5);
-        list.add(gene6);
-        list.add(gene7);
-        list.add(gene8);
-        list.add(gene9);
-        list.add(gene10);
-
-        return list;
-    }
-}
diff --git a/examples/src/main/java/org/apache/ignite/examples/ml/genetic/movie/MovieTerminateCriteria.java b/examples/src/main/java/org/apache/ignite/examples/ml/genetic/movie/MovieTerminateCriteria.java
deleted file mode 100644
index b193b7d..0000000
--- a/examples/src/main/java/org/apache/ignite/examples/ml/genetic/movie/MovieTerminateCriteria.java
+++ /dev/null
@@ -1,94 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package org.apache.ignite.examples.ml.genetic.movie;
-
-import java.util.List;
-import java.util.function.Consumer;
-import org.apache.ignite.Ignite;
-import org.apache.ignite.ml.genetic.Chromosome;
-import org.apache.ignite.ml.genetic.Gene;
-import org.apache.ignite.ml.genetic.parameter.ITerminateCriteria;
-import org.apache.ignite.ml.genetic.utils.GAGridUtils;
-
-/**
- * Represents the terminate condition for {@link MovieGAExample}.
- * <p>
- * Class terminates Genetic algorithm when fitness score is more than 32.</p>
- */
-public class MovieTerminateCriteria implements ITerminateCriteria {
-    /**
-     * Ignite instance.
-     */
-    private final Ignite ignite;
-
-    /**
-     *
-     */
-    private final Consumer<String> logConsumer;
-
-    /**
-     * Create class instance.
-     *
-     * @param ignite      Ignite instance.
-     * @param logConsumer Logging consumer.
-     */
-    MovieTerminateCriteria(Ignite ignite, Consumer<String> logConsumer) {
-        this.ignite = ignite;
-        this.logConsumer = logConsumer;
-
-    }
-
-    /**
-     * {@inheritDoc}
-     */
-    @Override public boolean isTerminationConditionMet(Chromosome fittestChromosome, double averageFitnessScore,
-        int currGeneration) {
-        boolean isTerminate = true;
-
-        logConsumer.accept(
-            "\n##########################################################################################"
-                + "\n Generation: " + currGeneration
-                + "\n Fittest is Chromosome Key: " + fittestChromosome
-                + "\nChromosome: " + fittestChromosome
-                + "\n" + reportMovies(GAGridUtils.getGenesInOrderForChromosome(ignite, fittestChromosome))
-                + "\n##########################################################################################");
-
-        if (!(fittestChromosome.getFitnessScore() > 32))
-            isTerminate = false;
-
-        return isTerminate;
-    }
-
-    /**
-     * Helper to print movies details.
-     *
-     * @param genes List of Genes.
-     * @return Movies details.
-     */
-    private String reportMovies(List<Gene> genes) {
-        StringBuilder sb = new StringBuilder();
-
-        for (Gene gene : genes) {
-            sb.append("\nName: ").append(((Movie)gene.getVal()).getName())
-                .append("\nGenres: ").append(((Movie)gene.getVal()).getGenre().toString())
-                .append("\nIMDB Rating: ").append(((Movie)gene.getVal()).getImdbRating());
-        }
-
-        return sb.toString();
-    }
-}
diff --git a/examples/src/main/java/org/apache/ignite/examples/ml/inference/IgniteModelDistributedInferenceExample.java b/examples/src/main/java/org/apache/ignite/examples/ml/inference/IgniteModelDistributedInferenceExample.java
index 26cf41c..deb7de2 100644
--- a/examples/src/main/java/org/apache/ignite/examples/ml/inference/IgniteModelDistributedInferenceExample.java
+++ b/examples/src/main/java/org/apache/ignite/examples/ml/inference/IgniteModelDistributedInferenceExample.java
@@ -27,6 +27,8 @@
 import org.apache.ignite.cache.query.QueryCursor;
 import org.apache.ignite.cache.query.ScanQuery;
 import org.apache.ignite.examples.ml.regression.linear.LinearRegressionLSQRTrainerExample;
+import org.apache.ignite.examples.ml.util.MLSandboxDatasets;
+import org.apache.ignite.examples.ml.util.SandboxMLCache;
 import org.apache.ignite.ml.dataset.feature.extractor.Vectorizer;
 import org.apache.ignite.ml.dataset.feature.extractor.impl.DummyVectorizer;
 import org.apache.ignite.ml.inference.Model;
@@ -38,8 +40,6 @@
 import org.apache.ignite.ml.math.primitives.vector.Vector;
 import org.apache.ignite.ml.regressions.linear.LinearRegressionLSQRTrainer;
 import org.apache.ignite.ml.regressions.linear.LinearRegressionModel;
-import org.apache.ignite.ml.util.MLSandboxDatasets;
-import org.apache.ignite.ml.util.SandboxMLCache;
 
 /**
  * This example is based on {@link LinearRegressionLSQRTrainerExample}, but to perform inference it uses an approach
@@ -101,7 +101,8 @@
                 System.out.println(">>> Linear regression model over cache based dataset usage example completed.");
             }
             finally {
-                dataCache.destroy();
+                if (dataCache != null)
+                    dataCache.destroy();
             }
         }
         finally {
diff --git a/examples/src/main/java/org/apache/ignite/examples/ml/inference/TensorFlowDistributedInferenceExample.java b/examples/src/main/java/org/apache/ignite/examples/ml/inference/TensorFlowDistributedInferenceExample.java
deleted file mode 100644
index 0d65219..0000000
--- a/examples/src/main/java/org/apache/ignite/examples/ml/inference/TensorFlowDistributedInferenceExample.java
+++ /dev/null
@@ -1,110 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package org.apache.ignite.examples.ml.inference;
-
-import java.io.File;
-import java.io.IOException;
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.List;
-import java.util.Objects;
-import java.util.Random;
-import java.util.concurrent.ExecutionException;
-import java.util.concurrent.Future;
-import org.apache.ignite.Ignite;
-import org.apache.ignite.Ignition;
-import org.apache.ignite.internal.util.IgniteUtils;
-import org.apache.ignite.ml.inference.Model;
-import org.apache.ignite.ml.inference.builder.IgniteDistributedModelBuilder;
-import org.apache.ignite.ml.inference.parser.ModelParser;
-import org.apache.ignite.ml.inference.parser.TensorFlowSavedModelModelParser;
-import org.apache.ignite.ml.inference.reader.FileSystemModelReader;
-import org.apache.ignite.ml.inference.reader.ModelReader;
-import org.apache.ignite.ml.util.MnistUtils;
-import org.tensorflow.Tensor;
-
-/**
- * This example demonstrates how to: load TensorFlow model into Java, make inference in distributed environment using
- * Apache Ignite services.
- */
-public class TensorFlowDistributedInferenceExample {
-    /**
-     * Path to the directory with saved TensorFlow model.
-     */
-    private static final String MODEL_PATH = "examples/src/main/resources/models/mnist_tf_model";
-
-    /**
-     * Path to the MNIST images data.
-     */
-    private static final String MNIST_IMG_PATH = "examples/src/main/resources/datasets/t10k-images-idx3-ubyte";
-
-    /**
-     * Path to the MNIST labels data.
-     */
-    private static final String MNIST_LBL_PATH = "examples/src/main/resources/datasets/t10k-labels-idx1-ubyte";
-
-    /**
-     * Run example.
-     */
-    public static void main(String[] args) throws IOException, ExecutionException, InterruptedException {
-        try (Ignite ignite = Ignition.start("examples/config/example-ignite.xml")) {
-            File mdlRsrc = IgniteUtils.resolveIgnitePath(MODEL_PATH);
-            if (mdlRsrc == null)
-                throw new IllegalArgumentException("Resource not found [resource_path=" + MODEL_PATH + "]");
-
-            ModelReader reader = new FileSystemModelReader(mdlRsrc.getPath());
-
-            ModelParser<double[], Long, ?> parser = new TensorFlowSavedModelModelParser<double[], Long>("serve")
-
-                .withInput("Placeholder", doubles -> {
-                    float[][][] reshaped = new float[1][28][28];
-                    for (int i = 0; i < doubles.length; i++)
-                        reshaped[0][i / 28][i % 28] = (float)doubles[i];
-                    return Tensor.create(reshaped);
-                })
-
-                .withOutput(Collections.singletonList("ArgMax"), collectedTensors -> collectedTensors.get("ArgMax")
-                    .copyTo(new long[1])[0]);
-
-            List<MnistUtils.MnistLabeledImage> images = MnistUtils.mnistAsList(
-                Objects.requireNonNull(IgniteUtils.resolveIgnitePath(MNIST_IMG_PATH)).getPath(),
-                Objects.requireNonNull(IgniteUtils.resolveIgnitePath(MNIST_LBL_PATH)).getPath(),
-                new Random(0),
-                10000
-            );
-
-            long t0 = System.currentTimeMillis();
-
-            try (Model<double[], Future<Long>> threadedMdl = new IgniteDistributedModelBuilder(ignite, 4, 4)
-                .build(reader, parser)) {
-                List<Future<?>> futures = new ArrayList<>(images.size());
-                for (MnistUtils.MnistLabeledImage image : images)
-                    futures.add(threadedMdl.predict(image.getPixels()));
-                for (Future<?> f : futures)
-                    f.get();
-            }
-
-            long t1 = System.currentTimeMillis();
-
-            System.out.println("Threaded model throughput: " + images.size() / ((t1 - t0) / 1000.0) + " req/sec");
-        }
-        finally {
-            System.out.flush();
-        }
-    }
-}
diff --git a/examples/src/main/java/org/apache/ignite/examples/ml/inference/TensorFlowLocalInferenceExample.java b/examples/src/main/java/org/apache/ignite/examples/ml/inference/TensorFlowLocalInferenceExample.java
deleted file mode 100644
index f77ac82..0000000
--- a/examples/src/main/java/org/apache/ignite/examples/ml/inference/TensorFlowLocalInferenceExample.java
+++ /dev/null
@@ -1,94 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package org.apache.ignite.examples.ml.inference;
-
-import java.io.File;
-import java.io.IOException;
-import java.util.Collections;
-import java.util.List;
-import java.util.Objects;
-import java.util.Random;
-import org.apache.ignite.internal.util.IgniteUtils;
-import org.apache.ignite.ml.inference.Model;
-import org.apache.ignite.ml.inference.builder.SingleModelBuilder;
-import org.apache.ignite.ml.inference.parser.ModelParser;
-import org.apache.ignite.ml.inference.parser.TensorFlowSavedModelModelParser;
-import org.apache.ignite.ml.inference.reader.FileSystemModelReader;
-import org.apache.ignite.ml.inference.reader.ModelReader;
-import org.apache.ignite.ml.util.MnistUtils;
-import org.tensorflow.Tensor;
-
-/**
- * This example demonstrates how to: load TensorFlow model into Java, make inference using this model in one thread.
- */
-public class TensorFlowLocalInferenceExample {
-    /**
-     * Path to the directory with saved TensorFlow model.
-     */
-    private static final String MODEL_PATH = "examples/src/main/resources/models/mnist_tf_model";
-
-    /**
-     * Path to the MNIST images data.
-     */
-    private static final String MNIST_IMG_PATH = "examples/src/main/resources/datasets/t10k-images-idx3-ubyte";
-
-    /**
-     * Path to the MNIST labels data.
-     */
-    private static final String MNIST_LBL_PATH = "examples/src/main/resources/datasets/t10k-labels-idx1-ubyte";
-
-    /**
-     * Run example.
-     */
-    public static void main(String[] args) throws IOException {
-        File mdlRsrc = IgniteUtils.resolveIgnitePath(MODEL_PATH);
-        if (mdlRsrc == null)
-            throw new IllegalArgumentException("Resource not found [resource_path=" + MODEL_PATH + "]");
-
-        ModelReader reader = new FileSystemModelReader(mdlRsrc.getPath());
-
-        ModelParser<double[], Long, ?> parser = new TensorFlowSavedModelModelParser<double[], Long>("serve")
-            .withInput("Placeholder", doubles -> {
-                float[][][] reshaped = new float[1][28][28];
-                for (int i = 0; i < doubles.length; i++)
-                    reshaped[0][i / 28][i % 28] = (float)doubles[i];
-                return Tensor.create(reshaped);
-            })
-            .withOutput(Collections.singletonList("ArgMax"), collectedTensors -> collectedTensors.get("ArgMax")
-                .copyTo(new long[1])[0]);
-
-        List<MnistUtils.MnistLabeledImage> images = MnistUtils.mnistAsList(
-            Objects.requireNonNull(IgniteUtils.resolveIgnitePath(MNIST_IMG_PATH)).getPath(),
-            Objects.requireNonNull(IgniteUtils.resolveIgnitePath(MNIST_LBL_PATH)).getPath(),
-            new Random(0),
-            10000
-        );
-
-        long t0 = System.currentTimeMillis();
-
-        try (Model<double[], Long> locMdl = new SingleModelBuilder().build(reader, parser)) {
-            for (MnistUtils.MnistLabeledImage image : images)
-                locMdl.predict(image.getPixels());
-        }
-
-        long t1 = System.currentTimeMillis();
-
-        System.out.println("Threaded model throughput: " + 1.0 * images.size() / ((t1 - t0) / 1000) + " req/sec");
-        System.out.flush();
-    }
-}
diff --git a/examples/src/main/java/org/apache/ignite/examples/ml/inference/TensorFlowThreadedInferenceExample.java b/examples/src/main/java/org/apache/ignite/examples/ml/inference/TensorFlowThreadedInferenceExample.java
deleted file mode 100644
index 22f0b23..0000000
--- a/examples/src/main/java/org/apache/ignite/examples/ml/inference/TensorFlowThreadedInferenceExample.java
+++ /dev/null
@@ -1,104 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package org.apache.ignite.examples.ml.inference;
-
-import java.io.File;
-import java.io.IOException;
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.List;
-import java.util.Objects;
-import java.util.Random;
-import java.util.concurrent.ExecutionException;
-import java.util.concurrent.Future;
-import org.apache.ignite.internal.util.IgniteUtils;
-import org.apache.ignite.ml.inference.Model;
-import org.apache.ignite.ml.inference.builder.ThreadedModelBuilder;
-import org.apache.ignite.ml.inference.parser.ModelParser;
-import org.apache.ignite.ml.inference.parser.TensorFlowSavedModelModelParser;
-import org.apache.ignite.ml.inference.reader.FileSystemModelReader;
-import org.apache.ignite.ml.inference.reader.ModelReader;
-import org.apache.ignite.ml.util.MnistUtils;
-import org.tensorflow.Tensor;
-
-/**
- * This example demonstrates how to: load TensorFlow model into Java, make inference using this model in multiple
- * threads.
- */
-public class TensorFlowThreadedInferenceExample {
-    /**
-     * Path to the directory with saved TensorFlow model.
-     */
-    private static final String MODEL_PATH = "examples/src/main/resources/models/mnist_tf_model";
-
-    /**
-     * Path to the MNIST images data.
-     */
-    private static final String MNIST_IMG_PATH = "examples/src/main/resources/datasets/t10k-images-idx3-ubyte";
-
-    /**
-     * Path to the MNIST labels data.
-     */
-    private static final String MNIST_LBL_PATH = "examples/src/main/resources/datasets/t10k-labels-idx1-ubyte";
-
-    /**
-     * Run example.
-     */
-    public static void main(String[] args) throws IOException, ExecutionException, InterruptedException {
-        File mdlRsrc = IgniteUtils.resolveIgnitePath(MODEL_PATH);
-        if (mdlRsrc == null)
-            throw new IllegalArgumentException("Resource not found [resource_path=" + MODEL_PATH + "]");
-
-        ModelReader reader = new FileSystemModelReader(mdlRsrc.getPath());
-
-        ModelParser<double[], Long, ?> parser = new TensorFlowSavedModelModelParser<double[], Long>("serve")
-
-            .withInput("Placeholder", doubles -> {
-                float[][][] reshaped = new float[1][28][28];
-                for (int i = 0; i < doubles.length; i++)
-                    reshaped[0][i / 28][i % 28] = (float)doubles[i];
-                return Tensor.create(reshaped);
-            })
-
-            .withOutput(Collections.singletonList("ArgMax"), collectedTensors -> collectedTensors.get("ArgMax")
-                .copyTo(new long[1])[0]);
-
-        List<MnistUtils.MnistLabeledImage> images = MnistUtils.mnistAsList(
-            Objects.requireNonNull(IgniteUtils.resolveIgnitePath(MNIST_IMG_PATH)).getPath(),
-            Objects.requireNonNull(IgniteUtils.resolveIgnitePath(MNIST_LBL_PATH)).getPath(),
-            new Random(0),
-            10000
-        );
-
-        long t0 = System.currentTimeMillis();
-
-        try (Model<double[], Future<Long>> threadedMdl = new ThreadedModelBuilder(8)
-            .build(reader, parser)) {
-            List<Future<?>> futures = new ArrayList<>(images.size());
-            for (MnistUtils.MnistLabeledImage image : images)
-                futures.add(threadedMdl.predict(image.getPixels()));
-            for (Future<?> f : futures)
-                f.get();
-        }
-
-        long t1 = System.currentTimeMillis();
-
-        System.out.println("Threaded model throughput: " + 1.0 * images.size() / ((t1 - t0) / 1000) + " req/sec");
-        System.out.flush();
-    }
-}
diff --git a/examples/src/main/java/org/apache/ignite/examples/ml/inference/spark/LogRegFromSparkThroughPMMLExample.java b/examples/src/main/java/org/apache/ignite/examples/ml/inference/spark/LogRegFromSparkThroughPMMLExample.java
index 7fa112c..f1beb70 100644
--- a/examples/src/main/java/org/apache/ignite/examples/ml/inference/spark/LogRegFromSparkThroughPMMLExample.java
+++ b/examples/src/main/java/org/apache/ignite/examples/ml/inference/spark/LogRegFromSparkThroughPMMLExample.java
@@ -25,6 +25,8 @@
 import org.apache.ignite.Ignite;
 import org.apache.ignite.IgniteCache;
 import org.apache.ignite.Ignition;
+import org.apache.ignite.examples.ml.util.MLSandboxDatasets;
+import org.apache.ignite.examples.ml.util.SandboxMLCache;
 import org.apache.ignite.internal.util.IgniteUtils;
 import org.apache.ignite.ml.dataset.feature.extractor.Vectorizer;
 import org.apache.ignite.ml.dataset.feature.extractor.impl.DummyVectorizer;
@@ -33,8 +35,6 @@
 import org.apache.ignite.ml.regressions.logistic.LogisticRegressionModel;
 import org.apache.ignite.ml.selection.scoring.evaluator.Evaluator;
 import org.apache.ignite.ml.selection.scoring.metric.classification.Accuracy;
-import org.apache.ignite.ml.util.MLSandboxDatasets;
-import org.apache.ignite.ml.util.SandboxMLCache;
 import org.dmg.pmml.PMML;
 import org.dmg.pmml.regression.RegressionModel;
 import org.dmg.pmml.regression.RegressionTable;
@@ -81,8 +81,9 @@
 
                 System.out.println("\n>>> Accuracy " + accuracy);
                 System.out.println("\n>>> Test Error " + (1 - accuracy));
-            } finally {
-                dataCache.destroy();
+            }    finally {
+                if (dataCache != null)
+                    dataCache.destroy();
             }
         }
     }
diff --git a/examples/src/main/java/org/apache/ignite/examples/ml/xgboost/XGBoostModelParserExample.java b/examples/src/main/java/org/apache/ignite/examples/ml/inference/xgboost/XGBoostModelParserExample.java
similarity index 98%
rename from examples/src/main/java/org/apache/ignite/examples/ml/xgboost/XGBoostModelParserExample.java
rename to examples/src/main/java/org/apache/ignite/examples/ml/inference/xgboost/XGBoostModelParserExample.java
index 9f9c6f9..997ece8 100644
--- a/examples/src/main/java/org/apache/ignite/examples/ml/xgboost/XGBoostModelParserExample.java
+++ b/examples/src/main/java/org/apache/ignite/examples/ml/inference/xgboost/XGBoostModelParserExample.java
@@ -15,7 +15,7 @@
  * limitations under the License.
  */
 
-package org.apache.ignite.examples.ml.xgboost;
+package org.apache.ignite.examples.ml.inference.xgboost;
 
 import java.io.File;
 import java.io.FileNotFoundException;
diff --git a/examples/src/main/java/org/apache/ignite/examples/ml/xgboost/package-info.java b/examples/src/main/java/org/apache/ignite/examples/ml/inference/xgboost/package-info.java
similarity index 93%
rename from examples/src/main/java/org/apache/ignite/examples/ml/xgboost/package-info.java
rename to examples/src/main/java/org/apache/ignite/examples/ml/inference/xgboost/package-info.java
index f0c8db4..3f834d2 100644
--- a/examples/src/main/java/org/apache/ignite/examples/ml/xgboost/package-info.java
+++ b/examples/src/main/java/org/apache/ignite/examples/ml/inference/xgboost/package-info.java
@@ -19,4 +19,4 @@
  * <!-- Package description. --> XGBoost model inference examples.
  */
 
-package org.apache.ignite.examples.ml.xgboost;
+package org.apache.ignite.examples.ml.inference.xgboost;
diff --git a/examples/src/main/java/org/apache/ignite/examples/ml/knn/IrisClassificationExample.java b/examples/src/main/java/org/apache/ignite/examples/ml/knn/IrisClassificationExample.java
index c06c5c3..e8ef55e 100644
--- a/examples/src/main/java/org/apache/ignite/examples/ml/knn/IrisClassificationExample.java
+++ b/examples/src/main/java/org/apache/ignite/examples/ml/knn/IrisClassificationExample.java
@@ -21,6 +21,8 @@
 import org.apache.ignite.Ignite;
 import org.apache.ignite.IgniteCache;
 import org.apache.ignite.Ignition;
+import org.apache.ignite.examples.ml.util.MLSandboxDatasets;
+import org.apache.ignite.examples.ml.util.SandboxMLCache;
 import org.apache.ignite.ml.dataset.feature.extractor.Vectorizer;
 import org.apache.ignite.ml.dataset.feature.extractor.impl.DummyVectorizer;
 import org.apache.ignite.ml.environment.LearningEnvironmentBuilder;
@@ -32,8 +34,6 @@
 import org.apache.ignite.ml.selection.scoring.metric.classification.Accuracy;
 import org.apache.ignite.ml.selection.split.TrainTestDatasetSplitter;
 import org.apache.ignite.ml.selection.split.TrainTestSplit;
-import org.apache.ignite.ml.util.MLSandboxDatasets;
-import org.apache.ignite.ml.util.SandboxMLCache;
 
 /**
  * Example of using Knn model in Apache Ignite for iris class predicion.
@@ -87,7 +87,8 @@
                 System.out.println(">> Model accuracy: " + accuracy);
             }
             finally {
-                dataCache.destroy();
+                if (dataCache != null)
+                    dataCache.destroy();
             }
         }
         finally {
diff --git a/examples/src/main/java/org/apache/ignite/examples/ml/knn/KNNClassificationExample.java b/examples/src/main/java/org/apache/ignite/examples/ml/knn/KNNClassificationExample.java
index e089f51..1917d22 100644
--- a/examples/src/main/java/org/apache/ignite/examples/ml/knn/KNNClassificationExample.java
+++ b/examples/src/main/java/org/apache/ignite/examples/ml/knn/KNNClassificationExample.java
@@ -21,6 +21,8 @@
 import org.apache.ignite.Ignite;
 import org.apache.ignite.IgniteCache;
 import org.apache.ignite.Ignition;
+import org.apache.ignite.examples.ml.util.MLSandboxDatasets;
+import org.apache.ignite.examples.ml.util.SandboxMLCache;
 import org.apache.ignite.ml.dataset.feature.extractor.Vectorizer;
 import org.apache.ignite.ml.dataset.feature.extractor.impl.DummyVectorizer;
 import org.apache.ignite.ml.knn.classification.KNNClassificationModel;
@@ -29,8 +31,6 @@
 import org.apache.ignite.ml.math.primitives.vector.Vector;
 import org.apache.ignite.ml.selection.scoring.evaluator.Evaluator;
 import org.apache.ignite.ml.selection.scoring.metric.MetricName;
-import org.apache.ignite.ml.util.MLSandboxDatasets;
-import org.apache.ignite.ml.util.SandboxMLCache;
 
 /**
  * Run kNN multi-class classification trainer ({@link KNNClassificationTrainer}) over distributed dataset.
diff --git a/examples/src/main/java/org/apache/ignite/examples/ml/knn/KNNRegressionExample.java b/examples/src/main/java/org/apache/ignite/examples/ml/knn/KNNRegressionExample.java
index 80d8a1a..a2c1cbe 100644
--- a/examples/src/main/java/org/apache/ignite/examples/ml/knn/KNNRegressionExample.java
+++ b/examples/src/main/java/org/apache/ignite/examples/ml/knn/KNNRegressionExample.java
@@ -21,6 +21,8 @@
 import org.apache.ignite.Ignite;
 import org.apache.ignite.IgniteCache;
 import org.apache.ignite.Ignition;
+import org.apache.ignite.examples.ml.util.MLSandboxDatasets;
+import org.apache.ignite.examples.ml.util.SandboxMLCache;
 import org.apache.ignite.ml.dataset.feature.extractor.Vectorizer;
 import org.apache.ignite.ml.dataset.feature.extractor.impl.DummyVectorizer;
 import org.apache.ignite.ml.knn.regression.KNNRegressionModel;
@@ -30,8 +32,6 @@
 import org.apache.ignite.ml.math.primitives.vector.Vector;
 import org.apache.ignite.ml.selection.scoring.evaluator.Evaluator;
 import org.apache.ignite.ml.selection.scoring.metric.regression.Rmse;
-import org.apache.ignite.ml.util.MLSandboxDatasets;
-import org.apache.ignite.ml.util.SandboxMLCache;
 
 /**
  * Run kNN regression trainer ({@link KNNRegressionTrainer}) over distributed dataset.
@@ -84,7 +84,8 @@
                 System.out.println("\n>>> Rmse = " + rmse);
             }
             finally {
-                dataCache.destroy();
+                if (dataCache != null)
+                    dataCache.destroy();
             }
         }
         finally {
diff --git a/examples/src/main/java/org/apache/ignite/examples/ml/multiclass/OneVsRestClassificationExample.java b/examples/src/main/java/org/apache/ignite/examples/ml/multiclass/OneVsRestClassificationExample.java
index 7201899..dd5fecf 100644
--- a/examples/src/main/java/org/apache/ignite/examples/ml/multiclass/OneVsRestClassificationExample.java
+++ b/examples/src/main/java/org/apache/ignite/examples/ml/multiclass/OneVsRestClassificationExample.java
@@ -26,6 +26,8 @@
 import org.apache.ignite.Ignition;
 import org.apache.ignite.cache.query.QueryCursor;
 import org.apache.ignite.cache.query.ScanQuery;
+import org.apache.ignite.examples.ml.util.MLSandboxDatasets;
+import org.apache.ignite.examples.ml.util.SandboxMLCache;
 import org.apache.ignite.ml.dataset.feature.extractor.impl.DummyVectorizer;
 import org.apache.ignite.ml.math.primitives.vector.Vector;
 import org.apache.ignite.ml.multiclass.MultiClassModel;
@@ -34,8 +36,6 @@
 import org.apache.ignite.ml.preprocessing.minmaxscaling.MinMaxScalerTrainer;
 import org.apache.ignite.ml.svm.SVMLinearClassificationModel;
 import org.apache.ignite.ml.svm.SVMLinearClassificationTrainer;
-import org.apache.ignite.ml.util.MLSandboxDatasets;
-import org.apache.ignite.ml.util.SandboxMLCache;
 
 /**
  * Run One-vs-Rest multi-class classification trainer ({@link OneVsRestTrainer}) parametrized by binary SVM classifier
diff --git a/examples/src/main/java/org/apache/ignite/examples/ml/naivebayes/CompoundNaiveBayesExample.java b/examples/src/main/java/org/apache/ignite/examples/ml/naivebayes/CompoundNaiveBayesExample.java
index 0f7e3a1..24bbcb8 100644
--- a/examples/src/main/java/org/apache/ignite/examples/ml/naivebayes/CompoundNaiveBayesExample.java
+++ b/examples/src/main/java/org/apache/ignite/examples/ml/naivebayes/CompoundNaiveBayesExample.java
@@ -21,6 +21,8 @@
 import org.apache.ignite.Ignite;
 import org.apache.ignite.IgniteCache;
 import org.apache.ignite.Ignition;
+import org.apache.ignite.examples.ml.util.MLSandboxDatasets;
+import org.apache.ignite.examples.ml.util.SandboxMLCache;
 import org.apache.ignite.ml.dataset.feature.extractor.Vectorizer;
 import org.apache.ignite.ml.dataset.feature.extractor.impl.DummyVectorizer;
 import org.apache.ignite.ml.math.primitives.vector.Vector;
@@ -30,8 +32,6 @@
 import org.apache.ignite.ml.naivebayes.gaussian.GaussianNaiveBayesTrainer;
 import org.apache.ignite.ml.selection.scoring.evaluator.Evaluator;
 import org.apache.ignite.ml.selection.scoring.metric.MetricName;
-import org.apache.ignite.ml.util.MLSandboxDatasets;
-import org.apache.ignite.ml.util.SandboxMLCache;
 
 import static java.util.Arrays.asList;
 
diff --git a/examples/src/main/java/org/apache/ignite/examples/ml/naivebayes/DiscreteNaiveBayesTrainerExample.java b/examples/src/main/java/org/apache/ignite/examples/ml/naivebayes/DiscreteNaiveBayesTrainerExample.java
index c62c53a..2aee5fe 100644
--- a/examples/src/main/java/org/apache/ignite/examples/ml/naivebayes/DiscreteNaiveBayesTrainerExample.java
+++ b/examples/src/main/java/org/apache/ignite/examples/ml/naivebayes/DiscreteNaiveBayesTrainerExample.java
@@ -21,6 +21,8 @@
 import org.apache.ignite.Ignite;
 import org.apache.ignite.IgniteCache;
 import org.apache.ignite.Ignition;
+import org.apache.ignite.examples.ml.util.MLSandboxDatasets;
+import org.apache.ignite.examples.ml.util.SandboxMLCache;
 import org.apache.ignite.ml.dataset.feature.extractor.Vectorizer;
 import org.apache.ignite.ml.dataset.feature.extractor.impl.DummyVectorizer;
 import org.apache.ignite.ml.math.primitives.vector.Vector;
@@ -28,8 +30,6 @@
 import org.apache.ignite.ml.naivebayes.discrete.DiscreteNaiveBayesTrainer;
 import org.apache.ignite.ml.selection.scoring.evaluator.Evaluator;
 import org.apache.ignite.ml.selection.scoring.metric.MetricName;
-import org.apache.ignite.ml.util.MLSandboxDatasets;
-import org.apache.ignite.ml.util.SandboxMLCache;
 
 /**
  * Run naive Bayes classification model based on <a href=https://en.wikipedia.org/wiki/Naive_Bayes_classifier#Multinomial_naive_Bayes">
diff --git a/examples/src/main/java/org/apache/ignite/examples/ml/naivebayes/GaussianNaiveBayesTrainerExample.java b/examples/src/main/java/org/apache/ignite/examples/ml/naivebayes/GaussianNaiveBayesTrainerExample.java
index 15ac6cb..6571d3e 100644
--- a/examples/src/main/java/org/apache/ignite/examples/ml/naivebayes/GaussianNaiveBayesTrainerExample.java
+++ b/examples/src/main/java/org/apache/ignite/examples/ml/naivebayes/GaussianNaiveBayesTrainerExample.java
@@ -21,6 +21,8 @@
 import org.apache.ignite.Ignite;
 import org.apache.ignite.IgniteCache;
 import org.apache.ignite.Ignition;
+import org.apache.ignite.examples.ml.util.MLSandboxDatasets;
+import org.apache.ignite.examples.ml.util.SandboxMLCache;
 import org.apache.ignite.ml.dataset.feature.extractor.Vectorizer;
 import org.apache.ignite.ml.dataset.feature.extractor.impl.DummyVectorizer;
 import org.apache.ignite.ml.math.primitives.vector.Vector;
@@ -28,8 +30,6 @@
 import org.apache.ignite.ml.naivebayes.gaussian.GaussianNaiveBayesTrainer;
 import org.apache.ignite.ml.selection.scoring.evaluator.Evaluator;
 import org.apache.ignite.ml.selection.scoring.metric.MetricName;
-import org.apache.ignite.ml.util.MLSandboxDatasets;
-import org.apache.ignite.ml.util.SandboxMLCache;
 
 /**
  * Run naive Bayes classification model based on <a href="https://en.wikipedia.org/wiki/Naive_Bayes_classifier"> naive
diff --git a/examples/src/main/java/org/apache/ignite/examples/ml/preprocessing/encoding/EncoderExample.java b/examples/src/main/java/org/apache/ignite/examples/ml/preprocessing/encoding/EncoderExample.java
index c189c1c..c24091c 100644
--- a/examples/src/main/java/org/apache/ignite/examples/ml/preprocessing/encoding/EncoderExample.java
+++ b/examples/src/main/java/org/apache/ignite/examples/ml/preprocessing/encoding/EncoderExample.java
@@ -21,6 +21,8 @@
 import org.apache.ignite.Ignite;
 import org.apache.ignite.IgniteCache;
 import org.apache.ignite.Ignition;
+import org.apache.ignite.examples.ml.util.MLSandboxDatasets;
+import org.apache.ignite.examples.ml.util.SandboxMLCache;
 import org.apache.ignite.ml.dataset.feature.extractor.Vectorizer;
 import org.apache.ignite.ml.dataset.feature.extractor.impl.ObjectArrayVectorizer;
 import org.apache.ignite.ml.preprocessing.Preprocessor;
@@ -30,8 +32,6 @@
 import org.apache.ignite.ml.selection.scoring.metric.classification.Accuracy;
 import org.apache.ignite.ml.tree.DecisionTreeClassificationTrainer;
 import org.apache.ignite.ml.tree.DecisionTreeNode;
-import org.apache.ignite.ml.util.MLSandboxDatasets;
-import org.apache.ignite.ml.util.SandboxMLCache;
 
 /**
  * Example that shows how to use String Encoder preprocessor to encode features presented as a strings.
diff --git a/examples/src/main/java/org/apache/ignite/examples/ml/preprocessing/encoding/EncoderExampleWithNormalization.java b/examples/src/main/java/org/apache/ignite/examples/ml/preprocessing/encoding/EncoderExampleWithNormalization.java
index 3af14e3..d9482a5 100644
--- a/examples/src/main/java/org/apache/ignite/examples/ml/preprocessing/encoding/EncoderExampleWithNormalization.java
+++ b/examples/src/main/java/org/apache/ignite/examples/ml/preprocessing/encoding/EncoderExampleWithNormalization.java
@@ -21,6 +21,8 @@
 import org.apache.ignite.Ignite;
 import org.apache.ignite.IgniteCache;
 import org.apache.ignite.Ignition;
+import org.apache.ignite.examples.ml.util.MLSandboxDatasets;
+import org.apache.ignite.examples.ml.util.SandboxMLCache;
 import org.apache.ignite.ml.dataset.feature.extractor.Vectorizer;
 import org.apache.ignite.ml.dataset.feature.extractor.impl.ObjectArrayVectorizer;
 import org.apache.ignite.ml.preprocessing.Preprocessor;
@@ -31,8 +33,6 @@
 import org.apache.ignite.ml.selection.scoring.metric.classification.Accuracy;
 import org.apache.ignite.ml.tree.DecisionTreeClassificationTrainer;
 import org.apache.ignite.ml.tree.DecisionTreeNode;
-import org.apache.ignite.ml.util.MLSandboxDatasets;
-import org.apache.ignite.ml.util.SandboxMLCache;
 
 /**
  * Example that shows how to combine together two preprocessors: String Encoder preprocessor to encode features presented as a strings
diff --git a/examples/src/main/java/org/apache/ignite/examples/ml/preprocessing/encoding/LabelEncoderExample.java b/examples/src/main/java/org/apache/ignite/examples/ml/preprocessing/encoding/LabelEncoderExample.java
index 675336f..d97c49c 100644
--- a/examples/src/main/java/org/apache/ignite/examples/ml/preprocessing/encoding/LabelEncoderExample.java
+++ b/examples/src/main/java/org/apache/ignite/examples/ml/preprocessing/encoding/LabelEncoderExample.java
@@ -21,6 +21,8 @@
 import org.apache.ignite.Ignite;
 import org.apache.ignite.IgniteCache;
 import org.apache.ignite.Ignition;
+import org.apache.ignite.examples.ml.util.MLSandboxDatasets;
+import org.apache.ignite.examples.ml.util.SandboxMLCache;
 import org.apache.ignite.ml.dataset.feature.extractor.Vectorizer;
 import org.apache.ignite.ml.dataset.feature.extractor.impl.ObjectArrayVectorizer;
 import org.apache.ignite.ml.preprocessing.Preprocessor;
@@ -30,8 +32,6 @@
 import org.apache.ignite.ml.selection.scoring.metric.classification.Accuracy;
 import org.apache.ignite.ml.tree.DecisionTreeClassificationTrainer;
 import org.apache.ignite.ml.tree.DecisionTreeNode;
-import org.apache.ignite.ml.util.MLSandboxDatasets;
-import org.apache.ignite.ml.util.SandboxMLCache;
 
 /**
  * Example that shows how to use Label Encoder preprocessor to encode labels presented as a strings.
diff --git a/examples/src/main/java/org/apache/ignite/examples/ml/recommendation/MovieLensExample.java b/examples/src/main/java/org/apache/ignite/examples/ml/recommendation/MovieLensExample.java
index 35e8151..b5c7984 100644
--- a/examples/src/main/java/org/apache/ignite/examples/ml/recommendation/MovieLensExample.java
+++ b/examples/src/main/java/org/apache/ignite/examples/ml/recommendation/MovieLensExample.java
@@ -26,13 +26,13 @@
 import org.apache.ignite.cache.query.QueryCursor;
 import org.apache.ignite.cache.query.ScanQuery;
 import org.apache.ignite.configuration.CacheConfiguration;
+import org.apache.ignite.examples.ml.util.MLSandboxDatasets;
+import org.apache.ignite.examples.ml.util.SandboxMLCache;
 import org.apache.ignite.ml.dataset.impl.cache.CacheBasedDatasetBuilder;
 import org.apache.ignite.ml.environment.LearningEnvironmentBuilder;
 import org.apache.ignite.ml.recommendation.ObjectSubjectRatingTriplet;
 import org.apache.ignite.ml.recommendation.RecommendationModel;
 import org.apache.ignite.ml.recommendation.RecommendationTrainer;
-import org.apache.ignite.ml.util.MLSandboxDatasets;
-import org.apache.ignite.ml.util.SandboxMLCache;
 
 /**
  * Example of recommendation system based on MovieLens dataset (see https://grouplens.org/datasets/movielens/).
diff --git a/examples/src/main/java/org/apache/ignite/examples/ml/recommendation/MovieLensSQLExample.java b/examples/src/main/java/org/apache/ignite/examples/ml/recommendation/MovieLensSQLExample.java
index b316c61..dbfb553 100644
--- a/examples/src/main/java/org/apache/ignite/examples/ml/recommendation/MovieLensSQLExample.java
+++ b/examples/src/main/java/org/apache/ignite/examples/ml/recommendation/MovieLensSQLExample.java
@@ -26,14 +26,14 @@
 import org.apache.ignite.cache.query.QueryCursor;
 import org.apache.ignite.cache.query.SqlFieldsQuery;
 import org.apache.ignite.configuration.CacheConfiguration;
+import org.apache.ignite.examples.ml.util.MLSandboxDatasets;
+import org.apache.ignite.examples.ml.util.SandboxMLCache;
 import org.apache.ignite.ml.environment.LearningEnvironmentBuilder;
 import org.apache.ignite.ml.inference.IgniteModelStorageUtil;
 import org.apache.ignite.ml.recommendation.RecommendationModel;
 import org.apache.ignite.ml.recommendation.RecommendationTrainer;
 import org.apache.ignite.ml.sql.SQLFunctions;
 import org.apache.ignite.ml.sql.SqlDatasetBuilder;
-import org.apache.ignite.ml.util.MLSandboxDatasets;
-import org.apache.ignite.ml.util.SandboxMLCache;
 
 /**
  * Example of recommendation system based on MovieLens dataset (see https://grouplens.org/datasets/movielens/) and SQL.
diff --git a/examples/src/main/java/org/apache/ignite/examples/ml/regression/linear/BostonHousePricesPredictionExample.java b/examples/src/main/java/org/apache/ignite/examples/ml/regression/linear/BostonHousePricesPredictionExample.java
index afaa4c9..511eb05 100644
--- a/examples/src/main/java/org/apache/ignite/examples/ml/regression/linear/BostonHousePricesPredictionExample.java
+++ b/examples/src/main/java/org/apache/ignite/examples/ml/regression/linear/BostonHousePricesPredictionExample.java
@@ -22,6 +22,8 @@
 import org.apache.ignite.Ignite;
 import org.apache.ignite.IgniteCache;
 import org.apache.ignite.Ignition;
+import org.apache.ignite.examples.ml.util.MLSandboxDatasets;
+import org.apache.ignite.examples.ml.util.SandboxMLCache;
 import org.apache.ignite.ml.dataset.feature.extractor.Vectorizer;
 import org.apache.ignite.ml.dataset.feature.extractor.impl.DummyVectorizer;
 import org.apache.ignite.ml.environment.LearningEnvironmentBuilder;
@@ -33,8 +35,6 @@
 import org.apache.ignite.ml.selection.split.TrainTestDatasetSplitter;
 import org.apache.ignite.ml.selection.split.TrainTestSplit;
 import org.apache.ignite.ml.trainers.DatasetTrainer;
-import org.apache.ignite.ml.util.MLSandboxDatasets;
-import org.apache.ignite.ml.util.SandboxMLCache;
 
 /**
  * Example of using Linear Regression model in Apache Ignite for house prices prediction.
diff --git a/examples/src/main/java/org/apache/ignite/examples/ml/regression/linear/LinearRegressionLSQRTrainerExample.java b/examples/src/main/java/org/apache/ignite/examples/ml/regression/linear/LinearRegressionLSQRTrainerExample.java
index c4da76c..e6ab6f6e 100644
--- a/examples/src/main/java/org/apache/ignite/examples/ml/regression/linear/LinearRegressionLSQRTrainerExample.java
+++ b/examples/src/main/java/org/apache/ignite/examples/ml/regression/linear/LinearRegressionLSQRTrainerExample.java
@@ -21,6 +21,8 @@
 import org.apache.ignite.Ignite;
 import org.apache.ignite.IgniteCache;
 import org.apache.ignite.Ignition;
+import org.apache.ignite.examples.ml.util.MLSandboxDatasets;
+import org.apache.ignite.examples.ml.util.SandboxMLCache;
 import org.apache.ignite.ml.dataset.feature.extractor.Vectorizer;
 import org.apache.ignite.ml.dataset.feature.extractor.impl.DummyVectorizer;
 import org.apache.ignite.ml.math.primitives.vector.Vector;
@@ -28,8 +30,6 @@
 import org.apache.ignite.ml.regressions.linear.LinearRegressionModel;
 import org.apache.ignite.ml.selection.scoring.evaluator.Evaluator;
 import org.apache.ignite.ml.selection.scoring.metric.MetricName;
-import org.apache.ignite.ml.util.MLSandboxDatasets;
-import org.apache.ignite.ml.util.SandboxMLCache;
 
 /**
  * Run linear regression model based on <a href="http://web.stanford.edu/group/SOL/software/lsqr/">LSQR algorithm</a>
@@ -87,7 +87,8 @@
                 System.out.println(">>> Linear regression model over cache based dataset usage example completed.");
             }
             finally {
-                dataCache.destroy();
+                if (dataCache != null)
+                    dataCache.destroy();
             }
         }
         finally {
diff --git a/examples/src/main/java/org/apache/ignite/examples/ml/regression/linear/LinearRegressionLSQRTrainerWithMinMaxScalerExample.java b/examples/src/main/java/org/apache/ignite/examples/ml/regression/linear/LinearRegressionLSQRTrainerWithMinMaxScalerExample.java
index 94c94b1..9979d3c 100644
--- a/examples/src/main/java/org/apache/ignite/examples/ml/regression/linear/LinearRegressionLSQRTrainerWithMinMaxScalerExample.java
+++ b/examples/src/main/java/org/apache/ignite/examples/ml/regression/linear/LinearRegressionLSQRTrainerWithMinMaxScalerExample.java
@@ -21,6 +21,8 @@
 import org.apache.ignite.Ignite;
 import org.apache.ignite.IgniteCache;
 import org.apache.ignite.Ignition;
+import org.apache.ignite.examples.ml.util.MLSandboxDatasets;
+import org.apache.ignite.examples.ml.util.SandboxMLCache;
 import org.apache.ignite.ml.dataset.feature.extractor.Vectorizer;
 import org.apache.ignite.ml.dataset.feature.extractor.impl.DummyVectorizer;
 import org.apache.ignite.ml.math.primitives.vector.Vector;
@@ -31,8 +33,6 @@
 import org.apache.ignite.ml.regressions.linear.LinearRegressionModel;
 import org.apache.ignite.ml.selection.scoring.evaluator.Evaluator;
 import org.apache.ignite.ml.selection.scoring.metric.MetricName;
-import org.apache.ignite.ml.util.MLSandboxDatasets;
-import org.apache.ignite.ml.util.SandboxMLCache;
 
 /**
  * Run linear regression model based on <a href="http://web.stanford.edu/group/SOL/software/lsqr/">LSQR algorithm</a>
diff --git a/examples/src/main/java/org/apache/ignite/examples/ml/regression/linear/LinearRegressionSGDTrainerExample.java b/examples/src/main/java/org/apache/ignite/examples/ml/regression/linear/LinearRegressionSGDTrainerExample.java
index 2b59d6a..5f116c4 100644
--- a/examples/src/main/java/org/apache/ignite/examples/ml/regression/linear/LinearRegressionSGDTrainerExample.java
+++ b/examples/src/main/java/org/apache/ignite/examples/ml/regression/linear/LinearRegressionSGDTrainerExample.java
@@ -21,6 +21,8 @@
 import org.apache.ignite.Ignite;
 import org.apache.ignite.IgniteCache;
 import org.apache.ignite.Ignition;
+import org.apache.ignite.examples.ml.util.MLSandboxDatasets;
+import org.apache.ignite.examples.ml.util.SandboxMLCache;
 import org.apache.ignite.ml.dataset.feature.extractor.Vectorizer;
 import org.apache.ignite.ml.dataset.feature.extractor.impl.DummyVectorizer;
 import org.apache.ignite.ml.math.primitives.vector.Vector;
@@ -31,8 +33,6 @@
 import org.apache.ignite.ml.regressions.linear.LinearRegressionSGDTrainer;
 import org.apache.ignite.ml.selection.scoring.evaluator.Evaluator;
 import org.apache.ignite.ml.selection.scoring.metric.MetricName;
-import org.apache.ignite.ml.util.MLSandboxDatasets;
-import org.apache.ignite.ml.util.SandboxMLCache;
 
 /**
  * Run linear regression model based on  based on
@@ -88,7 +88,8 @@
                 System.out.println(">>> Linear regression model over cache based dataset usage example completed.");
             }
             finally {
-                dataCache.destroy();
+                if (dataCache != null)
+                    dataCache.destroy();
             }
         }
         finally {
diff --git a/examples/src/main/java/org/apache/ignite/examples/ml/regression/logistic/bagged/BaggedLogisticRegressionSGDTrainerExample.java b/examples/src/main/java/org/apache/ignite/examples/ml/regression/logistic/bagged/BaggedLogisticRegressionSGDTrainerExample.java
index daa0c15..d7f63d2 100644
--- a/examples/src/main/java/org/apache/ignite/examples/ml/regression/logistic/bagged/BaggedLogisticRegressionSGDTrainerExample.java
+++ b/examples/src/main/java/org/apache/ignite/examples/ml/regression/logistic/bagged/BaggedLogisticRegressionSGDTrainerExample.java
@@ -21,6 +21,8 @@
 import org.apache.ignite.Ignite;
 import org.apache.ignite.IgniteCache;
 import org.apache.ignite.Ignition;
+import org.apache.ignite.examples.ml.util.MLSandboxDatasets;
+import org.apache.ignite.examples.ml.util.SandboxMLCache;
 import org.apache.ignite.ml.composition.bagging.BaggedTrainer;
 import org.apache.ignite.ml.composition.predictionsaggregator.OnMajorityPredictionsAggregator;
 import org.apache.ignite.ml.dataset.feature.extractor.Vectorizer;
@@ -34,8 +36,6 @@
 import org.apache.ignite.ml.selection.scoring.evaluator.Evaluator;
 import org.apache.ignite.ml.selection.scoring.metric.MetricName;
 import org.apache.ignite.ml.trainers.TrainerTransformers;
-import org.apache.ignite.ml.util.MLSandboxDatasets;
-import org.apache.ignite.ml.util.SandboxMLCache;
 
 /**
  * This example shows how bagging technique may be applied to arbitrary trainer. As an example (a bit synthetic)
diff --git a/examples/src/main/java/org/apache/ignite/examples/ml/regression/logistic/binary/LogisticRegressionSGDTrainerExample.java b/examples/src/main/java/org/apache/ignite/examples/ml/regression/logistic/binary/LogisticRegressionSGDTrainerExample.java
index f6a4b09..fd6b9ff 100644
--- a/examples/src/main/java/org/apache/ignite/examples/ml/regression/logistic/binary/LogisticRegressionSGDTrainerExample.java
+++ b/examples/src/main/java/org/apache/ignite/examples/ml/regression/logistic/binary/LogisticRegressionSGDTrainerExample.java
@@ -21,6 +21,8 @@
 import org.apache.ignite.Ignite;
 import org.apache.ignite.IgniteCache;
 import org.apache.ignite.Ignition;
+import org.apache.ignite.examples.ml.util.MLSandboxDatasets;
+import org.apache.ignite.examples.ml.util.SandboxMLCache;
 import org.apache.ignite.ml.dataset.feature.extractor.Vectorizer;
 import org.apache.ignite.ml.dataset.feature.extractor.impl.DummyVectorizer;
 import org.apache.ignite.ml.math.primitives.vector.Vector;
@@ -31,8 +33,6 @@
 import org.apache.ignite.ml.regressions.logistic.LogisticRegressionSGDTrainer;
 import org.apache.ignite.ml.selection.scoring.evaluator.Evaluator;
 import org.apache.ignite.ml.selection.scoring.metric.MetricName;
-import org.apache.ignite.ml.util.MLSandboxDatasets;
-import org.apache.ignite.ml.util.SandboxMLCache;
 
 /**
  * Run logistic regression model based on <a href="https://en.wikipedia.org/wiki/Stochastic_gradient_descent">
diff --git a/examples/src/main/java/org/apache/ignite/examples/ml/selection/scoring/EvaluatorExample.java b/examples/src/main/java/org/apache/ignite/examples/ml/selection/scoring/EvaluatorExample.java
index a53f16a..89e71fa 100644
--- a/examples/src/main/java/org/apache/ignite/examples/ml/selection/scoring/EvaluatorExample.java
+++ b/examples/src/main/java/org/apache/ignite/examples/ml/selection/scoring/EvaluatorExample.java
@@ -21,14 +21,14 @@
 import org.apache.ignite.Ignite;
 import org.apache.ignite.IgniteCache;
 import org.apache.ignite.Ignition;
+import org.apache.ignite.examples.ml.util.MLSandboxDatasets;
+import org.apache.ignite.examples.ml.util.SandboxMLCache;
 import org.apache.ignite.ml.dataset.feature.extractor.Vectorizer;
 import org.apache.ignite.ml.dataset.feature.extractor.impl.DummyVectorizer;
 import org.apache.ignite.ml.math.primitives.vector.Vector;
 import org.apache.ignite.ml.selection.scoring.evaluator.Evaluator;
 import org.apache.ignite.ml.svm.SVMLinearClassificationModel;
 import org.apache.ignite.ml.svm.SVMLinearClassificationTrainer;
-import org.apache.ignite.ml.util.MLSandboxDatasets;
-import org.apache.ignite.ml.util.SandboxMLCache;
 
 /**
  * Run SVM classification trainer ({@link SVMLinearClassificationTrainer}) over distributed dataset.
@@ -69,7 +69,8 @@
                 System.out.println(Evaluator.evaluateBinaryClassification(dataCache, mdl, vectorizer));
             }
             finally {
-                dataCache.destroy();
+                if (dataCache != null)
+                    dataCache.destroy();
             }
         }
         finally {
diff --git a/examples/src/main/java/org/apache/ignite/examples/ml/selection/scoring/MultipleMetricsExample.java b/examples/src/main/java/org/apache/ignite/examples/ml/selection/scoring/MultipleMetricsExample.java
deleted file mode 100644
index 7d24afd..0000000
--- a/examples/src/main/java/org/apache/ignite/examples/ml/selection/scoring/MultipleMetricsExample.java
+++ /dev/null
@@ -1,78 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package org.apache.ignite.examples.ml.selection.scoring;
-
-import java.io.IOException;
-import org.apache.ignite.Ignite;
-import org.apache.ignite.IgniteCache;
-import org.apache.ignite.Ignition;
-import org.apache.ignite.ml.dataset.feature.extractor.Vectorizer;
-import org.apache.ignite.ml.dataset.feature.extractor.impl.DummyVectorizer;
-import org.apache.ignite.ml.knn.classification.KNNClassificationTrainer;
-import org.apache.ignite.ml.math.primitives.vector.Vector;
-import org.apache.ignite.ml.selection.scoring.evaluator.Evaluator;
-import org.apache.ignite.ml.svm.SVMLinearClassificationModel;
-import org.apache.ignite.ml.svm.SVMLinearClassificationTrainer;
-import org.apache.ignite.ml.util.MLSandboxDatasets;
-import org.apache.ignite.ml.util.SandboxMLCache;
-
-/**
- * Run kNN multi-class classification trainer ({@link KNNClassificationTrainer}) over distributed dataset.
- * <p>
- * Code in this example launches Ignite grid and fills the cache with test data points (based on the
- * <a href="https://en.wikipedia.org/wiki/Iris_flower_data_set"></a>Iris dataset</a>).</p>
- * <p>
- * After that it trains the model based on the specified data using
- * <a href="https://en.wikipedia.org/wiki/K-nearest_neighbors_algorithm">kNN</a> algorithm.</p>
- * <p>
- * Finally, this example loops over the test set of data points, applies the trained model to predict what cluster does
- * this point belong to, and compares prediction to expected outcome (ground truth).</p>
- * <p>
- * You can change the test data used in this example and re-run it to explore this algorithm further.</p>
- */
-public class MultipleMetricsExample {
-    /**
-     * Run example.
-     */
-    public static void main(String[] args) throws IOException {
-        // Start ignite grid.
-        try (Ignite ignite = Ignition.start("examples/config/example-ignite.xml")) {
-            System.out.println(">>> Ignite grid started.");
-
-            IgniteCache<Integer, Vector> dataCache = null;
-            try {
-                dataCache = new SandboxMLCache(ignite).fillCacheWith(MLSandboxDatasets.TWO_CLASSED_IRIS);
-
-                SVMLinearClassificationTrainer trainer = new SVMLinearClassificationTrainer();
-
-                Vectorizer<Integer, Vector, Integer, Double> vectorizer = new DummyVectorizer<Integer>()
-                    .labeled(Vectorizer.LabelCoordinate.FIRST);
-
-                SVMLinearClassificationModel mdl = trainer.fit(ignite, dataCache, vectorizer);
-
-                System.out.println(Evaluator.evaluateBinaryClassification(dataCache, mdl, vectorizer));
-            }
-            finally {
-                dataCache.destroy();
-            }
-        }
-        finally {
-            System.out.flush();
-        }
-    }
-}
diff --git a/examples/src/main/java/org/apache/ignite/examples/ml/selection/scoring/RegressionMetricExample.java b/examples/src/main/java/org/apache/ignite/examples/ml/selection/scoring/RegressionMetricExample.java
index 448960d..67b977f 100644
--- a/examples/src/main/java/org/apache/ignite/examples/ml/selection/scoring/RegressionMetricExample.java
+++ b/examples/src/main/java/org/apache/ignite/examples/ml/selection/scoring/RegressionMetricExample.java
@@ -21,6 +21,8 @@
 import org.apache.ignite.Ignite;
 import org.apache.ignite.IgniteCache;
 import org.apache.ignite.Ignition;
+import org.apache.ignite.examples.ml.util.MLSandboxDatasets;
+import org.apache.ignite.examples.ml.util.SandboxMLCache;
 import org.apache.ignite.ml.dataset.feature.extractor.Vectorizer;
 import org.apache.ignite.ml.dataset.feature.extractor.impl.DummyVectorizer;
 import org.apache.ignite.ml.knn.regression.KNNRegressionModel;
@@ -30,8 +32,6 @@
 import org.apache.ignite.ml.math.primitives.vector.Vector;
 import org.apache.ignite.ml.selection.scoring.evaluator.Evaluator;
 import org.apache.ignite.ml.selection.scoring.metric.MetricName;
-import org.apache.ignite.ml.util.MLSandboxDatasets;
-import org.apache.ignite.ml.util.SandboxMLCache;
 
 /**
  * Run kNN regression trainer ({@link KNNRegressionTrainer}) over distributed dataset.
@@ -78,7 +78,8 @@
                 System.out.println("\n>>> Mae " + mae);
             }
             finally {
-                dataCache.destroy();
+                if (dataCache != null)
+                    dataCache.destroy();
             }
         }
         finally {
diff --git a/examples/src/main/java/org/apache/ignite/examples/ml/selection/split/TrainTestDatasetSplitterExample.java b/examples/src/main/java/org/apache/ignite/examples/ml/selection/split/TrainTestDatasetSplitterExample.java
index 04fe5e0..5c7f02ed 100644
--- a/examples/src/main/java/org/apache/ignite/examples/ml/selection/split/TrainTestDatasetSplitterExample.java
+++ b/examples/src/main/java/org/apache/ignite/examples/ml/selection/split/TrainTestDatasetSplitterExample.java
@@ -24,6 +24,8 @@
 import org.apache.ignite.Ignition;
 import org.apache.ignite.cache.query.QueryCursor;
 import org.apache.ignite.cache.query.ScanQuery;
+import org.apache.ignite.examples.ml.util.MLSandboxDatasets;
+import org.apache.ignite.examples.ml.util.SandboxMLCache;
 import org.apache.ignite.ml.dataset.feature.extractor.Vectorizer;
 import org.apache.ignite.ml.dataset.feature.extractor.impl.DummyVectorizer;
 import org.apache.ignite.ml.math.primitives.vector.Vector;
@@ -31,8 +33,6 @@
 import org.apache.ignite.ml.regressions.linear.LinearRegressionModel;
 import org.apache.ignite.ml.selection.split.TrainTestDatasetSplitter;
 import org.apache.ignite.ml.selection.split.TrainTestSplit;
-import org.apache.ignite.ml.util.MLSandboxDatasets;
-import org.apache.ignite.ml.util.SandboxMLCache;
 
 /**
  * Run linear regression model over dataset split on train and test subsets ({@link TrainTestDatasetSplitter}).
@@ -100,7 +100,8 @@
                 System.out.println(">>> Linear regression model over cache based dataset usage example completed.");
             }
             finally {
-                dataCache.destroy();
+                if (dataCache != null)
+                    dataCache.destroy();
             }
         }
         finally {
diff --git a/examples/src/main/java/org/apache/ignite/examples/ml/svm/SVMBinaryClassificationExample.java b/examples/src/main/java/org/apache/ignite/examples/ml/svm/SVMBinaryClassificationExample.java
index 3850749..20b3b2f 100644
--- a/examples/src/main/java/org/apache/ignite/examples/ml/svm/SVMBinaryClassificationExample.java
+++ b/examples/src/main/java/org/apache/ignite/examples/ml/svm/SVMBinaryClassificationExample.java
@@ -21,6 +21,8 @@
 import org.apache.ignite.Ignite;
 import org.apache.ignite.IgniteCache;
 import org.apache.ignite.Ignition;
+import org.apache.ignite.examples.ml.util.MLSandboxDatasets;
+import org.apache.ignite.examples.ml.util.SandboxMLCache;
 import org.apache.ignite.ml.dataset.feature.extractor.Vectorizer;
 import org.apache.ignite.ml.dataset.feature.extractor.impl.DummyVectorizer;
 import org.apache.ignite.ml.math.primitives.vector.Vector;
@@ -28,8 +30,6 @@
 import org.apache.ignite.ml.selection.scoring.metric.MetricName;
 import org.apache.ignite.ml.svm.SVMLinearClassificationModel;
 import org.apache.ignite.ml.svm.SVMLinearClassificationTrainer;
-import org.apache.ignite.ml.util.MLSandboxDatasets;
-import org.apache.ignite.ml.util.SandboxMLCache;
 
 /**
  * Run SVM binary-class classification model ({@link SVMLinearClassificationModel}) over distributed dataset.
@@ -78,7 +78,8 @@
                 System.out.println(">>> SVM Binary classification model over cache based dataset usage example completed.");
             }
             finally {
-                dataCache.destroy();
+                if (dataCache != null)
+                    dataCache.destroy();
             }
         }
         finally {
diff --git a/examples/src/main/java/org/apache/ignite/examples/ml/tree/FraudDetectionExample.java b/examples/src/main/java/org/apache/ignite/examples/ml/tree/FraudDetectionExample.java
index 1dab807..ed758d4 100644
--- a/examples/src/main/java/org/apache/ignite/examples/ml/tree/FraudDetectionExample.java
+++ b/examples/src/main/java/org/apache/ignite/examples/ml/tree/FraudDetectionExample.java
@@ -21,6 +21,8 @@
 import org.apache.ignite.Ignite;
 import org.apache.ignite.IgniteCache;
 import org.apache.ignite.Ignition;
+import org.apache.ignite.examples.ml.util.MLSandboxDatasets;
+import org.apache.ignite.examples.ml.util.SandboxMLCache;
 import org.apache.ignite.ml.IgniteModel;
 import org.apache.ignite.ml.dataset.feature.extractor.Vectorizer;
 import org.apache.ignite.ml.dataset.feature.extractor.impl.DummyVectorizer;
@@ -32,8 +34,6 @@
 import org.apache.ignite.ml.selection.split.TrainTestSplit;
 import org.apache.ignite.ml.trainers.DatasetTrainer;
 import org.apache.ignite.ml.tree.DecisionTreeClassificationTrainer;
-import org.apache.ignite.ml.util.MLSandboxDatasets;
-import org.apache.ignite.ml.util.SandboxMLCache;
 
 /**
  * Example of using classification algorithms for fraud detection problem.
@@ -79,7 +79,8 @@
                 );
             }
             finally {
-                dataCache.destroy();
+                if (dataCache != null)
+                    dataCache.destroy();
             }
         }
         finally {
diff --git a/examples/src/main/java/org/apache/ignite/examples/ml/tree/randomforest/RandomForestClassificationExample.java b/examples/src/main/java/org/apache/ignite/examples/ml/tree/randomforest/RandomForestClassificationExample.java
index 15cc5d4..0d9dbef 100644
--- a/examples/src/main/java/org/apache/ignite/examples/ml/tree/randomforest/RandomForestClassificationExample.java
+++ b/examples/src/main/java/org/apache/ignite/examples/ml/tree/randomforest/RandomForestClassificationExample.java
@@ -28,6 +28,8 @@
 import org.apache.ignite.Ignition;
 import org.apache.ignite.cache.query.QueryCursor;
 import org.apache.ignite.cache.query.ScanQuery;
+import org.apache.ignite.examples.ml.util.MLSandboxDatasets;
+import org.apache.ignite.examples.ml.util.SandboxMLCache;
 import org.apache.ignite.ml.composition.ModelsComposition;
 import org.apache.ignite.ml.dataset.feature.FeatureMeta;
 import org.apache.ignite.ml.dataset.feature.extractor.Vectorizer;
@@ -35,8 +37,6 @@
 import org.apache.ignite.ml.math.primitives.vector.Vector;
 import org.apache.ignite.ml.tree.randomforest.RandomForestClassifierTrainer;
 import org.apache.ignite.ml.tree.randomforest.data.FeaturesCountSelectionStrategies;
-import org.apache.ignite.ml.util.MLSandboxDatasets;
-import org.apache.ignite.ml.util.SandboxMLCache;
 
 /**
  * Example represents a solution for the task of wine classification based on a
diff --git a/examples/src/main/java/org/apache/ignite/examples/ml/tree/randomforest/RandomForestRegressionExample.java b/examples/src/main/java/org/apache/ignite/examples/ml/tree/randomforest/RandomForestRegressionExample.java
index cb2b1d0..714589a 100644
--- a/examples/src/main/java/org/apache/ignite/examples/ml/tree/randomforest/RandomForestRegressionExample.java
+++ b/examples/src/main/java/org/apache/ignite/examples/ml/tree/randomforest/RandomForestRegressionExample.java
@@ -27,6 +27,8 @@
 import org.apache.ignite.Ignition;
 import org.apache.ignite.cache.query.QueryCursor;
 import org.apache.ignite.cache.query.ScanQuery;
+import org.apache.ignite.examples.ml.util.MLSandboxDatasets;
+import org.apache.ignite.examples.ml.util.SandboxMLCache;
 import org.apache.ignite.ml.composition.ModelsComposition;
 import org.apache.ignite.ml.dataset.feature.FeatureMeta;
 import org.apache.ignite.ml.dataset.feature.extractor.Vectorizer;
@@ -37,8 +39,6 @@
 import org.apache.ignite.ml.math.primitives.vector.Vector;
 import org.apache.ignite.ml.tree.randomforest.RandomForestRegressionTrainer;
 import org.apache.ignite.ml.tree.randomforest.data.FeaturesCountSelectionStrategies;
-import org.apache.ignite.ml.util.MLSandboxDatasets;
-import org.apache.ignite.ml.util.SandboxMLCache;
 
 /**
  * Example represents a solution for the task of price predictions for houses in Boston based on a
@@ -125,7 +125,8 @@
                 }
             }
             finally {
-                dataCache.destroy();
+                if (dataCache != null)
+                    dataCache.destroy();
             }
         }
         finally {
diff --git a/examples/src/main/java/org/apache/ignite/examples/ml/tutorial/Step_8_CV_with_Param_Grid.java b/examples/src/main/java/org/apache/ignite/examples/ml/tutorial/Step_8_CV_with_Param_Grid.java
index c2b2c1a..5b62714 100644
--- a/examples/src/main/java/org/apache/ignite/examples/ml/tutorial/Step_8_CV_with_Param_Grid.java
+++ b/examples/src/main/java/org/apache/ignite/examples/ml/tutorial/Step_8_CV_with_Param_Grid.java
@@ -123,7 +123,7 @@
                     = new CrossValidation<>();
 
                 ParamGrid paramGrid = new ParamGrid()
-                    .addHyperParam("maxDeep", trainerCV::withMaxDeep, new Double[] {1.0, 2.0, 3.0, 4.0, 5.0, 10.0, 10.0})
+                    .addHyperParam("maxDeep", trainerCV::withMaxDeep, new Double[] {1.0, 2.0, 3.0, 4.0, 5.0, 10.0})
                     .addHyperParam("minImpurityDecrease", trainerCV::withMinImpurityDecrease, new Double[] {0.0, 0.25, 0.5});
 
                 scoreCalculator
@@ -175,7 +175,7 @@
                 System.out.println("\n>>> Accuracy " + accuracy);
                 System.out.println("\n>>> Test Error " + (1 - accuracy));
 
-                System.out.println(">>> Tutorial step 8 (cross-validation with param grid) example started.");
+                System.out.println(">>> Tutorial step 8 (cross-validation with param grid) example completed.");
             }
             catch (FileNotFoundException e) {
                 e.printStackTrace();
diff --git a/examples/src/main/java/org/apache/ignite/examples/ml/tutorial/Step_8_CV_with_Param_Grid_and_metrics.java b/examples/src/main/java/org/apache/ignite/examples/ml/tutorial/Step_8_CV_with_Param_Grid_and_metrics.java
deleted file mode 100644
index ef1defd..0000000
--- a/examples/src/main/java/org/apache/ignite/examples/ml/tutorial/Step_8_CV_with_Param_Grid_and_metrics.java
+++ /dev/null
@@ -1,188 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package org.apache.ignite.examples.ml.tutorial;
-
-import java.io.FileNotFoundException;
-import java.util.Arrays;
-import org.apache.ignite.Ignite;
-import org.apache.ignite.IgniteCache;
-import org.apache.ignite.Ignition;
-import org.apache.ignite.ml.dataset.feature.extractor.Vectorizer;
-import org.apache.ignite.ml.dataset.feature.extractor.impl.DummyVectorizer;
-import org.apache.ignite.ml.math.primitives.vector.Vector;
-import org.apache.ignite.ml.preprocessing.Preprocessor;
-import org.apache.ignite.ml.preprocessing.encoding.EncoderTrainer;
-import org.apache.ignite.ml.preprocessing.encoding.EncoderType;
-import org.apache.ignite.ml.preprocessing.imputing.ImputerTrainer;
-import org.apache.ignite.ml.preprocessing.minmaxscaling.MinMaxScalerTrainer;
-import org.apache.ignite.ml.preprocessing.normalization.NormalizationTrainer;
-import org.apache.ignite.ml.selection.cv.CrossValidation;
-import org.apache.ignite.ml.selection.cv.CrossValidationResult;
-import org.apache.ignite.ml.selection.paramgrid.ParamGrid;
-import org.apache.ignite.ml.selection.scoring.evaluator.Evaluator;
-import org.apache.ignite.ml.selection.scoring.metric.MetricName;
-import org.apache.ignite.ml.selection.scoring.metric.classification.Accuracy;
-import org.apache.ignite.ml.selection.split.TrainTestDatasetSplitter;
-import org.apache.ignite.ml.selection.split.TrainTestSplit;
-import org.apache.ignite.ml.tree.DecisionTreeClassificationTrainer;
-import org.apache.ignite.ml.tree.DecisionTreeNode;
-
-/**
- * To choose the best hyper-parameters the cross-validation with {@link ParamGrid} will be used in this example.
- * <p>
- * Code in this example launches Ignite grid and fills the cache with test data (based on Titanic passengers data).</p>
- * <p>
- * After that it defines how to split the data to train and test sets and configures preprocessors that extract features
- * from an upstream data and perform other desired changes over the extracted data.</p>
- * <p>
- * Then, it tunes hyper-parameters with K-fold Cross-Validation on the split training set and trains the model based on the
- * processed data using decision tree classification and the obtained hyper-parameters.</p>
- * <p>
- * Finally, this example uses {@link Evaluator} functionality to compute metrics from predictions.</p>
- * <p>
- * The purpose of cross-validation is model checking, not model building.</p>
- * <p>
- * We train {@code k} different models.</p>
- * <p>
- * They differ in that {@code 1/(k-1)}th of the training data is exchanged against other cases.</p>
- * <p>
- * These models are sometimes called surrogate models because the (average) performance measured for these models is
- * taken as a surrogate of the performance of the model trained on all cases.</p>
- * <p>
- * All scenarios are described there: https://sebastianraschka.com/faq/docs/evaluate-a-model.html</p>
- */
-public class Step_8_CV_with_Param_Grid_and_metrics {
-    /**
-     * Run example.
-     */
-    public static void main(String[] args) {
-        System.out.println();
-        System.out.println(">>> Tutorial step 8 (cross-validation with param grid) example started.");
-
-        try (Ignite ignite = Ignition.start("examples/config/example-ignite.xml")) {
-            try {
-                IgniteCache<Integer, Vector> dataCache = TitanicUtils.readPassengers(ignite);
-
-                // Extracts "pclass", "sibsp", "parch", "sex", "embarked", "age", "fare".
-                final Vectorizer<Integer, Vector, Integer, Double> vectorizer
-                    = new DummyVectorizer<Integer>(0, 3, 4, 5, 6, 8, 10).labeled(1);
-
-                TrainTestSplit<Integer, Vector> split = new TrainTestDatasetSplitter<Integer, Vector>()
-                    .split(0.75);
-
-                Preprocessor<Integer, Vector> strEncoderPreprocessor = new EncoderTrainer<Integer, Vector>()
-                    .withEncoderType(EncoderType.STRING_ENCODER)
-                    .withEncodedFeature(1)
-                    .withEncodedFeature(6) // <--- Changed index here.
-                    .fit(ignite,
-                        dataCache,
-                        vectorizer
-                    );
-
-                Preprocessor<Integer, Vector> imputingPreprocessor = new ImputerTrainer<Integer, Vector>()
-                    .fit(ignite,
-                        dataCache,
-                        strEncoderPreprocessor
-                    );
-
-                Preprocessor<Integer, Vector> minMaxScalerPreprocessor = new MinMaxScalerTrainer<Integer, Vector>()
-                    .fit(
-                        ignite,
-                        dataCache,
-                        imputingPreprocessor
-                    );
-
-                Preprocessor<Integer, Vector> normalizationPreprocessor = new NormalizationTrainer<Integer, Vector>()
-                    .withP(1)
-                    .fit(
-                        ignite,
-                        dataCache,
-                        minMaxScalerPreprocessor
-                    );
-
-                // Tune hyper-parameters with K-fold Cross-Validation on the split training set.
-
-                DecisionTreeClassificationTrainer trainerCV = new DecisionTreeClassificationTrainer();
-
-                CrossValidation<DecisionTreeNode, Integer, Vector> scoreCalculator
-                    = new CrossValidation<>();
-
-                ParamGrid paramGrid = new ParamGrid()
-                    .addHyperParam("maxDeep", trainerCV::withMaxDeep, new Double[] {1.0, 2.0, 3.0, 4.0, 5.0, 10.0})
-                    .addHyperParam("minImpurityDecrease", trainerCV::withMinImpurityDecrease, new Double[] {0.0, 0.25, 0.5});
-
-                scoreCalculator
-                    .withIgnite(ignite)
-                    .withUpstreamCache(dataCache)
-                    .withTrainer(trainerCV)
-                    .withMetric(MetricName.ACCURACY)
-                    .withFilter(split.getTrainFilter())
-                    .isRunningOnPipeline(false)
-                    .withPreprocessor(normalizationPreprocessor)
-                    .withAmountOfFolds(3)
-                    .withParamGrid(paramGrid);
-
-                CrossValidationResult crossValidationRes = scoreCalculator.tuneHyperParameters();
-
-                System.out.println("Train with maxDeep: " + crossValidationRes.getBest("maxDeep")
-                    + " and minImpurityDecrease: " + crossValidationRes.getBest("minImpurityDecrease"));
-
-                DecisionTreeClassificationTrainer trainer = new DecisionTreeClassificationTrainer()
-                    .withMaxDeep(crossValidationRes.getBest("maxDeep"))
-                    .withMinImpurityDecrease(crossValidationRes.getBest("minImpurityDecrease"));
-
-                System.out.println(crossValidationRes);
-
-                System.out.println("Best score: " + Arrays.toString(crossValidationRes.getBestScore()));
-                System.out.println("Best hyper params: " + crossValidationRes.getBestHyperParams());
-                System.out.println("Best average score: " + crossValidationRes.getBestAvgScore());
-
-                crossValidationRes.getScoringBoard().forEach((hyperParams, score)
-                    -> System.out.println("Score " + Arrays.toString(score) + " for hyper params " + hyperParams));
-
-                // Train decision tree model.
-                DecisionTreeNode bestMdl = trainer.fit(
-                    ignite,
-                    dataCache,
-                    split.getTrainFilter(),
-                    normalizationPreprocessor
-                );
-
-                System.out.println("\n>>> Trained model: " + bestMdl);
-
-                double accuracy = Evaluator.evaluate(
-                    dataCache, split.getTestFilter(),
-                    bestMdl,
-                    normalizationPreprocessor,
-                    new Accuracy<>()
-                );
-
-                System.out.println("\n>>> Accuracy " + accuracy);
-                System.out.println("\n>>> Test Error " + (1 - accuracy));
-
-                System.out.println(">>> Tutorial step 8 (cross-validation with param grid) example started.");
-            }
-            catch (FileNotFoundException e) {
-                e.printStackTrace();
-            }
-        }
-        finally {
-            System.out.flush();
-        }
-    }
-}
diff --git a/examples/src/main/java/org/apache/ignite/examples/ml/tutorial/Step_8_CV_with_Param_Grid_and_metrics_and_pipeline.java b/examples/src/main/java/org/apache/ignite/examples/ml/tutorial/Step_8_CV_with_Param_Grid_and_pipeline.java
similarity index 96%
rename from examples/src/main/java/org/apache/ignite/examples/ml/tutorial/Step_8_CV_with_Param_Grid_and_metrics_and_pipeline.java
rename to examples/src/main/java/org/apache/ignite/examples/ml/tutorial/Step_8_CV_with_Param_Grid_and_pipeline.java
index 24f2d6d..6be8496 100644
--- a/examples/src/main/java/org/apache/ignite/examples/ml/tutorial/Step_8_CV_with_Param_Grid_and_metrics_and_pipeline.java
+++ b/examples/src/main/java/org/apache/ignite/examples/ml/tutorial/Step_8_CV_with_Param_Grid_and_pipeline.java
@@ -62,13 +62,13 @@
  * <p>
  * All scenarios are described there: https://sebastianraschka.com/faq/docs/evaluate-a-model.html</p>
  */
-public class Step_8_CV_with_Param_Grid_and_metrics_and_pipeline {
+public class Step_8_CV_with_Param_Grid_and_pipeline {
     /**
      * Run example.
      */
     public static void main(String[] args) {
         System.out.println();
-        System.out.println(">>> Tutorial step 8 (cross-validation with param grid) example started.");
+        System.out.println(">>> Tutorial step 8 (cross-validation with param grid and pipeline) example started.");
 
         try (Ignite ignite = Ignition.start("examples/config/example-ignite.xml")) {
             try {
@@ -104,7 +104,6 @@
                     .withPipeline(pipeline)
                     .withMetric(MetricName.ACCURACY)
                     .withFilter(split.getTrainFilter())
-                    .withPreprocessor(vectorizer)
                     .withAmountOfFolds(3)
                     .withParamGrid(paramGrid);
 
@@ -122,6 +121,7 @@
                 crossValidationRes.getScoringBoard().forEach((hyperParams, score)
                     -> System.out.println("Score " + Arrays.toString(score) + " for hyper params " + hyperParams));
 
+                System.out.println(">>> Tutorial step 8 (cross-validation with param grid and pipeline) example completed.");
             }
             catch (FileNotFoundException e) {
                 e.printStackTrace();
diff --git a/examples/src/main/java/org/apache/ignite/examples/ml/tutorial/Step_9_Scaling_With_Stacking.java b/examples/src/main/java/org/apache/ignite/examples/ml/tutorial/Step_9_Scaling_With_Stacking.java
index bb710d3..7199257 100644
--- a/examples/src/main/java/org/apache/ignite/examples/ml/tutorial/Step_9_Scaling_With_Stacking.java
+++ b/examples/src/main/java/org/apache/ignite/examples/ml/tutorial/Step_9_Scaling_With_Stacking.java
@@ -138,7 +138,7 @@
                 System.out.println("\n>>> Accuracy " + accuracy);
                 System.out.println("\n>>> Test Error " + (1 - accuracy));
 
-                System.out.println(">>> Tutorial step 5 (scaling) example completed.");
+                System.out.println(">>> Tutorial step 9 (scaling with stacking) example completed.");
             }
             catch (FileNotFoundException e) {
                 e.printStackTrace();
diff --git a/examples/src/main/java/org/apache/ignite/examples/ml/tutorial/TutorialStepByStepExample.java b/examples/src/main/java/org/apache/ignite/examples/ml/tutorial/TutorialStepByStepExample.java
index 5dd1551..8ef5fe0 100644
--- a/examples/src/main/java/org/apache/ignite/examples/ml/tutorial/TutorialStepByStepExample.java
+++ b/examples/src/main/java/org/apache/ignite/examples/ml/tutorial/TutorialStepByStepExample.java
@@ -18,7 +18,7 @@
 package org.apache.ignite.examples.ml.tutorial;
 
 import org.apache.ignite.examples.ml.tutorial.hyperparametertuning.Step_13_RandomSearch;
-import org.apache.ignite.examples.ml.tutorial.hyperparametertuning.Step_14_Parallel_BrutForce_Search;
+import org.apache.ignite.examples.ml.tutorial.hyperparametertuning.Step_14_Parallel_Brute_Force_Search;
 import org.apache.ignite.examples.ml.tutorial.hyperparametertuning.Step_15_Parallel_Random_Search;
 import org.apache.ignite.examples.ml.tutorial.hyperparametertuning.Step_16_Genetic_Programming_Search;
 import org.apache.ignite.examples.ml.tutorial.hyperparametertuning.Step_17_Parallel_Genetic_Programming_Search;
@@ -42,12 +42,13 @@
         Step_7_Split_train_test.main(args);
         Step_8_CV.main(args);
         Step_8_CV_with_Param_Grid.main(args);
+        Step_8_CV_with_Param_Grid_and_pipeline.main(args);
         Step_9_Scaling_With_Stacking.main(args);
         Step_10_Bagging.main(args);
         Step_11_Boosting.main(args);
         Step_12_Model_Update.main(args);
         Step_13_RandomSearch.main(args);
-        Step_14_Parallel_BrutForce_Search.main(args);
+        Step_14_Parallel_Brute_Force_Search.main(args);
         Step_15_Parallel_Random_Search.main(args);
         Step_16_Genetic_Programming_Search.main(args);
         Step_17_Parallel_Genetic_Programming_Search.main(args);
diff --git a/examples/src/main/java/org/apache/ignite/examples/ml/tutorial/hyperparametertuning/Step_13_RandomSearch.java b/examples/src/main/java/org/apache/ignite/examples/ml/tutorial/hyperparametertuning/Step_13_RandomSearch.java
index dcf94a0..d7e2f27 100644
--- a/examples/src/main/java/org/apache/ignite/examples/ml/tutorial/hyperparametertuning/Step_13_RandomSearch.java
+++ b/examples/src/main/java/org/apache/ignite/examples/ml/tutorial/hyperparametertuning/Step_13_RandomSearch.java
@@ -73,6 +73,9 @@
      * Run example.
      */
     public static void main(String[] args) {
+        System.out.println();
+        System.out.println(">>> Tutorial step 13 (Random Search) example started.");
+
         try (Ignite ignite = Ignition.start("examples/config/example-ignite.xml")) {
             try {
                 IgniteCache<Integer, Vector> dataCache = TitanicUtils.readPassengers(ignite);
@@ -182,7 +185,7 @@
                 System.out.println("\n>>> Accuracy " + accuracy);
                 System.out.println("\n>>> Test Error " + (1 - accuracy));
 
-                System.out.println(">>> Tutorial step 8 (cross-validation with param grid) example started.");
+                System.out.println(">>> Tutorial step 13 (Random Search) example completed.");
             }
             catch (FileNotFoundException e) {
                 e.printStackTrace();
diff --git a/examples/src/main/java/org/apache/ignite/examples/ml/tutorial/hyperparametertuning/Step_14_Parallel_BrutForce_Search.java b/examples/src/main/java/org/apache/ignite/examples/ml/tutorial/hyperparametertuning/Step_14_Parallel_Brute_Force_Search.java
similarity index 97%
rename from examples/src/main/java/org/apache/ignite/examples/ml/tutorial/hyperparametertuning/Step_14_Parallel_BrutForce_Search.java
rename to examples/src/main/java/org/apache/ignite/examples/ml/tutorial/hyperparametertuning/Step_14_Parallel_Brute_Force_Search.java
index 2fa6b40..017f123 100644
--- a/examples/src/main/java/org/apache/ignite/examples/ml/tutorial/hyperparametertuning/Step_14_Parallel_BrutForce_Search.java
+++ b/examples/src/main/java/org/apache/ignite/examples/ml/tutorial/hyperparametertuning/Step_14_Parallel_Brute_Force_Search.java
@@ -71,11 +71,14 @@
  * <p>
  * All scenarios are described there: https://sebastianraschka.com/faq/docs/evaluate-a-model.html</p>
  */
-public class Step_14_Parallel_BrutForce_Search {
+public class Step_14_Parallel_Brute_Force_Search {
     /**
      * Run example.
      */
     public static void main(String[] args) {
+        System.out.println();
+        System.out.println(">>> Tutorial step 14 (Brute Force) example started.");
+
         try (Ignite ignite = Ignition.start("examples/config/example-ignite.xml")) {
             try {
                 IgniteCache<Integer, Vector> dataCache = TitanicUtils.readPassengers(ignite);
@@ -184,7 +187,7 @@
                 System.out.println("\n>>> Accuracy " + accuracy);
                 System.out.println("\n>>> Test Error " + (1 - accuracy));
 
-                System.out.println(">>> Tutorial step 8 (cross-validation with param grid) example started.");
+                System.out.println(">>> Tutorial step 14 (Brute Force) example completed.");
             }
             catch (FileNotFoundException e) {
                 e.printStackTrace();
diff --git a/examples/src/main/java/org/apache/ignite/examples/ml/tutorial/hyperparametertuning/Step_15_Parallel_Random_Search.java b/examples/src/main/java/org/apache/ignite/examples/ml/tutorial/hyperparametertuning/Step_15_Parallel_Random_Search.java
index c0cf6c4..3a3e9e8 100644
--- a/examples/src/main/java/org/apache/ignite/examples/ml/tutorial/hyperparametertuning/Step_15_Parallel_Random_Search.java
+++ b/examples/src/main/java/org/apache/ignite/examples/ml/tutorial/hyperparametertuning/Step_15_Parallel_Random_Search.java
@@ -76,6 +76,9 @@
      * Run example.
      */
     public static void main(String[] args) {
+        System.out.println();
+        System.out.println(">>> Tutorial step 15 (Parallel Random Search) example started.");
+
         try (Ignite ignite = Ignition.start("examples/config/example-ignite.xml")) {
             try {
                 IgniteCache<Integer, Vector> dataCache = TitanicUtils.readPassengers(ignite);
@@ -187,7 +190,7 @@
                 System.out.println("\n>>> Accuracy " + accuracy);
                 System.out.println("\n>>> Test Error " + (1 - accuracy));
 
-                System.out.println(">>> Tutorial step 8 (cross-validation with param grid) example started.");
+                System.out.println(">>> Tutorial step 15 (Parallel Random Search) example completed.");
             }
             catch (FileNotFoundException e) {
                 e.printStackTrace();
diff --git a/examples/src/main/java/org/apache/ignite/examples/ml/tutorial/hyperparametertuning/Step_16_Genetic_Programming_Search.java b/examples/src/main/java/org/apache/ignite/examples/ml/tutorial/hyperparametertuning/Step_16_Genetic_Programming_Search.java
index 7261c5a..bee51e4 100644
--- a/examples/src/main/java/org/apache/ignite/examples/ml/tutorial/hyperparametertuning/Step_16_Genetic_Programming_Search.java
+++ b/examples/src/main/java/org/apache/ignite/examples/ml/tutorial/hyperparametertuning/Step_16_Genetic_Programming_Search.java
@@ -73,6 +73,9 @@
      * Run example.
      */
     public static void main(String[] args) {
+        System.out.println();
+        System.out.println(">>> Tutorial step 16 (Genetic Programming) example started.");
+
         try (Ignite ignite = Ignition.start("examples/config/example-ignite.xml")) {
             try {
                 IgniteCache<Integer, Vector> dataCache = TitanicUtils.readPassengers(ignite);
@@ -178,7 +181,7 @@
                 System.out.println("\n>>> Accuracy " + accuracy);
                 System.out.println("\n>>> Test Error " + (1 - accuracy));
 
-                System.out.println(">>> Tutorial step 8 (cross-validation with param grid) example started.");
+                System.out.println(">>> Tutorial step 16 (Genetic Programming) example completed.");
             }
             catch (FileNotFoundException e) {
                 e.printStackTrace();
diff --git a/examples/src/main/java/org/apache/ignite/examples/ml/tutorial/hyperparametertuning/Step_17_Parallel_Genetic_Programming_Search.java b/examples/src/main/java/org/apache/ignite/examples/ml/tutorial/hyperparametertuning/Step_17_Parallel_Genetic_Programming_Search.java
index 446d914..34a8158 100644
--- a/examples/src/main/java/org/apache/ignite/examples/ml/tutorial/hyperparametertuning/Step_17_Parallel_Genetic_Programming_Search.java
+++ b/examples/src/main/java/org/apache/ignite/examples/ml/tutorial/hyperparametertuning/Step_17_Parallel_Genetic_Programming_Search.java
@@ -76,6 +76,9 @@
      * Run example.
      */
     public static void main(String[] args) {
+        System.out.println();
+        System.out.println(">>> Tutorial step 17 (Parallel Genetic Programming) example started.");
+
         try (Ignite ignite = Ignition.start("examples/config/example-ignite.xml")) {
             try {
                 IgniteCache<Integer, Vector> dataCache = TitanicUtils.readPassengers(ignite);
@@ -184,7 +187,7 @@
                 System.out.println("\n>>> Accuracy " + accuracy);
                 System.out.println("\n>>> Test Error " + (1 - accuracy));
 
-                System.out.println(">>> Tutorial step 8 (cross-validation with param grid) example started.");
+                System.out.println(">>> Tutorial step 17 (Parallel Genetic Programming) example completed.");
             }
             catch (FileNotFoundException e) {
                 e.printStackTrace();
diff --git a/modules/ml/src/main/java/org/apache/ignite/ml/util/MLSandboxDatasets.java b/examples/src/main/java/org/apache/ignite/examples/ml/util/MLSandboxDatasets.java
similarity index 71%
rename from modules/ml/src/main/java/org/apache/ignite/ml/util/MLSandboxDatasets.java
rename to examples/src/main/java/org/apache/ignite/examples/ml/util/MLSandboxDatasets.java
index 4b7a2e8..7021e7d 100644
--- a/modules/ml/src/main/java/org/apache/ignite/ml/util/MLSandboxDatasets.java
+++ b/examples/src/main/java/org/apache/ignite/examples/ml/util/MLSandboxDatasets.java
@@ -15,60 +15,60 @@
  * limitations under the License.
  */
 
-package org.apache.ignite.ml.util;
+package org.apache.ignite.examples.ml.util;
 
 /**
  * The names of popular datasets used in examples.
  */
 public enum MLSandboxDatasets {
     /** Movielens dataset with ratings. */
-    MOVIELENS("modules/ml/src/main/resources/datasets/ratings.csv", true, ","),
+    MOVIELENS("examples/src/main/resources/datasets/ratings.csv", true, ","),
 
     /** The full Iris dataset from Machine Learning Repository. */
-    IRIS("modules/ml/src/main/resources/datasets/iris.txt", false, "\t"),
+    IRIS("examples/src/main/resources/datasets/iris.txt", false, "\t"),
 
     /** The Titanic dataset from Kaggle competition. */
-    TITANIC("modules/ml/src/main/resources/datasets/titanic.csv", true, ";"),
+    TITANIC("examples/src/main/resources/datasets/titanic.csv", true, ";"),
 
     /** The 1st and 2nd classes from the Iris dataset. */
-    TWO_CLASSED_IRIS("modules/ml/src/main/resources/datasets/two_classed_iris.csv", false, "\t"),
+    TWO_CLASSED_IRIS("examples/src/main/resources/datasets/two_classed_iris.csv", false, "\t"),
 
     /** The dataset is about different computers' properties based on https://archive.ics.uci.edu/ml/datasets/Computer+Hardware. */
-    CLEARED_MACHINES("modules/ml/src/main/resources/datasets/cleared_machines.csv", false, ";"),
+    CLEARED_MACHINES("examples/src/main/resources/datasets/cleared_machines.csv", false, ";"),
 
     /**
      * The health data is related to death rate based on; doctor availability, hospital availability,
      * annual per capita income, and population density people per square mile.
      */
-    MORTALITY_DATA("modules/ml/src/main/resources/datasets/mortalitydata.csv", false, ";"),
+    MORTALITY_DATA("examples/src/main/resources/datasets/mortalitydata.csv", false, ";"),
 
     /**
      * The preprocessed Glass dataset from the Machine Learning Repository https://archive.ics.uci.edu/ml/datasets/Glass+Identification
      * There are 3 classes with labels: 1 {building_windows_float_processed}, 3 {vehicle_windows_float_processed}, 7 {headlamps}.
      * Feature names: 'Na-Sodium', 'Mg-Magnesium', 'Al-Aluminum', 'Ba-Barium', 'Fe-Iron'.
      */
-    GLASS_IDENTIFICATION("modules/ml/src/main/resources/datasets/glass_identification.csv", false, ";"),
+    GLASS_IDENTIFICATION("examples/src/main/resources/datasets/glass_identification.csv", false, ";"),
 
     /** The Wine recognition data. Could be found <a href="https://archive.ics.uci.edu/ml/machine-learning-databases/wine/">here</a>. */
-    WINE_RECOGNITION("modules/ml/src/main/resources/datasets/wine.txt", false, ","),
+    WINE_RECOGNITION("examples/src/main/resources/datasets/wine.txt", false, ","),
 
     /** The Boston house-prices dataset. Could be found <a href="https://archive.ics.uci.edu/ml/machine-learning-databases/housing/">here</a>. */
-    BOSTON_HOUSE_PRICES("modules/ml/src/main/resources/datasets/boston_housing_dataset.txt", false, ","),
+    BOSTON_HOUSE_PRICES("examples/src/main/resources/datasets/boston_housing_dataset.txt", false, ","),
 
     /** Example from book Barber D. Bayesian reasoning and machine learning. Chapter 10. */
-    ENGLISH_VS_SCOTTISH("modules/ml/src/main/resources/datasets/english_vs_scottish_binary_dataset.csv", true, ","),
+    ENGLISH_VS_SCOTTISH("examples/src/main/resources/datasets/english_vs_scottish_binary_dataset.csv", true, ","),
 
     /** Wholesale customers dataset. Could be found <a href="https://archive.ics.uci.edu/ml/datasets/Wholesale+customers">here</a>. */
-    WHOLESALE_CUSTOMERS("modules/ml/src/main/resources/datasets/wholesale_customers.csv", true, ","),
+    WHOLESALE_CUSTOMERS("examples/src/main/resources/datasets/wholesale_customers.csv", true, ","),
 
     /** Fraud detection problem [part of whole dataset]. Could be found <a href="https://www.kaggle.com/mlg-ulb/creditcardfraud/">here</a>. */
-    FRAUD_DETECTION("modules/ml/src/main/resources/datasets/fraud_detection.csv", false, ","),
+    FRAUD_DETECTION("examples/src/main/resources/datasets/fraud_detection.csv", false, ","),
 
     /** A dataset with discrete and continuous features. */
-    MIXED_DATASET("modules/ml/src/main/resources/datasets/mixed_dataset.csv", true, ","),
+    MIXED_DATASET("examples/src/main/resources/datasets/mixed_dataset.csv", true, ","),
 
     /** A dataset with categorical features and labels. */
-    MUSHROOMS("modules/ml/src/main/resources/datasets/mushrooms.csv", true, ",");
+    MUSHROOMS("examples/src/main/resources/datasets/mushrooms.csv", true, ",");
 
     /** Filename. */
     private final String filename;
diff --git a/modules/ml/src/main/java/org/apache/ignite/ml/util/SandboxMLCache.java b/examples/src/main/java/org/apache/ignite/examples/ml/util/SandboxMLCache.java
similarity index 98%
rename from modules/ml/src/main/java/org/apache/ignite/ml/util/SandboxMLCache.java
rename to examples/src/main/java/org/apache/ignite/examples/ml/util/SandboxMLCache.java
index 81e38e2..341a341 100644
--- a/modules/ml/src/main/java/org/apache/ignite/ml/util/SandboxMLCache.java
+++ b/examples/src/main/java/org/apache/ignite/examples/ml/util/SandboxMLCache.java
@@ -15,7 +15,7 @@
  * limitations under the License.
  */
 
-package org.apache.ignite.ml.util;
+package org.apache.ignite.examples.ml.util;
 
 import java.io.File;
 import java.io.FileNotFoundException;
@@ -68,7 +68,6 @@
         return cache;
     }
 
-
     /**
      * Loads dataset as a list of rows.
      *
@@ -95,11 +94,9 @@
             String row = scanner.nextLine();
             res.add(row);
         }
-
         return res;
     }
 
-
     /**
      * Fills cache with data and returns it.
      *
@@ -108,7 +105,6 @@
      * @throws FileNotFoundException If file not found.
      */
     public IgniteCache<Integer, Vector> fillCacheWith(MLSandboxDatasets dataset) throws FileNotFoundException {
-
         IgniteCache<Integer, Vector> cache = getCache();
 
         String fileName = dataset.getFileName();
@@ -137,7 +133,7 @@
                 try{
                     if(cells[i].isEmpty()) data[i] = Double.NaN;
                     else data[i] = Double.valueOf(cells[i]);
-                } catch (java.lang.NumberFormatException e) {
+                } catch (NumberFormatException e) {
                     try {
                         data[i] = format.parse(cells[i]).doubleValue();
                     }
@@ -148,7 +144,6 @@
             cache.put(cnt++, VectorUtils.of(data));
         }
         return cache;
-
     }
 
     /**
@@ -159,7 +154,6 @@
      * @throws FileNotFoundException If file not found.
      */
     public IgniteCache<Integer, Object[]> fillObjectCacheWithDoubleLabels(MLSandboxDatasets dataset) throws FileNotFoundException {
-
         IgniteCache<Integer, Object[]> cache = getCache2();
 
         String fileName = dataset.getFileName();
@@ -190,7 +184,6 @@
             cache.put(cnt++, res);
         }
         return cache;
-
     }
 
     /**
@@ -201,7 +194,6 @@
      * @throws FileNotFoundException If file not found.
      */
     public IgniteCache<Integer, Object[]> fillObjectCacheWithCategoricalData(MLSandboxDatasets dataset) throws FileNotFoundException {
-
         IgniteCache<Integer, Object[]> cache = getCache2();
 
         String fileName = dataset.getFileName();
@@ -225,7 +217,6 @@
             cache.put(cnt++, cells);
         }
         return cache;
-
     }
 
     /**
@@ -234,7 +225,6 @@
      * @return Filled Ignite Cache.
      */
     private IgniteCache<Integer, Vector> getCache() {
-
         CacheConfiguration<Integer, Vector> cacheConfiguration = new CacheConfiguration<>();
         cacheConfiguration.setName("ML_EXAMPLE_" + UUID.randomUUID());
         cacheConfiguration.setAffinity(new RendezvousAffinityFunction(false, 10));
@@ -248,7 +238,6 @@
      * @return Filled Ignite Cache.
      */
     private IgniteCache<Integer, Object[]> getCache2() {
-
         CacheConfiguration<Integer, Object[]> cacheConfiguration = new CacheConfiguration<>();
         cacheConfiguration.setName("ML_EXAMPLE_" + UUID.randomUUID());
         cacheConfiguration.setAffinity(new RendezvousAffinityFunction(false, 10));
diff --git a/modules/ml/src/main/resources/datasets/boston_housing_dataset.txt b/examples/src/main/resources/datasets/boston_housing_dataset.txt
similarity index 100%
rename from modules/ml/src/main/resources/datasets/boston_housing_dataset.txt
rename to examples/src/main/resources/datasets/boston_housing_dataset.txt
diff --git a/modules/ml/src/main/resources/datasets/cleared_machines.csv b/examples/src/main/resources/datasets/cleared_machines.csv
similarity index 100%
rename from modules/ml/src/main/resources/datasets/cleared_machines.csv
rename to examples/src/main/resources/datasets/cleared_machines.csv
diff --git a/modules/ml/src/main/resources/datasets/english_vs_scottish_binary_dataset.csv b/examples/src/main/resources/datasets/english_vs_scottish_binary_dataset.csv
similarity index 100%
rename from modules/ml/src/main/resources/datasets/english_vs_scottish_binary_dataset.csv
rename to examples/src/main/resources/datasets/english_vs_scottish_binary_dataset.csv
diff --git a/modules/ml/src/main/resources/datasets/fraud_detection.csv b/examples/src/main/resources/datasets/fraud_detection.csv
similarity index 100%
rename from modules/ml/src/main/resources/datasets/fraud_detection.csv
rename to examples/src/main/resources/datasets/fraud_detection.csv
diff --git a/modules/ml/src/main/resources/datasets/glass_identification.csv b/examples/src/main/resources/datasets/glass_identification.csv
similarity index 100%
rename from modules/ml/src/main/resources/datasets/glass_identification.csv
rename to examples/src/main/resources/datasets/glass_identification.csv
diff --git a/modules/ml/src/main/resources/datasets/iris.txt b/examples/src/main/resources/datasets/iris.txt
similarity index 100%
rename from modules/ml/src/main/resources/datasets/iris.txt
rename to examples/src/main/resources/datasets/iris.txt
diff --git a/modules/ml/src/main/resources/datasets/mixed_dataset.csv b/examples/src/main/resources/datasets/mixed_dataset.csv
similarity index 100%
rename from modules/ml/src/main/resources/datasets/mixed_dataset.csv
rename to examples/src/main/resources/datasets/mixed_dataset.csv
diff --git a/modules/ml/src/main/resources/datasets/mortalitydata.csv b/examples/src/main/resources/datasets/mortalitydata.csv
similarity index 100%
rename from modules/ml/src/main/resources/datasets/mortalitydata.csv
rename to examples/src/main/resources/datasets/mortalitydata.csv
diff --git a/modules/ml/src/main/resources/datasets/mushrooms.csv b/examples/src/main/resources/datasets/mushrooms.csv
similarity index 100%
rename from modules/ml/src/main/resources/datasets/mushrooms.csv
rename to examples/src/main/resources/datasets/mushrooms.csv
diff --git a/modules/ml/src/main/resources/datasets/ratings.csv b/examples/src/main/resources/datasets/ratings.csv
similarity index 100%
rename from modules/ml/src/main/resources/datasets/ratings.csv
rename to examples/src/main/resources/datasets/ratings.csv
diff --git a/examples/src/main/resources/datasets/t10k-images-idx3-ubyte b/examples/src/main/resources/datasets/t10k-images-idx3-ubyte
deleted file mode 100644
index 261057a..0000000
--- a/examples/src/main/resources/datasets/t10k-images-idx3-ubyte
+++ /dev/null
Binary files differ
diff --git a/examples/src/main/resources/datasets/t10k-labels-idx1-ubyte b/examples/src/main/resources/datasets/t10k-labels-idx1-ubyte
deleted file mode 100644
index d1c3a97..0000000
--- a/examples/src/main/resources/datasets/t10k-labels-idx1-ubyte
+++ /dev/null
Binary files differ
diff --git a/examples/src/main/resources/datasets/titanic.csv b/examples/src/main/resources/datasets/titanic.csv
index 6994016..ed25e85 100644
--- a/examples/src/main/resources/datasets/titanic.csv
+++ b/examples/src/main/resources/datasets/titanic.csv
@@ -1,17 +1,17 @@
 ﻿pclass;survived;name;sex;age;sibsp;parch;ticket;fare;cabin;embarked;boat;body;homedest
-1;1;Allen, Miss. Elisabeth Walton;;29;;;24160;211,3375;B5;;2;;St Louis, MO
-1;1;Allison, Master. Hudson Trevor;male;0,9167;1;2;113781;151,55;C22 C26;AA;11;;Montreal, PQ / Chesterville, ON
-1;0;Allison, Miss. Helen Loraine;female;2;1;2;113781;151,55;C22 C26;S;;;Montreal, PQ / Chesterville, ON
-1;0;Allison, Mr. Hudson Joshua Creighton;male;30;1;2;113781;151,55;C22 C26;S;;135;Montreal, PQ / Chesterville, ON
-1;0;Allison, Mrs. Hudson J C (Bessie Waldo Daniels);female;25;1;2;113781;151,55;C22 C26;S;;;Montreal, PQ / Chesterville, ON
-1;1;Anderson, Mr. Harry;male;48;0;0;19952;26,55;E12;S;3;;New York, NY
-1;1;Andrews, Miss. Kornelia Theodosia;female;63;1;0;13502;77,9583;D7;S;10;;Hudson, NY
-1;0;Andrews, Mr. Thomas Jr;male;39;0;0;112050;0;A36;S;;;Belfast, NI
-1;1;Appleton, Mrs. Edward Dale (Charlotte Lamson);female;53;2;0;11769;51,4792;C101;S;D;;Bayside, Queens, NY
-1;0;Artagaveytia, Mr. Ramon;male;71;0;0;PC 17609;49,5042;;C;;22;Montevideo, Uruguay
-1;0;Astor, Col. John Jacob;male;47;1;0;PC 17757;227,525;C62 C64;C;;124;New York, NY
-1;1;Astor, Mrs. John Jacob (Madeleine Talmadge Force);female;18;1;0;PC 17757;227,525;C62 C64;C;4;;New York, NY
-1;1;Aubart, Mme. Leontine Pauline;female;24;0;0;PC 17477;69,3;B35;C;9;;Paris, France
+1;1;Allen                                                                             ,Miss. Elisabeth Walton;;29;;;24160;211                               ,3375;B5;;2;;St Louis       ,MO
+1;1;Allison                                                                           ,Master. Hudson Trevor;male;0                                         ,9167;1;2;113781;151        ,55;C22 C26;AA;11;;Montreal,PQ / Chesterville,ON
+1;0;Allison                                                                           ,Miss. Helen Loraine;female;2;1;2;113781;151                          ,55;C22 C26;S;;;Montreal    ,PQ / Chesterville         ,ON
+1;0;Allison                                                                           ,Mr. Hudson Joshua Creighton;male;30;1;2;113781;151                   ,55;C22 C26;S;;135;Montreal ,PQ / Chesterville         ,ON
+1;0;Allison                                                                           ,Mrs. Hudson J C (Bessie Waldo Daniels);female;25;1;2;113781;151      ,55;C22 C26;S;;;Montreal    ,PQ / Chesterville         ,ON
+1;1;Anderson                                                                          ,Mr. Harry;male;48;0;0;19952;26                                       ,55;E12;S;3;;New York       ,NY
+1;1;Andrews                                                                           ,Miss. Kornelia Theodosia;female;63;1;0;13502;77                      ,9583;D7;S;10;;Hudson       ,NY
+1;0;Andrews                                                                           ,Mr. Thomas Jr;male;39;0;0;112050;0;A36;S;;;Belfast                   ,NI
+1;1;Appleton                                                                          ,Mrs. Edward Dale (Charlotte Lamson);female;53;2;0;11769;51           ,4792;C101;S;D;;Bayside     ,Queens                    ,NY
+1;0;Artagaveytia                                                                      ,Mr. Ramon;male;71;0;0;PC 17609;49                                    ,5042;;C;;22;Montevideo     ,Uruguay
+1;0;Astor                                                                             ,Col. John Jacob;male;47;1;0;PC 17757;227                             ,525;C62 C64;C;;124;New York,NY
+1;1;Astor                                                                             ,Mrs. John Jacob (Madeleine Talmadge Force);female;18;1;0;PC 17757;227,525;C62 C64;C;4;;New York  ,NY
+1;1;Aubart                                                                            ,Mme. Leontine Pauline;female;24;0;0;PC 17477;69                      ,3;B35;C;9;;Paris           ,France
 1;1;"Barber, Miss. Ellen ""Nellie""";female;26;0;0;19877;78,85;;S;6;;
 1;1;Barkworth, Mr. Algernon Henry Wilson;male;80;0;0;27042;30;A23;S;B;;Hessle, Yorks
 1;0;Baumann, Mr. John D;male;;0;0;PC 17318;25,925;;S;;;New York, NY
diff --git a/modules/ml/src/main/resources/datasets/two_classed_iris.csv b/examples/src/main/resources/datasets/two_classed_iris.csv
similarity index 100%
rename from modules/ml/src/main/resources/datasets/two_classed_iris.csv
rename to examples/src/main/resources/datasets/two_classed_iris.csv
diff --git a/modules/ml/src/main/resources/datasets/wholesale_customers.csv b/examples/src/main/resources/datasets/wholesale_customers.csv
similarity index 100%
rename from modules/ml/src/main/resources/datasets/wholesale_customers.csv
rename to examples/src/main/resources/datasets/wholesale_customers.csv
diff --git a/modules/ml/src/main/resources/datasets/wine.txt b/examples/src/main/resources/datasets/wine.txt
similarity index 100%
rename from modules/ml/src/main/resources/datasets/wine.txt
rename to examples/src/main/resources/datasets/wine.txt
diff --git a/examples/src/main/resources/models/mleap/airbnb.model.rf.zip b/examples/src/main/resources/models/mleap/airbnb.model.rf.zip
deleted file mode 100644
index 0da815c..0000000
--- a/examples/src/main/resources/models/mleap/airbnb.model.rf.zip
+++ /dev/null
Binary files differ
diff --git a/examples/src/main/resources/models/mnist_tf_model/saved_model.pb b/examples/src/main/resources/models/mnist_tf_model/saved_model.pb
deleted file mode 100644
index 4d36671..0000000
--- a/examples/src/main/resources/models/mnist_tf_model/saved_model.pb
+++ /dev/null
Binary files differ
diff --git a/examples/src/main/resources/models/mnist_tf_model/variables/variables.data-00000-of-00001 b/examples/src/main/resources/models/mnist_tf_model/variables/variables.data-00000-of-00001
deleted file mode 100644
index a65398f..0000000
--- a/examples/src/main/resources/models/mnist_tf_model/variables/variables.data-00000-of-00001
+++ /dev/null
Binary files differ
diff --git a/examples/src/main/resources/models/mnist_tf_model/variables/variables.index b/examples/src/main/resources/models/mnist_tf_model/variables/variables.index
deleted file mode 100644
index 221dd2d..0000000
--- a/examples/src/main/resources/models/mnist_tf_model/variables/variables.index
+++ /dev/null
Binary files differ
diff --git a/examples/src/main/spark/org/apache/ignite/examples/ml/mleap/MLeapModelParserExample.java b/examples/src/main/spark/org/apache/ignite/examples/ml/mleap/MLeapModelParserExample.java
deleted file mode 100644
index 2462bfd..0000000
--- a/examples/src/main/spark/org/apache/ignite/examples/ml/mleap/MLeapModelParserExample.java
+++ /dev/null
@@ -1,75 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package org.apache.ignite.examples.ml.mleap;
-
-import java.io.File;
-import java.util.HashMap;
-import java.util.concurrent.ExecutionException;
-import java.util.concurrent.Future;
-import org.apache.ignite.Ignite;
-import org.apache.ignite.Ignition;
-import org.apache.ignite.internal.util.IgniteUtils;
-import org.apache.ignite.ml.inference.Model;
-import org.apache.ignite.ml.inference.builder.AsyncModelBuilder;
-import org.apache.ignite.ml.inference.builder.IgniteDistributedModelBuilder;
-import org.apache.ignite.ml.inference.reader.FileSystemModelReader;
-import org.apache.ignite.ml.inference.reader.ModelReader;
-import org.apache.ignite.ml.math.primitives.vector.NamedVector;
-import org.apache.ignite.ml.math.primitives.vector.VectorUtils;
-import org.apache.ignite.ml.mleap.MLeapModelParser;
-
-/**
- * This example demonstrates how to import MLeap model and use imported model for distributed inference in Apache
- * Ignite.
- */
-public class MLeapModelParserExample {
-    /** Test model resource name. */
-    private static final String TEST_MODEL_RES = "examples/src/main/resources/models/mleap/airbnb.model.rf.zip";
-
-    /** Parser. */
-    private static final MLeapModelParser parser = new MLeapModelParser();
-
-    /** Run example. */
-    public static void main(String... args) throws ExecutionException, InterruptedException {
-        try (Ignite ignite = Ignition.start("examples/config/example-ignite.xml")) {
-            File mdlRsrc = IgniteUtils.resolveIgnitePath(TEST_MODEL_RES);
-            if (mdlRsrc == null)
-                throw new IllegalArgumentException("File not found [resource_path=" + TEST_MODEL_RES + "]");
-
-            ModelReader reader = new FileSystemModelReader(mdlRsrc.getPath());
-
-            AsyncModelBuilder mdlBuilder = new IgniteDistributedModelBuilder(ignite, 4, 4);
-
-            try (Model<NamedVector, Future<Double>> mdl = mdlBuilder.build(reader, parser)) {
-                HashMap<String, Double> input = new HashMap<>();
-                input.put("bathrooms", 1.0);
-                input.put("bedrooms", 1.0);
-                input.put("security_deposit", 1.0);
-                input.put("cleaning_fee", 1.0);
-                input.put("extra_people", 1.0);
-                input.put("number_of_reviews", 1.0);
-                input.put("square_feet", 1.0);
-                input.put("review_scores_rating", 1.0);
-
-                Future<Double> prediction = mdl.predict(VectorUtils.of(input));
-
-                System.out.println("Predicted price: " + prediction.get());
-            }
-        }
-    }
-}
diff --git a/modules/ml/mleap-model-parser/pom.xml b/modules/ml/mleap-model-parser/pom.xml
deleted file mode 100644
index 48df94a..0000000
--- a/modules/ml/mleap-model-parser/pom.xml
+++ /dev/null
@@ -1,75 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-
-<!--
-  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.
--->
-<!--
-    POM file.
--->
-<project xmlns="http://maven.apache.org/POM/4.0.0"
-         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
-         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
-    <modelVersion>4.0.0</modelVersion>
-
-    <parent>
-        <artifactId>ignite-parent</artifactId>
-        <groupId>org.apache.ignite</groupId>
-        <version>1</version>
-        <relativePath>../../../parent</relativePath>
-    </parent>
-
-    <artifactId>ignite-ml-mleap-model-parser</artifactId>
-    <version>2.9.0-SNAPSHOT</version>
-    <url>http://ignite.apache.org</url>
-
-    <build>
-        <plugins>
-            <plugin>
-                <artifactId>maven-dependency-plugin</artifactId>
-                <executions>
-                    <execution>
-                        <id>copy-libs</id>
-                        <phase>package</phase>
-                        <goals>
-                            <goal>copy-dependencies</goal>
-                        </goals>
-                        <configuration>
-                            <excludeTransitive>false</excludeTransitive>
-                            <excludeArtifactIds>
-                                fastutil,h2,ignite-shmem,annotations,arpack_combined_all,
-                                cache-api,commons-math3,commons-rng-client-api,commons-rng-core,
-                                commons-rng-simple,core,ignite-ml
-                            </excludeArtifactIds>
-                        </configuration>
-                    </execution>
-                </executions>
-            </plugin>
-        </plugins>
-    </build>
-
-    <dependencies>
-        <dependency>
-            <groupId>org.apache.ignite</groupId>
-            <artifactId>ignite-ml</artifactId>
-            <version>${project.version}</version>
-        </dependency>
-        <dependency>
-            <groupId>ml.combust.mleap</groupId>
-            <artifactId>mleap-runtime_2.11</artifactId>
-            <version>0.13.0</version>
-        </dependency>
-    </dependencies>
-</project>
diff --git a/modules/ml/mleap-model-parser/src/main/java/org/apache/ignite/ml/mleap/MLeapModel.java b/modules/ml/mleap-model-parser/src/main/java/org/apache/ignite/ml/mleap/MLeapModel.java
deleted file mode 100644
index fe33a5f..0000000
--- a/modules/ml/mleap-model-parser/src/main/java/org/apache/ignite/ml/mleap/MLeapModel.java
+++ /dev/null
@@ -1,125 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package org.apache.ignite.ml.mleap;
-
-import java.util.ArrayList;
-import java.util.List;
-import java.util.Map;
-import java.util.stream.Collectors;
-import java.util.stream.IntStream;
-import ml.combust.mleap.core.types.ScalarType;
-import ml.combust.mleap.core.types.StructField;
-import ml.combust.mleap.core.types.StructType;
-import ml.combust.mleap.runtime.frame.DefaultLeapFrame;
-import ml.combust.mleap.runtime.frame.Row;
-import ml.combust.mleap.runtime.frame.Transformer;
-import ml.combust.mleap.runtime.javadsl.LeapFrameBuilder;
-import org.apache.ignite.ml.inference.Model;
-import org.apache.ignite.ml.math.primitives.vector.NamedVector;
-import org.apache.ignite.ml.math.primitives.vector.VectorUtils;
-import scala.collection.immutable.Set;
-import scala.collection.immutable.Stream;
-import scala.util.Try;
-
-/**
- * MLeap model imported and wrapped to be compatible with Apache Ignite infrastructure.
- */
-public class MLeapModel implements Model<NamedVector, Double> {
-    /** MLeap model (transformer in terms of MLeap). */
-    private final Transformer transformer;
-
-    /** List of field names. */
-    private final List<String> schema;
-
-    /** Output field name. */
-    private final String outputFieldName;
-
-    /**
-     * Constructs a new instance of MLeap model.
-     *
-     * @param transformer MLpeap model (transformer in terms of MLeap).
-     * @param schema List of field names.
-     * @param outputFieldName Output field name.
-     */
-    public MLeapModel(Transformer transformer, List<String> schema, String outputFieldName) {
-        this.transformer = transformer;
-        this.schema = new ArrayList<>(schema);
-        this.outputFieldName = outputFieldName;
-    }
-
-    /** {@inheritDoc} */
-    @Override public Double predict(NamedVector input) {
-        LeapFrameBuilder builder = new LeapFrameBuilder();
-        List<StructField> structFields = new ArrayList<>();
-
-        List<Object> values = new ArrayList<>();
-        for (String fieldName : input.getKeys()) {
-            structFields.add(new StructField(fieldName, ScalarType.Double()));
-            values.add(input.get(fieldName));
-        }
-
-        StructType schema = builder.createSchema(structFields);
-
-        List<Row> rows = new ArrayList<>();
-        rows.add(builder.createRowFromIterable(values));
-
-        DefaultLeapFrame inputFrame = builder.createFrame(schema, rows);
-
-        return predict(inputFrame);
-    }
-
-    /**
-     * Makes a prediction using default column order specified in {@link #schema}.
-     *
-     * @param input Input arguments.
-     * @return Prediction result.
-     */
-    public double predict(Double[] input) {
-        if (input.length != schema.size())
-            throw new IllegalArgumentException("Input size is not equal to schema size");
-
-        Map<String, Double> vec = IntStream.range(0, input.length)
-            .boxed()
-            .collect(Collectors.toMap(schema::get, i -> input[i]));
-
-        return predict(VectorUtils.of(vec));
-    }
-
-    /**
-     * Makes a prediction using MLeap API.
-     *
-     * @param inputFrame Input MLeap frame.
-     * @return Prediction result.
-     */
-    public double predict(DefaultLeapFrame inputFrame) {
-        DefaultLeapFrame outputFrame = transformer.transform(inputFrame).get();
-
-        Try<DefaultLeapFrame> resFrame = outputFrame.select(new Set.Set1<>(outputFieldName).toSeq());
-        DefaultLeapFrame frame = resFrame.get();
-
-        Stream<?> stream = (Stream<?>)frame.productElement(1);
-        Row row = (Row)stream.head();
-
-        return (Double)row.get(0);
-    }
-
-    /** {@inheritDoc} */
-    @Override public void close() {
-        transformer.close();
-    }
-}
diff --git a/modules/ml/mleap-model-parser/src/main/java/org/apache/ignite/ml/mleap/MLeapModelParser.java b/modules/ml/mleap-model-parser/src/main/java/org/apache/ignite/ml/mleap/MLeapModelParser.java
deleted file mode 100644
index 7f7c258..0000000
--- a/modules/ml/mleap-model-parser/src/main/java/org/apache/ignite/ml/mleap/MLeapModelParser.java
+++ /dev/null
@@ -1,123 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package org.apache.ignite.ml.mleap;
-
-import java.io.File;
-import java.io.FileOutputStream;
-import java.io.IOException;
-import java.util.ArrayList;
-import java.util.List;
-import ml.combust.mleap.core.types.ScalarType;
-import ml.combust.mleap.core.types.StructField;
-import ml.combust.mleap.core.types.StructType;
-import ml.combust.mleap.runtime.MleapContext;
-import ml.combust.mleap.runtime.frame.Transformer;
-import ml.combust.mleap.runtime.javadsl.BundleBuilder;
-import ml.combust.mleap.runtime.javadsl.ContextBuilder;
-import ml.combust.mleap.runtime.transformer.PipelineModel;
-import org.apache.ignite.ml.inference.parser.ModelParser;
-import org.apache.ignite.ml.math.primitives.vector.NamedVector;
-import scala.collection.JavaConverters;
-
-/**
- * MLeap model parser.
- */
-public class MLeapModelParser implements ModelParser<NamedVector, Double, MLeapModel> {
-    /** */
-    private static final long serialVersionUID = -370352744966205715L;
-
-    /** Temporary file prefix. */
-    private static final String TMP_FILE_PREFIX = "mleap_model";
-
-    /** Temporary file postfix. */
-    private static final String TMP_FILE_POSTFIX = ".zip";
-
-    /** {@inheritDoc} */
-    @Override public MLeapModel parse(byte[] mdl) {
-        MleapContext mleapCtx = new ContextBuilder().createMleapContext();
-        BundleBuilder bundleBuilder = new BundleBuilder();
-
-        File file = null;
-        try {
-            file = File.createTempFile(TMP_FILE_PREFIX, TMP_FILE_POSTFIX);
-            try (FileOutputStream fos = new FileOutputStream(file)) {
-                fos.write(mdl);
-                fos.flush();
-            }
-
-            Transformer transformer = bundleBuilder.load(file, mleapCtx).root();
-            PipelineModel pipelineMdl = (PipelineModel)transformer.model();
-
-            List<String> inputSchema = checkAndGetInputSchema(pipelineMdl);
-            String outputSchema = checkAndGetOutputSchema(pipelineMdl);
-
-            return new MLeapModel(transformer, inputSchema, outputSchema);
-        }
-        catch (IOException e) {
-            throw new RuntimeException(e);
-        }
-        finally {
-            if (file != null)
-                file.delete();
-        }
-    }
-
-    /**
-     * Util method that checks that input schema contains only one double type.
-     *
-     * @param mdl Pipeline model.
-     * @return Name of output field.
-     */
-    private String checkAndGetOutputSchema(PipelineModel mdl) {
-        Transformer lastTransformer = mdl.transformers().last();
-        StructType outputSchema = lastTransformer.outputSchema();
-
-        List<StructField> output = new ArrayList<>(JavaConverters.seqAsJavaListConverter(outputSchema.fields()).asJava());
-
-        if (output.size() != 1)
-            throw new IllegalArgumentException("Parser supports only scalar outputs");
-
-        return output.get(0).name();
-    }
-
-    /**
-     * Util method that checks that output schema contains only double types and returns list of field names.
-     *
-     * @param mdl Pipeline model.
-     * @return List of field names.
-     */
-    private List<String> checkAndGetInputSchema(PipelineModel mdl) {
-        Transformer firstTransformer = mdl.transformers().head();
-        StructType inputSchema = firstTransformer.inputSchema();
-
-        List<StructField> input = new ArrayList<>(JavaConverters.seqAsJavaListConverter(inputSchema.fields()).asJava());
-
-        List<String> schema = new ArrayList<>();
-
-        for (StructField field : input) {
-            String fieldName = field.name();
-
-            schema.add(field.name());
-            if (!ScalarType.Double().base().equals(field.dataType().base()))
-                throw new IllegalArgumentException("Parser supports only double types [name=" +
-                    fieldName + ",type=" + field.dataType() + "]");
-        }
-
-        return schema;
-    }
-}
diff --git a/modules/ml/mleap-model-parser/src/main/java/org/apache/ignite/ml/mleap/package-info.java b/modules/ml/mleap-model-parser/src/main/java/org/apache/ignite/ml/mleap/package-info.java
deleted file mode 100644
index 1930ed7..0000000
--- a/modules/ml/mleap-model-parser/src/main/java/org/apache/ignite/ml/mleap/package-info.java
+++ /dev/null
@@ -1,23 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-/**
- * <!-- Package description. -->
- * Base package for Mleap model parser.
- */
-
-package org.apache.ignite.ml.mleap;
diff --git a/modules/ml/mleap-model-parser/src/test/java/org/apache/ignite/ml/mleap/IgniteMLeapTestSuite.java b/modules/ml/mleap-model-parser/src/test/java/org/apache/ignite/ml/mleap/IgniteMLeapTestSuite.java
deleted file mode 100644
index 109b91d..0000000
--- a/modules/ml/mleap-model-parser/src/test/java/org/apache/ignite/ml/mleap/IgniteMLeapTestSuite.java
+++ /dev/null
@@ -1,30 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package org.apache.ignite.ml.mleap;
-
-import org.junit.runner.RunWith;
-import org.junit.runners.Suite;
-
-/** Test suite for all module tests. */
-@RunWith(Suite.class)
-@Suite.SuiteClasses({
-    MLeapModelParserTest.class
-})
-public class IgniteMLeapTestSuite {
-    // No-op.
-}
diff --git a/modules/ml/mleap-model-parser/src/test/java/org/apache/ignite/ml/mleap/MLeapModelParserTest.java b/modules/ml/mleap-model-parser/src/test/java/org/apache/ignite/ml/mleap/MLeapModelParserTest.java
deleted file mode 100644
index 12f6ee1..0000000
--- a/modules/ml/mleap-model-parser/src/test/java/org/apache/ignite/ml/mleap/MLeapModelParserTest.java
+++ /dev/null
@@ -1,69 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package org.apache.ignite.ml.mleap;
-
-import java.net.URL;
-import java.util.HashMap;
-import org.apache.ignite.ml.inference.builder.SingleModelBuilder;
-import org.apache.ignite.ml.inference.builder.SyncModelBuilder;
-import org.apache.ignite.ml.inference.reader.FileSystemModelReader;
-import org.apache.ignite.ml.inference.reader.ModelReader;
-import org.apache.ignite.ml.math.primitives.vector.VectorUtils;
-import org.junit.Test;
-
-import static org.junit.Assert.assertEquals;
-
-/**
- * Tests for {@link MLeapModelParser}.
- */
-public class MLeapModelParserTest {
-    /** Test model resource name. */
-    private static final String TEST_MODEL_RESOURCE = "datasets/scikit-airbnb.rf.zip";
-
-    /** Parser. */
-    private final MLeapModelParser parser = new MLeapModelParser();
-
-    /** Model builder. */
-    private final SyncModelBuilder mdlBuilder = new SingleModelBuilder();
-
-    /** */
-    @Test
-    public void testParseAndPredict() {
-        URL url = MLeapModelParserTest.class.getClassLoader().getResource(TEST_MODEL_RESOURCE);
-        if (url == null)
-            throw new IllegalStateException("File not found [resource_name=" + TEST_MODEL_RESOURCE + "]");
-
-        ModelReader reader = new FileSystemModelReader(url.getPath());
-
-        try (MLeapModel mdl = mdlBuilder.build(reader, parser)) {
-            HashMap<String, Double> input = new HashMap<>();
-            input.put("imp_bathrooms", 1.0);
-            input.put("imp_bedrooms", 1.0);
-            input.put("imp_security_deposit", 1.0);
-            input.put("imp_cleaning_fee", 1.0);
-            input.put("imp_extra_people", 1.0);
-            input.put("imp_number_of_reviews", 1.0);
-            input.put("imp_square_feet", 1.0);
-            input.put("imp_review_scores_rating", 1.0);
-
-            double prediction = mdl.predict(VectorUtils.of(input));
-
-            assertEquals(95.3919, prediction, 1e-5);
-        }
-    }
-}
diff --git a/modules/ml/mleap-model-parser/src/test/resources/datasets/scikit-airbnb.rf.zip b/modules/ml/mleap-model-parser/src/test/resources/datasets/scikit-airbnb.rf.zip
deleted file mode 100644
index e24d3b4..0000000
--- a/modules/ml/mleap-model-parser/src/test/resources/datasets/scikit-airbnb.rf.zip
+++ /dev/null
Binary files differ
diff --git a/modules/ml/src/main/java/org/apache/ignite/ml/genetic/Chromosome.java b/modules/ml/src/main/java/org/apache/ignite/ml/genetic/Chromosome.java
deleted file mode 100644
index 0552036..0000000
--- a/modules/ml/src/main/java/org/apache/ignite/ml/genetic/Chromosome.java
+++ /dev/null
@@ -1,106 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package org.apache.ignite.ml.genetic;
-
-import java.util.Arrays;
-import java.util.concurrent.atomic.AtomicLong;
-import org.apache.ignite.cache.query.annotations.QuerySqlField;
-
-/**
- * Represents a potential solution consisting of a fixed-length collection of genes. <br/>
- *
- * <p>
- *
- * NOTE: Chromosome resides in cache: GAGridConstants.POPULATION_CACHE. This cached is partitioned.
- *
- * </p>
- */
-public class Chromosome {
-    /** primary key of Chromosome */
-    private static final AtomicLong ID_GEN = new AtomicLong();
-
-    /** fitness score */
-    @QuerySqlField(index = true)
-    private double fitnessScore = -1;
-
-    /** Id (indexed). */
-    @QuerySqlField(index = true)
-    private Long id;
-
-    /** array of gene keys. */
-    private long[] genes;
-
-    /**
-     * @param genes Primary keys of Genes
-     */
-    public Chromosome(long[] genes) {
-        id = ID_GEN.incrementAndGet();
-        this.genes = genes;
-    }
-
-    /**
-     * Gets the fitnessScore
-     *
-     * @return This chromosome's fitness score
-     */
-    public double getFitnessScore() {
-        return fitnessScore;
-    }
-
-    /**
-     * Set the fitnessScore for this chromosome
-     *
-     * @param fitnessScore This chromosome's new fitness score
-     */
-    public void setFitnessScore(double fitnessScore) {
-        this.fitnessScore = fitnessScore;
-    }
-
-    /**
-     * Gets the gene keys (ie: primary keys) for this chromosome
-     *
-     * @return This chromosome's genes
-     */
-    public long[] getGenes() {
-        return genes;
-    }
-
-    /**
-     * Set the gene keys (ie: primary keys)
-     *
-     * @param genes This chromosome's new genes
-     */
-    public void setGenes(long[] genes) {
-        this.genes = genes;
-    }
-
-    /**
-     * Get the id (primary key) for this chromosome
-     *
-     * @return This chromosome's primary key
-     */
-    public Long id() {
-        return id;
-    }
-
-    /** {@inheritDoc} */
-    @Override public String toString() {
-        return "Chromosome [fitnessScore=" + fitnessScore + ", id=" + id + ", genes=" + Arrays.toString(genes) + "]";
-    }
-
-}
diff --git a/modules/ml/src/main/java/org/apache/ignite/ml/genetic/CrossOverJob.java b/modules/ml/src/main/java/org/apache/ignite/ml/genetic/CrossOverJob.java
deleted file mode 100644
index afd0119..0000000
--- a/modules/ml/src/main/java/org/apache/ignite/ml/genetic/CrossOverJob.java
+++ /dev/null
@@ -1,137 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package org.apache.ignite.ml.genetic;
-
-import java.util.Arrays;
-import java.util.Random;
-import org.apache.ignite.Ignite;
-import org.apache.ignite.IgniteCache;
-import org.apache.ignite.IgniteException;
-import org.apache.ignite.IgniteLogger;
-import org.apache.ignite.compute.ComputeJobAdapter;
-import org.apache.ignite.ml.genetic.parameter.GAGridConstants;
-import org.apache.ignite.resources.IgniteInstanceResource;
-import org.apache.ignite.resources.LoggerResource;
-import org.apache.ignite.transactions.Transaction;
-
-/**
- * Responsible for performing 'crossover' genetic operation for 2 X 'parent' chromosomes.
- *
- * <p>
- *
- * It relies on the GAConfiguration.getCrossOverRate() to determine probability rate of crossover for pair of
- * chromosome.
- *
- * <br/>
- *
- * CrossOverJob will randomly pick a start index j in Chromosome.getGenes[] and continue
- *
- * swapping until end of genes[] array.
- *
- * </p>
- */
-public class CrossOverJob extends ComputeJobAdapter {
-    /** Ignite resource */
-    @IgniteInstanceResource
-    private Ignite ignite;
-
-    /** Ignite logger */
-    @LoggerResource
-    private IgniteLogger log;
-
-    /** primary key of 1st chromosome */
-    private Long key1;
-
-    /** primary key of 2nd chromosome */
-    private Long key2;
-
-    /** Cross over rate */
-    private double crossOverRate;
-
-    /**
-     * @param key1 Primary key for 1st chromosome
-     * @param key2 Primary key for 2nd chromosome
-     * @param crossOverRate CrossOver rate
-     */
-    public CrossOverJob(Long key1, Long key2, double crossOverRate) {
-        this.key1 = key1;
-        this.key2 = key2;
-        this.crossOverRate = crossOverRate;
-    }
-
-    /**
-     * helper routine to assist cross over
-     *
-     * @param newKeySwapArrForChrome New gene keys to copy starting at updateIdx
-     * @param updateIdx Update Index
-     * @param genekeys Original gene Keys for a chromosome
-     * @return New Gene keys
-     */
-    private long[] crossOver(long[] newKeySwapArrForChrome, int updateIdx, long[] genekeys) {
-        long[] newGeneKeys = genekeys.clone();
-
-        int k = 0;
-        for (int x = updateIdx; x < newGeneKeys.length; x++) {
-            newGeneKeys[x] = newKeySwapArrForChrome[k];
-            k += 1;
-        }
-        return newGeneKeys;
-    }
-
-    /** {@inheritDoc} */
-    @Override public Object execute() throws IgniteException {
-
-        if (this.crossOverRate > Math.random()) {
-
-            IgniteCache<Long, Chromosome> populationCache = ignite.cache(GAGridConstants.POPULATION_CACHE);
-
-            Transaction tx = ignite.transactions().txStart();
-
-            Chromosome chromosome1 = populationCache.localPeek(this.key1);
-            Chromosome chromosome2 = populationCache.localPeek(this.key2);
-
-            long[] genesforChrom1 = chromosome1.getGenes();
-            long[] genesforChrom2 = chromosome2.getGenes();
-
-            Random rn = new Random();
-
-            // compute index to start for copying respective genes
-            int geneIdxStartSwap = rn.nextInt(genesforChrom1.length);
-
-            long[] newKeySwapArrForChrome1 =
-                Arrays.copyOfRange(genesforChrom2, geneIdxStartSwap, genesforChrom1.length);
-            long[] newKeySwapArrForChrome2 =
-                Arrays.copyOfRange(genesforChrom1, geneIdxStartSwap, genesforChrom1.length);
-
-            long[] newGeneKeysForChrom1 = crossOver(newKeySwapArrForChrome1, geneIdxStartSwap, genesforChrom1);
-            long[] newGeneKeysForChrom2 = crossOver(newKeySwapArrForChrome2, geneIdxStartSwap, genesforChrom2);
-
-            chromosome1.setGenes(newGeneKeysForChrom1);
-            populationCache.put(chromosome1.id(), chromosome1);
-
-            chromosome2.setGenes(newGeneKeysForChrom2);
-            populationCache.put(chromosome2.id(), chromosome2);
-
-            tx.commit();
-
-        }
-
-        return null;
-    }
-
-}
diff --git a/modules/ml/src/main/java/org/apache/ignite/ml/genetic/CrossOverTask.java b/modules/ml/src/main/java/org/apache/ignite/ml/genetic/CrossOverTask.java
deleted file mode 100644
index 7b9ec8c..0000000
--- a/modules/ml/src/main/java/org/apache/ignite/ml/genetic/CrossOverTask.java
+++ /dev/null
@@ -1,120 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package org.apache.ignite.ml.genetic;
-
-import java.util.Collection;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-import org.apache.ignite.Ignite;
-import org.apache.ignite.IgniteException;
-import org.apache.ignite.cache.affinity.Affinity;
-import org.apache.ignite.cluster.ClusterNode;
-import org.apache.ignite.compute.ComputeJob;
-import org.apache.ignite.compute.ComputeJobResult;
-import org.apache.ignite.compute.ComputeJobResultPolicy;
-import org.apache.ignite.compute.ComputeTaskAdapter;
-import org.apache.ignite.ml.genetic.parameter.GAConfiguration;
-import org.apache.ignite.ml.genetic.parameter.GAGridConstants;
-import org.apache.ignite.resources.IgniteInstanceResource;
-import org.jetbrains.annotations.NotNull;
-
-/**
- * Responsible for assigning 2 X 'parent' chromosomes to produce 2 X 'child' chromosomes.
- *
- * <p>
- *
- * CrossOverTask leverages  Ignite's data affinity capabilities for routing CrossOverJobs to primary <br/> IgniteNode
- * where 'parent' chromosomes reside.
- *
- * </p>
- */
-public class CrossOverTask extends ComputeTaskAdapter<List<Long>, Boolean> {
-    /** Ignite instance */
-    @IgniteInstanceResource
-    private Ignite ignite;
-
-    /** GAConfiguration */
-    private GAConfiguration cfg;
-
-    /**
-     * @param cfg GAConfiguration
-     */
-    public CrossOverTask(GAConfiguration cfg) {
-        this.cfg = cfg;
-    }
-
-    /** {@inheritDoc} */
-    @NotNull @Override public Map map(List<ClusterNode> nodes, List<Long> chromosomeKeys) throws IgniteException {
-
-        Map<ComputeJob, ClusterNode> map = new HashMap<>();
-
-        Affinity affinity = ignite.affinity(GAGridConstants.POPULATION_CACHE);
-
-        Map<ClusterNode, Collection<Long>> nodeKeys = affinity.mapKeysToNodes(chromosomeKeys);
-
-        for (Map.Entry<ClusterNode, Collection<Long>> entry : nodeKeys.entrySet()) {
-            ClusterNode aNode = entry.getKey();
-            map = setupCrossOver(aNode, (List<Long>)entry.getValue(), map);
-        }
-        return map;
-    }
-
-    /** {@inheritDoc} */
-    @Override public Boolean reduce(List<ComputeJobResult> list) throws IgniteException {
-        // TODO Auto-generated method stub
-        return Boolean.TRUE;
-    }
-
-    /** {@inheritDoc} */
-    @Override public ComputeJobResultPolicy result(ComputeJobResult res, List<ComputeJobResult> rcvd) {
-        IgniteException err = res.getException();
-
-        if (err != null)
-            return ComputeJobResultPolicy.FAILOVER;
-
-        // If there is no exception, wait for all job results.
-        return ComputeJobResultPolicy.WAIT;
-
-    }
-
-    /**
-     * Helper method to help assign ComputeJobs to respective ClusterNodes.
-     *
-     * @param clusterNode Cluster node.
-     * @param keys Primary keys of Chromosomes.
-     * @param map Nodes where jobs will be sent.
-     * @return A map of ComputeJob/ClusterNode's.
-     */
-    private Map<ComputeJob, ClusterNode> setupCrossOver(ClusterNode clusterNode, List<Long> keys,
-        Map<ComputeJob, ClusterNode> map) {
-        // Calculate number of Jobs = keys / 2
-        // as we desire pairs of Chromosomes to be swapped
-        int numOfJobs = keys.size() / 2;
-        int k = 0;
-        for (int i = 0; i < numOfJobs; i++) {
-            Long key1 = keys.get(k);
-            Long key2 = keys.get(k + 1);
-
-            CrossOverJob job = new CrossOverJob(key1, key2, this.cfg.getCrossOverRate());
-            map.put(job, clusterNode);
-            k += 2;
-        }
-        return map;
-    }
-}
diff --git a/modules/ml/src/main/java/org/apache/ignite/ml/genetic/FitnessJob.java b/modules/ml/src/main/java/org/apache/ignite/ml/genetic/FitnessJob.java
deleted file mode 100644
index 445f1d7..0000000
--- a/modules/ml/src/main/java/org/apache/ignite/ml/genetic/FitnessJob.java
+++ /dev/null
@@ -1,93 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package org.apache.ignite.ml.genetic;
-
-import java.util.ArrayList;
-import java.util.List;
-import org.apache.ignite.Ignite;
-import org.apache.ignite.IgniteCache;
-import org.apache.ignite.IgniteException;
-import org.apache.ignite.IgniteLogger;
-import org.apache.ignite.compute.ComputeJobAdapter;
-import org.apache.ignite.ml.genetic.parameter.GAGridConstants;
-import org.apache.ignite.resources.IgniteInstanceResource;
-import org.apache.ignite.resources.LoggerResource;
-import org.apache.ignite.transactions.Transaction;
-
-/**
- * Responsible for performing fitness evaluation on an individual chromosome
- */
-public class FitnessJob extends ComputeJobAdapter {
-    /**
-     * Chromosome primary Key
-     */
-    private Long key;
-
-    /** Ignite instance */
-    @IgniteInstanceResource
-    private Ignite ignite;
-
-    /** Ignite logger */
-    @LoggerResource
-    private IgniteLogger log;
-
-    /** IFitnessFunction */
-    private IFitnessFunction fitnessFunction;
-
-    /**
-     * @param key Chromosome primary Key
-     * @param fitnessFunction Fitness function defined by developer
-     */
-    public FitnessJob(Long key, IFitnessFunction fitnessFunction) {
-        this.key = key;
-        this.fitnessFunction = fitnessFunction;
-    }
-
-    /** {@inheritDoc} */
-    @Override public Double execute() throws IgniteException {
-
-        IgniteCache<Long, Chromosome> populationCache = ignite.cache(GAGridConstants.POPULATION_CACHE);
-
-        IgniteCache<Long, Gene> geneCache = ignite.cache(GAGridConstants.GENE_CACHE);
-
-        Chromosome chromosome = populationCache.localPeek(key);
-
-        long[] geneKeys = chromosome.getGenes();
-
-        List<Gene> genes = new ArrayList<>();
-
-        for (int i = 0; i < geneKeys.length; i++) {
-            long aKey = geneKeys[i];
-            Gene aGene = geneCache.localPeek(aKey);
-            genes.add(aGene);
-        }
-
-        Double val = fitnessFunction.evaluate(genes);
-
-        chromosome.setFitnessScore(val);
-
-        Transaction tx = ignite.transactions().txStart();
-
-        populationCache.put(chromosome.id(), chromosome);
-
-        tx.commit();
-
-        return val;
-    }
-
-}
diff --git a/modules/ml/src/main/java/org/apache/ignite/ml/genetic/FitnessTask.java b/modules/ml/src/main/java/org/apache/ignite/ml/genetic/FitnessTask.java
deleted file mode 100644
index 97b5275..0000000
--- a/modules/ml/src/main/java/org/apache/ignite/ml/genetic/FitnessTask.java
+++ /dev/null
@@ -1,89 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package org.apache.ignite.ml.genetic;
-
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-import org.apache.ignite.Ignite;
-import org.apache.ignite.IgniteException;
-import org.apache.ignite.cache.affinity.Affinity;
-import org.apache.ignite.cluster.ClusterNode;
-import org.apache.ignite.compute.ComputeJob;
-import org.apache.ignite.compute.ComputeJobResult;
-import org.apache.ignite.compute.ComputeJobResultPolicy;
-import org.apache.ignite.compute.ComputeTaskAdapter;
-import org.apache.ignite.ml.genetic.parameter.GAConfiguration;
-import org.apache.ignite.ml.genetic.parameter.GAGridConstants;
-import org.apache.ignite.resources.IgniteInstanceResource;
-import org.jetbrains.annotations.NotNull;
-
-/**
- * Responsible for fitness operation
- */
-public class FitnessTask extends ComputeTaskAdapter<List<Long>, Boolean> {
-    /** Ignite instance */
-    @IgniteInstanceResource
-    private Ignite ignite;
-
-    /** GAConfiguration */
-    private GAConfiguration cfg;
-
-    /**
-     * @param cfg GAConfiguration
-     */
-    public FitnessTask(GAConfiguration cfg) {
-        this.cfg = cfg;
-    }
-
-    /** {@inheritDoc} */
-    @NotNull @Override public Map map(List<ClusterNode> nodes, List<Long> chromosomeKeys) throws IgniteException {
-
-        Map<ComputeJob, ClusterNode> map = new HashMap<>();
-
-        Affinity affinity = ignite.affinity(GAGridConstants.POPULATION_CACHE);
-
-        for (Long key : chromosomeKeys) {
-
-            FitnessJob ajob = new FitnessJob(key, this.cfg.getFitnessFunction());
-
-            ClusterNode primary = affinity.mapKeyToNode(key);
-
-            map.put(ajob, primary);
-        }
-        return map;
-    }
-
-    /** {@inheritDoc} */
-    @Override public Boolean reduce(List<ComputeJobResult> list) throws IgniteException {
-
-        return Boolean.TRUE;
-    }
-
-    /** {@inheritDoc} */
-    @Override public ComputeJobResultPolicy result(ComputeJobResult res, List<ComputeJobResult> rcvd) {
-        IgniteException err = res.getException();
-
-        if (err != null)
-            return ComputeJobResultPolicy.FAILOVER;
-
-        // If there is no exception, wait for all job results.
-        return ComputeJobResultPolicy.WAIT;
-
-    }
-}
diff --git a/modules/ml/src/main/java/org/apache/ignite/ml/genetic/GAGrid.java b/modules/ml/src/main/java/org/apache/ignite/ml/genetic/GAGrid.java
deleted file mode 100644
index 68c6f76..0000000
--- a/modules/ml/src/main/java/org/apache/ignite/ml/genetic/GAGrid.java
+++ /dev/null
@@ -1,449 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package org.apache.ignite.ml.genetic;
-
-import java.util.ArrayList;
-import java.util.LinkedHashMap;
-import java.util.List;
-import java.util.Random;
-import java.util.stream.Collectors;
-import javax.cache.Cache.Entry;
-import org.apache.ignite.Ignite;
-import org.apache.ignite.IgniteCache;
-import org.apache.ignite.IgniteLogger;
-import org.apache.ignite.cache.query.QueryCursor;
-import org.apache.ignite.cache.query.SqlFieldsQuery;
-import org.apache.ignite.cache.query.SqlQuery;
-import org.apache.ignite.ml.genetic.cache.GeneCacheConfig;
-import org.apache.ignite.ml.genetic.cache.PopulationCacheConfig;
-import org.apache.ignite.ml.genetic.parameter.GAConfiguration;
-import org.apache.ignite.ml.genetic.parameter.GAGridConstants;
-
-/**
- * Central class responsible for orchestrating distributive Genetic Algorithm.
- *
- * This class accepts a GAConfigriation and Ignite instance.
- */
-public class GAGrid {
-    /** Ignite logger */
-    private IgniteLogger igniteLog;
-
-    /** GAConfiguraton */
-    private GAConfiguration cfg;
-
-    /** Ignite instance */
-    private Ignite ignite;
-
-    /** Population cache */
-    private IgniteCache<Long, Chromosome> populationCache;
-
-    /** Gene cache */
-    private IgniteCache<Long, Gene> geneCache;
-
-    /**
-     * @param cfg GAConfiguration
-     * @param ignite Ignite
-     */
-    public GAGrid(GAConfiguration cfg, Ignite ignite) {
-        this.ignite = ignite;
-        this.cfg = cfg;
-        this.ignite = ignite;
-        this.igniteLog = ignite.log();
-
-        // Get/Create cache
-        populationCache = this.ignite.getOrCreateCache(PopulationCacheConfig.populationCache());
-        populationCache.clear();
-
-        // Get/Create cache
-        geneCache = this.ignite.getOrCreateCache(GeneCacheConfig.geneCache());
-        geneCache.clear();
-    }
-
-    /**
-     * Calculate average fitness value
-     *
-     * @return Average fitness score
-     */
-    private Double calculateAverageFitness() {
-        double avgFitnessScore = 0;
-
-        IgniteCache<Long, Gene> cache = ignite.cache(GAGridConstants.POPULATION_CACHE);
-
-        // Execute query calculate average fitness
-        SqlFieldsQuery sql = new SqlFieldsQuery("select AVG(FITNESSSCORE) from Chromosome");
-
-        // Iterate over the result set.
-        try (QueryCursor<List<?>> cursor = cache.query(sql)) {
-            for (List<?> row : cursor)
-                avgFitnessScore = (Double)row.get(0);
-        }
-
-        return avgFitnessScore;
-    }
-
-    /**
-     * Calculate fitness each Chromosome in population
-     *
-     * @param chromosomeKeys List of chromosome primary keys
-     */
-    private void calculateFitness(List<Long> chromosomeKeys) {
-       this.ignite.compute().execute(new FitnessTask(this.cfg), chromosomeKeys);
-    }
-
-    /**
-     * @param fittestKeys List of chromosome keys that will be copied from
-     * @param selectedKeys List of chromosome keys that will be overwritten evenly by fittestKeys
-     * @return Boolean value
-     */
-    private Boolean copyFitterChromosomesToPopulation(List<Long> fittestKeys, List<Long> selectedKeys) {
-        double truncatePercentage = this.cfg.getTruncateRate();
-
-        int totalSize = this.cfg.getPopulationSize();
-
-        int truncateCnt = (int)(truncatePercentage * totalSize);
-
-        int numOfCopies = selectedKeys.size() / truncateCnt;
-
-        return this.ignite.compute()
-            .execute(new TruncateSelectionTask(fittestKeys, numOfCopies), selectedKeys);
-    }
-
-    /**
-     * create a Chromsome
-     *
-     * @param numOfGenes Number of Genes in resepective Chromosome
-     * @return Chromosome
-     */
-    private Chromosome createChromosome(int numOfGenes) {
-        long[] genes = new long[numOfGenes];
-        List<Long> keys = new ArrayList<>();
-        int k = 0;
-        while (k < numOfGenes) {
-            long key = selectGene(k);
-
-            if (!(keys.contains(key))) {
-                genes[k] = key;
-                keys.add(key);
-                k += 1;
-            }
-        }
-        return new Chromosome(genes);
-    }
-
-    /**
-     * Perform crossover
-     *
-     * @param leastFitKeys List of primary keys for Chromosomes that are considered 'least fit'
-     */
-    private void crossover(List<Long> leastFitKeys) {
-        this.ignite.compute().execute(new CrossOverTask(this.cfg), leastFitKeys);
-    }
-
-    /**
-     * Evolve the population
-     *
-     * @return Fittest Chromosome
-     */
-    public Chromosome evolve() {
-        // keep track of current generation
-        int generationCnt = 1;
-
-        Chromosome fittestChromosome;
-
-        initializeGenePopulation();
-
-        initializePopulation();
-
-        // Calculate Fitness
-        calculateFitness(getPopulationKeys());
-
-        // Retrieve chromosomes in order by fitness value
-        LinkedHashMap<Long, Double> map = getChromosomesByFittest();
-
-        // Calculate average fitness value of population
-        double averageFitnessScore = calculateAverageFitness();
-
-        Long key = map.keySet().iterator().next();
-
-        fittestChromosome = populationCache.get(key);
-
-        // while NOT terminateCondition met
-        while (!(cfg.getTerminateCriteria().isTerminationConditionMet(fittestChromosome, averageFitnessScore,
-            generationCnt))) {
-            generationCnt += 1;
-
-            // We will crossover/mutate over chromosomes based on selection method
-            List<Long> selectedKeystoreCrossMutation = selection(map);
-
-            // Cross Over
-            crossover(selectedKeystoreCrossMutation);
-
-            // Mutate
-            mutation(selectedKeystoreCrossMutation);
-
-            // Calculate Fitness
-            calculateFitness(selectedKeystoreCrossMutation);
-
-            // Retrieve chromosomes in order by fitness value
-            map = getChromosomesByFittest();
-
-            key = map.keySet().iterator().next();
-
-            // Retreive the first chromosome from the list
-            fittestChromosome = populationCache.get(key);
-
-            // Calculate average fitness value of population
-            averageFitnessScore = calculateAverageFitness();
-
-            // End Loop
-
-        }
-        return fittestChromosome;
-    }
-
-    /**
-     * helper routine to retrieve Chromosome keys in order of fittest
-     *
-     * @return Map of primary key/fitness score pairs for chromosomes.
-     */
-    private LinkedHashMap<Long,Double> getChromosomesByFittest() {
-        LinkedHashMap<Long, Double> orderChromKeysByFittest = new LinkedHashMap<>();
-
-        String orderDirection = "desc";
-
-        if (!cfg.isHigherFitnessValFitter())
-            orderDirection = "asc";
-
-        String fittestSQL = "select _key, fitnessScore from Chromosome order by fitnessScore " + orderDirection;
-
-        // Execute query to retrieve keys for ALL Chromosomes by fittnessScore
-        QueryCursor<List<?>> cursor = populationCache.query(new SqlFieldsQuery(fittestSQL));
-
-        List<List<?>> res = cursor.getAll();
-
-        for (List row : res) {
-            Long key = (Long)row.get(0);
-            Double fitnessScore = (Double)row.get(1);
-            orderChromKeysByFittest.put(key, fitnessScore);
-        }
-
-        return orderChromKeysByFittest;
-    }
-
-    /**
-     * @param keys List of primary keys for respective Chromosomes
-     * @return List of keys for respective Chromosomes
-     */
-    private List<Long> getFittestKeysForTruncation(List<Long> keys) {
-        double truncatePercentage = this.cfg.getTruncateRate();
-
-        int truncateCnt = (int)(truncatePercentage * keys.size());
-
-        return keys.subList(0, truncateCnt);
-    }
-
-    /**
-     * initialize the Gene pool
-     */
-    void initializeGenePopulation() {
-        geneCache.clear();
-
-        List<Gene> genePool = cfg.getGenePool();
-
-        for (Gene gene : genePool)
-            geneCache.put(gene.id(), gene);
-    }
-
-    /**
-     * Initialize the population of Chromosomes
-     */
-    void initializePopulation() {
-        int populationSize = cfg.getPopulationSize();
-        populationCache.clear();
-
-        for (int j = 0; j < populationSize; j++) {
-            Chromosome chromosome = createChromosome(cfg.getChromosomeLen());
-            populationCache.put(chromosome.id(), chromosome);
-        }
-
-    }
-
-    /**
-     * Perform mutation
-     *
-     * @param leastFitKeys List of primary keys for Chromosomes that are considered 'least fit'.
-     */
-    private void mutation(List<Long> leastFitKeys) {
-         this.ignite.compute().execute(new MutateTask(this.cfg), leastFitKeys);
-    }
-
-    /**
-     * select a gene from the Gene pool
-     *
-     * @return Primary key of respective Gene
-     */
-    private long selectAnyGene() {
-        int idx = selectRandomIndex(cfg.getGenePool().size());
-        Gene gene = cfg.getGenePool().get(idx);
-        return gene.id();
-    }
-
-    /**
-     * For our implementation we consider 'best fit' chromosomes, by selecting least fit chromosomes for crossover and
-     * mutation
-     *
-     * As result, we are interested in least fit chromosomes.
-     *
-     * @param keys List of primary keys for respective Chromosomes
-     * @return List of primary Keys for respective Chromosomes that are considered least fit
-     */
-    private List<Long> selectByElitism(List<Long> keys) {
-        int elitismCnt = this.cfg.getElitismCnt();
-        return keys.subList(elitismCnt, keys.size());
-    }
-
-    /**
-     * Truncation selection simply retains the fittest x% of the population. These fittest individuals are duplicated so
-     * that the population size is maintained.
-     *
-     * @param keys Keys.
-     * @return List of keys
-     */
-    private List<Long> selectByTruncation(List<Long> keys) {
-        double truncatePercentage = this.cfg.getTruncateRate();
-
-        int truncateCnt = (int)(truncatePercentage * keys.size());
-
-        return keys.subList(truncateCnt, keys.size());
-    }
-
-    /**
-     * Roulette Wheel selection
-     *
-     * @param map Map of keys/fitness scores
-     * @return List of primary Keys for respective chromosomes that will breed
-     */
-    private List<Long> selectByRouletteWheel(LinkedHashMap map) {
-        List<Long> populationKeys = this.ignite.compute().execute(new RouletteWheelSelectionTask(this.cfg), map);
-
-        return populationKeys;
-    }
-
-    /**
-     * @param k Gene index in Chromosome.
-     * @return Primary key of respective Gene chosen
-     */
-    private long selectGene(int k) {
-        if (cfg.getChromosomeCriteria() == null)
-            return (selectAnyGene());
-        else
-            return (selectGeneByChromosomeCriteria(k));
-    }
-
-    /**
-     * method assumes ChromosomeCriteria is set.
-     *
-     * @param k Gene index in Chromosome
-     * @return Primary key of respective Gene
-     */
-    private long selectGeneByChromosomeCriteria(int k) {
-        List<Gene> genes = new ArrayList<>();
-
-        StringBuffer sbSqlClause = new StringBuffer("_val like '");
-        sbSqlClause.append("%");
-        sbSqlClause.append(cfg.getChromosomeCriteria().getCriteria().get(k));
-        sbSqlClause.append("%'");
-
-        IgniteCache<Long, Gene> cache = ignite.cache(GAGridConstants.GENE_CACHE);
-
-        SqlQuery sql = new SqlQuery(Gene.class, sbSqlClause.toString());
-
-        try (QueryCursor<Entry<Long, Gene>> cursor = cache.query(sql)) {
-            for (Entry<Long, Gene> e : cursor)
-                genes.add(e.getValue());
-        }
-
-        int idx = selectRandomIndex(genes.size());
-
-        Gene gene = genes.get(idx);
-        return gene.id();
-    }
-
-    /**
-     * @param sizeOfGenePool Size of Gene pool
-     * @return Index
-     */
-    private int selectRandomIndex(int sizeOfGenePool) {
-        Random randomGenerator = new Random();
-        return randomGenerator.nextInt(sizeOfGenePool);
-    }
-
-    /**
-     * Select chromosomes
-     *
-     * @param map Map of keys/fitness scores for respective Chromosomes
-     * @return List of primary keys for respective Chromosomes
-     */
-    private List<Long> selection(LinkedHashMap map) {
-        List<Long> selectedKeys = new ArrayList<>();
-
-        // We will crossover/mutate over chromosomes based on selection method
-        List<Long> chromosomeKeys = new ArrayList<>(map.keySet());
-
-        GAGridConstants.SELECTION_METHOD selectionMtd = cfg.getSelectionMtd();
-
-        switch (selectionMtd) {
-            case SELECTION_METHOD_ELITISM:
-                selectedKeys = selectByElitism(chromosomeKeys);
-                break;
-            case SELECTION_METHOD_TRUNCATION:
-                selectedKeys = selectByTruncation(chromosomeKeys);
-
-                List<Long> fittestKeys = getFittestKeysForTruncation(chromosomeKeys);
-
-                copyFitterChromosomesToPopulation(fittestKeys, selectedKeys);
-
-                // copy more fit keys to rest of population
-                break;
-            case SELECTION_METHOD_ROULETTE_WHEEL:
-              selectedKeys = this.selectByRouletteWheel(map);
-
-            default:
-                break;
-        }
-
-        return selectedKeys;
-    }
-
-    /**
-     * Get primary keys for Chromosomes
-     *
-     * @return List of Chromosome primary keys
-     */
-    List<Long> getPopulationKeys() {
-        String fittestSQL = "select _key from Chromosome";
-
-        // Execute query to retrieve keys for ALL Chromosomes
-         QueryCursor<List<?>> cursor = populationCache.query(new SqlFieldsQuery(fittestSQL));
-
-         List<List<?>> res = cursor.getAll();
-
-        return (List<Long>) res.stream().map(x -> x.get(0)).collect(Collectors.toList());
-    }
-
-}
diff --git a/modules/ml/src/main/java/org/apache/ignite/ml/genetic/Gene.java b/modules/ml/src/main/java/org/apache/ignite/ml/genetic/Gene.java
deleted file mode 100644
index 04b054b..0000000
--- a/modules/ml/src/main/java/org/apache/ignite/ml/genetic/Gene.java
+++ /dev/null
@@ -1,86 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package org.apache.ignite.ml.genetic;
-
-import org.apache.ignite.cache.query.annotations.QuerySqlField;
-
-import java.util.concurrent.atomic.AtomicLong;
-
-/**
- * Represents the discrete parts of a potential solution (ie: Chromosome)
- *
- * <p>
- *
- * Gene is a container for a POJO that developer will implement. <br/>
- *
- * For the Movie Fitness example, the Movie object is the POJO contained within Gene. <br/> NOTE: Gene resides in cache:
- * 'geneCache'. This cache is replicated.
- *
- *
- * </p>
- */
-public class Gene {
-    /** primary key of Gene */
-    private static final AtomicLong ID_GEN = new AtomicLong();
-
-    /** Id (indexed). */
-    @QuerySqlField(index = true)
-    private Long id;
-
-    /** value used to model an individual Gene. */
-    private Object val;
-
-    /**
-     * object Object parameter.
-     *
-     * @param obj Object parameter.
-     */
-    public Gene(Object obj) {
-        id = ID_GEN.incrementAndGet();
-        this.val = obj;
-    }
-
-    /**
-     * @return Value for Gene
-     */
-    public Object getVal() {
-        return val;
-    }
-
-    /**
-     * Set the Gene value
-     *
-     * @param obj Value for Gene
-     */
-    public void setVal(Object obj) {
-        this.val = obj;
-    }
-
-    /**
-     * @return Primary key for Gene
-     */
-    public Long id() {
-        return id;
-    }
-
-    /** {@inheritDoc} */
-    @Override public String toString() {
-        return "Gene [id=" + id + ", value=" + val + "]";
-    }
-
-}
diff --git a/modules/ml/src/main/java/org/apache/ignite/ml/genetic/IFitnessFunction.java b/modules/ml/src/main/java/org/apache/ignite/ml/genetic/IFitnessFunction.java
deleted file mode 100644
index fa84946..0000000
--- a/modules/ml/src/main/java/org/apache/ignite/ml/genetic/IFitnessFunction.java
+++ /dev/null
@@ -1,37 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package org.apache.ignite.ml.genetic;
-
-import java.util.List;
-
-/**
- * Fitness function are used to determine how optimal a particular solution is relative to other solutions.
- *
- * <p> The evaluate() method should be implemented for this interface. The fitness function is provided list of Genes.
- *
- * The evaluate method should return a positive double value that reflects fitness score.
- *
- * </p>
- */
-public interface IFitnessFunction {
-    /**
-     * @param genes Genes within an individual Chromosome
-     * @return Fitness score
-     */
-    public double evaluate(List<Gene> genes);
-}
diff --git a/modules/ml/src/main/java/org/apache/ignite/ml/genetic/MutateJob.java b/modules/ml/src/main/java/org/apache/ignite/ml/genetic/MutateJob.java
deleted file mode 100644
index c3a4d4e..0000000
--- a/modules/ml/src/main/java/org/apache/ignite/ml/genetic/MutateJob.java
+++ /dev/null
@@ -1,83 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package org.apache.ignite.ml.genetic;
-
-import java.util.List;
-import org.apache.ignite.Ignite;
-import org.apache.ignite.IgniteCache;
-import org.apache.ignite.IgniteException;
-import org.apache.ignite.compute.ComputeJobAdapter;
-import org.apache.ignite.ml.genetic.parameter.GAGridConstants;
-import org.apache.ignite.resources.IgniteInstanceResource;
-import org.apache.ignite.transactions.Transaction;
-
-/**
- * Responsible for applying mutation on respective Chromosome based on mutation Rate
- */
-public class MutateJob extends ComputeJobAdapter {
-    /** primary key of Chromosome to mutate **/
-    private Long key;
-
-    /** primary keys of genes to be used in mutation **/
-    private List<Long> mutatedGeneKeys;
-
-    /** Ignite instance */
-    @IgniteInstanceResource
-    private Ignite ignite;
-
-    /** Mutation Rate **/
-    private double mutationRate;
-
-    /**
-     * @param key Primary key of chromosome
-     * @param mutatedGeneKeys Primary keys of genes to be used in mutation
-     * @param mutationRate Mutation rate
-     */
-    public MutateJob(Long key, List<Long> mutatedGeneKeys, double mutationRate) {
-        this.key = key;
-        this.mutationRate = mutationRate;
-        this.mutatedGeneKeys = mutatedGeneKeys;
-    }
-
-    /** {@inheritDoc} */
-    @Override public Boolean execute() throws IgniteException {
-
-        IgniteCache<Long, Chromosome> populationCache = ignite.cache(GAGridConstants.POPULATION_CACHE);
-
-        Chromosome chromosome = populationCache.localPeek(key);
-
-        long[] geneKeys = chromosome.getGenes();
-
-        for (int k = 0; k < this.mutatedGeneKeys.size(); k++) {
-            // Mutate gene based on MutationRate
-            if (this.mutationRate > Math.random())
-                geneKeys[k] = this.mutatedGeneKeys.get(k);
-        }
-
-        chromosome.setGenes(geneKeys);
-
-        Transaction tx = ignite.transactions().txStart();
-
-        populationCache.put(chromosome.id(), chromosome);
-
-        tx.commit();
-
-        return Boolean.TRUE;
-    }
-
-}
diff --git a/modules/ml/src/main/java/org/apache/ignite/ml/genetic/MutateTask.java b/modules/ml/src/main/java/org/apache/ignite/ml/genetic/MutateTask.java
deleted file mode 100644
index c32406b..0000000
--- a/modules/ml/src/main/java/org/apache/ignite/ml/genetic/MutateTask.java
+++ /dev/null
@@ -1,173 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package org.apache.ignite.ml.genetic;
-
-import java.util.ArrayList;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-import java.util.Random;
-import javax.cache.Cache.Entry;
-import org.apache.ignite.Ignite;
-import org.apache.ignite.IgniteCache;
-import org.apache.ignite.IgniteException;
-import org.apache.ignite.cache.affinity.Affinity;
-import org.apache.ignite.cache.query.QueryCursor;
-import org.apache.ignite.cache.query.SqlQuery;
-import org.apache.ignite.cluster.ClusterNode;
-import org.apache.ignite.compute.ComputeJob;
-import org.apache.ignite.compute.ComputeJobResult;
-import org.apache.ignite.compute.ComputeJobResultPolicy;
-import org.apache.ignite.compute.ComputeTaskAdapter;
-import org.apache.ignite.ml.genetic.parameter.GAConfiguration;
-import org.apache.ignite.ml.genetic.parameter.GAGridConstants;
-import org.apache.ignite.resources.IgniteInstanceResource;
-import org.jetbrains.annotations.NotNull;
-
-/**
- * Responsible for applying mutation on respective chromosomes.  <br/>
- *
- * MutateTask leverages Ignite's data affinity capabilities for routing MutateJobs to primary IgniteNode where <br/>
- * chromosomes reside.<br/>
- */
-public class MutateTask extends ComputeTaskAdapter<List<Long>, Boolean> {
-    /** Ignite instance */
-    @IgniteInstanceResource
-    private Ignite ignite;
-
-    /** GAConfiguration */
-    private GAConfiguration cfg;
-
-    /**
-     * @param cfg GAConfiguration
-     */
-    public MutateTask(GAConfiguration cfg) {
-        this.cfg = cfg;
-    }
-
-    /**
-     * choose mutated genes.
-     *
-     * @return Gene primary keys
-     */
-    private List<Long> getMutatedGenes() {
-        List<Long> mutatedGenes = new ArrayList<>();
-        cfg.getChromosomeLen();
-
-        for (int i = 0; i < cfg.getChromosomeLen(); i++)
-            mutatedGenes.add(selectGene(i));
-
-        return mutatedGenes;
-    }
-
-    /** {@inheritDoc} */
-    @NotNull @Override public Map map(List<ClusterNode> nodes, List<Long> chromosomeKeys) throws IgniteException {
-
-        Map<ComputeJob, ClusterNode> map = new HashMap<>();
-        Affinity affinity = ignite.affinity(GAGridConstants.POPULATION_CACHE);
-
-        for (Long key : chromosomeKeys) {
-            MutateJob ajob = new MutateJob(key, getMutatedGenes(), this.cfg.getMutationRate());
-            ClusterNode primary = affinity.mapKeyToNode(key);
-            map.put(ajob, primary);
-        }
-        return map;
-    }
-
-    /** {@inheritDoc} */
-    @Override public Boolean reduce(List<ComputeJobResult> list) throws IgniteException {
-        return Boolean.TRUE;
-    }
-
-    /** {@inheritDoc} */
-    @Override public ComputeJobResultPolicy result(ComputeJobResult res, List<ComputeJobResult> rcvd) {
-        IgniteException err = res.getException();
-
-        if (err != null)
-            return ComputeJobResultPolicy.FAILOVER;
-
-        // If there is no exception, wait for all job results.
-        return ComputeJobResultPolicy.WAIT;
-
-    }
-
-    /**
-     * select a gene from the Gene pool
-     *
-     * @return Primary key of Gene
-     */
-    private long selectAnyGene() {
-        int idx = selectRandomIndex(cfg.getGenePool().size());
-        Gene gene = cfg.getGenePool().get(idx);
-        return gene.id();
-    }
-
-    /**
-     * select a gene based from the Gene pool
-     *
-     * @param k Gene index in Chromosome.
-     * @return Primary key of Gene
-     */
-    private long selectGene(int k) {
-        if (cfg.getChromosomeCriteria() == null)
-            return (selectAnyGene());
-        else
-            return (selectGeneByChromosomeCriteria(k));
-    }
-
-    /**
-     * method assumes ChromosomeCriteria is set.
-     *
-     * @param k Gene index in Chromosome.
-     * @return Primary key of Gene
-     */
-    private long selectGeneByChromosomeCriteria(int k) {
-        List<Gene> genes = new ArrayList<>();
-
-        StringBuffer sbSqlClause = new StringBuffer("_val like '");
-        sbSqlClause.append("%");
-        sbSqlClause.append(cfg.getChromosomeCriteria().getCriteria().get(k));
-        sbSqlClause.append("%'");
-
-        IgniteCache<Long, Gene> cache = ignite.cache(GAGridConstants.GENE_CACHE);
-
-        SqlQuery sql = new SqlQuery(Gene.class, sbSqlClause.toString());
-
-        try (QueryCursor<Entry<Long, Gene>> cursor = cache.query(sql)) {
-            for (Entry<Long, Gene> e : cursor)
-                genes.add(e.getValue());
-        }
-
-        int idx = selectRandomIndex(genes.size());
-
-        Gene gene = genes.get(idx);
-        return gene.id();
-    }
-
-    /**
-     * select an index at random
-     *
-     * @param sizeOfGenePool Size of gene pool
-     * @return Index of Gene to be selected
-     */
-    private int selectRandomIndex(int sizeOfGenePool) {
-        Random randomGenerator = new Random();
-        return randomGenerator.nextInt(sizeOfGenePool);
-    }
-
-}
diff --git a/modules/ml/src/main/java/org/apache/ignite/ml/genetic/RouletteWheelSelectionJob.java b/modules/ml/src/main/java/org/apache/ignite/ml/genetic/RouletteWheelSelectionJob.java
deleted file mode 100644
index da0085f..0000000
--- a/modules/ml/src/main/java/org/apache/ignite/ml/genetic/RouletteWheelSelectionJob.java
+++ /dev/null
@@ -1,111 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package org.apache.ignite.ml.genetic;
-
-import java.util.Iterator;
-import java.util.LinkedHashMap;
-import java.util.Map;
-import java.util.Map.Entry;
-import java.util.Random;
-import java.util.stream.Collectors;
-import org.apache.ignite.Ignite;
-import org.apache.ignite.IgniteCache;
-import org.apache.ignite.IgniteException;
-import org.apache.ignite.IgniteLogger;
-import org.apache.ignite.compute.ComputeJobAdapter;
-import org.apache.ignite.ml.genetic.parameter.GAGridConstants;
-import org.apache.ignite.resources.IgniteInstanceResource;
-import org.apache.ignite.resources.LoggerResource;
-
-/**
- * Responsible for performing Roulette Wheel selection
- */
-public class RouletteWheelSelectionJob extends ComputeJobAdapter {
-    /** Ignite instance */
-    @IgniteInstanceResource
-    private Ignite ignite;
-
-    /** Ignite logger */
-    @LoggerResource
-    private IgniteLogger log;
-
-    /** Total Fitness score */
-    Double totalFitnessScore;
-
-    /** Chromosome key/fitness score pair */
-    LinkedHashMap<Long, Double> map;
-
-    /**
-     * @param totalFitnessScore Total fitness score
-     * @param map Chromosome key / fitness score map
-     */
-    public RouletteWheelSelectionJob(Double totalFitnessScore, LinkedHashMap<Long, Double> map) {
-        this.totalFitnessScore = totalFitnessScore;
-        this.map = map;
-    }
-
-    /**
-     * Perform Roulette Wheel selection
-     *
-     * @return Chromosome parent chosen after 'spinning' the wheel.
-     */
-    @Override public Chromosome execute() throws IgniteException {
-
-        IgniteCache<Long, Chromosome> populationCache = ignite.cache(GAGridConstants.POPULATION_CACHE);
-
-        int value = spintheWheel(this.totalFitnessScore);
-
-        double partialSum = 0;
-        boolean notFound = true;
-
-        //sort map in ascending order by fitness score
-        Map<Long, Double> sortedAscendingMap = map.entrySet().stream()
-            .sorted(Map.Entry.comparingByValue())
-            .collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue, (e1, e2) -> e1, LinkedHashMap::new));
-
-        Iterator<Entry<Long, Double>> entries = sortedAscendingMap.entrySet().iterator();
-
-        Long chromosomeKey = (long)-1;
-
-        while (entries.hasNext() && notFound) {
-            Entry<Long, Double> entry = entries.next();
-            Long key = entry.getKey();
-            Double fitnessScore = entry.getValue();
-            partialSum += fitnessScore;
-
-            if (partialSum >= value) {
-                notFound = false;
-                chromosomeKey = key;
-            }
-        }
-
-        return populationCache.get(chromosomeKey);
-    }
-
-    /**
-     * Spin the wheel.
-     *
-     * @param fitnessScore Size of Gene pool
-     * @return value
-     */
-    private int spintheWheel(Double fitnessScore) {
-        Random randomGenerator = new Random();
-        return randomGenerator.nextInt(fitnessScore.intValue());
-    }
-
-}
diff --git a/modules/ml/src/main/java/org/apache/ignite/ml/genetic/RouletteWheelSelectionTask.java b/modules/ml/src/main/java/org/apache/ignite/ml/genetic/RouletteWheelSelectionTask.java
deleted file mode 100644
index 74253d8..0000000
--- a/modules/ml/src/main/java/org/apache/ignite/ml/genetic/RouletteWheelSelectionTask.java
+++ /dev/null
@@ -1,154 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package org.apache.ignite.ml.genetic;
-
-import java.util.ArrayList;
-import java.util.HashMap;
-import java.util.LinkedHashMap;
-import java.util.List;
-import java.util.Map;
-import java.util.stream.Collectors;
-import org.apache.ignite.Ignite;
-import org.apache.ignite.IgniteCache;
-import org.apache.ignite.IgniteException;
-import org.apache.ignite.cache.affinity.Affinity;
-import org.apache.ignite.cache.query.QueryCursor;
-import org.apache.ignite.cache.query.SqlFieldsQuery;
-import org.apache.ignite.cluster.ClusterNode;
-import org.apache.ignite.compute.ComputeJob;
-import org.apache.ignite.compute.ComputeJobResult;
-import org.apache.ignite.compute.ComputeJobResultPolicy;
-import org.apache.ignite.compute.ComputeLoadBalancer;
-import org.apache.ignite.compute.ComputeTaskAdapter;
-import org.apache.ignite.ml.genetic.parameter.GAConfiguration;
-import org.apache.ignite.ml.genetic.parameter.GAGridConstants;
-import org.apache.ignite.resources.IgniteInstanceResource;
-import org.apache.ignite.resources.LoadBalancerResource;
-import org.jetbrains.annotations.NotNull;
-
-/**
- * Responsible for performing Roulette Wheel selection.
- */
-public class RouletteWheelSelectionTask extends ComputeTaskAdapter<LinkedHashMap<Long, Double>, List<Long>> {
-    /** Ignite resource. */
-    @IgniteInstanceResource
-    private Ignite ignite;
-
-    /** Inject load balancer. */
-    @LoadBalancerResource
-    ComputeLoadBalancer balancer;
-
-    /** GAConfiguration */
-    private GAConfiguration cfg;
-
-    /**
-     * @param cfg GAConfiguration
-     */
-    public RouletteWheelSelectionTask(GAConfiguration cfg) {
-        this.cfg = cfg;
-    }
-
-    /**
-     * Calculate total fitness of population
-     *
-     * @return Double value representing total fitness score of population
-     */
-    private Double calculateTotalFitness() {
-        double totalFitnessScore = 0;
-
-        IgniteCache<Long, Chromosome> cache = ignite.cache(GAGridConstants.POPULATION_CACHE);
-
-        SqlFieldsQuery sql = new SqlFieldsQuery("select SUM(FITNESSSCORE) from Chromosome");
-
-        // Iterate over the result set.
-        try (QueryCursor<List<?>> cursor = cache.query(sql)) {
-            for (List<?> row : cursor)
-                totalFitnessScore = (Double)row.get(0);
-        }
-
-        return totalFitnessScore;
-    }
-
-    /**
-     * @param nodes List of ClusterNode.
-     * @param chromosomeKeyFitness Map of key/fitness score pairs.
-     * @return Map of nodes to jobs.
-     */
-    @NotNull @Override public Map<ComputeJob, ClusterNode> map(List<ClusterNode> nodes,
-        LinkedHashMap<Long, Double> chromosomeKeyFitness) throws IgniteException {
-        Map<ComputeJob, ClusterNode> map = new HashMap<>();
-
-        Affinity affinity = ignite.affinity(GAGridConstants.POPULATION_CACHE);
-        Double totalFitness = this.calculateTotalFitness();
-
-        int populationSize = this.cfg.getPopulationSize();
-
-        for (int i = 0; i < populationSize; i++) {
-            // Pick the next best balanced node for the job.
-            RouletteWheelSelectionJob job = new RouletteWheelSelectionJob(totalFitness, chromosomeKeyFitness);
-            map.put(job, balancer.getBalancedNode(job, null));
-        }
-
-        return map;
-    }
-
-    /**
-     * Return list of parent Chromosomes.
-     *
-     * @param list List of ComputeJobResult.
-     * @return List of Chromosome keys.
-     */
-    @Override public List<Long> reduce(List<ComputeJobResult> list) throws IgniteException {
-        List<Chromosome> parents = list.stream().map((x) -> (Chromosome)x.getData()).collect(Collectors.toList());
-
-        return createParents(parents);
-    }
-
-    /**
-     * Create new parents and add to populationCache
-     *
-     * @param parents Chromosomes chosen to breed
-     * @return List of Chromosome keys.
-     */
-    private List<Long> createParents(List<Chromosome> parents) {
-        IgniteCache<Long, Chromosome> cache = ignite.cache(GAGridConstants.POPULATION_CACHE);
-        cache.clear();
-
-        List<Long> keys = new ArrayList();
-
-        parents.forEach((x) -> {
-            long[] genes = x.getGenes();
-            Chromosome newparent = new Chromosome(genes);
-            cache.put(newparent.id(), newparent);
-            keys.add(newparent.id());
-        });
-
-        return keys;
-    }
-
-    /** {@inheritDoc} */
-    @Override public ComputeJobResultPolicy result(ComputeJobResult res, List<ComputeJobResult> rcvd) {
-        IgniteException err = res.getException();
-
-        if (err != null)
-            return ComputeJobResultPolicy.FAILOVER;
-
-        // If there is no exception, wait for all job results.
-        return ComputeJobResultPolicy.WAIT;
-    }
-}
diff --git a/modules/ml/src/main/java/org/apache/ignite/ml/genetic/TruncateSelectionJob.java b/modules/ml/src/main/java/org/apache/ignite/ml/genetic/TruncateSelectionJob.java
deleted file mode 100644
index 19cbc39..0000000
--- a/modules/ml/src/main/java/org/apache/ignite/ml/genetic/TruncateSelectionJob.java
+++ /dev/null
@@ -1,75 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package org.apache.ignite.ml.genetic;
-
-import java.util.List;
-import org.apache.ignite.Ignite;
-import org.apache.ignite.IgniteCache;
-import org.apache.ignite.IgniteException;
-import org.apache.ignite.compute.ComputeJobAdapter;
-import org.apache.ignite.ml.genetic.parameter.GAGridConstants;
-import org.apache.ignite.resources.IgniteInstanceResource;
-import org.apache.ignite.transactions.Transaction;
-
-/**
- * Responsible for performing truncate selection
- */
-public class TruncateSelectionJob extends ComputeJobAdapter {
-    /** primary key of Chromosome to mutate */
-    private Long key;
-
-    /** primary keys of genes to be used in mutation */
-    private List<Long> mutatedGeneKeys;
-
-    /** Ignite instance */
-    @IgniteInstanceResource
-    private Ignite ignite;
-
-    /**
-     * @param key Primary key of Chromosome to mutate
-     * @param mutatedGeneKeys Primary keys of genes to be used in mutation
-     */
-    public TruncateSelectionJob(Long key, List<Long> mutatedGeneKeys) {
-        this.key = key;
-        this.mutatedGeneKeys = mutatedGeneKeys;
-    }
-
-    /** {@inheritDoc} */
-    @Override public Boolean execute() throws IgniteException {
-
-        IgniteCache<Long, Chromosome> populationCache = ignite.cache(GAGridConstants.POPULATION_CACHE);
-
-        Chromosome chromosome = populationCache.localPeek(key);
-
-        long[] geneKeys = chromosome.getGenes();
-
-        for (int k = 0; k < this.mutatedGeneKeys.size(); k++)
-            geneKeys[k] = this.mutatedGeneKeys.get(k);
-
-        chromosome.setGenes(geneKeys);
-
-        Transaction tx = ignite.transactions().txStart();
-
-        populationCache.put(chromosome.id(), chromosome);
-
-        tx.commit();
-
-        return Boolean.TRUE;
-    }
-
-}
diff --git a/modules/ml/src/main/java/org/apache/ignite/ml/genetic/TruncateSelectionTask.java b/modules/ml/src/main/java/org/apache/ignite/ml/genetic/TruncateSelectionTask.java
deleted file mode 100644
index 9d3ccb1..0000000
--- a/modules/ml/src/main/java/org/apache/ignite/ml/genetic/TruncateSelectionTask.java
+++ /dev/null
@@ -1,145 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package org.apache.ignite.ml.genetic;
-
-import java.util.ArrayList;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-import javax.cache.Cache.Entry;
-import org.apache.ignite.Ignite;
-import org.apache.ignite.IgniteCache;
-import org.apache.ignite.IgniteException;
-import org.apache.ignite.cache.affinity.Affinity;
-import org.apache.ignite.cache.query.QueryCursor;
-import org.apache.ignite.cache.query.SqlQuery;
-import org.apache.ignite.cluster.ClusterNode;
-import org.apache.ignite.compute.ComputeJob;
-import org.apache.ignite.compute.ComputeJobResult;
-import org.apache.ignite.compute.ComputeJobResultPolicy;
-import org.apache.ignite.compute.ComputeTaskAdapter;
-import org.apache.ignite.ml.genetic.parameter.GAGridConstants;
-import org.apache.ignite.resources.IgniteInstanceResource;
-import org.jetbrains.annotations.NotNull;
-
-/**
- * Responsible for performing truncate selection.
- */
-public class TruncateSelectionTask extends ComputeTaskAdapter<List<Long>, Boolean> {
-    /** Ignite resource. */
-    @IgniteInstanceResource
-    private Ignite ignite;
-
-    /** Fittest keys. */
-    private List<Long> fittestKeys;
-
-    /** Number of Copies. */
-    private int numOfCopies;
-
-    /**
-     * @param fittestKeys List of long.
-     * @param numOfCopies Number of Copies.
-     */
-    public TruncateSelectionTask(List<Long> fittestKeys, int numOfCopies) {
-        this.fittestKeys = fittestKeys;
-        this.numOfCopies = numOfCopies;
-    }
-
-    /**
-     * Retrieve a chromosome.
-     *
-     * @param key Primary key of chromosome.
-     * @return Chromosome.
-     */
-    private Chromosome getChromosome(Long key) {
-        IgniteCache<Long, Chromosome> cache = ignite.cache(GAGridConstants.POPULATION_CACHE);
-        StringBuffer sbSqlClause = new StringBuffer();
-        sbSqlClause.append("_key IN (");
-        sbSqlClause.append(key);
-        sbSqlClause.append(")");
-
-        Chromosome chromosome = null;
-
-        SqlQuery sql = new SqlQuery(Chromosome.class, sbSqlClause.toString());
-
-        try (QueryCursor<Entry<Long, Chromosome>> cursor = cache.query(sql)) {
-            for (Entry<Long, Chromosome> e : cursor)
-                chromosome = (e.getValue());
-        }
-
-        return chromosome;
-    }
-
-    /**
-     * Return a List of lists containing keys.
-     *
-     * @return List of lists containing keys.
-     */
-    private List<List<Long>> getEnhancedPopulation() {
-        List<List<Long>> list = new ArrayList<>();
-
-        for (Long key : fittestKeys) {
-            Chromosome cp = getChromosome(key);
-            for (int i = 0; i < numOfCopies; i++) {
-                long[] thegenes = cp.getGenes();
-                List<Long> geneList = new ArrayList<>();
-                for (int k = 0; k < cp.getGenes().length; k++)
-                    geneList.add(thegenes[k]);
-
-                list.add(geneList);
-            }
-        }
-
-        return list;
-    }
-
-    /** {@inheritDoc} */
-    @NotNull @Override public Map map(List<ClusterNode> nodes, List<Long> chromosomeKeys) throws IgniteException {
-        Map<ComputeJob, ClusterNode> map = new HashMap<>();
-        Affinity affinity = ignite.affinity(GAGridConstants.POPULATION_CACHE);
-
-        // Retrieve enhanced population
-        List<List<Long>> enhancedPopulation = getEnhancedPopulation();
-
-        int k = 0;
-        for (Long key : chromosomeKeys) {
-            TruncateSelectionJob ajob = new TruncateSelectionJob(key, enhancedPopulation.get(k));
-            ClusterNode primary = affinity.mapKeyToNode(key);
-            map.put(ajob, primary);
-            k += 1;
-        }
-        return map;
-    }
-
-    /** {@inheritDoc} */
-    @Override public Boolean reduce(List<ComputeJobResult> list) throws IgniteException {
-        return Boolean.TRUE;
-    }
-
-    /** {@inheritDoc} */
-    @Override public ComputeJobResultPolicy result(ComputeJobResult res, List<ComputeJobResult> rcvd) {
-        IgniteException err = res.getException();
-
-        if (err != null)
-            return ComputeJobResultPolicy.FAILOVER;
-
-        // If there is no exception, wait for all job results.
-        return ComputeJobResultPolicy.WAIT;
-    }
-
-}
diff --git a/modules/ml/src/main/java/org/apache/ignite/ml/genetic/cache/GeneCacheConfig.java b/modules/ml/src/main/java/org/apache/ignite/ml/genetic/cache/GeneCacheConfig.java
deleted file mode 100644
index f980e22..0000000
--- a/modules/ml/src/main/java/org/apache/ignite/ml/genetic/cache/GeneCacheConfig.java
+++ /dev/null
@@ -1,49 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package org.apache.ignite.ml.genetic.cache;
-
-import org.apache.ignite.cache.CacheMode;
-import org.apache.ignite.cache.CacheRebalanceMode;
-import org.apache.ignite.configuration.CacheConfiguration;
-import org.apache.ignite.ml.genetic.Gene;
-import org.apache.ignite.ml.genetic.functions.GAGridFunction;
-import org.apache.ignite.ml.genetic.parameter.GAGridConstants;
-
-/**
- * Cache configuration for GAGridConstants.GENE_CACHE
- *
- * cache maintains full population of genes.
- */
-public class GeneCacheConfig {
-    /**
-     * @return Cache Configuration
-     */
-    public static CacheConfiguration<Long, Gene> geneCache() {
-
-        CacheConfiguration<Long, Gene> cfg = new CacheConfiguration<>(GAGridConstants.GENE_CACHE);
-        cfg.setIndexedTypes(Long.class, Gene.class);
-        cfg.setCacheMode(CacheMode.REPLICATED);
-        cfg.setRebalanceMode(CacheRebalanceMode.SYNC);
-        cfg.setStatisticsEnabled(true);
-        cfg.setBackups(1);
-        cfg.setSqlFunctionClasses(GAGridFunction.class);
-        return cfg;
-
-    }
-
-}
diff --git a/modules/ml/src/main/java/org/apache/ignite/ml/genetic/cache/PopulationCacheConfig.java b/modules/ml/src/main/java/org/apache/ignite/ml/genetic/cache/PopulationCacheConfig.java
deleted file mode 100644
index 6a8b2b4..0000000
--- a/modules/ml/src/main/java/org/apache/ignite/ml/genetic/cache/PopulationCacheConfig.java
+++ /dev/null
@@ -1,50 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package org.apache.ignite.ml.genetic.cache;
-
-import org.apache.ignite.cache.CacheAtomicityMode;
-import org.apache.ignite.cache.CacheMode;
-import org.apache.ignite.cache.CacheRebalanceMode;
-import org.apache.ignite.configuration.CacheConfiguration;
-import org.apache.ignite.ml.genetic.Chromosome;
-import org.apache.ignite.ml.genetic.parameter.GAGridConstants;
-
-/**
- * Cache configuration for GAGridConstants.POPULATION_CACHE
- *
- * cache population of chromosomes (ie: potential solutions)
- */
-public class PopulationCacheConfig {
-    /**
-     * @return Cache Configuration
-     */
-    public static CacheConfiguration<Long, Chromosome> populationCache() {
-
-        CacheConfiguration<Long, Chromosome> cfg = new CacheConfiguration<>(GAGridConstants.POPULATION_CACHE);
-        cfg.setIndexedTypes(Long.class, Chromosome.class);
-        cfg.setCacheMode(CacheMode.PARTITIONED);
-        cfg.setRebalanceMode(CacheRebalanceMode.SYNC);
-        cfg.setAtomicityMode(CacheAtomicityMode.TRANSACTIONAL);
-        cfg.setStatisticsEnabled(true);
-        cfg.setBackups(1);
-
-        return cfg;
-
-    }
-
-}
diff --git a/modules/ml/src/main/java/org/apache/ignite/ml/genetic/cache/package-info.java b/modules/ml/src/main/java/org/apache/ignite/ml/genetic/cache/package-info.java
deleted file mode 100644
index 3dfd401..0000000
--- a/modules/ml/src/main/java/org/apache/ignite/ml/genetic/cache/package-info.java
+++ /dev/null
@@ -1,22 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-/**
- * Contains cache configurations for GA Grid
- */
-
-package org.apache.ignite.ml.genetic.cache;
diff --git a/modules/ml/src/main/java/org/apache/ignite/ml/genetic/functions/GAGridFunction.java b/modules/ml/src/main/java/org/apache/ignite/ml/genetic/functions/GAGridFunction.java
deleted file mode 100644
index bdc3baf..0000000
--- a/modules/ml/src/main/java/org/apache/ignite/ml/genetic/functions/GAGridFunction.java
+++ /dev/null
@@ -1,122 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package org.apache.ignite.ml.genetic.functions;
-
-import java.sql.SQLException;
-import java.sql.Types;
-import java.util.List;
-import org.apache.ignite.Ignite;
-import org.apache.ignite.Ignition;
-import org.apache.ignite.cache.query.annotations.QuerySqlFunction;
-import org.apache.ignite.ml.genetic.Chromosome;
-import org.apache.ignite.ml.genetic.Gene;
-import org.apache.ignite.ml.genetic.utils.GAGridUtils;
-import org.h2.tools.SimpleResultSet;
-
-/**
- * Responsible for providing custom SQL functions to retrieve optimization results.
- */
-public class GAGridFunction {
-     /** */
-    public GAGridFunction() {
-    }
-
-    /**
-     * Retrieve solutions in descending order based on fitness score.
-     *
-     * @return Result set.
-     * @throws SQLException If failed.
-     */
-    @QuerySqlFunction
-    public static SimpleResultSet getSolutionsDesc() {
-        return (getChromosomes("order by fitnessScore desc"));
-    }
-
-    /**
-     * Retrieve solutions in ascending order based on fitness score.
-     *
-     * @return Result set
-     * @throws SQLException If failed.
-     */
-    @QuerySqlFunction
-    public static SimpleResultSet getSolutionsAsc() throws SQLException {
-        return (getChromosomes("order by fitnessScore asc"));
-    }
-
-    /**
-     * Retrieve and individual solution by Chromosome key.
-     *
-     * @param key Primary key of Chromosome.
-     * @return SimpleResultSet.
-     * @throws SQLException If failed.
-     */
-    @QuerySqlFunction
-    public static SimpleResultSet getSolutionById(int key) throws SQLException {
-        StringBuffer sbSqlClause = new StringBuffer();
-        sbSqlClause.append("_key IN");
-        sbSqlClause.append("(");
-        sbSqlClause.append(key);
-        sbSqlClause.append(")");
-        return (getChromosomes(sbSqlClause.toString()));
-    }
-
-    /**
-     * Helper routine to return 'pivoted' results using the provided query param.
-     *
-     * @param qry Sql
-     * @return Result set
-     */
-    private static SimpleResultSet getChromosomes(String qry) {
-        Ignite ignite = Ignition.localIgnite();
-
-        List<Chromosome> chromosomes = GAGridUtils.getChromosomes(ignite, qry);
-
-        SimpleResultSet rs2 = new SimpleResultSet();
-
-        Chromosome aChrom = chromosomes.get(0);
-        int genesCnt = aChrom.getGenes().length;
-
-        rs2.addColumn("Chromosome Id", Types.INTEGER, 0, 0);
-        rs2.addColumn("Fitness Score", Types.DOUBLE, 0, 0);
-
-        for (int i = 0; i < genesCnt; i++) {
-            int colIdx = i + 1;
-            rs2.addColumn("Gene " + colIdx, Types.VARCHAR, 0, 0);
-        }
-
-        for (Chromosome rowChrom : chromosomes) {
-
-            Object[] row = new Object[genesCnt + 2];
-            row[0] = rowChrom.id();
-            row[1] = rowChrom.getFitnessScore();
-
-            List<Gene> genes = GAGridUtils.getGenesInOrderForChromosome(ignite, rowChrom);
-            int i = 2;
-
-            for (Gene gene : genes) {
-                row[i] = gene.getVal().toString();
-                i += 1;
-            }
-            //Add a row for an individual Chromosome
-            rs2.addRow(row);
-        }
-
-        return rs2;
-    }
-
-}
diff --git a/modules/ml/src/main/java/org/apache/ignite/ml/genetic/functions/package-info.java b/modules/ml/src/main/java/org/apache/ignite/ml/genetic/functions/package-info.java
deleted file mode 100644
index 8822a00..0000000
--- a/modules/ml/src/main/java/org/apache/ignite/ml/genetic/functions/package-info.java
+++ /dev/null
@@ -1,22 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-/**
- * Contains functions used for GA Grid
- */
-
-package org.apache.ignite.ml.genetic.functions;
diff --git a/modules/ml/src/main/java/org/apache/ignite/ml/genetic/package-info.java b/modules/ml/src/main/java/org/apache/ignite/ml/genetic/package-info.java
deleted file mode 100644
index fad2a52..0000000
--- a/modules/ml/src/main/java/org/apache/ignite/ml/genetic/package-info.java
+++ /dev/null
@@ -1,22 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-/**
- * Root GA package (GA Grid)
- */
-
-package org.apache.ignite.ml.genetic;
diff --git a/modules/ml/src/main/java/org/apache/ignite/ml/genetic/parameter/ChromosomeCriteria.java b/modules/ml/src/main/java/org/apache/ignite/ml/genetic/parameter/ChromosomeCriteria.java
deleted file mode 100644
index de035be..0000000
--- a/modules/ml/src/main/java/org/apache/ignite/ml/genetic/parameter/ChromosomeCriteria.java
+++ /dev/null
@@ -1,48 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package org.apache.ignite.ml.genetic.parameter;
-
-import java.util.ArrayList;
-import java.util.List;
-
-/**
- * Responsible for describing the characteristics of an individual Chromosome.
- */
-public class ChromosomeCriteria {
-    /** List of criteria for a Chromosome */
-    private List<String> criteria = new ArrayList<>();
-
-    /**
-     * Retrieve criteria
-     *
-     * @return List of strings
-     */
-    public List<String> getCriteria() {
-        return criteria;
-    }
-
-    /**
-     * Set criteria
-     *
-     * @param criteria List of criteria to be applied for a Chromosome ;Use format "name=value", ie: "coinType=QUARTER"
-     */
-    public void setCriteria(List<String> criteria) {
-        this.criteria = criteria;
-    }
-
-}
diff --git a/modules/ml/src/main/java/org/apache/ignite/ml/genetic/parameter/GAConfiguration.java b/modules/ml/src/main/java/org/apache/ignite/ml/genetic/parameter/GAConfiguration.java
deleted file mode 100644
index c7da056..0000000
--- a/modules/ml/src/main/java/org/apache/ignite/ml/genetic/parameter/GAConfiguration.java
+++ /dev/null
@@ -1,332 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package org.apache.ignite.ml.genetic.parameter;
-
-import java.util.ArrayList;
-import java.util.List;
-import org.apache.ignite.ml.genetic.Gene;
-import org.apache.ignite.ml.genetic.IFitnessFunction;
-
-/**
- * Maintains configuration parameters to be used in genetic algorithm
- *
- * <br/>
- *
- * <p>
- *
- * NOTE: Default selectionMethod is SELECTION_METHOD_TRUNCATION
- *
- * Default truncateRate is .10
- *
- * More selectionMethods will be introduced in future releases.
- *
- * </p>
- */
-public class GAConfiguration {
-    /** Selection method */
-    private GAGridConstants.SELECTION_METHOD selectionMtd;
-
-    /** Criteria used to describe a chromosome */
-    private ChromosomeCriteria chromosomeCriteria;
-
-    /**
-     * Percentage of most fit chromosomes to be maintained and utilized to copy into new population.
-     *
-     * NOTE: This parameter is only considered when selectionMethod is SELECTION_METHOD_TRUNCATION
-     *
-     * Accepted values between 0 and 1
-     */
-    private double truncateRate;
-
-    /**
-     * Elitism is the concept that the strongest members of the population will be preserved from generation to
-     * generation. <br/>
-     *
-     * No crossovers or mutations will be performed for elite chromosomes.
-     *
-     * NOTE: This parameter is only considered when selectionMethod is SELECTION_METHOD_ELITISM.
-     */
-    private int elitismCnt;
-
-    /**
-     * Indicates how chromosome fitness values should be evaluated. </br> A chromosome with
-     * isHigherFitnessValueFitter=true is considered fittest.
-     */
-    private boolean isHigherFitnessValFitter = true;
-
-    /**
-     * Population size represents the number of potential solutions (ie: chromosomes) between each generation Default
-     * size is 500
-     *
-     * </br> NOTE: The population size remains fixed between each generation
-     */
-    private int populationSize = 500;
-
-    /** Gene pool is the sum of ALL genes utilized to create chromosomes */
-    private List<Gene> genePool = new ArrayList<>();
-
-    /** Number of genes within a chromosome */
-    private int chromosomeLen;
-
-    /**
-     * Crossover rate is the probability that two chromosomes will breed with each other. offspring with traits of each
-     * of the parents.
-     *
-     * Accepted values are between 0 and 1
-     */
-    private double crossOverRate = .50;
-
-    /**
-     * Mutation rate is the probability that a chromosome will be mutated offspring with traits of each of the parents.
-     *
-     *
-     * Accepted values are between 0 and 1
-     */
-    private double mutationRate = .50;
-
-    /**
-     * Call back interface used to terminate Genetic algorithm.
-     *
-     * Implement this interface based on particular use case.
-     */
-    private ITerminateCriteria terminateCriteria;
-
-    /**
-     * Represents a fitness function. Implement the IFitnessFunction to satisfy your particular use case.
-     */
-    private IFitnessFunction fitnessFunction;
-
-    /**
-     * Default constructor.
-     */
-    public GAConfiguration() {
-        this.setSelectionMtd(GAGridConstants.SELECTION_METHOD.SELECTION_METHOD_TRUNCATION);
-        this.setTruncateRate(.10);
-    }
-
-    /**
-     * retrieve the ChromosomeCriteria
-     *
-     * @return Chromosome criteria
-     */
-    public ChromosomeCriteria getChromosomeCriteria() {
-        return chromosomeCriteria;
-    }
-
-    /**
-     * set value for ChromosomeCriteria
-     *
-     * @param chromosomeCriteria Chromosome criteria
-     */
-
-    public void setChromosomeCriteria(ChromosomeCriteria chromosomeCriteria) {
-        this.chromosomeCriteria = chromosomeCriteria;
-    }
-
-    /**
-     * @return Boolean value indicating how fitness values should be evaluated.
-     */
-    public boolean isHigherFitnessValFitter() {
-        return this.isHigherFitnessValFitter;
-    }
-
-    /**
-     * Retrieve the chromosome length
-     *
-     * @return Size of Chromosome
-     */
-    public int getChromosomeLen() {
-        return chromosomeLen;
-    }
-
-    /**
-     * Set the Chromsome length
-     *
-     * @param chromosomeLen Size of Chromosome
-     */
-    public void setChromosomeLen(int chromosomeLen) {
-        this.chromosomeLen = chromosomeLen;
-    }
-
-    /**
-     * Retrieve the cross over rate
-     *
-     * @return Cross over rate
-     */
-    public double getCrossOverRate() {
-        return crossOverRate;
-    }
-
-    /**
-     * Set the cross over rate.
-     *
-     * @param crossOverRate Cross over rate
-     */
-    public void setCrossOverRate(double crossOverRate) {
-        this.crossOverRate = crossOverRate;
-    }
-
-    /**
-     * Retrieve the elitism count
-     *
-     * @return Elitism count
-     */
-    public int getElitismCnt() {
-        return elitismCnt;
-    }
-
-    /**
-     * Set the elitism count.
-     *
-     * @param elitismCnt Elitism count
-     */
-    public void setElitismCnt(int elitismCnt) {
-        this.elitismCnt = elitismCnt;
-    }
-
-    /**
-     * Retrieve IFitnessFunction
-     *
-     * @return Fitness function
-     */
-    public IFitnessFunction getFitnessFunction() {
-        return fitnessFunction;
-    }
-
-    /**
-     * Set IFitnessFunction
-     *
-     * @param fitnessFunction Fitness function
-     */
-    public void setFitnessFunction(IFitnessFunction fitnessFunction) {
-        this.fitnessFunction = fitnessFunction;
-    }
-
-    /**
-     * Retrieve the gene pool
-     *
-     * @return List of Genes
-     */
-    public List<Gene> getGenePool() {
-        return (this.genePool);
-    }
-
-    /**
-     * Set the gene pool.
-     *
-     * NOTE: When Apache Ignite is started the gene pool is utilized to initialize the distributed
-     * GAGridConstants.GENE_CACHE.
-     *
-     * @param genePool List of Genes
-     */
-    public void setGenePool(List<Gene> genePool) {
-        this.genePool = genePool;
-    }
-
-    /**
-     * Retrieve the mutation rate.
-     *
-     * @return Mutation Rate
-     */
-    public double getMutationRate() {
-        return mutationRate;
-    }
-
-    /**
-     * Set the mutation rate.
-     *
-     * @param mutationRate Mutation Rate
-     */
-    public void setMutationRate(double mutationRate) {
-        this.mutationRate = mutationRate;
-    }
-
-    /**
-     * Retrieve the population size
-     *
-     * @return Population size
-     */
-
-    public int getPopulationSize() {
-        return populationSize;
-    }
-
-    /**
-     * Set the population size
-     *
-     * @param populationSize Size of population
-     */
-    public void setPopulationSize(int populationSize) {
-        this.populationSize = populationSize;
-    }
-
-    /**
-     * Get the selection method
-     *
-     * @return Selection method
-     */
-    public GAGridConstants.SELECTION_METHOD getSelectionMtd() {
-        return selectionMtd;
-    }
-
-    /**
-     * Set the selection method
-     *
-     * @param selectionMtd Selection method
-     */
-    public void setSelectionMtd(GAGridConstants.SELECTION_METHOD selectionMtd) {
-        this.selectionMtd = selectionMtd;
-    }
-
-    /**
-     * Retrieve the termination criteria
-     *
-     * @return Termination Criteria
-     */
-    public ITerminateCriteria getTerminateCriteria() {
-        return terminateCriteria;
-    }
-
-    /**
-     * Set the termination criteria.
-     *
-     * @param terminateCriteria Termination Criteria
-     */
-    public void setTerminateCriteria(ITerminateCriteria terminateCriteria) {
-        this.terminateCriteria = terminateCriteria;
-    }
-
-    /**
-     * Retrieve truncateRate
-     *
-     * @return Truncate Rate
-     */
-    public double getTruncateRate() {
-        return truncateRate;
-    }
-
-    /**
-     * Set truncatePercentage
-     *
-     * @param truncateRate Truncate rate
-     */
-    public void setTruncateRate(double truncateRate) {
-        this.truncateRate = truncateRate;
-    }
-
-}
diff --git a/modules/ml/src/main/java/org/apache/ignite/ml/genetic/parameter/GAGridConstants.java b/modules/ml/src/main/java/org/apache/ignite/ml/genetic/parameter/GAGridConstants.java
deleted file mode 100644
index 86111ea..0000000
--- a/modules/ml/src/main/java/org/apache/ignite/ml/genetic/parameter/GAGridConstants.java
+++ /dev/null
@@ -1,39 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package org.apache.ignite.ml.genetic.parameter;
-
-/**
- * GAGridConstants
- */
-public interface GAGridConstants {
-    /** populationCache constant */
-    public static final String POPULATION_CACHE = "populationCache";
-
-    /** populationCache constant */
-    public static final String GENE_CACHE = "geneCache";
-
-    /** Selection Method type **/
-    public enum SELECTION_METHOD {
-        /** Selection method eletism. */
-        SELECTION_METHOD_ELITISM,
-        /** Selection method truncation. */
-        SELECTION_METHOD_TRUNCATION,
-        /** Selection method roulette wheel. */
-        SELECTION_METHOD_ROULETTE_WHEEL
-    }
-}
diff --git a/modules/ml/src/main/java/org/apache/ignite/ml/genetic/parameter/ITerminateCriteria.java b/modules/ml/src/main/java/org/apache/ignite/ml/genetic/parameter/ITerminateCriteria.java
deleted file mode 100644
index 5868b3d..0000000
--- a/modules/ml/src/main/java/org/apache/ignite/ml/genetic/parameter/ITerminateCriteria.java
+++ /dev/null
@@ -1,39 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package org.apache.ignite.ml.genetic.parameter;
-
-import org.apache.ignite.ml.genetic.Chromosome;
-
-/**
- * Represents the terminate condition for a genetic algorithm.
- *
- * <p>
- *
- * Implement this interface for your respective use case.
- *
- * </p>
- */
-public interface ITerminateCriteria {
-    /**
-     * @param fittestChromosome Fittest chromosome as of the nth generation
-     * @param averageFitnessScore Average fitness score
-     * @param generation Current number of generations
-     * @return Boolean value to determine when to stop evolution
-     */
-    public boolean isTerminationConditionMet(Chromosome fittestChromosome, double averageFitnessScore, int generation);
-}
diff --git a/modules/ml/src/main/java/org/apache/ignite/ml/genetic/parameter/package-info.java b/modules/ml/src/main/java/org/apache/ignite/ml/genetic/parameter/package-info.java
deleted file mode 100644
index a22dd60..0000000
--- a/modules/ml/src/main/java/org/apache/ignite/ml/genetic/parameter/package-info.java
+++ /dev/null
@@ -1,22 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-/**
- * Contains parameters used for GA Grid
- */
-
-package org.apache.ignite.ml.genetic.parameter;
diff --git a/modules/ml/src/main/java/org/apache/ignite/ml/genetic/utils/GAGridUtils.java b/modules/ml/src/main/java/org/apache/ignite/ml/genetic/utils/GAGridUtils.java
deleted file mode 100644
index c80fa52..0000000
--- a/modules/ml/src/main/java/org/apache/ignite/ml/genetic/utils/GAGridUtils.java
+++ /dev/null
@@ -1,89 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package org.apache.ignite.ml.genetic.utils;
-
-import java.util.ArrayList;
-import java.util.List;
-import javax.cache.Cache.Entry;
-import org.apache.ignite.Ignite;
-import org.apache.ignite.IgniteCache;
-import org.apache.ignite.cache.query.QueryCursor;
-import org.apache.ignite.cache.query.SqlQuery;
-import org.apache.ignite.ml.genetic.Chromosome;
-import org.apache.ignite.ml.genetic.Gene;
-import org.apache.ignite.ml.genetic.cache.PopulationCacheConfig;
-import org.apache.ignite.ml.genetic.parameter.GAGridConstants;
-
-/**
- * GA Grid Helper routines
- */
-public class GAGridUtils {
-    /**
-     * Retrieve chromosomes
-     *
-     * @param ignite Ignite
-     * @param qry Sql
-     * @return List of Chromosomes
-     */
-    public static List<Chromosome> getChromosomes(Ignite ignite, String qry) {
-        List<Chromosome> chromosomes = new ArrayList<>();
-
-        IgniteCache<Long, Chromosome> populationCache = ignite.getOrCreateCache(PopulationCacheConfig.populationCache());
-
-        SqlQuery sql = new SqlQuery(Chromosome.class, qry);
-
-        try (QueryCursor<Entry<Long, Chromosome>> cursor = populationCache.query(sql)) {
-            for (Entry<Long, Chromosome> e : cursor)
-                chromosomes.add(e.getValue());
-        }
-
-        return chromosomes;
-    }
-
-    /**
-     * Retrieve genes in order
-     *
-     * @param ignite Ignite
-     * @param chromosome Chromosome
-     * @return List of Genes
-     */
-    public static List<Gene> getGenesInOrderForChromosome(Ignite ignite, Chromosome chromosome) {
-        List<Gene> genes = new ArrayList<>();
-        IgniteCache<Long, Gene> cache = ignite.cache(GAGridConstants.GENE_CACHE);
-
-        long[] primaryKeys = chromosome.getGenes();
-
-        for (int k = 0; k < primaryKeys.length; k++) {
-
-            StringBuffer sbSqlClause = new StringBuffer();
-            sbSqlClause.append("_key IN ");
-            sbSqlClause.append("(");
-            sbSqlClause.append(primaryKeys[k]);
-            sbSqlClause.append(")");
-
-            SqlQuery sql = new SqlQuery(Gene.class, sbSqlClause.toString());
-
-            try (QueryCursor<Entry<Long, Gene>> cursor = cache.query(sql)) {
-                for (Entry<Long, Gene> e : cursor)
-                    genes.add(e.getValue());
-            }
-        }
-
-        return genes;
-    }
-}
diff --git a/modules/ml/src/main/java/org/apache/ignite/ml/genetic/utils/package-info.java b/modules/ml/src/main/java/org/apache/ignite/ml/genetic/utils/package-info.java
deleted file mode 100644
index eaf23ba5..0000000
--- a/modules/ml/src/main/java/org/apache/ignite/ml/genetic/utils/package-info.java
+++ /dev/null
@@ -1,22 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-/**
- * Contains utils for GA Grid
- */
-
-package org.apache.ignite.ml.genetic.utils;
diff --git a/modules/tensorflow/src/main/java/org/apache/ignite/tensorflow/util/SerializableConsumer.java b/modules/ml/src/main/java/org/apache/ignite/ml/math/functions/IgniteDoubleConsumer.java
similarity index 78%
rename from modules/tensorflow/src/main/java/org/apache/ignite/tensorflow/util/SerializableConsumer.java
rename to modules/ml/src/main/java/org/apache/ignite/ml/math/functions/IgniteDoubleConsumer.java
index ece58aa..baa478a 100644
--- a/modules/tensorflow/src/main/java/org/apache/ignite/tensorflow/util/SerializableConsumer.java
+++ b/modules/ml/src/main/java/org/apache/ignite/ml/math/functions/IgniteDoubleConsumer.java
@@ -15,15 +15,15 @@
  * limitations under the License.
  */
 
-package org.apache.ignite.tensorflow.util;
+package org.apache.ignite.ml.math.functions;
 
 import java.io.Serializable;
-import java.util.function.Consumer;
+import java.util.function.DoubleConsumer;
 
 /**
- * Serializable consumer.
+ * Serializable DoubleConsumer.
  *
- * @param <T> The type of the input to the operation.
+ * @see DoubleConsumer
  */
-public interface SerializableConsumer<T> extends Consumer<T>, Serializable {
+public interface IgniteDoubleConsumer extends DoubleConsumer, Serializable {
 }
diff --git a/modules/ml/src/main/java/org/apache/ignite/ml/pipeline/Pipeline.java b/modules/ml/src/main/java/org/apache/ignite/ml/pipeline/Pipeline.java
index b869aed..cea87c5 100644
--- a/modules/ml/src/main/java/org/apache/ignite/ml/pipeline/Pipeline.java
+++ b/modules/ml/src/main/java/org/apache/ignite/ml/pipeline/Pipeline.java
@@ -43,7 +43,7 @@
  * @param <K> Type of a key in {@code upstream} data.
  * @param <V> Type of a value in {@code upstream} data.
  */
-public class Pipeline<K, V, C extends Serializable, L> {
+public class Pipeline<K, V, C extends Serializable, L> implements Serializable {
     /** Final Feature extractor. */
     private Preprocessor<K, V> finalPreprocessor;
 
@@ -158,4 +158,11 @@
             .withPreprocessor(finalPreprocessor)
             .withInternalMdl(internalMdl);
     }
+
+    /**
+     * Returns the final preprocessor for evaluation needs.
+     */
+    public Preprocessor<K, V> getFinalPreprocessor() {
+        return finalPreprocessor;
+    }
 }
diff --git a/modules/ml/src/main/java/org/apache/ignite/ml/selection/cv/AbstractCrossValidation.java b/modules/ml/src/main/java/org/apache/ignite/ml/selection/cv/AbstractCrossValidation.java
index 911be41..518bcef 100644
--- a/modules/ml/src/main/java/org/apache/ignite/ml/selection/cv/AbstractCrossValidation.java
+++ b/modules/ml/src/main/java/org/apache/ignite/ml/selection/cv/AbstractCrossValidation.java
@@ -17,18 +17,35 @@
 
 package org.apache.ignite.ml.selection.cv;
 
+import java.io.Serializable;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.Random;
+import java.util.function.BiFunction;
+import java.util.function.Function;
+import java.util.stream.Collectors;
 import org.apache.ignite.lang.IgniteBiPredicate;
 import org.apache.ignite.ml.IgniteModel;
 import org.apache.ignite.ml.dataset.DatasetBuilder;
 import org.apache.ignite.ml.environment.LearningEnvironment;
 import org.apache.ignite.ml.environment.LearningEnvironmentBuilder;
 import org.apache.ignite.ml.environment.parallelism.Promise;
+import org.apache.ignite.ml.math.functions.IgniteDoubleConsumer;
 import org.apache.ignite.ml.math.functions.IgniteSupplier;
 import org.apache.ignite.ml.math.primitives.vector.Vector;
 import org.apache.ignite.ml.pipeline.Pipeline;
 import org.apache.ignite.ml.pipeline.PipelineMdl;
 import org.apache.ignite.ml.preprocessing.Preprocessor;
-import org.apache.ignite.ml.selection.paramgrid.*;
+import org.apache.ignite.ml.selection.paramgrid.BruteForceStrategy;
+import org.apache.ignite.ml.selection.paramgrid.EvolutionOptimizationStrategy;
+import org.apache.ignite.ml.selection.paramgrid.HyperParameterTuningStrategy;
+import org.apache.ignite.ml.selection.paramgrid.ParamGrid;
+import org.apache.ignite.ml.selection.paramgrid.ParameterSetGenerator;
+import org.apache.ignite.ml.selection.paramgrid.RandomStrategy;
 import org.apache.ignite.ml.selection.scoring.evaluator.Evaluator;
 import org.apache.ignite.ml.selection.scoring.metric.Metric;
 import org.apache.ignite.ml.selection.scoring.metric.MetricName;
@@ -39,12 +56,6 @@
 import org.apache.ignite.ml.util.genetic.GeneticAlgorithm;
 import org.jetbrains.annotations.NotNull;
 
-import java.util.*;
-import java.util.function.BiFunction;
-import java.util.function.DoubleConsumer;
-import java.util.function.Function;
-import java.util.stream.Collectors;
-
 /**
  * Cross validation score calculator. Cross validation is an approach that allows to avoid overfitting that is made the
  * following way: the training set is split into k smaller sets. The following procedure is followed for each of the k
@@ -59,7 +70,7 @@
  * @param <K> Type of a key in {@code upstream} data.
  * @param <V> Type of a value in {@code upstream} data.
  */
-public abstract class AbstractCrossValidation<M extends IgniteModel<Vector, Double>, K, V> {
+public abstract class AbstractCrossValidation<M extends IgniteModel<Vector, Double>, K, V> implements Serializable {
     /** Learning environment builder. */
     protected LearningEnvironmentBuilder envBuilder = LearningEnvironmentBuilder.defaultBuilder();
 
@@ -300,7 +311,7 @@
         Map<String, Double> paramMap = new HashMap<>();
 
         for (int paramIdx = 0; paramIdx < paramSet.length; paramIdx++) {
-            DoubleConsumer setter = paramGrid.getSetterByIndex(paramIdx);
+            IgniteDoubleConsumer setter = paramGrid.getSetterByIndex(paramIdx);
 
             Double paramVal = paramSet[paramIdx];
             setter.accept(paramVal);
@@ -330,10 +341,10 @@
                 return pnt < from || pnt > to;
             };
 
-            IgniteBiPredicate<K, V> testSetFilter = (k, v) -> !trainSetFilter.apply(k,v);
+            IgniteBiPredicate<K, V> testSetFilter = (k, v) -> !trainSetFilter.apply(k, v);
 
             DatasetBuilder<K, V> trainSet = datasetBuilderSupplier.apply(trainSetFilter);
-            M mdl = trainer.fit(trainSet, preprocessor); //TODO: IGNITE-11580
+            M mdl = trainer.fit(trainSet, preprocessor);
 
             DatasetBuilder<K, V> testSet = datasetBuilderSupplier.apply(testSetFilter);
             scores[i] = Evaluator.evaluate(testSet, mdl, preprocessor, metric).getSingle();
@@ -361,13 +372,13 @@
                 return pnt < from || pnt > to;
             };
 
-            IgniteBiPredicate<K, V> testSetFilter = (k, v) -> !trainSetFilter.apply(k,v);
+            IgniteBiPredicate<K, V> testSetFilter = (k, v) -> !trainSetFilter.apply(k, v);
 
-            DatasetBuilder<K, V> datasetBuilder = datasetBuilderSupplier.apply(trainSetFilter);
-            PipelineMdl<K, V> mdl = pipeline.fit(datasetBuilder);
+            DatasetBuilder<K, V> trainSet = datasetBuilderSupplier.apply(trainSetFilter);
+            PipelineMdl<K, V> mdl = pipeline.fit(trainSet);
 
             DatasetBuilder<K, V> testSet = datasetBuilderSupplier.apply(testSetFilter);
-            scores[i] = Evaluator.evaluate(testSet, mdl, preprocessor, metric).getSingle();
+            scores[i] = Evaluator.evaluate(testSet, mdl, pipeline.getFinalPreprocessor(), metric).getSingle();
         }
 
         return scores;
diff --git a/modules/ml/src/main/java/org/apache/ignite/ml/selection/cv/CrossValidationResult.java b/modules/ml/src/main/java/org/apache/ignite/ml/selection/cv/CrossValidationResult.java
index f7ddae3..ad50cc5 100644
--- a/modules/ml/src/main/java/org/apache/ignite/ml/selection/cv/CrossValidationResult.java
+++ b/modules/ml/src/main/java/org/apache/ignite/ml/selection/cv/CrossValidationResult.java
@@ -17,6 +17,7 @@
 
 package org.apache.ignite.ml.selection.cv;
 
+import java.io.Serializable;
 import java.util.Arrays;
 import java.util.Collections;
 import java.util.HashMap;
@@ -26,7 +27,7 @@
  * Represents the cross validation procedure result,
  * wraps score and values of hyper parameters associated with these values.
  */
-public class CrossValidationResult {
+public class CrossValidationResult implements Serializable {
     /** Best hyper params. */
     private Map<String, Double> bestHyperParams;
 
diff --git a/modules/ml/src/main/java/org/apache/ignite/ml/selection/paramgrid/ParamGrid.java b/modules/ml/src/main/java/org/apache/ignite/ml/selection/paramgrid/ParamGrid.java
index 11878a1..054ed90 100644
--- a/modules/ml/src/main/java/org/apache/ignite/ml/selection/paramgrid/ParamGrid.java
+++ b/modules/ml/src/main/java/org/apache/ignite/ml/selection/paramgrid/ParamGrid.java
@@ -17,22 +17,23 @@
 
 package org.apache.ignite.ml.selection.paramgrid;
 
+import java.io.Serializable;
 import java.util.ArrayList;
 import java.util.Collections;
 import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
-import java.util.function.DoubleConsumer;
+import org.apache.ignite.ml.math.functions.IgniteDoubleConsumer;
 
 /**
  * Keeps the grid of parameters.
  */
-public class ParamGrid {
+public class ParamGrid implements Serializable {
     /** Parameter values by parameter index. */
     private Map<Integer, Double[]> paramValuesByParamIdx = new HashMap<>();
 
     /** Parameter names by parameter index. */
-    private Map<Integer, DoubleConsumer> settersByParamIdx = new HashMap<>();
+    private Map<Integer, IgniteDoubleConsumer> settersByParamIdx = new HashMap<>();
 
     /** Parameter names by parameter index. */
     private Map<Integer, String> paramNamesByParamIdx = new HashMap<>();
@@ -55,7 +56,7 @@
      * @param params The array of the given hyper parameter values.
      * @return The updated ParamGrid.
      */
-    public ParamGrid addHyperParam(String paramName, DoubleConsumer setter, Double[] params) {
+    public ParamGrid addHyperParam(String paramName, IgniteDoubleConsumer setter, Double[] params) {
         paramValuesByParamIdx.put(paramCntr, params);
         paramNamesByParamIdx.put(paramCntr, paramName);
         settersByParamIdx.put(paramCntr, setter);
@@ -80,7 +81,7 @@
     }
 
     /** Returns setter for parameter with the given index. */
-    public DoubleConsumer getSetterByIndex(int idx) {
+    public IgniteDoubleConsumer getSetterByIndex(int idx) {
         return settersByParamIdx.get(idx);
     }
 
diff --git a/modules/ml/src/main/resources/datasets/titanic.csv b/modules/ml/src/main/resources/datasets/titanic.csv
deleted file mode 100644
index ed25e85..0000000
--- a/modules/ml/src/main/resources/datasets/titanic.csv
+++ /dev/null
@@ -1,1310 +0,0 @@
-﻿pclass;survived;name;sex;age;sibsp;parch;ticket;fare;cabin;embarked;boat;body;homedest
-1;1;Allen                                                                             ,Miss. Elisabeth Walton;;29;;;24160;211                               ,3375;B5;;2;;St Louis       ,MO
-1;1;Allison                                                                           ,Master. Hudson Trevor;male;0                                         ,9167;1;2;113781;151        ,55;C22 C26;AA;11;;Montreal,PQ / Chesterville,ON
-1;0;Allison                                                                           ,Miss. Helen Loraine;female;2;1;2;113781;151                          ,55;C22 C26;S;;;Montreal    ,PQ / Chesterville         ,ON
-1;0;Allison                                                                           ,Mr. Hudson Joshua Creighton;male;30;1;2;113781;151                   ,55;C22 C26;S;;135;Montreal ,PQ / Chesterville         ,ON
-1;0;Allison                                                                           ,Mrs. Hudson J C (Bessie Waldo Daniels);female;25;1;2;113781;151      ,55;C22 C26;S;;;Montreal    ,PQ / Chesterville         ,ON
-1;1;Anderson                                                                          ,Mr. Harry;male;48;0;0;19952;26                                       ,55;E12;S;3;;New York       ,NY
-1;1;Andrews                                                                           ,Miss. Kornelia Theodosia;female;63;1;0;13502;77                      ,9583;D7;S;10;;Hudson       ,NY
-1;0;Andrews                                                                           ,Mr. Thomas Jr;male;39;0;0;112050;0;A36;S;;;Belfast                   ,NI
-1;1;Appleton                                                                          ,Mrs. Edward Dale (Charlotte Lamson);female;53;2;0;11769;51           ,4792;C101;S;D;;Bayside     ,Queens                    ,NY
-1;0;Artagaveytia                                                                      ,Mr. Ramon;male;71;0;0;PC 17609;49                                    ,5042;;C;;22;Montevideo     ,Uruguay
-1;0;Astor                                                                             ,Col. John Jacob;male;47;1;0;PC 17757;227                             ,525;C62 C64;C;;124;New York,NY
-1;1;Astor                                                                             ,Mrs. John Jacob (Madeleine Talmadge Force);female;18;1;0;PC 17757;227,525;C62 C64;C;4;;New York  ,NY
-1;1;Aubart                                                                            ,Mme. Leontine Pauline;female;24;0;0;PC 17477;69                      ,3;B35;C;9;;Paris           ,France
-1;1;"Barber, Miss. Ellen ""Nellie""";female;26;0;0;19877;78,85;;S;6;;
-1;1;Barkworth, Mr. Algernon Henry Wilson;male;80;0;0;27042;30;A23;S;B;;Hessle, Yorks
-1;0;Baumann, Mr. John D;male;;0;0;PC 17318;25,925;;S;;;New York, NY
-1;0;Baxter, Mr. Quigg Edmond;male;24;0;1;PC 17558;247,5208;B58 B60;C;;;Montreal, PQ
-1;1;Baxter, Mrs. James (Helene DeLaudeniere Chaput);female;50;0;1;PC 17558;247,5208;B58 B60;C;6;;Montreal, PQ
-1;1;Bazzani, Miss. Albina;female;32;0;0;11813;76,2917;D15;C;8;;
-1;0;Beattie, Mr. Thomson;male;36;0;0;13050;75,2417;C6;C;A;;Winnipeg, MN
-1;1;Beckwith, Mr. Richard Leonard;male;37;1;1;11751;52,5542;D35;S;5;;New York, NY
-1;1;Beckwith, Mrs. Richard Leonard (Sallie Monypeny);female;47;1;1;11751;52,5542;D35;S;5;;New York, NY
-1;1;Behr, Mr. Karl Howell;male;26;0;0;111369;30;C148;C;5;;New York, NY
-1;1;Bidois, Miss. Rosalie;female;42;0;0;PC 17757;227,525;;C;4;;
-1;1;Bird, Miss. Ellen;female;29;0;0;PC 17483;221,7792;C97;S;8;;
-1;0;Birnbaum, Mr. Jakob;male;25;0;0;13905;26;;C;;148;San Francisco, CA
-1;1;Bishop, Mr. Dickinson H;male;25;1;0;11967;91,0792;B49;C;7;;Dowagiac, MI
-1;1;Bishop, Mrs. Dickinson H (Helen Walton);female;19;1;0;11967;91,0792;B49;C;7;;Dowagiac, MI
-1;1;Bissette, Miss. Amelia;female;35;0;0;PC 17760;135,6333;C99;S;8;;
-1;1;Bjornstrom-Steffansson, Mr. Mauritz Hakan;male;28;0;0;110564;26,55;C52;S;D;;Stockholm, Sweden / Washington, DC
-1;0;Blackwell, Mr. Stephen Weart;male;45;0;0;113784;35,5;T;S;;;Trenton, NJ
-1;1;Blank, Mr. Henry;male;40;0;0;112277;31;A31;C;7;;Glen Ridge, NJ
-1;1;Bonnell, Miss. Caroline;female;30;0;0;36928;164,8667;C7;S;8;;Youngstown, OH
-1;1;Bonnell, Miss. Elizabeth;female;58;0;0;113783;26,55;C103;S;8;;Birkdale, England Cleveland, Ohio
-1;0;Borebank, Mr. John James;male;42;0;0;110489;26,55;D22;S;;;London / Winnipeg, MB
-1;1;Bowen, Miss. Grace Scott;female;45;0;0;PC 17608;262,375;;C;4;;Cooperstown, NY
-1;1;Bowerman, Miss. Elsie Edith;female;22;0;1;113505;55;E33;S;6;;St Leonards-on-Sea, England Ohio
-1;1;"Bradley, Mr. George (""George Arthur Brayton"")";male;;0;0;111427;26,55;;S;9;;Los Angeles, CA
-1;0;Brady, Mr. John Bertram;male;41;0;0;113054;30,5;A21;S;;;Pomeroy, WA
-1;0;Brandeis, Mr. Emil;male;48;0;0;PC 17591;50,4958;B10;C;;208;Omaha, NE
-1;0;Brewe, Dr. Arthur Jackson;male;;0;0;112379;39,6;;C;;;Philadelphia, PA
-1;1;Brown, Mrs. James Joseph (Margaret Tobin);female;44;0;0;PC 17610;27,7208;B4;C;6;;Denver, CO
-1;1;Brown, Mrs. John Murray (Caroline Lane Lamson);female;59;2;0;11769;51,4792;C101;S;D;;Belmont, MA
-1;1;Bucknell, Mrs. William Robert (Emma Eliza Ward);female;60;0;0;11813;76,2917;D15;C;8;;Philadelphia, PA
-1;1;Burns, Miss. Elizabeth Margaret;female;41;0;0;16966;134,5;E40;C;3;;
-1;0;Butt, Major. Archibald Willingham;male;45;0;0;113050;26,55;B38;S;;;Washington, DC
-1;0;Cairns, Mr. Alexander;male;;0;0;113798;31;;S;;;
-1;1;Calderhead, Mr. Edward Pennington;male;42;0;0;PC 17476;26,2875;E24;S;5;;New York, NY
-1;1;Candee, Mrs. Edward (Helen Churchill Hungerford);female;53;0;0;PC 17606;27,4458;;C;6;;Washington, DC
-1;1;Cardeza, Mr. Thomas Drake Martinez;male;36;0;1;PC 17755;512,3292;B51 B53 B55;C;3;;Austria-Hungary / Germantown, Philadelphia, PA
-1;1;Cardeza, Mrs. James Warburton Martinez (Charlotte Wardle Drake);female;58;0;1;PC 17755;512,3292;B51 B53 B55;C;3;;Germantown, Philadelphia, PA
-1;0;Carlsson, Mr. Frans Olof;male;33;0;0;695;5;B51 B53 B55;S;;;New York, NY
-1;0;Carrau, Mr. Francisco M;male;28;0;0;113059;47,1;;S;;;Montevideo, Uruguay
-1;0;Carrau, Mr. Jose Pedro;male;17;0;0;113059;47,1;;S;;;Montevideo, Uruguay
-1;1;Carter, Master. William Thornton II;male;11;1;2;113760;120;B96 B98;S;4;;Bryn Mawr, PA
-1;1;Carter, Miss. Lucile Polk;female;14;1;2;113760;120;B96 B98;S;4;;Bryn Mawr, PA
-1;1;Carter, Mr. William Ernest;male;36;1;2;113760;120;B96 B98;S;C;;Bryn Mawr, PA
-1;1;Carter, Mrs. William Ernest (Lucile Polk);female;36;1;2;113760;120;B96 B98;S;4;;Bryn Mawr, PA
-1;0;Case, Mr. Howard Brown;male;49;0;0;19924;26;;S;;;Ascot, Berkshire / Rochester, NY
-1;1;Cassebeer, Mrs. Henry Arthur Jr (Eleanor Genevieve Fosdick);female;;0;0;17770;27,7208;;C;5;;New York, NY
-1;0;Cavendish, Mr. Tyrell William;male;36;1;0;19877;78,85;C46;S;;172;Little Onn Hall, Staffs
-1;1;Cavendish, Mrs. Tyrell William (Julia Florence Siegel);female;76;1;0;19877;78,85;C46;S;6;;Little Onn Hall, Staffs
-1;0;Chaffee, Mr. Herbert Fuller;male;46;1;0;W.E.P. 5734;61,175;E31;S;;;Amenia, ND
-1;1;Chaffee, Mrs. Herbert Fuller (Carrie Constance Toogood);female;47;1;0;W.E.P. 5734;61,175;E31;S;4;;Amenia, ND
-1;1;Chambers, Mr. Norman Campbell;male;27;1;0;113806;53,1;E8;S;5;;New York, NY / Ithaca, NY
-1;1;Chambers, Mrs. Norman Campbell (Bertha Griggs);female;33;1;0;113806;53,1;E8;S;5;;New York, NY / Ithaca, NY
-1;1;Chaudanson, Miss. Victorine;female;36;0;0;PC 17608;262,375;B61;C;4;;
-1;1;Cherry, Miss. Gladys;female;30;0;0;110152;86,5;B77;S;8;;London, England
-1;1;Chevre, Mr. Paul Romaine;male;45;0;0;PC 17594;29,7;A9;C;7;;Paris, France
-1;1;Chibnall, Mrs. (Edith Martha Bowerman);female;;0;1;113505;55;E33;S;6;;St Leonards-on-Sea, England Ohio
-1;0;Chisholm, Mr. Roderick Robert Crispin;male;;0;0;112051;0;;S;;;Liverpool, England / Belfast
-1;0;Clark, Mr. Walter Miller;male;27;1;0;13508;136,7792;C89;C;;;Los Angeles, CA
-1;1;Clark, Mrs. Walter Miller (Virginia McDowell);female;26;1;0;13508;136,7792;C89;C;4;;Los Angeles, CA
-1;1;Cleaver, Miss. Alice;female;22;0;0;113781;151,55;;S;11;;
-1;0;Clifford, Mr. George Quincy;male;;0;0;110465;52;A14;S;;;Stoughton, MA
-1;0;Colley, Mr. Edward Pomeroy;male;47;0;0;5727;25,5875;E58;S;;;Victoria, BC
-1;1;Compton, Miss. Sara Rebecca;female;39;1;1;PC 17756;83,1583;E49;C;14;;Lakewood, NJ
-1;0;Compton, Mr. Alexander Taylor Jr;male;37;1;1;PC 17756;83,1583;E52;C;;;Lakewood, NJ
-1;1;Compton, Mrs. Alexander Taylor (Mary Eliza Ingersoll);female;64;0;2;PC 17756;83,1583;E45;C;14;;Lakewood, NJ
-1;1;Cornell, Mrs. Robert Clifford (Malvina Helen Lamson);female;55;2;0;11770;25,7;C101;S;2;;New York, NY
-1;0;Crafton, Mr. John Bertram;male;;0;0;113791;26,55;;S;;;Roachdale, IN
-1;0;Crosby, Capt. Edward Gifford;male;70;1;1;WE/P 5735;71;B22;S;;269;Milwaukee, WI
-1;1;Crosby, Miss. Harriet R;female;36;0;2;WE/P 5735;71;B22;S;7;;Milwaukee, WI
-1;1;Crosby, Mrs. Edward Gifford (Catherine Elizabeth Halstead);female;64;1;1;112901;26,55;B26;S;7;;Milwaukee, WI
-1;0;Cumings, Mr. John Bradley;male;39;1;0;PC 17599;71,2833;C85;C;;;New York, NY
-1;1;Cumings, Mrs. John Bradley (Florence Briggs Thayer);female;38;1;0;PC 17599;71,2833;C85;C;4;;New York, NY
-1;1;Daly, Mr. Peter Denis ;male;51;0;0;113055;26,55;E17;S;5 9;;Lima, Peru
-1;1;Daniel, Mr. Robert Williams;male;27;0;0;113804;30,5;;S;3;;Philadelphia, PA
-1;1;Daniels, Miss. Sarah;female;33;0;0;113781;151,55;;S;8;;
-1;0;Davidson, Mr. Thornton;male;31;1;0;F.C. 12750;52;B71;S;;;Montreal, PQ
-1;1;Davidson, Mrs. Thornton (Orian Hays);female;27;1;2;F.C. 12750;52;B71;S;3;;Montreal, PQ
-1;1;Dick, Mr. Albert Adrian;male;31;1;0;17474;57;B20;S;3;;Calgary, AB
-1;1;Dick, Mrs. Albert Adrian (Vera Gillespie);female;17;1;0;17474;57;B20;S;3;;Calgary, AB
-1;1;Dodge, Dr. Washington;male;53;1;1;33638;81,8583;A34;S;13;;San Francisco, CA
-1;1;Dodge, Master. Washington;male;4;0;2;33638;81,8583;A34;S;5;;San Francisco, CA
-1;1;Dodge, Mrs. Washington (Ruth Vidaver);female;54;1;1;33638;81,8583;A34;S;5;;San Francisco, CA
-1;0;Douglas, Mr. Walter Donald;male;50;1;0;PC 17761;106,425;C86;C;;62;Deephaven, MN / Cedar Rapids, IA
-1;1;Douglas, Mrs. Frederick Charles (Mary Helene Baxter);female;27;1;1;PC 17558;247,5208;B58 B60;C;6;;Montreal, PQ
-1;1;Douglas, Mrs. Walter Donald (Mahala Dutton);female;48;1;0;PC 17761;106,425;C86;C;2;;Deephaven, MN / Cedar Rapids, IA
-1;1;"Duff Gordon, Lady. (Lucille Christiana Sutherland) (""Mrs Morgan"")";female;48;1;0;11755;39,6;A16;C;1;;London / Paris
-1;1;"Duff Gordon, Sir. Cosmo Edmund (""Mr Morgan"")";male;49;1;0;PC 17485;56,9292;A20;C;1;;London / Paris
-1;0;Dulles, Mr. William Crothers;male;39;0;0;PC 17580;29,7;A18;C;;133;Philadelphia, PA
-1;1;Earnshaw, Mrs. Boulton (Olive Potter);female;23;0;1;11767;83,1583;C54;C;7;;Mt Airy, Philadelphia, PA
-1;1;Endres, Miss. Caroline Louise;female;38;0;0;PC 17757;227,525;C45;C;4;;New York, NY
-1;1;Eustis, Miss. Elizabeth Mussey;female;54;1;0;36947;78,2667;D20;C;4;;Brookline, MA
-1;0;Evans, Miss. Edith Corse;female;36;0;0;PC 17531;31,6792;A29;C;;;New York, NY
-1;0;Farthing, Mr. John;male;;0;0;PC 17483;221,7792;C95;S;;;
-1;1;Flegenheim, Mrs. Alfred (Antoinette);female;;0;0;PC 17598;31,6833;;S;7;;New York, NY
-1;1;Fleming, Miss. Margaret;female;;0;0;17421;110,8833;;C;4;;
-1;1;"Flynn, Mr. John Irwin (""Irving"")";male;36;0;0;PC 17474;26,3875;E25;S;5;;Brooklyn, NY
-1;0;Foreman, Mr. Benjamin Laventall;male;30;0;0;113051;27,75;C111;C;;;New York, NY
-1;1;Fortune, Miss. Alice Elizabeth;female;24;3;2;19950;263;C23 C25 C27;S;10;;Winnipeg, MB
-1;1;Fortune, Miss. Ethel Flora;female;28;3;2;19950;263;C23 C25 C27;S;10;;Winnipeg, MB
-1;1;Fortune, Miss. Mabel Helen;female;23;3;2;19950;263;C23 C25 C27;S;10;;Winnipeg, MB
-1;0;Fortune, Mr. Charles Alexander;male;19;3;2;19950;263;C23 C25 C27;S;;;Winnipeg, MB
-1;0;Fortune, Mr. Mark;male;64;1;4;19950;263;C23 C25 C27;S;;;Winnipeg, MB
-1;1;Fortune, Mrs. Mark (Mary McDougald);female;60;1;4;19950;263;C23 C25 C27;S;10;;Winnipeg, MB
-1;1;Francatelli, Miss. Laura Mabel;female;30;0;0;PC 17485;56,9292;E36;C;1;;
-1;0;Franklin, Mr. Thomas Parham;male;;0;0;113778;26,55;D34;S;;;Westcliff-on-Sea, Essex
-1;1;Frauenthal, Dr. Henry William;male;50;2;0;PC 17611;133,65;;S;5;;New York, NY
-1;1;Frauenthal, Mr. Isaac Gerald;male;43;1;0;17765;27,7208;D40;C;5;;New York, NY
-1;1;Frauenthal, Mrs. Henry William (Clara Heinsheimer);female;;1;0;PC 17611;133,65;;S;5;;New York, NY
-1;1;Frolicher, Miss. Hedwig Margaritha;female;22;0;2;13568;49,5;B39;C;5;;Zurich, Switzerland
-1;1;Frolicher-Stehli, Mr. Maxmillian;male;60;1;1;13567;79,2;B41;C;5;;Zurich, Switzerland
-1;1;Frolicher-Stehli, Mrs. Maxmillian (Margaretha Emerentia Stehli);female;48;1;1;13567;79,2;B41;C;5;;Zurich, Switzerland
-1;0;Fry, Mr. Richard;male;;0;0;112058;0;B102;S;;;
-1;0;Futrelle, Mr. Jacques Heath;male;37;1;0;113803;53,1;C123;S;;;Scituate, MA
-1;1;Futrelle, Mrs. Jacques Heath (Lily May Peel);female;35;1;0;113803;53,1;C123;S;D;;Scituate, MA
-1;0;Gee, Mr. Arthur H;male;47;0;0;111320;38,5;E63;S;;275;St Anne's-on-Sea, Lancashire
-1;1;Geiger, Miss. Amalie;female;35;0;0;113503;211,5;C130;C;4;;
-1;1;Gibson, Miss. Dorothy Winifred;female;22;0;1;112378;59,4;;C;7;;New York, NY
-1;1;Gibson, Mrs. Leonard (Pauline C Boeson);female;45;0;1;112378;59,4;;C;7;;New York, NY
-1;0;Giglio, Mr. Victor;male;24;0;0;PC 17593;79,2;B86;C;;;
-1;1;Goldenberg, Mr. Samuel L;male;49;1;0;17453;89,1042;C92;C;5;;Paris, France / New York, NY
-1;1;Goldenberg, Mrs. Samuel L (Edwiga Grabowska);female;;1;0;17453;89,1042;C92;C;5;;Paris, France / New York, NY
-1;0;Goldschmidt, Mr. George B;male;71;0;0;PC 17754;34,6542;A5;C;;;New York, NY
-1;1;Gracie, Col. Archibald IV;male;53;0;0;113780;28,5;C51;C;B;;Washington, DC
-1;1;Graham, Miss. Margaret Edith;female;19;0;0;112053;30;B42;S;3;;Greenwich, CT
-1;0;Graham, Mr. George Edward;male;38;0;1;PC 17582;153,4625;C91;S;;147;Winnipeg, MB
-1;1;Graham, Mrs. William Thompson (Edith Junkins);female;58;0;1;PC 17582;153,4625;C125;S;3;;Greenwich, CT
-1;1;Greenfield, Mr. William Bertram;male;23;0;1;PC 17759;63,3583;D10 D12;C;7;;New York, NY
-1;1;Greenfield, Mrs. Leo David (Blanche Strouse);female;45;0;1;PC 17759;63,3583;D10 D12;C;7;;New York, NY
-1;0;Guggenheim, Mr. Benjamin;male;46;0;0;PC 17593;79,2;B82 B84;C;;;New York, NY
-1;1;Harder, Mr. George Achilles;male;25;1;0;11765;55,4417;E50;C;5;;Brooklyn, NY
-1;1;Harder, Mrs. George Achilles (Dorothy Annan);female;25;1;0;11765;55,4417;E50;C;5;;Brooklyn, NY
-1;1;Harper, Mr. Henry Sleeper;male;48;1;0;PC 17572;76,7292;D33;C;3;;New York, NY
-1;1;Harper, Mrs. Henry Sleeper (Myna Haxtun);female;49;1;0;PC 17572;76,7292;D33;C;3;;New York, NY
-1;0;Harrington, Mr. Charles H;male;;0;0;113796;42,4;;S;;;
-1;0;Harris, Mr. Henry Birkhardt;male;45;1;0;36973;83,475;C83;S;;;New York, NY
-1;1;Harris, Mrs. Henry Birkhardt (Irene Wallach);female;35;1;0;36973;83,475;C83;S;D;;New York, NY
-1;0;Harrison, Mr. William;male;40;0;0;112059;0;B94;S;;110;
-1;1;Hassab, Mr. Hammad;male;27;0;0;PC 17572;76,7292;D49;C;3;;
-1;1;Hawksford, Mr. Walter James;male;;0;0;16988;30;D45;S;3;;Kingston, Surrey
-1;1;Hays, Miss. Margaret Bechstein;female;24;0;0;11767;83,1583;C54;C;7;;New York, NY
-1;0;Hays, Mr. Charles Melville;male;55;1;1;12749;93,5;B69;S;;307;Montreal, PQ
-1;1;Hays, Mrs. Charles Melville (Clara Jennings Gregg);female;52;1;1;12749;93,5;B69;S;3;;Montreal, PQ
-1;0;Head, Mr. Christopher;male;42;0;0;113038;42,5;B11;S;;;London / Middlesex
-1;0;Hilliard, Mr. Herbert Henry;male;;0;0;17463;51,8625;E46;S;;;Brighton, MA
-1;0;Hipkins, Mr. William Edward;male;55;0;0;680;50;C39;S;;;London / Birmingham
-1;1;Hippach, Miss. Jean Gertrude;female;16;0;1;111361;57,9792;B18;C;4;;Chicago, IL
-1;1;Hippach, Mrs. Louis Albert (Ida Sophia Fischer);female;44;0;1;111361;57,9792;B18;C;4;;Chicago, IL
-1;1;Hogeboom, Mrs. John C (Anna Andrews);female;51;1;0;13502;77,9583;D11;S;10;;Hudson, NY
-1;0;Holverson, Mr. Alexander Oskar;male;42;1;0;113789;52;;S;;38;New York, NY
-1;1;Holverson, Mrs. Alexander Oskar (Mary Aline Towner);female;35;1;0;113789;52;;S;8;;New York, NY
-1;1;"Homer, Mr. Harry (""Mr E Haven"")";male;35;0;0;111426;26,55;;C;15;;Indianapolis, IN
-1;1;Hoyt, Mr. Frederick Maxfield;male;38;1;0;19943;90;C93;S;D;;New York, NY /  Stamford CT
-1;0;Hoyt, Mr. William Fisher;male;;0;0;PC 17600;30,6958;;C;14;;New York, NY
-1;1;Hoyt, Mrs. Frederick Maxfield (Jane Anne Forby);female;35;1;0;19943;90;C93;S;D;;New York, NY /  Stamford CT
-1;1;Icard, Miss. Amelie;female;38;0;0;113572;80;B28;;6;;
-1;0;Isham, Miss. Ann Elizabeth;female;50;0;0;PC 17595;28,7125;C49;C;;;Paris, France New York, NY
-1;1;Ismay, Mr. Joseph Bruce;male;49;0;0;112058;0;B52 B54 B56;S;C;;Liverpool
-1;0;Jones, Mr. Charles Cresson;male;46;0;0;694;26;;S;;80;Bennington, VT
-1;0;Julian, Mr. Henry Forbes;male;50;0;0;113044;26;E60;S;;;London
-1;0;Keeping, Mr. Edwin;male;32,5;0;0;113503;211,5;C132;C;;45;
-1;0;Kent, Mr. Edward Austin;male;58;0;0;11771;29,7;B37;C;;258;Buffalo, NY
-1;0;Kenyon, Mr. Frederick R;male;41;1;0;17464;51,8625;D21;S;;;Southington / Noank, CT
-1;1;Kenyon, Mrs. Frederick R (Marion);female;;1;0;17464;51,8625;D21;S;8;;Southington / Noank, CT
-1;1;Kimball, Mr. Edwin Nelson Jr;male;42;1;0;11753;52,5542;D19;S;5;;Boston, MA
-1;1;Kimball, Mrs. Edwin Nelson Jr (Gertrude Parsons);female;45;1;0;11753;52,5542;D19;S;5;;Boston, MA
-1;0;Klaber, Mr. Herman;male;;0;0;113028;26,55;C124;S;;;Portland, OR
-1;1;Kreuchen, Miss. Emilie;female;39;0;0;24160;211,3375;;S;2;;
-1;1;Leader, Dr. Alice (Farnham);female;49;0;0;17465;25,9292;D17;S;8;;New York, NY
-1;1;LeRoy, Miss. Bertha;female;30;0;0;PC 17761;106,425;;C;2;;
-1;1;Lesurer, Mr. Gustave J;male;35;0;0;PC 17755;512,3292;B101;C;3;;
-1;0;Lewy, Mr. Ervin G;male;;0;0;PC 17612;27,7208;;C;;;Chicago, IL
-1;0;"Lindeberg-Lind, Mr. Erik Gustaf (""Mr Edward Lingrey"")";male;42;0;0;17475;26,55;;S;;;Stockholm, Sweden
-1;1;Lindstrom, Mrs. Carl Johan (Sigrid Posse);female;55;0;0;112377;27,7208;;C;6;;Stockholm, Sweden
-1;1;Lines, Miss. Mary Conover;female;16;0;1;PC 17592;39,4;D28;S;9;;Paris, France
-1;1;Lines, Mrs. Ernest H (Elizabeth Lindsey James);female;51;0;1;PC 17592;39,4;D28;S;9;;Paris, France
-1;0;Long, Mr. Milton Clyde;male;29;0;0;113501;30;D6;S;;126;Springfield, MA
-1;1;Longley, Miss. Gretchen Fiske;female;21;0;0;13502;77,9583;D9;S;10;;Hudson, NY
-1;0;Loring, Mr. Joseph Holland;male;30;0;0;113801;45,5;;S;;;London / New York, NY
-1;1;Lurette, Miss. Elise;female;58;0;0;PC 17569;146,5208;B80;C;;;
-1;1;Madill, Miss. Georgette Alexandra;female;15;0;1;24160;211,3375;B5;S;2;;St Louis, MO
-1;0;Maguire, Mr. John Edward;male;30;0;0;110469;26;C106;S;;;Brockton, MA
-1;1;Maioni, Miss. Roberta;female;16;0;0;110152;86,5;B79;S;8;;
-1;1;Marechal, Mr. Pierre;male;;0;0;11774;29,7;C47;C;7;;Paris, France
-1;0;Marvin, Mr. Daniel Warner;male;19;1;0;113773;53,1;D30;S;;;New York, NY
-1;1;Marvin, Mrs. Daniel Warner (Mary Graham Carmichael Farquarson);female;18;1;0;113773;53,1;D30;S;10;;New York, NY
-1;1;"Mayne, Mlle. Berthe Antonine (""Mrs de Villiers"")";female;24;0;0;PC 17482;49,5042;C90;C;6;;Belgium  Montreal, PQ
-1;0;McCaffry, Mr. Thomas Francis;male;46;0;0;13050;75,2417;C6;C;;292;Vancouver, BC
-1;0;McCarthy, Mr. Timothy J;male;54;0;0;17463;51,8625;E46;S;;175;Dorchester, MA
-1;1;McGough, Mr. James Robert;male;36;0;0;PC 17473;26,2875;E25;S;7;;Philadelphia, PA
-1;0;Meyer, Mr. Edgar Joseph;male;28;1;0;PC 17604;82,1708;;C;;;New York, NY
-1;1;Meyer, Mrs. Edgar Joseph (Leila Saks);female;;1;0;PC 17604;82,1708;;C;6;;New York, NY
-1;0;Millet, Mr. Francis Davis;male;65;0;0;13509;26,55;E38;S;;249;East Bridgewater, MA
-1;0;Minahan, Dr. William Edward;male;44;2;0;19928;90;C78;Q;;230;Fond du Lac, WI
-1;1;Minahan, Miss. Daisy E;female;33;1;0;19928;90;C78;Q;14;;Green Bay, WI
-1;1;Minahan, Mrs. William Edward (Lillian E Thorpe);female;37;1;0;19928;90;C78;Q;14;;Fond du Lac, WI
-1;1;Mock, Mr. Philipp Edmund;male;30;1;0;13236;57,75;C78;C;11;;New York, NY
-1;0;Molson, Mr. Harry Markland;male;55;0;0;113787;30,5;C30;S;;;Montreal, PQ
-1;0;Moore, Mr. Clarence Bloomfield;male;47;0;0;113796;42,4;;S;;;Washington, DC
-1;0;Natsch, Mr. Charles H;male;37;0;1;PC 17596;29,7;C118;C;;;Brooklyn, NY
-1;1;Newell, Miss. Madeleine;female;31;1;0;35273;113,275;D36;C;6;;Lexington, MA
-1;1;Newell, Miss. Marjorie;female;23;1;0;35273;113,275;D36;C;6;;Lexington, MA
-1;0;Newell, Mr. Arthur Webster;male;58;0;2;35273;113,275;D48;C;;122;Lexington, MA
-1;1;Newsom, Miss. Helen Monypeny;female;19;0;2;11752;26,2833;D47;S;5;;New York, NY
-1;0;Nicholson, Mr. Arthur Ernest;male;64;0;0;693;26;;S;;263;Isle of Wight, England
-1;1;Oliva y Ocana, Dona. Fermina;female;39;0;0;PC 17758;108,9;C105;C;8;;
-1;1;Omont, Mr. Alfred Fernand;male;;0;0;F.C. 12998;25,7417;;C;7;;Paris, France
-1;1;Ostby, Miss. Helene Ragnhild;female;22;0;1;113509;61,9792;B36;C;5;;Providence, RI
-1;0;Ostby, Mr. Engelhart Cornelius;male;65;0;1;113509;61,9792;B30;C;;234;Providence, RI
-1;0;Ovies y Rodriguez, Mr. Servando;male;28,5;0;0;PC 17562;27,7208;D43;C;;189;?Havana, Cuba
-1;0;Parr, Mr. William Henry Marsh;male;;0;0;112052;0;;S;;;Belfast
-1;0;Partner, Mr. Austen;male;45,5;0;0;113043;28,5;C124;S;;166;Surbiton Hill, Surrey
-1;0;Payne, Mr. Vivian Ponsonby;male;23;0;0;12749;93,5;B24;S;;;Montreal, PQ
-1;0;Pears, Mr. Thomas Clinton;male;29;1;0;113776;66,6;C2;S;;;Isleworth, England
-1;1;Pears, Mrs. Thomas (Edith Wearne);female;22;1;0;113776;66,6;C2;S;8;;Isleworth, England
-1;0;Penasco y Castellana, Mr. Victor de Satode;male;18;1;0;PC 17758;108,9;C65;C;;;Madrid, Spain
-1;1;Penasco y Castellana, Mrs. Victor de Satode (Maria Josefa Perez de Soto y Vallejo);female;17;1;0;PC 17758;108,9;C65;C;8;;Madrid, Spain
-1;1;Perreault, Miss. Anne;female;30;0;0;12749;93,5;B73;S;3;;
-1;1;Peuchen, Major. Arthur Godfrey;male;52;0;0;113786;30,5;C104;S;6;;Toronto, ON
-1;0;Porter, Mr. Walter Chamberlain;male;47;0;0;110465;52;C110;S;;207;Worcester, MA
-1;1;Potter, Mrs. Thomas Jr (Lily Alexenia Wilson);female;56;0;1;11767;83,1583;C50;C;7;;Mt Airy, Philadelphia, PA
-1;0;Reuchlin, Jonkheer. John George;male;38;0;0;19972;0;;S;;;Rotterdam, Netherlands
-1;1;Rheims, Mr. George Alexander Lucien;male;;0;0;PC 17607;39,6;;S;A;;Paris /  New York, NY
-1;0;Ringhini, Mr. Sante;male;22;0;0;PC 17760;135,6333;;C;;232;
-1;0;Robbins, Mr. Victor;male;;0;0;PC 17757;227,525;;C;;;
-1;1;Robert, Mrs. Edward Scott (Elisabeth Walton McMillan);female;43;0;1;24160;211,3375;B3;S;2;;St Louis, MO
-1;0;Roebling, Mr. Washington Augustus II;male;31;0;0;PC 17590;50,4958;A24;S;;;Trenton, NJ
-1;1;"Romaine, Mr. Charles Hallace (""Mr C Rolmane"")";male;45;0;0;111428;26,55;;S;9;;New York, NY
-1;0;Rood, Mr. Hugh Roscoe;male;;0;0;113767;50;A32;S;;;Seattle, WA
-1;1;Rosenbaum, Miss. Edith Louise;female;33;0;0;PC 17613;27,7208;A11;C;11;;Paris, France
-1;0;"Rosenshine, Mr. George (""Mr George Thorne"")";male;46;0;0;PC 17585;79,2;;C;;16;New York, NY
-1;0;Ross, Mr. John Hugo;male;36;0;0;13049;40,125;A10;C;;;Winnipeg, MB
-1;1;Rothes, the Countess. of (Lucy Noel Martha Dyer-Edwards);female;33;0;0;110152;86,5;B77;S;8;;London  Vancouver, BC
-1;0;Rothschild, Mr. Martin;male;55;1;0;PC 17603;59,4;;C;;;New York, NY
-1;1;Rothschild, Mrs. Martin (Elizabeth L. Barrett);female;54;1;0;PC 17603;59,4;;C;6;;New York, NY
-1;0;Rowe, Mr. Alfred G;male;33;0;0;113790;26,55;;S;;109;London
-1;1;Ryerson, Master. John Borie;male;13;2;2;PC 17608;262,375;B57 B59 B63 B66;C;4;;Haverford, PA / Cooperstown, NY
-1;1;Ryerson, Miss. Emily Borie;female;18;2;2;PC 17608;262,375;B57 B59 B63 B66;C;4;;Haverford, PA / Cooperstown, NY
-1;1;"Ryerson, Miss. Susan Parker ""Suzette""";female;21;2;2;PC 17608;262,375;B57 B59 B63 B66;C;4;;Haverford, PA / Cooperstown, NY
-1;0;Ryerson, Mr. Arthur Larned;male;61;1;3;PC 17608;262,375;B57 B59 B63 B66;C;;;Haverford, PA / Cooperstown, NY
-1;1;Ryerson, Mrs. Arthur Larned (Emily Maria Borie);female;48;1;3;PC 17608;262,375;B57 B59 B63 B66;C;4;;Haverford, PA / Cooperstown, NY
-1;1;Saalfeld, Mr. Adolphe;male;;0;0;19988;30,5;C106;S;3;;Manchester, England
-1;1;Sagesser, Mlle. Emma;female;24;0;0;PC 17477;69,3;B35;C;9;;
-1;1;Salomon, Mr. Abraham L;male;;0;0;111163;26;;S;1;;New York, NY
-1;1;Schabert, Mrs. Paul (Emma Mock);female;35;1;0;13236;57,75;C28;C;11;;New York, NY
-1;1;Serepeca, Miss. Augusta;female;30;0;0;113798;31;;C;4;;
-1;1;Seward, Mr. Frederic Kimber;male;34;0;0;113794;26,55;;S;7;;New York, NY
-1;1;Shutes, Miss. Elizabeth W;female;40;0;0;PC 17582;153,4625;C125;S;3;;New York, NY / Greenwich CT
-1;1;Silverthorne, Mr. Spencer Victor;male;35;0;0;PC 17475;26,2875;E24;S;5;;St Louis, MO
-1;0;Silvey, Mr. William Baird;male;50;1;0;13507;55,9;E44;S;;;Duluth, MN
-1;1;Silvey, Mrs. William Baird (Alice Munger);female;39;1;0;13507;55,9;E44;S;11;;Duluth, MN
-1;1;Simonius-Blumer, Col. Oberst Alfons;male;56;0;0;13213;35,5;A26;C;3;;Basel, Switzerland
-1;1;Sloper, Mr. William Thompson;male;28;0;0;113788;35,5;A6;S;7;;New Britain, CT
-1;0;Smart, Mr. John Montgomery;male;56;0;0;113792;26,55;;S;;;New York, NY
-1;0;Smith, Mr. James Clinch;male;56;0;0;17764;30,6958;A7;C;;;St James, Long Island, NY
-1;0;Smith, Mr. Lucien Philip;male;24;1;0;13695;60;C31;S;;;Huntington, WV
-1;0;Smith, Mr. Richard William;male;;0;0;113056;26;A19;S;;;Streatham, Surrey
-1;1;Smith, Mrs. Lucien Philip (Mary Eloise Hughes);female;18;1;0;13695;60;C31;S;6;;Huntington, WV
-1;1;Snyder, Mr. John Pillsbury;male;24;1;0;21228;82,2667;B45;S;7;;Minneapolis, MN
-1;1;Snyder, Mrs. John Pillsbury (Nelle Stevenson);female;23;1;0;21228;82,2667;B45;S;7;;Minneapolis, MN
-1;1;Spedden, Master. Robert Douglas;male;6;0;2;16966;134,5;E34;C;3;;Tuxedo Park, NY
-1;1;Spedden, Mr. Frederic Oakley;male;45;1;1;16966;134,5;E34;C;3;;Tuxedo Park, NY
-1;1;Spedden, Mrs. Frederic Oakley (Margaretta Corning Stone);female;40;1;1;16966;134,5;E34;C;3;;Tuxedo Park, NY
-1;0;Spencer, Mr. William Augustus;male;57;1;0;PC 17569;146,5208;B78;C;;;Paris, France
-1;1;Spencer, Mrs. William Augustus (Marie Eugenie);female;;1;0;PC 17569;146,5208;B78;C;6;;Paris, France
-1;1;Stahelin-Maeglin, Dr. Max;male;32;0;0;13214;30,5;B50;C;3;;Basel, Switzerland
-1;0;Stead, Mr. William Thomas;male;62;0;0;113514;26,55;C87;S;;;Wimbledon Park, London / Hayling Island, Hants
-1;1;Stengel, Mr. Charles Emil Henry;male;54;1;0;11778;55,4417;C116;C;1;;Newark, NJ
-1;1;Stengel, Mrs. Charles Emil Henry (Annie May Morris);female;43;1;0;11778;55,4417;C116;C;5;;Newark, NJ
-1;1;Stephenson, Mrs. Walter Bertram (Martha Eustis);female;52;1;0;36947;78,2667;D20;C;4;;Haverford, PA
-1;0;Stewart, Mr. Albert A;male;;0;0;PC 17605;27,7208;;C;;;Gallipolis, Ohio / ? Paris / New York
-1;1;Stone, Mrs. George Nelson (Martha Evelyn);female;62;0;0;113572;80;B28;;6;;Cincinatti, OH
-1;0;Straus, Mr. Isidor;male;67;1;0;PC 17483;221,7792;C55 C57;S;;96;New York, NY
-1;0;Straus, Mrs. Isidor (Rosalie Ida Blun);female;63;1;0;PC 17483;221,7792;C55 C57;S;;;New York, NY
-1;0;Sutton, Mr. Frederick;male;61;0;0;36963;32,3208;D50;S;;46;Haddenfield, NJ
-1;1;Swift, Mrs. Frederick Joel (Margaret Welles Barron);female;48;0;0;17466;25,9292;D17;S;8;;Brooklyn, NY
-1;1;Taussig, Miss. Ruth;female;18;0;2;110413;79,65;E68;S;8;;New York, NY
-1;0;Taussig, Mr. Emil;male;52;1;1;110413;79,65;E67;S;;;New York, NY
-1;1;Taussig, Mrs. Emil (Tillie Mandelbaum);female;39;1;1;110413;79,65;E67;S;8;;New York, NY
-1;1;Taylor, Mr. Elmer Zebley;male;48;1;0;19996;52;C126;S;5 7;;London /  East Orange, NJ
-1;1;Taylor, Mrs. Elmer Zebley (Juliet Cummins Wright);female;;1;0;19996;52;C126;S;5 7;;London /  East Orange, NJ
-1;0;Thayer, Mr. John Borland;male;49;1;1;17421;110,8833;C68;C;;;Haverford, PA
-1;1;Thayer, Mr. John Borland Jr;male;17;0;2;17421;110,8833;C70;C;B;;Haverford, PA
-1;1;Thayer, Mrs. John Borland (Marian Longstreth Morris);female;39;1;1;17421;110,8833;C68;C;4;;Haverford, PA
-1;1;Thorne, Mrs. Gertrude Maybelle;female;;0;0;PC 17585;79,2;;C;D;;New York, NY
-1;1;Tucker, Mr. Gilbert Milligan Jr;male;31;0;0;2543;28,5375;C53;C;7;;Albany, NY
-1;0;Uruchurtu, Don. Manuel E;male;40;0;0;PC 17601;27,7208;;C;;;Mexico City, Mexico
-1;0;Van der hoef, Mr. Wyckoff;male;61;0;0;111240;33,5;B19;S;;245;Brooklyn, NY
-1;0;Walker, Mr. William Anderson;male;47;0;0;36967;34,0208;D46;S;;;East Orange, NJ
-1;1;Ward, Miss. Anna;female;35;0;0;PC 17755;512,3292;;C;3;;
-1;0;Warren, Mr. Frank Manley;male;64;1;0;110813;75,25;D37;C;;;Portland, OR
-1;1;Warren, Mrs. Frank Manley (Anna Sophia Atkinson);female;60;1;0;110813;75,25;D37;C;5;;Portland, OR
-1;0;Weir, Col. John;male;60;0;0;113800;26,55;;S;;;England Salt Lake City, Utah
-1;0;White, Mr. Percival Wayland;male;54;0;1;35281;77,2875;D26;S;;;Brunswick, ME
-1;0;White, Mr. Richard Frasar;male;21;0;1;35281;77,2875;D26;S;;169;Brunswick, ME
-1;1;White, Mrs. John Stuart (Ella Holmes);female;55;0;0;PC 17760;135,6333;C32;C;8;;New York, NY / Briarcliff Manor NY
-1;1;Wick, Miss. Mary Natalie;female;31;0;2;36928;164,8667;C7;S;8;;Youngstown, OH
-1;0;Wick, Mr. George Dennick;male;57;1;1;36928;164,8667;;S;;;Youngstown, OH
-1;1;Wick, Mrs. George Dennick (Mary Hitchcock);female;45;1;1;36928;164,8667;;S;8;;Youngstown, OH
-1;0;Widener, Mr. George Dunton;male;50;1;1;113503;211,5;C80;C;;;Elkins Park, PA
-1;0;Widener, Mr. Harry Elkins;male;27;0;2;113503;211,5;C82;C;;;Elkins Park, PA
-1;1;Widener, Mrs. George Dunton (Eleanor Elkins);female;50;1;1;113503;211,5;C80;C;4;;Elkins Park, PA
-1;1;Willard, Miss. Constance;female;21;0;0;113795;26,55;;S;8 10;;Duluth, MN
-1;0;Williams, Mr. Charles Duane;male;51;0;1;PC 17597;61,3792;;C;;;Geneva, Switzerland / Radnor, PA
-1;1;Williams, Mr. Richard Norris II;male;21;0;1;PC 17597;61,3792;;C;A;;Geneva, Switzerland / Radnor, PA
-1;0;Williams-Lambert, Mr. Fletcher Fellows;male;;0;0;113510;35;C128;S;;;London, England
-1;1;Wilson, Miss. Helen Alice;female;31;0;0;16966;134,5;E39 E41;C;3;;
-1;1;Woolner, Mr. Hugh;male;;0;0;19947;35,5;C52;S;D;;London, England
-1;0;Wright, Mr. George;male;62;0;0;113807;26,55;;S;;;Halifax, NS
-1;1;Young, Miss. Marie Grice;female;36;0;0;PC 17760;135,6333;C32;C;8;;New York, NY / Washington, DC
-2;0;Abelson, Mr. Samuel;male;30;1;0;P/PP 3381;24;;C;;;Russia New York, NY
-2;1;Abelson, Mrs. Samuel (Hannah Wizosky);female;28;1;0;P/PP 3381;24;;C;10;;Russia New York, NY
-2;0;Aldworth, Mr. Charles Augustus;male;30;0;0;248744;13;;S;;;Bryn Mawr, PA, USA
-2;0;Andrew, Mr. Edgardo Samuel;male;18;0;0;231945;11,5;;S;;;Buenos Aires, Argentina / New Jersey, NJ
-2;0;Andrew, Mr. Frank Thomas;male;25;0;0;C.A. 34050;10,5;;S;;;Cornwall, England Houghton, MI
-2;0;Angle, Mr. William A;male;34;1;0;226875;26;;S;;;Warwick, England
-2;1;"Angle, Mrs. William A (Florence ""Mary"" Agnes Hughes)";female;36;1;0;226875;26;;S;11;;Warwick, England
-2;0;Ashby, Mr. John;male;57;0;0;244346;13;;S;;;West Hoboken, NJ
-2;0;Bailey, Mr. Percy Andrew;male;18;0;0;29108;11,5;;S;;;Penzance, Cornwall / Akron, OH
-2;0;Baimbrigge, Mr. Charles Robert;male;23;0;0;C.A. 31030;10,5;;S;;;Guernsey
-2;1;Ball, Mrs. (Ada E Hall);female;36;0;0;28551;13;D;S;10;;Bristol, Avon / Jacksonville, FL
-2;0;Banfield, Mr. Frederick James;male;28;0;0;C.A./SOTON 34068;10,5;;S;;;Plymouth, Dorset / Houghton, MI
-2;0;Bateman, Rev. Robert James;male;51;0;0;S.O.P. 1166;12,525;;S;;174;Jacksonville, FL
-2;1;Beane, Mr. Edward;male;32;1;0;2908;26;;S;13;;Norwich / New York, NY
-2;1;Beane, Mrs. Edward (Ethel Clarke);female;19;1;0;2908;26;;S;13;;Norwich / New York, NY
-2;0;Beauchamp, Mr. Henry James;male;28;0;0;244358;26;;S;;;England
-2;1;Becker, Master. Richard F;male;1;2;1;230136;39;F4;S;11;;Guntur, India / Benton Harbour, MI
-2;1;Becker, Miss. Marion Louise;female;4;2;1;230136;39;F4;S;11;;Guntur, India / Benton Harbour, MI
-2;1;Becker, Miss. Ruth Elizabeth;female;12;2;1;230136;39;F4;S;13;;Guntur, India / Benton Harbour, MI
-2;1;Becker, Mrs. Allen Oliver (Nellie E Baumgardner);female;36;0;3;230136;39;F4;S;11;;Guntur, India / Benton Harbour, MI
-2;1;Beesley, Mr. Lawrence;male;34;0;0;248698;13;D56;S;13;;London
-2;1;Bentham, Miss. Lilian W;female;19;0;0;28404;13;;S;12;;Rochester, NY
-2;0;Berriman, Mr. William John;male;23;0;0;28425;13;;S;;;St Ives, Cornwall / Calumet, MI
-2;0;Botsford, Mr. William Hull;male;26;0;0;237670;13;;S;;;Elmira, NY / Orange, NJ
-2;0;Bowenur, Mr. Solomon;male;42;0;0;211535;13;;S;;;London
-2;0;Bracken, Mr. James H;male;27;0;0;220367;13;;S;;;Lake Arthur, Chavez County, NM
-2;1;"Brown, Miss. Amelia ""Mildred""";female;24;0;0;248733;13;F33;S;11;;London / Montreal, PQ
-2;1;Brown, Miss. Edith Eileen;female;15;0;2;29750;39;;S;14;;Cape Town, South Africa / Seattle, WA
-2;0;Brown, Mr. Thomas William Solomon;male;60;1;1;29750;39;;S;;;Cape Town, South Africa / Seattle, WA
-2;1;Brown, Mrs. Thomas William Solomon (Elizabeth Catherine Ford);female;40;1;1;29750;39;;S;14;;Cape Town, South Africa / Seattle, WA
-2;1;Bryhl, Miss. Dagmar Jenny Ingeborg ;female;20;1;0;236853;26;;S;12;;Skara, Sweden / Rockford, IL
-2;0;Bryhl, Mr. Kurt Arnold Gottfrid;male;25;1;0;236853;26;;S;;;Skara, Sweden / Rockford, IL
-2;1;Buss, Miss. Kate;female;36;0;0;27849;13;;S;9;;Sittingbourne, England / San Diego, CA
-2;0;Butler, Mr. Reginald Fenton;male;25;0;0;234686;13;;S;;97;Southsea, Hants
-2;0;Byles, Rev. Thomas Roussel Davids;male;42;0;0;244310;13;;S;;;London
-2;1;Bystrom, Mrs. (Karolina);female;42;0;0;236852;13;;S;;;New York, NY
-2;1;Caldwell, Master. Alden Gates;male;0,8333;0;2;248738;29;;S;13;;Bangkok, Thailand / Roseville, IL
-2;1;Caldwell, Mr. Albert Francis;male;26;1;1;248738;29;;S;13;;Bangkok, Thailand / Roseville, IL
-2;1;Caldwell, Mrs. Albert Francis (Sylvia Mae Harbaugh);female;22;1;1;248738;29;;S;13;;Bangkok, Thailand / Roseville, IL
-2;1;Cameron, Miss. Clear Annie;female;35;0;0;F.C.C. 13528;21;;S;14;;Mamaroneck, NY
-2;0;Campbell, Mr. William;male;;0;0;239853;0;;S;;;Belfast
-2;0;Carbines, Mr. William;male;19;0;0;28424;13;;S;;18;St Ives, Cornwall / Calumet, MI
-2;0;Carter, Mrs. Ernest Courtenay (Lilian Hughes);female;44;1;0;244252;26;;S;;;London
-2;0;Carter, Rev. Ernest Courtenay;male;54;1;0;244252;26;;S;;;London
-2;0;Chapman, Mr. Charles Henry;male;52;0;0;248731;13,5;;S;;130;Bronx, NY
-2;0;Chapman, Mr. John Henry;male;37;1;0;SC/AH 29037;26;;S;;17;Cornwall / Spokane, WA
-2;0;Chapman, Mrs. John Henry (Sara Elizabeth Lawry);female;29;1;0;SC/AH 29037;26;;S;;;Cornwall / Spokane, WA
-2;1;Christy, Miss. Julie Rachel;female;25;1;1;237789;30;;S;12;;London
-2;1;Christy, Mrs. (Alice Frances);female;45;0;2;237789;30;;S;12;;London
-2;0;Clarke, Mr. Charles Valentine;male;29;1;0;2003;26;;S;;;England / San Francisco, CA
-2;1;Clarke, Mrs. Charles V (Ada Maria Winfield);female;28;1;0;2003;26;;S;14;;England / San Francisco, CA
-2;0;Coleridge, Mr. Reginald Charles;male;29;0;0;W./C. 14263;10,5;;S;;;Hartford, Huntingdonshire
-2;0;Collander, Mr. Erik Gustaf;male;28;0;0;248740;13;;S;;;Helsinki, Finland Ashtabula, Ohio
-2;1;Collett, Mr. Sidney C Stuart;male;24;0;0;28034;10,5;;S;9;;London / Fort Byron, NY
-2;1;"Collyer, Miss. Marjorie ""Lottie""";female;8;0;2;C.A. 31921;26,25;;S;14;;Bishopstoke, Hants / Fayette Valley, ID
-2;0;Collyer, Mr. Harvey;male;31;1;1;C.A. 31921;26,25;;S;;;Bishopstoke, Hants / Fayette Valley, ID
-2;1;Collyer, Mrs. Harvey (Charlotte Annie Tate);female;31;1;1;C.A. 31921;26,25;;S;14;;Bishopstoke, Hants / Fayette Valley, ID
-2;1;Cook, Mrs. (Selena Rogers);female;22;0;0;W./C. 14266;10,5;F33;S;14;;Pennsylvania
-2;0;Corbett, Mrs. Walter H (Irene Colvin);female;30;0;0;237249;13;;S;;;Provo, UT
-2;0;Corey, Mrs. Percy C (Mary Phyllis Elizabeth Miller);female;;0;0;F.C.C. 13534;21;;S;;;Upper Burma, India Pittsburgh, PA
-2;0;"Cotterill, Mr. Henry ""Harry""";male;21;0;0;29107;11,5;;S;;;Penzance, Cornwall / Akron, OH
-2;0;Cunningham, Mr. Alfred Fleming;male;;0;0;239853;0;;S;;;Belfast
-2;1;Davies, Master. John Morgan Jr;male;8;1;1;C.A. 33112;36,75;;S;14;;St Ives, Cornwall / Hancock, MI
-2;0;Davies, Mr. Charles Henry;male;18;0;0;S.O.C. 14879;73,5;;S;;;Lyndhurst, England
-2;1;Davies, Mrs. John Morgan (Elizabeth Agnes Mary White) ;female;48;0;2;C.A. 33112;36,75;;S;14;;St Ives, Cornwall / Hancock, MI
-2;1;Davis, Miss. Mary;female;28;0;0;237668;13;;S;13;;London / Staten Island, NY
-2;0;de Brito, Mr. Jose Joaquim;male;32;0;0;244360;13;;S;;;Portugal / Sau Paulo, Brazil
-2;0;Deacon, Mr. Percy William;male;17;0;0;S.O.C. 14879;73,5;;S;;;
-2;0;del Carlo, Mr. Sebastiano;male;29;1;0;SC/PARIS 2167;27,7208;;C;;295;Lucca, Italy / California
-2;1;del Carlo, Mrs. Sebastiano (Argenia Genovesi);female;24;1;0;SC/PARIS 2167;27,7208;;C;12;;Lucca, Italy / California
-2;0;Denbury, Mr. Herbert;male;25;0;0;C.A. 31029;31,5;;S;;;Guernsey / Elizabeth, NJ
-2;0;Dibden, Mr. William;male;18;0;0;S.O.C. 14879;73,5;;S;;;New Forest, England
-2;1;Doling, Miss. Elsie;female;18;0;1;231919;23;;S;;;Southampton
-2;1;Doling, Mrs. John T (Ada Julia Bone);female;34;0;1;231919;23;;S;;;Southampton
-2;0;Downton, Mr. William James;male;54;0;0;28403;26;;S;;;Holley, NY
-2;1;Drew, Master. Marshall Brines;male;8;0;2;28220;32,5;;S;10;;Greenport, NY
-2;0;Drew, Mr. James Vivian;male;42;1;1;28220;32,5;;S;;;Greenport, NY
-2;1;Drew, Mrs. James Vivian (Lulu Thorne Christian);female;34;1;1;28220;32,5;;S;10;;Greenport, NY
-2;1;Duran y More, Miss. Asuncion;female;27;1;0;SC/PARIS 2149;13,8583;;C;12;;Barcelona, Spain / Havana, Cuba
-2;1;Duran y More, Miss. Florentina;female;30;1;0;SC/PARIS 2148;13,8583;;C;12;;Barcelona, Spain / Havana, Cuba
-2;0;Eitemiller, Mr. George Floyd;male;23;0;0;29751;13;;S;;;England / Detroit, MI
-2;0;Enander, Mr. Ingvar;male;21;0;0;236854;13;;S;;;Goteborg, Sweden / Rockford, IL
-2;0;Fahlstrom, Mr. Arne Jonas;male;18;0;0;236171;13;;S;;;Oslo, Norway Bayonne, NJ
-2;0;Faunthorpe, Mr. Harry;male;40;1;0;2926;26;;S;;286;England / Philadelphia, PA
-2;1;Faunthorpe, Mrs. Lizzie (Elizabeth Anne Wilkinson);female;29;1;0;2926;26;;S;16;;
-2;0;Fillbrook, Mr. Joseph Charles;male;18;0;0;C.A. 15185;10,5;;S;;;Cornwall / Houghton, MI
-2;0;Fox, Mr. Stanley Hubert;male;36;0;0;229236;13;;S;;236;Rochester, NY
-2;0;"Frost, Mr. Anthony Wood ""Archie""";male;;0;0;239854;0;;S;;;Belfast
-2;0;Funk, Miss. Annie Clemmer;female;38;0;0;237671;13;;S;;;Janjgir, India / Pennsylvania
-2;0;Fynney, Mr. Joseph J;male;35;0;0;239865;26;;S;;322;Liverpool / Montreal, PQ
-2;0;Gale, Mr. Harry;male;38;1;0;28664;21;;S;;;Cornwall / Clear Creek, CO
-2;0;Gale, Mr. Shadrach;male;34;1;0;28664;21;;S;;;Cornwall / Clear Creek, CO
-2;1;Garside, Miss. Ethel;female;34;0;0;243880;13;;S;12;;Brooklyn, NY
-2;0;Gaskell, Mr. Alfred;male;16;0;0;239865;26;;S;;;Liverpool / Montreal, PQ
-2;0;Gavey, Mr. Lawrence;male;26;0;0;31028;10,5;;S;;;Guernsey / Elizabeth, NJ
-2;0;Gilbert, Mr. William;male;47;0;0;C.A. 30769;10,5;;S;;;Cornwall
-2;0;Giles, Mr. Edgar;male;21;1;0;28133;11,5;;S;;;Cornwall / Camden, NJ
-2;0;Giles, Mr. Frederick Edward;male;21;1;0;28134;11,5;;S;;;Cornwall / Camden, NJ
-2;0;Giles, Mr. Ralph;male;24;0;0;248726;13,5;;S;;297;West Kensington, London
-2;0;Gill, Mr. John William;male;24;0;0;233866;13;;S;;155;Clevedon, England
-2;0;Gillespie, Mr. William Henry;male;34;0;0;12233;13;;S;;;Vancouver, BC
-2;0;Givard, Mr. Hans Kristensen;male;30;0;0;250646;13;;S;;305;
-2;0;Greenberg, Mr. Samuel;male;52;0;0;250647;13;;S;;19;Bronx, NY
-2;0;Hale, Mr. Reginald;male;30;0;0;250653;13;;S;;75;Auburn, NY
-2;1;Hamalainen, Master. Viljo;male;0,6667;1;1;250649;14,5;;S;4;;Detroit, MI
-2;1;Hamalainen, Mrs. William (Anna);female;24;0;2;250649;14,5;;S;4;;Detroit, MI
-2;0;Harbeck, Mr. William H;male;44;0;0;248746;13;;S;;35;Seattle, WA / Toledo, OH
-2;1;"Harper, Miss. Annie Jessie ""Nina""";female;6;0;1;248727;33;;S;11;;Denmark Hill, Surrey / Chicago
-2;0;Harper, Rev. John;male;28;0;1;248727;33;;S;;;Denmark Hill, Surrey / Chicago
-2;1;Harris, Mr. George;male;62;0;0;S.W./PP 752;10,5;;S;15;;London
-2;0;Harris, Mr. Walter;male;30;0;0;W/C 14208;10,5;;S;;;Walthamstow, England
-2;1;Hart, Miss. Eva Miriam;female;7;0;2;F.C.C. 13529;26,25;;S;14;;Ilford, Essex / Winnipeg, MB
-2;0;Hart, Mr. Benjamin;male;43;1;1;F.C.C. 13529;26,25;;S;;;Ilford, Essex / Winnipeg, MB
-2;1;Hart, Mrs. Benjamin (Esther Ada Bloomfield);female;45;1;1;F.C.C. 13529;26,25;;S;14;;Ilford, Essex / Winnipeg, MB
-2;1;Herman, Miss. Alice;female;24;1;2;220845;65;;S;9;;Somerset / Bernardsville, NJ
-2;1;Herman, Miss. Kate;female;24;1;2;220845;65;;S;9;;Somerset / Bernardsville, NJ
-2;0;Herman, Mr. Samuel;male;49;1;2;220845;65;;S;;;Somerset / Bernardsville, NJ
-2;1;Herman, Mrs. Samuel (Jane Laver);female;48;1;2;220845;65;;S;9;;Somerset / Bernardsville, NJ
-2;1;Hewlett, Mrs. (Mary D Kingcome) ;female;55;0;0;248706;16;;S;13;;India / Rapid City, SD
-2;0;Hickman, Mr. Leonard Mark;male;24;2;0;S.O.C. 14879;73,5;;S;;;West Hampstead, London / Neepawa, MB
-2;0;Hickman, Mr. Lewis;male;32;2;0;S.O.C. 14879;73,5;;S;;256;West Hampstead, London / Neepawa, MB
-2;0;Hickman, Mr. Stanley George;male;21;2;0;S.O.C. 14879;73,5;;S;;;West Hampstead, London / Neepawa, MB
-2;0;Hiltunen, Miss. Marta;female;18;1;1;250650;13;;S;;;Kontiolahti, Finland / Detroit, MI
-2;1;"Hocking, Miss. Ellen ""Nellie""";female;20;2;1;29105;23;;S;4;;Cornwall / Akron, OH
-2;0;Hocking, Mr. Richard George;male;23;2;1;29104;11,5;;S;;;Cornwall / Akron, OH
-2;0;Hocking, Mr. Samuel James Metcalfe;male;36;0;0;242963;13;;S;;;Devonport, England
-2;1;Hocking, Mrs. Elizabeth (Eliza Needs);female;54;1;3;29105;23;;S;4;;Cornwall / Akron, OH
-2;0;Hodges, Mr. Henry Price;male;50;0;0;250643;13;;S;;149;Southampton
-2;0;Hold, Mr. Stephen;male;44;1;0;26707;26;;S;;;England / Sacramento, CA
-2;1;Hold, Mrs. Stephen (Annie Margaret Hill);female;29;1;0;26707;26;;S;10;;England / Sacramento, CA
-2;0;Hood, Mr. Ambrose Jr;male;21;0;0;S.O.C. 14879;73,5;;S;;;New Forest, England
-2;1;Hosono, Mr. Masabumi;male;42;0;0;237798;13;;S;10;;Tokyo, Japan
-2;0;Howard, Mr. Benjamin;male;63;1;0;24065;26;;S;;;Swindon, England
-2;0;Howard, Mrs. Benjamin (Ellen Truelove Arman);female;60;1;0;24065;26;;S;;;Swindon, England
-2;0;Hunt, Mr. George Henry;male;33;0;0;SCO/W 1585;12,275;;S;;;Philadelphia, PA
-2;1;Ilett, Miss. Bertha;female;17;0;0;SO/C 14885;10,5;;S;;;Guernsey
-2;0;Jacobsohn, Mr. Sidney Samuel;male;42;1;0;243847;27;;S;;;London
-2;1;Jacobsohn, Mrs. Sidney Samuel (Amy Frances Christy);female;24;2;1;243847;27;;S;12;;London
-2;0;Jarvis, Mr. John Denzil;male;47;0;0;237565;15;;S;;;North Evington, England
-2;0;Jefferys, Mr. Clifford Thomas;male;24;2;0;C.A. 31029;31,5;;S;;;Guernsey / Elizabeth, NJ
-2;0;Jefferys, Mr. Ernest Wilfred;male;22;2;0;C.A. 31029;31,5;;S;;;Guernsey / Elizabeth, NJ
-2;0;Jenkin, Mr. Stephen Curnow;male;32;0;0;C.A. 33111;10,5;;S;;;St Ives, Cornwall / Houghton, MI
-2;1;Jerwan, Mrs. Amin S (Marie Marthe Thuillard);female;23;0;0;SC/AH Basle 541;13,7917;D;C;11;;New York, NY
-2;0;Kantor, Mr. Sinai;male;34;1;0;244367;26;;S;;283;Moscow / Bronx, NY
-2;1;Kantor, Mrs. Sinai (Miriam Sternin);female;24;1;0;244367;26;;S;12;;Moscow / Bronx, NY
-2;0;Karnes, Mrs. J Frank (Claire Bennett);female;22;0;0;F.C.C. 13534;21;;S;;;India / Pittsburgh, PA
-2;1;Keane, Miss. Nora A;female;;0;0;226593;12,35;E101;Q;10;;Harrisburg, PA
-2;0;Keane, Mr. Daniel;male;35;0;0;233734;12,35;;Q;;;
-2;1;"Kelly, Mrs. Florence ""Fannie""";female;45;0;0;223596;13,5;;S;9;;London / New York, NY
-2;0;Kirkland, Rev. Charles Leonard;male;57;0;0;219533;12,35;;Q;;;Glasgow / Bangor, ME
-2;0;Knight, Mr. Robert J;male;;0;0;239855;0;;S;;;Belfast
-2;0;Kvillner, Mr. Johan Henrik Johannesson;male;31;0;0;C.A. 18723;10,5;;S;;165;Sweden / Arlington, NJ
-2;0;Lahtinen, Mrs. William (Anna Sylfven);female;26;1;1;250651;26;;S;;;Minneapolis, MN
-2;0;Lahtinen, Rev. William;male;30;1;1;250651;26;;S;;;Minneapolis, MN
-2;0;Lamb, Mr. John Joseph;male;;0;0;240261;10,7083;;Q;;;
-2;1;Laroche, Miss. Louise;female;1;1;2;SC/Paris 2123;41,5792;;C;14;;Paris / Haiti
-2;1;Laroche, Miss. Simonne Marie Anne Andree;female;3;1;2;SC/Paris 2123;41,5792;;C;14;;Paris / Haiti
-2;0;Laroche, Mr. Joseph Philippe Lemercier;male;25;1;2;SC/Paris 2123;41,5792;;C;;;Paris / Haiti
-2;1;Laroche, Mrs. Joseph (Juliette Marie Louise Lafargue);female;22;1;2;SC/Paris 2123;41,5792;;C;14;;Paris / Haiti
-2;1;Lehmann, Miss. Bertha;female;17;0;0;SC 1748;12;;C;12;;Berne, Switzerland / Central City, IA
-2;1;Leitch, Miss. Jessie Wills;female;;0;0;248727;33;;S;11;;London / Chicago, IL
-2;1;Lemore, Mrs. (Amelia Milley);female;34;0;0;C.A. 34260;10,5;F33;S;14;;Chicago, IL
-2;0;Levy, Mr. Rene Jacques;male;36;0;0;SC/Paris 2163;12,875;D;C;;;Montreal, PQ
-2;0;Leyson, Mr. Robert William Norman;male;24;0;0;C.A. 29566;10,5;;S;;108;
-2;0;Lingane, Mr. John;male;61;0;0;235509;12,35;;Q;;;
-2;0;Louch, Mr. Charles Alexander;male;50;1;0;SC/AH 3085;26;;S;;121;Weston-Super-Mare, Somerset
-2;1;Louch, Mrs. Charles Alexander (Alice Adelaide Slow);female;42;1;0;SC/AH 3085;26;;S;;;Weston-Super-Mare, Somerset
-2;0;Mack, Mrs. (Mary);female;57;0;0;S.O./P.P. 3;10,5;E77;S;;52;Southampton / New York, NY
-2;0;Malachard, Mr. Noel;male;;0;0;237735;15,0458;D;C;;;Paris
-2;1;Mallet, Master. Andre;male;1;0;2;S.C./PARIS 2079;37,0042;;C;10;;Paris / Montreal, PQ
-2;0;Mallet, Mr. Albert;male;31;1;1;S.C./PARIS 2079;37,0042;;C;;;Paris / Montreal, PQ
-2;1;Mallet, Mrs. Albert (Antoinette Magnin);female;24;1;1;S.C./PARIS 2079;37,0042;;C;10;;Paris / Montreal, PQ
-2;0;Mangiavacchi, Mr. Serafino Emilio;male;;0;0;SC/A.3 2861;15,5792;;C;;;New York, NY
-2;0;Matthews, Mr. William John;male;30;0;0;28228;13;;S;;;St Austall, Cornwall
-2;0;Maybery, Mr. Frank Hubert;male;40;0;0;239059;16;;S;;;Weston-Super-Mare / Moose Jaw, SK
-2;0;McCrae, Mr. Arthur Gordon;male;32;0;0;237216;13,5;;S;;209;Sydney, Australia
-2;0;McCrie, Mr. James Matthew;male;30;0;0;233478;13;;S;;;Sarnia, ON
-2;0;McKane, Mr. Peter David;male;46;0;0;28403;26;;S;;;Rochester, NY
-2;1;Mellinger, Miss. Madeleine Violet;female;13;0;1;250644;19,5;;S;14;;England / Bennington, VT
-2;1;Mellinger, Mrs. (Elizabeth Anne Maidment);female;41;0;1;250644;19,5;;S;14;;England / Bennington, VT
-2;1;Mellors, Mr. William John;male;19;0;0;SW/PP 751;10,5;;S;B;;Chelsea, London
-2;0;Meyer, Mr. August;male;39;0;0;248723;13;;S;;;Harrow-on-the-Hill, Middlesex
-2;0;Milling, Mr. Jacob Christian;male;48;0;0;234360;13;;S;;271;Copenhagen, Denmark
-2;0;Mitchell, Mr. Henry Michael;male;70;0;0;C.A. 24580;10,5;;S;;;Guernsey / Montclair, NJ and/or Toledo, Ohio
-2;0;Montvila, Rev. Juozas;male;27;0;0;211536;13;;S;;;Worcester, MA
-2;0;Moraweck, Dr. Ernest;male;54;0;0;29011;14;;S;;;Frankfort, KY
-2;0;"Morley, Mr. Henry Samuel (""Mr Henry Marshall"")";male;39;0;0;250655;26;;S;;;
-2;0;Mudd, Mr. Thomas Charles;male;16;0;0;S.O./P.P. 3;10,5;;S;;;Halesworth, England
-2;0;Myles, Mr. Thomas Francis;male;62;0;0;240276;9,6875;;Q;;;Cambridge, MA
-2;0;Nasser, Mr. Nicholas;male;32,5;1;0;237736;30,0708;;C;;43;New York, NY
-2;1;Nasser, Mrs. Nicholas (Adele Achem);female;14;1;0;237736;30,0708;;C;;;New York, NY
-2;1;Navratil, Master. Edmond Roger;male;2;1;1;230080;26;F2;S;D;;Nice, France
-2;1;Navratil, Master. Michel M;male;3;1;1;230080;26;F2;S;D;;Nice, France
-2;0;"Navratil, Mr. Michel (""Louis M Hoffman"")";male;36,5;0;2;230080;26;F2;S;;15;Nice, France
-2;0;Nesson, Mr. Israel;male;26;0;0;244368;13;F2;S;;;Boston, MA
-2;0;Nicholls, Mr. Joseph Charles;male;19;1;1;C.A. 33112;36,75;;S;;101;Cornwall / Hancock, MI
-2;0;Norman, Mr. Robert Douglas;male;28;0;0;218629;13,5;;S;;287;Glasgow
-2;1;"Nourney, Mr. Alfred (""Baron von Drachstedt"")";male;20;0;0;SC/PARIS 2166;13,8625;D38;C;7;;Cologne, Germany
-2;1;Nye, Mrs. (Elizabeth Ramell);female;29;0;0;C.A. 29395;10,5;F33;S;11;;Folkstone, Kent / New York, NY
-2;0;Otter, Mr. Richard;male;39;0;0;28213;13;;S;;;Middleburg Heights, OH
-2;1;Oxenham, Mr. Percy Thomas;male;22;0;0;W./C. 14260;10,5;;S;13;;Pondersend, England / New Durham, NJ
-2;1;Padro y Manent, Mr. Julian;male;;0;0;SC/PARIS 2146;13,8625;;C;9;;Spain / Havana, Cuba
-2;0;Pain, Dr. Alfred;male;23;0;0;244278;10,5;;S;;;Hamilton, ON
-2;1;Pallas y Castello, Mr. Emilio;male;29;0;0;SC/PARIS 2147;13,8583;;C;9;;Spain / Havana, Cuba
-2;0;Parker, Mr. Clifford Richard;male;28;0;0;SC 14888;10,5;;S;;;St Andrews, Guernsey
-2;0;"Parkes, Mr. Francis ""Frank""";male;;0;0;239853;0;;S;;;Belfast
-2;1;Parrish, Mrs. (Lutie Davis);female;50;0;1;230433;26;;S;12;;Woodford County, KY
-2;0;Pengelly, Mr. Frederick William;male;19;0;0;28665;10,5;;S;;;Gunnislake, England / Butte, MT
-2;0;Pernot, Mr. Rene;male;;0;0;SC/PARIS 2131;15,05;;C;;;
-2;0;Peruschitz, Rev. Joseph Maria;male;41;0;0;237393;13;;S;;;
-2;1;Phillips, Miss. Alice Frances Louisa;female;21;0;1;S.O./P.P. 2;21;;S;12;;Ilfracombe, Devon
-2;1;"Phillips, Miss. Kate Florence (""Mrs Kate Louise Phillips Marshall"")";female;19;0;0;250655;26;;S;11;;Worcester, England
-2;0;Phillips, Mr. Escott Robert;male;43;0;1;S.O./P.P. 2;21;;S;;;Ilfracombe, Devon
-2;1;Pinsky, Mrs. (Rosa);female;32;0;0;234604;13;;S;9;;Russia
-2;0;Ponesell, Mr. Martin;male;34;0;0;250647;13;;S;;;Denmark / New York, NY
-2;1;Portaluppi, Mr. Emilio Ilario Giuseppe;male;30;0;0;C.A. 34644;12,7375;;C;14;;Milford, NH
-2;0;Pulbaum, Mr. Franz;male;27;0;0;SC/PARIS 2168;15,0333;;C;;;Paris
-2;1;Quick, Miss. Phyllis May;female;2;1;1;26360;26;;S;11;;Plymouth, Devon / Detroit, MI
-2;1;Quick, Miss. Winifred Vera;female;8;1;1;26360;26;;S;11;;Plymouth, Devon / Detroit, MI
-2;1;Quick, Mrs. Frederick Charles (Jane Richards);female;33;0;2;26360;26;;S;11;;Plymouth, Devon / Detroit, MI
-2;0;Reeves, Mr. David;male;36;0;0;C.A. 17248;10,5;;S;;;Brighton, Sussex
-2;0;Renouf, Mr. Peter Henry;male;34;1;0;31027;21;;S;12;;Elizabeth, NJ
-2;1;Renouf, Mrs. Peter Henry (Lillian Jefferys);female;30;3;0;31027;21;;S;;;Elizabeth, NJ
-2;1;Reynaldo, Ms. Encarnacion;female;28;0;0;230434;13;;S;9;;Spain
-2;0;Richard, Mr. Emile;male;23;0;0;SC/PARIS 2133;15,0458;;C;;;Paris / Montreal, PQ
-2;1;Richards, Master. George Sibley;male;0,8333;1;1;29106;18,75;;S;4;;Cornwall / Akron, OH
-2;1;Richards, Master. William Rowe;male;3;1;1;29106;18,75;;S;4;;Cornwall / Akron, OH
-2;1;Richards, Mrs. Sidney (Emily Hocking);female;24;2;3;29106;18,75;;S;4;;Cornwall / Akron, OH
-2;1;Ridsdale, Miss. Lucy;female;50;0;0;W./C. 14258;10,5;;S;13;;London, England / Marietta, Ohio and Milwaukee, WI
-2;0;Rogers, Mr. Reginald Harry;male;19;0;0;28004;10,5;;S;;;
-2;1;Rugg, Miss. Emily;female;21;0;0;C.A. 31026;10,5;;S;12;;Guernsey / Wilmington, DE
-2;0;Schmidt, Mr. August;male;26;0;0;248659;13;;S;;;Newark, NJ
-2;0;Sedgwick, Mr. Charles Frederick Waddington;male;25;0;0;244361;13;;S;;;Liverpool
-2;0;Sharp, Mr. Percival James R;male;27;0;0;244358;26;;S;;;Hornsey, England
-2;1;Shelley, Mrs. William (Imanita Parrish Hall);female;25;0;1;230433;26;;S;12;;Deer Lodge, MT
-2;1;Silven, Miss. Lyyli Karoliina;female;18;0;2;250652;13;;S;16;;Finland / Minneapolis, MN
-2;1;Sincock, Miss. Maude;female;20;0;0;C.A. 33112;36,75;;S;11;;Cornwall / Hancock, MI
-2;1;Sinkkonen, Miss. Anna;female;30;0;0;250648;13;;S;10;;Finland / Washington, DC
-2;0;Sjostedt, Mr. Ernst Adolf;male;59;0;0;237442;13,5;;S;;;Sault St Marie, ON
-2;1;Slayter, Miss. Hilda Mary;female;30;0;0;234818;12,35;;Q;13;;Halifax, NS
-2;0;Slemen, Mr. Richard James;male;35;0;0;28206;10,5;;S;;;Cornwall
-2;1;Smith, Miss. Marion Elsie;female;40;0;0;31418;13;;S;9;;
-2;0;Sobey, Mr. Samuel James Hayden;male;25;0;0;C.A. 29178;13;;S;;;Cornwall / Houghton, MI
-2;0;Stanton, Mr. Samuel Ward;male;41;0;0;237734;15,0458;;C;;;New York, NY
-2;0;Stokes, Mr. Philip Joseph;male;25;0;0;F.C.C. 13540;10,5;;S;;81;Catford, Kent / Detroit, MI
-2;0;Swane, Mr. George;male;18,5;0;0;248734;13;F;S;;294;
-2;0;Sweet, Mr. George Frederick;male;14;0;0;220845;65;;S;;;Somerset / Bernardsville, NJ
-2;1;Toomey, Miss. Ellen;female;50;0;0;F.C.C. 13531;10,5;;S;9;;Indianapolis, IN
-2;0;Troupiansky, Mr. Moses Aaron;male;23;0;0;233639;13;;S;;;
-2;1;Trout, Mrs. William H (Jessie L);female;28;0;0;240929;12,65;;S;;;Columbus, OH
-2;1;"Troutt, Miss. Edwina Celia ""Winnie""";female;27;0;0;34218;10,5;E101;S;16;;Bath, England / Massachusetts
-2;0;Turpin, Mr. William John Robert;male;29;1;0;11668;21;;S;;;Plymouth, England
-2;0;Turpin, Mrs. William John Robert (Dorothy Ann Wonnacott);female;27;1;0;11668;21;;S;;;Plymouth, England
-2;0;Veal, Mr. James;male;40;0;0;28221;13;;S;;;Barre, Co Washington, VT
-2;1;Walcroft, Miss. Nellie;female;31;0;0;F.C.C. 13528;21;;S;14;;Mamaroneck, NY
-2;0;Ware, Mr. John James;male;30;1;0;CA 31352;21;;S;;;Bristol, England / New Britain, CT
-2;0;Ware, Mr. William Jeffery;male;23;1;0;28666;10,5;;S;;;
-2;1;Ware, Mrs. John James (Florence Louise Long);female;31;0;0;CA 31352;21;;S;10;;Bristol, England / New Britain, CT
-2;0;Watson, Mr. Ennis Hastings;male;;0;0;239856;0;;S;;;Belfast
-2;1;Watt, Miss. Bertha J;female;12;0;0;C.A. 33595;15,75;;S;9;;Aberdeen / Portland, OR
-2;1;"Watt, Mrs. James (Elizabeth ""Bessie"" Inglis Milne)";female;40;0;0;C.A. 33595;15,75;;S;9;;Aberdeen / Portland, OR
-2;1;Webber, Miss. Susan;female;32,5;0;0;27267;13;E101;S;12;;England / Hartford, CT
-2;0;Weisz, Mr. Leopold;male;27;1;0;228414;26;;S;;293;Bromsgrove, England / Montreal, PQ
-2;1;Weisz, Mrs. Leopold (Mathilde Francoise Pede);female;29;1;0;228414;26;;S;10;;Bromsgrove, England / Montreal, PQ
-2;1;Wells, Master. Ralph Lester;male;2;1;1;29103;23;;S;14;;Cornwall / Akron, OH
-2;1;Wells, Miss. Joan;female;4;1;1;29103;23;;S;14;;Cornwall / Akron, OH
-2;1;"Wells, Mrs. Arthur Henry (""Addie"" Dart Trevaskis)";female;29;0;2;29103;23;;S;14;;Cornwall / Akron, OH
-2;1;West, Miss. Barbara J;female;0,9167;1;2;C.A. 34651;27,75;;S;10;;Bournmouth, England
-2;1;West, Miss. Constance Mirium;female;5;1;2;C.A. 34651;27,75;;S;10;;Bournmouth, England
-2;0;West, Mr. Edwy Arthur;male;36;1;2;C.A. 34651;27,75;;S;;;Bournmouth, England
-2;1;West, Mrs. Edwy Arthur (Ada Mary Worth);female;33;1;2;C.A. 34651;27,75;;S;10;;Bournmouth, England
-2;0;Wheadon, Mr. Edward H;male;66;0;0;C.A. 24579;10,5;;S;;;Guernsey, England / Edgewood, RI
-2;0;"Wheeler, Mr. Edwin ""Frederick""";male;;0;0;SC/PARIS 2159;12,875;;S;;;
-2;1;Wilhelms, Mr. Charles;male;31;0;0;244270;13;;S;9;;London, England
-2;1;Williams, Mr. Charles Eugene;male;;0;0;244373;13;;S;14;;Harrow, England
-2;1;Wright, Miss. Marion;female;26;0;0;220844;13,5;;S;9;;Yoevil, England / Cottage Grove, OR
-2;0;"Yrois, Miss. Henriette (""Mrs Harbeck"")";female;24;0;0;248747;13;;S;;;Paris
-3;0;Abbing, Mr. Anthony;male;42;0;0;C.A. 5547;7,55;;S;;;
-3;0;Abbott, Master. Eugene Joseph;male;13;0;2;C.A. 2673;20,25;;S;;;East Providence, RI
-3;0;Abbott, Mr. Rossmore Edward;male;16;1;1;C.A. 2673;20,25;;S;;190;East Providence, RI
-3;1;Abbott, Mrs. Stanton (Rosa Hunt);female;35;1;1;C.A. 2673;20,25;;S;A;;East Providence, RI
-3;1;Abelseth, Miss. Karen Marie;female;16;0;0;348125;7,65;;S;16;;Norway Los Angeles, CA
-3;1;Abelseth, Mr. Olaus Jorgensen;male;25;0;0;348122;7,65;F G63;S;A;;Perkins County, SD
-3;1;Abrahamsson, Mr. Abraham August Johannes;male;20;0;0;SOTON/O2 3101284;7,925;;S;15;;Taalintehdas, Finland Hoboken, NJ
-3;1;Abrahim, Mrs. Joseph (Sophie Halaut Easu);female;18;0;0;2657;7,2292;;C;C;;Greensburg, PA
-3;0;Adahl, Mr. Mauritz Nils Martin;male;30;0;0;C 7076;7,25;;S;;72;Asarum, Sweden Brooklyn, NY
-3;0;Adams, Mr. John;male;26;0;0;341826;8,05;;S;;103;Bournemouth, England
-3;0;Ahlin, Mrs. Johan (Johanna Persdotter Larsson);female;40;1;0;7546;9,475;;S;;;Sweden Akeley, MN
-3;1;Aks, Master. Philip Frank;male;0,8333;0;1;392091;9,35;;S;11;;London, England Norfolk, VA
-3;1;Aks, Mrs. Sam (Leah Rosen);female;18;0;1;392091;9,35;;S;13;;London, England Norfolk, VA
-3;1;Albimona, Mr. Nassef Cassem;male;26;0;0;2699;18,7875;;C;15;;Syria Fredericksburg, VA
-3;0;Alexander, Mr. William;male;26;0;0;3474;7,8875;;S;;;England Albion, NY
-3;0;Alhomaki, Mr. Ilmari Rudolf;male;20;0;0;SOTON/O2 3101287;7,925;;S;;;Salo, Finland Astoria, OR
-3;0;Ali, Mr. Ahmed;male;24;0;0;SOTON/O.Q. 3101311;7,05;;S;;;
-3;0;Ali, Mr. William;male;25;0;0;SOTON/O.Q. 3101312;7,05;;S;;79;Argentina
-3;0;Allen, Mr. William Henry;male;35;0;0;373450;8,05;;S;;;Lower Clapton, Middlesex or Erdington, Birmingham
-3;0;Allum, Mr. Owen George;male;18;0;0;2223;8,3;;S;;259;Windsor, England New York, NY
-3;0;Andersen, Mr. Albert Karvin;male;32;0;0;C 4001;22,525;;S;;260;Bergen, Norway
-3;1;Andersen-Jensen, Miss. Carla Christine Nielsine;female;19;1;0;350046;7,8542;;S;16;;
-3;0;Andersson, Master. Sigvard Harald Elias;male;4;4;2;347082;31,275;;S;;;Sweden Winnipeg, MN
-3;0;Andersson, Miss. Ebba Iris Alfrida;female;6;4;2;347082;31,275;;S;;;Sweden Winnipeg, MN
-3;0;Andersson, Miss. Ellis Anna Maria;female;2;4;2;347082;31,275;;S;;;Sweden Winnipeg, MN
-3;1;Andersson, Miss. Erna Alexandra;female;17;4;2;3101281;7,925;;S;D;;Ruotsinphyhtaa, Finland New York, NY
-3;0;Andersson, Miss. Ida Augusta Margareta;female;38;4;2;347091;7,775;;S;;;Vadsbro, Sweden Ministee, MI
-3;0;Andersson, Miss. Ingeborg Constanzia;female;9;4;2;347082;31,275;;S;;;Sweden Winnipeg, MN
-3;0;Andersson, Miss. Sigrid Elisabeth;female;11;4;2;347082;31,275;;S;;;Sweden Winnipeg, MN
-3;0;Andersson, Mr. Anders Johan;male;39;1;5;347082;31,275;;S;;;Sweden Winnipeg, MN
-3;1;"Andersson, Mr. August Edvard (""Wennerstrom"")";male;27;0;0;350043;7,7958;;S;A;;
-3;0;Andersson, Mr. Johan Samuel;male;26;0;0;347075;7,775;;S;;;Hartford, CT
-3;0;Andersson, Mrs. Anders Johan (Alfrida Konstantia Brogren);female;39;1;5;347082;31,275;;S;;;Sweden Winnipeg, MN
-3;0;Andreasson, Mr. Paul Edvin;male;20;0;0;347466;7,8542;;S;;;Sweden Chicago, IL
-3;0;Angheloff, Mr. Minko;male;26;0;0;349202;7,8958;;S;;;Bulgaria Chicago, IL
-3;0;Arnold-Franchi, Mr. Josef;male;25;1;0;349237;17,8;;S;;;Altdorf, Switzerland
-3;0;Arnold-Franchi, Mrs. Josef (Josefine Franchi);female;18;1;0;349237;17,8;;S;;;Altdorf, Switzerland
-3;0;Aronsson, Mr. Ernst Axel Algot;male;24;0;0;349911;7,775;;S;;;Sweden Joliet, IL
-3;0;Asim, Mr. Adola;male;35;0;0;SOTON/O.Q. 3101310;7,05;;S;;;
-3;0;Asplund, Master. Carl Edgar;male;5;4;2;347077;31,3875;;S;;;Sweden  Worcester, MA
-3;0;Asplund, Master. Clarence Gustaf Hugo;male;9;4;2;347077;31,3875;;S;;;Sweden Worcester, MA
-3;1;Asplund, Master. Edvin Rojj Felix;male;3;4;2;347077;31,3875;;S;15;;Sweden Worcester, MA
-3;0;Asplund, Master. Filip Oscar;male;13;4;2;347077;31,3875;;S;;;Sweden Worcester, MA
-3;1;Asplund, Miss. Lillian Gertrud;female;5;4;2;347077;31,3875;;S;15;;Sweden Worcester, MA
-3;0;Asplund, Mr. Carl Oscar Vilhelm Gustafsson;male;40;1;5;347077;31,3875;;S;;142;Sweden  Worcester, MA
-3;1;Asplund, Mr. Johan Charles;male;23;0;0;350054;7,7958;;S;13;;Oskarshamn, Sweden Minneapolis, MN
-3;1;Asplund, Mrs. Carl Oscar (Selma Augusta Emilia Johansson);female;38;1;5;347077;31,3875;;S;15;;Sweden  Worcester, MA
-3;1;"Assaf Khalil, Mrs. Mariana (""Miriam"")";female;45;0;0;2696;7,225;;C;C;;Ottawa, ON
-3;0;Assaf, Mr. Gerios;male;21;0;0;2692;7,225;;C;;;Ottawa, ON
-3;0;Assam, Mr. Ali;male;23;0;0;SOTON/O.Q. 3101309;7,05;;S;;;
-3;0;Attalah, Miss. Malake;female;17;0;0;2627;14,4583;;C;;;
-3;0;Attalah, Mr. Sleiman;male;30;0;0;2694;7,225;;C;;;Ottawa, ON
-3;0;Augustsson, Mr. Albert;male;23;0;0;347468;7,8542;;S;;;Krakoryd, Sweden Bloomington, IL
-3;1;Ayoub, Miss. Banoura;female;13;0;0;2687;7,2292;;C;C;;Syria Youngstown, OH
-3;0;Baccos, Mr. Raffull;male;20;0;0;2679;7,225;;C;;;
-3;0;Backstrom, Mr. Karl Alfred;male;32;1;0;3101278;15,85;;S;D;;Ruotsinphytaa, Finland New York, NY
-3;1;Backstrom, Mrs. Karl Alfred (Maria Mathilda Gustafsson);female;33;3;0;3101278;15,85;;S;;;Ruotsinphytaa, Finland New York, NY
-3;1;Baclini, Miss. Eugenie;female;0,75;2;1;2666;19,2583;;C;C;;Syria New York, NY
-3;1;Baclini, Miss. Helene Barbara;female;0,75;2;1;2666;19,2583;;C;C;;Syria New York, NY
-3;1;Baclini, Miss. Marie Catherine;female;5;2;1;2666;19,2583;;C;C;;Syria New York, NY
-3;1;Baclini, Mrs. Solomon (Latifa Qurban);female;24;0;3;2666;19,2583;;C;C;;Syria New York, NY
-3;1;Badman, Miss. Emily Louisa;female;18;0;0;A/4 31416;8,05;;S;C;;London Skanteales, NY
-3;0;Badt, Mr. Mohamed;male;40;0;0;2623;7,225;;C;;;
-3;0;Balkic, Mr. Cerin;male;26;0;0;349248;7,8958;;S;;;
-3;1;Barah, Mr. Hanna Assi;male;20;0;0;2663;7,2292;;C;15;;
-3;0;Barbara, Miss. Saiide;female;18;0;1;2691;14,4542;;C;;;Syria Ottawa, ON
-3;0;Barbara, Mrs. (Catherine David);female;45;0;1;2691;14,4542;;C;;;Syria Ottawa, ON
-3;0;Barry, Miss. Julia;female;27;0;0;330844;7,8792;;Q;;;New York, NY
-3;0;Barton, Mr. David John;male;22;0;0;324669;8,05;;S;;;England New York, NY
-3;0;Beavan, Mr. William Thomas;male;19;0;0;323951;8,05;;S;;;England
-3;0;Bengtsson, Mr. John Viktor;male;26;0;0;347068;7,775;;S;;;Krakudden, Sweden Moune, IL
-3;0;Berglund, Mr. Karl Ivar Sven;male;22;0;0;PP 4348;9,35;;S;;;Tranvik, Finland New York
-3;0;Betros, Master. Seman;male;;0;0;2622;7,2292;;C;;;
-3;0;Betros, Mr. Tannous;male;20;0;0;2648;4,0125;;C;;;Syria
-3;1;Bing, Mr. Lee;male;32;0;0;1601;56,4958;;S;C;;Hong Kong New York, NY
-3;0;Birkeland, Mr. Hans Martin Monsen;male;21;0;0;312992;7,775;;S;;;Brennes, Norway New York
-3;0;Bjorklund, Mr. Ernst Herbert;male;18;0;0;347090;7,75;;S;;;Stockholm, Sweden New York
-3;0;Bostandyeff, Mr. Guentcho;male;26;0;0;349224;7,8958;;S;;;Bulgaria Chicago, IL
-3;0;Boulos, Master. Akar;male;6;1;1;2678;15,2458;;C;;;Syria Kent, ON
-3;0;Boulos, Miss. Nourelain;female;9;1;1;2678;15,2458;;C;;;Syria Kent, ON
-3;0;Boulos, Mr. Hanna;male;;0;0;2664;7,225;;C;;;Syria
-3;0;Boulos, Mrs. Joseph (Sultana);female;;0;2;2678;15,2458;;C;;;Syria Kent, ON
-3;0;Bourke, Miss. Mary;female;;0;2;364848;7,75;;Q;;;Ireland Chicago, IL
-3;0;Bourke, Mr. John;male;40;1;1;364849;15,5;;Q;;;Ireland Chicago, IL
-3;0;Bourke, Mrs. John (Catherine);female;32;1;1;364849;15,5;;Q;;;Ireland Chicago, IL
-3;0;"Bowen, Mr. David John ""Dai""";male;21;0;0;54636;16,1;;S;;;Treherbert, Cardiff, Wales
-3;1;Bradley, Miss. Bridget Delia;female;22;0;0;334914;7,725;;Q;13;;Kingwilliamstown, Co Cork, Ireland Glens Falls, NY
-3;0;Braf, Miss. Elin Ester Maria;female;20;0;0;347471;7,8542;;S;;;Medeltorp, Sweden Chicago, IL
-3;0;Braund, Mr. Lewis Richard;male;29;1;0;3460;7,0458;;S;;;Bridgerule, Devon
-3;0;Braund, Mr. Owen Harris;male;22;1;0;A/5 21171;7,25;;S;;;Bridgerule, Devon
-3;0;Brobeck, Mr. Karl Rudolf;male;22;0;0;350045;7,7958;;S;;;Sweden Worcester, MA
-3;0;Brocklebank, Mr. William Alfred;male;35;0;0;364512;8,05;;S;;;Broomfield, Chelmsford, England
-3;0;Buckley, Miss. Katherine;female;18,5;0;0;329944;7,2833;;Q;;299;Co Cork, Ireland Roxbury, MA
-3;1;Buckley, Mr. Daniel;male;21;0;0;330920;7,8208;;Q;13;;Kingwilliamstown, Co Cork, Ireland New York, NY
-3;0;Burke, Mr. Jeremiah;male;19;0;0;365222;6,75;;Q;;;Co Cork, Ireland Charlestown, MA
-3;0;Burns, Miss. Mary Delia;female;18;0;0;330963;7,8792;;Q;;;Co Sligo, Ireland New York, NY
-3;0;Cacic, Miss. Manda;female;21;0;0;315087;8,6625;;S;;;
-3;0;Cacic, Miss. Marija;female;30;0;0;315084;8,6625;;S;;;
-3;0;Cacic, Mr. Jego Grga;male;18;0;0;315091;8,6625;;S;;;
-3;0;Cacic, Mr. Luka;male;38;0;0;315089;8,6625;;S;;;Croatia
-3;0;Calic, Mr. Jovo;male;17;0;0;315093;8,6625;;S;;;
-3;0;Calic, Mr. Petar;male;17;0;0;315086;8,6625;;S;;;
-3;0;Canavan, Miss. Mary;female;21;0;0;364846;7,75;;Q;;;
-3;0;Canavan, Mr. Patrick;male;21;0;0;364858;7,75;;Q;;;Ireland Philadelphia, PA
-3;0;Cann, Mr. Ernest Charles;male;21;0;0;A./5. 2152;8,05;;S;;;
-3;0;Caram, Mr. Joseph;male;;1;0;2689;14,4583;;C;;;Ottawa, ON
-3;0;Caram, Mrs. Joseph (Maria Elias);female;;1;0;2689;14,4583;;C;;;Ottawa, ON
-3;0;Carlsson, Mr. August Sigfrid;male;28;0;0;350042;7,7958;;S;;;Dagsas, Sweden Fower, MN
-3;0;Carlsson, Mr. Carl Robert;male;24;0;0;350409;7,8542;;S;;;Goteborg, Sweden Huntley, IL
-3;1;"Carr, Miss. Helen ""Ellen""";female;16;0;0;367231;7,75;;Q;16;;Co Longford, Ireland New York, NY
-3;0;Carr, Miss. Jeannie;female;37;0;0;368364;7,75;;Q;;;Co Sligo, Ireland Hartford, CT
-3;0;Carver, Mr. Alfred John;male;28;0;0;392095;7,25;;S;;;St Denys, Southampton, Hants
-3;0;Celotti, Mr. Francesco;male;24;0;0;343275;8,05;;S;;;London
-3;0;Charters, Mr. David;male;21;0;0;A/5. 13032;7,7333;;Q;;;Ireland New York, NY
-3;1;Chip, Mr. Chang;male;32;0;0;1601;56,4958;;S;C;;Hong Kong New York, NY
-3;0;Christmann, Mr. Emil;male;29;0;0;343276;8,05;;S;;;
-3;0;Chronopoulos, Mr. Apostolos;male;26;1;0;2680;14,4542;;C;;;Greece
-3;0;Chronopoulos, Mr. Demetrios;male;18;1;0;2680;14,4542;;C;;;Greece
-3;0;Coelho, Mr. Domingos Fernandeo;male;20;0;0;SOTON/O.Q. 3101307;7,05;;S;;;Portugal
-3;1;"Cohen, Mr. Gurshon ""Gus""";male;18;0;0;A/5 3540;8,05;;S;12;;London Brooklyn, NY
-3;0;Colbert, Mr. Patrick;male;24;0;0;371109;7,25;;Q;;;Co Limerick, Ireland Sherbrooke, PQ
-3;0;Coleff, Mr. Peju;male;36;0;0;349210;7,4958;;S;;;Bulgaria Chicago, IL
-3;0;Coleff, Mr. Satio;male;24;0;0;349209;7,4958;;S;;;
-3;0;Conlon, Mr. Thomas Henry;male;31;0;0;21332;7,7333;;Q;;;Philadelphia, PA
-3;0;Connaghton, Mr. Michael;male;31;0;0;335097;7,75;;Q;;;Ireland Brooklyn, NY
-3;1;Connolly, Miss. Kate;female;22;0;0;370373;7,75;;Q;13;;Ireland
-3;0;Connolly, Miss. Kate;female;30;0;0;330972;7,6292;;Q;;;Ireland
-3;0;Connors, Mr. Patrick;male;70,5;0;0;370369;7,75;;Q;;171;
-3;0;Cook, Mr. Jacob;male;43;0;0;A/5 3536;8,05;;S;;;
-3;0;Cor, Mr. Bartol;male;35;0;0;349230;7,8958;;S;;;Austria
-3;0;Cor, Mr. Ivan;male;27;0;0;349229;7,8958;;S;;;Austria
-3;0;Cor, Mr. Liudevit;male;19;0;0;349231;7,8958;;S;;;Austria
-3;0;Corn, Mr. Harry;male;30;0;0;SOTON/OQ 392090;8,05;;S;;;London
-3;1;"Coutts, Master. Eden Leslie ""Neville""";male;9;1;1;C.A. 37671;15,9;;S;2;;England Brooklyn, NY
-3;1;"Coutts, Master. William Loch ""William""";male;3;1;1;C.A. 37671;15,9;;S;2;;England Brooklyn, NY
-3;1;"Coutts, Mrs. William (Winnie ""Minnie"" Treanor)";female;36;0;2;C.A. 37671;15,9;;S;2;;England Brooklyn, NY
-3;0;Coxon, Mr. Daniel;male;59;0;0;364500;7,25;;S;;;Merrill, WI
-3;0;Crease, Mr. Ernest James;male;19;0;0;S.P. 3464;8,1583;;S;;;Bristol, England Cleveland, OH
-3;1;Cribb, Miss. Laura Alice;female;17;0;1;371362;16,1;;S;12;;Bournemouth, England Newark, NJ
-3;0;Cribb, Mr. John Hatfield;male;44;0;1;371362;16,1;;S;;;Bournemouth, England Newark, NJ
-3;0;Culumovic, Mr. Jeso;male;17;0;0;315090;8,6625;;S;;;Austria-Hungary
-3;0;Daher, Mr. Shedid;male;22,5;0;0;2698;7,225;;C;;9;
-3;1;Dahl, Mr. Karl Edwart;male;45;0;0;7598;8,05;;S;15;;Australia Fingal, ND
-3;0;Dahlberg, Miss. Gerda Ulrika;female;22;0;0;7552;10,5167;;S;;;Norrlot, Sweden Chicago, IL
-3;0;Dakic, Mr. Branko;male;19;0;0;349228;10,1708;;S;;;Austria
-3;1;"Daly, Miss. Margaret Marcella ""Maggie""";female;30;0;0;382650;6,95;;Q;15;;Co Athlone, Ireland New York, NY
-3;1;Daly, Mr. Eugene Patrick;male;29;0;0;382651;7,75;;Q;13 15 B;;Co Athlone, Ireland New York, NY
-3;0;Danbom, Master. Gilbert Sigvard Emanuel;male;0,3333;0;2;347080;14,4;;S;;;Stanton, IA
-3;0;Danbom, Mr. Ernst Gilbert;male;34;1;1;347080;14,4;;S;;197;Stanton, IA
-3;0;Danbom, Mrs. Ernst Gilbert (Anna Sigrid Maria Brogren);female;28;1;1;347080;14,4;;S;;;Stanton, IA
-3;0;Danoff, Mr. Yoto;male;27;0;0;349219;7,8958;;S;;;Bulgaria Chicago, IL
-3;0;Dantcheff, Mr. Ristiu;male;25;0;0;349203;7,8958;;S;;;Bulgaria Chicago, IL
-3;0;Davies, Mr. Alfred J;male;24;2;0;A/4 48871;24,15;;S;;;West Bromwich, England Pontiac, MI
-3;0;Davies, Mr. Evan;male;22;0;0;SC/A4 23568;8,05;;S;;;
-3;0;Davies, Mr. John Samuel;male;21;2;0;A/4 48871;24,15;;S;;;West Bromwich, England Pontiac, MI
-3;0;Davies, Mr. Joseph;male;17;2;0;A/4 48873;8,05;;S;;;West Bromwich, England Pontiac, MI
-3;0;Davison, Mr. Thomas Henry;male;;1;0;386525;16,1;;S;;;Liverpool, England Bedford, OH
-3;1;Davison, Mrs. Thomas Henry (Mary E Finck);female;;1;0;386525;16,1;;S;16;;Liverpool, England Bedford, OH
-3;1;de Messemaeker, Mr. Guillaume Joseph;male;36,5;1;0;345572;17,4;;S;15;;Tampico, MT
-3;1;de Messemaeker, Mrs. Guillaume Joseph (Emma);female;36;1;0;345572;17,4;;S;13;;Tampico, MT
-3;1;de Mulder, Mr. Theodore;male;30;0;0;345774;9,5;;S;11;;Belgium Detroit, MI
-3;0;de Pelsmaeker, Mr. Alfons;male;16;0;0;345778;9,5;;S;;;
-3;1;Dean, Master. Bertram Vere;male;1;1;2;C.A. 2315;20,575;;S;10;;Devon, England Wichita, KS
-3;1;"Dean, Miss. Elizabeth Gladys ""Millvina""";female;0,1667;1;2;C.A. 2315;20,575;;S;10;;Devon, England Wichita, KS
-3;0;Dean, Mr. Bertram Frank;male;26;1;2;C.A. 2315;20,575;;S;;;Devon, England Wichita, KS
-3;1;Dean, Mrs. Bertram (Eva Georgetta Light);female;33;1;2;C.A. 2315;20,575;;S;10;;Devon, England Wichita, KS
-3;0;Delalic, Mr. Redjo;male;25;0;0;349250;7,8958;;S;;;
-3;0;Demetri, Mr. Marinko;male;;0;0;349238;7,8958;;S;;;
-3;0;Denkoff, Mr. Mitto;male;;0;0;349225;7,8958;;S;;;Bulgaria Coon Rapids, IA
-3;0;Dennis, Mr. Samuel;male;22;0;0;A/5 21172;7,25;;S;;;
-3;0;Dennis, Mr. William;male;36;0;0;A/5 21175;7,25;;S;;;
-3;1;Devaney, Miss. Margaret Delia;female;19;0;0;330958;7,8792;;Q;C;;Kilmacowen, Co Sligo, Ireland New York, NY
-3;0;Dika, Mr. Mirko;male;17;0;0;349232;7,8958;;S;;;
-3;0;Dimic, Mr. Jovan;male;42;0;0;315088;8,6625;;S;;;
-3;0;Dintcheff, Mr. Valtcho;male;43;0;0;349226;7,8958;;S;;;
-3;0;Doharr, Mr. Tannous;male;;0;0;2686;7,2292;;C;;;
-3;0;Dooley, Mr. Patrick;male;32;0;0;370376;7,75;;Q;;;Ireland New York, NY
-3;1;Dorking, Mr. Edward Arthur;male;19;0;0;A/5. 10482;8,05;;S;B;;England Oglesby, IL
-3;1;Dowdell, Miss. Elizabeth;female;30;0;0;364516;12,475;;S;13;;Union Hill, NJ
-3;0;Doyle, Miss. Elizabeth;female;24;0;0;368702;7,75;;Q;;;Ireland New York, NY
-3;1;Drapkin, Miss. Jennie;female;23;0;0;SOTON/OQ 392083;8,05;;S;;;London New York, NY
-3;0;Drazenoic, Mr. Jozef;male;33;0;0;349241;7,8958;;C;;51;Austria Niagara Falls, NY
-3;0;Duane, Mr. Frank;male;65;0;0;336439;7,75;;Q;;;
-3;1;Duquemin, Mr. Joseph;male;24;0;0;S.O./P.P. 752;7,55;;S;D;;England Albion, NY
-3;0;Dyker, Mr. Adolf Fredrik;male;23;1;0;347072;13,9;;S;;;West Haven, CT
-3;1;Dyker, Mrs. Adolf Fredrik (Anna Elisabeth Judith Andersson);female;22;1;0;347072;13,9;;S;16;;West Haven, CT
-3;0;Edvardsson, Mr. Gustaf Hjalmar;male;18;0;0;349912;7,775;;S;;;Tofta, Sweden Joliet, IL
-3;0;Eklund, Mr. Hans Linus;male;16;0;0;347074;7,775;;S;;;Karberg, Sweden Jerome Junction, AZ
-3;0;Ekstrom, Mr. Johan;male;45;0;0;347061;6,975;;S;;;Effington Rut, SD
-3;0;Elias, Mr. Dibo;male;;0;0;2674;7,225;;C;;;
-3;0;Elias, Mr. Joseph;male;39;0;2;2675;7,2292;;C;;;Syria Ottawa, ON
-3;0;Elias, Mr. Joseph Jr;male;17;1;1;2690;7,2292;;C;;;
-3;0;Elias, Mr. Tannous;male;15;1;1;2695;7,2292;;C;;;Syria
-3;0;Elsbury, Mr. William James;male;47;0;0;A/5 3902;7,25;;S;;;Illinois, USA
-3;1;Emanuel, Miss. Virginia Ethel;female;5;0;0;364516;12,475;;S;13;;New York, NY
-3;0;Emir, Mr. Farred Chehab;male;;0;0;2631;7,225;;C;;;
-3;0;Everett, Mr. Thomas James;male;40,5;0;0;C.A. 6212;15,1;;S;;187;
-3;0;Farrell, Mr. James;male;40,5;0;0;367232;7,75;;Q;;68;Aughnacliff, Co Longford, Ireland New York, NY
-3;1;Finoli, Mr. Luigi;male;;0;0;SOTON/O.Q. 3101308;7,05;;S;15;;Italy Philadelphia, PA
-3;0;Fischer, Mr. Eberhard Thelander;male;18;0;0;350036;7,7958;;S;;;
-3;0;Fleming, Miss. Honora;female;;0;0;364859;7,75;;Q;;;
-3;0;Flynn, Mr. James;male;;0;0;364851;7,75;;Q;;;
-3;0;Flynn, Mr. John;male;;0;0;368323;6,95;;Q;;;
-3;0;Foley, Mr. Joseph;male;26;0;0;330910;7,8792;;Q;;;Ireland Chicago, IL
-3;0;Foley, Mr. William;male;;0;0;365235;7,75;;Q;;;Ireland
-3;1;Foo, Mr. Choong;male;;0;0;1601;56,4958;;S;13;;Hong Kong New York, NY
-3;0;"Ford, Miss. Doolina Margaret ""Daisy""";female;21;2;2;W./C. 6608;34,375;;S;;;Rotherfield, Sussex, England Essex Co, MA
-3;0;"Ford, Miss. Robina Maggie ""Ruby""";female;9;2;2;W./C. 6608;34,375;;S;;;Rotherfield, Sussex, England Essex Co, MA
-3;0;Ford, Mr. Arthur;male;;0;0;A/5 1478;8,05;;S;;;Bridgwater, Somerset, England
-3;0;Ford, Mr. Edward Watson;male;18;2;2;W./C. 6608;34,375;;S;;;Rotherfield, Sussex, England Essex Co, MA
-3;0;Ford, Mr. William Neal;male;16;1;3;W./C. 6608;34,375;;S;;;Rotherfield, Sussex, England Essex Co, MA
-3;0;Ford, Mrs. Edward (Margaret Ann Watson);female;48;1;3;W./C. 6608;34,375;;S;;;Rotherfield, Sussex, England Essex Co, MA
-3;0;Fox, Mr. Patrick;male;;0;0;368573;7,75;;Q;;;Ireland New York, NY
-3;0;Franklin, Mr. Charles (Charles Fardon);male;;0;0;SOTON/O.Q. 3101314;7,25;;S;;;
-3;0;Gallagher, Mr. Martin;male;25;0;0;36864;7,7417;;Q;;;New York, NY
-3;0;Garfirth, Mr. John;male;;0;0;358585;14,5;;S;;;
-3;0;Gheorgheff, Mr. Stanio;male;;0;0;349254;7,8958;;C;;;
-3;0;Gilinski, Mr. Eliezer;male;22;0;0;14973;8,05;;S;;47;
-3;1;"Gilnagh, Miss. Katherine ""Katie""";female;16;0;0;35851;7,7333;;Q;16;;Co Longford, Ireland New York, NY
-3;1;Glynn, Miss. Mary Agatha;female;;0;0;335677;7,75;;Q;13;;Co Clare, Ireland Washington, DC
-3;1;"Goldsmith, Master. Frank John William ""Frankie""";male;9;0;2;363291;20,525;;S;C D;;Strood, Kent, England Detroit, MI
-3;0;Goldsmith, Mr. Frank John;male;33;1;1;363291;20,525;;S;;;Strood, Kent, England Detroit, MI
-3;0;Goldsmith, Mr. Nathan;male;41;0;0;SOTON/O.Q. 3101263;7,85;;S;;;Philadelphia, PA
-3;1;Goldsmith, Mrs. Frank John (Emily Alice Brown);female;31;1;1;363291;20,525;;S;C D;;Strood, Kent, England Detroit, MI
-3;0;Goncalves, Mr. Manuel Estanslas;male;38;0;0;SOTON/O.Q. 3101306;7,05;;S;;;Portugal
-3;0;Goodwin, Master. Harold Victor;male;9;5;2;CA 2144;46,9;;S;;;Wiltshire, England Niagara Falls, NY
-3;0;Goodwin, Master. Sidney Leonard;male;1;5;2;CA 2144;46,9;;S;;;Wiltshire, England Niagara Falls, NY
-3;0;Goodwin, Master. William Frederick;male;11;5;2;CA 2144;46,9;;S;;;Wiltshire, England Niagara Falls, NY
-3;0;Goodwin, Miss. Jessie Allis;female;10;5;2;CA 2144;46,9;;S;;;Wiltshire, England Niagara Falls, NY
-3;0;Goodwin, Miss. Lillian Amy;female;16;5;2;CA 2144;46,9;;S;;;Wiltshire, England Niagara Falls, NY
-3;0;Goodwin, Mr. Charles Edward;male;14;5;2;CA 2144;46,9;;S;;;Wiltshire, England Niagara Falls, NY
-3;0;Goodwin, Mr. Charles Frederick;male;40;1;6;CA 2144;46,9;;S;;;Wiltshire, England Niagara Falls, NY
-3;0;Goodwin, Mrs. Frederick (Augusta Tyler);female;43;1;6;CA 2144;46,9;;S;;;Wiltshire, England Niagara Falls, NY
-3;0;Green, Mr. George Henry;male;51;0;0;21440;8,05;;S;;;Dorking, Surrey, England
-3;0;Gronnestad, Mr. Daniel Danielsen;male;32;0;0;8471;8,3625;;S;;;Foresvik, Norway Portland, ND
-3;0;Guest, Mr. Robert;male;;0;0;376563;8,05;;S;;;
-3;0;Gustafsson, Mr. Alfred Ossian;male;20;0;0;7534;9,8458;;S;;;Waukegan, Chicago, IL
-3;0;Gustafsson, Mr. Anders Vilhelm;male;37;2;0;3101276;7,925;;S;;98;Ruotsinphytaa, Finland New York, NY
-3;0;Gustafsson, Mr. Johan Birger;male;28;2;0;3101277;7,925;;S;;;Ruotsinphytaa, Finland New York, NY
-3;0;Gustafsson, Mr. Karl Gideon;male;19;0;0;347069;7,775;;S;;;Myren, Sweden New York, NY
-3;0;Haas, Miss. Aloisia;female;24;0;0;349236;8,85;;S;;;
-3;0;Hagardon, Miss. Kate;female;17;0;0;AQ/3. 30631;7,7333;;Q;;;
-3;0;Hagland, Mr. Ingvald Olai Olsen;male;;1;0;65303;19,9667;;S;;;
-3;0;Hagland, Mr. Konrad Mathias Reiersen;male;;1;0;65304;19,9667;;S;;;
-3;0;Hakkarainen, Mr. Pekka Pietari;male;28;1;0;STON/O2. 3101279;15,85;;S;;;
-3;1;Hakkarainen, Mrs. Pekka Pietari (Elin Matilda Dolck);female;24;1;0;STON/O2. 3101279;15,85;;S;15;;
-3;0;Hampe, Mr. Leon;male;20;0;0;345769;9,5;;S;;;
-3;0;Hanna, Mr. Mansour;male;23,5;0;0;2693;7,2292;;C;;188;
-3;0;Hansen, Mr. Claus Peter;male;41;2;0;350026;14,1083;;S;;;
-3;0;Hansen, Mr. Henrik Juul;male;26;1;0;350025;7,8542;;S;;;
-3;0;Hansen, Mr. Henry Damsgaard;male;21;0;0;350029;7,8542;;S;;69;
-3;1;Hansen, Mrs. Claus Peter (Jennie L Howard);female;45;1;0;350026;14,1083;;S;11;;
-3;0;Harknett, Miss. Alice Phoebe;female;;0;0;W./C. 6609;7,55;;S;;;
-3;0;Harmer, Mr. Abraham (David Lishin);male;25;0;0;374887;7,25;;S;B;;
-3;0;Hart, Mr. Henry;male;;0;0;394140;6,8583;;Q;;;
-3;0;Hassan, Mr. Houssein G N;male;11;0;0;2699;18,7875;;C;;;
-3;1;"Healy, Miss. Hanora ""Nora""";female;;0;0;370375;7,75;;Q;16;;
-3;1;Hedman, Mr. Oskar Arvid;male;27;0;0;347089;6,975;;S;15;;
-3;1;Hee, Mr. Ling;male;;0;0;1601;56,4958;;S;C;;
-3;0;"Hegarty, Miss. Hanora ""Nora""";female;18;0;0;365226;6,75;;Q;;;
-3;1;Heikkinen, Miss. Laina;female;26;0;0;STON/O2. 3101282;7,925;;S;;;
-3;0;Heininen, Miss. Wendla Maria;female;23;0;0;STON/O2. 3101290;7,925;;S;;;
-3;1;Hellstrom, Miss. Hilda Maria;female;22;0;0;7548;8,9625;;S;C;;
-3;0;Hendekovic, Mr. Ignjac;male;28;0;0;349243;7,8958;;S;;306;
-3;0;Henriksson, Miss. Jenny Lovisa;female;28;0;0;347086;7,775;;S;;;
-3;0;Henry, Miss. Delia;female;;0;0;382649;7,75;;Q;;;
-3;1;Hirvonen, Miss. Hildur E;female;2;0;1;3101298;12,2875;;S;15;;
-3;1;Hirvonen, Mrs. Alexander (Helga E Lindqvist);female;22;1;1;3101298;12,2875;;S;15;;
-3;0;Holm, Mr. John Fredrik Alexander;male;43;0;0;C 7075;6,45;;S;;;
-3;0;Holthen, Mr. Johan Martin;male;28;0;0;C 4001;22,525;;S;;;
-3;1;Honkanen, Miss. Eliina;female;27;0;0;STON/O2. 3101283;7,925;;S;;;
-3;0;Horgan, Mr. John;male;;0;0;370377;7,75;;Q;;;
-3;1;Howard, Miss. May Elizabeth;female;;0;0;A. 2. 39186;8,05;;S;C;;
-3;0;Humblen, Mr. Adolf Mathias Nicolai Olsen;male;42;0;0;348121;7,65;F G63;S;;120;
-3;1;Hyman, Mr. Abraham;male;;0;0;3470;7,8875;;S;C;;
-3;0;Ibrahim Shawah, Mr. Yousseff;male;30;0;0;2685;7,2292;;C;;;
-3;0;Ilieff, Mr. Ylio;male;;0;0;349220;7,8958;;S;;;
-3;0;Ilmakangas, Miss. Ida Livija;female;27;1;0;STON/O2. 3101270;7,925;;S;;;
-3;0;Ilmakangas, Miss. Pieta Sofia;female;25;1;0;STON/O2. 3101271;7,925;;S;;;
-3;0;Ivanoff, Mr. Kanio;male;;0;0;349201;7,8958;;S;;;
-3;1;Jalsevac, Mr. Ivan;male;29;0;0;349240;7,8958;;C;15;;
-3;1;Jansson, Mr. Carl Olof;male;21;0;0;350034;7,7958;;S;A;;
-3;0;Jardin, Mr. Jose Neto;male;;0;0;SOTON/O.Q. 3101305;7,05;;S;;;
-3;0;Jensen, Mr. Hans Peder;male;20;0;0;350050;7,8542;;S;;;
-3;0;Jensen, Mr. Niels Peder;male;48;0;0;350047;7,8542;;S;;;
-3;0;Jensen, Mr. Svend Lauritz;male;17;1;0;350048;7,0542;;S;;;
-3;1;Jermyn, Miss. Annie;female;;0;0;14313;7,75;;Q;D;;
-3;1;Johannesen-Bratthammer, Mr. Bernt;male;;0;0;65306;8,1125;;S;13;;
-3;0;Johanson, Mr. Jakob Alfred;male;34;0;0;3101264;6,4958;;S;;143;
-3;1;Johansson Palmquist, Mr. Oskar Leander;male;26;0;0;347070;7,775;;S;15;;
-3;0;Johansson, Mr. Erik;male;22;0;0;350052;7,7958;;S;;156;
-3;0;Johansson, Mr. Gustaf Joel;male;33;0;0;7540;8,6542;;S;;285;
-3;0;Johansson, Mr. Karl Johan;male;31;0;0;347063;7,775;;S;;;
-3;0;Johansson, Mr. Nils;male;29;0;0;347467;7,8542;;S;;;
-3;1;Johnson, Master. Harold Theodor;male;4;1;1;347742;11,1333;;S;15;;
-3;1;Johnson, Miss. Eleanor Ileen;female;1;1;1;347742;11,1333;;S;15;;
-3;0;Johnson, Mr. Alfred;male;49;0;0;LINE;0;;S;;;
-3;0;Johnson, Mr. Malkolm Joackim;male;33;0;0;347062;7,775;;S;;37;
-3;0;Johnson, Mr. William Cahoone Jr;male;19;0;0;LINE;0;;S;;;
-3;1;Johnson, Mrs. Oscar W (Elisabeth Vilhelmina Berg);female;27;0;2;347742;11,1333;;S;15;;
-3;0;"Johnston, Master. William Arthur ""Willie""";male;;1;2;W./C. 6607;23,45;;S;;;
-3;0;"Johnston, Miss. Catherine Helen ""Carrie""";female;;1;2;W./C. 6607;23,45;;S;;;
-3;0;Johnston, Mr. Andrew G;male;;1;2;W./C. 6607;23,45;;S;;;
-3;0;"Johnston, Mrs. Andrew G (Elizabeth ""Lily"" Watson)";female;;1;2;W./C. 6607;23,45;;S;;;
-3;0;Jonkoff, Mr. Lalio;male;23;0;0;349204;7,8958;;S;;;
-3;1;Jonsson, Mr. Carl;male;32;0;0;350417;7,8542;;S;15;;
-3;0;Jonsson, Mr. Nils Hilding;male;27;0;0;350408;7,8542;;S;;;
-3;0;Jussila, Miss. Katriina;female;20;1;0;4136;9,825;;S;;;
-3;0;Jussila, Miss. Mari Aina;female;21;1;0;4137;9,825;;S;;;
-3;1;Jussila, Mr. Eiriik;male;32;0;0;STON/O 2. 3101286;7,925;;S;15;;
-3;0;Kallio, Mr. Nikolai Erland;male;17;0;0;STON/O 2. 3101274;7,125;;S;;;
-3;0;Kalvik, Mr. Johannes Halvorsen;male;21;0;0;8475;8,4333;;S;;;
-3;0;Karaic, Mr. Milan;male;30;0;0;349246;7,8958;;S;;;
-3;1;Karlsson, Mr. Einar Gervasius;male;21;0;0;350053;7,7958;;S;13;;
-3;0;Karlsson, Mr. Julius Konrad Eugen;male;33;0;0;347465;7,8542;;S;;;
-3;0;Karlsson, Mr. Nils August;male;22;0;0;350060;7,5208;;S;;;
-3;1;Karun, Miss. Manca;female;4;0;1;349256;13,4167;;C;15;;
-3;1;Karun, Mr. Franz;male;39;0;1;349256;13,4167;;C;15;;
-3;0;Kassem, Mr. Fared;male;;0;0;2700;7,2292;;C;;;
-3;0;"Katavelas, Mr. Vassilios (""Catavelas Vassilios"")";male;18,5;0;0;2682;7,2292;;C;;58;
-3;0;"Keane, Mr. Andrew ""Andy""";male;;0;0;12460;7,75;;Q;;;
-3;0;Keefe, Mr. Arthur;male;;0;0;323592;7,25;;S;A;;
-3;1;"Kelly, Miss. Anna Katherine ""Annie Kate""";female;;0;0;9234;7,75;;Q;16;;
-3;1;Kelly, Miss. Mary;female;;0;0;14312;7,75;;Q;D;;
-3;0;Kelly, Mr. James;male;34,5;0;0;330911;7,8292;;Q;;70;
-3;0;Kelly, Mr. James;male;44;0;0;363592;8,05;;S;;;
-3;1;Kennedy, Mr. John;male;;0;0;368783;7,75;;Q;;;
-3;0;Khalil, Mr. Betros;male;;1;0;2660;14,4542;;C;;;
-3;0;"Khalil, Mrs. Betros (Zahie ""Maria"" Elias)";female;;1;0;2660;14,4542;;C;;;
-3;0;Kiernan, Mr. John;male;;1;0;367227;7,75;;Q;;;
-3;0;Kiernan, Mr. Philip;male;;1;0;367229;7,75;;Q;;;
-3;0;Kilgannon, Mr. Thomas J;male;;0;0;36865;7,7375;;Q;;;
-3;0;Kink, Miss. Maria;female;22;2;0;315152;8,6625;;S;;;
-3;0;Kink, Mr. Vincenz;male;26;2;0;315151;8,6625;;S;;;
-3;1;Kink-Heilmann, Miss. Luise Gretchen;female;4;0;2;315153;22,025;;S;2;;
-3;1;Kink-Heilmann, Mr. Anton;male;29;3;1;315153;22,025;;S;2;;
-3;1;Kink-Heilmann, Mrs. Anton (Luise Heilmann);female;26;1;1;315153;22,025;;S;2;;
-3;0;Klasen, Miss. Gertrud Emilia;female;1;1;1;350405;12,1833;;S;;;
-3;0;Klasen, Mr. Klas Albin;male;18;1;1;350404;7,8542;;S;;;
-3;0;Klasen, Mrs. (Hulda Kristina Eugenia Lofqvist);female;36;0;2;350405;12,1833;;S;;;
-3;0;Kraeff, Mr. Theodor;male;;0;0;349253;7,8958;;C;;;
-3;1;Krekorian, Mr. Neshan;male;25;0;0;2654;7,2292;F E57;C;10;;
-3;0;Lahoud, Mr. Sarkis;male;;0;0;2624;7,225;;C;;;
-3;0;Laitinen, Miss. Kristina Sofia;female;37;0;0;4135;9,5875;;S;;;
-3;0;Laleff, Mr. Kristo;male;;0;0;349217;7,8958;;S;;;
-3;1;Lam, Mr. Ali;male;;0;0;1601;56,4958;;S;C;;
-3;0;Lam, Mr. Len;male;;0;0;1601;56,4958;;S;;;
-3;1;Landergren, Miss. Aurora Adelia;female;22;0;0;C 7077;7,25;;S;13;;
-3;0;Lane, Mr. Patrick;male;;0;0;7935;7,75;;Q;;;
-3;1;Lang, Mr. Fang;male;26;0;0;1601;56,4958;;S;14;;
-3;0;Larsson, Mr. August Viktor;male;29;0;0;7545;9,4833;;S;;;
-3;0;Larsson, Mr. Bengt Edvin;male;29;0;0;347067;7,775;;S;;;
-3;0;Larsson-Rondberg, Mr. Edvard A;male;22;0;0;347065;7,775;;S;;;
-3;1;"Leeni, Mr. Fahim (""Philip Zenni"")";male;22;0;0;2620;7,225;;C;6;;
-3;0;Lefebre, Master. Henry Forbes;male;;3;1;4133;25,4667;;S;;;
-3;0;Lefebre, Miss. Ida;female;;3;1;4133;25,4667;;S;;;
-3;0;Lefebre, Miss. Jeannie;female;;3;1;4133;25,4667;;S;;;
-3;0;Lefebre, Miss. Mathilde;female;;3;1;4133;25,4667;;S;;;
-3;0;Lefebre, Mrs. Frank (Frances);female;;0;4;4133;25,4667;;S;;;
-3;0;Leinonen, Mr. Antti Gustaf;male;32;0;0;STON/O 2. 3101292;7,925;;S;;;
-3;0;Lemberopolous, Mr. Peter L;male;34,5;0;0;2683;6,4375;;C;;196;
-3;0;Lennon, Miss. Mary;female;;1;0;370371;15,5;;Q;;;
-3;0;Lennon, Mr. Denis;male;;1;0;370371;15,5;;Q;;;
-3;0;Leonard, Mr. Lionel;male;36;0;0;LINE;0;;S;;;
-3;0;Lester, Mr. James;male;39;0;0;A/4 48871;24,15;;S;;;
-3;0;Lievens, Mr. Rene Aime;male;24;0;0;345781;9,5;;S;;;
-3;0;Lindahl, Miss. Agda Thorilda Viktoria;female;25;0;0;347071;7,775;;S;;;
-3;0;Lindblom, Miss. Augusta Charlotta;female;45;0;0;347073;7,75;;S;;;
-3;0;Lindell, Mr. Edvard Bengtsson;male;36;1;0;349910;15,55;;S;A;;
-3;0;Lindell, Mrs. Edvard Bengtsson (Elin Gerda Persson);female;30;1;0;349910;15,55;;S;A;;
-3;1;Lindqvist, Mr. Eino William;male;20;1;0;STON/O 2. 3101285;7,925;;S;15;;
-3;0;Linehan, Mr. Michael;male;;0;0;330971;7,8792;;Q;;;
-3;0;Ling, Mr. Lee;male;28;0;0;1601;56,4958;;S;;;
-3;0;Lithman, Mr. Simon;male;;0;0;S.O./P.P. 251;7,55;;S;;;
-3;0;Lobb, Mr. William Arthur;male;30;1;0;A/5. 3336;16,1;;S;;;
-3;0;Lobb, Mrs. William Arthur (Cordelia K Stanlick);female;26;1;0;A/5. 3336;16,1;;S;;;
-3;0;Lockyer, Mr. Edward;male;;0;0;1222;7,8792;;S;;153;
-3;0;"Lovell, Mr. John Hall (""Henry"")";male;20,5;0;0;A/5 21173;7,25;;S;;;
-3;1;Lulic, Mr. Nikola;male;27;0;0;315098;8,6625;;S;15;;
-3;0;Lundahl, Mr. Johan Svensson;male;51;0;0;347743;7,0542;;S;;;
-3;1;Lundin, Miss. Olga Elida;female;23;0;0;347469;7,8542;;S;10;;
-3;1;Lundstrom, Mr. Thure Edvin;male;32;0;0;350403;7,5792;;S;15;;
-3;0;Lyntakoff, Mr. Stanko;male;;0;0;349235;7,8958;;S;;;
-3;0;MacKay, Mr. George William;male;;0;0;C.A. 42795;7,55;;S;;;
-3;1;"Madigan, Miss. Margaret ""Maggie""";female;;0;0;370370;7,75;;Q;15;;
-3;1;Madsen, Mr. Fridtjof Arne;male;24;0;0;C 17369;7,1417;;S;13;;
-3;0;Maenpaa, Mr. Matti Alexanteri;male;22;0;0;STON/O 2. 3101275;7,125;;S;;;
-3;0;Mahon, Miss. Bridget Delia;female;;0;0;330924;7,8792;;Q;;;
-3;0;Mahon, Mr. John;male;;0;0;AQ/4 3130;7,75;;Q;;;
-3;0;Maisner, Mr. Simon;male;;0;0;A/S 2816;8,05;;S;;;
-3;0;Makinen, Mr. Kalle Edvard;male;29;0;0;STON/O 2. 3101268;7,925;;S;;;
-3;1;Mamee, Mr. Hanna;male;;0;0;2677;7,2292;;C;15;;
-3;0;Mangan, Miss. Mary;female;30,5;0;0;364850;7,75;;Q;;61;
-3;1;Mannion, Miss. Margareth;female;;0;0;36866;7,7375;;Q;16;;
-3;0;Mardirosian, Mr. Sarkis;male;;0;0;2655;7,2292;F E46;C;;;
-3;0;Markoff, Mr. Marin;male;35;0;0;349213;7,8958;;C;;;
-3;0;Markun, Mr. Johann;male;33;0;0;349257;7,8958;;S;;;
-3;1;Masselmani, Mrs. Fatima;female;;0;0;2649;7,225;;C;C;;
-3;0;Matinoff, Mr. Nicola;male;;0;0;349255;7,8958;;C;;;
-3;1;"McCarthy, Miss. Catherine ""Katie""";female;;0;0;383123;7,75;;Q;15 16;;
-3;1;McCormack, Mr. Thomas Joseph;male;;0;0;367228;7,75;;Q;;;
-3;1;McCoy, Miss. Agnes;female;;2;0;367226;23,25;;Q;16;;
-3;1;McCoy, Miss. Alicia;female;;2;0;367226;23,25;;Q;16;;
-3;1;McCoy, Mr. Bernard;male;;2;0;367226;23,25;;Q;16;;
-3;1;McDermott, Miss. Brigdet Delia;female;;0;0;330932;7,7875;;Q;13;;
-3;0;McEvoy, Mr. Michael;male;;0;0;36568;15,5;;Q;;;
-3;1;McGovern, Miss. Mary;female;;0;0;330931;7,8792;;Q;13;;
-3;1;"McGowan, Miss. Anna ""Annie""";female;15;0;0;330923;8,0292;;Q;;;
-3;0;McGowan, Miss. Katherine;female;35;0;0;9232;7,75;;Q;;;
-3;0;McMahon, Mr. Martin;male;;0;0;370372;7,75;;Q;;;
-3;0;McNamee, Mr. Neal;male;24;1;0;376566;16,1;;S;;;
-3;0;McNamee, Mrs. Neal (Eileen O'Leary);female;19;1;0;376566;16,1;;S;;53;
-3;0;McNeill, Miss. Bridget;female;;0;0;370368;7,75;;Q;;;
-3;0;Meanwell, Miss. (Marion Ogden);female;;0;0;SOTON/O.Q. 392087;8,05;;S;;;
-3;0;Meek, Mrs. Thomas (Annie Louise Rowley);female;;0;0;343095;8,05;;S;;;
-3;0;Meo, Mr. Alfonzo;male;55,5;0;0;A.5. 11206;8,05;;S;;201;
-3;0;Mernagh, Mr. Robert;male;;0;0;368703;7,75;;Q;;;
-3;1;Midtsjo, Mr. Karl Albert;male;21;0;0;345501;7,775;;S;15;;
-3;0;Miles, Mr. Frank;male;;0;0;359306;8,05;;S;;;
-3;0;Mineff, Mr. Ivan;male;24;0;0;349233;7,8958;;S;;;
-3;0;Minkoff, Mr. Lazar;male;21;0;0;349211;7,8958;;S;;;
-3;0;Mionoff, Mr. Stoytcho;male;28;0;0;349207;7,8958;;S;;;
-3;0;Mitkoff, Mr. Mito;male;;0;0;349221;7,8958;;S;;;
-3;1;"Mockler, Miss. Helen Mary ""Ellie""";female;;0;0;330980;7,8792;;Q;16;;
-3;0;Moen, Mr. Sigurd Hansen;male;25;0;0;348123;7,65;F G73;S;;309;
-3;1;Moor, Master. Meier;male;6;0;1;392096;12,475;E121;S;14;;
-3;1;Moor, Mrs. (Beila);female;27;0;1;392096;12,475;E121;S;14;;
-3;0;Moore, Mr. Leonard Charles;male;;0;0;A4. 54510;8,05;;S;;;
-3;1;Moran, Miss. Bertha;female;;1;0;371110;24,15;;Q;16;;
-3;0;Moran, Mr. Daniel J;male;;1;0;371110;24,15;;Q;;;
-3;0;Moran, Mr. James;male;;0;0;330877;8,4583;;Q;;;
-3;0;Morley, Mr. William;male;34;0;0;364506;8,05;;S;;;
-3;0;Morrow, Mr. Thomas Rowan;male;;0;0;372622;7,75;;Q;;;
-3;1;Moss, Mr. Albert Johan;male;;0;0;312991;7,775;;S;B;;
-3;1;Moubarek, Master. Gerios;male;;1;1;2661;15,2458;;C;C;;
-3;1;"Moubarek, Master. Halim Gonios (""William George"")";male;;1;1;2661;15,2458;;C;C;;
-3;1;"Moubarek, Mrs. George (Omine ""Amenia"" Alexander)";female;;0;2;2661;15,2458;;C;C;;
-3;1;Moussa, Mrs. (Mantoura Boulos);female;;0;0;2626;7,2292;;C;;;
-3;0;Moutal, Mr. Rahamin Haim;male;;0;0;374746;8,05;;S;;;
-3;1;"Mullens, Miss. Katherine ""Katie""";female;;0;0;35852;7,7333;;Q;16;;
-3;1;Mulvihill, Miss. Bertha E;female;24;0;0;382653;7,75;;Q;15;;
-3;0;Murdlin, Mr. Joseph;male;;0;0;A./5. 3235;8,05;;S;;;
-3;1;"Murphy, Miss. Katherine ""Kate""";female;;1;0;367230;15,5;;Q;16;;
-3;1;Murphy, Miss. Margaret Jane;female;;1;0;367230;15,5;;Q;16;;
-3;1;Murphy, Miss. Nora;female;;0;0;36568;15,5;;Q;16;;
-3;0;Myhrman, Mr. Pehr Fabian Oliver Malkolm;male;18;0;0;347078;7,75;;S;;;
-3;0;Naidenoff, Mr. Penko;male;22;0;0;349206;7,8958;;S;;;
-3;1;"Najib, Miss. Adele Kiamie ""Jane""";female;15;0;0;2667;7,225;;C;C;;
-3;1;"Nakid, Miss. Maria (""Mary"")";female;1;0;2;2653;15,7417;;C;C;;
-3;1;Nakid, Mr. Sahid;male;20;1;1;2653;15,7417;;C;C;;
-3;1;"Nakid, Mrs. Said (Waika ""Mary"" Mowad)";female;19;1;1;2653;15,7417;;C;C;;
-3;0;Nancarrow, Mr. William Henry;male;33;0;0;A./5. 3338;8,05;;S;;;
-3;0;Nankoff, Mr. Minko;male;;0;0;349218;7,8958;;S;;;
-3;0;Nasr, Mr. Mustafa;male;;0;0;2652;7,2292;;C;;;
-3;0;Naughton, Miss. Hannah;female;;0;0;365237;7,75;;Q;;;
-3;0;Nenkoff, Mr. Christo;male;;0;0;349234;7,8958;;S;;;
-3;1;Nicola-Yarred, Master. Elias;male;12;1;0;2651;11,2417;;C;C;;
-3;1;Nicola-Yarred, Miss. Jamila;female;14;1;0;2651;11,2417;;C;C;;
-3;0;Nieminen, Miss. Manta Josefina;female;29;0;0;3101297;7,925;;S;;;
-3;0;Niklasson, Mr. Samuel;male;28;0;0;363611;8,05;;S;;;
-3;1;Nilsson, Miss. Berta Olivia;female;18;0;0;347066;7,775;;S;D;;
-3;1;Nilsson, Miss. Helmina Josefina;female;26;0;0;347470;7,8542;;S;13;;
-3;0;Nilsson, Mr. August Ferdinand;male;21;0;0;350410;7,8542;;S;;;
-3;0;Nirva, Mr. Iisakki Antino Aijo;male;41;0;0;SOTON/O2 3101272;7,125;;S;;;Finland Sudbury, ON
-3;1;Niskanen, Mr. Juha;male;39;0;0;STON/O 2. 3101289;7,925;;S;9;;
-3;0;Nosworthy, Mr. Richard Cater;male;21;0;0;A/4. 39886;7,8;;S;;;
-3;0;Novel, Mr. Mansouer;male;28,5;0;0;2697;7,2292;;C;;181;
-3;1;Nysten, Miss. Anna Sofia;female;22;0;0;347081;7,75;;S;13;;
-3;0;Nysveen, Mr. Johan Hansen;male;61;0;0;345364;6,2375;;S;;;
-3;0;O'Brien, Mr. Thomas;male;;1;0;370365;15,5;;Q;;;
-3;0;O'Brien, Mr. Timothy;male;;0;0;330979;7,8292;;Q;;;
-3;1;"O'Brien, Mrs. Thomas (Johanna ""Hannah"" Godfrey)";female;;1;0;370365;15,5;;Q;;;
-3;0;O'Connell, Mr. Patrick D;male;;0;0;334912;7,7333;;Q;;;
-3;0;O'Connor, Mr. Maurice;male;;0;0;371060;7,75;;Q;;;
-3;0;O'Connor, Mr. Patrick;male;;0;0;366713;7,75;;Q;;;
-3;0;Odahl, Mr. Nils Martin;male;23;0;0;7267;9,225;;S;;;
-3;0;O'Donoghue, Ms. Bridget;female;;0;0;364856;7,75;;Q;;;
-3;1;O'Driscoll, Miss. Bridget;female;;0;0;14311;7,75;;Q;D;;
-3;1;"O'Dwyer, Miss. Ellen ""Nellie""";female;;0;0;330959;7,8792;;Q;;;
-3;1;Ohman, Miss. Velin;female;22;0;0;347085;7,775;;S;C;;
-3;1;O'Keefe, Mr. Patrick;male;;0;0;368402;7,75;;Q;B;;
-3;1;"O'Leary, Miss. Hanora ""Norah""";female;;0;0;330919;7,8292;;Q;13;;
-3;1;Olsen, Master. Artur Karl;male;9;0;1;C 17368;3,1708;;S;13;;
-3;0;Olsen, Mr. Henry Margido;male;28;0;0;C 4001;22,525;;S;;173;
-3;0;Olsen, Mr. Karl Siegwart Andreas;male;42;0;1;4579;8,4042;;S;;;
-3;0;Olsen, Mr. Ole Martin;male;;0;0;Fa 265302;7,3125;;S;;;
-3;0;Olsson, Miss. Elina;female;31;0;0;350407;7,8542;;S;;;
-3;0;Olsson, Mr. Nils Johan Goransson;male;28;0;0;347464;7,8542;;S;;;
-3;1;Olsson, Mr. Oscar Wilhelm;male;32;0;0;347079;7,775;;S;A;;
-3;0;Olsvigen, Mr. Thor Anderson;male;20;0;0;6563;9,225;;S;;89;Oslo, Norway Cameron, WI
-3;0;Oreskovic, Miss. Jelka;female;23;0;0;315085;8,6625;;S;;;
-3;0;Oreskovic, Miss. Marija;female;20;0;0;315096;8,6625;;S;;;
-3;0;Oreskovic, Mr. Luka;male;20;0;0;315094;8,6625;;S;;;
-3;0;Osen, Mr. Olaf Elon;male;16;0;0;7534;9,2167;;S;;;
-3;1;Osman, Mrs. Mara;female;31;0;0;349244;8,6833;;S;;;
-3;0;O'Sullivan, Miss. Bridget Mary;female;;0;0;330909;7,6292;;Q;;;
-3;0;Palsson, Master. Gosta Leonard;male;2;3;1;349909;21,075;;S;;4;
-3;0;Palsson, Master. Paul Folke;male;6;3;1;349909;21,075;;S;;;
-3;0;Palsson, Miss. Stina Viola;female;3;3;1;349909;21,075;;S;;;
-3;0;Palsson, Miss. Torborg Danira;female;8;3;1;349909;21,075;;S;;;
-3;0;Palsson, Mrs. Nils (Alma Cornelia Berglund);female;29;0;4;349909;21,075;;S;;206;
-3;0;Panula, Master. Eino Viljami;male;1;4;1;3101295;39,6875;;S;;;
-3;0;Panula, Master. Juha Niilo;male;7;4;1;3101295;39,6875;;S;;;
-3;0;Panula, Master. Urho Abraham;male;2;4;1;3101295;39,6875;;S;;;
-3;0;Panula, Mr. Ernesti Arvid;male;16;4;1;3101295;39,6875;;S;;;
-3;0;Panula, Mr. Jaako Arnold;male;14;4;1;3101295;39,6875;;S;;;
-3;0;Panula, Mrs. Juha (Maria Emilia Ojala);female;41;0;5;3101295;39,6875;;S;;;
-3;0;Pasic, Mr. Jakob;male;21;0;0;315097;8,6625;;S;;;
-3;0;Patchett, Mr. George;male;19;0;0;358585;14,5;;S;;;
-3;0;Paulner, Mr. Uscher;male;;0;0;3411;8,7125;;C;;;
-3;0;Pavlovic, Mr. Stefo;male;32;0;0;349242;7,8958;;S;;;
-3;0;Peacock, Master. Alfred Edward;male;0,75;1;1;SOTON/O.Q. 3101315;13,775;;S;;;
-3;0;Peacock, Miss. Treasteall;female;3;1;1;SOTON/O.Q. 3101315;13,775;;S;;;
-3;0;Peacock, Mrs. Benjamin (Edith Nile);female;26;0;2;SOTON/O.Q. 3101315;13,775;;S;;;
-3;0;Pearce, Mr. Ernest;male;;0;0;343271;7;;S;;;
-3;0;Pedersen, Mr. Olaf;male;;0;0;345498;7,775;;S;;;
-3;0;Peduzzi, Mr. Joseph;male;;0;0;A/5 2817;8,05;;S;;;
-3;0;Pekoniemi, Mr. Edvard;male;21;0;0;STON/O 2. 3101294;7,925;;S;;;
-3;0;Peltomaki, Mr. Nikolai Johannes;male;25;0;0;STON/O 2. 3101291;7,925;;S;;;
-3;0;Perkin, Mr. John Henry;male;22;0;0;A/5 21174;7,25;;S;;;
-3;1;Persson, Mr. Ernst Ulrik;male;25;1;0;347083;7,775;;S;15;;
-3;1;Peter, Master. Michael J;male;;1;1;2668;22,3583;;C;C;;
-3;1;Peter, Miss. Anna;female;;1;1;2668;22,3583;F E69;C;D;;
-3;1;Peter, Mrs. Catherine (Catherine Rizk);female;;0;2;2668;22,3583;;C;D;;
-3;0;Peters, Miss. Katie;female;;0;0;330935;8,1375;;Q;;;
-3;0;Petersen, Mr. Marius;male;24;0;0;342441;8,05;;S;;;
-3;0;Petranec, Miss. Matilda;female;28;0;0;349245;7,8958;;S;;;
-3;0;Petroff, Mr. Nedelio;male;19;0;0;349212;7,8958;;S;;;
-3;0;"Petroff, Mr. Pastcho (""Pentcho"")";male;;0;0;349215;7,8958;;S;;;
-3;0;Petterson, Mr. Johan Emil;male;25;1;0;347076;7,775;;S;;;
-3;0;Pettersson, Miss. Ellen Natalia;female;18;0;0;347087;7,775;;S;;;
-3;1;Pickard, Mr. Berk (Berk Trembisky);male;32;0;0;SOTON/O.Q. 392078;8,05;E10;S;9;;
-3;0;Plotcharsky, Mr. Vasil;male;;0;0;349227;7,8958;;S;;;
-3;0;Pokrnic, Mr. Mate;male;17;0;0;315095;8,6625;;S;;;
-3;0;Pokrnic, Mr. Tome;male;24;0;0;315092;8,6625;;S;;;
-3;0;Radeff, Mr. Alexander;male;;0;0;349223;7,8958;;S;;;
-3;0;Rasmussen, Mrs. (Lena Jacobsen Solvang);female;;0;0;65305;8,1125;;S;;;
-3;0;Razi, Mr. Raihed;male;;0;0;2629;7,2292;;C;;;
-3;0;Reed, Mr. James George;male;;0;0;362316;7,25;;S;;;
-3;0;Rekic, Mr. Tido;male;38;0;0;349249;7,8958;;S;;;
-3;0;Reynolds, Mr. Harold J;male;21;0;0;342684;8,05;;S;;;
-3;0;Rice, Master. Albert;male;10;4;1;382652;29,125;;Q;;;
-3;0;Rice, Master. Arthur;male;4;4;1;382652;29,125;;Q;;;
-3;0;Rice, Master. Eric;male;7;4;1;382652;29,125;;Q;;;
-3;0;Rice, Master. Eugene;male;2;4;1;382652;29,125;;Q;;;
-3;0;Rice, Master. George Hugh;male;8;4;1;382652;29,125;;Q;;;
-3;0;Rice, Mrs. William (Margaret Norton);female;39;0;5;382652;29,125;;Q;;327;
-3;0;"Riihivouri, Miss. Susanna Juhantytar ""Sanni""";female;22;0;0;3101295;39,6875;;S;;;
-3;0;Rintamaki, Mr. Matti;male;35;0;0;STON/O 2. 3101273;7,125;;S;;;
-3;1;"Riordan, Miss. Johanna ""Hannah""";female;;0;0;334915;7,7208;;Q;13;;
-3;0;Risien, Mr. Samuel Beard;male;;0;0;364498;14,5;;S;;;
-3;0;Risien, Mrs. Samuel (Emma);female;;0;0;364498;14,5;;S;;;
-3;0;Robins, Mr. Alexander A;male;50;1;0;A/5. 3337;14,5;;S;;119;
-3;0;Robins, Mrs. Alexander A (Grace Charity Laury);female;47;1;0;A/5. 3337;14,5;;S;;7;
-3;0;Rogers, Mr. William John;male;;0;0;S.C./A.4. 23567;8,05;;S;;;
-3;0;Rommetvedt, Mr. Knud Paust;male;;0;0;312993;7,775;;S;;;
-3;0;Rosblom, Miss. Salli Helena;female;2;1;1;370129;20,2125;;S;;;
-3;0;Rosblom, Mr. Viktor Richard;male;18;1;1;370129;20,2125;;S;;;
-3;0;Rosblom, Mrs. Viktor (Helena Wilhelmina);female;41;0;2;370129;20,2125;;S;;;
-3;1;Roth, Miss. Sarah A;female;;0;0;342712;8,05;;S;C;;
-3;0;Rouse, Mr. Richard Henry;male;50;0;0;A/5 3594;8,05;;S;;;
-3;0;Rush, Mr. Alfred George John;male;16;0;0;A/4. 20589;8,05;;S;;;
-3;1;Ryan, Mr. Edward;male;;0;0;383162;7,75;;Q;14;;
-3;0;Ryan, Mr. Patrick;male;;0;0;371110;24,15;;Q;;;
-3;0;Saad, Mr. Amin;male;;0;0;2671;7,2292;;C;;;
-3;0;Saad, Mr. Khalil;male;25;0;0;2672;7,225;;C;;;
-3;0;Saade, Mr. Jean Nassr;male;;0;0;2676;7,225;;C;;;
-3;0;Sadlier, Mr. Matthew;male;;0;0;367655;7,7292;;Q;;;
-3;0;Sadowitz, Mr. Harry;male;;0;0;LP 1588;7,575;;S;;;
-3;0;Saether, Mr. Simon Sivertsen;male;38,5;0;0;SOTON/O.Q. 3101262;7,25;;S;;32;
-3;0;Sage, Master. Thomas Henry;male;;8;2;CA. 2343;69,55;;S;;;
-3;0;Sage, Master. William Henry;male;14,5;8;2;CA. 2343;69,55;;S;;67;
-3;0;Sage, Miss. Ada;female;;8;2;CA. 2343;69,55;;S;;;
-3;0;Sage, Miss. Constance Gladys;female;;8;2;CA. 2343;69,55;;S;;;
-3;0;"Sage, Miss. Dorothy Edith ""Dolly""";female;;8;2;CA. 2343;69,55;;S;;;
-3;0;Sage, Miss. Stella Anna;female;;8;2;CA. 2343;69,55;;S;;;
-3;0;Sage, Mr. Douglas Bullen;male;;8;2;CA. 2343;69,55;;S;;;
-3;0;Sage, Mr. Frederick;male;;8;2;CA. 2343;69,55;;S;;;
-3;0;Sage, Mr. George John Jr;male;;8;2;CA. 2343;69,55;;S;;;
-3;0;Sage, Mr. John George;male;;1;9;CA. 2343;69,55;;S;;;
-3;0;Sage, Mrs. John (Annie Bullen);female;;1;9;CA. 2343;69,55;;S;;;
-3;0;Salander, Mr. Karl Johan;male;24;0;0;7266;9,325;;S;;;
-3;1;Salkjelsvik, Miss. Anna Kristine;female;21;0;0;343120;7,65;;S;C;;
-3;0;Salonen, Mr. Johan Werner;male;39;0;0;3101296;7,925;;S;;;
-3;0;Samaan, Mr. Elias;male;;2;0;2662;21,6792;;C;;;
-3;0;Samaan, Mr. Hanna;male;;2;0;2662;21,6792;;C;;;
-3;0;Samaan, Mr. Youssef;male;;2;0;2662;21,6792;;C;;;
-3;1;Sandstrom, Miss. Beatrice Irene;female;1;1;1;PP 9549;16,7;G6;S;13;;
-3;1;Sandstrom, Mrs. Hjalmar (Agnes Charlotta Bengtsson);female;24;0;2;PP 9549;16,7;G6;S;13;;
-3;1;Sandstrom, Miss. Marguerite Rut;female;4;1;1;PP 9549;16,7;G6;S;13;;
-3;1;Sap, Mr. Julius;male;25;0;0;345768;9,5;;S;11;;
-3;0;Saundercock, Mr. William Henry;male;20;0;0;A/5. 2151;8,05;;S;;;
-3;0;Sawyer, Mr. Frederick Charles;male;24,5;0;0;342826;8,05;;S;;284;
-3;0;Scanlan, Mr. James;male;;0;0;36209;7,725;;Q;;;
-3;0;Sdycoff, Mr. Todor;male;;0;0;349222;7,8958;;S;;;
-3;0;Shaughnessy, Mr. Patrick;male;;0;0;370374;7,75;;Q;;;
-3;1;Sheerlinck, Mr. Jan Baptist;male;29;0;0;345779;9,5;;S;11;;
-3;0;Shellard, Mr. Frederick William;male;;0;0;C.A. 6212;15,1;;S;;;
-3;1;Shine, Miss. Ellen Natalia;female;;0;0;330968;7,7792;;Q;;;
-3;0;Shorney, Mr. Charles Joseph;male;;0;0;374910;8,05;;S;;;
-3;0;Simmons, Mr. John;male;;0;0;SOTON/OQ 392082;8,05;;S;;;
-3;0;Sirayanian, Mr. Orsen;male;22;0;0;2669;7,2292;;C;;;
-3;0;Sirota, Mr. Maurice;male;;0;0;392092;8,05;;S;;;
-3;0;Sivic, Mr. Husein;male;40;0;0;349251;7,8958;;S;;;
-3;0;Sivola, Mr. Antti Wilhelm;male;21;0;0;STON/O 2. 3101280;7,925;;S;;;
-3;1;Sjoblom, Miss. Anna Sofia;female;18;0;0;3101265;7,4958;;S;16;;
-3;0;Skoog, Master. Harald;male;4;3;2;347088;27,9;;S;;;
-3;0;Skoog, Master. Karl Thorsten;male;10;3;2;347088;27,9;;S;;;
-3;0;Skoog, Miss. Mabel;female;9;3;2;347088;27,9;;S;;;
-3;0;Skoog, Miss. Margit Elizabeth;female;2;3;2;347088;27,9;;S;;;
-3;0;Skoog, Mr. Wilhelm;male;40;1;4;347088;27,9;;S;;;
-3;0;Skoog, Mrs. William (Anna Bernhardina Karlsson);female;45;1;4;347088;27,9;;S;;;
-3;0;Slabenoff, Mr. Petco;male;;0;0;349214;7,8958;;S;;;
-3;0;Slocovski, Mr. Selman Francis;male;;0;0;SOTON/OQ 392086;8,05;;S;;;
-3;0;Smiljanic, Mr. Mile;male;;0;0;315037;8,6625;;S;;;
-3;0;Smith, Mr. Thomas;male;;0;0;384461;7,75;;Q;;;
-3;1;Smyth, Miss. Julia;female;;0;0;335432;7,7333;;Q;13;;
-3;0;Soholt, Mr. Peter Andreas Lauritz Andersen;male;19;0;0;348124;7,65;F G73;S;;;
-3;0;Somerton, Mr. Francis William;male;30;0;0;A.5. 18509;8,05;;S;;;
-3;0;Spector, Mr. Woolf;male;;0;0;A.5. 3236;8,05;;S;;;
-3;0;Spinner, Mr. Henry John;male;32;0;0;STON/OQ. 369943;8,05;;S;;;
-3;0;Staneff, Mr. Ivan;male;;0;0;349208;7,8958;;S;;;
-3;0;Stankovic, Mr. Ivan;male;33;0;0;349239;8,6625;;C;;;
-3;1;Stanley, Miss. Amy Zillah Elsie;female;23;0;0;CA. 2314;7,55;;S;C;;
-3;0;Stanley, Mr. Edward Roland;male;21;0;0;A/4 45380;8,05;;S;;;
-3;0;Storey, Mr. Thomas;male;60,5;0;0;3701;;;S;;261;
-3;0;Stoytcheff, Mr. Ilia;male;19;0;0;349205;7,8958;;S;;;
-3;0;Strandberg, Miss. Ida Sofia;female;22;0;0;7553;9,8375;;S;;;
-3;1;Stranden, Mr. Juho;male;31;0;0;STON/O 2. 3101288;7,925;;S;9;;
-3;0;Strilic, Mr. Ivan;male;27;0;0;315083;8,6625;;S;;;
-3;0;Strom, Miss. Telma Matilda;female;2;0;1;347054;10,4625;G6;S;;;
-3;0;Strom, Mrs. Wilhelm (Elna Matilda Persson);female;29;1;1;347054;10,4625;G6;S;;;
-3;1;Sunderland, Mr. Victor Francis;male;16;0;0;SOTON/OQ 392089;8,05;;S;B;;
-3;1;Sundman, Mr. Johan Julian;male;44;0;0;STON/O 2. 3101269;7,925;;S;15;;
-3;0;Sutehall, Mr. Henry Jr;male;25;0;0;SOTON/OQ 392076;7,05;;S;;;
-3;0;Svensson, Mr. Johan;male;74;0;0;347060;7,775;;S;;;
-3;1;Svensson, Mr. Johan Cervin;male;14;0;0;7538;9,225;;S;13;;
-3;0;Svensson, Mr. Olof;male;24;0;0;350035;7,7958;;S;;;
-3;1;Tenglin, Mr. Gunnar Isidor;male;25;0;0;350033;7,7958;;S;13 15;;
-3;0;Theobald, Mr. Thomas Leonard;male;34;0;0;363294;8,05;;S;;176;
-3;1;Thomas, Master. Assad Alexander;male;0,4167;0;1;2625;8,5167;;C;16;;
-3;0;Thomas, Mr. Charles P;male;;1;0;2621;6,4375;;C;;;
-3;0;Thomas, Mr. John;male;;0;0;2681;6,4375;;C;;;
-3;0;Thomas, Mr. Tannous;male;;0;0;2684;7,225;;C;;;
-3;1;"Thomas, Mrs. Alexander (Thamine ""Thelma"")";female;16;1;1;2625;8,5167;;C;14;;
-3;0;Thomson, Mr. Alexander Morrison;male;;0;0;32302;8,05;;S;;;
-3;0;Thorneycroft, Mr. Percival;male;;1;0;376564;16,1;;S;;;
-3;1;Thorneycroft, Mrs. Percival (Florence Kate White);female;;1;0;376564;16,1;;S;10;;
-3;0;Tikkanen, Mr. Juho;male;32;0;0;STON/O 2. 3101293;7,925;;S;;;
-3;0;Tobin, Mr. Roger;male;;0;0;383121;7,75;F38;Q;;;
-3;0;Todoroff, Mr. Lalio;male;;0;0;349216;7,8958;;S;;;
-3;0;Tomlin, Mr. Ernest Portage;male;30,5;0;0;364499;8,05;;S;;50;
-3;0;Torber, Mr. Ernst William;male;44;0;0;364511;8,05;;S;;;
-3;0;Torfa, Mr. Assad;male;;0;0;2673;7,2292;;C;;;
-3;1;Tornquist, Mr. William Henry;male;25;0;0;LINE;0;;S;15;;
-3;0;Toufik, Mr. Nakli;male;;0;0;2641;7,2292;;C;;;
-3;1;Touma, Master. Georges Youssef;male;7;1;1;2650;15,2458;;C;C;;
-3;1;Touma, Miss. Maria Youssef;female;9;1;1;2650;15,2458;;C;C;;
-3;1;Touma, Mrs. Darwis (Hanne Youssef Razi);female;29;0;2;2650;15,2458;;C;C;;
-3;0;Turcin, Mr. Stjepan;male;36;0;0;349247;7,8958;;S;;;
-3;1;Turja, Miss. Anna Sofia;female;18;0;0;4138;9,8417;;S;15;;
-3;1;Turkula, Mrs. (Hedwig);female;63;0;0;4134;9,5875;;S;15;;
-3;0;van Billiard, Master. James William;male;;1;1;A/5. 851;14,5;;S;;;
-3;0;van Billiard, Master. Walter John;male;11,5;1;1;A/5. 851;14,5;;S;;1;
-3;0;van Billiard, Mr. Austin Blyler;male;40,5;0;2;A/5. 851;14,5;;S;;255;
-3;0;Van Impe, Miss. Catharina;female;10;0;2;345773;24,15;;S;;;
-3;0;Van Impe, Mr. Jean Baptiste;male;36;1;1;345773;24,15;;S;;;
-3;0;Van Impe, Mrs. Jean Baptiste (Rosalie Paula Govaert);female;30;1;1;345773;24,15;;S;;;
-3;0;van Melkebeke, Mr. Philemon;male;;0;0;345777;9,5;;S;;;
-3;0;Vande Velde, Mr. Johannes Joseph;male;33;0;0;345780;9,5;;S;;;
-3;0;Vande Walle, Mr. Nestor Cyriel;male;28;0;0;345770;9,5;;S;;;
-3;0;Vanden Steen, Mr. Leo Peter;male;28;0;0;345783;9,5;;S;;;
-3;0;Vander Cruyssen, Mr. Victor;male;47;0;0;345765;9;;S;;;
-3;0;Vander Planke, Miss. Augusta Maria;female;18;2;0;345764;18;;S;;;
-3;0;Vander Planke, Mr. Julius;male;31;3;0;345763;18;;S;;;
-3;0;Vander Planke, Mr. Leo Edmondus;male;16;2;0;345764;18;;S;;;
-3;0;Vander Planke, Mrs. Julius (Emelia Maria Vandemoortele);female;31;1;0;345763;18;;S;;;
-3;1;Vartanian, Mr. David;male;22;0;0;2658;7,225;;C;13 15;;
-3;0;Vendel, Mr. Olof Edvin;male;20;0;0;350416;7,8542;;S;;;
-3;0;Vestrom, Miss. Hulda Amanda Adolfina;female;14;0;0;350406;7,8542;;S;;;
-3;0;Vovk, Mr. Janko;male;22;0;0;349252;7,8958;;S;;;
-3;0;Waelens, Mr. Achille;male;22;0;0;345767;9;;S;;;Antwerp, Belgium / Stanton, OH
-3;0;Ware, Mr. Frederick;male;;0;0;359309;8,05;;S;;;
-3;0;Warren, Mr. Charles William;male;;0;0;C.A. 49867;7,55;;S;;;
-3;0;Webber, Mr. James;male;;0;0;SOTON/OQ 3101316;8,05;;S;;;
-3;0;Wenzel, Mr. Linhart;male;32,5;0;0;345775;9,5;;S;;298;
-3;1;Whabee, Mrs. George Joseph (Shawneene Abi-Saab);female;38;0;0;2688;7,2292;;C;C;;
-3;0;Widegren, Mr. Carl/Charles Peter;male;51;0;0;347064;7,75;;S;;;
-3;0;Wiklund, Mr. Jakob Alfred;male;18;1;0;3101267;6,4958;;S;;314;
-3;0;Wiklund, Mr. Karl Johan;male;21;1;0;3101266;6,4958;;S;;;
-3;1;Wilkes, Mrs. James (Ellen Needs);female;47;1;0;363272;7;;S;;;
-3;0;"Willer, Mr. Aaron (""Abi Weller"")";male;;0;0;3410;8,7125;;S;;;
-3;0;Willey, Mr. Edward;male;;0;0;S.O./P.P. 751;7,55;;S;;;
-3;0;"Williams, Mr. Howard Hugh ""Harry""";male;;0;0;A/5 2466;8,05;;S;;;
-3;0;Williams, Mr. Leslie;male;28,5;0;0;54636;16,1;;S;;14;
-3;0;Windelov, Mr. Einar;male;21;0;0;SOTON/OQ 3101317;7,25;;S;;;
-3;0;Wirz, Mr. Albert;male;27;0;0;315154;8,6625;;S;;131;
-3;0;Wiseman, Mr. Phillippe;male;;0;0;A/4. 34244;7,25;;S;;;
-3;0;Wittevrongel, Mr. Camille;male;36;0;0;345771;9,5;;S;;;
-3;0;Yasbeck, Mr. Antoni;male;27;1;0;2659;14,4542;;C;C;;
-3;1;Yasbeck, Mrs. Antoni (Selini Alexander);female;15;1;0;2659;14,4542;;C;;;
-3;0;Youseff, Mr. Gerious;male;45,5;0;0;2628;7,225;;C;;312;
-3;0;Yousif, Mr. Wazli;male;;0;0;2647;7,225;;C;;;
-3;0;Yousseff, Mr. Gerious;male;;0;0;2627;14,4583;;C;;;
-3;0;Zabour, Miss. Hileni;female;14,5;1;0;2665;14,4542;;C;;328;
-3;0;Zabour, Miss. Thamine;female;;1;0;2665;14,4542;;C;;;
-3;0;Zakarian, Mr. Mapriededer;male;26,5;0;0;2656;7,225;;C;;304;
-3;0;Zakarian, Mr. Ortin;male;27;0;0;2670;7,225;;C;;;
-3;0;Zimmerman, Mr. Leo;male;29;0;0;315082;7,875;;S;;;
diff --git a/modules/ml/src/test/java/org/apache/ignite/ml/IgniteMLTestSuite.java b/modules/ml/src/test/java/org/apache/ignite/ml/IgniteMLTestSuite.java
index c82d5de..b613ade 100644
--- a/modules/ml/src/test/java/org/apache/ignite/ml/IgniteMLTestSuite.java
+++ b/modules/ml/src/test/java/org/apache/ignite/ml/IgniteMLTestSuite.java
@@ -22,7 +22,6 @@
 import org.apache.ignite.ml.composition.CompositionTestSuite;
 import org.apache.ignite.ml.dataset.DatasetTestSuite;
 import org.apache.ignite.ml.environment.EnvironmentTestSuite;
-import org.apache.ignite.ml.genetic.GAGridTestSuite;
 import org.apache.ignite.ml.inference.InferenceTestSuite;
 import org.apache.ignite.ml.knn.KNNTestSuite;
 import org.apache.ignite.ml.math.MathImplMainTestSuite;
@@ -55,7 +54,6 @@
     KNNTestSuite.class,
     PipelineTestSuite.class,
     PreprocessingTestSuite.class,
-    GAGridTestSuite.class,
     CompositionTestSuite.class,
     EnvironmentTestSuite.class,
     StructuresTestSuite.class,
diff --git a/modules/ml/src/test/java/org/apache/ignite/ml/genetic/GAGridCalculateFitnessTest.java b/modules/ml/src/test/java/org/apache/ignite/ml/genetic/GAGridCalculateFitnessTest.java
deleted file mode 100644
index fa05bad..0000000
--- a/modules/ml/src/test/java/org/apache/ignite/ml/genetic/GAGridCalculateFitnessTest.java
+++ /dev/null
@@ -1,145 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package org.apache.ignite.ml.genetic;
-
-import java.util.ArrayList;
-import java.util.List;
-import org.apache.ignite.Ignite;
-import org.apache.ignite.IgniteCache;
-import org.apache.ignite.Ignition;
-import org.apache.ignite.cache.query.QueryCursor;
-import org.apache.ignite.cache.query.SqlFieldsQuery;
-import org.apache.ignite.ml.genetic.parameter.GAConfiguration;
-import org.apache.ignite.ml.genetic.parameter.GAGridConstants;
-import org.junit.After;
-import org.junit.Before;
-import org.junit.Test;
-
-import static org.junit.Assert.assertEquals;
-
-/**
- * Calculate Fitness Test
- */
-public class GAGridCalculateFitnessTest {
-    /** Ignite instance */
-    private Ignite ignite;
-
-    /** GAGrid **/
-    private GAGrid gaGrid;
-
-    /** GAConfiguration */
-    private GAConfiguration gaCfg;
-
-    /**
-     * Setup test
-     */
-    @Before
-    public void initialize() {
-
-        try {
-
-            // Create an Ignite instance as you would in any other use case.
-            ignite = Ignition.start();
-
-            // Create GAConfiguration
-            gaCfg = new GAConfiguration();
-
-            // set Gene Pool
-            List<Gene> genes = this.getGenePool();
-            gaCfg.setGenePool(genes);
-
-            // set the Chromosome Length to '8' since password contains 8 characters.
-            gaCfg.setChromosomeLen(8);
-
-            // create and set Fitness function
-            PasswordFitnessFunction function = new PasswordFitnessFunction();
-            gaCfg.setFitnessFunction(function);
-
-            gaGrid = new GAGrid(gaCfg, ignite);
-            gaGrid.initializeGenePopulation();
-            gaGrid.initializePopulation();
-
-        }
-        catch (Exception e) {
-            System.out.println(e.getMessage());
-        }
-    }
-
-    /**
-     * Test Calculate Fitness
-     */
-    @Test
-    public void testCalculateFitness() {
-        try {
-
-            List<Long> chromosomeKeys = gaGrid.getPopulationKeys();
-
-            Boolean boolVal = this.ignite.compute().execute(new FitnessTask(this.gaCfg), chromosomeKeys);
-
-            IgniteCache<Long, Chromosome> populationCache = ignite.cache(GAGridConstants.POPULATION_CACHE);
-
-            String sql = "select count(*) from Chromosome where fitnessScore>0";
-
-            // Execute query to keys for ALL Chromosomes by fitnessScore
-            QueryCursor<List<?>> cursor = populationCache.query(new SqlFieldsQuery(sql));
-
-            List<List<?>> res = cursor.getAll();
-
-            Long cnt = 0L;
-
-            for (List row : res)
-                cnt = (Long)row.get(0);
-
-            assertEquals(500, cnt.longValue());
-        }
-
-        catch (Exception e) {
-            System.out.println(e.getMessage());
-        }
-    }
-
-    /**
-     * Helper routine to initialize Gene pool
-     *
-     * @return List of Genes
-     */
-    private List<Gene> getGenePool() {
-        List<Gene> list = new ArrayList();
-
-        char[] chars = {
-            'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's',
-            't', 'u', 'v', 'w', 'x', 'y', 'z', 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S',
-            'T', 'U', 'V', 'W', 'X', 'Y', 'Z', '1', '2', '3', '4', '5', '6', '7', '8', '!', '"', '#', '$', '%', '&', '(', ')', '*', '+', '-', '.', '/', ':', ';', '<', '=', '>', '?', '@', '[', ']', '^'};
-
-        for (int i = 0; i < chars.length; i++) {
-            Gene gene = new Gene(chars[i]);
-            list.add(gene);
-        }
-        return list;
-    }
-
-    /**
-     * Stop the Ignite.
-     */
-    @After
-    public void tearDown() {
-
-        Ignition.stop(true);
-        ignite = null;
-    }
-}
diff --git a/modules/ml/src/test/java/org/apache/ignite/ml/genetic/GAGridInitializePopulationTest.java b/modules/ml/src/test/java/org/apache/ignite/ml/genetic/GAGridInitializePopulationTest.java
deleted file mode 100644
index 1fd0538..0000000
--- a/modules/ml/src/test/java/org/apache/ignite/ml/genetic/GAGridInitializePopulationTest.java
+++ /dev/null
@@ -1,162 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package org.apache.ignite.ml.genetic;
-
-import java.util.ArrayList;
-import java.util.List;
-import org.apache.ignite.Ignite;
-import org.apache.ignite.IgniteCache;
-import org.apache.ignite.Ignition;
-import org.apache.ignite.cache.query.QueryCursor;
-import org.apache.ignite.cache.query.SqlFieldsQuery;
-import org.apache.ignite.ml.genetic.parameter.GAConfiguration;
-import org.apache.ignite.ml.genetic.parameter.GAGridConstants;
-import org.junit.After;
-import org.junit.Before;
-import org.junit.Test;
-
-import static org.junit.Assert.assertEquals;
-
-/**
- * Initialize Gene and Chromosome Test
- */
-public class GAGridInitializePopulationTest {
-    /** Ignite instance */
-    private Ignite ignite;
-
-    /** GAGrid **/
-    private GAGrid gaGrid;
-
-    /**
-     * Initialize the population.
-     */
-    @Before
-    public void initialize() {
-        try {
-
-            // Create an Ignite instance as you would in any other use case.
-            ignite = Ignition.start();
-
-            // Create GAConfiguration
-            /* GAConfiguraton */ /** GAConfiguraton */GAConfiguration gaCfg = new GAConfiguration();
-
-            // set Gene Pool
-            List<Gene> genes = this.getGenePool();
-
-            // set the Chromosome Length to '8' since password contains 8 characters.
-            gaCfg.setChromosomeLen(8);
-
-            gaCfg.setGenePool(genes);
-
-            gaGrid = new GAGrid(gaCfg, ignite);
-        }
-        catch (Exception e) {
-            System.out.println(e.getMessage());
-        }
-    }
-
-    /**
-     * Check the initialization of genes.
-     */
-    @Test
-    public void testInitializeGenes() {
-        try {
-            IgniteCache<Long, Gene> geneCache = ignite.cache(GAGridConstants.GENE_CACHE);
-            gaGrid.initializeGenePopulation();
-
-            String sql = "select count(*) from Gene";
-
-            // Execute query to keys for ALL Chromosomes by fittnessScore
-            QueryCursor<List<?>> cursor = geneCache.query(new SqlFieldsQuery(sql));
-
-            List<List<?>> res = cursor.getAll();
-
-            Long cnt = 0L;
-
-            for (List row : res)
-                cnt = (Long)row.get(0);
-
-            assertEquals(83, cnt.longValue());
-        }
-
-        catch (Exception e) {
-            System.out.println(e.getMessage());
-        }
-    }
-
-    /**
-     *
-     */
-    @Test
-    public void testInitializePopulation() {
-        try {
-
-            IgniteCache<Long, Chromosome> populationCache = ignite.cache(GAGridConstants.POPULATION_CACHE);
-
-            gaGrid.initializePopulation();
-
-            String sql = "select count(*) from Chromosome";
-
-            // Execute query to keys for ALL Chromosomes by fittnessScore
-            QueryCursor<List<?>> cursor = populationCache.query(new SqlFieldsQuery(sql));
-
-            List<List<?>> res = cursor.getAll();
-
-            Long cnt = 0L;
-
-            for (List row : res)
-                cnt = (Long)row.get(0);
-
-            assertEquals(500, cnt.longValue());
-        }
-
-        catch (Exception e) {
-            System.out.println(e.getMessage());
-        }
-    }
-
-    /**
-     * Helper routine to initialize Gene pool
-     *
-     * @return List of Genes
-     */
-    private List<Gene> getGenePool() {
-        List<Gene> list = new ArrayList();
-
-        char[] chars = {
-            'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's',
-            't', 'u', 'v', 'w', 'x', 'y', 'z', 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S',
-            'T', 'U', 'V', 'W', 'X', 'Y', 'Z', '1', '2', '3', '4', '5', '6', '7', '8', '!', '"', '#', '$', '%', '&', '(', ')', '*', '+', '-', '.', '/', ':', ';', '<', '=', '>', '?', '@', '[', ']', '^'};
-
-        for (int i = 0; i < chars.length; i++) {
-            Gene gene = new Gene(chars[i]);
-            list.add(gene);
-        }
-        return list;
-    }
-
-    /**
-     * Stop the Ignite.
-     */
-    @After
-    public void tearDown() {
-
-        Ignition.stop(true);
-        ignite = null;
-    }
-}
diff --git a/modules/ml/src/test/java/org/apache/ignite/ml/genetic/GAGridTestSuite.java b/modules/ml/src/test/java/org/apache/ignite/ml/genetic/GAGridTestSuite.java
deleted file mode 100644
index d7751fd..0000000
--- a/modules/ml/src/test/java/org/apache/ignite/ml/genetic/GAGridTestSuite.java
+++ /dev/null
@@ -1,33 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package org.apache.ignite.ml.genetic;
-
-import org.junit.runner.RunWith;
-import org.junit.runners.Suite;
-
-/**
- * Test suite for all tests located in org.apache.ignite.ml.genetic package.
- */
-@RunWith(Suite.class)
-@Suite.SuiteClasses({
-    GAGridInitializePopulationTest.class,
-    GAGridCalculateFitnessTest.class
-})
-
-public class GAGridTestSuite {
-}
diff --git a/modules/ml/src/test/java/org/apache/ignite/ml/genetic/PasswordFitnessFunction.java b/modules/ml/src/test/java/org/apache/ignite/ml/genetic/PasswordFitnessFunction.java
deleted file mode 100644
index cb5aa00..0000000
--- a/modules/ml/src/test/java/org/apache/ignite/ml/genetic/PasswordFitnessFunction.java
+++ /dev/null
@@ -1,55 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package org.apache.ignite.ml.genetic;
-
-import java.util.List;
-
-/**
- * PasswordFitnessFunction evaluates randomly generated passwords giving higher score to passwords with more special
- * characters.
- */
-public class PasswordFitnessFunction implements IFitnessFunction {
-    /**
-     * @param genes List of Genes within an individual Chromosome
-     * @return Fitness score
-     */
-    @Override public double evaluate(List<Gene> genes) {
-
-        double specialCCnt = 0;
-        double lowerCaseCnt = 0;
-        double upperCaseCnt = 0;
-
-        double fitness;
-        double specialCScore = 2;
-
-        for (Gene gene : genes) {
-            Character aCharacter = (Character)(gene.getVal());
-            if (Character.isUpperCase(aCharacter))
-                upperCaseCnt += 1;
-
-            else if (Character.isLowerCase(aCharacter))
-                lowerCaseCnt += 1;
-            else
-                specialCCnt += 1;
-        }
-
-        specialCCnt = specialCScore * specialCCnt;
-        fitness = upperCaseCnt + lowerCaseCnt + specialCCnt;
-        return fitness;
-    }
-}
diff --git a/modules/ml/tensorflow-model-parser/pom.xml b/modules/ml/tensorflow-model-parser/pom.xml
deleted file mode 100644
index adc8364..0000000
--- a/modules/ml/tensorflow-model-parser/pom.xml
+++ /dev/null
@@ -1,88 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-
-<!--
-  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.
--->
-<!--
-    POM file.
--->
-<project xmlns="http://maven.apache.org/POM/4.0.0"
-         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
-         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
-
-    <modelVersion>4.0.0</modelVersion>
-
-    <properties>
-        <tensorflow.version>1.12.0</tensorflow.version>
-    </properties>
-
-    <parent>
-        <artifactId>ignite-parent</artifactId>
-        <groupId>org.apache.ignite</groupId>
-        <version>1</version>
-        <relativePath>../../../parent</relativePath>
-    </parent>
-
-
-    <artifactId>ignite-ml-tensorflow-model-parser</artifactId>
-    <version>2.9.0-SNAPSHOT</version>
-    <url>http://ignite.apache.org</url>
-
-    <build>
-        <plugins>
-            <plugin>
-                <artifactId>maven-dependency-plugin</artifactId>
-                <executions>
-                    <execution>
-                        <id>copy-libs</id>
-                        <phase>package</phase>
-                        <goals>
-                            <goal>copy-dependencies</goal>
-                        </goals>
-                        <configuration>
-                            <excludeTransitive>false</excludeTransitive>
-                            <excludeArtifactIds>
-                                fastutil,h2,ignite-shmem,annotations,arpack_combined_all,
-                                cache-api,commons-math3,commons-rng-client-api,commons-rng-core,
-                                commons-rng-simple,core,ignite-ml
-                            </excludeArtifactIds>
-                        </configuration>
-                    </execution>
-                </executions>
-            </plugin>
-        </plugins>
-    </build>
-
-    <dependencies>
-        <dependency>
-            <groupId>org.apache.ignite</groupId>
-            <artifactId>ignite-ml</artifactId>
-            <version>${project.version}</version>
-        </dependency>
-
-        <dependency>
-            <groupId>org.tensorflow</groupId>
-            <artifactId>tensorflow</artifactId>
-            <version>${tensorflow.version}</version>
-        </dependency>
-
-        <dependency>
-            <groupId>org.tensorflow</groupId>
-            <artifactId>proto</artifactId>
-            <version>${tensorflow.version}</version>
-        </dependency>
-    </dependencies>
-</project>
diff --git a/modules/ml/tensorflow-model-parser/src/main/java/org/apache/ignite/ml/inference/parser/TensorFlowBaseModelParser.java b/modules/ml/tensorflow-model-parser/src/main/java/org/apache/ignite/ml/inference/parser/TensorFlowBaseModelParser.java
deleted file mode 100644
index b40486d..0000000
--- a/modules/ml/tensorflow-model-parser/src/main/java/org/apache/ignite/ml/inference/parser/TensorFlowBaseModelParser.java
+++ /dev/null
@@ -1,216 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package org.apache.ignite.ml.inference.parser;
-
-import java.io.Serializable;
-import java.util.HashMap;
-import java.util.Iterator;
-import java.util.List;
-import java.util.Map;
-import org.apache.ignite.ml.inference.Model;
-import org.tensorflow.Session;
-import org.tensorflow.Tensor;
-
-/**
- * Base class for TensorFlow model parsers. Contains the logic that is common for models saved as "SavedModel" and as a
- * simple graph.
- *
- * @param <I> Type of model input.
- * @param <O> Type of model output.
- */
-public abstract class TensorFlowBaseModelParser<I, O> implements ModelParser<I, O, Model<I, O>> {
-    /** */
-    private static final long serialVersionUID = 5574259553625871456L;
-
-    /** Map of input graph nodes (placeholders) and transformers that allow to transform input into tensor. */
-    private final Map<String, InputTransformer<I>> inputs = new HashMap<>();
-
-    /** List of output graph nodes. */
-    private List<String> outputNames;
-
-    /** Transformer that allows to transform tensors into output. */
-    private OutputTransformer<O> outputTransformer;
-
-    /** {@inheritDoc} */
-    @Override public Model<I, O> parse(byte[] mdl) {
-        return new TensorFlowInfModel(parseModel(mdl));
-    }
-
-    /**
-     * Parses model specified in serialized form as byte array.
-     *
-     * @param mdl Inference model in serialized form as byte array.
-     * @return TensorFlow session that encapsulates the TensorFlow graph parsed from serialized model.
-     */
-    public abstract Session parseModel(byte[] mdl);
-
-    /**
-     * Setter that allows to specify additional input graph node and correspondent transformer that allows to transform
-     * input into tensor.
-     *
-     * @param name Name of the input graph node.
-     * @param transformer Transformer that allows to transform input into tensor.
-     * @return This instance.
-     */
-    public TensorFlowBaseModelParser<I, O> withInput(String name, InputTransformer<I> transformer) {
-        if (inputs.containsKey(name))
-            throw new IllegalArgumentException("Inputs already contains specified name [name=" + name + "]");
-
-        inputs.put(name, transformer);
-
-        return this;
-    }
-
-    /**
-     * Setter that allows to specify output graph nodes and correspondent transformer that allow to transform tensors
-     * into output.
-     *
-     * @param names List of output graph node names.
-     * @param transformer Transformer that allow to transform tensors into output.
-     * @return This instance.
-     */
-    public TensorFlowBaseModelParser<I, O> withOutput(List<String> names, OutputTransformer<O> transformer) {
-        if (outputNames != null || outputTransformer != null)
-            throw new IllegalArgumentException("Outputs already specified");
-
-        outputNames = names;
-        outputTransformer = transformer;
-
-        return this;
-    }
-
-    /**
-     * Input transformer that accepts input and transforms it into tensor.
-     *
-     * @param <I> Type of model input.
-     */
-    @FunctionalInterface
-    public interface InputTransformer<I> extends Serializable {
-        /**
-         * Transforms input into tensor.
-         *
-         * @param input Input data.
-         * @return Tensor (transformed input data).
-         */
-        public Tensor<?> transform(I input);
-    }
-
-    /**
-     * Output transformer that accepts tensors and transforms them into output.
-     *
-     * @param <O> Type of model output.
-     */
-    @FunctionalInterface
-    public interface OutputTransformer<O> extends Serializable {
-        /**
-         * Transforms tensors into output.
-         *
-         * @param output Tensors.
-         * @return Output (transformed tensors).
-         */
-        public O transform(Map<String, Tensor<?>> output);
-    }
-
-    /**
-     * TensorFlow inference model based on pre-loaded graph and created session.
-     */
-    private class TensorFlowInfModel implements Model<I, O> {
-        /** TensorFlow session. */
-        private final Session ses;
-
-        /**
-         * Constructs a new instance of TensorFlow inference model.
-         *
-         * @param ses TensorFlow session.
-         */
-        TensorFlowInfModel(Session ses) {
-            this.ses = ses;
-        }
-
-        /** {@inheritDoc} */
-        @Override public O predict(I input) {
-            Session.Runner runner = ses.runner();
-
-            runner = feedAll(runner, input);
-            runner = fetchAll(runner);
-
-            List<Tensor<?>> prediction = runner.run();
-            Map<String, Tensor<?>> collectedPredictionTensors = indexTensors(prediction);
-
-            return outputTransformer.transform(collectedPredictionTensors);
-        }
-
-        /**
-         * Feeds input into graphs input nodes using input transformers (see {@link #inputs}).
-         *
-         * @param runner TensorFlow session runner.
-         * @param input Input.
-         * @return TensorFlow session runner.
-         */
-        private Session.Runner feedAll(Session.Runner runner, I input) {
-            for (Map.Entry<String, InputTransformer<I>> e : inputs.entrySet()) {
-                String opName = e.getKey();
-                InputTransformer<I> transformer = e.getValue();
-
-                runner = runner.feed(opName, transformer.transform(input));
-            }
-
-            return runner;
-        }
-
-        /**
-         * Specifies graph output nodes to be fetched using {@link #outputNames}.
-         *
-         * @param runner TensorFlow session runner.
-         * @return TensorFlow session runner.
-         */
-        private Session.Runner fetchAll(Session.Runner runner) {
-            for (String e : outputNames)
-                runner.fetch(e);
-
-            return runner;
-        }
-
-        /**
-         * Indexes tensors fetched from graph using {@link #outputNames}.
-         *
-         * @param tensors List of fetched tensors.
-         * @return Map of tensor name as a key and tensor as a value.
-         */
-        private Map<String, Tensor<?>> indexTensors(List<Tensor<?>> tensors) {
-            Map<String, Tensor<?>> collectedTensors = new HashMap<>();
-
-            Iterator<String> outputNamesIter = outputNames.iterator();
-            Iterator<Tensor<?>> tensorsIter = tensors.iterator();
-
-            while (outputNamesIter.hasNext() && tensorsIter.hasNext())
-                collectedTensors.put(outputNamesIter.next(), tensorsIter.next());
-
-            // We expect that output names and output tensors have the same size.
-            if (outputNamesIter.hasNext() || tensorsIter.hasNext())
-                throw new IllegalStateException("Outputs are incorrect");
-
-            return collectedTensors;
-        }
-
-        /** {@inheritDoc} */
-        @Override public void close() {
-            ses.close();
-        }
-    }
-}
diff --git a/modules/ml/tensorflow-model-parser/src/main/java/org/apache/ignite/ml/inference/parser/TensorFlowGraphModelParser.java b/modules/ml/tensorflow-model-parser/src/main/java/org/apache/ignite/ml/inference/parser/TensorFlowGraphModelParser.java
deleted file mode 100644
index dc1d99e..0000000
--- a/modules/ml/tensorflow-model-parser/src/main/java/org/apache/ignite/ml/inference/parser/TensorFlowGraphModelParser.java
+++ /dev/null
@@ -1,40 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package org.apache.ignite.ml.inference.parser;
-
-import org.tensorflow.Graph;
-import org.tensorflow.Session;
-
-/**
- * Implementation of TensorFlow model parser that accepts serialized graph definition.
- *
- * @param <I> Type of model input.
- * @param <O> Type of model output.
- */
-public class TensorFlowGraphModelParser<I, O> extends TensorFlowBaseModelParser<I, O> {
-    /** */
-    private static final long serialVersionUID = -1872566748640565856L;
-
-    /** {@inheritDoc} */
-    @Override public Session parseModel(byte[] mdl) {
-        Graph graph = new Graph();
-        graph.importGraphDef(mdl);
-
-        return new Session(graph);
-    }
-}
diff --git a/modules/ml/tensorflow-model-parser/src/main/java/org/apache/ignite/ml/inference/parser/TensorFlowSavedModelModelParser.java b/modules/ml/tensorflow-model-parser/src/main/java/org/apache/ignite/ml/inference/parser/TensorFlowSavedModelModelParser.java
deleted file mode 100644
index 2c0b007..0000000
--- a/modules/ml/tensorflow-model-parser/src/main/java/org/apache/ignite/ml/inference/parser/TensorFlowSavedModelModelParser.java
+++ /dev/null
@@ -1,70 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package org.apache.ignite.ml.inference.parser;
-
-import java.io.IOException;
-import java.nio.file.Files;
-import java.nio.file.Path;
-import org.apache.ignite.ml.inference.util.DirectorySerializer;
-import org.tensorflow.SavedModelBundle;
-import org.tensorflow.Session;
-
-/**
- * Implementation of TensorFlow model parser that accepts serialized directory with "SavedModel" as an input. The
- * directory is assumed to be serialized by {@link DirectorySerializer}.
- *
- * @param <I> Type of model input.
- * @param <O> Type of model output.
- */
-public class TensorFlowSavedModelModelParser<I, O> extends TensorFlowBaseModelParser<I, O> {
-    /** */
-    private static final long serialVersionUID = 5638083440240281879L;
-
-    /** Prefix to be used to create temporary directory for TensorFlow model files. */
-    private static final String TMP_DIR_PREFIX = "tensorflow_saved_model_";
-
-    /** Model tags. */
-    private final String[] tags;
-
-    /**
-     * Constructs a new instance of TensorFlow model parser.
-     *
-     * @param tags Model tags.
-     */
-    public TensorFlowSavedModelModelParser(String... tags) {
-        this.tags = tags;
-    }
-
-    /** {@inheritDoc} */
-    @Override public Session parseModel(byte[] mdl) {
-        Path dir = null;
-        try {
-            dir = Files.createTempDirectory(TMP_DIR_PREFIX);
-            DirectorySerializer.deserialize(dir.toAbsolutePath(), mdl);
-            SavedModelBundle bundle = SavedModelBundle.load(dir.toString(), tags);
-            return bundle.session();
-        }
-        catch (IOException | ClassNotFoundException e) {
-            throw new RuntimeException(e);
-        }
-        finally {
-            if (dir != null)
-                DirectorySerializer.deleteDirectory(dir);
-        }
-    }
-}
diff --git a/modules/tensorflow/DEVNOTES.txt b/modules/tensorflow/DEVNOTES.txt
deleted file mode 100644
index 2fd9f95..0000000
--- a/modules/tensorflow/DEVNOTES.txt
+++ /dev/null
@@ -1 +0,0 @@
-TBD
\ No newline at end of file
diff --git a/modules/tensorflow/README.txt b/modules/tensorflow/README.txt
deleted file mode 100644
index 21ea88d..0000000
--- a/modules/tensorflow/README.txt
+++ /dev/null
@@ -1,80 +0,0 @@
-Apache Ignite TensorFlow Integration Module
-------------------------
-
-Apache Ignite TensorFlow Integration Module allowed using TensorFlow with Apache Ignite. In this scenario Apache Ignite
-will be a datasource for any TensorFlow model training.
-
-Import Apache Ignite TensorFlow Integration Module In Maven Project
--------------------------------------
-
-If you are using Maven to manage dependencies of your project, you can add TensorFlow module
-dependency like this (replace '${ignite.version}' with actual Ignite version you are
-interested in):
-
-<project xmlns="http://maven.apache.org/POM/4.0.0"
-    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
-    xsi:schemaLocation="http://maven.apache.org/POM/4.0.0
-                        http://maven.apache.org/xsd/maven-4.0.0.xsd">
-    ...
-    <dependencies>
-        ...
-        <dependency>
-            <groupId>org.apache.ignite</groupId>
-            <artifactId>ignite-tensorflow</artifactId>
-            <version>${ignite.version}</version>
-        </dependency>
-        ...
-    </dependencies>
-    ...
-</project>
--------------------------------------
-
-TensorFlow integration module provides command line tool that allows to start, maintain and stop distributed deep
-learning utilizing Apache Ignite infrastructure and data. This tool provides several commands that are shown here:
-
-Usage: ignite-tf [-hV] [-c=<cfg>] [COMMAND]
-Apache Ignite and TensorFlow integration command line utility that allows to
-start, maintain and stop distributed deep learning utilizing Apache Ignite
-infrastructure and data.
-  -c, --config=<cfg>   Apache Ignite client configuration.
-  -h, --help           Show this help message and exit.
-  -V, --version        Print version information and exit.
-Commands:
-  start   Starts a new TensorFlow cluster and attaches to user script process.
-  stop    Stops a running TensorFlow cluster.
-  attach  Attaches to running TensorFlow cluster (user script process).
-  ps      Prints identifiers of all running TensorFlow clusters.
-
-To start TensorFlow cluster you need to specify upstream cache that will be used as data source for training, folder
-that contains code that actually performs training and command that should be called on this code to start training
-correctly. Command "start" have the following help output:
-
-Usage: ignite-tf start [-hV] [-c=<cfg>] CACHE_NAME JOB_DIR JOB_CMD [JOB_ARGS...]
-Starts a new TensorFlow cluster and attaches to user script process.
-      CACHE_NAME       Upstream cache name.
-      JOB_DIR          Job folder (or zip archive).
-      JOB_CMD          Job command.
-      [JOB_ARGS...]    Job arguments.
-  -c, --config=<cfg>   Apache Ignite client configuration.
-  -h, --help           Show this help message and exit.
-  -V, --version        Print version information and exit.
-
-To attach to running TensorFlow cluster or stop it you can use commands "attach" and "stop" correspondingly. These
-commands accepts cluster identifier as a parameter:
-
-Usage: ignite-tf attach [-hV] [-c=<cfg>] CLUSTER_ID
-Attaches to running TensorFlow cluster (user script process).
-      CLUSTER_ID       Cluster identifier.
-  -c, --config=<cfg>   Apache Ignite client configuration.
-  -h, --help           Show this help message and exit.
-  -V, --version        Print version information and exit.
-
-Usage: ignite-tf stop [-hV] [-c=<cfg>] CLUSTER_ID
-Stops a running TensorFlow cluster.
-      CLUSTER_ID       Cluster identifier.
-  -c, --config=<cfg>   Apache Ignite client configuration.
-  -h, --help           Show this help message and exit.
-  -V, --version        Print version information and exit.
-
-To find out what TensorFlow clusters are currently running on top of Apache Ignite you can use "ps" command that doesn't
-require arguments.
\ No newline at end of file
diff --git a/modules/tensorflow/licenses/apache-2.0.txt b/modules/tensorflow/licenses/apache-2.0.txt
deleted file mode 100644
index d645695..0000000
--- a/modules/tensorflow/licenses/apache-2.0.txt
+++ /dev/null
@@ -1,202 +0,0 @@
-
-                                 Apache License
-                           Version 2.0, January 2004
-                        http://www.apache.org/licenses/
-
-   TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
-
-   1. Definitions.
-
-      "License" shall mean the terms and conditions for use, reproduction,
-      and distribution as defined by Sections 1 through 9 of this document.
-
-      "Licensor" shall mean the copyright owner or entity authorized by
-      the copyright owner that is granting the License.
-
-      "Legal Entity" shall mean the union of the acting entity and all
-      other entities that control, are controlled by, or are under common
-      control with that entity. For the purposes of this definition,
-      "control" means (i) the power, direct or indirect, to cause the
-      direction or management of such entity, whether by contract or
-      otherwise, or (ii) ownership of fifty percent (50%) or more of the
-      outstanding shares, or (iii) beneficial ownership of such entity.
-
-      "You" (or "Your") shall mean an individual or Legal Entity
-      exercising permissions granted by this License.
-
-      "Source" form shall mean the preferred form for making modifications,
-      including but not limited to software source code, documentation
-      source, and configuration files.
-
-      "Object" form shall mean any form resulting from mechanical
-      transformation or translation of a Source form, including but
-      not limited to compiled object code, generated documentation,
-      and conversions to other media types.
-
-      "Work" shall mean the work of authorship, whether in Source or
-      Object form, made available under the License, as indicated by a
-      copyright notice that is included in or attached to the work
-      (an example is provided in the Appendix below).
-
-      "Derivative Works" shall mean any work, whether in Source or Object
-      form, that is based on (or derived from) the Work and for which the
-      editorial revisions, annotations, elaborations, or other modifications
-      represent, as a whole, an original work of authorship. For the purposes
-      of this License, Derivative Works shall not include works that remain
-      separable from, or merely link (or bind by name) to the interfaces of,
-      the Work and Derivative Works thereof.
-
-      "Contribution" shall mean any work of authorship, including
-      the original version of the Work and any modifications or additions
-      to that Work or Derivative Works thereof, that is intentionally
-      submitted to Licensor for inclusion in the Work by the copyright owner
-      or by an individual or Legal Entity authorized to submit on behalf of
-      the copyright owner. For the purposes of this definition, "submitted"
-      means any form of electronic, verbal, or written communication sent
-      to the Licensor or its representatives, including but not limited to
-      communication on electronic mailing lists, source code control systems,
-      and issue tracking systems that are managed by, or on behalf of, the
-      Licensor for the purpose of discussing and improving the Work, but
-      excluding communication that is conspicuously marked or otherwise
-      designated in writing by the copyright owner as "Not a Contribution."
-
-      "Contributor" shall mean Licensor and any individual or Legal Entity
-      on behalf of whom a Contribution has been received by Licensor and
-      subsequently incorporated within the Work.
-
-   2. Grant of Copyright License. Subject to the terms and conditions of
-      this License, each Contributor hereby grants to You a perpetual,
-      worldwide, non-exclusive, no-charge, royalty-free, irrevocable
-      copyright license to reproduce, prepare Derivative Works of,
-      publicly display, publicly perform, sublicense, and distribute the
-      Work and such Derivative Works in Source or Object form.
-
-   3. Grant of Patent License. Subject to the terms and conditions of
-      this License, each Contributor hereby grants to You a perpetual,
-      worldwide, non-exclusive, no-charge, royalty-free, irrevocable
-      (except as stated in this section) patent license to make, have made,
-      use, offer to sell, sell, import, and otherwise transfer the Work,
-      where such license applies only to those patent claims licensable
-      by such Contributor that are necessarily infringed by their
-      Contribution(s) alone or by combination of their Contribution(s)
-      with the Work to which such Contribution(s) was submitted. If You
-      institute patent litigation against any entity (including a
-      cross-claim or counterclaim in a lawsuit) alleging that the Work
-      or a Contribution incorporated within the Work constitutes direct
-      or contributory patent infringement, then any patent licenses
-      granted to You under this License for that Work shall terminate
-      as of the date such litigation is filed.
-
-   4. Redistribution. You may reproduce and distribute copies of the
-      Work or Derivative Works thereof in any medium, with or without
-      modifications, and in Source or Object form, provided that You
-      meet the following conditions:
-
-      (a) You must give any other recipients of the Work or
-          Derivative Works a copy of this License; and
-
-      (b) You must cause any modified files to carry prominent notices
-          stating that You changed the files; and
-
-      (c) You must retain, in the Source form of any Derivative Works
-          that You distribute, all copyright, patent, trademark, and
-          attribution notices from the Source form of the Work,
-          excluding those notices that do not pertain to any part of
-          the Derivative Works; and
-
-      (d) If the Work includes a "NOTICE" text file as part of its
-          distribution, then any Derivative Works that You distribute must
-          include a readable copy of the attribution notices contained
-          within such NOTICE file, excluding those notices that do not
-          pertain to any part of the Derivative Works, in at least one
-          of the following places: within a NOTICE text file distributed
-          as part of the Derivative Works; within the Source form or
-          documentation, if provided along with the Derivative Works; or,
-          within a display generated by the Derivative Works, if and
-          wherever such third-party notices normally appear. The contents
-          of the NOTICE file are for informational purposes only and
-          do not modify the License. You may add Your own attribution
-          notices within Derivative Works that You distribute, alongside
-          or as an addendum to the NOTICE text from the Work, provided
-          that such additional attribution notices cannot be construed
-          as modifying the License.
-
-      You may add Your own copyright statement to Your modifications and
-      may provide additional or different license terms and conditions
-      for use, reproduction, or distribution of Your modifications, or
-      for any such Derivative Works as a whole, provided Your use,
-      reproduction, and distribution of the Work otherwise complies with
-      the conditions stated in this License.
-
-   5. Submission of Contributions. Unless You explicitly state otherwise,
-      any Contribution intentionally submitted for inclusion in the Work
-      by You to the Licensor shall be under the terms and conditions of
-      this License, without any additional terms or conditions.
-      Notwithstanding the above, nothing herein shall supersede or modify
-      the terms of any separate license agreement you may have executed
-      with Licensor regarding such Contributions.
-
-   6. Trademarks. This License does not grant permission to use the trade
-      names, trademarks, service marks, or product names of the Licensor,
-      except as required for reasonable and customary use in describing the
-      origin of the Work and reproducing the content of the NOTICE file.
-
-   7. Disclaimer of Warranty. Unless required by applicable law or
-      agreed to in writing, Licensor provides the Work (and each
-      Contributor provides its Contributions) on an "AS IS" BASIS,
-      WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
-      implied, including, without limitation, any warranties or conditions
-      of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
-      PARTICULAR PURPOSE. You are solely responsible for determining the
-      appropriateness of using or redistributing the Work and assume any
-      risks associated with Your exercise of permissions under this License.
-
-   8. Limitation of Liability. In no event and under no legal theory,
-      whether in tort (including negligence), contract, or otherwise,
-      unless required by applicable law (such as deliberate and grossly
-      negligent acts) or agreed to in writing, shall any Contributor be
-      liable to You for damages, including any direct, indirect, special,
-      incidental, or consequential damages of any character arising as a
-      result of this License or out of the use or inability to use the
-      Work (including but not limited to damages for loss of goodwill,
-      work stoppage, computer failure or malfunction, or any and all
-      other commercial damages or losses), even if such Contributor
-      has been advised of the possibility of such damages.
-
-   9. Accepting Warranty or Additional Liability. While redistributing
-      the Work or Derivative Works thereof, You may choose to offer,
-      and charge a fee for, acceptance of support, warranty, indemnity,
-      or other liability obligations and/or rights consistent with this
-      License. However, in accepting such obligations, You may act only
-      on Your own behalf and on Your sole responsibility, not on behalf
-      of any other Contributor, and only if You agree to indemnify,
-      defend, and hold each Contributor harmless for any liability
-      incurred by, or claims asserted against, such Contributor by reason
-      of your accepting any such warranty or additional liability.
-
-   END OF TERMS AND CONDITIONS
-
-   APPENDIX: How to apply the Apache License to your work.
-
-      To apply the Apache License to your work, attach the following
-      boilerplate notice, with the fields enclosed by brackets "[]"
-      replaced with your own identifying information. (Don't include
-      the brackets!)  The text should be enclosed in the appropriate
-      comment syntax for the file format. We also recommend that a
-      file or class name and description of purpose be included on the
-      same "printed page" as the copyright notice for easier
-      identification within third-party archives.
-
-   Copyright [yyyy] [name of copyright owner]
-
-   Licensed 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.
diff --git a/modules/tensorflow/pom.xml b/modules/tensorflow/pom.xml
deleted file mode 100644
index 9f45ae9..0000000
--- a/modules/tensorflow/pom.xml
+++ /dev/null
@@ -1,132 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-
-<!--
-  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.
--->
-<!--
-    POM file.
--->
-<project xmlns="http://maven.apache.org/POM/4.0.0"
-         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
-         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
-    <parent>
-        <artifactId>ignite-parent</artifactId>
-        <groupId>org.apache.ignite</groupId>
-        <version>1</version>
-        <relativePath>../../parent/pom.xml</relativePath>
-    </parent>
-    <modelVersion>4.0.0</modelVersion>
-
-    <artifactId>ignite-tensorflow</artifactId>
-    <version>2.9.0-SNAPSHOT</version>
-    <url>http://ignite.apache.org</url>
-
-    <build>
-        <plugins>
-            <plugin>
-                <artifactId>maven-dependency-plugin</artifactId>
-                <executions>
-                    <execution>
-                        <id>copy-libs</id>
-                        <phase>package</phase>
-                        <goals>
-                            <goal>copy-dependencies</goal>
-                        </goals>
-                        <configuration>
-                            <excludeTransitive>false</excludeTransitive>
-                        </configuration>
-                    </execution>
-                </executions>
-            </plugin>
-        </plugins>
-    </build>
-
-    <dependencies>
-        <dependency>
-            <groupId>org.apache.ignite</groupId>
-            <artifactId>ignite-core</artifactId>
-            <version>${project.version}</version>
-        </dependency>
-
-        <dependency>
-            <groupId>org.apache.ignite</groupId>
-            <artifactId>ignite-spring</artifactId>
-            <version>${project.version}</version>
-        </dependency>
-
-        <dependency>
-            <groupId>org.apache.ignite</groupId>
-            <artifactId>ignite-slf4j</artifactId>
-            <version>${project.version}</version>
-        </dependency>
-
-        <dependency>
-            <groupId>ch.qos.logback</groupId>
-            <artifactId>logback-classic</artifactId>
-            <version>1.2.3</version>
-        </dependency>
-
-        <dependency>
-            <groupId>ch.qos.logback</groupId>
-            <artifactId>logback-core</artifactId>
-            <version>1.2.3</version>
-        </dependency>
-
-        <dependency>
-            <groupId>commons-io</groupId>
-            <artifactId>commons-io</artifactId>
-            <version>${commons.io.version}</version>
-        </dependency>
-
-        <dependency>
-            <groupId>info.picocli</groupId>
-            <artifactId>picocli</artifactId>
-            <version>3.3.0</version>
-        </dependency>
-
-        <dependency>
-            <groupId>org.apache.ignite</groupId>
-            <artifactId>ignite-core</artifactId>
-            <version>${project.version}</version>
-            <type>test-jar</type>
-            <scope>test</scope>
-        </dependency>
-
-        <dependency>
-            <groupId>org.mockito</groupId>
-            <artifactId>mockito-all</artifactId>
-            <version>${mockito.version}</version>
-            <scope>test</scope>
-        </dependency>
-    </dependencies>
-
-    <profiles>
-        <profile>
-            <id>tensorflow</id>
-            <build>
-                <plugins>
-                    <plugin>
-                        <groupId>org.apache.maven.plugins</groupId>
-                        <artifactId>maven-deploy-plugin</artifactId>
-                        <configuration>
-                            <skip>false</skip>
-                        </configuration>
-                    </plugin>
-                </plugins>
-            </build>
-        </profile>
-    </profiles>
-</project>
diff --git a/modules/tensorflow/src/main/java/org/apache/ignite/tensorflow/cluster/TensorFlowCluster.java b/modules/tensorflow/src/main/java/org/apache/ignite/tensorflow/cluster/TensorFlowCluster.java
deleted file mode 100644
index cf60e42..0000000
--- a/modules/tensorflow/src/main/java/org/apache/ignite/tensorflow/cluster/TensorFlowCluster.java
+++ /dev/null
@@ -1,62 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package org.apache.ignite.tensorflow.cluster;
-
-import org.apache.ignite.tensorflow.cluster.spec.TensorFlowClusterSpec;
-import java.io.Serializable;
-import java.util.List;
-import java.util.Map;
-import java.util.UUID;
-
-/**
- * TensorFlow Cluster metadata.
- */
-public class TensorFlowCluster implements Serializable {
-    /** */
-    private static final long serialVersionUID = -6636339457255751011L;
-
-    /** TensorFlow cluster specification. */
-    private final TensorFlowClusterSpec spec;
-
-    /** Process identifiers. */
-    private final Map<UUID, List<UUID>> processes;
-
-    /**
-     * Constructs a new instance of TensorFlow cluster.
-     *
-     * @param spec TensorFlow cluster specification.
-     * @param processes Process identifiers.
-     */
-    public TensorFlowCluster(TensorFlowClusterSpec spec, Map<UUID, List<UUID>> processes) {
-        assert spec != null : "TensorFlow cluster specification should not be null";
-        assert processes != null : "Processes should not be null";
-
-        this.spec = spec;
-        this.processes = processes;
-    }
-
-    /** */
-    public TensorFlowClusterSpec getSpec() {
-        return spec;
-    }
-
-    /** */
-    public Map<UUID, List<UUID>> getProcesses() {
-        return processes;
-    }
-}
diff --git a/modules/tensorflow/src/main/java/org/apache/ignite/tensorflow/cluster/TensorFlowClusterGateway.java b/modules/tensorflow/src/main/java/org/apache/ignite/tensorflow/cluster/TensorFlowClusterGateway.java
deleted file mode 100644
index 092dfcb..0000000
--- a/modules/tensorflow/src/main/java/org/apache/ignite/tensorflow/cluster/TensorFlowClusterGateway.java
+++ /dev/null
@@ -1,88 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package org.apache.ignite.tensorflow.cluster;
-
-import java.util.HashSet;
-import java.util.Optional;
-import java.util.UUID;
-import java.util.function.Consumer;
-import org.apache.ignite.lang.IgniteBiPredicate;
-import org.apache.ignite.tensorflow.util.SerializableConsumer;
-
-/**
- * TensorFlow cluster gateway that allows to subscribe on changes in cluster configuration.
- */
-public class TensorFlowClusterGateway implements IgniteBiPredicate<UUID, Optional<TensorFlowCluster>>, AutoCloseable {
-    /** */
-    private static final long serialVersionUID = -540323262800791340L;
-
-    /** Callback that will be called on unsubscribe. */
-    private final SerializableConsumer<TensorFlowClusterGateway> unsubscribeCb;
-
-    /** Subscribers. */
-    private final HashSet<Consumer<Optional<TensorFlowCluster>>> subscribers = new HashSet<>();
-
-    /** Last value received from the upstream. */
-    private Optional<TensorFlowCluster> last;
-
-    /**
-     * Constructs a new instance of TensorFlow cluster gateway.
-     *
-     * @param unsubscribeCb Callback that will be called on unsubscribe.
-     */
-    public TensorFlowClusterGateway(SerializableConsumer<TensorFlowClusterGateway> unsubscribeCb) {
-        this.unsubscribeCb = unsubscribeCb;
-    }
-
-    /**
-     * Subscribers the specified subscriber on the upstream events.
-     *
-     * @param subscriber Subscriber.
-     */
-    public synchronized void subscribe(Consumer<Optional<TensorFlowCluster>> subscriber) {
-        subscribers.add(subscriber);
-
-        if (last != null)
-            subscriber.accept(last);
-    }
-
-    /**
-     * Unsubscribe the specified subscriber.
-     *
-     * @param subscriber Subscriber.
-     */
-    public synchronized void unsubscribe(Consumer<Optional<TensorFlowCluster>> subscriber) {
-        subscribers.remove(subscriber);
-    }
-
-    /** {@inheritDoc} */
-    @Override public synchronized boolean apply(UUID uuid, Optional<TensorFlowCluster> cluster) {
-        for (Consumer<Optional<TensorFlowCluster>> subscriber : subscribers)
-            subscriber.accept(cluster);
-
-        last = cluster;
-
-        return true;
-    }
-
-    /** {@inheritDoc} */
-    @Override public void close() {
-        subscribers.clear();
-        unsubscribeCb.accept(this);
-    }
-}
diff --git a/modules/tensorflow/src/main/java/org/apache/ignite/tensorflow/cluster/TensorFlowClusterGatewayManager.java b/modules/tensorflow/src/main/java/org/apache/ignite/tensorflow/cluster/TensorFlowClusterGatewayManager.java
deleted file mode 100644
index a315aaf..0000000
--- a/modules/tensorflow/src/main/java/org/apache/ignite/tensorflow/cluster/TensorFlowClusterGatewayManager.java
+++ /dev/null
@@ -1,155 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package org.apache.ignite.tensorflow.cluster;
-
-import java.util.Optional;
-import java.util.UUID;
-import java.util.concurrent.CountDownLatch;
-import java.util.function.Consumer;
-import org.apache.ignite.Ignite;
-import org.apache.ignite.IgniteLogger;
-
-/**
- * TensorFlow cluster manager that allows to start, maintain and stop TensorFlow cluster using
- * {@link TensorFlowClusterManager} and Ignite Service Grid.
- */
-public class TensorFlowClusterGatewayManager {
-    /** Service name template. */
-    private static final String SERVICE_NAME_TEMPLATE = "TF_SERVICE_%s";
-
-    /** Service topic name template. */
-    private static final String SERVICE_TOPIC_NAME_TEMPLATE = "TF_SERVICE_TOPIC_%s";
-
-    /** Ignite instance. */
-    private final Ignite ignite;
-
-    /** Logger. */
-    private final IgniteLogger log;
-
-    /**
-     * Constructs a new instance of TensorFlow cluster manager with maintenance.
-     *
-     * @param ignite Ignite instance.
-     */
-    public TensorFlowClusterGatewayManager(Ignite ignite) {
-        assert ignite != null : "Ignite should not be null";
-
-        this.ignite = ignite;
-        this.log = ignite.log().getLogger(TensorFlowClusterGatewayManager.class);
-    }
-
-    /**
-     * Subscribes on changes of the specified cluster.
-     *
-     * @param clusterId Cluster identifier.
-     * @return TensorFlow cluster gateway that allows to subscribe on cluster changes.
-     */
-    public TensorFlowClusterGateway getCluster(UUID clusterId) {
-        String topicName = String.format(SERVICE_TOPIC_NAME_TEMPLATE, clusterId);
-
-        return createTensorFlowClusterGateway(topicName);
-    }
-
-    /**
-     * Creates and starts a new TensorFlow cluster for the specified cache.
-     *
-     * @param clusterId Cluster identifier.
-     * @param jobArchive Job archive.
-     * @return TensorFlow cluster gateway that allows to subscribe on cluster changes.
-     */
-    public TensorFlowClusterGateway createCluster(UUID clusterId, TensorFlowJobArchive jobArchive) {
-        String svcName = String.format(SERVICE_NAME_TEMPLATE, clusterId);
-        String topicName = String.format(SERVICE_TOPIC_NAME_TEMPLATE, clusterId);
-
-        TensorFlowClusterGateway gateway = createTensorFlowClusterGateway(topicName);
-
-        ignite.services().deployClusterSingleton(
-            svcName,
-            new TensorFlowClusterMaintainer(clusterId, jobArchive, topicName)
-        );
-        log.info("Cluster maintainer deployed as a service [clusterId=" + clusterId + "]");
-
-        return gateway;
-    }
-
-    /**
-     * Listens to TensorFlow cluster user script.
-     *
-     * @param clusterId Cluster identifier.
-     * @param out Output stream consumer.
-     * @param err Error stream consumer.
-     */
-    public void listenToClusterUserScript(UUID clusterId, Consumer<String> out, Consumer<String> err) {
-        TensorFlowClusterGateway gateway = getCluster(clusterId);
-
-        ignite.message().localListen("us_out_" + clusterId, (node, msg) -> {
-            out.accept(msg.toString());
-            return true;
-        });
-
-        ignite.message().localListen("us_err_" + clusterId, (node, msg) -> {
-            err.accept(msg.toString());
-            return true;
-        });
-
-        CountDownLatch latch = new CountDownLatch(1);
-
-        Consumer<Optional<TensorFlowCluster>> subscriber = cluster -> {
-            if (!cluster.isPresent())
-                latch.countDown();
-        };
-
-        gateway.subscribe(subscriber);
-
-        try {
-            latch.await();
-            gateway.unsubscribe(subscriber);
-        }
-        catch (InterruptedException e) {
-            throw new RuntimeException(e);
-        }
-    }
-
-    /**
-     * Stops TensorFlow cluster.
-     *
-     * @param clusterId Cluster identifier.
-     */
-    public void stopClusterIfExists(UUID clusterId) {
-        ignite.services().cancel(String.format(SERVICE_NAME_TEMPLATE, clusterId));
-        log.info("Cluster maintained cancelled as a service [clusterId=" + clusterId + "]");
-    }
-
-    /**
-     * Creates TensorFlow cluster gateway.
-     *
-     * @param topicName Topic name.
-     * @return TensorFlow cluster gateway.
-     */
-    private TensorFlowClusterGateway createTensorFlowClusterGateway(String topicName) {
-        TensorFlowClusterGateway gateway = new TensorFlowClusterGateway(subscriber -> {
-            ignite.message().stopLocalListen(topicName, subscriber);
-            log.info("Stop listen to cluster gateway [topicName=" + topicName + "]");
-        });
-
-        ignite.message().localListen(topicName, gateway);
-        log.info("Start listen to cluster gateway [topicName=" + topicName + "]");
-
-        return gateway;
-    }
-}
diff --git a/modules/tensorflow/src/main/java/org/apache/ignite/tensorflow/cluster/TensorFlowClusterMaintainer.java b/modules/tensorflow/src/main/java/org/apache/ignite/tensorflow/cluster/TensorFlowClusterMaintainer.java
deleted file mode 100644
index f44a4f8..0000000
--- a/modules/tensorflow/src/main/java/org/apache/ignite/tensorflow/cluster/TensorFlowClusterMaintainer.java
+++ /dev/null
@@ -1,233 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package org.apache.ignite.tensorflow.cluster;
-
-import java.util.Arrays;
-import java.util.List;
-import java.util.Map;
-import java.util.Optional;
-import java.util.UUID;
-import java.util.concurrent.locks.LockSupport;
-import org.apache.ignite.Ignite;
-import org.apache.ignite.IgniteLogger;
-import org.apache.ignite.cache.affinity.Affinity;
-import org.apache.ignite.cluster.ClusterNode;
-import org.apache.ignite.resources.IgniteInstanceResource;
-import org.apache.ignite.resources.LoggerResource;
-import org.apache.ignite.services.Service;
-import org.apache.ignite.services.ServiceContext;
-import org.apache.ignite.tensorflow.core.longrunning.task.util.LongRunningProcessState;
-import org.apache.ignite.tensorflow.core.longrunning.task.util.LongRunningProcessStatus;
-
-/**
- * TensorFlow cluster service that maintains TensorFlow cluster.
- */
-public class TensorFlowClusterMaintainer implements Service {
-    /** */
-    private static final long serialVersionUID = -3220563310643566419L;
-
-    /** Ignite instance. */
-    @IgniteInstanceResource
-    private transient Ignite ignite;
-
-    /** Logger. */
-    @LoggerResource
-    private transient IgniteLogger log;
-
-    /** TensorFlow cluster identifier. */
-    private final UUID clusterId;
-
-    /** Job archive. */
-    private final TensorFlowJobArchive jobArchive;
-
-    /** Topic name. */
-    private final String topicName;
-
-    /** TensorFlow cluster manager. */
-    private transient TensorFlowClusterManager clusterMgr;
-
-    /** Previous partition mapping. */
-    private transient UUID[] prev;
-
-    /**
-     * Constructs a new instance of TensorFlow cluster service.
-     *
-     * @param clusterId Cluster identifier.
-     * @param jobArchive Job archive.
-     * @param topicName Topic name.
-     */
-    public TensorFlowClusterMaintainer(UUID clusterId, TensorFlowJobArchive jobArchive, String topicName) {
-        assert clusterId != null : "Cluster identifier should not be null";
-        assert jobArchive != null : "Job archive should not be null";
-        assert topicName != null : "Topic name should not be null";
-
-        this.clusterId = clusterId;
-        this.jobArchive = jobArchive;
-        this.topicName = topicName;
-    }
-
-    /** {@inheritDoc} */
-    @Override public void cancel(ServiceContext ctx) {
-        clusterMgr.stopClusterIfExists(clusterId);
-        log.debug("Cluster maintainer canceled [clusterId=" + clusterId + "]");
-    }
-
-    /** {@inheritDoc} */
-    @Override public void init(ServiceContext ctx) {
-        clusterMgr = new TensorFlowClusterManager(ignite);
-        log.debug("Cluster maintainer initialized [clusterId=" + clusterId + "]");
-    }
-
-    /** {@inheritDoc} */
-    @Override public void execute(ServiceContext ctx) {
-        while (!ctx.isCancelled() && !hasUserScriptCompletedSuccessfully()) {
-            LockSupport.parkNanos(1_000_000);
-
-            boolean restartRequired = hasAffinityChanged()
-                || hasAnyWorkerFailed()
-                || hasChiefFailed()
-                || hasUserScriptFailed();
-
-            if (restartRequired) {
-                log.debug("Cluster will be restarted [clusterId=" + clusterId + "]");
-
-                restartCluster();
-            }
-        }
-
-        stopCluster(true);
-
-        log.debug("Cluster maintainer completed [clusterId=" + clusterId + "]");
-    }
-
-    /**
-     * Restarts TensorFlow cluster.
-     */
-    private void restartCluster() {
-        stopCluster(false);
-        startCluster();
-    }
-
-    /**
-     * Stops TensorFlow cluster.
-     *
-     * @param terminate Terminate TensorFlow cluster and notify all listeners that cluster won't be started again.
-     */
-    private void stopCluster(boolean terminate) {
-        clusterMgr.stopClusterIfExists(clusterId);
-
-        if (terminate)
-            ignite.message().send(topicName, Optional.empty());
-    }
-
-    /**
-     * Starts TensorFlow cluster.
-     */
-    private void startCluster() {
-        TensorFlowCluster cluster = clusterMgr.createCluster(
-            clusterId,
-            jobArchive,
-            str -> ignite.message().sendOrdered("us_out_" + clusterId, str, 60 * 1000),
-            str -> ignite.message().sendOrdered("us_err_" + clusterId, str, 60 * 1000)
-        );
-
-        ignite.message().send(topicName, Optional.of(cluster));
-    }
-
-    /**
-     * Checks if affinity mapping has been changed.
-     *
-     * @return True if mapping has been changed, otherwise false.
-     */
-    private boolean hasAffinityChanged() {
-        Affinity<?> affinity = ignite.affinity(jobArchive.getUpstreamCacheName());
-
-        int parts = affinity.partitions();
-
-        UUID[] ids = new UUID[parts];
-
-        for (int part = 0; part < parts; part++) {
-            ClusterNode node = affinity.mapPartitionToNode(part);
-            UUID nodeId = node.id();
-            ids[part] = nodeId;
-        }
-
-        if (prev == null || !Arrays.equals(ids, prev)) {
-            prev = ids;
-            return true;
-        }
-
-        return false;
-    }
-
-    /**
-     * Checks is any worker has failed.
-     *
-     * @return True if any worker has failed, otherwise false.
-     */
-    private boolean hasAnyWorkerFailed() {
-        TensorFlowCluster cluster = clusterMgr.getCluster(clusterId);
-
-        Map<UUID, List<LongRunningProcessStatus>> statuses;
-        try {
-            statuses = clusterMgr.getSrvProcMgr().ping(cluster.getProcesses());
-        }
-        catch (Exception e) {
-            log.error("Failed to check process statuses", e);
-
-            return true;
-        }
-
-        for (UUID nodeId : statuses.keySet()) {
-            for (LongRunningProcessStatus status : statuses.get(nodeId)) {
-                if (status.getState().equals(LongRunningProcessState.DONE))
-                    return true;
-            }
-        }
-
-        return false;
-    }
-
-    /**
-     * Checks if chief has failed.
-     *
-     * @return True if chief has failed, otherwise false.
-     */
-    private boolean hasChiefFailed() {
-        return clusterMgr.getChiefException(clusterId) != null;
-    }
-
-    /**
-     * Checks if user script failed.
-     *
-     * @return True if user script has failed, otherwise false.
-     */
-    private boolean hasUserScriptFailed() {
-        return clusterMgr.getUserScriptException(clusterId) != null;
-    }
-
-    /**
-     * Checks if user script has completed successfully.
-     *
-     * @return True if user script has completed successfully, otherwise false.
-     */
-    private boolean hasUserScriptCompletedSuccessfully() {
-        return clusterMgr.isUserScriptCompleted(clusterId)
-            && clusterMgr.getUserScriptException(clusterId) == null;
-    }
-}
diff --git a/modules/tensorflow/src/main/java/org/apache/ignite/tensorflow/cluster/TensorFlowClusterManager.java b/modules/tensorflow/src/main/java/org/apache/ignite/tensorflow/cluster/TensorFlowClusterManager.java
deleted file mode 100644
index 12ed4ea..0000000
--- a/modules/tensorflow/src/main/java/org/apache/ignite/tensorflow/cluster/TensorFlowClusterManager.java
+++ /dev/null
@@ -1,351 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package org.apache.ignite.tensorflow.cluster;
-
-import java.util.ArrayList;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-import java.util.UUID;
-import java.util.concurrent.ConcurrentHashMap;
-import java.util.concurrent.ConcurrentMap;
-import java.util.concurrent.Executors;
-import java.util.concurrent.locks.Lock;
-import java.util.function.Consumer;
-import javax.cache.Cache;
-import org.apache.ignite.Ignite;
-import org.apache.ignite.IgniteCache;
-import org.apache.ignite.cache.CacheAtomicityMode;
-import org.apache.ignite.cache.CacheMode;
-import org.apache.ignite.cache.query.QueryCursor;
-import org.apache.ignite.cache.query.ScanQuery;
-import org.apache.ignite.configuration.CacheConfiguration;
-import org.apache.ignite.tensorflow.cluster.spec.TensorFlowClusterSpec;
-import org.apache.ignite.tensorflow.cluster.spec.TensorFlowServerAddressSpec;
-import org.apache.ignite.tensorflow.cluster.tfrunning.TensorFlowServer;
-import org.apache.ignite.tensorflow.cluster.tfrunning.TensorFlowServerManager;
-import org.apache.ignite.tensorflow.cluster.util.TensorFlowChiefRunner;
-import org.apache.ignite.tensorflow.cluster.util.TensorFlowClusterResolver;
-import org.apache.ignite.tensorflow.cluster.util.TensorFlowUserScriptRunner;
-import org.apache.ignite.tensorflow.core.util.CustomizableThreadFactory;
-
-/**
- * TensorFlow cluster manager that allows to start, maintain and stop TensorFlow cluster.
- */
-public class TensorFlowClusterManager {
-    /** TensorFlow cluster metadata cache name. */
-    private static final String TF_CLUSTER_METADATA_CACHE_NAME = "TF_CLUSTER_METADATA_CACHE";
-
-    /** Ignite instance. */
-    private final Ignite ignite;
-
-    /** TensorFlow server manager. */
-    private final TensorFlowServerManager srvProcMgr;
-
-    /** TensorFlow cluster resolver. */
-    private final TensorFlowClusterResolver clusterRslvr;
-
-    /** TensorFlow cluster metadata cache. */
-    private IgniteCache<UUID, TensorFlowCluster> cache;
-
-    /** TensorFlow chief runners. */
-    private ConcurrentMap<UUID, TensorFlowChiefRunner> chiefRunners;
-
-    /** TensorFlow user script runners. */
-    private ConcurrentMap<UUID, TensorFlowUserScriptRunner> userScriptRunners;
-
-    /**
-     * Constructs a new instance of TensorFlow cluster manager.
-     *
-     * @param ignite Ignite instance.
-     */
-    public TensorFlowClusterManager(Ignite ignite) {
-        assert ignite != null : "Ignite instance should not be null";
-
-        this.ignite = ignite;
-        this.srvProcMgr = new TensorFlowServerManager(ignite);
-        this.clusterRslvr = new TensorFlowClusterResolver(ignite, "TF", 10000, 1000);
-        this.cache = getOrCreateCache();
-        this.chiefRunners = new ConcurrentHashMap<>();
-        this.userScriptRunners = new ConcurrentHashMap<>();
-    }
-
-    /**
-     * Returns cluster by identifier.
-     *
-     * @param clusterId Cluster identifier.
-     * @return TensorFlow cluster.
-     */
-    public TensorFlowCluster getCluster(UUID clusterId) {
-        return cache.get(clusterId);
-    }
-
-    /**
-     * Creates and starts a new TensorFlow cluster for the specified cache.
-     *
-     * @param clusterId Cluster identifier.
-     * @param jobArchive Job archive.
-     * @return TensorFlow cluster metadata.
-     */
-    public TensorFlowCluster createCluster(UUID clusterId, TensorFlowJobArchive jobArchive,
-        Consumer<String> userScriptOut, Consumer<String> userScriptErr) {
-        Lock clusterMgrCacheLock = cache.lock(clusterId);
-        clusterMgrCacheLock.lock();
-
-        try {
-            TensorFlowCluster cluster = cache.get(clusterId);
-
-            if (cluster != null)
-                throw new IllegalStateException("Cluster is already created [clusterId=" + clusterId + "]");
-
-            TensorFlowClusterSpec clusterSpec = clusterRslvr.resolveAndAcquirePorts(jobArchive.getUpstreamCacheName());
-            cluster = startCluster(clusterId, clusterSpec, jobArchive, userScriptOut, userScriptErr);
-            cache.put(clusterId, cluster);
-
-            return cluster;
-        }
-        finally {
-            clusterMgrCacheLock.unlock();
-        }
-    }
-
-    /**
-     * Stops TensorFlow cluster.
-     *
-     * @param clusterId TensorFlow cluster identifier.
-     */
-    public void stopClusterIfExists(UUID clusterId) {
-        Lock clusterMgrCacheLock = cache.lock(clusterId);
-        clusterMgrCacheLock.lock();
-
-        try {
-            TensorFlowCluster cluster = cache.get(clusterId);
-
-            if (cluster != null) {
-                stopChief(clusterId);
-                stopUserScript(clusterId);
-                srvProcMgr.stop(cluster.getProcesses(), true);
-                clusterRslvr.releasePorts(cluster.getSpec());
-                cache.remove(clusterId);
-            }
-        }
-        finally {
-            clusterMgrCacheLock.unlock();
-        }
-    }
-
-    /** Destroys TensorFlow cluster manager and related caches. */
-    public void destroy() {
-        clusterRslvr.destroy();
-        ignite.destroyCache(TF_CLUSTER_METADATA_CACHE_NAME);
-    }
-
-    /**
-     * Starts TensorFlow cluster using the specified specification and returns metadata of the started cluster.
-     *
-     * @param clusterId Cluster identifier.
-     * @param spec TensorFlow cluster specification.
-     * @return TensorFlow cluster metadata.
-     */
-    private TensorFlowCluster startCluster(UUID clusterId, TensorFlowClusterSpec spec, TensorFlowJobArchive jobArchive,
-        Consumer<String> userScriptOut, Consumer<String> userScriptErr) {
-        Map<String, List<TensorFlowServerAddressSpec>> jobs = spec.getJobs();
-
-        Map<UUID, List<UUID>> workerProcesses = startWorkers(spec, jobs.get(TensorFlowClusterResolver.WORKER_JOB_NAME));
-
-        startChief(clusterId, spec);
-        startUserScript(clusterId, jobArchive, spec, userScriptOut, userScriptErr);
-
-        return new TensorFlowCluster(spec, workerProcesses);
-    }
-
-    /**
-     * Starts TensorFlow worker processes using the specified specification and returns identifiers of the started
-     * processes.
-     *
-     * @param spec TensorFlow cluster specification.
-     * @param tasks Worker tasks.
-     * @return Identifiers of the started processes.
-     */
-    private Map<UUID, List<UUID>> startWorkers(TensorFlowClusterSpec spec, List<TensorFlowServerAddressSpec> tasks) {
-        List<TensorFlowServer> srvs = new ArrayList<>();
-
-        if (tasks != null) {
-            for (int i = 0; i < tasks.size(); i++) {
-                TensorFlowServer srvSpec = new TensorFlowServer(spec, TensorFlowClusterResolver.WORKER_JOB_NAME, i);
-                srvs.add(srvSpec);
-            }
-        }
-
-        return srvProcMgr.start(srvs);
-    }
-
-    /**
-     * Starts chief process using the specified cluster specification.
-     *
-     * @param clusterId Cluster identifier.
-     * @param spec TensorFlow cluster specification.
-     */
-    private void startChief(UUID clusterId, TensorFlowClusterSpec spec) {
-        TensorFlowChiefRunner chiefRunner = new TensorFlowChiefRunner(
-            ignite,
-            Executors.newSingleThreadExecutor(
-                new CustomizableThreadFactory("tf-ch", true)
-            ),
-            spec,
-            System.out::println,
-            System.err::println
-        );
-
-        chiefRunner.start();
-
-        chiefRunners.put(clusterId, chiefRunner);
-    }
-
-    /**
-     * Stops chief process.
-     *
-     * @param clusterId Cluster identifier.
-     */
-    private void stopChief(UUID clusterId) {
-        TensorFlowChiefRunner runner = chiefRunners.remove(clusterId);
-
-        if (runner != null)
-            runner.stop();
-    }
-
-    /**
-     * Checks if chief completed and returns result.
-     *
-     * @param clusterId Cluster identifier.
-     * @return {@code true} if chief completed, otherwise {@code false}.
-     */
-    public boolean isChiefCompleted(UUID clusterId) {
-        TensorFlowChiefRunner runner = chiefRunners.get(clusterId);
-
-        return runner != null && runner.isCompleted();
-    }
-
-    /**
-     * Returns an exception that happened during execution or {@code null} if there is no exception.
-     *
-     * @param clusterId Cluster identifier.
-     * @return Exception that happened during execution or {@code null} if there is no exception.
-     */
-    public Exception getChiefException(UUID clusterId) {
-        TensorFlowChiefRunner runner = chiefRunners.get(clusterId);
-
-        return runner != null ? runner.getException() : null;
-    }
-
-    /**
-     * Starts user script processes using the specified job archive.
-     *
-     * @param clusterId Cluster identifier.
-     * @param jobArchive Job archive.
-     * @param clusterSpec Cluster specification.
-     */
-    private void startUserScript(UUID clusterId, TensorFlowJobArchive jobArchive, TensorFlowClusterSpec clusterSpec,
-        Consumer<String> out, Consumer<String> err) {
-        TensorFlowUserScriptRunner userScriptRunner = new TensorFlowUserScriptRunner(
-            ignite,
-            Executors.newSingleThreadExecutor(
-                new CustomizableThreadFactory("tf-us", true)
-            ),
-            jobArchive,
-            clusterSpec,
-            out,
-            err
-        );
-
-        userScriptRunner.start();
-
-        userScriptRunners.put(clusterId, userScriptRunner);
-    }
-
-    /**
-     * Stops user script process.
-     *
-     * @param clusterId Cluster identifier.
-     */
-    private void stopUserScript(UUID clusterId) {
-        TensorFlowUserScriptRunner runner = userScriptRunners.remove(clusterId);
-
-        if (runner != null)
-            runner.stop();
-    }
-
-    /**
-     * Checks if user script completed and returns result.
-     *
-     * @param clusterId Cluster identifier.
-     * @return {@code true} if user script completed, otherwise {@code false}.
-     */
-    public boolean isUserScriptCompleted(UUID clusterId) {
-        TensorFlowUserScriptRunner runner = userScriptRunners.get(clusterId);
-
-        return runner != null && runner.isCompleted();
-    }
-
-    /**
-     * Returns an exception that happened during execution or {@code null} if there is no exception.
-     *
-     * @param clusterId Cluster identifier.
-     * @return Exception that happened during execution or {@code null} if there is no exception.
-     */
-    public Exception getUserScriptException(UUID clusterId) {
-        TensorFlowUserScriptRunner runner = userScriptRunners.get(clusterId);
-
-        return runner != null ? runner.getException() : null;
-    }
-
-    /**
-     * Returns list of maintained TensorFlow clusters.
-     *
-     * @return List of maintained TensorFlow clusters.
-     */
-    public Map<UUID, TensorFlowCluster> getAllClusters() {
-        Map<UUID, TensorFlowCluster> res = new HashMap<>();
-
-        ScanQuery<UUID, TensorFlowCluster> qry = new ScanQuery<>();
-        QueryCursor<Cache.Entry<UUID, TensorFlowCluster>> cursor = cache.query(qry);
-        for (Cache.Entry<UUID, TensorFlowCluster> e : cursor)
-            res.put(e.getKey(), e.getValue());
-
-        return res;
-    }
-
-    /** */
-    public TensorFlowServerManager getSrvProcMgr() {
-        return srvProcMgr;
-    }
-
-    /**
-     * Returns existing cluster manager cache or creates a new one.
-     *
-     * @return Cluster manager cache.
-     */
-    private IgniteCache<UUID, TensorFlowCluster> getOrCreateCache() {
-        CacheConfiguration<UUID, TensorFlowCluster> cacheConfiguration = new CacheConfiguration<>();
-        cacheConfiguration.setName(TF_CLUSTER_METADATA_CACHE_NAME);
-        cacheConfiguration.setCacheMode(CacheMode.REPLICATED);
-        cacheConfiguration.setAtomicityMode(CacheAtomicityMode.TRANSACTIONAL);
-
-        return ignite.getOrCreateCache(cacheConfiguration);
-    }
-}
diff --git a/modules/tensorflow/src/main/java/org/apache/ignite/tensorflow/cluster/TensorFlowJobArchive.java b/modules/tensorflow/src/main/java/org/apache/ignite/tensorflow/cluster/TensorFlowJobArchive.java
deleted file mode 100644
index 953cf76..0000000
--- a/modules/tensorflow/src/main/java/org/apache/ignite/tensorflow/cluster/TensorFlowJobArchive.java
+++ /dev/null
@@ -1,65 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package org.apache.ignite.tensorflow.cluster;
-
-import java.io.Serializable;
-
-/**
- * TensorFlow job archive that keeps archived working directory and command to be executed.
- */
-public class TensorFlowJobArchive implements Serializable {
-    /** */
-    private static final long serialVersionUID = -5977231383594482459L;
-
-    /** Upstream cache name. */
-    private final String upstreamCacheName;
-
-    /** Archived working directory. */
-    private final byte[] data;
-
-    /** Command to be executed with arguments. */
-    private final String[] commands;
-
-    /**
-     * Constructs a new instance of TensorFlow job archive.
-     *
-     * @param upstreamCacheName Upstream cache name.
-     * @param data Archived working directory.
-     * @param commands Command to be executed with arguments.
-     */
-    public TensorFlowJobArchive(String upstreamCacheName, byte[] data, String[] commands) {
-        this.upstreamCacheName = upstreamCacheName;
-        this.data = data;
-        this.commands = commands;
-    }
-
-    /** */
-    public String getUpstreamCacheName() {
-        return upstreamCacheName;
-    }
-
-    /** */
-    public byte[] getData() {
-        return data;
-    }
-
-    /** */
-    public String[] getCommands() {
-        return commands;
-    }
-}
diff --git a/modules/tensorflow/src/main/java/org/apache/ignite/tensorflow/cluster/package-info.java b/modules/tensorflow/src/main/java/org/apache/ignite/tensorflow/cluster/package-info.java
deleted file mode 100644
index 858aa90..0000000
--- a/modules/tensorflow/src/main/java/org/apache/ignite/tensorflow/cluster/package-info.java
+++ /dev/null
@@ -1,34 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-/**
- * <!-- Package description. -->
- * TensorFlow integration API that allows to start and maintain TensorFlow cluster using infrastructure tools from
- * package {@link org.apache.ignite.tensorflow.core}. The most important components are:
- * <ul>
- *     <li>{@link org.apache.ignite.tensorflow.cluster.TensorFlowClusterManager} that allows to start and stop
- *     TensorFlow cluster on top of Apache Ignite, but doesn't monitor it and doesn't maintain so that in case of
- *     failure the cluster won't be restarted.</li>
- *     <li>{@link org.apache.ignite.tensorflow.cluster.TensorFlowClusterGatewayManager} that allows to start, maintain
- *     and stop TensorFlow cluster on top of Apache Ignite so that in case of failure the cluster will be restarted and
- *     recovered.</li>
- *     <li>{@link org.apache.ignite.tensorflow.cluster.TensorFlowClusterGateway} that allows to subscribe on cluster
- *     configuration changes that might be done as result of rebalancing or node failures.</li>
- * </ul>
- */
-
-package org.apache.ignite.tensorflow.cluster;
diff --git a/modules/tensorflow/src/main/java/org/apache/ignite/tensorflow/cluster/spec/TensorFlowClusterSpec.java b/modules/tensorflow/src/main/java/org/apache/ignite/tensorflow/cluster/spec/TensorFlowClusterSpec.java
deleted file mode 100644
index ea813ea..0000000
--- a/modules/tensorflow/src/main/java/org/apache/ignite/tensorflow/cluster/spec/TensorFlowClusterSpec.java
+++ /dev/null
@@ -1,98 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package org.apache.ignite.tensorflow.cluster.spec;
-
-import java.io.Serializable;
-import java.util.ArrayList;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-import java.util.UUID;
-import org.apache.ignite.Ignite;
-
-/**
- * TensorFlow cluster specification.
- */
-public class TensorFlowClusterSpec implements Serializable {
-    /** */
-    private static final long serialVersionUID = 1428581667528448091L;
-
-    /** TensorFlow cluster jobs. */
-    private final Map<String, List<TensorFlowServerAddressSpec>> jobs = new HashMap<>();
-
-    /**
-     * Adds new task to the cluster specification.
-     *
-     * @param jobName Job name.
-     * @param nodeId Node identifier.
-     * @param port Port number.
-     * @return This instance of TensorFlow cluster specification.
-     */
-    public TensorFlowClusterSpec addTask(String jobName, UUID nodeId, int port) {
-        jobs.putIfAbsent(jobName, new ArrayList<>());
-
-        List<TensorFlowServerAddressSpec> tasks = jobs.get(jobName);
-
-        tasks.add(new TensorFlowServerAddressSpec(nodeId, port));
-
-        return this;
-    }
-
-    /**
-     * Formats cluster specification so that TensorFlow accepts it.
-     *
-     * @param ignite Ignite instance.
-     * @return Formatted cluster specification.
-     */
-    public String format(Ignite ignite) {
-        StringBuilder builder = new StringBuilder();
-
-        builder.append("{\n");
-
-        for (Map.Entry<String, List<TensorFlowServerAddressSpec>> entry : jobs.entrySet()) {
-            builder
-                .append("\t\"")
-                .append(entry.getKey())
-                .append("\" : [ ");
-
-            for (TensorFlowServerAddressSpec address : entry.getValue()) {
-                builder
-                    .append("\n\t\t\"")
-                    .append(address.format(ignite))
-                    .append("\", ");
-            }
-
-            if (!entry.getValue().isEmpty())
-                builder.delete(builder.length() - 2, builder.length());
-
-            builder.append("\n\t],\n");
-        }
-
-        if (!jobs.isEmpty())
-            builder.delete(builder.length() - 2, builder.length() - 1);
-
-        builder.append('}');
-
-        return builder.toString();
-    }
-
-    /** */
-    public Map<String, List<TensorFlowServerAddressSpec>> getJobs() {
-        return jobs;
-    }
-}
diff --git a/modules/tensorflow/src/main/java/org/apache/ignite/tensorflow/cluster/spec/TensorFlowServerAddressSpec.java b/modules/tensorflow/src/main/java/org/apache/ignite/tensorflow/cluster/spec/TensorFlowServerAddressSpec.java
deleted file mode 100644
index 9421874..0000000
--- a/modules/tensorflow/src/main/java/org/apache/ignite/tensorflow/cluster/spec/TensorFlowServerAddressSpec.java
+++ /dev/null
@@ -1,72 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package org.apache.ignite.tensorflow.cluster.spec;
-
-import java.io.Serializable;
-import java.util.Collection;
-import java.util.UUID;
-import org.apache.ignite.Ignite;
-
-/**
- * TensorFlow server address specification.
- */
-public class TensorFlowServerAddressSpec implements Serializable {
-    /** */
-    private static final long serialVersionUID = 7883701602323727681L;
-
-    /** Node identifier. */
-    private final UUID nodeId;
-
-    /** Port. */
-    private final int port;
-
-    /**
-     * Constructs a new instance of TensorFlow server address specification.
-     *
-     * @param nodeId Node identifier.
-     * @param port Port.
-     */
-    TensorFlowServerAddressSpec(UUID nodeId, int port) {
-        assert nodeId != null : "Node identifier should not be null";
-        assert port >= 0 && port <= 0xFFFF : "Port should be between 0 and 65535";
-
-        this.nodeId = nodeId;
-        this.port = port;
-    }
-
-    /**
-     * Formats Server Address specification so that TensorFlow accepts it.
-     *
-     * @param ignite Ignite instance.
-     * @return Formatted server address specification.
-     */
-    public String format(Ignite ignite) {
-        Collection<String> names = ignite.cluster().forNodeId(nodeId).hostNames();
-        return names.iterator().next() + ":" + port;
-    }
-
-    /** */
-    public UUID getNodeId() {
-        return nodeId;
-    }
-
-    /** */
-    public int getPort() {
-        return port;
-    }
-}
diff --git a/modules/tensorflow/src/main/java/org/apache/ignite/tensorflow/cluster/spec/package-info.java b/modules/tensorflow/src/main/java/org/apache/ignite/tensorflow/cluster/spec/package-info.java
deleted file mode 100644
index f744ff9..0000000
--- a/modules/tensorflow/src/main/java/org/apache/ignite/tensorflow/cluster/spec/package-info.java
+++ /dev/null
@@ -1,23 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-/**
- * <!-- Package description. -->
- * Contains specifications that describes TensorFlow cluster configuration.
- */
-
-package org.apache.ignite.tensorflow.cluster.spec;
diff --git a/modules/tensorflow/src/main/java/org/apache/ignite/tensorflow/cluster/tfrunning/TensorFlowServer.java b/modules/tensorflow/src/main/java/org/apache/ignite/tensorflow/cluster/tfrunning/TensorFlowServer.java
deleted file mode 100644
index ca67405..0000000
--- a/modules/tensorflow/src/main/java/org/apache/ignite/tensorflow/cluster/tfrunning/TensorFlowServer.java
+++ /dev/null
@@ -1,100 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package org.apache.ignite.tensorflow.cluster.tfrunning;
-
-import org.apache.ignite.tensorflow.cluster.spec.TensorFlowClusterSpec;
-import java.io.Serializable;
-
-/**
- * TensorFlow server specification.
- */
-public class TensorFlowServer implements Serializable {
-    /** */
-    private static final long serialVersionUID = 165988934166176805L;
-
-    /** TensorFlow cluster specification. */
-    private final TensorFlowClusterSpec clusterSpec;
-
-    /** Job name. */
-    private final String jobName;
-
-    /** Task index. */
-    private final Integer taskIdx;
-
-    /** Protocol. */
-    private final String proto;
-
-    /**
-     * Constructs a new instance of TensorFlow server specification.
-     *
-     * @param clusterSpec TensorFlow cluster specification.
-     * @param jobName Job name.
-     */
-    public TensorFlowServer(TensorFlowClusterSpec clusterSpec, String jobName) {
-        this(clusterSpec, jobName, null);
-    }
-
-    /**
-     * Constructs a new instance of TensorFlow server specification.
-     *
-     * @param clusterSpec TensorFlow cluster specification.
-     * @param jobName Job name.
-     * @param taskIdx Task index.
-     */
-    public TensorFlowServer(TensorFlowClusterSpec clusterSpec, String jobName, Integer taskIdx) {
-        this(clusterSpec, jobName, taskIdx, null);
-    }
-
-    /**
-     * Constructs a new instance of TensorFlow server specification.
-     *
-     * @param clusterSpec TensorFlow cluster specification.
-     * @param jobName Job name.
-     * @param taskIdx Task index.
-     * @param proto Task index.
-     */
-    public TensorFlowServer(TensorFlowClusterSpec clusterSpec, String jobName, Integer taskIdx, String proto) {
-        assert clusterSpec != null : "TensorFlow cluster specification should not be null";
-        assert jobName != null : "Job name should not be null";
-
-        this.clusterSpec = clusterSpec;
-        this.jobName = jobName;
-        this.taskIdx = taskIdx;
-        this.proto = proto;
-    }
-
-    /** */
-    public TensorFlowClusterSpec getClusterSpec() {
-        return clusterSpec;
-    }
-
-    /** */
-    public String getJobName() {
-        return jobName;
-    }
-
-    /** */
-    public Integer getTaskIdx() {
-        return taskIdx;
-    }
-
-    /** */
-    public String getProto() {
-        return proto;
-    }
-}
diff --git a/modules/tensorflow/src/main/java/org/apache/ignite/tensorflow/cluster/tfrunning/TensorFlowServerManager.java b/modules/tensorflow/src/main/java/org/apache/ignite/tensorflow/cluster/tfrunning/TensorFlowServerManager.java
deleted file mode 100644
index 589d1d7..0000000
--- a/modules/tensorflow/src/main/java/org/apache/ignite/tensorflow/cluster/tfrunning/TensorFlowServerManager.java
+++ /dev/null
@@ -1,86 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package org.apache.ignite.tensorflow.cluster.tfrunning;
-
-import java.util.List;
-import java.util.Map;
-import java.util.UUID;
-import org.apache.ignite.Ignite;
-import org.apache.ignite.Ignition;
-import org.apache.ignite.tensorflow.cluster.spec.TensorFlowClusterSpec;
-import org.apache.ignite.tensorflow.cluster.spec.TensorFlowServerAddressSpec;
-import org.apache.ignite.tensorflow.cluster.util.TensorFlowProcessBuilderSupplier;
-import org.apache.ignite.tensorflow.core.ProcessManager;
-import org.apache.ignite.tensorflow.core.ProcessManagerWrapper;
-import org.apache.ignite.tensorflow.core.nativerunning.NativeProcess;
-import org.apache.ignite.tensorflow.core.nativerunning.NativeProcessManager;
-
-/**
- * TensorFlow server manager that allows to start, stop and make other actions with TensorFlow servers.
- */
-public class TensorFlowServerManager extends ProcessManagerWrapper<NativeProcess, TensorFlowServer> {
-    /** TensorFlow server script formatter. */
-    private static final TensorFlowServerScriptFormatter scriptFormatter = new TensorFlowServerScriptFormatter();
-
-    /**
-     * Constructs a new instance of TensorFlow server manager.
-     *
-     * @param ignite Ignite instance.
-     */
-    public TensorFlowServerManager(Ignite ignite) {
-        this(new NativeProcessManager(ignite));
-    }
-
-    /**
-     * Constructs a new instance of TensorFlow server manager.
-     *
-     * @param delegate Delegate.
-     */
-    public TensorFlowServerManager(ProcessManager<NativeProcess> delegate) {
-        super(delegate);
-    }
-
-    /** {@inheritDoc} */
-    @Override protected NativeProcess transformSpecification(TensorFlowServer spec) {
-        return new NativeProcess(
-            new TensorFlowProcessBuilderSupplier(
-                true,
-                true,
-                "job:" + spec.getJobName(),
-                "task:" + spec.getTaskIdx()
-            ),
-            scriptFormatter.format(spec, true, Ignition.ignite()),
-            getNode(spec)
-        );
-    }
-
-    /**
-     * Extracts the cluster node server should be running on.
-     *
-     * @param spec TensorFlow server specification.
-     * @return Node identifier.
-     */
-    private UUID getNode(TensorFlowServer spec) {
-        TensorFlowClusterSpec clusterSpec = spec.getClusterSpec();
-        Map<String, List<TensorFlowServerAddressSpec>> jobs = clusterSpec.getJobs();
-        List<TensorFlowServerAddressSpec> tasks = jobs.get(spec.getJobName());
-        TensorFlowServerAddressSpec addr = tasks.get(spec.getTaskIdx());
-
-        return addr.getNodeId();
-    }
-}
diff --git a/modules/tensorflow/src/main/java/org/apache/ignite/tensorflow/cluster/tfrunning/TensorFlowServerScriptFormatter.java b/modules/tensorflow/src/main/java/org/apache/ignite/tensorflow/cluster/tfrunning/TensorFlowServerScriptFormatter.java
deleted file mode 100644
index fc90ef0..0000000
--- a/modules/tensorflow/src/main/java/org/apache/ignite/tensorflow/cluster/tfrunning/TensorFlowServerScriptFormatter.java
+++ /dev/null
@@ -1,109 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package org.apache.ignite.tensorflow.cluster.tfrunning;
-
-import org.apache.ignite.Ignite;
-
-/**
- * Utils class that helps to format Python script that starts TensorFlow server.
- */
-public class TensorFlowServerScriptFormatter {
-    /**
-     * Formats TensorFlow server specification so that it's available to be passed into а python script.
-     *
-     * @param srv Server specification.
-     * @param join Joins server by default or not.
-     * @param ignite Ignite instance.
-     * @return Formatted TensorFlow server script.
-     */
-    public String format(TensorFlowServer srv, boolean join, Ignite ignite) {
-        StringBuilder builder = new StringBuilder();
-
-        builder.append("from __future__ import absolute_import").append("\n");
-        builder.append("from __future__ import division").append("\n");
-        builder.append("from __future__ import print_function").append("\n");
-
-        builder.append("from threading import Thread").append("\n");
-        builder.append("from time import sleep").append("\n");
-        builder.append("import os, signal").append("\n");
-
-        builder.append("\n");
-
-        builder.append("def check_pid(pid):").append("\n");
-        builder.append("    try:").append("\n");
-        builder.append("        os.kill(pid, 0)").append("\n");
-        builder.append("    except OSError:").append("\n");
-        builder.append("        return False").append("\n");
-        builder.append("    else:").append("\n");
-        builder.append("        return True").append("\n");
-
-        builder.append("\n");
-
-        builder.append("def threaded_function(pid):").append("\n");
-        builder.append("    while check_pid(pid):").append("\n");
-        builder.append("        sleep(1)").append("\n");
-        builder.append("    os.kill(os.getpid(), signal.SIGUSR1)").append("\n");
-
-        builder.append("\n");
-
-        builder.append("Thread(target = threaded_function, args = (int(os.environ['PPID']), )).start()")
-            .append("\n");
-        builder.append("\n");
-
-        builder.append("import tensorflow as tf").append('\n');
-        builder.append("to_import_contrib_ops = tf.contrib.resampler").append("\n");
-        builder.append("from tensorflow.contrib.ignite import IgniteDataset").append("\n");
-        builder.append("import tensorflow.contrib.igfs.python.ops.igfs_ops").append("\n");
-
-        builder.append("print('job:%s task:%d' % ('")
-            .append(srv.getJobName())
-            .append("', ")
-            .append(srv.getTaskIdx())
-            .append("))")
-            .append("\n");
-        builder.append("print('IGNITE_DATASET_HOST = ', os.environ.get('IGNITE_DATASET_HOST'))").append("\n");
-        builder.append("print('IGNITE_DATASET_PORT = ', os.environ.get('IGNITE_DATASET_PORT'))").append("\n");
-        builder.append("print('IGNITE_DATASET_LOCAL = ', os.environ.get('IGNITE_DATASET_LOCAL'))").append("\n");
-
-        builder.append("os.environ['TF_CONFIG'] = '").append(formatTfConfigVar(srv, ignite)).append("'\n");
-        builder.append("server = tf.contrib.distribute.run_standard_tensorflow_server()").append("\n");
-
-        if (join)
-            builder.append("server.join()").append('\n');
-
-        return builder.toString();
-    }
-
-    /**
-     * Formats "TF_CONFIG" variable to be passed into user script.
-     *
-     * @param srv Server description.
-     * @param ignite Ignite instance.
-     * @return Formatted "TF_CONFIG" variable to be passed into user script.
-     */
-    private String formatTfConfigVar(TensorFlowServer srv, Ignite ignite) {
-        return "{\"cluster\" : " +
-            srv.getClusterSpec().format(ignite).replace('\n', ' ') +
-            ", " +
-            "\"task\": {\"type\" : \"" +
-            srv.getJobName() +
-            "\", \"index\": " +
-            srv.getTaskIdx() +
-            "}}";
-    }
-}
diff --git a/modules/tensorflow/src/main/java/org/apache/ignite/tensorflow/cluster/tfrunning/package-info.java b/modules/tensorflow/src/main/java/org/apache/ignite/tensorflow/cluster/tfrunning/package-info.java
deleted file mode 100644
index b226bb1..0000000
--- a/modules/tensorflow/src/main/java/org/apache/ignite/tensorflow/cluster/tfrunning/package-info.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-/**
- * <!-- Package description. -->
- * Additional "running" layer on top of Python running layer of infrastructure. Allows to start TensorFlow server using
- * server description ({@link org.apache.ignite.tensorflow.cluster.tfrunning.TensorFlowServer}).
- */
-
-package org.apache.ignite.tensorflow.cluster.tfrunning;
diff --git a/modules/tensorflow/src/main/java/org/apache/ignite/tensorflow/cluster/util/ClusterPortManager.java b/modules/tensorflow/src/main/java/org/apache/ignite/tensorflow/cluster/util/ClusterPortManager.java
deleted file mode 100644
index 681e07f..0000000
--- a/modules/tensorflow/src/main/java/org/apache/ignite/tensorflow/cluster/util/ClusterPortManager.java
+++ /dev/null
@@ -1,247 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package org.apache.ignite.tensorflow.cluster.util;
-
-import org.apache.ignite.Ignite;
-import org.apache.ignite.IgniteCache;
-import org.apache.ignite.IgniteLogger;
-import org.apache.ignite.cache.CacheAtomicityMode;
-import org.apache.ignite.cache.CacheMode;
-import org.apache.ignite.cluster.ClusterGroup;
-import org.apache.ignite.cluster.ClusterGroupEmptyException;
-import org.apache.ignite.configuration.CacheConfiguration;
-
-import java.io.Serializable;
-import java.net.NetworkInterface;
-import java.util.*;
-import java.util.concurrent.locks.Lock;
-
-/**
- * Cluster port manager that allows to reliably {@link #acquirePort(UUID)} and {@link #releasePort(UUID, int)} on the
- * cluster nodes.
- */
-public class ClusterPortManager {
-    /** Ignite instance. */
-    private final Ignite ignite;
-
-    /** Ignite logger. */
-    private final IgniteLogger log;
-
-    /** Port manager cache name. */
-    private final String portMgrCacheName;
-
-    /** Port range from point. */
-    private final int from;
-
-    /** Port range size. */
-    private final int cnt;
-
-    /** Port manager cache */
-    private final IgniteCache<HostIdentifier, BitSet> cache;
-
-    /**
-     * Constructs a new instance of cluster port manager.
-     *
-     * @param poolName Port pool name.
-     * @param from Port range from point.
-     * @param cnt Port range size.
-     */
-    public ClusterPortManager(Ignite ignite, String poolName, int from, int cnt) {
-        assert ignite != null : "Ignite instance should not be null";
-        assert poolName != null : "Pool name should not be null";
-        assert cnt >= 0 : "Count should not be negative";
-        assert from >= 0 && cnt + from <= 0xFFFF : "Port range should be between 0 and 65535";
-
-        this.ignite = ignite;
-        this.log = ignite.log().getLogger(ClusterPortManager.class);
-
-        this.portMgrCacheName = String.format("PORT_MANAGER_%s_CACHE", poolName);
-        this.from = from;
-        this.cnt = cnt;
-        this.cache = getOrCreateCache();
-    }
-
-    /**
-     * Acquires free port on the specified node.
-     *
-     * @param nodeId Node identifier.
-     * @return Port to be acquired.
-     */
-    public int acquirePort(UUID nodeId) {
-        HostIdentifier hostId = getHostIdentifier(nodeId);
-
-        if (hostId == null)
-            throw new IllegalStateException("Can't find node [nodeId=" + nodeId + "]");
-
-        Lock lock = cache.lock(hostId);
-        lock.lock();
-
-        try {
-            BitSet ports = cache.get(hostId);
-
-            if (ports == null)
-                ports = new BitSet(cnt);
-
-            int free = ports.nextClearBit(0);
-
-            if (free >= cnt)
-                throw new IllegalStateException("No free ports in range [from=" + from + ", cnt=" + cnt + "]");
-
-            ports.set(free);
-            log.debug("Port acquired [nodeId=" + nodeId + ", port=" + (from + free) + "]");
-
-            cache.put(hostId, ports);
-
-            return from + free;
-        }
-        finally {
-            lock.unlock();
-        }
-    }
-
-    /**
-     * Releases acquired port on the specified node.
-     *
-     * @param nodeId Node identifier.
-     * @param port Acquired port to be free.
-     */
-    public void releasePort(UUID nodeId, int port) {
-        assert port - from >= 0 && port - from < cnt : "Port not in the range";
-
-        HostIdentifier hostId = getHostIdentifier(nodeId);
-
-        if (hostId == null)
-            return;
-
-        Lock lock = cache.lock(hostId);
-        lock.lock();
-
-        try {
-            BitSet ports = cache.get(hostId);
-
-            if (ports != null) {
-                ports.clear(port - from);
-                log.debug("Port released [nodeId=" + nodeId + ", port=" + port + "]");
-
-                if (ports.isEmpty())
-                    cache.remove(hostId);
-                else
-                    cache.put(hostId, ports);
-            }
-        }
-        finally {
-            lock.unlock();
-        }
-    }
-
-    /** Destroys port manager and related caches. */
-    public void destroy() {
-        ignite.destroyCache(portMgrCacheName);
-    }
-
-    /**
-     * Returns existed port pool cache or creates a new one.
-     *
-     * @return Port pool cache.
-     */
-    private IgniteCache<HostIdentifier, BitSet> getOrCreateCache() {
-        CacheConfiguration<HostIdentifier, BitSet> cacheConfiguration = new CacheConfiguration<>();
-        cacheConfiguration.setName(portMgrCacheName);
-        cacheConfiguration.setCacheMode(CacheMode.REPLICATED);
-        cacheConfiguration.setAtomicityMode(CacheAtomicityMode.TRANSACTIONAL);
-
-        return ignite.getOrCreateCache(cacheConfiguration);
-    }
-
-    /**
-     * Returns host identifier by node identifier.
-     *
-     * @param nodeId Node identifier.
-     * @return Host identifier.
-     */
-    private HostIdentifier getHostIdentifier(UUID nodeId) {
-        try {
-            ClusterGroup grp = ignite.cluster().forNodeId(nodeId);
-
-            return ignite.compute(grp).call(() -> {
-                Enumeration<NetworkInterface> interfaces = NetworkInterface.getNetworkInterfaces();
-
-                List<byte[]> macAddrs = new ArrayList<>();
-
-                while (interfaces.hasMoreElements()) {
-                    NetworkInterface netItf = interfaces.nextElement();
-                    byte[] macAddr = netItf.getHardwareAddress();
-                    macAddrs.add(macAddr);
-                }
-
-                return new HostIdentifier(macAddrs.toArray(new byte[macAddrs.size()][]));
-            });
-        }
-        catch (ClusterGroupEmptyException e) {
-            return null;
-        }
-    }
-
-    /**
-     * Host identifier based on arrays of mac addresses of the host machine.
-     */
-    private static class HostIdentifier implements Serializable {
-        /** */
-        private static final long serialVersionUID = -7060231325908935162L;
-
-        /** Mac addresses. */
-        private final byte[][] macAddrs;
-
-        /**
-         * Constructs a new instance of host identifier.
-         *
-         * @param macAddrs Mac addresses.
-         */
-        public HostIdentifier(byte[][] macAddrs) {
-            this.macAddrs = macAddrs;
-        }
-
-        /** */
-        public byte[][] getMacAddrs() {
-            return macAddrs;
-        }
-
-        /** {@inheritDoc} */
-        @Override public boolean equals(Object o) {
-            if (this == o)
-                return true;
-            if (o == null || getClass() != o.getClass())
-                return false;
-
-            HostIdentifier that = (HostIdentifier)o;
-            if (macAddrs.length != that.macAddrs.length)
-                return false;
-
-            for (int i = 0; i < macAddrs.length; i++)
-                if (!Arrays.equals(macAddrs[i], that.macAddrs[i]))
-                    return false;
-
-            return true;
-        }
-
-        /** {@inheritDoc} */
-        @Override public int hashCode() {
-            return Arrays.hashCode(macAddrs);
-        }
-    }
-}
diff --git a/modules/tensorflow/src/main/java/org/apache/ignite/tensorflow/cluster/util/TensorFlowChiefRunner.java b/modules/tensorflow/src/main/java/org/apache/ignite/tensorflow/cluster/util/TensorFlowChiefRunner.java
deleted file mode 100644
index d8640fa..0000000
--- a/modules/tensorflow/src/main/java/org/apache/ignite/tensorflow/cluster/util/TensorFlowChiefRunner.java
+++ /dev/null
@@ -1,84 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package org.apache.ignite.tensorflow.cluster.util;
-
-import java.util.concurrent.ExecutorService;
-import java.util.function.Consumer;
-import org.apache.ignite.Ignite;
-import org.apache.ignite.tensorflow.cluster.spec.TensorFlowClusterSpec;
-import org.apache.ignite.tensorflow.cluster.tfrunning.TensorFlowServer;
-import org.apache.ignite.tensorflow.cluster.tfrunning.TensorFlowServerScriptFormatter;
-import org.apache.ignite.tensorflow.core.util.AsyncNativeProcessRunner;
-import org.apache.ignite.tensorflow.core.util.NativeProcessRunner;
-import org.apache.ignite.tensorflow.core.util.PythonProcessBuilderSupplier;
-
-/**
- * Utils class that helps to start and stop chief process.
- */
-public class TensorFlowChiefRunner extends AsyncNativeProcessRunner {
-    /** Ignite instance. */
-    private final Ignite ignite;
-
-    /** TensorFlow cluster specification. */
-    private final TensorFlowClusterSpec spec;
-
-    /** Output stream data consumer. */
-    private final Consumer<String> out;
-
-    /** Error stream data consumer. */
-    private final Consumer<String> err;
-
-    /**
-     * Constructs a new instance of TensorFlow chief runner.
-     *
-     * @param ignite Ignite instance.
-     * @param executor Executor to be used in {@link AsyncNativeProcessRunner}.
-     * @param spec TensorFlow cluster specification.
-     * @param out Output stream data consumer.
-     * @param err Error stream data consumer.
-     */
-    public TensorFlowChiefRunner(Ignite ignite, ExecutorService executor, TensorFlowClusterSpec spec,
-        Consumer<String> out, Consumer<String> err) {
-        super(ignite, executor);
-        this.ignite = ignite;
-        this.spec = spec;
-        this.out = out;
-        this.err = err;
-    }
-
-    /** {@inheritDoc} */
-    @Override public NativeProcessRunner doBefore() {
-        TensorFlowServer srv = new TensorFlowServer(spec, TensorFlowClusterResolver.CHIEF_JOB_NAME, 0);
-
-        return new NativeProcessRunner(
-            new PythonProcessBuilderSupplier(
-                true,
-                "job:" + srv.getJobName(),
-                "task:" + srv.getTaskIdx()
-            ).get(),
-            new TensorFlowServerScriptFormatter().format(srv, true, ignite),
-            out,
-            err
-        );
-    }
-
-    /** {@inheritDoc} */
-    @Override public void doAfter() {
-        // Do nothing.
-    }
-}
diff --git a/modules/tensorflow/src/main/java/org/apache/ignite/tensorflow/cluster/util/TensorFlowClusterResolver.java b/modules/tensorflow/src/main/java/org/apache/ignite/tensorflow/cluster/util/TensorFlowClusterResolver.java
deleted file mode 100644
index 87aafaf..0000000
--- a/modules/tensorflow/src/main/java/org/apache/ignite/tensorflow/cluster/util/TensorFlowClusterResolver.java
+++ /dev/null
@@ -1,131 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package org.apache.ignite.tensorflow.cluster.util;
-
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.HashSet;
-import java.util.List;
-import java.util.Set;
-import java.util.UUID;
-import org.apache.ignite.Ignite;
-import org.apache.ignite.cache.affinity.Affinity;
-import org.apache.ignite.cluster.ClusterNode;
-import org.apache.ignite.tensorflow.cluster.spec.TensorFlowClusterSpec;
-import org.apache.ignite.tensorflow.cluster.spec.TensorFlowServerAddressSpec;
-
-/**
- * TensorFlow cluster resolver based on Ignite Cache affinity.
- */
-public class TensorFlowClusterResolver {
-    /** TensorFlow worker job name. */
-    public static final String WORKER_JOB_NAME = "worker";
-
-    /** TensorFlow chief job name. */
-    public static final String CHIEF_JOB_NAME = "chief";
-
-    /** Ignite instance. */
-    private final Ignite ignite;
-
-    /** Cluster port manager. */
-    private final ClusterPortManager portMgr;
-
-    /**
-     * Constructs a new instance of TensorFlow cluster resolver.
-     *
-     * @param ignite Ignite instance.
-     */
-    public TensorFlowClusterResolver(Ignite ignite, String portPoolName, int portFrom, int portCnt) {
-        assert ignite != null : "Ignite instance should not be null";
-        assert portPoolName != null : "Port pool name should not be null";
-        assert portFrom >= 0 : "Port count should not be negative";
-        assert portCnt >= 0 && portCnt + portFrom <= 0xFFFF : "Port range should be between 0 and 65535";
-
-        this.ignite = ignite;
-        this.portMgr = new ClusterPortManager(ignite, portPoolName, portFrom, portCnt);
-    }
-
-    /**
-     * Resolves TensorFlow cluster and acquires required ports.
-     *
-     * @param upstreamCacheName Upstream cache name.
-     * @return TensorFlow cluster specification.
-     */
-    public TensorFlowClusterSpec resolveAndAcquirePorts(String upstreamCacheName) {
-        TensorFlowClusterSpec spec = new TensorFlowClusterSpec();
-
-        resolveAndAcquirePortsForWorkers(spec, upstreamCacheName);
-        resolveAndAcquirePortsForChief(spec);
-
-        return spec;
-    }
-
-    /**
-     * Releases ports acquired for the given cluster specification.
-     *
-     * @param spec TensorFlow cluster specification.
-     */
-    public void releasePorts(TensorFlowClusterSpec spec) {
-        for (String jobName : spec.getJobs().keySet())
-            for (TensorFlowServerAddressSpec address : spec.getJobs().get(jobName))
-                portMgr.releasePort(address.getNodeId(), address.getPort());
-    }
-
-    /** Destroys TensorFlow cluster resolver. */
-    public void destroy() {
-        portMgr.destroy();
-    }
-
-    /**
-     * Resolves TensorFlow cluster worker jobs and acquires ports.
-     *
-     * @param spec TensorFlow cluster specification.
-     * @param upstreamCacheName Upstream cache name.
-     */
-    private void resolveAndAcquirePortsForWorkers(TensorFlowClusterSpec spec, String upstreamCacheName) {
-        Affinity<?> affinity = ignite.affinity(upstreamCacheName);
-        int parts = affinity.partitions();
-
-        Set<UUID> distinctNodeIds = new HashSet<>();
-        for (int part = 0; part < parts; part++) {
-            ClusterNode node = affinity.mapPartitionToNode(part);
-            UUID nodeId = node.id();
-            distinctNodeIds.add(nodeId);
-        }
-        List<UUID> nodeIds = new ArrayList<>(distinctNodeIds);
-        Collections.sort(nodeIds);
-
-        for (UUID nodeId : nodeIds) {
-            int port = portMgr.acquirePort(nodeId);
-            spec.addTask(WORKER_JOB_NAME, nodeId, port);
-        }
-    }
-
-    /**
-     * Resolves TensorFlow cluster chief job and acquires ports.
-     *
-     * @param spec TensorFlow cluster specification.
-     */
-    private void resolveAndAcquirePortsForChief(TensorFlowClusterSpec spec) {
-        ClusterNode chiefNode = ignite.cluster().localNode();
-        UUID chiefNodeId = chiefNode.id();
-        int chiefPort = portMgr.acquirePort(chiefNodeId);
-
-        spec.addTask(CHIEF_JOB_NAME, chiefNodeId, chiefPort);
-    }
-}
diff --git a/modules/tensorflow/src/main/java/org/apache/ignite/tensorflow/cluster/util/TensorFlowProcessBuilderSupplier.java b/modules/tensorflow/src/main/java/org/apache/ignite/tensorflow/cluster/util/TensorFlowProcessBuilderSupplier.java
deleted file mode 100644
index 73f4b4b..0000000
--- a/modules/tensorflow/src/main/java/org/apache/ignite/tensorflow/cluster/util/TensorFlowProcessBuilderSupplier.java
+++ /dev/null
@@ -1,72 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package org.apache.ignite.tensorflow.cluster.util;
-
-import java.util.Map;
-import org.apache.ignite.Ignite;
-import org.apache.ignite.Ignition;
-import org.apache.ignite.cluster.ClusterNode;
-import org.apache.ignite.internal.processors.odbc.ClientListenerProcessor;
-import org.apache.ignite.tensorflow.core.util.PythonProcessBuilderSupplier;
-
-/**
- * Python process builder supplier that is used to create TensorFlow worker process builder.
- */
-public class TensorFlowProcessBuilderSupplier extends PythonProcessBuilderSupplier {
-    /** */
-    private static final long serialVersionUID = 6866243505446122897L;
-
-    /** Prefix for worker environment variables. */
-    private static final String ENV_PREFIX = "IGNITE_DATASET_";
-
-    /** Upstream cache query local mode. */
-    private final Boolean loc;
-
-    /**
-     * Constructs a new instance of Python process builder supplier.
-     *
-     * @param interactive Interactive flag (allows to used standard input to pass Python script).
-     * @param loc Upstream cache query local mode.
-     * @param meta Meta information that adds to script as arguments.
-     */
-    public TensorFlowProcessBuilderSupplier(boolean interactive, Boolean loc, String... meta) {
-        super(interactive, meta);
-        this.loc = loc;
-    }
-
-    /** {@inheritDoc} */
-    @Override public ProcessBuilder get() {
-        ProcessBuilder pythonProcBuilder = super.get();
-
-        Ignite ignite = Ignition.ignite();
-        ClusterNode locNode = ignite.cluster().localNode();
-
-        Integer port = locNode.attribute(ClientListenerProcessor.CLIENT_LISTENER_PORT);
-
-        Map<String, String> env = pythonProcBuilder.environment();
-        env.put(ENV_PREFIX + "HOST", "localhost");
-
-        if (port != null)
-            env.put(ENV_PREFIX + "PORT", String.valueOf(port));
-
-        if (loc != null)
-            env.put(ENV_PREFIX + "LOCAL", String.valueOf(loc));
-
-        return pythonProcBuilder;
-    }
-}
diff --git a/modules/tensorflow/src/main/java/org/apache/ignite/tensorflow/cluster/util/TensorFlowUserScriptRunner.java b/modules/tensorflow/src/main/java/org/apache/ignite/tensorflow/cluster/util/TensorFlowUserScriptRunner.java
deleted file mode 100644
index d9ed9b2..0000000
--- a/modules/tensorflow/src/main/java/org/apache/ignite/tensorflow/cluster/util/TensorFlowUserScriptRunner.java
+++ /dev/null
@@ -1,231 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package org.apache.ignite.tensorflow.cluster.util;
-
-import java.io.BufferedOutputStream;
-import java.io.ByteArrayInputStream;
-import java.io.File;
-import java.io.FileOutputStream;
-import java.io.IOException;
-import java.nio.file.Files;
-import java.util.List;
-import java.util.Map;
-import java.util.StringJoiner;
-import java.util.concurrent.ExecutorService;
-import java.util.function.Consumer;
-import java.util.zip.ZipEntry;
-import java.util.zip.ZipInputStream;
-import org.apache.commons.io.IOUtils;
-import org.apache.ignite.Ignite;
-import org.apache.ignite.IgniteLogger;
-import org.apache.ignite.Ignition;
-import org.apache.ignite.tensorflow.cluster.TensorFlowJobArchive;
-import org.apache.ignite.tensorflow.cluster.spec.TensorFlowClusterSpec;
-import org.apache.ignite.tensorflow.cluster.spec.TensorFlowServerAddressSpec;
-import org.apache.ignite.tensorflow.core.util.AsyncNativeProcessRunner;
-import org.apache.ignite.tensorflow.core.util.NativeProcessRunner;
-
-/**
- * Utils class that helps to start and stop user script process.
- */
-public class TensorFlowUserScriptRunner extends AsyncNativeProcessRunner {
-    /** Ignite logger. */
-    private final IgniteLogger log;
-
-    /** Job archive that will be extracted and used as working directory for the native process. */
-    private final TensorFlowJobArchive jobArchive;
-
-    /** TensorFlow cluster specification. */
-    private final TensorFlowClusterSpec clusterSpec;
-
-    /** Output stream data consumer. */
-    private final Consumer<String> out;
-
-    /** Error stream data consumer. */
-    private final Consumer<String> err;
-
-    /** Working directory of the user script process. */
-    private File workingDir;
-
-    /**
-     * Constructs a new instance of TensorFlow user script runner.
-     *
-     * @param ignite Ignite instance.
-     * @param executor Executor to be used in {@link AsyncNativeProcessRunner}.
-     * @param jobArchive  Job archive that will be extracted and used as working directory for the native process.
-     * @param clusterSpec TensorFlow cluster specification.
-     * @param out Output stream data consumer.
-     * @param err  Error stream data consumer.
-     */
-    public TensorFlowUserScriptRunner(Ignite ignite, ExecutorService executor, TensorFlowJobArchive jobArchive,
-        TensorFlowClusterSpec clusterSpec, Consumer<String> out, Consumer<String> err) {
-        super(ignite, executor);
-
-        this.log = ignite.log().getLogger(TensorFlowUserScriptRunner.class);
-
-        this.jobArchive = jobArchive;
-        this.clusterSpec = clusterSpec;
-        this.out = out;
-        this.err = err;
-    }
-
-    /** {@inheritDoc} */
-    @Override public NativeProcessRunner doBefore() {
-        try {
-            workingDir = Files.createTempDirectory("tf_us_").toFile();
-            log.debug("Directory has been created [path=" + workingDir.getAbsolutePath() + "]");
-
-            unzip(jobArchive.getData(), workingDir);
-            log.debug("Job archive has been extracted [path=" + workingDir.getAbsolutePath() + "]");
-
-            return prepareNativeProcessRunner();
-        }
-        catch (IOException e) {
-            throw new RuntimeException(e);
-        }
-    }
-
-    /** {@inheritDoc} */
-    @Override public void doAfter() {
-        if (workingDir != null) {
-            delete(workingDir);
-            log.debug("Directory has been deleted [path=" + workingDir.getAbsolutePath() + "]");
-        }
-    }
-
-    /**
-     * Prepares process builder and specifies working directory and command to be run.
-     *
-     * @return Prepared process builder.
-     */
-    private NativeProcessRunner prepareNativeProcessRunner() {
-        if (workingDir == null)
-            throw new IllegalStateException("Working directory is not created");
-
-        ProcessBuilder procBuilder = new TensorFlowProcessBuilderSupplier(false, null).get();
-
-        procBuilder.directory(workingDir);
-        procBuilder.command(jobArchive.getCommands());
-
-        Map<String, String> env = procBuilder.environment();
-        env.put("PYTHONPATH", workingDir.getAbsolutePath());
-        env.put("TF_CLUSTER", formatTfClusterVar());
-        env.put("TF_WORKERS", formatTfWorkersVar());
-        env.put("TF_CHIEF_SERVER", formatTfChiefServerVar());
-
-        return new NativeProcessRunner(procBuilder, null, out, err);
-    }
-
-    /**
-     * Formats "TF_CLUSTER" variable to be passed into user script.
-     *
-     * @return Formatted "TF_CLUSTER" variable to be passed into user script.
-     */
-    private String formatTfClusterVar() {
-        return clusterSpec.format(Ignition.ignite());
-    }
-
-    /**
-     * Formats "TF_WORKERS" variable to be passed into user script.
-     *
-     * @return Formatted "TF_WORKERS" variable to be passed into user script.
-     */
-    private String formatTfWorkersVar() {
-        StringJoiner joiner = new StringJoiner(", ");
-
-        int cnt = clusterSpec.getJobs().get(TensorFlowClusterResolver.WORKER_JOB_NAME).size();
-        for (int i = 0; i < cnt; i++)
-            joiner.add("\"/job:" + TensorFlowClusterResolver.WORKER_JOB_NAME + "/task:" + i + "\"");
-
-        return "[" + joiner + "]";
-    }
-
-    /**
-     * Formats "TF_CHIEF_SERVER" variable to be passed into user script.
-     *
-     * @return Formatted "TF_CHIEF_SERVER" variable to be passed into user script.
-     */
-    private String formatTfChiefServerVar() {
-        List<TensorFlowServerAddressSpec> tasks = clusterSpec.getJobs().get(TensorFlowClusterResolver.CHIEF_JOB_NAME);
-
-        if (tasks == null || tasks.size() != 1)
-            throw new IllegalStateException("TensorFlow cluster specification should contain exactly one chief task");
-
-        TensorFlowServerAddressSpec addrSpec = tasks.iterator().next();
-
-        return "grpc://" + addrSpec.format(Ignition.ignite());
-    }
-
-    /**
-     * Clears given file or directory recursively.
-     *
-     * @param file File or directory to be cleaned,
-     */
-    private void delete(File file) {
-        if (file.isDirectory()) {
-            String[] files = file.list();
-
-            if (files != null && files.length != 0)
-                for (String fileToBeDeleted : files)
-                    delete(new File(file, fileToBeDeleted));
-
-            if (!file.delete())
-                throw new IllegalStateException("Can't delete directory [path=" + file.getAbsolutePath() + "]");
-        }
-        else {
-            if (!file.delete())
-                throw new IllegalStateException("Can't delete file [path=" + file.getAbsolutePath() + "]");
-        }
-    }
-
-    /**
-     * Extracts specified zip archive into specified directory.
-     *
-     * @param data Zip archive to be extracted.
-     * @param extractTo Target directory.
-     */
-    private void unzip(byte[] data, File extractTo) {
-        try (ZipInputStream zipStream = new ZipInputStream(new ByteArrayInputStream(data))) {
-            ZipEntry entry;
-            while ((entry = zipStream.getNextEntry()) != null) {
-                File file = new File(extractTo, entry.getName());
-
-                if (entry.isDirectory() && !file.exists()) {
-                    boolean created = file.mkdirs();
-                    if (!created)
-                        throw new IllegalStateException("Can't create directory [path=" + file.getAbsolutePath() + "]");
-                }
-                else {
-                    if (!file.getParentFile().exists()) {
-                        boolean created = file.getParentFile().mkdirs();
-                        if (!created)
-                            throw new IllegalStateException("Can't create directory [path=" +
-                                file.getParentFile().getAbsolutePath() + "]");
-                    }
-
-                    try (BufferedOutputStream out = new BufferedOutputStream(new FileOutputStream(file))) {
-                        IOUtils.copy(zipStream, out);
-                    }
-                }
-            }
-        }
-        catch (IOException e) {
-            throw new RuntimeException(e);
-        }
-    }
-}
diff --git a/modules/tensorflow/src/main/java/org/apache/ignite/tensorflow/cluster/util/package-info.java b/modules/tensorflow/src/main/java/org/apache/ignite/tensorflow/cluster/util/package-info.java
deleted file mode 100644
index f48d20b..0000000
--- a/modules/tensorflow/src/main/java/org/apache/ignite/tensorflow/cluster/util/package-info.java
+++ /dev/null
@@ -1,23 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-/**
- * <!-- Package description. -->
- * Util components that are used in TensorFlow cluster package.
- */
-
-package org.apache.ignite.tensorflow.cluster.util;
diff --git a/modules/tensorflow/src/main/java/org/apache/ignite/tensorflow/core/ProcessManager.java b/modules/tensorflow/src/main/java/org/apache/ignite/tensorflow/core/ProcessManager.java
deleted file mode 100644
index c825448..0000000
--- a/modules/tensorflow/src/main/java/org/apache/ignite/tensorflow/core/ProcessManager.java
+++ /dev/null
@@ -1,62 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package org.apache.ignite.tensorflow.core;
-
-import java.util.List;
-import java.util.Map;
-import java.util.UUID;
-import org.apache.ignite.tensorflow.core.longrunning.task.util.LongRunningProcessStatus;
-
-/**
- * Process manager that allows to run and maintain processes in the cluster.
- *
- * @param <R> Type of task to be run.
- */
-public interface ProcessManager<R> {
-    /**
-     * Starts the processes by the given specifications.
-     *
-     * @param specifications Process specifications.
-     * @return Map of node identifier as a key and list of started process identifiers as a value.
-     */
-    public Map<UUID, List<UUID>> start(List<R> specifications);
-
-    /**
-     * Pings the given processes.
-     *
-     * @param procIds Map of node identifier as a key and list of process identifiers as a value.
-     * @return Map of node identifier as a key and list of process statuses as a value.
-     */
-    public Map<UUID, List<LongRunningProcessStatus>> ping(Map<UUID, List<UUID>> procIds);
-
-    /**
-     * Stops the given processes.
-     *
-     * @param procIds Map of node identifier as a key and list of process identifiers as a value.
-     * @return Map of node identifier as a key and list of process statuses as a value.
-     */
-    public Map<UUID, List<LongRunningProcessStatus>> stop(Map<UUID, List<UUID>> procIds, boolean clear);
-
-    /**
-     * Clears metadata of the given processes.
-     *
-     * @param procIds Map of node identifier as a key and list of process identifiers as a value.
-     * @return Map of node identifier as a key and list of process statuses as a value.
-     */
-    public Map<UUID, List<LongRunningProcessStatus>> clear(Map<UUID, List<UUID>> procIds);
-}
diff --git a/modules/tensorflow/src/main/java/org/apache/ignite/tensorflow/core/ProcessManagerWrapper.java b/modules/tensorflow/src/main/java/org/apache/ignite/tensorflow/core/ProcessManagerWrapper.java
deleted file mode 100644
index 4f10e83..0000000
--- a/modules/tensorflow/src/main/java/org/apache/ignite/tensorflow/core/ProcessManagerWrapper.java
+++ /dev/null
@@ -1,80 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package org.apache.ignite.tensorflow.core;
-
-import java.util.ArrayList;
-import java.util.List;
-import java.util.Map;
-import java.util.UUID;
-import org.apache.ignite.tensorflow.core.longrunning.task.util.LongRunningProcessStatus;
-
-/**
- * Process manager wrapper that allows to define how one type of process specification should be transformed into
- * another type of process specification delegate working with and delegate all operations to this delegate.
- *
- * @param <T> Type of process specification delegate working with.
- * @param <R> Type of accepted process specifications.
- */
-public abstract class ProcessManagerWrapper<T, R> implements ProcessManager<R> {
-    /** Delegate. */
-    private final ProcessManager<T> delegate;
-
-    /**
-     * Constructs a new instance of process manager wrapper.
-     *
-     * @param delegate Delegate.
-     */
-    public ProcessManagerWrapper(ProcessManager<T> delegate) {
-        assert delegate != null : "Delegate should not be null";
-
-        this.delegate = delegate;
-    }
-
-    /**
-     * Transforms accepted process specification into process specification delegate working with.
-     *
-     * @param spec Accepted process specification.
-     * @return Process specification delegate working with.
-     */
-    protected abstract T transformSpecification(R spec);
-
-    /** {@inheritDoc} */
-    @Override public Map<UUID, List<UUID>> start(List<R> specifications) {
-        List<T> transformedSpecifications = new ArrayList<>();
-
-        for (R spec : specifications)
-            transformedSpecifications.add(transformSpecification(spec));
-
-        return delegate.start(transformedSpecifications);
-    }
-
-    /** {@inheritDoc} */
-    @Override public Map<UUID, List<LongRunningProcessStatus>> ping(Map<UUID, List<UUID>> procIds) {
-        return delegate.ping(procIds);
-    }
-
-    /** {@inheritDoc} */
-    @Override public Map<UUID, List<LongRunningProcessStatus>> stop(Map<UUID, List<UUID>> procIds, boolean clear) {
-        return delegate.stop(procIds, clear);
-    }
-
-    /** {@inheritDoc} */
-    @Override public Map<UUID, List<LongRunningProcessStatus>> clear(Map<UUID, List<UUID>> procIds) {
-        return delegate.clear(procIds);
-    }
-}
diff --git a/modules/tensorflow/src/main/java/org/apache/ignite/tensorflow/core/longrunning/LongRunningProcess.java b/modules/tensorflow/src/main/java/org/apache/ignite/tensorflow/core/longrunning/LongRunningProcess.java
deleted file mode 100644
index f11f42a..0000000
--- a/modules/tensorflow/src/main/java/org/apache/ignite/tensorflow/core/longrunning/LongRunningProcess.java
+++ /dev/null
@@ -1,61 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package org.apache.ignite.tensorflow.core.longrunning;
-
-import java.io.Serializable;
-import java.util.UUID;
-import org.apache.ignite.lang.IgniteRunnable;
-
-/**
- * Long running process specification that contains identifier of a node where the process should be running on and the
- * task to be run.
- */
-public class LongRunningProcess implements Serializable {
-    /** */
-    private static final long serialVersionUID = 6039507725567997183L;
-
-    /** Node identifier. */
-    private final UUID nodeId;
-
-    /** Task to be run. */
-    private final IgniteRunnable task;
-
-    /**
-     * Constructs a new instance of long running process specification.
-     *
-     * @param nodeId Node identifier.
-     * @param task Task to be run.
-     */
-    public LongRunningProcess(UUID nodeId, IgniteRunnable task) {
-        assert nodeId != null : "Node identifier should not be null";
-        assert task != null : "Task should not be null";
-
-        this.nodeId = nodeId;
-        this.task = task;
-    }
-
-    /** */
-    public UUID getNodeId() {
-        return nodeId;
-    }
-
-    /** */
-    public IgniteRunnable getTask() {
-        return task;
-    }
-}
diff --git a/modules/tensorflow/src/main/java/org/apache/ignite/tensorflow/core/longrunning/LongRunningProcessManager.java b/modules/tensorflow/src/main/java/org/apache/ignite/tensorflow/core/longrunning/LongRunningProcessManager.java
deleted file mode 100644
index a25ff97..0000000
--- a/modules/tensorflow/src/main/java/org/apache/ignite/tensorflow/core/longrunning/LongRunningProcessManager.java
+++ /dev/null
@@ -1,161 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package org.apache.ignite.tensorflow.core.longrunning;
-
-import java.util.ArrayList;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-import java.util.UUID;
-import java.util.function.Consumer;
-import java.util.function.Function;
-import org.apache.ignite.Ignite;
-import org.apache.ignite.cluster.ClusterGroup;
-import org.apache.ignite.cluster.ClusterGroupEmptyException;
-import org.apache.ignite.tensorflow.core.ProcessManager;
-import org.apache.ignite.tensorflow.core.longrunning.task.LongRunningProcessClearTask;
-import org.apache.ignite.tensorflow.core.longrunning.task.LongRunningProcessPingTask;
-import org.apache.ignite.tensorflow.core.longrunning.task.LongRunningProcessStartTask;
-import org.apache.ignite.tensorflow.core.longrunning.task.LongRunningProcessStopTask;
-import org.apache.ignite.tensorflow.core.longrunning.task.LongRunningProcessTask;
-import org.apache.ignite.tensorflow.core.longrunning.task.util.LongRunningProcessStatus;
-
-/**
- * Long running process manager that allows to start, stop and make other actions with long running processes.
- */
-public class LongRunningProcessManager implements ProcessManager<LongRunningProcess> {
-    /** Ignite instance. */
-    private final Ignite ignite;
-
-    /**
-     * Constructs a new instance of long running process manager.
-     *
-     * @param ignite Ignite instance.
-     */
-    public LongRunningProcessManager(Ignite ignite) {
-        assert ignite != null : "Ignite instance should not be null";
-
-        this.ignite = ignite;
-    }
-
-    /** {@inheritDoc} */
-    @Override public Map<UUID, List<UUID>> start(List<LongRunningProcess> specifications) {
-        return call(groupByNodeId(specifications), LongRunningProcessStartTask::new, this::rollbackStartTask, false);
-    }
-
-    /** {@inheritDoc} */
-    @Override public Map<UUID, List<LongRunningProcessStatus>> ping(Map<UUID, List<UUID>> procIds) {
-        return call(procIds, LongRunningProcessPingTask::new, this::rollbackNothing, false);
-    }
-
-    /** {@inheritDoc} */
-    @Override public Map<UUID, List<LongRunningProcessStatus>> stop(Map<UUID, List<UUID>> procIds, boolean clear) {
-        return call(procIds, params -> new LongRunningProcessStopTask(params, clear), this::rollbackNothing, true);
-    }
-
-    /** {@inheritDoc} */
-    @Override public Map<UUID, List<LongRunningProcessStatus>> clear(Map<UUID, List<UUID>> procIds) {
-        return call(procIds, LongRunningProcessClearTask::new, this::rollbackNothing, true);
-    }
-
-    /**
-     * Sends the specified tasks to the cluster to be executed.
-     *
-     * @param params Parameters needed to create tasks.
-     * @param taskSupplier Supplier that defines how to create tasks.
-     * @param rollback Rollback procedure.
-     * @param onlyIfNodeExists If node doesn't exist the correspondent task will be ignored.
-     * @param <T> Type of params needed to create tasks.
-     * @param <E> Type of returned by task value.
-     * @return Map of node identifier as a key and list task results as a value.
-     */
-    private <T, E> Map<UUID, List<E>> call(Map<UUID, List<T>> params,
-        Function<List<T>, LongRunningProcessTask<List<E>>> taskSupplier, Consumer<Map<UUID, List<E>>> rollback,
-        boolean onlyIfNodeExists) {
-        Map<UUID, List<E>> res = new HashMap<>();
-
-        try {
-            for (UUID nodeId : params.keySet()) {
-                List<T> nodeProcesses = params.get(nodeId);
-                LongRunningProcessTask<List<E>> task = taskSupplier.apply(nodeProcesses);
-
-                ClusterGroup clusterGrp = ignite.cluster().forNodeId(nodeId);
-
-                try {
-                    List<E> nodeRes = ignite.compute(clusterGrp).call(task);
-                    res.put(nodeId, nodeRes);
-                }
-                catch (ClusterGroupEmptyException e) {
-                    if (!onlyIfNodeExists)
-                        throw e;
-                }
-            }
-        }
-        catch (Exception e) {
-            // All-or-nothing strategy. In case of exception already processed tasks should be rolled back.
-            rollback.accept(res);
-
-            throw e;
-        }
-
-        return res;
-    }
-
-    /**
-     * Groups the given process specifications by node identifier.
-     *
-     * @param specifications Process specifications.
-     * @return Map of node identifier as a key and list of process specifications as a value.
-     */
-    private Map<UUID, List<LongRunningProcess>> groupByNodeId(List<LongRunningProcess> specifications) {
-        Map<UUID, List<LongRunningProcess>> res = new HashMap<>();
-
-        for (LongRunningProcess spec : specifications) {
-            UUID nodeId = spec.getNodeId();
-
-            List<LongRunningProcess> nodeSpecs = res.get(nodeId);
-
-            if (nodeSpecs == null) {
-                nodeSpecs = new ArrayList<>();
-                nodeSpecs.add(spec);
-                res.put(nodeId, nodeSpecs);
-            }
-            else
-                nodeSpecs.add(spec);
-        }
-
-        return res;
-    }
-
-    /**
-     * Rolls back start task successfully applied earlier.
-     *
-     * @param procIds Process identifiers.
-     */
-    private void rollbackStartTask(Map<UUID, List<UUID>> procIds) {
-        stop(procIds, true);
-    }
-
-    /**
-     * Rolls back nothing. Ping, stop and clear tasks cannot be rolled back, so it's the only one available strategy
-     * for these tasks.
-     */
-    private void rollbackNothing(Map<UUID, List<LongRunningProcessStatus>> processes) {
-        // Do nothing.
-    }
-}
diff --git a/modules/tensorflow/src/main/java/org/apache/ignite/tensorflow/core/longrunning/package-info.java b/modules/tensorflow/src/main/java/org/apache/ignite/tensorflow/core/longrunning/package-info.java
deleted file mode 100644
index d1edf16..0000000
--- a/modules/tensorflow/src/main/java/org/apache/ignite/tensorflow/core/longrunning/package-info.java
+++ /dev/null
@@ -1,26 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-/**
- * <!-- Package description. -->
- * The part of TensorFlow integration infrastructure that allows to start and maintain abstract long-running processes.
- * As described in {@link org.apache.ignite.tensorflow.core.longrunning.LongRunningProcess} user only needs to specify
- * runnable task and the node identifier the process should be started on and LongRunning Process Manager will make the
- * rest so that the specified runnable will be executed and maintained on the specified node.
- */
-
-package org.apache.ignite.tensorflow.core.longrunning;
diff --git a/modules/tensorflow/src/main/java/org/apache/ignite/tensorflow/core/longrunning/task/LongRunningProcessClearTask.java b/modules/tensorflow/src/main/java/org/apache/ignite/tensorflow/core/longrunning/task/LongRunningProcessClearTask.java
deleted file mode 100644
index 2afaaa9..0000000
--- a/modules/tensorflow/src/main/java/org/apache/ignite/tensorflow/core/longrunning/task/LongRunningProcessClearTask.java
+++ /dev/null
@@ -1,98 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package org.apache.ignite.tensorflow.core.longrunning.task;
-
-import org.apache.ignite.tensorflow.core.longrunning.task.util.LongRunningProcessState;
-import org.apache.ignite.tensorflow.core.longrunning.task.util.LongRunningProcessStatus;
-import java.util.ArrayList;
-import java.util.List;
-import java.util.Map;
-import java.util.UUID;
-import java.util.concurrent.Future;
-
-/**
- * Task that clears process metadata on the node where the process has run.
- */
-public class LongRunningProcessClearTask extends LongRunningProcessTask<List<LongRunningProcessStatus>> {
-    /** */
-    private static final long serialVersionUID = -1840332865137076107L;
-
-    /** Process identifiers. */
-    private final List<UUID> procIds;
-
-    /**
-     * Constructs a new instance of clear task.
-     *
-     * @param procIds Process identifiers.
-     */
-    public LongRunningProcessClearTask(List<UUID> procIds) {
-        assert procIds != null : "Process identifiers should not be null";
-
-        this.procIds = procIds;
-    }
-
-    /** {@inheritDoc} */
-    @Override public List<LongRunningProcessStatus> call() {
-        ArrayList<LongRunningProcessStatus> res = new ArrayList<>();
-
-        for (UUID prodId : procIds)
-            res.add(prepareProcessForRemoving(prodId));
-
-        // All-or-nothing strategy. Processes will be removed only if all processes can be removed.
-        removeProcessesFromMetadataStorage();
-
-        return res;
-    }
-
-    /**
-     * Prepares process to be removed. Checks that the process is not running and wraps information about state and
-     * exception into a status object.
-     *
-     * @param procId Process identifier.
-     * @return Process status.
-     */
-    private LongRunningProcessStatus prepareProcessForRemoving(UUID procId) {
-        Map<UUID, Future<?>> metadataStorage = getMetadataStorage();
-
-        Future<?> fut = metadataStorage.get(procId);
-
-        if (fut == null)
-            return new LongRunningProcessStatus(LongRunningProcessState.NOT_FOUND);
-
-        if (!fut.isDone())
-            throw new IllegalStateException("Process is still running [procId=" + procId + "]");
-
-        try {
-            fut.get();
-            return new LongRunningProcessStatus(LongRunningProcessState.DONE);
-        }
-        catch (Exception e) {
-            return new LongRunningProcessStatus(LongRunningProcessState.DONE, e);
-        }
-    }
-
-    /**
-     * Removes processes from metadata storage.
-     */
-    private void removeProcessesFromMetadataStorage() {
-        Map<UUID, Future<?>> metadataStorage = getMetadataStorage();
-
-        for (UUID procId : procIds)
-            metadataStorage.remove(procId);
-    }
-}
diff --git a/modules/tensorflow/src/main/java/org/apache/ignite/tensorflow/core/longrunning/task/LongRunningProcessPingTask.java b/modules/tensorflow/src/main/java/org/apache/ignite/tensorflow/core/longrunning/task/LongRunningProcessPingTask.java
deleted file mode 100644
index 5d54886..0000000
--- a/modules/tensorflow/src/main/java/org/apache/ignite/tensorflow/core/longrunning/task/LongRunningProcessPingTask.java
+++ /dev/null
@@ -1,85 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package org.apache.ignite.tensorflow.core.longrunning.task;
-
-import org.apache.ignite.tensorflow.core.longrunning.task.util.LongRunningProcessStatus;
-import org.apache.ignite.tensorflow.core.longrunning.task.util.LongRunningProcessState;
-import java.util.ArrayList;
-import java.util.List;
-import java.util.Map;
-import java.util.UUID;
-import java.util.concurrent.Future;
-
-/**
- * Task that pings processes to check their statuses.
- */
-public class LongRunningProcessPingTask extends LongRunningProcessTask<List<LongRunningProcessStatus>> {
-    /** */
-    private static final long serialVersionUID = 7003289989579770395L;
-
-    /** Process identifiers. */
-    private final List<UUID> procIds;
-
-    /**
-     * Constructs a new instance of ping task.
-     *
-     * @param procIds Process identifiers.
-     */
-    public LongRunningProcessPingTask(List<UUID> procIds) {
-        assert procIds != null : "Process identifiers should not be null";
-
-        this.procIds = procIds;
-    }
-
-    /** {@inheritDoc} */
-    @Override public List<LongRunningProcessStatus> call() {
-        ArrayList<LongRunningProcessStatus> statuses = new ArrayList<>();
-
-        for (UUID procId : procIds)
-            statuses.add(getProcessStatus(procId));
-
-        return statuses;
-    }
-
-    /**
-     * Extracts the process status.
-     *
-     * @param procId Process identifier.
-     * @return Process status.
-     */
-    private LongRunningProcessStatus getProcessStatus(UUID procId) {
-        Map<UUID, Future<?>> metadataStorage = getMetadataStorage();
-
-        Future<?> fut = metadataStorage.get(procId);
-
-        if (fut == null)
-            return new LongRunningProcessStatus(LongRunningProcessState.NOT_FOUND);
-
-        if (!fut.isDone())
-            return new LongRunningProcessStatus(LongRunningProcessState.RUNNING);
-
-        try {
-            fut.get();
-        }
-        catch (Exception e) {
-            return new LongRunningProcessStatus(LongRunningProcessState.DONE, e);
-        }
-
-        return new LongRunningProcessStatus(LongRunningProcessState.DONE);
-    }
-}
diff --git a/modules/tensorflow/src/main/java/org/apache/ignite/tensorflow/core/longrunning/task/LongRunningProcessStartTask.java b/modules/tensorflow/src/main/java/org/apache/ignite/tensorflow/core/longrunning/task/LongRunningProcessStartTask.java
deleted file mode 100644
index 04f90d3..0000000
--- a/modules/tensorflow/src/main/java/org/apache/ignite/tensorflow/core/longrunning/task/LongRunningProcessStartTask.java
+++ /dev/null
@@ -1,114 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package org.apache.ignite.tensorflow.core.longrunning.task;
-
-import java.util.ArrayList;
-import java.util.List;
-import java.util.Map;
-import java.util.UUID;
-import java.util.concurrent.Executors;
-import java.util.concurrent.Future;
-import org.apache.ignite.tensorflow.core.longrunning.LongRunningProcess;
-import org.apache.ignite.tensorflow.core.util.CustomizableThreadFactory;
-
-/**
- * Task that starts long running processes by their specifications.
- */
-public class LongRunningProcessStartTask extends LongRunningProcessTask<List<UUID>> {
-    /** */
-    private static final long serialVersionUID = -3934183044853083034L;
-
-    /** Process specifications. */
-    private final List<LongRunningProcess> processes;
-
-    /**
-     * Constructs a new instance of start task.
-     *
-     * @param processes Process specifications.
-     */
-    public LongRunningProcessStartTask(List<LongRunningProcess> processes) {
-        assert processes != null : "Processes should not be null";
-
-        this.processes = processes;
-    }
-
-    /** {@inheritDoc} */
-    @Override public List<UUID> call() {
-        ArrayList<UUID> res = new ArrayList<>();
-
-        try {
-            for (LongRunningProcess proc : processes) {
-                Future<?> fut = runTask(proc.getTask());
-
-                UUID procId = saveProcMetadata(fut);
-
-                res.add(procId);
-            }
-        }
-        catch (Exception e) {
-            // All-or-nothing strategy. In case of exception already started processes will be stopped.
-            stopAllProcessesAndClearMetadata(res);
-
-            throw e;
-        }
-
-        return res;
-    }
-
-    /**
-     * Executes the task in a separate thread.
-     *
-     * @param task Task to be executed.
-     * @return Future that allows to interrupt or get the status of the task.
-     */
-    private Future<?> runTask(Runnable task) {
-        return Executors
-            .newSingleThreadExecutor(new CustomizableThreadFactory("tf-long-running", true))
-            .submit(task);
-    }
-
-    /**
-     * Saves process metadata into the local metadata storage.
-     *
-     * @param fut Future that allows to interrupt or get the status of the task.
-     * @return Process identifier.
-     */
-    private UUID saveProcMetadata(Future<?> fut) {
-        Map<UUID, Future<?>> metadataStorage = getMetadataStorage();
-
-        UUID procId = UUID.randomUUID();
-
-        metadataStorage.put(procId, fut);
-
-        return procId;
-    }
-
-    /**
-     * Stop all processes by their identifiers and removes them from the metadata storage.
-     *
-     * @param procIds Process identifiers.
-     */
-    private void stopAllProcessesAndClearMetadata(List<UUID> procIds) {
-        Map<UUID, Future<?>> metadataStorage = getMetadataStorage();
-
-        for (UUID procId : procIds) {
-            Future<?> fut = metadataStorage.remove(procId);
-            fut.cancel(true);
-        }
-    }
-}
diff --git a/modules/tensorflow/src/main/java/org/apache/ignite/tensorflow/core/longrunning/task/LongRunningProcessStopTask.java b/modules/tensorflow/src/main/java/org/apache/ignite/tensorflow/core/longrunning/task/LongRunningProcessStopTask.java
deleted file mode 100644
index 56b906b..0000000
--- a/modules/tensorflow/src/main/java/org/apache/ignite/tensorflow/core/longrunning/task/LongRunningProcessStopTask.java
+++ /dev/null
@@ -1,102 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package org.apache.ignite.tensorflow.core.longrunning.task;
-
-import org.apache.ignite.tensorflow.core.longrunning.task.util.LongRunningProcessStatus;
-import org.apache.ignite.tensorflow.core.longrunning.task.util.LongRunningProcessState;
-import java.util.ArrayList;
-import java.util.List;
-import java.util.Map;
-import java.util.UUID;
-import java.util.concurrent.Future;
-
-/**
- * Task that stops long running processes.
- */
-public class LongRunningProcessStopTask extends LongRunningProcessTask<List<LongRunningProcessStatus>> {
-    /** */
-    private static final long serialVersionUID = -5552468435820611170L;
-
-    /** Process identifiers. */
-    private final List<UUID> procIds;
-
-    /** Flag that defines that metadata should be removed immediately. */
-    private final boolean clear;
-
-    /**
-     * Constructs a new instance of stop task.
-     *
-     * @param procIds Process identifiers.
-     * @param clear Flag that defines that metadata should be removed immediately.
-     */
-    public LongRunningProcessStopTask(List<UUID> procIds, boolean clear) {
-        assert procIds != null : "Process identifiers should not be null";
-
-        this.procIds = procIds;
-        this.clear = clear;
-    }
-
-    /** {@inheritDoc} */
-    @Override public List<LongRunningProcessStatus> call() {
-        ArrayList<LongRunningProcessStatus> res = new ArrayList<>();
-
-        for (UUID prodId : procIds)
-            res.add(stopProcess(prodId));
-
-        // All-or-nothing strategy. Processes will be removed only if all processes can be removed.
-        if (clear)
-            removeProcessesFromMetadataStorage();
-
-        return res;
-    }
-
-    /**
-     * Stop process by process identifier.
-     *
-     * @param procId Process identifier.
-     * @return Process status after stop.
-     */
-    private LongRunningProcessStatus stopProcess(UUID procId) {
-        Map<UUID, Future<?>> metadataStorage = getMetadataStorage();
-
-        Future<?> fut = metadataStorage.get(procId);
-
-        if (fut == null)
-            return new LongRunningProcessStatus(LongRunningProcessState.NOT_FOUND);
-
-        try {
-            fut.cancel(true);
-            fut.get();
-        }
-        catch (Exception e) {
-            return new LongRunningProcessStatus(LongRunningProcessState.DONE, e);
-        }
-
-        return new LongRunningProcessStatus(LongRunningProcessState.DONE);
-    }
-
-    /**
-     * Removes processes from metadata storage.
-     */
-    private void removeProcessesFromMetadataStorage() {
-        Map<UUID, Future<?>> metadataStorage = getMetadataStorage();
-
-        for (UUID procId : procIds)
-            metadataStorage.remove(procId);
-    }
-}
diff --git a/modules/tensorflow/src/main/java/org/apache/ignite/tensorflow/core/longrunning/task/LongRunningProcessTask.java b/modules/tensorflow/src/main/java/org/apache/ignite/tensorflow/core/longrunning/task/LongRunningProcessTask.java
deleted file mode 100644
index 96d2274..0000000
--- a/modules/tensorflow/src/main/java/org/apache/ignite/tensorflow/core/longrunning/task/LongRunningProcessTask.java
+++ /dev/null
@@ -1,53 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package org.apache.ignite.tensorflow.core.longrunning.task;
-
-import java.util.UUID;
-import java.util.concurrent.ConcurrentHashMap;
-import java.util.concurrent.ConcurrentMap;
-import java.util.concurrent.Future;
-import org.apache.ignite.Ignite;
-import org.apache.ignite.Ignition;
-import org.apache.ignite.lang.IgniteCallable;
-import org.apache.ignite.tensorflow.core.longrunning.LongRunningProcessManager;
-
-/**
- * Task that can be executed on a cluster using the {@link LongRunningProcessManager}.
- *
- * @param <T> Type of the result.
- */
-public abstract class LongRunningProcessTask<T> implements IgniteCallable<T> {
-    /** */
-    private static final long serialVersionUID = 2351380200758417004L;
-
-    /** Long running process storage name. */
-    private static final String LONG_RUNNING_PROCESS_STORAGE_NAME = "LONG_RUNNING_PROCESS_STORAGE";
-
-    /**
-     * Returns task metadata storage that is kept by every node in the cluster.
-     *
-     * @return Task metadata storage that is kept by every node in the cluster.
-     */
-    ConcurrentHashMap<UUID, Future<?>> getMetadataStorage() {
-        Ignite ignite = Ignition.localIgnite();
-
-        ConcurrentMap<String, ConcurrentHashMap<UUID, Future<?>>> nodeLocMap = ignite.cluster().nodeLocalMap();
-
-        return nodeLocMap.computeIfAbsent(LONG_RUNNING_PROCESS_STORAGE_NAME, k -> new ConcurrentHashMap<>());
-    }
-}
diff --git a/modules/tensorflow/src/main/java/org/apache/ignite/tensorflow/core/longrunning/task/package-info.java b/modules/tensorflow/src/main/java/org/apache/ignite/tensorflow/core/longrunning/task/package-info.java
deleted file mode 100644
index 34ffe72..0000000
--- a/modules/tensorflow/src/main/java/org/apache/ignite/tensorflow/core/longrunning/task/package-info.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-/**
- * <!-- Package description. -->
- * Contains long-running process tasks that encapsulates the logic of starting, pinging and stopping a long-running
- * process.
- */
-
-package org.apache.ignite.tensorflow.core.longrunning.task;
diff --git a/modules/tensorflow/src/main/java/org/apache/ignite/tensorflow/core/longrunning/task/util/LongRunningProcessState.java b/modules/tensorflow/src/main/java/org/apache/ignite/tensorflow/core/longrunning/task/util/LongRunningProcessState.java
deleted file mode 100644
index 7b3c777..0000000
--- a/modules/tensorflow/src/main/java/org/apache/ignite/tensorflow/core/longrunning/task/util/LongRunningProcessState.java
+++ /dev/null
@@ -1,27 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package org.apache.ignite.tensorflow.core.longrunning.task.util;
-
-/**
- * Long running process state.
- */
-public enum LongRunningProcessState {
-    /** Process not found. */ NOT_FOUND,
-    /** Process is running. */ RUNNING,
-    /** Process is done */ DONE
-}
diff --git a/modules/tensorflow/src/main/java/org/apache/ignite/tensorflow/core/longrunning/task/util/LongRunningProcessStatus.java b/modules/tensorflow/src/main/java/org/apache/ignite/tensorflow/core/longrunning/task/util/LongRunningProcessStatus.java
deleted file mode 100644
index 1ae8e15..0000000
--- a/modules/tensorflow/src/main/java/org/apache/ignite/tensorflow/core/longrunning/task/util/LongRunningProcessStatus.java
+++ /dev/null
@@ -1,66 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package org.apache.ignite.tensorflow.core.longrunning.task.util;
-
-import java.io.Serializable;
-
-/**
- * Long running process status that includes state and exception if exists.
- */
-public class LongRunningProcessStatus implements Serializable {
-    /** */
-    private static final long serialVersionUID = -2958316078722079954L;
-
-    /** Process state. */
-    private final LongRunningProcessState state;
-
-    /** Process exception. */
-    private final Exception e;
-
-    /**
-     * Constructs a new instance of long running process status.
-     *
-     * @param state Process state.
-     */
-    public LongRunningProcessStatus(LongRunningProcessState state) {
-        this(state, null);
-    }
-
-    /**
-     * Constructs a new instance of long running process status.
-     *
-     * @param state Process state.
-     * @param e Process exception.
-     */
-    public LongRunningProcessStatus(LongRunningProcessState state, Exception e) {
-        assert state != null : "Process state should not be null";
-
-        this.state = state;
-        this.e = e;
-    }
-
-    /** */
-    public LongRunningProcessState getState() {
-        return state;
-    }
-
-    /** */
-    public Exception getException() {
-        return e;
-    }
-}
diff --git a/modules/tensorflow/src/main/java/org/apache/ignite/tensorflow/core/longrunning/task/util/package-info.java b/modules/tensorflow/src/main/java/org/apache/ignite/tensorflow/core/longrunning/task/util/package-info.java
deleted file mode 100644
index 645a8ef..0000000
--- a/modules/tensorflow/src/main/java/org/apache/ignite/tensorflow/core/longrunning/task/util/package-info.java
+++ /dev/null
@@ -1,23 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-/**
- * <!-- Package description. -->
- * Util package that contains util classes used in long-running tasks.
- */
-
-package org.apache.ignite.tensorflow.core.longrunning.task.util;
diff --git a/modules/tensorflow/src/main/java/org/apache/ignite/tensorflow/core/nativerunning/NativeProcess.java b/modules/tensorflow/src/main/java/org/apache/ignite/tensorflow/core/nativerunning/NativeProcess.java
deleted file mode 100644
index 2ad3c9d..0000000
--- a/modules/tensorflow/src/main/java/org/apache/ignite/tensorflow/core/nativerunning/NativeProcess.java
+++ /dev/null
@@ -1,71 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package org.apache.ignite.tensorflow.core.nativerunning;
-
-import java.io.Serializable;
-import java.util.UUID;
-import java.util.function.Supplier;
-import org.apache.ignite.tensorflow.util.SerializableSupplier;
-
-/**
- * Native process specification.
- */
-public class NativeProcess implements Serializable {
-    /** */
-    private static final long serialVersionUID = -7056800139746134956L;
-
-    /** Process builder supplier. */
-    private final SerializableSupplier<ProcessBuilder> procBuilderSupplier;
-
-    /** Stdin of the process. */
-    private final String stdin;
-
-    /** Node identifier. */
-    private final UUID nodeId;
-
-    /**
-     * Constructs a new instance of native process specification.
-     *
-     * @param procBuilderSupplier Process builder supplier.
-     * @param stdin Stdin of the process.
-     * @param nodeId Node identifier.
-     */
-    public NativeProcess(SerializableSupplier<ProcessBuilder> procBuilderSupplier, String stdin, UUID nodeId) {
-        assert procBuilderSupplier != null : "Process builder supplier should not be null";
-        assert nodeId != null : "Node identifier should not be null";
-
-        this.procBuilderSupplier = procBuilderSupplier;
-        this.stdin = stdin;
-        this.nodeId = nodeId;
-    }
-
-    /** */
-    public Supplier<ProcessBuilder> getProcBuilderSupplier() {
-        return procBuilderSupplier;
-    }
-
-    /** */
-    public String getStdin() {
-        return stdin;
-    }
-
-    /** */
-    public UUID getNodeId() {
-        return nodeId;
-    }
-}
diff --git a/modules/tensorflow/src/main/java/org/apache/ignite/tensorflow/core/nativerunning/NativeProcessManager.java b/modules/tensorflow/src/main/java/org/apache/ignite/tensorflow/core/nativerunning/NativeProcessManager.java
deleted file mode 100644
index 5accf3d..0000000
--- a/modules/tensorflow/src/main/java/org/apache/ignite/tensorflow/core/nativerunning/NativeProcessManager.java
+++ /dev/null
@@ -1,53 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package org.apache.ignite.tensorflow.core.nativerunning;
-
-import org.apache.ignite.Ignite;
-import org.apache.ignite.tensorflow.core.ProcessManager;
-import org.apache.ignite.tensorflow.core.ProcessManagerWrapper;
-import org.apache.ignite.tensorflow.core.longrunning.LongRunningProcess;
-import org.apache.ignite.tensorflow.core.longrunning.LongRunningProcessManager;
-import org.apache.ignite.tensorflow.core.nativerunning.task.NativeProcessStartTask;
-
-/**
- * Native process manager that allows to start, stop and make other actions with native processes.
- */
-public class NativeProcessManager extends ProcessManagerWrapper<LongRunningProcess, NativeProcess> {
-    /**
-     * Constructs a new native process manager.
-     *
-     * @param ignite Ignite instance.
-     */
-    public NativeProcessManager(Ignite ignite) {
-        super(new LongRunningProcessManager(ignite));
-    }
-
-    /**
-     * Constructs a new native process manager.
-     *
-     * @param delegate Delegate.
-     */
-    public NativeProcessManager(ProcessManager<LongRunningProcess> delegate) {
-        super(delegate);
-    }
-
-    /** {@inheritDoc} */
-    @Override protected LongRunningProcess transformSpecification(NativeProcess spec) {
-        return new LongRunningProcess(spec.getNodeId(), new NativeProcessStartTask(spec));
-    }
-}
diff --git a/modules/tensorflow/src/main/java/org/apache/ignite/tensorflow/core/nativerunning/package-info.java b/modules/tensorflow/src/main/java/org/apache/ignite/tensorflow/core/nativerunning/package-info.java
deleted file mode 100644
index 86b64b3..0000000
--- a/modules/tensorflow/src/main/java/org/apache/ignite/tensorflow/core/nativerunning/package-info.java
+++ /dev/null
@@ -1,26 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-/**
- * <!-- Package description. -->
- * The part of TensorFlow integration infrastructure that allows to start and maintain abstract native processes. As
- * described in {@link org.apache.ignite.tensorflow.core.nativerunning.NativeProcess} user only needs to specify process
- * builder, stdin and node identifier the process should be started on and Native Process Manager will make the rest so
- * that the specified process will be executed and maintained on the specified node.
- */
-
-package org.apache.ignite.tensorflow.core.nativerunning;
diff --git a/modules/tensorflow/src/main/java/org/apache/ignite/tensorflow/core/nativerunning/task/NativeProcessStartTask.java b/modules/tensorflow/src/main/java/org/apache/ignite/tensorflow/core/nativerunning/task/NativeProcessStartTask.java
deleted file mode 100644
index ae9e2b9..0000000
--- a/modules/tensorflow/src/main/java/org/apache/ignite/tensorflow/core/nativerunning/task/NativeProcessStartTask.java
+++ /dev/null
@@ -1,75 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package org.apache.ignite.tensorflow.core.nativerunning.task;
-
-import java.util.function.Supplier;
-import org.apache.ignite.IgniteLogger;
-import org.apache.ignite.Ignition;
-import org.apache.ignite.lang.IgniteRunnable;
-import org.apache.ignite.tensorflow.core.nativerunning.NativeProcess;
-import org.apache.ignite.tensorflow.core.util.NativeProcessRunner;
-
-/**
- * Task that starts native process by its specification.
- */
-public class NativeProcessStartTask implements IgniteRunnable {
-    /** */
-    private static final long serialVersionUID = 8421398298283116405L;
-
-    /** Native process specification. */
-    private final NativeProcess procSpec;
-
-    /**
-     * Constructs a new instance of native process start task.
-     *
-     * @param procSpec Native process specification.
-     */
-    public NativeProcessStartTask(NativeProcess procSpec) {
-        assert procSpec != null : "Process specification should not be null";
-
-        this.procSpec = procSpec;
-    }
-
-    /** {@inheritDoc} */
-    @Override public void run() {
-        Supplier<ProcessBuilder> procBuilderSupplier = procSpec.getProcBuilderSupplier();
-        ProcessBuilder procBuilder = procBuilderSupplier.get();
-
-        NativeProcessRunner procRunner = new NativeProcessRunner(
-            procBuilder,
-            procSpec.getStdin(),
-            System.out::println,
-            System.err::println
-        );
-
-        IgniteLogger log = Ignition.ignite().log().getLogger(NativeProcessStartTask.class);
-
-        try {
-            log.debug("Starting native process");
-            procRunner.startAndWait();
-            log.debug("Native process completed");
-        }
-        catch (InterruptedException e) {
-            log.debug("Native process interrupted");
-        }
-        catch (Exception e) {
-            log.error("Native process failed", e);
-            throw e;
-        }
-    }
-}
diff --git a/modules/tensorflow/src/main/java/org/apache/ignite/tensorflow/core/nativerunning/task/package-info.java b/modules/tensorflow/src/main/java/org/apache/ignite/tensorflow/core/nativerunning/task/package-info.java
deleted file mode 100644
index 02222fc..0000000
--- a/modules/tensorflow/src/main/java/org/apache/ignite/tensorflow/core/nativerunning/task/package-info.java
+++ /dev/null
@@ -1,23 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-/**
- * <!-- Package description. -->
- * Contains native process task that encapsulates the logic of starting native process.
- */
-
-package org.apache.ignite.tensorflow.core.nativerunning.task;
diff --git a/modules/tensorflow/src/main/java/org/apache/ignite/tensorflow/core/package-info.java b/modules/tensorflow/src/main/java/org/apache/ignite/tensorflow/core/package-info.java
deleted file mode 100644
index dc8b314..0000000
--- a/modules/tensorflow/src/main/java/org/apache/ignite/tensorflow/core/package-info.java
+++ /dev/null
@@ -1,27 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-/**
- * <!-- Package description. -->
- * TensorFlow integration core package that provides infrastructure layers that allows TensorFlow cluster to start and
- * be maintained. It provides layer hierarchy. The lowermost layer (long-running process layer) provides API to start
- * and maintain abstract long-running processes. The second layer (native-running processes layer) is built on top of
- * previous layer and allows to start and maintain native processes. And the third layer (python-running processes
- * layer) is responsible for starting and maintaining of Python native processes.
- */
-
-package org.apache.ignite.tensorflow.core;
diff --git a/modules/tensorflow/src/main/java/org/apache/ignite/tensorflow/core/util/AsyncNativeProcessRunner.java b/modules/tensorflow/src/main/java/org/apache/ignite/tensorflow/core/util/AsyncNativeProcessRunner.java
deleted file mode 100644
index 8bf32e8..0000000
--- a/modules/tensorflow/src/main/java/org/apache/ignite/tensorflow/core/util/AsyncNativeProcessRunner.java
+++ /dev/null
@@ -1,125 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package org.apache.ignite.tensorflow.core.util;
-
-import java.util.concurrent.ExecutionException;
-import java.util.concurrent.ExecutorService;
-import java.util.concurrent.Future;
-import org.apache.ignite.Ignite;
-import org.apache.ignite.IgniteLogger;
-
-/**
- * Asynchronous native process runner.
- */
-public abstract class AsyncNativeProcessRunner {
-    /** Ignite logger. */
-    private final IgniteLogger log;
-
-    /** Executors that is used to start async native process. */
-    private final ExecutorService executor;
-
-    /** Future of the async process process. */
-    private Future<?> fut;
-
-    /**
-     * Constructs a new asynchronous native process runner.
-     *
-     * @param ignite Ignite instance.
-     * @param executor Executor.
-     */
-    public AsyncNativeProcessRunner(Ignite ignite, ExecutorService executor) {
-        this.log = ignite.log().getLogger(AsyncNativeProcessRunner.class);
-        this.executor = executor;
-    }
-
-    /**
-     * Method that should be called before starting the process.
-     *
-     * @return Prepared native process runner.
-     */
-    public abstract NativeProcessRunner doBefore();
-
-    /**
-     * Method that should be called after starting the process.
-     */
-    public abstract void doAfter();
-
-    /**
-     * Starts the process in separate thread.
-     */
-    public synchronized void start() {
-        if (fut != null)
-            throw new IllegalStateException("Async native process has already been started");
-
-        NativeProcessRunner procRunner = doBefore();
-
-        fut = executor.submit(() -> {
-            try {
-                log.debug("Starting native process");
-                procRunner.startAndWait();
-                log.debug("Native process completed");
-            }
-            catch (InterruptedException e) {
-                log.debug("Native process interrupted");
-            }
-            catch (Exception e) {
-                log.error("Native process failed", e);
-                throw e;
-            }
-            finally {
-                doAfter();
-            }
-        });
-    }
-
-    /**
-     * Stops the process.
-     */
-    public synchronized void stop() {
-        if (fut != null && !fut.isDone())
-            fut.cancel(true);
-    }
-
-    /**
-     * Checks if process is already completed.
-     *
-     * @return {@code true} if process completed, otherwise {@code false}.
-     */
-    public boolean isCompleted() {
-        return fut != null && fut.isDone();
-    }
-
-    /**
-     * Returns an exception that happened during execution or {@code null} if there is no exception.
-     *
-     * @return Exception that happened during execution or {@code null} if there is no exception.
-     */
-    public Exception getException() {
-        if (!fut.isDone())
-            return null;
-
-        try {
-            fut.get();
-        }
-        catch (InterruptedException | ExecutionException e) {
-            return e;
-        }
-
-        return null;
-    }
-}
diff --git a/modules/tensorflow/src/main/java/org/apache/ignite/tensorflow/core/util/CustomizableThreadFactory.java b/modules/tensorflow/src/main/java/org/apache/ignite/tensorflow/core/util/CustomizableThreadFactory.java
deleted file mode 100644
index 2de671d..0000000
--- a/modules/tensorflow/src/main/java/org/apache/ignite/tensorflow/core/util/CustomizableThreadFactory.java
+++ /dev/null
@@ -1,54 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package org.apache.ignite.tensorflow.core.util;
-
-import java.util.concurrent.ThreadFactory;
-import org.jetbrains.annotations.NotNull;
-
-/**
- * Customizable thread factory that allows to specify thread name and daemon flag for the processes created by this
- * factory.
- */
-public class CustomizableThreadFactory implements ThreadFactory {
-    /** Thread name. */
-    private final String threadName;
-
-    /** Is daemon flag. */
-    private final boolean isDaemon;
-
-    /**
-     * Constructs a new instance of customizable thread factory.
-     *
-     * @param threadName Thread name.
-     * @param isDaemon Is daemon flag.
-     */
-    public CustomizableThreadFactory(String threadName, boolean isDaemon) {
-        this.threadName = threadName;
-        this.isDaemon = isDaemon;
-    }
-
-    /** {@inheritDoc} */
-    @Override public Thread newThread(@NotNull Runnable r) {
-        Thread thread = new Thread(r);
-
-        thread.setName(threadName);
-        thread.setDaemon(isDaemon);
-
-        return thread;
-    }
-}
diff --git a/modules/tensorflow/src/main/java/org/apache/ignite/tensorflow/core/util/NativeProcessRunner.java b/modules/tensorflow/src/main/java/org/apache/ignite/tensorflow/core/util/NativeProcessRunner.java
deleted file mode 100644
index 38af26d..0000000
--- a/modules/tensorflow/src/main/java/org/apache/ignite/tensorflow/core/util/NativeProcessRunner.java
+++ /dev/null
@@ -1,133 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package org.apache.ignite.tensorflow.core.util;
-
-import java.io.IOException;
-import java.io.InputStream;
-import java.io.PrintWriter;
-import java.util.Scanner;
-import java.util.concurrent.Executors;
-import java.util.concurrent.Future;
-import java.util.concurrent.atomic.AtomicBoolean;
-import java.util.function.Consumer;
-
-/**
- * Utils class that helps to start native processes.
- */
-public class NativeProcessRunner {
-    /** Thread name to be used by threads that forward streams. */
-    private static final String NATIVE_PROCESS_FORWARD_STREAM_THREAD_NAME = "tf-forward-native-output";
-
-    /** Process builder. */
-    private final ProcessBuilder procBuilder;
-
-    /** Standard input of the process. */
-    private final String stdin;
-
-    /** Output stream data consumer. */
-    private final Consumer<String> out;
-
-    /** Error stream data consumer. */
-    private final Consumer<String> err;
-
-    /**
-     * Constructs a new instance of native process runner.
-     *
-     * @param procBuilder Process builder.
-     * @param stdin Standard input of the process.
-     * @param out Output stream data consumer.
-     * @param err Error stream data consumer.
-     */
-    public NativeProcessRunner(ProcessBuilder procBuilder, String stdin, Consumer<String> out, Consumer<String> err) {
-        this.procBuilder = procBuilder;
-        this.stdin = stdin;
-        this.out = out;
-        this.err = err;
-    }
-
-    /**
-     * Starts the native process and waits it to be completed successfully or with exception.
-     */
-    public void startAndWait() throws InterruptedException {
-        Process proc;
-        try {
-            proc = procBuilder.start();
-        }
-        catch (IOException e) {
-            throw new RuntimeException(e);
-        }
-
-        AtomicBoolean shutdown = new AtomicBoolean();
-
-        Thread shutdownHook = new Thread(() -> {
-            shutdown.set(true);
-            proc.destroy();
-        });
-
-        Runtime.getRuntime().addShutdownHook(shutdownHook);
-
-        Future<?> outForward = forwardStream(proc.getInputStream(), out);
-        Future<?> errForward = forwardStream(proc.getErrorStream(), err);
-
-        try {
-            if (stdin != null) {
-                PrintWriter writer = new PrintWriter(proc.getOutputStream());
-                writer.println(stdin);
-                writer.flush();
-            }
-
-            int status;
-            try {
-                status = proc.waitFor();
-            }
-            catch (InterruptedException e) {
-                proc.destroy();
-                throw e;
-            }
-
-            if (!shutdown.get()) {
-                Runtime.getRuntime().removeShutdownHook(shutdownHook);
-
-                if (status != 0)
-                    throw new IllegalStateException("Native process exit [status=" + status + "]");
-            }
-        }
-        finally {
-            outForward.cancel(true);
-            errForward.cancel(true);
-        }
-    }
-
-    /**
-     * Forwards stream.
-     *
-     * @param src Source stream.
-     * @param dst Destination stream.
-     * @return Future that allows to interrupt forwarding.
-     */
-    private Future<?> forwardStream(InputStream src, Consumer<String> dst) {
-        return Executors
-            .newSingleThreadExecutor(new CustomizableThreadFactory(NATIVE_PROCESS_FORWARD_STREAM_THREAD_NAME, true))
-            .submit(() -> {
-                Scanner scanner = new Scanner(src);
-
-                while (!Thread.currentThread().isInterrupted() && scanner.hasNextLine())
-                    dst.accept(scanner.nextLine());
-            });
-    }
-}
diff --git a/modules/tensorflow/src/main/java/org/apache/ignite/tensorflow/core/util/PythonProcessBuilderSupplier.java b/modules/tensorflow/src/main/java/org/apache/ignite/tensorflow/core/util/PythonProcessBuilderSupplier.java
deleted file mode 100644
index f3882e9..0000000
--- a/modules/tensorflow/src/main/java/org/apache/ignite/tensorflow/core/util/PythonProcessBuilderSupplier.java
+++ /dev/null
@@ -1,89 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package org.apache.ignite.tensorflow.core.util;
-
-import java.lang.management.ManagementFactory;
-import java.util.Map;
-import org.apache.ignite.tensorflow.util.SerializableSupplier;
-
-/**
- * Python process builder supplier that is used to create Python process builder.
- */
-public class PythonProcessBuilderSupplier implements SerializableSupplier<ProcessBuilder> {
-    /** */
-    private static final long serialVersionUID = 7181937306294456125L;
-
-    /** Python environment variable name. */
-    private static final String PYTHON_ENV_NAME = "PYTHON";
-
-    /** Interactive flag (allows to used standard input to pass Python script). */
-    private final boolean interactive;
-
-    /** Meta information that adds to script as arguments. */
-    private final String[] meta;
-
-    /**
-     * Constructs a new instance of Python process builder supplier.
-     *
-     * @param interactive Interactive flag (allows to used standard input to pass Python script).
-     * @param meta Meta information that adds to script as arguments.
-     */
-    public PythonProcessBuilderSupplier(boolean interactive, String... meta) {
-        this.interactive = interactive;
-        this.meta = meta;
-    }
-
-    /** {@inheritDoc} */
-    @Override public ProcessBuilder get() {
-        String python = System.getenv(PYTHON_ENV_NAME);
-
-        if (python == null)
-            python = "python3";
-
-        ProcessBuilder procBldr;
-        if (interactive) {
-            String[] cmd = new String[meta.length + 3];
-
-            cmd[0] = python;
-            cmd[1] = "-i";
-            cmd[2] = "-";
-
-            System.arraycopy(meta, 0, cmd, 3, meta.length);
-
-            procBldr = new ProcessBuilder(cmd);
-        }
-        else
-            procBldr = new ProcessBuilder(python);
-
-        Map<String, String> env = procBldr.environment();
-        env.put("PPID", String.valueOf(getProcessId()));
-
-        return procBldr;
-    }
-
-    /**
-     * Returns current process identifier.
-     *
-     * @return Process identifier.
-     */
-    private long getProcessId() {
-        String pid = ManagementFactory.getRuntimeMXBean().getName().split("@")[0];
-
-        return Long.parseLong(pid);
-    }
-}
diff --git a/modules/tensorflow/src/main/java/org/apache/ignite/tensorflow/core/util/package-info.java b/modules/tensorflow/src/main/java/org/apache/ignite/tensorflow/core/util/package-info.java
deleted file mode 100644
index 39119bd..0000000
--- a/modules/tensorflow/src/main/java/org/apache/ignite/tensorflow/core/util/package-info.java
+++ /dev/null
@@ -1,23 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-/**
- * <!-- Package description. -->
- * Util classes used in other {@link org.apache.ignite.tensorflow.core} classes.
- */
-
-package org.apache.ignite.tensorflow.core.util;
diff --git a/modules/tensorflow/src/main/java/org/apache/ignite/tensorflow/package-info.java b/modules/tensorflow/src/main/java/org/apache/ignite/tensorflow/package-info.java
deleted file mode 100644
index 53189de..0000000
--- a/modules/tensorflow/src/main/java/org/apache/ignite/tensorflow/package-info.java
+++ /dev/null
@@ -1,38 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-/**
- * <!-- Package description. -->
- * TensorFlow integration that allows to start and maintain TensorFlow cluster on top of Apache Ignite cluster
- * infrastructure. The TensorFlow cluster is built for the specified cache the following way:
- * <ol>
- *     <li>The TensorFlow cluster maintainer is created to maintain the cluster associated with the specified cache so
- *     that this service works reliable even the node will fail. It's achieved using Ignite Service Grid.</li>
- *     <li>TensorFlow cluster maintainer finds out that cluster is not started and begins starting procedure.</li>
- *     <li>TensorFlow cluster resolver builds cluster specification based on the specified cache so that every
- *     TensorFlow task is associated with partition of the cache and assumed to be started on the node where the
- *     partition is kept.</li>
- *     <li>Based on the built cluster specification the set of tasks is sent to the nodes on purpose to start TensorFlow
- *     servers on the nodes defined in the specification.</li>
- *     <li>When this set of tasks is completed successfully the started process identifiers are returned and saved
- *     for future using.</li>
- *     <li>The starting procedure is completed. In case a server fails the cluster will be turn down and then started
- *     again by maintainer.</li>
- * </ol>
- */
-
-package org.apache.ignite.tensorflow;
diff --git a/modules/tensorflow/src/main/java/org/apache/ignite/tensorflow/submitter/JobSubmitter.java b/modules/tensorflow/src/main/java/org/apache/ignite/tensorflow/submitter/JobSubmitter.java
deleted file mode 100644
index 0a7cae6..0000000
--- a/modules/tensorflow/src/main/java/org/apache/ignite/tensorflow/submitter/JobSubmitter.java
+++ /dev/null
@@ -1,35 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package org.apache.ignite.tensorflow.submitter;
-
-import org.apache.ignite.tensorflow.submitter.command.RootCommand;
-import picocli.CommandLine;
-
-/**
- * Main class of the job submitter application that allows to submit TensorFlow jobs to be run within Ignite cluster.
- */
-public class JobSubmitter {
-    /**
-     * Main method.
-     *
-     * @param args Arguments.
-     */
-    public static void main(String... args) {
-        CommandLine.run(new RootCommand(), System.out, args);
-    }
-}
diff --git a/modules/tensorflow/src/main/java/org/apache/ignite/tensorflow/submitter/command/AbstractCommand.java b/modules/tensorflow/src/main/java/org/apache/ignite/tensorflow/submitter/command/AbstractCommand.java
deleted file mode 100644
index 4d2fc18..0000000
--- a/modules/tensorflow/src/main/java/org/apache/ignite/tensorflow/submitter/command/AbstractCommand.java
+++ /dev/null
@@ -1,55 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package org.apache.ignite.tensorflow.submitter.command;
-
-import org.apache.ignite.Ignite;
-import org.apache.ignite.Ignition;
-import org.apache.ignite.configuration.IgniteConfiguration;
-import org.apache.ignite.logger.slf4j.Slf4jLogger;
-import picocli.CommandLine;
-
-/**
- * Abstract command that contains options common for all commands.
- */
-public abstract class AbstractCommand implements Runnable {
-    /** Ignite node configuration path. */
-    @CommandLine.Option(names = { "-c", "--config" }, description = "Apache Ignite client configuration.")
-    protected String cfg;
-
-    /**
-     * Returns Ignite instance based on configuration specified in {@link #cfg} field.
-     *
-     * @return Ignite instance.
-     */
-    protected Ignite getIgnite() {
-        if (cfg != null)
-            return Ignition.start(cfg);
-        else {
-            IgniteConfiguration igniteCfg = new IgniteConfiguration();
-            igniteCfg.setGridLogger(new Slf4jLogger());
-            igniteCfg.setClientMode(true);
-
-            return Ignition.start(igniteCfg);
-        }
-    }
-
-    /** */
-    public void setCfg(String cfg) {
-        this.cfg = cfg;
-    }
-}
diff --git a/modules/tensorflow/src/main/java/org/apache/ignite/tensorflow/submitter/command/AttachCommand.java b/modules/tensorflow/src/main/java/org/apache/ignite/tensorflow/submitter/command/AttachCommand.java
deleted file mode 100644
index 946aa08..0000000
--- a/modules/tensorflow/src/main/java/org/apache/ignite/tensorflow/submitter/command/AttachCommand.java
+++ /dev/null
@@ -1,51 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package org.apache.ignite.tensorflow.submitter.command;
-
-import java.util.UUID;
-import org.apache.ignite.Ignite;
-import org.apache.ignite.tensorflow.cluster.TensorFlowClusterGatewayManager;
-import picocli.CommandLine;
-
-/**
- * Command "attach" that is used to attach to running TensorFlow cluster and receive output of the user script.
- */
-@CommandLine.Command(
-    name = "attach",
-    description = "Attaches to running TensorFlow cluster (user script process).",
-    mixinStandardHelpOptions = true
-)
-public class AttachCommand extends AbstractCommand {
-    /** TensorFlow cluster identifier. */
-    @CommandLine.Parameters(paramLabel = "CLUSTER_ID", description = "Cluster identifier.")
-    private UUID clusterId;
-
-    /** {@inheritDoc} */
-    @Override public void run() {
-        try (Ignite ignite = getIgnite()) {
-            TensorFlowClusterGatewayManager mgr = new TensorFlowClusterGatewayManager(ignite);
-
-            mgr.listenToClusterUserScript(clusterId, System.out::println, System.err::println);
-        }
-    }
-
-    /** */
-    public void setClusterId(UUID clusterId) {
-        this.clusterId = clusterId;
-    }
-}
diff --git a/modules/tensorflow/src/main/java/org/apache/ignite/tensorflow/submitter/command/PsCommand.java b/modules/tensorflow/src/main/java/org/apache/ignite/tensorflow/submitter/command/PsCommand.java
deleted file mode 100644
index 0538496..0000000
--- a/modules/tensorflow/src/main/java/org/apache/ignite/tensorflow/submitter/command/PsCommand.java
+++ /dev/null
@@ -1,47 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package org.apache.ignite.tensorflow.submitter.command;
-
-import java.util.Map;
-import java.util.UUID;
-import org.apache.ignite.Ignite;
-import org.apache.ignite.tensorflow.cluster.TensorFlowCluster;
-import org.apache.ignite.tensorflow.cluster.TensorFlowClusterManager;
-import picocli.CommandLine;
-
-/**
- * Command "ps" that is used to print identifiers of all running TensorFlow clusters.
- */
-@CommandLine.Command(
-    name = "ps",
-    description = "Prints identifiers of all running TensorFlow clusters.",
-    mixinStandardHelpOptions = true
-)
-public class PsCommand extends AbstractCommand {
-    /** {@inheritDoc} */
-    @Override public void run() {
-        try (Ignite ignite = getIgnite()) {
-            TensorFlowClusterManager mgr = new TensorFlowClusterManager(ignite);
-
-            Map<UUID, TensorFlowCluster> clusters = mgr.getAllClusters();
-
-            for (UUID clusterId : clusters.keySet())
-                System.out.println(clusterId);
-        }
-    }
-}
diff --git a/modules/tensorflow/src/main/java/org/apache/ignite/tensorflow/submitter/command/RootCommand.java b/modules/tensorflow/src/main/java/org/apache/ignite/tensorflow/submitter/command/RootCommand.java
deleted file mode 100644
index 508ea7b..0000000
--- a/modules/tensorflow/src/main/java/org/apache/ignite/tensorflow/submitter/command/RootCommand.java
+++ /dev/null
@@ -1,42 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package org.apache.ignite.tensorflow.submitter.command;
-
-import picocli.CommandLine;
-
-/**
- * Root command that aggregates all sub commands.
- */
-@CommandLine.Command(
-    name = "ignite-tf",
-    description = "Apache Ignite and TensorFlow integration command line tool that allows to start, maintain and" +
-        " stop distributed deep learning utilizing Apache Ignite infrastructure and data.",
-    subcommands = {
-        StartCommand.class,
-        StopCommand.class,
-        AttachCommand.class,
-        PsCommand.class
-    },
-    mixinStandardHelpOptions = true
-)
-public class RootCommand extends AbstractCommand {
-    /** {@inheritDoc} */
-    @Override public void run() {
-        CommandLine.usage(this, System.out);
-    }
-}
diff --git a/modules/tensorflow/src/main/java/org/apache/ignite/tensorflow/submitter/command/StartCommand.java b/modules/tensorflow/src/main/java/org/apache/ignite/tensorflow/submitter/command/StartCommand.java
deleted file mode 100644
index 0202b8e..0000000
--- a/modules/tensorflow/src/main/java/org/apache/ignite/tensorflow/submitter/command/StartCommand.java
+++ /dev/null
@@ -1,206 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package org.apache.ignite.tensorflow.submitter.command;
-
-import java.io.ByteArrayOutputStream;
-import java.io.File;
-import java.io.FileInputStream;
-import java.io.IOException;
-import java.nio.file.Path;
-import java.nio.file.Paths;
-import java.util.UUID;
-import java.util.zip.ZipEntry;
-import java.util.zip.ZipOutputStream;
-import org.apache.commons.io.IOUtils;
-import org.apache.ignite.Ignite;
-import org.apache.ignite.internal.processors.cache.persistence.file.FilePageStoreManager;
-import org.apache.ignite.tensorflow.cluster.TensorFlowClusterGatewayManager;
-import org.apache.ignite.tensorflow.cluster.TensorFlowJobArchive;
-import picocli.CommandLine;
-
-/**
- * Command "start" that is used to start a new TensorFlow cluster on top of Apache Ignite.
- */
-@CommandLine.Command(
-    name = "start",
-    description = "Starts a new TensorFlow cluster and attaches to user script process.",
-    mixinStandardHelpOptions = true
-)
-public class StartCommand extends AbstractCommand {
-    /** Upstream cache name. */
-    @CommandLine.Parameters(index = "0", paramLabel = "CACHE_NAME", description = "Upstream cache name.")
-    private String cacheName;
-
-    /** Job folder or archive. */
-    @CommandLine.Parameters(index = "1", paramLabel = "JOB_DIR", description = "Job folder (or zip archive).")
-    private String jobFolder;
-
-    /** Job command to be executed in cluster. */
-    @CommandLine.Parameters(index = "2", paramLabel = "JOB_CMD", description = "Job command.")
-    private String jobCmd;
-
-    /** Arguments of a job command to be executed in cluster. */
-    @CommandLine.Parameters(index = "3..*", paramLabel = "JOB_ARGS", description = "Job arguments.")
-    private String[] jobArguments;
-
-    /** {@inheritDoc} */
-    @Override public void run() {
-        try (Ignite ignite = getIgnite()) {
-            UUID clusterId = UUID.randomUUID();
-            String[] commands = new String[jobArguments.length + 1];
-            commands[0] = jobCmd;
-            System.arraycopy(jobArguments, 0, commands, 1, commands.length - 1);
-
-            TensorFlowJobArchive jobArchive = new TensorFlowJobArchive(
-                cacheName,
-                zip(jobFolder),
-                commands
-            );
-
-            TensorFlowClusterGatewayManager mgr = new TensorFlowClusterGatewayManager(ignite);
-            mgr.createCluster(clusterId, jobArchive);
-
-            mgr.listenToClusterUserScript(clusterId, System.out::println, System.err::println);
-        }
-        catch (IOException e) {
-            throw new RuntimeException(e);
-        }
-    }
-
-    /**
-     * Archives specified folder or file into zip archive.
-     *
-     * @param jobArchivePath Path to folder to be archived.
-     * @return Byte array representing zip archive.
-     * @throws IOException In case of input/output exception.
-     */
-    private byte[] zip(String jobArchivePath) throws IOException {
-        Path path = Paths.get(jobArchivePath);
-        File file = path.toFile();
-
-        if (!file.exists())
-            throw new IllegalArgumentException("File doesn't exist [name=" + jobArchivePath + "]");
-
-        if (file.isDirectory())
-            return zipDirectory(file);
-        else if (jobArchivePath.endsWith(FilePageStoreManager.ZIP_SUFFIX))
-            return zipArchive(file);
-        else
-            return zipFile(file);
-    }
-
-    /**
-     * Archives specified folder into zip archive.
-     *
-     * @param dir Directory to be archived.
-     * @return Byte array representing zip archive.
-     * @throws IOException In case of input/output exception.
-     */
-    private byte[] zipDirectory(File dir) throws IOException {
-        ByteArrayOutputStream baos = new ByteArrayOutputStream();
-
-        try (ZipOutputStream zipFile = new ZipOutputStream(baos)) {
-            compressDirectoryToZip(dir.getAbsolutePath(), dir.getAbsolutePath(), zipFile);
-        }
-
-        return baos.toByteArray();
-    }
-
-    /**
-     * Archives specified file into zip archive.
-     *
-     * @param file File to be archived.
-     * @return Byte array representing zip archive.
-     * @throws IOException In case of input/output exception.
-     */
-    private byte[] zipFile(File file) throws IOException {
-        ByteArrayOutputStream baos = new ByteArrayOutputStream();
-
-        try (ZipOutputStream zos = new ZipOutputStream(baos)) {
-            ZipEntry entry = new ZipEntry(file.getName());
-            zos.putNextEntry(entry);
-
-            try (FileInputStream in = new FileInputStream(file.getAbsolutePath())) {
-                IOUtils.copy(in, zos);
-            }
-        }
-
-        return baos.toByteArray();
-    }
-
-    /**
-     * Reads zip archive into byte array and returns this array.
-     *
-     * @param file Archive to be read.
-     * @return Byte array representing zip archive.
-     * @throws IOException In case of input/output exception.
-     */
-    private byte[] zipArchive(File file) throws IOException {
-        try (FileInputStream fis = new FileInputStream(file)) {
-            return IOUtils.toByteArray(fis);
-        }
-    }
-
-    /**
-     * Archives specified folder into zip output stream.
-     *
-     * @param rootDir Root directory.
-     * @param srcDir Source directory.
-     * @param out Zip output stream.
-     * @throws IOException In case of input/output exception.
-     */
-    private void compressDirectoryToZip(String rootDir, String srcDir, ZipOutputStream out) throws IOException {
-        File[] files = new File(srcDir).listFiles();
-
-        if (files != null) {
-            for (File file : files) {
-                if (file.isDirectory())
-                    compressDirectoryToZip(rootDir, srcDir + File.separator + file.getName(), out);
-                else {
-                    ZipEntry entry = new ZipEntry(srcDir.replace(rootDir, "")
-                        + File.separator + file.getName());
-                    out.putNextEntry(entry);
-
-                    try (FileInputStream in = new FileInputStream(srcDir + File.separator + file.getName())) {
-                        IOUtils.copy(in, out);
-                    }
-                }
-            }
-        }
-    }
-
-    /** */
-    public void setCacheName(String cacheName) {
-        this.cacheName = cacheName;
-    }
-
-    /** */
-    public void setJobFolder(String jobFolder) {
-        this.jobFolder = jobFolder;
-    }
-
-    /** */
-    public void setJobCmd(String jobCmd) {
-        this.jobCmd = jobCmd;
-    }
-
-    /** */
-    public void setJobArguments(String[] jobArguments) {
-        this.jobArguments = jobArguments;
-    }
-}
diff --git a/modules/tensorflow/src/main/java/org/apache/ignite/tensorflow/submitter/command/StopCommand.java b/modules/tensorflow/src/main/java/org/apache/ignite/tensorflow/submitter/command/StopCommand.java
deleted file mode 100644
index 8890370..0000000
--- a/modules/tensorflow/src/main/java/org/apache/ignite/tensorflow/submitter/command/StopCommand.java
+++ /dev/null
@@ -1,50 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package org.apache.ignite.tensorflow.submitter.command;
-
-import java.util.UUID;
-import org.apache.ignite.Ignite;
-import org.apache.ignite.tensorflow.cluster.TensorFlowClusterGatewayManager;
-import picocli.CommandLine;
-
-/**
- * Command "stop" that is used to stop TensorFlow cluster.
- */
-@CommandLine.Command(
-    name = "stop",
-    description = "Stops a running TensorFlow cluster.",
-    mixinStandardHelpOptions = true
-)
-public class StopCommand extends AbstractCommand {
-    /** Cluster identifier. */
-    @CommandLine.Parameters(paramLabel = "CLUSTER_ID", description = "Cluster identifier.")
-    private UUID clusterId;
-
-    /** {@inheritDoc} */
-    @Override public void run() {
-        try (Ignite ignite = getIgnite()) {
-            TensorFlowClusterGatewayManager mgr = new TensorFlowClusterGatewayManager(ignite);
-            mgr.stopClusterIfExists(clusterId);
-        }
-    }
-
-    /** */
-    public void setClusterId(UUID clusterId) {
-        this.clusterId = clusterId;
-    }
-}
diff --git a/modules/tensorflow/src/main/java/org/apache/ignite/tensorflow/submitter/command/package-info.java b/modules/tensorflow/src/main/java/org/apache/ignite/tensorflow/submitter/command/package-info.java
deleted file mode 100644
index 1693887..0000000
--- a/modules/tensorflow/src/main/java/org/apache/ignite/tensorflow/submitter/command/package-info.java
+++ /dev/null
@@ -1,23 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-/**
- * <!-- Package description. -->
- * This package contains commands that command line tool provides. Pico CLI is used to make these commands maintainable.
- */
-
-package org.apache.ignite.tensorflow.submitter.command;
diff --git a/modules/tensorflow/src/main/java/org/apache/ignite/tensorflow/submitter/package-info.java b/modules/tensorflow/src/main/java/org/apache/ignite/tensorflow/submitter/package-info.java
deleted file mode 100644
index af6e27c..0000000
--- a/modules/tensorflow/src/main/java/org/apache/ignite/tensorflow/submitter/package-info.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-/**
- * <!-- Package description. -->
- * This package contains classes that allow to use command line interface to submit jobs into TensorFlow in Apache
- * Ignite infrastructure.
- */
-
-package org.apache.ignite.tensorflow.submitter;
diff --git a/modules/tensorflow/src/main/java/org/apache/ignite/tensorflow/util/SerializableSupplier.java b/modules/tensorflow/src/main/java/org/apache/ignite/tensorflow/util/SerializableSupplier.java
deleted file mode 100644
index 768dbe1..0000000
--- a/modules/tensorflow/src/main/java/org/apache/ignite/tensorflow/util/SerializableSupplier.java
+++ /dev/null
@@ -1,29 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package org.apache.ignite.tensorflow.util;
-
-import java.io.Serializable;
-import java.util.function.Supplier;
-
-/**
- * Serializable supplier.
- *
- * @param <T> The type of results supplied by this supplier.
- */
-public interface SerializableSupplier<T> extends Supplier<T>, Serializable {
-}
diff --git a/modules/tensorflow/src/main/java/org/apache/ignite/tensorflow/util/package-info.java b/modules/tensorflow/src/main/java/org/apache/ignite/tensorflow/util/package-info.java
deleted file mode 100644
index 408e16e..0000000
--- a/modules/tensorflow/src/main/java/org/apache/ignite/tensorflow/util/package-info.java
+++ /dev/null
@@ -1,23 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-/**
- * <!-- Package description. -->
- * Util classes used in {@link org.apache.ignite.tensorflow} package.
- */
-
-package org.apache.ignite.tensorflow.util;
diff --git a/modules/tensorflow/src/main/resources/logback.xml b/modules/tensorflow/src/main/resources/logback.xml
deleted file mode 100644
index 816b5e6..0000000
--- a/modules/tensorflow/src/main/resources/logback.xml
+++ /dev/null
@@ -1,36 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-
-<!--
-  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.
--->
-<!--
-    Logback configuration file.
--->
-<configuration>
-
-    <appender name="FILE" class="ch.qos.logback.core.FileAppender">
-        <file>ignite-tf.log</file>
-        <append>false</append>
-        <encoder>
-            <pattern>%d{yyyy-MM-dd HH:mm:ss} [%thread] %-5level %logger{36} - %msg%n</pattern>
-        </encoder>
-    </appender>
-
-    <root level="warn">
-        <appender-ref ref="FILE" />
-    </root>
-
-</configuration>
\ No newline at end of file
diff --git a/modules/tensorflow/src/test/java/org/apache/ignite/tensorflow/TensorFlowTestSuite.java b/modules/tensorflow/src/test/java/org/apache/ignite/tensorflow/TensorFlowTestSuite.java
deleted file mode 100644
index 4ad5216..0000000
--- a/modules/tensorflow/src/test/java/org/apache/ignite/tensorflow/TensorFlowTestSuite.java
+++ /dev/null
@@ -1,33 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package org.apache.ignite.tensorflow;
-
-import org.apache.ignite.tensorflow.core.CoreTestSuite;
-import org.junit.runner.RunWith;
-import org.junit.runners.Suite;
-
-/**
- * Test suite for all module tests.
- */
-@RunWith(Suite.class)
-@Suite.SuiteClasses({
-    CoreTestSuite.class
-})
-public class TensorFlowTestSuite {
-    // No-op.
-}
diff --git a/modules/tensorflow/src/test/java/org/apache/ignite/tensorflow/core/CoreTestSuite.java b/modules/tensorflow/src/test/java/org/apache/ignite/tensorflow/core/CoreTestSuite.java
deleted file mode 100644
index 92b6dbd..0000000
--- a/modules/tensorflow/src/test/java/org/apache/ignite/tensorflow/core/CoreTestSuite.java
+++ /dev/null
@@ -1,42 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package org.apache.ignite.tensorflow.core;
-
-import org.apache.ignite.tensorflow.core.longrunning.LongRunningProcessManagerTest;
-import org.apache.ignite.tensorflow.core.longrunning.task.LongRunningProcessClearTaskTest;
-import org.apache.ignite.tensorflow.core.longrunning.task.LongRunningProcessPingTaskTest;
-import org.apache.ignite.tensorflow.core.longrunning.task.LongRunningProcessStartTaskTest;
-import org.apache.ignite.tensorflow.core.longrunning.task.LongRunningProcessStopTaskTest;
-import org.junit.runner.RunWith;
-import org.junit.runners.Suite;
-
-/**
- * Test suite for all tests in core package.
- */
-@RunWith(Suite.class)
-@Suite.SuiteClasses({
-    ProcessManagerWrapperTest.class,
-    LongRunningProcessClearTaskTest.class,
-    LongRunningProcessPingTaskTest.class,
-    LongRunningProcessStartTaskTest.class,
-    LongRunningProcessStopTaskTest.class,
-    LongRunningProcessManagerTest.class
-})
-public class CoreTestSuite {
-    // No-op.
-}
diff --git a/modules/tensorflow/src/test/java/org/apache/ignite/tensorflow/core/ProcessManagerWrapperTest.java b/modules/tensorflow/src/test/java/org/apache/ignite/tensorflow/core/ProcessManagerWrapperTest.java
deleted file mode 100644
index e44daac..0000000
--- a/modules/tensorflow/src/test/java/org/apache/ignite/tensorflow/core/ProcessManagerWrapperTest.java
+++ /dev/null
@@ -1,108 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package org.apache.ignite.tensorflow.core;
-
-import java.util.Arrays;
-import java.util.Collections;
-import java.util.List;
-import java.util.Map;
-import java.util.UUID;
-import org.junit.Before;
-import org.junit.Test;
-import org.junit.runner.RunWith;
-import org.mockito.Mock;
-import org.mockito.runners.MockitoJUnitRunner;
-
-import static org.mockito.Matchers.eq;
-import static org.mockito.Mockito.verify;
-
-/**
- * Tests for {@link ProcessManagerWrapper}.
- */
-@RunWith(MockitoJUnitRunner.class)
-public class ProcessManagerWrapperTest {
-    /** Delegate. */
-    @Mock
-    private ProcessManager<String> delegate;
-
-    /** Process manager wrapper. */
-    private ProcessManagerWrapper<String, Integer> wrapper;
-
-    /** Initializes tests. */
-    @Before
-    public void init() {
-        wrapper = new TestProcessManagerWrapper(delegate);
-    }
-
-    /** */
-    @Test
-    public void testStart() {
-        wrapper.start(Arrays.asList(1, 2, 3));
-
-        verify(delegate).start(eq(Arrays.asList("1", "2", "3")));
-    }
-
-    /** */
-    @Test
-    public void testPing() {
-        Map<UUID, List<UUID>> procIds = Collections.emptyMap();
-        wrapper.ping(procIds);
-
-        verify(delegate).ping(eq(procIds));
-    }
-
-    /** */
-    @Test
-    public void testStop() {
-        Map<UUID, List<UUID>> procIds = Collections.emptyMap();
-        wrapper.stop(procIds, true);
-
-        verify(delegate).stop(eq(procIds), eq(true));
-    }
-
-    /** */
-    @Test
-    public void testClear() {
-        Map<UUID, List<UUID>> procIds = Collections.emptyMap();
-        wrapper.clear(procIds);
-
-        verify(delegate).clear(eq(procIds));
-    }
-
-    /**
-     * Process manager wrapper to be used in tests.
-     */
-    private static class TestProcessManagerWrapper extends ProcessManagerWrapper<String, Integer> {
-        /** */
-        private static final long serialVersionUID = 7562628311662129855L;
-
-        /**
-         * Constructs a new instance of process manager wrapper.
-         *
-         * @param delegate Delegate.
-         */
-        public TestProcessManagerWrapper(ProcessManager<String> delegate) {
-            super(delegate);
-        }
-
-        /** {@inheritDoc} */
-        @Override protected String transformSpecification(Integer spec) {
-            return spec.toString();
-        }
-    }
-}
diff --git a/modules/tensorflow/src/test/java/org/apache/ignite/tensorflow/core/longrunning/LongRunningProcessManagerTest.java b/modules/tensorflow/src/test/java/org/apache/ignite/tensorflow/core/longrunning/LongRunningProcessManagerTest.java
deleted file mode 100644
index faa2b6b..0000000
--- a/modules/tensorflow/src/test/java/org/apache/ignite/tensorflow/core/longrunning/LongRunningProcessManagerTest.java
+++ /dev/null
@@ -1,167 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package org.apache.ignite.tensorflow.core.longrunning;
-
-import java.util.Collections;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-import java.util.UUID;
-import org.apache.ignite.Ignite;
-import org.apache.ignite.IgniteCluster;
-import org.apache.ignite.IgniteCompute;
-import org.apache.ignite.cluster.ClusterGroup;
-import org.apache.ignite.lang.IgniteCallable;
-import org.apache.ignite.tensorflow.core.longrunning.task.LongRunningProcessClearTask;
-import org.apache.ignite.tensorflow.core.longrunning.task.LongRunningProcessPingTask;
-import org.apache.ignite.tensorflow.core.longrunning.task.LongRunningProcessStartTask;
-import org.apache.ignite.tensorflow.core.longrunning.task.LongRunningProcessStopTask;
-import org.apache.ignite.tensorflow.core.longrunning.task.util.LongRunningProcessState;
-import org.apache.ignite.tensorflow.core.longrunning.task.util.LongRunningProcessStatus;
-import org.junit.Test;
-
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertTrue;
-import static org.mockito.Matchers.any;
-import static org.mockito.Matchers.eq;
-import static org.mockito.Mockito.doReturn;
-import static org.mockito.Mockito.mock;
-import static org.mockito.Mockito.verify;
-
-/**
- * Tests for {@link LongRunningProcessManager}.
- */
-public class LongRunningProcessManagerTest {
-    /** */
-    @Test
-    @SuppressWarnings("unchecked")
-    public void testStart() {
-        UUID nodeId = UUID.randomUUID();
-        UUID procId = UUID.randomUUID();
-
-        Ignite ignite = mock(Ignite.class);
-        IgniteCluster cluster = mock(IgniteCluster.class);
-        ClusterGroup clusterGrp = mock(ClusterGroup.class);
-        IgniteCompute igniteCompute = mock(IgniteCompute.class);
-        doReturn(cluster).when(ignite).cluster();
-        doReturn(igniteCompute).when(ignite).compute(eq(clusterGrp));
-        doReturn(clusterGrp).when(cluster).forNodeId(eq(nodeId));
-        doReturn(Collections.singletonList(procId)).when(igniteCompute).call(any(IgniteCallable.class));
-
-        List<LongRunningProcess> list = Collections.singletonList(new LongRunningProcess(nodeId, () -> {}));
-
-        LongRunningProcessManager mgr = new LongRunningProcessManager(ignite);
-        Map<UUID, List<UUID>> res = mgr.start(list);
-
-        assertEquals(1, res.size());
-        assertTrue(res.containsKey(nodeId));
-        assertEquals(procId, res.get(nodeId).iterator().next());
-
-        verify(igniteCompute).call(any(LongRunningProcessStartTask.class));
-    }
-
-    /** */
-    @Test
-    @SuppressWarnings("unchecked")
-    public void testPing() {
-        UUID nodeId = UUID.randomUUID();
-        UUID procId = UUID.randomUUID();
-
-        Ignite ignite = mock(Ignite.class);
-        IgniteCluster cluster = mock(IgniteCluster.class);
-        ClusterGroup clusterGrp = mock(ClusterGroup.class);
-        IgniteCompute igniteCompute = mock(IgniteCompute.class);
-        doReturn(cluster).when(ignite).cluster();
-        doReturn(igniteCompute).when(ignite).compute(eq(clusterGrp));
-        doReturn(clusterGrp).when(cluster).forNodeId(eq(nodeId));
-        doReturn(Collections.singletonList(new LongRunningProcessStatus(LongRunningProcessState.RUNNING)))
-            .when(igniteCompute).call(any(IgniteCallable.class));
-
-        Map<UUID, List<UUID>> procIds = new HashMap<>();
-        procIds.put(nodeId, Collections.singletonList(procId));
-
-        LongRunningProcessManager mgr = new LongRunningProcessManager(ignite);
-        Map<UUID, List<LongRunningProcessStatus>> res = mgr.ping(procIds);
-
-        assertEquals(1, res.size());
-        assertTrue(res.containsKey(nodeId));
-        assertEquals(LongRunningProcessState.RUNNING, res.get(nodeId).iterator().next().getState());
-
-        verify(igniteCompute).call(any(LongRunningProcessPingTask.class));
-    }
-
-    /** */
-    @Test
-    @SuppressWarnings("unchecked")
-    public void testStop() {
-        UUID nodeId = UUID.randomUUID();
-        UUID procId = UUID.randomUUID();
-
-        Ignite ignite = mock(Ignite.class);
-        IgniteCluster cluster = mock(IgniteCluster.class);
-        ClusterGroup clusterGrp = mock(ClusterGroup.class);
-        IgniteCompute igniteCompute = mock(IgniteCompute.class);
-        doReturn(cluster).when(ignite).cluster();
-        doReturn(igniteCompute).when(ignite).compute(eq(clusterGrp));
-        doReturn(clusterGrp).when(cluster).forNodeId(eq(nodeId));
-        doReturn(Collections.singletonList(new LongRunningProcessStatus(LongRunningProcessState.RUNNING)))
-            .when(igniteCompute).call(any(IgniteCallable.class));
-
-        Map<UUID, List<UUID>> procIds = new HashMap<>();
-        procIds.put(nodeId, Collections.singletonList(procId));
-
-        LongRunningProcessManager mgr = new LongRunningProcessManager(ignite);
-        Map<UUID, List<LongRunningProcessStatus>> res = mgr.stop(procIds, true);
-
-        assertEquals(1, res.size());
-        assertTrue(res.containsKey(nodeId));
-        assertEquals(LongRunningProcessState.RUNNING, res.get(nodeId).iterator().next().getState());
-
-        verify(igniteCompute).call(any(LongRunningProcessStopTask.class));
-    }
-
-    /** */
-    @Test
-    @SuppressWarnings("unchecked")
-    public void testClear() {
-        UUID nodeId = UUID.randomUUID();
-        UUID procId = UUID.randomUUID();
-
-        Ignite ignite = mock(Ignite.class);
-        IgniteCluster cluster = mock(IgniteCluster.class);
-        ClusterGroup clusterGrp = mock(ClusterGroup.class);
-        IgniteCompute igniteCompute = mock(IgniteCompute.class);
-        doReturn(cluster).when(ignite).cluster();
-        doReturn(igniteCompute).when(ignite).compute(eq(clusterGrp));
-        doReturn(clusterGrp).when(cluster).forNodeId(eq(nodeId));
-        doReturn(Collections.singletonList(new LongRunningProcessStatus(LongRunningProcessState.RUNNING)))
-            .when(igniteCompute).call(any(IgniteCallable.class));
-
-        Map<UUID, List<UUID>> procIds = new HashMap<>();
-        procIds.put(nodeId, Collections.singletonList(procId));
-
-        LongRunningProcessManager mgr = new LongRunningProcessManager(ignite);
-        Map<UUID, List<LongRunningProcessStatus>> res = mgr.clear(procIds);
-
-        assertEquals(1, res.size());
-        assertTrue(res.containsKey(nodeId));
-        assertEquals(LongRunningProcessState.RUNNING, res.get(nodeId).iterator().next().getState());
-
-        verify(igniteCompute).call(any(LongRunningProcessClearTask.class));
-    }
-}
diff --git a/modules/tensorflow/src/test/java/org/apache/ignite/tensorflow/core/longrunning/task/LongRunningProcessClearTaskTest.java b/modules/tensorflow/src/test/java/org/apache/ignite/tensorflow/core/longrunning/task/LongRunningProcessClearTaskTest.java
deleted file mode 100644
index 268f3e4..0000000
--- a/modules/tensorflow/src/test/java/org/apache/ignite/tensorflow/core/longrunning/task/LongRunningProcessClearTaskTest.java
+++ /dev/null
@@ -1,144 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package org.apache.ignite.tensorflow.core.longrunning.task;
-
-import java.util.Collections;
-import java.util.List;
-import java.util.UUID;
-import java.util.concurrent.ConcurrentHashMap;
-import java.util.concurrent.ConcurrentMap;
-import java.util.concurrent.ExecutionException;
-import java.util.concurrent.Future;
-import org.apache.ignite.tensorflow.core.longrunning.task.util.LongRunningProcessState;
-import org.apache.ignite.tensorflow.core.longrunning.task.util.LongRunningProcessStatus;
-import org.junit.Before;
-import org.junit.Test;
-
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertNotNull;
-import static org.junit.Assert.assertNull;
-import static org.junit.Assert.assertTrue;
-import static org.mockito.Mockito.doReturn;
-import static org.mockito.Mockito.doThrow;
-import static org.mockito.Mockito.mock;
-import static org.mockito.Mockito.spy;
-
-/**
- * Tests for {@link LongRunningProcessClearTask}.
- */
-public class LongRunningProcessClearTaskTest {
-    /** Process metadata storage used instead of Apache Ignite node local storage. */
-    private final ConcurrentMap<UUID, Future<?>> metadataStorage = new ConcurrentHashMap<>();
-
-    /** Initializes tests. */
-    @Before
-    public void init() {
-        metadataStorage.clear();
-    }
-
-    /** Tests execution of the task in case process is not found. */
-    @Test
-    public void testCallProcessNotFound() {
-        LongRunningProcessClearTask clearTask = createTask(UUID.randomUUID());
-
-        List<LongRunningProcessStatus> statuses = clearTask.call();
-
-        assertEquals(1, statuses.size());
-
-        LongRunningProcessStatus status = statuses.get(0);
-        assertEquals(LongRunningProcessState.NOT_FOUND, status.getState());
-        assertNull(status.getException());
-
-        assertEquals(0, metadataStorage.size());
-    }
-
-    /** Tests execution of the task in case process is running. */
-    @Test(expected = IllegalStateException.class)
-    public void testCallProcessIsRunning() {
-        UUID procId = UUID.randomUUID();
-
-        Future<?> fut = mock(Future.class);
-        doReturn(false).when(fut).isDone();
-        metadataStorage.put(procId, fut);
-
-        LongRunningProcessClearTask clearTask = createTask(procId);
-
-        clearTask.call();
-    }
-
-    /** Tests execution of the task in case process is done. */
-    @Test
-    public void testCallProcessIsDone() {
-        UUID procId = UUID.randomUUID();
-
-        Future<?> fut = mock(Future.class);
-        doReturn(true).when(fut).isDone();
-        metadataStorage.put(procId, fut);
-
-        LongRunningProcessClearTask clearTask = createTask(procId);
-
-        List<LongRunningProcessStatus> statuses = clearTask.call();
-
-        assertEquals(1, statuses.size());
-
-        LongRunningProcessStatus status = statuses.get(0);
-        assertEquals(LongRunningProcessState.DONE, status.getState());
-        assertNull(status.getException());
-
-        assertEquals(0, metadataStorage.size());
-    }
-
-    /** Tests execution of the task in case process is done with exception. */
-    @Test
-    public void testCallProcessIsDoneWithException() throws ExecutionException, InterruptedException {
-        UUID procId = UUID.randomUUID();
-
-        Future<?> fut = mock(Future.class);
-        doReturn(true).when(fut).isDone();
-        doThrow(RuntimeException.class).when(fut).get();
-        metadataStorage.put(procId, fut);
-
-        LongRunningProcessClearTask clearTask = createTask(procId);
-
-        List<LongRunningProcessStatus> statuses = clearTask.call();
-
-        assertEquals(1, statuses.size());
-
-        LongRunningProcessStatus status = statuses.get(0);
-        assertEquals(LongRunningProcessState.DONE, status.getState());
-        assertNotNull(status.getException());
-        assertTrue(status.getException() instanceof RuntimeException);
-
-        assertEquals(0, metadataStorage.size());
-    }
-
-    /**
-     * Creates clear task.
-     *
-     * @param procId Process identifier.
-     * @return Clear task.
-     */
-    private LongRunningProcessClearTask createTask(UUID procId) {
-        LongRunningProcessClearTask clearTask = new LongRunningProcessClearTask(Collections.singletonList(procId));
-
-        clearTask = spy(clearTask);
-        doReturn(metadataStorage).when(clearTask).getMetadataStorage();
-
-        return clearTask;
-    }
-}
diff --git a/modules/tensorflow/src/test/java/org/apache/ignite/tensorflow/core/longrunning/task/LongRunningProcessPingTaskTest.java b/modules/tensorflow/src/test/java/org/apache/ignite/tensorflow/core/longrunning/task/LongRunningProcessPingTaskTest.java
deleted file mode 100644
index 818509a..0000000
--- a/modules/tensorflow/src/test/java/org/apache/ignite/tensorflow/core/longrunning/task/LongRunningProcessPingTaskTest.java
+++ /dev/null
@@ -1,152 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package org.apache.ignite.tensorflow.core.longrunning.task;
-
-import java.util.Collections;
-import java.util.List;
-import java.util.UUID;
-import java.util.concurrent.ConcurrentHashMap;
-import java.util.concurrent.ConcurrentMap;
-import java.util.concurrent.ExecutionException;
-import java.util.concurrent.Future;
-import org.apache.ignite.tensorflow.core.longrunning.task.util.LongRunningProcessState;
-import org.apache.ignite.tensorflow.core.longrunning.task.util.LongRunningProcessStatus;
-import org.junit.Before;
-import org.junit.Test;
-
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertNotNull;
-import static org.junit.Assert.assertNull;
-import static org.junit.Assert.assertTrue;
-import static org.mockito.Mockito.doReturn;
-import static org.mockito.Mockito.doThrow;
-import static org.mockito.Mockito.mock;
-import static org.mockito.Mockito.spy;
-
-/**
- * Tests for {@link LongRunningProcessPingTask}.
- */
-public class LongRunningProcessPingTaskTest {
-    /** Process metadata storage used instead of Apache Ignite node local storage. */
-    private final ConcurrentMap<UUID, Future<?>> metadataStorage = new ConcurrentHashMap<>();
-
-    /** Initializes tests. */
-    @Before
-    public void init() {
-        metadataStorage.clear();
-    }
-
-    /** Tests execution of the task in case process is not found. */
-    @Test
-    public void testCallProcessNotFound() {
-        LongRunningProcessPingTask pingTask = createTask(UUID.randomUUID());
-
-        List<LongRunningProcessStatus> statuses = pingTask.call();
-
-        assertEquals(1, statuses.size());
-
-        LongRunningProcessStatus status = statuses.get(0);
-        assertEquals(LongRunningProcessState.NOT_FOUND, status.getState());
-        assertNull(status.getException());
-
-        assertEquals(0, metadataStorage.size());
-    }
-
-    /** Tests execution of the task in case process is running. */
-    @Test
-    public void testCallProcessIsRunning() {
-        UUID procId = UUID.randomUUID();
-
-        Future<?> fut = mock(Future.class);
-        doReturn(false).when(fut).isDone();
-        metadataStorage.put(procId, fut);
-
-        LongRunningProcessPingTask pingTask = createTask(procId);
-
-        List<LongRunningProcessStatus> statuses = pingTask.call();
-
-        assertEquals(1, statuses.size());
-
-        LongRunningProcessStatus status = statuses.get(0);
-        assertEquals(LongRunningProcessState.RUNNING, status.getState());
-        assertNull(status.getException());
-
-        assertEquals(1, metadataStorage.size());
-    }
-
-    /** Tests execution of the task in case process is done. */
-    @Test
-    public void testCallProcessIsDone() {
-        UUID procId = UUID.randomUUID();
-
-        Future<?> fut = mock(Future.class);
-        doReturn(true).when(fut).isDone();
-        metadataStorage.put(procId, fut);
-
-        LongRunningProcessPingTask pingTask = createTask(procId);
-
-        List<LongRunningProcessStatus> statuses = pingTask.call();
-
-        assertEquals(1, statuses.size());
-
-        LongRunningProcessStatus status = statuses.get(0);
-        assertEquals(LongRunningProcessState.DONE, status.getState());
-        assertNull(status.getException());
-
-        assertEquals(1, metadataStorage.size());
-    }
-
-    /** Tests execution of the task in case process is done with exception. */
-    @Test
-    public void testCallProcessIsDoneWithException() throws ExecutionException, InterruptedException {
-        UUID procId = UUID.randomUUID();
-
-        Future<?> fut = mock(Future.class);
-        doReturn(true).when(fut).isDone();
-        doThrow(RuntimeException.class).when(fut).get();
-        metadataStorage.put(procId, fut);
-
-        LongRunningProcessPingTask pingTask = createTask(procId);
-
-        List<LongRunningProcessStatus> statuses = pingTask.call();
-
-        assertEquals(1, statuses.size());
-
-        LongRunningProcessStatus status = statuses.get(0);
-        assertEquals(LongRunningProcessState.DONE, status.getState());
-        assertNotNull(status.getException());
-        assertTrue(status.getException() instanceof RuntimeException);
-
-        assertEquals(1, metadataStorage.size());
-    }
-
-    /**
-     * Creates ping task.
-     *
-     * @param procId Process identifier.
-     * @return Ping task.
-     */
-    private LongRunningProcessPingTask createTask(UUID procId) {
-        LongRunningProcessPingTask clearTask = new LongRunningProcessPingTask(Collections.singletonList(procId));
-
-        clearTask = spy(clearTask);
-        doReturn(metadataStorage).when(clearTask).getMetadataStorage();
-
-        return clearTask;
-    }
-}
diff --git a/modules/tensorflow/src/test/java/org/apache/ignite/tensorflow/core/longrunning/task/LongRunningProcessStartTaskTest.java b/modules/tensorflow/src/test/java/org/apache/ignite/tensorflow/core/longrunning/task/LongRunningProcessStartTaskTest.java
deleted file mode 100644
index 0d14335..0000000
--- a/modules/tensorflow/src/test/java/org/apache/ignite/tensorflow/core/longrunning/task/LongRunningProcessStartTaskTest.java
+++ /dev/null
@@ -1,101 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package org.apache.ignite.tensorflow.core.longrunning.task;
-
-import java.util.Collections;
-import java.util.List;
-import java.util.UUID;
-import java.util.concurrent.ConcurrentHashMap;
-import java.util.concurrent.ConcurrentMap;
-import java.util.concurrent.ExecutionException;
-import java.util.concurrent.Future;
-import org.apache.ignite.tensorflow.core.longrunning.LongRunningProcess;
-import org.junit.Before;
-import org.junit.Test;
-
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertNotNull;
-import static org.mockito.Mockito.doReturn;
-import static org.mockito.Mockito.spy;
-
-/**
- * Tests for {@link LongRunningProcessStartTask}.
- */
-public class LongRunningProcessStartTaskTest {
-    /** Process metadata storage used instead of Apache Ignite node local storage. */
-    private final ConcurrentMap<UUID, Future<?>> metadataStorage = new ConcurrentHashMap<>();
-
-    /** Initializes tests. */
-    @Before
-    public void init() {
-        metadataStorage.clear();
-    }
-
-    /** */
-    @Test
-    public void testCall() throws ExecutionException, InterruptedException {
-        LongRunningProcess proc = new LongRunningProcess(UUID.randomUUID(), () -> {});
-        LongRunningProcessStartTask task = createTask(proc);
-        List<UUID> procIds = task.call();
-
-        assertEquals(1, procIds.size());
-
-        UUID procId = procIds.get(0);
-
-        assertNotNull(metadataStorage.get(procId));
-
-        Future<?> fut = metadataStorage.get(procId);
-        fut.get();
-
-        assertEquals(true, fut.isDone());
-    }
-
-    /** */
-    @Test(expected = ExecutionException.class)
-    public void testCallWithException() throws ExecutionException, InterruptedException {
-        LongRunningProcess proc = new LongRunningProcess(UUID.randomUUID(), () -> {
-            throw new RuntimeException();
-        });
-        LongRunningProcessStartTask task = createTask(proc);
-        List<UUID> procIds = task.call();
-
-        assertEquals(1, procIds.size());
-
-        UUID procId = procIds.get(0);
-
-        assertNotNull(metadataStorage.get(procId));
-
-        Future<?> fut = metadataStorage.get(procId);
-        fut.get();
-    }
-
-    /**
-     * Creates start task.
-     *
-     * @param proc Long running process.
-     * @return Start task.
-     */
-    private LongRunningProcessStartTask createTask(LongRunningProcess proc) {
-        LongRunningProcessStartTask startTask = new LongRunningProcessStartTask(Collections.singletonList(proc));
-
-        startTask = spy(startTask);
-        doReturn(metadataStorage).when(startTask).getMetadataStorage();
-
-        return startTask;
-    }
-}
diff --git a/modules/tensorflow/src/test/java/org/apache/ignite/tensorflow/core/longrunning/task/LongRunningProcessStopTaskTest.java b/modules/tensorflow/src/test/java/org/apache/ignite/tensorflow/core/longrunning/task/LongRunningProcessStopTaskTest.java
deleted file mode 100644
index 129f0cb..0000000
--- a/modules/tensorflow/src/test/java/org/apache/ignite/tensorflow/core/longrunning/task/LongRunningProcessStopTaskTest.java
+++ /dev/null
@@ -1,157 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package org.apache.ignite.tensorflow.core.longrunning.task;
-
-import java.util.Collections;
-import java.util.List;
-import java.util.UUID;
-import java.util.concurrent.ConcurrentHashMap;
-import java.util.concurrent.ConcurrentMap;
-import java.util.concurrent.ExecutionException;
-import java.util.concurrent.Future;
-import org.apache.ignite.tensorflow.core.longrunning.task.util.LongRunningProcessState;
-import org.apache.ignite.tensorflow.core.longrunning.task.util.LongRunningProcessStatus;
-import org.junit.Before;
-import org.junit.Test;
-import org.mockito.Mockito;
-
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertNotNull;
-import static org.junit.Assert.assertNull;
-import static org.junit.Assert.assertTrue;
-import static org.mockito.Matchers.eq;
-import static org.mockito.Mockito.doReturn;
-import static org.mockito.Mockito.doThrow;
-import static org.mockito.Mockito.mock;
-import static org.mockito.Mockito.verify;
-
-/**
- * Tests for {@link LongRunningProcessStopTask}.
- */
-public class LongRunningProcessStopTaskTest {
-    /** Process metadata storage used instead of Apache Ignite node local storage. */
-    private final ConcurrentMap<UUID, Future<?>> metadataStorage = new ConcurrentHashMap<>();
-
-    /** Initializes tests. */
-    @Before
-    public void init() {
-        metadataStorage.clear();
-    }
-
-    /** Tests execution of the task in case process is not found. */
-    @Test
-    public void testCallProcessNotFound() {
-        LongRunningProcessStopTask stopTask = createTask(UUID.randomUUID(), true);
-
-        List<LongRunningProcessStatus> statuses = stopTask.call();
-
-        assertEquals(1, statuses.size());
-
-        LongRunningProcessStatus status = statuses.get(0);
-        assertEquals(LongRunningProcessState.NOT_FOUND, status.getState());
-        assertNull(status.getException());
-
-        assertEquals(0, metadataStorage.size());
-    }
-
-    /** Tests execution of the task in case process is running. */
-    @Test
-    public void testCallProcessIsRunning() {
-        UUID procId = UUID.randomUUID();
-
-        Future<?> fut = mock(Future.class);
-        doReturn(false).when(fut).isDone();
-        metadataStorage.put(procId, fut);
-
-        LongRunningProcessStopTask stopTask = createTask(procId, true);
-
-        List<LongRunningProcessStatus> statuses = stopTask.call();
-
-        assertEquals(1, statuses.size());
-        verify(fut).cancel(eq(true));
-
-        LongRunningProcessStatus status = statuses.get(0);
-        assertEquals(LongRunningProcessState.DONE, status.getState());
-        assertNull(status.getException());
-
-        assertEquals(0, metadataStorage.size());
-    }
-
-    /** Tests execution of the task in case process is done. */
-    @Test
-    public void testCallProcessIsDone() {
-        UUID procId = UUID.randomUUID();
-
-        Future<?> fut = mock(Future.class);
-        doReturn(true).when(fut).isDone();
-        metadataStorage.put(procId, fut);
-
-        LongRunningProcessStopTask stopTask = createTask(procId, true);
-
-        List<LongRunningProcessStatus> statuses = stopTask.call();
-
-        assertEquals(1, statuses.size());
-        verify(fut).cancel(eq(true));
-
-        LongRunningProcessStatus status = statuses.get(0);
-        assertEquals(LongRunningProcessState.DONE, status.getState());
-        assertNull(status.getException());
-
-        assertEquals(0, metadataStorage.size());
-    }
-
-    /** Tests execution of the task in case process is done with exception. */
-    @Test
-    public void testCallProcessIsDoneWithException() throws ExecutionException, InterruptedException {
-        UUID procId = UUID.randomUUID();
-
-        Future<?> fut = mock(Future.class);
-        doReturn(true).when(fut).isDone();
-        doThrow(RuntimeException.class).when(fut).get();
-        metadataStorage.put(procId, fut);
-
-        LongRunningProcessStopTask stopTask = createTask(procId, true);
-
-        List<LongRunningProcessStatus> statuses = stopTask.call();
-
-        assertEquals(1, statuses.size());
-        verify(fut).cancel(eq(true));
-
-        LongRunningProcessStatus status = statuses.get(0);
-        assertEquals(LongRunningProcessState.DONE, status.getState());
-        assertNotNull(status.getException());
-        assertTrue(status.getException() instanceof RuntimeException);
-
-        assertEquals(0, metadataStorage.size());
-    }
-
-    /**
-     * Creates stop task.
-     *
-     * @param procId Process identifier.
-     * @return Stop task.
-     */
-    private LongRunningProcessStopTask createTask(UUID procId, boolean clear) {
-        LongRunningProcessStopTask clearTask = new LongRunningProcessStopTask(Collections.singletonList(procId), clear);
-
-        clearTask = Mockito.spy(clearTask);
-        doReturn(metadataStorage).when(clearTask).getMetadataStorage();
-
-        return clearTask;
-    }
-}
diff --git a/parent/pom.xml b/parent/pom.xml
index 8b92c5b..f2b883c 100644
--- a/parent/pom.xml
+++ b/parent/pom.xml
@@ -465,10 +465,6 @@
                                 <packages>org.apache.ignite.ml*</packages>
                             </group>
                             <group>
-                                <title>Ignite TensorFlow</title>
-                                <packages>org.apache.ignite.tensorflow*</packages>
-                            </group>
-                            <group>
                                 <title>Encryption SPI</title>
                                 <packages>org.apache.ignite.spi.encryption*</packages>
                             </group>
diff --git a/pom.xml b/pom.xml
index 6db5b55..28e0385 100644
--- a/pom.xml
+++ b/pom.xml
@@ -96,9 +96,7 @@
         <module>modules/ml</module>
         <module>modules/ml/spark-model-parser</module>
         <module>modules/ml/xgboost-model-parser</module>
-        <module>modules/ml/tensorflow-model-parser</module>
         <module>modules/ml/h2o-model-parser</module>
-        <module>modules/tensorflow</module>
         <module>modules/opencensus</module>
     </modules>
 
@@ -122,7 +120,6 @@
         <profile>
             <id>all-scala</id><!-- used to update project versions and check all modules compilation -->
             <modules><!-- sorted alphabetically -->
-                <module>modules/ml/mleap-model-parser</module>
                 <module>modules/scalar-2.10</module>
                 <module>modules/scalar</module>
                 <module>modules/spark</module>
@@ -560,7 +557,6 @@
             </activation>
 
             <modules>
-                <module>modules/ml/mleap-model-parser</module>
                 <module>modules/scalar</module>
                 <module>modules/spark</module>
                 <module>modules/visor-console</module>
@@ -577,7 +573,6 @@
 
             <modules>
                 <module>modules/spark-2.4</module>
-                <module>modules/ml/mleap-model-parser</module>
                 <module>modules/scalar</module>
             </modules>
         </profile>
