diff --git a/java/pom.xml b/java/pom.xml
index 7ea593eb53238acdc465a2bec4a34308e7444f59..a839c769a1f12a3c50359e0a34c064db87801004 100644
--- a/java/pom.xml
+++ b/java/pom.xml
@@ -18,6 +18,7 @@
         <module>runjava</module>
         <module>tests</module>
         <module>tests-isolates</module>
+        <module>tests-jre-extension</module>
     </modules>
 
     <dependencies>
@@ -56,6 +57,11 @@
                 <artifactId>tests-isolates</artifactId>
                 <version>${project.version}</version>
             </dependency>
+            <dependency>
+                <groupId>io.osv</groupId>
+                <artifactId>tests-jre-extension</artifactId>
+                <version>${project.version}</version>
+            </dependency>
             <dependency>
                 <groupId>org.apache.commons</groupId>
                 <artifactId>commons-lang3</artifactId>
diff --git a/java/runjava/pom.xml b/java/runjava/pom.xml
index 8aeb185723052e612ca8ebc14ffba517c0cf032c..feed5f1912698ce948f965e6869e9f84d30b8519 100644
--- a/java/runjava/pom.xml
+++ b/java/runjava/pom.xml
@@ -43,6 +43,31 @@
                     </execution>
                 </executions>
             </plugin>
+            <plugin>
+                <groupId>org.apache.maven.plugins</groupId>
+                <artifactId>maven-shade-plugin</artifactId>
+                <version>2.2</version>
+                <executions>
+                    <execution>
+                        <phase>package</phase>
+                        <goals>
+                            <goal>shade</goal>
+                        </goals>
+                        <configuration>
+                            <relocations>
+                                <relocation>
+                                    <pattern>net.sf.cglib</pattern>
+                                    <shadedPattern>io.osv.shade.net.sf.cglib</shadedPattern>
+                                </relocation>
+                                <relocation>
+                                    <pattern>org.objectweb.asm</pattern>
+                                    <shadedPattern>io.osv.shade.org.objectweb.asm</shadedPattern>
+                                </relocation>
+                            </relocations>
+                        </configuration>
+                    </execution>
+                </executions>
+            </plugin>
         </plugins>
     </build>
 </project>
diff --git a/java/runjava/src/main/java/io/osv/ContextIsolator.java b/java/runjava/src/main/java/io/osv/ContextIsolator.java
index 2c425e99a1954e1253c8cccc139efe6b739a9452..96e00504bb695319d077a66f4e840d482cbec1fe 100644
--- a/java/runjava/src/main/java/io/osv/ContextIsolator.java
+++ b/java/runjava/src/main/java/io/osv/ContextIsolator.java
@@ -60,8 +60,7 @@ public class ContextIsolator {
         ClassLoader originalSystemClassLoader = getOsvClassLoader().getParent();
         masterContext = new Context(originalSystemClassLoader, System.getProperties());
 
-        parentClassLoaderForIsolates = new TeeClassLoader(
-                new FilteringClassLoader(originalSystemClassLoader, "io.osv."));
+        parentClassLoaderForIsolates = originalSystemClassLoader;
 
         installSystemPropertiesProxy();
     }
diff --git a/java/runjava/src/main/java/io/osv/FilteringClassLoader.java b/java/runjava/src/main/java/io/osv/FilteringClassLoader.java
deleted file mode 100644
index 6c8c28a1af00394b4ed3a4186befcbf81363accc..0000000000000000000000000000000000000000
--- a/java/runjava/src/main/java/io/osv/FilteringClassLoader.java
+++ /dev/null
@@ -1,22 +0,0 @@
-package io.osv;
-
-class FilteringClassLoader extends ClassLoader {
-    private final String allowedPrefix;
-
-    public FilteringClassLoader(ClassLoader parent, String allowedPrefix) {
-        super(parent);
-        this.allowedPrefix = allowedPrefix;
-    }
-
-    private boolean isClassAllowed(String name) {
-        return name.startsWith(allowedPrefix);
-    }
-
-    @Override
-    protected Class<?> loadClass(String name, boolean resolve) throws ClassNotFoundException {
-        if (!isClassAllowed(name)) {
-            throw new ClassNotFoundException(name);
-        }
-        return super.loadClass(name, resolve);
-    }
-}
diff --git a/java/runjava/src/main/java/io/osv/TeeClassLoader.java b/java/runjava/src/main/java/io/osv/TeeClassLoader.java
deleted file mode 100644
index 1d98a3b83582767aa439d7e0cecfa91e65d6d21e..0000000000000000000000000000000000000000
--- a/java/runjava/src/main/java/io/osv/TeeClassLoader.java
+++ /dev/null
@@ -1,29 +0,0 @@
-package io.osv;
-
-import java.io.IOException;
-import java.net.URL;
-import java.util.Enumeration;
-
-class TeeClassLoader extends ClassLoader {
-    private ClassLoader delegate;
-
-    public TeeClassLoader(ClassLoader delegate) {
-        super(null);
-        this.delegate = delegate;
-    }
-
-    @Override
-    protected Class<?> findClass(String name) throws ClassNotFoundException {
-        return delegate.loadClass(name);
-    }
-
-    @Override
-    protected URL findResource(String name) {
-        return delegate.getResource(name);
-    }
-
-    @Override
-    protected Enumeration<URL> findResources(String name) throws IOException {
-        return delegate.getResources(name);
-    }
-}
diff --git a/java/tests-jre-extension/pom.xml b/java/tests-jre-extension/pom.xml
new file mode 100644
index 0000000000000000000000000000000000000000..84a861e5bd02ccf6d0efe86e64b369a959d91294
--- /dev/null
+++ b/java/tests-jre-extension/pom.xml
@@ -0,0 +1,19 @@
+<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>
+        <groupId>io.osv</groupId>
+        <artifactId>java-parent</artifactId>
+        <version>${version}</version>
+    </parent>
+
+    <artifactId>tests-jre-extension</artifactId>
+    <packaging>jar</packaging>
+
+    <build>
+        <finalName>tests-jre-extension</finalName>
+    </build>
+</project>
diff --git a/java/tests-jre-extension/src/main/java/tests/SomeExtensionClass.java b/java/tests-jre-extension/src/main/java/tests/SomeExtensionClass.java
new file mode 100644
index 0000000000000000000000000000000000000000..bc07386468818095c82e672011e76dedc0e9bcab
--- /dev/null
+++ b/java/tests-jre-extension/src/main/java/tests/SomeExtensionClass.java
@@ -0,0 +1,10 @@
+package tests;
+
+/*
+ * Copyright (C) 2014 Cloudius Systems, Ltd.
+ *
+ * This work is open source software, licensed under the terms of the
+ * BSD license as described in the LICENSE file in the top-level directory.
+ */
+public class SomeExtensionClass {
+}
diff --git a/java/tests/pom.xml b/java/tests/pom.xml
index e34b357d428372a1e1e5f24111a5431ad5facc85..f359f43c1d8ed54ae4f98cac588f4adffe7f2613 100644
--- a/java/tests/pom.xml
+++ b/java/tests/pom.xml
@@ -31,6 +31,11 @@
             <artifactId>runjava</artifactId>
             <scope>provided</scope>
         </dependency>
