diff --git a/modules/core/src/test/java/org/apache/ignite/testframework/GridTestUtils.java b/modules/core/src/test/java/org/apache/ignite/testframework/GridTestUtils.java
index d9f8ade..199685d 100644
--- a/modules/core/src/test/java/org/apache/ignite/testframework/GridTestUtils.java
+++ b/modules/core/src/test/java/org/apache/ignite/testframework/GridTestUtils.java
@@ -99,6 +99,7 @@
 import org.apache.ignite.internal.processors.odbc.ClientListenerProcessor;
 import org.apache.ignite.internal.processors.port.GridPortRecord;
 import org.apache.ignite.internal.util.GridBusyLock;
+import org.apache.ignite.internal.util.IgniteUtils;
 import org.apache.ignite.internal.util.future.GridFutureAdapter;
 import org.apache.ignite.internal.util.lang.GridAbsClosure;
 import org.apache.ignite.internal.util.lang.GridAbsPredicate;
@@ -123,6 +124,7 @@
 import org.jetbrains.annotations.NotNull;
 import org.jetbrains.annotations.Nullable;
 
+import static org.apache.ignite.IgniteSystemProperties.IGNITE_HOME;
 import static org.apache.ignite.internal.processors.cache.persistence.file.FilePageStoreManager.DFLT_STORE_DIR;
 import static org.apache.ignite.ssl.SslContextFactory.DFLT_KEY_ALGORITHM;
 import static org.apache.ignite.ssl.SslContextFactory.DFLT_SSL_PROTOCOL;
@@ -1280,6 +1282,20 @@
         }
     }
 
+    /** */
+    public static void initTestProjectHome() {
+        // Initialize IGNITE_HOME system property.
+        String igniteHome = U.getIgniteHome();
+
+        if (F.isEmpty(igniteHome)) {
+            igniteHome = new File(System.getProperty("user.dir"), "ignite").getAbsolutePath();
+
+            IgniteUtils.setIgniteHome(igniteHome);
+
+            U.warn(null, '"' + IGNITE_HOME + "\" system property was automatically set to " + igniteHome);
+        }
+    }
+
     /**
      * @return Ignite home.
      * @throws Exception If failed.
diff --git a/modules/core/src/test/java/org/apache/ignite/testframework/config/GridTestProperties.java b/modules/core/src/test/java/org/apache/ignite/testframework/config/GridTestProperties.java
index 9a89d12..b1c9869 100644
--- a/modules/core/src/test/java/org/apache/ignite/testframework/config/GridTestProperties.java
+++ b/modules/core/src/test/java/org/apache/ignite/testframework/config/GridTestProperties.java
@@ -18,6 +18,7 @@
 package org.apache.ignite.testframework.config;
 
 import java.io.File;
+import java.io.FileInputStream;
 import java.io.IOException;
 import java.io.InputStream;
 import java.net.URI;
@@ -31,15 +32,12 @@
 import java.util.regex.Pattern;
 import org.apache.ignite.binary.BinaryBasicNameMapper;
 import org.apache.ignite.binary.BinaryTypeConfiguration;
-import org.apache.ignite.internal.util.typedef.F;
-import org.apache.ignite.internal.util.typedef.internal.U;
 import org.apache.ignite.testframework.GridTestUtils;
 import org.apache.logging.log4j.core.config.Configurator;
 import org.apache.logging.log4j.core.config.LoggerConfig;
 import org.jetbrains.annotations.Nullable;
 
-import static org.apache.ignite.IgniteSystemProperties.IGNITE_HOME;
-import static org.junit.Assert.fail;
+import static org.apache.ignite.testframework.GridTestUtils.initTestProjectHome;
 
 /**
  * Loads test properties from {@code config} folder under tests.
@@ -105,28 +103,15 @@
     /** */
     static {
         // Initialize IGNITE_HOME system property.
-        if (F.isEmpty(U.getIgniteHome())) {
-            // Setting IGNITE_HOME for extensions because the current logger configuration depends on it.
-            String userDir = System.getProperty("user.dir");
-
-            if (!F.isEmpty(userDir)) {
-                String igniteDir = new File(userDir, "ignite").getAbsolutePath();
-
-                System.setProperty(IGNITE_HOME, igniteDir);
-
-                System.out.println('"' + IGNITE_HOME + "\" system property was automatically set to " + igniteDir);
-            }
-        }
+        initTestProjectHome();
 
         // Load default properties.
-//        URI cfgFileResource = null;
+        File cfgFile = getTestConfigurationFile(null, TESTS_PROP_FILE);
 
-        URI cfgFile = getTestConfigurationFile(TESTS_PROP_FILE, true);
+        assert cfgFile != null && cfgFile.exists();
+        assert !cfgFile.isDirectory();
 
-        if (cfgFile == null)
-            fail("Unable to find " + TESTS_PROP_FILE);
-
-        dfltProps = Collections.unmodifiableMap(loadFromResource(new HashMap<>(), cfgFile));
+        dfltProps = Collections.unmodifiableMap(loadFromFile(new HashMap<String, String>(), cfgFile));
 
         if ("false".equals(System.getProperty("IGNITE_TEST_PROP_DISABLE_LOG4J", "false"))) {
             String user = System.getProperty("user.name");
@@ -154,9 +139,12 @@
         if (cfgFile == null)
             cfgFile = DEFAULT_LOG4J_FILE;
 
-        URI log4jFile = getTestConfigurationFile(cfgFile, true, user, null);
+        File log4jFile = getTestConfigurationFile(user, cfgFile);
 
-        Configurator.initialize(LoggerConfig.ROOT, GridTestProperties.class.getClassLoader(), log4jFile);
+        if (log4jFile == null)
+            log4jFile = getTestConfigurationFile(null, cfgFile);
+
+        Configurator.initialize(LoggerConfig.ROOT, log4jFile.getAbsolutePath());
 
         System.out.println("Configured log4j2 from: " + log4jFile);
     }
@@ -167,13 +155,13 @@
     }
 
     /** */
