diff --git a/BUILDING.txt b/BUILDING.txt
deleted file mode 100644
index 8d6ee82..0000000
--- a/BUILDING.txt
+++ /dev/null
@@ -1,19 +0,0 @@
-                    **********************
-********************* Building Hamcrest *********************
-                    **********************
-
---[ Build requirements ]-------------------------------------
-
-* JDK 1.7
-
-* Gradle
-
---[ Building from the command line ]-------------------------
-
-Execute the default ant target:
-  ./gradlew clean build javadoc
-
-This will do a full clean build, run all tests and (if
-successful) package up a distribution. The resulting builds
-reside in the 'build' directory.
-
diff --git a/CHANGES.txt b/CHANGES.txt
deleted file mode 100644
index f0a392b..0000000
--- a/CHANGES.txt
+++ /dev/null
@@ -1,135 +0,0 @@
-== Version 2.0.0.0 ==
-
-A new beginning...
-
-* Upgraded to Java 7
-
-* Build with Gradle
-
-* Publish a single jar java-hamcrest-x.x.x.x.jar
-
-* Removed deprecated methods from previous release
-
-* Improve mismatch description of hasItem/hasItems
-
-* General improvements to mismatch descriptions
-
-* Several JavaDoc improvements and corrections
-
-* Fix gh issue #69 - Iterable contains in order is null-safe
-
-* Fix gh issue #59 - added equalToObject() (i.e. unchecked) method
-
-* Fix gh issue #25 - arrayContaining(null, null) cause NullPointerException
-
-* Fix gh issue #36 - string matching on regular expressions
-
-* Fix gh issue #8 - isCloseTo() shows wrong delta in mismatch description
-
-* Fix issue 131 - Implement IsEmptyMap, IsMapWithSize
-
-* Fix issue 155 - Deprecated several matcher factory methods of the for "isXyz"
-
-* Fix issue 187 - IsArray.describeMismatchSafely() should use Matcher.describeMismatch
-
-* Fix issue 155 - Add Matcher implementation for files
-
-* Fix issue 59 - add untyped version of equalTo, named equalToObject
-
-* Fix issue 69 - fix NPE in IsIterableContainingInOrder
-
-* Fix issue 75 - address doclint errors reported in JDK 1.8
-
-== Version 1.3: Released July 09 2012 ==
-
-* Introduce Condition class to ease the implementation of multi-step matches
-
-* Upgrade qdox (included in the generator) to the latest stable version
-
-* Correct inadvertent deprecation of the Is.isA factory method
-
-* Fix issue 179 - AllOf does not output mismatch description
-
-* Fix issue 177 - Introduced closeTo matcher for BigDecimals
-
-* Fix issue 152 - Factory classes missing from matchers.xml
-
-* Fix issue 144 - OrderingComparison doesn't describe mismatch of comparables that return values other than (-1,0,1)
-
-* Fix issue 134 - DescribedAs does not delegate describeMismatch
-
-* Fix issue 106 - deprecation warning when writing custom matchers
-
-* Fix issue 101 - Added theInstance alias for sameInstance factory method
-
-== Version 1.3 RC2: Released October 22 2010 ==
-
-* Added FeatureMatcher
-
-* distinguish between instanceOf() and any()
-
-== Version 1.2: Released May 16 2009 ==
-
-* Added mismatch reporting
-
-* Added WithSamePropertyValuesAs matcher
-
-* Moved any() from IsAnything to IsInstanceOf. It now checks the type of the matched object
-
-* Moved MatcherAssert from integration to core
-
-* Tightened up generics.  
-
-* Added IsMapContainingKey and IsMapContainingValue matchers to resolve a 
-  generics bug in hasKey and hasValue static factories previously declared
-  in IsMapContaining (ngd)
-
-* Added IsCollectionOnlyContaining and IsArrayOnlyContaining which matches 
-  collections (and arrays) where all match a given matcher. E.g onlyContains(3,4,5) 
-  or onlyContains(lessThan(9))
-
-* text module moved to separate project, hamcrest-text-patterns
-
-* added more colection matchers: xContainingInAnyOrder, xContainingInOrder, xWithSize
-
-* new text Matcher: IsEmptyString
-
-* hamcrest generator uses method return type 
-
-== Version 1.1: Released Jun 30 2007 ==
-
-* Hamcrest Generator now includes JavaDoc and parameter names in generated code
-  by using QDox to parse the source code.
-
-* Created hamcrest-core.jar (and removed hamcrest-api.jar).
-  Moved core set of matchers (and, eq, not, etc)
-  to this package to make it more practical for external libraries
-  to embed Hamcrest.
-
-* Created CoreMatchers (static import sugar) in hamcrest-core.jar.
-
-* StringBuilder can use any Appendable (not just StringBuffer).
-
-* Added sensible toString() method to BaseMatcher.
-
-* Created StringDescription.asString() alias (because toString() caused issues
-  with static imports).
-
-* Relaxed isInstanceOf() matcher generic type so it can be used on any kind of
-  object. e.g. assertThat(someUnknownObject, isInstanceOf(String.class));
-
-* Added any(Class<T>), null(Class<T>) and notNull(Class<T>) matchers, which returns
-  Matcher<T>. Helpful when the compiler struggles with type inference.
-
-* Modified anyOf() and allOf() to accept mixed-types.
-
-* TypeSafeMatcher.matchesSafely() is now public.
-
-* Generator recognizes @Factory methods that return subclass of Matcher.
-  (Fix by David Saff)
-
-== Version 1.0: Released Dec 15 2006 ==
-
-Initial release.
-* Support for namespaces in HasXPath
-* Bug fix for matching empty elements with HasXPath
diff --git a/LICENSE.txt b/LICENSE.txt
index 71806dd..5ebe92c 100644
--- a/LICENSE.txt
+++ b/LICENSE.txt
@@ -1,6 +1,6 @@
 BSD License
 
-Copyright (c) 2000-20014 www.hamcrest.org
+Copyright (c) 2000-2006, www.hamcrest.org
 All rights reserved.
 
 Redistribution and use in source and binary forms, with or without
diff --git a/README.android b/README.android
new file mode 100644
index 0000000..a1bbfd2
--- /dev/null
+++ b/README.android
@@ -0,0 +1 @@
+unmodified source obtained from http://code.google.com/p/hamcrest/downloads/detail?name=hamcrest-core-1.1.jar&can=2&q=, 
diff --git a/README.md b/README.md
deleted file mode 100644
index c1e1e0f..0000000
--- a/README.md
+++ /dev/null
@@ -1,63 +0,0 @@
-![JavaHamcrest](http://hamcrest.org/images/logo.jpg)
-
-[![Build Status](https://travis-ci.org/hamcrest/JavaHamcrest.png?branch=master)](https://travis-ci.org/hamcrest/JavaHamcrest)
-
-Java Hamcrest
-=============
-Licensed under [BSD License][].
-
-What is Hamcrest?
------------------
-Hamcrest is a library of matchers, which can be combined in to create flexible expressions of intent in tests.
-They've also been used for other purposes.
-
-Downloads
----------
-You can obtain Hamcrest binaries from [maven central][], or from [google code downloads][].
-
-Extensions
-----------
-
-For Hamcrest extension projects see the [hamcrest extensions page][].
-
-Documentation
--------------
-Documentation can be found on the [Hamcrest site](http://hamcrest.org).
-
-Reporting Bugs/Issues
----------------------
-If you find an issue with Java Hamcrest, please report it via the 
-[GitHub issue tracker](https://github.com/hamcrest/JavaHamcrest/issues), 
-after first checking that it hasn't been raised already. 
-
-Source
-------
-To build, please read BUILDING.txt
-
-Acknowledgements
-----------------
-Developers:
-
-  * Joe Walnes
-  * Nat Pryce
-  * Steve Freeman
-
-Contributors:
-
-  * Robert Chatley
-  * Tom White
-  * Neil Dunn
-  * Dan North
-  * Magne Rasmussen
-  * David Saff
-  * Tom Denley
-
-Also, thanks to everyone who has worked on DynaMock, nMock, jMock, EasyMock and MiniMock! These libraries inspired Hamcrest.
-
-
-[logo]: https://raw.github.com/hamcrest/JavaHamcrest/master/doc/images/logo.jpg
-[website]: https://github.com/hamcrest/JavaHamcrest
-[BSD License]: http://opensource.org/licenses/BSD-3-Clause
-[Maven central]: http://search.maven.org/#search%7Cga%7C1%7Cg%3Aorg.hamcrest
-[hamcrest extensions page]: https://github.com/hamcrest/JavaHamcrest/wiki/Related-Projects
-[GitHub issue tracker]: https://github.com/hamcrest/JavaHamcrest/issues
diff --git a/README.version b/README.version
deleted file mode 100644
index 660cee5..0000000
--- a/README.version
+++ /dev/null
@@ -1,15 +0,0 @@
-URL: https://github.com/hamcrest/JavaHamcrest/archive/f540af9fd49f33cc07b3446a8895c7b51cbf0944.zip
-Version: f540af9fd49f33cc07b3446a8895c7b51cbf0944
-BugComponent: 40416
-
-Version f540af9fd49f33cc07b3446a8895c7b51cbf0944 was chosen because it is the
-point at which v2.0.0.0 and master diverge. There are only about 7 commits
-on v2.0.0.0 which are not on master but they do conflict with some changes in
-master. Those changes appear to be relatively minor and while it is not clear
-what the future holds for Hamcrest given that it has had no activity since June
-2016 it seems unnecessary to take those extra 7 commits given the potential for
-conflicts in future upgrades.
-
-Local Changes:
-    Remove hamcrest-library/src/main/java/org/hamcrest/beans/ as Android does not support java.beans.
-    
\ No newline at end of file
diff --git a/build.gradle b/build.gradle
index cd23be2..b169d73 100644
--- a/build.gradle
+++ b/build.gradle
@@ -1,116 +1,9 @@
-import static org.gradle.api.JavaVersion.VERSION_1_7
-
 apply plugin: 'java'
-apply plugin: 'maven'
-apply plugin: 'signing'
-
-sourceCompatibility = VERSION_1_7
-targetCompatibility = VERSION_1_7
-archivesBaseName = "java-hamcrest"
-
-group = "org.hamcrest"
-version = "2.0.0.0"
-
-
-repositories {
-    mavenCentral()
-}
-
-dependencies {
-    testCompile(group: 'junit', name: 'junit', version: '4.12') {
-        transitive = false
-    }
-}
 
 sourceSets {
     main {
         java {
-            srcDirs 'hamcrest-core/src/main/java', 'hamcrest-library/src/main/java'
-        }
-
-    }
-    test {
-        java {
-            srcDirs 'hamcrest-core/src/test/java', 'hamcrest-library/src/test/java'
-        }
-    }
-}
-
-jar {
-    manifest {
-        attributes 'Implementation-Title': 'hamcrest-all',
-                'Implementation-Vendor': 'hamcrest.org',
-                'Implementation-Version': version
-    }
-}
-
-task sourcesJar(type: Jar) {
-    classifier = 'sources'
-    from sourceSets.main.allSource
-}
-
-task javadocJar(type: Jar) {
-    classifier = 'javadoc'
-    from javadoc
-}
-
-artifacts {
-    archives sourcesJar, javadocJar
-}
-
-signing {
-    required { gradle.taskGraph.hasTask("uploadArchives") }
-    sign configurations.archives
-}
-
-uploadArchives {
-    if (hasProperty('ossrhUsername') && hasProperty('ossrhPassword')) {
-        repositories {
-            mavenDeployer {
-                beforeDeployment { MavenDeployment deployment -> signing.signPom(deployment) }
-
-                repository(url: "https://oss.sonatype.org/service/local/staging/deploy/maven2/") {
-                    authentication(userName: ossrhUsername, password: ossrhPassword)
-                }
-
-                snapshotRepository(url: "https://oss.sonatype.org/content/repositories/snapshots/") {
-                    authentication(userName: ossrhUsername, password: ossrhPassword)
-                }
-
-                pom.project {
-                    name 'Java Hamcrest'
-                    packaging 'jar'
-                    description 'Hamcrest matcher library for Java'
-                    url 'http://hamcrest.org/JavaHamcrest/'
-
-                    scm {
-                        connection 'git@github.com:hamcrest/JavaHamcrest.git'
-                        url 'https://github.com/hamcrest/JavaHamcrest'
-                    }
-
-                    licenses {
-                        license {
-                            name 'BSD Licence 3'
-                            url 'http://opensource.org/licenses/BSD-3-Clause'
-                        }
-                    }
-
-                    developers {
-                        developer {
-                            id 'joewalnes'
-                            name 'Joe Walnes'
-                        }
-                        developer {
-                            id 'npryce'
-                            name 'Nat Pryce'
-                        }
-                        developer {
-                            id 'sf105'
-                            name 'Steve Freeman'
-                        }
-                    }
-                }
-            }
+            srcDirs = ['src']
         }
     }
 }
diff --git a/build.xml.original b/build.xml.original
deleted file mode 100644
index 95662ee..0000000
--- a/build.xml.original
+++ /dev/null
@@ -1,289 +0,0 @@
-<project name="hamcrest" default="all">
-
-    <property name="version" value="SNAPSHOT" description="Version number to use in build files"/>
-    <property name="haltonfailure" value="true" description="Whether to halt the build if the tests fail"/>
-    <property name="debug" value="true" description="Whether to build with debug information"/>
-    <property name="javaversion" value="1.5" description="Java version to target"/>
-    <tstamp><format property="build.timestamp" pattern="yyyy-MM-dd HH:mm:ss" timezone="GMT"/></tstamp>
-    <taskdef name="junit" classname="org.apache.tools.ant.taskdefs.optional.junit.JUnitTask" classpath="lib/integration/ant-junit-1.8.4.jar"/>
-
-
-    <target name="all" depends="clean, bigjar, javadoc" description="Performs clean build, runs tests and packages for distribution"/>
-
-    <target name="clean" description="Clean up all built files">
-        <delete dir="build"/>
-    </target>
-
-    <target name="api" description="Build Hamcrest APIs">
-        <path id="cp-hamcrest-api-main" path=""/>
-        <path id="cp-hamcrest-api-test" path=""/>
-        <compile-module modulename="hamcrest-api"/>
-        <jar-module modulename="hamcrest-api"/>
-        <test-module modulename="hamcrest-api"/>
-    </target>
-
-    <target name="generator" depends="api" description="Build code generator tool">
-        <path id="cp-hamcrest-generator-main" path="lib/generator/qdox-2.0-M2.jar;build/hamcrest-api-${version}.jar"/>
-        <path id="cp-hamcrest-generator-test" path=""/>
-        <compile-module modulename="hamcrest-generator"/>
-        <jar-module modulename="hamcrest-generator"/>
-        <test-module modulename="hamcrest-generator"/>
-
-        <!-- Include QDox classes in hamcrest-generator.jar using JarJar to place classes under a different package -->
-        <taskdef name="jarjar" classname="com.tonicsystems.jarjar.JarJarTask" classpath="lib/generator/jarjar-1.3.jar"/>
-        <copy file="build/hamcrest-generator-${version}.jar" tofile="build/hamcrest-generator-${version}-nodep.jar"/>
-        <jarjar jarfile="build/hamcrest-generator-${version}.jar">
-            <zipfileset src="build/hamcrest-generator-${version}-nodep.jar"/>
-            <zipfileset src="lib/generator/qdox-2.0-M2.jar"/>
-            <rule pattern="com.thoughtworks.qdox.**" result="org.hamcrest.generator.qdox.@1"/>
-        </jarjar>
-    </target>
-
-    <target name="core" depends="generator" description="Build core Hamcrest library">
-        <path id="cp-hamcrest-core-main" path="build/hamcrest-api-${version}.jar"/>
-        <path id="cp-hamcrest-core-test" path=""/>
-        <compile-module modulename="hamcrest-core"/>
-        <generate-module-factory modulename="hamcrest-core" configurationfile="hamcrest-core/core-matchers.xml" targetclass="org.hamcrest.CoreMatchers" sources="hamcrest-core/src/main/java"/>
-        <jar-module modulename="hamcrest-core"/>
-        <test-module modulename="hamcrest-core"/>
-    </target>
-
-    <target name="library" depends="core" description="Build library of matchers">
-        <path id="cp-hamcrest-library-main" path="build/hamcrest-api-${version}.jar;build/hamcrest-core-${version}.jar"/>
-        <path id="cp-hamcrest-library-test" path="build/hamcrest-core-${version}-tests.jar"/>
-        <compile-module modulename="hamcrest-library"/>
-        <generate-module-factory modulename="hamcrest-library" configurationfile="hamcrest-library/matchers.xml" targetclass="org.hamcrest.Matchers" sources="hamcrest-core/src/main/java,hamcrest-library/src/main/java"/>
-        <jar-module modulename="hamcrest-library"/>
-        <test-module modulename="hamcrest-library"/>
-    </target>
-
-    <target name="integration" depends="library" description="Build integration with external tools">
-        <path id="cp-hamcrest-integration-main">
-            <fileset file="build/hamcrest-api-${version}.jar"/>
-            <fileset file="build/hamcrest-core-${version}.jar"/>
-            <fileset file="build/hamcrest-library-${version}.jar"/>
-            <fileset dir="lib/integration" includes="**/*.jar"/>
-        </path>
-        <path id="cp-hamcrest-integration-test" path="build/hamcrest-core-${version}-tests.jar"/>
-        <compile-module modulename="hamcrest-integration"/>
-        <jar-module modulename="hamcrest-integration"/>
-        <test-module modulename="hamcrest-integration"/>
-    </target>
-
-    <target name="examples" depends="core, library, integration" description="Build and run unit tests.">
-        <path id="cp-hamcrest-examples-main">
-            <fileset file="build/hamcrest-api-${version}.jar"/>
-            <fileset file="build/hamcrest-core-${version}.jar"/>
-            <fileset file="build/hamcrest-library-${version}.jar"/>
-            <fileset file="build/hamcrest-integration-${version}.jar"/>
-            <fileset dir="lib/integration" includes="**/*.jar"/>
-        </path>
-        <compile-module modulename="hamcrest-examples"/>
-        <jar-module modulename="hamcrest-examples"/>
-    </target>
-
-    <target name="bigjar" depends="core,library,integration,generator" description="Build composite jars">
-        <!-- Bundle api into core jar -->
-        <copy todir="build/temp/hamcrest-core-${version}.jar.contents">
-            <fileset dir="build/temp/hamcrest-api-${version}.jar.contents"/>
-        </copy>
-        <copy todir="build/temp/hamcrest-core-${version}-sources.jar.contents">
-            <fileset dir="build/temp/hamcrest-api-${version}-sources.jar.contents"/>
-        </copy>
-        <jar-module modulename="hamcrest-core"/>
-
-        <!-- Bundle core, library, integration, and generator into all jar-->
-        <copy todir="build/temp/hamcrest-all-${version}.jar.contents">
-            <fileset dir="build/temp/hamcrest-core-${version}.jar.contents"/>
-            <fileset dir="build/temp/hamcrest-library-${version}.jar.contents"/>
-            <fileset dir="build/temp/hamcrest-integration-${version}.jar.contents"/>
-            <fileset dir="build/temp/hamcrest-generator-${version}.jar.contents"/>
-        </copy>
-        <copy todir="build/temp/hamcrest-all-${version}-sources.jar.contents">
-            <fileset dir="build/temp/hamcrest-core-${version}-sources.jar.contents"/>
-            <fileset dir="build/temp/hamcrest-library-${version}-sources.jar.contents"/>
-            <fileset dir="build/temp/hamcrest-integration-${version}-sources.jar.contents"/>
-            <fileset dir="build/temp/hamcrest-generator-${version}-sources.jar.contents"/>
-        </copy>
-        <path id="cp-hamcrest-all-main">
-            <path refid="cp-hamcrest-core-main"/>
-            <path refid="cp-hamcrest-library-main"/>
-            <path refid="cp-hamcrest-integration-main"/>
-            <path refid="cp-hamcrest-generator-main"/>
-        </path>
-        <jar-module modulename="hamcrest-all"/>
-    </target>
-
-    <target name="javadoc" depends="bigjar" description="build javadoc jars">
-        <javadoc-module modulename="hamcrest-generator"/>
-        <javadoc-module modulename="hamcrest-core"/>
-        <javadoc-module modulename="hamcrest-library"/>
-        <javadoc-module modulename="hamcrest-integration"/>
-        <javadoc-module modulename="hamcrest-all"/>
-    </target>
-
-    <target name="bundle" description="Create a release bundle for deployment to maven central" depends="clean, javadoc">
-        <copy todir="build">
-            <fileset dir="pom" includes="*.pom"/>
-            <filterset><filter token="VERSION" value="${version}"/></filterset>
-            <mapper type="regexp" from="(.*)\.pom" to="\1-${version}.pom"/>
-        </copy>
-
-        <sign target="hamcrest-parent-${version}.pom"/>
-        <jar-bundle modulename="hamcrest-parent"/>
-
-        <bundle-module modulename="hamcrest-core"/>
-        <bundle-module modulename="hamcrest-generator"/>
-        <bundle-module modulename="hamcrest-library"/>
-        <bundle-module modulename="hamcrest-integration"/>
-        <bundle-module modulename="hamcrest-all"/>
-    </target>
-
-    <macrodef name="make-manifest">
-        <attribute name="modulename" description="Name of the module"/>
-        <sequential>
-            <mkdir dir="build/temp/@{modulename}-${version}.jar.manifest"/>
-            <manifest file="build/temp/@{modulename}-${version}.jar.manifest/MANIFEST.MF">
-               <attribute name="Implementation-Title" value="@{modulename}"/>
-               <attribute name="Implementation-Vendor" value="hamcrest.org"/>
-               <attribute name="Implementation-Version" value="${version}"/>
-               <attribute name="Built-By" value="${user.name}"/>
-               <attribute name="Built-Date" value="${build.timestamp}"/>
-           </manifest>
-        </sequential>
-    </macrodef>
-
-    <macrodef name="compile-module">
-        <attribute name="modulename" description="Name of the module to jar"/>
-        <sequential>
-            <compile-content srcdir="@{modulename}/src/main/java" jarname="@{modulename}-${version}" classpathref="cp-@{modulename}-main" />
-            <path id="cp-@{modulename}-test-complete">
-                <path path="lib/integration/junit-dep-4.11.jar"/>
-                <path refid="cp-@{modulename}-main"/>
-                <path refid="cp-@{modulename}-test"/>
-                <path path="build/temp/@{modulename}-${version}.jar.contents"/>
-            </path>
-            <compile-content srcdir="@{modulename}/src/test/java" jarname="@{modulename}-${version}-tests" classpathref="cp-@{modulename}-test-complete" />
-        </sequential>
-    </macrodef>
-
-    <macrodef name="compile-content">
-        <attribute name="srcdir"/>
-        <attribute name="jarname" description="Name of the jar whose content is being compiled (without .jar suffix)"/>
-        <attribute name="classpathref"/>
-        <sequential>
-            <mkdir dir="build/temp/@{jarname}-sources.jar.contents"/>
-            <copy failonerror="false" todir="build/temp/@{jarname}-sources.jar.contents">
-                <fileset dir="@{srcdir}"/>
-            </copy>
-            <mkdir dir="build/temp/@{jarname}.jar.contents"/>
-            <javac srcdir="build/temp/@{jarname}-sources.jar.contents"
-                   destdir="build/temp/@{jarname}.jar.contents"
-                   debug="${debug}" source="${javaversion}" target="${javaversion}" includeantruntime="false">
-                <classpath refid="@{classpathref}"/>
-            </javac>
-        </sequential>
-    </macrodef>
-
-    <macrodef name="jar-module">
-        <attribute name="modulename" description="Name of the module to jar"/>
-        <sequential>
-            <make-manifest modulename="@{modulename}"/>
-            <jar-module-component modulename="@{modulename}"/>
-            <jar-module-component modulename="@{modulename}" suffix="-tests"/>
-            <jar-module-component modulename="@{modulename}" suffix="-sources"/>
-        </sequential>
-    </macrodef>
-
-    <macrodef name="jar-module-component">
-        <attribute name="modulename" description="Name of the module to jar"/>
-        <attribute name="suffix" default="" description="Name of the module to jar"/>
-        <sequential>
-            <copy file="LICENSE.txt" todir="build/temp/@{modulename}-${version}@{suffix}.jar.contents/META-INF"/>
-            <jar jarfile="build/@{modulename}-${version}@{suffix}.jar" manifest="build/temp/@{modulename}-${version}.jar.manifest/MANIFEST.MF">
-                <fileset dir="build/temp/@{modulename}-${version}@{suffix}.jar.contents"/>
-            </jar>
-        </sequential>
-    </macrodef>
-
-    <macrodef name="generate-module-factory" description="Generate one class with all static imports">
-        <attribute name="modulename" description="Name of the module to jar"/>
-        <attribute name="configurationfile" description="xml configuration file"/>
-        <attribute name="targetclass" description="factory class to generate"/>
-        <attribute name="sources" description="comma-separated source directories"/>
-        <sequential>
-            <mkdir dir="build/temp/@{modulename}/generated-code"/>
-            <java classname="org.hamcrest.generator.config.XmlConfigurator" fork="yes" failonerror="yes">
-                <classpath path="build/hamcrest-generator-${version}.jar"/>
-                <classpath refid="cp-@{modulename}-main"/>
-                <classpath path="build/temp/@{modulename}-${version}.jar.contents"/>
-                <arg value="@{configurationfile}"/>
-                <arg value="@{sources}"/>
-                <arg value="@{targetclass}"/>
-                <arg value="build/temp/@{modulename}/generated-code"/>
-            </java>
-
-            <copy todir="build/temp/@{modulename}-${version}-sources.jar.contents">
-                <fileset dir="build/temp/@{modulename}/generated-code"/>
-            </copy>
-            <compile-module modulename="@{modulename}"/>
-        </sequential>
-    </macrodef>
-
-    <macrodef name="test-module" description="run unit tests.">
-        <attribute name="modulename" description="Name of the module to test"/>
-        <sequential>
-            <mkdir dir="build/temp/@{modulename}/test-wrk"/>
-            <junit printsummary="no" forkmode="once" tempdir="build/temp/@{modulename}/test-wrk" haltonfailure="${haltonfailure}" dir="@{modulename}">
-                <formatter type="brief" usefile="no"/>
-                <classpath refid="cp-@{modulename}-test-complete"/>
-                <classpath path="build/@{modulename}-${version}-tests.jar"/>
-                <batchtest fork="yes" todir="${build.dir}/testreport">
-                    <zipfileset src="build/@{modulename}-${version}-tests.jar">
-                        <include name="org/hamcrest/**/*Test.class"/>
-                        <exclude name="**/Abstract*.class"/>
-                    </zipfileset>
-                </batchtest>
-            </junit>
-        </sequential>
-    </macrodef>
-
-    <macrodef name="javadoc-module" description="Generate javadoc for a module and build a Jar">
-        <attribute name="modulename" description="Name of the module to document"/>
-        <sequential>
-            <javadoc packagenames="org.hamcrest.*" sourcepath="build/temp/@{modulename}-${version}-sources.jar.contents"
-                     destdir="build/temp/@{modulename}-${version}-javadoc.jar.contents" author="true" version="true"
-                     use="true" windowtitle="Hamcrest" source="${javaversion}" failonerror="yes" defaultexcludes="yes">
-                <classpath refid="cp-@{modulename}-main"/>
-            </javadoc>
-            <jar-module-component modulename="@{modulename}" suffix="-javadoc"/>
-        </sequential>
-    </macrodef>
-
-    <macrodef name="bundle-module" description="Generate maven bundle jar for a module">
-        <attribute name="modulename" description="Name of the module to bundle"/>
-        <sequential>
-            <sign target="@{modulename}-${version}.pom"/>
-            <sign target="@{modulename}-${version}.jar"/>
-            <sign target="@{modulename}-${version}-javadoc.jar"/>
-            <sign target="@{modulename}-${version}-sources.jar"/>
-            <jar-bundle modulename="@{modulename}"/>
-        </sequential>
-    </macrodef>
-
-    <macrodef name="jar-bundle" description="Jar maven bundle contents">
-        <attribute name="modulename" description="Name of the module to create bundle jar for"/>
-        <sequential>
-            <jar destfile="build/maven-bundle-@{modulename}.jar">
-                <fileset dir="build"><include name="@{modulename}-${version}*"/></fileset>
-            </jar>
-        </sequential>
-    </macrodef>
-
-    <macrodef name="sign" description="Sign a file with a gpg key">
-        <attribute name="target" description="Name of the resource to sign"/>
-        <sequential>
-            <exec executable="gpg" dir="build"><arg value="-ab"/><arg value="@{target}"/></exec>
-        </sequential>
-    </macrodef>
-</project>
diff --git a/doc/images/logo.jpg b/doc/images/logo.jpg
deleted file mode 100644
index efd750d..0000000
--- a/doc/images/logo.jpg
+++ /dev/null
Binary files differ
diff --git a/hamcrest-core/src/main/java/org/hamcrest/BaseDescription.java b/hamcrest-core/src/main/java/org/hamcrest/BaseDescription.java
index 6e62e69..4c98e5f 100644
--- a/hamcrest-core/src/main/java/org/hamcrest/BaseDescription.java
+++ b/hamcrest-core/src/main/java/org/hamcrest/BaseDescription.java
@@ -1,144 +1,127 @@
-package org.hamcrest;
-
-import org.hamcrest.internal.ArrayIterator;
-import org.hamcrest.internal.SelfDescribingValueIterator;
-
-import java.util.Arrays;
-import java.util.Iterator;
-
-import static java.lang.String.valueOf;
-
-/**
- * A {@link Description} that is stored as a string.
- */
-public abstract class BaseDescription implements Description {
-
-    @Override
-    public Description appendText(String text) {
-        append(text);
-        return this;
-    }
-    
-    @Override
-    public Description appendDescriptionOf(SelfDescribing value) {
-        value.describeTo(this);
-        return this;
-    }
-    
-    @Override
-    public Description appendValue(Object value) {
-        if (value == null) {
-            append("null");
-        } else if (value instanceof String) {
-            toJavaSyntax((String) value);
-        } else if (value instanceof Character) {
-            append('"');
-            toJavaSyntax((Character) value);
-            append('"');
-        } else if (value instanceof Short) {
-            append('<');
-            append(descriptionOf(value));
-            append("s>");
-        } else if (value instanceof Long) {
-            append('<');
-            append(descriptionOf(value));
-            append("L>");
-        } else if (value instanceof Float) {
-            append('<');
-            append(descriptionOf(value));
-            append("F>");
-        } else if (value.getClass().isArray()) {
-            appendValueList("[",", ","]", new ArrayIterator(value));
-        } else {
-            append('<');
-            append(descriptionOf(value));
-            append('>');
-        }
-        return this;
-    }
-
-    private String descriptionOf(Object value) {
-        try {
-            return valueOf(value);
-        }
-        catch (Exception e) {
-            return value.getClass().getName() + "@" + Integer.toHexString(value.hashCode());
-        }
-    }
-
-    @Override
-    public <T> Description appendValueList(String start, String separator, String end, T... values) {
-        return appendValueList(start, separator, end, Arrays.asList(values));
-    }
-    
-    @Override
-    public <T> Description appendValueList(String start, String separator, String end, Iterable<T> values) {
-        return appendValueList(start, separator, end, values.iterator());
-    }
-    
-    private <T> Description appendValueList(String start, String separator, String end, Iterator<T> values) {
-        return appendList(start, separator, end, new SelfDescribingValueIterator<T>(values));
-    }
-    
-    @Override
-    public Description appendList(String start, String separator, String end, Iterable<? extends SelfDescribing> values) {
-        return appendList(start, separator, end, values.iterator());
-    }
-
-    private Description appendList(String start, String separator, String end, Iterator<? extends SelfDescribing> i) {
-        boolean separate = false;
-        
-        append(start);
-        while (i.hasNext()) {
-            if (separate) append(separator);
-            appendDescriptionOf(i.next());
-            separate = true;
-        }
-        append(end);
-        
-        return this;
-    }
-
-    /**
-     * Append the String <var>str</var> to the description.  
-     * The default implementation passes every character to {@link #append(char)}.  
-     * Override in subclasses to provide an efficient implementation.
-     */
-    protected void append(String str) {
-        for (int i = 0; i < str.length(); i++) {
-            append(str.charAt(i));
-        }
-    }
-    
-    /**
-     * Append the char <var>c</var> to the description.  
-     */
-    protected abstract void append(char c);
-
-    private void toJavaSyntax(String unformatted) {
-        append('"');
-        for (int i = 0; i < unformatted.length(); i++) {
-            toJavaSyntax(unformatted.charAt(i));
-        }
-        append('"');
-    }
-
-    private void toJavaSyntax(char ch) {
-        switch (ch) {
-            case '"':
-                append("\\\"");
-                break;
-            case '\n':
-                append("\\n");
-                break;
-            case '\r':
-                append("\\r");
-                break;
-            case '\t':
-                append("\\t");
-                break;
-            default:
-                append(ch);
-        }
-    }
-}
+package org.hamcrest;
+
+import static java.lang.String.valueOf;
+
+import java.util.Arrays;
+import java.util.Iterator;
+
+import org.hamcrest.internal.ArrayIterator;
+import org.hamcrest.internal.SelfDescribingValueIterator;
+
+/**
+ * A {@link Description} that is stored as a string.
+ */
+public abstract class BaseDescription implements Description {
+    public Description appendText(String text) {
+        append(text);
+        return this;
+    }
+    
+    public Description appendDescriptionOf(SelfDescribing value) {
+    	value.describeTo(this);
+    	return this;
+    }
+    
+    public Description appendValue(Object value) {
+        if (value == null) {
+            append("null");
+        } else if (value instanceof String) {
+            toJavaSyntax((String) value);
+        } else if (value instanceof Character) {
+            append('"');
+            toJavaSyntax((Character) value);
+            append('"');
+        } else if (value instanceof Short) {
+            append('<');
+            append(valueOf(value));
+            append("s>");
+        } else if (value instanceof Long) {
+            append('<');
+            append(valueOf(value));
+            append("L>");
+        } else if (value instanceof Float) {
+            append('<');
+            append(valueOf(value));
+            append("F>");
+        } else if (value.getClass().isArray()) {
+        	appendValueList("[",", ","]", new ArrayIterator(value));
+        } else {
+            append('<');
+            append(valueOf(value));
+            append('>');
+        }
+        return this;
+    }
+    
+    public <T> Description appendValueList(String start, String separator, String end, T... values) {
+        return appendValueList(start, separator, end, Arrays.asList(values));
+	}
+    
+	public <T> Description appendValueList(String start, String separator, String end, Iterable<T> values) {
+		return appendValueList(start, separator, end, values.iterator());
+	}
+	
+	private <T> Description appendValueList(String start, String separator, String end, Iterator<T> values) {
+		return appendList(start, separator, end, new SelfDescribingValueIterator<T>(values));
+	}
+	
+    public Description appendList(String start, String separator, String end, Iterable<? extends SelfDescribing> values) {
+        return appendList(start, separator, end, values.iterator());
+    }
+
+    private Description appendList(String start, String separator, String end, Iterator<? extends SelfDescribing> i) {
+        boolean separate = false;
+        
+        append(start);
+        while (i.hasNext()) {
+            if (separate) append(separator);
+            appendDescriptionOf(i.next());
+            separate = true;
+        }
+        append(end);
+        
+        return this;
+    }
+
+
+    /** Append the String <var>str</var> to the description.  
+     *  The default implementation passes every character to {@link #append(char)}.  
+     *  Override in subclasses to provide an efficient implementation.
+     */
+    protected void append(String str) {
+    	for (int i = 0; i < str.length(); i++) {
+    		append(str.charAt(i));
+    	}
+    }
+    
+    /** Append the char <var>c</var> to the description.  
+     */
+    protected abstract void append(char c);
+
+    private void toJavaSyntax(String unformatted) {
+        append('"');
+        for (int i = 0; i < unformatted.length(); i++) {
+            toJavaSyntax(unformatted.charAt(i));
+        }
+        append('"');
+    }
+
+    private void toJavaSyntax(char ch) {
+        switch (ch) {
+            case '"':
+                append("\\\"");
+                break;
+            case '\n':
+                append("\\n");
+                break;
+            case '\r':
+                append("\\r");
+                break;
+            case '\t':
+                append("\\t");
+                break;
+            default:
+                append(ch);
+        }
+    }
+}
diff --git a/hamcrest-core/src/main/java/org/hamcrest/BaseMatcher.java b/hamcrest-core/src/main/java/org/hamcrest/BaseMatcher.java
index 484c101..3fdd6f7 100644
--- a/hamcrest-core/src/main/java/org/hamcrest/BaseMatcher.java
+++ b/hamcrest-core/src/main/java/org/hamcrest/BaseMatcher.java
@@ -1,3 +1,5 @@
+/*  Copyright (c) 2000-2006 hamcrest.org
+ */
 package org.hamcrest;
 
 /**
@@ -10,18 +12,11 @@
     /**
      * @see Matcher#_dont_implement_Matcher___instead_extend_BaseMatcher_()
      */
-    @Override
-    @Deprecated
     public final void _dont_implement_Matcher___instead_extend_BaseMatcher_() {
         // See Matcher interface for an explanation of this method.
     }
 
     @Override
-    public void describeMismatch(Object item, Description description) {
-        description.appendText("was ").appendValue(item);
-    }
-
-    @Override
     public String toString() {
         return StringDescription.toString(this);
     }
diff --git a/hamcrest-core/src/main/java/org/hamcrest/Condition.java b/hamcrest-core/src/main/java/org/hamcrest/Condition.java
deleted file mode 100644
index 02ce09e..0000000
--- a/hamcrest-core/src/main/java/org/hamcrest/Condition.java
+++ /dev/null
@@ -1,69 +0,0 @@
-package org.hamcrest;
-
-/**
- * A Condition implements part of a multi-step match. We sometimes need to write matchers
- * that have a sequence of steps, where each step depends on the result of the previous
- * step and we can stop processing as soon as a step fails. These classes provide
- * infrastructure for writing such a sequence.
- *
- * Based on https://github.com/npryce/maybe-java
- * @author Steve Freeman 2012 http://www.hamcrest.com
- */
-
-public abstract class Condition<T> {
-    public static final NotMatched<Object> NOT_MATCHED = new NotMatched<Object>();
-
-    public interface Step<I, O> {
-        Condition<O> apply(I value, Description mismatch);
-    }
-
-    private Condition() { }
-
-    public abstract boolean matching(Matcher<T> match, String message);
-    public abstract <U> Condition<U> and(Step<? super T, U> mapping);
-
-    public final boolean matching(Matcher<T> match) { return matching(match, ""); }
-    public final <U> Condition<U> then(Step<? super T, U> mapping) { return and(mapping); }
-
-    @SuppressWarnings("unchecked")
-    public static <T> Condition<T> notMatched() {
-        return (Condition<T>) NOT_MATCHED;
-    }
-
-    public static <T> Condition<T> matched(final T theValue, final Description mismatch) {
-        return new Matched<T>(theValue, mismatch);
-    }
-
-    private static final class Matched<T> extends Condition<T> {
-        private final T theValue;
-        private final Description mismatch;
-
-        private Matched(T theValue, Description mismatch) {
-            this.theValue = theValue;
-            this.mismatch = mismatch;
-        }
-
-        @Override
-        public boolean matching(Matcher<T> matcher, String message) {
-            if (matcher.matches(theValue)) {
-                return true;
-            }
-            mismatch.appendText(message);
-            matcher.describeMismatch(theValue, mismatch);
-            return false;
-        }
-
-        @Override
-        public <U> Condition<U> and(Step<? super T, U> next) {
-            return next.apply(theValue, mismatch);
-        }
-    }
-
-    private static final class NotMatched<T> extends Condition<T> {
-        @Override public boolean matching(Matcher<T> match, String message) { return false; }
-
-        @Override public <U> Condition<U> and(Step<? super T, U> mapping) {
-            return notMatched();
-        }
-    }
-}
diff --git a/hamcrest-core/src/main/java/org/hamcrest/CoreMatchers.java b/hamcrest-core/src/main/java/org/hamcrest/CoreMatchers.java
index 799a26a..400a491 100644
--- a/hamcrest-core/src/main/java/org/hamcrest/CoreMatchers.java
+++ b/hamcrest-core/src/main/java/org/hamcrest/CoreMatchers.java
@@ -1,114 +1,24 @@
+// Generated source.
 package org.hamcrest;
 
-@SuppressWarnings("UnusedDeclaration")
 public class CoreMatchers {
 
   /**
-   * Creates a matcher that matches if the examined object matches <b>ALL</b> of the specified matchers.
-   * For example:
-   * <pre>assertThat("myValue", allOf(startsWith("my"), containsString("Val")))</pre>
-   */
-  public static <T> org.hamcrest.Matcher<T> allOf(java.lang.Iterable<org.hamcrest.Matcher<? super T>> matchers) {
-    return org.hamcrest.core.AllOf.<T>allOf(matchers);
-  }
-
-  /**
-   * Creates a matcher that matches if the examined object matches <b>ALL</b> of the specified matchers.
-   * For example:
-   * <pre>assertThat("myValue", allOf(startsWith("my"), containsString("Val")))</pre>
-   */
-  @SafeVarargs
-  public static <T> org.hamcrest.Matcher<T> allOf(org.hamcrest.Matcher<? super T>... matchers) {
-    return org.hamcrest.core.AllOf.<T>allOf(matchers);
-  }
-
-
-  /**
-   * Creates a matcher that matches if the examined object matches <b>ANY</b> of the specified matchers.
-   * For example:
-   * <pre>assertThat("myValue", anyOf(startsWith("foo"), containsString("Val")))</pre>
-   */
-  public static <T> org.hamcrest.core.AnyOf<T> anyOf(java.lang.Iterable<org.hamcrest.Matcher<? super T>> matchers) {
-    return org.hamcrest.core.AnyOf.<T>anyOf(matchers);
-  }
-
-  /**
-   * Creates a matcher that matches if the examined object matches <b>ANY</b> of the specified matchers.
-   * For example:
-   * <pre>assertThat("myValue", anyOf(startsWith("foo"), containsString("Val")))</pre>
-   */
-  @SafeVarargs
-  public static <T> org.hamcrest.core.AnyOf<T> anyOf(org.hamcrest.Matcher<? super T>... matchers) {
-    return org.hamcrest.core.AnyOf.<T>anyOf(matchers);
-  }
-
-  /**
-   * Creates a matcher that matches when both of the specified matchers match the examined object.
-   * For example:
-   * <pre>assertThat("fab", both(containsString("a")).and(containsString("b")))</pre>
-   */
-  public static <LHS> org.hamcrest.core.CombinableMatcher.CombinableBothMatcher<LHS> both(org.hamcrest.Matcher<? super LHS> matcher) {
-    return org.hamcrest.core.CombinableMatcher.both(matcher);
-  }
-
-  /**
-   * Creates a matcher that matches when either of the specified matchers match the examined object.
-   * For example:
-   * <pre>assertThat("fan", either(containsString("a")).or(containsString("b")))</pre>
-   */
-  public static <LHS> org.hamcrest.core.CombinableMatcher.CombinableEitherMatcher<LHS> either(org.hamcrest.Matcher<? super LHS> matcher) {
-    return org.hamcrest.core.CombinableMatcher.either(matcher);
-  }
-
-  /**
-   * Wraps an existing matcher, overriding its description with that specified.  All other functions are
-   * delegated to the decorated matcher, including its mismatch description.
-   * For example:
-   * <pre>describedAs("a big decimal equal to %0", equalTo(myBigDecimal), myBigDecimal.toPlainString())</pre>
-   * 
-   * @param description
-   *     the new description for the wrapped matcher
-   * @param matcher
-   *     the matcher to wrap
-   * @param values
-   *     optional values to insert into the tokenised description
-   */
-  public static <T> org.hamcrest.Matcher<T> describedAs(java.lang.String description, org.hamcrest.Matcher<T> matcher, java.lang.Object... values) {
-    return org.hamcrest.core.DescribedAs.describedAs(description, matcher, values);
-  }
-
-  /**
-   * Creates a matcher for {@link Iterable}s that only matches when a single pass over the
-   * examined {@link Iterable} yields items that are all matched by the specified
-   * <code>itemMatcher</code>.
-   * For example:
-   * <pre>assertThat(Arrays.asList("bar", "baz"), everyItem(startsWith("ba")))</pre>
-   * 
-   * @param itemMatcher
-   *     the matcher to apply to every item provided by the examined {@link Iterable}
-   */
-  public static <U> org.hamcrest.Matcher<java.lang.Iterable<? extends U>> everyItem(org.hamcrest.Matcher<U> itemMatcher) {
-    return org.hamcrest.core.Every.everyItem(itemMatcher);
-  }
-
-  /**
-   * Decorates another Matcher, retaining its behaviour, but allowing tests
+   * Decorates another Matcher, retaining the behavior but allowing tests
    * to be slightly more expressive.
-   * For example:
-   * <pre>assertThat(cheese, is(equalTo(smelly)))</pre>
-   * instead of:
-   * <pre>assertThat(cheese, equalTo(smelly))</pre>
+   * 
+   * eg. assertThat(cheese, equalTo(smelly))
+   * vs assertThat(cheese, is(equalTo(smelly)))
    */
   public static <T> org.hamcrest.Matcher<T> is(org.hamcrest.Matcher<T> matcher) {
     return org.hamcrest.core.Is.is(matcher);
   }
 
   /**
-   * A shortcut to the frequently used <code>is(equalTo(x))</code>.
-   * For example:
-   * <pre>assertThat(cheese, is(smelly))</pre>
-   * instead of:
-   * <pre>assertThat(cheese, is(equalTo(smelly)))</pre>
+   * This is a shortcut to the frequently used is(equalTo(x)).
+   * 
+   * eg. assertThat(cheese, is(equalTo(smelly)))
+   * vs assertThat(cheese, is(smelly))
    */
   public static <T> org.hamcrest.Matcher<T> is(T value) {
     return org.hamcrest.core.Is.is(value);
@@ -131,334 +41,131 @@
   }
 
   /**
-   * A shortcut to the frequently used <code>is(instanceOf(SomeClass.class))</code>.
-   * For example:
-   * <pre>assertThat(cheese, isA(Cheddar.class))</pre>
-   * instead of:
-   * <pre>assertThat(cheese, is(instanceOf(Cheddar.class)))</pre>
-   */
-  public static <T> org.hamcrest.Matcher<T> isA(java.lang.Class<T> type) {
-    return org.hamcrest.core.Is.isA(type);
-  }
-
-  /**
-   * Creates a matcher that always matches, regardless of the examined object.
-   */
-  public static org.hamcrest.Matcher<java.lang.Object> anything() {
-    return org.hamcrest.core.IsAnything.anything();
-  }
-
-  /**
-   * Creates a matcher that always matches, regardless of the examined object, but describes
-   * itself with the specified {@link String}.
-   * 
-   * @param description
-   *     a meaningful {@link String} used when describing itself
-   */
-  public static org.hamcrest.Matcher<java.lang.Object> anything(java.lang.String description) {
-    return org.hamcrest.core.IsAnything.anything(description);
-  }
-
-  /**
-   * Creates a matcher for {@link Iterable}s that only matches when a single pass over the
-   * examined {@link Iterable} yields at least one item that is matched by the specified
-   * <code>itemMatcher</code>.  Whilst matching, the traversal of the examined {@link Iterable}
-   * will stop as soon as a matching item is found.
-   * For example:
-   * <pre>assertThat(Arrays.asList("foo", "bar"), hasItem(startsWith("ba")))</pre>
-   * 
-   * @param itemMatcher
-   *     the matcher to apply to items provided by the examined {@link Iterable}
-   */
-  public static <T> org.hamcrest.Matcher<java.lang.Iterable<? super T>> hasItem(org.hamcrest.Matcher<? super T> itemMatcher) {
-    return org.hamcrest.core.IsCollectionContaining.<T>hasItem(itemMatcher);
-  }
-
-  /**
-   * Creates a matcher for {@link Iterable}s that only matches when a single pass over the
-   * examined {@link Iterable} yields at least one item that is equal to the specified
-   * <code>item</code>.  Whilst matching, the traversal of the examined {@link Iterable}
-   * will stop as soon as a matching item is found.
-   * For example:
-   * <pre>assertThat(Arrays.asList("foo", "bar"), hasItem("bar"))</pre>
-   * 
-   * @param item
-   *     the item to compare against the items provided by the examined {@link Iterable}
-   */
-  public static <T> org.hamcrest.Matcher<java.lang.Iterable<? super T>> hasItem(T item) {
-    return org.hamcrest.core.IsCollectionContaining.<T>hasItem(item);
-  }
-
-  /**
-   * Creates a matcher for {@link Iterable}s that matches when consecutive passes over the
-   * examined {@link Iterable} yield at least one item that is matched by the corresponding
-   * matcher from the specified <code>itemMatchers</code>.  Whilst matching, each traversal of
-   * the examined {@link Iterable} will stop as soon as a matching item is found.
-   * For example:
-   * <pre>assertThat(Arrays.asList("foo", "bar", "baz"), hasItems(endsWith("z"), endsWith("o")))</pre>
-   * 
-   * @param itemMatchers
-   *     the matchers to apply to items provided by the examined {@link Iterable}
-   */
-  @SafeVarargs
-  public static <T> org.hamcrest.Matcher<java.lang.Iterable<T>> hasItems(org.hamcrest.Matcher<? super T>... itemMatchers) {
-    return org.hamcrest.core.IsCollectionContaining.<T>hasItems(itemMatchers);
-  }
-
-  /**
-   * Creates a matcher for {@link Iterable}s that matches when consecutive passes over the
-   * examined {@link Iterable} yield at least one item that is equal to the corresponding
-   * item from the specified <code>items</code>.  Whilst matching, each traversal of the
-   * examined {@link Iterable} will stop as soon as a matching item is found.
-   * For example:
-   * <pre>assertThat(Arrays.asList("foo", "bar", "baz"), hasItems("baz", "foo"))</pre>
-   * 
-   * @param items
-   *     the items to compare against the items provided by the examined {@link Iterable}
-   */
-  @SafeVarargs
-  public static <T> org.hamcrest.Matcher<java.lang.Iterable<T>> hasItems(T... items) {
-    return org.hamcrest.core.IsCollectionContaining.<T>hasItems(items);
-  }
-
-  /**
-   * Creates a matcher that matches when the examined object is logically equal to the specified
-   * <code>operand</code>, as determined by calling the {@link java.lang.Object#equals} method on
-   * the <b>examined</b> object.
-   * 
-   * <p>If the specified operand is <code>null</code> then the created matcher will only match if
-   * the examined object's <code>equals</code> method returns <code>true</code> when passed a
-   * <code>null</code> (which would be a violation of the <code>equals</code> contract), unless the
-   * examined object itself is <code>null</code>, in which case the matcher will return a positive
-   * match.</p>
-   * 
-   * <p>The created matcher provides a special behaviour when examining <code>Array</code>s, whereby
-   * it will match if both the operand and the examined object are arrays of the same length and
-   * contain items that are equal to each other (according to the above rules) <b>in the same
-   * indexes</b>.</p> 
-   * For example:
-   * <pre>
-   * assertThat("foo", equalTo("foo"));
-   * assertThat(new String[] {"foo", "bar"}, equalTo(new String[] {"foo", "bar"}));
-   * </pre>
-   */
-  public static <T> org.hamcrest.Matcher<T> equalTo(T operand) {
-    return org.hamcrest.core.IsEqual.equalTo(operand);
-  }
-
-  /**
-   * Creates an {@link org.hamcrest.core.IsEqual} matcher that does not enforce the values being
-   * compared to be of the same static type.
-   */
-  public static org.hamcrest.Matcher<java.lang.Object> equalToObject(java.lang.Object operand) {
-    return org.hamcrest.core.IsEqual.equalToObject(operand);
-  }
-
-  /**
-   * Creates a matcher that matches when the examined object is an instance of the specified <code>type</code>,
-   * as determined by calling the {@link java.lang.Class#isInstance(Object)} method on that type, passing the
-   * the examined object.
-   * 
-   * <p>The created matcher forces a relationship between specified type and the examined object, and should be
-   * used when it is necessary to make generics conform, for example in the JMock clause
-   * <code>with(any(Thing.class))</code></p>
-   * For example:
-   * <pre>assertThat(new Canoe(), instanceOf(Canoe.class));</pre>
-   */
-  public static <T> org.hamcrest.Matcher<T> any(java.lang.Class<T> type) {
-    return org.hamcrest.core.IsInstanceOf.any(type);
-  }
-
-  /**
-   * Creates a matcher that matches when the examined object is an instance of the specified <code>type</code>,
-   * as determined by calling the {@link java.lang.Class#isInstance(Object)} method on that type, passing the
-   * the examined object.
-   * 
-   * <p>The created matcher assumes no relationship between specified type and the examined object.</p>
-   * For example:
-   * <pre>assertThat(new Canoe(), instanceOf(Paddlable.class));</pre>
-   */
-  public static <T> org.hamcrest.Matcher<T> instanceOf(java.lang.Class<?> type) {
-    return org.hamcrest.core.IsInstanceOf.instanceOf(type);
-  }
-
-  /**
-   * Creates a matcher that wraps an existing matcher, but inverts the logic by which
-   * it will match.
-   * For example:
-   * <pre>assertThat(cheese, is(not(equalTo(smelly))))</pre>
-   * 
-   * @param matcher
-   *     the matcher whose sense should be inverted
+   * Inverts the rule.
    */
   public static <T> org.hamcrest.Matcher<T> not(org.hamcrest.Matcher<T> matcher) {
     return org.hamcrest.core.IsNot.not(matcher);
   }
 
   /**
-   * A shortcut to the frequently used <code>not(equalTo(x))</code>.
-   * For example:
-   * <pre>assertThat(cheese, is(not(smelly)))</pre>
-   * instead of:
-   * <pre>assertThat(cheese, is(not(equalTo(smelly))))</pre>
+   * This is a shortcut to the frequently used not(equalTo(x)).
    * 
-   * @param value
-   *     the value that any examined object should <b>not</b> equal
+   * eg. assertThat(cheese, is(not(equalTo(smelly))))
+   * vs assertThat(cheese, is(not(smelly)))
    */
   public static <T> org.hamcrest.Matcher<T> not(T value) {
     return org.hamcrest.core.IsNot.not(value);
   }
 
   /**
-   * A shortcut to the frequently used <code>not(nullValue())</code>.
-   * For example:
-   * <pre>assertThat(cheese, is(notNullValue()))</pre>
-   * instead of:
-   * <pre>assertThat(cheese, is(not(nullValue())))</pre>
+   * Is the value equal to another value, as tested by the
+   * {@link java.lang.Object#equals} invokedMethod?
    */
-  public static org.hamcrest.Matcher<java.lang.Object> notNullValue() {
-    return org.hamcrest.core.IsNull.notNullValue();
+  public static <T> org.hamcrest.Matcher<T> equalTo(T operand) {
+    return org.hamcrest.core.IsEqual.equalTo(operand);
   }
 
   /**
-   * A shortcut to the frequently used <code>not(nullValue(X.class)). Accepts a
-   * single dummy argument to facilitate type inference.</code>.
-   * For example:
-   * <pre>assertThat(cheese, is(notNullValue(X.class)))</pre>
-   * instead of:
-   * <pre>assertThat(cheese, is(not(nullValue(X.class))))</pre>
+   * Is the value an instance of a particular type?
+   */
+  public static org.hamcrest.Matcher<java.lang.Object> instanceOf(java.lang.Class<?> type) {
+    return org.hamcrest.core.IsInstanceOf.instanceOf(type);
+  }
+
+  /**
+   * Evaluates to true only if ALL of the passed in matchers evaluate to true.
+   */
+  public static <T> org.hamcrest.Matcher<T> allOf(org.hamcrest.Matcher<? extends T>... matchers) {
+    return org.hamcrest.core.AllOf.<T>allOf(matchers);
+  }
+
+  /**
+   * Evaluates to true only if ALL of the passed in matchers evaluate to true.
+   */
+  public static <T> org.hamcrest.Matcher<T> allOf(java.lang.Iterable<org.hamcrest.Matcher<? extends T>> matchers) {
+    return org.hamcrest.core.AllOf.allOf(matchers);
+  }
+
+  /**
+   * Evaluates to true if ANY of the passed in matchers evaluate to true.
+   */
+  public static <T> org.hamcrest.Matcher<T> anyOf(org.hamcrest.Matcher<? extends T>... matchers) {
+    return org.hamcrest.core.AnyOf.<T>anyOf(matchers);
+  }
+
+  /**
+   * Evaluates to true if ANY of the passed in matchers evaluate to true.
+   */
+  public static <T> org.hamcrest.Matcher<T> anyOf(java.lang.Iterable<org.hamcrest.Matcher<? extends T>> matchers) {
+    return org.hamcrest.core.AnyOf.anyOf(matchers);
+  }
+
+  /**
+   * Creates a new instance of IsSame
    * 
-   * @param type
-   *     dummy parameter used to infer the generic type of the returned matcher
+   * @param object The predicate evaluates to true only when the argument is
+   * this object.
    */
-  public static <T> org.hamcrest.Matcher<T> notNullValue(java.lang.Class<T> type) {
-    return org.hamcrest.core.IsNull.notNullValue(type);
+  public static <T> org.hamcrest.Matcher<T> sameInstance(T object) {
+    return org.hamcrest.core.IsSame.sameInstance(object);
   }
 
   /**
-   * Creates a matcher that matches if examined object is <code>null</code>.
-   * For example:
-   * <pre>assertThat(cheese, is(nullValue())</pre>
+   * This matcher always evaluates to true.
    */
-  public static org.hamcrest.Matcher<java.lang.Object> nullValue() {
+  public static <T> org.hamcrest.Matcher<T> anything() {
+    return org.hamcrest.core.IsAnything.anything();
+  }
+
+  /**
+   * This matcher always evaluates to true.
+   * 
+   * @param description A meaningful string used when describing itself.
+   */
+  public static <T> org.hamcrest.Matcher<T> anything(java.lang.String description) {
+    return org.hamcrest.core.IsAnything.anything(description);
+  }
+
+  /**
+   * This matcher always evaluates to true. With type inference.
+   */
+  public static <T> org.hamcrest.Matcher<T> any(java.lang.Class<T> type) {
+    return org.hamcrest.core.IsAnything.any(type);
+  }
+
+  /**
+   * Matches if value is null.
+   */
+  public static <T> org.hamcrest.Matcher<T> nullValue() {
     return org.hamcrest.core.IsNull.nullValue();
   }
 
   /**
-   * Creates a matcher that matches if examined object is <code>null</code>. Accepts a
-   * single dummy argument to facilitate type inference.
-   * For example:
-   * <pre>assertThat(cheese, is(nullValue(Cheese.class))</pre>
-   * 
-   * @param type
-   *     dummy parameter used to infer the generic type of the returned matcher
+   * Matches if value is null. With type inference.
    */
   public static <T> org.hamcrest.Matcher<T> nullValue(java.lang.Class<T> type) {
     return org.hamcrest.core.IsNull.nullValue(type);
   }
 
   /**
-   * Creates a matcher that matches only when the examined object is the same instance as
-   * the specified target object.
-   * 
-   * @param target
-   *     the target instance against which others should be assessed
+   * Matches if value is not null.
    */
-  public static <T> org.hamcrest.Matcher<T> sameInstance(T target) {
-    return org.hamcrest.core.IsSame.sameInstance(target);
+  public static <T> org.hamcrest.Matcher<T> notNullValue() {
+    return org.hamcrest.core.IsNull.notNullValue();
   }
 
   /**
-   * Creates a matcher that matches only when the examined object is the same instance as
-   * the specified target object.
-   * 
-   * @param target
-   *     the target instance against which others should be assessed
+   * Matches if value is not null. With type inference.
    */
-  public static <T> org.hamcrest.Matcher<T> theInstance(T target) {
-    return org.hamcrest.core.IsSame.theInstance(target);
+  public static <T> org.hamcrest.Matcher<T> notNullValue(java.lang.Class<T> type) {
+    return org.hamcrest.core.IsNull.notNullValue(type);
   }
 
   /**
-   * Creates a matcher that matches if the examined {@link String} contains the specified
-   * {@link String} anywhere.
-   * For example:
-   * <pre>assertThat("myStringOfNote", containsString("ring"))</pre>
-   * 
-   * @param substring
-   *     the substring that the returned matcher will expect to find within any examined string
+   * Wraps an existing matcher and overrides the description when it fails.
    */
-  public static org.hamcrest.Matcher<java.lang.String> containsString(java.lang.String substring) {
-    return org.hamcrest.core.StringContains.containsString(substring);
-  }
-
-  /**
-   * Creates a matcher that matches if the examined {@link String} contains the specified
-   * {@link String} anywhere, ignoring case.
-   * For example:
-   * <pre>assertThat("myStringOfNote", containsString("ring"))</pre>
-   * 
-   * @param substring
-   *     the substring that the returned matcher will expect to find within any examined string
-   */
-  public static org.hamcrest.Matcher<java.lang.String> containsStringIgnoringCase(java.lang.String substring) {
-    return org.hamcrest.core.StringContains.containsStringIgnoringCase(substring);
-  }
-
-  /**
-   * <p>
-   * Creates a matcher that matches if the examined {@link String} starts with the specified
-   * {@link String}.
-   * </p>
-   * For example:
-   * <pre>assertThat("myStringOfNote", startsWith("my"))</pre>
-   * 
-   * @param prefix
-   *      the substring that the returned matcher will expect at the start of any examined string
-   */
-  public static org.hamcrest.Matcher<java.lang.String> startsWith(java.lang.String prefix) {
-    return org.hamcrest.core.StringStartsWith.startsWith(prefix);
-  }
-
-  /**
-   * <p>
-   * Creates a matcher that matches if the examined {@link String} starts with the specified
-   * {@link String}, ignoring case
-   * </p>
-   * For example:
-   * <pre>assertThat("myStringOfNote", startsWith("my"))</pre>
-   * 
-   * @param prefix
-   *      the substring that the returned matcher will expect at the start of any examined string
-   */
-  public static org.hamcrest.Matcher<java.lang.String> startsWithIgnoringCase(java.lang.String prefix) {
-    return org.hamcrest.core.StringStartsWith.startsWithIgnoringCase(prefix);
-  }
-
-  /**
-   * Creates a matcher that matches if the examined {@link String} ends with the specified
-   * {@link String}.
-   * For example:
-   * <pre>assertThat("myStringOfNote", endsWith("Note"))</pre>
-   * 
-   * @param suffix
-   *      the substring that the returned matcher will expect at the end of any examined string
-   */
-  public static org.hamcrest.Matcher<java.lang.String> endsWith(java.lang.String suffix) {
-    return org.hamcrest.core.StringEndsWith.endsWith(suffix);
-  }
-
-  /**
-   * Creates a matcher that matches if the examined {@link String} ends with the specified
-   * {@link String}, ignoring case.
-   * For example:
-   * <pre>assertThat("myStringOfNote", endsWith("Note"))</pre>
-   * 
-   * @param suffix
-   *      the substring that the returned matcher will expect at the end of any examined string
-   */
-  public static org.hamcrest.Matcher<java.lang.String> endsWithIgnoringCase(java.lang.String suffix) {
-    return org.hamcrest.core.StringEndsWith.endsWithIgnoringCase(suffix);
+  public static <T> org.hamcrest.Matcher<T> describedAs(java.lang.String description, org.hamcrest.Matcher<T> matcher, java.lang.Object... values) {
+    return org.hamcrest.core.DescribedAs.describedAs(description, matcher, values);
   }
 
 }
diff --git a/hamcrest-core/src/main/java/org/hamcrest/CustomMatcher.java b/hamcrest-core/src/main/java/org/hamcrest/CustomMatcher.java
deleted file mode 100644
index 036a764..0000000
--- a/hamcrest-core/src/main/java/org/hamcrest/CustomMatcher.java
+++ /dev/null
@@ -1,37 +0,0 @@
-package org.hamcrest;
-
-/**
- * Utility class for writing one off matchers.
- * For example:
- * <pre>
- * Matcher&lt;String&gt; aNonEmptyString = new CustomMatcher&lt;String&gt;("a non empty string") {
- *   public boolean matches(Object object) {
- *     return ((object instanceof String) &amp;&amp; !((String) object).isEmpty();
- *   }
- * };
- * </pre>
- * <p>
- * This class is designed for scenarios where an anonymous inner class
- * matcher makes sense. It should not be used by API designers implementing
- * matchers.
- *
- * @author Neil Dunn
- * @see CustomTypeSafeMatcher for a type safe variant of this class that you probably
- *  want to use.
- * @param <T> The type of object being matched.
- */
-public abstract class CustomMatcher<T> extends BaseMatcher<T> {
-    private final String fixedDescription;
-
-    public CustomMatcher(String description) {
-        if (description == null) {
-            throw new IllegalArgumentException("Description should be non null!");
-        }
-        this.fixedDescription = description;
-    }
-
-    @Override
-    public final void describeTo(Description description) {
-        description.appendText(fixedDescription);
-    }
-}
diff --git a/hamcrest-core/src/main/java/org/hamcrest/CustomTypeSafeMatcher.java b/hamcrest-core/src/main/java/org/hamcrest/CustomTypeSafeMatcher.java
deleted file mode 100644
index 7c5c46c..0000000
--- a/hamcrest-core/src/main/java/org/hamcrest/CustomTypeSafeMatcher.java
+++ /dev/null
@@ -1,39 +0,0 @@
-package org.hamcrest;
-
-
-/**
- * Utility class for writing one off matchers.
- * For example:
- * <pre>
- * Matcher&lt;String&gt; aNonEmptyString = new CustomTypeSafeMatcher&lt;String&gt;("a non empty string") {
- *   public boolean matchesSafely(String string) {
- *     return !string.isEmpty();
- *   }
- *   public void describeMismatchSafely(String string, Description mismatchDescription) {
- *     mismatchDescription.appendText("was empty");
- *   }
- * };
- * </pre>
- * This is a variant of {@link CustomMatcher} that first type checks
- * the argument being matched. By the time {@link TypeSafeMatcher#matchesSafely} is
- * is called the argument is guaranteed to be non-null and of the correct
- * type.
- *
- * @author Neil Dunn
- * @param <T> The type of object being matched
- */
-public abstract class CustomTypeSafeMatcher<T> extends TypeSafeMatcher<T> {
-    private final String fixedDescription;
-
-    public CustomTypeSafeMatcher(String description) {
-        if (description == null) {
-            throw new IllegalArgumentException("Description must be non null!");
-        }
-        this.fixedDescription = description;
-    }
-
-    @Override
-    public final void describeTo(Description description) {
-        description.appendText(fixedDescription);
-    }
-}
diff --git a/hamcrest-core/src/main/java/org/hamcrest/Description.java b/hamcrest-core/src/main/java/org/hamcrest/Description.java
index 73bfa38..36ddeda 100644
--- a/hamcrest-core/src/main/java/org/hamcrest/Description.java
+++ b/hamcrest-core/src/main/java/org/hamcrest/Description.java
@@ -1,89 +1,44 @@
-package org.hamcrest;
-
-/**
- * A description of a Matcher. A Matcher will describe itself to a description
- * which can later be used for reporting.
- *
- * @see Matcher#describeTo(Description)
- */
-public interface Description {
-  /**
-   * A description that consumes input but does nothing.
-   */
-  static final Description NONE = new NullDescription();
-  
-    /**
-     * Appends some plain text to the description.
-     */
-    Description appendText(String text);
-
-    /**
-     * Appends the description of a {@link SelfDescribing} value to this description.
-     */
-    Description appendDescriptionOf(SelfDescribing value);
-
-    /**
-     * Appends an arbitrary value to the description.
-     */
-    Description appendValue(Object value);
-
-    /**
-     * Appends a list of values to the description.
-     */
-    <T> Description appendValueList(String start, String separator, String end,
-                                    T... values);
-
-    /**
-     * Appends a list of values to the description.
-     */
-    <T> Description appendValueList(String start, String separator, String end,
-                                    Iterable<T> values);
-
-    /**
-     * Appends a list of {@link org.hamcrest.SelfDescribing} objects
-     * to the description.
-     */
-    Description appendList(String start, String separator, String end,
-                           Iterable<? extends SelfDescribing> values);
-
-
-    public static final class NullDescription implements Description {
-      @Override
-      public Description appendDescriptionOf(SelfDescribing value) {
-        return this;
-      }
-
-      @Override
-      public Description appendList(String start, String separator,
-          String end, Iterable<? extends SelfDescribing> values) {
-        return this;
-      }
-
-      @Override
-      public Description appendText(String text) {
-        return this;
-      }
-
-      @Override
-      public Description appendValue(Object value) {
-        return this;
-      }
-
-      @Override
-      public <T> Description appendValueList(String start, String separator,
-          String end, T... values) {
-        return this;
-      }
-
-      @Override
-      public <T> Description appendValueList(String start, String separator,
-          String end, Iterable<T> values) {
-        return this;
-      }
-
-      @Override
-        public String toString() {
-          return "";
-        }
-    }
-}
+package org.hamcrest;
+
+/**
+ * A description of a Matcher. A Matcher will describe itself to a description
+ * which can later be used for reporting.
+ *
+ * @see Matcher#describeTo(Description)
+ */
+public interface Description {
+
+    /**
+     * Appends some plain text to the description.
+     */
+    Description appendText(String text);
+    
+    /**
+     * Appends the description of a {@link SelfDescribing} value to this description.
+     */
+    Description appendDescriptionOf(SelfDescribing value);
+    
+    /**
+     * Appends an arbitary value to the description.
+     */
+    Description appendValue(Object value);
+    
+    /**
+     * Appends a list of values to the description.
+     */
+    <T> Description appendValueList(String start, String separator, String end,
+    							    T... values);
+
+    /**
+     * Appends a list of values to the description.
+     */
+    <T> Description appendValueList(String start, String separator, String end,
+    							    Iterable<T> values);
+    
+    /** 
+     * Appends a list of {@link org.hamcrest.SelfDescribing} objects
+     * to the description. 
+     */
+    Description appendList(String start, String separator, String end, 
+                           Iterable<? extends SelfDescribing> values);
+}
diff --git a/hamcrest-core/src/main/java/org/hamcrest/DiagnosingMatcher.java b/hamcrest-core/src/main/java/org/hamcrest/DiagnosingMatcher.java
deleted file mode 100644
index f87de2d..0000000
--- a/hamcrest-core/src/main/java/org/hamcrest/DiagnosingMatcher.java
+++ /dev/null
@@ -1,21 +0,0 @@
-package org.hamcrest;
-
-/**
- * TODO(ngd): Document.
- *
- * @param <T>
- */
-public abstract class DiagnosingMatcher<T> extends BaseMatcher<T> {
-
-    @Override
-    public final boolean matches(Object item) {
-        return matches(item, Description.NONE);
-    }
-
-    @Override
-    public final void describeMismatch(Object item, Description mismatchDescription) {
-        matches(item, mismatchDescription);
-    }
-
-    protected abstract boolean matches(Object item, Description mismatchDescription);
-}
diff --git a/hamcrest-core/src/main/java/org/hamcrest/Factory.java b/hamcrest-core/src/main/java/org/hamcrest/Factory.java
index 99a5132..a8bf5f9 100644
--- a/hamcrest-core/src/main/java/org/hamcrest/Factory.java
+++ b/hamcrest-core/src/main/java/org/hamcrest/Factory.java
@@ -1,20 +1,17 @@
 package org.hamcrest;
 
-import java.lang.annotation.Retention;
-import java.lang.annotation.Target;
-
 import static java.lang.annotation.ElementType.METHOD;
+import java.lang.annotation.Retention;
 import static java.lang.annotation.RetentionPolicy.RUNTIME;
+import java.lang.annotation.Target;
 
 /**
  * Marks a Hamcrest static factory method so tools recognise them.
  * A factory method is an equivalent to a named constructor.
- *
- * @deprecated The code generator is no longer maintained. Write classes of syntactic sugar by hand.
+ * 
  * @author Joe Walnes
  */
 @Retention(RUNTIME)
 @Target({METHOD})
-@Deprecated
 public @interface Factory {
 }
diff --git a/hamcrest-core/src/main/java/org/hamcrest/FeatureMatcher.java b/hamcrest-core/src/main/java/org/hamcrest/FeatureMatcher.java
deleted file mode 100644
index 385cf99..0000000
--- a/hamcrest-core/src/main/java/org/hamcrest/FeatureMatcher.java
+++ /dev/null
@@ -1,54 +0,0 @@
-package org.hamcrest;
-
-import org.hamcrest.internal.ReflectiveTypeFinder;
-
-/**
- * Supporting class for matching a feature of an object. Implement <code>featureValueOf()</code>
- * in a subclass to pull out the feature to be matched against. 
- *
- * @param <T> The type of the object to be matched
- * @param <U> The type of the feature to be matched
- */
-public abstract class FeatureMatcher<T, U> extends TypeSafeDiagnosingMatcher<T> {
-  private static final ReflectiveTypeFinder TYPE_FINDER = new ReflectiveTypeFinder("featureValueOf", 1, 0); 
-  private final Matcher<? super U> subMatcher;
-  private final String featureDescription;
-  private final String featureName;
-  
-  /**
-   * Constructor
-   * @param subMatcher The matcher to apply to the feature
-   * @param featureDescription Descriptive text to use in describeTo
-   * @param featureName Identifying text for mismatch message
-   */
-  public FeatureMatcher(Matcher<? super U> subMatcher, String featureDescription, String featureName) {
-    super(TYPE_FINDER);
-    this.subMatcher = subMatcher;
-    this.featureDescription = featureDescription;
-    this.featureName = featureName;
-  }
-  
-  /**
-   * Implement this to extract the interesting feature.
-   * @param actual the target object
-   * @return the feature to be matched
-   */
-  protected abstract U featureValueOf(T actual);
-
-  @Override
-  protected boolean matchesSafely(T actual, Description mismatch) {
-    final U featureValue = featureValueOf(actual);
-    if (!subMatcher.matches(featureValue)) {
-      mismatch.appendText(featureName).appendText(" ");
-      subMatcher.describeMismatch(featureValue, mismatch);
-      return false;
-    }
-    return true;
-  }
-      
-  @Override
-  public final void describeTo(Description description) {
-    description.appendText(featureDescription).appendText(" ")
-               .appendDescriptionOf(subMatcher);
-  }
-}
diff --git a/hamcrest-core/src/main/java/org/hamcrest/Matcher.java b/hamcrest-core/src/main/java/org/hamcrest/Matcher.java
index 3ac1a53..fd10207 100644
--- a/hamcrest-core/src/main/java/org/hamcrest/Matcher.java
+++ b/hamcrest-core/src/main/java/org/hamcrest/Matcher.java
@@ -1,31 +1,32 @@
+/*  Copyright (c) 2000-2006 hamcrest.org
+ */
 package org.hamcrest;
 
 /**
- * <p>
  * A matcher over acceptable values.
  * A matcher is able to describe itself to give feedback when it fails.
- * </p>
- * <p>
+ * <p/>
  * Matcher implementations should <b>NOT directly implement this interface</b>.
  * Instead, <b>extend</b> the {@link BaseMatcher} abstract class,
  * which will ensure that the Matcher API can grow to support
  * new features and remain compatible with all Matcher implementations.
- * </p>
- * <p>
- * N.B. Well designed matchers should be immutable.
- * </p>
+ * <p/>
+ * For easy access to common Matcher implementations, use the static factory
+ * methods in {@link CoreMatchers}.
  *
+ * @see CoreMatchers
  * @see BaseMatcher
  */
+@SuppressWarnings({"unused", "UnusedDeclaration"})
 public interface Matcher<T> extends SelfDescribing {
 
     /**
      * Evaluates the matcher for argument <var>item</var>.
-     *
+     * <p/>
      * This method matches against Object, instead of the generic type T. This is
      * because the caller of the Matcher does not know at runtime what the type is
      * (because of type erasure with Java generics). It is down to the implementations
-     * to check the correct type.
+     * to check the correct type. 
      *
      * @param item the object against which the matcher is evaluated.
      * @return <code>true</code> if <var>item</var> matches, otherwise <code>false</code>.
@@ -33,19 +34,6 @@
      * @see BaseMatcher
      */
     boolean matches(Object item);
-    
-    /**
-     * Generate a description of why the matcher has not accepted the item.
-     * The description will be part of a larger description of why a matching
-     * failed, so it should be concise. 
-     * This method assumes that <code>matches(item)</code> is false, but 
-     * will not check this.
-     *
-     * @param item The item that the Matcher has rejected.
-     * @param mismatchDescription
-     *     The description to be built or appended to.
-     */
-    void describeMismatch(Object item, Description mismatchDescription);
 
     /**
      * This method simply acts a friendly reminder not to implement Matcher directly and
@@ -54,8 +42,6 @@
      *
      * @see Matcher for reasons why.
      * @see BaseMatcher
-     * @deprecated to make
      */
-    @Deprecated
     void _dont_implement_Matcher___instead_extend_BaseMatcher_();
 }
diff --git a/hamcrest-core/src/main/java/org/hamcrest/MatcherAssert.java b/hamcrest-core/src/main/java/org/hamcrest/MatcherAssert.java
index 049e1df..3eb234a 100644
--- a/hamcrest-core/src/main/java/org/hamcrest/MatcherAssert.java
+++ b/hamcrest-core/src/main/java/org/hamcrest/MatcherAssert.java
@@ -1,27 +1,24 @@
-package org.hamcrest;
-
-
-public class MatcherAssert {
-    public static <T> void assertThat(T actual, Matcher<? super T> matcher) {
-        assertThat("", actual, matcher);
-    }
-    
-    public static <T> void assertThat(String reason, T actual, Matcher<? super T> matcher) {
-        if (!matcher.matches(actual)) {
-            Description description = new StringDescription();
-            description.appendText(reason)
-                       .appendText("\nExpected: ")
-                       .appendDescriptionOf(matcher)
-                       .appendText("\n     but: ");
-            matcher.describeMismatch(actual, description);
-            
-            throw new AssertionError(description.toString());
-        }
-    }
-    
-    public static void assertThat(String reason, boolean assertion) {
-        if (!assertion) {
-            throw new AssertionError(reason);
-        }
-    }
-}
+/*  Copyright (c) 2000-2006 hamcrest.org
+ */
+package org.hamcrest;
+
+
+public class MatcherAssert {
+    public static <T> void assertThat(T actual, Matcher<T> matcher) {
+        assertThat("", actual, matcher);
+    }
+    
+    public static <T> void assertThat(String reason, T actual, Matcher<T> matcher) {
+        if (!matcher.matches(actual)) {
+            Description description = new StringDescription();
+            description.appendText(reason)
+                       .appendText("\nExpected: ")
+                       .appendDescriptionOf(matcher)
+                       .appendText("\n     got: ")
+                       .appendValue(actual)
+                       .appendText("\n");
+            
+            throw new java.lang.AssertionError(description.toString());
+        }
+    }
+}
diff --git a/hamcrest-core/src/main/java/org/hamcrest/SelfDescribing.java b/hamcrest-core/src/main/java/org/hamcrest/SelfDescribing.java
index 06b361d..cd53070 100644
--- a/hamcrest-core/src/main/java/org/hamcrest/SelfDescribing.java
+++ b/hamcrest-core/src/main/java/org/hamcrest/SelfDescribing.java
@@ -12,5 +12,5 @@
      * @param description
      *     The description to be built or appended to.
      */
-    void describeTo(Description description);
+	void describeTo(Description description);
 }
\ No newline at end of file
diff --git a/hamcrest-core/src/main/java/org/hamcrest/StringDescription.java b/hamcrest-core/src/main/java/org/hamcrest/StringDescription.java
index 813c178..66709ee 100644
--- a/hamcrest-core/src/main/java/org/hamcrest/StringDescription.java
+++ b/hamcrest-core/src/main/java/org/hamcrest/StringDescription.java
@@ -1,63 +1,60 @@
-package org.hamcrest;
-
-import java.io.IOException;
-
-/**
- * A {@link Description} that is stored as a string.
- */
-public class StringDescription extends BaseDescription {
-    private final Appendable out;
-
-    public StringDescription() {
-        this(new StringBuilder());
-    }
-
-    public StringDescription(Appendable out) {
-        this.out = out;
-    }
-    
-    /**
-     * Return the description of a {@link SelfDescribing} object as a String.
-     * 
-     * @param selfDescribing
-     *   The object to be described.
-     * @return
-     *   The description of the object.
-     */
-    public static String toString(SelfDescribing selfDescribing) {
-        return new StringDescription().appendDescriptionOf(selfDescribing).toString();
-    }
-
-    /**
-     * Alias for {@link #toString(SelfDescribing)}.
-     */
-    public static String asString(SelfDescribing selfDescribing) {
-        return toString(selfDescribing);
-    }
-
-    @Override
-    protected void append(String str) {
-        try {
-            out.append(str);
-        } catch (IOException e) {
-            throw new RuntimeException("Could not write description", e);
-        }
-    }
-
-    @Override
-    protected void append(char c) {
-        try {
-            out.append(c);
-        } catch (IOException e) {
-            throw new RuntimeException("Could not write description", e);
-        }
-    }
-    
-    /**
-     * Returns the description as a string.
-     */
-    @Override
-    public String toString() {
-        return out.toString();
-    }
-}
+package org.hamcrest;
+
+import java.io.IOException;
+
+/**
+ * A {@link Description} that is stored as a string.
+ */
+public class StringDescription extends BaseDescription {
+    private final Appendable out;
+
+    public StringDescription() {
+        this(new StringBuilder());
+    }
+
+    public StringDescription(Appendable out) {
+        this.out = out;
+    }
+    
+    /**
+     * Return the description of a {@link SelfDescribing} object as a String.
+     * 
+     * @param selfDescribing
+     *   The object to be described.
+     * @return
+     *   The description of the object.
+     */
+    public static String toString(SelfDescribing value) {
+    	return new StringDescription().appendDescriptionOf(value).toString();
+    }
+
+    /**
+     * Alias for {@link #toString(SelfDescribing)}.
+     */
+    public static String asString(SelfDescribing selfDescribing) {
+        return toString(selfDescribing);
+    }
+
+    protected void append(String str) {
+        try {
+            out.append(str);
+        } catch (IOException e) {
+            throw new RuntimeException("Could not write description", e);
+        }
+    }
+
+    protected void append(char c) {
+        try {
+            out.append(c);
+        } catch (IOException e) {
+            throw new RuntimeException("Could not write description", e);
+        }
+    }
+    
+    /**
+     * Returns the description as a string.
+     */
+    public String toString() {
+        return out.toString();
+    }
+}
diff --git a/hamcrest-core/src/main/java/org/hamcrest/TypeSafeDiagnosingMatcher.java b/hamcrest-core/src/main/java/org/hamcrest/TypeSafeDiagnosingMatcher.java
deleted file mode 100644
index c204120..0000000
--- a/hamcrest-core/src/main/java/org/hamcrest/TypeSafeDiagnosingMatcher.java
+++ /dev/null
@@ -1,69 +0,0 @@
-package org.hamcrest;
-
-import org.hamcrest.internal.ReflectiveTypeFinder;
-
-
-/**
- * Convenient base class for Matchers that require a non-null value of a specific type
- * and that will report why the received value has been rejected.
- * This implements the null check, checks the type and then casts. 
- * To use, implement <pre>matchesSafely()</pre>. 
- *
- * @param <T>
- * @author Neil Dunn
- * @author Nat Pryce
- * @author Steve Freeman
- */
-public abstract class TypeSafeDiagnosingMatcher<T> extends BaseMatcher<T> {
-    private static final ReflectiveTypeFinder TYPE_FINDER = new ReflectiveTypeFinder("matchesSafely", 2, 0); 
-    private final Class<?> expectedType;
-
-    /**
-     * Subclasses should implement this. The item will already have been checked
-     * for the specific type and will never be null.
-     */
-    protected abstract boolean matchesSafely(T item, Description mismatchDescription);
-
-    /**
-     * Use this constructor if the subclass that implements <code>matchesSafely</code> 
-     * is <em>not</em> the class that binds &lt;T&gt; to a type. 
-     * @param expectedType The expectedType of the actual value.
-     */
-    protected TypeSafeDiagnosingMatcher(Class<?> expectedType) {
-      this.expectedType = expectedType;
-    }
-
-    /**
-     * Use this constructor if the subclass that implements <code>matchesSafely</code> 
-     * is <em>not</em> the class that binds &lt;T&gt; to a type. 
-     * @param typeFinder A type finder to extract the type
-     */
-    protected TypeSafeDiagnosingMatcher(ReflectiveTypeFinder typeFinder) {
-      this.expectedType = typeFinder.findExpectedType(getClass()); 
-    }
-
-    /**
-     * The default constructor for simple sub types
-     */
-    protected TypeSafeDiagnosingMatcher() {
-      this(TYPE_FINDER); 
-    }
-
-    @Override
-    @SuppressWarnings("unchecked")
-    public final boolean matches(Object item) {
-        return item != null
-            && expectedType.isInstance(item)
-            && matchesSafely((T) item, new Description.NullDescription());
-    }
-
-    @SuppressWarnings("unchecked")
-    @Override
-    public final void describeMismatch(Object item, Description mismatchDescription) {
-      if (item == null || !expectedType.isInstance(item)) {
-        super.describeMismatch(item, mismatchDescription);
-      } else {
-        matchesSafely((T) item, mismatchDescription);
-      }
-    }
-}
diff --git a/hamcrest-core/src/main/java/org/hamcrest/TypeSafeMatcher.java b/hamcrest-core/src/main/java/org/hamcrest/TypeSafeMatcher.java
index 08dfce8..7f18fd3 100644
--- a/hamcrest-core/src/main/java/org/hamcrest/TypeSafeMatcher.java
+++ b/hamcrest-core/src/main/java/org/hamcrest/TypeSafeMatcher.java
@@ -1,85 +1,58 @@
 package org.hamcrest;
 
-import org.hamcrest.internal.ReflectiveTypeFinder;
+import java.lang.reflect.Method;
 
 /**
  * Convenient base class for Matchers that require a non-null value of a specific type.
  * This simply implements the null check, checks the type and then casts.
  *
  * @author Joe Walnes
- * @author Steve Freeman
- * @author Nat Pryce
  */
 public abstract class TypeSafeMatcher<T> extends BaseMatcher<T> {
-    private static final ReflectiveTypeFinder TYPE_FINDER = new ReflectiveTypeFinder("matchesSafely", 1, 0);
-    
-    final private Class<?> expectedType;
 
-    /**
-     * The default constructor for simple sub types
-     */
-    protected TypeSafeMatcher() {
-        this(TYPE_FINDER);
-    }
-   
-    /**
-     * Use this constructor if the subclass that implements <code>matchesSafely</code> 
-     * is <em>not</em> the class that binds &lt;T&gt; to a type. 
-     * @param expectedType The expectedType of the actual value.
-     */
-    protected TypeSafeMatcher(Class<?> expectedType) {
-        this.expectedType = expectedType;
-    }
-    
-    /**
-     * Use this constructor if the subclass that implements <code>matchesSafely</code> 
-     * is <em>not</em> the class that binds &lt;T&gt; to a type. 
-     * @param typeFinder A type finder to extract the type
-     */
-    protected TypeSafeMatcher(ReflectiveTypeFinder typeFinder) {
-      this.expectedType = typeFinder.findExpectedType(getClass()); 
-    }
- 
+    private Class expectedType;
+
     /**
      * Subclasses should implement this. The item will already have been checked for
      * the specific type and will never be null.
      */
-    protected abstract boolean matchesSafely(T item);
-    
-    /**
-     * Subclasses should override this. The item will already have been checked for
-     * the specific type and will never be null.
-     */
-    protected void describeMismatchSafely(T item, Description mismatchDescription) {
-        super.describeMismatch(item, mismatchDescription);
+    public abstract boolean matchesSafely(T item);
+
+    protected TypeSafeMatcher() {
+        expectedType = findExpectedType(getClass());
     }
     
+    private static Class<?> findExpectedType(Class<?> fromClass) {
+        for (Class<?> c = fromClass; c != Object.class; c = c.getSuperclass()) {
+            for (Method method : c.getDeclaredMethods()) {
+                if (isMatchesSafelyMethod(method)) {
+                    return method.getParameterTypes()[0];
+                }
+            }
+        }
+        
+        throw new Error("Cannot determine correct type for matchesSafely() method.");
+    }
+    
+    private static boolean isMatchesSafelyMethod(Method method) {
+        return method.getName().equals("matchesSafely") 
+            && method.getParameterTypes().length == 1
+            && !method.isSynthetic(); 
+    }
+    
+    protected TypeSafeMatcher(Class<T> expectedType) {
+    	this.expectedType = expectedType;
+    }
+
     /**
-     * Methods made final to prevent accidental override.
+     * Method made final to prevent accidental override.
      * If you need to override this, there's no point on extending TypeSafeMatcher.
      * Instead, extend the {@link BaseMatcher}.
      */
-    @Override
     @SuppressWarnings({"unchecked"})
     public final boolean matches(Object item) {
         return item != null
                 && expectedType.isInstance(item)
                 && matchesSafely((T) item);
     }
-    
-    @SuppressWarnings("unchecked")
-    @Override
-    final public void describeMismatch(Object item, Description description) {
-        if (item == null) {
-            super.describeMismatch(null, description);
-        } else if (! expectedType.isInstance(item)) {
-            description.appendText("was a ")
-                       .appendText(item.getClass().getName())
-                       .appendText(" (")
-                       .appendValue(item)
-                       .appendText(")");
-        } else {
-            describeMismatchSafely((T)item, description);
-        }
-    }
 }
diff --git a/hamcrest-core/src/main/java/org/hamcrest/core/AllOf.java b/hamcrest-core/src/main/java/org/hamcrest/core/AllOf.java
index 3b7e56c..f619a7d 100644
--- a/hamcrest-core/src/main/java/org/hamcrest/core/AllOf.java
+++ b/hamcrest-core/src/main/java/org/hamcrest/core/AllOf.java
@@ -1,57 +1,51 @@
 package org.hamcrest.core;
 
-import org.hamcrest.Description;
-import org.hamcrest.DiagnosingMatcher;
+import org.hamcrest.BaseMatcher;
 import org.hamcrest.Matcher;
+import org.hamcrest.Description;
+import org.hamcrest.Factory;
 
 import java.util.Arrays;
-import java.util.List;
 
 /**
- * Calculates the logical conjunction of multiple matchers. Evaluation is shortcut, so
- * subsequent matchers are not called if an earlier matcher returns <code>false</code>.
+ * Calculates the logical conjunction of two matchers. Evaluation is
+ * shortcut, so that the second matcher is not called if the first
+ * matcher returns <code>false</code>.
  */
-public class AllOf<T> extends DiagnosingMatcher<T> {
+public class AllOf<T> extends BaseMatcher<T> {
+    private final Iterable<Matcher<? extends T>> matchers;
 
-    private final Iterable<Matcher<? super T>> matchers;
-
-    public AllOf(Iterable<Matcher<? super T>> matchers) {
+    public AllOf(Iterable<Matcher<? extends T>> matchers) {
         this.matchers = matchers;
     }
 
-    @Override
-    public boolean matches(Object o, Description mismatch) {
-        for (Matcher<? super T> matcher : matchers) {
+    public boolean matches(Object o) {
+        for (Matcher<? extends T> matcher : matchers) {
             if (!matcher.matches(o)) {
-                mismatch.appendDescriptionOf(matcher).appendText(" ");
-                matcher.describeMismatch(o, mismatch);
-              return false;
+                return false;
             }
         }
         return true;
     }
 
-    @Override
     public void describeTo(Description description) {
-        description.appendList("(", " " + "and" + " ", ")", matchers);
+    	description.appendList("(", " and ", ")", matchers);
     }
 
     /**
-     * Creates a matcher that matches if the examined object matches <b>ALL</b> of the specified matchers.
-     * For example:
-     * <pre>assertThat("myValue", allOf(startsWith("my"), containsString("Val")))</pre>
+     * Evaluates to true only if ALL of the passed in matchers evaluate to true.
      */
-    public static <T> Matcher<T> allOf(Iterable<Matcher<? super T>> matchers) {
-        return new AllOf<>(matchers);
+    @Factory
+    public static <T> Matcher<T> allOf(Matcher<? extends T>... matchers) {
+        return allOf(Arrays.asList(matchers));
     }
 
     /**
-     * Creates a matcher that matches if the examined object matches <b>ALL</b> of the specified matchers.
-     * For example:
-     * <pre>assertThat("myValue", allOf(startsWith("my"), containsString("Val")))</pre>
+     * Evaluates to true only if ALL of the passed in matchers evaluate to true.
      */
-    @SafeVarargs
-    public static <T> Matcher<T> allOf(Matcher<? super T>... matchers) {
-      return allOf((List) Arrays.asList(matchers));
+    @Factory
+    public static <T> Matcher<T> allOf(Iterable<Matcher<? extends T>> matchers) {
+        return new AllOf<T>(matchers);
     }
+
 }
diff --git a/hamcrest-core/src/main/java/org/hamcrest/core/AnyOf.java b/hamcrest-core/src/main/java/org/hamcrest/core/AnyOf.java
index b7b423f..e7e9181 100644
--- a/hamcrest-core/src/main/java/org/hamcrest/core/AnyOf.java
+++ b/hamcrest-core/src/main/java/org/hamcrest/core/AnyOf.java
@@ -1,47 +1,51 @@
 package org.hamcrest.core;
 
-import org.hamcrest.Description;
+import org.hamcrest.BaseMatcher;
 import org.hamcrest.Matcher;
+import org.hamcrest.Description;
+import org.hamcrest.Factory;
 
 import java.util.Arrays;
-import java.util.List;
 
 /**
- * Calculates the logical disjunction of multiple matchers. Evaluation is shortcut, so
- * subsequent matchers are not called if an earlier matcher returns <code>true</code>.
+ * Calculates the logical disjunction of two matchers. Evaluation is
+ * shortcut, so that the second matcher is not called if the first
+ * matcher returns <code>true</code>.
  */
-public class AnyOf<T> extends ShortcutCombination<T> {
+public class AnyOf<T> extends BaseMatcher<T> {
 
-    public AnyOf(Iterable<Matcher<? super T>> matchers) {
-        super(matchers);
+    private final Iterable<Matcher<? extends T>> matchers;
+
+    public AnyOf(Iterable<Matcher<? extends T>> matchers) {
+        this.matchers = matchers;
     }
 
-    @Override
     public boolean matches(Object o) {
-        return matches(o, true);
+        for (Matcher<? extends T> matcher : matchers) {
+            if (matcher.matches(o)) {
+                return true;
+            }
+        }
+        return false;
     }
 
-    @Override
     public void describeTo(Description description) {
-        describeTo(description, "or");
+    	description.appendList("(", " or ", ")", matchers);
     }
 
     /**
-     * Creates a matcher that matches if the examined object matches <b>ANY</b> of the specified matchers.
-     * For example:
-     * <pre>assertThat("myValue", anyOf(startsWith("foo"), containsString("Val")))</pre>
+     * Evaluates to true if ANY of the passed in matchers evaluate to true.
      */
-    public static <T> AnyOf<T> anyOf(Iterable<Matcher<? super T>> matchers) {
-        return new AnyOf<>(matchers);
+    @Factory
+    public static <T> Matcher<T> anyOf(Matcher<? extends T>... matchers) {
+        return anyOf(Arrays.asList(matchers));
     }
-    
+
     /**
-     * Creates a matcher that matches if the examined object matches <b>ANY</b> of the specified matchers.
-     * For example:
-     * <pre>assertThat("myValue", anyOf(startsWith("foo"), containsString("Val")))</pre>
+     * Evaluates to true if ANY of the passed in matchers evaluate to true.
      */
-    @SafeVarargs
-    public static <T> AnyOf<T> anyOf(Matcher<? super T>... matchers) {
-      return anyOf((List) Arrays.asList(matchers));
+    @Factory
+    public static <T> Matcher<T> anyOf(Iterable<Matcher<? extends T>> matchers) {
+        return new AnyOf<T>(matchers);
     }
 }
diff --git a/hamcrest-core/src/main/java/org/hamcrest/core/CombinableMatcher.java b/hamcrest-core/src/main/java/org/hamcrest/core/CombinableMatcher.java
deleted file mode 100644
index 2414bbb..0000000
--- a/hamcrest-core/src/main/java/org/hamcrest/core/CombinableMatcher.java
+++ /dev/null
@@ -1,82 +0,0 @@
-package org.hamcrest.core;
-
-import org.hamcrest.Description;
-import org.hamcrest.Matcher;
-import org.hamcrest.TypeSafeDiagnosingMatcher;
-
-import java.util.ArrayList;
-
-public class CombinableMatcher<T> extends TypeSafeDiagnosingMatcher<T> {
-  private final Matcher<? super T> matcher;
-
-  public CombinableMatcher(Matcher<? super T> matcher) {
-    this.matcher = matcher;
-  }
-
-  @Override
-  protected boolean matchesSafely(T item, Description mismatch) {
-    if (!matcher.matches(item)) {
-      matcher.describeMismatch(item, mismatch);
-      return false;
-    }
-    return true;
-  }
-
-  @Override
-  public void describeTo(Description description) {
-    description.appendDescriptionOf(matcher);
-  }
-
-  public CombinableMatcher<T> and(Matcher<? super T> other) {
-    return new CombinableMatcher<T>(new AllOf<T>(templatedListWith(other)));
-  }
-
-  public CombinableMatcher<T> or(Matcher<? super T> other) {
-    return new CombinableMatcher<T>(new AnyOf<T>(templatedListWith(other)));
-  }
-
-  private ArrayList<Matcher<? super T>> templatedListWith(Matcher<? super T> other) {
-    ArrayList<Matcher<? super T>> matchers = new ArrayList<Matcher<? super T>>();
-    matchers.add(matcher);
-    matchers.add(other);
-    return matchers;
-  }
-
-  /**
-   * Creates a matcher that matches when both of the specified matchers match the examined object.
-   * For example:
-   * <pre>assertThat("fab", both(containsString("a")).and(containsString("b")))</pre>
-   */
-  public static <LHS> CombinableBothMatcher<LHS> both(Matcher<? super LHS> matcher) {
-    return new CombinableBothMatcher<LHS>(matcher);
-  }
-  
-  public static final class CombinableBothMatcher<X> {
-    private final Matcher<? super X> first;
-    public CombinableBothMatcher(Matcher<? super X> matcher) {
-        this.first = matcher;
-    }
-    public CombinableMatcher<X> and(Matcher<? super X> other) {
-      return new CombinableMatcher<X>(first).and(other);
-    }
-  }
-
-  /**
-   * Creates a matcher that matches when either of the specified matchers match the examined object.
-   * For example:
-   * <pre>assertThat("fan", either(containsString("a")).or(containsString("b")))</pre>
-   */
-  public static <LHS> CombinableEitherMatcher<LHS> either(Matcher<? super LHS> matcher) {
-    return new CombinableEitherMatcher<LHS>(matcher);
-  }
-  
-  public static final class CombinableEitherMatcher<X> {
-    private final Matcher<? super X> first;
-    public CombinableEitherMatcher(Matcher<? super X> matcher) {
-        this.first = matcher;
-    }
-    public CombinableMatcher<X> or(Matcher<? super X> other) {
-      return new CombinableMatcher<X>(first).or(other);
-    }
-  }
-}
diff --git a/hamcrest-core/src/main/java/org/hamcrest/core/DescribedAs.java b/hamcrest-core/src/main/java/org/hamcrest/core/DescribedAs.java
index 2387609..7b8c151 100644
--- a/hamcrest-core/src/main/java/org/hamcrest/core/DescribedAs.java
+++ b/hamcrest-core/src/main/java/org/hamcrest/core/DescribedAs.java
@@ -1,69 +1,55 @@
-package org.hamcrest.core;
-
-import org.hamcrest.BaseMatcher;
-import org.hamcrest.Description;
-import org.hamcrest.Matcher;
-
-import java.util.regex.Pattern;
-
-import static java.lang.Integer.parseInt;
-
-/**
- * Provides a custom description to another matcher.
- */
-public class DescribedAs<T> extends BaseMatcher<T> {
-    private final String descriptionTemplate;
-    private final Matcher<T> matcher;
-    private final Object[] values;
-    
-    private final static Pattern ARG_PATTERN = Pattern.compile("%([0-9]+)"); 
-    
-    public DescribedAs(String descriptionTemplate, Matcher<T> matcher, Object[] values) {
-        this.descriptionTemplate = descriptionTemplate;
-        this.matcher = matcher;
-        this.values = values.clone();
-    }
-    
-    @Override
-    public boolean matches(Object o) {
-        return matcher.matches(o);
-    }
-
-    @Override
-    public void describeTo(Description description) {
-        java.util.regex.Matcher arg = ARG_PATTERN.matcher(descriptionTemplate);
-        
-        int textStart = 0;
-        while (arg.find()) {
-            description.appendText(descriptionTemplate.substring(textStart, arg.start()));
-            description.appendValue(values[parseInt(arg.group(1))]);
-            textStart = arg.end();
-        }
-        
-        if (textStart < descriptionTemplate.length()) {
-            description.appendText(descriptionTemplate.substring(textStart));
-        }
-    }
-    
-    @Override
-    public void describeMismatch(Object item, Description description) {
-        matcher.describeMismatch(item, description);
-    }
-
-    /**
-     * Wraps an existing matcher, overriding its description with that specified.  All other functions are
-     * delegated to the decorated matcher, including its mismatch description.
-     * For example:
-     * <pre>describedAs("a big decimal equal to %0", equalTo(myBigDecimal), myBigDecimal.toPlainString())</pre> 
-     * 
-     * @param description
-     *     the new description for the wrapped matcher
-     * @param matcher
-     *     the matcher to wrap
-     * @param values
-     *     optional values to insert into the tokenised description
-     */
-    public static <T> Matcher<T> describedAs(String description, Matcher<T> matcher, Object... values) {
-        return new DescribedAs<T>(description, matcher, values);
-    }
-}
+/*  Copyright (c) 2000-2006 hamcrest.org
+ */
+package org.hamcrest.core;
+
+import java.util.regex.Pattern;
+
+import org.hamcrest.Description;
+import org.hamcrest.Matcher;
+import org.hamcrest.Factory;
+import org.hamcrest.BaseMatcher;
+
+/**
+ * Provides a custom description to another matcher.
+ */
+public class DescribedAs<T> extends BaseMatcher<T> {
+    private final String descriptionTemplate;
+    private final Matcher<T> matcher;
+    private final Object[] values;
+    
+    private final static Pattern ARG_PATTERN = Pattern.compile("%([0-9]+)"); 
+    
+    public DescribedAs(String descriptionTemplate, Matcher<T> matcher, Object[] values) {
+        this.descriptionTemplate = descriptionTemplate;
+        this.matcher = matcher;
+        this.values = values.clone();
+    }
+    
+    public boolean matches(Object o) {
+        return matcher.matches(o);
+    }
+
+    public void describeTo(Description description) {
+        java.util.regex.Matcher arg = ARG_PATTERN.matcher(descriptionTemplate);
+        
+        int textStart = 0;
+        while (arg.find()) {
+            description.appendText(descriptionTemplate.substring(textStart, arg.start()));
+            int argIndex = Integer.parseInt(arg.group(1));
+            description.appendValue(values[argIndex]);
+            textStart = arg.end();
+        }
+        
+        if (textStart < descriptionTemplate.length()) {
+            description.appendText(descriptionTemplate.substring(textStart));
+        }
+    }
+
+    /**
+     * Wraps an existing matcher and overrides the description when it fails.
+     */
+    @Factory
+    public static <T> Matcher<T> describedAs(String description, Matcher<T> matcher, Object... values) {
+        return new DescribedAs<T>(description, matcher, values);
+    }
+}
diff --git a/hamcrest-core/src/main/java/org/hamcrest/core/Every.java b/hamcrest-core/src/main/java/org/hamcrest/core/Every.java
deleted file mode 100644
index 757b7b4..0000000
--- a/hamcrest-core/src/main/java/org/hamcrest/core/Every.java
+++ /dev/null
@@ -1,44 +0,0 @@
-package org.hamcrest.core;
-
-import org.hamcrest.Description;
-import org.hamcrest.Matcher;
-import org.hamcrest.TypeSafeDiagnosingMatcher;
-
-public class Every<T> extends TypeSafeDiagnosingMatcher<Iterable<? extends T>> {
-    private final Matcher<? super T> matcher;
-
-    public Every(Matcher<? super T> matcher) {
-        this.matcher= matcher;
-    }
-
-    @Override
-    public boolean matchesSafely(Iterable<? extends T> collection, Description mismatchDescription) {
-        for (T t : collection) {
-            if (!matcher.matches(t)) {
-                mismatchDescription.appendText("an item ");
-                matcher.describeMismatch(t, mismatchDescription);
-                return false;
-            }
-        }
-        return true;
-    }
-
-    @Override
-    public void describeTo(Description description) {
-        description.appendText("every item is ").appendDescriptionOf(matcher);
-    }
-
-    /**
-     * Creates a matcher for {@link Iterable}s that only matches when a single pass over the
-     * examined {@link Iterable} yields items that are all matched by the specified
-     * <code>itemMatcher</code>.
-     * For example:
-     * <pre>assertThat(Arrays.asList("bar", "baz"), everyItem(startsWith("ba")))</pre>
-     * 
-     * @param itemMatcher
-     *     the matcher to apply to every item provided by the examined {@link Iterable}
-     */
-    public static <U> Matcher<Iterable<? extends U>> everyItem(final Matcher<U> itemMatcher) {
-        return new Every<U>(itemMatcher);
-    }
-}
diff --git a/hamcrest-core/src/main/java/org/hamcrest/core/Is.java b/hamcrest-core/src/main/java/org/hamcrest/core/Is.java
index ec22238..f9152e9 100644
--- a/hamcrest-core/src/main/java/org/hamcrest/core/Is.java
+++ b/hamcrest-core/src/main/java/org/hamcrest/core/Is.java
@@ -1,76 +1,68 @@
 package org.hamcrest.core;
 
+import static org.hamcrest.core.IsInstanceOf.instanceOf;
+import static org.hamcrest.core.IsEqual.equalTo;
+import org.hamcrest.Factory;
+import org.hamcrest.Matcher;
 import org.hamcrest.BaseMatcher;
 import org.hamcrest.Description;
-import org.hamcrest.Matcher;
-
-import static org.hamcrest.core.IsEqual.equalTo;
-import static org.hamcrest.core.IsInstanceOf.instanceOf;
 
 /**
- * Decorates another Matcher, retaining the behaviour but allowing tests
+ * Decorates another Matcher, retaining the behavior but allowing tests
  * to be slightly more expressive.
  *
- * For example:  assertThat(cheese, equalTo(smelly))
- *          vs.  assertThat(cheese, is(equalTo(smelly)))
+ * eg. assertThat(cheese, equalTo(smelly))
+ * vs  assertThat(cheese, is(equalTo(smelly)))
  */
 public class Is<T> extends BaseMatcher<T> {
+
     private final Matcher<T> matcher;
 
     public Is(Matcher<T> matcher) {
         this.matcher = matcher;
     }
 
-    @Override
     public boolean matches(Object arg) {
         return matcher.matches(arg);
     }
 
-    @Override
     public void describeTo(Description description) {
         description.appendText("is ").appendDescriptionOf(matcher);
     }
-
-    @Override
-    public void describeMismatch(Object item, Description mismatchDescription) {
-        matcher.describeMismatch(item, mismatchDescription);
-    }
-
+    
     /**
-     * Decorates another Matcher, retaining its behaviour, but allowing tests
+     * Decorates another Matcher, retaining the behavior but allowing tests
      * to be slightly more expressive.
-     * For example:
-     * <pre>assertThat(cheese, is(equalTo(smelly)))</pre>
-     * instead of:
-     * <pre>assertThat(cheese, equalTo(smelly))</pre>
-     * 
+     *
+     * eg. assertThat(cheese, equalTo(smelly))
+     * vs  assertThat(cheese, is(equalTo(smelly)))
      */
+    @Factory
     public static <T> Matcher<T> is(Matcher<T> matcher) {
         return new Is<T>(matcher);
     }
 
     /**
-     * A shortcut to the frequently used <code>is(equalTo(x))</code>.
-     * For example:
-     * <pre>assertThat(cheese, is(smelly))</pre>
-     * instead of:
-     * <pre>assertThat(cheese, is(equalTo(smelly)))</pre>
-     * 
+     * This is a shortcut to the frequently used is(equalTo(x)).
+     *
+     * eg. assertThat(cheese, is(equalTo(smelly)))
+     * vs  assertThat(cheese, is(smelly))
      */
+    @Factory
     public static <T> Matcher<T> is(T value) {
         return is(equalTo(value));
     }
 
     /**
-     * A shortcut to the frequently used <code>is(instanceOf(SomeClass.class))</code>.
-     * For example:
-     * <pre>assertThat(cheese, isA(Cheddar.class))</pre>
-     * instead of:
-     * <pre>assertThat(cheese, is(instanceOf(Cheddar.class)))</pre>
-     * 
+     * This is a shortcut to the frequently used is(instanceOf(SomeClass.class)).
+     *
+     * eg. assertThat(cheese, is(instanceOf(Cheddar.class)))
+     * vs  assertThat(cheese, is(Cheddar.class))
      */
-    public static <T> Matcher<T> isA(Class<T> type) {
-        final Matcher<T> typeMatcher = instanceOf(type);
-        return is(typeMatcher);
+    @Factory
+    public static Matcher<Object> is(Class<?> type) {
+        return is(instanceOf(type));
     }
+
 }
+
diff --git a/hamcrest-core/src/main/java/org/hamcrest/core/IsAnything.java b/hamcrest-core/src/main/java/org/hamcrest/core/IsAnything.java
index 4c71a9b..c5ca49d 100644
--- a/hamcrest-core/src/main/java/org/hamcrest/core/IsAnything.java
+++ b/hamcrest-core/src/main/java/org/hamcrest/core/IsAnything.java
@@ -1,8 +1,11 @@
+/*  Copyright (c) 2000-2006 hamcrest.org
+ */
 package org.hamcrest.core;
 
-import org.hamcrest.BaseMatcher;
 import org.hamcrest.Description;
 import org.hamcrest.Matcher;
+import org.hamcrest.Factory;
+import org.hamcrest.BaseMatcher;
 
 
 /**
@@ -10,41 +13,47 @@
  */
 public class IsAnything<T> extends BaseMatcher<T> {
 
-    private final String message;
+    private final String description;
 
     public IsAnything() {
         this("ANYTHING");
     }
 
-    public IsAnything(String message) {
-        this.message = message;
+    public IsAnything(String description) {
+        this.description = description;
     }
 
-    @Override
     public boolean matches(Object o) {
         return true;
     }
 
-    @Override
     public void describeTo(Description description) {
-        description.appendText(message);
+        description.appendText(this.description);
     }
 
     /**
-     * Creates a matcher that always matches, regardless of the examined object.
+     * This matcher always evaluates to true.
      */
-    public static Matcher<Object> anything() {
-        return new IsAnything<Object>();
+    @Factory
+    public static <T> Matcher<T> anything() {
+        return new IsAnything<T>();
     }
 
     /**
-     * Creates a matcher that always matches, regardless of the examined object, but describes
-     * itself with the specified {@link String}.
+     * This matcher always evaluates to true.
      *
-     * @param description
-     *     a meaningful {@link String} used when describing itself
+     * @param description A meaningful string used when describing itself.
      */
-    public static Matcher<Object> anything(String description) {
-        return new IsAnything<Object>(description);
+    @Factory
+    public static <T> Matcher<T> anything(String description) {
+        return new IsAnything<T>(description);
+    }
+
+    /**
+     * This matcher always evaluates to true. With type inference.
+     */
+    @Factory
+    public static <T> Matcher<T> any(@SuppressWarnings("unused")Class<T> type) {
+        return new IsAnything<T>();
     }
 }
diff --git a/hamcrest-core/src/main/java/org/hamcrest/core/IsCollectionContaining.java b/hamcrest-core/src/main/java/org/hamcrest/core/IsCollectionContaining.java
deleted file mode 100644
index c55853d..0000000
--- a/hamcrest-core/src/main/java/org/hamcrest/core/IsCollectionContaining.java
+++ /dev/null
@@ -1,133 +0,0 @@
-package org.hamcrest.core;
-
-import org.hamcrest.Description;
-import org.hamcrest.Matcher;
-import org.hamcrest.TypeSafeDiagnosingMatcher;
-
-import java.util.ArrayList;
-import java.util.List;
-
-import static org.hamcrest.core.AllOf.allOf;
-import static org.hamcrest.core.IsEqual.equalTo;
-
-public class IsCollectionContaining<T> extends TypeSafeDiagnosingMatcher<Iterable<? super T>> {
-    private final Matcher<? super T> elementMatcher;
-
-    public IsCollectionContaining(Matcher<? super T> elementMatcher) {
-        this.elementMatcher = elementMatcher;
-    }
-
-    @Override
-    protected boolean matchesSafely(Iterable<? super T> collection, Description mismatchDescription) {
-        if (isEmpty(collection)) {
-          mismatchDescription.appendText("was empty");
-          return false;
-        }
-
-        for (Object item : collection) {
-            if (elementMatcher.matches(item)) {
-                return true;
-            }
-        }
-
-        mismatchDescription.appendText("mismatches were: [");
-        boolean isPastFirst = false;
-        for (Object item : collection) {
-            if (isPastFirst) {
-              mismatchDescription.appendText(", ");
-            }
-            elementMatcher.describeMismatch(item, mismatchDescription);
-            isPastFirst = true;
-        }
-        mismatchDescription.appendText("]");
-        return false;
-    }
-
-    private boolean isEmpty(Iterable<? super T> iterable) {
-      return ! iterable.iterator().hasNext();
-    }
-
-    @Override
-    public void describeTo(Description description) {
-        description
-            .appendText("a collection containing ")
-            .appendDescriptionOf(elementMatcher);
-    }
-
-    
-    /**
-     * Creates a matcher for {@link Iterable}s that only matches when a single pass over the
-     * examined {@link Iterable} yields at least one item that is matched by the specified
-     * <code>itemMatcher</code>.  Whilst matching, the traversal of the examined {@link Iterable}
-     * will stop as soon as a matching item is found.
-     * For example:
-     * <pre>assertThat(Arrays.asList("foo", "bar"), hasItem(startsWith("ba")))</pre>
-     * 
-     * @param itemMatcher
-     *     the matcher to apply to items provided by the examined {@link Iterable}
-     */
-    public static <T> Matcher<Iterable<? super T>> hasItem(Matcher<? super T> itemMatcher) {
-        return new IsCollectionContaining<>(itemMatcher);
-    }
-
-    /**
-     * Creates a matcher for {@link Iterable}s that only matches when a single pass over the
-     * examined {@link Iterable} yields at least one item that is equal to the specified
-     * <code>item</code>.  Whilst matching, the traversal of the examined {@link Iterable}
-     * will stop as soon as a matching item is found.
-     * For example:
-     * <pre>assertThat(Arrays.asList("foo", "bar"), hasItem("bar"))</pre>
-     * 
-     * @param item
-     *     the item to compare against the items provided by the examined {@link Iterable}
-     */
-    public static <T> Matcher<Iterable<? super T>> hasItem(T item) {
-        // Doesn't forward to hasItem() method so compiler can sort out generics.
-        return new IsCollectionContaining<>(equalTo(item));
-    }
-
-    /**
-     * Creates a matcher for {@link Iterable}s that matches when consecutive passes over the
-     * examined {@link Iterable} yield at least one item that is matched by the corresponding
-     * matcher from the specified <code>itemMatchers</code>.  Whilst matching, each traversal of
-     * the examined {@link Iterable} will stop as soon as a matching item is found.
-     * For example:
-     * <pre>assertThat(Arrays.asList("foo", "bar", "baz"), hasItems(endsWith("z"), endsWith("o")))</pre>
-     * 
-     * @param itemMatchers
-     *     the matchers to apply to items provided by the examined {@link Iterable}
-     */
-    @SafeVarargs
-    public static <T> Matcher<Iterable<T>> hasItems(Matcher<? super T>... itemMatchers) {
-        List<Matcher<? super Iterable<T>>> all = new ArrayList<>(itemMatchers.length);
-        
-        for (Matcher<? super T> elementMatcher : itemMatchers) {
-          // Doesn't forward to hasItem() method so compiler can sort out generics.
-          all.add(new IsCollectionContaining<>(elementMatcher));
-        }
-        
-        return allOf(all);
-    }
-    
-    /**
-     * Creates a matcher for {@link Iterable}s that matches when consecutive passes over the
-     * examined {@link Iterable} yield at least one item that is equal to the corresponding
-     * item from the specified <code>items</code>.  Whilst matching, each traversal of the
-     * examined {@link Iterable} will stop as soon as a matching item is found.
-     * For example:
-     * <pre>assertThat(Arrays.asList("foo", "bar", "baz"), hasItems("baz", "foo"))</pre>
-     * 
-     * @param items
-     *     the items to compare against the items provided by the examined {@link Iterable}
-     */
-    @SafeVarargs
-    public static <T> Matcher<Iterable<T>> hasItems(T... items) {
-        List<Matcher<? super Iterable<T>>> all = new ArrayList<>(items.length);
-        for (T item : items) {
-            all.add(hasItem(item));
-        }
-        
-        return allOf(all);
-    }
-
-}
diff --git a/hamcrest-core/src/main/java/org/hamcrest/core/IsEqual.java b/hamcrest-core/src/main/java/org/hamcrest/core/IsEqual.java
index 860e85e..b9f17c5 100644
--- a/hamcrest-core/src/main/java/org/hamcrest/core/IsEqual.java
+++ b/hamcrest-core/src/main/java/org/hamcrest/core/IsEqual.java
@@ -1,8 +1,11 @@
+/*  Copyright (c) 2000-2006 hamcrest.org
+ */
 package org.hamcrest.core;
 
-import org.hamcrest.BaseMatcher;
 import org.hamcrest.Description;
 import org.hamcrest.Matcher;
+import org.hamcrest.Factory;
+import org.hamcrest.BaseMatcher;
 
 import java.lang.reflect.Array;
 
@@ -12,47 +15,42 @@
  * {@link java.lang.Object#equals} invokedMethod?
  */
 public class IsEqual<T> extends BaseMatcher<T> {
-    private final Object expectedValue;
+    private final Object object;
 
     public IsEqual(T equalArg) {
-        expectedValue = equalArg;
+        object = equalArg;
     }
 
-    @Override
-    public boolean matches(Object actualValue) {
-        return areEqual(actualValue, expectedValue);
+    public boolean matches(Object arg) {
+        return areEqual(object, arg);
     }
 
-    @Override
     public void describeTo(Description description) {
-        description.appendValue(expectedValue);
+        description.appendValue(object);
     }
 
-    private static boolean areEqual(Object actual, Object expected) {
-        if (actual == null) {
-            return expected == null;
+    private static boolean areEqual(Object o1, Object o2) {
+        if (o1 == null || o2 == null) {
+            return o1 == null && o2 == null;
+        } else if (isArray(o1)) {
+            return isArray(o2) && areArraysEqual(o1, o2);
+        } else {
+            return o1.equals(o2);
         }
-        
-        if (expected != null && isArray(actual)) {
-            return isArray(expected) && areArraysEqual(actual, expected);
-        }
-        
-        return actual.equals(expected);
     }
 
-    private static boolean areArraysEqual(Object actualArray, Object expectedArray) {
-        return areArrayLengthsEqual(actualArray, expectedArray) && areArrayElementsEqual(actualArray, expectedArray);
+    private static boolean areArraysEqual(Object o1, Object o2) {
+        return areArrayLengthsEqual(o1, o2)
+                && areArrayElementsEqual(o1, o2);
     }
 
-    private static boolean areArrayLengthsEqual(Object actualArray, Object expectedArray) {
-        return Array.getLength(actualArray) == Array.getLength(expectedArray);
+    private static boolean areArrayLengthsEqual(Object o1, Object o2) {
+        return Array.getLength(o1) == Array.getLength(o2);
     }
 
-    private static boolean areArrayElementsEqual(Object actualArray, Object expectedArray) {
-        for (int i = 0; i < Array.getLength(actualArray); i++) {
-            if (!areEqual(Array.get(actualArray, i), Array.get(expectedArray, i))) {
-                return false;
-            }
+    private static boolean areArrayElementsEqual(Object o1, Object o2) {
+        for (int i = 0; i < Array.getLength(o1); i++) {
+            if (!areEqual(Array.get(o1, i), Array.get(o2, i))) return false;
         }
         return true;
     }
@@ -62,36 +60,12 @@
     }
 
     /**
-     * Creates a matcher that matches when the examined object is logically equal to the specified
-     * <code>operand</code>, as determined by calling the {@link java.lang.Object#equals} method on
-     * the <b>examined</b> object.
-     * 
-     * <p>If the specified operand is <code>null</code> then the created matcher will only match if
-     * the examined object's <code>equals</code> method returns <code>true</code> when passed a
-     * <code>null</code> (which would be a violation of the <code>equals</code> contract), unless the
-     * examined object itself is <code>null</code>, in which case the matcher will return a positive
-     * match.</p>
-     * 
-     * <p>The created matcher provides a special behaviour when examining <code>Array</code>s, whereby
-     * it will match if both the operand and the examined object are arrays of the same length and
-     * contain items that are equal to each other (according to the above rules) <b>in the same
-     * indexes</b>.</p> 
-     * For example:
-     * <pre>
-     * assertThat("foo", equalTo("foo"));
-     * assertThat(new String[] {"foo", "bar"}, equalTo(new String[] {"foo", "bar"}));
-     * </pre>
-     * 
+     * Is the value equal to another value, as tested by the
+     * {@link java.lang.Object#equals} invokedMethod?
      */
+    @Factory
     public static <T> Matcher<T> equalTo(T operand) {
         return new IsEqual<T>(operand);
     }
-
-    /**
-     * Creates an {@link org.hamcrest.core.IsEqual} matcher that does not enforce the values being
-     * compared to be of the same static type.
-     */
-    public static Matcher<Object> equalToObject(Object operand) {
-        return new IsEqual<Object>(operand);
-    }
+    
 }
diff --git a/hamcrest-core/src/main/java/org/hamcrest/core/IsInstanceOf.java b/hamcrest-core/src/main/java/org/hamcrest/core/IsInstanceOf.java
index 5a508c9..df20824 100644
--- a/hamcrest-core/src/main/java/org/hamcrest/core/IsInstanceOf.java
+++ b/hamcrest-core/src/main/java/org/hamcrest/core/IsInstanceOf.java
@@ -1,91 +1,44 @@
+/*  Copyright (c) 2000-2006 hamcrest.org
+ */
 package org.hamcrest.core;
 
 import org.hamcrest.Description;
-import org.hamcrest.DiagnosingMatcher;
 import org.hamcrest.Matcher;
+import org.hamcrest.Factory;
+import org.hamcrest.BaseMatcher;
 
 
 /**
  * Tests whether the value is an instance of a class.
- * Classes of basic types will be converted to the relevant "Object" classes
  */
-public class IsInstanceOf extends DiagnosingMatcher<Object> {
-    private final Class<?> expectedClass;
-    private final Class<?> matchableClass;
+public class IsInstanceOf extends BaseMatcher<Object> {
+    private final Class<?> theClass;
 
     /**
      * Creates a new instance of IsInstanceOf
      *
-     * @param expectedClass The predicate evaluates to true for instances of this class
+     * @param theClass The predicate evaluates to true for instances of this class
      *                 or one of its subclasses.
      */
-    public IsInstanceOf(Class<?> expectedClass) {
-        this.expectedClass = expectedClass;
-        this.matchableClass = matchableClass(expectedClass);
+    public IsInstanceOf(Class<?> theClass) {
+        this.theClass = theClass;
     }
 
-    private static Class<?> matchableClass(Class<?> expectedClass) {
-      if (boolean.class.equals(expectedClass)) return Boolean.class; 
-      if (byte.class.equals(expectedClass)) return Byte.class; 
-      if (char.class.equals(expectedClass)) return Character.class; 
-      if (double.class.equals(expectedClass)) return Double.class; 
-      if (float.class.equals(expectedClass)) return Float.class; 
-      if (int.class.equals(expectedClass)) return Integer.class; 
-      if (long.class.equals(expectedClass)) return Long.class; 
-      if (short.class.equals(expectedClass)) return Short.class; 
-      return expectedClass;
+    public boolean matches(Object item) {
+        return theClass.isInstance(item);
     }
 
-    @Override
-    protected boolean matches(Object item, Description mismatch) {
-      if (null == item) {
-        mismatch.appendText("null");
-        return false;
-      }
-      
-      if (!matchableClass.isInstance(item)) {
-        mismatch.appendValue(item).appendText(" is a " + item.getClass().getName());
-        return false;
-      }
-      
-      return true;
-    }
-
-    @Override
     public void describeTo(Description description) {
-        description.appendText("an instance of ").appendText(expectedClass.getName());
+        description.appendText("an instance of ")
+                .appendText(theClass.getName());
     }
 
     /**
-     * Creates a matcher that matches when the examined object is an instance of the specified <code>type</code>,
-     * as determined by calling the {@link java.lang.Class#isInstance(Object)} method on that type, passing the
-     * the examined object.
-     * 
-     * <p>The created matcher assumes no relationship between specified type and the examined object.</p>
-     * For example:
-     * <pre>assertThat(new Canoe(), instanceOf(Paddlable.class));</pre>
-     * 
+     * Is the value an instance of a particular type?
      */
-    @SuppressWarnings("unchecked")
-    public static <T> Matcher<T> instanceOf(Class<?> type) {
-        return (Matcher<T>) new IsInstanceOf(type);
-    }
-    
-    /**
-     * Creates a matcher that matches when the examined object is an instance of the specified <code>type</code>,
-     * as determined by calling the {@link java.lang.Class#isInstance(Object)} method on that type, passing the
-     * the examined object.
-     * 
-     * <p>The created matcher forces a relationship between specified type and the examined object, and should be
-     * used when it is necessary to make generics conform, for example in the JMock clause
-     * <code>with(any(Thing.class))</code></p>
-     * For example:
-     * <pre>assertThat(new Canoe(), instanceOf(Canoe.class));</pre>
-     *
-     */
-    @SuppressWarnings("unchecked")
-    public static <T> Matcher<T> any(Class<T> type) {
-        return (Matcher<T>) new IsInstanceOf(type);
+    @Factory
+    public static Matcher<Object> instanceOf(Class<?> type) {
+        return new IsInstanceOf(type);
     }
 
 }
diff --git a/hamcrest-core/src/main/java/org/hamcrest/core/IsNot.java b/hamcrest-core/src/main/java/org/hamcrest/core/IsNot.java
index d5cf9c0..cb6946c 100644
--- a/hamcrest-core/src/main/java/org/hamcrest/core/IsNot.java
+++ b/hamcrest-core/src/main/java/org/hamcrest/core/IsNot.java
@@ -1,57 +1,49 @@
+/*  Copyright (c) 2000-2006 hamcrest.org
+ */
 package org.hamcrest.core;
 
-import org.hamcrest.BaseMatcher;
+import static org.hamcrest.core.IsEqual.equalTo;
 import org.hamcrest.Description;
 import org.hamcrest.Matcher;
-
-import static org.hamcrest.core.IsEqual.equalTo;
+import org.hamcrest.Factory;
+import org.hamcrest.BaseMatcher;
 
 
 /**
  * Calculates the logical negation of a matcher.
  */
-public class IsNot<T> extends BaseMatcher<T>  {
+public class IsNot<T> extends BaseMatcher<T> {
     private final Matcher<T> matcher;
 
     public IsNot(Matcher<T> matcher) {
         this.matcher = matcher;
     }
 
-    @Override
     public boolean matches(Object arg) {
         return !matcher.matches(arg);
     }
 
-    @Override
     public void describeTo(Description description) {
         description.appendText("not ").appendDescriptionOf(matcher);
     }
 
-    
     /**
-     * Creates a matcher that wraps an existing matcher, but inverts the logic by which
-     * it will match.
-     * For example:
-     * <pre>assertThat(cheese, is(not(equalTo(smelly))))</pre>
-     * 
-     * @param matcher
-     *     the matcher whose sense should be inverted
+     * Inverts the rule.
      */
+    @Factory
     public static <T> Matcher<T> not(Matcher<T> matcher) {
         return new IsNot<T>(matcher);
     }
 
     /**
-     * A shortcut to the frequently used <code>not(equalTo(x))</code>.
-     * For example:
-     * <pre>assertThat(cheese, is(not(smelly)))</pre>
-     * instead of:
-     * <pre>assertThat(cheese, is(not(equalTo(smelly))))</pre>
-     * 
-     * @param value
-     *     the value that any examined object should <b>not</b> equal
+     * This is a shortcut to the frequently used not(equalTo(x)).
+     *
+     * eg. assertThat(cheese, is(not(equalTo(smelly))))
+     * vs  assertThat(cheese, is(not(smelly)))
      */
+    @Factory
     public static <T> Matcher<T> not(T value) {
         return not(equalTo(value));
     }
+
 }
diff --git a/hamcrest-core/src/main/java/org/hamcrest/core/IsNull.java b/hamcrest-core/src/main/java/org/hamcrest/core/IsNull.java
index 9ebf080..737dcf2 100644
--- a/hamcrest-core/src/main/java/org/hamcrest/core/IsNull.java
+++ b/hamcrest-core/src/main/java/org/hamcrest/core/IsNull.java
@@ -1,74 +1,55 @@
+/*  Copyright (c) 2000-2006 hamcrest.org
+ */
 package org.hamcrest.core;
 
-import org.hamcrest.BaseMatcher;
+import static org.hamcrest.core.IsNot.not;
 import org.hamcrest.Description;
 import org.hamcrest.Matcher;
-
-import static org.hamcrest.core.IsNot.not;
+import org.hamcrest.Factory;
+import org.hamcrest.BaseMatcher;
 
 /**
  * Is the value null?
  */
 public class IsNull<T> extends BaseMatcher<T> {
-    @Override
     public boolean matches(Object o) {
         return o == null;
     }
 
-    @Override
     public void describeTo(Description description) {
         description.appendText("null");
     }
 
     /**
-     * Creates a matcher that matches if examined object is <code>null</code>.
-     * For example:
-     * <pre>assertThat(cheese, is(nullValue())</pre>
-     * 
+     * Matches if value is null.
      */
-    public static Matcher<Object> nullValue() {
-        return new IsNull<Object>();
-    }
-
-    /**
-     * A shortcut to the frequently used <code>not(nullValue())</code>.
-     * For example:
-     * <pre>assertThat(cheese, is(notNullValue()))</pre>
-     * instead of:
-     * <pre>assertThat(cheese, is(not(nullValue())))</pre>
-     * 
-     */
-    public static Matcher<Object> notNullValue() {
-        return not(nullValue());
-    }
-
-    /**
-     * Creates a matcher that matches if examined object is <code>null</code>. Accepts a
-     * single dummy argument to facilitate type inference.
-     * For example:
-     * <pre>assertThat(cheese, is(nullValue(Cheese.class))</pre>
-     * 
-     * @param type
-     *     dummy parameter used to infer the generic type of the returned matcher
-     */
-    public static <T> Matcher<T> nullValue(Class<T> type) {
+    @Factory
+    public static <T> Matcher<T> nullValue() {
         return new IsNull<T>();
     }
 
     /**
-     * A shortcut to the frequently used <code>not(nullValue(X.class)). Accepts a
-     * single dummy argument to facilitate type inference.</code>.
-     * For example:
-     * <pre>assertThat(cheese, is(notNullValue(X.class)))</pre>
-     * instead of:
-     * <pre>assertThat(cheese, is(not(nullValue(X.class))))</pre>
-     * 
-     * @param type
-     *     dummy parameter used to infer the generic type of the returned matcher
-     *  
+     * Matches if value is not null.
      */
-    public static <T> Matcher<T> notNullValue(Class<T> type) {
-        return not(nullValue(type));
+    @Factory
+    public static <T> Matcher<T> notNullValue() {
+        return not(IsNull.<T>nullValue());
+    }
+
+    /**
+     * Matches if value is null. With type inference.
+     */
+    @Factory
+    public static <T> Matcher<T> nullValue(@SuppressWarnings("unused") Class<T> type) {
+        return nullValue();
+    }
+
+    /**
+     * Matches if value is not null. With type inference.
+     */
+    @Factory
+    public static <T> Matcher<T> notNullValue(@SuppressWarnings("unused") Class<T> type) {
+        return notNullValue();
     }
 }
 
diff --git a/hamcrest-core/src/main/java/org/hamcrest/core/IsSame.java b/hamcrest-core/src/main/java/org/hamcrest/core/IsSame.java
index cbc3971..b3ad77e 100644
--- a/hamcrest-core/src/main/java/org/hamcrest/core/IsSame.java
+++ b/hamcrest-core/src/main/java/org/hamcrest/core/IsSame.java
@@ -1,8 +1,11 @@
+/*  Copyright (c) 2000-2006 hamcrest.org
+ */
 package org.hamcrest.core;
 
-import org.hamcrest.BaseMatcher;
 import org.hamcrest.Description;
 import org.hamcrest.Matcher;
+import org.hamcrest.Factory;
+import org.hamcrest.BaseMatcher;
 
 
 /**
@@ -10,42 +13,28 @@
  */
 public class IsSame<T> extends BaseMatcher<T> {
     private final T object;
-    
+
     public IsSame(T object) {
         this.object = object;
     }
 
-    @Override
     public boolean matches(Object arg) {
         return arg == object;
     }
 
-    @Override
     public void describeTo(Description description) {
-        description.appendText("sameInstance(")
-                .appendValue(object)
-                .appendText(")");
+        description.appendText("same(") .appendValue(object) .appendText(")");
     }
-    
+
     /**
-     * Creates a matcher that matches only when the examined object is the same instance as
-     * the specified target object.
+     * Creates a new instance of IsSame
      *
-     * @param target
-     *     the target instance against which others should be assessed
+     * @param object The predicate evaluates to true only when the argument is
+     *               this object.
      */
-    public static <T> Matcher<T> sameInstance(T target) {
-        return new IsSame<T>(target);
+    @Factory
+    public static <T> Matcher<T> sameInstance(T object) {
+        return new IsSame<T>(object);
     }
-    
-    /**
-     * Creates a matcher that matches only when the examined object is the same instance as
-     * the specified target object.
-     *
-     * @param target
-     *     the target instance against which others should be assessed
-     */
-    public static <T> Matcher<T> theInstance(T target) {
-        return new IsSame<T>(target);
-    }
+
 }
diff --git a/hamcrest-core/src/main/java/org/hamcrest/core/ShortcutCombination.java b/hamcrest-core/src/main/java/org/hamcrest/core/ShortcutCombination.java
deleted file mode 100644
index 30b33af..0000000
--- a/hamcrest-core/src/main/java/org/hamcrest/core/ShortcutCombination.java
+++ /dev/null
@@ -1,33 +0,0 @@
-package org.hamcrest.core;
-
-import org.hamcrest.BaseMatcher;
-import org.hamcrest.Description;
-import org.hamcrest.Matcher;
-
-abstract class ShortcutCombination<T> extends BaseMatcher<T> {
-
-    private final Iterable<Matcher<? super T>> matchers;
-
-    public ShortcutCombination(Iterable<Matcher<? super T>> matchers) {
-        this.matchers = matchers;
-    }
-    
-    @Override
-    public abstract boolean matches(Object o);
-    
-    @Override
-    public abstract void describeTo(Description description);
-    
-    protected boolean matches(Object o, boolean shortcut) {
-        for (Matcher<? super T> matcher : matchers) {
-            if (matcher.matches(o) == shortcut) {
-                return shortcut;
-            }
-        }
-        return !shortcut;
-    }
-    
-    public void describeTo(Description description, String operator) {
-        description.appendList("(", " " + operator + " ", ")", matchers);
-    }
-}
diff --git a/hamcrest-core/src/main/java/org/hamcrest/core/StringContains.java b/hamcrest-core/src/main/java/org/hamcrest/core/StringContains.java
deleted file mode 100644
index 9e0a4ab..0000000
--- a/hamcrest-core/src/main/java/org/hamcrest/core/StringContains.java
+++ /dev/null
@@ -1,46 +0,0 @@
-package org.hamcrest.core;
-
-import org.hamcrest.Matcher;
-
-/**
- * Tests if the argument is a string that contains a substring.
- */
-public class StringContains extends SubstringMatcher {
-    public StringContains(boolean ignoringCase, String substring) {
-        super("containing", ignoringCase, substring);
-    }
-
-    @Override
-    protected boolean evalSubstringOf(String s) {
-        return converted(s).contains(converted(substring));
-    }
-
-    /**
-     * Creates a matcher that matches if the examined {@link String} contains the specified
-     * {@link String} anywhere.
-     * For example:
-     * <pre>assertThat("myStringOfNote", containsString("ring"))</pre>
-     * 
-     * @param substring
-     *     the substring that the returned matcher will expect to find within any examined string
-     * 
-     */
-    public static Matcher<String> containsString(String substring) {
-        return new StringContains(false, substring);
-    }
-
-    /**
-     * Creates a matcher that matches if the examined {@link String} contains the specified
-     * {@link String} anywhere, ignoring case.
-     * For example:
-     * <pre>assertThat("myStringOfNote", containsString("ring"))</pre>
-     *
-     * @param substring
-     *     the substring that the returned matcher will expect to find within any examined string
-     *
-     */
-    public static Matcher<String> containsStringIgnoringCase(String substring) {
-        return new StringContains(true, substring);
-    }
-
-}
diff --git a/hamcrest-core/src/main/java/org/hamcrest/core/StringEndsWith.java b/hamcrest-core/src/main/java/org/hamcrest/core/StringEndsWith.java
deleted file mode 100644
index 6a6d1a0..0000000
--- a/hamcrest-core/src/main/java/org/hamcrest/core/StringEndsWith.java
+++ /dev/null
@@ -1,42 +0,0 @@
-package org.hamcrest.core;
-
-import org.hamcrest.Matcher;
-
-/**
- * Tests if the argument is a string that contains a substring.
- */
-public class StringEndsWith extends SubstringMatcher {
-    public StringEndsWith(boolean ignoringCase, String substring) { super("ending with", ignoringCase, substring); }
-
-    @Override
-    protected boolean evalSubstringOf(String s) {
-        return converted(s).endsWith(converted(substring));
-    }
-
-    /**
-     * Creates a matcher that matches if the examined {@link String} ends with the specified
-     * {@link String}.
-     * For example:
-     * <pre>assertThat("myStringOfNote", endsWith("Note"))</pre>
-     * 
-     * @param suffix
-     *      the substring that the returned matcher will expect at the end of any examined string
-     */
-    public static Matcher<String> endsWith(String suffix) {
-        return new StringEndsWith(false, suffix);
-    }
-
-    /**
-     * Creates a matcher that matches if the examined {@link String} ends with the specified
-     * {@link String}, ignoring case.
-     * For example:
-     * <pre>assertThat("myStringOfNote", endsWith("Note"))</pre>
-     *
-     * @param suffix
-     *      the substring that the returned matcher will expect at the end of any examined string
-     */
-    public static Matcher<String> endsWithIgnoringCase(String suffix) {
-        return new StringEndsWith(true, suffix);
-    }
-
-}
diff --git a/hamcrest-core/src/main/java/org/hamcrest/core/StringStartsWith.java b/hamcrest-core/src/main/java/org/hamcrest/core/StringStartsWith.java
deleted file mode 100644
index fe7b990..0000000
--- a/hamcrest-core/src/main/java/org/hamcrest/core/StringStartsWith.java
+++ /dev/null
@@ -1,40 +0,0 @@
-package org.hamcrest.core;
-
-import org.hamcrest.Matcher;
-
-/**
- * Tests if the argument is a string that contains a substring.
- */
-public class StringStartsWith extends SubstringMatcher {
-    public StringStartsWith(boolean ignoringCase, String substring) { super("starting with", ignoringCase, substring); }
-
-    @Override
-    protected boolean evalSubstringOf(String s) { return converted(s).startsWith(converted(substring)); }
-
-    /**
-     * <p>
-     * Creates a matcher that matches if the examined {@link String} starts with the specified
-     * {@link String}.
-     * </p>
-     * For example:
-     * <pre>assertThat("myStringOfNote", startsWith("my"))</pre>
-     * 
-     * @param prefix
-     *      the substring that the returned matcher will expect at the start of any examined string
-     */
-    public static Matcher<String> startsWith(String prefix) { return new StringStartsWith(false, prefix); }
-
-    /**
-     * <p>
-     * Creates a matcher that matches if the examined {@link String} starts with the specified
-     * {@link String}, ignoring case
-     * </p>
-     * For example:
-     * <pre>assertThat("myStringOfNote", startsWith("my"))</pre>
-     *
-     * @param prefix
-     *      the substring that the returned matcher will expect at the start of any examined string
-     */
-    public static Matcher<String> startsWithIgnoringCase(String prefix) { return new StringStartsWith(true, prefix); }
-
-}
diff --git a/hamcrest-core/src/main/java/org/hamcrest/core/SubstringMatcher.java b/hamcrest-core/src/main/java/org/hamcrest/core/SubstringMatcher.java
deleted file mode 100644
index 85c6657..0000000
--- a/hamcrest-core/src/main/java/org/hamcrest/core/SubstringMatcher.java
+++ /dev/null
@@ -1,44 +0,0 @@
-package org.hamcrest.core;
-
-import org.hamcrest.Description;
-import org.hamcrest.TypeSafeMatcher;
-
-public abstract class SubstringMatcher extends TypeSafeMatcher<String> {
-
-    // TODO: Replace String with CharSequence to allow for easy interoperability between
-    //       String, StringBuffer, StringBuilder, CharBuffer, etc (joe).
-
-    private final String relationship;
-    private final boolean ignoringCase;
-    protected final String substring;
-
-    protected SubstringMatcher(String relationship, boolean ignoringCase, String substring) {
-        this.relationship = relationship;
-        this.ignoringCase = ignoringCase;
-        this.substring = substring;
-    }
-
-    @Override
-    public boolean matchesSafely(String item) {
-        return evalSubstringOf(ignoringCase ? item.toLowerCase() :item);
-    }
-    @Override
-    public void describeMismatchSafely(String item, Description mismatchDescription) {
-      mismatchDescription.appendText("was \"").appendText(item).appendText("\"");
-    }
-    
-    @Override
-    public void describeTo(Description description) {
-        description.appendText("a string ")
-                .appendText(relationship)
-                .appendText(" ")
-                .appendValue(substring);
-        if (ignoringCase) {
-            description.appendText(" ignoring case");
-        }
-    }
-
-    protected String converted(String arg) { return ignoringCase ? arg.toLowerCase() : arg; }
-    protected abstract boolean evalSubstringOf(String string);
-
-}
diff --git a/hamcrest-core/src/main/java/org/hamcrest/internal/ArrayIterator.java b/hamcrest-core/src/main/java/org/hamcrest/internal/ArrayIterator.java
index 03e4c43..093cdba 100644
--- a/hamcrest-core/src/main/java/org/hamcrest/internal/ArrayIterator.java
+++ b/hamcrest-core/src/main/java/org/hamcrest/internal/ArrayIterator.java
@@ -4,28 +4,25 @@
 import java.util.Iterator;
 
 public class ArrayIterator implements Iterator<Object> {
-    private final Object array;
-    private int currentIndex = 0;
-    
-    public ArrayIterator(Object array) {
-        if (!array.getClass().isArray()) {
-            throw new IllegalArgumentException("not an array");
-        }
-        this.array = array;
-    }
-    
-    @Override
-    public boolean hasNext() {
-        return currentIndex < Array.getLength(array);
-    }
+	private final Object array;
+	private int currentIndex = 0;
+	
+	public ArrayIterator(Object array) {
+		if (!array.getClass().isArray()) {
+			throw new IllegalArgumentException("not an array");
+		}
+		this.array = array;
+	}
+	
+	public boolean hasNext() {
+		return currentIndex < Array.getLength(array);
+	}
 
-    @Override
-    public Object next() {
-        return Array.get(array, currentIndex++);
-    }
-    
-    @Override
-    public void remove() {
-        throw new UnsupportedOperationException("cannot remove items from an array");
-    }
+	public Object next() {
+		return Array.get(array, currentIndex++);
+	}
+	
+	public void remove() {
+		throw new UnsupportedOperationException("cannot remove items from an array");
+	}
 }
diff --git a/hamcrest-core/src/main/java/org/hamcrest/internal/NullSafety.java b/hamcrest-core/src/main/java/org/hamcrest/internal/NullSafety.java
deleted file mode 100644
index 9310abf..0000000
--- a/hamcrest-core/src/main/java/org/hamcrest/internal/NullSafety.java
+++ /dev/null
@@ -1,18 +0,0 @@
-package org.hamcrest.internal;
-
-import org.hamcrest.Matcher;
-import org.hamcrest.core.IsNull;
-
-import java.util.ArrayList;
-import java.util.List;
-
-public class NullSafety {
-    @SuppressWarnings("unchecked")
-    public static <E> List<Matcher<? super E>> nullSafe(Matcher<? super E>[] itemMatchers) {
-        final List<Matcher<? super E>> matchers = new ArrayList<Matcher<? super E>>(itemMatchers.length);
-        for (final Matcher<? super E> itemMatcher : itemMatchers) {
-            matchers.add((Matcher<? super E>) (itemMatcher == null ? IsNull.nullValue() : itemMatcher));
-        }
-        return matchers;
-    }
-}
diff --git a/hamcrest-core/src/main/java/org/hamcrest/internal/ReflectiveTypeFinder.java b/hamcrest-core/src/main/java/org/hamcrest/internal/ReflectiveTypeFinder.java
deleted file mode 100644
index ada74d6..0000000
--- a/hamcrest-core/src/main/java/org/hamcrest/internal/ReflectiveTypeFinder.java
+++ /dev/null
@@ -1,70 +0,0 @@
-/**
- * The TypeSafe classes, and their descendants, need a mechanism to find out what type has been used as a parameter 
- * for the concrete matcher. Unfortunately, this type is lost during type erasure so we need to use reflection 
- * to get it back, by picking out the type of a known parameter to a known method. 
- * The catch is that, with bridging methods, this type is only visible in the class that actually implements 
- * the expected method, so the ReflectiveTypeFinder needs to be applied to that class or a subtype.
- * 
- * For example, the abstract <code>TypeSafeDiagnosingMatcher&lt;T&gt;</code> defines an abstract method
- * <pre>protected abstract boolean matchesSafely(T item, Description mismatchDescription);</pre>
- * By default it uses <code>new ReflectiveTypeFinder("matchesSafely", 2, 0); </code> to find the
- * parameterised type. If we create a <code>TypeSafeDiagnosingMatcher&lt;String&gt;</code>, the type
- * finder will return <code>String.class</code>.
- * 
- * A <code>FeatureMatcher</code> is an abstract subclass of <code>TypeSafeDiagnosingMatcher</code>. 
- * Although it has a templated implementation of <code>matchesSafely(&lt;T&gt;, Description);</code>, the
- * actual run-time signature of this is <code>matchesSafely(Object, Description);</code>. Instead,
- * we must find the type by reflecting on the concrete implementation of 
- * <pre>protected abstract U featureValueOf(T actual);</pre>
- * a method which is declared in <code>FeatureMatcher</code>.
- * 
- * In short, use this to extract a type from a method in the leaf class of a templated class hierarchy. 
- *  
- * @author Steve Freeman
- * @author Nat Pryce
- */
-package org.hamcrest.internal;
-
-import java.lang.reflect.Method;
-
-public class ReflectiveTypeFinder {
-  private final String methodName;
-  private final int expectedNumberOfParameters;
-  private final int typedParameter;
-
-  public ReflectiveTypeFinder(String methodName, int expectedNumberOfParameters, int typedParameter) {
-    this.methodName = methodName;
-    this.expectedNumberOfParameters = expectedNumberOfParameters;
-    this.typedParameter = typedParameter;
-  }
-  
-  public Class<?> findExpectedType(Class<?> fromClass) {
-    for (Class<?> c = fromClass; c != Object.class; c = c.getSuperclass()) {
-        for (Method method : c.getDeclaredMethods()) {
-            if (canObtainExpectedTypeFrom(method)) {
-                return expectedTypeFrom(method);
-            }
-        }
-    }
-    throw new Error("Cannot determine correct type for " + methodName + "() method.");
-  }
-
-  /**
-   * @param method The method to examine.
-   * @return true if this method references the relevant type
-   */
-  protected boolean canObtainExpectedTypeFrom(Method method) {
-      return method.getName().equals(methodName)
-              && method.getParameterTypes().length == expectedNumberOfParameters
-              && !method.isSynthetic();
-  }
-
-
-  /**
-   * @param method The method from which to extract
-   * @return The type we're looking for
-   */
-  protected Class<?> expectedTypeFrom(Method method) {
-      return method.getParameterTypes()[typedParameter];
-  }
-}
diff --git a/hamcrest-core/src/main/java/org/hamcrest/internal/SelfDescribingValue.java b/hamcrest-core/src/main/java/org/hamcrest/internal/SelfDescribingValue.java
index 6537018..0634527 100644
--- a/hamcrest-core/src/main/java/org/hamcrest/internal/SelfDescribingValue.java
+++ b/hamcrest-core/src/main/java/org/hamcrest/internal/SelfDescribingValue.java
@@ -10,7 +10,6 @@
         this.value = value;
     }
 
-    @Override
     public void describeTo(Description description) {
         description.appendValue(value);
     }
diff --git a/hamcrest-core/src/main/java/org/hamcrest/internal/SelfDescribingValueIterator.java b/hamcrest-core/src/main/java/org/hamcrest/internal/SelfDescribingValueIterator.java
index bc8f8f4..58bedf6 100644
--- a/hamcrest-core/src/main/java/org/hamcrest/internal/SelfDescribingValueIterator.java
+++ b/hamcrest-core/src/main/java/org/hamcrest/internal/SelfDescribingValueIterator.java
@@ -1,9 +1,9 @@
 package org.hamcrest.internal;
 
-import org.hamcrest.SelfDescribing;
-
 import java.util.Iterator;
 
+import org.hamcrest.SelfDescribing;
+
 public class SelfDescribingValueIterator<T> implements Iterator<SelfDescribing> {
     private Iterator<T> values;
     
@@ -11,17 +11,14 @@
         this.values = values;
     }
     
-    @Override
     public boolean hasNext() {
         return values.hasNext();
     }
 
-    @Override
     public SelfDescribing next() {
         return new SelfDescribingValue<T>(values.next());
     }
 
-    @Override
     public void remove() {
         values.remove();
     }
diff --git a/hamcrest-core/src/main/java/org/hamcrest/internal/package.html b/hamcrest-core/src/main/java/org/hamcrest/internal/package.html
new file mode 100644
index 0000000..1c9bf9d
--- /dev/null
+++ b/hamcrest-core/src/main/java/org/hamcrest/internal/package.html
@@ -0,0 +1,5 @@
+<html>
+<body>
+    {@hide}
+</body>
+</html>
diff --git a/hamcrest-core/src/main/java/org/hamcrest/package.html b/hamcrest-core/src/main/java/org/hamcrest/package.html
new file mode 100644
index 0000000..143c704
--- /dev/null
+++ b/hamcrest-core/src/main/java/org/hamcrest/package.html
@@ -0,0 +1,9 @@
+<html>
+<head>
+</head>
+<body>
+  <p>The stable API defining Matcher and its associated interfaces and classes.
+  Hamcrest sub-projects define their convenience classes in the org.hamcrest package.
+  </p>
+</body>
+</html>
diff --git a/hamcrest-core/src/test/java/org/hamcrest/AbstractMatcherTest.java b/hamcrest-core/src/test/java/org/hamcrest/AbstractMatcherTest.java
deleted file mode 100644
index 22f823b..0000000
--- a/hamcrest-core/src/test/java/org/hamcrest/AbstractMatcherTest.java
+++ /dev/null
@@ -1,77 +0,0 @@
-package org.hamcrest;
-
-import junit.framework.TestCase;
-import org.junit.Assert;
-
-public abstract class AbstractMatcherTest extends TestCase {
-
-  /**
-   * Create an instance of the Matcher so some generic safety-net tests can be run on it.
-   */
-  protected abstract Matcher<?> createMatcher();
-  
-  public static <T> void assertMatches(Matcher<T> matcher, T arg) {
-      assertMatches("Expected match, but mismatched", matcher, arg);
-  }
-
-  public static <T> void assertMatches(String message, Matcher<T> matcher, T arg) {
-    if (!matcher.matches(arg)) {
-      Assert.fail(message + " because: '" + mismatchDescription(matcher, arg) + "'");
-    }
-  }
-
-  public static <T> void assertDoesNotMatch(Matcher<? super T> c, T arg) {
-      assertDoesNotMatch("Unexpected match", c, arg);
-  }
-
-  public static <T> void assertDoesNotMatch(String message, Matcher<? super T> c, T arg) {
-    Assert.assertFalse(message, c.matches(arg));
-  }
-
-  public static void assertDescription(String expected, Matcher<?> matcher) {
-    Description description = new StringDescription();
-    description.appendDescriptionOf(matcher);
-    Assert.assertEquals("Expected description", expected, description.toString().trim());
-  }
-
-  public static <T> void assertMismatchDescription(String expected, Matcher<? super T> matcher, T arg) {
-    Assert.assertFalse("Precondition: Matcher should not match item.", matcher.matches(arg));
-    Assert.assertEquals("Expected mismatch description", expected, mismatchDescription(matcher, arg));
-  }
-  
-  public static void assertNullSafe(Matcher<?> matcher) {
-      try {
-          matcher.matches(null);
-      }
-      catch (Exception e) {
-          Assert.fail("Matcher was not null safe");
-      }
-  }
-
-  public static void assertUnknownTypeSafe(Matcher<?> matcher) {
-      try {
-          matcher.matches(new UnknownType());
-      }
-      catch (Exception e) {
-          Assert.fail("Matcher was not unknown type safe");
-      }
-  }
-
-  public static <T> String mismatchDescription(Matcher<? super T> matcher, T arg) {
-    Description description = new StringDescription();
-    matcher.describeMismatch(arg, description);
-    return description.toString().trim();
-  }
-
-  public void testIsNullSafe() {
-    assertNullSafe(createMatcher());
-  }
-
-  public void testCopesWithUnknownTypes() {
-    assertUnknownTypeSafe(createMatcher());
-  }
-
-  public static class UnknownType {
-  }
-
-}
diff --git a/hamcrest-core/src/test/java/org/hamcrest/BaseDescriptionTest.java b/hamcrest-core/src/test/java/org/hamcrest/BaseDescriptionTest.java
deleted file mode 100644
index 8b70725..0000000
--- a/hamcrest-core/src/test/java/org/hamcrest/BaseDescriptionTest.java
+++ /dev/null
@@ -1,78 +0,0 @@
-package org.hamcrest;
-
-import org.junit.Test;
-
-import static org.junit.Assert.assertEquals;
-
-public final class BaseDescriptionTest {
-
-    private final StringBuilder result = new StringBuilder();
-
-    private final BaseDescription baseDescription = new BaseDescription() {
-        @Override protected void append(char c) {
-            result.append(c);
-        }
-    };
-
-    @Test public void 
-    describesAppendedNullValue() {
-        baseDescription.appendValue(null);
-        assertEquals("null", result.toString());
-    }
-
-    @Test public void 
-    quotesAppendedStringValue() {
-        baseDescription.appendValue("foo");
-        assertEquals("\"foo\"", result.toString());
-    }
-
-    @Test public void 
-    quotesAppendedCharacterValue() {
-        baseDescription.appendValue('f');
-        assertEquals("\"f\"", result.toString());
-    }
-
-    @Test public void 
-    bracketsAppendedShortValue() {
-        baseDescription.appendValue(Short.valueOf("2"));
-        assertEquals("<2s>", result.toString());
-    }
-
-    @Test public void 
-    bracketsAppendedLongValue() {
-        baseDescription.appendValue(Long.valueOf("2"));
-        assertEquals("<2L>", result.toString());
-    }
-
-    @Test public void 
-    bracketsAppendedFloatValue() {
-        baseDescription.appendValue(Float.valueOf("1.2"));
-        assertEquals("<1.2F>", result.toString());
-    }
-
-    @Test public void 
-    describesAppendedArrayValue() {
-        baseDescription.appendValue(new String[] {"2", "3"});
-        assertEquals("[\"2\", \"3\"]", result.toString());
-    }
-
-    @Test public void 
-    bracketsAppendedObjectValue() {
-        final Object value = new Object();
-        baseDescription.appendValue(value);
-        assertEquals("<" + value.toString() + ">", result.toString());
-    }
-    
-    @Test public void 
-    safelyDescribesAppendedValueOfObjectWhoseToStringThrowsAnException() {
-        final Object value = new Object() {
-            @Override public String toString() {
-                throw new UnsupportedOperationException();
-            }
-        };
-        
-        final String expected = value.getClass().getName() + "@" + Integer.toHexString(value.hashCode());
-        baseDescription.appendValue(value);
-        assertEquals("<" + expected + ">", result.toString());
-    }
-}
diff --git a/hamcrest-core/src/test/java/org/hamcrest/BaseMatcherTest.java b/hamcrest-core/src/test/java/org/hamcrest/BaseMatcherTest.java
deleted file mode 100644
index e663f04..0000000
--- a/hamcrest-core/src/test/java/org/hamcrest/BaseMatcherTest.java
+++ /dev/null
@@ -1,26 +0,0 @@
-package org.hamcrest;
-
-import org.junit.Test;
-
-import static org.junit.Assert.assertEquals;
-
-public final class BaseMatcherTest {
-
-    @Test
-    public void
-    describesItselfWithToStringMethod() {
-        Matcher<Object> someMatcher = new BaseMatcher<Object>() {
-            @Override
-            public boolean matches(Object item) {
-                throw new UnsupportedOperationException();
-            }
-
-            @Override
-            public void describeTo(Description description) {
-                description.appendText("SOME DESCRIPTION");
-            }
-        };
-
-        assertEquals("SOME DESCRIPTION", someMatcher.toString());
-    }
-}
diff --git a/hamcrest-core/src/test/java/org/hamcrest/CustomMatcherTest.java b/hamcrest-core/src/test/java/org/hamcrest/CustomMatcherTest.java
deleted file mode 100644
index 08649f7..0000000
--- a/hamcrest-core/src/test/java/org/hamcrest/CustomMatcherTest.java
+++ /dev/null
@@ -1,20 +0,0 @@
-package org.hamcrest;
-
-import org.junit.Test;
-
-import static org.hamcrest.AbstractMatcherTest.assertDescription;
-
-public final class CustomMatcherTest {
-
-    @Test public void
-    usesStaticDescription() throws Exception {
-        Matcher<String> matcher = new CustomMatcher<String>("I match strings") {
-            @Override
-            public boolean matches(Object item) {
-                return (item instanceof String);
-            }
-        };
-
-        assertDescription("I match strings", matcher);
-    }
-}
diff --git a/hamcrest-core/src/test/java/org/hamcrest/CustomTypeSafeMatcherTest.java b/hamcrest-core/src/test/java/org/hamcrest/CustomTypeSafeMatcherTest.java
deleted file mode 100644
index 2c86712..0000000
--- a/hamcrest-core/src/test/java/org/hamcrest/CustomTypeSafeMatcherTest.java
+++ /dev/null
@@ -1,41 +0,0 @@
-package org.hamcrest;
-
-import org.junit.Test;
-
-import static org.hamcrest.AbstractMatcherTest.*;
-
-public final class CustomTypeSafeMatcherTest {
-    private static final String STATIC_DESCRIPTION = "I match non empty strings";
-
-    private final Matcher<String> customMatcher = new CustomTypeSafeMatcher<String>(STATIC_DESCRIPTION) {
-        @Override
-        public boolean matchesSafely(String item) {
-            return false;
-        }
-
-        @Override
-        public void describeMismatchSafely(String item, Description mismatchDescription) {
-            mismatchDescription.appendText("an " + item);
-        }
-    };
-
-    @Test public void
-    usesStaticDescription() throws Exception {
-        assertDescription(STATIC_DESCRIPTION, customMatcher);
-    }
-
-    @Test public void
-    reportsMismatch() {
-        assertMismatchDescription("an item", customMatcher, "item");
-    }
-
-    @Test public void
-    isNullSafe() {
-        assertNullSafe(customMatcher);
-    }
-    
-    @Test public void
-    copesWithUnknownTypes() {
-        assertUnknownTypeSafe(customMatcher);
-    }
-}
diff --git a/hamcrest-core/src/test/java/org/hamcrest/FeatureMatcherTest.java b/hamcrest-core/src/test/java/org/hamcrest/FeatureMatcherTest.java
deleted file mode 100644
index f0cbdd5..0000000
--- a/hamcrest-core/src/test/java/org/hamcrest/FeatureMatcherTest.java
+++ /dev/null
@@ -1,68 +0,0 @@
-package org.hamcrest;
-
-import org.hamcrest.core.IsEqual;
-import org.junit.Test;
-
-import static org.hamcrest.AbstractMatcherTest.*;
-import static org.junit.Assert.assertEquals;
-
-public final class FeatureMatcherTest {
-    private final FeatureMatcher<Thingy, String> resultMatcher = resultMatcher();
-
-    @Test public void
-    matchesPartOfAnObject() {
-        assertMatches("feature", resultMatcher, new Thingy("bar"));
-        assertDescription("Thingy with result \"bar\"", resultMatcher);
-    }
-
-    @Test public void
-    mismatchesPartOfAnObject() {
-        assertMismatchDescription("result mismatch-description", resultMatcher, new Thingy("foo"));
-    }
-
-    @Test public void
-    doesNotThrowNullPointerException() {
-        assertMismatchDescription("was null", resultMatcher, null);
-    }
-
-    @Test public void
-    doesNotThrowClassCastException() {
-        resultMatcher.matches(new ShouldNotMatch());
-        StringDescription mismatchDescription = new StringDescription(); 
-        resultMatcher.describeMismatch(new ShouldNotMatch(), mismatchDescription);
-        assertEquals("was <ShouldNotMatch>", mismatchDescription.toString());
-    }
-
-    public static class Match extends IsEqual<String> {
-        public Match(String equalArg) { super(equalArg); }
-        @Override public void describeMismatch(Object item, Description description) {
-            description.appendText("mismatch-description");
-        }
-    }
-
-    public static class Thingy {
-        private final String result;
-
-        public Thingy(String result) {
-            this.result = result;
-        }
-
-        public String getResult() {
-            return result;
-        }
-    }
-
-    public static class ShouldNotMatch {
-        @Override public String toString() { return "ShouldNotMatch"; }
-    } 
-
-    private static FeatureMatcher<Thingy, String> resultMatcher() {
-        return new FeatureMatcher<Thingy, String>(new Match("bar"), "Thingy with result", "result") {
-            @Override
-            public String featureValueOf(Thingy actual) {
-                return actual.getResult();
-            }
-        };
-    }
-
-}
diff --git a/hamcrest-core/src/test/java/org/hamcrest/MatcherAssertTest.java b/hamcrest-core/src/test/java/org/hamcrest/MatcherAssertTest.java
deleted file mode 100644
index b57c4d7..0000000
--- a/hamcrest-core/src/test/java/org/hamcrest/MatcherAssertTest.java
+++ /dev/null
@@ -1,96 +0,0 @@
-package org.hamcrest;
-
-import org.junit.Test;
-
-import static org.hamcrest.MatcherAssert.assertThat;
-import static org.hamcrest.core.IsEqual.equalTo;
-import static org.junit.Assert.*;
-
-public final class MatcherAssertTest {
-
-    @Test public void
-    includesDescriptionOfTestedValueInErrorMessage() {
-        String expected = "expected";
-        String actual = "actual";
-
-        String expectedMessage = "identifier\nExpected: \"expected\"\n     but: was \"actual\"";
-
-        try {
-            assertThat("identifier", actual, equalTo(expected));
-        }
-        catch (AssertionError e) {
-            assertTrue(e.getMessage().startsWith(expectedMessage));
-            return;
-        }
-
-        fail("should have failed");
-    }
-
-    @Test public void
-    descriptionCanBeElided() {
-        String expected = "expected";
-        String actual = "actual";
-
-        String expectedMessage = "\nExpected: \"expected\"\n     but: was \"actual\"";
-
-        try {
-            assertThat(actual, equalTo(expected));
-        }
-        catch (AssertionError e) {
-            assertTrue(e.getMessage().startsWith(expectedMessage));
-            return;
-        }
-
-        fail("should have failed");
-    }
-
-    @Test public void
-    canTestBooleanDirectly() {
-        assertThat("success reason message", true);
-
-        try {
-            assertThat("failing reason message", false);
-        }
-        catch (AssertionError e) {
-            assertEquals("failing reason message", e.getMessage());
-            return;
-        }
-
-        fail("should have failed");
-    }
-
-    @Test public void
-    includesMismatchDescription() {
-        Matcher<String> matcherWithCustomMismatchDescription = new BaseMatcher<String>() {
-            @Override
-            public boolean matches(Object item) {
-                return false;
-            }
-
-            @Override
-            public void describeTo(Description description) {
-                description.appendText("Something cool");
-            }
-
-            @Override
-            public void describeMismatch(Object item, Description mismatchDescription) {
-                mismatchDescription.appendText("Not cool");
-            }
-        };
-
-        String expectedMessage = "\nExpected: Something cool\n     but: Not cool";
-
-        try {
-            assertThat("Value", matcherWithCustomMismatchDescription);
-            fail("should have failed");
-        }
-        catch (AssertionError e) {
-            assertEquals(expectedMessage, e.getMessage());
-        }
-    }
-
-    @Test public void
-    canAssertSubtypes() {
-        assertThat(1, equalTo((Number) 1));
-    }
-}
diff --git a/hamcrest-core/src/test/java/org/hamcrest/NullDescriptionTest.java b/hamcrest-core/src/test/java/org/hamcrest/NullDescriptionTest.java
deleted file mode 100644
index cccece0..0000000
--- a/hamcrest-core/src/test/java/org/hamcrest/NullDescriptionTest.java
+++ /dev/null
@@ -1,18 +0,0 @@
-package org.hamcrest;
-
-import org.hamcrest.Description.NullDescription;
-import org.junit.Test;
-
-import static org.junit.Assert.assertEquals;
-
-public final class NullDescriptionTest {
-
-    private final NullDescription nullDescription = new Description.NullDescription();
-
-    @Test public void
-    isUnchangedByAppendedText() {
-        nullDescription.appendText("myText");
-        assertEquals("", nullDescription.toString());
-    }
-
-}
diff --git a/hamcrest-core/src/test/java/org/hamcrest/TypeSafeMatcherTest.java b/hamcrest-core/src/test/java/org/hamcrest/TypeSafeMatcherTest.java
deleted file mode 100644
index e23bab8..0000000
--- a/hamcrest-core/src/test/java/org/hamcrest/TypeSafeMatcherTest.java
+++ /dev/null
@@ -1,40 +0,0 @@
-package org.hamcrest;
-
-import org.junit.Test;
-
-import static org.hamcrest.AbstractMatcherTest.assertMismatchDescription;
-import static org.junit.Assert.assertFalse;
-
-public final class TypeSafeMatcherTest {
-    private final Matcher<String> matcher = new TypeSafeMatcherSubclass();
-
-    public static class TypeSafeMatcherSubclass extends TypeSafeMatcher<String> {
-        @Override
-        public boolean matchesSafely(String item) {
-            return false;
-        }
-
-        @Override
-        public void describeMismatchSafely(String item, Description mismatchDescription) {
-          mismatchDescription.appendText("The mismatch");
-        }
-
-        @Override
-        public void describeTo(Description description) {
-        }
-    }
-
-    @Test public void
-    canDetermineMatcherTypeFromProtectedMatchesSafelyMethod() {
-        assertFalse(matcher.matches(null));
-        assertFalse(matcher.matches(10));
-    }
-
-    @SuppressWarnings({ "unchecked", "rawtypes" })
-    @Test public void
-    describesMismatches() {
-      assertMismatchDescription("was null", matcher, null);
-      assertMismatchDescription("was a java.lang.Integer (<3>)", (Matcher)matcher, 3);
-      assertMismatchDescription("The mismatch", matcher, "a string");
-    }
-}
diff --git a/hamcrest-core/src/test/java/org/hamcrest/core/AllOfTest.java b/hamcrest-core/src/test/java/org/hamcrest/core/AllOfTest.java
deleted file mode 100644
index 4815002..0000000
--- a/hamcrest-core/src/test/java/org/hamcrest/core/AllOfTest.java
+++ /dev/null
@@ -1,63 +0,0 @@
-package org.hamcrest.core;
-
-import org.hamcrest.Matcher;
-import org.junit.Test;
-
-import static org.hamcrest.AbstractMatcherTest.*;
-import static org.hamcrest.core.AllOf.allOf;
-import static org.hamcrest.core.Is.is;
-import static org.hamcrest.core.IsEqual.equalTo;
-import static org.hamcrest.core.IsNull.notNullValue;
-import static org.hamcrest.core.StringEndsWith.endsWith;
-import static org.hamcrest.core.StringStartsWith.startsWith;
-
-public final class AllOfTest {
-
-    @Test public void
-    copesWithNullsAndUnknownTypes() {
-        Matcher<String> matcher = allOf(equalTo("irrelevant"), startsWith("irr"));
-        
-        assertNullSafe(matcher);
-        assertUnknownTypeSafe(matcher);
-    }
-    
-    @Test public void
-    evaluatesToTheTheLogicalConjunctionOfTwoOtherMatchers() {
-        Matcher<String> matcher = allOf(startsWith("goo"), endsWith("ood"));
-        
-        assertMatches("didn't pass both sub-matchers", matcher, "good");
-        assertDoesNotMatch("didn't fail first sub-matcher", matcher, "mood");
-        assertDoesNotMatch("didn't fail second sub-matcher", matcher, "goon");
-        assertDoesNotMatch("didn't fail both sub-matchers", matcher, "fred");
-    }
-
-    @Test public void
-    evaluatesToTheTheLogicalConjunctionOfManyOtherMatchers() {
-        Matcher<String> matcher = allOf(startsWith("g"), startsWith("go"), endsWith("d"), startsWith("go"), startsWith("goo"));
-        
-        assertMatches("didn't pass all sub-matchers", matcher, "good");
-        assertDoesNotMatch("didn't fail middle sub-matcher", matcher, "goon");
-    }
-    
-    @Test public void
-    supportsMixedTypes() {
-        final Matcher<SampleSubClass> matcher = allOf(
-                equalTo(new SampleBaseClass("bad")),
-                is(notNullValue()),
-                equalTo(new SampleBaseClass("good")),
-                equalTo(new SampleSubClass("ugly")));
-        
-        assertDoesNotMatch("didn't fail last sub-matcher", matcher, new SampleSubClass("good"));
-    }
-    
-    @Test public void
-    hasAReadableDescription() {
-        assertDescription("(\"good\" and \"bad\" and \"ugly\")",
-                allOf(equalTo("good"), equalTo("bad"), equalTo("ugly")));
-    }
-
-    @Test public void
-    hasAMismatchDescriptionDescribingTheFirstFailingMatch() {
-        assertMismatchDescription("\"good\" was \"bad\"", allOf(equalTo("bad"), equalTo("good")), "bad");
-    }
-}
diff --git a/hamcrest-core/src/test/java/org/hamcrest/core/AnyOfTest.java b/hamcrest-core/src/test/java/org/hamcrest/core/AnyOfTest.java
deleted file mode 100644
index 11c053c..0000000
--- a/hamcrest-core/src/test/java/org/hamcrest/core/AnyOfTest.java
+++ /dev/null
@@ -1,56 +0,0 @@
-package org.hamcrest.core;
-
-import org.hamcrest.Matcher;
-import org.junit.Test;
-
-import static org.hamcrest.AbstractMatcherTest.*;
-import static org.hamcrest.core.AnyOf.anyOf;
-import static org.hamcrest.core.IsEqual.equalTo;
-import static org.hamcrest.core.StringEndsWith.endsWith;
-import static org.hamcrest.core.StringStartsWith.startsWith;
-
-public final class AnyOfTest {
-
-    @Test public void
-    copesWithNullsAndUnknownTypes() {
-        Matcher<String> matcher = anyOf(equalTo("irrelevant"), startsWith("irr"));
-        
-        assertNullSafe(matcher);
-        assertUnknownTypeSafe(matcher);
-    }
-
-    @Test public void
-    evaluatesToTheTheLogicalDisjunctionOfTwoOtherMatchers() {
-        Matcher<String> matcher = anyOf(startsWith("goo"), endsWith("ood"));
-        
-        assertMatches("didn't pass both sub-matchers", matcher, "good");
-        assertMatches("didn't pass second sub-matcher", matcher, "mood");
-        assertMatches("didn't pass first sub-matcher", matcher, "goon");
-        assertDoesNotMatch("didn't fail both sub-matchers", matcher, "flan");
-    }
-
-    @Test public void
-    evaluatesToTheTheLogicalDisjunctionOfManyOtherMatchers() {
-        Matcher<String> matcher = anyOf(startsWith("g"), startsWith("go"), endsWith("d"), startsWith("go"), startsWith("goo"));
-        
-        assertMatches("didn't pass middle sub-matcher", matcher, "vlad");
-        assertDoesNotMatch("didn't fail all sub-matchers", matcher, "flan");
-    }
-
-    @SuppressWarnings("unchecked")
-    @Test public void
-    supportsMixedTypes() {
-        final Matcher<SampleSubClass> matcher = anyOf(
-                equalTo(new SampleBaseClass("bad")),
-                equalTo(new SampleBaseClass("good")),
-                equalTo(new SampleSubClass("ugly")));
-        
-        assertMatches("didn't pass middle sub-matcher", matcher, new SampleSubClass("good"));
-    }
-
-    @Test public void
-    hasAReadableDescription() {
-        assertDescription("(\"good\" or \"bad\" or \"ugly\")",
-                anyOf(equalTo("good"), equalTo("bad"), equalTo("ugly")));
-    }
-}
diff --git a/hamcrest-core/src/test/java/org/hamcrest/core/CombinableTest.java b/hamcrest-core/src/test/java/org/hamcrest/core/CombinableTest.java
deleted file mode 100644
index e89c493..0000000
--- a/hamcrest-core/src/test/java/org/hamcrest/core/CombinableTest.java
+++ /dev/null
@@ -1,68 +0,0 @@
-package org.hamcrest.core;
-
-import org.hamcrest.Matcher;
-import org.junit.Test;
-
-import static org.hamcrest.AbstractMatcherTest.*;
-import static org.hamcrest.core.IsEqual.equalTo;
-import static org.hamcrest.core.IsNot.not;
-import static org.hamcrest.core.IsNull.notNullValue;
-
-public final class CombinableTest {
-    private static final CombinableMatcher<Integer> EITHER_3_OR_4 = CombinableMatcher.<Integer>either(equalTo(3)).or(equalTo(4));
-    private static final CombinableMatcher<Integer> NOT_3_AND_NOT_4 = CombinableMatcher.<Integer>both(not(equalTo(3))).and(not(equalTo(4)));
-
-    @Test public void
-    copesWithNullsAndUnknownTypes() {
-        assertNullSafe(EITHER_3_OR_4);
-        assertNullSafe(NOT_3_AND_NOT_4);
-        assertUnknownTypeSafe(EITHER_3_OR_4);
-        assertUnknownTypeSafe(NOT_3_AND_NOT_4);
-    }
-
-    @Test public void
-    bothAcceptsAndRejects() {
-        assertMatches("both didn't pass", NOT_3_AND_NOT_4, 2);
-        assertDoesNotMatch("both didn't fail", NOT_3_AND_NOT_4, 3);
-    }
-
-    @Test public void
-    acceptsAndRejectsThreeAnds() {
-        CombinableMatcher<? super Integer> tripleAnd = NOT_3_AND_NOT_4.and(equalTo(2));
-        
-        assertMatches("tripleAnd didn't pass", tripleAnd, 2);
-        assertDoesNotMatch("tripleAnd didn't fail", tripleAnd, 3);
-    }
-
-    @Test public void
-    bothDescribesItself() {
-        assertDescription("(not <3> and not <4>)", NOT_3_AND_NOT_4);
-        assertMismatchDescription("not <3> was <3>", NOT_3_AND_NOT_4, 3);
-    }
-
-    @Test public void
-    eitherAcceptsAndRejects() {
-        assertMatches("either didn't pass", EITHER_3_OR_4, 3);
-        assertDoesNotMatch("either didn't fail", EITHER_3_OR_4, 6);
-    }
-
-    @Test public void
-    acceptsAndRejectsThreeOrs() {
-        final CombinableMatcher<Integer> tripleOr = EITHER_3_OR_4.or(equalTo(11));
-        
-        assertMatches("tripleOr didn't pass", tripleOr, 11);
-        assertDoesNotMatch("tripleOr didn't fail", tripleOr, 9);
-    }
-
-    @Test public void
-    eitherDescribesItself() {
-        assertDescription("(<3> or <4>)", EITHER_3_OR_4);
-        assertMismatchDescription("was <6>", EITHER_3_OR_4, 6);
-    }
-
-    @Test public void
-    picksUpTypeFromLeftHandSideOfExpression() {
-        @SuppressWarnings("unused")
-        Matcher<String> matcher = CombinableMatcher.both(equalTo("yellow")).and(notNullValue(String.class));
-    }
-}
diff --git a/hamcrest-core/src/test/java/org/hamcrest/core/DescribedAsTest.java b/hamcrest-core/src/test/java/org/hamcrest/core/DescribedAsTest.java
deleted file mode 100644
index 5c76af9..0000000
--- a/hamcrest-core/src/test/java/org/hamcrest/core/DescribedAsTest.java
+++ /dev/null
@@ -1,49 +0,0 @@
-package org.hamcrest.core;
-
-import org.hamcrest.Matcher;
-import org.junit.Test;
-
-import static org.hamcrest.AbstractMatcherTest.*;
-import static org.hamcrest.core.DescribedAs.describedAs;
-import static org.hamcrest.core.IsAnything.anything;
-import static org.hamcrest.core.IsEqual.equalTo;
-
-public final class DescribedAsTest {
-
-    @Test public void
-    copesWithNullsAndUnknownTypes() {
-        Matcher<Object> matcher = describedAs("irrelevant", anything());
-
-        assertNullSafe(matcher);
-        assertUnknownTypeSafe(matcher);
-    }
-
-    @Test public void
-    overridesDescriptionOfOtherMatcherWithThatPassedToConstructor() {
-        Matcher<?> matcher = describedAs("my description", anything());
-
-        assertDescription("my description", matcher);
-    }
-
-    @Test public void
-    appendsValuesToDescription() {
-        Matcher<?> matcher = describedAs("value 1 = %0, value 2 = %1", anything(), 33, 97);
-
-        assertDescription("value 1 = <33>, value 2 = <97>", matcher);
-    }
-
-    @Test public void
-    celegatesMatchingToAnotherMatcher() {
-        Matcher<String> matcher = describedAs("irrelevant", equalTo("hi"));
-
-        assertMatches(matcher, "hi");
-        assertDoesNotMatch("matched", matcher, "oi");
-    }
-
-    @Test public void
-    delegatesMismatchDescriptionToAnotherMatcher() {
-        Matcher<Integer> matcher = describedAs("irrelevant", equalTo(2));
-
-        assertMismatchDescription("was <1>", matcher, 1);
-    }
-}
diff --git a/hamcrest-core/src/test/java/org/hamcrest/core/EveryTest.java b/hamcrest-core/src/test/java/org/hamcrest/core/EveryTest.java
deleted file mode 100644
index e45e881..0000000
--- a/hamcrest-core/src/test/java/org/hamcrest/core/EveryTest.java
+++ /dev/null
@@ -1,43 +0,0 @@
-package org.hamcrest.core;
-
-import org.hamcrest.Matcher;
-import org.junit.Test;
-
-import java.util.ArrayList;
-
-import static java.util.Arrays.asList;
-import static org.hamcrest.AbstractMatcherTest.*;
-import static org.hamcrest.core.StringContains.containsString;
-
-public final class EveryTest {
-
-    private final Matcher<Iterable<? extends String>> matcher = Every.everyItem(containsString("a"));
-
-    @Test public void
-    copesWithNullsAndUnknownTypes() {
-        assertNullSafe(matcher);
-        assertUnknownTypeSafe(matcher);
-    }
-
-    @Test public void
-    matchesOnlyWhenEveryItemMatches() {
-        assertMatches(matcher, asList("AaA", "BaB", "CaC"));
-        assertDoesNotMatch(matcher, asList("AaA", "BXB", "CaC"));
-    }
-
-    @Test public void
-    matchesEmptyLists() {
-        assertMatches("didn't match empty list", matcher, new ArrayList<String>());
-    }
-
-    @Test public void
-    describesItself() {
-        assertDescription("every item is a string containing \"a\"", matcher);
-    }
-
-    @Test public void
-    describesAMismatch() {
-        assertMismatchDescription("an item was \"BXB\"", matcher, asList("BXB"));
-    }
-}
-
diff --git a/hamcrest-core/src/test/java/org/hamcrest/core/IsAnythingTest.java b/hamcrest-core/src/test/java/org/hamcrest/core/IsAnythingTest.java
deleted file mode 100644
index 4983bf7..0000000
--- a/hamcrest-core/src/test/java/org/hamcrest/core/IsAnythingTest.java
+++ /dev/null
@@ -1,35 +0,0 @@
-package org.hamcrest.core;
-
-import org.hamcrest.Matcher;
-import org.junit.Test;
-
-import static org.hamcrest.AbstractMatcherTest.assertDescription;
-import static org.hamcrest.AbstractMatcherTest.assertMatches;
-import static org.hamcrest.core.IsAnything.anything;
-
-public final class IsAnythingTest {
-
-    private final Matcher<Object> matcher = anything();
-
-    private static class CustomThing { }
-    
-    @Test public void
-    alwaysEvaluatesToTrue() {
-        assertMatches("didn't match null", matcher, null);
-        assertMatches("didn't match Object", matcher, new Object());
-        assertMatches("didn't match custom object", matcher, new CustomThing());
-        assertMatches("didn't match String", matcher, "hi");
-    }
-
-    @Test public void
-    hasUsefulDefaultDescription() {
-        assertDescription("ANYTHING", matcher);
-    }
-
-    @Test public void
-    canOverrideDescription() {
-        String description = "description";
-        assertDescription(description, anything(description));
-    }
-
-}
diff --git a/hamcrest-core/src/test/java/org/hamcrest/core/IsCollectionContainingTest.java b/hamcrest-core/src/test/java/org/hamcrest/core/IsCollectionContainingTest.java
deleted file mode 100644
index a9007cd..0000000
--- a/hamcrest-core/src/test/java/org/hamcrest/core/IsCollectionContainingTest.java
+++ /dev/null
@@ -1,107 +0,0 @@
-package org.hamcrest.core;
-
-import org.hamcrest.Description;
-import org.hamcrest.Matcher;
-import org.hamcrest.TypeSafeDiagnosingMatcher;
-import org.junit.Test;
-
-import java.util.ArrayList;
-import java.util.HashSet;
-import java.util.Set;
-
-import static java.util.Arrays.asList;
-import static org.hamcrest.AbstractMatcherTest.*;
-import static org.hamcrest.core.IsCollectionContaining.hasItem;
-import static org.hamcrest.core.IsCollectionContaining.hasItems;
-import static org.hamcrest.core.IsEqual.equalTo;
-
-public final class IsCollectionContainingTest {
-    
-    @Test public void
-    copesWithNullsAndUnknownTypes() {
-        Matcher<?> matcher = hasItem(equalTo("irrelevant"));
-        
-        assertNullSafe(matcher);
-        assertUnknownTypeSafe(matcher);
-    }
-
-    @Test public void
-    matchesACollectionThatContainsAnElementForTheGivenMatcher() {
-        final Matcher<Iterable<? super String>> itemMatcher = hasItem(equalTo("a"));
-
-        assertMatches("list containing 'a'", itemMatcher, asList("a", "b", "c"));
-    }
-
-    @Test public void
-    doesNotMatchCollectionWithoutAnElementForGivenMatcher() {
-        final Matcher<Iterable<? super String>> matcher = hasItem(mismatchable("a"));
-        
-        assertMismatchDescription("mismatches were: [mismatched: b, mismatched: c]", matcher, asList("b", "c"));
-        assertMismatchDescription("was empty", matcher, new ArrayList<String>());
-    }
-
-    @Test public void
-    doesNotMatchNull() {
-        assertDoesNotMatch("doesn't match null", hasItem(equalTo("a")), null);
-    }
-
-    @Test public void
-    hasAReadableDescription() {
-        assertDescription("a collection containing mismatchable: a", hasItem(mismatchable("a")));
-    }
-    
-    @Test public void
-    canMatchItemWhenCollectionHoldsSuperclass() { // Issue 24
-        final Set<Number> s = new HashSet<Number>();
-        s.add(2);
-
-        assertMatches(new IsCollectionContaining<Number>(new IsEqual<Number>(2)), s);
-        assertMatches(IsCollectionContaining.hasItem(2), s);
-    }
-
-    @SuppressWarnings("unchecked")
-    @Test public void
-    matchesMultipleItemsInCollection() {
-        final Matcher<Iterable<String>> matcher1 = hasItems(equalTo("a"), equalTo("b"), equalTo("c"));
-        assertMatches("list containing all items", matcher1, asList("a", "b", "c"));
-        
-        final Matcher<Iterable<String>> matcher2 = hasItems("a", "b", "c");
-        assertMatches("list containing all items (without matchers)", matcher2, asList("a", "b", "c"));
-        
-        final Matcher<Iterable<String>> matcher3 = hasItems(equalTo("a"), equalTo("b"), equalTo("c"));
-        assertMatches("list containing all items in any order", matcher3, asList("c", "b", "a"));
-        
-        final Matcher<Iterable<String>> matcher4 = hasItems(equalTo("a"), equalTo("b"), equalTo("c"));
-        assertMatches("list containing all items plus others", matcher4, asList("e", "c", "b", "a", "d"));
-        
-        final Matcher<Iterable<String>> matcher5 = hasItems(equalTo("a"), equalTo("b"), equalTo("c"));
-        assertDoesNotMatch("not match list unless it contains all items", matcher5, asList("e", "c", "b", "d")); // 'a' missing
-    }
-    
-    @Test public void
-    reportsMismatchWithAReadableDescriptionForMultipleItems() {
-        final Matcher<Iterable<Integer>> matcher = hasItems(3, 4);
-        
-        assertMismatchDescription("a collection containing <4> mismatches were: [was <1>, was <2>, was <3>]",
-                                  matcher, asList(1, 2, 3));
-    }
-
-    private static Matcher<? super String> mismatchable(final String string) {
-        return new TypeSafeDiagnosingMatcher<String>() {
-            @Override
-            protected boolean matchesSafely(String item, Description mismatchDescription) {
-                if (string.equals(item)) 
-                    return true;
-
-                mismatchDescription.appendText("mismatched: " + item);
-                return false;
-            }
-
-            @Override
-            public void describeTo(Description description) {
-                description.appendText("mismatchable: " + string);
-            }
-        };
-    }
-}
-
diff --git a/hamcrest-core/src/test/java/org/hamcrest/core/IsEqualTest.java b/hamcrest-core/src/test/java/org/hamcrest/core/IsEqualTest.java
deleted file mode 100644
index 9df73e4..0000000
--- a/hamcrest-core/src/test/java/org/hamcrest/core/IsEqualTest.java
+++ /dev/null
@@ -1,143 +0,0 @@
-package org.hamcrest.core;
-
-import org.hamcrest.Matcher;
-import org.junit.Test;
-
-import static org.hamcrest.AbstractMatcherTest.*;
-import static org.hamcrest.core.IsEqual.equalTo;
-import static org.hamcrest.core.IsEqual.equalToObject;
-
-public final class IsEqualTest {
-
-    @Test public void
-    copesWithNullsAndUnknownTypes() {
-        Matcher<?> matcher = equalTo("irrelevant");
-
-        assertNullSafe(matcher);
-        assertUnknownTypeSafe(matcher);
-    }
-
-    @Test public void
-    comparesObjectsUsingEqualsMethod() {
-        final Matcher<String> matcher1 = equalTo("hi");
-        assertMatches(matcher1, "hi");
-        assertDoesNotMatch(matcher1, "bye");
-        assertDoesNotMatch(matcher1, null);
-
-        final Matcher<Integer> matcher2 = equalTo(1);
-        assertMatches(matcher2, 1);
-        assertDoesNotMatch(matcher2, 2);
-        assertDoesNotMatch(matcher2, null);
-    }
-
-    @Test public void
-    canCompareNullValues() {
-        final Matcher<Object> matcher = equalTo(null);
-        
-        assertMatches(matcher, null);
-        assertDoesNotMatch(matcher, 2);
-        assertDoesNotMatch(matcher, "hi");
-        assertDoesNotMatch(matcher, new String[] {"a", "b"});
-    }
-
-    @SuppressWarnings("EqualsWhichDoesntCheckParameterClass")
-    @Test public void
-    honoursIsEqualImplementationEvenWithNullValues() {
-        Object alwaysEqual = new Object() {
-            @Override
-            public boolean equals(Object obj) {
-                return true;
-            }
-        };
-        Object neverEqual = new Object() {
-            @Override
-            public boolean equals(Object obj) {
-                return false;
-            }
-        };
-
-        Matcher<Object> matcher = equalTo(null);
-
-        assertMatches(matcher, alwaysEqual);
-        assertDoesNotMatch(matcher, neverEqual);
-    }
-
-    @Test public void
-    comparesTheElementsOfAnObjectArray() {
-        String[] s1 = {"a", "b"};
-        String[] s2 = {"a", "b"};
-        String[] s3 = {"c", "d"};
-        String[] s4 = {"a", "b", "c", "d"};
-
-        final Matcher<String[]> matcher = equalTo(s1);
-        assertMatches(matcher, s1);
-        assertMatches(matcher, s2);
-        assertDoesNotMatch(matcher, s3);
-        assertDoesNotMatch(matcher, s4);
-        assertDoesNotMatch(matcher, null);
-    }
-
-    @Test public void
-    comparesTheElementsOfAnArrayOfPrimitiveTypes() {
-        int[] i1 = new int[]{1, 2};
-        int[] i2 = new int[]{1, 2};
-        int[] i3 = new int[]{3, 4};
-        int[] i4 = new int[]{1, 2, 3, 4};
-
-        final Matcher<int[]> matcher = equalTo(i1);
-        assertMatches(matcher, i1);
-        assertMatches(matcher, i2);
-        assertDoesNotMatch(matcher, i3);
-        assertDoesNotMatch(matcher, i4);
-        assertDoesNotMatch(matcher, null);
-    }
-
-    @Test public void
-    recursivelyTestsElementsOfArrays() {
-        int[][] i1 = new int[][]{{1, 2}, {3, 4}};
-        int[][] i2 = new int[][]{{1, 2}, {3, 4}};
-        int[][] i3 = new int[][]{{5, 6}, {7, 8}};
-        int[][] i4 = new int[][]{{1, 2, 3, 4}, {3, 4}};
-
-        final Matcher<int[][]> matcher = equalTo(i1);
-        assertMatches(matcher, i1);
-        assertMatches(matcher, i2);
-        assertDoesNotMatch(matcher, i3);
-        assertDoesNotMatch(matcher, i4);
-        assertDoesNotMatch(matcher, null);
-    }
-
-    @Test public void
-    hasUntypedVariant() {
-        Object original = 10;
-
-        assertMatches(equalToObject(10), original);
-        assertDoesNotMatch(equalToObject(0), original);
-        assertDoesNotMatch(equalToObject("10"), original);
-        assertDoesNotMatch(equalToObject(10), "10");
-    }
-
-    @Test public void
-    includesTheResultOfCallingToStringOnItsArgumentInTheDescription() {
-        final String argumentDescription = "ARGUMENT DESCRIPTION";
-        Object argument = new Object() {
-            @Override
-            public String toString() {
-                return argumentDescription;
-            }
-        };
-        assertDescription("<" + argumentDescription + ">", equalTo(argument));
-    }
-
-    @Test public void
-    returnsAnObviousDescriptionIfCreatedWithANestedMatcherByMistake() {
-        Matcher<? super String> innerMatcher = equalTo("NestedMatcher");
-        assertDescription("<" + innerMatcher.toString() + ">", equalTo(innerMatcher));
-    }
-
-    @Test public void
-    returnsGoodDescriptionIfCreatedWithNullReference() {
-        assertDescription("null", equalTo(null));
-    }
-}
-
diff --git a/hamcrest-core/src/test/java/org/hamcrest/core/IsInstanceOfTest.java b/hamcrest-core/src/test/java/org/hamcrest/core/IsInstanceOfTest.java
deleted file mode 100644
index 8dd85af..0000000
--- a/hamcrest-core/src/test/java/org/hamcrest/core/IsInstanceOfTest.java
+++ /dev/null
@@ -1,69 +0,0 @@
-package org.hamcrest.core;
-
-import org.hamcrest.Matcher;
-import org.junit.Test;
-
-import static org.hamcrest.AbstractMatcherTest.*;
-import static org.hamcrest.core.IsInstanceOf.any;
-import static org.hamcrest.core.IsInstanceOf.instanceOf;
-
-public final class IsInstanceOfTest {
-
-    @Test public void
-    copesWithNullsAndUnknownTypes() {
-        Matcher<?> matcher = instanceOf(Number.class);
-
-        assertNullSafe(matcher);
-        assertUnknownTypeSafe(matcher);
-    }
-
-    @Test public void
-    evaluatesToTrueIfArgumentIsInstanceOfASpecificClass() {
-        final Matcher<Object> matcher = instanceOf(Number.class);
-
-        assertMatches(matcher, 1);
-        assertMatches(matcher, 1.1);
-        assertDoesNotMatch(matcher, null);
-        assertDoesNotMatch(matcher, new Object());
-    }
-
-    @Test public void
-    hasAReadableDescription() {
-        assertDescription("an instance of java.lang.Number", instanceOf(Number.class));
-    }
-
-    @Test public void
-    describesActualClassInMismatchMessage() {
-        assertMismatchDescription("\"some text\" is a java.lang.String", instanceOf(Number.class), "some text");
-    }
-
-    @Test public void
-    matchesPrimitiveTypes() {
-        assertMatches(any(boolean.class), true);
-        assertMatches(any(byte.class), (byte)1);
-        assertMatches(any(char.class), 'x');
-        assertMatches(any(double.class), 5.0);
-        assertMatches(any(float.class), 5.0f);
-        assertMatches(any(int.class), 2);
-        assertMatches(any(long.class), 4L);
-        assertMatches(any(short.class), (short)1);
-    }
-
-    @Test public void
-    instanceOfRequiresACastToReturnTheCorrectTypeForUseInJMock() {
-        @SuppressWarnings("unused")
-        Integer anInteger = (Integer)with(instanceOf(Integer.class));
-    }
-
-    @Test public void
-    anyWillReturnTheCorrectTypeForUseInJMock() {
-        @SuppressWarnings("unused")
-        Integer anInteger = with(any(Integer.class));
-    }
-
-
-    private static <T> T with(@SuppressWarnings("unused") Matcher<T> matcher) {
-        return null;
-    }
-}
-
diff --git a/hamcrest-core/src/test/java/org/hamcrest/core/IsNotTest.java b/hamcrest-core/src/test/java/org/hamcrest/core/IsNotTest.java
deleted file mode 100644
index 79f4683..0000000
--- a/hamcrest-core/src/test/java/org/hamcrest/core/IsNotTest.java
+++ /dev/null
@@ -1,42 +0,0 @@
-package org.hamcrest.core;
-
-import org.hamcrest.Matcher;
-import org.junit.Test;
-
-import static org.hamcrest.AbstractMatcherTest.*;
-import static org.hamcrest.core.IsEqual.equalTo;
-import static org.hamcrest.core.IsInstanceOf.instanceOf;
-import static org.hamcrest.core.IsNot.not;
-
-public final class IsNotTest {
-
-    @Test public void
-    copesWithNullsAndUnknownTypes() {
-        Matcher<String> matcher = not("something");
-
-        assertNullSafe(matcher);
-        assertUnknownTypeSafe(matcher);
-    }
-
-    @Test public void
-    evaluatesToTheTheLogicalNegationOfAnotherMatcher() {
-        final Matcher<String> matcher = not(equalTo("A"));
-
-        assertMatches(matcher, "B");
-        assertDoesNotMatch(matcher, "A");
-    }
-
-    @Test public void
-    providesConvenientShortcutForNotEqualTo() {
-        final Matcher<String> matcher = not("A");
-
-        assertMatches(matcher, "B");
-        assertDoesNotMatch(matcher, "A");
-    }
-
-    @Test public void
-    usesDescriptionOfNegatedMatcherWithPrefix() {
-        assertDescription("not an instance of java.lang.String", not(instanceOf(String.class)));
-        assertDescription("not \"A\"", not("A"));
-    }
-}
diff --git a/hamcrest-core/src/test/java/org/hamcrest/core/IsNullTest.java b/hamcrest-core/src/test/java/org/hamcrest/core/IsNullTest.java
deleted file mode 100644
index 74b046b..0000000
--- a/hamcrest-core/src/test/java/org/hamcrest/core/IsNullTest.java
+++ /dev/null
@@ -1,43 +0,0 @@
-package org.hamcrest.core;
-
-import org.hamcrest.Matcher;
-import org.junit.Test;
-
-import static org.hamcrest.AbstractMatcherTest.*;
-import static org.hamcrest.core.IsNull.notNullValue;
-import static org.hamcrest.core.IsNull.nullValue;
-
-
-public final class IsNullTest {
-
-    private final Matcher<Object> nullMatcher = nullValue();
-    private final Matcher<Object> notNullMatcher = notNullValue();
-
-    @Test public void
-    copesWithNullsAndUnknownTypes() {
-        assertNullSafe(nullMatcher);
-        assertUnknownTypeSafe(nullMatcher);
-        
-        assertNullSafe(notNullMatcher);
-        assertUnknownTypeSafe(notNullMatcher);
-    }
-
-    @Test public void
-    evaluatesToTrueIfArgumentIsNull() {
-        assertMatches(nullMatcher, null);
-        assertDoesNotMatch(nullMatcher, new Object());
-        
-        assertMatches(notNullMatcher, new Object());
-        assertDoesNotMatch(notNullMatcher, null);
-    }
-    
-    @Test public void
-    supportsStaticTyping() {
-        requiresStringMatcher(nullValue(String.class));
-        requiresStringMatcher(notNullValue(String.class));
-    }
-
-    private void requiresStringMatcher(@SuppressWarnings("unused") Matcher<String> arg) {
-        // no-op
-    }
-}
diff --git a/hamcrest-core/src/test/java/org/hamcrest/core/IsSameTest.java b/hamcrest-core/src/test/java/org/hamcrest/core/IsSameTest.java
deleted file mode 100644
index a4a2010..0000000
--- a/hamcrest-core/src/test/java/org/hamcrest/core/IsSameTest.java
+++ /dev/null
@@ -1,48 +0,0 @@
-package org.hamcrest.core;
-
-import org.hamcrest.Matcher;
-import org.junit.Test;
-
-import static org.hamcrest.AbstractMatcherTest.*;
-import static org.hamcrest.core.IsSame.sameInstance;
-import static org.hamcrest.core.IsSame.theInstance;
-
-
-public final class IsSameTest {
-
-    @Test public void
-    copesWithNullsAndUnknownTypes() {
-        Matcher<String> matcher = sameInstance("irrelevant");
-        
-        assertNullSafe(matcher);
-        assertUnknownTypeSafe(matcher);
-    }
-
-    @Test public void
-    evaluatesToTrueIfArgumentIsReferenceToASpecifiedObject() {
-        Object o1 = new Object();
-        Matcher<Object> matcher = sameInstance(o1);
-
-        assertMatches(matcher, o1);
-        assertDoesNotMatch(matcher, new Object());
-    }
-
-    @Test public void
-    alternativeFactoryMethodAlsoMatchesOnlyIfArgumentIsReferenceToASpecifiedObject() {
-        Object o1 = new Object();
-        Matcher<Object> matcher = theInstance(o1);
-
-        assertMatches(matcher, o1);
-        assertDoesNotMatch(matcher, new Object());
-    }
-
-    @Test public void
-    returnsReadableDescriptionFromToString() {
-        assertDescription("sameInstance(\"ARG\")", sameInstance("ARG"));
-    }
-
-    @Test public void
-    returnsReadableDescriptionFromToStringWhenInitialisedWithNull() {
-        assertDescription("sameInstance(null)", sameInstance(null));
-    }
-}
diff --git a/hamcrest-core/src/test/java/org/hamcrest/core/IsTest.java b/hamcrest-core/src/test/java/org/hamcrest/core/IsTest.java
deleted file mode 100644
index 6656e6d..0000000
--- a/hamcrest-core/src/test/java/org/hamcrest/core/IsTest.java
+++ /dev/null
@@ -1,51 +0,0 @@
-package org.hamcrest.core;
-
-import org.hamcrest.Matcher;
-import org.junit.Test;
-
-import static org.hamcrest.AbstractMatcherTest.*;
-import static org.hamcrest.core.Is.is;
-import static org.hamcrest.core.Is.isA;
-import static org.hamcrest.core.IsEqual.equalTo;
-
-public final class IsTest {
-
-    @Test public void
-    copesWithNullsAndUnknownTypes() {
-        Matcher<String> matcher = is("something");
-        
-        assertNullSafe(matcher);
-        assertUnknownTypeSafe(matcher);
-    }
-
-    @Test public void
-    matchesTheSameWayTheUnderlyingMatcherDoes() {
-        final Matcher<Boolean> matcher = is(equalTo(true));
-
-        assertMatches(matcher, true);
-        assertDoesNotMatch(matcher, false);
-    }
-
-    @Test public void
-    generatesIsPrefixInDescription() {
-        assertDescription("is <true>", is(equalTo(true)));
-        assertDescription("is \"A\"", is("A"));
-    }
-
-    @Test public void
-    providesConvenientShortcutForIsEqualTo() {
-        final Matcher<String> matcher = is("A");
-        
-        assertMatches(matcher, "A");
-        assertDoesNotMatch(is("A"), "B");
-    }
-
-    @SuppressWarnings({ "unchecked", "rawtypes" })
-    @Test public void
-    providesConvenientShortcutForIsInstanceOf() {
-        final Matcher matcher = isA(Integer.class);
-        assertMatches(matcher, 1);
-        assertDoesNotMatch(matcher, new Object());
-        assertDoesNotMatch(matcher, null);
-    }
-}
diff --git a/hamcrest-core/src/test/java/org/hamcrest/core/SampleBaseClass.java b/hamcrest-core/src/test/java/org/hamcrest/core/SampleBaseClass.java
deleted file mode 100644
index baf4d8e..0000000
--- a/hamcrest-core/src/test/java/org/hamcrest/core/SampleBaseClass.java
+++ /dev/null
@@ -1,24 +0,0 @@
-package org.hamcrest.core;
-
-public class SampleBaseClass {
-    String value;
-
-    public SampleBaseClass(String value) {
-        this.value = value;
-    }
-
-    @Override
-    public String toString() {
-        return value;
-    }
-
-    @Override
-    public boolean equals(Object obj) {
-        return obj instanceof SampleBaseClass && value.equals(((SampleBaseClass) obj).value);
-    }
-
-    @Override
-    public int hashCode() {
-      return value.hashCode();
-    }
-}
diff --git a/hamcrest-core/src/test/java/org/hamcrest/core/SampleSubClass.java b/hamcrest-core/src/test/java/org/hamcrest/core/SampleSubClass.java
deleted file mode 100644
index bdaa160..0000000
--- a/hamcrest-core/src/test/java/org/hamcrest/core/SampleSubClass.java
+++ /dev/null
@@ -1,9 +0,0 @@
-package org.hamcrest.core;
-
-public class SampleSubClass extends SampleBaseClass {
-    
-    public SampleSubClass(String value) {
-        super(value);
-    }
-
-}
diff --git a/hamcrest-core/src/test/java/org/hamcrest/core/StringContainsTest.java b/hamcrest-core/src/test/java/org/hamcrest/core/StringContainsTest.java
deleted file mode 100644
index 93dd05c..0000000
--- a/hamcrest-core/src/test/java/org/hamcrest/core/StringContainsTest.java
+++ /dev/null
@@ -1,43 +0,0 @@
-package org.hamcrest.core;
-
-import org.hamcrest.AbstractMatcherTest;
-import org.hamcrest.Matcher;
-
-import static org.hamcrest.core.StringContains.containsString;
-import static org.hamcrest.core.StringContains.containsStringIgnoringCase;
-
-
-public class StringContainsTest extends AbstractMatcherTest {
-    static final String EXCERPT = "EXCERPT";
-    final Matcher<String> stringContains = containsString(EXCERPT);
-
-    @Override
-    protected Matcher<?> createMatcher() {
-        return stringContains;
-    }
-
-    public void testMatchesSubstrings() {
-        assertMatches(stringContains, EXCERPT + "END");
-        assertMatches(stringContains, "START" + EXCERPT);
-        assertMatches(stringContains, "START" + EXCERPT + "END");
-        assertMatches(stringContains, EXCERPT);
-        assertDoesNotMatch(stringContains, EXCERPT.toLowerCase());
-        assertMatches(stringContains, EXCERPT + EXCERPT);
-        assertDoesNotMatch(stringContains, "XC");
-
-        assertMismatchDescription("was \"Something else\"", stringContains, "Something else");
-        assertDescription("a string containing \"EXCERPT\"", stringContains);
-    }
-
-    public void testMatchesSubstringsIgnoringCase() {
-        final Matcher<String> ignoringCase = containsStringIgnoringCase("ExCert");
-        assertMatches(ignoringCase, "eXcERT" + "END");
-        assertMatches(ignoringCase, "START" + "EXCert");
-        assertMatches(ignoringCase, "START" + "excERT" + "END");
-        assertMatches(ignoringCase, "eXCert" + "excErt");
-        assertDoesNotMatch(ignoringCase, "xc");
-
-        assertMismatchDescription("was \"Something else\"", ignoringCase, "Something else");
-        assertDescription("a string containing \"ExCert\" ignoring case", ignoringCase);
-    }
-}
diff --git a/hamcrest-core/src/test/java/org/hamcrest/core/StringEndsWithTest.java b/hamcrest-core/src/test/java/org/hamcrest/core/StringEndsWithTest.java
deleted file mode 100644
index f482cbf..0000000
--- a/hamcrest-core/src/test/java/org/hamcrest/core/StringEndsWithTest.java
+++ /dev/null
@@ -1,45 +0,0 @@
-package org.hamcrest.core;
-
-import org.hamcrest.AbstractMatcherTest;
-import org.hamcrest.Matcher;
-
-import static org.hamcrest.core.StringEndsWith.endsWith;
-import static org.hamcrest.core.StringEndsWith.endsWithIgnoringCase;
-
-
-public class StringEndsWithTest extends AbstractMatcherTest {
-    static final String EXCERPT = "EXCERPT";
-    final Matcher<String> stringEndsWith = endsWith(EXCERPT);
-
-    @Override
-    protected Matcher<?> createMatcher() {
-        return stringEndsWith;
-    }
-
-    public void testMatchesSubstringAtEnd() {
-        assertDoesNotMatch(stringEndsWith, EXCERPT + "END");
-        assertMatches(stringEndsWith, "START" + EXCERPT);
-        assertMatches(stringEndsWith, EXCERPT);
-        assertDoesNotMatch(stringEndsWith, EXCERPT.toLowerCase());
-        assertDoesNotMatch(stringEndsWith, "START" + EXCERPT + "END");
-        assertMatches(stringEndsWith, EXCERPT + EXCERPT);
-        assertDoesNotMatch(stringEndsWith, "EXCER");
-
-        assertMismatchDescription("was \"Something else\"", stringEndsWith, "Something else");
-        assertDescription("a string ending with \"EXCERPT\"", stringEndsWith);
-    }
-
-    public void testMatchesSubstringAtEndIngoringCase() {
-        final Matcher<String> ignoringCase = endsWithIgnoringCase("EXCERpt");
-        assertDoesNotMatch(ignoringCase, "eXCErpt" + "END");
-        assertMatches(ignoringCase, "START" + "EXceRpt");
-        assertMatches(ignoringCase, "EXcerPT");
-        assertDoesNotMatch(ignoringCase, "START" + "ExcERpt" + "END");
-        assertMatches(ignoringCase, "exCERpt" + "EXCerPt");
-        assertDoesNotMatch(ignoringCase, "ExcER");
-
-        assertMismatchDescription("was \"Something else\"", ignoringCase, "Something else");
-        assertDescription("a string ending with \"EXCERpt\" ignoring case", ignoringCase);
-    }
-
-}
diff --git a/hamcrest-core/src/test/java/org/hamcrest/core/StringStartsWithTest.java b/hamcrest-core/src/test/java/org/hamcrest/core/StringStartsWithTest.java
deleted file mode 100644
index f093acb..0000000
--- a/hamcrest-core/src/test/java/org/hamcrest/core/StringStartsWithTest.java
+++ /dev/null
@@ -1,46 +0,0 @@
-package org.hamcrest.core;
-
-import org.hamcrest.AbstractMatcherTest;
-import org.hamcrest.Matcher;
-
-import static org.hamcrest.core.StringStartsWith.startsWith;
-import static org.hamcrest.core.StringStartsWith.startsWithIgnoringCase;
-
-
-public class StringStartsWithTest extends AbstractMatcherTest {
-    static final String EXCERPT = "EXCERPT";
-    final Matcher<String> stringStartsWith = startsWith(EXCERPT);
-
-    @Override
-    protected Matcher<?> createMatcher() {
-        return stringStartsWith;
-    }
-
-    public void testMatchesStringAtStart() {
-        assertMatches(stringStartsWith, EXCERPT + "END");
-        assertDoesNotMatch(stringStartsWith, "START" + EXCERPT);
-        assertDoesNotMatch(stringStartsWith, "START" + EXCERPT + "END");
-        assertMatches(stringStartsWith, EXCERPT);
-        assertDoesNotMatch(stringStartsWith, EXCERPT.toLowerCase());
-        assertMatches(stringStartsWith, EXCERPT + EXCERPT);
-        assertDoesNotMatch(stringStartsWith, "EXCER");
-
-        assertDescription("a string starting with \"EXCERPT\"", stringStartsWith);
-        assertMismatchDescription("was \"Something else\"", stringStartsWith, "Something else");
-    }
-
-    public void testMatchesStringAtStartIgnoringCase() {
-        final Matcher<String> ignoreCase = startsWithIgnoringCase("EXCerPT");
-
-        assertMatches(ignoreCase, "exCerPT" + "END");
-        assertDoesNotMatch(ignoreCase, "START" + "EXCerpt");
-        assertDoesNotMatch(ignoreCase, "START" + "EXcerpT" + "END");
-        assertMatches(ignoreCase, "excERPT");
-        assertMatches(ignoreCase, "ExcerPT" + "EXCerpt");
-        assertDoesNotMatch(ignoreCase, "ExcER");
-
-        assertDescription("a string starting with \"EXCerPT\" ignoring case", ignoreCase);
-        assertMismatchDescription("was \"Something else\"", ignoreCase, "Something else");
-    }
-
-}
diff --git a/hamcrest-library/LICENSE.txt b/hamcrest-library/LICENSE.txt
new file mode 100644
index 0000000..5ebe92c
--- /dev/null
+++ b/hamcrest-library/LICENSE.txt
@@ -0,0 +1,27 @@
+BSD License
+
+Copyright (c) 2000-2006, www.hamcrest.org
+All rights reserved.
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are met:
+
+Redistributions of source code must retain the above copyright notice, this list of
+conditions and the following disclaimer. Redistributions in binary form must reproduce
+the above copyright notice, this list of conditions and the following disclaimer in
+the documentation and/or other materials provided with the distribution.
+
+Neither the name of Hamcrest nor the names of its contributors may be used to endorse
+or promote products derived from this software without specific prior written
+permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY
+EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT
+SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED
+TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
+BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY
+WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH
+DAMAGE.
diff --git a/hamcrest-library/README.android b/hamcrest-library/README.android
new file mode 100644
index 0000000..dd099ed
--- /dev/null
+++ b/hamcrest-library/README.android
@@ -0,0 +1 @@
+Ssource obtained from https://hamcrest.googlecode.com/files/hamcrest-library-1.1.jar, with org.hamcrest.beans removed
diff --git a/hamcrest-library/build.gradle b/hamcrest-library/build.gradle
new file mode 100644
index 0000000..54ab15f
--- /dev/null
+++ b/hamcrest-library/build.gradle
@@ -0,0 +1,13 @@
+apply plugin: 'java'
+
+sourceSets {
+    main {
+        java {
+            srcDirs = ['src']
+        }
+    }
+}
+
+dependencies {
+    compile project(':hamcrest')
+}
diff --git a/hamcrest-library/src/main/java/org/hamcrest/Matchers.java b/hamcrest-library/src/main/java/org/hamcrest/Matchers.java
index b04c45d..2e82aa0 100644
--- a/hamcrest-library/src/main/java/org/hamcrest/Matchers.java
+++ b/hamcrest-library/src/main/java/org/hamcrest/Matchers.java
@@ -1,204 +1,28 @@
+// Generated source.
 package org.hamcrest;
 
 public class Matchers {
 
-  /**
-   * Creates a matcher that matches if the examined object matches <b>ALL</b> of the specified matchers.
-   * For example:
-   * <pre>assertThat("myValue", allOf(startsWith("my"), containsString("Val")))</pre>
-   */
-  public static <T> org.hamcrest.Matcher<T> allOf(java.lang.Iterable<org.hamcrest.Matcher<? super T>> matchers) {
-    return org.hamcrest.core.AllOf.<T>allOf(matchers);
-  }
+    /**
+     * Decorates another Matcher, retaining the behavior but allowing tests
+     * to be slightly more expressive.
+     * 
+     * eg. assertThat(cheese, equalTo(smelly))
+     * vs assertThat(cheese, is(equalTo(smelly)))
+     */
+    public static <T> org.hamcrest.Matcher<T> is(org.hamcrest.Matcher<T> matcher) {
+        return org.hamcrest.core.Is.is(matcher);
+    }
 
-  /**
-   * Creates a matcher that matches if the examined object matches <b>ALL</b> of the specified matchers.
-   * For example:
-   * <pre>assertThat("myValue", allOf(startsWith("my"), containsString("Val")))</pre>
-   */
-  public static <T> org.hamcrest.Matcher<T> allOf(org.hamcrest.Matcher<? super T>... matchers) {
-    return org.hamcrest.core.AllOf.<T>allOf(matchers);
-  }
-
-  /**
-   * Creates a matcher that matches if the examined object matches <b>ALL</b> of the specified matchers.
-   * For example:
-   * <pre>assertThat("myValue", allOf(startsWith("my"), containsString("Val")))</pre>
-   */
-  public static <T> org.hamcrest.Matcher<T> allOf(org.hamcrest.Matcher<? super T> first, org.hamcrest.Matcher<? super T> second) {
-    return org.hamcrest.core.AllOf.<T>allOf(first, second);
-  }
-
-  /**
-   * Creates a matcher that matches if the examined object matches <b>ALL</b> of the specified matchers.
-   * For example:
-   * <pre>assertThat("myValue", allOf(startsWith("my"), containsString("Val")))</pre>
-   */
-  public static <T> org.hamcrest.Matcher<T> allOf(org.hamcrest.Matcher<? super T> first, org.hamcrest.Matcher<? super T> second, org.hamcrest.Matcher<? super T> third) {
-    return org.hamcrest.core.AllOf.<T>allOf(first, second, third);
-  }
-
-  /**
-   * Creates a matcher that matches if the examined object matches <b>ALL</b> of the specified matchers.
-   * For example:
-   * <pre>assertThat("myValue", allOf(startsWith("my"), containsString("Val")))</pre>
-   */
-  public static <T> org.hamcrest.Matcher<T> allOf(org.hamcrest.Matcher<? super T> first, org.hamcrest.Matcher<? super T> second, org.hamcrest.Matcher<? super T> third, org.hamcrest.Matcher<? super T> fourth) {
-    return org.hamcrest.core.AllOf.<T>allOf(first, second, third, fourth);
-  }
-
-  /**
-   * Creates a matcher that matches if the examined object matches <b>ALL</b> of the specified matchers.
-   * For example:
-   * <pre>assertThat("myValue", allOf(startsWith("my"), containsString("Val")))</pre>
-   */
-  public static <T> org.hamcrest.Matcher<T> allOf(org.hamcrest.Matcher<? super T> first, org.hamcrest.Matcher<? super T> second, org.hamcrest.Matcher<? super T> third, org.hamcrest.Matcher<? super T> fourth, org.hamcrest.Matcher<? super T> fifth) {
-    return org.hamcrest.core.AllOf.<T>allOf(first, second, third, fourth, fifth);
-  }
-
-  /**
-   * Creates a matcher that matches if the examined object matches <b>ALL</b> of the specified matchers.
-   * For example:
-   * <pre>assertThat("myValue", allOf(startsWith("my"), containsString("Val")))</pre>
-   */
-  public static <T> org.hamcrest.Matcher<T> allOf(org.hamcrest.Matcher<? super T> first, org.hamcrest.Matcher<? super T> second, org.hamcrest.Matcher<? super T> third, org.hamcrest.Matcher<? super T> fourth, org.hamcrest.Matcher<? super T> fifth, org.hamcrest.Matcher<? super T> sixth) {
-    return org.hamcrest.core.AllOf.<T>allOf(first, second, third, fourth, fifth, sixth);
-  }
-
-  /**
-   * Creates a matcher that matches if the examined object matches <b>ANY</b> of the specified matchers.
-   * For example:
-   * <pre>assertThat("myValue", anyOf(startsWith("foo"), containsString("Val")))</pre>
-   */
-  public static <T> org.hamcrest.core.AnyOf<T> anyOf(java.lang.Iterable<org.hamcrest.Matcher<? super T>> matchers) {
-    return org.hamcrest.core.AnyOf.<T>anyOf(matchers);
-  }
-
-  /**
-   * Creates a matcher that matches if the examined object matches <b>ANY</b> of the specified matchers.
-   * For example:
-   * <pre>assertThat("myValue", anyOf(startsWith("foo"), containsString("Val")))</pre>
-   */
-  public static <T> org.hamcrest.core.AnyOf<T> anyOf(org.hamcrest.Matcher<? super T>... matchers) {
-    return org.hamcrest.core.AnyOf.<T>anyOf(matchers);
-  }
-
-  /**
-   * Creates a matcher that matches if the examined object matches <b>ANY</b> of the specified matchers.
-   * For example:
-   * <pre>assertThat("myValue", anyOf(startsWith("foo"), containsString("Val")))</pre>
-   */
-  public static <T> org.hamcrest.core.AnyOf<T> anyOf(org.hamcrest.Matcher<T> first, org.hamcrest.Matcher<? super T> second) {
-    return org.hamcrest.core.AnyOf.<T>anyOf(first, second);
-  }
-
-  /**
-   * Creates a matcher that matches if the examined object matches <b>ANY</b> of the specified matchers.
-   * For example:
-   * <pre>assertThat("myValue", anyOf(startsWith("foo"), containsString("Val")))</pre>
-   */
-  public static <T> org.hamcrest.core.AnyOf<T> anyOf(org.hamcrest.Matcher<T> first, org.hamcrest.Matcher<? super T> second, org.hamcrest.Matcher<? super T> third) {
-    return org.hamcrest.core.AnyOf.<T>anyOf(first, second, third);
-  }
-
-  /**
-   * Creates a matcher that matches if the examined object matches <b>ANY</b> of the specified matchers.
-   * For example:
-   * <pre>assertThat("myValue", anyOf(startsWith("foo"), containsString("Val")))</pre>
-   */
-  public static <T> org.hamcrest.core.AnyOf<T> anyOf(org.hamcrest.Matcher<T> first, org.hamcrest.Matcher<? super T> second, org.hamcrest.Matcher<? super T> third, org.hamcrest.Matcher<? super T> fourth) {
-    return org.hamcrest.core.AnyOf.<T>anyOf(first, second, third, fourth);
-  }
-
-  /**
-   * Creates a matcher that matches if the examined object matches <b>ANY</b> of the specified matchers.
-   * For example:
-   * <pre>assertThat("myValue", anyOf(startsWith("foo"), containsString("Val")))</pre>
-   */
-  public static <T> org.hamcrest.core.AnyOf<T> anyOf(org.hamcrest.Matcher<T> first, org.hamcrest.Matcher<? super T> second, org.hamcrest.Matcher<? super T> third, org.hamcrest.Matcher<? super T> fourth, org.hamcrest.Matcher<? super T> fifth) {
-    return org.hamcrest.core.AnyOf.<T>anyOf(first, second, third, fourth, fifth);
-  }
-
-  /**
-   * Creates a matcher that matches if the examined object matches <b>ANY</b> of the specified matchers.
-   * For example:
-   * <pre>assertThat("myValue", anyOf(startsWith("foo"), containsString("Val")))</pre>
-   */
-  public static <T> org.hamcrest.core.AnyOf<T> anyOf(org.hamcrest.Matcher<T> first, org.hamcrest.Matcher<? super T> second, org.hamcrest.Matcher<? super T> third, org.hamcrest.Matcher<? super T> fourth, org.hamcrest.Matcher<? super T> fifth, org.hamcrest.Matcher<? super T> sixth) {
-    return org.hamcrest.core.AnyOf.<T>anyOf(first, second, third, fourth, fifth, sixth);
-  }
-
-  /**
-   * Creates a matcher that matches when both of the specified matchers match the examined object.
-   * For example:
-   * <pre>assertThat("fab", both(containsString("a")).and(containsString("b")))</pre>
-   */
-  public static <LHS> org.hamcrest.core.CombinableMatcher.CombinableBothMatcher<LHS> both(org.hamcrest.Matcher<? super LHS> matcher) {
-    return org.hamcrest.core.CombinableMatcher.<LHS>both(matcher);
-  }
-
-  /**
-   * Creates a matcher that matches when either of the specified matchers match the examined object.
-   * For example:
-   * <pre>assertThat("fan", either(containsString("a")).or(containsString("b")))</pre>
-   */
-  public static <LHS> org.hamcrest.core.CombinableMatcher.CombinableEitherMatcher<LHS> either(org.hamcrest.Matcher<? super LHS> matcher) {
-    return org.hamcrest.core.CombinableMatcher.<LHS>either(matcher);
-  }
-
-  /**
-   * Wraps an existing matcher, overriding its description with that specified.  All other functions are
-   * delegated to the decorated matcher, including its mismatch description.
-   * For example:
-   * <pre>describedAs("a big decimal equal to %0", equalTo(myBigDecimal), myBigDecimal.toPlainString())</pre>
-   * 
-   * @param description
-   *     the new description for the wrapped matcher
-   * @param matcher
-   *     the matcher to wrap
-   * @param values
-   *     optional values to insert into the tokenised description
-   */
-  public static <T> org.hamcrest.Matcher<T> describedAs(java.lang.String description, org.hamcrest.Matcher<T> matcher, java.lang.Object... values) {
-    return org.hamcrest.core.DescribedAs.<T>describedAs(description, matcher, values);
-  }
-
-  /**
-   * Creates a matcher for {@link Iterable}s that only matches when a single pass over the
-   * examined {@link Iterable} yields items that are all matched by the specified
-   * <code>itemMatcher</code>.
-   * For example:
-   * <pre>assertThat(Arrays.asList("bar", "baz"), everyItem(startsWith("ba")))</pre>
-   * 
-   * @param itemMatcher
-   *     the matcher to apply to every item provided by the examined {@link Iterable}
-   */
-  public static <U> org.hamcrest.Matcher<java.lang.Iterable<? extends U>> everyItem(org.hamcrest.Matcher<U> itemMatcher) {
-    return org.hamcrest.core.Every.<U>everyItem(itemMatcher);
-  }
-
-  /**
-   * Decorates another Matcher, retaining its behaviour, but allowing tests
-   * to be slightly more expressive.
-   * For example:
-   * <pre>assertThat(cheese, is(equalTo(smelly)))</pre>
-   * instead of:
-   * <pre>assertThat(cheese, equalTo(smelly))</pre>
-   */
-  public static <T> org.hamcrest.Matcher<T> is(org.hamcrest.Matcher<T> matcher) {
-    return org.hamcrest.core.Is.<T>is(matcher);
-  }
-
-  /**
-   * A shortcut to the frequently used <code>is(equalTo(x))</code>.
-   * For example:
-   * <pre>assertThat(cheese, is(smelly))</pre>
-   * instead of:
-   * <pre>assertThat(cheese, is(equalTo(smelly)))</pre>
-   */
-  public static <T> org.hamcrest.Matcher<T> is(T value) {
-    return org.hamcrest.core.Is.<T>is(value);
-  }
+    /**
+     * This is a shortcut to the frequently used is(equalTo(x)).
+     * 
+     * eg. assertThat(cheese, is(equalTo(smelly)))
+     * vs assertThat(cheese, is(smelly))
+     */
+    public static <T> org.hamcrest.Matcher<T> is(T value) {
+        return org.hamcrest.core.Is.is(value);
+    }
 
   /**
    * Provided to cause compile time error when used in preference to a possible runtime error if
@@ -216,1370 +40,275 @@
   public static void is(java.lang.Class<?> type) {
   }
 
-  /**
-   * A shortcut to the frequently used <code>is(instanceOf(SomeClass.class))</code>.
-   * For example:
-   * <pre>assertThat(cheese, isA(Cheddar.class))</pre>
-   * instead of:
-   * <pre>assertThat(cheese, is(instanceOf(Cheddar.class)))</pre>
-   */
-  public static <T> org.hamcrest.Matcher<T> isA(java.lang.Class<T> type) {
-    return org.hamcrest.core.Is.<T>isA(type);
-  }
+    /**
+     * Inverts the rule.
+     */
+    public static <T> org.hamcrest.Matcher<T> not(org.hamcrest.Matcher<T> matcher) {
+        return org.hamcrest.core.IsNot.not(matcher);
+    }
 
-  /**
-   * Creates a matcher that always matches, regardless of the examined object.
-   */
-  public static org.hamcrest.Matcher<java.lang.Object> anything() {
-    return org.hamcrest.core.IsAnything.anything();
-  }
+    /**
+     * This is a shortcut to the frequently used not(equalTo(x)).
+     * 
+     * eg. assertThat(cheese, is(not(equalTo(smelly))))
+     * vs assertThat(cheese, is(not(smelly)))
+     */
+    public static <T> org.hamcrest.Matcher<T> not(T value) {
+        return org.hamcrest.core.IsNot.not(value);
+    }
 
-  /**
-   * Creates a matcher that always matches, regardless of the examined object, but describes
-   * itself with the specified {@link String}.
-   * 
-   * @param description
-   *     a meaningful {@link String} used when describing itself
-   */
-  public static org.hamcrest.Matcher<java.lang.Object> anything(java.lang.String description) {
-    return org.hamcrest.core.IsAnything.anything(description);
-  }
+    /**
+     * Is the value equal to another value, as tested by the
+     * {@link java.lang.Object#equals} invokedMethod?
+     */
+    public static <T> org.hamcrest.Matcher<T> equalTo(T operand) {
+        return org.hamcrest.core.IsEqual.equalTo(operand);
+    }
 
-  /**
-   * Creates a matcher for {@link Iterable}s that only matches when a single pass over the
-   * examined {@link Iterable} yields at least one item that is matched by the specified
-   * <code>itemMatcher</code>.  Whilst matching, the traversal of the examined {@link Iterable}
-   * will stop as soon as a matching item is found.
-   * For example:
-   * <pre>assertThat(Arrays.asList("foo", "bar"), hasItem(startsWith("ba")))</pre>
-   * 
-   * @param itemMatcher
-   *     the matcher to apply to items provided by the examined {@link Iterable}
-   */
-  public static <T> org.hamcrest.Matcher<java.lang.Iterable<? super T>> hasItem(org.hamcrest.Matcher<? super T> itemMatcher) {
-    return org.hamcrest.core.IsCollectionContaining.<T>hasItem(itemMatcher);
-  }
+    /**
+     * Is the value an instance of a particular type?
+     */
+    public static org.hamcrest.Matcher<java.lang.Object> instanceOf(java.lang.Class<?> type) {
+        return org.hamcrest.core.IsInstanceOf.instanceOf(type);
+    }
 
-  /**
-   * Creates a matcher for {@link Iterable}s that only matches when a single pass over the
-   * examined {@link Iterable} yields at least one item that is equal to the specified
-   * <code>item</code>.  Whilst matching, the traversal of the examined {@link Iterable}
-   * will stop as soon as a matching item is found.
-   * For example:
-   * <pre>assertThat(Arrays.asList("foo", "bar"), hasItem("bar"))</pre>
-   * 
-   * @param item
-   *     the item to compare against the items provided by the examined {@link Iterable}
-   */
-  public static <T> org.hamcrest.Matcher<java.lang.Iterable<? super T>> hasItem(T item) {
-    return org.hamcrest.core.IsCollectionContaining.<T>hasItem(item);
-  }
+    /**
+     * Evaluates to true only if ALL of the passed in matchers evaluate to true.
+     */
+    public static <T> org.hamcrest.Matcher<T> allOf(org.hamcrest.Matcher<? extends T>... matchers) {
+        return org.hamcrest.core.AllOf.<T>allOf(matchers);
+    }
 
-  /**
-   * Creates a matcher for {@link Iterable}s that matches when consecutive passes over the
-   * examined {@link Iterable} yield at least one item that is matched by the corresponding
-   * matcher from the specified <code>itemMatchers</code>.  Whilst matching, each traversal of
-   * the examined {@link Iterable} will stop as soon as a matching item is found.
-   * For example:
-   * <pre>assertThat(Arrays.asList("foo", "bar", "baz"), hasItems(endsWith("z"), endsWith("o")))</pre>
-   * 
-   * @param itemMatchers
-   *     the matchers to apply to items provided by the examined {@link Iterable}
-   */
-  public static <T> org.hamcrest.Matcher<java.lang.Iterable<T>> hasItems(org.hamcrest.Matcher<? super T>... itemMatchers) {
-    return org.hamcrest.core.IsCollectionContaining.<T>hasItems(itemMatchers);
-  }
+    /**
+     * Evaluates to true only if ALL of the passed in matchers evaluate to true.
+     */
+    public static <T> org.hamcrest.Matcher<T> allOf(java.lang.Iterable<org.hamcrest.Matcher<? extends T>> matchers) {
+        return org.hamcrest.core.AllOf.allOf(matchers);
+    }
 
-  /**
-   * Creates a matcher for {@link Iterable}s that matches when consecutive passes over the
-   * examined {@link Iterable} yield at least one item that is equal to the corresponding
-   * item from the specified <code>items</code>.  Whilst matching, each traversal of the
-   * examined {@link Iterable} will stop as soon as a matching item is found.
-   * For example:
-   * <pre>assertThat(Arrays.asList("foo", "bar", "baz"), hasItems("baz", "foo"))</pre>
-   * 
-   * @param items
-   *     the items to compare against the items provided by the examined {@link Iterable}
-   */
-  public static <T> org.hamcrest.Matcher<java.lang.Iterable<T>> hasItems(T... items) {
-    return org.hamcrest.core.IsCollectionContaining.<T>hasItems(items);
-  }
+    /**
+     * Evaluates to true if ANY of the passed in matchers evaluate to true.
+     */
+    public static <T> org.hamcrest.Matcher<T> anyOf(org.hamcrest.Matcher<? extends T>... matchers) {
+        return org.hamcrest.core.AnyOf.<T>anyOf(matchers);
+    }
 
-  /**
-   * Creates a matcher that matches when the examined object is logically equal to the specified
-   * <code>operand</code>, as determined by calling the {@link java.lang.Object#equals} method on
-   * the <b>examined</b> object.
-   * 
-   * <p>If the specified operand is <code>null</code> then the created matcher will only match if
-   * the examined object's <code>equals</code> method returns <code>true</code> when passed a
-   * <code>null</code> (which would be a violation of the <code>equals</code> contract), unless the
-   * examined object itself is <code>null</code>, in which case the matcher will return a positive
-   * match.</p>
-   * 
-   * <p>The created matcher provides a special behaviour when examining <code>Array</code>s, whereby
-   * it will match if both the operand and the examined object are arrays of the same length and
-   * contain items that are equal to each other (according to the above rules) <b>in the same
-   * indexes</b>.</p> 
-   * For example:
-   * <pre>
-   * assertThat("foo", equalTo("foo"));
-   * assertThat(new String[] {"foo", "bar"}, equalTo(new String[] {"foo", "bar"}));
-   * </pre>
-   */
-  public static <T> org.hamcrest.Matcher<T> equalTo(T operand) {
-    return org.hamcrest.core.IsEqual.<T>equalTo(operand);
-  }
+    /**
+     * Evaluates to true if ANY of the passed in matchers evaluate to true.
+     */
+    public static <T> org.hamcrest.Matcher<T> anyOf(java.lang.Iterable<org.hamcrest.Matcher<? extends T>> matchers) {
+        return org.hamcrest.core.AnyOf.anyOf(matchers);
+    }
 
-  /**
-   * Creates an {@link org.hamcrest.core.IsEqual} matcher that does not enforce the values being
-   * compared to be of the same static type.
-   */
-  public static org.hamcrest.Matcher<java.lang.Object> equalToObject(java.lang.Object operand) {
-    return org.hamcrest.core.IsEqual.equalToObject(operand);
-  }
+    /**
+     * Creates a new instance of IsSame
+     * 
+     * @param object The predicate evaluates to true only when the argument is
+     * this object.
+     */
+    public static <T> org.hamcrest.Matcher<T> sameInstance(T object) {
+        return org.hamcrest.core.IsSame.sameInstance(object);
+    }
 
-  /**
-   * Creates a matcher that matches when the examined object is an instance of the specified <code>type</code>,
-   * as determined by calling the {@link java.lang.Class#isInstance(Object)} method on that type, passing the
-   * the examined object.
-   * 
-   * <p>The created matcher forces a relationship between specified type and the examined object, and should be
-   * used when it is necessary to make generics conform, for example in the JMock clause
-   * <code>with(any(Thing.class))</code></p>
-   * For example:
-   * <pre>assertThat(new Canoe(), instanceOf(Canoe.class));</pre>
-   */
-  public static <T> org.hamcrest.Matcher<T> any(java.lang.Class<T> type) {
-    return org.hamcrest.core.IsInstanceOf.<T>any(type);
-  }
+    /**
+     * This matcher always evaluates to true.
+     */
+    public static <T> org.hamcrest.Matcher<T> anything() {
+        return org.hamcrest.core.IsAnything.anything();
+    }
 
-  /**
-   * Creates a matcher that matches when the examined object is an instance of the specified <code>type</code>,
-   * as determined by calling the {@link java.lang.Class#isInstance(Object)} method on that type, passing the
-   * the examined object.
-   * 
-   * <p>The created matcher assumes no relationship between specified type and the examined object.</p>
-   * For example:
-   * <pre>assertThat(new Canoe(), instanceOf(Paddlable.class));</pre>
-   */
-  public static <T> org.hamcrest.Matcher<T> instanceOf(java.lang.Class<?> type) {
-    return org.hamcrest.core.IsInstanceOf.<T>instanceOf(type);
-  }
+    /**
+     * This matcher always evaluates to true.
+     * 
+     * @param description A meaningful string used when describing itself.
+     */
+    public static <T> org.hamcrest.Matcher<T> anything(java.lang.String description) {
+        return org.hamcrest.core.IsAnything.anything(description);
+    }
 
-  /**
-   * Creates a matcher that wraps an existing matcher, but inverts the logic by which
-   * it will match.
-   * For example:
-   * <pre>assertThat(cheese, is(not(equalTo(smelly))))</pre>
-   * 
-   * @param matcher
-   *     the matcher whose sense should be inverted
-   */
-  public static <T> org.hamcrest.Matcher<T> not(org.hamcrest.Matcher<T> matcher) {
-    return org.hamcrest.core.IsNot.<T>not(matcher);
-  }
+    /**
+     * This matcher always evaluates to true. With type inference.
+     */
+    public static <T> org.hamcrest.Matcher<T> any(java.lang.Class<T> type) {
+        return org.hamcrest.core.IsAnything.any(type);
+    }
 
-  /**
-   * A shortcut to the frequently used <code>not(equalTo(x))</code>.
-   * For example:
-   * <pre>assertThat(cheese, is(not(smelly)))</pre>
-   * instead of:
-   * <pre>assertThat(cheese, is(not(equalTo(smelly))))</pre>
-   * 
-   * @param value
-   *     the value that any examined object should <b>not</b> equal
-   */
-  public static <T> org.hamcrest.Matcher<T> not(T value) {
-    return org.hamcrest.core.IsNot.<T>not(value);
-  }
+    /**
+     * Matches if value is null.
+     */
+    public static <T> org.hamcrest.Matcher<T> nullValue() {
+        return org.hamcrest.core.IsNull.nullValue();
+    }
 
-  /**
-   * A shortcut to the frequently used <code>not(nullValue())</code>.
-   * For example:
-   * <pre>assertThat(cheese, is(notNullValue()))</pre>
-   * instead of:
-   * <pre>assertThat(cheese, is(not(nullValue())))</pre>
-   */
-  public static org.hamcrest.Matcher<java.lang.Object> notNullValue() {
-    return org.hamcrest.core.IsNull.notNullValue();
-  }
+    /**
+     * Matches if value is null. With type inference.
+     */
+    public static <T> org.hamcrest.Matcher<T> nullValue(java.lang.Class<T> type) {
+        return org.hamcrest.core.IsNull.nullValue(type);
+    }
 
-  /**
-   * A shortcut to the frequently used <code>not(nullValue(X.class)). Accepts a
-   * single dummy argument to facilitate type inference.</code>.
-   * For example:
-   * <pre>assertThat(cheese, is(notNullValue(X.class)))</pre>
-   * instead of:
-   * <pre>assertThat(cheese, is(not(nullValue(X.class))))</pre>
-   * 
-   * @param type
-   *     dummy parameter used to infer the generic type of the returned matcher
-   */
-  public static <T> org.hamcrest.Matcher<T> notNullValue(java.lang.Class<T> type) {
-    return org.hamcrest.core.IsNull.<T>notNullValue(type);
-  }
+    /**
+     * Matches if value is not null.
+     */
+    public static <T> org.hamcrest.Matcher<T> notNullValue() {
+        return org.hamcrest.core.IsNull.notNullValue();
+    }
 
-  /**
-   * Creates a matcher that matches if examined object is <code>null</code>.
-   * For example:
-   * <pre>assertThat(cheese, is(nullValue())</pre>
-   */
-  public static org.hamcrest.Matcher<java.lang.Object> nullValue() {
-    return org.hamcrest.core.IsNull.nullValue();
-  }
+    /**
+     * Matches if value is not null. With type inference.
+     */
+    public static <T> org.hamcrest.Matcher<T> notNullValue(java.lang.Class<T> type) {
+        return org.hamcrest.core.IsNull.notNullValue(type);
+    }
 
-  /**
-   * Creates a matcher that matches if examined object is <code>null</code>. Accepts a
-   * single dummy argument to facilitate type inference.
-   * For example:
-   * <pre>assertThat(cheese, is(nullValue(Cheese.class))</pre>
-   * 
-   * @param type
-   *     dummy parameter used to infer the generic type of the returned matcher
-   */
-  public static <T> org.hamcrest.Matcher<T> nullValue(java.lang.Class<T> type) {
-    return org.hamcrest.core.IsNull.<T>nullValue(type);
-  }
+    /**
+     * Wraps an existing matcher and overrides the description when it fails.
+     */
+    public static <T> org.hamcrest.Matcher<T> describedAs(java.lang.String description, org.hamcrest.Matcher<T> matcher, java.lang.Object... values) {
+        return org.hamcrest.core.DescribedAs.describedAs(description, matcher, values);
+    }
 
-  /**
-   * Creates a matcher that matches only when the examined object is the same instance as
-   * the specified target object.
-   * 
-   * @param target
-   *     the target instance against which others should be assessed
-   */
-  public static <T> org.hamcrest.Matcher<T> sameInstance(T target) {
-    return org.hamcrest.core.IsSame.<T>sameInstance(target);
-  }
+    public static <T> org.hamcrest.Matcher<T[]> hasItemInArray(org.hamcrest.Matcher<T> elementMatcher) {
+        return org.hamcrest.collection.IsArrayContaining.hasItemInArray(elementMatcher);
+    }
 
-  /**
-   * Creates a matcher that matches only when the examined object is the same instance as
-   * the specified target object.
-   * 
-   * @param target
-   *     the target instance against which others should be assessed
-   */
-  public static <T> org.hamcrest.Matcher<T> theInstance(T target) {
-    return org.hamcrest.core.IsSame.<T>theInstance(target);
-  }
+    public static <T> org.hamcrest.Matcher<T[]> hasItemInArray(T element) {
+        return org.hamcrest.collection.IsArrayContaining.hasItemInArray(element);
+    }
 
-  /**
-   * Creates a matcher that matches if the examined {@link String} contains the specified
-   * {@link String} anywhere.
-   * For example:
-   * <pre>assertThat("myStringOfNote", containsString("ring"))</pre>
-   * 
-   * @param substring
-   *     the substring that the returned matcher will expect to find within any examined string
-   */
-  public static org.hamcrest.Matcher<java.lang.String> containsString(java.lang.String substring) {
-    return org.hamcrest.core.StringContains.containsString(substring);
-  }
+    public static <T> org.hamcrest.Matcher<java.lang.Iterable<T>> hasItem(T element) {
+        return org.hamcrest.collection.IsCollectionContaining.hasItem(element);
+    }
 
-  /**
-   * Creates a matcher that matches if the examined {@link String} contains the specified
-   * {@link String} anywhere, ignoring case.
-   * For example:
-   * <pre>assertThat("myStringOfNote", containsString("ring"))</pre>
-   * 
-   * @param substring
-   *     the substring that the returned matcher will expect to find within any examined string
-   */
-  public static org.hamcrest.Matcher<java.lang.String> containsStringIgnoringCase(java.lang.String substring) {
-    return org.hamcrest.core.StringContains.containsStringIgnoringCase(substring);
-  }
+    public static <T> org.hamcrest.Matcher<java.lang.Iterable<T>> hasItem(org.hamcrest.Matcher<? extends T> elementMatcher) {
+        return org.hamcrest.collection.IsCollectionContaining.<T>hasItem(elementMatcher);
+    }
 
-  /**
-   * <p>
-   * Creates a matcher that matches if the examined {@link String} starts with the specified
-   * {@link String}.
-   * </p>
-   * For example:
-   * <pre>assertThat("myStringOfNote", startsWith("my"))</pre>
-   * 
-   * @param prefix
-   *      the substring that the returned matcher will expect at the start of any examined string
-   */
-  public static org.hamcrest.Matcher<java.lang.String> startsWith(java.lang.String prefix) {
-    return org.hamcrest.core.StringStartsWith.startsWith(prefix);
-  }
+    public static <T> org.hamcrest.Matcher<java.lang.Iterable<T>> hasItems(org.hamcrest.Matcher<? extends T>... elementMatchers) {
+        return org.hamcrest.collection.IsCollectionContaining.<T>hasItems(elementMatchers);
+    }
 
-  /**
-   * <p>
-   * Creates a matcher that matches if the examined {@link String} starts with the specified
-   * {@link String}, ignoring case
-   * </p>
-   * For example:
-   * <pre>assertThat("myStringOfNote", startsWith("my"))</pre>
-   * 
-   * @param prefix
-   *      the substring that the returned matcher will expect at the start of any examined string
-   */
-  public static org.hamcrest.Matcher<java.lang.String> startsWithIgnoringCase(java.lang.String prefix) {
-    return org.hamcrest.core.StringStartsWith.startsWithIgnoringCase(prefix);
-  }
+    public static <T> org.hamcrest.Matcher<java.lang.Iterable<T>> hasItems(T... elements) {
+        return org.hamcrest.collection.IsCollectionContaining.hasItems(elements);
+    }
 
-  /**
-   * Creates a matcher that matches if the examined {@link String} ends with the specified
-   * {@link String}.
-   * For example:
-   * <pre>assertThat("myStringOfNote", endsWith("Note"))</pre>
-   * 
-   * @param suffix
-   *      the substring that the returned matcher will expect at the end of any examined string
-   */
-  public static org.hamcrest.Matcher<java.lang.String> endsWith(java.lang.String suffix) {
-    return org.hamcrest.core.StringEndsWith.endsWith(suffix);
-  }
+    public static <K, V> org.hamcrest.Matcher<java.util.Map<K, V>> hasEntry(org.hamcrest.Matcher<K> keyMatcher, org.hamcrest.Matcher<V> valueMatcher) {
+        return org.hamcrest.collection.IsMapContaining.hasEntry(keyMatcher, valueMatcher);
+    }
 
-  /**
-   * Creates a matcher that matches if the examined {@link String} ends with the specified
-   * {@link String}, ignoring case.
-   * For example:
-   * <pre>assertThat("myStringOfNote", endsWith("Note"))</pre>
-   * 
-   * @param suffix
-   *      the substring that the returned matcher will expect at the end of any examined string
-   */
-  public static org.hamcrest.Matcher<java.lang.String> endsWithIgnoringCase(java.lang.String suffix) {
-    return org.hamcrest.core.StringEndsWith.endsWithIgnoringCase(suffix);
-  }
+    public static <K, V> org.hamcrest.Matcher<java.util.Map<K, V>> hasEntry(K key, V value) {
+        return org.hamcrest.collection.IsMapContaining.hasEntry(key, value);
+    }
 
-  /**
-   * Creates a matcher that matches arrays whose elements are satisfied by the specified matchers.  Matches
-   * positively only if the number of matchers specified is equal to the length of the examined array and
-   * each matcher[i] is satisfied by array[i].
-   * For example:
-   * <pre>assertThat(new Integer[]{1,2,3}, is(array(equalTo(1), equalTo(2), equalTo(3))))</pre>
-   * 
-   * @param elementMatchers
-   *     the matchers that the elements of examined arrays should satisfy
-   */
-  public static <T> org.hamcrest.collection.IsArray<T> array(org.hamcrest.Matcher<? super T>... elementMatchers) {
-    return org.hamcrest.collection.IsArray.<T>array(elementMatchers);
-  }
+    public static <K, V> org.hamcrest.Matcher<java.util.Map<K, V>> hasKey(org.hamcrest.Matcher<K> keyMatcher) {
+        return org.hamcrest.collection.IsMapContaining.hasKey(keyMatcher);
+    }
 
-  /**
-   * Creates a matcher for arrays that matches when the examined array contains at least one item
-   * that is matched by the specified <code>elementMatcher</code>.  Whilst matching, the traversal
-   * of the examined array will stop as soon as a matching element is found.
-   * For example:
-   * <pre>assertThat(new String[] {"foo", "bar"}, hasItemInArray(startsWith("ba")))</pre>
-   * 
-   * @param elementMatcher
-   *     the matcher to apply to elements in examined arrays
-   */
-  public static <T> org.hamcrest.Matcher<T[]> hasItemInArray(org.hamcrest.Matcher<? super T> elementMatcher) {
-    return org.hamcrest.collection.IsArrayContaining.<T>hasItemInArray(elementMatcher);
-  }
+    public static <K, V> org.hamcrest.Matcher<java.util.Map<K, V>> hasKey(K key) {
+        return org.hamcrest.collection.IsMapContaining.hasKey(key);
+    }
 
-  /**
-   * A shortcut to the frequently used <code>hasItemInArray(equalTo(x))</code>.
-   * For example:
-   * <pre>assertThat(hasItemInArray(x))</pre>
-   * instead of:
-   * <pre>assertThat(hasItemInArray(equalTo(x)))</pre>
-   * 
-   * @param element
-   *     the element that should be present in examined arrays
-   */
-  public static <T> org.hamcrest.Matcher<T[]> hasItemInArray(T element) {
-    return org.hamcrest.collection.IsArrayContaining.<T>hasItemInArray(element);
-  }
+    public static <K, V> org.hamcrest.Matcher<java.util.Map<K, V>> hasValue(org.hamcrest.Matcher<V> valueMatcher) {
+        return org.hamcrest.collection.IsMapContaining.hasValue(valueMatcher);
+    }
 
-  /**
-   * Creates a matcher for arrays that matches when each item in the examined array is
-   * logically equal to the corresponding item in the specified items.  For a positive match,
-   * the examined array must be of the same length as the number of specified items.
-   * For example:
-   * <pre>assertThat(new String[]{"foo", "bar"}, contains("foo", "bar"))</pre>
-   * 
-   * @param items
-   *     the items that must equal the items within an examined array
-   */
-  public static <E> org.hamcrest.Matcher<E[]> arrayContaining(E... items) {
-    return org.hamcrest.collection.IsArrayContainingInOrder.<E>arrayContaining(items);
-  }
+    public static <K, V> org.hamcrest.Matcher<java.util.Map<K, V>> hasValue(V value) {
+        return org.hamcrest.collection.IsMapContaining.hasValue(value);
+    }
 
-  /**
-   * Creates a matcher for arrays that matches when each item in the examined array satisfies the
-   * corresponding matcher in the specified matchers.  For a positive match, the examined array
-   * must be of the same length as the number of specified matchers.
-   * For example:
-   * <pre>assertThat(new String[]{"foo", "bar"}, contains(equalTo("foo"), equalTo("bar")))</pre>
-   * 
-   * @param itemMatchers
-   *     the matchers that must be satisfied by the items in the examined array
-   */
-  public static <E> org.hamcrest.Matcher<E[]> arrayContaining(org.hamcrest.Matcher<? super E>... itemMatchers) {
-    return org.hamcrest.collection.IsArrayContainingInOrder.<E>arrayContaining(itemMatchers);
-  }
+    public static <T> org.hamcrest.Matcher<T> isIn(java.util.Collection<T> collection) {
+        return org.hamcrest.collection.IsIn.isIn(collection);
+    }
 
-  /**
-   * Creates a matcher for arrays that matches when each item in the examined array satisfies the
-   * corresponding matcher in the specified list of matchers.  For a positive match, the examined array
-   * must be of the same length as the specified list of matchers.
-   * For example:
-   * <pre>assertThat(new String[]{"foo", "bar"}, contains(Arrays.asList(equalTo("foo"), equalTo("bar"))))</pre>
-   * 
-   * @param itemMatchers
-   *     a list of matchers, each of which must be satisfied by the corresponding item in an examined array
-   */
-  public static <E> org.hamcrest.Matcher<E[]> arrayContaining(java.util.List<org.hamcrest.Matcher<? super E>> itemMatchers) {
-    return org.hamcrest.collection.IsArrayContainingInOrder.<E>arrayContaining(itemMatchers);
-  }
+    public static <T> org.hamcrest.Matcher<T> isIn(T[] param1) {
+        return org.hamcrest.collection.IsIn.isIn(param1);
+    }
 
-  /**
-   * <p>
-   * Creates an order agnostic matcher for arrays that matches when each item in the
-   * examined array satisfies one matcher anywhere in the specified matchers.
-   * For a positive match, the examined array must be of the same length as the number of
-   * specified matchers.
-   * </p>
-   * <p>
-   * N.B. each of the specified matchers will only be used once during a given examination, so be
-   * careful when specifying matchers that may be satisfied by more than one entry in an examined
-   * array.
-   * </p>
-   * <p>
-   * For example:
-   * </p>
-   * <pre>assertThat(new String[]{"foo", "bar"}, arrayContainingInAnyOrder(equalTo("bar"), equalTo("foo")))</pre>
-   * 
-   * @param itemMatchers
-   *     a list of matchers, each of which must be satisfied by an entry in an examined array
-   */
-  public static <E> org.hamcrest.Matcher<E[]> arrayContainingInAnyOrder(org.hamcrest.Matcher<? super E>... itemMatchers) {
-    return org.hamcrest.collection.IsArrayContainingInAnyOrder.<E>arrayContainingInAnyOrder(itemMatchers);
-  }
+    public static <T> org.hamcrest.Matcher<T> isOneOf(T... elements) {
+        return org.hamcrest.collection.IsIn.isOneOf(elements);
+    }
 
-  /**
-   * <p>
-   * Creates an order agnostic matcher for arrays that matches when each item in the
-   * examined array satisfies one matcher anywhere in the specified collection of matchers.
-   * For a positive match, the examined array must be of the same length as the specified collection
-   * of matchers.
-   * </p>
-   * <p>
-   * N.B. each matcher in the specified collection will only be used once during a given
-   * examination, so be careful when specifying matchers that may be satisfied by more than
-   * one entry in an examined array.
-   * </p>
-   * <p>
-   * For example:
-   * </p>
-   * <pre>assertThat(new String[]{"foo", "bar"}, arrayContainingInAnyOrder(Arrays.asList(equalTo("bar"), equalTo("foo"))))</pre>
-   * 
-   * @param itemMatchers
-   *     a list of matchers, each of which must be satisfied by an item provided by an examined array
-   */
-  public static <E> org.hamcrest.Matcher<E[]> arrayContainingInAnyOrder(java.util.Collection<org.hamcrest.Matcher<? super E>> itemMatchers) {
-    return org.hamcrest.collection.IsArrayContainingInAnyOrder.<E>arrayContainingInAnyOrder(itemMatchers);
-  }
+    public static org.hamcrest.Matcher<java.lang.Double> closeTo(double operand, double error) {
+        return org.hamcrest.number.IsCloseTo.closeTo(operand, error);
+    }
 
-  /**
-   * <p>Creates an order agnostic matcher for arrays that matches when each item in the
-   * examined array is logically equal to one item anywhere in the specified items.
-   * For a positive match, the examined array must be of the same length as the number of
-   * specified items.
-   * </p>
-   * <p>N.B. each of the specified items will only be used once during a given examination, so be
-   * careful when specifying items that may be equal to more than one entry in an examined
-   * array.
-   * </p>
-   * <p>
-   * For example:
-   * </p>
-   * <pre>assertThat(new String[]{"foo", "bar"}, containsInAnyOrder("bar", "foo"))</pre>
-   * 
-   * @param items
-   *     the items that must equal the entries of an examined array, in any order
-   */
-  public static <E> org.hamcrest.Matcher<E[]> arrayContainingInAnyOrder(E... items) {
-    return org.hamcrest.collection.IsArrayContainingInAnyOrder.<E>arrayContainingInAnyOrder(items);
-  }
+    public static <T extends java.lang.Comparable<T>> org.hamcrest.Matcher<T> greaterThan(T value) {
+        return org.hamcrest.number.OrderingComparisons.greaterThan(value);
+    }
 
-  /**
-   * Creates a matcher for arrays that matches when the <code>length</code> of the array
-   * satisfies the specified matcher.
-   * For example:
-   * <pre>assertThat(new String[]{"foo", "bar"}, arrayWithSize(equalTo(2)))</pre>
-   * 
-   * @param sizeMatcher
-   *     a matcher for the length of an examined array
-   */
-  public static <E> org.hamcrest.Matcher<E[]> arrayWithSize(org.hamcrest.Matcher<? super java.lang.Integer> sizeMatcher) {
-    return org.hamcrest.collection.IsArrayWithSize.<E>arrayWithSize(sizeMatcher);
-  }
+    public static <T extends java.lang.Comparable<T>> org.hamcrest.Matcher<T> greaterThanOrEqualTo(T value) {
+        return org.hamcrest.number.OrderingComparisons.greaterThanOrEqualTo(value);
+    }
 
-  /**
-   * Creates a matcher for arrays that matches when the <code>length</code> of the array
-   * equals the specified <code>size</code>.
-   * For example:
-   * <pre>assertThat(new String[]{"foo", "bar"}, arrayWithSize(2))</pre>
-   * 
-   * @param size
-   *     the length that an examined array must have for a positive match
-   */
-  public static <E> org.hamcrest.Matcher<E[]> arrayWithSize(int size) {
-    return org.hamcrest.collection.IsArrayWithSize.<E>arrayWithSize(size);
-  }
+    public static <T extends java.lang.Comparable<T>> org.hamcrest.Matcher<T> lessThan(T value) {
+        return org.hamcrest.number.OrderingComparisons.lessThan(value);
+    }
 
-  /**
-   * Creates a matcher for arrays that matches when the <code>length</code> of the array
-   * is zero.
-   * For example:
-   * <pre>assertThat(new String[0], emptyArray())</pre>
-   */
-  public static <E> org.hamcrest.Matcher<E[]> emptyArray() {
-    return org.hamcrest.collection.IsArrayWithSize.<E>emptyArray();
-  }
+    public static <T extends java.lang.Comparable<T>> org.hamcrest.Matcher<T> lessThanOrEqualTo(T value) {
+        return org.hamcrest.number.OrderingComparisons.lessThanOrEqualTo(value);
+    }
 
-  /**
-   * Creates a matcher for {@link java.util.Map}s that matches when the <code>size()</code> method returns
-   * a value that satisfies the specified matcher.
-   * For example:
-   * <pre>assertThat(myMap, is(aMapWithSize(equalTo(2))))</pre>
-   * 
-   * @param sizeMatcher
-   *     a matcher for the size of an examined {@link java.util.Map}
-   */
-  public static <K, V> org.hamcrest.Matcher<java.util.Map<? extends K,? extends V>> aMapWithSize(org.hamcrest.Matcher<? super java.lang.Integer> sizeMatcher) {
-    return org.hamcrest.collection.IsMapWithSize.<K,V>aMapWithSize(sizeMatcher);
-  }
+    public static org.hamcrest.Matcher<java.lang.String> equalToIgnoringCase(java.lang.String string) {
+        return org.hamcrest.text.IsEqualIgnoringCase.equalToIgnoringCase(string);
+    }
 
-  /**
-   * Creates a matcher for {@link java.util.Map}s that matches when the <code>size()</code> method returns
-   * a value equal to the specified <code>size</code>.
-   * For example:
-   * <pre>assertThat(myMap, is(aMapWithSize(2)))</pre>
-   * 
-   * @param size
-   *     the expected size of an examined {@link java.util.Map}
-   */
-  public static <K, V> org.hamcrest.Matcher<java.util.Map<? extends K,? extends V>> aMapWithSize(int size) {
-    return org.hamcrest.collection.IsMapWithSize.<K,V>aMapWithSize(size);
-  }
+    public static org.hamcrest.Matcher<java.lang.String> equalToIgnoringWhiteSpace(java.lang.String string) {
+        return org.hamcrest.text.IsEqualIgnoringWhiteSpace.equalToIgnoringWhiteSpace(string);
+    }
 
-  /**
-   * Creates a matcher for {@link java.util.Map}s that matches when the <code>size()</code> method returns
-   * zero.
-   * For example:
-   * <pre>assertThat(myMap, is(anEmptyMap()))</pre>
-   */
-  public static <K, V> org.hamcrest.Matcher<java.util.Map<? extends K,? extends V>> anEmptyMap() {
-    return org.hamcrest.collection.IsMapWithSize.<K,V>anEmptyMap();
-  }
+    public static org.hamcrest.Matcher<java.lang.String> containsString(java.lang.String substring) {
+        return org.hamcrest.text.StringContains.containsString(substring);
+    }
 
-  /**
-   * Creates a matcher for {@link java.util.Collection}s that matches when the <code>size()</code> method returns
-   * a value that satisfies the specified matcher.
-   * For example:
-   * <pre>assertThat(Arrays.asList("foo", "bar"), hasSize(equalTo(2)))</pre>
-   * 
-   * @param sizeMatcher
-   *     a matcher for the size of an examined {@link java.util.Collection}
-   */
-  public static <E> org.hamcrest.Matcher<java.util.Collection<? extends E>> hasSize(org.hamcrest.Matcher<? super java.lang.Integer> sizeMatcher) {
-    return org.hamcrest.collection.IsCollectionWithSize.<E>hasSize(sizeMatcher);
-  }
+    public static org.hamcrest.Matcher<java.lang.String> endsWith(java.lang.String substring) {
+        return org.hamcrest.text.StringEndsWith.endsWith(substring);
+    }
 
-  /**
-   * Creates a matcher for {@link java.util.Collection}s that matches when the <code>size()</code> method returns
-   * a value equal to the specified <code>size</code>.
-   * For example:
-   * <pre>assertThat(Arrays.asList("foo", "bar"), hasSize(2))</pre>
-   * 
-   * @param size
-   *     the expected size of an examined {@link java.util.Collection}
-   */
-  public static <E> org.hamcrest.Matcher<java.util.Collection<? extends E>> hasSize(int size) {
-    return org.hamcrest.collection.IsCollectionWithSize.<E>hasSize(size);
-  }
+    public static org.hamcrest.Matcher<java.lang.String> startsWith(java.lang.String substring) {
+        return org.hamcrest.text.StringStartsWith.startsWith(substring);
+    }
 
-  /**
-   * Creates a matcher for {@link java.util.Collection}s matching examined collections whose <code>isEmpty</code>
-   * method returns <code>true</code>.
-   * For example:
-   * <pre>assertThat(new ArrayList&lt;String&gt;(), is(empty()))</pre>
-   */
-  public static <E> org.hamcrest.Matcher<java.util.Collection<? extends E>> empty() {
-    return org.hamcrest.collection.IsEmptyCollection.<E>empty();
-  }
+    public static <T> org.hamcrest.Matcher<T> hasToString(org.hamcrest.Matcher<java.lang.String> toStringMatcher) {
+        return org.hamcrest.object.HasToString.hasToString(toStringMatcher);
+    }
 
-  /**
-   * Creates a matcher for {@link java.util.Collection}s matching examined collections whose <code>isEmpty</code>
-   * method returns <code>true</code>.
-   * For example:
-   * <pre>assertThat(new ArrayList&lt;String&gt;(), is(emptyCollectionOf(String.class)))</pre>
-   * 
-   * @param unusedToForceReturnType
-   *     the type of the collection's content
-   */
-  public static <E> org.hamcrest.Matcher<java.util.Collection<E>> emptyCollectionOf(java.lang.Class<E> unusedToForceReturnType) {
-    return org.hamcrest.collection.IsEmptyCollection.<E>emptyCollectionOf(unusedToForceReturnType);
-  }
+    public static <T> org.hamcrest.Matcher<java.lang.Class<?>> typeCompatibleWith(java.lang.Class<T> baseType) {
+        return org.hamcrest.object.IsCompatibleType.typeCompatibleWith(baseType);
+    }
 
-  /**
-   * Creates a matcher for {@link Iterable}s matching examined iterables that yield no items.
-   * For example:
-   * <pre>assertThat(new ArrayList&lt;String&gt;(), is(emptyIterable()))</pre>
-   */
-  public static <E> org.hamcrest.Matcher<java.lang.Iterable<? extends E>> emptyIterable() {
-    return org.hamcrest.collection.IsEmptyIterable.<E>emptyIterable();
-  }
-
-  /**
-   * Creates a matcher for {@link Iterable}s matching examined iterables that yield no items.
-   * For example:
-   * <pre>assertThat(new ArrayList&lt;String&gt;(), is(emptyIterableOf(String.class)))</pre>
-   * 
-   * @param unusedToForceReturnType
-   *     the type of the iterable's content
-   */
-  public static <E> org.hamcrest.Matcher<java.lang.Iterable<E>> emptyIterableOf(java.lang.Class<E> unusedToForceReturnType) {
-    return org.hamcrest.collection.IsEmptyIterable.<E>emptyIterableOf(unusedToForceReturnType);
-  }
-
-  /**
-   * Creates a matcher for {@link Iterable}s that matches when a single pass over the
-   * examined {@link Iterable} yields a series of items, each logically equal to the
-   * corresponding item in the specified items.  For a positive match, the examined iterable
-   * must be of the same length as the number of specified items.
-   * For example:
-   * <pre>assertThat(Arrays.asList("foo", "bar"), contains("foo", "bar"))</pre>
-   * 
-   * @param items
-   *     the items that must equal the items provided by an examined {@link Iterable}
-   */
-  public static <E> org.hamcrest.Matcher<java.lang.Iterable<? extends E>> contains(E... items) {
-    return org.hamcrest.collection.IsIterableContainingInOrder.<E>contains(items);
-  }
-
-  /**
-   * Creates a matcher for {@link Iterable}s that matches when a single pass over the
-   * examined {@link Iterable} yields a single item that satisfies the specified matcher.
-   * For a positive match, the examined iterable must only yield one item.
-   * For example:
-   * <pre>assertThat(Arrays.asList("foo"), contains(equalTo("foo")))</pre>
-   * 
-   * @param itemMatcher
-   *     the matcher that must be satisfied by the single item provided by an
-   *     examined {@link Iterable}
-   */
-  public static <E> org.hamcrest.Matcher<java.lang.Iterable<? extends E>> contains(org.hamcrest.Matcher<? super E> itemMatcher) {
-    return org.hamcrest.collection.IsIterableContainingInOrder.<E>contains(itemMatcher);
-  }
-
-  /**
-   * Creates a matcher for {@link Iterable}s that matches when a single pass over the
-   * examined {@link Iterable} yields a series of items, each satisfying the corresponding
-   * matcher in the specified matchers.  For a positive match, the examined iterable
-   * must be of the same length as the number of specified matchers.
-   * For example:
-   * <pre>assertThat(Arrays.asList("foo", "bar"), contains(equalTo("foo"), equalTo("bar")))</pre>
-   * 
-   * @param itemMatchers
-   *     the matchers that must be satisfied by the items provided by an examined {@link Iterable}
-   */
-  public static <E> org.hamcrest.Matcher<java.lang.Iterable<? extends E>> contains(org.hamcrest.Matcher<? super E>... itemMatchers) {
-    return org.hamcrest.collection.IsIterableContainingInOrder.<E>contains(itemMatchers);
-  }
-
-  /**
-   * Creates a matcher for {@link Iterable}s that matches when a single pass over the
-   * examined {@link Iterable} yields a series of items, each satisfying the corresponding
-   * matcher in the specified list of matchers.  For a positive match, the examined iterable
-   * must be of the same length as the specified list of matchers.
-   * For example:
-   * <pre>assertThat(Arrays.asList("foo", "bar"), contains(Arrays.asList(equalTo("foo"), equalTo("bar"))))</pre>
-   * 
-   * @param itemMatchers
-   *     a list of matchers, each of which must be satisfied by the corresponding item provided by
-   *     an examined {@link Iterable}
-   */
-  public static <E> org.hamcrest.Matcher<java.lang.Iterable<? extends E>> contains(java.util.List<org.hamcrest.Matcher<? super E>> itemMatchers) {
-    return org.hamcrest.collection.IsIterableContainingInOrder.<E>contains(itemMatchers);
-  }
-
-  /**
-   * <p>
-   * Creates an order agnostic matcher for {@link Iterable}s that matches when a single pass over
-   * the examined {@link Iterable} yields a series of items, each satisfying one matcher anywhere
-   * in the specified matchers.  For a positive match, the examined iterable must be of the same
-   * length as the number of specified matchers.
-   * </p>
-   * <p>
-   * N.B. each of the specified matchers will only be used once during a given examination, so be
-   * careful when specifying matchers that may be satisfied by more than one entry in an examined
-   * iterable.
-   * </p>
-   * <p>
-   * For example:
-   * </p>
-   * <pre>assertThat(Arrays.asList("foo", "bar"), containsInAnyOrder(equalTo("bar"), equalTo("foo")))</pre>
-   * 
-   * @param itemMatchers
-   *     a list of matchers, each of which must be satisfied by an item provided by an examined {@link Iterable}
-   */
-  public static <T> org.hamcrest.Matcher<java.lang.Iterable<? extends T>> containsInAnyOrder(org.hamcrest.Matcher<? super T>... itemMatchers) {
-    return org.hamcrest.collection.IsIterableContainingInAnyOrder.<T>containsInAnyOrder(itemMatchers);
-  }
-
-  /**
-   * <p>
-   * Creates an order agnostic matcher for {@link Iterable}s that matches when a single pass over
-   * the examined {@link Iterable} yields a series of items, each logically equal to one item
-   * anywhere in the specified items. For a positive match, the examined iterable
-   * must be of the same length as the number of specified items.
-   * </p>
-   * <p>
-   * N.B. each of the specified items will only be used once during a given examination, so be
-   * careful when specifying items that may be equal to more than one entry in an examined
-   * iterable.
-   * </p>
-   * <p>
-   * For example:
-   * </p>
-   * <pre>assertThat(Arrays.asList("foo", "bar"), containsInAnyOrder("bar", "foo"))</pre>
-   * 
-   * @param items
-   *     the items that must equal the items provided by an examined {@link Iterable} in any order
-   */
-  public static <T> org.hamcrest.Matcher<java.lang.Iterable<? extends T>> containsInAnyOrder(T... items) {
-    return org.hamcrest.collection.IsIterableContainingInAnyOrder.<T>containsInAnyOrder(items);
-  }
-
-  /**
-   * <p>
-   * Creates an order agnostic matcher for {@link Iterable}s that matches when a single pass over
-   * the examined {@link Iterable} yields a series of items, each satisfying one matcher anywhere
-   * in the specified collection of matchers.  For a positive match, the examined iterable
-   * must be of the same length as the specified collection of matchers.
-   * </p>
-   * <p>
-   * N.B. each matcher in the specified collection will only be used once during a given
-   * examination, so be careful when specifying matchers that may be satisfied by more than
-   * one entry in an examined iterable.
-   * </p>
-   * <p>For example:</p>
-   * <pre>assertThat(Arrays.asList("foo", "bar"), containsInAnyOrder(Arrays.asList(equalTo("bar"), equalTo("foo"))))</pre>
-   * 
-   * @param itemMatchers
-   *     a list of matchers, each of which must be satisfied by an item provided by an examined {@link Iterable}
-   */
-  public static <T> org.hamcrest.Matcher<java.lang.Iterable<? extends T>> containsInAnyOrder(java.util.Collection<org.hamcrest.Matcher<? super T>> itemMatchers) {
-    return org.hamcrest.collection.IsIterableContainingInAnyOrder.<T>containsInAnyOrder(itemMatchers);
-  }
-
-  /**
-   * Creates a matcher for {@link Iterable}s that matches when a single pass over the
-   * examined {@link Iterable} yields a series of items, that contains items logically equal to the
-   * corresponding item in the specified items, in the same relative order
-   * For example:
-   * <pre>assertThat(Arrays.asList("a", "b", "c", "d", "e"), containsInRelativeOrder("b", "d"))</pre>
-   * 
-   * @param items
-   *     the items that must be contained within items provided by an examined {@link Iterable} in the same relative order
-   */
-  public static <E> org.hamcrest.Matcher<java.lang.Iterable<? extends E>> containsInRelativeOrder(E... items) {
-    return org.hamcrest.collection.IsIterableContainingInRelativeOrder.<E>containsInRelativeOrder(items);
-  }
-
-  /**
-   * Creates a matcher for {@link Iterable}s that matches when a single pass over the
-   * examined {@link Iterable} yields a series of items, that each satisfying the corresponding
-   * matcher in the specified matchers, in the same relative order.
-   * For example:
-   * <pre>assertThat(Arrays.asList("a", "b", "c", "d", "e"), containsInRelativeOrder(equalTo("b"), equalTo("d")))</pre>
-   * 
-   * @param itemMatchers
-   *     the matchers that must be satisfied by the items provided by an examined {@link Iterable} in the same relative order
-   */
-  public static <E> org.hamcrest.Matcher<java.lang.Iterable<? extends E>> containsInRelativeOrder(org.hamcrest.Matcher<? super E>... itemMatchers) {
-    return org.hamcrest.collection.IsIterableContainingInRelativeOrder.<E>containsInRelativeOrder(itemMatchers);
-  }
-
-  /**
-   * Creates a matcher for {@link Iterable}s that matches when a single pass over the
-   * examined {@link Iterable} yields a series of items, that contains items satisfying the corresponding
-   * matcher in the specified list of matchers, in the same relative order.
-   * For example:
-   * <pre>assertThat(Arrays.asList("a", "b", "c", "d", "e"), contains(Arrays.asList(equalTo("b"), equalTo("d"))))</pre>
-   * 
-   * @param itemMatchers
-   *     a list of matchers, each of which must be satisfied by the items provided by
-   *     an examined {@link Iterable} in the same relative order
-   */
-  public static <E> org.hamcrest.Matcher<java.lang.Iterable<? extends E>> containsInRelativeOrder(java.util.List<org.hamcrest.Matcher<? super E>> itemMatchers) {
-    return org.hamcrest.collection.IsIterableContainingInRelativeOrder.<E>containsInRelativeOrder(itemMatchers);
-  }
-
-  /**
-   * Creates a matcher for {@link Iterable}s that matches when a single pass over the
-   * examined {@link Iterable} yields an item count that satisfies the specified
-   * matcher.
-   * For example:
-   * <pre>assertThat(Arrays.asList("foo", "bar"), iterableWithSize(equalTo(2)))</pre>
-   * 
-   * @param sizeMatcher
-   *     a matcher for the number of items that should be yielded by an examined {@link Iterable}
-   */
-  public static <E> org.hamcrest.Matcher<java.lang.Iterable<E>> iterableWithSize(org.hamcrest.Matcher<? super java.lang.Integer> sizeMatcher) {
-    return org.hamcrest.collection.IsIterableWithSize.<E>iterableWithSize(sizeMatcher);
-  }
-
-  /**
-   * Creates a matcher for {@link Iterable}s that matches when a single pass over the
-   * examined {@link Iterable} yields an item count that is equal to the specified
-   * <code>size</code> argument.
-   * For example:
-   * <pre>assertThat(Arrays.asList("foo", "bar"), iterableWithSize(2))</pre>
-   * 
-   * @param size
-   *     the number of items that should be yielded by an examined {@link Iterable}
-   */
-  public static <E> org.hamcrest.Matcher<java.lang.Iterable<E>> iterableWithSize(int size) {
-    return org.hamcrest.collection.IsIterableWithSize.<E>iterableWithSize(size);
-  }
-
-  /**
-   * Creates a matcher for {@link java.util.Map}s matching when the examined {@link java.util.Map} contains
-   * at least one entry whose key satisfies the specified <code>keyMatcher</code> <b>and</b> whose
-   * value satisfies the specified <code>valueMatcher</code>.
-   * For example:
-   * <pre>assertThat(myMap, hasEntry(equalTo("bar"), equalTo("foo")))</pre>
-   * 
-   * @param keyMatcher
-   *     the key matcher that, in combination with the valueMatcher, must be satisfied by at least one entry
-   * @param valueMatcher
-   *     the value matcher that, in combination with the keyMatcher, must be satisfied by at least one entry
-   */
-  public static <K, V> org.hamcrest.Matcher<java.util.Map<? extends K,? extends V>> hasEntry(org.hamcrest.Matcher<? super K> keyMatcher, org.hamcrest.Matcher<? super V> valueMatcher) {
-    return org.hamcrest.collection.IsMapContaining.<K,V>hasEntry(keyMatcher, valueMatcher);
-  }
-
-  /**
-   * Creates a matcher for {@link java.util.Map}s matching when the examined {@link java.util.Map} contains
-   * at least one entry whose key equals the specified <code>key</code> <b>and</b> whose value equals the
-   * specified <code>value</code>.
-   * For example:
-   * <pre>assertThat(myMap, hasEntry("bar", "foo"))</pre>
-   * 
-   * @param key
-   *     the key that, in combination with the value, must be describe at least one entry
-   * @param value
-   *     the value that, in combination with the key, must be describe at least one entry
-   */
-  public static <K, V> org.hamcrest.Matcher<java.util.Map<? extends K,? extends V>> hasEntry(K key, V value) {
-    return org.hamcrest.collection.IsMapContaining.<K,V>hasEntry(key, value);
-  }
-
-  /**
-   * Creates a matcher for {@link java.util.Map}s matching when the examined {@link java.util.Map} contains
-   * at least one key that satisfies the specified matcher.
-   * For example:
-   * <pre>assertThat(myMap, hasKey(equalTo("bar")))</pre>
-   * 
-   * @param keyMatcher
-   *     the matcher that must be satisfied by at least one key
-   */
-  public static <K> org.hamcrest.Matcher<java.util.Map<? extends K,?>> hasKey(org.hamcrest.Matcher<? super K> keyMatcher) {
-    return org.hamcrest.collection.IsMapContaining.<K>hasKey(keyMatcher);
-  }
-
-  /**
-   * Creates a matcher for {@link java.util.Map}s matching when the examined {@link java.util.Map} contains
-   * at least one key that is equal to the specified key.
-   * For example:
-   * <pre>assertThat(myMap, hasKey("bar"))</pre>
-   * 
-   * @param key
-   *     the key that satisfying maps must contain
-   */
-  public static <K> org.hamcrest.Matcher<java.util.Map<? extends K,?>> hasKey(K key) {
-    return org.hamcrest.collection.IsMapContaining.<K>hasKey(key);
-  }
-
-  /**
-   * Creates a matcher for {@link java.util.Map}s matching when the examined {@link java.util.Map} contains
-   * at least one value that satisfies the specified valueMatcher.
-   * For example:
-   * <pre>assertThat(myMap, hasValue(equalTo("foo")))</pre>
-   * 
-   * @param valueMatcher
-   *     the matcher that must be satisfied by at least one value
-   */
-  public static <V> org.hamcrest.Matcher<java.util.Map<?,? extends V>> hasValue(org.hamcrest.Matcher<? super V> valueMatcher) {
-    return org.hamcrest.collection.IsMapContaining.<V>hasValue(valueMatcher);
-  }
-
-  /**
-   * Creates a matcher for {@link java.util.Map}s matching when the examined {@link java.util.Map} contains
-   * at least one value that is equal to the specified value.
-   * For example:
-   * <pre>assertThat(myMap, hasValue("foo"))</pre>
-   * 
-   * @param value
-   *     the value that satisfying maps must contain
-   */
-  public static <V> org.hamcrest.Matcher<java.util.Map<?,? extends V>> hasValue(V value) {
-    return org.hamcrest.collection.IsMapContaining.<V>hasValue(value);
-  }
-
-  /**
-   * Creates a matcher that matches when the examined object is found within the
-   * specified collection.
-   * For example:
-   * <pre>assertThat("foo", is(in(Arrays.asList("bar", "foo"))))</pre>
-   * 
-   * @param collection
-   *     the collection in which matching items must be found
-   */
-  public static <T> org.hamcrest.Matcher<T> in(java.util.Collection<T> collection) {
-    return org.hamcrest.collection.IsIn.<T>in(collection);
-  }
-
-  /**
-   * Creates a matcher that matches when the examined object is found within the
-   * specified array.
-   * For example:
-   * <pre>assertThat("foo", is(in(new String[]{"bar", "foo"})))</pre>
-   * 
-   * @param elements
-   *     the array in which matching items must be found
-   */
-  public static <T> org.hamcrest.Matcher<T> in(T[] elements) {
-    return org.hamcrest.collection.IsIn.<T>in(elements);
-  }
-
-  /**
-   * Creates a matcher that matches when the examined object is found within the
-   * specified collection.
-   * For example:
-   * <pre>assertThat("foo", isIn(Arrays.asList("bar", "foo")))</pre>
-   * 
-   * @deprecated use is(in(...)) instead
-   * @param collection
-   *     the collection in which matching items must be found
-   */
-  public static <T> org.hamcrest.Matcher<T> isIn(java.util.Collection<T> collection) {
-    return org.hamcrest.collection.IsIn.<T>isIn(collection);
-  }
-
-  /**
-   * Creates a matcher that matches when the examined object is found within the
-   * specified array.
-   * For example:
-   * <pre>assertThat("foo", isIn(new String[]{"bar", "foo"}))</pre>
-   * 
-   * @deprecated use is(in(...)) instead
-   * @param elements
-   *     the array in which matching items must be found
-   */
-  public static <T> org.hamcrest.Matcher<T> isIn(T[] elements) {
-    return org.hamcrest.collection.IsIn.<T>isIn(elements);
-  }
-
-  /**
-   * Creates a matcher that matches when the examined object is equal to one of the
-   * specified elements.
-   * For example:
-   * <pre>assertThat("foo", isOneOf("bar", "foo"))</pre>
-   * 
-   * @deprecated use is(oneOf(...)) instead
-   * @param elements
-   *     the elements amongst which matching items will be found
-   */
-  public static <T> org.hamcrest.Matcher<T> isOneOf(T... elements) {
-    return org.hamcrest.collection.IsIn.<T>isOneOf(elements);
-  }
-
-  /**
-   * Creates a matcher that matches when the examined object is equal to one of the
-   * specified elements.
-   * For example:
-   * <pre>assertThat("foo", is(oneOf("bar", "foo")))</pre>
-   * 
-   * @param elements
-   *     the elements amongst which matching items will be found
-   */
-  public static <T> org.hamcrest.Matcher<T> oneOf(T... elements) {
-    return org.hamcrest.collection.IsIn.<T>oneOf(elements);
-  }
-
-  /**
-   * Creates a matcher of {@link Double}s that matches when an examined double is equal
-   * to the specified <code>operand</code>, within a range of +/- <code>error</code>.
-   * For example:
-   * <pre>assertThat(1.03, is(closeTo(1.0, 0.03)))</pre>
-   * 
-   * @param operand
-   *     the expected value of matching doubles
-   * @param error
-   *     the delta (+/-) within which matches will be allowed
-   */
-  public static org.hamcrest.Matcher<java.lang.Double> closeTo(double operand, double error) {
-    return org.hamcrest.number.IsCloseTo.closeTo(operand, error);
-  }
-
-  /**
-   * Creates a matcher of {@link Double}s that matches when an examined double is not a number.
-   * For example:
-   * <pre>assertThat(Double.NaN, is(notANumber()))</pre>
-   */
-  public static org.hamcrest.Matcher<java.lang.Double> notANumber() {
-    return org.hamcrest.number.IsNaN.notANumber();
-  }
-
-  /**
-   * Creates a matcher of {@link java.math.BigDecimal}s that matches when an examined BigDecimal is equal
-   * to the specified <code>operand</code>, within a range of +/- <code>error</code>. The comparison for equality
-   * is done by BigDecimals {@link java.math.BigDecimal#compareTo(java.math.BigDecimal)} method.
-   * For example:
-   * <pre>assertThat(new BigDecimal("1.03"), is(closeTo(new BigDecimal("1.0"), new BigDecimal("0.03"))))</pre>
-   * 
-   * @param operand
-   *     the expected value of matching BigDecimals
-   * @param error
-   *     the delta (+/-) within which matches will be allowed
-   */
-  public static org.hamcrest.Matcher<java.math.BigDecimal> closeTo(java.math.BigDecimal operand, java.math.BigDecimal error) {
-    return org.hamcrest.number.BigDecimalCloseTo.closeTo(operand, error);
-  }
-
-  /**
-   * Creates a matcher of {@link Comparable} object that matches when the examined object is
-   * equal to the specified value, as reported by the <code>compareTo</code> method of the
-   * <b>examined</b> object.
-   * For example:
-   * <pre>assertThat(1, comparesEqualTo(1))</pre>
-   * 
-   * @param value the value which, when passed to the compareTo method of the examined object, should return zero
-   */
-  public static <T extends java.lang.Comparable<T>> org.hamcrest.Matcher<T> comparesEqualTo(T value) {
-    return org.hamcrest.number.OrderingComparison.<T>comparesEqualTo(value);
-  }
-
-  /**
-   * Creates a matcher of {@link Comparable} object that matches when the examined object is
-   * greater than the specified value, as reported by the <code>compareTo</code> method of the
-   * <b>examined</b> object.
-   * For example:
-   * <pre>assertThat(2, greaterThan(1))</pre>
-   * 
-   * @param value the value which, when passed to the compareTo method of the examined object, should return greater
-   *              than zero
-   */
-  public static <T extends java.lang.Comparable<T>> org.hamcrest.Matcher<T> greaterThan(T value) {
-    return org.hamcrest.number.OrderingComparison.<T>greaterThan(value);
-  }
-
-  /**
-   * Creates a matcher of {@link Comparable} object that matches when the examined object is
-   * greater than or equal to the specified value, as reported by the <code>compareTo</code> method
-   * of the <b>examined</b> object.
-   * For example:
-   * <pre>assertThat(1, greaterThanOrEqualTo(1))</pre>
-   * 
-   * @param value the value which, when passed to the compareTo method of the examined object, should return greater
-   *              than or equal to zero
-   */
-  public static <T extends java.lang.Comparable<T>> org.hamcrest.Matcher<T> greaterThanOrEqualTo(T value) {
-    return org.hamcrest.number.OrderingComparison.<T>greaterThanOrEqualTo(value);
-  }
-
-  /**
-   * Creates a matcher of {@link Comparable} object that matches when the examined object is
-   * less than the specified value, as reported by the <code>compareTo</code> method of the
-   * <b>examined</b> object.
-   * For example:
-   * <pre>assertThat(1, lessThan(2))</pre>
-   * 
-   * @param value the value which, when passed to the compareTo method of the examined object, should return less
-   *              than zero
-   */
-  public static <T extends java.lang.Comparable<T>> org.hamcrest.Matcher<T> lessThan(T value) {
-    return org.hamcrest.number.OrderingComparison.<T>lessThan(value);
-  }
-
-  /**
-   * Creates a matcher of {@link Comparable} object that matches when the examined object is
-   * less than or equal to the specified value, as reported by the <code>compareTo</code> method
-   * of the <b>examined</b> object.
-   * For example:
-   * <pre>assertThat(1, lessThanOrEqualTo(1))</pre>
-   * 
-   * @param value the value which, when passed to the compareTo method of the examined object, should return less
-   *              than or equal to zero
-   */
-  public static <T extends java.lang.Comparable<T>> org.hamcrest.Matcher<T> lessThanOrEqualTo(T value) {
-    return org.hamcrest.number.OrderingComparison.<T>lessThanOrEqualTo(value);
-  }
-
-  /**
-   * Creates a matcher of {@link String} that matches when the examined string is equal to
-   * the specified expectedString, ignoring case.
-   * For example:
-   * <pre>assertThat("Foo", equalToIgnoringCase("FOO"))</pre>
-   * 
-   * @param expectedString
-   *     the expected value of matched strings
-   */
-  public static org.hamcrest.Matcher<java.lang.String> equalToIgnoringCase(java.lang.String expectedString) {
-    return org.hamcrest.text.IsEqualIgnoringCase.equalToIgnoringCase(expectedString);
-  }
-
-  /**
-   * Creates a matcher of {@link String} that matches when the examined string is equal to
-   * the specified expectedString, when whitespace differences are (mostly) ignored.  To be
-   * exact, the following whitespace rules are applied:
-   * <ul>
-   *   <li>all leading and trailing whitespace of both the expectedString and the examined string are ignored</li>
-   *   <li>any remaining whitespace, appearing within either string, is collapsed to a single space before comparison</li>
-   * </ul>
-   * For example:
-   * <pre>assertThat("   my\tfoo  bar ", equalToIgnoringWhiteSpace(" my  foo bar"))</pre>
-   * 
-   * @param expectedString
-   *     the expected value of matched strings
-   */
-  public static org.hamcrest.Matcher<java.lang.String> equalToIgnoringWhiteSpace(java.lang.String expectedString) {
-    return org.hamcrest.text.IsEqualIgnoringWhiteSpace.equalToIgnoringWhiteSpace(expectedString);
-  }
-
-  /**
-   * Creates a matcher of {@link String} that matches when the examined string is <code>null</code>, or
-   * has zero length.
-   * For example:
-   * <pre>assertThat(((String)null), is(emptyOrNullString()))</pre>
-   */
-  public static org.hamcrest.Matcher<java.lang.String> emptyOrNullString() {
-    return org.hamcrest.text.IsEmptyString.emptyOrNullString();
-  }
-
-  /**
-   * Creates a matcher of {@link String} that matches when the examined string has zero length.
-   * For example:
-   * <pre>assertThat("", is(emptyString()))</pre>
-   */
-  public static org.hamcrest.Matcher<java.lang.String> emptyString() {
-    return org.hamcrest.text.IsEmptyString.emptyString();
-  }
-
-  /**
-   * Creates a matcher of {@link String} that matches when the examined string is <code>null</code>, or
-   * has zero length.
-   * For example:
-   * <pre>assertThat(((String)null), isEmptyOrNullString())</pre>
-   * 
-   * @deprecated use is(emptyOrNullString()) instead
-   */
-  public static org.hamcrest.Matcher<java.lang.String> isEmptyOrNullString() {
-    return org.hamcrest.text.IsEmptyString.isEmptyOrNullString();
-  }
-
-  /**
-   * Creates a matcher of {@link String} that matches when the examined string has zero length.
-   * For example:
-   * <pre>assertThat("", isEmptyString())</pre>
-   * 
-   * @deprecated use is(emptyString()) instead
-   */
-  public static org.hamcrest.Matcher<java.lang.String> isEmptyString() {
-    return org.hamcrest.text.IsEmptyString.isEmptyString();
-  }
-
-  /**
-   * Creates a matcher of {@link String} that matches when the examined string is <code>null</code>, or
-   * contains zero or more whitespace characters and nothing else.
-   * For example:
-   * <pre>assertThat(((String)null), is(blankOrNullString()))</pre>
-   */
-  public static org.hamcrest.Matcher<java.lang.String> blankOrNullString() {
-    return org.hamcrest.text.IsBlankString.blankOrNullString();
-  }
-
-  /**
-   * Creates a matcher of {@link String} that matches when the examined string contains
-   * zero or more whitespace characters and nothing else.
-   * For example:
-   * <pre>assertThat("  ", is(blankString()))</pre>
-   */
-  public static org.hamcrest.Matcher<java.lang.String> blankString() {
-    return org.hamcrest.text.IsBlankString.blankString();
-  }
-
-  /**
-   * Creates a matcher of {@link java.lang.String} that matches when the examined string
-   * exactly matches the given {@link java.util.regex.Pattern}.
-   */
-  public static org.hamcrest.Matcher<java.lang.String> matchesPattern(java.util.regex.Pattern pattern) {
-    return org.hamcrest.text.MatchesPattern.matchesPattern(pattern);
-  }
-
-  /**
-   * Creates a matcher of {@link java.lang.String} that matches when the examined string
-   * exactly matches the given regular expression, treated as a {@link java.util.regex.Pattern}.
-   */
-  public static org.hamcrest.Matcher<java.lang.String> matchesPattern(java.lang.String regex) {
-    return org.hamcrest.text.MatchesPattern.matchesPattern(regex);
-  }
-
-  /**
-   * Creates a matcher of {@link String} that matches when the examined string contains all of
-   * the specified substrings, considering the order of their appearance.
-   * For example:
-   * <pre>assertThat("myfoobarbaz", stringContainsInOrder(Arrays.asList("bar", "foo")))</pre>
-   * fails as "foo" occurs before "bar" in the string "myfoobarbaz"
-   * 
-   * @param substrings
-   *     the substrings that must be contained within matching strings
-   */
-  public static org.hamcrest.Matcher<java.lang.String> stringContainsInOrder(java.lang.Iterable<java.lang.String> substrings) {
-    return org.hamcrest.text.StringContainsInOrder.stringContainsInOrder(substrings);
-  }
-
-  /**
-   * Creates a matcher of {@link String} that matches when the examined string contains all of
-   * the specified substrings, considering the order of their appearance.
-   * For example:
-   * <pre>assertThat("myfoobarbaz", stringContainsInOrder("bar", "foo"))</pre>
-   * fails as "foo" occurs before "bar" in the string "myfoobarbaz"
-   * 
-   * @param substrings
-   *     the substrings that must be contained within matching strings
-   */
-  public static org.hamcrest.Matcher<java.lang.String> stringContainsInOrder(java.lang.String... substrings) {
-    return org.hamcrest.text.StringContainsInOrder.stringContainsInOrder(substrings);
-  }
-
-  /**
-   * Creates a matcher that matches any examined object whose <code>toString</code> method
-   * returns a value that satisfies the specified matcher.
-   * For example:
-   * <pre>assertThat(true, hasToString(equalTo("TRUE")))</pre>
-   * 
-   * @param toStringMatcher
-   *     the matcher used to verify the toString result
-   */
-  public static <T> org.hamcrest.Matcher<T> hasToString(org.hamcrest.Matcher<? super java.lang.String> toStringMatcher) {
-    return org.hamcrest.object.HasToString.<T>hasToString(toStringMatcher);
-  }
-
-  /**
-   * Creates a matcher that matches any examined object whose <code>toString</code> method
-   * returns a value equalTo the specified string.
-   * For example:
-   * <pre>assertThat(true, hasToString("TRUE"))</pre>
-   * 
-   * @param expectedToString
-   *     the expected toString result
-   */
-  public static <T> org.hamcrest.Matcher<T> hasToString(java.lang.String expectedToString) {
-    return org.hamcrest.object.HasToString.<T>hasToString(expectedToString);
-  }
-
-  /**
-   * Creates a matcher of {@link Class} that matches when the specified baseType is
-   * assignable from the examined class.
-   * For example:
-   * <pre>assertThat(Integer.class, typeCompatibleWith(Number.class))</pre>
-   * 
-   * @param baseType
-   *     the base class to examine classes against
-   */
-  public static <T> org.hamcrest.Matcher<java.lang.Class<?>> typeCompatibleWith(java.lang.Class<T> baseType) {
-    return org.hamcrest.object.IsCompatibleType.<T>typeCompatibleWith(baseType);
-  }
-
-  /**
-   * Creates a matcher of {@link java.util.EventObject} that matches any object
-   * derived from <var>eventClass</var> announced by <var>source</var>.
-   * For example:
-   * <pre>assertThat(myEvent, is(eventFrom(PropertyChangeEvent.class, myBean)))</pre>
-   * 
-   * @param eventClass
-   *     the class of the event to match on
-   * @param source
-   *     the source of the event
-   */
-  public static org.hamcrest.Matcher<java.util.EventObject> eventFrom(java.lang.Class<? extends java.util.EventObject> eventClass, java.lang.Object source) {
-    return org.hamcrest.object.IsEventFrom.eventFrom(eventClass, source);
-  }
+    /**
+     * Constructs an IsEventFrom Matcher that returns true for any object
+     * derived from <var>eventClass</var> announced by <var>source</var>.
+     */
+    public static org.hamcrest.Matcher<java.util.EventObject> eventFrom(java.lang.Class<? extends java.util.EventObject> eventClass, java.lang.Object source) {
+        return org.hamcrest.object.IsEventFrom.eventFrom(eventClass, source);
+    }
 
-  /**
-   * Creates a matcher of {@link java.util.EventObject} that matches any EventObject
-   * announced by <var>source</var>.
-   * For example:
-   * <pre>assertThat(myEvent, is(eventFrom(myBean)))</pre>
-   * 
-   * @param source
-   *     the source of the event
-   */
-  public static org.hamcrest.Matcher<java.util.EventObject> eventFrom(java.lang.Object source) {
-    return org.hamcrest.object.IsEventFrom.eventFrom(source);
-  }
+    /**
+     * Constructs an IsEventFrom Matcher that returns true for any object
+     * derived from {@link java.util.EventObject} announced by <var>source
+     * </var>.
+     */
+    public static org.hamcrest.Matcher<java.util.EventObject> eventFrom(java.lang.Object source) {
+        return org.hamcrest.object.IsEventFrom.eventFrom(source);
+    }
 
-  /**
-   * Creates a matcher of {@link org.w3c.dom.Node}s that matches when the examined node has a value at the
-   * specified <code>xPath</code> that satisfies the specified <code>valueMatcher</code>.
-   * For example:
-   * <pre>assertThat(xml, hasXPath("/root/something[2]/cheese", equalTo("Cheddar")))</pre>
-   * 
-   * @param xPath
-   *     the target xpath
-   * @param valueMatcher
-   *     matcher for the value at the specified xpath
-   */
-  public static org.hamcrest.Matcher<org.w3c.dom.Node> hasXPath(java.lang.String xPath, org.hamcrest.Matcher<java.lang.String> valueMatcher) {
-    return org.hamcrest.xml.HasXPath.hasXPath(xPath, valueMatcher);
+    /* android-changed REMOVE
+  public static <T> org.hamcrest.Matcher<T> hasProperty(java.lang.String propertyName) {
+    return org.hamcrest.beans.HasProperty.hasProperty(propertyName);
   }
 
-  /**
-   * Creates a matcher of {@link org.w3c.dom.Node}s that matches when the examined node has a value at the
-   * specified <code>xPath</code>, within the specified <code>namespaceContext</code>, that satisfies
-   * the specified <code>valueMatcher</code>.
-   * For example:
-   * <pre>assertThat(xml, hasXPath("/root/something[2]/cheese", myNs, equalTo("Cheddar")))</pre>
-   * 
-   * @param xPath
-   *     the target xpath
-   * @param namespaceContext
-   *     the namespace for matching nodes
-   * @param valueMatcher
-   *     matcher for the value at the specified xpath
-   */
-  public static org.hamcrest.Matcher<org.w3c.dom.Node> hasXPath(java.lang.String xPath, javax.xml.namespace.NamespaceContext namespaceContext, org.hamcrest.Matcher<java.lang.String> valueMatcher) {
-    return org.hamcrest.xml.HasXPath.hasXPath(xPath, namespaceContext, valueMatcher);
+  public static <T> org.hamcrest.Matcher<T> hasProperty(java.lang.String propertyName, org.hamcrest.Matcher value) {
+    return org.hamcrest.beans.HasPropertyWithValue.hasProperty(propertyName, value);
   }
+     */
 
-  /**
-   * Creates a matcher of {@link org.w3c.dom.Node}s that matches when the examined node contains a node
-   * at the specified <code>xPath</code>, with any content.
-   * For example:
-   * <pre>assertThat(xml, hasXPath("/root/something[2]/cheese"))</pre>
-   * 
-   * @param xPath
-   *     the target xpath
-   */
-  public static org.hamcrest.Matcher<org.w3c.dom.Node> hasXPath(java.lang.String xPath) {
-    return org.hamcrest.xml.HasXPath.hasXPath(xPath);
-  }
+    public static org.hamcrest.Matcher<org.w3c.dom.Node> hasXPath(java.lang.String xPath, org.hamcrest.Matcher<java.lang.String> valueMatcher) {
+        return org.hamcrest.xml.HasXPath.hasXPath(xPath, valueMatcher);
+    }
 
-  /**
-   * Creates a matcher of {@link org.w3c.dom.Node}s that matches when the examined node contains a node
-   * at the specified <code>xPath</code> within the specified namespace context, with any content.
-   * For example:
-   * <pre>assertThat(xml, hasXPath("/root/something[2]/cheese", myNs))</pre>
-   * 
-   * @param xPath
-   *     the target xpath
-   * @param namespaceContext
-   *     the namespace for matching nodes
-   */
-  public static org.hamcrest.Matcher<org.w3c.dom.Node> hasXPath(java.lang.String xPath, javax.xml.namespace.NamespaceContext namespaceContext) {
-    return org.hamcrest.xml.HasXPath.hasXPath(xPath, namespaceContext);
-  }
+    public static org.hamcrest.Matcher<org.w3c.dom.Node> hasXPath(java.lang.String xPath) {
+        return org.hamcrest.xml.HasXPath.hasXPath(xPath);
+    }
 
 }
diff --git a/hamcrest-library/src/main/java/org/hamcrest/collection/IsArray.java b/hamcrest-library/src/main/java/org/hamcrest/collection/IsArray.java
index 38f5d91..6a26ef1 100644
--- a/hamcrest-library/src/main/java/org/hamcrest/collection/IsArray.java
+++ b/hamcrest-library/src/main/java/org/hamcrest/collection/IsArray.java
@@ -1,23 +1,18 @@
 package org.hamcrest.collection;
 
+import java.util.Arrays;
+
 import org.hamcrest.Description;
 import org.hamcrest.Matcher;
 import org.hamcrest.TypeSafeMatcher;
 
-import java.util.Arrays;
-
-/**
- * Matcher for array whose elements satisfy a sequence of matchers.
- * The array size must equal the number of element matchers.
- */
 public class IsArray<T> extends TypeSafeMatcher<T[]> {
-    private final Matcher<? super T>[] elementMatchers;
+    private final Matcher<T>[] elementMatchers;
     
-    public IsArray(Matcher<? super T>[] elementMatchers) {
+    public IsArray(Matcher<T>[] elementMatchers) {
         this.elementMatchers = elementMatchers.clone();
     }
     
-    @Override
     public boolean matchesSafely(T[] array) {
         if (array.length != elementMatchers.length) return false;
         
@@ -27,24 +22,7 @@
         
         return true;
     }
-
-    @Override
-    public void describeMismatchSafely(T[] actual, Description mismatchDescription) {
-        if (actual.length != elementMatchers.length) {
-            mismatchDescription.appendText("array length was ").appendValue(actual.length);
-            return;
-        }
-        for (int i = 0; i < actual.length; i++) {
-            if (!elementMatchers[i].matches(actual[i])) {
-                mismatchDescription.appendText("element ").appendValue(i).appendText(" ");
-                elementMatchers[i].describeMismatch(actual[i], mismatchDescription);
-                return;
-            }
-        }
-    }
-
-    @Override
-    @SuppressWarnings("unchecked")
+    
     public void describeTo(Description description) {
         description.appendList(descriptionStart(), descriptionSeparator(), descriptionEnd(), 
                                Arrays.asList(elementMatchers));
@@ -80,18 +58,7 @@
         return "]";
     }
     
-    /**
-     * Creates a matcher that matches arrays whose elements are satisfied by the specified matchers.  Matches
-     * positively only if the number of matchers specified is equal to the length of the examined array and
-     * each matcher[i] is satisfied by array[i].
-     * For example:
-     * <pre>assertThat(new Integer[]{1,2,3}, is(array(equalTo(1), equalTo(2), equalTo(3))))</pre>
-     * 
-     * @param elementMatchers
-     *     the matchers that the elements of examined arrays should satisfy
-     */
-    public static <T> IsArray<T> array(Matcher<? super T>... elementMatchers) {
+    public static <T> IsArray<T> array(Matcher<T>... elementMatchers) {
         return new IsArray<T>(elementMatchers);
     }
-
 }
diff --git a/hamcrest-library/src/main/java/org/hamcrest/collection/IsArrayContaining.java b/hamcrest-library/src/main/java/org/hamcrest/collection/IsArrayContaining.java
index 749c7c6..76ddf9d 100644
--- a/hamcrest-library/src/main/java/org/hamcrest/collection/IsArrayContaining.java
+++ b/hamcrest-library/src/main/java/org/hamcrest/collection/IsArrayContaining.java
@@ -2,23 +2,18 @@
 
 import org.hamcrest.Description;
 import org.hamcrest.Matcher;
+import org.hamcrest.Factory;
 import org.hamcrest.TypeSafeMatcher;
-
-import java.util.Arrays;
-
 import static org.hamcrest.core.IsEqual.equalTo;
 
-/**
- * Matches if an array contains an item satisfying a nested matcher.
- */
 public class IsArrayContaining<T> extends TypeSafeMatcher<T[]> {
-    private final Matcher<? super T> elementMatcher;
 
-    public IsArrayContaining(Matcher<? super T> elementMatcher) {
+    private final Matcher<T> elementMatcher;
+
+    public IsArrayContaining(Matcher<T> elementMatcher) {
         this.elementMatcher = elementMatcher;
     }
 
-    @Override
     public boolean matchesSafely(T[] array) {
         for (T item : array) {
             if (elementMatcher.matches(item)) {
@@ -27,45 +22,21 @@
         }
         return false;
     }
-    
-    @Override
-    public void describeMismatchSafely(T[] item, Description mismatchDescription) {
-        super.describeMismatch(Arrays.asList(item), mismatchDescription);
-    }
 
-    @Override
     public void describeTo(Description description) {
         description
-            .appendText("an array containing ")
-            .appendDescriptionOf(elementMatcher);
+        	.appendText("an array containing ")
+        	.appendDescriptionOf(elementMatcher);
     }
 
-    /**
-     * Creates a matcher for arrays that matches when the examined array contains at least one item
-     * that is matched by the specified <code>elementMatcher</code>.  Whilst matching, the traversal
-     * of the examined array will stop as soon as a matching element is found.
-     * For example:
-     * <pre>assertThat(new String[] {"foo", "bar"}, hasItemInArray(startsWith("ba")))</pre>
-     * 
-     * @param elementMatcher
-     *     the matcher to apply to elements in examined arrays
-     */
-    public static <T> Matcher<T[]> hasItemInArray(Matcher<? super T> elementMatcher) {
+    @Factory
+    public static <T> Matcher<T[]> hasItemInArray(Matcher<T> elementMatcher) {
         return new IsArrayContaining<T>(elementMatcher);
     }
 
-    /**
-     * A shortcut to the frequently used <code>hasItemInArray(equalTo(x))</code>.
-     * For example:
-     * <pre>assertThat(hasItemInArray(x))</pre>
-     * instead of:
-     * <pre>assertThat(hasItemInArray(equalTo(x)))</pre>
-     * 
-     * @param element
-     *     the element that should be present in examined arrays
-     */
+    @Factory
     public static <T> Matcher<T[]> hasItemInArray(T element) {
-        Matcher<? super T> matcher = equalTo(element);
-        return IsArrayContaining.<T>hasItemInArray(matcher);
+        return hasItemInArray(equalTo(element));
     }
+
 }
diff --git a/hamcrest-library/src/main/java/org/hamcrest/collection/IsArrayContainingInAnyOrder.java b/hamcrest-library/src/main/java/org/hamcrest/collection/IsArrayContainingInAnyOrder.java
deleted file mode 100644
index fbab222..0000000
--- a/hamcrest-library/src/main/java/org/hamcrest/collection/IsArrayContainingInAnyOrder.java
+++ /dev/null
@@ -1,112 +0,0 @@
-package org.hamcrest.collection;
-
-import org.hamcrest.Description;
-import org.hamcrest.Matcher;
-import org.hamcrest.TypeSafeMatcher;
-
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.Collection;
-import java.util.List;
-
-import static org.hamcrest.core.IsEqual.equalTo;
-
-public class IsArrayContainingInAnyOrder<E> extends TypeSafeMatcher<E[]> {
-    private final IsIterableContainingInAnyOrder<E> iterableMatcher;
-    private final Collection<Matcher<? super E>> matchers;
-
-    public IsArrayContainingInAnyOrder(Collection<Matcher<? super E>> matchers) {
-        this.iterableMatcher = new IsIterableContainingInAnyOrder<E>(matchers);
-        this.matchers = matchers;
-    }
-
-    @Override
-    public boolean matchesSafely(E[] item) {
-        return iterableMatcher.matches(Arrays.asList(item));
-    }
-    
-    @Override
-    public void describeMismatchSafely(E[] item, Description mismatchDescription) {
-      iterableMatcher.describeMismatch(Arrays.asList(item), mismatchDescription);
-    }
-
-    @Override
-    public void describeTo(Description description) {
-        description.appendList("[", ", ", "]", matchers)
-            .appendText(" in any order");
-    }
-
-    /**
-     * <p>
-     * Creates an order agnostic matcher for arrays that matches when each item in the
-     * examined array satisfies one matcher anywhere in the specified matchers.
-     * For a positive match, the examined array must be of the same length as the number of
-     * specified matchers.
-     * </p>
-     * <p>
-     * N.B. each of the specified matchers will only be used once during a given examination, so be
-     * careful when specifying matchers that may be satisfied by more than one entry in an examined
-     * array.
-     * </p>
-     * <p>
-     * For example:
-     * </p>
-     * <pre>assertThat(new String[]{"foo", "bar"}, arrayContainingInAnyOrder(equalTo("bar"), equalTo("foo")))</pre>
-     * 
-     * @param itemMatchers
-     *     a list of matchers, each of which must be satisfied by an entry in an examined array
-     */
-    public static <E> Matcher<E[]> arrayContainingInAnyOrder(Matcher<? super E>... itemMatchers) {
-      return arrayContainingInAnyOrder((List) Arrays.asList(itemMatchers));
-    }
-
-    /**
-     * <p>
-     * Creates an order agnostic matcher for arrays that matches when each item in the
-     * examined array satisfies one matcher anywhere in the specified collection of matchers.
-     * For a positive match, the examined array must be of the same length as the specified collection
-     * of matchers.
-     * </p>
-     * <p>
-     * N.B. each matcher in the specified collection will only be used once during a given
-     * examination, so be careful when specifying matchers that may be satisfied by more than
-     * one entry in an examined array.
-     * </p>
-     * <p>
-     * For example:
-     * </p>
-     * <pre>assertThat(new String[]{"foo", "bar"}, arrayContainingInAnyOrder(Arrays.asList(equalTo("bar"), equalTo("foo"))))</pre>
-     * 
-     * @param itemMatchers
-     *     a list of matchers, each of which must be satisfied by an item provided by an examined array
-     */
-    public static <E> Matcher<E[]> arrayContainingInAnyOrder(Collection<Matcher<? super E>> itemMatchers) {
-        return new IsArrayContainingInAnyOrder<E>(itemMatchers);
-    }
-
-    /**
-     * <p>Creates an order agnostic matcher for arrays that matches when each item in the
-     * examined array is logically equal to one item anywhere in the specified items.
-     * For a positive match, the examined array must be of the same length as the number of
-     * specified items.
-     * </p>
-     * <p>N.B. each of the specified items will only be used once during a given examination, so be
-     * careful when specifying items that may be equal to more than one entry in an examined
-     * array.
-     * </p>
-     * <p>
-     * For example:
-     * </p>
-     * <pre>assertThat(new String[]{"foo", "bar"}, containsInAnyOrder("bar", "foo"))</pre>
-     * 
-     * @param items
-     *     the items that must equal the entries of an examined array, in any order
-     */
-    public static <E> Matcher<E[]> arrayContainingInAnyOrder(E... items) {
-      List<Matcher<? super E>> matchers = new ArrayList<Matcher<? super E>>();
-      for (E item : items) {
-          matchers.add(equalTo(item));
-      }
-      return new IsArrayContainingInAnyOrder<E>(matchers);
-    }
-}
diff --git a/hamcrest-library/src/main/java/org/hamcrest/collection/IsArrayContainingInOrder.java b/hamcrest-library/src/main/java/org/hamcrest/collection/IsArrayContainingInOrder.java
deleted file mode 100644
index 849920a..0000000
--- a/hamcrest-library/src/main/java/org/hamcrest/collection/IsArrayContainingInOrder.java
+++ /dev/null
@@ -1,89 +0,0 @@
-package org.hamcrest.collection;
-
-import org.hamcrest.Description;
-import org.hamcrest.Matcher;
-import org.hamcrest.TypeSafeMatcher;
-import org.hamcrest.internal.NullSafety;
-
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.List;
-
-import static java.util.Arrays.asList;
-import static org.hamcrest.core.IsEqual.equalTo;
-
-public class IsArrayContainingInOrder<E> extends TypeSafeMatcher<E[]> {
-    private final Collection<Matcher<? super E>> matchers;
-    private final IsIterableContainingInOrder<E> iterableMatcher;
-
-    public IsArrayContainingInOrder(List<Matcher<? super E>> matchers) {
-        this.iterableMatcher = new IsIterableContainingInOrder<E>(matchers);
-        this.matchers = matchers;
-    }
-
-    @Override
-    public boolean matchesSafely(E[] item) {
-        return iterableMatcher.matches(asList(item));
-    }
-    
-    @Override
-    public void describeMismatchSafely(E[] item, Description mismatchDescription) {
-      iterableMatcher.describeMismatch(asList(item), mismatchDescription);
-    }
-
-    @Override
-    public void describeTo(Description description) {
-        description.appendList("[", ", ", "]", matchers);
-    }
-
-    /**
-     * Creates a matcher for arrays that matches when each item in the examined array is
-     * logically equal to the corresponding item in the specified items.  For a positive match,
-     * the examined array must be of the same length as the number of specified items.
-     * For example:
-     * <pre>assertThat(new String[]{"foo", "bar"}, contains("foo", "bar"))</pre>
-     * 
-     * @param items
-     *     the items that must equal the items within an examined array
-     */
-    public static <E> Matcher<E[]> arrayContaining(E... items) {
-        List<Matcher<? super E>> matchers = new ArrayList<Matcher<? super E>>();
-        for (E item : items) {
-            matchers.add(equalTo(item));
-        }
-        return arrayContaining(matchers);
-    }
-
-    /**
-     * Creates a matcher for arrays that matches when each item in the examined array satisfies the
-     * corresponding matcher in the specified matchers.  For a positive match, the examined array
-     * must be of the same length as the number of specified matchers.
-     * For example:
-     * <pre>assertThat(new String[]{"foo", "bar"}, contains(equalTo("foo"), equalTo("bar")))</pre>
-     * 
-     * @param itemMatchers
-     *     the matchers that must be satisfied by the items in the examined array
-     */
-    public static <E> Matcher<E[]> arrayContaining(Matcher<? super E>... itemMatchers) {
-        //required for JDK 1.6
-        //noinspection RedundantTypeArguments
-        final List<Matcher<? super E>> nullSafeWithExplicitTypeMatchers = NullSafety.<E>nullSafe(itemMatchers);
-
-        return arrayContaining(nullSafeWithExplicitTypeMatchers);
-    }
-
-    /**
-     * Creates a matcher for arrays that matches when each item in the examined array satisfies the
-     * corresponding matcher in the specified list of matchers.  For a positive match, the examined array
-     * must be of the same length as the specified list of matchers.
-     * For example:
-     * <pre>assertThat(new String[]{"foo", "bar"}, contains(Arrays.asList(equalTo("foo"), equalTo("bar"))))</pre>
-     * 
-     * @param itemMatchers
-     *     a list of matchers, each of which must be satisfied by the corresponding item in an examined array
-     */
-    public static <E> Matcher<E[]> arrayContaining(List<Matcher<? super E>> itemMatchers) {
-        return new IsArrayContainingInOrder<E>(itemMatchers);
-    }
-
-}
diff --git a/hamcrest-library/src/main/java/org/hamcrest/collection/IsArrayWithSize.java b/hamcrest-library/src/main/java/org/hamcrest/collection/IsArrayWithSize.java
deleted file mode 100644
index b3a0b1f..0000000
--- a/hamcrest-library/src/main/java/org/hamcrest/collection/IsArrayWithSize.java
+++ /dev/null
@@ -1,59 +0,0 @@
-package org.hamcrest.collection;
-
-import org.hamcrest.FeatureMatcher;
-import org.hamcrest.Matcher;
-
-import static org.hamcrest.core.DescribedAs.describedAs;
-import static org.hamcrest.core.IsEqual.equalTo;
-
-/**
- * Matches if array size satisfies a nested matcher.
- */
-public class IsArrayWithSize<E> extends FeatureMatcher<E[], Integer> {
-    public IsArrayWithSize(Matcher<? super Integer> sizeMatcher) {
-        super(sizeMatcher, "an array with size","array size");
-    }
-
-    @Override
-    protected Integer featureValueOf(E[] actual) {
-      return actual.length;
-    }
-
-    /**
-     * Creates a matcher for arrays that matches when the <code>length</code> of the array
-     * satisfies the specified matcher.
-     * For example:
-     * <pre>assertThat(new String[]{"foo", "bar"}, arrayWithSize(equalTo(2)))</pre>
-     * 
-     * @param sizeMatcher
-     *     a matcher for the length of an examined array
-     */
-    public static <E> Matcher<E[]> arrayWithSize(Matcher<? super Integer> sizeMatcher) {
-        return new IsArrayWithSize<E>(sizeMatcher);
-    }
-
-    /**
-     * Creates a matcher for arrays that matches when the <code>length</code> of the array
-     * equals the specified <code>size</code>.
-     * For example:
-     * <pre>assertThat(new String[]{"foo", "bar"}, arrayWithSize(2))</pre>
-     * 
-     * @param size
-     *     the length that an examined array must have for a positive match
-     */
-    public static <E> Matcher<E[]> arrayWithSize(int size) {
-        return arrayWithSize(equalTo(size));
-    }
-
-    /**
-     * Creates a matcher for arrays that matches when the <code>length</code> of the array
-     * is zero.
-     * For example:
-     * <pre>assertThat(new String[0], emptyArray())</pre>
-     * 
-     */
-    public static <E> Matcher<E[]> emptyArray() {
-        Matcher<E[]> isEmpty = arrayWithSize(0);
-        return describedAs("an empty array", isEmpty);
-    }
-}
diff --git a/hamcrest-library/src/main/java/org/hamcrest/collection/IsCollectionContaining.java b/hamcrest-library/src/main/java/org/hamcrest/collection/IsCollectionContaining.java
new file mode 100644
index 0000000..ba98630
--- /dev/null
+++ b/hamcrest-library/src/main/java/org/hamcrest/collection/IsCollectionContaining.java
@@ -0,0 +1,65 @@
+package org.hamcrest.collection;
+
+import static org.hamcrest.core.AllOf.allOf;
+import org.hamcrest.Description;
+import org.hamcrest.Matcher;
+import org.hamcrest.Factory;
+import org.hamcrest.TypeSafeMatcher;
+import static org.hamcrest.core.IsEqual.equalTo;
+
+import java.util.Collection;
+import java.util.ArrayList;
+
+public class IsCollectionContaining<T> extends TypeSafeMatcher<Iterable<T>> {
+    private final Matcher<? extends T> elementMatcher;
+
+    public IsCollectionContaining(Matcher<? extends T> elementMatcher) {
+        this.elementMatcher = elementMatcher;
+    }
+
+    public boolean matchesSafely(Iterable<T> collection) {
+        for (T item : collection) {
+            if (elementMatcher.matches(item)){
+                return true;
+            }
+        }
+        return false;
+    }
+
+    public void describeTo(Description description) {
+        description
+        	.appendText("a collection containing ")
+        	.appendDescriptionOf(elementMatcher);
+    }
+
+    @Factory
+    public static <T> Matcher<Iterable<T>> hasItem(Matcher<? extends T> elementMatcher) {
+        return new IsCollectionContaining<T>(elementMatcher);
+    }
+
+    @Factory
+    public static <T> Matcher<Iterable<T>> hasItem(T element) {
+        return hasItem(equalTo(element));
+    }
+
+    @Factory
+    public static <T> Matcher<Iterable<T>> hasItems(Matcher<? extends T>... elementMatchers) {
+        Collection<Matcher<? extends Iterable<T>>> all
+                = new ArrayList<Matcher<? extends Iterable<T>>>(elementMatchers.length);
+        for (Matcher<? extends T> elementMatcher : elementMatchers) {
+            all.add(hasItem(elementMatcher));
+        }
+        return allOf(all);
+    }
+
+    @Factory
+    public static <T> Matcher<Iterable<T>> hasItems(T... elements) {
+        Collection<Matcher<? extends Iterable<T>>> all
+                = new ArrayList<Matcher<? extends Iterable<T>>>(elements.length);
+        for (T element : elements) {
+            all.add(hasItem(element));
+        }
+        return allOf(all);
+    }
+
+}
diff --git a/hamcrest-library/src/main/java/org/hamcrest/collection/IsCollectionWithSize.java b/hamcrest-library/src/main/java/org/hamcrest/collection/IsCollectionWithSize.java
deleted file mode 100644
index f12f57c..0000000
--- a/hamcrest-library/src/main/java/org/hamcrest/collection/IsCollectionWithSize.java
+++ /dev/null
@@ -1,50 +0,0 @@
-package org.hamcrest.collection;
-
-import org.hamcrest.FeatureMatcher;
-import org.hamcrest.Matcher;
-
-import java.util.Collection;
-
-import static org.hamcrest.core.IsEqual.equalTo;
-
-/**
- * Matches if collection size satisfies a nested matcher.
- */
-public class IsCollectionWithSize<E> extends FeatureMatcher<Collection<? extends E>, Integer> {
-    public IsCollectionWithSize(Matcher<? super Integer> sizeMatcher) {
-      super(sizeMatcher, "a collection with size", "collection size");
-    }
-
-    @Override
-    protected Integer featureValueOf(Collection<? extends E> actual) {
-      return actual.size();
-    }
-
-    /**
-     * Creates a matcher for {@link java.util.Collection}s that matches when the <code>size()</code> method returns
-     * a value that satisfies the specified matcher.
-     * For example:
-     * <pre>assertThat(Arrays.asList("foo", "bar"), hasSize(equalTo(2)))</pre>
-     * 
-     * @param sizeMatcher
-     *     a matcher for the size of an examined {@link java.util.Collection}
-     */
-    public static <E> Matcher<Collection<? extends E>> hasSize(Matcher<? super Integer> sizeMatcher) {
-        return new IsCollectionWithSize<E>(sizeMatcher);
-    }
-
-    /**
-     * Creates a matcher for {@link java.util.Collection}s that matches when the <code>size()</code> method returns
-     * a value equal to the specified <code>size</code>.
-     * For example:
-     * <pre>assertThat(Arrays.asList("foo", "bar"), hasSize(2))</pre>
-     * 
-     * @param size
-     *     the expected size of an examined {@link java.util.Collection}
-     */
-    @SuppressWarnings({ "rawtypes", "unchecked" })
-    public static <E> Matcher<Collection<? extends E>> hasSize(int size) {
-    	return (Matcher)IsCollectionWithSize.hasSize(equalTo(size));
-    }
-
-}
diff --git a/hamcrest-library/src/main/java/org/hamcrest/collection/IsEmptyCollection.java b/hamcrest-library/src/main/java/org/hamcrest/collection/IsEmptyCollection.java
deleted file mode 100644
index 481b08c..0000000
--- a/hamcrest-library/src/main/java/org/hamcrest/collection/IsEmptyCollection.java
+++ /dev/null
@@ -1,53 +0,0 @@
-package org.hamcrest.collection;
-
-import org.hamcrest.Description;
-import org.hamcrest.Matcher;
-import org.hamcrest.TypeSafeMatcher;
-
-import java.util.Collection;
-
-/**
- * Tests if collection is empty.
- */
-public class IsEmptyCollection<E> extends TypeSafeMatcher<Collection<? extends E>> {
-
-    @Override
-    public boolean matchesSafely(Collection<? extends E> item) {
-        return item.isEmpty();
-    }
-
-    @Override
-    public void describeMismatchSafely(Collection<? extends E> item, Description mismatchDescription) {
-      mismatchDescription.appendValue(item);
-    }
-
-    @Override
-    public void describeTo(Description description) {
-        description.appendText("an empty collection");
-    }
-
-    /**
-     * Creates a matcher for {@link java.util.Collection}s matching examined collections whose <code>isEmpty</code>
-     * method returns <code>true</code>.
-     * For example:
-     * <pre>assertThat(new ArrayList&lt;String&gt;(), is(empty()))</pre>
-     * 
-     */
-    public static <E> Matcher<Collection<? extends E>> empty() {
-        return new IsEmptyCollection<E>();
-    }
-
-    /**
-     * Creates a matcher for {@link java.util.Collection}s matching examined collections whose <code>isEmpty</code>
-     * method returns <code>true</code>.
-     * For example:
-     * <pre>assertThat(new ArrayList&lt;String&gt;(), is(emptyCollectionOf(String.class)))</pre>
-     * 
-     * @param unusedToForceReturnType
-     *     the type of the collection's content
-     */
-    @SuppressWarnings({"unchecked", "UnusedParameters"})
-    public static <E> Matcher<Collection<E>> emptyCollectionOf(Class<E> unusedToForceReturnType) {
-      return (Matcher)empty();
-    }
-}
diff --git a/hamcrest-library/src/main/java/org/hamcrest/collection/IsEmptyIterable.java b/hamcrest-library/src/main/java/org/hamcrest/collection/IsEmptyIterable.java
deleted file mode 100644
index 047e670..0000000
--- a/hamcrest-library/src/main/java/org/hamcrest/collection/IsEmptyIterable.java
+++ /dev/null
@@ -1,48 +0,0 @@
-package org.hamcrest.collection;
-
-import org.hamcrest.Description;
-import org.hamcrest.Matcher;
-import org.hamcrest.TypeSafeMatcher;
-
-/**
- * Tests if collection is empty.
- */
-public class IsEmptyIterable<E> extends TypeSafeMatcher<Iterable<? extends E>> {
-
-    @Override
-    public boolean matchesSafely(Iterable<? extends E> iterable) {
-        return !iterable.iterator().hasNext();
-    }
-    @Override
-    public void describeMismatchSafely(Iterable<? extends E> iter, Description mismatchDescription) {
-        mismatchDescription.appendValueList("[", ",", "]", iter);
-    }
-
-    @Override
-    public void describeTo(Description description) {
-        description.appendText("an empty iterable");
-    }
-
-    /**
-     * Creates a matcher for {@link Iterable}s matching examined iterables that yield no items.
-     * For example:
-     * <pre>assertThat(new ArrayList&lt;String&gt;(), is(emptyIterable()))</pre>
-     * 
-     */
-    public static <E> Matcher<Iterable<? extends E>> emptyIterable() {
-        return new IsEmptyIterable<E>();
-    }
-
-    /**
-     * Creates a matcher for {@link Iterable}s matching examined iterables that yield no items.
-     * For example:
-     * <pre>assertThat(new ArrayList&lt;String&gt;(), is(emptyIterableOf(String.class)))</pre>
-     * 
-     * @param unusedToForceReturnType
-     *     the type of the iterable's content
-     */
-    @SuppressWarnings({"unchecked", "UnusedParameters"})
-    public static <E> Matcher<Iterable<E>> emptyIterableOf(Class<E> unusedToForceReturnType) {
-      return (Matcher)emptyIterable();
-    }
-}
diff --git a/hamcrest-library/src/main/java/org/hamcrest/collection/IsIn.java b/hamcrest-library/src/main/java/org/hamcrest/collection/IsIn.java
index f030cab..0a7bbb5 100644
--- a/hamcrest-library/src/main/java/org/hamcrest/collection/IsIn.java
+++ b/hamcrest-library/src/main/java/org/hamcrest/collection/IsIn.java
@@ -1,12 +1,13 @@
 package org.hamcrest.collection;
 
-import org.hamcrest.BaseMatcher;
-import org.hamcrest.Description;
-import org.hamcrest.Matcher;
-
 import java.util.Arrays;
 import java.util.Collection;
 
+import org.hamcrest.BaseMatcher;
+import org.hamcrest.Description;
+import org.hamcrest.Factory;
+import org.hamcrest.Matcher;
+
 public class IsIn<T> extends BaseMatcher<T> {
     private final Collection<T> collection;
 
@@ -18,108 +19,27 @@
         collection = Arrays.asList(elements);
     }
     
-    @SuppressWarnings("SuspiciousMethodCalls")
-    @Override
     public boolean matches(Object o) {
         return collection.contains(o);
     }
 
-    @Override
     public void describeTo(Description buffer) {
         buffer.appendText("one of ");
         buffer.appendValueList("{", ", ", "}", collection);
     }
     
-    /**
-     * Creates a matcher that matches when the examined object is found within the
-     * specified collection.
-     * For example:
-     * <pre>assertThat("foo", isIn(Arrays.asList("bar", "foo")))</pre>
-     * 
-     * @deprecated use is(in(...)) instead
-     * 
-     * @param collection
-     *     the collection in which matching items must be found
-     * 
-     */
-    @Deprecated
+    @Factory
     public static <T> Matcher<T> isIn(Collection<T> collection) {
-        return in(collection);
-    }
-    
-    /**
-     * Creates a matcher that matches when the examined object is found within the
-     * specified collection.
-     * For example:
-     * <pre>assertThat("foo", is(in(Arrays.asList("bar", "foo"))))</pre>
-     * 
-     * @param collection
-     *     the collection in which matching items must be found
-     * 
-     */
-    public static <T> Matcher<T> in(Collection<T> collection) {
         return new IsIn<T>(collection);
     }
-
-    /**
-     * Creates a matcher that matches when the examined object is found within the
-     * specified array.
-     * For example:
-     * <pre>assertThat("foo", isIn(new String[]{"bar", "foo"}))</pre>
-     * 
-     * @deprecated use is(in(...)) instead
-     * 
-     * @param elements
-     *     the array in which matching items must be found
-     * 
-     */
-    @Deprecated
-    public static <T> Matcher<T> isIn(T[] elements) {
-        return in(elements);
-    }
     
-    /**
-     * Creates a matcher that matches when the examined object is found within the
-     * specified array.
-     * For example:
-     * <pre>assertThat("foo", is(in(new String[]{"bar", "foo"})))</pre>
-     * 
-     * @param elements
-     *     the array in which matching items must be found
-     * 
-     */
-    public static <T> Matcher<T> in(T[] elements) {
+    @Factory
+    public static <T> Matcher<T> isIn(T[] elements) {
         return new IsIn<T>(elements);
     }
     
-    /**
-     * Creates a matcher that matches when the examined object is equal to one of the
-     * specified elements.
-     * For example:
-     * <pre>assertThat("foo", isOneOf("bar", "foo"))</pre>
-     * 
-     * @deprecated use is(oneOf(...)) instead
-     * 
-     * @param elements
-     *     the elements amongst which matching items will be found 
-     * 
-     */
-    @Deprecated
+    @Factory
     public static <T> Matcher<T> isOneOf(T... elements) {
-        return oneOf(elements);
-    }
-    
-    /**
-     * Creates a matcher that matches when the examined object is equal to one of the
-     * specified elements.
-     * For example:
-     * <pre>assertThat("foo", is(oneOf("bar", "foo")))</pre>
-     *  
-     * @param elements
-     *     the elements amongst which matching items will be found 
-     * 
-     */
-    public static <T> Matcher<T> oneOf(T... elements) {
-        return in(elements);
+        return isIn(elements);
     }
 }
diff --git a/hamcrest-library/src/main/java/org/hamcrest/collection/IsIterableContainingInAnyOrder.java b/hamcrest-library/src/main/java/org/hamcrest/collection/IsIterableContainingInAnyOrder.java
deleted file mode 100644
index 0888d49..0000000
--- a/hamcrest-library/src/main/java/org/hamcrest/collection/IsIterableContainingInAnyOrder.java
+++ /dev/null
@@ -1,154 +0,0 @@
-package org.hamcrest.collection;
-
-import org.hamcrest.Description;
-import org.hamcrest.Matcher;
-import org.hamcrest.TypeSafeDiagnosingMatcher;
-
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.Collection;
-import java.util.List;
-
-import static org.hamcrest.core.IsEqual.equalTo;
-
-public class IsIterableContainingInAnyOrder<T> extends TypeSafeDiagnosingMatcher<Iterable<? extends T>> {
-    private final Collection<Matcher<? super T>> matchers;
-
-    public IsIterableContainingInAnyOrder(Collection<Matcher<? super T>> matchers) {
-        this.matchers = matchers;
-    }
-    
-    @Override
-    protected boolean matchesSafely(Iterable<? extends T> items, Description mismatchDescription) {
-      final Matching<T> matching = new Matching<T>(matchers, mismatchDescription);
-      for (T item : items) {
-        if (! matching.matches(item)) {
-          return false;
-        }
-      }
-      
-      return matching.isFinished(items);
-    }
-    
-    @Override
-    public void describeTo(Description description) {
-      description.appendText("iterable with items ")
-          .appendList("[", ", ", "]", matchers)
-          .appendText(" in any order");
-    }
-
-    private static class Matching<S> {
-      private final Collection<Matcher<? super S>> matchers;
-      private final Description mismatchDescription;
-
-      public Matching(Collection<Matcher<? super S>> matchers, Description mismatchDescription) {
-        this.matchers = new ArrayList<Matcher<? super S>>(matchers);
-        this.mismatchDescription = mismatchDescription;
-      }
-      
-      public boolean matches(S item) {
-        if (matchers.isEmpty()) {
-          mismatchDescription.appendText("no match for: ").appendValue(item);
-          return false;
-        }
-        return isMatched(item);
-      }
-
-      public boolean isFinished(Iterable<? extends S> items) {
-        if (matchers.isEmpty()) {
-          return true;
-        }
-        mismatchDescription
-          .appendText("no item matches: ").appendList("", ", ", "", matchers)
-          .appendText(" in ").appendValueList("[", ", ", "]", items);
-        return false;
-      }
-
-      private boolean isMatched(S item) {
-        for (Matcher<? super S>  matcher : matchers) {
-          if (matcher.matches(item)) {
-            matchers.remove(matcher);
-            return true;
-          }
-        }
-        mismatchDescription.appendText("not matched: ").appendValue(item);
-        return false;
-      }
-    }
-
-    /**
-     * <p>
-     * Creates an order agnostic matcher for {@link Iterable}s that matches when a single pass over
-     * the examined {@link Iterable} yields a series of items, each satisfying one matcher anywhere
-     * in the specified matchers.  For a positive match, the examined iterable must be of the same
-     * length as the number of specified matchers.
-     * </p>
-     * <p>
-     * N.B. each of the specified matchers will only be used once during a given examination, so be
-     * careful when specifying matchers that may be satisfied by more than one entry in an examined
-     * iterable.
-     * </p>
-     * <p>
-     * For example:
-     * </p>
-     * <pre>assertThat(Arrays.asList("foo", "bar"), containsInAnyOrder(equalTo("bar"), equalTo("foo")))</pre>
-     * 
-     * @param itemMatchers
-     *     a list of matchers, each of which must be satisfied by an item provided by an examined {@link Iterable}
-     */
-    public static <T> Matcher<Iterable<? extends T>> containsInAnyOrder(Matcher<? super T>... itemMatchers) {
-      return containsInAnyOrder((List) Arrays.asList(itemMatchers));
-    }
-
-    /**
-     * <p>
-     * Creates an order agnostic matcher for {@link Iterable}s that matches when a single pass over
-     * the examined {@link Iterable} yields a series of items, each logically equal to one item
-     * anywhere in the specified items. For a positive match, the examined iterable
-     * must be of the same length as the number of specified items.
-     * </p>
-     * <p>
-     * N.B. each of the specified items will only be used once during a given examination, so be
-     * careful when specifying items that may be equal to more than one entry in an examined
-     * iterable.
-     * </p>
-     * <p>
-     * For example:
-     * </p>
-     * <pre>assertThat(Arrays.asList("foo", "bar"), containsInAnyOrder("bar", "foo"))</pre>
-     * 
-     * @param items
-     *     the items that must equal the items provided by an examined {@link Iterable} in any order
-     */
-    public static <T> Matcher<Iterable<? extends T>> containsInAnyOrder(T... items) {
-        List<Matcher<? super T>> matchers = new ArrayList<Matcher<? super T>>();
-        for (T item : items) {
-            matchers.add(equalTo(item));
-        }
-        
-        return new IsIterableContainingInAnyOrder<T>(matchers);
-    }
-
-    /**
-     * <p>
-     * Creates an order agnostic matcher for {@link Iterable}s that matches when a single pass over
-     * the examined {@link Iterable} yields a series of items, each satisfying one matcher anywhere
-     * in the specified collection of matchers.  For a positive match, the examined iterable
-     * must be of the same length as the specified collection of matchers.
-     * </p>
-     * <p>
-     * N.B. each matcher in the specified collection will only be used once during a given
-     * examination, so be careful when specifying matchers that may be satisfied by more than
-     * one entry in an examined iterable.
-     * </p>
-     * <p>For example:</p>
-     * <pre>assertThat(Arrays.asList("foo", "bar"), containsInAnyOrder(Arrays.asList(equalTo("bar"), equalTo("foo"))))</pre>
-     * 
-     * @param itemMatchers
-     *     a list of matchers, each of which must be satisfied by an item provided by an examined {@link Iterable}
-     */
-    public static <T> Matcher<Iterable<? extends T>> containsInAnyOrder(Collection<Matcher<? super T>> itemMatchers) {
-        return new IsIterableContainingInAnyOrder<T>(itemMatchers);
-    }
-}
-
diff --git a/hamcrest-library/src/main/java/org/hamcrest/collection/IsIterableContainingInOrder.java b/hamcrest-library/src/main/java/org/hamcrest/collection/IsIterableContainingInOrder.java
deleted file mode 100644
index 6309566..0000000
--- a/hamcrest-library/src/main/java/org/hamcrest/collection/IsIterableContainingInOrder.java
+++ /dev/null
@@ -1,153 +0,0 @@
-package org.hamcrest.collection;
-
-import org.hamcrest.Description;
-import org.hamcrest.Matcher;
-import org.hamcrest.TypeSafeDiagnosingMatcher;
-import org.hamcrest.internal.NullSafety;
-
-import java.util.ArrayList;
-import java.util.List;
-
-import static java.util.Arrays.asList;
-import static org.hamcrest.core.IsEqual.equalTo;
-
-public class IsIterableContainingInOrder<E> extends TypeSafeDiagnosingMatcher<Iterable<? extends E>> {
-    private final List<Matcher<? super E>> matchers;
-
-    public IsIterableContainingInOrder(List<Matcher<? super E>> matchers) {
-        this.matchers = matchers;
-    }
-
-    @Override
-    protected boolean matchesSafely(Iterable<? extends E> iterable, Description mismatchDescription) {
-        final MatchSeries<E> matchSeries = new MatchSeries<E>(matchers, mismatchDescription);
-        for (E item : iterable) {
-            if (!matchSeries.matches(item)) {
-                return false;
-            }
-        }
-
-        return matchSeries.isFinished();
-    }
-
-    @Override
-    public void describeTo(Description description) {
-        description.appendText("iterable containing ").appendList("[", ", ", "]", matchers);
-    }
-
-    private static class MatchSeries<F> {
-        private final List<Matcher<? super F>> matchers;
-        private final Description mismatchDescription;
-        private int nextMatchIx = 0;
-
-        public MatchSeries(List<Matcher<? super F>> matchers, Description mismatchDescription) {
-            this.mismatchDescription = mismatchDescription;
-            if (matchers.isEmpty()) {
-                throw new IllegalArgumentException("Should specify at least one expected element");
-            }
-            this.matchers = matchers;
-        }
-
-        public boolean matches(F item) {
-          if (matchers.size() <= nextMatchIx) {
-            mismatchDescription.appendText("not matched: ").appendValue(item);
-            return false;
-          }
-
-          return isMatched(item);
-        }
-
-        public boolean isFinished() {
-            if (nextMatchIx < matchers.size()) {
-                mismatchDescription.appendText("no item was ").appendDescriptionOf(matchers.get(nextMatchIx));
-                return false;
-            }
-            return true;
-        }
-
-        private boolean isMatched(F item) {
-            final Matcher<? super F> matcher = matchers.get(nextMatchIx);
-            if (!matcher.matches(item)) {
-                describeMismatch(matcher, item);
-                return false;
-            }
-            nextMatchIx++;
-            return true;
-        }
-
-      private void describeMismatch(Matcher<? super F> matcher, F item) {
-            mismatchDescription.appendText("item " + nextMatchIx + ": ");
-            matcher.describeMismatch(item, mismatchDescription);
-        }
-    }
-
-    /**
-     * Creates a matcher for {@link Iterable}s that matches when a single pass over the
-     * examined {@link Iterable} yields a series of items, each logically equal to the
-     * corresponding item in the specified items.  For a positive match, the examined iterable
-     * must be of the same length as the number of specified items.
-     * For example:
-     * <pre>assertThat(Arrays.asList("foo", "bar"), contains("foo", "bar"))</pre>
-     * 
-     * @param items
-     *     the items that must equal the items provided by an examined {@link Iterable}
-     */
-    public static <E> Matcher<Iterable<? extends E>> contains(E... items) {
-        List<Matcher<? super E>> matchers = new ArrayList<Matcher<? super E>>();
-        for (E item : items) {
-            matchers.add(equalTo(item));
-        }
-
-        return contains(matchers);
-    }
-
-    /**
-     * Creates a matcher for {@link Iterable}s that matches when a single pass over the
-     * examined {@link Iterable} yields a single item that satisfies the specified matcher.
-     * For a positive match, the examined iterable must only yield one item.
-     * For example:
-     * <pre>assertThat(Arrays.asList("foo"), contains(equalTo("foo")))</pre>
-     * 
-     * @param itemMatcher
-     *     the matcher that must be satisfied by the single item provided by an
-     *     examined {@link Iterable}
-     */
-    @SuppressWarnings("unchecked")
-    public static <E> Matcher<Iterable<? extends E>> contains(final Matcher<? super E> itemMatcher) {
-        return contains(new ArrayList<Matcher<? super E>>(asList(itemMatcher)));
-    }
-
-    /**
-     * Creates a matcher for {@link Iterable}s that matches when a single pass over the
-     * examined {@link Iterable} yields a series of items, each satisfying the corresponding
-     * matcher in the specified matchers.  For a positive match, the examined iterable
-     * must be of the same length as the number of specified matchers.
-     * For example:
-     * <pre>assertThat(Arrays.asList("foo", "bar"), contains(equalTo("foo"), equalTo("bar")))</pre>
-     * 
-     * @param itemMatchers
-     *     the matchers that must be satisfied by the items provided by an examined {@link Iterable}
-     */
-    public static <E> Matcher<Iterable<? extends E>> contains(Matcher<? super E>... itemMatchers) {
-        // required for JDK 1.6
-        //noinspection RedundantTypeArguments
-        final List<Matcher<? super E>> nullSafeWithExplicitTypeMatchers = NullSafety.<E>nullSafe(itemMatchers);
-    	return contains(nullSafeWithExplicitTypeMatchers);
-    }
-
-    /**
-     * Creates a matcher for {@link Iterable}s that matches when a single pass over the
-     * examined {@link Iterable} yields a series of items, each satisfying the corresponding
-     * matcher in the specified list of matchers.  For a positive match, the examined iterable
-     * must be of the same length as the specified list of matchers.
-     * For example:
-     * <pre>assertThat(Arrays.asList("foo", "bar"), contains(Arrays.asList(equalTo("foo"), equalTo("bar"))))</pre>
-     * 
-     * @param itemMatchers
-     *     a list of matchers, each of which must be satisfied by the corresponding item provided by
-     *     an examined {@link Iterable}
-     */
-    public static <E> Matcher<Iterable<? extends E>> contains(List<Matcher<? super E>> itemMatchers) {
-        return new IsIterableContainingInOrder<E>(itemMatchers);
-    }
-}
diff --git a/hamcrest-library/src/main/java/org/hamcrest/collection/IsIterableContainingInRelativeOrder.java b/hamcrest-library/src/main/java/org/hamcrest/collection/IsIterableContainingInRelativeOrder.java
deleted file mode 100644
index d811411..0000000
--- a/hamcrest-library/src/main/java/org/hamcrest/collection/IsIterableContainingInRelativeOrder.java
+++ /dev/null
@@ -1,117 +0,0 @@
-package org.hamcrest.collection;
-
-import org.hamcrest.Description;
-import org.hamcrest.Matcher;
-import org.hamcrest.TypeSafeDiagnosingMatcher;
-
-import java.util.ArrayList;
-import java.util.List;
-
-import static java.util.Arrays.asList;
-import static org.hamcrest.core.IsEqual.equalTo;
-
-public class IsIterableContainingInRelativeOrder<E> extends TypeSafeDiagnosingMatcher<Iterable<? extends E>> {
-    private final List<Matcher<? super E>> matchers;
-
-    public IsIterableContainingInRelativeOrder(List<Matcher<? super E>> matchers) {
-        this.matchers = matchers;
-    }
-
-    @Override
-    protected boolean matchesSafely(Iterable<? extends E> iterable, Description mismatchDescription) {
-        MatchSeriesInRelativeOrder<E> matchSeriesInRelativeOrder = new MatchSeriesInRelativeOrder<E>(matchers, mismatchDescription);
-        matchSeriesInRelativeOrder.processItems(iterable);
-        return matchSeriesInRelativeOrder.isFinished();
-    }
-
-    public void describeTo(Description description) {
-        description.appendText("iterable containing ").appendList("[", ", ", "]", matchers).appendText(" in relative order");
-    }
-
-    private static class MatchSeriesInRelativeOrder<F> {
-        public final List<Matcher<? super F>> matchers;
-        private final Description mismatchDescription;
-        private int nextMatchIx = 0;
-        private F lastMatchedItem = null;
-
-        public MatchSeriesInRelativeOrder(List<Matcher<? super F>> matchers, Description mismatchDescription) {
-            this.mismatchDescription = mismatchDescription;
-            if (matchers.isEmpty()) {
-                throw new IllegalArgumentException("Should specify at least one expected element");
-            }
-            this.matchers = matchers;
-        }
-
-        public void processItems(Iterable<? extends F> iterable) {
-            for (F item : iterable) {
-                if (nextMatchIx < matchers.size()) {
-                    Matcher<? super F> matcher = matchers.get(nextMatchIx);
-                    if (matcher.matches(item)) {
-                        lastMatchedItem = item;
-                        nextMatchIx++;
-                    }
-                }
-            }
-        }
-
-        public boolean isFinished() {
-            if (nextMatchIx < matchers.size()) {
-                mismatchDescription.appendDescriptionOf(matchers.get(nextMatchIx)).appendText(" was not found");
-                if (lastMatchedItem != null) {
-                    mismatchDescription.appendText(" after ").appendValue(lastMatchedItem);
-                }
-                return false;
-            }
-            return true;
-        }
-
-    }
-
-    /**
-     * Creates a matcher for {@link Iterable}s that matches when a single pass over the
-     * examined {@link Iterable} yields a series of items, that contains items logically equal to the
-     * corresponding item in the specified items, in the same relative order
-     * For example:
-     * <pre>assertThat(Arrays.asList("a", "b", "c", "d", "e"), containsInRelativeOrder("b", "d"))</pre>
-     * 
-     * @param items
-     *     the items that must be contained within items provided by an examined {@link Iterable} in the same relative order
-     */
-    public static <E> Matcher<Iterable<? extends E>> containsInRelativeOrder(E... items) {
-        List<Matcher<? super E>> matchers = new ArrayList<Matcher<? super E>>();
-        for (E item : items) {
-            matchers.add(equalTo(item));
-        }
-
-        return containsInRelativeOrder(matchers);
-    }
-
-    /**
-     * Creates a matcher for {@link Iterable}s that matches when a single pass over the
-     * examined {@link Iterable} yields a series of items, that each satisfying the corresponding
-     * matcher in the specified matchers, in the same relative order.
-     * For example:
-     * <pre>assertThat(Arrays.asList("a", "b", "c", "d", "e"), containsInRelativeOrder(equalTo("b"), equalTo("d")))</pre>
-     * 
-     * @param itemMatchers
-     *     the matchers that must be satisfied by the items provided by an examined {@link Iterable} in the same relative order
-     */
-    public static <E> Matcher<Iterable<? extends E>> containsInRelativeOrder(Matcher<? super E>... itemMatchers) {
-      return containsInRelativeOrder((List) asList(itemMatchers));
-    }
-
-    /**
-     * Creates a matcher for {@link Iterable}s that matches when a single pass over the
-     * examined {@link Iterable} yields a series of items, that contains items satisfying the corresponding
-     * matcher in the specified list of matchers, in the same relative order.
-     * For example:
-     * <pre>assertThat(Arrays.asList("a", "b", "c", "d", "e"), contains(Arrays.asList(equalTo("b"), equalTo("d"))))</pre>
-     * 
-     * @param itemMatchers
-     *     a list of matchers, each of which must be satisfied by the items provided by
-     *     an examined {@link Iterable} in the same relative order
-     */
-    public static <E> Matcher<Iterable<? extends E>> containsInRelativeOrder(List<Matcher<? super E>> itemMatchers) {
-        return new IsIterableContainingInRelativeOrder<E>(itemMatchers);
-    }
-}
diff --git a/hamcrest-library/src/main/java/org/hamcrest/collection/IsIterableWithSize.java b/hamcrest-library/src/main/java/org/hamcrest/collection/IsIterableWithSize.java
deleted file mode 100644
index 0a1535f..0000000
--- a/hamcrest-library/src/main/java/org/hamcrest/collection/IsIterableWithSize.java
+++ /dev/null
@@ -1,53 +0,0 @@
-package org.hamcrest.collection;
-
-import org.hamcrest.FeatureMatcher;
-import org.hamcrest.Matcher;
-
-import java.util.Iterator;
-
-import static org.hamcrest.core.IsEqual.equalTo;
-
-public class IsIterableWithSize<E> extends FeatureMatcher<Iterable<E>, Integer> {
-
-    public IsIterableWithSize(Matcher<? super Integer> sizeMatcher) {
-        super(sizeMatcher, "an iterable with size", "iterable size");
-    }
-    
-
-    @Override
-    protected Integer featureValueOf(Iterable<E> actual) {
-      int size = 0;
-      for (Iterator<E> iterator = actual.iterator(); iterator.hasNext(); iterator.next()) {
-        size++;
-      }
-      return size;
-    }
-
-    /**
-     * Creates a matcher for {@link Iterable}s that matches when a single pass over the
-     * examined {@link Iterable} yields an item count that satisfies the specified
-     * matcher.
-     * For example:
-     * <pre>assertThat(Arrays.asList("foo", "bar"), iterableWithSize(equalTo(2)))</pre>
-     * 
-     * @param sizeMatcher
-     *     a matcher for the number of items that should be yielded by an examined {@link Iterable}
-     */
-    public static <E> Matcher<Iterable<E>> iterableWithSize(Matcher<? super Integer> sizeMatcher) {
-        return new IsIterableWithSize<E>(sizeMatcher);
-    }
-
-    /**
-     * Creates a matcher for {@link Iterable}s that matches when a single pass over the
-     * examined {@link Iterable} yields an item count that is equal to the specified
-     * <code>size</code> argument.
-     * For example:
-     * <pre>assertThat(Arrays.asList("foo", "bar"), iterableWithSize(2))</pre>
-     * 
-     * @param size
-     *     the number of items that should be yielded by an examined {@link Iterable}
-     */
-    public static <E> Matcher<Iterable<E>> iterableWithSize(int size) {
-        return iterableWithSize(equalTo(size));
-    }
-}
diff --git a/hamcrest-library/src/main/java/org/hamcrest/collection/IsMapContaining.java b/hamcrest-library/src/main/java/org/hamcrest/collection/IsMapContaining.java
index c29801e..74572dd 100644
--- a/hamcrest-library/src/main/java/org/hamcrest/collection/IsMapContaining.java
+++ b/hamcrest-library/src/main/java/org/hamcrest/collection/IsMapContaining.java
@@ -1,27 +1,28 @@
 package org.hamcrest.collection;
 
 import org.hamcrest.Description;
+import org.hamcrest.Factory;
 import org.hamcrest.Matcher;
 import org.hamcrest.TypeSafeMatcher;
+import org.hamcrest.core.IsAnything;
+
+import static org.hamcrest.core.IsEqual.equalTo;
 
 import java.util.Map;
 import java.util.Map.Entry;
 
-import static org.hamcrest.core.IsAnything.anything;
-import static org.hamcrest.core.IsEqual.equalTo;
+public class IsMapContaining<K,V> extends TypeSafeMatcher<Map<K, V>> {
 
-public class IsMapContaining<K,V> extends TypeSafeMatcher<Map<? extends K, ? extends V>> {
-    private final Matcher<? super K> keyMatcher;
-    private final Matcher<? super V> valueMatcher;
+    private final Matcher<K> keyMatcher;
+    private final Matcher<V> valueMatcher;
 
-    public IsMapContaining(Matcher<? super K> keyMatcher, Matcher<? super V> valueMatcher) {
+    public IsMapContaining(Matcher<K> keyMatcher, Matcher<V> valueMatcher) {
         this.keyMatcher = keyMatcher;
         this.valueMatcher = valueMatcher;
     }
 
-    @Override
-    public boolean matchesSafely(Map<? extends K, ? extends V> map) {
-        for (Entry<? extends K, ? extends V> entry : map.entrySet()) {
+    public boolean matchesSafely(Map<K, V> map) {
+        for (Entry<K, V> entry : map.entrySet()) {
             if (keyMatcher.matches(entry.getKey()) && valueMatcher.matches(entry.getValue())) {
                 return true;
             }
@@ -29,101 +30,41 @@
         return false;
     }
 
-    @Override
-    public void describeMismatchSafely(Map<? extends K, ? extends V> map, Description mismatchDescription) {
-      mismatchDescription.appendText("map was ").appendValueList("[", ", ", "]", map.entrySet());
-    }
-
-    @Override
     public void describeTo(Description description) {
         description.appendText("map containing [")
                    .appendDescriptionOf(keyMatcher)
                    .appendText("->")
-                   .appendDescriptionOf(valueMatcher)
-                   .appendText("]");
+			       .appendDescriptionOf(valueMatcher)
+			       .appendText("]");
     }
 
-    /**
-     * Creates a matcher for {@link java.util.Map}s matching when the examined {@link java.util.Map} contains
-     * at least one entry whose key satisfies the specified <code>keyMatcher</code> <b>and</b> whose
-     * value satisfies the specified <code>valueMatcher</code>.
-     * For example:
-     * <pre>assertThat(myMap, hasEntry(equalTo("bar"), equalTo("foo")))</pre>
-     * 
-     * @param keyMatcher
-     *     the key matcher that, in combination with the valueMatcher, must be satisfied by at least one entry
-     * @param valueMatcher
-     *     the value matcher that, in combination with the keyMatcher, must be satisfied by at least one entry
-     */
-    public static <K,V> Matcher<Map<? extends K,? extends V>> hasEntry(Matcher<? super K> keyMatcher, Matcher<? super V> valueMatcher) {
+    @Factory
+    public static <K,V> Matcher<Map<K,V>> hasEntry(Matcher<K> keyMatcher, Matcher<V> valueMatcher) {
         return new IsMapContaining<K,V>(keyMatcher, valueMatcher);
     }
 
-    /**
-     * Creates a matcher for {@link java.util.Map}s matching when the examined {@link java.util.Map} contains
-     * at least one entry whose key equals the specified <code>key</code> <b>and</b> whose value equals the
-     * specified <code>value</code>.
-     * For example:
-     * <pre>assertThat(myMap, hasEntry("bar", "foo"))</pre>
-     *  
-     * @param key
-     *     the key that, in combination with the value, must be describe at least one entry
-     * @param value
-     *     the value that, in combination with the key, must be describe at least one entry
-     */
-    public static <K,V> Matcher<Map<? extends K,? extends V>> hasEntry(K key, V value) {
-        return new IsMapContaining<K,V>(equalTo(key), equalTo(value));
-    }
-    
-    /**
-     * Creates a matcher for {@link java.util.Map}s matching when the examined {@link java.util.Map} contains
-     * at least one key that satisfies the specified matcher.
-     * For example:
-     * <pre>assertThat(myMap, hasKey(equalTo("bar")))</pre>
-     * 
-     * @param keyMatcher
-     *     the matcher that must be satisfied by at least one key
-     */
-    public static <K> Matcher<Map<? extends K, ?>> hasKey(Matcher<? super K> keyMatcher) {
-        return new IsMapContaining<K,Object>(keyMatcher, anything());
+    @Factory
+    public static <K,V> Matcher<Map<K,V>> hasEntry(K key, V value) {
+        return hasEntry(equalTo(key), equalTo(value));
     }
 
-    /**
-     * Creates a matcher for {@link java.util.Map}s matching when the examined {@link java.util.Map} contains
-     * at least one key that is equal to the specified key.
-     * For example:
-     * <pre>assertThat(myMap, hasKey("bar"))</pre>
-     * 
-     * @param key
-     *     the key that satisfying maps must contain
-     */
-    public static <K> Matcher<Map<? extends K, ?>> hasKey(K key) {
-        return new IsMapContaining<K,Object>(equalTo(key), anything());
+    @Factory
+    public static <K,V> Matcher<Map<K,V>> hasKey(Matcher<K> keyMatcher) {
+        return hasEntry(keyMatcher, IsAnything.<V>anything());
     }
 
-    /**
-     * Creates a matcher for {@link java.util.Map}s matching when the examined {@link java.util.Map} contains
-     * at least one value that satisfies the specified valueMatcher.
-     * For example:
-     * <pre>assertThat(myMap, hasValue(equalTo("foo")))</pre>
-     * 
-     * @param valueMatcher
-     *     the matcher that must be satisfied by at least one value
-     */
-    public static <V> Matcher<Map<?, ? extends V>> hasValue(Matcher<? super V> valueMatcher) {
-        return new IsMapContaining<Object,V>(anything(), valueMatcher);
+    @Factory
+    public static <K,V> Matcher<Map<K,V>> hasKey(K key) {
+        return hasKey(equalTo(key));
     }
 
-    /**
-     * Creates a matcher for {@link java.util.Map}s matching when the examined {@link java.util.Map} contains
-     * at least one value that is equal to the specified value.
-     * For example:
-     * <pre>assertThat(myMap, hasValue("foo"))</pre>
-     * 
-     * @param value
-     *     the value that satisfying maps must contain
-     */
-    public static <V> Matcher<Map<?, ? extends V>> hasValue(V value) {
-        return new IsMapContaining<Object,V>(anything(), equalTo(value));
+    @Factory
+    public static <K,V> Matcher<Map<K,V>> hasValue(Matcher<V> valueMatcher) {
+        return hasEntry(IsAnything.<K>anything(), valueMatcher);
+    }
+
+    @Factory
+    public static <K,V> Matcher<Map<K,V>> hasValue(V value) {
+        return hasValue(equalTo(value));
     }
 }
diff --git a/hamcrest-library/src/main/java/org/hamcrest/collection/IsMapWithSize.java b/hamcrest-library/src/main/java/org/hamcrest/collection/IsMapWithSize.java
deleted file mode 100644
index 0132390..0000000
--- a/hamcrest-library/src/main/java/org/hamcrest/collection/IsMapWithSize.java
+++ /dev/null
@@ -1,60 +0,0 @@
-package org.hamcrest.collection;
-
-import org.hamcrest.FeatureMatcher;
-import org.hamcrest.Matcher;
-
-import java.util.Map;
-
-import static org.hamcrest.core.IsEqual.equalTo;
-
-/**
- * Matches if map size satisfies a nested matcher.
- */
-public final class IsMapWithSize<K, V> extends FeatureMatcher<Map<? extends K, ? extends V>, Integer> {
-    public IsMapWithSize(Matcher<? super Integer> sizeMatcher) {
-      super(sizeMatcher, "a map with size", "map size");
-    }
-
-    @Override
-    protected Integer featureValueOf(Map<? extends K, ? extends V> actual) {
-      return actual.size();
-    }
-
-    /**
-     * Creates a matcher for {@link java.util.Map}s that matches when the <code>size()</code> method returns
-     * a value that satisfies the specified matcher.
-     * For example:
-     * <pre>assertThat(myMap, is(aMapWithSize(equalTo(2))))</pre>
-     * 
-     * @param sizeMatcher
-     *     a matcher for the size of an examined {@link java.util.Map}
-     */
-    public static <K, V> Matcher<Map<? extends K, ? extends V>> aMapWithSize(Matcher<? super Integer> sizeMatcher) {
-        return new IsMapWithSize<K, V>(sizeMatcher);
-    }
-
-    /**
-     * Creates a matcher for {@link java.util.Map}s that matches when the <code>size()</code> method returns
-     * a value equal to the specified <code>size</code>.
-     * For example:
-     * <pre>assertThat(myMap, is(aMapWithSize(2)))</pre>
-     * 
-     * @param size
-     *     the expected size of an examined {@link java.util.Map}
-     */
-    public static <K, V> Matcher<Map<? extends K, ? extends V>> aMapWithSize(int size) {
-        Matcher<? super Integer> matcher = equalTo(size);
-        return IsMapWithSize.aMapWithSize(matcher);
-    }
-    
-    /**
-     * Creates a matcher for {@link java.util.Map}s that matches when the <code>size()</code> method returns
-     * zero.
-     * For example:
-     * <pre>assertThat(myMap, is(anEmptyMap()))</pre>
-     * 
-     */
-    public static <K, V> Matcher<Map<? extends K, ? extends V>> anEmptyMap() {
-        return IsMapWithSize.aMapWithSize(equalTo(0));
-    }
-}
diff --git a/hamcrest-library/src/main/java/org/hamcrest/comparator/ComparatorMatcherBuilder.java b/hamcrest-library/src/main/java/org/hamcrest/comparator/ComparatorMatcherBuilder.java
deleted file mode 100644
index cf52211..0000000
--- a/hamcrest-library/src/main/java/org/hamcrest/comparator/ComparatorMatcherBuilder.java
+++ /dev/null
@@ -1,178 +0,0 @@
-package org.hamcrest.comparator;
-
-import org.hamcrest.Description;
-import org.hamcrest.Matcher;
-import org.hamcrest.TypeSafeMatcher;
-
-import java.util.Comparator;
-
-import static java.lang.Integer.signum;
-
-public final class ComparatorMatcherBuilder<T> {
-
-    private final Comparator<T> comparator;
-    private final boolean includeComparatorInDescription;
-
-    /**
-     * Creates a matcher factory for matchers of {@code Comparable}s.
-     * For example:
-     * <pre>assertThat(1, ComparatorMatcherBuilder.&lt;Integer&gt;usingNaturalOrdering().lessThanOrEqualTo(1))</pre>
-     */
-    public static <T extends Comparable<T>> ComparatorMatcherBuilder<T> usingNaturalOrdering() {
-        return new ComparatorMatcherBuilder<T>(new Comparator<T>() {
-            @Override
-            public int compare(T o1, T o2) {
-                return o1.compareTo(o2);
-            }
-        }, false);
-    }
-
-    /**
-     * Creates a matcher factory for matchers of {@code Comparators}s of {@code T}.
-     * For example:
-     * <pre>assertThat(5, comparedBy(new Comparator&lt;Integer&gt;() {
-     * public int compare(Integer o1, Integer o2) {
-     * return -o1.compareTo(o2);
-     * }
-     * }).lessThan(4))</pre>
-     */
-    public static <T> ComparatorMatcherBuilder<T> comparedBy(Comparator<T> comparator) {
-        return new ComparatorMatcherBuilder<T>(comparator, true);
-    }
-
-    private ComparatorMatcherBuilder(Comparator<T> comparator, boolean includeComparatorInDescription) {
-        this.comparator = comparator;
-        this.includeComparatorInDescription = includeComparatorInDescription;
-    }
-
-    private static final class ComparatorMatcher<T> extends TypeSafeMatcher<T> {
-        private static final int LESS_THAN = -1;
-        private static final int GREATER_THAN = 1;
-        private static final int EQUAL = 0;
-
-        private final Comparator<T> comparator;
-        private final T expected;
-        private final int minCompare;
-        private final int maxCompare;
-        private final boolean includeComparatorInDescription;
-
-        private static final String[] comparisonDescriptions = {
-                "less than",
-                "equal to",
-                "greater than"
-        };
-
-        private ComparatorMatcher(Comparator<T> comparator, T expected, int minCompare, int maxCompare, boolean includeComparatorInDescription) {
-            this.comparator = comparator;
-            this.expected = expected;
-            this.minCompare = minCompare;
-            this.maxCompare = maxCompare;
-            this.includeComparatorInDescription = includeComparatorInDescription;
-        }
-
-        @Override
-        public boolean matchesSafely(T actual) {
-            try {
-                int compare = signum(comparator.compare(actual, expected));
-                return minCompare <= compare && compare <= maxCompare;
-            } catch (ClassCastException e) {
-                return false; // type erasure means someone can shonk in a non-T :(
-            }
-        }
-
-        @Override
-        public void describeMismatchSafely(T actual, Description mismatchDescription) {
-            mismatchDescription.appendValue(actual).appendText(" was ")
-                    .appendText(asText(comparator.compare(actual, expected)))
-                    .appendText(" ").appendValue(expected);
-            if (includeComparatorInDescription) {
-                mismatchDescription.appendText(" when compared by ").appendValue(comparator);
-            }
-        }
-
-        @Override
-        public void describeTo(Description description) {
-            description.appendText("a value ").appendText(asText(minCompare));
-            if (minCompare != maxCompare) {
-                description.appendText(" or ").appendText(asText(maxCompare));
-            }
-            description.appendText(" ").appendValue(expected);
-            if (includeComparatorInDescription) {
-                description.appendText(" when compared by ").appendValue(comparator);
-            }
-        }
-
-        private static String asText(int comparison) {
-            return comparisonDescriptions[signum(comparison) + 1];
-        }
-    }
-
-    /**
-     * Creates a matcher of {@code T} object that matches when the examined object is
-     * equal to the specified value, as reported by the {@code Comparator} used to
-     * create this builder.
-     * For example:
-     * <pre>assertThat(1, ComparatorMatcherBuilder.&lt;Integer&gt;usingNaturalOrdering().comparesEqualTo(1))</pre>
-     *
-     * @param value the value which, when passed to the Comparator supplied to this builder, should return zero
-     */
-    public Matcher<T> comparesEqualTo(T value) {
-        return new ComparatorMatcher<T>(comparator, value, ComparatorMatcher.EQUAL, ComparatorMatcher.EQUAL, includeComparatorInDescription);
-    }
-
-    /**
-     * Creates a matcher of {@code T} object that matches when the examined object is
-     * greater than the specified value, as reported by the {@code Comparator} used to
-     * create this builder.
-     * For example:
-     * <pre>assertThat(2, ComparatorMatcherBuilder.&lt;Integer&gt;usingNaturalOrdering().greaterThan(1))</pre>
-     *
-     * @param value the value which, when passed to the Comparator supplied to this builder, should return greater
-     *              than zero
-     */
-    public Matcher<T> greaterThan(T value) {
-        return new ComparatorMatcher<T>(comparator, value, ComparatorMatcher.GREATER_THAN, ComparatorMatcher.GREATER_THAN, includeComparatorInDescription);
-    }
-
-    /**
-     * Creates a matcher of {@code T} object that matches when the examined object is
-     * greater than or equal to the specified value, as reported by the {@code Comparator} used to
-     * create this builder.
-     * For example:
-     * <pre>assertThat(1, ComparatorMatcherBuilder.&lt;Integer&gt;usingNaturalOrdering().greaterThanOrEqualTo(1))</pre>
-     *
-     * @param value the value which, when passed to the Comparator supplied to this builder, should return greater
-     *              than or equal to zero
-     */
-    public Matcher<T> greaterThanOrEqualTo(T value) {
-        return new ComparatorMatcher<T>(comparator, value, ComparatorMatcher.EQUAL, ComparatorMatcher.GREATER_THAN, includeComparatorInDescription);
-    }
-
-    /**
-     * Creates a matcher of {@code T} object that matches when the examined object is
-     * less than the specified value, as reported by the {@code Comparator} used to
-     * create this builder.
-     * For example:
-     * <pre>assertThat(1, ComparatorMatcherBuilder.&lt;Integer&gt;usingNaturalOrdering().lessThan(2))</pre>
-     *
-     * @param value the value which, when passed to the Comparator supplied to this builder, should return less
-     *              than zero
-     */
-    public Matcher<T> lessThan(T value) {
-        return new ComparatorMatcher<T>(comparator, value, ComparatorMatcher.LESS_THAN, ComparatorMatcher.LESS_THAN, includeComparatorInDescription);
-    }
-
-    /**
-     * Creates a matcher of {@code T} object that matches when the examined object is
-     * less than or equal to the specified value, as reported by the {@code Comparator} used to
-     * create this builder.
-     * For example:
-     * <pre>assertThat(1, ComparatorMatcherBuilder.&lt;Integer&gt;usingNaturalOrdering().lessThanOrEqualTo(1))</pre>
-     *
-     * @param value the value which, when passed to the Comparator supplied to this builder, should return less
-     *              than or equal to zero
-     */
-    public Matcher<T> lessThanOrEqualTo(T value) {
-        return new ComparatorMatcher<T>(comparator, value, ComparatorMatcher.LESS_THAN, ComparatorMatcher.EQUAL, includeComparatorInDescription);
-    }
-}
diff --git a/hamcrest-library/src/main/java/org/hamcrest/io/FileMatchers.java b/hamcrest-library/src/main/java/org/hamcrest/io/FileMatchers.java
deleted file mode 100644
index 88288b0..0000000
--- a/hamcrest-library/src/main/java/org/hamcrest/io/FileMatchers.java
+++ /dev/null
@@ -1,107 +0,0 @@
-package org.hamcrest.io;
-
-import org.hamcrest.Description;
-import org.hamcrest.FeatureMatcher;
-import org.hamcrest.Matcher;
-import org.hamcrest.TypeSafeDiagnosingMatcher;
-
-import java.io.File;
-import java.io.IOException;
-
-import static org.hamcrest.core.IsEqual.equalTo;
-
-public final class FileMatchers {
-
-    public static Matcher<File> anExistingDirectory() {
-        return fileChecker(IS_DIRECTORY, "an existing directory", "is not a directory");
-    }
-
-    public static Matcher<File> anExistingFileOrDirectory() {
-        return fileChecker(EXISTS, "an existing file or directory", "does not exist");
-    }
-
-    public static Matcher<File> anExistingFile() {
-        return fileChecker(IS_FILE, "an existing File", "is not a file");
-    }
-
-    public static Matcher<File> aReadableFile() {
-        return fileChecker(CAN_READ, "a readable File", "cannot be read");
-    }
-
-    public static Matcher<File> aWritableFile() {
-        return fileChecker(CAN_WRITE, "a writable File", "cannot be written to");
-    }
-
-    public static Matcher<File> aFileWithSize(long size) {
-        return aFileWithSize(equalTo(size));
-    }
-
-    public static Matcher<File> aFileWithSize(final Matcher<Long> expected) {
-        return new FeatureMatcher<File, Long>(expected, "A file with size", "size") {
-            @Override protected Long featureValueOf(File actual) { return actual.length(); }
-        };
-    }
-
-    public static Matcher<File> aFileNamed(final Matcher<String> expected) {
-        return new FeatureMatcher<File, String>(expected, "A file with name", "name") {
-            @Override protected String featureValueOf(File actual) { return actual.getName(); }
-        };
-    }
-
-    public static Matcher<File> aFileWithCanonicalPath(final Matcher<String> expected) {
-        return new FeatureMatcher<File, String>(expected, "A file with canonical path", "path") {
-            @Override protected String featureValueOf(File actual) {
-                try {
-                    return actual.getCanonicalPath();
-                } catch (IOException e) {
-                    return "Exception: " + e.getMessage();
-                }
-            }
-        };
-    }
-
-    public static Matcher<File> aFileWithAbsolutePath(final Matcher<String> expected) {
-        return new FeatureMatcher<File, String>(expected, "A file with absolute path", "path") {
-            @Override protected String featureValueOf(File actual) { return actual.getAbsolutePath(); }
-        };
-    }
-
-    public static interface FileStatus {
-        boolean check(File actual);
-    }
-
-    public static final FileStatus CAN_WRITE = new FileStatus() {
-        @Override public boolean check(File actual) { return actual.canWrite(); }
-    };
-    public static final FileStatus CAN_READ = new FileStatus() {
-        @Override public boolean check(File actual) { return actual.canRead(); }
-    };
-
-    public static final FileStatus IS_FILE = new FileStatus() {
-        @Override public boolean check(File actual) { return actual.isFile(); }
-    };
-
-    public static final FileStatus IS_DIRECTORY = new FileStatus() {
-        @Override public boolean check(File actual) { return actual.isDirectory(); }
-    };
-
-    public static final FileStatus EXISTS = new FileStatus() {
-        @Override public boolean check(File actual) { return actual.exists(); }
-    };
-
-    private static Matcher<File> fileChecker(final FileStatus fileStatus, final String successDescription, final String failureDescription) {
-        return new TypeSafeDiagnosingMatcher<File>() {
-            public boolean matchesSafely(File actual, Description mismatchDescription) {
-                final boolean result = fileStatus.check(actual);
-                if (!result) {
-                    mismatchDescription.appendText(failureDescription);
-                }
-                return result;
-            }
-
-            public void describeTo(Description description) {
-                description.appendText(successDescription);
-            }
-        };
-    }
-}
diff --git a/hamcrest-library/src/main/java/org/hamcrest/number/BigDecimalCloseTo.java b/hamcrest-library/src/main/java/org/hamcrest/number/BigDecimalCloseTo.java
deleted file mode 100644
index d9cb026..0000000
--- a/hamcrest-library/src/main/java/org/hamcrest/number/BigDecimalCloseTo.java
+++ /dev/null
@@ -1,63 +0,0 @@
-package org.hamcrest.number;
-
-import org.hamcrest.Description;
-import org.hamcrest.Matcher;
-import org.hamcrest.TypeSafeMatcher;
-
-import java.math.BigDecimal;
-import java.math.MathContext;
-
-public class BigDecimalCloseTo extends TypeSafeMatcher<BigDecimal> {
-
-  private final BigDecimal delta;
-  private final BigDecimal value;
-
-  public BigDecimalCloseTo(BigDecimal value, BigDecimal error) {
-      this.delta = error;
-      this.value = value;
-  }
-
-  @Override
-  public boolean matchesSafely(BigDecimal item) {
-      return actualDelta(item).compareTo(BigDecimal.ZERO) <= 0;
-  }
-
-  @Override
-  public void describeMismatchSafely(BigDecimal item, Description mismatchDescription) {
-      mismatchDescription.appendValue(item)
-              .appendText(" differed by ")
-              .appendValue(actualDelta(item))
-              .appendText(" more than delta ")
-              .appendValue(delta);
-  }
-
-  @Override
-  public void describeTo(Description description) {
-      description.appendText("a numeric value within ")
-              .appendValue(delta)
-              .appendText(" of ")
-              .appendValue(value);
-  }
-
-  private BigDecimal actualDelta(BigDecimal item) {
-      return item.subtract(value, MathContext.DECIMAL128).abs().subtract(delta, MathContext.DECIMAL128).stripTrailingZeros();
-  }
-
-  /**
-   * Creates a matcher of {@link java.math.BigDecimal}s that matches when an examined BigDecimal is equal
-   * to the specified <code>operand</code>, within a range of +/- <code>error</code>. The comparison for equality
-   * is done by BigDecimals {@link java.math.BigDecimal#compareTo(java.math.BigDecimal)} method.
-   * For example:
-   * <pre>assertThat(new BigDecimal("1.03"), is(closeTo(new BigDecimal("1.0"), new BigDecimal("0.03"))))</pre>
-   * 
-   * @param operand
-   *     the expected value of matching BigDecimals
-   * @param error
-   *     the delta (+/-) within which matches will be allowed
-   */
-  public static Matcher<BigDecimal> closeTo(BigDecimal operand, BigDecimal error) {
-      return new BigDecimalCloseTo(operand, error);
-  }
-
-}
-
diff --git a/hamcrest-library/src/main/java/org/hamcrest/number/IsCloseTo.java b/hamcrest-library/src/main/java/org/hamcrest/number/IsCloseTo.java
index 3b6967d..dc183e8 100644
--- a/hamcrest-library/src/main/java/org/hamcrest/number/IsCloseTo.java
+++ b/hamcrest-library/src/main/java/org/hamcrest/number/IsCloseTo.java
@@ -1,63 +1,40 @@
+/*  Copyright (c) 2000-2006 hamcrest.org
+ */
 package org.hamcrest.number;
 
 import org.hamcrest.Description;
 import org.hamcrest.Matcher;
+import org.hamcrest.Factory;
 import org.hamcrest.TypeSafeMatcher;
 
-import static java.lang.Math.abs;
-
 
 /**
  * Is the value a number equal to a value within some range of
  * acceptable error?
  */
 public class IsCloseTo extends TypeSafeMatcher<Double> {
-    private final double delta;
+    private final double error;
     private final double value;
 
     public IsCloseTo(double value, double error) {
-        this.delta = error;
+        this.error = error;
         this.value = value;
     }
 
-    @Override
     public boolean matchesSafely(Double item) {
-        return actualDelta(item) <= 0.0;
+        return Math.abs((item - value)) <= error;
     }
 
-    @Override
-    public void describeMismatchSafely(Double item, Description mismatchDescription) {
-      mismatchDescription.appendValue(item)
-                         .appendText(" differed by ")
-                         .appendValue(actualDelta(item))
-                         .appendText(" more than delta ")
-                         .appendValue(delta);
-    }
-
-    @Override
     public void describeTo(Description description) {
         description.appendText("a numeric value within ")
-                .appendValue(delta)
+                .appendValue(error)
                 .appendText(" of ")
                 .appendValue(value);
     }
 
-    private double actualDelta(Double item) {
-      return abs(item - value) - delta;
-    }
-
-    /**
-     * Creates a matcher of {@link Double}s that matches when an examined double is equal
-     * to the specified <code>operand</code>, within a range of +/- <code>error</code>.
-     * For example:
-     * <pre>assertThat(1.03, is(closeTo(1.0, 0.03)))</pre>
-     * 
-     * @param operand
-     *     the expected value of matching doubles
-     * @param error
-     *     the delta (+/-) within which matches will be allowed
-     */
+    @Factory
     public static Matcher<Double> closeTo(double operand, double error) {
         return new IsCloseTo(operand, error);
     }
+
 }
diff --git a/hamcrest-library/src/main/java/org/hamcrest/number/IsGreaterThan.java b/hamcrest-library/src/main/java/org/hamcrest/number/IsGreaterThan.java
new file mode 100644
index 0000000..34046b7
--- /dev/null
+++ b/hamcrest-library/src/main/java/org/hamcrest/number/IsGreaterThan.java
@@ -0,0 +1,26 @@
+/*  Copyright (c) 2000-2006 hamcrest.org
+ */
+package org.hamcrest.number;
+
+import org.hamcrest.Description;
+import org.hamcrest.TypeSafeMatcher;
+
+/**
+ * Is the value less than or greater than another {@link java.lang.Comparable} value?
+ */
+public class IsGreaterThan<T extends Comparable<T>> extends TypeSafeMatcher<T> {
+    private final Comparable<T> compareTo;
+    
+    public IsGreaterThan(Comparable<T> compareTo) {
+        this.compareTo = compareTo;
+    }
+    
+    public boolean matchesSafely(T item) {
+        return compareTo.compareTo(item) < 0;
+    }
+    
+    public void describeTo(Description description) {
+        description.appendText("a value greater than ");
+        description.appendValue(compareTo);
+    }
+}
diff --git a/hamcrest-library/src/main/java/org/hamcrest/number/IsNaN.java b/hamcrest-library/src/main/java/org/hamcrest/number/IsNaN.java
deleted file mode 100644
index 415a9a2..0000000
--- a/hamcrest-library/src/main/java/org/hamcrest/number/IsNaN.java
+++ /dev/null
@@ -1,38 +0,0 @@
-package org.hamcrest.number;
-
-import org.hamcrest.Description;
-import org.hamcrest.Matcher;
-import org.hamcrest.TypeSafeMatcher;
-
-
-/**
- * Is the value a number actually not a number (NaN)?
- */
-public final class IsNaN extends TypeSafeMatcher<Double> {
-
-    private IsNaN() { }
-
-    @Override
-    public boolean matchesSafely(Double item) {
-        return Double.isNaN(item);
-    }
-
-    @Override
-    public void describeMismatchSafely(Double item, Description mismatchDescription) {
-        mismatchDescription.appendText("was ").appendValue(item);
-    }
-
-    @Override
-    public void describeTo(Description description) {
-        description.appendText("a double value of NaN");
-    }
-
-    /**
-     * Creates a matcher of {@link Double}s that matches when an examined double is not a number.
-     * For example:
-     * <pre>assertThat(Double.NaN, is(notANumber()))</pre>
-     */
-    public static Matcher<Double> notANumber() {
-        return new IsNaN();
-    }
-}
diff --git a/hamcrest-library/src/main/java/org/hamcrest/number/OrderingComparison.java b/hamcrest-library/src/main/java/org/hamcrest/number/OrderingComparison.java
deleted file mode 100644
index 8a77713..0000000
--- a/hamcrest-library/src/main/java/org/hamcrest/number/OrderingComparison.java
+++ /dev/null
@@ -1,79 +0,0 @@
-package org.hamcrest.number;
-
-import org.hamcrest.Matcher;
-import org.hamcrest.comparator.ComparatorMatcherBuilder;
-
-public class OrderingComparison {
-
-    private OrderingComparison() {
-    }
-
-    /**
-     * Creates a matcher of {@link Comparable} object that matches when the examined object is
-     * equal to the specified value, as reported by the <code>compareTo</code> method of the
-     * <b>examined</b> object.
-     * For example:
-     * <pre>assertThat(1, comparesEqualTo(1))</pre>
-     *
-     * @param value the value which, when passed to the compareTo method of the examined object, should return zero
-     */
-    public static <T extends Comparable<T>> Matcher<T> comparesEqualTo(T value) {
-        return ComparatorMatcherBuilder.<T>usingNaturalOrdering().comparesEqualTo(value);
-    }
-
-    /**
-     * Creates a matcher of {@link Comparable} object that matches when the examined object is
-     * greater than the specified value, as reported by the <code>compareTo</code> method of the
-     * <b>examined</b> object.
-     * For example:
-     * <pre>assertThat(2, greaterThan(1))</pre>
-     *
-     * @param value the value which, when passed to the compareTo method of the examined object, should return greater
-     *              than zero
-     */
-    public static <T extends Comparable<T>> Matcher<T> greaterThan(T value) {
-        return ComparatorMatcherBuilder.<T>usingNaturalOrdering().greaterThan(value);
-    }
-
-    /**
-     * Creates a matcher of {@link Comparable} object that matches when the examined object is
-     * greater than or equal to the specified value, as reported by the <code>compareTo</code> method
-     * of the <b>examined</b> object.
-     * For example:
-     * <pre>assertThat(1, greaterThanOrEqualTo(1))</pre>
-     *
-     * @param value the value which, when passed to the compareTo method of the examined object, should return greater
-     *              than or equal to zero
-     */
-    public static <T extends Comparable<T>> Matcher<T> greaterThanOrEqualTo(T value) {
-        return ComparatorMatcherBuilder.<T>usingNaturalOrdering().greaterThanOrEqualTo(value);
-    }
-
-    /**
-     * Creates a matcher of {@link Comparable} object that matches when the examined object is
-     * less than the specified value, as reported by the <code>compareTo</code> method of the
-     * <b>examined</b> object.
-     * For example:
-     * <pre>assertThat(1, lessThan(2))</pre>
-     *
-     * @param value the value which, when passed to the compareTo method of the examined object, should return less
-     *              than zero
-     */
-    public static <T extends Comparable<T>> Matcher<T> lessThan(T value) {
-        return ComparatorMatcherBuilder.<T>usingNaturalOrdering().lessThan(value);
-    }
-
-    /**
-     * Creates a matcher of {@link Comparable} object that matches when the examined object is
-     * less than or equal to the specified value, as reported by the <code>compareTo</code> method
-     * of the <b>examined</b> object.
-     * For example:
-     * <pre>assertThat(1, lessThanOrEqualTo(1))</pre>
-     *
-     * @param value the value which, when passed to the compareTo method of the examined object, should return less
-     *              than or equal to zero
-     */
-    public static <T extends Comparable<T>> Matcher<T> lessThanOrEqualTo(T value) {
-        return ComparatorMatcherBuilder.<T>usingNaturalOrdering().lessThanOrEqualTo(value);
-    }
-}
diff --git a/hamcrest-library/src/main/java/org/hamcrest/number/OrderingComparisons.java b/hamcrest-library/src/main/java/org/hamcrest/number/OrderingComparisons.java
new file mode 100644
index 0000000..1791a40
--- /dev/null
+++ b/hamcrest-library/src/main/java/org/hamcrest/number/OrderingComparisons.java
@@ -0,0 +1,38 @@
+package org.hamcrest.number;
+
+import static org.hamcrest.core.AnyOf.anyOf;
+import static org.hamcrest.core.IsEqual.equalTo;
+import static org.hamcrest.core.IsNot.not;
+import static org.hamcrest.core.DescribedAs.describedAs;
+
+import org.hamcrest.Factory;
+import org.hamcrest.Matcher;
+
+@SuppressWarnings("unchecked")
+public class OrderingComparisons {
+    @Factory
+    public static <T extends Comparable<T>> Matcher<T> greaterThan(T value) {
+        return new IsGreaterThan<T>(value);
+    }
+    
+	@Factory
+    public static <T extends Comparable<T>> Matcher<T> greaterThanOrEqualTo(T value) {
+        return describedAs("a value greater than or equal to %0", 
+                           anyOf(greaterThan(value), equalTo(value)),
+                           value);
+    }
+    
+    @Factory
+    public static <T extends Comparable<T>> Matcher<T> lessThan(T value) {
+        return describedAs("a value less than %0", 
+                           not(greaterThanOrEqualTo(value)),
+                           value);
+    }
+
+    @Factory
+    public static <T extends Comparable<T>> Matcher<T> lessThanOrEqualTo(T value) {
+        return describedAs("a value less than or equal to %0",
+                           not(greaterThan(value)),
+                           value);
+    }
+}
diff --git a/hamcrest-library/src/main/java/org/hamcrest/object/HasToString.java b/hamcrest-library/src/main/java/org/hamcrest/object/HasToString.java
index 2dab9de..0f12ffd 100644
--- a/hamcrest-library/src/main/java/org/hamcrest/object/HasToString.java
+++ b/hamcrest-library/src/main/java/org/hamcrest/object/HasToString.java
@@ -1,43 +1,31 @@
 package org.hamcrest.object;
 
-import org.hamcrest.FeatureMatcher;
+import org.hamcrest.Description;
 import org.hamcrest.Matcher;
+import org.hamcrest.Factory;
+import org.hamcrest.BaseMatcher;
 
-import static org.hamcrest.core.IsEqual.equalTo;
+public class HasToString<T> extends BaseMatcher<T> {
 
-public class HasToString<T> extends FeatureMatcher<T, String> {
-    public HasToString(Matcher<? super String> toStringMatcher) {
-      super(toStringMatcher, "with toString()", "toString()");
+    private final Matcher<String> toStringMatcher;
+
+    public HasToString(Matcher<String> toStringMatcher) {
+        this.toStringMatcher = toStringMatcher;
+    }
+
+    public boolean matches(Object item) {
+        return item != null && toStringMatcher.matches(item.toString());
+    }
+
+    public void describeTo(Description description) {
+        description
+	        .appendText("asString(")
+	        .appendDescriptionOf(toStringMatcher)
+	        .appendText(")");
     }
     
-    @Override
-    protected String featureValueOf(T actual) {
-      return String.valueOf(actual);
-    }
-
-    /**
-     * Creates a matcher that matches any examined object whose <code>toString</code> method
-     * returns a value that satisfies the specified matcher.
-     * For example:
-     * <pre>assertThat(true, hasToString(equalTo("TRUE")))</pre>
-     * 
-     * @param toStringMatcher
-     *     the matcher used to verify the toString result
-     */
-    public static <T> Matcher<T> hasToString(Matcher<? super String> toStringMatcher) {
+    @Factory
+    public static <T> Matcher<T> hasToString(Matcher<String> toStringMatcher) {
         return new HasToString<T>(toStringMatcher);
     }
-
-    /**
-     * Creates a matcher that matches any examined object whose <code>toString</code> method
-     * returns a value equalTo the specified string.
-     * For example:
-     * <pre>assertThat(true, hasToString("TRUE"))</pre>
-     * 
-     * @param expectedToString
-     *     the expected toString result
-     */
-    public static <T> Matcher<T> hasToString(String expectedToString) {
-        return new HasToString<T>(equalTo(expectedToString));
-    }
 }
diff --git a/hamcrest-library/src/main/java/org/hamcrest/object/IsCompatibleType.java b/hamcrest-library/src/main/java/org/hamcrest/object/IsCompatibleType.java
index e1410a4..3a2dc7a 100644
--- a/hamcrest-library/src/main/java/org/hamcrest/object/IsCompatibleType.java
+++ b/hamcrest-library/src/main/java/org/hamcrest/object/IsCompatibleType.java
@@ -2,6 +2,7 @@
 
 import org.hamcrest.Description;
 import org.hamcrest.Matcher;
+import org.hamcrest.Factory;
 import org.hamcrest.TypeSafeMatcher;
 
 public class IsCompatibleType<T> extends TypeSafeMatcher<Class<?>> {
@@ -11,30 +12,15 @@
         this.type = type;
     }
     
-    @Override
     public boolean matchesSafely(Class<?> cls) {
         return type.isAssignableFrom(cls);
     }
     
-    @Override
-    public void describeMismatchSafely(Class<?> cls, Description mismatchDescription) {
-      mismatchDescription.appendValue(cls.getName());
-    }
-    
-    @Override
     public void describeTo(Description description) {
         description.appendText("type < ").appendText(type.getName());
     }
     
-    /**
-     * Creates a matcher of {@link Class} that matches when the specified baseType is
-     * assignable from the examined class.
-     * For example:
-     * <pre>assertThat(Integer.class, typeCompatibleWith(Number.class))</pre>
-     * 
-     * @param baseType
-     *     the base class to examine classes against
-     */
+    @Factory
     public static <T> Matcher<Class<?>> typeCompatibleWith(Class<T> baseType) {
         return new IsCompatibleType<T>(baseType);
     }
diff --git a/hamcrest-library/src/main/java/org/hamcrest/object/IsEventFrom.java b/hamcrest-library/src/main/java/org/hamcrest/object/IsEventFrom.java
index 43b64d4..504a8f5 100644
--- a/hamcrest-library/src/main/java/org/hamcrest/object/IsEventFrom.java
+++ b/hamcrest-library/src/main/java/org/hamcrest/object/IsEventFrom.java
@@ -1,8 +1,11 @@
+/*  Copyright (c) 2000-2006 hamcrest.org
+ */
 package org.hamcrest.object;
 
 import org.hamcrest.Description;
 import org.hamcrest.Matcher;
-import org.hamcrest.TypeSafeDiagnosingMatcher;
+import org.hamcrest.Factory;
+import org.hamcrest.TypeSafeMatcher;
 
 import java.util.EventObject;
 
@@ -10,35 +13,24 @@
 /**
  * Tests if the value is an event announced by a specific object.
  */
-public class IsEventFrom extends TypeSafeDiagnosingMatcher<EventObject> {
-    private final Class<?> eventClass;
+public class IsEventFrom extends TypeSafeMatcher<EventObject> {
+    private final Class eventClass;
     private final Object source;
 
-    public IsEventFrom(Class<?> eventClass, Object source) {
+    public IsEventFrom(Class eventClass, Object source) {
         this.eventClass = eventClass;
         this.source = source;
     }
 
-    @Override
-    public boolean matchesSafely(EventObject item, Description mismatchDescription) {
-        if (!eventClass.isInstance(item)) {
-          mismatchDescription.appendText("item type was " + item.getClass().getName());
-          return false;
-        }
-        
-        if (!eventHasSameSource(item)) {
-          mismatchDescription.appendText("source was ").appendValue(item.getSource());
-          return false;
-        }
-        return true;
+    public boolean matchesSafely(EventObject item) {
+        return eventClass.isInstance(item)
+                && eventHasSameSource(item);
     }
 
-    
     private boolean eventHasSameSource(EventObject ev) {
         return ev.getSource() == source;
     }
 
-    @Override
     public void describeTo(Description description) {
         description.appendText("an event of type ")
                 .appendText(eventClass.getName())
@@ -47,29 +39,20 @@
     }
 
     /**
-     * Creates a matcher of {@link java.util.EventObject} that matches any object
+     * Constructs an IsEventFrom Matcher that returns true for any object
      * derived from <var>eventClass</var> announced by <var>source</var>.
-     * For example:
-     * <pre>assertThat(myEvent, is(eventFrom(PropertyChangeEvent.class, myBean)))</pre>
-     * 
-     * @param eventClass
-     *     the class of the event to match on
-     * @param source
-     *     the source of the event
      */
+    @Factory
     public static Matcher<EventObject> eventFrom(Class<? extends EventObject> eventClass, Object source) {
         return new IsEventFrom(eventClass, source);
     }
 
     /**
-     * Creates a matcher of {@link java.util.EventObject} that matches any EventObject
-     * announced by <var>source</var>.
-     * For example:
-     * <pre>assertThat(myEvent, is(eventFrom(myBean)))</pre>
-     * 
-     * @param source
-     *     the source of the event
+     * Constructs an IsEventFrom Matcher that returns true for any object
+     * derived from {@link java.util.EventObject} announced by <var>source
+     * </var>.
      */
+    @Factory
     public static Matcher<EventObject> eventFrom(Object source) {
         return eventFrom(EventObject.class, source);
     }
diff --git a/hamcrest-library/src/main/java/org/hamcrest/text/IsBlankString.java b/hamcrest-library/src/main/java/org/hamcrest/text/IsBlankString.java
deleted file mode 100644
index b168541..0000000
--- a/hamcrest-library/src/main/java/org/hamcrest/text/IsBlankString.java
+++ /dev/null
@@ -1,55 +0,0 @@
-
-package org.hamcrest.text;
-
-import org.hamcrest.Description;
-import org.hamcrest.Matcher;
-import org.hamcrest.TypeSafeMatcher;
-
-import java.util.regex.Pattern;
-
-import static org.hamcrest.core.AnyOf.anyOf;
-import static org.hamcrest.core.IsNull.nullValue;
-
-/**
- * Matches blank Strings (and null).
- */
-public final class IsBlankString extends TypeSafeMatcher<String> {
-    private static final IsBlankString BLANK_INSTANCE = new IsBlankString();
-    @SuppressWarnings("unchecked")
-    private static final Matcher<String> NULL_OR_BLANK_INSTANCE = anyOf(nullValue(), BLANK_INSTANCE);
-
-    private static final Pattern REGEX_WHITESPACE = Pattern.compile("\\s*");
-
-    private IsBlankString() { }
-
-    @Override
-    public boolean matchesSafely(String item) {
-        return REGEX_WHITESPACE.matcher(item).matches();
-    }
-
-    @Override
-    public void describeTo(Description description) {
-        description.appendText("a blank string");
-    }
-
-    /**
-     * Creates a matcher of {@link String} that matches when the examined string contains
-     * zero or more whitespace characters and nothing else.
-     * For example:
-     * <pre>assertThat("  ", is(blankString()))</pre>
-     */
-    public static Matcher<String> blankString() {
-        return BLANK_INSTANCE;
-    }
-
-    /**
-     * Creates a matcher of {@link String} that matches when the examined string is <code>null</code>, or
-     * contains zero or more whitespace characters and nothing else.
-     * For example:
-     * <pre>assertThat(((String)null), is(blankOrNullString()))</pre>
-     * 
-     */
-    public static Matcher<String> blankOrNullString() {
-        return NULL_OR_BLANK_INSTANCE;
-    }
-}
diff --git a/hamcrest-library/src/main/java/org/hamcrest/text/IsEmptyString.java b/hamcrest-library/src/main/java/org/hamcrest/text/IsEmptyString.java
deleted file mode 100644
index bbe5681..0000000
--- a/hamcrest-library/src/main/java/org/hamcrest/text/IsEmptyString.java
+++ /dev/null
@@ -1,77 +0,0 @@
-
-package org.hamcrest.text;
-
-import org.hamcrest.Description;
-import org.hamcrest.Matcher;
-import org.hamcrest.TypeSafeMatcher;
-
-import static org.hamcrest.core.AnyOf.anyOf;
-import static org.hamcrest.core.IsNull.nullValue;
-
-/**
- * Matches empty Strings (and null).
- */
-public final class IsEmptyString extends TypeSafeMatcher<String> {
-    private static final IsEmptyString INSTANCE = new IsEmptyString();
-    @SuppressWarnings("unchecked")
-    private static final Matcher<String> NULL_OR_EMPTY_INSTANCE = anyOf(nullValue(), INSTANCE);
-
-    private IsEmptyString() { }
-
-    @Override
-    public boolean matchesSafely(String item) {
-        return item.equals("");
-    }
-
-    @Override
-    public void describeTo(Description description) {
-        description.appendText("an empty string");
-    }
-
-    /**
-     * Creates a matcher of {@link String} that matches when the examined string has zero length.
-     * For example:
-     * <pre>assertThat("", isEmptyString())</pre>
-     * 
-     * @deprecated use is(emptyString()) instead
-     */
-    @Deprecated
-    public static Matcher<String> isEmptyString() {
-        return emptyString();
-    }
-
-    /**
-     * Creates a matcher of {@link String} that matches when the examined string has zero length.
-     * For example:
-     * <pre>assertThat("", is(emptyString()))</pre>
-     * 
-     */
-    public static Matcher<String> emptyString() {
-        return INSTANCE;
-    }
-
-    /**
-     * Creates a matcher of {@link String} that matches when the examined string is <code>null</code>, or
-     * has zero length.
-     * For example:
-     * <pre>assertThat(((String)null), isEmptyOrNullString())</pre>
-     * 
-     * @deprecated use is(emptyOrNullString()) instead
-     * 
-     */
-    @Deprecated
-    public static Matcher<String> isEmptyOrNullString() {
-        return emptyOrNullString();
-    }
-
-    /**
-     * Creates a matcher of {@link String} that matches when the examined string is <code>null</code>, or
-     * has zero length.
-     * For example:
-     * <pre>assertThat(((String)null), is(emptyOrNullString()))</pre>
-     * 
-     */
-    public static Matcher<String> emptyOrNullString() {
-        return NULL_OR_EMPTY_INSTANCE;
-    }
-}
diff --git a/hamcrest-library/src/main/java/org/hamcrest/text/IsEqualIgnoringCase.java b/hamcrest-library/src/main/java/org/hamcrest/text/IsEqualIgnoringCase.java
index 00586f6..cc78c71 100644
--- a/hamcrest-library/src/main/java/org/hamcrest/text/IsEqualIgnoringCase.java
+++ b/hamcrest-library/src/main/java/org/hamcrest/text/IsEqualIgnoringCase.java
@@ -1,54 +1,42 @@
-package org.hamcrest.text;
-
-import org.hamcrest.Description;
-import org.hamcrest.Matcher;
-import org.hamcrest.TypeSafeMatcher;
-
-/**
- * Tests if a string is equal to another string, regardless of the case.
- */
-public class IsEqualIgnoringCase extends TypeSafeMatcher<String> {
-
-    // TODO: Replace String with CharSequence to allow for easy interoperability between
-    //       String, StringBuffer, StringBuilder, CharBuffer, etc (joe).
-
-    private final String string;
-
-    public IsEqualIgnoringCase(String string) {
-        if (string == null) {
-            throw new IllegalArgumentException("Non-null value required by IsEqualIgnoringCase()");
-        }
-        this.string = string;
-    }
-
-    @Override
-    public boolean matchesSafely(String item) {
-        return string.equalsIgnoreCase(item);
-    }
-
-    @Override
-    public void describeMismatchSafely(String item, Description mismatchDescription) {
-      mismatchDescription.appendText("was ").appendValue(item);
-    }
-    
-    @Override
-    public void describeTo(Description description) {
-        description.appendText("equalToIgnoringCase(")
-                .appendValue(string)
-                .appendText(")");
-    }
-
-    /**
-     * Creates a matcher of {@link String} that matches when the examined string is equal to
-     * the specified expectedString, ignoring case.
-     * For example:
-     * <pre>assertThat("Foo", equalToIgnoringCase("FOO"))</pre>
-     * 
-     * @param expectedString
-     *     the expected value of matched strings
-     */
-    public static Matcher<String> equalToIgnoringCase(String expectedString) {
-        return new IsEqualIgnoringCase(expectedString);
-    }
-
-}
+/*  Copyright (c) 2000-2006 hamcrest.org
+ */
+package org.hamcrest.text;
+
+import org.hamcrest.Description;
+import org.hamcrest.Matcher;
+import org.hamcrest.Factory;
+import org.hamcrest.TypeSafeMatcher;
+
+/**
+ * Tests if a string is equal to another string, regardless of the case.
+ */
+public class IsEqualIgnoringCase extends TypeSafeMatcher<String> {
+
+    // TODO: Replace String with CharSequence to allow for easy interopability between
+    //       String, StringBuffer, StringBuilder, CharBuffer, etc (joe).
+
+    private final String string;
+
+    public IsEqualIgnoringCase(String string) {
+        if (string == null) {
+            throw new IllegalArgumentException("Non-null value required by IsEqualIgnoringCase()");
+        }
+        this.string = string;
+    }
+
+    public boolean matchesSafely(String item) {
+        return string.equalsIgnoreCase(item);
+    }
+
+    public void describeTo(Description description) {
+        description.appendText("eqIgnoringCase(")
+                .appendValue(string)
+                .appendText(")");
+    }
+
+    @Factory
+    public static Matcher<String> equalToIgnoringCase(String string) {
+        return new IsEqualIgnoringCase(string);
+    }
+
+}
diff --git a/hamcrest-library/src/main/java/org/hamcrest/text/IsEqualIgnoringWhiteSpace.java b/hamcrest-library/src/main/java/org/hamcrest/text/IsEqualIgnoringWhiteSpace.java
index f2b706c..dd390e8 100644
--- a/hamcrest-library/src/main/java/org/hamcrest/text/IsEqualIgnoringWhiteSpace.java
+++ b/hamcrest-library/src/main/java/org/hamcrest/text/IsEqualIgnoringWhiteSpace.java
@@ -1,79 +1,60 @@
-package org.hamcrest.text;
-
-import org.hamcrest.Description;
-import org.hamcrest.Matcher;
-import org.hamcrest.TypeSafeMatcher;
-
-import static java.lang.Character.isWhitespace;
-
-/**
- * Tests if a string is equal to another string, ignoring any changes in whitespace.
- */
-public class IsEqualIgnoringWhiteSpace extends TypeSafeMatcher<String> {
-
-    // TODO: Replace String with CharSequence to allow for easy interoperability between
-    //       String, StringBuffer, StringBuilder, CharBuffer, etc (joe).
-
-    private final String string;
-
-    public IsEqualIgnoringWhiteSpace(String string) {
-        if (string == null) {
-            throw new IllegalArgumentException("Non-null value required by IsEqualIgnoringCase()");
-        }
-        this.string = string;
-    }
-
-    @Override
-    public boolean matchesSafely(String item) {
-        return stripSpace(string).equalsIgnoreCase(stripSpace(item));
-    }
-    
-    @Override
-    public void describeMismatchSafely(String item, Description mismatchDescription) {
-      mismatchDescription.appendText("was  ").appendText(stripSpace(item));
-    }
-    
-    @Override
-    public void describeTo(Description description) {
-        description.appendText("equalToIgnoringWhiteSpace(")
-                .appendValue(string)
-                .appendText(")");
-    }
-
-    public String stripSpace(String toBeStripped) {
-        final StringBuilder result = new StringBuilder();
-        boolean lastWasSpace = true;
-        for (int i = 0; i < toBeStripped.length(); i++) {
-            char c = toBeStripped.charAt(i);
-            if (isWhitespace(c)) {
-                if (!lastWasSpace) {
-                    result.append(' ');
-                }
-                lastWasSpace = true;
-            } else {
-                result.append(c);
-                lastWasSpace = false;
-            }
-        }
-        return result.toString().trim();
-    }
-
-    /**
-     * Creates a matcher of {@link String} that matches when the examined string is equal to
-     * the specified expectedString, when whitespace differences are (mostly) ignored.  To be
-     * exact, the following whitespace rules are applied:
-     * <ul>
-     *   <li>all leading and trailing whitespace of both the expectedString and the examined string are ignored</li>
-     *   <li>any remaining whitespace, appearing within either string, is collapsed to a single space before comparison</li>
-     * </ul>
-     * For example:
-     * <pre>assertThat("   my\tfoo  bar ", equalToIgnoringWhiteSpace(" my  foo bar"))</pre>
-     * 
-     * @param expectedString
-     *     the expected value of matched strings
-     */
-    public static Matcher<String> equalToIgnoringWhiteSpace(String expectedString) {
-        return new IsEqualIgnoringWhiteSpace(expectedString);
-    }
-
-}
+/*  Copyright (c) 2000-2006 hamcrest.org
+ */
+package org.hamcrest.text;
+
+import org.hamcrest.Description;
+import org.hamcrest.Matcher;
+import org.hamcrest.Factory;
+import org.hamcrest.TypeSafeMatcher;
+
+/**
+ * Tests if a string is equal to another string, ignoring any changes in whitespace.
+ */
+public class IsEqualIgnoringWhiteSpace extends TypeSafeMatcher<String> {
+
+    // TODO: Replace String with CharSequence to allow for easy interopability between
+    //       String, StringBuffer, StringBuilder, CharBuffer, etc (joe).
+
+    private final String string;
+
+    public IsEqualIgnoringWhiteSpace(String string) {
+        if (string == null) {
+            throw new IllegalArgumentException("Non-null value required by IsEqualIgnoringCase()");
+        }
+        this.string = string;
+    }
+
+    public boolean matchesSafely(String item) {
+        return stripSpace(string).equalsIgnoreCase(stripSpace(item));
+    }
+
+    public void describeTo(Description description) {
+        description.appendText("eqIgnoringWhiteSpace(")
+                .appendValue(string)
+                .appendText(")");
+    }
+
+    public String stripSpace(String string) {
+        StringBuilder result = new StringBuilder();
+        boolean lastWasSpace = true;
+        for (int i = 0; i < string.length(); i++) {
+            char c = string.charAt(i);
+            if (Character.isWhitespace(c)) {
+                if (!lastWasSpace) {
+                    result.append(' ');
+                }
+                lastWasSpace = true;
+            } else {
+                result.append(c);
+                lastWasSpace = false;
+            }
+        }
+        return result.toString().trim();
+    }
+
+    @Factory
+    public static Matcher<String> equalToIgnoringWhiteSpace(String string) {
+        return new IsEqualIgnoringWhiteSpace(string);
+    }
+
+}
diff --git a/hamcrest-library/src/main/java/org/hamcrest/text/MatchesPattern.java b/hamcrest-library/src/main/java/org/hamcrest/text/MatchesPattern.java
deleted file mode 100644
index e0eda0a..0000000
--- a/hamcrest-library/src/main/java/org/hamcrest/text/MatchesPattern.java
+++ /dev/null
@@ -1,41 +0,0 @@
-package org.hamcrest.text;
-
-import org.hamcrest.Description;
-import org.hamcrest.Matcher;
-import org.hamcrest.TypeSafeMatcher;
-
-import java.util.regex.Pattern;
-
-public class MatchesPattern extends TypeSafeMatcher<String> {
-    private final Pattern pattern;
-
-    public MatchesPattern(Pattern pattern) {
-        this.pattern = pattern;
-    }
-
-    @Override
-    protected boolean matchesSafely(String item) {
-        return pattern.matcher(item).matches();
-    }
-
-    @Override
-    public void describeTo(Description description) {
-        description.appendText("a string matching the pattern '" + pattern + "'");
-    }
-
-    /**
-     * Creates a matcher of {@link java.lang.String} that matches when the examined string
-     * exactly matches the given {@link java.util.regex.Pattern}.
-     */
-    public static Matcher<String> matchesPattern(Pattern pattern) {
-        return new MatchesPattern(pattern);
-    }
-
-    /**
-     * Creates a matcher of {@link java.lang.String} that matches when the examined string
-     * exactly matches the given regular expression, treated as a {@link java.util.regex.Pattern}.
-     */
-    public static Matcher<String> matchesPattern(String regex) {
-        return new MatchesPattern(Pattern.compile(regex));
-    }
-}
diff --git a/hamcrest-library/src/main/java/org/hamcrest/text/StringContains.java b/hamcrest-library/src/main/java/org/hamcrest/text/StringContains.java
new file mode 100644
index 0000000..9e55560
--- /dev/null
+++ b/hamcrest-library/src/main/java/org/hamcrest/text/StringContains.java
@@ -0,0 +1,29 @@
+/*  Copyright (c) 2000-2006 hamcrest.org
+ */
+package org.hamcrest.text;
+
+import org.hamcrest.Factory;
+import org.hamcrest.Matcher;
+
+/**
+ * Tests if the argument is a string that contains a substring.
+ */
+public class StringContains extends SubstringMatcher {
+    public StringContains(String substring) {
+        super(substring);
+    }
+
+    protected boolean evalSubstringOf(String s) {
+        return s.indexOf(substring) >= 0;
+    }
+
+    protected String relationship() {
+        return "containing";
+    }
+
+    @Factory
+    public static Matcher<String> containsString(String substring) {
+        return new StringContains(substring);
+    }
+
+}
\ No newline at end of file
diff --git a/hamcrest-library/src/main/java/org/hamcrest/text/StringContainsInOrder.java b/hamcrest-library/src/main/java/org/hamcrest/text/StringContainsInOrder.java
deleted file mode 100644
index f5d24ff..0000000
--- a/hamcrest-library/src/main/java/org/hamcrest/text/StringContainsInOrder.java
+++ /dev/null
@@ -1,69 +0,0 @@
-package org.hamcrest.text;
-
-import org.hamcrest.Description;
-import org.hamcrest.Matcher;
-import org.hamcrest.TypeSafeMatcher;
-
-import java.util.Arrays;
-
-public class StringContainsInOrder extends TypeSafeMatcher<String> {
-    private final Iterable<String> substrings;
-
-    public StringContainsInOrder(Iterable<String> substrings) {
-        this.substrings = substrings;
-    }
-
-    @Override
-    public boolean matchesSafely(String s) {
-        int fromIndex = 0;
-        
-        for (String substring : substrings) {
-            fromIndex = s.indexOf(substring, fromIndex);
-            if (fromIndex == -1) {
-                return false;
-            }
-        }
-        
-        return true;
-    }
-    
-    @Override
-    public void describeMismatchSafely(String item, Description mismatchDescription) {
-        mismatchDescription.appendText("was \"").appendText(item).appendText("\"");
-    }
-    
-    @Override
-    public void describeTo(Description description) {
-        description.appendText("a string containing ")
-                   .appendValueList("", ", ", "", substrings)
-                   .appendText(" in order");
-    }
-    
-    /**
-     * Creates a matcher of {@link String} that matches when the examined string contains all of
-     * the specified substrings, considering the order of their appearance.
-     * For example:
-     * <pre>assertThat("myfoobarbaz", stringContainsInOrder(Arrays.asList("bar", "foo")))</pre>
-     * fails as "foo" occurs before "bar" in the string "myfoobarbaz"
-     * 
-     * @param substrings
-     *     the substrings that must be contained within matching strings
-     */
-    public static Matcher<String> stringContainsInOrder(Iterable<String> substrings) {
-        return new StringContainsInOrder(substrings);
-    }
-
-    /**
-     * Creates a matcher of {@link String} that matches when the examined string contains all of
-     * the specified substrings, considering the order of their appearance.
-     * For example:
-     * <pre>assertThat("myfoobarbaz", stringContainsInOrder("bar", "foo"))</pre>
-     * fails as "foo" occurs before "bar" in the string "myfoobarbaz"
-     *
-     * @param substrings
-     *     the substrings that must be contained within matching strings
-     */
-    public static Matcher<String> stringContainsInOrder(String... substrings) {
-        return new StringContainsInOrder(Arrays.asList(substrings));
-    }
-}
diff --git a/hamcrest-library/src/main/java/org/hamcrest/text/StringEndsWith.java b/hamcrest-library/src/main/java/org/hamcrest/text/StringEndsWith.java
new file mode 100644
index 0000000..10e4764
--- /dev/null
+++ b/hamcrest-library/src/main/java/org/hamcrest/text/StringEndsWith.java
@@ -0,0 +1,29 @@
+/*  Copyright (c) 2000-2006 hamcrest.org
+ */
+package org.hamcrest.text;
+
+import org.hamcrest.Factory;
+import org.hamcrest.Matcher;
+
+/**
+ * Tests if the argument is a string that contains a substring.
+ */
+public class StringEndsWith extends SubstringMatcher {
+    public StringEndsWith(String substring) {
+        super(substring);
+    }
+
+    protected boolean evalSubstringOf(String s) {
+        return s.endsWith(substring);
+    }
+
+    protected String relationship() {
+        return "ending with";
+    }
+
+    @Factory
+    public static Matcher<String> endsWith(String substring) {
+        return new StringEndsWith(substring);
+    }
+
+}
diff --git a/hamcrest-library/src/main/java/org/hamcrest/text/StringStartsWith.java b/hamcrest-library/src/main/java/org/hamcrest/text/StringStartsWith.java
new file mode 100644
index 0000000..4613101
--- /dev/null
+++ b/hamcrest-library/src/main/java/org/hamcrest/text/StringStartsWith.java
@@ -0,0 +1,29 @@
+/*  Copyright (c) 2000-2006 hamcrest.org
+ */
+package org.hamcrest.text;
+
+import org.hamcrest.Factory;
+import org.hamcrest.Matcher;
+
+/**
+ * Tests if the argument is a string that contains a substring.
+ */
+public class StringStartsWith extends SubstringMatcher {
+    public StringStartsWith(String substring) {
+        super(substring);
+    }
+
+    protected boolean evalSubstringOf(String s) {
+        return s.startsWith(substring);
+    }
+
+    protected String relationship() {
+        return "starting with";
+    }
+
+    @Factory
+    public static Matcher<String> startsWith(String substring) {
+        return new StringStartsWith(substring);
+    }
+
+}
\ No newline at end of file
diff --git a/hamcrest-library/src/main/java/org/hamcrest/text/SubstringMatcher.java b/hamcrest-library/src/main/java/org/hamcrest/text/SubstringMatcher.java
new file mode 100644
index 0000000..8ebe739
--- /dev/null
+++ b/hamcrest-library/src/main/java/org/hamcrest/text/SubstringMatcher.java
@@ -0,0 +1,31 @@
+package org.hamcrest.text;
+
+import org.hamcrest.Description;
+import org.hamcrest.TypeSafeMatcher;
+
+public abstract class SubstringMatcher extends TypeSafeMatcher<String> {
+
+    // TODO: Replace String with CharSequence to allow for easy interopability between
+    //       String, StringBuffer, StringBuilder, CharBuffer, etc (joe).
+
+    protected final String substring;
+
+    protected SubstringMatcher(final String substring) {
+        this.substring = substring;
+    }
+
+    public boolean matchesSafely(String item) {
+        return evalSubstringOf(item);
+    }
+
+    public void describeTo(Description description) {
+        description.appendText("a string ")
+                .appendText(relationship())
+                .appendText(" ")
+                .appendValue(substring);
+    }
+
+    protected abstract boolean evalSubstringOf(String string);
+
+    protected abstract String relationship();
+}
\ No newline at end of file
diff --git a/hamcrest-library/src/main/java/org/hamcrest/text/X.java b/hamcrest-library/src/main/java/org/hamcrest/text/X.java
new file mode 100644
index 0000000..7e85bd9
--- /dev/null
+++ b/hamcrest-library/src/main/java/org/hamcrest/text/X.java
@@ -0,0 +1,18 @@
+package org.hamcrest.text;
+
+import org.hamcrest.Matcher;
+import org.hamcrest.CoreMatchers;
+
+public class X {
+
+    public static void main(String[] args) {
+
+        x(CoreMatchers.any(String.class));
+
+
+    }
+
+    private static void x(Matcher<String> s) {
+
+    }
+}
diff --git a/hamcrest-library/src/main/java/org/hamcrest/xml/HasXPath.java b/hamcrest-library/src/main/java/org/hamcrest/xml/HasXPath.java
index 30ed081..742935b 100644
--- a/hamcrest-library/src/main/java/org/hamcrest/xml/HasXPath.java
+++ b/hamcrest-library/src/main/java/org/hamcrest/xml/HasXPath.java
@@ -1,34 +1,27 @@
 package org.hamcrest.xml;
 
-import org.hamcrest.Condition;
 import org.hamcrest.Description;
+import org.hamcrest.Factory;
 import org.hamcrest.Matcher;
-import org.hamcrest.TypeSafeDiagnosingMatcher;
-import org.hamcrest.core.IsAnything;
+import org.hamcrest.TypeSafeMatcher;
 import org.w3c.dom.Node;
 
-import javax.xml.namespace.NamespaceContext;
-import javax.xml.namespace.QName;
-import javax.xml.xpath.*;
-
-import static javax.xml.xpath.XPathConstants.STRING;
-import static org.hamcrest.Condition.matched;
-import static org.hamcrest.Condition.notMatched;
+import javax.xml.xpath.XPath;
+import javax.xml.xpath.XPathConstants;
+import javax.xml.xpath.XPathExpression;
+import javax.xml.xpath.XPathExpressionException;
+import javax.xml.xpath.XPathFactory;
 
 /**
  * Applies a Matcher to a given XML Node in an existing XML Node tree, specified by an XPath expression.
  *
  * @author Joe Walnes
- * @author Steve Freeman
  */
-public class HasXPath extends TypeSafeDiagnosingMatcher<Node> {
-    public static final NamespaceContext NO_NAMESPACE_CONTEXT = null;
-    private static final IsAnything<String> WITH_ANY_CONTENT = new IsAnything<String>("");
-    private static final Condition.Step<Object,String> NODE_EXISTS = nodeExists();
+public class HasXPath extends TypeSafeMatcher<Node> {
+
     private final Matcher<String> valueMatcher;
     private final XPathExpression compiledXPath;
     private final String xpathString;
-    private final QName evaluationMode;
 
     /**
      * @param xPathExpression XPath expression.
@@ -36,134 +29,46 @@
      *                     May be null to specify that the XPath must exist but the value is irrelevant.
      */
     public HasXPath(String xPathExpression, Matcher<String> valueMatcher) {
-        this(xPathExpression, NO_NAMESPACE_CONTEXT, valueMatcher);
+        try {
+            XPath xPath = XPathFactory.newInstance().newXPath();
+            compiledXPath = xPath.compile(xPathExpression);
+            this.xpathString = xPathExpression;
+            this.valueMatcher = valueMatcher;
+        } catch (XPathExpressionException e) {
+            throw new IllegalArgumentException("Invalid XPath : " + xPathExpression, e);
+        }
     }
 
-    /**
-     * @param xPathExpression XPath expression.
-     * @param namespaceContext Resolves XML namespace prefixes in the XPath expression
-     * @param valueMatcher Matcher to use at given XPath.
-     *                     May be null to specify that the XPath must exist but the value is irrelevant.
-     */
-    public HasXPath(String xPathExpression, NamespaceContext namespaceContext, Matcher<String> valueMatcher) {
-        this(xPathExpression, namespaceContext, valueMatcher, STRING);
+    public boolean matchesSafely(Node item) {
+        try {
+            String result = (String) compiledXPath.evaluate(item, XPathConstants.STRING);
+            if (result == null) {
+                return false;
+            } else if (valueMatcher == null) {
+                return !result.equals("");
+            } else {
+                return valueMatcher.matches(result);
+            }
+        } catch (XPathExpressionException e) {
+            return false;
+        }
     }
 
-    private HasXPath(String xPathExpression, NamespaceContext namespaceContext, Matcher<String> valueMatcher, QName mode) {
-        this.compiledXPath = compiledXPath(xPathExpression, namespaceContext);
-        this.xpathString = xPathExpression;
-        this.valueMatcher = valueMatcher;
-        this.evaluationMode = mode;
-    }
-
-    @Override
-    public boolean matchesSafely(Node item, Description mismatch) {
-        return evaluated(item, mismatch)
-               .and(NODE_EXISTS)
-               .matching(valueMatcher);
-    }
-
-    @Override
     public void describeTo(Description description) {
         description.appendText("an XML document with XPath ").appendText(xpathString);
         if (valueMatcher != null) {
             description.appendText(" ").appendDescriptionOf(valueMatcher);
         }
     }
-
-    private Condition<Object> evaluated(Node item, Description mismatch) {
-        try {
-            return matched(compiledXPath.evaluate(item, evaluationMode), mismatch);
-        } catch (XPathExpressionException e) {
-            mismatch.appendText(e.getMessage());
-        }
-        return notMatched();
-    }
-
-    private static Condition.Step<Object, String> nodeExists() {
-        return new Condition.Step<Object, String>() {
-            @Override
-            public Condition<String> apply(Object value, Description mismatch) {
-                if (value == null) {
-                    mismatch.appendText("xpath returned no results.");
-                    return notMatched();
-                }
-                return matched(String.valueOf(value), mismatch);
-            }
-        };
-    }
-
-    private static XPathExpression compiledXPath(String xPathExpression, NamespaceContext namespaceContext) {
-        try {
-            final XPath xPath = XPathFactory.newInstance().newXPath();
-            if (namespaceContext != null) {
-                xPath.setNamespaceContext(namespaceContext);
-            }
-            return xPath.compile(xPathExpression);
-        } catch (XPathExpressionException e) {
-            throw new IllegalArgumentException("Invalid XPath : " + xPathExpression, e);
-        }
-    }
-
-
-    /**
-     * Creates a matcher of {@link org.w3c.dom.Node}s that matches when the examined node has a value at the
-     * specified <code>xPath</code> that satisfies the specified <code>valueMatcher</code>.
-     * For example:
-     * <pre>assertThat(xml, hasXPath("/root/something[2]/cheese", equalTo("Cheddar")))</pre>
-     * 
-     * @param xPath
-     *     the target xpath
-     * @param valueMatcher
-     *     matcher for the value at the specified xpath
-     */
+    
+    @Factory
     public static Matcher<Node> hasXPath(String xPath, Matcher<String> valueMatcher) {
-        return hasXPath(xPath, NO_NAMESPACE_CONTEXT, valueMatcher);
+        return new HasXPath(xPath, valueMatcher);
     }
 
-    /**
-     * Creates a matcher of {@link org.w3c.dom.Node}s that matches when the examined node has a value at the
-     * specified <code>xPath</code>, within the specified <code>namespaceContext</code>, that satisfies
-     * the specified <code>valueMatcher</code>.
-     * For example:
-     * <pre>assertThat(xml, hasXPath("/root/something[2]/cheese", myNs, equalTo("Cheddar")))</pre>
-     * 
-     * @param xPath
-     *     the target xpath
-     * @param namespaceContext
-     *     the namespace for matching nodes
-     * @param valueMatcher
-     *     matcher for the value at the specified xpath
-     */
-    public static Matcher<Node> hasXPath(String xPath, NamespaceContext namespaceContext, Matcher<String> valueMatcher) {
-        return new HasXPath(xPath, namespaceContext, valueMatcher, STRING);
-    }
-
-    /**
-     * Creates a matcher of {@link org.w3c.dom.Node}s that matches when the examined node contains a node
-     * at the specified <code>xPath</code>, with any content.
-     * For example:
-     * <pre>assertThat(xml, hasXPath("/root/something[2]/cheese"))</pre>
-     * 
-     * @param xPath
-     *     the target xpath
-     */
+    @Factory
     public static Matcher<Node> hasXPath(String xPath) {
-        return hasXPath(xPath, NO_NAMESPACE_CONTEXT);
+        return hasXPath(xPath, null);
     }
 
-    /**
-     * Creates a matcher of {@link org.w3c.dom.Node}s that matches when the examined node contains a node
-     * at the specified <code>xPath</code> within the specified namespace context, with any content.
-     * For example:
-     * <pre>assertThat(xml, hasXPath("/root/something[2]/cheese", myNs))</pre>
-     * 
-     * @param xPath
-     *     the target xpath
-     * @param namespaceContext
-     *     the namespace for matching nodes
-     */
-    public static Matcher<Node> hasXPath(String xPath, NamespaceContext namespaceContext) {
-        return new HasXPath(xPath, namespaceContext, WITH_ANY_CONTENT, XPathConstants.NODE);
-    }
 }
diff --git a/hamcrest-library/src/test/java/org/hamcrest/beans/HasPropertyTest.java b/hamcrest-library/src/test/java/org/hamcrest/beans/HasPropertyTest.java
deleted file mode 100644
index 314797f..0000000
--- a/hamcrest-library/src/test/java/org/hamcrest/beans/HasPropertyTest.java
+++ /dev/null
@@ -1,48 +0,0 @@
-package org.hamcrest.beans;
-
-import org.hamcrest.Matcher;
-import org.junit.Test;
-
-import static org.hamcrest.AbstractMatcherTest.*;
-import static org.hamcrest.beans.HasProperty.hasProperty;
-
-/**
- * @author Iain McGinniss
- * @author Nat Pryce
- * @author Steve Freeman
- * @author Tom Denley
- * @since 1.1.0
- */
-public final class HasPropertyTest {
-
-    private final HasPropertyWithValueTest.BeanWithoutInfo bean = new HasPropertyWithValueTest.BeanWithoutInfo("a bean");
-
-    @Test public void
-    copesWithNullsAndUnknownTypes() {
-        Matcher<Object> matcher = hasProperty("irrelevant");
-        
-        assertNullSafe(matcher);
-        assertUnknownTypeSafe(matcher);
-    }
-
-    @Test public void
-    matchesWhenThePropertyExists() {
-        assertMatches(hasProperty("writeOnlyProperty"), bean);
-    }
-
-    @Test public void
-    doesNotMatchIfPropertyDoesNotExist() {
-        assertDoesNotMatch(hasProperty("aNonExistentProp"), bean);
-    }
-
-    @Test public void
-    describesItself() {
-        assertDescription("hasProperty(\"property\")", hasProperty("property"));
-    }
-
-    @Test public void
-    describesAMismatch() {
-        assertMismatchDescription("no \"aNonExistentProp\" in <[Person: a bean]>",
-                                  hasProperty("aNonExistentProp"), bean);
-    }
-}
diff --git a/hamcrest-library/src/test/java/org/hamcrest/beans/HasPropertyWithValueTest.java b/hamcrest-library/src/test/java/org/hamcrest/beans/HasPropertyWithValueTest.java
deleted file mode 100644
index eeaa113..0000000
--- a/hamcrest-library/src/test/java/org/hamcrest/beans/HasPropertyWithValueTest.java
+++ /dev/null
@@ -1,139 +0,0 @@
-package org.hamcrest.beans;
-
-import org.hamcrest.AbstractMatcherTest;
-import org.hamcrest.Description;
-import org.hamcrest.Matcher;
-import org.hamcrest.StringDescription;
-import org.hamcrest.core.IsEqual;
-
-import java.beans.IntrospectionException;
-import java.beans.PropertyDescriptor;
-import java.beans.SimpleBeanInfo;
-
-import static org.hamcrest.MatcherAssert.assertThat;
-import static org.hamcrest.beans.HasPropertyWithValue.hasProperty;
-import static org.hamcrest.core.IsAnything.anything;
-import static org.hamcrest.core.IsEqual.equalTo;
-
-/**
- * @author Iain McGinniss
- * @author Nat Pryce
- * @author Steve Freeman
- * @since 1.1.0
- */
-@SuppressWarnings("UnusedDeclaration")
-public class HasPropertyWithValueTest extends AbstractMatcherTest {
-  private final BeanWithoutInfo shouldMatch = new BeanWithoutInfo("is expected");
-  private final BeanWithoutInfo shouldNotMatch = new BeanWithoutInfo("not expected");
-
-  private final BeanWithInfo beanWithInfo = new BeanWithInfo("with info");
-
-  @Override
-  protected Matcher<?> createMatcher() {
-    return hasProperty("irrelevant", anything());
-  }
-
-  public void testMatchesInfolessBeanWithMatchedNamedProperty() {
-    assertMatches("with property", hasProperty("property", equalTo("is expected")), shouldMatch);
-    assertMismatchDescription("property 'property' was \"not expected\"", 
-                              hasProperty("property", equalTo("is expected")), shouldNotMatch);
-  }
-
-  public void testMatchesBeanWithInfoWithMatchedNamedProperty() {
-    assertMatches("with bean info", hasProperty("property", equalTo("with info")), beanWithInfo);
-    assertMismatchDescription("property 'property' was \"with info\"", 
-        hasProperty("property", equalTo("without info")), beanWithInfo);
-  }
-
-  public void testDoesNotMatchInfolessBeanWithoutMatchedNamedProperty() {
-    assertMismatchDescription("No property \"nonExistentProperty\"", 
-                              hasProperty("nonExistentProperty", anything()), shouldNotMatch);
-   }
-
-  public void testDoesNotMatchWriteOnlyProperty() {
-    assertMismatchDescription("property \"writeOnlyProperty\" is not readable",
-                              hasProperty("writeOnlyProperty", anything()), shouldNotMatch); 
-  }
-
-  public void testDescribeTo() {
-    assertDescription("hasProperty(\"property\", <true>)", hasProperty("property", equalTo(true)));
-  }
-
-  public void testMatchesPropertyAndValue() {
-    assertMatches("property with value", hasProperty( "property", anything()), beanWithInfo);
-  }
-  
-  public void testDoesNotWriteMismatchIfPropertyMatches() {
-    Description description = new StringDescription();
-    hasProperty( "property", anything()).describeMismatch(beanWithInfo, description);
-    assertEquals("Expected mismatch description", "", description.toString());
-  }
-
-  public void testDescribesMissingPropertyMismatch() {
-    assertMismatchDescription("No property \"honk\"", hasProperty( "honk", anything()), shouldNotMatch);
-  }
-
-  public void testCanAccessAnAnonymousInnerClass() {
-    class X implements IX {
-      @Override
-      public int getTest() {
-        return 1;
-      }
-    }
-
-    assertThat(new X(), HasPropertyWithValue.hasProperty("test", IsEqual.equalTo(1)));
-  }
-
-  interface IX {
-    int getTest();
-  }
-
-  public static class BeanWithoutInfo {
-    private String property;
-
-    public BeanWithoutInfo(String property) {
-      this.property = property;
-    }
-
-    public String getProperty() {
-      return property;
-    }
-
-    public void setProperty(String property) {
-      this.property = property;
-    }
-
-    public void setWriteOnlyProperty(@SuppressWarnings("unused") float property) {
-    }
-
-    @Override
-    public String toString() {
-      return "[Person: " + property + "]";
-    }
-  }
-
-  public static class BeanWithInfo {
-    private final String propertyValue;
-
-    public BeanWithInfo(String propertyValue) {
-      this.propertyValue = propertyValue;
-    }
-
-    public String property() {
-      return propertyValue;
-    }
-  }
-
-  public static class BeanWithInfoBeanInfo extends SimpleBeanInfo {
-    @Override
-    public PropertyDescriptor[] getPropertyDescriptors() {
-      try {
-        return new PropertyDescriptor[] { 
-            new PropertyDescriptor("property", BeanWithInfo.class, "property", null) 
-          };
-      } catch (IntrospectionException e) {
-        throw new RuntimeException("Introspection exception: " + e.getMessage());
-      }
-    }
-  }
-}
diff --git a/hamcrest-library/src/test/java/org/hamcrest/beans/SamePropertyValuesAsTest.java b/hamcrest-library/src/test/java/org/hamcrest/beans/SamePropertyValuesAsTest.java
deleted file mode 100644
index 173457f..0000000
--- a/hamcrest-library/src/test/java/org/hamcrest/beans/SamePropertyValuesAsTest.java
+++ /dev/null
@@ -1,98 +0,0 @@
-package org.hamcrest.beans;
-
-import org.hamcrest.AbstractMatcherTest;
-import org.hamcrest.Matcher;
-
-import static org.hamcrest.beans.SamePropertyValuesAs.samePropertyValuesAs;
-
-@SuppressWarnings("UnusedDeclaration")
-public class SamePropertyValuesAsTest extends AbstractMatcherTest {
-  private static final Value aValue = new Value("expected");
-  private static final ExampleBean expectedBean = new ExampleBean("same", 1, aValue);
-  private static final ExampleBean actualBean = new ExampleBean("same", 1, aValue);
-  
-  
-  @Override
-  protected Matcher<?> createMatcher() {
-    return samePropertyValuesAs(expectedBean);
-  }
-
-  public void testReportsMatchWhenAllPropertiesMatch() {
-    assertMatches("matched properties", samePropertyValuesAs(expectedBean), actualBean);
-  }
-  
-  public void testReportsMismatchWhenActualTypeIsNotAssignableToExpectedType() {
-    assertMismatchDescription("is incompatible type: ExampleBean", 
-                              samePropertyValuesAs((Object)aValue), actualBean);
-  }
-
-  public void testReportsMismatchOnFirstPropertyDifference() {
-    assertMismatchDescription("string was \"different\"", 
-        samePropertyValuesAs(expectedBean), new ExampleBean("different", 1, aValue));
-    assertMismatchDescription("int was <2>", 
-        samePropertyValuesAs(expectedBean), new ExampleBean("same", 2, aValue));
-    assertMismatchDescription("value was <Value other>", 
-        samePropertyValuesAs(expectedBean), new ExampleBean("same", 1, new Value("other")));
-  }
-
-  public void testMatchesBeansWithInheritanceButNoExtraProperties() {
-    assertMatches("sub type with same properties", 
-        samePropertyValuesAs(expectedBean), new SubBeanWithNoExtraProperties("same", 1, aValue));
-  }
-
-  public void testRejectsSubTypeThatHasExtraProperties() {
-    assertMismatchDescription("has extra properties called [extra]", 
-        samePropertyValuesAs(expectedBean), new SubBeanWithExtraProperty("same", 1, aValue));
-  }
-  
-  public void testDescribesItself() {
-    assertDescription("same property values as ExampleBean [int: <1>, string: \"same\", value: <Value expected>]", samePropertyValuesAs(expectedBean));
-  }
-
-  public static class Value {
-    public Value(Object value) {
-      this.value = value;
-    }
-
-    public final Object value;
-    @Override
-    public String toString() {
-      return "Value " + value;
-    }
-  }
-  
-  public static class ExampleBean {
-    private String stringProperty;
-    private int intProperty;
-    private Value valueProperty;
-
-    public ExampleBean(String stringProperty, int intProperty, Value valueProperty) {
-      this.stringProperty = stringProperty;
-      this.intProperty = intProperty;
-      this.valueProperty = valueProperty;
-    }
-    
-    public String getString() {
-      return stringProperty;
-    }
-    public int getInt() {
-      return intProperty;
-    }
-    public Value getValue() {
-      return valueProperty;
-    }
-  }
-  
-  public static class SubBeanWithNoExtraProperties extends ExampleBean {
-    public SubBeanWithNoExtraProperties(String stringProperty, int intProperty, Value valueProperty) {
-      super(stringProperty, intProperty, valueProperty);
-    }
-  }
-  
-  public static class SubBeanWithExtraProperty extends ExampleBean {
-    public SubBeanWithExtraProperty(String stringProperty, int intProperty, Value valueProperty) {
-      super(stringProperty, intProperty, valueProperty);
-    }
-    public String getExtra() { return "extra"; }
-  }
-}
diff --git a/hamcrest-library/src/test/java/org/hamcrest/collection/IsArrayContainingInAnyOrderTest.java b/hamcrest-library/src/test/java/org/hamcrest/collection/IsArrayContainingInAnyOrderTest.java
deleted file mode 100644
index d4dc270..0000000
--- a/hamcrest-library/src/test/java/org/hamcrest/collection/IsArrayContainingInAnyOrderTest.java
+++ /dev/null
@@ -1,43 +0,0 @@
-package org.hamcrest.collection;
-
-import org.hamcrest.AbstractMatcherTest;
-import org.hamcrest.Matcher;
-
-import static org.hamcrest.collection.IsArrayContainingInAnyOrder.arrayContainingInAnyOrder;
-import static org.hamcrest.core.IsEqual.equalTo;
-
-public class IsArrayContainingInAnyOrderTest extends AbstractMatcherTest {
-
-    @SuppressWarnings("unchecked")
-    @Override
-    protected Matcher<?> createMatcher() {
-        return arrayContainingInAnyOrder(equalTo(1), equalTo(2));
-    }
-
-    @SuppressWarnings("unchecked")
-    public void testHasAReadableDescription() {
-        assertDescription("[<1>, <2>] in any order", arrayContainingInAnyOrder(equalTo(1), equalTo(2)));
-        assertDescription("[<1>, <2>] in any order", arrayContainingInAnyOrder(1, 2));
-    }
-    
-    public void testMatchesItemsInAnyOrder() {
-      assertMatches("in order", arrayContainingInAnyOrder(1, 2, 3), new Integer[] {1, 2, 3});
-      assertMatches("out of order", arrayContainingInAnyOrder(1, 2, 3), new Integer[] {3, 2, 1});
-      assertMatches("single", arrayContainingInAnyOrder(1), new Integer[] {1});
-    }
-
-    @SuppressWarnings("unchecked")
-    public void testAppliesMatchersInAnyOrder() {
-      assertMatches("in order", arrayContainingInAnyOrder(equalTo(1), equalTo(2), equalTo(3)), new Integer[] {1, 2, 3});
-      assertMatches("out of order", arrayContainingInAnyOrder(equalTo(1), equalTo(2), equalTo(3)), new Integer[] {3, 2, 1});
-      assertMatches("single", arrayContainingInAnyOrder(equalTo(1)), new Integer[] {1});
-    }
-
-    public void testMismatchesItemsInAnyOrder() {
-      Matcher<Integer[]> matcher = arrayContainingInAnyOrder(1, 2, 3);
-      assertMismatchDescription("was null", matcher, null);
-      assertMismatchDescription("no item matches: <1>, <2>, <3> in []", matcher, new Integer[] {});
-      assertMismatchDescription("no item matches: <2>, <3> in [<1>]", matcher, new Integer[] {1});
-      assertMismatchDescription("not matched: <4>", matcher, new Integer[] {4,3,2,1});
-    }
-}
diff --git a/hamcrest-library/src/test/java/org/hamcrest/collection/IsArrayContainingInOrderTest.java b/hamcrest-library/src/test/java/org/hamcrest/collection/IsArrayContainingInOrderTest.java
deleted file mode 100644
index ab1d821..0000000
--- a/hamcrest-library/src/test/java/org/hamcrest/collection/IsArrayContainingInOrderTest.java
+++ /dev/null
@@ -1,45 +0,0 @@
-package org.hamcrest.collection;
-
-import org.hamcrest.AbstractMatcherTest;
-import org.hamcrest.Matcher;
-
-import static org.hamcrest.collection.IsArrayContainingInOrder.arrayContaining;
-import static org.hamcrest.core.IsEqual.equalTo;
-
-public class IsArrayContainingInOrderTest extends AbstractMatcherTest {
-
-    @SuppressWarnings("unchecked")
-    @Override
-    protected Matcher<?> createMatcher() {
-        return arrayContaining(equalTo(1), equalTo(2));
-    }
-
-    @SuppressWarnings("unchecked")
-    public void testHasAReadableDescription() {
-        assertDescription("[<1>, <2>]", arrayContaining(equalTo(1), equalTo(2)));
-    }
-    
-    public void testMatchesItemsInOrder() {
-      assertMatches("in order", arrayContaining(1, 2, 3), new Integer[] {1, 2, 3});
-      assertMatches("single", arrayContaining(1), new Integer[] {1});
-    }
-
-    @SuppressWarnings("unchecked")
-    public void testAppliesMatchersInOrder() {
-      assertMatches("in order", arrayContaining(equalTo(1), equalTo(2), equalTo(3)), new Integer[] {1, 2, 3});
-      assertMatches("single", arrayContaining(equalTo(1)), new Integer[] {1});
-    }
-    
-    public void testMismatchesItemsInOrder() {
-      Matcher<Integer[]> matcher = arrayContaining(1, 2, 3);
-      assertMismatchDescription("was null", matcher, null);
-      assertMismatchDescription("no item was <1>", matcher, new Integer[] {});
-      assertMismatchDescription("no item was <2>", matcher, new Integer[] {1});
-      assertMismatchDescription("item 0: was <4>", matcher, new Integer[] {4,3,2,1});
-      assertMismatchDescription("item 2: was <4>", matcher, new Integer[] {1,2, 4});
-    }
-
-    public void testCanHandleNullValuesInAnArray() {
-      assertMatches("with nulls", arrayContaining(null, null), new Object[]{null, null});
-    }
-}
diff --git a/hamcrest-library/src/test/java/org/hamcrest/collection/IsArrayContainingTest.java b/hamcrest-library/src/test/java/org/hamcrest/collection/IsArrayContainingTest.java
deleted file mode 100644
index 275984c..0000000
--- a/hamcrest-library/src/test/java/org/hamcrest/collection/IsArrayContainingTest.java
+++ /dev/null
@@ -1,72 +0,0 @@
-package org.hamcrest.collection;
-
-import org.hamcrest.AbstractMatcherTest;
-import org.hamcrest.Matcher;
-
-import static org.hamcrest.collection.IsArrayContaining.hasItemInArray;
-
-public class IsArrayContainingTest extends AbstractMatcherTest {
-
-    @Override
-    protected Matcher<?> createMatcher() {
-        return hasItemInArray("irrelevant");
-    }
-
-    public void testMatchesAnArrayThatContainsAnElementMatchingTheGivenMatcher() {
-        assertMatches("should matches array that contains 'a'",
-                hasItemInArray("a"), new String[]{"a", "b", "c"});
-    }
-
-    public void testDoesNotMatchAnArrayThatDoesntContainAnElementMatchingTheGivenMatcher() {
-        assertDoesNotMatch("should not matches array that doesn't contain 'a'",
-                hasItemInArray("a"), new String[]{"b", "c"});
-        assertDoesNotMatch("should not matches empty array",
-                hasItemInArray("a"), new String[0]);
-    }
-
-    public void testDoesNotMatchNull() {
-        assertDoesNotMatch("should not matches null",
-                hasItemInArray("a"), null);
-    }
-
-    public void testHasAReadableDescription() {
-        assertDescription("an array containing \"a\"", hasItemInArray("a"));
-    }
-
-    // Remaining code no longer compiles, thanks to generics. I think that's a good thing, but
-    // I still need to investigate how this behaves with code that doesn't use generics.
-    // I expect ClassCastExceptions will be thrown.
-    // -Joe.
-
-//    public void testDoesNotMatchObjectThatIsNotAnArray() {
-//        assertDoesNotMatch("should not matches empty list",
-//                arrayContaining("a"), "not a collection");
-//    }
-
-//    public void testMatchesPrimitiveArrayElements() {
-//        assertMatches("boolean", arrayContaining(true), new boolean[]{true, false});
-//        assertDoesNotMatch("boolean", arrayContaining(false), new boolean[]{false});
-//
-//        assertMatches("byte", arrayContaining((byte) 1), new byte[]{1, 2, 3});
-//        assertDoesNotMatch("byte", arrayContaining((byte) 0), new byte[]{1, 2, 3});
-//
-//        assertMatches("char", arrayContaining('a'), new char[]{'a', 'b', 'c'});
-//        assertDoesNotMatch("char", arrayContaining('z'), new char[]{'a', 'b', 'c'});
-//
-//        assertMatches("short", arrayContaining((short) 1), new short[]{1, 2, 3});
-//        assertDoesNotMatch("short", arrayContaining((short) 0), new short[]{1, 2, 3});
-//
-//        assertMatches("int", arrayContaining(1), new int[]{1, 2, 3});
-//        assertDoesNotMatch("int", arrayContaining(0), new int[]{1, 2, 3});
-//
-//        assertMatches("long", arrayContaining(1L), new long[]{1, 2, 3});
-//        assertDoesNotMatch("long", arrayContaining(0L), new long[]{1, 2, 3});
-//
-//        assertMatches("float", arrayContaining(1f), new float[]{1f, 2f, 3f});
-//        assertDoesNotMatch("float", arrayContaining(0f), new float[]{1f, 2f, 3f});
-//
-//        assertMatches("double", arrayContaining(1.0), new double[]{1.0, 2.0, 3.0});
-//        assertDoesNotMatch("double", arrayContaining(0.0), new double[]{1.0, 2.0, 3.0});
-//    }
-
-}
diff --git a/hamcrest-library/src/test/java/org/hamcrest/collection/IsArrayTest.java b/hamcrest-library/src/test/java/org/hamcrest/collection/IsArrayTest.java
deleted file mode 100644
index 4135d9f..0000000
--- a/hamcrest-library/src/test/java/org/hamcrest/collection/IsArrayTest.java
+++ /dev/null
@@ -1,59 +0,0 @@
-package org.hamcrest.collection;
-
-import org.hamcrest.AbstractMatcherTest;
-import org.hamcrest.BaseMatcher;
-import org.hamcrest.Description;
-import org.hamcrest.Matcher;
-
-import static org.hamcrest.collection.IsArray.array;
-import static org.hamcrest.core.IsEqual.equalTo;
-
-@SuppressWarnings("unchecked")
-public class IsArrayTest extends AbstractMatcherTest {
-
-    @Override
-    protected Matcher<?> createMatcher() {
-        return array(equalTo("irrelevant"));
-    }
-
-    public void testMatchesAnArrayThatMatchesAllTheElementMatchers() {
-        assertMatches("should match array with matching elements",
-                array(equalTo("a"), equalTo("b"), equalTo("c")), new String[]{"a", "b", "c"});
-    }
-    
-    public void testDoesNotMatchAnArrayWhenElementsDoNotMatch() {
-        assertDoesNotMatch("should not match array with different elements",
-                array(equalTo("a"), equalTo("b")), new String[]{"b", "c"});
-    }
-    
-    public void testDoesNotMatchAnArrayOfDifferentSize() {
-        assertDoesNotMatch("should not match larger array",
-                           array(equalTo("a"), equalTo("b")), new String[]{"a", "b", "c"});
-        assertDoesNotMatch("should not match smaller array",
-                           array(equalTo("a"), equalTo("b")), new String[]{"a"});
-    }
-    
-    public void testDoesNotMatchNull() {
-        assertDoesNotMatch("should not match null",
-                array(equalTo("a")), null);
-    }
-    
-    public void testHasAReadableDescription() {
-        assertDescription("[\"a\", \"b\"]", array(equalTo("a"), equalTo("b")));
-    }
-    
-    public void testHasAReadableMismatchDescriptionUsing() {
-        assertMismatchDescription("element <0> was \"c\"", array(equalTo("a"), equalTo("b")), new String[]{"c", "b"});
-    }
-    
-    public void testHasAReadableMismatchDescriptionUsingCustomMatchers() {
-        final BaseMatcher<String> m = new BaseMatcher<String>() {
-            @Override public boolean matches(Object item) { return false; }
-            @Override public void describeTo(Description description) { description.appendText("c"); }
-            @Override public void describeMismatch(Object item, Description description) {
-                description.appendText("didn't match");
-            }
-        };
-        assertMismatchDescription("element <0> didn't match", array(m, equalTo("b")), new String[]{"c", "b"});
-    }
-}
diff --git a/hamcrest-library/src/test/java/org/hamcrest/collection/IsArrayWithSizeTest.java b/hamcrest-library/src/test/java/org/hamcrest/collection/IsArrayWithSizeTest.java
deleted file mode 100644
index 18f607e..0000000
--- a/hamcrest-library/src/test/java/org/hamcrest/collection/IsArrayWithSizeTest.java
+++ /dev/null
@@ -1,36 +0,0 @@
-package org.hamcrest.collection;
-
-import org.hamcrest.AbstractMatcherTest;
-import org.hamcrest.Matcher;
-
-import static org.hamcrest.collection.IsArrayWithSize.arrayWithSize;
-import static org.hamcrest.collection.IsArrayWithSize.emptyArray;
-import static org.hamcrest.core.IsEqual.equalTo;
-
-public class IsArrayWithSizeTest extends AbstractMatcherTest {
-
-    @Override
-    protected Matcher<?> createMatcher() {
-        return arrayWithSize(equalTo(2));
-    }
-
-    public void testMatchesWhenSizeIsCorrect() {
-        assertMatches("correct size", arrayWithSize(equalTo(3)), new Object[] {1, 2, 3});
-        assertDoesNotMatch("incorrect size", arrayWithSize(equalTo(2)), new Object[] {1, 2, 3});
-    }
-
-    public void testProvidesConvenientShortcutForArrayWithSizeEqualTo() {
-        assertMatches("correct size", arrayWithSize(3), new Object[] {1, 2, 3});
-        assertDoesNotMatch("incorrect size", arrayWithSize(2), new Object[] {1, 2, 3});
-    }
-
-    public void testEmptyArray() {
-        assertMatches("correct size", emptyArray(), new Object[] {});
-        assertDoesNotMatch("incorrect size", emptyArray(), new Object[] {1});
-    }
-
-    public void testHasAReadableDescription() {
-        assertDescription("an array with size <3>", arrayWithSize(equalTo(3)));
-        assertDescription("an empty array", emptyArray());
-    }
-}
diff --git a/hamcrest-library/src/test/java/org/hamcrest/collection/IsCollectionWithSizeTest.java b/hamcrest-library/src/test/java/org/hamcrest/collection/IsCollectionWithSizeTest.java
deleted file mode 100644
index b04a0c5..0000000
--- a/hamcrest-library/src/test/java/org/hamcrest/collection/IsCollectionWithSizeTest.java
+++ /dev/null
@@ -1,77 +0,0 @@
-package org.hamcrest.collection;
-
-import org.hamcrest.AbstractMatcherTest;
-import org.hamcrest.Matcher;
-import org.hamcrest.MatcherAssert;
-
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.List;
-
-import static java.util.Arrays.asList;
-import static org.hamcrest.collection.IsCollectionWithSize.hasSize;
-import static org.hamcrest.core.IsEqual.equalTo;
-
-public class IsCollectionWithSizeTest extends AbstractMatcherTest {
-
-    @Override
-    protected Matcher<?> createMatcher() {
-        return hasSize(7);
-    }
-
-    public void testMatchesWhenSizeIsCorrect() {
-        assertMatches("correct size", hasSize(equalTo(2)), asList(null, null));
-        assertMismatchDescription("collection size was <3>", hasSize(equalTo(2)), asList(null, null, null));
-    }
-
-    public void testMatchesCollectionWhenSizeIsCorrectUsingObjectElementType() {
-        Collection<Object> list = asList(null, null);
-        assertMatches("correct size", hasSize(equalTo(2)), list);
-        assertMismatchDescription("collection size was <2>", hasSize(equalTo(3)), list);
-    }
-
-    public void testMatchesCollectionWhenSizeIsCorrectUsingStringElementType() {
-        Collection<String> list = asList("a", "b");
-        assertMatches("correct size", hasSize(equalTo(2)), list);
-        assertMismatchDescription("collection size was <2>", hasSize(equalTo(3)), list);
-    }
-
-    public void testMatchesCollectionWhenSizeIsCorrectUsingWildcardElementType() {
-        Collection<?> list = asList("a", "b");
-        assertMatches("correct size", hasSize(equalTo(2)), list);
-        assertMismatchDescription("collection size was <2>", hasSize(equalTo(3)), list);
-    }
-
-    public void testMatchesListWhenSizeIsCorrectUsingObjectElementType() {
-        List<Object> list = asList(null, null);
-        assertMatches("correct size", hasSize(equalTo(2)), list);
-        assertMismatchDescription("collection size was <2>", hasSize(equalTo(3)), list);
-    }
-
-    public void testMatchesListWhenSizeIsCorrectUsingStringElementType() {
-        List<String> list = asList("a", "b");
-        assertMatches("correct size", hasSize(equalTo(2)), list);
-        assertMismatchDescription("collection size was <2>", hasSize(equalTo(3)), list);
-    }
-
-    public void testMatchesListWhenSizeIsCorrectUsingWildcardElementType() {
-        List<?> list = asList("a", "b");
-        assertMatches("correct size", hasSize(equalTo(2)), list);
-        assertMismatchDescription("collection size was <2>", hasSize(equalTo(3)), list);
-    }
-
-    public void testProvidesConvenientShortcutForHasSizeEqualTo() {
-        assertMatches("correct size", hasSize(2), asList(null, null));
-        assertMismatchDescription("collection size was <3>", hasSize(2), asList(null, null, null));
-    }
-
-    public void testHasAReadableDescription() {
-        assertDescription("a collection with size <3>", hasSize(equalTo(3)));
-    }
-    
-    public void testCompilesWithATypedCollection() {
-      // To prove Issue 43
-      ArrayList<String> arrayList = new ArrayList<String>();
-      MatcherAssert.assertThat(arrayList, hasSize(0));
-    }
-}
diff --git a/hamcrest-library/src/test/java/org/hamcrest/collection/IsEmptyCollectionTest.java b/hamcrest-library/src/test/java/org/hamcrest/collection/IsEmptyCollectionTest.java
deleted file mode 100644
index ea875e8..0000000
--- a/hamcrest-library/src/test/java/org/hamcrest/collection/IsEmptyCollectionTest.java
+++ /dev/null
@@ -1,45 +0,0 @@
-package org.hamcrest.collection;
-
-import org.hamcrest.AbstractMatcherTest;
-import org.hamcrest.Matcher;
-
-import java.util.ArrayList;
-import java.util.Collection;
-
-import static java.util.Arrays.asList;
-import static org.hamcrest.collection.IsEmptyCollection.empty;
-import static org.hamcrest.core.Is.is;
-
-public class IsEmptyCollectionTest extends AbstractMatcherTest {
-
-    @Override
-    protected Matcher<Collection<?>> createMatcher() {
-        return empty();
-    }
-
-    public void testMatchesAnEmptyCollection() {
-        assertMatches("empty collection", createMatcher(), emptyCollection());
-    }
-
-    public void testDoesNotMatchACollectionWithAnItem() {
-        assertMismatchDescription("<[one, three]>", is(createMatcher()), collectionOfValues());
-    }
-
-    public void testHasAReadableDescription() {
-        assertDescription("an empty collection", createMatcher());
-    }
-
-    public void testCompiles() {
-        needs(IsEmptyCollection.emptyCollectionOf(String.class));
-    }
-
-    private void needs(@SuppressWarnings("unused") Matcher<Collection<String>> bar) { }
-    
-    private static Collection<String> collectionOfValues() {
-        return new ArrayList<String>(asList("one", "three"));
-    }
-
-    private static Collection<Integer> emptyCollection() {
-        return new ArrayList<Integer>();
-    }
-}
diff --git a/hamcrest-library/src/test/java/org/hamcrest/collection/IsEmptyIterableTest.java b/hamcrest-library/src/test/java/org/hamcrest/collection/IsEmptyIterableTest.java
deleted file mode 100644
index 600b576..0000000
--- a/hamcrest-library/src/test/java/org/hamcrest/collection/IsEmptyIterableTest.java
+++ /dev/null
@@ -1,44 +0,0 @@
-package org.hamcrest.collection;
-
-import org.hamcrest.AbstractMatcherTest;
-import org.hamcrest.Matcher;
-
-import java.util.ArrayList;
-import java.util.Collection;
-
-import static java.util.Arrays.asList;
-import static org.hamcrest.collection.IsEmptyIterable.emptyIterable;
-
-public class IsEmptyIterableTest extends AbstractMatcherTest {
-
-    @Override
-    protected Matcher<Iterable<?>> createMatcher() {
-        return emptyIterable();
-    }
-
-    public void testMatchesAnEmptyIterable() {
-        assertMatches("empty iterable", createMatcher(), emptyCollection());
-    }
-
-    public void testDoesNotMatchAnIterableWithItems() {
-        assertDoesNotMatch("iterable with an item", createMatcher(), collectionOfValues());
-    }
-
-    public void testHasAReadableDescription() {
-        assertDescription("an empty iterable", createMatcher());
-    }
-
-    public void testCompiles() {
-        needs(IsEmptyIterable.emptyIterableOf(String.class));
-    }
-
-    private void needs(@SuppressWarnings("unused") Matcher<Iterable<String>> bar) { }
-
-    private static Collection<String> collectionOfValues() {
-        return new ArrayList<String>(asList("one", "three"));
-    }
-
-    private static Collection<Integer> emptyCollection() {
-        return new ArrayList<Integer>();
-    }
-}
diff --git a/hamcrest-library/src/test/java/org/hamcrest/collection/IsInTest.java b/hamcrest-library/src/test/java/org/hamcrest/collection/IsInTest.java
deleted file mode 100644
index e9fcbdc..0000000
--- a/hamcrest-library/src/test/java/org/hamcrest/collection/IsInTest.java
+++ /dev/null
@@ -1,44 +0,0 @@
-package org.hamcrest.collection;
-
-import org.hamcrest.AbstractMatcherTest;
-import org.hamcrest.Matcher;
-import org.hamcrest.StringDescription;
-
-import java.util.Arrays;
-import java.util.Collection;
-
-public class IsInTest extends AbstractMatcherTest {
-    String[] elements = {"a", "b", "c"};
-
-    @Override
-    protected Matcher<?> createMatcher() {
-        return new IsIn<String>(elements);
-    }
-
-    public void testReturnsTrueIfArgumentIsInCollection() {
-        Collection<String> collection = Arrays.asList(elements);
-        Matcher<String> isIn = new IsIn<String>(collection);
-        
-        assertMatches("a", isIn, "a");
-        assertMatches("b", isIn, "b");
-        assertMatches("c", isIn, "c");
-        assertDoesNotMatch("d", isIn, "d");
-    }
-    
-    public void testReturnsTrueIfArgumentIsInArray() {
-        Matcher<String> isIn = new IsIn<String>(elements);
-        
-        assertMatches("a", isIn, "a");
-        assertMatches("b", isIn, "b");
-        assertMatches("c", isIn, "c");
-        assertDoesNotMatch("d", isIn, "d");
-    }
-    
-    public void testHasReadableDescription() {
-        Matcher<String> isIn = new IsIn<String>(elements);
-        
-        assertEquals("description", 
-            "one of {\"a\", \"b\", \"c\"}", 
-            StringDescription.toString(isIn));
-    }
-}
diff --git a/hamcrest-library/src/test/java/org/hamcrest/collection/IsIterableContainingInAnyOrderTest.java b/hamcrest-library/src/test/java/org/hamcrest/collection/IsIterableContainingInAnyOrderTest.java
deleted file mode 100644
index 091c347..0000000
--- a/hamcrest-library/src/test/java/org/hamcrest/collection/IsIterableContainingInAnyOrderTest.java
+++ /dev/null
@@ -1,54 +0,0 @@
-package org.hamcrest.collection;
-
-import org.hamcrest.AbstractMatcherTest;
-import org.hamcrest.Matcher;
-import org.hamcrest.collection.IsIterableContainingInOrderTest.WithValue;
-
-import java.util.Collections;
-
-import static java.util.Arrays.asList;
-import static org.hamcrest.collection.IsIterableContainingInAnyOrder.containsInAnyOrder;
-import static org.hamcrest.collection.IsIterableContainingInOrderTest.make;
-import static org.hamcrest.collection.IsIterableContainingInOrderTest.value;
-
-public class IsIterableContainingInAnyOrderTest extends AbstractMatcherTest {
-
-    @Override
-    protected Matcher<?> createMatcher() {
-        return containsInAnyOrder(1, 2);
-    }   
-
-    public void testMatchesSingleItemIterable() {
-      assertMatches("single item", containsInAnyOrder(1), asList(1));
-    }
-
-    public void testDoesNotMatchEmpty() {
-        assertMismatchDescription("no item matches: <1>, <2> in []", containsInAnyOrder(1, 2), Collections.<Integer>emptyList());
-    }
-    
-    public void testMatchesIterableOutOfOrder() {
-        assertMatches("Out of order", containsInAnyOrder(1, 2), asList(2, 1));
-    }
-    
-    public void testMatchesIterableInOrder() {
-        assertMatches("In order", containsInAnyOrder(1, 2), asList(1, 2));
-    }
-    
-    public void testDoesNotMatchIfOneOfMultipleElementsMismatches() {
-        assertMismatchDescription("not matched: <4>", containsInAnyOrder(1, 2, 3), asList(1, 2, 4));
-    }
-
-    @SuppressWarnings("unchecked")
-    public void testDoesNotMatchIfThereAreMoreElementsThanMatchers() {
-        final Matcher<Iterable<? extends WithValue>> helpTheCompilerOut = containsInAnyOrder(value(1), value(3));
-        assertMismatchDescription("not matched: <WithValue 2>", helpTheCompilerOut, asList(make(1), make(2), make(3)));
-    }
-    
-    public void testDoesNotMatchIfThereAreMoreMatchersThanElements() {
-        assertMismatchDescription("no item matches: <4> in [<1>, <2>, <3>]", containsInAnyOrder(1, 2, 3, 4), asList(1, 2, 3));
-    }
-
-    public void testHasAReadableDescription() {
-        assertDescription("iterable with items [<1>, <2>] in any order", containsInAnyOrder(1, 2));
-    }
-}
diff --git a/hamcrest-library/src/test/java/org/hamcrest/collection/IsIterableContainingInOrderTest.java b/hamcrest-library/src/test/java/org/hamcrest/collection/IsIterableContainingInOrderTest.java
deleted file mode 100644
index 8cb1bf8..0000000
--- a/hamcrest-library/src/test/java/org/hamcrest/collection/IsIterableContainingInOrderTest.java
+++ /dev/null
@@ -1,77 +0,0 @@
-package org.hamcrest.collection;
-
-import org.hamcrest.AbstractMatcherTest;
-import org.hamcrest.FeatureMatcher;
-import org.hamcrest.Matcher;
-
-import java.util.ArrayList;
-import java.util.List;
-
-import static java.util.Arrays.asList;
-import static org.hamcrest.collection.IsIterableContainingInOrder.contains;
-import static org.hamcrest.core.IsEqual.equalTo;
-
-@SuppressWarnings("unchecked")
-public class IsIterableContainingInOrderTest extends AbstractMatcherTest {
-    // temporary hack until the Java type system works
-    private final Matcher<Iterable<? extends WithValue>> contains123 = contains(value(1), value(2), value(3));
-
-    @Override
-    protected Matcher<?> createMatcher() {
-        return contains(1, 2);
-    }
-
-    public void testMatchingSingleItemIterable() throws Exception {
-        assertMatches("Single item iterable", contains(1), asList(1));
-    }
-
-    public void testMatchingMultipleItemIterable() throws Exception {
-        assertMatches("Multiple item iterable", contains(1, 2, 3), asList(1, 2, 3));
-    }
-
-    public void testDoesNotMatchWithMoreElementsThanExpected() throws Exception {
-        assertMismatchDescription("not matched: <4>", contains(1, 2, 3), asList(1, 2, 3, 4));
-    }
-
-    public void testDoesNotMatchWithFewerElementsThanExpected() throws Exception {
-        List<WithValue> valueList = asList(make(1), make(2));
-        assertMismatchDescription("no item was value with <3>", contains123, valueList);
-    }
-
-    public void testDoesNotMatchIfSingleItemMismatches() throws Exception {
-        assertMismatchDescription("item 0: value was <3>", contains(value(4)), asList(make(3)));
-    }
-
-    public void testDoesNotMatchIfOneOfMultipleItemsMismatch() throws Exception {
-        assertMismatchDescription("item 2: value was <4>", contains123, asList(make(1), make(2), make(4)));
-    }
-
-    public void testDoesNotMatchEmptyIterable() throws Exception {
-        assertMismatchDescription("no item was value with <4>", contains(value(4)), new ArrayList<WithValue>());
-    }
-
-    public void testHasAReadableDescription() {
-        assertDescription("iterable containing [<1>, <2>]", contains(1, 2));
-    }
-    
-    public void testCanHandleNullMatchers() {
-    	assertMatches(contains(null, null), asList(null, null));
-    }
-
-    public static class WithValue {
-      private final int value;
-      public WithValue(int value) { this.value = value; }
-      public int getValue() { return value; }
-      @Override public String toString() { return "WithValue " + value; }
-    }
-
-    public static WithValue make(int value) {
-      return new WithValue(value);
-    }
-
-    public static Matcher<WithValue> value(int value) {
-      return new FeatureMatcher<WithValue, Integer>(equalTo(value), "value with", "value") {
-        @Override protected Integer featureValueOf(WithValue actual) { return actual.getValue(); }
-      };
-    }
-}
diff --git a/hamcrest-library/src/test/java/org/hamcrest/collection/IsIterableContainingInRelativeOrderTest.java b/hamcrest-library/src/test/java/org/hamcrest/collection/IsIterableContainingInRelativeOrderTest.java
deleted file mode 100644
index 8192c8b..0000000
--- a/hamcrest-library/src/test/java/org/hamcrest/collection/IsIterableContainingInRelativeOrderTest.java
+++ /dev/null
@@ -1,93 +0,0 @@
-package org.hamcrest.collection;
-
-import org.hamcrest.AbstractMatcherTest;
-import org.hamcrest.FeatureMatcher;
-import org.hamcrest.Matcher;
-
-import java.util.ArrayList;
-import java.util.List;
-
-import static java.util.Arrays.asList;
-import static org.hamcrest.collection.IsIterableContainingInRelativeOrder.containsInRelativeOrder;
-import static org.hamcrest.core.IsEqual.equalTo;
-
-@SuppressWarnings("unchecked")
-public class IsIterableContainingInRelativeOrderTest extends AbstractMatcherTest {
-    // temporary hack until the Java type system works
-    private final Matcher<Iterable<? extends WithValue>> contains123 = containsInRelativeOrder(value(1), value(2), value(3));
-
-    @Override
-    protected Matcher<?> createMatcher() {
-        return containsInRelativeOrder(1, 2);
-    }
-
-    public void testMatchingSingleItemIterable() throws Exception {
-        assertMatches("Single item iterable", containsInRelativeOrder(1), asList(1));
-    }
-
-    public void testMatchingMultipleItemIterable() throws Exception {
-        assertMatches("Multiple item iterable", containsInRelativeOrder(1, 2, 3), asList(1, 2, 3));
-    }
-
-    public void testMatchesWithMoreElementsThanExpectedAtBeginning() throws Exception {
-        assertMatches("More elements at beginning", containsInRelativeOrder(2, 3, 4), asList(1, 2, 3, 4));
-    }
-
-    public void testMatchesWithMoreElementsThanExpectedAtEnd() throws Exception {
-        assertMatches("More elements at end", containsInRelativeOrder(1, 2, 3), asList(1, 2, 3, 4));
-    }
-
-    public void testMatchesWithMoreElementsThanExpectedInBetween() throws Exception {
-        assertMatches("More elements in between", containsInRelativeOrder(1, 3), asList(1, 2, 3));
-    }
-
-    public void testMatchesSubSection() throws Exception {
-        assertMatches("Sub section of iterable", containsInRelativeOrder(2, 3), asList(1, 2, 3, 4));
-    }
-
-    public void testMatchesWithSingleGapAndNotFirstOrLast() throws Exception {
-        assertMatches("Sub section with single gaps without a first or last match", containsInRelativeOrder(2, 4), asList(1, 2, 3, 4, 5));
-    }
-
-    public void testMatchingSubSectionWithManyGaps() throws Exception {
-        assertMatches("Sub section with many gaps iterable", containsInRelativeOrder(2, 4, 6), asList(1, 2, 3, 4, 5, 6, 7));
-    }
-
-    public void testDoesNotMatchWithFewerElementsThanExpected() throws Exception {
-        List<WithValue> valueList = asList(make(1), make(2));
-        assertMismatchDescription("value with <3> was not found after <WithValue 2>", contains123, valueList);
-    }
-
-    public void testDoesNotMatchIfSingleItemNotFound() throws Exception {
-        assertMismatchDescription("value with <4> was not found", containsInRelativeOrder(value(4)), asList(make(3)));
-    }
-
-    public void testDoesNotMatchIfOneOfMultipleItemsNotFound() throws Exception {
-        assertMismatchDescription("value with <3> was not found after <WithValue 2>", contains123, asList(make(1), make(2), make(4)));
-    }
-
-    public void testDoesNotMatchEmptyIterable() throws Exception {
-        assertMismatchDescription("value with <4> was not found", containsInRelativeOrder(value(4)), new ArrayList<WithValue>());
-    }
-
-    public void testHasAReadableDescription() {
-        assertDescription("iterable containing [<1>, <2>] in relative order", containsInRelativeOrder(1, 2));
-    }
-
-    public static class WithValue {
-      private final int value;
-      public WithValue(int value) { this.value = value; }
-      public int getValue() { return value; }
-      @Override public String toString() { return "WithValue " + value; }
-    }
-
-    public static WithValue make(int value) {
-      return new WithValue(value);
-    }
-
-    public static Matcher<WithValue> value(int value) {
-      return new FeatureMatcher<WithValue, Integer>(equalTo(value), "value with", "value") {
-        @Override protected Integer featureValueOf(WithValue actual) { return actual.getValue(); }
-      };
-    }
-}
diff --git a/hamcrest-library/src/test/java/org/hamcrest/collection/IsIterableWithSizeTest.java b/hamcrest-library/src/test/java/org/hamcrest/collection/IsIterableWithSizeTest.java
deleted file mode 100644
index 8bf65d1..0000000
--- a/hamcrest-library/src/test/java/org/hamcrest/collection/IsIterableWithSizeTest.java
+++ /dev/null
@@ -1,37 +0,0 @@
-package org.hamcrest.collection;
-
-import org.hamcrest.AbstractMatcherTest;
-import org.hamcrest.Matcher;
-
-import java.util.Arrays;
-import java.util.Collections;
-
-import static org.hamcrest.collection.IsIterableWithSize.iterableWithSize;
-
-public class IsIterableWithSizeTest extends AbstractMatcherTest {
-
-    @Override
-    protected Matcher<?> createMatcher() {
-        return iterableWithSize(7);
-    }
-
-    public void testMatchesEmptyIterable() throws Exception {
-        assertMatches("Empty iterable", iterableWithSize(0), Collections.emptyList());
-    }
-
-    public void testMatchingSingleItemIterable() throws Exception {
-        assertMatches("Single item iterable", iterableWithSize(1), Arrays.<Object>asList(1));
-    }
-
-    public void testMatchingMultipleItemIterable() throws Exception {
-        assertMatches("Multiple item iterable", iterableWithSize(3), Arrays.<Object>asList(1, 2, 3));
-    }
-
-    public void testDoesNotMatchIncorrectSize() throws Exception {
-        assertDoesNotMatch("Incorrect size", iterableWithSize(3), Arrays.<Object>asList(1));
-    }
-
-    public void testHasAReadableDescription() {
-        assertDescription("an iterable with size <4>", iterableWithSize(4));
-    }
-}
diff --git a/hamcrest-library/src/test/java/org/hamcrest/collection/IsMapContainingKeyTest.java b/hamcrest-library/src/test/java/org/hamcrest/collection/IsMapContainingKeyTest.java
deleted file mode 100644
index 13f067c..0000000
--- a/hamcrest-library/src/test/java/org/hamcrest/collection/IsMapContainingKeyTest.java
+++ /dev/null
@@ -1,84 +0,0 @@
-package org.hamcrest.collection;
-
-import org.hamcrest.AbstractMatcherTest;
-import org.hamcrest.Matcher;
-
-import java.util.HashMap;
-import java.util.Map;
-import java.util.TreeMap;
-
-import static org.hamcrest.MatcherAssert.assertThat;
-import static org.hamcrest.collection.IsMapContaining.hasKey;
-
-public class IsMapContainingKeyTest extends AbstractMatcherTest {
-
-    @Override
-    protected Matcher<?> createMatcher() {
-        return hasKey("foo");
-    }
-
-    public void testMatchesSingletonMapContainingKey() {
-        Map<String,Integer> map = new HashMap<String, Integer>();
-        map.put("a", 1);
-        
-        assertMatches("Matches single key", hasKey("a"), map);
-    }
-    
-    public void testMatchesMapContainingKey() {
-        Map<String,Integer> map = new HashMap<String, Integer>();
-        map.put("a", 1);
-        map.put("b", 2);
-        map.put("c", 3);
-        
-        assertMatches("Matches a", hasKey("a"), map);
-        assertMatches("Matches c", hasKey("c"), map);
-    }
-    
-
-//    No longer compiles
-//    public void testMatchesMapContainingKeyWithNoGenerics() {
-//        Map map = new HashMap();
-//        map.put("a", 1);
-//        map.put("b", 2);
-//        map.put("c", 3);
-//
-//        assertMatches("Matches a", hasKey("a"), map);
-//        assertMatches("Matches c", hasKey("c"), map);
-//    }
-
-    public void testMatchesMapContainingKeyWithIntegerKeys() throws Exception {
-        Map<Integer, String> map = new HashMap<Integer, String>();
-        map.put(1, "A");
-        map.put(2, "B");
-
-        assertThat(map, hasKey(1));
-    }
-
-    public void testMatchesMapContainingKeyWithNumberKeys() throws Exception {
-        Map<Number, String> map = new HashMap<Number, String>();
-        map.put(1, "A");
-        map.put(2, "B");
-
-        assertThat(map, hasKey((Number)1));
-
-        // TODO: work out the correct sprinkling of wildcards to get this to work!
-//        assertThat(map, hasKey(1));
-    }
-
-    public void testHasReadableDescription() {
-        assertDescription("map containing [\"a\"->ANYTHING]", hasKey("a"));
-    }
-    
-    public void testDoesNotMatchEmptyMap() {
-        assertMismatchDescription("map was []", hasKey("Foo"), new HashMap<String,Integer>());
-    }
-    
-    public void testDoesNotMatchMapMissingKey() {
-        Map<String,Integer> map = new TreeMap<String, Integer>();
-        map.put("a", 1);
-        map.put("b", 2);
-        map.put("c", 3);
-        
-        assertMismatchDescription("map was [<a=1>, <b=2>, <c=3>]", hasKey("d"), map);
-    }
-}
diff --git a/hamcrest-library/src/test/java/org/hamcrest/collection/IsMapContainingTest.java b/hamcrest-library/src/test/java/org/hamcrest/collection/IsMapContainingTest.java
deleted file mode 100644
index f472224..0000000
--- a/hamcrest-library/src/test/java/org/hamcrest/collection/IsMapContainingTest.java
+++ /dev/null
@@ -1,58 +0,0 @@
-package org.hamcrest.collection;
-
-import org.hamcrest.AbstractMatcherTest;
-import org.hamcrest.Matcher;
-
-import java.util.Map;
-import java.util.TreeMap;
-
-import static org.hamcrest.collection.IsMapContaining.hasEntry;
-import static org.hamcrest.core.IsAnything.anything;
-import static org.hamcrest.core.IsEqual.equalTo;
-
-public class IsMapContainingTest extends AbstractMatcherTest {
-
-    @Override
-    protected Matcher<?> createMatcher() {
-        return IsMapContaining.hasEntry("irrelevant", "irrelevant");
-    }
-
-    public void testMatchesMapContainingMatchingKeyAndValue() {
-        Map<String,Integer> map = new TreeMap<String,Integer>();
-        map.put("a", 1);
-        map.put("b", 2);
-
-        assertMatches("matcherA", hasEntry(equalTo("a"), equalTo(1)), map);
-        assertMatches("matcherB", hasEntry(equalTo("b"), equalTo(2)), map);
-        assertMismatchDescription("map was [<a=1>, <b=2>]", hasEntry(equalTo("c"), equalTo(3)), map);
-    }
-
-//    no longer compiles. SF
-//    public void testMatchesMapContainingMatchingKeyAndValueWithoutGenerics() {
-//        Map map = new HashMap();
-//        map.put("a", 1);
-//        map.put("b", 2);
-//
-//        assertMatches("matcherA", hasEntry(equalTo("a"), equalTo(1)), map);
-//        assertMatches("matcherB", hasEntry(equalTo("b"), equalTo(2)), map);
-//        assertDoesNotMatch("matcherC", hasEntry(equalTo("c"), equalTo(3)), map);
-//    }
-//
-    public void testDoesNotMatchNull() {
-        assertMismatchDescription("was null", hasEntry(anything(), anything()), null);
-    }
-
-    public void testHasReadableDescription() {
-        assertDescription("map containing [\"a\"-><2>]", hasEntry(equalTo("a"), (equalTo(2))));
-    }
-
-    // Remaining code no longer compiles, thanks to generics. I think that's a good thing, but
-    // I still need to investigate how this behaves with code that doesn't use generics.
-    // I expect ClassCastExceptions will be thrown.
-    // -Joe.
-    
-//    public void testDoesNotMatchAnObjectThatIsNotAMap() {
-//        assertDoesNotMatch("should not matches a string",
-//                mapContaining(ANYTHING, ANYTHING), "not a map");
-//    }
-}
diff --git a/hamcrest-library/src/test/java/org/hamcrest/collection/IsMapContainingValueTest.java b/hamcrest-library/src/test/java/org/hamcrest/collection/IsMapContainingValueTest.java
deleted file mode 100644
index a2d7f90..0000000
--- a/hamcrest-library/src/test/java/org/hamcrest/collection/IsMapContainingValueTest.java
+++ /dev/null
@@ -1,46 +0,0 @@
-package org.hamcrest.collection;
-
-
-import org.hamcrest.AbstractMatcherTest;
-import org.hamcrest.Matcher;
-
-import java.util.HashMap;
-import java.util.Map;
-import java.util.TreeMap;
-
-import static org.hamcrest.collection.IsMapContaining.hasValue;
-
-public class IsMapContainingValueTest extends AbstractMatcherTest {
-
-    @Override
-    protected Matcher<?> createMatcher() {
-        return hasValue("foo");
-    }
-
-    public void testHasReadableDescription() {
-        assertDescription("map containing [ANYTHING->\"a\"]", hasValue("a"));
-    }
-    
-    public void testDoesNotMatchEmptyMap() {
-        Map<String,Integer> map = new HashMap<String,Integer>();
-        assertMismatchDescription("map was []", hasValue(1), map);
-    }
-    
-    public void testMatchesSingletonMapContainingValue() {
-        Map<String,Integer> map = new HashMap<String,Integer>();
-        map.put("a", 1);
-        
-        assertMatches("Singleton map", hasValue(1), map);
-    }
-
-    public void testMatchesMapContainingValue() {
-        Map<String,Integer> map = new TreeMap<String,Integer>();
-        map.put("a", 1);
-        map.put("b", 2);
-        map.put("c", 3);
-        
-        assertMatches("hasValue 1", hasValue(1), map);      
-        assertMatches("hasValue 3", hasValue(3), map);      
-        assertMismatchDescription("map was [<a=1>, <b=2>, <c=3>]", hasValue(4), map);      
-    }
-}
diff --git a/hamcrest-library/src/test/java/org/hamcrest/collection/IsMapWithSizeTest.java b/hamcrest-library/src/test/java/org/hamcrest/collection/IsMapWithSizeTest.java
deleted file mode 100644
index c050924..0000000
--- a/hamcrest-library/src/test/java/org/hamcrest/collection/IsMapWithSizeTest.java
+++ /dev/null
@@ -1,82 +0,0 @@
-package org.hamcrest.collection;
-
-import org.hamcrest.AbstractMatcherTest;
-import org.hamcrest.Matcher;
-import org.hamcrest.MatcherAssert;
-
-import java.util.HashMap;
-import java.util.Map;
-
-import static org.hamcrest.collection.IsMapWithSize.aMapWithSize;
-import static org.hamcrest.core.IsEqual.equalTo;
-
-public final class IsMapWithSizeTest extends AbstractMatcherTest {
-
-    @Override
-    protected Matcher<?> createMatcher() {
-        return aMapWithSize(7);
-    }
-
-    public void testMatchesWhenSizeIsCorrect() {
-        assertMatches("correct size", aMapWithSize(equalTo(2)), mapWithKeys("a", "b"));
-        assertMismatchDescription("map size was <3>", aMapWithSize(equalTo(2)), mapWithKeys("a", "b", "c"));
-    }
-
-    public void testMatchesMapWhenSizeIsCorrectUsingObjectElementType() {
-        Map<Object, Object> map = mapWithKeys(new Object(), new Object());
-        assertMatches("correct size", aMapWithSize(equalTo(2)), map);
-        assertMismatchDescription("map size was <2>", aMapWithSize(equalTo(3)), map);
-    }
-
-    public void testMatchesMapWhenSizeIsCorrectUsingStringElementType() {
-        Map<String, Integer> map = mapWithKeys("a", "b");
-        assertMatches("correct size", aMapWithSize(equalTo(2)), map);
-        assertMismatchDescription("map size was <2>", aMapWithSize(equalTo(3)), map);
-    }
-
-    public void testMatchesMapWhenSizeIsCorrectUsingWildcardElementType() {
-        Map<?, ?> map = mapWithKeys("a", "b");
-        assertMatches("correct size", aMapWithSize(equalTo(2)), map);
-        assertMismatchDescription("map size was <2>", aMapWithSize(equalTo(3)), map);
-    }
-
-    public void testMatchesListWhenSizeIsCorrectUsingObjectElementType() {
-        Map<Object, Object> map = mapWithKeys(new Object(), new Object());
-        assertMatches("correct size", aMapWithSize(equalTo(2)), map);
-        assertMismatchDescription("map size was <2>", aMapWithSize(equalTo(3)), map);
-    }
-
-    public void testMatchesListWhenSizeIsCorrectUsingStringElementType() {
-        Map<String, Integer> list = mapWithKeys("a", "b");
-        assertMatches("correct size", aMapWithSize(equalTo(2)), list);
-        assertMismatchDescription("map size was <2>", aMapWithSize(equalTo(3)), list);
-    }
-
-    public void testMatchesListWhenSizeIsCorrectUsingWildcardElementType() {
-        Map<?, ?> list = mapWithKeys("a", "b");
-        assertMatches("correct size", aMapWithSize(equalTo(2)), list);
-        assertMismatchDescription("map size was <2>", aMapWithSize(equalTo(3)), list);
-    }
-
-    public void testProvidesConvenientShortcutForHasSizeEqualTo() {
-        assertMatches("correct size", aMapWithSize(2), mapWithKeys(new Object(), new Object()));
-        assertMismatchDescription("map size was <3>", aMapWithSize(2), mapWithKeys(new Object(), new Object(), new Object()));
-    }
-
-    public void testHasAReadableDescription() {
-        assertDescription("a map with size <3>", aMapWithSize(equalTo(3)));
-    }
-    
-    public void testCompilesWithATypedMap() {
-      Map<String, Integer> arrayList = new HashMap<String, Integer>();
-      MatcherAssert.assertThat(arrayList, aMapWithSize(0));
-    }
-    
-    private static <K, V> Map<K, V> mapWithKeys(K... keys) {
-        final Map<K, V> result = new HashMap<K, V>();
-        for (K key : keys) {
-            result.put(key, null);
-        }
-        return result;
-    }
-}
diff --git a/hamcrest-library/src/test/java/org/hamcrest/comparator/ComparatorMatcherBuilderTest.java b/hamcrest-library/src/test/java/org/hamcrest/comparator/ComparatorMatcherBuilderTest.java
deleted file mode 100644
index a5fdb4a..0000000
--- a/hamcrest-library/src/test/java/org/hamcrest/comparator/ComparatorMatcherBuilderTest.java
+++ /dev/null
@@ -1,128 +0,0 @@
-package org.hamcrest.comparator;
-
-import org.hamcrest.AbstractMatcherTest;
-import org.hamcrest.Matcher;
-
-import java.math.BigDecimal;
-import java.util.Comparator;
-
-import static org.hamcrest.MatcherAssert.assertThat;
-import static org.hamcrest.comparator.ComparatorMatcherBuilder.comparedBy;
-import static org.hamcrest.core.IsNot.not;
-
-public class ComparatorMatcherBuilderTest extends AbstractMatcherTest {
-
-    private final ComparatorMatcherBuilder<Integer> integerComparatorMatcherBuilder = ComparatorMatcherBuilder.usingNaturalOrdering();
-    private final ComparatorMatcherBuilder<Double> doubleComparatorMatcherBuilder = ComparatorMatcherBuilder.usingNaturalOrdering();
-    private final ComparatorMatcherBuilder<String> stringComparatorMatcherBuilder = ComparatorMatcherBuilder.usingNaturalOrdering();
-    private final ComparatorMatcherBuilder<BigDecimal> bigDecimalComparatorMatcherBuilder = ComparatorMatcherBuilder.usingNaturalOrdering();
-    private final Comparator<Integer> backwardsIntegerComparator = new Comparator<Integer>() {
-        @Override
-        public int compare(Integer o1, Integer o2) {
-            return -o1.compareTo(o2);
-        }
-
-        @Override
-        public String toString() {
-            return "backwards integer comparator";
-        }
-    };
-
-    @Override
-    protected Matcher<Integer> createMatcher() {
-        return integerComparatorMatcherBuilder.greaterThan(1);
-    }
-
-    public void testDescription() {
-        assertDescription("a value greater than <1>", integerComparatorMatcherBuilder.greaterThan(1));
-        assertDescription("a value equal to or greater than <1>", integerComparatorMatcherBuilder.greaterThanOrEqualTo(1));
-        assertDescription("a value equal to <1>", integerComparatorMatcherBuilder.comparesEqualTo(1));
-        assertDescription("a value less than or equal to <1>", integerComparatorMatcherBuilder.lessThanOrEqualTo(1));
-        assertDescription("a value less than <1>", integerComparatorMatcherBuilder.lessThan(1));
-
-        assertDescription("a value greater than <1> when compared by <backwards integer comparator>", comparedBy(backwardsIntegerComparator).greaterThan(1));
-        assertDescription("a value equal to or greater than <1> when compared by <backwards integer comparator>", comparedBy(backwardsIntegerComparator).greaterThanOrEqualTo(1));
-        assertDescription("a value equal to <1> when compared by <backwards integer comparator>", comparedBy(backwardsIntegerComparator).comparesEqualTo(1));
-        assertDescription("a value less than or equal to <1> when compared by <backwards integer comparator>", comparedBy(backwardsIntegerComparator).lessThanOrEqualTo(1));
-        assertDescription("a value less than <1> when compared by <backwards integer comparator>", comparedBy(backwardsIntegerComparator).lessThan(1));
-    }
-
-    public void testMismatchDescriptions() {
-        assertMismatchDescription("<0> was less than <1>", integerComparatorMatcherBuilder.greaterThan(1), 0);
-        assertMismatchDescription("<1> was equal to <1>", integerComparatorMatcherBuilder.greaterThan(1), 1);
-        assertMismatchDescription("<1> was greater than <0>", integerComparatorMatcherBuilder.lessThan(0), 1);
-        assertMismatchDescription("<2> was equal to <2>", integerComparatorMatcherBuilder.lessThan(2), 2);
-
-        assertMismatchDescription("<1> was less than <0> when compared by <backwards integer comparator>", comparedBy(backwardsIntegerComparator).greaterThan(0), 1);
-        assertMismatchDescription("<1> was equal to <1> when compared by <backwards integer comparator>", comparedBy(backwardsIntegerComparator).greaterThan(1), 1);
-        assertMismatchDescription("<0> was greater than <1> when compared by <backwards integer comparator>", comparedBy(backwardsIntegerComparator).lessThan(1), 0);
-        assertMismatchDescription("<2> was equal to <2> when compared by <backwards integer comparator>", comparedBy(backwardsIntegerComparator).lessThan(2), 2);
-    }
-
-    public void testComparesObjectsForGreaterThan() {
-        assertThat(2, integerComparatorMatcherBuilder.greaterThan(1));
-        assertThat(0, not(integerComparatorMatcherBuilder.greaterThan(1)));
-    }
-
-    public void testComparesObjectsForLessThan() {
-        assertThat(2, integerComparatorMatcherBuilder.lessThan(3));
-        assertThat(0, integerComparatorMatcherBuilder.lessThan(1));
-    }
-
-
-    public void testComparesObjectsForEquality() {
-        assertThat(3, integerComparatorMatcherBuilder.comparesEqualTo(3));
-        assertThat("aa", stringComparatorMatcherBuilder.comparesEqualTo("aa"));
-    }
-
-    public void testAllowsForInclusiveComparisons() {
-        assertThat("less", 1, integerComparatorMatcherBuilder.lessThanOrEqualTo(1));
-        assertThat("greater", 1, integerComparatorMatcherBuilder.greaterThanOrEqualTo(1));
-    }
-
-    public void testSupportsDifferentTypesOfComparableObjects() {
-        assertThat(1.1, doubleComparatorMatcherBuilder.greaterThan(1.0));
-        assertThat("cc", stringComparatorMatcherBuilder.greaterThan("bb"));
-    }
-
-    public void testComparesBigDecimalsWithDifferentScalesCorrectlyForIssue20() {
-        assertThat(new BigDecimal("10.0"), bigDecimalComparatorMatcherBuilder.greaterThanOrEqualTo(new BigDecimal("10")));
-        assertThat(new BigDecimal(10), bigDecimalComparatorMatcherBuilder.greaterThanOrEqualTo(new BigDecimal("10.0")));
-        assertThat(new BigDecimal("2"), bigDecimalComparatorMatcherBuilder.comparesEqualTo(new BigDecimal("2.000")));
-    }
-
-    public void testComparesCustomTypesWhoseCompareToReturnsValuesGreaterThatOne() {
-        assertThat(new CustomInt(5), ComparatorMatcherBuilder.<CustomInt>usingNaturalOrdering().lessThan(new CustomInt(10)));
-    }
-
-    public void testComparesByCustomComparator() {
-        assertThat(5, comparedBy(backwardsIntegerComparator).lessThan(4));
-    }
-
-    public void testJavadocExamples() {
-        assertThat(1, ComparatorMatcherBuilder.<Integer>usingNaturalOrdering().comparesEqualTo(1));
-        assertThat(2, ComparatorMatcherBuilder.<Integer>usingNaturalOrdering().greaterThan(1));
-        assertThat(1, ComparatorMatcherBuilder.<Integer>usingNaturalOrdering().greaterThanOrEqualTo(1));
-        assertThat(1, ComparatorMatcherBuilder.<Integer>usingNaturalOrdering().lessThan(2));
-        assertThat(1, ComparatorMatcherBuilder.<Integer>usingNaturalOrdering().lessThanOrEqualTo(1));
-        assertThat(5, comparedBy(new Comparator<Integer>() {
-            @Override
-            public int compare(Integer o1, Integer o2) {
-                return -o1.compareTo(o2);
-            }
-        }).lessThan(4));
-    }
-
-    private static final class CustomInt implements Comparable<CustomInt> {
-        private final int value;
-
-        public CustomInt(int value) {
-            this.value = value;
-        }
-
-        @Override
-        public int compareTo(CustomInt other) {
-            return value - other.value;
-        }
-    }
-}
diff --git a/hamcrest-library/src/test/java/org/hamcrest/comparator/ComparatorMatcherTest.java b/hamcrest-library/src/test/java/org/hamcrest/comparator/ComparatorMatcherTest.java
deleted file mode 100644
index 2bc53d4..0000000
--- a/hamcrest-library/src/test/java/org/hamcrest/comparator/ComparatorMatcherTest.java
+++ /dev/null
@@ -1,87 +0,0 @@
-package org.hamcrest.comparator;
-
-import org.hamcrest.AbstractMatcherTest;
-import org.hamcrest.Matcher;
-
-import java.math.BigDecimal;
-import java.util.Comparator;
-
-import static org.hamcrest.MatcherAssert.assertThat;
-import static org.hamcrest.core.IsNot.not;
-import static org.hamcrest.number.OrderingComparison.*;
-
-public class ComparatorMatcherTest extends AbstractMatcherTest {
-
-    @Override
-    protected Matcher<Integer> createMatcher() {
-        return ComparatorMatcherBuilder.comparedBy(new Comparator<Integer>() {
-            @Override
-            public int compare(Integer o1, Integer o2) {
-                return o1.compareTo(o2);
-            }
-        }).greaterThan(1);
-    }
-
-    public void testDescription() {
-        assertDescription("a value greater than <1>", greaterThan(1));
-        assertDescription("a value equal to or greater than <1>", greaterThanOrEqualTo(1));
-        assertDescription("a value equal to <1>", comparesEqualTo(1));
-        assertDescription("a value less than or equal to <1>", lessThanOrEqualTo(1));
-        assertDescription("a value less than <1>", lessThan(1));
-    }
-
-    public void testMismatchDescriptions() {
-        assertMismatchDescription("<0> was less than <1>", greaterThan(1), 0);
-        assertMismatchDescription("<1> was equal to <1>", greaterThan(1), 1);
-        assertMismatchDescription("<1> was greater than <0>", lessThan(0), 1);
-        assertMismatchDescription("<2> was equal to <2>", lessThan(2), 2);
-    }
-
-    public void testComparesObjectsForGreaterThan() {
-        assertThat(2, greaterThan(1));
-        assertThat(0, not(greaterThan(1)));
-    }
-
-    public void testComparesObjectsForLessThan() {
-        assertThat(2, lessThan(3));
-        assertThat(0, lessThan(1));
-    }
-
-
-    public void testComparesObjectsForEquality() {
-        assertThat(3, comparesEqualTo(3));
-        assertThat("aa", comparesEqualTo("aa"));
-    }
-
-    public void testAllowsForInclusiveComparisons() {
-        assertThat("less", 1, lessThanOrEqualTo(1));
-        assertThat("greater", 1, greaterThanOrEqualTo(1));
-    }
-
-    public void testSupportsDifferentTypesOfComparableObjects() {
-        assertThat(1.1, greaterThan(1.0));
-        assertThat("cc", greaterThan("bb"));
-    }
-
-    public void testComparesBigDecimalsWithDifferentScalesCorrectlyForIssue20() {
-        assertThat(new BigDecimal("10.0"), greaterThanOrEqualTo(new BigDecimal("10")));
-        assertThat(new BigDecimal(10), greaterThanOrEqualTo(new BigDecimal("10.0")));
-        assertThat(new BigDecimal("2"), comparesEqualTo(new BigDecimal("2.000")));
-    }
-
-    public void testComparesCustomTypesWhoseCompareToReturnsValuesGreaterThatOne() {
-        assertThat(new CustomInt(5), lessThan(new CustomInt(10)));
-    }
-
-    private static final class CustomInt implements Comparable<CustomInt> {
-        private final int value;
-
-        public CustomInt(int value) {
-            this.value = value;
-        }
-
-        public int compareTo(CustomInt other) {
-            return value - other.value;
-        }
-    }
-}
diff --git a/hamcrest-library/src/test/java/org/hamcrest/io/FileMatchersTest.java b/hamcrest-library/src/test/java/org/hamcrest/io/FileMatchersTest.java
deleted file mode 100644
index b186549..0000000
--- a/hamcrest-library/src/test/java/org/hamcrest/io/FileMatchersTest.java
+++ /dev/null
@@ -1,93 +0,0 @@
-package org.hamcrest.io;
-
-import org.hamcrest.AbstractMatcherTest;
-import org.hamcrest.Matcher;
-
-import java.io.File;
-
-import static org.hamcrest.core.IsEqual.equalTo;
-
-@SuppressWarnings("ResultOfMethodCallIgnored")
-public class FileMatchersTest extends AbstractMatcherTest {
-
-    private File directory;
-    private File file;
-
-    @Override
-    protected void setUp() throws Exception {
-        directory = File.createTempFile("myDir", "");
-        directory.delete();
-        directory.mkdirs();
-        
-        file = new File(directory, "myFile");
-        file.createNewFile();
-    }
-    
-    public void testAnExistingDirectory() {
-        assertMatches("matches existing directory", FileMatchers.anExistingDirectory(), directory);
-        assertDoesNotMatch("doesn't match existing file", FileMatchers.anExistingDirectory(), file);
-        assertDoesNotMatch("doesn't match missing file", FileMatchers.anExistingDirectory(), new File("foo"));
-    }
-
-    public void testAnExistingFileOrDirectory() {
-        assertMatches("matches existing file", FileMatchers.anExistingFileOrDirectory(), file);
-        assertMatches("matches existing directory", FileMatchers.anExistingFileOrDirectory(), directory);
-        assertDoesNotMatch("doesn't match missing file", FileMatchers.anExistingFileOrDirectory(), new File("foo"));
-    }
-
-    public void testAnExistingFile() {
-        assertMatches("matches existing file", FileMatchers.anExistingFile(), file);
-        assertDoesNotMatch("doesn't match existing directory", FileMatchers.anExistingFile(), directory);
-        assertDoesNotMatch("doesn't match missing file", FileMatchers.anExistingFile(), new File("foo"));
-    }
-
-    public void testAReadableFile() {
-        file.setReadable(true);
-        assertMatches("matches readable file", FileMatchers.aReadableFile(), file);
-        if (file.setReadable(false)) {
-            assertDoesNotMatch("doesn't match unreadable file", FileMatchers.aReadableFile(), file);
-        }
-    }
-
-    public void testAWritableFile() {
-        assertMatches("matches writable file", FileMatchers.aWritableFile(), file);
-        file.setWritable(false);
-        assertDoesNotMatch("doesn't match unwritable file", FileMatchers.aWritableFile(), file);
-    }
-
-    public void testAFileWithSizeLong() {
-        assertMatches("matches file size", FileMatchers.aFileWithSize(0L), file);
-        file.setWritable(false);
-        assertDoesNotMatch("doesn't match incorrect file size", FileMatchers.aFileWithSize(34L), file);
-    }
-
-    public void testAFileWithSizeMatcherOfLong() {
-        assertMatches("matches file size", FileMatchers.aFileWithSize(equalTo(0L)), file);
-        file.setWritable(false);
-        assertDoesNotMatch("doesn't match incorrect file size", FileMatchers.aFileWithSize(equalTo(23L)), file);
-    }
-
-    public void testAFileNamed() {
-        assertMatches("matches file name", FileMatchers.aFileNamed(equalTo(file.getName())), file);
-        file.setWritable(false);
-        assertDoesNotMatch("doesn't match incorrect file name", FileMatchers.aFileNamed(equalTo("foo")), file);
-    }
-
-    public void testAFileWithCanonicalPath() throws Exception {
-        assertMatches("matches file canonical path", FileMatchers.aFileWithCanonicalPath(equalTo(file.getCanonicalPath())), file);
-        file.setWritable(false);
-        assertDoesNotMatch("doesn't match incorrect canonical path", FileMatchers.aFileWithCanonicalPath(equalTo("foo")), file);
-    }
-
-    public void testAFileWithAbsolutePath() {
-        assertMatches("matches file absolute path", FileMatchers.aFileWithAbsolutePath(equalTo(file.getAbsolutePath())), file);
-        file.setWritable(false);
-        assertDoesNotMatch("doesn't match incorrect absolute path", FileMatchers.aFileWithAbsolutePath(equalTo("foo")), file);
-    }
-
-    @Override
-    protected Matcher<?> createMatcher() {
-        return FileMatchers.aFileWithSize(1L);
-    }
-
-}
diff --git a/hamcrest-library/src/test/java/org/hamcrest/number/BigDecimalCloseToTest.java b/hamcrest-library/src/test/java/org/hamcrest/number/BigDecimalCloseToTest.java
deleted file mode 100644
index c82e6f4..0000000
--- a/hamcrest-library/src/test/java/org/hamcrest/number/BigDecimalCloseToTest.java
+++ /dev/null
@@ -1,45 +0,0 @@
-package org.hamcrest.number;
-
-import org.hamcrest.AbstractMatcherTest;
-import org.hamcrest.Matcher;
-
-import java.math.BigDecimal;
-
-import static org.hamcrest.number.BigDecimalCloseTo.closeTo;
-
-public class BigDecimalCloseToTest  extends AbstractMatcherTest {
-  private final Matcher<BigDecimal> matcher = closeTo(new BigDecimal("1.0"), new BigDecimal("0.5"));
-
-  @Override
-  protected Matcher<?> createMatcher() {
-    BigDecimal irrelevant = new BigDecimal("0.01");
-    return closeTo(irrelevant, irrelevant);
-  }
-  
-  public void testEvaluatesToTrueIfArgumentIsEqualToABigDecimalWithinSomeError() {
-    assertTrue(matcher.matches(new BigDecimal("1.0")));
-    assertTrue(matcher.matches(new BigDecimal("0.5")));
-    assertTrue(matcher.matches(new BigDecimal("1.5")));
-
-    assertDoesNotMatch("too large", matcher, new BigDecimal("2.0"));
-    assertMismatchDescription("<2.0> differed by <0.5> more than delta <0.5>", matcher, new BigDecimal("2.0"));
-    assertDoesNotMatch("number too small", matcher, new BigDecimal("0.0"));
-    assertMismatchDescription("<0.0> differed by <0.5> more than delta <0.5>", matcher, new BigDecimal("0.0"));
-  }
-  
-  public void testEvaluatesToTrueIfArgumentHasDifferentScale() {
-    assertTrue(matcher.matches(new BigDecimal("1.000000")));
-    assertTrue(matcher.matches(new BigDecimal("0.500000")));
-    assertTrue(matcher.matches(new BigDecimal("1.500000")));
-
-    assertDoesNotMatch("too large", matcher, new BigDecimal("2.000000"));
-    assertMismatchDescription("<2.000000> differed by <0.5> more than delta <0.5>", matcher, new BigDecimal("2.000000"));
-    assertDoesNotMatch("number too small", matcher, new BigDecimal("0.000000"));
-    assertMismatchDescription("<0.000000> differed by <0.5> more than delta <0.5>", matcher, new BigDecimal("0.000000"));
-  }
-
-  public void test_is_self_describing() {
-    assertDescription("a numeric value within <0.5> of <1.0>", matcher);
-  }
-
-}
diff --git a/hamcrest-library/src/test/java/org/hamcrest/number/IsCloseToTest.java b/hamcrest-library/src/test/java/org/hamcrest/number/IsCloseToTest.java
deleted file mode 100644
index 8b0e244..0000000
--- a/hamcrest-library/src/test/java/org/hamcrest/number/IsCloseToTest.java
+++ /dev/null
@@ -1,32 +0,0 @@
-package org.hamcrest.number;
-
-import org.hamcrest.AbstractMatcherTest;
-import org.hamcrest.Matcher;
-
-import static org.hamcrest.number.IsCloseTo.closeTo;
-
-public class IsCloseToTest extends AbstractMatcherTest {
-  private final Matcher<Double> matcher = closeTo(1.0d, 0.5d);
-
-  @Override
-    protected Matcher<?> createMatcher() {
-        final double irrelevant = 0.1;
-        return closeTo(irrelevant, irrelevant);
-    }
-
-    public void test_matchesIfArgumentIsEqualToADoubleValueWithinSomeError() {
-        assertMatches("1.0", matcher, 1.0);
-        assertMatches("0.5d", matcher, 0.5d);
-        assertMatches("1.5d", matcher, 1.5d);
-
-        assertDoesNotMatch("too large", matcher, 2.0);
-        assertMismatchDescription("<3.0> differed by <1.5> more than delta <0.5>", matcher, 3.0d);
-        assertDoesNotMatch("number too small", matcher, 0.0);
-        assertMismatchDescription("<0.1> differed by <0.4> more than delta <0.5>", matcher, 0.1);
-    }
-
-    public void test_is_self_describing() {
-        assertDescription("a numeric value within <0.5> of <1.0>", matcher);
-    }
-
-}
diff --git a/hamcrest-library/src/test/java/org/hamcrest/number/IsNanTest.java b/hamcrest-library/src/test/java/org/hamcrest/number/IsNanTest.java
deleted file mode 100644
index c9b3956..0000000
--- a/hamcrest-library/src/test/java/org/hamcrest/number/IsNanTest.java
+++ /dev/null
@@ -1,43 +0,0 @@
-package org.hamcrest.number;
-
-import org.hamcrest.Matcher;
-import org.junit.Test;
-
-import static org.hamcrest.AbstractMatcherTest.*;
-import static org.hamcrest.number.IsNaN.notANumber;
-
-public final class IsNanTest {
-
-    @Test public void
-    copesWithNullsAndUnknownTypes() {
-        Matcher<Double> matcher = notANumber();
-        
-        assertNullSafe(matcher);
-        assertUnknownTypeSafe(matcher);
-    }
-
-    @Test public void
-    matchesNaN() {
-        assertMatches(notANumber(), Double.NaN);
-    }
-
-    @Test public void
-    doesNotMatchDoubleValue() {
-        assertDoesNotMatch(notANumber(), 1.25);
-    }
-
-    @Test public void
-    doesNotMatchInfinity() {
-        assertDoesNotMatch(notANumber(), Double.POSITIVE_INFINITY);
-    }
-
-    @Test public void
-    describesItself() {
-        assertDescription("a double value of NaN", notANumber());
-    }
-
-    @Test public void
-    describesAMismatch() {
-        assertMismatchDescription("was <1.25>", notANumber(), 1.25);
-    }
-}
diff --git a/hamcrest-library/src/test/java/org/hamcrest/number/OrderingComparisonTest.java b/hamcrest-library/src/test/java/org/hamcrest/number/OrderingComparisonTest.java
deleted file mode 100644
index 5953bd0..0000000
--- a/hamcrest-library/src/test/java/org/hamcrest/number/OrderingComparisonTest.java
+++ /dev/null
@@ -1,80 +0,0 @@
-package org.hamcrest.number;
-
-import org.hamcrest.AbstractMatcherTest;
-import org.hamcrest.Matcher;
-
-import java.math.BigDecimal;
-
-import static org.hamcrest.MatcherAssert.assertThat;
-import static org.hamcrest.core.IsNot.not;
-import static org.hamcrest.number.OrderingComparison.*;
-
-public class OrderingComparisonTest extends AbstractMatcherTest {
-
-    @Override
-    protected Matcher<Integer> createMatcher() {
-        return greaterThan(1);
-    }
-
-    public void testDescription() {
-      assertDescription("a value greater than <1>", greaterThan(1));
-      assertDescription("a value equal to or greater than <1>", greaterThanOrEqualTo(1));
-      assertDescription("a value equal to <1>", comparesEqualTo(1));
-      assertDescription("a value less than or equal to <1>", lessThanOrEqualTo(1));
-      assertDescription("a value less than <1>", lessThan(1));
-    }
-
-    public void testMismatchDescriptions() {
-      assertMismatchDescription("<0> was less than <1>", greaterThan(1), 0);
-      assertMismatchDescription("<1> was equal to <1>", greaterThan(1), 1);
-      assertMismatchDescription("<1> was greater than <0>", lessThan(0), 1);
-      assertMismatchDescription("<2> was equal to <2>", lessThan(2), 2);
-    }
-
-    public void testComparesObjectsForGreaterThan() {
-        assertThat(2, greaterThan(1));
-        assertThat(0, not(greaterThan(1)));
-    }
-
-    public void testComparesObjectsForLessThan() {
-        assertThat(2, lessThan(3));
-        assertThat(0, lessThan(1));
-    }
-
-
-    public void testComparesObjectsForEquality() {
-      assertThat(3, comparesEqualTo(3));
-      assertThat("aa", comparesEqualTo("aa"));
-    }
-
-    public void testAllowsForInclusiveComparisons() {
-        assertThat("less", 1, lessThanOrEqualTo(1));
-        assertThat("greater", 1, greaterThanOrEqualTo(1));
-    }
-
-    public void testSupportsDifferentTypesOfComparableObjects() {
-        assertThat(1.1, greaterThan(1.0));
-        assertThat("cc", greaterThan("bb"));
-    }
-
-    public void testComparesBigDecimalsWithDifferentScalesCorrectlyForIssue20() {
-      assertThat(new BigDecimal("10.0"), greaterThanOrEqualTo(new BigDecimal("10")));
-      assertThat(new BigDecimal(10), greaterThanOrEqualTo(new BigDecimal("10.0")));
-      assertThat(new BigDecimal("2"), comparesEqualTo(new BigDecimal("2.000")));
-    }
-    
-    public void testComparesCustomTypesWhoseCompareToReturnsValuesGreaterThatOne() {
-        assertThat(new CustomInt(5), lessThan(new CustomInt(10)));
-    }
-
-    private static final class CustomInt implements Comparable<CustomInt> {
-        private final int value;
-        public CustomInt(int value) {
-            this.value = value;
-        }
-
-        public int compareTo(CustomInt other) {
-            return value - other.value;
-        }
-    }
-}
diff --git a/hamcrest-library/src/test/java/org/hamcrest/object/HasToStringTest.java b/hamcrest-library/src/test/java/org/hamcrest/object/HasToStringTest.java
deleted file mode 100644
index 5c75ae7..0000000
--- a/hamcrest-library/src/test/java/org/hamcrest/object/HasToStringTest.java
+++ /dev/null
@@ -1,55 +0,0 @@
-package org.hamcrest.object;
-
-import org.hamcrest.Matcher;
-import org.junit.Test;
-
-import static org.hamcrest.AbstractMatcherTest.*;
-import static org.hamcrest.core.IsEqual.equalTo;
-import static org.hamcrest.object.HasToString.hasToString;
-
-public final class HasToStringTest {
-    private static final String TO_STRING_RESULT = "toString result";
-    private static final Object TEST_OBJECT = new Object() {
-        @Override
-        public String toString() {
-            return TO_STRING_RESULT;
-        }
-    };
-
-    @Test public void
-    copesWithNullsAndUnknownTypes() {
-        Matcher<Object> matcher = hasToString(equalTo("irrelevant"));
-        
-        assertNullSafe(matcher);
-        assertUnknownTypeSafe(matcher);
-    }
-    
-    @Test public void
-    matchesWhenUtilisingANestedMatcher() {
-    	final Matcher<Object> matcher = hasToString(equalTo(TO_STRING_RESULT));
-
-    	assertMatches(matcher, TEST_OBJECT);
-    	assertDoesNotMatch(matcher, new Object());
-    }
-
-    @Test public void
-    matchesWhenUsingShortcutForHasToStringEqualTo() {
-    	final Matcher<Object> matcher = hasToString(TO_STRING_RESULT);
-    	
-		assertMatches(matcher, TEST_OBJECT);
-    	assertDoesNotMatch(matcher, new Object());
-    }
-
-    @Test public void
-    describesItself() {
-    	final Matcher<Object> matcher = hasToString(equalTo(TO_STRING_RESULT));
-        assertDescription("with toString() \"toString result\"", matcher);
-    }
-
-    @Test public void
-    describesAMismatch() {
-    	final Matcher<Object> matcher = hasToString(equalTo(TO_STRING_RESULT));
-    	String expectedMismatchString = "toString() was \"Cheese\"";
-        assertMismatchDescription(expectedMismatchString, matcher, "Cheese");
-    }
-}
diff --git a/hamcrest-library/src/test/java/org/hamcrest/object/IsCompatibleTypeTest.java b/hamcrest-library/src/test/java/org/hamcrest/object/IsCompatibleTypeTest.java
deleted file mode 100644
index 8432fdb..0000000
--- a/hamcrest-library/src/test/java/org/hamcrest/object/IsCompatibleTypeTest.java
+++ /dev/null
@@ -1,58 +0,0 @@
-package org.hamcrest.object;
-
-import org.hamcrest.AbstractMatcherTest;
-import org.hamcrest.Matcher;
-
-import static org.hamcrest.MatcherAssert.assertThat;
-import static org.hamcrest.object.IsCompatibleType.typeCompatibleWith;
-
-public class IsCompatibleTypeTest extends AbstractMatcherTest {
-    public static class BaseClass {
-    }
-
-    public static class ExtendedClass extends BaseClass {
-    }
-
-    public interface BaseInterface {
-    }
-
-    public interface ExtendedInterface extends BaseInterface {
-    }
-
-    public static class ClassImplementingBaseInterface implements BaseInterface {
-    }
-
-    @Override
-    protected Matcher<?> createMatcher() {
-        return typeCompatibleWith(BaseClass.class);
-    }
-
-    public void testMatchesSameClass() {
-        assertThat(BaseClass.class, typeCompatibleWith(BaseClass.class));
-    }
-
-    public void testMatchesSameInterface() {
-        assertThat(BaseInterface.class, typeCompatibleWith(BaseInterface.class));
-    }
-
-    public void testMatchesExtendedClass() {
-        assertThat(ExtendedClass.class, typeCompatibleWith(BaseClass.class));
-    }
-
-    public void testMatchesClassImplementingInterface() {
-        assertThat(ClassImplementingBaseInterface.class, typeCompatibleWith(BaseInterface.class));
-    }
-
-    public void testMatchesExtendedInterface() {
-        assertThat(ExtendedInterface.class, typeCompatibleWith(BaseInterface.class));
-    }
-
-//    public void testDoesNotMatchIncompatibleTypes() {
-//        assertThat(BaseClass.class, not(compatibleType(ExtendedClass.class)));
-//        assertThat(Integer.class, not(compatibleType(String.class)));
-//    }
-
-    public void testHasReadableDescription() {
-        assertDescription("type < java.lang.Runnable", typeCompatibleWith(Runnable.class));
-    }
-}
diff --git a/hamcrest-library/src/test/java/org/hamcrest/object/IsEventFromTest.java b/hamcrest-library/src/test/java/org/hamcrest/object/IsEventFromTest.java
deleted file mode 100644
index b3c4a3a..0000000
--- a/hamcrest-library/src/test/java/org/hamcrest/object/IsEventFromTest.java
+++ /dev/null
@@ -1,52 +0,0 @@
-package org.hamcrest.object;
-
-import org.hamcrest.AbstractMatcherTest;
-import org.hamcrest.Matcher;
-
-import java.util.EventObject;
-
-import static org.hamcrest.MatcherAssert.assertThat;
-import static org.hamcrest.object.IsEventFrom.eventFrom;
-
-
-public class IsEventFromTest extends AbstractMatcherTest {
-
-    @Override
-    protected Matcher<?> createMatcher() {
-        return eventFrom(null);
-    }
-
-    public void testEvaluatesToTrueIfArgumentIsAnEventObjectFiredByASpecifiedSource() {
-        Object o = "Source";
-        EventObject ev = new EventObject(o);
-        EventObject ev2 = new EventObject("source 2");
-
-        Matcher<EventObject> isEventMatcher = eventFrom(o);
-
-        assertThat(ev, isEventMatcher);
-        assertMismatchDescription("source was \"source 2\"", isEventMatcher, ev2);
-    }
-
-    private static class DerivedEvent extends EventObject {
-        private static final long serialVersionUID = 1L;
-
-        public DerivedEvent(Object source) {
-            super(source);
-        }
-    }
-
-    public void testCanTestForSpecificEventClasses() {
-        Object o = new Object();
-        DerivedEvent goodEv = new DerivedEvent(o);
-        DerivedEvent wrongSource = new DerivedEvent("wrong source");
-        EventObject wrongType = new EventObject(o);
-        EventObject wrongSourceAndType = new EventObject(new Object());
-
-        Matcher<EventObject> isEventMatcher = IsEventFrom.eventFrom(DerivedEvent.class, o);
-
-        assertThat(goodEv, isEventMatcher);
-        assertMismatchDescription("source was \"wrong source\"", isEventMatcher, wrongSource);
-        assertMismatchDescription("item type was java.util.EventObject", isEventMatcher, wrongType);
-        assertMismatchDescription("item type was java.util.EventObject", isEventMatcher, wrongSourceAndType);
-    }
-}
diff --git a/hamcrest-library/src/test/java/org/hamcrest/object/MatchesPatternTest.java b/hamcrest-library/src/test/java/org/hamcrest/object/MatchesPatternTest.java
deleted file mode 100644
index 3e2d911..0000000
--- a/hamcrest-library/src/test/java/org/hamcrest/object/MatchesPatternTest.java
+++ /dev/null
@@ -1,59 +0,0 @@
-package org.hamcrest.object;
-
-import org.hamcrest.Matcher;
-import org.hamcrest.text.MatchesPattern;
-import org.junit.Test;
-
-import java.util.regex.Pattern;
-
-import static org.hamcrest.AbstractMatcherTest.*;
-import static org.junit.Assert.assertThat;
-
-public class MatchesPatternTest {
-    @Test
-    public void copesWithNullsAndUnknownTypes() {
-        Matcher<String> matcher = new MatchesPattern(Pattern.compile("."));
-
-        assertNullSafe(matcher);
-        assertUnknownTypeSafe(matcher);
-    }
-
-    @Test
-    public void matchesExactString() {
-        assertThat("a", new MatchesPattern(Pattern.compile("a")));
-    }
-
-    @Test
-    public void doesNotMatchADifferentString() {
-        assertDoesNotMatch("A different string does not match", new MatchesPattern(Pattern.compile("a")), "b");
-    }
-
-    @Test
-    public void doesNotMatchSubstring() {
-        assertDoesNotMatch("A substring does not match", new MatchesPattern(Pattern.compile("a")), "ab");
-    }
-
-    @Test
-    public void hasAReadableDescription() {
-        Matcher<?> m = new MatchesPattern(Pattern.compile("a[bc](d|e)"));
-        assertDescription("a string matching the pattern 'a[bc](d|e)'", m );
-    }
-
-    @Test
-    public void describesAMismatch() {
-        final Matcher<String> matcher = new MatchesPattern(Pattern.compile("a"));
-        assertMismatchDescription("was \"Cheese\"", matcher, "Cheese");
-    }
-
-    @Test
-    public void factoryMethodAllowsCreationWithPattern() {
-        Matcher<?> m = MatchesPattern.matchesPattern(Pattern.compile("a[bc](d|e)"));
-        assertDescription("a string matching the pattern 'a[bc](d|e)'", m );
-    }
-
-    @Test
-    public void factoryMethodAllowsCreationWithString() {
-        Matcher<?> m = MatchesPattern.matchesPattern("a[bc](d|e)");
-        assertDescription("a string matching the pattern 'a[bc](d|e)'", m );
-    }
-}
diff --git a/hamcrest-library/src/test/java/org/hamcrest/text/IsBlankStringTest.java b/hamcrest-library/src/test/java/org/hamcrest/text/IsBlankStringTest.java
deleted file mode 100644
index c5f35f1..0000000
--- a/hamcrest-library/src/test/java/org/hamcrest/text/IsBlankStringTest.java
+++ /dev/null
@@ -1,55 +0,0 @@
-package org.hamcrest.text;
-
-import org.hamcrest.Matcher;
-import org.junit.Test;
-
-import static org.hamcrest.AbstractMatcherTest.*;
-import static org.hamcrest.text.IsBlankString.blankOrNullString;
-import static org.hamcrest.text.IsBlankString.blankString;
-
-public final class IsBlankStringTest {
-
-    @Test public void
-    copesWithNullsAndUnknownTypes() {
-        Matcher<String> matcher = blankString();
-        
-        assertNullSafe(matcher);
-        assertUnknownTypeSafe(matcher);
-    }
-
-    @Test public void
-    matchesEmptyString() {
-        assertMatches(blankOrNullString(), "");
-        assertMatches(blankString(), "");
-    }
-
-    @Test public void
-    matchesNullAppropriately() {
-        assertMatches(blankOrNullString(), null);
-        assertDoesNotMatch(blankString(), null);
-    }
-
-    @Test public void
-    matchesBlankStringAppropriately() {
-        assertMatches(blankString(), " \t");
-        assertMatches(blankOrNullString(), " \t");
-    }
-
-    @Test public void
-    doesNotMatchFilledString() {
-        assertDoesNotMatch(blankString(), "a");
-        assertDoesNotMatch(blankOrNullString(), "a");
-    }
-
-    @Test public void
-    describesItself() {
-        assertDescription("a blank string", blankString());
-        assertDescription("(null or a blank string)", blankOrNullString());
-    }
-
-    @Test public void
-    describesAMismatch() {
-        assertMismatchDescription("was \"a\"", blankString(), "a");
-        assertMismatchDescription("was \"a\"", blankOrNullString(), "a");
-    }
-}
diff --git a/hamcrest-library/src/test/java/org/hamcrest/text/IsEmptyStringTest.java b/hamcrest-library/src/test/java/org/hamcrest/text/IsEmptyStringTest.java
deleted file mode 100644
index 62e3053..0000000
--- a/hamcrest-library/src/test/java/org/hamcrest/text/IsEmptyStringTest.java
+++ /dev/null
@@ -1,55 +0,0 @@
-package org.hamcrest.text;
-
-import org.hamcrest.Matcher;
-import org.junit.Test;
-
-import static org.hamcrest.AbstractMatcherTest.*;
-import static org.hamcrest.text.IsEmptyString.emptyOrNullString;
-import static org.hamcrest.text.IsEmptyString.emptyString;
-
-public final class IsEmptyStringTest {
-
-    @Test public void
-    copesWithNullsAndUnknownTypes() {
-        Matcher<String> matcher = emptyString();
-        
-        assertNullSafe(matcher);
-        assertUnknownTypeSafe(matcher);
-    }
-
-    @Test public void
-    matchesEmptyString() {
-        assertMatches(emptyOrNullString(), "");
-        assertMatches(emptyString(), "");
-    }
-
-    @Test public void
-    matchesNullAppropriately() {
-        assertMatches(emptyOrNullString(), null);
-        assertDoesNotMatch(emptyString(), null);
-    }
-
-    @Test public void
-    matchesBlankStringAppropriately() {
-        assertDoesNotMatch(emptyString(), "  ");
-        assertDoesNotMatch(emptyOrNullString(), "  ");
-    }
-
-    @Test public void
-    doesNotMatchFilledString() {
-        assertDoesNotMatch(emptyString(), "a");
-        assertDoesNotMatch(emptyOrNullString(), "a");
-    }
-
-    @Test public void
-    describesItself() {
-        assertDescription("an empty string", emptyString());
-        assertDescription("(null or an empty string)", emptyOrNullString());
-    }
-
-    @Test public void
-    describesAMismatch() {
-        assertMismatchDescription("was \"a\"", emptyString(), "a");
-        assertMismatchDescription("was \"a\"", emptyOrNullString(), "a");
-    }
-}
diff --git a/hamcrest-library/src/test/java/org/hamcrest/text/IsEqualIgnoringCaseTest.java b/hamcrest-library/src/test/java/org/hamcrest/text/IsEqualIgnoringCaseTest.java
deleted file mode 100644
index 4800f43..0000000
--- a/hamcrest-library/src/test/java/org/hamcrest/text/IsEqualIgnoringCaseTest.java
+++ /dev/null
@@ -1,62 +0,0 @@
-package org.hamcrest.text;
-
-import org.hamcrest.Matcher;
-import org.junit.Test;
-
-import static org.hamcrest.AbstractMatcherTest.*;
-import static org.hamcrest.text.IsEqualIgnoringCase.equalToIgnoringCase;
-
-public final class IsEqualIgnoringCaseTest {
-
-    @Test public void
-    copesWithNullsAndUnknownTypes() {
-        Matcher<String> matcher = equalToIgnoringCase("irrelevant");
-        
-        assertNullSafe(matcher);
-        assertUnknownTypeSafe(matcher);
-    }
-
-    @Test public void
-    ignoresCaseOfCharsInString() {
-        final Matcher<String> matcher = equalToIgnoringCase("heLLo");
-		
-        assertMatches(matcher, "HELLO");
-        assertMatches(matcher, "hello");
-        assertMatches(matcher, "HelLo");
-    	assertDoesNotMatch(matcher, "bye");
-    }
-
-    @Test public void 
-    mismatchesIfAdditionalWhitespaceIsPresent() {
-    	final Matcher<String> matcher = equalToIgnoringCase("heLLo");
-		
-    	assertDoesNotMatch(matcher, "hello ");
-    	assertDoesNotMatch(matcher, " hello");
-    }
-
-    @Test public void 
-    mismatchesNull() {
-    	final Matcher<String> matcher = equalToIgnoringCase("heLLo");
-		
-    	assertDoesNotMatch(matcher, null);
-    }
-
-    @Test(expected=IllegalArgumentException.class) public void
-    canOnlyBeConstructedAboutANonNullString() {
-        equalToIgnoringCase(null);
-    }
-
-
-    @Test public void
-    describesItself() {
-    	final Matcher<String> matcher = equalToIgnoringCase("heLLo");
-        assertDescription("equalToIgnoringCase(\"heLLo\")", matcher);
-    }
-
-    @Test public void
-    describesAMismatch() {
-    	final Matcher<String> matcher = equalToIgnoringCase("heLLo");
-    	String expectedMismatchString = "was \"Cheese\"";
-        assertMismatchDescription(expectedMismatchString, matcher, "Cheese");
-    }
-}
diff --git a/hamcrest-library/src/test/java/org/hamcrest/text/IsEqualIgnoringWhiteSpaceTest.java b/hamcrest-library/src/test/java/org/hamcrest/text/IsEqualIgnoringWhiteSpaceTest.java
deleted file mode 100644
index d5c7576..0000000
--- a/hamcrest-library/src/test/java/org/hamcrest/text/IsEqualIgnoringWhiteSpaceTest.java
+++ /dev/null
@@ -1,51 +0,0 @@
-package org.hamcrest.text;
-
-import org.hamcrest.AbstractMatcherTest;
-import org.hamcrest.Matcher;
-
-import static org.hamcrest.MatcherAssert.assertThat;
-import static org.hamcrest.core.IsNot.not;
-import static org.hamcrest.text.IsEqualIgnoringWhiteSpace.equalToIgnoringWhiteSpace;
-
-public class IsEqualIgnoringWhiteSpaceTest extends AbstractMatcherTest {
-
-    private final Matcher<String> matcher = equalToIgnoringWhiteSpace("Hello World   how\n are we? ");
-
-    @Override
-    protected Matcher<?> createMatcher() {
-        return matcher;
-    }
-
-    public void testPassesIfWordsAreSameButWhitespaceDiffers() {
-        assertThat("Hello World how are we?", matcher);
-        assertThat("   Hello World   how are \n\n\twe?", matcher);
-    }
-
-    public void testFailsIfTextOtherThanWhitespaceDiffers() {
-        assertThat("Hello PLANET how are we?", not(matcher));
-        assertThat("Hello World how are we", not(matcher));
-    }
-
-    public void testFailsIfWhitespaceIsAddedOrRemovedInMidWord() {
-        assertThat("HelloWorld how are we?", not(matcher));
-        assertThat("Hello Wo rld how are we?", not(matcher));
-    }
-
-    public void testFailsIfMatchingAgainstNull() {
-        assertThat(null, not(matcher));
-    }
-
-    public void testRequiresNonNullStringToBeConstructed() {
-        try {
-            new IsEqualIgnoringWhiteSpace(null);
-            fail("Expected exception");
-        } catch (IllegalArgumentException goodException) {
-            // expected!
-        }
-    }
-
-    public void testHasAReadableDescription() {
-        assertDescription("equalToIgnoringWhiteSpace(\"Hello World   how\\n are we? \")",
-                        matcher);
-    }
-}
diff --git a/hamcrest-library/src/test/java/org/hamcrest/text/StringContainsInOrderTest.java b/hamcrest-library/src/test/java/org/hamcrest/text/StringContainsInOrderTest.java
deleted file mode 100644
index 8ffbc67..0000000
--- a/hamcrest-library/src/test/java/org/hamcrest/text/StringContainsInOrderTest.java
+++ /dev/null
@@ -1,30 +0,0 @@
-package org.hamcrest.text;
-
-import org.hamcrest.AbstractMatcherTest;
-import org.hamcrest.Matcher;
-
-import static java.util.Arrays.asList;
-
-
-public class StringContainsInOrderTest extends AbstractMatcherTest {
-    StringContainsInOrder m = new StringContainsInOrder(asList("a", "b", "c"));
-
-    @Override
-    protected Matcher<?> createMatcher() {
-        return m;
-    }
-    
-    public void testMatchesOnlyIfStringContainsGivenSubstringsInTheSameOrder() {
-        assertMatches("substrings in order", m, "abc");
-        assertMatches("substrings separated", m, "1a2b3c4");
-        
-        assertDoesNotMatch("substrings out of order", m, "cab");
-        assertDoesNotMatch("no substrings in string", m, "xyz");
-        assertDoesNotMatch("substring missing", m, "ac");
-        assertDoesNotMatch("empty string", m, "");
-    }
-    
-    public void testHasAReadableDescription() {
-        assertDescription("a string containing \"a\", \"b\", \"c\" in order", m);
-    }
-}
diff --git a/hamcrest-library/src/test/java/org/hamcrest/xml/HasXPathTest.java b/hamcrest-library/src/test/java/org/hamcrest/xml/HasXPathTest.java
deleted file mode 100644
index a66689d..0000000
--- a/hamcrest-library/src/test/java/org/hamcrest/xml/HasXPathTest.java
+++ /dev/null
@@ -1,147 +0,0 @@
-package org.hamcrest.xml;
-
-import org.hamcrest.Matcher;
-import org.junit.Test;
-import org.w3c.dom.Document;
-import org.w3c.dom.Node;
-
-import javax.xml.namespace.NamespaceContext;
-import javax.xml.parsers.DocumentBuilder;
-import javax.xml.parsers.DocumentBuilderFactory;
-import java.io.ByteArrayInputStream;
-import java.util.HashSet;
-import java.util.Iterator;
-
-import static org.hamcrest.AbstractMatcherTest.*;
-import static org.hamcrest.core.IsEqual.equalTo;
-import static org.hamcrest.core.IsNot.not;
-import static org.hamcrest.core.StringContains.containsString;
-import static org.hamcrest.xml.HasXPath.hasXPath;
-import static org.junit.Assert.fail;
-
-/**
- * @author Joe Walnes
- * @author Tom Denley
- */
-public final class HasXPathTest {
-
-    private final Document xml = parse(""
-            + "<root type='food'>\n"
-            + "  <something id='a'><cheese>Edam</cheese></something>\n"
-            + "  <something id='b'><cheese>Cheddar</cheese></something>\n"
-            + "  <f:foreignSomething xmlns:f=\"http://cheese.com\" milk=\"camel\">Caravane</f:foreignSomething>\n"
-            + "  <emptySomething />\n"
-            + "  <f:emptySomething xmlns:f=\"http://cheese.com\" />"
-            + "</root>\n"
-            );
-
-    private final NamespaceContext ns = new NamespaceContext() {
-        @Override
-        public String getNamespaceURI(String prefix) {
-            return ("cheese".equals(prefix) ? "http://cheese.com" : null);
-        }
-
-        @Override
-        public String getPrefix(String namespaceURI) {
-            return ("http://cheese.com".equals(namespaceURI) ? "cheese" : null);
-        }
-
-        @Override
-        public Iterator<String> getPrefixes(String namespaceURI) {
-            HashSet<String> prefixes = new HashSet<String>();
-            String prefix = getPrefix(namespaceURI);
-            if (prefix != null) {
-                prefixes.add(prefix);
-            }
-            return prefixes.iterator();
-        }
-    };
-
-    @Test public void
-    copesWithNullsAndUnknownTypes() {
-        Matcher<Node> matcher = hasXPath("//irrelevant");
-        
-        assertNullSafe(matcher);
-        assertUnknownTypeSafe(matcher);
-    }
-
-    @Test public void
-    appliesMatcherToXPathInDocument() {
-        assertMatches(hasXPath("/root/something[2]/cheese", equalTo("Cheddar")), xml);
-        assertMatches(hasXPath("//something[1]/cheese", containsString("dam")), xml);
-        assertMatches(hasXPath("//something[2]/cheese", not(containsString("dam"))), xml);
-        assertMatches(hasXPath("/root/@type", equalTo("food")), xml);
-        assertMatches(hasXPath("//something[@id='b']/cheese", equalTo("Cheddar")), xml);
-        assertMatches(hasXPath("//something[@id='b']/cheese"), xml);
-    }
-
-    @Test public void
-    matchesEmptyElement() {
-        assertMatches(hasXPath("//emptySomething"), xml);
-    }
-
-    @Test public void
-    matchesEmptyElementInNamespace() {
-        assertMatches(hasXPath("//cheese:emptySomething", ns), xml);
-    }
-
-    @Test public void
-    failsIfNodeIsMissing() {
-        assertDoesNotMatch(hasXPath("/root/something[3]/cheese", ns, equalTo("Cheddar")), xml);
-        assertDoesNotMatch(hasXPath("//something[@id='c']/cheese", ns), xml);
-    }
-
-    @Test public void
-    failsIfNodeIsMissingInNamespace() {
-        assertDoesNotMatch(hasXPath("//cheese:foreignSomething", equalTo("Badger")), xml);
-        assertDoesNotMatch(hasXPath("//cheese:foreignSomething"), xml);
-    }
-
-    @Test public void
-    matchesWithNamespace() {
-        assertMatches(hasXPath("//cheese:foreignSomething", ns), xml);
-        assertMatches(hasXPath("//cheese:foreignSomething/@milk", ns, equalTo("camel")), xml);
-        assertMatches(hasXPath("//cheese:foreignSomething/text()", ns, equalTo("Caravane")), xml);
-    }
-
-    @Test public void
-    throwsIllegalArgumentExceptionIfGivenIllegalExpression() {
-        try {
-            hasXPath("\\g:dfgd::DSgf/root/something[2]/cheese", equalTo("blah"));
-            fail("Expected exception");
-        } catch (IllegalArgumentException expectedException) {
-            // expected exception
-        }
-    }
-
-    @Test public void
-    describesItself() {
-        assertDescription("an XML document with XPath /some/path \"Cheddar\"",
-                          hasXPath("/some/path", equalTo("Cheddar")));
-        
-        assertDescription("an XML document with XPath /some/path",
-                          hasXPath("/some/path"));
-    }
-
-    @Test public void
-    describesMissingNodeMismatch() {
-        assertMismatchDescription("xpath returned no results.", hasXPath("//honky"), xml);
-    }
-
-    @Test public void
-    describesIncorrectNodeValueMismatch() {
-        assertMismatchDescription("was \"Edam\"", hasXPath("//something[1]/cheese", equalTo("parmesan")), xml);
-    }
-
-    private static Document parse(String xml) {
-        try {
-            DocumentBuilderFactory documentBuilderFactory = DocumentBuilderFactory.newInstance();
-            documentBuilderFactory.setNamespaceAware(true);
-            DocumentBuilder documentBuilder = documentBuilderFactory.newDocumentBuilder();
-            return documentBuilder.parse(new ByteArrayInputStream(xml.getBytes()));
-        }
-        catch (Exception e) {
-            throw new IllegalStateException(e);
-        }
-    }
-}