+        <dependency>
+            <groupId>io.osv</groupId>
+            <artifactId>tests-jre-extension</artifactId>
+            <scope>provided</scope>
+        </dependency>
         <dependency>
             <groupId>io.osv</groupId>
             <artifactId>tests-isolates</artifactId>
@@ -81,23 +86,6 @@
                     </execution>
                 </executions>
             </plugin>
-            <plugin>
-                <groupId>org.apache.maven.plugins</groupId>
-                <artifactId>maven-surefire-plugin</artifactId>
-                <configuration>
-                    <testSourceDirectory>${basedir}/src/main/java/</testSourceDirectory>
-                    <testClassesDirectory>target/classes</testClassesDirectory>
-                    <argLine>-ea -Djava.system.class.loader=io.osv.OsvSystemClassLoader
-                        -Djava.util.logging.manager=io.osv.jul.IsolatingLogManager
-                    </argLine>
-                    <systemProperties>
-                        <property>
-                            <name>isolates.jar</name>
-                            <value>${io.osv:tests-isolates:jar:jar-with-dependencies}</value>
-                        </property>
-                    </systemProperties>
-                </configuration>
-            </plugin>
         </plugins>
     </build>
 </project>
diff --git a/java/tests/src/main/java/io/osv/ClassLoaderIsolationTest.java b/java/tests/src/main/java/io/osv/ClassLoaderIsolationTest.java
index f31d5d8a8fd0a0e6f51026467d58298f3b118ff0..df0b879440270f89257138949a8746108ca4a660 100644
--- a/java/tests/src/main/java/io/osv/ClassLoaderIsolationTest.java
+++ b/java/tests/src/main/java/io/osv/ClassLoaderIsolationTest.java
@@ -7,6 +7,7 @@ import java.util.concurrent.CyclicBarrier;
 
 import static io.osv.TestIsolateLaunching.runIsolate;
 import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNotNull;
 
 /*
  * Copyright (C) 2014 Cloudius Systems, Ltd.
@@ -66,4 +67,9 @@ public class ClassLoaderIsolationTest {
             }
         }
     }
+
+    @Test
+    public void testClassesFromExtensionDirectoryCanBeLoaded() throws Exception {
+        assertNotNull(SomeExtensionClass.class);
+    }
 }
diff --git a/modules/java-tests/module.py b/modules/java-tests/module.py
index 3ff51677d07946b975e244ab60b4392d47cc08a2..828c8a6d75f5f0d35594ed4816c7a8dec11c0391 100644
--- a/modules/java-tests/module.py
+++ b/modules/java-tests/module.py
@@ -10,5 +10,8 @@ usr_files = FileMap()
 usr_files.add('${OSV_BASE}/java/tests/target/runjava-tests.jar').to(_jar)
 usr_files.add('${OSV_BASE}/java/tests-isolates/target/tests-isolates-jar-with-dependencies.jar').to(_isolates_jar)
 
+usr_files.add('${OSV_BASE}/java/tests-jre-extension/target/tests-jre-extension.jar') \
+    .to('/usr/lib/jvm/jre/lib/ext/tests-jre-extension.jar')
+
 run_tests = api.run_java(classpath=[_jar, _isolates_jar],
     args=['-Disolates.jar=' + _isolates_jar, 'org.junit.runner.JUnitCore', 'io.osv.AllTests'])