-    public static URI findTestResource(String res) {
+    public static File findTestResource(String res) {
         URL resUrl = GridTestProperties.class.getResource(TEST_CONFIG_DIR + res);
 
         if (resUrl == null)
             return null;
 
-        return URI.create(resUrl.toExternalForm());
+        return new File(URI.create(resUrl.toExternalForm()));
     }
 
     /**
@@ -296,91 +284,62 @@
      * @return Loaded properties.
      */
     private static Map<String, String> loadProperties(Map<String, String> props, String dir) {
-        URI cfg = getTestConfigurationFile(TESTS_PROP_FILE, false, dir);
+        File cfg = getTestConfigurationFile(dir, TESTS_PROP_FILE);
 
         if (cfg != null)
-            loadFromResource(props, cfg);
+            loadFromFile(props, cfg);
 
         return props;
     }
 
     /**
+     * @param user User name.
      * @param fileName File name.
-     * @param resourceLookup Search this file in resources.
-     * @param subDirs Sub-directory names.
-     * @return Configuration file for given sub-directories.
+     * @return Configuration file for given user.
      */
-    @Nullable private static URI getTestConfigurationFile(String fileName, boolean resourceLookup, String... subDirs) {
-        if (F.isEmpty(subDirs))
-            subDirs = new String[] {null};
+    @Nullable private static File getTestConfigurationFile(@Nullable String user, String fileName) {
+        String path = TESTS_CFG_PATH;
 
-        for (String dir : subDirs) {
-            String path = TESTS_CFG_PATH;
+        if (user != null)
+            path += File.separatorChar + user;
 
-            if (dir != null)
-                path += File.separatorChar + dir;
+        path += File.separatorChar + fileName;
 
-            path += File.separatorChar + fileName;
+        File file = GridTestUtils.resolveIgnitePath(path);
 
-            File file = GridTestUtils.resolveIgnitePath(path);
+        if (file != null && file.exists()) {
+            assert !file.isDirectory();
 
-            if (file != null && file.exists()) {
-                assert !file.isDirectory();
+            return file;
+        }
 
-                return file.toURI();
+        return user == null ? findTestResource(fileName) : null;
+    }
+
+    /**
+     * @param props Initial properties.
+     * @param file Property file.
+     * @return Loaded properties.
+     */
+    private static Map<String, String> loadFromFile(Map<String, String> props, File file) {
+        try {
+
+            try (InputStream in = new FileInputStream(file)) {
+                Properties fileProps = new Properties();
+
+                fileProps.load(in);
+
+                for (Entry<Object, Object> prop : fileProps.entrySet())
+                    props.put((String)prop.getKey(), (String)prop.getValue());
+
+                for (Entry<String, String> prop : props.entrySet())
+                    prop.setValue(substituteProperties(prop.getValue()));
             }
         }
-
-        return resourceLookup ? findTestResource(TESTS_PROP_FILE) : null;
-    }
-
-    /**
-     * @param props Initial properties.
-     * @param resource File resource location.
-     * @return Loaded properties.
-     */
-    private static Map<String, String> loadFromResource(Map<String, String> props, URI resource) {
-        try (InputStream in = resource.toURL().openStream()) {
-            Properties fileProps = new Properties();
-
-            fileProps.load(in);
-
-            for (Entry<Object, Object> prop : fileProps.entrySet())
-                props.put((String)prop.getKey(), (String)prop.getValue());
-
-            for (Entry<String, String> prop : props.entrySet())
-                prop.setValue(substituteProperties(prop.getValue()));
-        }
         catch (IOException e) {
             e.printStackTrace();
 
-            assert false : "Failed to load test configuration properties: " + resource;
-        }
-
-        return props;
-    }
-
-    /**
-     * @param props Initial properties.
-     * @param res Resource.
-     * @return Loaded properties.
-     */
-    private static Map<String, String> loadFromResource(Map<String, String> props, URL res) {
-        try (InputStream in = res.openStream()) {
-            Properties fileProps = new Properties();
-
-            fileProps.load(in);
-
-            for (Entry<Object, Object> prop : fileProps.entrySet())
-                props.put((String)prop.getKey(), (String)prop.getValue());
-
-            for (Entry<String, String> prop : props.entrySet())
-                prop.setValue(substituteProperties(prop.getValue()));
-        }
-        catch (IOException e) {
-            e.printStackTrace();
-
-            assert false : "Failed to load test configuration properties: " + res;
+            assert false : "Failed to load test configuration properties: " + file;
         }
 
         return props;
