diff --git a/ikvm.build b/ikvm.build
index 0b1b1c81..66ac456a 100644
--- a/ikvm.build
+++ b/ikvm.build
@@ -40,8 +40,10 @@
+
+
diff --git a/openjdk/dependencies.txt b/openjdk/dependencies.txt
new file mode 100644
index 00000000..208cefa3
--- /dev/null
+++ b/openjdk/dependencies.txt
@@ -0,0 +1,108 @@
+# This file declares the dependencies of the OpenJDK assemblies.
+# It exists to prevent accidentally introducing new dependencies.
+#
+# Note that mscorlib, System, IKVM.Runtime and IKVM.OpenJDK.Core are not very interesting,
+# so these dependencies are ignored by the dependency checker.
+
+IKVM.OpenJDK.Core
+->System.Core
+->IKVM.OpenJDK.Util
+->IKVM.OpenJDK.Security
+->IKVM.OpenJDK.Text
+->IKVM.OpenJDK.XML.API
+
+IKVM.OpenJDK.Corba
+->IKVM.OpenJDK.Misc
+->IKVM.OpenJDK.Util
+->IKVM.OpenJDK.SwingAWT
+->IKVM.OpenJDK.Text
+
+IKVM.OpenJDK.XML.API
+
+IKVM.OpenJDK.XML.Parse
+->IKVM.OpenJDK.XML.API
+->IKVM.OpenJDK.Text
+->IKVM.OpenJDK.Misc
+
+IKVM.OpenJDK.XML.Transform
+->IKVM.OpenJDK.Util
+->IKVM.OpenJDK.XML.Parse
+->IKVM.OpenJDK.XML.API
+->IKVM.OpenJDK.Text
+
+IKVM.OpenJDK.XML.Bind
+->IKVM.OpenJDK.Misc
+->IKVM.OpenJDK.XML.API
+->IKVM.OpenJDK.Util
+->IKVM.OpenJDK.Text
+->IKVM.OpenJDK.SwingAWT
+->IKVM.OpenJDK.XML.RelaxNG
+
+IKVM.OpenJDK.XML.WebServices
+->IKVM.OpenJDK.XML.API
+->IKVM.OpenJDK.Text
+->IKVM.OpenJDK.Util
+->IKVM.OpenJDK.Misc
+->IKVM.OpenJDK.SwingAWT
+->IKVM.OpenJDK.XML.Parse
+->IKVM.OpenJDK.XML.Bind
+->IKVM.OpenJDK.Security
+
+IKVM.OpenJDK.XML.RelaxNG
+->IKVM.OpenJDK.XML.API
+->IKVM.OpenJDK.Text
+
+IKVM.OpenJDK.XML.Crypto
+->IKVM.OpenJDK.Util
+->IKVM.OpenJDK.XML.API
+->IKVM.OpenJDK.Security
+->IKVM.OpenJDK.Text
+->IKVM.OpenJDK.XML.Parse
+
+IKVM.OpenJDK.SwingAWT
+->System.Drawing
+->IKVM.OpenJDK.Misc
+->IKVM.OpenJDK.Util
+->IKVM.OpenJDK.Text
+->IKVM.OpenJDK.XML.API
+->IKVM.OpenJDK.Charsets
+
+IKVM.OpenJDK.Charsets
+
+IKVM.OpenJDK.Util
+->IKVM.OpenJDK.Security
+->IKVM.OpenJDK.Misc
+->IKVM.OpenJDK.Text
+->IKVM.OpenJDK.XML.API
+
+IKVM.OpenJDK.Text
+->IKVM.OpenJDK.Util
+->IKVM.OpenJDK.SwingAWT
+
+IKVM.OpenJDK.Security
+->IKVM.OpenJDK.Misc
+->IKVM.OpenJDK.Text
+->IKVM.OpenJDK.SwingAWT
+->IKVM.OpenJDK.Util
+
+IKVM.OpenJDK.Management
+->IKVM.OpenJDK.Misc
+->IKVM.OpenJDK.Security
+->IKVM.OpenJDK.Corba
+->IKVM.OpenJDK.Util
+
+IKVM.OpenJDK.Misc
+->System.Drawing
+->IKVM.OpenJDK.SwingAWT
+->IKVM.OpenJDK.XML.API
+->IKVM.OpenJDK.Util
+->IKVM.OpenJDK.Corba
+->IKVM.OpenJDK.Text
+->IKVM.OpenJDK.Security
+
+IKVM.OpenJDK.Jdbc
+->System.Data
+->IKVM.OpenJDK.Text
+->IKVM.OpenJDK.Misc
+->IKVM.OpenJDK.XML.API
+->IKVM.OpenJDK.Util
diff --git a/openjdk/openjdk.build b/openjdk/openjdk.build
index f5ef4160..eebc5c80 100644
--- a/openjdk/openjdk.build
+++ b/openjdk/openjdk.build
@@ -142,6 +142,8 @@
+
+
diff --git a/tools/depcheck.cs b/tools/depcheck.cs
new file mode 100644
index 00000000..ee86e43a
--- /dev/null
+++ b/tools/depcheck.cs
@@ -0,0 +1,90 @@
+/*
+ Copyright (C) 2009 Jeroen Frijters
+
+ This software is provided 'as-is', without any express or implied
+ warranty. In no event will the authors be held liable for any damages
+ arising from the use of this software.
+
+ Permission is granted to anyone to use this software for any purpose,
+ including commercial applications, and to alter it and redistribute it
+ freely, subject to the following restrictions:
+
+ 1. The origin of this software must not be misrepresented; you must not
+ claim that you wrote the original software. If you use this software
+ in a product, an acknowledgment in the product documentation would be
+ appreciated but is not required.
+ 2. Altered source versions must be plainly marked as such, and must not be
+ misrepresented as being the original software.
+ 3. This notice may not be removed or altered from any source distribution.
+
+ Jeroen Frijters
+ jeroen@frijters.net
+
+*/
+
+using System;
+using System.IO;
+using System.Collections.Generic;
+using System.Reflection;
+
+class DependencyChecker
+{
+ static int Main(string[] args)
+ {
+ Dictionary> deps = new Dictionary>();
+ string dep = null;
+ foreach (string line in File.ReadAllLines(args[1]))
+ {
+ if (line.Trim().Length == 0 || line.StartsWith("#"))
+ {
+ // comment
+ }
+ else if (line.StartsWith("->"))
+ {
+ deps[dep].Add(line.Substring(2));
+ }
+ else
+ {
+ dep = line;
+ deps.Add(dep, new List());
+ }
+ }
+ List whitelist = new List(new string[] { "mscorlib", "System", "IKVM.Runtime", "IKVM.OpenJDK.Core" });
+ bool fail = false;
+ foreach (string line in File.ReadAllLines(args[0]))
+ {
+ if (line.Contains("-out:"))
+ {
+ string file = line.Trim().Substring(5);
+ Assembly asm = Assembly.ReflectionOnlyLoadFrom(Path.Combine(Path.GetDirectoryName(args[0]), file));
+ if (!deps.ContainsKey(asm.GetName().Name))
+ {
+ fail = true;
+ Console.WriteLine(asm.GetName().Name);
+ foreach (AssemblyName asmdep in asm.GetReferencedAssemblies())
+ {
+ if (!whitelist.Contains(asmdep.Name))
+ {
+ Console.WriteLine("->{0}", asmdep.Name);
+ }
+ }
+ }
+ else
+ {
+ foreach (AssemblyName asmdep in asm.GetReferencedAssemblies())
+ {
+ if (!whitelist.Contains(asmdep.Name))
+ {
+ if (!deps[asm.GetName().Name].Contains(asmdep.Name))
+ {
+ fail = true;
+ Console.WriteLine("Error: Assembly {0} has an undeclared dependency on {1}", asm.GetName().Name, asmdep.Name);
+ }
+ }
+ }
+ }
+ }
+ }
+ return fail ? 1 : 0;
+ }
+}
diff --git a/tools/tools.build b/tools/tools.build
index df76059a..aa4d56ab 100644
--- a/tools/tools.build
+++ b/tools/tools.build
@@ -13,6 +13,12 @@
+
+
+
+
+
+