diff --git a/tests/org.eclipse.e4.languages.javascript.framework.test/.classpath b/tests/org.eclipse.e4.languages.javascript.framework.test/.classpath
new file mode 100644
index 0000000..ad32c83
--- /dev/null
+++ b/tests/org.eclipse.e4.languages.javascript.framework.test/.classpath
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<classpath>
+	<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/JavaSE-1.6"/>
+	<classpathentry kind="con" path="org.eclipse.pde.core.requiredPlugins"/>
+	<classpathentry kind="src" path="src"/>
+	<classpathentry kind="output" path="bin"/>
+</classpath>
diff --git a/tests/org.eclipse.e4.languages.javascript.framework.test/.project b/tests/org.eclipse.e4.languages.javascript.framework.test/.project
new file mode 100644
index 0000000..88494eb
--- /dev/null
+++ b/tests/org.eclipse.e4.languages.javascript.framework.test/.project
@@ -0,0 +1,28 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<projectDescription>
+	<name>org.eclipse.e4.languages.javascript.framework.test</name>
+	<comment></comment>
+	<projects>
+	</projects>
+	<buildSpec>
+		<buildCommand>
+			<name>org.eclipse.jdt.core.javabuilder</name>
+			<arguments>
+			</arguments>
+		</buildCommand>
+		<buildCommand>
+			<name>org.eclipse.pde.ManifestBuilder</name>
+			<arguments>
+			</arguments>
+		</buildCommand>
+		<buildCommand>
+			<name>org.eclipse.pde.SchemaBuilder</name>
+			<arguments>
+			</arguments>
+		</buildCommand>
+	</buildSpec>
+	<natures>
+		<nature>org.eclipse.pde.PluginNature</nature>
+		<nature>org.eclipse.jdt.core.javanature</nature>
+	</natures>
+</projectDescription>
diff --git a/tests/org.eclipse.e4.languages.javascript.framework.test/.settings/org.eclipse.jdt.core.prefs b/tests/org.eclipse.e4.languages.javascript.framework.test/.settings/org.eclipse.jdt.core.prefs
new file mode 100644
index 0000000..72be161
--- /dev/null
+++ b/tests/org.eclipse.e4.languages.javascript.framework.test/.settings/org.eclipse.jdt.core.prefs
@@ -0,0 +1,8 @@
+#Fri May 14 16:54:18 EDT 2010
+eclipse.preferences.version=1
+org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled
+org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.6
+org.eclipse.jdt.core.compiler.compliance=1.6
+org.eclipse.jdt.core.compiler.problem.assertIdentifier=error
+org.eclipse.jdt.core.compiler.problem.enumIdentifier=error
+org.eclipse.jdt.core.compiler.source=1.6
diff --git a/tests/org.eclipse.e4.languages.javascript.framework.test/.settings/org.eclipse.pde.core.prefs b/tests/org.eclipse.e4.languages.javascript.framework.test/.settings/org.eclipse.pde.core.prefs
new file mode 100644
index 0000000..5a20dbd
--- /dev/null
+++ b/tests/org.eclipse.e4.languages.javascript.framework.test/.settings/org.eclipse.pde.core.prefs
@@ -0,0 +1,4 @@
+#Fri May 14 16:54:18 EDT 2010
+eclipse.preferences.version=1
+pluginProject.extensions=false
+resolve.requirebundle=false
diff --git a/tests/org.eclipse.e4.languages.javascript.framework.test/META-INF/MANIFEST.MF b/tests/org.eclipse.e4.languages.javascript.framework.test/META-INF/MANIFEST.MF
new file mode 100644
index 0000000..82d215b
--- /dev/null
+++ b/tests/org.eclipse.e4.languages.javascript.framework.test/META-INF/MANIFEST.MF
@@ -0,0 +1,16 @@
+Manifest-Version: 1.0
+Bundle-ManifestVersion: 2
+Bundle-Name: Test
+Bundle-SymbolicName: org.eclipse.e4.languages.javascript.framework.test
+Bundle-Version: 1.0.0.qualifier
+Require-Bundle: org.junit,
+ org.eclipse.e4.languages.javascript.junit;bundle-version="1.0.0",
+ org.eclipse.e4.languages.javascript.framework;bundle-version="1.0.0",
+ org.eclipse.equinox.common;bundle-version="3.6.0"
+Bundle-RequiredExecutionEnvironment: J2SE-1.5
+Import-Package: org.osgi.framework;version="1.5.0",
+ org.osgi.service.packageadmin,
+ org.osgi.util.tracker
+Export-Package: org.eclipse.e4.languages.javascript.framework.test
+Bundle-ActivationPolicy: lazy
+Bundle-Activator: org.eclipse.e4.languages.javascript.framework.test.Activator
diff --git a/tests/org.eclipse.e4.languages.javascript.framework.test/build.properties b/tests/org.eclipse.e4.languages.javascript.framework.test/build.properties
new file mode 100644
index 0000000..34d2e4d
--- /dev/null
+++ b/tests/org.eclipse.e4.languages.javascript.framework.test/build.properties
@@ -0,0 +1,4 @@
+source.. = src/
+output.. = bin/
+bin.includes = META-INF/,\
+               .
diff --git a/tests/org.eclipse.e4.languages.javascript.framework.test/scripts/BundleTest.js b/tests/org.eclipse.e4.languages.javascript.framework.test/scripts/BundleTest.js
new file mode 100644
index 0000000..464c75d
--- /dev/null
+++ b/tests/org.eclipse.e4.languages.javascript.framework.test/scripts/BundleTest.js
@@ -0,0 +1,84 @@
+var BundleTest = TestCase.create("BundleTest");
+
+BundleTest.prototype.testGetName = function() {
+	var framework = new Framework();
+	var b = framework.installBundle("xyz_1", {name:"xyz"});
+	assertEquals("xyz", b.getName());
+};
+
+BundleTest.prototype.testEmptyVersion = function() {
+	var framework = new Framework();
+	var b = framework.installBundle("xyz_1", {name:"xyz"});
+	assertEquals(Version.EMPTY_VERSION, b.getVersion());
+};
+
+BundleTest.prototype.testBasicVersion = function() {
+	var framework = new Framework();
+	var b = framework.installBundle("xyz_1", {name:"xyz", version:"1.2.3.test"});
+	assertEquals(Version.parseVersion("1.2.3.test"), b.getVersion());
+};
+
+BundleTest.prototype.testBasicVersion = function() {
+	var framework = new Framework();
+	var b = framework.installBundle("xyz_1", {name:"xyz", version:"1.2.3.test"});
+	assertEquals(Version.parseVersion("1.2.3.test"), b.getVersion());
+};
+
+BundleTest.prototype.testGetBundleId = function() {
+	var framework = new Framework();
+	var b1 = framework.installBundle("xyz_1", {name:"xyz", version:"1.2.3.test"});
+	assertEquals(0, b1.getBundleId());
+	var b2 = framework.installBundle("xyz_2", {name:"xyz", version:"2.2.3.test"});
+	assertEquals(1, b2.getBundleId());
+};
+
+BundleTest.prototype.testGetLocation = function() {
+	var framework = new Framework();
+	var b = framework.installBundle("xyz_1", {name:"xyz", version:"1.2.3.test"});
+	assertEquals("xyz_1", b.getLocation());
+};
+
+BundleTest.prototype.testGetHeaders = function() {
+	var framework = new Framework();
+	var b = framework.installBundle("xyz_1", {name:"xyz", version:"1.2.3.test", randomHeader: "random"});
+	assertEquals("xyz", b.getHeaders().name);
+	assertEquals("1.2.3.test", b.getHeaders().version);
+	assertEquals("random", b.getHeaders().randomHeader);
+	assertUndefined(b.getHeaders().randomHeader2);
+};
+
+BundleTest.prototype.testGetState = function() {
+	var framework = new Framework();
+	var b = framework.installBundle("xyz_1", {name:"xyz", version:"1.2.3.test", randomHeader: "random"});
+	assertEquals(Bundle.INSTALLED, b.getState());
+	framework.resolve();
+	assertEquals(Bundle.RESOLVED, b.getState());
+	b.start();
+	assertEquals(Bundle.ACTIVE, b.getState());
+	b.stop();
+	assertEquals(Bundle.RESOLVED, b.getState());
+	b.uninstall();
+	assertEquals(Bundle.UNINSTALLED, b.getState());
+};
+
+BundleTest.prototype.testEquals = function() {
+	var framework = new Framework();
+	var b1 = framework.installBundle("xyz_1", {name:"xyz", version:"1.2.3.test", randomHeader: "random"});
+	var b2 = framework.installBundle("xyz_2", {name:"xyz", version:"1.2.3.test", randomHeader: "random"});
+	var b3 = framework.installBundle("xyz_3", {name:"xyz", version:"1.2.4.test", randomHeader: "random"});
+	assertTrue(b1.equals(b2));
+	assertFalse(b1.equals(b3));
+};
+
+BundleTest.prototype.testGetResource = function() {
+	var framework = new Framework();
+	var b1 = framework.installBundle("xyz", {name:"xyz", version:"1.2.3.test", exports: "/abc", resources: "/abc/def.jpg"});
+	var b2 = framework.installBundle("qrs", {name:"qrs", version:"1.2.3.test", imports: "/abc"});
+	assertNull(b1.getResource("mno"));
+	assertNotNull(b1.getResource("/abc/def.jpg"));
+	assertNull(b2.getResource("/abc/def.jpg"));
+	framework.resolve();
+	assertNotNull(b2.getResource("/abc/def.jpg"));
+	
+};
+
diff --git a/tests/org.eclipse.e4.languages.javascript.framework.test/scripts/FrameworkTest.js b/tests/org.eclipse.e4.languages.javascript.framework.test/scripts/FrameworkTest.js
new file mode 100644
index 0000000..252015c
--- /dev/null
+++ b/tests/org.eclipse.e4.languages.javascript.framework.test/scripts/FrameworkTest.js
@@ -0,0 +1,286 @@
+var FrameworkTest = TestCase.create("FrameworkTest");
+
+FrameworkTest.prototype.testEmptyGetBundles = function() {
+	var framework = new Framework();
+	assertEquals(0, framework.getBundles().length);
+};
+
+FrameworkTest.prototype.getSetProperty = function() {
+	var framework = new Framework();
+	assertUndefined(framework.getProperty("test"));
+	framework.setProperty("test", "value");
+	assertEquals("test", framework.getProperty("test"));
+	framework.setProperty("test");
+	assertUndefined(framework.getProperty("test"));
+};
+
+FrameworkTest.prototype.testNullLocationInstallBundle = function() {
+	var framework = new Framework();
+	try {
+		framework.installBundle(null);
+	} catch (e) {
+		return;
+	}
+	fail();
+};
+
+FrameworkTest.prototype.testSimpleInstallBundle = function() {
+	var framework = new Framework();
+	var b = framework.installBundle("xyz", {name:"xyz"});
+	assertEquals(1, framework.getBundles().length);
+	assertEquals(Bundle.INSTALLED, b.getState());
+};
+
+
+FrameworkTest.prototype.testEmptyRefresh = function() {
+	var framework = new Framework();
+	framework.refresh();
+};
+
+FrameworkTest.prototype.testSimpleRefresh = function() {
+	var framework = new Framework();
+	var b = framework.installBundle("xyz", {name:"xyz"});
+	assertEquals(1, framework.getBundles().length);
+	assertEquals(Bundle.INSTALLED, b.getState());
+	b.uninstall();
+	assertEquals(Bundle.UNINSTALLED, b.getState());
+	assertEquals(1, framework.getBundles().length);	
+	framework.refresh();
+	assertEquals(0, framework.getBundles().length);	
+};
+
+
+FrameworkTest.prototype.testEmptyResolve = function() {
+	var framework = new Framework();
+	framework.resolve();
+};
+
+FrameworkTest.prototype.testSimpleResolve = function() {
+	var framework = new Framework();
+	var b = framework.installBundle("xyz", {name:"xyz"});
+	assertEquals(1, framework.getBundles().length);
+	assertEquals(Bundle.INSTALLED, b.getState());
+	framework.resolve();
+	assertEquals(Bundle.RESOLVED, b.getState());
+};
+
+FrameworkTest.prototype.testResolveNonSingleton = function() {
+	var framework = new Framework();
+	var a = framework.installBundle("cde", {name:"cde", version:"1"});
+	var b = framework.installBundle("cde2", {name:"cde", version:"2"});
+	assertEquals(2, framework.getBundles().length);
+	assertEquals(Bundle.INSTALLED, a.getState());
+	assertEquals(Bundle.INSTALLED, b.getState());
+	framework.resolve();
+	assertTrue(Bundle.RESOLVED == a.getState());
+	assertTrue(Bundle.RESOLVED == b.getState());
+};
+
+FrameworkTest.prototype.testResolveSingletonFail = function() {
+	var framework = new Framework();
+	var a = framework.installBundle("cde", {name:"cde;singleton:=true", version:"1"});
+	var b = framework.installBundle("cde2", {name:"cde;singleton:=true", version:"2"});
+	assertEquals(2, framework.getBundles().length);
+	assertEquals(Bundle.INSTALLED, a.getState());
+	assertEquals(Bundle.INSTALLED, b.getState());
+	framework.resolve();
+	assertTrue(Bundle.RESOLVED == a.getState());
+	assertFalse(Bundle.RESOLVED == b.getState());
+};
+
+
+FrameworkTest.prototype.testResolveImportsFail = function() {
+	var framework = new Framework();
+	var b = framework.installBundle("xyz", {name:"xyz", imports:"abc"});
+	assertEquals(1, framework.getBundles().length);
+	assertEquals(Bundle.INSTALLED, b.getState());
+	framework.resolve();
+	assertFalse(Bundle.RESOLVED == b.getState());
+};
+
+FrameworkTest.prototype.testResolveOptionalImports = function() {
+	var framework = new Framework();
+	var b = framework.installBundle("xyz", {name:"xyz", imports:"abc;resolution:=optional"});
+	assertEquals(1, framework.getBundles().length);
+	assertEquals(Bundle.INSTALLED, b.getState());
+	framework.resolve();
+	assertTrue(Bundle.RESOLVED == b.getState());
+};
+
+FrameworkTest.prototype.testResolveImportsSuccess = function() {
+	var framework = new Framework();
+	var a = framework.installBundle("cde", {name:"cde", exports:"abc", script:"var abc = {hi:7};"});
+	var b = framework.installBundle("xyz", {name:"xyz", imports:"abc"});
+	assertEquals(2, framework.getBundles().length);
+	assertEquals(Bundle.INSTALLED, a.getState());
+	assertEquals(Bundle.INSTALLED, b.getState());
+	framework.resolve();
+	assertTrue(Bundle.RESOLVED == a.getState());
+	assertTrue(Bundle.RESOLVED == b.getState());
+};
+
+FrameworkTest.prototype.testResolveVersionedImportsSuccess = function() {
+	var framework = new Framework();
+	var a = framework.installBundle("cde", {name:"cde", exports:"abc;version=1.2", script:"var abc = {hi:7};"});
+	var b = framework.installBundle("xyz", {name:"xyz", imports:"abc;version=1.2"});
+	assertEquals(2, framework.getBundles().length);
+	assertEquals(Bundle.INSTALLED, a.getState());
+	assertEquals(Bundle.INSTALLED, b.getState());
+	framework.resolve();
+	assertTrue(Bundle.RESOLVED == a.getState());
+	assertTrue(Bundle.RESOLVED == b.getState());
+};
+
+FrameworkTest.prototype.testResolveVersionedImportsFail = function() {
+	var framework = new Framework();
+	var a = framework.installBundle("cde", {name:"cde", exports:"abc;version=1.1", script:"var abc = {hi:7};"});
+	var b = framework.installBundle("xyz", {name:"xyz", imports:"abc;version=1.2"});
+	assertEquals(2, framework.getBundles().length);
+	assertEquals(Bundle.INSTALLED, a.getState());
+	assertEquals(Bundle.INSTALLED, b.getState());
+	framework.resolve();
+	assertTrue(Bundle.RESOLVED == a.getState());
+	assertFalse(Bundle.RESOLVED == b.getState());
+};
+
+
+FrameworkTest.prototype.testResolveResourceImportsSuccess = function() {
+	var framework = new Framework();
+	var a = framework.installBundle("cde", {name:"cde", exports:"/abc/def"});
+	var b = framework.installBundle("xyz", {name:"xyz", imports:"/abc/def"});
+	assertEquals(2, framework.getBundles().length);
+	assertEquals(Bundle.INSTALLED, a.getState());
+	assertEquals(Bundle.INSTALLED, b.getState());
+	framework.resolve();
+	assertTrue(Bundle.RESOLVED == a.getState());
+	assertTrue(Bundle.RESOLVED == b.getState());
+};
+
+
+FrameworkTest.prototype.testResolveImportsFailAfterUninstall = function() {
+	var framework = new Framework();
+	var a = framework.installBundle("cde", {name:"cde", exports:"abc", script:"var abc = {hi:7};"});
+	var b = framework.installBundle("xyz", {name:"xyz", imports:"abc"});
+	framework.resolve();
+	assertTrue(Bundle.RESOLVED == a.getState());
+	assertTrue(Bundle.RESOLVED == b.getState());
+	a.uninstall();
+	framework.refresh();
+	assertFalse(Bundle.RESOLVED == b.getState());
+};
+
+FrameworkTest.prototype.testResolveLikeFunction = function() {
+	var load = new Function("", "var abc = {hi:7};\n\n return {abc:abc};");
+	var x= load.apply({}, []);
+	assertEquals(7, x.abc.hi);
+};
+	
+FrameworkTest.prototype.testResolveImportsLoad = function() {	
+	var framework = new Framework();
+	var a = framework.installBundle("cde", {name:"cde", exports:"abc", script:"var abc = {hi:7};"});
+	framework.resolve();
+	assertEquals(7, a._scope.abc.hi);
+	assertEquals(7, a.load("abc").hi);
+	var b = framework.installBundle("xyz", {name:"xyz", imports:"abc", exports:"def", script:"var def = abc;"});
+	framework.resolve();
+	assertTrue(Bundle.RESOLVED == a.getState());
+	assertTrue(Bundle.RESOLVED == b.getState());
+	assertEquals(7, b.load("def").hi);
+};
+
+FrameworkTest.prototype.testResolveMultipleImportsLoad = function() {	
+	var framework = new Framework();
+	var a = framework.installBundle("cde", {name:"cde", exports:"abc,xyz", script:"var abc = {hi:7};\nvar xyz = {bye:9};"});
+	framework.resolve();
+	assertEquals(7, a._scope.abc.hi);
+	assertEquals(7, a.load("abc").hi);
+	assertEquals(9, a.load("xyz").bye);
+	var b = framework.installBundle("xyz", {name:"xyz", imports:"abc,xyz", exports:"def,ghi", script:"var def = abc;\nvar ghi = xyz;"});
+	framework.resolve();
+	assertTrue(Bundle.RESOLVED == a.getState());
+	assertTrue(Bundle.RESOLVED == b.getState());
+	assertEquals(7, b.load("def").hi);
+	assertEquals(9, b.load("ghi").bye);
+};
+
+FrameworkTest.prototype.testResolveRequiresFail = function() {
+	var framework = new Framework();
+	var b = framework.installBundle("xyz", {name:"xyz", requires:"abc"});
+	assertEquals(1, framework.getBundles().length);
+	assertEquals(Bundle.INSTALLED, b.getState());
+	framework.resolve();
+	assertFalse(Bundle.RESOLVED == b.getState());
+};
+
+FrameworkTest.prototype.testResolveOptionalRequires = function() {
+	var framework = new Framework();
+	var b = framework.installBundle("xyz", {name:"xyz", requires:"abc;resolution:=optional"});
+	assertEquals(1, framework.getBundles().length);
+	assertEquals(Bundle.INSTALLED, b.getState());
+	framework.resolve();
+	assertTrue(Bundle.RESOLVED == b.getState());
+};
+
+
+FrameworkTest.prototype.testResolveRequiresFailAfterUninstall = function() {
+	var framework = new Framework();
+	var a = framework.installBundle("abc", {name:"abc"});
+	var b = framework.installBundle("xyz", {name:"xyz", requires:"abc"});
+	framework.resolve();
+	assertTrue(Bundle.RESOLVED == a.getState());
+	assertTrue(Bundle.RESOLVED == b.getState());
+	a.uninstall();
+	framework.refresh();
+	assertFalse(Bundle.RESOLVED == b.getState());
+};
+
+FrameworkTest.prototype.testResolveRequiresSuccess = function() {
+	var framework = new Framework();
+	var a = framework.installBundle("abc", {name:"abc"});
+	var b = framework.installBundle("xyz", {name:"xyz", requires:"abc"});
+	assertEquals(2, framework.getBundles().length);
+	assertEquals(Bundle.INSTALLED, a.getState());
+	assertEquals(Bundle.INSTALLED, b.getState());
+	framework.resolve();
+	assertTrue(Bundle.RESOLVED == a.getState());
+	assertTrue(Bundle.RESOLVED == b.getState());
+};
+
+FrameworkTest.prototype.testResolveVersionedRequiresSuccess = function() {
+	var framework = new Framework();
+	var a = framework.installBundle("abc", {name:"abc", version:"1.2"});
+	var b = framework.installBundle("xyz", {name:"xyz", requires:"abc;bundle-version=1.2"});
+	assertEquals(2, framework.getBundles().length);
+	assertEquals(Bundle.INSTALLED, a.getState());
+	assertEquals(Bundle.INSTALLED, b.getState());
+	framework.resolve();
+	assertTrue(Bundle.RESOLVED == a.getState());
+	assertTrue(Bundle.RESOLVED == b.getState());
+};
+
+FrameworkTest.prototype.testResolveVersionedRequiresFail = function() {
+	var framework = new Framework();
+	var a = framework.installBundle("abc", {name:"abc", version:"1.1"});
+	var b = framework.installBundle("xyz", {name:"xyz", requires:"abc;bundle-version=1.2"});
+	assertEquals(2, framework.getBundles().length);
+	assertEquals(Bundle.INSTALLED, a.getState());
+	assertEquals(Bundle.INSTALLED, b.getState());
+	framework.resolve();
+	assertTrue(Bundle.RESOLVED == a.getState());
+	assertFalse(Bundle.RESOLVED == b.getState());
+};
+
+
+FrameworkTest.prototype.testEmptyShutdown = function() {
+	var framework = new Framework();
+	framework.shutdown();
+};
+FrameworkTest.prototype.testEmptyShutdown = function() {
+	var framework = new Framework();
+	var b = framework.installBundle("xyz", {name:"xyz"});
+	assertEquals(1, framework.getBundles().length);
+	assertEquals(Bundle.INSTALLED, b.getState());
+	framework.shutdown();
+	assertEquals(0, framework.getBundles().length);	
+};
+
diff --git a/tests/org.eclipse.e4.languages.javascript.framework.test/scripts/VersionRangeTest.js b/tests/org.eclipse.e4.languages.javascript.framework.test/scripts/VersionRangeTest.js
new file mode 100644
index 0000000..1f18a6a
--- /dev/null
+++ b/tests/org.eclipse.e4.languages.javascript.framework.test/scripts/VersionRangeTest.js
@@ -0,0 +1,53 @@
+var VersionRangeTest = TestCase.create("VersionRangeTest");
+
+VersionRangeTest.prototype.testBasicVersionRange = function() {
+	var versionRange = new VersionRange(Version.EMPTY_VERSION, true, Version.MAX_VERSION, true);
+	assertEquals(Version.EMPTY_VERSION, versionRange.getMinimum());
+	assertTrue(versionRange.getIncludeMinimum());
+	assertEquals(Version.MAX_VERSION, versionRange.getMaximum());
+	assertTrue(versionRange.getIncludeMaximum());
+};
+
+VersionRangeTest.prototype.testEmptyVersionRange = function() {
+	var versionRange = new VersionRange(null, true, null, true);
+	assertEquals(VersionRange.EMPTY_RANGE, versionRange);
+};
+
+VersionRangeTest.prototype.testParseBasicVersionRange = function() {
+	var versionRange = VersionRange.parseVersionRange("0.0.0");
+	assertEquals(Version.EMPTY_VERSION, versionRange.getMinimum());
+	assertTrue(versionRange.getIncludeMinimum());
+	assertEquals(Version.MAX_VERSION, versionRange.getMaximum());
+	assertTrue(versionRange.getIncludeMaximum());
+};
+
+VersionRangeTest.prototype.testIncludeMinMax = function() {
+	var versionRange1 = new VersionRange(null, true, null, false);
+	assertTrue(versionRange1.getIncludeMinimum());
+	assertFalse(versionRange1.getIncludeMaximum());
+	
+	var versionRange2 = new VersionRange(null, false, null, true);
+	assertFalse(versionRange2.getIncludeMinimum());
+	assertTrue(versionRange2.getIncludeMaximum());
+};
+
+VersionRangeTest.prototype.testIsIncluded = function() {
+	var versionRange1 = new VersionRange(null, true, null, false);
+	assertTrue(versionRange1.isIncluded(Version.EMPTY_VERSION));
+	assertFalse(versionRange1.isIncluded(Version.MAX_VERSION));
+	
+	var versionRange2 = new VersionRange(null, false, null, true);
+	assertFalse(versionRange2.isIncluded(Version.EMPTY_VERSION));
+	assertTrue(versionRange2.isIncluded(Version.MAX_VERSION));
+};
+
+VersionRangeTest.prototype.testToString = function() {
+	var versionRange1 = new VersionRange(new Version(1,0,0), true, null, true);
+	assertEquals("1.0.0", versionRange1.toString());
+
+	var versionRange2 = new VersionRange(new Version(1,0,0), true, null, false);
+	assertEquals("[1.0.0," + Version.MAX_VERSION.toString() + ")", versionRange2.toString());
+	
+	var versionRange2 = new VersionRange(new Version(1,0,0), false, null, true);
+	assertEquals("(1.0.0," + Version.MAX_VERSION.toString() + "]", versionRange2.toString());
+};
diff --git a/tests/org.eclipse.e4.languages.javascript.framework.test/scripts/VersionTest.js b/tests/org.eclipse.e4.languages.javascript.framework.test/scripts/VersionTest.js
new file mode 100644
index 0000000..77a0971
--- /dev/null
+++ b/tests/org.eclipse.e4.languages.javascript.framework.test/scripts/VersionTest.js
@@ -0,0 +1,86 @@
+var VersionTest = TestCase.create("VersionTest");
+
+VersionTest.prototype.testBasicVersion = function() {
+	var version = new Version(1, 0, 0);
+	assertEquals(1, version.getMajor());
+	assertEquals(0, version.getMinor());
+	assertEquals(0, version.getMicro());
+	assertEquals("", version.getQualifier());
+	assertEquals("1.0.0", version.toString());
+};
+VersionTest.prototype.testQualifiedBasicVersion = function() {
+	var version = new Version(1, 0, 0, "qualifier");
+	assertEquals(1, version.getMajor());
+	assertEquals(0, version.getMinor());
+	assertEquals(0, version.getMicro());
+	assertEquals("qualifier", version.getQualifier());
+	assertEquals("1.0.0.qualifier", version.toString());
+};
+VersionTest.prototype.testEmptyVersion = function() {
+	var version = new Version(0, 0, 0);
+	assertEquals(Version.EMPTY_VERSION, version);
+	assertEquals("0.0.0", version.toString());
+};
+VersionTest.prototype.testMaxVersion = function() {
+	var version = new Version(Number.MAX_VALUE, Number.MAX_VALUE, Number.MAX_VALUE, "extra");
+	assertEquals(Version.MAX_VERSION, version);
+};
+
+VersionTest.prototype.testParseEmptyVersion = function() {
+	var version = Version.parseVersion("");
+	assertEquals(Version.EMPTY_VERSION, version);
+};
+VersionTest.prototype.testParseBasicVersion = function() {
+	var version = Version.parseVersion("1.0.0");
+	assertEquals(1, version.getMajor());
+	assertEquals(0, version.getMinor());
+	assertEquals(0, version.getMicro());
+	assertEquals("", version.getQualifier());
+	assertEquals("1.0.0", version.toString());
+};
+VersionTest.prototype.testParseQualifiedBasicVersion = function() {
+	var version = Version.parseVersion("1.0.0.qualifier");
+	assertEquals(1, version.getMajor());
+	assertEquals(0, version.getMinor());
+	assertEquals(0, version.getMicro());
+	assertEquals("qualifier", version.getQualifier());
+	assertEquals("1.0.0.qualifier", version.toString());
+};
+VersionTest.prototype.testCompareVersion = function() {
+	var version = Version.parseVersion("1.0.0");
+	assertTrue(0 === version.compareTo(version));
+	assertTrue(0 < version.compareTo(Version.EMPTY_VERSION));
+	assertTrue(0 > Version.EMPTY_VERSION.compareTo(version));
+};
+VersionTest.prototype.testBadMajor = function() {
+	try {
+		var version = new Version("x", 0, 0);
+	} catch (e) {
+		return;
+	}
+	fail();
+};
+VersionTest.prototype.testBadMinor = function() {
+	try {
+		var version = new Version(0, "x", 0);
+	} catch (e) {
+		return;
+	}
+	fail();
+};
+VersionTest.prototype.testBadMicro = function() {
+	try {
+		var version = new Version(0, 0, "x");
+	} catch (e) {
+		return;
+	}
+	fail();
+}
+VersionTest.prototype.testBadQualifier = function() {
+	try {
+		var version = new Version(0, 0, 0, 7);
+	} catch (e) {
+		return;
+	}
+	fail();
+};
diff --git a/tests/org.eclipse.e4.languages.javascript.framework.test/src/org/eclipse/e4/languages/javascript/framework/test/Activator.java b/tests/org.eclipse.e4.languages.javascript.framework.test/src/org/eclipse/e4/languages/javascript/framework/test/Activator.java
new file mode 100644
index 0000000..6e9229a
--- /dev/null
+++ b/tests/org.eclipse.e4.languages.javascript.framework.test/src/org/eclipse/e4/languages/javascript/framework/test/Activator.java
@@ -0,0 +1,56 @@
+package org.eclipse.e4.languages.javascript.framework.test;
+
+import java.util.Collection;
+import java.util.Collections;
+
+import org.osgi.framework.Bundle;
+import org.osgi.framework.BundleActivator;
+import org.osgi.framework.BundleContext;
+import org.osgi.service.packageadmin.PackageAdmin;
+
+public class Activator implements BundleActivator {
+
+	private static BundleContext context;
+	private static PackageAdmin packageAdmin;
+	
+	static BundleContext getContext() {
+		return context;
+	}
+
+
+
+	public void start(BundleContext bundleContext) throws Exception {
+		context = bundleContext;
+		packageAdmin = (PackageAdmin) context.getService(context.getServiceReference(PackageAdmin.class.getName()));
+	}
+
+	public void stop(BundleContext bundleContext) throws Exception {
+		packageAdmin = null;
+		context = null;
+	}
+
+	public static synchronized Bundle getBundle(String symbolicName) {
+		if (packageAdmin == null)
+			throw new IllegalStateException("Not started"); //$NON-NLS-1$
+
+		Bundle[] bundles = packageAdmin.getBundles(symbolicName, null);
+		if (bundles == null)
+			return null;
+		//Return the first bundle that is not installed or uninstalled
+		for (int i = 0; i < bundles.length; i++) {
+			if ((bundles[i].getState() & (Bundle.INSTALLED | Bundle.UNINSTALLED)) == 0) {
+				return bundles[i];
+			}
+		}
+		return null;
+	}
+
+
+
+	public static Collection getFrameworkScripts() {
+		Bundle frameworkBundle = Activator.getBundle("org.eclipse.e4.languages.javascript.framework");
+		return Collections.list(frameworkBundle.findEntries("/scripts", "*.js", false));
+	}
+
+
+}
diff --git a/tests/org.eclipse.e4.languages.javascript.framework.test/src/org/eclipse/e4/languages/javascript/framework/test/AllTests.java b/tests/org.eclipse.e4.languages.javascript.framework.test/src/org/eclipse/e4/languages/javascript/framework/test/AllTests.java
new file mode 100644
index 0000000..ec6ca5d
--- /dev/null
+++ b/tests/org.eclipse.e4.languages.javascript.framework.test/src/org/eclipse/e4/languages/javascript/framework/test/AllTests.java
@@ -0,0 +1,48 @@
+/*******************************************************************************
+ * Copyright (c) 2009 IBM Corporation and others 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: IBM Corporation - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.e4.languages.javascript.framework.test;
+
+import java.io.IOException;
+import java.net.URL;
+import java.util.ArrayList;
+import java.util.ListIterator;
+
+import junit.framework.Test;
+import junit.framework.TestSuite;
+
+import org.eclipse.core.runtime.FileLocator;
+import org.eclipse.e4.languages.javascript.junit.JavaScriptTestSuite;
+
+public class AllTests extends TestSuite {
+
+	public static Test suite() throws IOException {
+		return new AllTests();
+	}
+
+	public AllTests() throws IOException {
+		super(AllTests.class.getName());
+		addTest(createFrameworkTest("BundleTest"));
+		addTest(createFrameworkTest("FrameworkTest"));
+		addTest(createFrameworkTest("VersionTest"));
+		addTest(createFrameworkTest("VersionRangeTest"));
+	}
+	
+	private Test createFrameworkTest(String testCaseName) throws IOException {
+		return createFrameworkTest(testCaseName, Activator.getContext().getBundle().getEntry("/scripts/"+testCaseName+".js"));
+	}
+
+	private Test createFrameworkTest(String testCaseName, URL entry) throws IOException {
+		ArrayList scripts = new ArrayList(Activator.getFrameworkScripts());
+		scripts.add(entry);
+		for (ListIterator iterator = scripts.listIterator(); iterator.hasNext();) {
+			iterator.set(FileLocator.toFileURL((URL) iterator.next()));
+		}
+		return new JavaScriptTestSuite(testCaseName, scripts);
+	}
+}
