diff --git a/org.eclipse.sisu.plexus.tests/resources/component-jar/component-jar-0.1.jar b/org.eclipse.sisu.plexus.tests/resources/component-jar/component-jar-0.1.jar
new file mode 100644
index 0000000..3c4e9dd
--- /dev/null
+++ b/org.eclipse.sisu.plexus.tests/resources/component-jar/component-jar-0.1.jar
Binary files differ
diff --git a/org.eclipse.sisu.plexus.tests/resources/component-jar/pom.xml b/org.eclipse.sisu.plexus.tests/resources/component-jar/pom.xml
new file mode 100644
index 0000000..ce05685
--- /dev/null
+++ b/org.eclipse.sisu.plexus.tests/resources/component-jar/pom.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ ~ Copyright (c) 2014 Takari, Inc.
+ ~ All rights reserved. This program and the accompanying materials
+ ~ are made available under the terms of the Eclipse Public License v1.0
+ ~ which accompanies this distribution, and is available at
+ ~ http://www.eclipse.org/legal/epl-v10.html
+ ~
+ ~ Contributors:
+ ~    Takari, Inc. - initial API and implementation
+-->
+
+<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>
+
+  <groupId>org.eclipse.sisu.plexus.tests</groupId>
+  <artifactId>component-jar</artifactId>
+  <version>0.1</version>
+
+</project>
diff --git a/org.eclipse.sisu.plexus.tests/resources/component-jar/src/main/java/org/eclipse/sisu/plexus/tests/SomeComponent.java b/org.eclipse.sisu.plexus.tests/resources/component-jar/src/main/java/org/eclipse/sisu/plexus/tests/SomeComponent.java
new file mode 100644
index 0000000..295638f
--- /dev/null
+++ b/org.eclipse.sisu.plexus.tests/resources/component-jar/src/main/java/org/eclipse/sisu/plexus/tests/SomeComponent.java
@@ -0,0 +1,16 @@
+/*******************************************************************************
+ * Copyright (c) 2014 Takari, Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *    Takari, Inc. - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.sisu.plexus.tests;
+
+public class SomeComponent
+{
+
+}
diff --git a/org.eclipse.sisu.plexus.tests/resources/component-jar/src/main/resources/META-INF/plexus/components.xml b/org.eclipse.sisu.plexus.tests/resources/component-jar/src/main/resources/META-INF/plexus/components.xml
new file mode 100644
index 0000000..320cd3c
--- /dev/null
+++ b/org.eclipse.sisu.plexus.tests/resources/component-jar/src/main/resources/META-INF/plexus/components.xml
@@ -0,0 +1,22 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ ~ Copyright (c) 2014 Takari, Inc.
+ ~ All rights reserved. This program and the accompanying materials
+ ~ are made available under the terms of the Eclipse Public License v1.0
+ ~ which accompanies this distribution, and is available at
+ ~ http://www.eclipse.org/legal/epl-v10.html
+ ~
+ ~ Contributors:
+ ~    Takari, Inc. - initial API and implementation
+-->
+<component-set>
+  <components>
+    <component>
+      <role>org.eclipse.sisu.plexus.tests.SomeComponent</role>
+      <role-hint>default</role-hint>
+      <implementation>org.eclipse.sisu.plexus.tests.SomeComponent</implementation>
+      <description />
+      <isolated-realm>false</isolated-realm>
+    </component>
+  </components>
+</component-set>
diff --git a/org.eclipse.sisu.plexus.tests/src/org/eclipse/sisu/plexus/DefaultPlexusContainerTest.java b/org.eclipse.sisu.plexus.tests/src/org/eclipse/sisu/plexus/DefaultPlexusContainerTest.java
new file mode 100644
index 0000000..1cafb28
--- /dev/null
+++ b/org.eclipse.sisu.plexus.tests/src/org/eclipse/sisu/plexus/DefaultPlexusContainerTest.java
@@ -0,0 +1,102 @@
+/*******************************************************************************
+ * Copyright (c) 2014 Takari, Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *    Takari, Inc. - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.sisu.plexus;
+
+import java.io.File;
+
+import junit.framework.TestCase;
+
+import org.codehaus.plexus.DefaultPlexusContainer;
+import org.codehaus.plexus.classworlds.realm.ClassRealm;
+
+public class DefaultPlexusContainerTest
+    extends TestCase
+{
+    private ClassLoader origCL;
+
+    @Override
+    protected void setUp()
+        throws Exception
+    {
+        super.setUp();
+        origCL = Thread.currentThread().getContextClassLoader();
+    }
+
+    @Override
+    protected void tearDown()
+        throws Exception
+    {
+        Thread.currentThread().setContextClassLoader( origCL );
+        super.tearDown();
+    }
+
+    public void test441254_recreateChildRealm()
+        throws Exception
+    {
+        String realmId = "child-realm";
+
+        DefaultPlexusContainer plexus = new DefaultPlexusContainer();
+
+        ClassRealm realm = plexus.createChildRealm( realmId );
+        realm.addURL( new File( "resources/component-jar/component-jar-0.1.jar" ).getCanonicalFile().toURI().toURL() );
+        Thread.currentThread().setContextClassLoader( realm );
+        plexus.discoverComponents( realm );
+        assertNotNull( plexus.lookup( "org.eclipse.sisu.plexus.tests.SomeComponent" ) );
+
+        realm.getWorld().disposeRealm( realm.getId() );
+
+        realm = plexus.createChildRealm( realmId );
+        realm.addURL( new File( "resources/component-jar/component-jar-0.1.jar" ).getCanonicalFile().toURI().toURL() );
+        Thread.currentThread().setContextClassLoader( realm );
+        plexus.discoverComponents( realm );
+        assertNotNull( plexus.lookup( "org.eclipse.sisu.plexus.tests.SomeComponent" ) );
+    }
+
+    // the point of this disabled test is to manually assert all references to the disposed realms are cleared
+    // the test runs create/dispose the same realm 100k times and prints 1k iterations how long it took
+    // each 1k are expected to take about the same time to execute (as opposed to always increasing time)
+    // it is recommended to run the test with -Xmx128m to make sure there are no memory leaks
+    public void _test441254_torture()
+        throws Exception
+    {
+        String realmId = "child-realm";
+
+        DefaultPlexusContainer plexus = new DefaultPlexusContainer();
+
+        ClassRealm realm = plexus.createChildRealm( realmId );
+        realm.addURL( new File( "resources/component-jar/component-jar-0.1.jar" ).getCanonicalFile().toURI().toURL() );
+        Thread.currentThread().setContextClassLoader( realm );
+        plexus.discoverComponents( realm );
+
+        long start = System.currentTimeMillis();
+        for ( int i = 0; i < 100000; i++ )
+        {
+            realm.getWorld().disposeRealm( realm.getId() );
+
+            realm = plexus.createChildRealm( realmId );
+            realm.addURL( new File( "resources/component-jar/component-jar-0.1.jar" ).getCanonicalFile().toURI().toURL() );
+            Thread.currentThread().setContextClassLoader( realm );
+            plexus.discoverComponents( realm );
+
+            if ( i % 1000 == 0 )
+            {
+                long end = System.currentTimeMillis();
+                System.out.printf( "%6d %d\n", i, end - start );
+                start = end;
+            }
+        }
+
+        realm.getWorld().disposeRealm( realm.getId() );
+
+        System.in.read();
+    }
+
+}
