Creating lang-3.4-RC1 tag

git-svn-id: https://svn.apache.org/repos/asf/commons/proper/lang/tags/LANG_3_4_RC1@1669797 13f79535-47bb-0310-9956-ffa450edef68
diff --git a/lang/.gitignore b/lang/.gitignore
deleted file mode 100644
index 338a65b..0000000
--- a/lang/.gitignore
+++ /dev/null
@@ -1,17 +0,0 @@
-# Maven build files
-target
-*.log
-maven-eclipse.xml
-build.properties
-site-content
-
-# IntelliJ IDEA files
-.idea
-.iws
-*.iml
-*.ipr
-
-# Eclipse files
-.settings
-.classpath
-.project
diff --git a/lang/CONTRIBUTING.md b/lang/CONTRIBUTING.md
deleted file mode 100644
index bc418fc..0000000
--- a/lang/CONTRIBUTING.md
+++ /dev/null
@@ -1,97 +0,0 @@
-<!---
- Licensed to the Apache Software Foundation (ASF) under one or more
- contributor license agreements.  See the NOTICE file distributed with
- this work for additional information regarding copyright ownership.
- The ASF licenses this file to You under the Apache License, Version 2.0
- (the "License"); you may not use this file except in compliance with
- the License.  You may obtain a copy of the License at
-
-      http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
--->
-<!---
- +======================================================================+
- |****                                                              ****|
- |****      THIS FILE IS GENERATED BY THE COMMONS BUILD PLUGIN      ****|
- |****                    DO NOT EDIT DIRECTLY                      ****|
- |****                                                              ****|
- +======================================================================+
- | TEMPLATE FILE: contributing-md-template.md                           |
- | commons-build-plugin/trunk/src/main/resources/commons-xdoc-templates |
- +======================================================================+
- |                                                                      |
- | 1) Re-generate using: mvn commons:contributing-md                    |
- |                                                                      |
- | 2) Set the following properties in the component's pom:              |
- |    - commons.jira.id  (required, alphabetic, upper case)             |
- |                                                                      |
- | 3) Example Properties                                                |
- |                                                                      |
- |  <properties>                                                        |
- |    <commons.jira.id>MATH</commons.jira.id>                           |
- |  </properties>                                                       |
- |                                                                      |
- +======================================================================+
---->
-Contributing to Apache Commons Lang
-======================
-
-You have found a bug or you have an idea for a cool new feature? Contributing code is a great way to give something back to
-the open source community. Before you dig right into the code there are a few guidelines that we need contributors to
-follow so that we can have a chance of keeping on top of things.
-
-Getting Started
----------------
-
-+ Make sure you have a [JIRA account](https://issues.apache.org/jira/).
-+ Make sure you have a [GitHub account](https://github.com/signup/free).
-+ If you're planning to implement a new feature it makes sense to discuss you're changes on the [dev list](https://commons.apache.org/mail-lists.html) first. This way you can make sure you're not wasting your time on something that isn't considered to be in Apache Commons Lang's scope.
-+ Submit a ticket for your issue, assuming one does not already exist.
-  + Clearly describe the issue including steps to reproduce when it is a bug.
-  + Make sure you fill in the earliest version that you know has the issue.
-+ Fork the repository on GitHub.
-
-Making Changes
---------------
-
-+ Create a topic branch from where you want to base your work (this is usually the master/trunk branch).
-+ Make commits of logical units.
-+ Respect the original code style:
-  + Only use spaces for indentation.
-  + Create minimal diffs - disable on save actions like reformat source code or organize imports. If you feel the source code should be reformatted create a separate PR for this change.
-  + Check for unnecessary whitespace with git diff --check before committing.
-+ Make sure your commit messages are in the proper format. Your commit message should contain the key of the JIRA issue.
-+ Make sure you have added the necessary tests for your changes.
-+ Run all the tests with `mvn clean verify` to assure nothing else was accidentally broken.
-
-Making Trivial Changes
-----------------------
-
-For changes of a trivial nature to comments and documentation, it is not always necessary to create a new ticket in JIRA.
-In this case, it is appropriate to start the first line of a commit with '(doc)' instead of a ticket number.
-
-Submitting Changes
-------------------
-
-+ Sign the [Contributor License Agreement][cla] if you haven't already.
-+ Push your changes to a topic branch in your fork of the repository.
-+ Submit a pull request to the repository in the apache organization.
-+ Update your JIRA ticket and include a link to the pull request in the ticket.
-
-Additional Resources
---------------------
-
-+ [Contributing patches](https://commons.apache.org/patches.html)
-+ [Apache Commons Lang JIRA project page](https://issues.apache.org/jira/browse/LANG)
-+ [Contributor License Agreement][cla]
-+ [General GitHub documentation](https://help.github.com/)
-+ [GitHub pull request documentation](https://help.github.com/send-pull-requests/)
-+ [Apache Commons Twitter Account](https://twitter.com/ApacheCommons)
-+ #apachecommons IRC channel on freenode.org
-
-[cla]:https://www.apache.org/licenses/#clas
diff --git a/lang/LICENSE.txt b/lang/LICENSE.txt
deleted file mode 100644
index d645695..0000000
--- a/lang/LICENSE.txt
+++ /dev/null
@@ -1,202 +0,0 @@
-
-                                 Apache License
-                           Version 2.0, January 2004
-                        http://www.apache.org/licenses/
-
-   TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
-
-   1. Definitions.
-
-      "License" shall mean the terms and conditions for use, reproduction,
-      and distribution as defined by Sections 1 through 9 of this document.
-
-      "Licensor" shall mean the copyright owner or entity authorized by
-      the copyright owner that is granting the License.
-
-      "Legal Entity" shall mean the union of the acting entity and all
-      other entities that control, are controlled by, or are under common
-      control with that entity. For the purposes of this definition,
-      "control" means (i) the power, direct or indirect, to cause the
-      direction or management of such entity, whether by contract or
-      otherwise, or (ii) ownership of fifty percent (50%) or more of the
-      outstanding shares, or (iii) beneficial ownership of such entity.
-
-      "You" (or "Your") shall mean an individual or Legal Entity
-      exercising permissions granted by this License.
-
-      "Source" form shall mean the preferred form for making modifications,
-      including but not limited to software source code, documentation
-      source, and configuration files.
-
-      "Object" form shall mean any form resulting from mechanical
-      transformation or translation of a Source form, including but
-      not limited to compiled object code, generated documentation,
-      and conversions to other media types.
-
-      "Work" shall mean the work of authorship, whether in Source or
-      Object form, made available under the License, as indicated by a
-      copyright notice that is included in or attached to the work
-      (an example is provided in the Appendix below).
-
-      "Derivative Works" shall mean any work, whether in Source or Object
-      form, that is based on (or derived from) the Work and for which the
-      editorial revisions, annotations, elaborations, or other modifications
-      represent, as a whole, an original work of authorship. For the purposes
-      of this License, Derivative Works shall not include works that remain
-      separable from, or merely link (or bind by name) to the interfaces of,
-      the Work and Derivative Works thereof.
-
-      "Contribution" shall mean any work of authorship, including
-      the original version of the Work and any modifications or additions
-      to that Work or Derivative Works thereof, that is intentionally
-      submitted to Licensor for inclusion in the Work by the copyright owner
-      or by an individual or Legal Entity authorized to submit on behalf of
-      the copyright owner. For the purposes of this definition, "submitted"
-      means any form of electronic, verbal, or written communication sent
-      to the Licensor or its representatives, including but not limited to
-      communication on electronic mailing lists, source code control systems,
-      and issue tracking systems that are managed by, or on behalf of, the
-      Licensor for the purpose of discussing and improving the Work, but
-      excluding communication that is conspicuously marked or otherwise
-      designated in writing by the copyright owner as "Not a Contribution."
-
-      "Contributor" shall mean Licensor and any individual or Legal Entity
-      on behalf of whom a Contribution has been received by Licensor and
-      subsequently incorporated within the Work.
-
-   2. Grant of Copyright License. Subject to the terms and conditions of
-      this License, each Contributor hereby grants to You a perpetual,
-      worldwide, non-exclusive, no-charge, royalty-free, irrevocable
-      copyright license to reproduce, prepare Derivative Works of,
-      publicly display, publicly perform, sublicense, and distribute the
-      Work and such Derivative Works in Source or Object form.
-
-   3. Grant of Patent License. Subject to the terms and conditions of
-      this License, each Contributor hereby grants to You a perpetual,
-      worldwide, non-exclusive, no-charge, royalty-free, irrevocable
-      (except as stated in this section) patent license to make, have made,
-      use, offer to sell, sell, import, and otherwise transfer the Work,
-      where such license applies only to those patent claims licensable
-      by such Contributor that are necessarily infringed by their
-      Contribution(s) alone or by combination of their Contribution(s)
-      with the Work to which such Contribution(s) was submitted. If You
-      institute patent litigation against any entity (including a
-      cross-claim or counterclaim in a lawsuit) alleging that the Work
-      or a Contribution incorporated within the Work constitutes direct
-      or contributory patent infringement, then any patent licenses
-      granted to You under this License for that Work shall terminate
-      as of the date such litigation is filed.
-
-   4. Redistribution. You may reproduce and distribute copies of the
-      Work or Derivative Works thereof in any medium, with or without
-      modifications, and in Source or Object form, provided that You
-      meet the following conditions:
-
-      (a) You must give any other recipients of the Work or
-          Derivative Works a copy of this License; and
-
-      (b) You must cause any modified files to carry prominent notices
-          stating that You changed the files; and
-
-      (c) You must retain, in the Source form of any Derivative Works
-          that You distribute, all copyright, patent, trademark, and
-          attribution notices from the Source form of the Work,
-          excluding those notices that do not pertain to any part of
-          the Derivative Works; and
-
-      (d) If the Work includes a "NOTICE" text file as part of its
-          distribution, then any Derivative Works that You distribute must
-          include a readable copy of the attribution notices contained
-          within such NOTICE file, excluding those notices that do not
-          pertain to any part of the Derivative Works, in at least one
-          of the following places: within a NOTICE text file distributed
-          as part of the Derivative Works; within the Source form or
-          documentation, if provided along with the Derivative Works; or,
-          within a display generated by the Derivative Works, if and
-          wherever such third-party notices normally appear. The contents
-          of the NOTICE file are for informational purposes only and
-          do not modify the License. You may add Your own attribution
-          notices within Derivative Works that You distribute, alongside
-          or as an addendum to the NOTICE text from the Work, provided
-          that such additional attribution notices cannot be construed
-          as modifying the License.
-
-      You may add Your own copyright statement to Your modifications and
-      may provide additional or different license terms and conditions
-      for use, reproduction, or distribution of Your modifications, or
-      for any such Derivative Works as a whole, provided Your use,
-      reproduction, and distribution of the Work otherwise complies with
-      the conditions stated in this License.
-
-   5. Submission of Contributions. Unless You explicitly state otherwise,
-      any Contribution intentionally submitted for inclusion in the Work
-      by You to the Licensor shall be under the terms and conditions of
-      this License, without any additional terms or conditions.
-      Notwithstanding the above, nothing herein shall supersede or modify
-      the terms of any separate license agreement you may have executed
-      with Licensor regarding such Contributions.
-
-   6. Trademarks. This License does not grant permission to use the trade
-      names, trademarks, service marks, or product names of the Licensor,
-      except as required for reasonable and customary use in describing the
-      origin of the Work and reproducing the content of the NOTICE file.
-
-   7. Disclaimer of Warranty. Unless required by applicable law or
-      agreed to in writing, Licensor provides the Work (and each
-      Contributor provides its Contributions) on an "AS IS" BASIS,
-      WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
-      implied, including, without limitation, any warranties or conditions
-      of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
-      PARTICULAR PURPOSE. You are solely responsible for determining the
-      appropriateness of using or redistributing the Work and assume any
-      risks associated with Your exercise of permissions under this License.
-
-   8. Limitation of Liability. In no event and under no legal theory,
-      whether in tort (including negligence), contract, or otherwise,
-      unless required by applicable law (such as deliberate and grossly
-      negligent acts) or agreed to in writing, shall any Contributor be
-      liable to You for damages, including any direct, indirect, special,
-      incidental, or consequential damages of any character arising as a
-      result of this License or out of the use or inability to use the
-      Work (including but not limited to damages for loss of goodwill,
-      work stoppage, computer failure or malfunction, or any and all
-      other commercial damages or losses), even if such Contributor
-      has been advised of the possibility of such damages.
-
-   9. Accepting Warranty or Additional Liability. While redistributing
-      the Work or Derivative Works thereof, You may choose to offer,
-      and charge a fee for, acceptance of support, warranty, indemnity,
-      or other liability obligations and/or rights consistent with this
-      License. However, in accepting such obligations, You may act only
-      on Your own behalf and on Your sole responsibility, not on behalf
-      of any other Contributor, and only if You agree to indemnify,
-      defend, and hold each Contributor harmless for any liability
-      incurred by, or claims asserted against, such Contributor by reason
-      of your accepting any such warranty or additional liability.
-
-   END OF TERMS AND CONDITIONS
-
-   APPENDIX: How to apply the Apache License to your work.
-
-      To apply the Apache License to your work, attach the following
-      boilerplate notice, with the fields enclosed by brackets "[]"
-      replaced with your own identifying information. (Don't include
-      the brackets!)  The text should be enclosed in the appropriate
-      comment syntax for the file format. We also recommend that a
-      file or class name and description of purpose be included on the
-      same "printed page" as the copyright notice for easier
-      identification within third-party archives.
-
-   Copyright [yyyy] [name of copyright owner]
-
-   Licensed under the Apache License, Version 2.0 (the "License");
-   you may not use this file except in compliance with the License.
-   You may obtain a copy of the License at
-
-       http://www.apache.org/licenses/LICENSE-2.0
-
-   Unless required by applicable law or agreed to in writing, software
-   distributed under the License is distributed on an "AS IS" BASIS,
-   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-   See the License for the specific language governing permissions and
-   limitations under the License.
diff --git a/lang/NOTICE.txt b/lang/NOTICE.txt
deleted file mode 100644
index 592023a..0000000
--- a/lang/NOTICE.txt
+++ /dev/null
@@ -1,8 +0,0 @@
-Apache Commons Lang
-Copyright 2001-2015 The Apache Software Foundation
-
-This product includes software developed at
-The Apache Software Foundation (http://www.apache.org/).
-
-This product includes software from the Spring Framework,
-under the Apache License 2.0 (see: StringUtils.containsWhitespace())
diff --git a/lang/README.md b/lang/README.md
deleted file mode 100644
index 8d91cba..0000000
--- a/lang/README.md
+++ /dev/null
@@ -1,100 +0,0 @@
-<!---
- Licensed to the Apache Software Foundation (ASF) under one or more
- contributor license agreements.  See the NOTICE file distributed with
- this work for additional information regarding copyright ownership.
- The ASF licenses this file to You under the Apache License, Version 2.0
- (the "License"); you may not use this file except in compliance with
- the License.  You may obtain a copy of the License at
-
-      http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
--->
-<!---
- +======================================================================+
- |****                                                              ****|
- |****      THIS FILE IS GENERATED BY THE COMMONS BUILD PLUGIN      ****|
- |****                    DO NOT EDIT DIRECTLY                      ****|
- |****                                                              ****|
- +======================================================================+
- | TEMPLATE FILE: readme-md-template.md                                 |
- | commons-build-plugin/trunk/src/main/resources/commons-xdoc-templates |
- +======================================================================+
- |                                                                      |
- | 1) Re-generate using: mvn commons:readme-md                          |
- |                                                                      |
- | 2) Set the following properties in the component's pom:              |
- |    - commons.componentid (required, alphabetic, lower case)          |
- |    - commons.release.version (required)                              |
- |                                                                      |
- | 3) Example Properties                                                |
- |                                                                      |
- |  <properties>                                                        |
- |    <commons.componentid>math</commons.componentid>                   |
- |    <commons.release.version>1.2</commons.release.version>            |
- |  </properties>                                                       |
- |                                                                      |
- +======================================================================+
---->
-Apache Commons Lang
-===================
-
-Apache Commons Lang, a package of Java utility classes for the
-  classes that are in java.lang's hierarchy, or are considered to be so
-  standard as to justify existence in java.lang.
-
-Documentation
--------------
-
-More information can be found on the [homepage](https://commons.apache.org/proper/commons-lang3).
-The [JavaDoc](https://commons.apache.org/proper/commons-lang3/javadocs/api-release) can be browsed.
-Questions related to the usage of Apache Commons Lang should be posted to the [user mailing list][ml].
-
-Where can I get the latest release?
------------------------------------
-You can download source and binaries from our [download page](https://commons.apache.org/proper/commons-lang3/download_lang3.cgi).
-
-Alternatively you can pull it from the central Maven repositories:
-
-```xml
-<dependency>
-  <groupId>org.apache.commons</groupId>
-  <artifactId>commons-lang3</artifactId>
-  <version>3.3.2</version>
-</dependency>
-```
-
-Contributing
-------------
-
-We accept PRs via github. The [developer mailing list][ml] is the main channel of communication for contributors.
-There are some guidelines which will make applying PRs easier for us:
-+ No tabs! Please use spaces for indentation.
-+ Respect the code style.
-+ Create minimal diffs - disable on save actions like reformat source code or organize imports. If you feel the source code should be reformatted create a separate PR for this change.
-+ Provide JUnit tests for your changes and make sure your changes don't break any existing tests by running ```mvn clean test```.
-
-If you plan to contribute on a regular basis, please consider filing a [contributor license agreement](https://www.apache.org/licenses/#clas).
-You can learn more about contributing via GitHub in our [contribution guidelines](CONTRIBUTING.md).
-
-License
--------
-Code is under the [Apache Licence v2](https://www.apache.org/licenses/LICENSE-2.0.txt).
-
-Donations
----------
-You like Apache Commons Lang? Then [donate back to the ASF](https://www.apache.org/foundation/contributing.html) to support the development.
-
-Additional Resources
---------------------
-
-+ [Apache Commons Homepage](https://commons.apache.org/)
-+ [Apache Bugtracker (JIRA)](https://issues.apache.org/jira/)
-+ [Apache Commons Twitter Account](https://twitter.com/ApacheCommons)
-+ #apachecommons IRC channel on freenode.org
-
-[ml]:https://commons.apache.org/mail-lists.html
diff --git a/lang/RELEASE-NOTES.txt b/lang/RELEASE-NOTES.txt
deleted file mode 100644
index 8fe9508..0000000
--- a/lang/RELEASE-NOTES.txt
+++ /dev/null
@@ -1,608 +0,0 @@
-                           Apache Commons Lang
-                               Version 3.4
-                              Release Notes
-
-
-INTRODUCTION:
-
-This document contains the release notes for the 3.4 version of
-Apache Commons Lang. Commons Lang is a set of utility functions and reusable 
-components that should be of use in any Java environment. Commons Lang 3.4
-at least requires Java 6.0.
-
-For the advice on upgrading from 2.x to 3.x, see the following page:
-
-    http://commons.apache.org/lang/article3_0.html
-
-
-NEW FEATURES
-==============
-
-o LANG-1103: Add SystemUtils.IS_JAVA_1_9
-o LANG-1093: Add ClassUtils.getAbbreviatedName(). Thanks to Fabian Lange.
-o LANG-1082: Add option to disable the "objectsTriviallyEqual" test in
-             DiffBuilder. Thanks to Jonathan Baker.
-o LANG-1015: Add JsonToStringStyle implementation to ToStringStyle. Thanks to
-             Thiago Andrade.
-o LANG-1080: Add NoClassNameToStringStyle implementation of ToStringStyle.
-             Thanks to Innokenty Shuvalov.
-o LANG-883:  Add StringUtils.containsAny(CharSequence, CharSequence...) method.
-             Thanks to Daniel Stewart.
-o LANG-1052: Multiline recursive to string style. Thanks to Jan Matèrne.
-o LANG-536:  Add isSorted() to ArrayUtils. Thanks to James Sawle.
-o LANG-1033: Add StringUtils.countMatches(CharSequence, char)
-o LANG-1021: Provide methods to retrieve all fields/methods annotated with a
-             specific type. Thanks to Alexander Müller.
-o LANG-1016: NumberUtils#isParsable method(s). Thanks to
-             Juan Pablo Santos Rodríguez.
-o LANG-999:  Add fuzzy String matching logic to StringUtils. Thanks to
-             Ben Ripkens.
-o LANG-994:  Add zero copy read method to StrBuilder. Thanks to
-             Mikhail Mazursky.
-o LANG-993:  Add zero copy write method to StrBuilder. Thanks to
-             Mikhail Mazursky.
-o LANG-1044: Add method MethodUtils.invokeExactMethod(Object, String)
-o LANG-1045: Add method MethodUtils.invokeMethod(Object, String)
-
-FIXED BUGS
-============
-
-o LANG-948:  Exception while using ExtendedMessageFormat and escaping braces.
-             Thanks to Andrey Khobnya.
-o LANG-1092: Wrong formating of time zones with daylight saving time in
-             FastDatePrinter
-o LANG-1090: FastDateParser does not set error indication in ParsePosition
-o LANG-1089: FastDateParser does not handle excess hours as per
-             SimpleDateFormat
-o LANG-1061: FastDateParser error - timezones not handled correctly. Thanks to
-             dmeneses.
-o LANG-1087: NumberUtils#createNumber() returns positive BigDecimal when
-             negative Float is expected. Thanks to Renat Zhilkibaev.
-o LANG-1081: DiffBuilder.append(String, Object left, Object right) does not do
-             a left.equals(right) check. Thanks to Jonathan Baker.
-o LANG-1055: StrSubstitutor.replaceSystemProperties does not work consistently.
-             Thanks to Jonathan Baker.
-o LANG-1083: Add (T) casts to get unit tests to pass in old JDK. Thanks to
-             Jonathan Baker.
-o LANG-1073: Read wrong component type of array in add in ArrayUtils.
-             Thanks to haiyang li.
-o LANG-1077: StringUtils.ordinalIndexOf("aaaaaa", "aa", 2) != 3 in StringUtils.
-             Thanks to haiyang li.
-o LANG-1072: Duplicated "0x" check in createBigInteger in NumberUtils. Thanks 
-             to haiyang li.
-o LANG-1064: StringUtils.abbreviate description doesn't agree with the 
-             examples. Thanks to B.J. Herbison.
-o LANG-1041: Fix MethodUtilsTest so it does not depend on JDK method ordering.
-             Thanks to Alexandre Bartel.
-o LANG-1000: ParseException when trying to parse UTC dates with Z as zone
-             designator using DateFormatUtils.ISO_DATETIME_TIME_ZONE_FORMAT
-o LANG-1035: Javadoc for EqualsBuilder.reflectionEquals() is unclear
-o LANG-1001: ISO 8601 misspelled throughout the Javadocs. Thanks to
-             Michael Osipov.
-o LANG-1088: FastDateParser should be case insensitive
-o LANG-995:  Fix bug with stripping spaces on last line in WordUtils.wrap().
-             Thanks to Andrey Khobnya.
-
-CHANGES
-=========
-
-o LANG-1102: Make logic for comparing OS versions in SystemUtils smarter
-o LANG-1091: Shutdown thread pools in test cases. Thanks to Fabian Lange.
-o LANG-1101: FastDateParser and FastDatePrinter support 'X' format
-o LANG-1100: Avoid memory allocation when using date formating to StringBuffer.
-             Thanks to mbracher.
-o LANG-935:  Possible performance improvement on string escape functions.
-             Thanks to Fabian Lange, Thomas Neidhart.
-o LANG-1098: Avoid String allocation in StrBuilder.append(CharSequence). Thanks
-             to Mikhail Mazurskiy, Fabian Lange.
-o LANG-1098: Update maven-checkstyle-plugin to 2.14. Thanks to Micha? Kordas.
-o LANG-1097: Update org.easymock:easymock to 3.3.1. Thanks to Micha? Kordas.
-o LANG-1096: Update maven-pmd-plugin to 3.4. Thanks to Micha? Kordas.
-o LANG-1095: Update maven-antrun-plugin to 1.8. Thanks to Micha? Kordas.
-o LANG-877:  Performance improvements for StringEscapeUtils. Thanks to
-             Fabian Lange.
-o LANG-1071: Fix wrong examples in JavaDoc of 
-             StringUtils.replaceEachRepeatedly(...), 
-             StringUtils.replaceEach(...) Thanks to Arno Noordover.
-o LANG-827:  CompareToBuilder's doc doesn't specify precedence of fields it
-             uses in performing comparisons
-o LANG-1020: Improve performance of normalize space. Thanks to Libor Ondrusek.
-o LANG-1027: org.apache.commons.lang3.SystemUtils#isJavaVersionAtLeast should
-             return true by default
-o LANG-1026: Bring static method references in StringUtils to consistent style.
-             Thanks to Alex Yursha.
-o LANG-1017: Use non-ASCII digits in Javadoc examples for 
-             StringUtils.isNumeric. Thanks to Christoph Schneegans.
-o LANG-1008: Change min/max methods in NumberUtils/IEEE754rUtils from array
-             input parameters to varargs. Thanks to Thiago Andrade.
-o LANG-1006: Add wrap (with String or char) to StringUtils. Thanks to
-             Thiago Andrade.
-o LANG-1005: Extend DurationFormatUtils#formatDurationISO default pattern to
-             match #formatDurationHMS. Thanks to Michael Osipov.
-o LANG-1007: Fixing NumberUtils JAVADoc comments for max methods. Thanks to
-             Thiago Andrade.
-o LANG-731:  Better Javadoc for BitField class
-o LANG-1004: DurationFormatUtils#formatDurationHMS implementation does not
-             correspond to Javadoc and vice versa. Thanks to Michael Osipov.
-o LANG-1003: DurationFormatUtils are not able to handle negative
-             durations/periods
-o LANG-998:  Javadoc is not clear on preferred pattern to instantiate
-             FastDateParser / FastDatePrinter
-
-                        Release Notes for version 3.3.2
-
-NEW FEATURES
-==============
-
-o LANG-989:  Add org.apache.commons.lang3.SystemUtils.IS_JAVA_1_8
-
-FIXED BUGS
-============
-
-o LANG-992:  NumberUtils#isNumber() returns false for "0.0", "0.4790", et al
-
-                        Release Notes for version 3.3.1
-
-FIXED BUGS
-============
-
-o LANG-987:  DateUtils.getFragmentInDays(Date, Calendar.MONTH) returns wrong
-             days
-o LANG-983:  DurationFormatUtils does not describe format string fully
-o LANG-981:  DurationFormatUtils#lexx does not detect unmatched quote char
-o LANG-984:  DurationFormatUtils does not handle large durations correctly
-o LANG-982:  DurationFormatUtils.formatDuration(61999, "s.SSSS") - ms field
-             size should be 4 digits
-o LANG-978:  Failing tests with Java 8 b128
-
-                        Release Notes for version 3.3
-
-NEW FEATURES
-==============
-
-o LANG-955:  Add methods for removing all invalid characters according to
-             XML 1.0 and XML 1.1 in an input string to StringEscapeUtils.
-             Thanks to Adam Hooper.
-o LANG-970:  Add APIs MutableBoolean setTrue() and setFalse()
-o LANG-962:  Add SerializationUtils.roundtrip(T extends Serializable) to
-             serialize then deserialize
-o LANG-637:  There should be a DifferenceBuilder with a
-             ReflectionDifferenceBuilder implementation
-o LANG-944:  Add the Jaro-Winkler string distance algorithm to StringUtils.
-             Thanks to Rekha Joshi.
-o LANG-417:  New class ClassPathUtils with methods for turning FQN into
-             resource path
-o LANG-834:  Validate: add inclusiveBetween and exclusiveBetween overloads
-             for primitive types
-o LANG-900:  New RandomUtils class. Thanks to Duncan Jones.
-o LANG-966:  Add IBM OS/400 detection
-
-FIXED BUGS
-============
-
-o LANG-621:  ReflectionToStringBuilder.toString does not debug 3rd party object
-             fields within 3rd party object. Thanks to Philip Hodges,
-             Thomas Neidhart.
-o LANG-977:  NumericEntityEscaper incorrectly encodes supplementary characters.
-             Thanks to Chris Karcher.
-o LANG-973:  Make some private fields final
-o LANG-971:  NumberUtils#isNumber(String) fails to reject invalid Octal numbers
-o LANG-972:  NumberUtils#isNumber does not allow for hex 0XABCD
-o LANG-969:  StringUtils.toEncodedString(byte[], Charset) needlessly throws
-             UnsupportedEncodingException. Thanks to Matt Bishop.
-o LANG-946:  ConstantInitializerTest fails when building with IBM JDK 7
-o LANG-954:  uncaught PatternSyntaxException in FastDateFormat on Android.
-             Thanks to Michael Keppler.
-o LANG-936:  StringUtils.getLevenshteinDistance with too big of a threshold
-             returns wrong result. Thanks to Yaniv Kunda, Eli Lindsey.
-o LANG-943:  Test DurationFormatUtilsTest.testEdgeDuration fails in
-             JDK 1.6, 1.7 and 1.8, BRST time zone
-o LANG-613:  ConstructorUtils.getAccessibleConstructor() Does Not Check the
-             Accessibility of Enclosing Classes
-o LANG-951:  Fragments are wrong by 1 day when using fragment YEAR or MONTH.
-             Thanks to Sebastian Götz.
-o LANG-950:  FastDateParser does not handle two digit year parsing like
-             SimpleDateFormat
-o LANG-949:  FastDateParserTest.testParses does not test FastDateParser
-o LANG-915:  Wrong locale handling in LocaleUtils.toLocale().
-             Thanks to Sergio Fernández.
-
-CHANGES
-=========
-
-o LANG-961:  org.apache.commons.lang3.reflect.FieldUtils.removeFinalModifier(Field)
-             does not clean up after itself
-o LANG-958:  FastDateParser javadoc incorrectly states that SimpleDateFormat
-             is used internally
-o LANG-956:  Improve JavaDoc of WordUtils.wrap methods
-o LANG-939:  Move Documentation from user guide to package-info files
-o LANG-953:  Convert package.html files to package-info.java files
-o LANG-940:  Fix deprecation warnings
-o LANG-819:  EnumUtils.generateBitVector needs a "? extends"
-
-                        Release Notes for version 3.2.1
-
-BUG FIXES
-===========
-
-o LANG-937:  Fix missing Hamcrest dependency in Ant Build
-o LANG-941:  Test failure in LocaleUtilsTest when building with JDK 8
-o LANG-942:  Test failure in FastDateParserTest and FastDateFormat_ParserTest
-             when building with JDK8. Thanks to Bruno P. Kinoshita,
-             Henri Yandell.
-o LANG-938:  Build fails with test failures when building with JDK 8 
-
-                        Release Notes for version 3.2
-
-COMPATIBILITY WITH 3.1
-========================
-
-This release introduces backwards incompatible changes in 
-org.apache.commons.lang3.time.FastDateFormat:
-o Method 'protected java.util.List parsePattern()' has been removed
-o Method 'protected java.lang.String parseToken(java.lang.String, int[])' has
-  been removed
-o Method 'protected org.apache.commons.lang3.time.FastDateFormat$NumberRule
-  selectNumberRule(int, int)' has been removed
-
-These changes were the result of [LANG-462]. It is assumed that this change 
-will not break clients as Charles Honton pointed out on 25/Jan/12:
-"
- 1. Methods "FastDateFormat$NumberRule selectNumberRule(int, int)" and 
-    "List<Rule> parsePattern()" couldn't have been overridden because
-    NumberRule and Rule were private to FastDateFormat.
- 2. Due to the factory pattern used, it's unlikely other two methods would have 
-    been overridden.
- 3. The four methods are highly implementation specific. I consider it a 
-    mistake that the methods were exposed.
-"
-For more information see https://issues.apache.org/jira/browse/LANG-462.
-
-NEW FEATURES
-==============
-
-o LANG-934:  Add removeFinalModifier to FieldUtils
-o LANG-863:  Method returns number of inheritance hops between parent and
-             subclass. Thanks to Daneel S. Yaitskov.
-o LANG-774:  Added isStarted, isSuspended and isStopped to StopWatch.
-             Thanks to Erhan Bagdemir.
-o LANG-848:  Added StringUtils.isBlank/isEmpty CharSequence... methods.
-             Thanks to Alexander Muthmann.
-o LANG-926:  Added ArrayUtils.reverse(array, from, to) methods.
-o LANG-795:  StringUtils.toString(byte[], String) deprecated in favour of a new
-             StringUtils.toString(byte[], CharSet). Thanks to Aaron Digulla.
-o LANG-893:  StrSubstitutor now supports default values for variables.
-             Thanks to Woonsan Ko.
-o LANG-913:  Adding .gitignore to commons-lang. Thanks to Allon Mureinik.
-o LANG-837:  Add ObjectUtils.toIdentityString methods that support
-             StringBuilder, StrBuilder, and Appendable.
-o LANG-886:  Added CharSetUtils.containsAny(String, String).
-o LANG-797:  Added escape/unescapeJson to StringEscapeUtils.
-o LANG-875:  Added appendIfMissing and prependIfMissing methods to StringUtils.
-o LANG-870:  Add StringUtils.LF and StringUtils.CR values.
-o LANG-873:  Add FieldUtils getAllFields() to return all the fields defined in
-             the given class and super classes.
-o LANG-835:  StrBuilder should support StringBuilder as an input parameter.
-o LANG-857:  StringIndexOutOfBoundsException in CharSequenceTranslator.
-o LANG-856:  Code refactoring in NumberUtils.
-o LANG-855:  NumberUtils#createBigInteger does not allow for hex and octal
-             numbers.
-o LANG-854:  NumberUtils#createNumber - does not allow for hex numbers to be
-             larger than Long. 
-o LANG-853:  StringUtils join APIs for primitives. 
-o LANG-841:  Add StringUtils API to call String.replaceAll in DOTALL a.k.a.
-             single-line mode. 
-o LANG-825:  Create StrBuilder APIs similar to
-             String.format(String, Object...).
-o LANG-675:  Add Triple class (ternary version of Pair).
-o LANG-462:  FastDateFormat supports parse methods.
-
-BUG FIXES
-===========
-
-o LANG-932:  Spelling fixes. Thanks to Ville Skyttä.
-o LANG-929:  OctalUnescaper tried to parse all of \279.
-o LANG-928:  OctalUnescaper had bugs when parsing octals starting with a zero.
-o LANG-905:  EqualsBuilder returned true when comparing arrays, even when the
-             elements are different.
-o LANG-917:  Fixed exception when combining custom and choice format in
-             ExtendedMessageFormat. Thanks to Arne Burmeister.
-o LANG-902:  RandomStringUtils.random javadoc was incorrectly promising letters
-             and numbers would, as opposed to may, appear  Issue:. Thanks to
-             Andrzej Winnicki.
-o LANG-921:  BooleanUtils.xor(boolean...) produces wrong results.
-o LANG-896:  BooleanUtils.toBoolean(String str) javadoc is not updated. Thanks
-             to Mark Bryan Yu.
-o LANG-879:  LocaleUtils test fails with new Locale "ja_JP_JP_#u-ca-japanese"
-             of JDK7.
-o LANG-836:  StrSubstitutor does not support StringBuilder or CharSequence.
-             Thanks to Arnaud Brunet.
-o LANG-693:  Method createNumber from NumberUtils doesn't work for floating
-             point numbers other than Float  Issue: LANG-693. Thanks to
-             Calvin Echols.
-o LANG-887:  FastDateFormat does not use the locale specific cache correctly.
-o LANG-754:  ClassUtils.getShortName(String) will now only do a reverse lookup
-             for array types.
-o LANG-881:  NumberUtils.createNumber() Javadoc says it does not work for octal
-             numbers.
-o LANG-865:  LocaleUtils.toLocale does not parse strings starting with an
-             underscore.
-o LANG-858:  StringEscapeUtils.escapeJava() and escapeEcmaScript() do not
-             output the escaped surrogate pairs that are Java parsable.
-o LANG-849:  FastDateFormat and FastDatePrinter generates Date objects 
-             wastefully.
-o LANG-845:  Spelling fixes.
-o LANG-844:  Fix examples contained in javadoc of StringUtils.center methods.
-o LANG-832:  FastDateParser does not handle unterminated quotes correctly.
-o LANG-831:  FastDateParser does not handle white-space properly.
-o LANG-830:  FastDateParser could use \Q \E to quote regexes.
-o LANG-828:  FastDateParser does not handle non-Gregorian calendars properly.
-o LANG-826:  FastDateParser does not handle non-ASCII digits correctly.
-o LANG-822:  NumberUtils#createNumber - bad behaviour for leading "--".
-o LANG-818:  FastDateFormat's "z" pattern does not respect timezone of Calendar
-             instances passed to format().
-o LANG-817:  Add org.apache.commons.lang3.SystemUtils.IS_OS_WINDOWS_8.
-o LANG-813:  StringUtils.equalsIgnoreCase doesn't check string reference
-             equality.
-o LANG-810:  StringUtils.join() endIndex, bugged for loop.
-o LANG-807:  RandomStringUtils throws confusing IAE when end <= start.
-o LANG-805:  RandomStringUtils.random(count, 0, 0, false, false, universe,
-             random) always throws java.lang.ArrayIndexOutOfBoundsException.
-o LANG-802:  LocaleUtils - unnecessary recursive call in SyncAvoid class.
-o LANG-800:  Javadoc bug in DateUtils#ceiling for Calendar and Object versions.
-o LANG-788:  SerializationUtils throws ClassNotFoundException when cloning 
-             primitive classes.
-o LANG-786:  StringUtils equals() relies on undefined behavior.
-o LANG-783:  Documentation bug: StringUtils.split.
-o LANG-777:  jar contains velocity template of release notes.
-o LANG-776:  TypeUtilsTest contains incorrect type assignability assertion.
-o LANG-775:  TypeUtils.getTypeArguments() misses type arguments for
-             partially-assigned classes.
-o LANG-773:  ImmutablePair doc contains nonsense text.
-o LANG-772:  ClassUtils.PACKAGE_SEPARATOR Javadoc contains garbage text.
-o LANG-765:  EventListenerSupport.ProxyInvocationHandler no longer defines 
-             serialVersionUID.
-o LANG-764:  StrBuilder is now serializable.
-o LANG-761:  Fix Javadoc Ant warnings.
-o LANG-747:  NumberUtils does not handle Long Hex numbers.
-o LANG-743:  Javadoc bug in static inner class DateIterator.
-
-CHANGES
-=========
-
-o LANG-931:  Misleading Javadoc comment in StrBuilderReader class. Thanks
-             to Christoph Schneegans.
-o LANG-910:  StringUtils.normalizeSpace now handles non-breaking spaces
-             (Unicode 00A0). Thanks to Timur Yarosh.
-o LANG-804:  Redundant check for zero in HashCodeBuilder ctor. Thanks to 
-             Allon Mureinik.
-o LANG-884:  Simplify FastDateFormat; eliminate boxing.
-o LANG-882:  LookupTranslator now works with implementations of CharSequence
-             other than String.
-o LANG-846:  Provide CharSequenceUtils.regionMatches with a proper green
-             implementation instead of inefficiently converting to Strings.
-o LANG-839:  ArrayUtils removeElements methods use unnecessary HashSet.
-o LANG-838:  ArrayUtils removeElements methods clone temporary index arrays
-             unnecessarily.
-o LANG-799:  DateUtils#parseDate uses default locale; add Locale support.
-o LANG-798:  Use generics in SerializationUtils.
-
-CHANGES WITHOUT TICKET
-========================
-
-o Fixed URLs in javadoc to point to new oracle.com pages
-
-
-                        Release Notes for version 3.1
-
-NEW FEATURES
-==============
-
-o LANG-801:  Add Conversion utility to convert between data types on byte level
-o LANG-760:  Add API StringUtils.toString(byte[] intput, String charsetName)
-o LANG-756:  Add APIs ClassUtils.isPrimitiveWrapper(Class<?>) and 
-             isPrimitiveOrWrapper(Class<?>)
-o LANG-695:  SystemUtils.IS_OS_UNIX doesn't recognize FreeBSD as a Unix system
-
-BUG FIXES
-===========
-
-o LANG-749:  Incorrect Bundle-SymbolicName in Manifest
-o LANG-746:  NumberUtils does not handle upper-case hex: 0X and -0X
-o LANG-744:  StringUtils throws java.security.AccessControlException on Google
-             App Engine
-o LANG-741:  Ant build has wrong component.name
-o LANG-698:  Document that the Mutable numbers don't work as expected with
-             String.format
-
-CHANGES
-=========
-
-o LANG-758:  Add an example with whitespace in StringUtils.defaultIfEmpty
-o LANG-752:  Fix createLong() so it behaves like createInteger()
-o LANG-751:  Include the actual type in the Validate.isInstance and
-             isAssignableFrom exception messages
-o LANG-748:  Deprecating chomp(String, String)
-o LANG-736:  CharUtils static final array CHAR_STRING is not needed to compute
-             CHAR_STRING_ARRAY
-
-
-                        Release Notes for version 3.0
-
-ADDITIONS
-===========
-
-o LANG-276:  MutableBigDecimal and MutableBigInteger.
-o LANG-285:  Wish : method unaccent.
-o LANG-358:  ObjectUtils.coalesce.
-o LANG-386:  LeftOf/RightOfNumber in Range convenience methods necessary.
-o LANG-435:  Add ClassUtils.isAssignable() variants with autoboxing.
-o LANG-444:  StringUtils.emptyToNull.
-o LANG-482:  Enhance StrSubstitutor to support nested ${var-${subvr}} expansion
-o LANG-482:  StrSubstitutor now supports substitution in variable names.
-o LANG-496:  A generic implementation of the Lazy initialization pattern.
-o LANG-497:  Addition of ContextedException and ContextedRuntimeException.
-o LANG-498:  Add StringEscapeUtils.escapeText() methods.
-o LANG-499:  Add support for the handling of ExecutionExceptions.
-o LANG-501:  Add support for background initialization.
-o LANG-529:  Add a concurrent package.
-o LANG-533:  Validate: support for validating blank strings.
-o LANG-537:  Add ArrayUtils.toArray to create generic arrays.
-o LANG-545:  Add ability to create a Future for a constant.
-o LANG-546:  Add methods to Validate to check whether the index is valid for
-             the array/list/string.
-o LANG-553:  Add TypeUtils class to provide utility code for working with generic
-             types.
-o LANG-559:  Added isAssignableFrom and isInstanceOf validation methods.
-o LANG-559:  Added validState validation method.
-o LANG-560:  New TimedSemaphore class.
-o LANG-582:  Provide an implementation of the ThreadFactory interface.
-o LANG-588:  Create a basic Pair<L, R> class.
-o LANG-594:  DateUtils equal & compare functions up to most significant field.
-o LANG-601:  Add Builder Interface / Update Builders to Implement It.
-o LANG-609:  Support lazy initialization using atomic variables
-o LANG-610:  Extend exception handling in ConcurrentUtils to runtime exceptions.
-o LANG-614:  StringUtils.endsWithAny method
-o LANG-640:  Add normalizeSpace to StringUtils
-o LANG-644:  Provide documentation about the new concurrent package
-o LANG-649:  BooleanUtils.toBooleanObject to support single character input
-o LANG-651:  Add AnnotationUtils
-o LANG-653:  Provide a very basic ConcurrentInitializer implementation
-o LANG-655:  Add StringUtils.defaultIfBlank()
-o LANG-667:  Add a Null-safe compare() method to ObjectUtils
-o LANG-676:  Documented potential NPE if auto-boxing occurs for some BooleanUtils
-             methods
-o LANG-678:  Add support for ConcurrentMap.putIfAbsent()
-o LANG-692:  Add hashCodeMulti varargs method
-o LANG-697:  Add FormattableUtils class
-o LANG-684:  Levenshtein Distance Within a Given Threshold
-
-REMOVALS
-==========
-
-o LANG-438:  Remove @deprecateds.
-o LANG-492:  Remove code handled now by the JDK.
-o LANG-493:  Remove code that does not hold enough value to remain.
-o LANG-590:  Remove JDK 1.2/1.3 bug handling in 
-             StringUtils.indexOf(String, String, int).
-o LANG-673:  WordUtils.abbreviate() removed
-o LANG-691:  Removed DateUtils.UTC_TIME_ZONE
-
-IMPROVEMENTS
-==============
-
-o LANG-290:  EnumUtils for JDK 5.0.
-o LANG-336:  Finally start using generics.
-o LANG-355:  StrBuilder should implement CharSequence and Appendable.
-o LANG-396:  Investigate for vararg usages.
-o LANG-424:  Improve Javadoc for StringUtils class.
-o LANG-458:  Refactor Validate.java to eliminate code redundancy.
-o LANG-479:  Document where in SVN trunk is.
-o LANG-504:  bring ArrayUtils.isEmpty to the generics world.
-o LANG-505:  Rewrite StringEscapeUtils.
-o LANG-507:  StringEscapeUtils.unescapeJava should support \u+ notation.
-o LANG-510:  Convert StringUtils API to take CharSequence.
-o LANG-513:  Better EnumUtils.
-o LANG-528:  Mutable classes should implement an appropriately typed Mutable
-             interface.
-o LANG-539:  Compile commons.lang for CDC 1.1/Foundation 1.1.
-o LANG-540:  Make NumericEntityEscaper immutable.
-o LANG-541:  Replace StringBuffer with StringBuilder.
-o LANG-548:  Use Iterable on API instead of Collection.
-o LANG-551:  Replace Range classes with generic version.
-o LANG-562:  Change Maven groupId.
-o LANG-563:  Change Java package name.
-o LANG-570:  Do the test cases really still require main() and suite() methods?
-o LANG-579:  Add new Validate methods.
-o LANG-599:  ClassUtils.getClass(): Allow Dots as Inner Class Separators.
-o LANG-605:  DefaultExceptionContext overwrites values in recursive situations.
-o LANG-668:  Change ObjectUtils min() & max() functions to use varargs rather
-             than just two parameters
-o LANG-681:  Push down WordUtils to "text" sub-package.
-o LANG-711:  Add includeantruntime=false to javac targets to quell warnings in
-             ant 1.8.1 and better (and modest performance gain).
-o LANG-713:  Increase test coverage of FieldUtils read methods and tweak
-             javadoc.
-o LANG-718:  build.xml Java 1.5+ updates.
-
-BUG FIXES
-===========
-
-o LANG-11:   Depend on JDK 1.5+.
-o LANG-302:  StrBuilder does not implement clone().
-o LANG-339:  StringEscapeUtils.escapeHtml() escapes multibyte characters like
-             Chinese, Japanese, etc.
-o LANG-369:  ExceptionUtils not thread-safe.
-o LANG-418:  Javadoc incorrect for StringUtils.endsWithIgnoreCase.
-o LANG-428:  StringUtils.isAlpha, isAlphanumeric and isNumeric now return false
-             for ""
-o LANG-439:  StringEscapeUtils.escapeHTML() does not escape chars (0x00-0x20).
-o LANG-448:  Lower Ascii Characters don't get encoded by Entities.java.
-o LANG-468:  JDK 1.5 build/runtime failure on LANG-393 (EqualsBuilder).
-o LANG-474:  Fixes for thread safety.
-o LANG-478:  StopWatch does not resist to system time changes.
-o LANG-480:  StringEscapeUtils.escapeHtml incorrectly converts unicode
-             characters above U+00FFFF into 2 characters.
-o LANG-481:  Possible race-conditions in hashCode of the range classes.
-o LANG-564:  Improve StrLookup API documentation.
-o LANG-568:  @SuppressWarnings("unchecked") is used too generally.
-o LANG-571:  ArrayUtils.add(T[:  array, T element) can create unexpected
-             ClassCastException.
-o LANG-585:  exception.DefaultExceptionContext.getFormattedExceptionMessage
-             catches Throwable.
-o LANG-596:  StrSubstitutor should also handle the default properties of a
-             java.util.Properties class
-o LANG-600:  Javadoc is incorrect for public static int 
-             lastIndexOf(String str, String searchStr).
-o LANG-602:  ContextedRuntimeException no longer an 'unchecked' exception.
-o LANG-606:  EqualsBuilder causes StackOverflowException.
-o LANG-608:  Some StringUtils methods should take an int character instead of
-             char to use String API features.
-o LANG-617:  StringEscapeUtils.escapeXML() can't process UTF-16 supplementary
-             characters
-o LANG-624:  SystemUtils.getJavaVersionAsFloat throws 
-             StringIndexOutOfBoundsException on Android runtime/Dalvik VM
-o LANG-629:  Charset may not be threadsafe, because the HashSet is not synch.
-o LANG-638:  NumberUtils createNumber throws a StringIndexOutOfBoundsException
-             when argument containing "e" and "E" is passed in
-o LANG-643:  Javadoc StringUtils.left() claims to throw on negative len, but
-             doesn't
-o LANG-645:  FastDateFormat.format() outputs incorrect week of year because
-             locale isn't respected
-o LANG-646:  StringEscapeUtils.unescapeJava doesn't handle octal escapes and
-             Unicode with extra u
-o LANG-656:  Example StringUtils.indexOfAnyBut("zzabyycdxx", '') = 0 incorrect
-o LANG-658:  Some Entitys like &Ouml; are not matched properly against its
-             ISO8859-1 representation
-o LANG-659:  EntityArrays typo: {"\u2122", "&minus;"}, // minus sign, U+2212
-             ISOtech
-o LANG-66:   StringEscaper.escapeXml() escapes characters > 0x7f.
-o LANG-662:  org.apache.commons.lang3.math.Fraction does not reduce
-             (Integer.MIN_VALUE, 2^k)
-o LANG-663:  org.apache.commons.lang3.math.Fraction does not always succeed in
-             multiplyBy and divideBy
-o LANG-664:  NumberUtils.isNumber(String) is not right when the String is
-             "1.1L"
-o LANG-672:  Doc bug in DateUtils#ceiling
-o LANG-677:  DateUtils.isSameLocalTime compares using 12 hour clock and not
-             24 hour
-o LANG-685:  EqualsBuilder synchronizes on HashCodeBuilder.
-o LANG-703:  StringUtils.join throws NPE when toString returns null for one of
-             objects in collection
-o LANG-710:  StringIndexOutOfBoundsException when calling unescapeHtml4("&#03")
-o LANG-714:  StringUtils doc/comment spelling fixes.
-o LANG-715:  CharSetUtils.squeeze() speedup.
-o LANG-716:  swapCase and *capitalize speedups.
-
-
-Historical list of changes: http://commons.apache.org/lang/changes-report.html
-
-For complete information on Commons Lang, including instructions on how to
-submit bug reports, patches, or suggestions for improvement, see the 
-Apache Commons Lang website:
-
-http://commons.apache.org/lang/
-
-Have fun!
--Apache Commons Lang team
-
diff --git a/lang/build.properties.sample b/lang/build.properties.sample
deleted file mode 100644
index a969620..0000000
--- a/lang/build.properties.sample
+++ /dev/null
@@ -1,28 +0,0 @@
-#   Licensed to the Apache Software Foundation (ASF) under one or more
-#   contributor license agreements.  See the NOTICE file distributed with
-#   this work for additional information regarding copyright ownership.
-#   The ASF licenses this file to You under the Apache License, Version 2.0
-#   (the "License"); you may not use this file except in compliance with
-#   the License.  You may obtain a copy of the License at
-#
-#       http://www.apache.org/licenses/LICENSE-2.0
-#
-#   Unless required by applicable law or agreed to in writing, software
-#   distributed under the License is distributed on an "AS IS" BASIS,
-#   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-#   See the License for the specific language governing permissions and
-#   limitations under the License.
-##########################################################################
-# Sample Ant build.properties file
-#
-# This setup assumes dependent jars are in a local maven 2 repository.
-# However the jars are located, the properties ending in ".jar" need
-# expand to full paths to the jars.
-##########################################################################
-
-# Repository base path - unnecessary if full jar paths are provided below
-repository=${user.home}/.m2/repository
-junit.home=${repository}/junit/junit/4.11/
-easymock.home=${repository}/org/easymock/easymock/3.2/
-commons-io.home=${repository}/commons-io/commons-io/2.4/
-hamcrest.home=${repository}/org/hamcrest/hamcrest-core/1.3/
diff --git a/lang/build.xml b/lang/build.xml
deleted file mode 100644
index b493e47..0000000
--- a/lang/build.xml
+++ /dev/null
@@ -1,233 +0,0 @@
-<!--
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
- -->
-<!--
-   "Lang" component of the Apache Commons Subproject
-   $Id$
--->
-<project name="Lang" default="compile" basedir=".">
-
-    <!-- ========== Initialize Properties ===================================== -->
-    <property file="${user.home}/${component.name}.build.properties"/>
-    <property file="${user.home}/build.properties"/>
-    <property file="${basedir}/build.properties"/>
-    <property file="${basedir}/default.properties"/>
-    <property name="jdk.javadoc" value="http://docs.oracle.com/javase/6/docs/api/"/>
-    <property name="collections.javadoc" value="http://commons.apache.org/collections/api-release/"/>
-
-    <!-- ========== Construct compile classpath =============================== -->
-    <path id="compile.classpath">
-        <pathelement location="${build.home}/classes"/>
-    </path>
-
-    <!-- ========== Construct unit test classpath ============================= -->
-    <path id="test.classpath">
-        <pathelement location="${build.home}/classes"/>
-        <pathelement location="${build.home}/tests"/>
-        <pathelement location="${junit.jar}"/>
-        <pathelement location="${easymock.jar}"/>
-        <pathelement location="${commons-io.jar}"/>
-        <pathelement location="${hamcrest.jar}"/>
-    </path>
-
-    <!-- ========== Executable Targets ======================================== -->
-    <target name="init" description="Initialize and evaluate conditionals">
-        <echo message="-------- ${component.name} ${component.version} --------"/>
-        <filter token="name" value="${component.name}"/>
-        <filter token="package" value="${component.package}"/>
-        <filter token="version" value="${component.version}"/>
-        <filter token="compile.source" value="${compile.source}"/>
-        <filter token="compile.target" value="${compile.target}"/>
-        <mkdir dir="${build.home}"/>
-    </target>
-
-    <!-- ========== Compile Targets ========================================= -->
-    <target name="compile" depends="init" description="Compile shareable components">
-        <mkdir dir="${build.home}/classes"/>
-        <javac srcdir="${source.home}" destdir="${build.home}/classes" debug="${compile.debug}" deprecation="${compile.deprecation}" target="${compile.target}" source="${compile.source}" excludes="${compile.excludes}" optimize="${compile.optimize}" includeantruntime="false" encoding="${compile.encoding}">
-            <classpath refid="compile.classpath"/>
-        </javac>
-        <copy todir="${build.home}/classes" filtering="on">
-            <fileset dir="${source.home}" excludes="**/*.java,**/*.html"/>
-        </copy>
-    </target>
-
-    <target name="compile.tests" depends="compile" description="Compile unit test cases">
-        <mkdir dir="${build.home}/tests"/>
-        <javac srcdir="${test.home}" destdir="${build.home}/tests" debug="${compile.debug}" deprecation="off" target="${compile.target}" source="${compile.source}" optimize="${compile.optimize}" includeantruntime="false" encoding="${compile.encoding}">
-            <classpath refid="test.classpath"/>
-        </javac>
-        <copy todir="${build.home}/tests" filtering="on">
-            <fileset dir="${test.home}" excludes="**/*.java"/>
-        </copy>
-    </target>
-
-    <!-- ========== Unit Tests ========================================= -->
-    <target name="test" depends="compile.tests" description="Run all unit test cases">
-        <echo message="Running unit tests ..."/>
-        <mkdir dir="${build.home}/test-reports"/>
-        <junit printsummary="true" showoutput="true" fork="yes" haltonfailure="${test.failonerror}">
-            <classpath refid="test.classpath"/>
-            <formatter type="plain" usefile="true" />
-            <!-- If test.entry is defined, run a single test, otherwise run all valid tests -->
-            <test name="${test.entry}" todir="${build.home}/test-reports" if="test.entry"/>
-            <batchtest fork="yes" todir="${build.home}/test-reports" unless="test.entry">
-                <fileset dir="${test.home}">
-                    <include name="**/*Test.java"/>
-                    <exclude name="**/Abstract*Test.java"/>
-                </fileset>
-            </batchtest>
-        </junit>
-    </target>
-
-    <target name="clean" description="Clean build and distribution directories">
-        <delete dir="${build.home}"/>
-    </target>
-
-    <target name="all" depends="clean,test,compile" description="Clean and compile all components"/>
-
-    <!-- ========== JavaDocs ========================================= -->
-    <target name="javadoc" depends="compile" description="Create component Javadoc documentation">
-        <mkdir dir="${build.home}"/>
-        <mkdir dir="${build.home}/apidocs"/>
-        <tstamp>
-            <format property="current.year" pattern="yyyy"/>
-        </tstamp>
-        <javadoc sourcepath="${source.home}"
-                 destdir="${build.home}/apidocs"
-                 overview="${source.home}/org/apache/commons/lang3/overview.html"
-                 packagenames="org.apache.commons.*"
-                 excludepackagenames="${javadoc.excludepackagenames}"
-                 author="false"
-                 version="true"
-                 doctitle="&lt;h1&gt;Commons Lang ${component.version}&lt;/h1&gt;"
-                 windowtitle="Lang ${component.version}"
-                 bottom="Copyright &amp;copy; 2001-${current.year} - Apache Software Foundation"
-                 use="true"
-                 encoding="${compile.encoding}"
-                 source="${compile.source}">
-            <classpath refid="compile.classpath"/>
-            <link href="${jdk.javadoc}"/>
-            <link href="${collections.javadoc}"/>
-        </javadoc>
-    </target>
-
-    <!-- ========== Jar Targets ========================================= -->
-    <target name="jar" depends="compile" description="Create jar">
-        <mkdir dir="${build.home}/classes/META-INF"/>
-        <copy file="LICENSE.txt" tofile="${build.home}/classes/META-INF/LICENSE.txt"/>
-        <copy file="NOTICE.txt"  tofile="${build.home}/classes/META-INF/NOTICE.txt"/>
-        <jar jarfile="${build.home}/${final.name}.jar">
-            <manifest>
-                <attribute name="Specification-Title" value="Commons Lang"/>
-                <attribute name="Specification-Version" value="${component.version}"/>
-                <attribute name="Specification-Vendor" value="The Apache Software Foundation"/>
-                <attribute name="Implementation-Title" value="Commons Lang"/>
-                <attribute name="Implementation-Version" value="${component.version}"/>
-                <attribute name="Implementation-Vendor" value="The Apache Software Foundation"/>
-                <attribute name="Implementation-Vendor-Id" value="org.apache"/>
-                <attribute name="X-Compile-Source-JDK" value="${compile.source}"/>
-                <attribute name="X-Compile-Target-JDK" value="${compile.target}"/>
-            </manifest>
-            <fileset dir="${build.home}/classes">
-                <include name="**/*.class"/>
-                <include name="**/LICENSE.txt"/>
-                <include name="**/NOTICE.txt"/>
-            </fileset>
-        </jar>
-    </target>
-
-    <target name="javadoc-jar" depends="javadoc" description="Create JavaDoc jar">
-        <jar jarfile="${build.home}/${final.name}-javadoc.jar">
-            <manifest>
-                <attribute name="Specification-Title" value="Commons Lang API"/>
-                <attribute name="Specification-Version" value="${component.version}"/>
-                <attribute name="Specification-Vendor" value="The Apache Software Foundation"/>
-                <attribute name="Implementation-Title" value="Commons Lang API"/>
-                <attribute name="Implementation-Version" value="${component.version}"/>
-                <attribute name="Implementation-Vendor" value="The Apache Software Foundation"/>
-                <attribute name="Implementation-Vendor-Id" value="org.apache"/>
-            </manifest>
-            <fileset dir="${build.home}/apidocs"/>
-            <fileset dir="${basedir}">
-                <include name="LICENSE.txt"/>
-                <include name="NOTICE.txt"/>
-            </fileset>
-        </jar>
-    </target>
-
-    <target name="source-jar" depends="init" description="Create JavaDoc jar">
-        <jar jarfile="${build.home}/${final.name}-sources.jar">
-            <manifest>
-                <attribute name="Specification-Title" value="Commons Lang Source"/>
-                <attribute name="Specification-Version" value="${component.version}"/>
-                <attribute name="Specification-Vendor" value="The Apache Software Foundation"/>
-                <attribute name="Implementation-Title" value="Commons Lang Source"/>
-                <attribute name="Implementation-Version" value="${component.version}"/>
-                <attribute name="Implementation-Vendor" value="The Apache Software Foundation"/>
-                <attribute name="Implementation-Vendor-Id" value="org.apache"/>
-            </manifest>
-            <fileset dir="${source.home}">
-                <include name="**/*.java"/>
-            </fileset>
-            <fileset dir="${basedir}">
-                <include name="LICENSE.txt"/>
-                <include name="NOTICE.txt"/>
-            </fileset>
-        </jar>
-    </target>
-
-    <!-- ========== Distribution ========================================= -->
-    <target name="dist" depends="clean,jar,source-jar,javadoc-jar" description="Create binary distribution">
-
-        <!-- binary distro -->
-        <zip destfile="${build.home}/${final.name}.zip">
-            <zipfileset dir="${basedir}" prefix="${final.name}"
-                      includes="LICENSE.txt,
-                                NOTICE.txt,
-                                RELEASE-NOTES.txt"
-             />
-            <zipfileset dir="${build.home}" includes="*.jar," prefix="${final.name}"/>
-            <zipfileset dir="${build.home}/apidocs" prefix="${final.name}/apidocs"/>
-        </zip>
-        <tar destfile="${build.home}/${final.name}.tar.gz" compression="gzip">
-            <zipfileset src="${build.home}/${final.name}.zip"/>
-        </tar>
-
-        <!-- source distro -->
-        <zip destfile="${build.home}/${final.name}-src.zip">
-            <zipfileset dir="${basedir}" prefix="${final.name}-src"
-                      includes="build.xml,
-                                build.xml,
-                                checkstyle.xml,
-                                default.properties,
-                                LICENSE.txt,
-                                NOTICE.txt,
-                                pom.xml,
-                                RELEASE-NOTES.txt"
-             />
-            <zipfileset dir="${basedir}/src"   prefix="${final.name}-src/src"/>
-        </zip>
-        <tar destfile="${build.home}/${final.name}-src.tar.gz" compression="gzip">
-            <zipfileset src="${build.home}/${final.name}-src.zip"/>
-        </tar>
-
-    </target>
-</project>
diff --git a/lang/checkstyle.xml b/lang/checkstyle.xml
deleted file mode 100644
index 97b34af..0000000
--- a/lang/checkstyle.xml
+++ /dev/null
@@ -1,48 +0,0 @@
-<?xml version="1.0"?>
-<!--
-Licensed to the Apache Software Foundation (ASF) under one or more
-contributor license agreements.  See the NOTICE file distributed with
-this work for additional information regarding copyright ownership.
-The ASF licenses this file to You under the Apache License, Version 2.0
-(the "License"); you may not use this file except in compliance with
-the License.  You may obtain a copy of the License at
-
-     http://www.apache.org/licenses/LICENSE-2.0
-
-Unless required by applicable law or agreed to in writing, software
-distributed under the License is distributed on an "AS IS" BASIS,
-WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-See the License for the specific language governing permissions and
-limitations under the License.
--->
-
-<!DOCTYPE module PUBLIC
-    "-//Puppy Crawl//DTD Check Configuration 1.1//EN"
-    "http://www.puppycrawl.com/dtds/configuration_1_1.dtd">
-
-<!-- commons lang customization of default Checkstyle behavior -->
-<module name="Checker">
-  <property name="localeLanguage" value="en"/>
-  <module name="JavadocPackage">
-    <!-- setting allowLegacy means it will check for package.html instead of just package-info.java -->
-    <property name="allowLegacy" value="true"/>
-  </module>
-  <module name="FileTabCharacter">
-    <property name="fileExtensions" value="java,xml"/>
-  </module>
-  <module name="TreeWalker">
-    <property name="cacheFile" value="target/cachefile"/>
-    <module name="AvoidStarImport"/>
-    <module name="RedundantImport"/>
-    <module name="UnusedImports"/>
-    <module name="NeedBraces"/>
-    <module name="RedundantThrows">
-      <property name="allowUnchecked" value="true"/>
-    </module>
-    <module name="JavadocMethod">
-      <property name="allowUndeclaredRTE" value="true"/>
-    </module>
- </module>
-</module>
-                        
-
diff --git a/lang/default.properties b/lang/default.properties
deleted file mode 100644
index 8b67136..0000000
--- a/lang/default.properties
+++ /dev/null
@@ -1,90 +0,0 @@
-#
-# Licensed to the Apache Software Foundation (ASF) under one or more
-# contributor license agreements.  See the NOTICE file distributed with
-# this work for additional information regarding copyright ownership.
-# The ASF licenses this file to You under the Apache License, Version 2.0
-# (the "License"); you may not use this file except in compliance with
-# the License.  You may obtain a copy of the License at
-#
-#      http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-#
-
-# $Id$
-
-# The location of the "junit.jar" JAR file
-junit.jar = ${junit.home}/junit-4.11.jar
-
-# The location of the Easymock jar
-easymock.jar = ${easymock.home}/easymock-3.2.jar
-
-# The location of the Commons-IO jar
-commons-io.jar = ${commons-io.home}/commons-io-2.4.jar
-
-# The location of Hamcrest jar
-hamcrest.jar = ${hamcrest.home}/hamcrest-core-1.3.jar
-
-# Whether or not to fork tests
-junit.fork = true
-
-# The name of this component
-component.name = commons-lang3
-
-# The primary package name of this component
-component.package = org.apache.commons.lang3
-
-# The title of this component
-component.title = Core Language Utilities
-
-# The current version number of this component
-component.version = 3.4-SNAPSHOT
-
-# The name that is used to create the jar file
-final.name = ${component.name}-${component.version}
-
-# The base directory for compilation targets
-build.home = target
-
-# The base directory for component configuration files
-conf.home = src/conf
-
-# The base directory for component sources
-source.home = src/main/java
-
-# The base directory for unit test sources
-test.home = src/test/java
-
-# Should Java compilations set the 'debug' compiler option?
-compile.debug = true
-
-# Should Java compilations set the 'deprecation' compiler option?
-compile.deprecation = true
-
-# Should Java compilations set the 'optimize' compiler option?
-compile.optimize = true
-
-# Generate class files for specific VM version (e.g., 1.1 or 1.2).
-# Note that the default value depends on the JVM that is running Ant.
-# In particular, if you use JDK 1.4+ the generated classes will not be usable
-# for a 1.1 Java VM unless you explicitly set this attribute to the value 1.1
-# (which is the default value for JDK 1.1 to 1.3).
-compile.target = 1.6
-
-# Specifies the source version for the Java compiler.
-# Corresponds to the source attribute for the ant javac task.
-# Valid values are 1.3, 1.4, 1.5.
-compile.source = 1.6
-
-# Specifies the source encoding.
-compile.encoding = ISO-8859-1
-
-# Should all tests fail if one does?
-test.failonerror = true
-
-# The test runner to execute
-test.runner = junit.textui.TestRunner
diff --git a/lang/doap_lang.rdf b/lang/doap_lang.rdf
deleted file mode 100644
index 4d3bd5e..0000000
--- a/lang/doap_lang.rdf
+++ /dev/null
@@ -1,124 +0,0 @@
-<?xml version="1.0"?>
-<!--
-   Licensed to the Apache Software Foundation (ASF) under one or more
-   contributor license agreements.  See the NOTICE file distributed with
-   this work for additional information regarding copyright ownership.
-   The ASF licenses this file to You under the Apache License, Version 2.0
-   (the "License"); you may not use this file except in compliance with
-   the License.  You may obtain a copy of the License at
-
-       http://www.apache.org/licenses/LICENSE-2.0
-
-   Unless required by applicable law or agreed to in writing, software
-   distributed under the License is distributed on an "AS IS" BASIS,
-   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-   See the License for the specific language governing permissions and
-   limitations under the License.
--->
-<rdf:RDF xmlns="http://usefulinc.com/ns/doap#" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:asfext="http://projects.apache.org/ns/asfext#" xmlns:rdfs="http://www.w3.org/2000/01/rdf-schema#" xmlns:doap="http://usefulinc.com/ns/doap#" xml:lang="en">
-  <Project rdf:about="http://commons.apache.org/lang/">
-    <name>Apache Commons Lang</name>
-    <homepage rdf:resource="http://commons.apache.org/lang/"/>
-    <programming-language>Java</programming-language>
-    <category rdf:resource="http://projects.apache.org/category/library"/>
-    <license rdf:resource="http://usefulinc.com/doap/licenses/asl20"/>
-    <bug-database rdf:resource="http://issues.apache.org/jira/browse/LANG"/>
-    <download-page rdf:resource="http://commons.apache.org/lang/download_lang.cgi"/>
-    <asfext:pmc rdf:resource="http://commons.apache.org/"/>
-    <shortdesc xml:lang="en">Java Common Components</shortdesc>
-    <description xml:lang="en">
-        Commons Lang, a package of Java utility classes for the
-        classes that are in java.lang's hierarchy, or are considered to be so
-        standard as to justify existence in java.lang.
-    </description>
-    <repository>
-      <SVNRepository>
-        <browse rdf:resource="http://svn.apache.org/viewvc/commons/proper/lang/trunk"/>
-        <location rdf:resource="http://svn.apache.org/repos/asf/commons/proper/lang"/>
-      </SVNRepository>
-    </repository>
-    <release>
-      <Version>
-        <name>commons-lang</name>
-        <created>2014-04-09</created>
-        <revision>3.3.2</revision>
-      </Version>
-      <Version>
-        <name>commons-lang</name>
-        <created>2014-03-18</created>
-        <revision>3.3.1</revision>
-      </Version>
-      <Version>
-        <name>commons-lang</name>
-        <created>2014-03-04</created>
-        <revision>3.3</revision>
-      </Version>
-      <Version>
-        <name>commons-lang</name>
-        <created>2014-01-05</created>
-        <revision>3.2.1</revision>
-      </Version>
-      <Version>
-        <name>commons-lang</name>
-        <created>2014-01-01</created>
-        <revision>3.2</revision>
-      </Version>
-      <Version>
-        <name>commons-lang</name>
-        <created>2011-11-14</created>
-        <revision>3.1</revision>
-      </Version>
-      <Version>
-        <name>commons-lang</name>
-        <created>2011-07-18</created>
-        <revision>3.0</revision>
-      </Version>
-      <Version>
-        <name>commons-lang</name>
-        <created>2011-01-17</created>
-        <revision>2.6</revision>
-      </Version>
-      <Version>
-        <name>commons-lang</name>
-        <created>2010-02-25</created>
-        <revision>2.5</revision>
-      </Version>
-      <Version>
-        <name>commons-lang</name>
-        <created>2008-03-18</created>
-        <revision>2.4</revision>
-      </Version>
-      <Version>
-        <name>commons-lang</name>
-        <created>2007-02-13</created>
-        <revision>2.3</revision>
-      </Version>
-      <Version>
-        <name>commons-lang</name>
-        <created>2006-10-04</created>
-        <revision>2.2</revision>
-      </Version>
-      <Version>
-        <name>commons-lang</name>
-        <created>2005-06-12</created>
-        <revision>2.1</revision>
-      </Version>
-      <Version>
-        <name>commons-lang</name>
-        <created>2003-09-02</created>
-        <revision>2.0</revision>
-      </Version>
-      <Version>
-        <name>commons-lang</name>
-        <created>2002-11-25</created>
-        <revision>1.0.1</revision>
-      </Version>
-      <Version>
-        <name>commons-lang</name>
-        <created>2002-10-04</created>
-        <revision>1.0</revision>
-      </Version>
-    </release>
-    <mailing-list rdf:resource="http://commons.apache.org/mail-lists.html"/>
-  </Project>
-</rdf:RDF>
diff --git a/lang/findbugs-exclude-filter.xml b/lang/findbugs-exclude-filter.xml
deleted file mode 100644
index f239b2a..0000000
--- a/lang/findbugs-exclude-filter.xml
+++ /dev/null
@@ -1,144 +0,0 @@
-<?xml version="1.0"?>
-<!--
-   Licensed to the Apache Software Foundation (ASF) under one or more
-   contributor license agreements.  See the NOTICE file distributed with
-   this work for additional information regarding copyright ownership.
-   The ASF licenses this file to You under the Apache License, Version 2.0
-   (the "License"); you may not use this file except in compliance with
-   the License.  You may obtain a copy of the License at
-
-       http://www.apache.org/licenses/LICENSE-2.0
-
-   Unless required by applicable law or agreed to in writing, software
-   distributed under the License is distributed on an "AS IS" BASIS,
-   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-   See the License for the specific language governing permissions and
-   limitations under the License.
--->
-
-<!--
-  This file contains some false positive bugs detected by findbugs. Their
-  false positive nature has been analyzed individually and they have been
-  put here to instruct findbugs it must ignore them.
--->
-<FindBugsFilter>
-
-  <!-- Reason: Optimization to use == -->
-  <Match>
-    <Class name="org.apache.commons.lang3.BooleanUtils" />
-    <Or>
-      <Method name="toBoolean" />
-      <Method name="toBooleanObject" />
-    </Or>
-    <Bug pattern="ES_COMPARING_PARAMETER_STRING_WITH_EQ" />
-  </Match>
-  <Match>
-    <Class name="org.apache.commons.lang3.BooleanUtils" />
-    <Method name="toBoolean" />
-    <Bug pattern="RC_REF_COMPARISON_BAD_PRACTICE_BOOLEAN" />
-  </Match>
-
-  <!-- Reason: Behavior documented in javadoc -->
-  <Match>
-    <Class name="org.apache.commons.lang3.BooleanUtils" />
-    <Or>
-      <Method name="negate" />
-      <Method name="toBooleanObject" />
-    </Or>
-    <Bug pattern="NP_BOOLEAN_RETURN_NULL" />
-  </Match>
-
-  <!-- Reason: base class cannot be changed and field is properly checked against null so behavior is OK -->
-  <Match>
-    <Class name="org.apache.commons.lang3.text.ExtendedMessageFormat" />
-    <Method name="applyPattern" />
-    <Bug pattern="UR_UNINIT_READ_CALLED_FROM_SUPER_CONSTRUCTOR" />
-  </Match>
-
-  <!-- Reason: Optimization to use == -->
-  <Match>
-    <Class name="org.apache.commons.lang3.StringUtils" />
-    <Method name="indexOfDifference"/>
-    <Bug pattern="ES_COMPARING_PARAMETER_STRING_WITH_EQ" />
-  </Match>
-
-  <!-- Reason: Very much intended to do a fall through on the switch -->
-  <Match>
-    <Class name="org.apache.commons.lang3.math.NumberUtils" />
-    <Method name="createNumber"/>
-    <Bug pattern="SF_SWITCH_FALLTHROUGH" />
-  </Match>
-
-  <!-- Reason: Very much intended to do a fall through on the switch -->
-  <Match>
-    <Class name="org.apache.commons.lang3.time.DateUtils" />
-    <Method name="getFragment"/>
-    <Bug pattern="SF_SWITCH_FALLTHROUGH" />
-  </Match>
-
-  <!-- Reason: hashCode is lazily loaded in Range classes -->
-  <!-- TODO: Work out why regex didn't work here -->
-  <Match>
-    <Class name="org.apache.commons.lang3.math.DoubleRange" />
-    <Field name="hashCode" />
-    <Bug pattern="SE_TRANSIENT_FIELD_NOT_RESTORED" />
-  </Match>
-  <Match>
-    <Class name="org.apache.commons.lang3.math.FloatRange" />
-    <Field name="hashCode" />
-    <Bug pattern="SE_TRANSIENT_FIELD_NOT_RESTORED" />
-  </Match>
-  <Match>
-    <Class name="org.apache.commons.lang3.math.IntRange" />
-    <Field name="hashCode" />
-    <Bug pattern="SE_TRANSIENT_FIELD_NOT_RESTORED" />
-  </Match>
-  <Match>
-    <Class name="org.apache.commons.lang3.math.LongRange" />
-    <Field name="hashCode" />
-    <Bug pattern="SE_TRANSIENT_FIELD_NOT_RESTORED" />
-  </Match>
-  <Match>
-    <Class name="org.apache.commons.lang3.math.NumberRange" />
-    <Field name="hashCode" />
-    <Bug pattern="SE_TRANSIENT_FIELD_NOT_RESTORED" />
-  </Match>
-
-  <!-- Reason: toProperString is lazily loaded -->
-  <Match>
-    <Class name="org.apache.commons.lang3.math.Fraction" />
-    <Field name="toProperString" />
-    <Bug pattern="SE_TRANSIENT_FIELD_NOT_RESTORED" />
-  </Match>
-
-  <!-- Reason: It does call super.clone(), but via a subsequent method -->
-  <Match>
-    <Class name="org.apache.commons.lang3.text.StrTokenizer" />
-    <Method name="clone"/>
-    <Bug pattern="CN_IDIOM_NO_SUPER_CALL" />
-  </Match>
-
-  <!-- Reason: Testing shows that new Integer(...) etc is quicker than Integer.valueOf -->
-  <Match>
-    <Bug pattern="DM_NUMBER_CTOR" />
-  </Match>
-
-  <!-- Reason: FindBugs 2.0.2 used in maven-findbugs-plugin 2.5.2 seems to have problems with detection of default cases
-   in switch statements. All the excluded methods have switch statements that conatin a default case. -->
-  <Match>
-    <Class name="org.apache.commons.lang3.math.NumberUtils"/>
-    <Method name="createNumber" />
-    <Bug pattern="SF_SWITCH_NO_DEFAULT" />
-  </Match>
-  <Match>
-    <Class name="org.apache.commons.lang3.text.ExtendedMessageFormat"/>
-    <Method name="insertFormats" />
-    <Bug pattern="SF_SWITCH_NO_DEFAULT" />
-  </Match>
-  <Match>
-    <Class name="org.apache.commons.lang3.time.FastDateParser"/>
-    <Method name="getStrategy" />
-    <Bug pattern="SF_SWITCH_NO_DEFAULT" />
-  </Match>
-
-</FindBugsFilter>
diff --git a/lang/pom.xml b/lang/pom.xml
deleted file mode 100644
index f5cb532..0000000
--- a/lang/pom.xml
+++ /dev/null
@@ -1,769 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
- Licensed to the Apache Software Foundation (ASF) under one or more
- contributor license agreements.  See the NOTICE file distributed with
- this work for additional information regarding copyright ownership.
- The ASF licenses this file to You under the Apache License, Version 2.0
- (the "License"); you may not use this file except in compliance with
- the License.  You may obtain a copy of the License at
-
-      http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
--->
-<project
-  xmlns="http://maven.apache.org/POM/4.0.0"
-  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
-  xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
-  <parent>
-    <groupId>org.apache.commons</groupId>
-    <artifactId>commons-parent</artifactId>
-    <version>37</version>
-  </parent>
-  <modelVersion>4.0.0</modelVersion>
-  <groupId>org.apache.commons</groupId>
-  <artifactId>commons-lang3</artifactId>
-  <version>3.4</version>
-  <name>Apache Commons Lang</name>
-
-  <inceptionYear>2001</inceptionYear>
-  <description>
-  Apache Commons Lang, a package of Java utility classes for the
-  classes that are in java.lang's hierarchy, or are considered to be so
-  standard as to justify existence in java.lang.
-  </description>
-
-  <url>http://commons.apache.org/proper/commons-lang/</url>
-
-  <issueManagement>
-    <system>jira</system>
-    <url>http://issues.apache.org/jira/browse/LANG</url>
-  </issueManagement>
-
-  <scm>
-    <connection>scm:svn:http://svn.apache.org/repos/asf/commons/proper/lang/tags/LANG_3_4_RC1</connection>
-    <developerConnection>scm:svn:https://svn.apache.org/repos/asf/commons/proper/lang/tags/LANG_3_4_RC1</developerConnection>
-    <url>http://svn.apache.org/viewvc/commons/proper/lang/tags/LANG_3_4_RC1</url>
-  </scm>
-
-  <developers>
-    <developer>
-      <name>Daniel Rall</name>
-      <id>dlr</id>
-      <email>dlr@finemaltcoding.com</email>
-      <organization>CollabNet, Inc.</organization>
-      <roles>
-        <role>Java Developer</role>
-      </roles>
-    </developer>
-    <developer>
-      <name>Stephen Colebourne</name>
-      <id>scolebourne</id>
-      <email>scolebourne@joda.org</email>
-      <organization>SITA ATS Ltd</organization>
-      <timezone>0</timezone>
-      <roles>
-        <role>Java Developer</role>
-      </roles>
-    </developer>
-    <developer>
-      <name>Henri Yandell</name>
-      <id>bayard</id>
-      <email>bayard@apache.org</email>
-      <organization />
-      <roles>
-        <role>Java Developer</role>
-      </roles>
-    </developer>
-    <developer>
-      <name>Steven Caswell</name>
-      <id>scaswell</id>
-      <email>stevencaswell@apache.org</email>
-      <organization />
-      <roles>
-        <role>Java Developer</role>
-      </roles>
-      <timezone>-5</timezone>
-    </developer>
-    <developer>
-      <name>Robert Burrell Donkin</name>
-      <id>rdonkin</id>
-      <email>rdonkin@apache.org</email>
-      <organization />
-      <roles>
-        <role>Java Developer</role>
-      </roles>
-    </developer>
-    <developer>
-      <name>Gary D. Gregory</name>
-      <id>ggregory</id>
-      <email>ggregory@apache.org</email>
-      <timezone>-5</timezone>
-      <roles>
-        <role>Java Developer</role>
-      </roles>
-    </developer>
-    <developer>
-      <name>Fredrik Westermarck</name>
-      <id>fredrik</id>
-      <email />
-      <organization />
-      <roles>
-        <role>Java Developer</role>
-      </roles>
-    </developer>
-    <developer>
-      <name>James Carman</name>
-      <id>jcarman</id>
-      <email>jcarman@apache.org</email>
-      <organization>Carman Consulting, Inc.</organization>
-      <roles>
-        <role>Java Developer</role>
-      </roles>
-    </developer>
-    <developer>
-      <name>Niall Pemberton</name>
-      <id>niallp</id>
-      <roles>
-        <role>Java Developer</role>
-      </roles>
-    </developer>
-    <developer>
-      <name>Matt Benson</name>
-      <id>mbenson</id>
-      <roles>
-        <role>Java Developer</role>
-      </roles>
-    </developer>
-    <developer>
-      <name>Joerg Schaible</name>
-      <id>joehni</id>
-      <email>joerg.schaible@gmx.de</email>
-      <roles>
-        <role>Java Developer</role>
-      </roles>
-      <timezone>+1</timezone>
-    </developer>
-    <developer>
-      <name>Oliver Heger</name>
-      <id>oheger</id>
-      <email>oheger@apache.org</email>
-      <timezone>+1</timezone>
-      <roles>
-        <role>Java Developer</role>
-      </roles>
-    </developer>
-    <developer>
-      <name>Paul Benedict</name>
-      <id>pbenedict</id>
-      <email>pbenedict@apache.org</email>
-      <roles>
-        <role>Java Developer</role>
-      </roles>
-    </developer>
-    <developer>
-      <name>Benedikt Ritter</name>
-      <id>britter</id>
-      <email>britter@apache.org</email>
-      <roles>
-        <role>Java Developer</role>
-      </roles>
-    </developer>
-    <developer>
-      <name>Duncan Jones</name>
-      <id>djones</id>
-      <email>djones@apache.org</email>
-      <timezone>0</timezone>
-      <roles>
-        <role>Java Developer</role>
-      </roles>
-    </developer>
-  </developers>
-  <contributors>
-    <contributor>
-      <name>C. Scott Ananian</name>
-    </contributor>
-    <contributor>
-      <name>Chris Audley</name>
-    </contributor>
-    <contributor>
-      <name>Stephane Bailliez</name>
-    </contributor>
-    <contributor>
-      <name>Michael Becke</name>
-    </contributor>
-    <contributor>
-      <name>Benjamin Bentmann</name>
-    </contributor>
-    <contributor>
-      <name>Ola Berg</name>
-    </contributor>
-    <contributor>
-      <name>Nathan Beyer</name>
-    </contributor>
-    <contributor>
-      <name>Stefan Bodewig</name>
-    </contributor>
-    <contributor>
-      <name>Janek Bogucki</name>
-    </contributor>
-    <contributor>
-      <name>Mike Bowler</name>
-    </contributor>
-    <contributor>
-      <name>Sean Brown</name>
-    </contributor>
-    <contributor>
-      <name>Alexander Day Chaffee</name>
-    </contributor>
-    <contributor>
-      <name>Al Chou</name>
-    </contributor>
-    <contributor>
-      <name>Greg Coladonato</name>
-    </contributor>
-    <contributor>
-      <name>Maarten Coene</name>
-    </contributor>
-    <contributor>
-      <name>Justin Couch</name>
-    </contributor>
-    <contributor>
-      <name>Michael Davey</name>
-    </contributor>
-    <contributor>
-      <name>Norm Deane</name>
-    </contributor>
-    <contributor>
-      <name>Morgan Delagrange</name>
-    </contributor>
-    <contributor>
-      <name>Ringo De Smet</name>
-    </contributor>
-    <contributor>
-      <name>Russel Dittmar</name>
-    </contributor>
-    <contributor>
-      <name>Steve Downey</name>
-    </contributor>
-    <contributor>
-      <name>Matthias Eichel</name>
-    </contributor>
-    <contributor>
-      <name>Christopher Elkins</name>
-    </contributor>
-    <contributor>
-      <name>Chris Feldhacker</name>
-    </contributor>
-    <contributor>
-      <name>Roland Foerther</name>
-    </contributor>
-    <contributor>
-      <name>Pete Gieser</name>
-    </contributor>
-    <contributor>
-      <name>Jason Gritman</name>
-    </contributor>
-    <contributor>
-      <name>Matthew Hawthorne</name>
-    </contributor>
-    <contributor>
-      <name>Michael Heuer</name>
-    </contributor>
-    <contributor>
-      <name>Chas Honton</name>
-    </contributor>
-    <contributor>
-      <name>Chris Hyzer</name>
-    </contributor>
-    <contributor>
-      <name>Paul Jack</name>
-    </contributor>
-    <contributor>
-      <name>Marc Johnson</name>
-    </contributor>
-    <contributor>
-      <name>Shaun Kalley</name>
-    </contributor>
-    <contributor>
-      <name>Tetsuya Kaneuchi</name>
-    </contributor>
-    <contributor>
-      <name>Nissim Karpenstein</name>
-    </contributor>
-    <contributor>
-      <name>Ed Korthof</name>
-    </contributor>
-    <contributor>
-      <name>Holger Krauth</name>
-    </contributor>
-    <contributor>
-      <name>Rafal Krupinski</name>
-    </contributor>
-    <contributor>
-      <name>Rafal Krzewski</name>
-    </contributor>
-    <contributor>
-      <name>David Leppik</name>
-    </contributor>
-    <contributor>
-      <name>Eli Lindsey</name>
-    </contributor>
-    <contributor>
-      <name>Sven Ludwig</name>
-    </contributor>
-    <contributor>
-      <name>Craig R. McClanahan</name>
-    </contributor>
-    <contributor>
-      <name>Rand McNeely</name>
-    </contributor>
-    <contributor>
-      <name>Hendrik Maryns</name>
-    </contributor>
-    <contributor>
-      <name>Dave Meikle</name>
-    </contributor>
-    <contributor>
-      <name>Nikolay Metchev</name>
-    </contributor>
-    <contributor>
-      <name>Kasper Nielsen</name>
-    </contributor>
-    <contributor>
-      <name>Tim O'Brien</name>
-    </contributor>
-    <contributor>
-      <name>Brian S O'Neill</name>
-    </contributor>
-    <contributor>
-      <name>Andrew C. Oliver</name>
-    </contributor>
-    <contributor>
-      <name>Alban Peignier</name>
-    </contributor>
-    <contributor>
-      <name>Moritz Petersen</name>
-    </contributor>
-    <contributor>
-      <name>Dmitri Plotnikov</name>
-    </contributor>
-    <contributor>
-      <name>Neeme Praks</name>
-    </contributor>
-    <contributor>
-      <name>Eric Pugh</name>
-    </contributor>
-    <contributor>
-      <name>Stephen Putman</name>
-    </contributor>
-    <contributor>
-      <name>Travis Reeder</name>
-    </contributor>
-    <contributor>
-      <name>Antony Riley</name>
-    </contributor>
-    <contributor>
-      <name>Valentin Rocher</name>
-    </contributor>
-    <contributor>
-      <name>Scott Sanders</name>
-    </contributor>
-    <contributor>
-      <name>James Sawle</name>
-    </contributor>
-    <contributor>
-      <name>Ralph Schaer</name>
-    </contributor>
-    <contributor>
-      <name>Henning P. Schmiedehausen</name>
-    </contributor>
-    <contributor>
-      <name>Sean Schofield</name>
-    </contributor>
-    <contributor>
-      <name>Robert Scholte</name>
-    </contributor>
-    <contributor>
-      <name>Reuben Sivan</name>
-    </contributor>
-    <contributor>
-      <name>Ville Skytta</name>
-    </contributor>
-    <contributor>
-      <name>David M. Sledge</name>
-    </contributor>
-    <contributor>
-      <name>Michael A. Smith</name>
-    </contributor>
-    <contributor>
-      <name>Jan Sorensen</name>
-    </contributor>
-    <contributor>
-      <name>Glen Stampoultzis</name>
-    </contributor>
-    <contributor>
-      <name>Scott Stanchfield</name>
-    </contributor>
-    <contributor>
-      <name>Jon S. Stevens</name>
-    </contributor>
-    <contributor>
-      <name>Sean C. Sullivan</name>
-    </contributor>
-    <contributor>
-      <name>Ashwin Suresh</name>
-    </contributor>
-    <contributor>
-      <name>Helge Tesgaard</name>
-    </contributor>
-    <contributor>
-      <name>Arun Mammen Thomas</name>
-    </contributor>
-    <contributor>
-      <name>Masato Tezuka</name>
-    </contributor>
-    <contributor>
-      <name>Daniel Trebbien</name>
-    </contributor>
-    <contributor>
-      <name>Jeff Varszegi</name>
-    </contributor>
-    <contributor>
-      <name>Chris Webb</name>
-    </contributor>
-    <contributor>
-      <name>Mario Winterer</name>
-    </contributor>
-    <contributor>
-      <name>Stepan Koltsov</name>
-    </contributor>
-    <contributor>
-      <name>Holger Hoffstatte</name>
-    </contributor>
-    <contributor>
-      <name>Derek C. Ashmore</name>
-    </contributor>
-    <contributor>
-      <name>Sebastien Riou</name>
-    </contributor>
-    <contributor>
-      <name>Allon Mureinik</name>
-    </contributor>
-    <contributor>
-      <name>Adam Hooper</name>
-    </contributor>
-    <contributor>
-      <name>Chris Karcher</name>
-    </contributor>
-    <contributor>
-      <name>Michael Osipov</name>
-    </contributor>
-    <contributor>
-      <name>Thiago Andrade</name>
-    </contributor>
-    <contributor>
-      <name>Jonathan Baker</name>
-    </contributor>
-    <contributor>
-      <name>Mikhail Mazursky</name>
-    </contributor>
-    <contributor>
-      <name>Fabian Lange</name>
-    </contributor>
-    <contributor>
-      <name>Michał Kordas</name>
-    </contributor>
-  </contributors>
-
-  <!-- Lang should depend on very little -->
-  <dependencies>
-    <dependency>
-      <groupId>junit</groupId>
-      <artifactId>junit</artifactId>
-      <version>4.12</version>
-      <scope>test</scope>
-    </dependency>
-    <dependency>
-      <groupId>org.hamcrest</groupId>
-      <artifactId>hamcrest-all</artifactId>
-      <version>1.3</version>
-      <scope>test</scope>
-    </dependency>
-
-    <dependency>
-      <groupId>commons-io</groupId>
-      <artifactId>commons-io</artifactId>
-      <version>2.4</version>
-      <scope>test</scope>
-    </dependency>
-
-    <dependency>
-      <groupId>org.easymock</groupId>
-      <artifactId>easymock</artifactId>
-      <version>3.3.1</version>
-      <scope>test</scope>
-    </dependency>
-  </dependencies>
-
-  <distributionManagement>
-    <site>
-      <id>apache.website</id>
-      <name>Apache Commons Site</name>
-      <url>scm:svn:https://svn.apache.org/repos/infra/websites/production/commons/content/proper/commons-lang/</url>
-    </site>
-  </distributionManagement>
-
-  <properties>
-    <project.build.sourceEncoding>ISO-8859-1</project.build.sourceEncoding>
-    <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
-    <maven.compiler.source>1.6</maven.compiler.source>
-    <maven.compiler.target>1.6</maven.compiler.target>
-    <!--
-       This is also  used to generate download_xxx file name.
-       To override this when generating the download page:
-
-       mvn commons:download-page -Dcommons.componentid=lang
-
-       The above seems to change the download page name but not any other
-       properties that depend on the componentid.
-    -->
-    <commons.componentid>lang3</commons.componentid>
-    <!-- Current 3.x release series -->
-    <commons.release.version>3.4</commons.release.version>
-    <commons.release.desc>(Java 6.0+)</commons.release.desc>
-    <!-- Previous 2.x release series -->
-    <commons.release.2.version>2.6</commons.release.2.version>
-    <commons.release.2.desc>(Requires Java 1.2 or later)</commons.release.2.desc>
-    <!-- Override generated name -->
-    <commons.release.2.name>commons-lang-${commons.release.2.version}</commons.release.2.name>
-    <commons.jira.id>LANG</commons.jira.id>
-    <commons.jira.pid>12310481</commons.jira.pid>
-
-    <commons.site.path>lang</commons.site.path>
-    <commons.scmPubUrl>https://svn.apache.org/repos/infra/websites/production/commons/content/proper/commons-lang</commons.scmPubUrl>
-    <commons.scmPubCheckoutDirectory>site-content</commons.scmPubCheckoutDirectory>
-  </properties>
-
-
-  <build>
-    <plugins>
-      <plugin>
-        <groupId>org.apache.maven.plugins</groupId>
-        <artifactId>maven-surefire-plugin</artifactId>
-        <executions>
-          <execution>
-            <id>plain</id>
-            <configuration>
-              <includes>
-                <include>**/*Test.java</include>
-              </includes>
-              <runOrder>random</runOrder>
-            </configuration>
-          </execution>
-          <!-- <execution> <id>security-manager-test</id> <phase>integration-test</phase> <goals> <goal>test</goal> </goals> <configuration>
-            <includes> <include>**/*Test.java</include> </includes> <argLine>-Djava.security.manager -Djava.security.policy=${basedir}/src/test/resources/java.policy</argLine>
-            </configuration> </execution> -->
-        </executions>
-      </plugin>
-      <plugin>
-        <artifactId>maven-assembly-plugin</artifactId>
-        <configuration>
-          <descriptors>
-            <descriptor>src/assembly/bin.xml</descriptor>
-            <descriptor>src/assembly/src.xml</descriptor>
-          </descriptors>
-          <tarLongFileMode>gnu</tarLongFileMode>
-        </configuration>
-      </plugin>
-      <plugin>
-        <groupId>org.apache.maven.plugins</groupId>
-        <artifactId>maven-jar-plugin</artifactId>
-        <executions>
-          <execution>
-            <goals>
-              <goal>test-jar</goal>
-            </goals>
-          </execution>
-        </executions>
-      </plugin>
-      <plugin>
-        <groupId>org.apache.maven.plugins</groupId>
-        <artifactId>maven-scm-publish-plugin</artifactId>
-        <configuration>
-          <ignorePathsToDelete>
-            <ignorePathToDelete>javadocs</ignorePathToDelete>
-          </ignorePathsToDelete>
-        </configuration>
-      </plugin>
-    </plugins>
-
-  </build>
-
-  <reporting>
-    <plugins>
-      <plugin>
-        <artifactId>maven-checkstyle-plugin</artifactId>
-        <version>2.14</version>
-        <configuration>
-          <configLocation>${basedir}/checkstyle.xml</configLocation>
-          <enableRulesSummary>false</enableRulesSummary>
-        </configuration>
-        <reportSets>
-          <reportSet>
-            <reports>
-              <report>checkstyle</report>
-            </reports>
-          </reportSet>
-        </reportSets>
-      </plugin>
-      <!-- Requires setting 'export MAVEN_OPTS="-Xmx512m -XX:MaxPermSize=128m" ' -->
-      <plugin>
-        <groupId>org.codehaus.mojo</groupId>
-        <artifactId>findbugs-maven-plugin</artifactId>
-        <!-- Use version from parent pom as that is adjusted according to the Java version used to run Maven -->
-        <version>${commons.findbugs.version}</version>
-        <configuration>
-          <excludeFilterFile>${basedir}/findbugs-exclude-filter.xml</excludeFilterFile>
-        </configuration>
-      </plugin>
-      <plugin>
-        <groupId>org.codehaus.mojo</groupId>
-        <artifactId>clirr-maven-plugin</artifactId>
-        <version>2.6.1</version>
-        <configuration>
-          <minSeverity>info</minSeverity>
-        </configuration>
-      </plugin>
-      <plugin>
-        <artifactId>maven-pmd-plugin</artifactId>
-        <version>3.4</version>
-        <configuration>
-          <targetJdk>${maven.compiler.target}</targetJdk>
-        </configuration>
-        <reportSets>
-          <reportSet>
-            <reports>
-              <report>pmd</report>
-              <report>cpd</report>
-            </reports>
-          </reportSet>
-        </reportSets>
-      </plugin>
-      <plugin>
-        <groupId>org.codehaus.mojo</groupId>
-        <artifactId>taglist-maven-plugin</artifactId>
-        <version>2.4</version>
-        <configuration>
-          <tagListOptions>
-            <tagClasses>
-              <tagClass>
-                <displayName>Needs Work</displayName>
-                <tags>
-                  <tag>
-                    <matchString>TODO</matchString>
-                    <matchType>exact</matchType>
-                  </tag>
-                  <tag>
-                    <matchString>FIXME</matchString>
-                    <matchType>exact</matchType>
-                  </tag>
-                  <tag>
-                    <matchString>XXX</matchString>
-                    <matchType>exact</matchType>
-                  </tag>
-                </tags>
-              </tagClass>
-              <tagClass>
-                <displayName>Noteable Markers</displayName>
-                <tags>
-                  <tag>
-                    <matchString>NOTE</matchString>
-                    <matchType>exact</matchType>
-                  </tag>
-                  <tag>
-                    <matchString>NOPMD</matchString>
-                    <matchType>exact</matchType>
-                  </tag>
-                  <tag>
-                    <matchString>NOSONAR</matchString>
-                    <matchType>exact</matchType>
-                  </tag>
-                </tags>
-              </tagClass>
-            </tagClasses>
-          </tagListOptions>
-        </configuration>
-      </plugin>
-      <plugin>
-        <groupId>org.codehaus.mojo</groupId>
-        <artifactId>javancss-maven-plugin</artifactId>
-        <version>2.1</version>
-      </plugin>
-      <plugin>
-        <groupId>org.apache.rat</groupId>
-        <artifactId>apache-rat-plugin</artifactId>
-        <configuration>
-          <excludes>
-            <exclude>site-content/**</exclude>
-            <exclude>src/site/resources/download_lang.cgi</exclude>
-            <exclude>src/site/resources/release-notes/RELEASE-NOTES-*.txt</exclude>
-            <exclude>src/test/resources/lang-708-input.txt</exclude>
-          </excludes>
-        </configuration>
-      </plugin>
-    </plugins>
-  </reporting>
-
-  <profiles>
-    <profile>
-      <id>setup-checkout</id>
-      <activation>
-        <file>
-          <missing>site-content</missing>
-        </file>
-      </activation>
-      <build>
-        <plugins>
-          <plugin>
-            <groupId>org.apache.maven.plugins</groupId>
-            <artifactId>maven-antrun-plugin</artifactId>
-            <version>1.8</version>
-            <executions>
-              <execution>
-                <id>prepare-checkout</id>
-                <phase>pre-site</phase>
-                <goals>
-                  <goal>run</goal>
-                </goals>
-                <configuration>
-                  <tasks>
-                    <exec executable="svn">
-                      <arg line="checkout --depth immediates ${commons.scmPubUrl} ${commons.scmPubCheckoutDirectory}" />
-                    </exec>
-
-                    <exec executable="svn">
-                      <arg line="update --set-depth exclude ${commons.scmPubCheckoutDirectory}/javadocs" />
-                    </exec>
-
-                    <pathconvert pathsep=" " property="dirs">
-                      <dirset dir="${commons.scmPubCheckoutDirectory}" includes="*" />
-                    </pathconvert>
-                    <exec executable="svn">
-                      <arg line="update --set-depth infinity ${dirs}" />
-                    </exec>
-                  </tasks>
-                </configuration>
-              </execution>
-            </executions>
-          </plugin>
-        </plugins>
-      </build>
-    </profile>
-  </profiles>
-
-</project>
diff --git a/lang/src/assembly/bin.xml b/lang/src/assembly/bin.xml
deleted file mode 100644
index fb1e07c..0000000
--- a/lang/src/assembly/bin.xml
+++ /dev/null
@@ -1,46 +0,0 @@
-<!--
- Licensed to the Apache Software Foundation (ASF) under one or more
- contributor license agreements.  See the NOTICE file distributed with
- this work for additional information regarding copyright ownership.
- The ASF licenses this file to You under the Apache License, Version 2.0
- (the "License"); you may not use this file except in compliance with
- the License.  You may obtain a copy of the License at
-
-      http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
--->
-<assembly>
-    <id>bin</id>
-    <formats>
-        <format>tar.gz</format>
-        <format>zip</format>
-    </formats>
-    <includeSiteDirectory>false</includeSiteDirectory>
-    <fileSets>
-        <fileSet>
-            <includes>
-                <include>LICENSE.txt</include>
-                <include>NOTICE.txt</include>
-                <include>RELEASE-NOTES.txt</include>
-                <include>README.md</include>
-                <include>CONTRIBUTING.md</include>
-            </includes>
-        </fileSet>
-        <fileSet>
-            <directory>target</directory>
-            <outputDirectory></outputDirectory>
-            <includes>
-                <include>*.jar</include>
-            </includes>
-        </fileSet>
-        <fileSet>
-            <directory>target/site/apidocs</directory>
-            <outputDirectory>apidocs</outputDirectory>
-        </fileSet>
-    </fileSets>
-</assembly>
diff --git a/lang/src/assembly/src.xml b/lang/src/assembly/src.xml
deleted file mode 100644
index 994ccb4..0000000
--- a/lang/src/assembly/src.xml
+++ /dev/null
@@ -1,45 +0,0 @@
-<!--
- Licensed to the Apache Software Foundation (ASF) under one or more
- contributor license agreements.  See the NOTICE file distributed with
- this work for additional information regarding copyright ownership.
- The ASF licenses this file to You under the Apache License, Version 2.0
- (the "License"); you may not use this file except in compliance with
- the License.  You may obtain a copy of the License at
-
-      http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
--->
-<assembly>
-    <id>src</id>
-    <formats>
-        <format>tar.gz</format>
-        <format>zip</format>
-    </formats>
-    <baseDirectory>${project.artifactId}-${commons.release.version}-src</baseDirectory>
-    <fileSets>
-        <fileSet>
-            <includes>
-                <include>checkstyle.xml</include>
-                <include>findbugs-exclude-filter.xml</include>
-                <include>LICENSE.txt</include>
-                <include>NOTICE.txt</include>
-                <include>pom.xml</include>
-                <include>PROPOSAL.html</include>
-                <include>RELEASE-NOTES.txt</include>
-                <include>build.xml</include>
-                <include>default.properties</include>
-                <include>build.properties.sample</include>
-                <include>README.md</include>
-                <include>CONTRIBUTING.md</include>
-            </includes>
-        </fileSet>
-        <fileSet>
-            <directory>src</directory>
-        </fileSet>
-    </fileSets>
-</assembly>
diff --git a/lang/src/changes/changes.xml b/lang/src/changes/changes.xml
deleted file mode 100644
index da89632..0000000
--- a/lang/src/changes/changes.xml
+++ /dev/null
@@ -1,768 +0,0 @@
-<?xml version="1.0"?>
-<!--
-     Licensed to the Apache Software Foundation (ASF) under one or more
-     contributor license agreements.  See the NOTICE file distributed with
-     this work for additional information regarding copyright ownership.
-     The ASF licenses this file to You under the Apache License, Version 2.0
-     (the "License"); you may not use this file except in compliance with
-     the License.  You may obtain a copy of the License at
-
-          http://www.apache.org/licenses/LICENSE-2.0
-
-     Unless required by applicable law or agreed to in writing, software
-     distributed under the License is distributed on an "AS IS" BASIS,
-     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-     See the License for the specific language governing permissions and
-     limitations under the License.
-  -->
-<document>
-  <properties>
-    <title>Apache Commons Lang Changes</title>
-  </properties>
-  <body>
-
-  <release version="3.4" date="tba" description="tba">
-    <action issue="LANG-1103" type="add" dev="britter">Add SystemUtils.IS_JAVA_1_9</action>
-    <action issue="LANG-1102" type="update" dev="britter">Make logic for comparing OS versions in SystemUtils smarter</action>
-    <action issue="LANG-1091" type="update" dev="britter" due-to="Fabian Lange">Shutdown thread pools in test cases</action>
-    <action issue="LANG-1101" type="update" dev="chas">FastDateParser and FastDatePrinter support 'X' format</action>
-    <action issue="LANG-1100" type="update" dev="chas" due-to="mbracher">Avoid memory allocation when using date formating to StringBuffer</action>
-    <action issue="LANG-935" type="update" dev="britter" due-to="Fabian Lange, Thomas Neidhart">Possible performance improvement on string escape functions</action>
-    <action issue="LANG-948" type="fix" dev="britter" due-to="Andrey Khobnya">Exception while using ExtendedMessageFormat and escaping braces</action>
-    <action issue="LANG-1098" type="update" dev="britter" due-to="Mikhail Mazurskiy, Fabian Lange">Avoid String allocation in StrBuilder.append(CharSequence)</action>
-    <action issue="LANG-1098" type="update" dev="britter" due-to="Michał Kordas">Update maven-checkstyle-plugin to 2.14</action>
-    <action issue="LANG-1097" type="update" dev="britter" due-to="Michał Kordas">Update org.easymock:easymock to 3.3.1</action>
-    <action issue="LANG-1096" type="update" dev="britter" due-to="Michał Kordas">Update maven-pmd-plugin to 3.4</action>
-    <action issue="LANG-1095" type="update" dev="britter" due-to="Michał Kordas">Update maven-antrun-plugin to 1.8</action>
-    <action issue="LANG-1092" type="fix" dev="britter">Wrong formating of time zones with daylight saving time in FastDatePrinter</action>
-    <action issue="LANG-877" type="update" dev="britter" due-to="Fabian Lange">Performance improvements for StringEscapeUtils</action>
-    <action issue="LANG-1093" type="add" dev="britter" due-to="Fabian Lange">Add ClassUtils.getAbbreviatedName()</action>
-    <action issue="LANG-1090" type="fix" dev="sebb">FastDateParser does not set error indication in ParsePosition</action>
-    <action issue="LANG-1089" type="fix" dev="sebb">FastDateParser does not handle excess hours as per SimpleDateFormat</action>
-    <action issue="LANG-1061" type="fix" dev="sebb" due-to="dmeneses">FastDateParser error - timezones not handled correctly</action>
-    <action issue="LANG-1087" type="fix" dev="britter" due-to="Renat Zhilkibaev">NumberUtils#createNumber() returns positive BigDecimal when negative Float is expected</action>
-    <action issue="LANG-1081" type="fix" dev="britter" due-to="Jonathan Baker">DiffBuilder.append(String, Object left, Object right) does not do a left.equals(right) check</action>
-    <action issue="LANG-1055" type="fix" dev="britter" due-to="Jonathan Baker">StrSubstitutor.replaceSystemProperties does not work consistently</action>
-    <action issue="LANG-1082" type="add" dev="britter" due-to="Jonathan Baker">Add option to disable the "objectsTriviallyEqual" test in DiffBuilder</action>
-    <action issue="LANG-1083" type="fix" dev="britter" due-to="Jonathan Baker">Add (T) casts to get unit tests to pass in old JDK</action>
-    <action issue="LANG-1015" type="add" dev="britter" due-to="Thiago Andrade">Add JsonToStringStyle implementation to ToStringStyle</action>
-    <action issue="LANG-1080" type="add" dev="britter" due-to="Innokenty Shuvalov">Add NoClassNameToStringStyle implementation of ToStringStyle</action>
-    <action issue="LANG-1071" type="update" dev="britter" due-to="Arno Noordover">Fix wrong examples in JavaDoc of StringUtils.replaceEachRepeatedly(...), StringUtils.replaceEach(...)</action>
-    <action issue="LANG-883" type="add" dev="britter" due-to="Daniel Stewart">Add StringUtils.containsAny(CharSequence, CharSequence...) method</action>
-    <action issue="LANG-1073" type="fix" dev="kinow" due-to="haiyang li">Read wrong component type of array in add in ArrayUtils</action>
-    <action issue="LANG-1077" type="fix" dev="kinow" due-to="haiyang li">StringUtils.ordinalIndexOf("aaaaaa", "aa", 2) != 3 in StringUtils</action>
-    <action issue="LANG-1072" type="fix" dev="sebb" due-to="haiyang li">Duplicated "0x" check in createBigInteger in NumberUtils</action>
-    <action issue="LANG-1064" type="fix" dev="djones" due-to="B.J. Herbison">StringUtils.abbreviate description doesn't agree with the examples</action>
-    <action issue="LANG-1052" type="add" dev="britter" due-to="Jan Matèrne">Multiline recursive to string style</action>
-    <action issue="LANG-536" type="add" dev="djones" due-to="James Sawle">Add isSorted() to ArrayUtils</action>
-    <action issue="LANG-1041" type="fix" dev="britter" due-to="Alexandre Bartel">Fix MethodUtilsTest so it does not depend on JDK method ordering</action>
-    <action issue="LANG-827" type="update" dev="djones">CompareToBuilder's doc doesn't specify precedence of fields it uses in performing comparisons</action>
-    <action issue="LANG-1000" type="fix" dev="djones">ParseException when trying to parse UTC dates with Z as zone designator using DateFormatUtils.ISO_DATETIME_TIME_ZONE_FORMAT</action>
-    <action issue="LANG-1035" type="fix" dev="djones">Javadoc for EqualsBuilder.reflectionEquals() is unclear</action>
-    <action issue="LANG-1020" type="update" dev="britter" due-to="Libor Ondrusek">Improve performance of normalize space</action>
-    <action issue="LANG-1033" type="add" dev="ggregory">Add StringUtils.countMatches(CharSequence, char)</action>
-    <action issue="LANG-1027" type="update" dev="rmannibucau">org.apache.commons.lang3.SystemUtils#isJavaVersionAtLeast should return true by default</action>
-    <action issue="LANG-1021" type="add" dev="britter" due-to="Alexander Müller">Provide methods to retrieve all fields/methods annotated with a specific type</action>
-    <action issue="LANG-1026" type="update" dev="britter" due-to="Alex Yursha">Bring static method references in StringUtils to consistent style</action>
-    <action issue="LANG-1016" type="add" dev="britter" due-to="Juan Pablo Santos Rodríguez">NumberUtils#isParsable method(s)</action>
-    <action issue="LANG-1017" type="update" dev="britter" due-to="Christoph Schneegans">Use non-ASCII digits in Javadoc examples for StringUtils.isNumeric</action>
-    <action issue="LANG-1008" type="update" dev="britter" due-to="Thiago Andrade">Change min/max methods in NumberUtils/IEEE754rUtils from array input parameters to varargs</action>
-    <action issue="LANG-999" type="add" dev="britter" due-to="Ben Ripkens">Add fuzzy String matching logic to StringUtils</action>
-    <action issue="LANG-1006" type="update" dev="britter" due-to="Thiago Andrade">Add wrap (with String or char) to StringUtils</action>
-    <action issue="LANG-1005" type="update" dev="britter" due-to="Michael Osipov">Extend DurationFormatUtils#formatDurationISO default pattern to match #formatDurationHMS</action>
-    <action issue="LANG-1007" type="update" dev="britter" due-to="Thiago Andrade">Fixing NumberUtils JAVADoc comments for max methods</action>
-    <action issue="LANG-731" type="update" dev="djones">Better Javadoc for BitField class</action>
-    <action issue="LANG-1004" type="update" dev="britter" due-to="Michael Osipov">DurationFormatUtils#formatDurationHMS implementation does not correspond to Javadoc and vice versa</action>
-    <action issue="LANG-1003" type="update" dev="britter">DurationFormatUtils are not able to handle negative durations/periods</action>
-    <action issue="LANG-1001" type="fix" dev="ggregory" due-to="Michael Osipov">ISO 8601 misspelled throughout the Javadocs</action>
-    <action issue="LANG-994" type="add" dev="britter" due-to="Mikhail Mazursky">Add zero copy read method to StrBuilder</action>
-    <action issue="LANG-993" type="add" dev="britter" due-to="Mikhail Mazursky">Add zero copy write method to StrBuilder</action>
-    <action issue="LANG-998" type="update" dev="chas">Javadoc is not clear on preferred pattern to instantiate FastDateParser / FastDatePrinter</action>
-    <action issue="LANG-1088" type="fix" dev="chas">FastDateParser should be case insensitive</action>
-    <action issue="LANG-995" type="fix" dev="britter" due-to="Andrey Khobnya">Fix bug with stripping spaces on last line in WordUtils.wrap()</action>
-    <action issue="LANG-1044" type="add" dev="ggregory">Add method org.apache.commons.lang3.reflect.MethodUtils.invokeExactMethod(Object, String)</action>
-    <action issue="LANG-1045" type="add" dev="ggregory">Add method org.apache.commons.lang3.reflect.MethodUtils.invokeMethod(Object, String)</action>
-  </release>
-
-  <release version="3.3.2" date="2014-04-09" description="Bugfix for a bug in NumberUtils introduced in 3.3.1">
-    <action issue="LANG-992" type="fix" dev="niallp">NumberUtils#isNumber() returns false for "0.0", "0.4790", et al</action>
-    <action issue="LANG-989" type="add" dev="ggregory">Add org.apache.commons.lang3.SystemUtils.IS_JAVA_1_8</action>
-  </release>
-
-  <release version="3.3.1" date="2014-03-18" description="Bugfix release for 3.3">
-    <action issue="LANG-987" type="fix" dev="djones">DateUtils.getFragmentInDays(Date, Calendar.MONTH) returns wrong days</action>
-    <action issue="LANG-983" type="fix" dev="sebb">DurationFormatUtils does not describe format string fully</action>
-    <action issue="LANG-981" type="fix" dev="sebb">DurationFormatUtils#lexx does not detect unmatched quote char</action>
-    <action issue="LANG-984" type="fix" dev="sebb">DurationFormatUtils does not handle large durations correctly</action>
-    <action issue="LANG-982" type="fix" dev="sebb">DurationFormatUtils.formatDuration(61999, "s.SSSS") - ms field size should be 4 digits</action>
-    <action issue="LANG-978" type="fix" dev="sebb">Failing tests with Java 8 b128</action>
-  </release>
-
-  <release version="3.3" date="2014-03-04" description="Bug fixes and and new features including: DifferenceBuilder, ClassPathUtils, RandomUtils and Jaro-Winkler String distance metric">
-    <action issue="LANG-621" type="fix" dev="kinow" due-to="Philip Hodges, Thomas Neidhart">ReflectionToStringBuilder.toString does not debug 3rd party object fields within 3rd party object</action>
-    <action issue="LANG-955" type="add" dev="britter" due-to="Adam Hooper">Add methods for removing all invalid characters according to XML 1.0 and XML 1.1 in an input string to StringEscapeUtils</action>
-    <action issue="LANG-977" type="fix" dev="britter" due-to="Chris Karcher">NumericEntityEscaper incorrectly encodes supplementary characters</action>
-    <action issue="LANG-973" type="fix" dev="sebb">Make some private fields final</action>
-    <action issue="LANG-971" type="fix" dev="sebb">NumberUtils#isNumber(String) fails to reject invalid Octal numbers</action>
-    <action issue="LANG-972" type="fix" dev="sebb">NumberUtils#isNumber does not allow for hex 0XABCD</action>
-    <action issue="LANG-969" type="fix" dev="ggregory" due-to="Matt Bishop">StringUtils.toEncodedString(byte[], Charset) needlessly throws UnsupportedEncodingException</action>
-    <action issue="LANG-970" type="add" dev="ggregory">Add APIs MutableBoolean setTrue() and setFalse()</action>
-    <action issue="LANG-946" type="fix" dev="britter">ConstantInitializerTest fails when building with IBM JDK 7</action>
-    <action issue="LANG-962" type="add" dev="ggregory">Add SerializationUtils.roundtrip(T extends Serializable) to serialize then deserialize</action>
-    <action issue="LANG-961" type="update" dev="ggregory">org.apache.commons.lang3.reflect.FieldUtils.removeFinalModifier(Field) does not clean up after itself</action>
-    <action issue="LANG-958" type="update" dev="chas">FastDateParser javadoc incorrectly states that SimpleDateFormat is used internally</action>
-    <action issue="LANG-637" type="add" dev="djones">There should be a DifferenceBuilder with a ReflectionDifferenceBuilder implementation</action>
-    <action issue="LANG-954" type="fix" due-to="Michael Keppler" dev="sebb">uncaught PatternSyntaxException in FastDateFormat on Android</action>
-    <action issue="LANG-956" type="update" dev="britter">Improve JavaDoc of WordUtils.wrap methods</action>
-    <action issue="LANG-944" type="add" dev="britter" due-to="Rekha Joshi">Add the Jaro-Winkler string distance algorithm to StringUtils</action>
-    <action issue="LANG-936" type="fix" dev="bayard" due-to="Yaniv Kunda, Eli Lindsey">StringUtils.getLevenshteinDistance with too big of a threshold returns wrong result</action>
-    <action issue="LANG-943" type="fix" dev="kinow">Test DurationFormatUtilsTest.testEdgeDuration fails in JDK 1.6, 1.7 and 1.8, BRST time zone</action>
-    <action issue="LANG-613" type="fix" dev="mbenson">ConstructorUtils.getAccessibleConstructor() Does Not Check the Accessibility of Enclosing Classes</action>
-    <action issue="LANG-951" type="fix" dev="britter" due-to="Sebastian Götz">Fragments are wrong by 1 day when using fragment YEAR or MONTH</action>
-    <action issue="LANG-417" type="add" dev="britter">New class ClassPathUtils with methods for turning FQN into resource path</action>
-    <action issue="LANG-939" type="update" dev="britter">Move Documentation from user guide to package-info files</action>
-    <action issue="LANG-953" type="update" dev="britter">Convert package.html files to package-info.java files</action>
-    <action issue="LANG-950" type="fix" dev="chas">FastDateParser does not handle two digit year parsing like SimpleDateFormat</action>
-    <action issue="LANG-949" type="fix" dev="chas">FastDateParserTest.testParses does not test FastDateParser</action>
-    <action issue="LANG-940" type="update" dev="britter">Fix deprecation warnings</action>
-    <action issue="LANG-819" type="update" dev="mbenson">EnumUtils.generateBitVector needs a "? extends"</action>
-    <action issue="LANG-834" type="add" dev="britter">Validate: add inclusiveBetween and exclusiveBetween overloads for primitive types</action>
-    <action issue="LANG-900" type="add" dev="britter" due-to="Duncan Jones">New RandomUtils class</action>
-    <action issue="LANG-915" type="fix" dev="britter" due-to="Sergio Fernández">Wrong locale handling in LocaleUtils.toLocale()</action>
-    <action issue="LANG-966" type="add" dev="ggregory">Add IBM OS/400 detection</action>
-  </release>
-
-  <release version="3.2.1" date="2014-01-05" description="Bug fix for 3.2">
-    <action issue="LANG-937" type="fix" dev="britter">Fix missing Hamcrest dependency in Ant Build</action>
-    <action issue="LANG-941" type="fix" dev="britter">Test failure in LocaleUtilsTest when building with JDK 8</action>
-    <action issue="LANG-942" type="fix" dev="britter" due-to="Bruno P. Kinoshita, Henri Yandell">Test failure in FastDateParserTest and FastDateFormat_ParserTest when building with JDK8</action>
-    <action issue="LANG-938" type="fix">Build fails with test failures when building with JDK 8</action>
-  </release>
-
-  <release version="3.2" date="2014-01-01" description="Bug fixes and new features, at least requires Java 6.0">
-    <action issue="LANG-934" type="add" dev="mcucchiara">Add removeFinalModifier to FieldUtils</action>
-    <action issue="LANG-863" type="add" due-to="Daneel S. Yaitskov" dev="sebb">Method returns number of inheritance hops between parent and subclass</action>
-    <action issue="LANG-932" type="fix" due-to="Ville Skyttä" dev="sebb">Spelling fixes</action>
-    <action issue="LANG-931" type="update" dev="britter" due-to="Christoph Schneegans">Misleading Javadoc comment in StrBuilderReader class</action>
-    <action issue="LANG-929" type="fix">OctalUnescaper tried to parse all of \279</action>
-    <action issue="LANG-928" type="fix">OctalUnescaper had bugs when parsing octals starting with a zero</action>
-    <action issue="LANG-905" type="fix">EqualsBuilder returned true when comparing arrays, even when the elements are different</action>
-    <action issue="LANG-774" type="add" due-to="Erhan Bagdemir">Added isStarted, isSuspended and isStopped to StopWatch</action>
-    <action issue="LANG-917" type="fix" due-to="Arne Burmeister">Fixed exception when combining custom and choice format in ExtendedMessageFormat</action>
-    <action issue="LANG-848" type="add" due-to="Alexander Muthmann">Added StringUtils.isBlank/isEmpty CharSequence... methods</action>
-    <action issue="LANG-926" type="add" dev="ggregory">Added ArrayUtils.reverse(array, from, to) methods</action>
-    <action issue="LANG-795" type="add" due-to="Aaron Digulla">StringUtils.toString(byte[], String) deprecated in favour of a new StringUtils.toString(byte[], CharSet)</action>
-    <action issue="LANG-902" type="fix" due-to="Andrzej Winnicki">RandomStringUtils.random javadoc was incorrectly promising letters and numbers would, as opposed to may, appear</action>
-    <action issue="LANG-921" type="fix" dev="britter">BooleanUtils.xor(boolean...) produces wrong results</action>
-    <action issue="LANG-910" type="update" due-to="Timur Yarosh">StringUtils.normalizeSpace now handles non-breaking spaces (Unicode 00A0)</action>
-    <action issue="LANG-804" type="update" dev="britter" due-to="Allon Mureinik">Redundant check for zero in HashCodeBuilder ctor</action>
-    <action issue="LANG-893" type="add" dev="oheger" due-to="Woonsan Ko">StrSubstitutor now supports default values for variables</action>
-    <action issue="LANG-913" type="add" dev="britter" due-to="Allon Mureinik">Adding .gitignore to commons-lang</action>
-    <action issue="LANG-837" type="add">Add ObjectUtils.toIdentityString methods that support StringBuilder, StrBuilder, and Appendable</action>
-    <action issue="LANG-896" type="fix" due-to="Mark Bryan Yu">BooleanUtils.toBoolean(String str) javadoc is not updated</action>
-    <action issue="LANG-879" type="fix">LocaleUtils test fails with new Locale "ja_JP_JP_#u-ca-japanese" of JDK7</action>
-    <action issue="LANG-836" type="fix" due-to="Arnaud Brunet">StrSubstitutor does not support StringBuilder or CharSequence</action>
-    <action issue="LANG-693" type="fix" due-to="Calvin Echols">Method createNumber from NumberUtils doesn't work for floating point numbers other than Float</action>
-    <action issue="LANG-887" type="fix">FastDateFormat does not use the locale specific cache correctly</action>
-    <action issue="LANG-884" type="update">Simplify FastDateFormat; eliminate boxing</action>
-    <action issue="LANG-882" type="update">LookupTranslator now works with implementations of CharSequence other than String</action>
-    <action issue="LANG-754" type="fix">ClassUtils.getShortName(String) will now only do a reverse lookup for array types</action>
-    <action issue="LANG-886" type="add">Added CharSetUtils.containsAny(String, String)</action>
-    <action issue="LANG-846" type="update">Provide CharSequenceUtils.regionMatches with a proper green implementation instead of inefficiently converting to Strings</action>
-    <action issue="LANG-797" type="add">Added escape/unescapeJson to StringEscapeUtils</action>
-    <action issue="LANG-875" type="add">Added appendIfMissing and prependIfMissing methods to StringUtils</action>
-    <action issue="LANG-881" type="fix">NumberUtils.createNumber() Javadoc says it does not work for octal numbers</action>
-    <action type="fix">Fixed URLs in javadoc to point to new oracle.com pages</action>
-    <action issue="LANG-870" type="add">Add StringUtils.LF and StringUtils.CR values</action>
-    <action issue="LANG-873" type="add">Add FieldUtils getAllFields() to return all the fields defined in the given class and super classes</action>
-    <action issue="LANG-865" type="fix">LocaleUtils.toLocale does not parse strings starting with an underscore</action>
-    <action issue="LANG-835" type="add">StrBuilder should support StringBuilder as an input parameter</action>
-    <action issue="LANG-858" type="fix">StringEscapeUtils.escapeJava() and escapeEcmaScript() do not output the escaped surrogate pairs that are Java parsable</action>
-    <action issue="LANG-857" type="add">StringIndexOutOfBoundsException in CharSequenceTranslator</action>
-    <action issue="LANG-856" type="add">Code refactoring in NumberUtils</action>
-    <action issue="LANG-855" type="add">NumberUtils#createBigInteger does not allow for hex and octal numbers</action>
-    <action issue="LANG-854" type="add">NumberUtils#createNumber - does not allow for hex numbers to be larger than Long</action>
-    <action issue="LANG-853" type="add">StringUtils join APIs for primitives</action>
-    <action issue="LANG-849" type="fix">FastDateFormat and FastDatePrinter generates Date objects wastefully</action>
-    <action issue="LANG-845" type="fix">Spelling fixes</action>
-    <action issue="LANG-844" type="fix">Fix examples contained in javadoc of StringUtils.center methods</action>
-    <action issue="LANG-841" type="add">Add StringUtils API to call String.replaceAll in DOTALL a.k.a. single-line mode</action>
-    <action issue="LANG-839" type="update">ArrayUtils removeElements methods use unnecessary HashSet</action>
-    <action issue="LANG-838" type="update">ArrayUtils removeElements methods clone temporary index arrays unnecessarily</action>
-    <action issue="LANG-832" type="fix">FastDateParser does not handle unterminated quotes correctly</action>
-    <action issue="LANG-831" type="fix">FastDateParser does not handle white-space properly</action>
-    <action issue="LANG-830" type="fix">FastDateParser could use \Q \E to quote regexes</action>
-    <action issue="LANG-828" type="fix">FastDateParser does not handle non-Gregorian calendars properly</action>
-    <action issue="LANG-826" type="fix">FastDateParser does not handle non-ASCII digits correctly</action>
-    <action issue="LANG-825" type="add">Create StrBuilder APIs similar to String.format(String, Object...)</action>
-    <action issue="LANG-822" type="fix">NumberUtils#createNumber - bad behaviour for leading "--"</action>
-    <action issue="LANG-818" type="fix">FastDateFormat's "z" pattern does not respect timezone of Calendar instances passed to format()</action>
-    <action issue="LANG-817" type="fix">Add org.apache.commons.lang3.SystemUtils.IS_OS_WINDOWS_8</action>
-    <action issue="LANG-813" type="fix">StringUtils.equalsIgnoreCase doesn't check string reference equality</action>
-    <action issue="LANG-810" type="fix">StringUtils.join() endIndex, bugged for loop</action>
-    <action issue="LANG-807" type="fix">RandomStringUtils throws confusing IAE when end &lt;= start</action>
-    <action issue="LANG-805" type="fix">RandomStringUtils.random(count, 0, 0, false, false, universe, random) always throws java.lang.ArrayIndexOutOfBoundsException</action>
-    <action issue="LANG-802" type="fix">LocaleUtils - unnecessary recursive call in SyncAvoid class.</action>
-    <action issue="LANG-800" type="fix">Javadoc bug in DateUtils#ceiling for Calendar and Object versions.</action>
-    <action issue="LANG-799" type="update">DateUtils#parseDate uses default locale; add Locale support</action>
-    <action issue="LANG-798" type="update">Use generics in SerializationUtils</action>
-    <action issue="LANG-788" type="fix">SerializationUtils throws ClassNotFoundException when cloning primitive classes</action>
-    <action issue="LANG-786" type="fix">StringUtils equals() relies on undefined behavior</action>
-    <action issue="LANG-783" type="fix">Documentation bug: StringUtils.split</action>
-    <action issue="LANG-777" type="fix">jar contains velocity template of release notes</action>
-    <action issue="LANG-776" type="fix">TypeUtilsTest contains incorrect type assignability assertion</action>
-    <action issue="LANG-775" type="fix">TypeUtils.getTypeArguments() misses type arguments for partially-assigned classes</action>
-    <action issue="LANG-773" type="fix">ImmutablePair doc contains nonsense text</action>
-    <action issue="LANG-772" type="fix">ClassUtils.PACKAGE_SEPARATOR Javadoc contains garbage text</action>
-    <action issue="LANG-765" type="fix">EventListenerSupport.ProxyInvocationHandler no longer defines serialVersionUID</action>
-    <action issue="LANG-764" type="fix">StrBuilder is now serializable</action>
-    <action issue="LANG-761" type="fix">Fix Javadoc Ant warnings</action>
-    <action issue="LANG-747" type="fix">NumberUtils does not handle Long Hex numbers</action>
-    <action issue="LANG-743" type="fix">Javadoc bug in static inner class DateIterator</action>
-    <action issue="LANG-675" type="add">Add Triple class (ternary version of Pair)</action>
-    <action issue="LANG-462" type="add">FastDateFormat supports parse methods</action>
-  </release>
-
-  <release version="3.1" date="2011-11-14" description="November release">
-    <action type="add" issue="LANG-760">Add API StringUtils.toString(byte[] intput, String charsetName)</action>
-    <action type="update" issue="LANG-758">Add an example with whitespace in StringUtils.defaultIfEmpty</action>
-    <action type="add" issue="LANG-756">Add APIs ClassUtils.isPrimitiveWrapper(Class&lt;?&gt;) and isPrimitiveOrWrapper(Class&lt;?&gt;)</action>
-    <action type="update" issue="LANG-752">Fix createLong() so it behaves like createInteger()</action>
-    <action type="update" issue="LANG-751">Include the actual type in the Validate.isInstance and isAssignableFrom exception messages</action>
-    <action type="fix" issue="LANG-749">Incorrect Bundle-SymbolicName in Manifest</action>
-    <action type="update" issue="LANG-748">Deprecating chomp(String, String)</action>
-    <action type="fix" issue="LANG-746">NumberUtils does not handle upper-case hex: 0X and -0X</action>
-    <action type="fix" issue="LANG-744">StringUtils throws java.security.AccessControlException on Google App Engine</action>
-    <action type="fix" issue="LANG-741">Ant build has wrong component.name</action>
-    <action type="update" issue="LANG-736">CharUtils static final array CHAR_STRING is not needed to compute CHAR_STRING_ARRAY</action>
-    <action type="fix" issue="LANG-698">Document that the Mutable numbers don't work as expected with String.format</action>
-    <action type="add" issue="LANG-695">SystemUtils.IS_OS_UNIX doesn't recognize FreeBSD as a Unix system</action>
-  </release>
-
-  <release version="3.0.1" date="2011-08-09" description="August release">
-    <action type="fix" issue="LANG-626">SerializationUtils.clone: Fallback to context classloader if class not found in current classloader.</action>
-    <action type="fix" issue="LANG-727">ToStringBuilderTest.testReflectionHierarchyArrayList fails with IBM JDK 6.</action>
-    <action type="fix" issue="LANG-720">StringEscapeUtils.escapeXml(input) wrong when input contains characters in Supplementary Planes.</action>
-    <action type="fix" issue="LANG-708">StringEscapeUtils.escapeEcmaScript from lang3 cuts off long unicode string.</action>
-    <action type="update" issue="LANG-686">Improve exception message when StringUtils.replaceEachRepeatedly detects recursion.</action>
-    <action type="update" issue="LANG-717">Specify source encoding for Ant build.</action>
-    <action type="add" issue="LANG-721">Complement ArrayUtils.addAll() variants with by-index and by-value removal methods.</action>
-    <action type="add" issue="LANG-726">Add Range&lt;T&gt; Range&lt;T&gt;.intersectionWith(Range&lt;T&gt;).</action>
-    <action type="add" issue="LANG-723">Add mode and median Comparable... methods to ObjectUtils.</action>
-    <action type="add" issue="LANG-722">Add BooleanUtils.and + or varargs methods.</action>
-    <action type="add" issue="LANG-730">EnumSet -&gt; bit vector.</action>
-    <action type="fix" issue="LANG-734">The CHAR_ARRAY cache in CharUtils duplicates the cache in java.lang.Character.</action>
-    <action type="update" issue="LANG-735">Deprecate CharUtils.toCharacterObject(char) in favor of java.lang.Character.valueOf(char).</action>
-    <action type="add" issue="LANG-737">Missing method getRawMessage for ContextedException and ContextedRuntimeException.</action>
-    <action type="fix" issue="LANG-738">Use internal Java's Number caches instead creating new objects.</action>
-  </release>
-
-  <release version="3.0" date="2011-07-18" description="Backwards incompatible update of Commons Lang to Java 5">
-    <action type="fix" issue="LANG-720">StringEscapeUtils.escapeXml(input) outputs wrong results when an input contains characters in Supplementary Planes.</action>
-    <action type="update" issue="LANG-718">build.xml Java 1.5+ updates.</action>
-    <action type="fix" issue="LANG-716">swapCase and *capitalize speedups.</action>
-    <action type="fix" issue="LANG-715">CharSetUtils.squeeze() speedup.</action>
-    <action type="fix" issue="LANG-714">StringUtils doc/comment spelling fixes.</action>
-    <action type="update" issue="LANG-713">Increase test coverage of FieldUtils read methods and tweak Javadoc.</action>
-    <action type="fix" issue="LANG-711">Add includeantruntime=false to javac targets to quell warnings in ant 1.8.1 and better (and modest performance gain).</action>
-    <action type="fix" issue="LANG-710">StringIndexOutOfBoundsException when calling unescapeHtml4("&amp;#03").</action>
-    <action type="fix" issue="LANG-708">StringEscapeUtils.escapeEcmaScript from lang3 cuts off long Unicode string.</action>
-    <action type="fix" issue="LANG-703">StringUtils.join throws NPE when toString returns null for one of objects in collection.</action>
-    <action type="add" issue="LANG-697">Add FormattableUtils class.</action>
-    <action type="add">Add ClassUtils.getSimpleName() methods.</action>
-    <action type="add" issue="LANG-692">Add hashCodeMulti varargs method.</action>
-    <action type="remove" issue="LANG-691">Removed DateUtils.UTC_TIME_ZONE.</action>
-    <action type="update" issues="LANG-687">Convert more of the StringUtils API to take CharSequence.</action>
-    <action type="fix" issue="LANG-685">EqualsBuilder synchronizes on HashCodeBuilder.</action>
-    <action type="fix" issue="LANG-428">StringUtils.isAlpha, isAlphanumeric and isNumeric now return false for "".</action>
-    <action type="add" issue="LANG-678">Add support for ConcurrentMap.putIfAbsent().</action>
-    <action type="add" issue="LANG-676">Documented potential NPE if auto-boxing occurs for some BooleanUtils methods.</action>
-    <action type="fix" issue="LANG-677">DateUtils.isSameLocalTime compares using 12 hour clock and not 24 hour.</action>
-    <action type="add" issue="LANG-610">Extend exception handling in ConcurrentUtils to runtime exceptions.</action>
-    <action type="fix" issue="LANG-624">SystemUtils.getJavaVersionAsFloat throws StringIndexOutOfBoundsException on Android runtime/Dalvik VM.</action>
-    <action type="remove" issue="LANG-673">WordUtils.abbreviate() removed.</action>
-    <action type="fix" issue="LANG-672">Doc bug in DateUtils#ceiling.</action>
-    <action type="fix" issue="LANG-646">StringEscapeUtils.unescapeJava doesn't handle octal escapes and Unicode with extra u.</action>
-    <action type="fix" issue="LANG-662">org.apache.commons.lang3.math.Fraction does not reduce (Integer.MIN_VALUE, 2^k).</action>
-    <action type="fix" issue="LANG-663">org.apache.commons.lang3.math.Fraction does not always succeed in multiplyBy and divideBy.</action>
-    <action type="update" issue="LANG-668">Change ObjectUtils min() &amp; max() functions to use varargs rather than just two parameters.</action>
-    <action type="add" issue="LANG-667">Add a Null-safe compare() method to ObjectUtils.</action>
-    <action type="fix" issue="LANG-664">NumberUtils.isNumber(String) is not right when the String is "1.1L".</action>
-    <action type="fix" issue="LANG-659">EntityArrays typo: {"\u2122", "&amp;minus;"}, // minus sign, U+2212 ISOtech.</action>
-    <action type="fix" issue="LANG-658">Some Entitys like &amp;Ouml; are not matched properly against its ISO8859-1 representation.</action>
-    <action type="fix" issue="LANG-656">Example StringUtils.indexOfAnyBut("zzabyycdxx", '') = 0 incorrect.</action>
-    <action type="add" issue="LANG-655">Add StringUtils.defaultIfBlank().</action>
-    <action type="add" issue="LANG-653">Provide a very basic ConcurrentInitializer implementation.</action>
-    <action type="add" issue="LANG-609">Support lazy initialization using atomic variables.</action>
-    <action type="add" issue="LANG-482">Enhance StrSubstitutor to support nested ${var-${subvr}} expansion.</action>
-    <action type="add" issue="LANG-644">Provide documentation about the new concurrent package.</action>
-    <action type="fix" issue="LANG-629">Charset may not be threadsafe, because the HashSet is not synch.</action>
-    <action type="fix" issue="LANG-617">StringEscapeUtils.escapeXML() can't process UTF-16 supplementary characters.</action>
-    <action type="add" issue="LANG-614">StringUtils.endsWithAny method.</action>
-    <action type="add" issue="LANG-651">Add AnnotationUtils.</action>
-    <action type="add" issue="LANG-649">BooleanUtils.toBooleanObject to support single character input.</action>
-    <action type="fix" issue="LANG-645">FastDateFormat.format() outputs incorrect week of year because locale isn't respected.</action>
-    <action type="fix" issue="LANG-596">StrSubstitutor should also handle the default properties of a java.util.Properties class.</action>
-    <action type="fix" issue="LANG-643">Javadoc StringUtils.left() claims to throw on negative len, but doesn't.</action>
-    <action type="add" issue="LANG-640">Add normalizeSpace to StringUtils.</action>
-    <action type="fix" issue="LANG-638">NumberUtils createNumber throws a StringIndexOutOfBoundsException when argument containing "e" and "E" is passed in.</action>
-    <!-- 3.0 beta below here -->
-    <action>NOTE: The below were included in the Commons Lang 3.0-beta release.</action>
-    <action type="update" issues="LANG-510">Convert StringUtils API to take CharSequence.</action>
-    <action type="update">Push down WordUtils to "text" sub-package.</action>
-    <action type="add" issue="LANG-610">Extend exception handling in ConcurrentUtils to runtime exceptions.</action>
-    <action type="fix" issue="LANG-608">Some StringUtils methods should take an int character instead of char to use String API features.</action>
-    <action type="fix" issue="LANG-606">EqualsBuilder causes StackOverflowException.</action>
-    <action type="update" issue="LANG-605">DefaultExceptionContext overwrites values in recursive situations.</action>
-    <action type="fix" issue="LANG-602">ContextedRuntimeException no longer an 'unchecked' exception.</action>
-    <action type="add" issue="LANG-601">Add Builder Interface / Update Builders to Implement It.</action>
-    <action type="fix" issue="LANG-600">Javadoc is incorrect for public static int lastIndexOf(String str, String searchStr).</action>
-    <action type="update" issue="LANG-599">ClassUtils.getClass(): Allow Dots as Inner Class Separators.</action>
-    <action type="add" issue="LANG-594">DateUtils equal &amp; compare functions up to most significant field.</action>
-    <action type="remove" issue="LANG-590">Remove JDK 1.2/1.3 bug handling in StringUtils.indexOf(String, String, int).</action>
-    <action type="add" issue="LANG-588">Create a basic Pair&lt;L, R&gt; class.</action>
-    <action type="fix" issue="LANG-585">exception.DefaultExceptionContext.getFormattedExceptionMessage catches Throwable.</action>
-    <action type="add" issue="LANG-582">Provide an implementation of the ThreadFactory interface.</action>
-    <action type="update" issue="LANG-579">Add new Validate methods.</action>
-    <action type="fix" issue="LANG-571">ArrayUtils.add(T[] array, T element) can create unexpected ClassCastException.</action>
-    <action type="update" issue="LANG-570">Do the test cases really still require main() and suite() methods?.</action>
-    <action type="fix" issue="LANG-568">@SuppressWarnings("unchecked") is used too generally.</action>
-    <action type="fix" issue="LANG-564">Improve StrLookup API documentation.</action>
-    <action type="update" issue="LANG-563">Change Java package name.</action>
-    <action type="update" issue="LANG-562">Change Maven groupId.</action>
-    <action type="add" issue="LANG-560">New TimedSemaphore class.</action>
-    <action type="add" issue="LANG-559">Added validState validation method.</action>
-    <action type="add" issue="LANG-559">Added isAssignableFrom and isInstanceOf validation methods.</action>
-    <action type="add" issue="LANG-553">Add TypeUtils class to provide utility code for working with generic types.</action>
-    <action type="update" issue="LANG-551">Replace Range classes with generic version.</action>
-    <action type="update" issue="LANG-548">Use Iterable on API instead of Collection.</action>
-    <action type="add" issue="LANG-546">Add methods to Validate to check whether the index is valid for the array/list/string.</action>
-    <action type="add" issue="LANG-545">Add ability to create a Future for a constant.</action>
-    <action type="update" issue="LANG-541">Replace StringBuffer with StringBuilder.</action>
-    <action type="update" issue="LANG-540">Make NumericEntityEscaper immutable.</action>
-    <action type="update" issue="LANG-539">Compile commons.lang for CDC 1.1/Foundation 1.1.</action>
-    <action type="add" issue="LANG-537">Add ArrayUtils.toArray to create generic arrays.</action>
-    <action type="add" issue="LANG-533">Validate: support for validating blank strings.</action>
-    <action type="add" issue="LANG-529">Add a concurrent package.</action>
-    <action type="update" issue="LANG-528">Mutable classes should implement an appropriately typed Mutable interface.</action>
-    <action type="update" issue="LANG-513">Better EnumUtils.</action>
-    <action type="update" issue="LANG-507">StringEscapeUtils.unescapeJava should support \u+ notation.</action>
-    <action type="update" issue="LANG-505">Rewrite StringEscapeUtils.</action>
-    <action type="update" issue="LANG-504">bring ArrayUtils.isEmpty to the generics world.</action>
-    <action type="add" issue="LANG-501">Add support for background initialization.</action>
-    <action type="add" issue="LANG-499">Add support for the handling of ExecutionExceptions.</action>
-    <action type="add" issue="LANG-498">Add StringEscapeUtils.escapeText() methods.</action>
-    <action type="add" issue="LANG-497">Addition of ContextedException and ContextedRuntimeException.</action>
-    <action type="add" issue="LANG-496">A generic implementation of the Lazy initialization pattern.</action>
-    <action type="remove" issue="LANG-493">Remove code that does not hold enough value to remain.</action>
-    <action type="remove" issue="LANG-492">Remove code handled now by the JDK.</action>
-    <action type="add" issue="LANG-482">StrSubstitutor now supports substitution in variable names.</action>
-    <action type="fix" issue="LANG-481">Possible race-conditions in hashCode of the range classes.</action>
-    <action type="fix" issue="LANG-480">StringEscapeUtils.escapeHtml incorrectly converts Unicode characters above U+00FFFF into 2 characters.</action>
-    <action type="update" issue="LANG-479">Document where in SVN trunk is.</action>
-    <action type="fix" issue="LANG-478">StopWatch does not resist to system time changes.</action>
-    <action type="fix" issue="LANG-474">Fixes for thread safety.</action>
-    <action type="update" issue="LANG-458">Refactor Validate.java to eliminate code redundancy.</action>
-    <action type="fix" issue="LANG-448">Lower Ascii Characters don't get encoded by Entities.java.</action>
-    <action type="add" issue="LANG-444">StringUtils.emptyToNull.</action>
-    <action type="fix" issue="LANG-439">StringEscapeUtils.escapeHTML() does not escape chars (0x00-0x20).</action>
-    <action type="remove" issue="LANG-438">Remove @deprecateds.</action>
-    <action type="add" issue="LANG-435">Add ClassUtils.isAssignable() variants with autoboxing.</action>
-    <action type="update" issue="LANG-424">Improve Javadoc for StringUtils class.</action>
-    <action type="fix" issue="LANG-418">Javadoc incorrect for StringUtils.endsWithIgnoreCase.</action>
-    <action type="update" issue="LANG-396">Investigate for vararg usages.</action>
-    <action type="fix" issue="LANG-468">JDK 1.5 build/runtime failure on LANG-393 (EqualsBuilder).</action>
-    <action type="add" issue="LANG-386">LeftOf/RightOfNumber in Range convenience methods necessary.</action>
-    <action type="fix" issue="LANG-369">ExceptionUtils not thread-safe.</action>
-    <action type="add" issue="LANG-358">ObjectUtils.coalesce.</action>
-    <action type="update" issue="LANG-355">StrBuilder should implement CharSequence and Appendable.</action>
-    <action type="fix" issue="LANG-339">StringEscapeUtils.escapeHtml() escapes multibyte characters like Chinese, Japanese, etc.</action>
-    <action type="update" issue="LANG-336">Finally start using generics.</action>
-    <action type="fix" issue="LANG-302">StrBuilder does not implement clone().</action>
-    <action type="update" issue="LANG-290">EnumUtils for JDK 5.0.</action>
-    <action type="add" issue="LANG-285">Wish : method unaccent.</action>
-    <action type="add" issue="LANG-276">MutableBigDecimal and MutableBigInteger.</action>
-    <action type="fix" issue="LANG-66">StringEscaper.escapeXml() escapes characters &gt; 0x7f.</action>
-    <action type="fix" issue="LANG-11">Depend on JDK 1.5+.</action>
-  </release>
-
-  <release version="2.6" date="2011-01-16" description="Bug Fixes/Enhancements for the 2.6 release (requires minimum of Java 1.3)">
-    <action type="update" issue="LANG-633">BooleanUtils: use same optimization in toBooleanObject(String) as in toBoolean(String).</action>
-    <action type="update" issue="LANG-599">ClassUtils: allow Dots as Inner Class Separators in getClass().</action>
-    <action type="add" issue="LANG-594">DateUtils: equal and compare functions up to most significant field.</action>
-    <action type="add" issue="LANG-632">DateUtils: provide a Date to Calendar convenience method.</action>
-    <action type="add" issue="LANG-576">ObjectUtils: add clone methods to ObjectUtils.</action>
-    <action type="add" issue="LANG-667">ObjectUtils: add a Null-safe compare() method.</action>
-    <action type="add" issue="LANG-670">ObjectUtils: add notEqual() method.</action>
-    <action type="add" issue="LANG-302">StrBuilder: implement clone() method.</action>
-    <action type="add" issue="LANG-640">StringUtils: add a normalizeSpace() method.</action>
-    <action type="add" issue="LANG-614">StringUtils: add endsWithAny() method.</action>
-    <action type="add" issue="LANG-655">StringUtils: add defaultIfBlank() method.</action>
-    <action type="add" issue="LANG-596">StrSubstitutor: add a replace(String, Properties) variant.</action>
-    <action type="add" issue="LANG-482">StrSubstitutor: support substitution in variable names.</action>
-    <action type="update" issue="LANG-669">Use StrBuilder instead of StringBuffer to improve performance where sync. is not an issue.</action>
-    <action type="fix" issue="LANG-629">CharSet: make the underlying set synchronized.</action>
-    <action type="fix" issue="LANG-635">CompareToBuilder: fix passing along compareTransients to the reflectionCompare method.</action>
-    <action type="fix" issue="LANG-636">ExtendedMessageFormat doesn't override equals(Object).</action>
-    <action type="fix" issue="LANG-645">FastDateFormat: fix to properly include the locale when formatting a Date.</action>
-    <action type="fix" issue="LANG-638">NumberUtils: createNumber() throws a StringIndexOutOfBoundsException when argument containing "e" and "E" is passed in.</action>
-    <action type="fix" issue="LANG-607">StringUtils methods do not handle Unicode 2.0+ supplementary characters correctly.</action>
-    <action type="fix" issue="LANG-624">SystemUtils: getJavaVersionAsFloat throws StringIndexOutOfBoundsException on Android runtime/Dalvik VM.</action>
-    <action type="fix" issue="BEANUTILS-381">MemberUtils: getMatchingAccessibleMethod does not correctly handle inheritance and method overloading.</action>
-    <action type="update" issue="LANG-600">Javadoc is incorrect for lastIndexOf() method.</action>
-    <action type="update" issue="LANG-628">Javadoc for HashCodeBuilder.append(boolean) does not match implementation.</action>
-    <action type="update" issue="LANG-643">Javadoc StringUtils.left() claims to throw an exception on negative lenth, but doesn't.</action>
-    <action type="update" issue="LANG-370">Javadoc - document thread safety.</action>
-    <action type="update" issue="LANG-623">Test for StringUtils replaceChars() icelandic characters.</action>
-  </release>
-
-  <release version="2.5" date="2010-02-25" description="">
-    <action type="add" issue="LANG-583">ArrayUtils - add isNotEmpty() methods.</action>
-    <action type="add" issue="LANG-534">ArrayUtils - add nullToEmpty() methods.</action>
-    <action type="add" issue="LANG-454">CharRange - provide an iterator that lets you walk the chars in the range.</action>
-    <action type="add" issue="LANG-514">CharRange - add more readable static builder methods.</action>
-    <action type="add">ClassUtils - new isAssignable() methods with autoboxing.</action>
-    <action type="add" issue="LANG-535">ClassUtils - add support to getShortClassName and getPackageName for arrays.</action>
-    <action type="add" issue="LANG-434">DateUtils - add ceiling() method.</action>
-    <action type="add" issue="LANG-486">DateUtils - add parseDateStrictly() method.</action>
-    <action type="add" issue="LANG-466">EqualsBuilder - add reset() method.</action>
-    <action type="add" issue="LANG-461">NumberUtils - add toByte() and toShort() methods.</action>
-    <action type="add" issue="LANG-522">Mutable numbers - add string constructors.</action>
-    <action type="add">MutableBoolean - add toBoolean(), isTrue() and isFalse() methods.</action>
-    <action type="add" issue="LANG-422">StrBuilder - add appendSeparator() methods with an alternative default separator if the StrBuilder is currently empty.</action>
-    <action type="add" issue="LANG-555">SystemUtils - add IS_OS_WINDOWS_7 constant.</action>
-    <action type="add" issue="LANG-554">SystemUtils - add IS_JAVA_1_7 constant for JDK 1.7.</action>
-    <action type="add" issue="LANG-405">StringUtils - add abbreviateMiddle() method.</action>
-    <action type="add" issue="LANG-569">StringUtils - add indexOfIgnoreCase() and lastIndexOfIgnoreCase() methods.</action>
-    <action type="add" issue="LANG-471">StringUtils - add isAllUpperCase() and isAllLowerCase() methods.</action>
-    <action type="add" issue="LANG-469">StringUtils - add lastOrdinalIndexOf() method to complement the existing ordinalIndexOf() method.</action>
-    <action type="add" issue="LANG-348">StringUtils - add repeat() method.</action>
-    <action type="add" issue="LANG-445">StringUtils - add startsWithAny() method.</action>
-    <action type="add" issue="LANG-430">StringUtils - add upperCase(String, Locale) and lowerCase(String, Locale) methods.</action>
-    <action type="add" issue="LANG-416">New Reflection package containing ConstructorUtils, FieldUtils, MemberUtils and MethodUtils.</action>
-    <action type="fix" issue="LANG-567">ArrayUtils - addAll() does not handle mixed types very well.</action>
-    <action type="fix" issue="LANG-494">CharSet - Synchronizing the COMMON Map so that getInstance doesn't miss a put from a subclass in another thread.</action>
-    <action type="fix" issue="LANG-500">ClassUtils - improving performance of getAllInterfaces.</action>
-    <action type="fix" issue="LANG-587">ClassUtils - toClass() throws NullPointerException on null array element.</action>
-    <action type="fix" issue="LANG-530">DateUtils - Fix parseDate() cannot parse ISO8601 dates produced by FastDateFormat.</action>
-    <action type="fix" issue="LANG-440">DateUtils - round() doesn't work correct for Calendar.AM_PM.</action>
-    <action type="fix" issue="LANG-443">DateUtils - improve tests.</action>
-    <action type="fix" issue="LANG-204">Entities - multithreaded initialization.</action>
-    <action type="fix" issue="LANG-506">Entities - missing final modifiers; thread-safety issues.</action>
-    <action type="fix" issue="LANG-76">EnumUtils - getEnum() doesn't work well in 1.5+.</action>
-    <action type="fix" issue="LANG-584">ExceptionUtils - use immutable lock target.</action>
-    <action type="fix" issue="LANG-477">ExtendedMessageFormat - OutOfMemory with a pattern containing single quotes.</action>
-    <action type="fix" issue="LANG-538">FastDateFormat - call getTime() on a calendar to ensure timezone is in the right state.</action>
-    <action type="fix" issue="LANG-547">FastDateFormat - Remove unused field.</action>
-    <action type="fix" issue="LANG-511">LocaleUtils - Initialization of available locales in LocaleUtils can be deferred.</action>
-    <action type="fix" issue="LANG-457">NumberUtils - createNumber() thows a StringIndexOutOfBoundsException when only an "l" is passed in.</action>
-    <action type="fix" issue="LANG-521">NumberUtils - isNumber(String) and createNumber(String) both modified to support '2.'.</action>
-    <action type="fix" issue="LANG-432">StringUtils - improve handling of case-insensitive Strings.</action>
-    <action type="fix" issue="LANG-552">StringUtils - replaceEach() no longer NPEs when null appears in the last String[].</action>
-    <action type="fix" issue="LANG-460">StringUtils - correct Javadoc for startsWith() and startsWithIgnoreCase().</action>
-    <action type="fix" issue="LANG-421">StringEscapeUtils - escapeJava() escapes '/' characters.</action>
-    <action type="fix" issue="LANG-450">StringEscapeUtils - change escapeJavaStyleString() to throw UnhandledException instead swallowing IOException and returning null.</action>
-    <action type="fix" issue="LANG-419">WordUtils - fix StringIndexOutOfBoundsException when lower is greater than the String length.</action>
-    <action type="fix" issue="LANG-523">StrBuilder - Performance improvement by doubling the size of the String in ensureCapacity.</action>
-    <action type="fix" issue="LANG-575">Compare, Equals and HashCode builders - use ArrayUtils to avoid creating a temporary List.</action>
-    <action type="fix" issue="LANG-467">EqualsBuilder - removing the special handling of BigDecimal (LANG-393) to use compareTo instead of equals because it creates an inequality with HashCodeBuilder.</action>
-    <action type="fix" issue="LANG-574">HashCodeBuilder - Performance improvement: check for isArray to short-circuit the 9 instanceof checks.</action>
-    <action type="fix" issue="LANG-520">HashCodeBuilder - Changing the hashCode() method to return toHashCode().</action>
-    <action type="fix" issue="LANG-459">HashCodeBuilder - reflectionHashCode() can generate incorrect hashcodes.</action>
-    <action type="fix" issue="LANG-586">HashCodeBuilder and ToStringStyle - use of ThreadLocal causes memory leaks in container environments.</action>
-    <action type="fix" issue="LANG-487">ToStringBuilder - make default style thread-safe.</action>
-    <action type="fix" issue="LANG-472">RandomUtils - nextLong() always produces even numbers.</action>
-    <action type="fix" issue="LANG-592">RandomUtils - RandomUtils tests are failing frequently.</action>
-  </release>
-
-  <release version="2.4" date="2008-03-18" description="">
-    <action type="add" issue="LANG-322">ClassUtils.getShortClassName(String) inefficient.</action>
-    <action type="add" issue="LANG-269">Shouldn't Commons Lang's StringUtils have a "common" string method?.</action>
-    <action type="fix" issue="LANG-368">FastDateFormat getDateInstance() and getDateTimeInstance() assume Locale.getDefault() won't change.</action>
-    <action type="add" issue="LANG-402">OSGi-ify Lang.</action>
-    <action type="fix" issue="LANG-412">StrBuilder appendFixedWidth does not handle nulls.</action>
-    <action type="fix" issue="LANG-380">infinite loop in Fraction.reduce when numerator == 0.</action>
-    <action type="fix" issue="LANG-367">FastDateFormat thread safety.</action>
-    <action type="add" issue="LANG-298">ClassUtils.getShortClassName and ClassUtils.getPackageName and class of array.</action>
-    <action type="fix" issue="LANG-328">LocaleUtils.toLocale() rejects strings with only language+variant.</action>
-    <action type="fix" issue="LANG-334">Enum is not thread-safe.</action>
-    <action type="fix" issue="LANG-365">BooleanUtils.toBoolean() - invalid drop-thru in case statement causes StringIndexOutOfBoundsException.</action>
-    <action type="add" issue="LANG-333">ArrayUtils.toClass.</action>
-    <action type="fix" issue="LANG-360">Why does appendIdentityToString return null?.</action>
-    <action type="fix" issue="LANG-381">NumberUtils.min(floatArray) returns wrong value if floatArray[0] happens to be Float.NaN.</action>
-    <action type="fix" issue="LANG-346">Dates.round() behaves incorrectly for minutes and seconds.</action>
-    <action type="add" issue="LANG-407">StringUtils.length(String) returns null-safe length.</action>
-    <action type="add" issue="LANG-180">adding a StringUtils.replace method that takes an array or List of replacement strings.</action>
-    <action type="add" issue="LANG-383">Adding functionality to DateUtils to allow direct setting of various fields.</action>
-    <action type="add" issue="LANG-374">Add escaping for CSV columns to StringEscapeUtils.</action>
-    <action type="add" issue="LANG-326">StringUtils: startsWith / endsWith / startsWithIgnoreCase / endsWithIgnoreCase / removeStartIgnoreCase / removeEndIgnoreCase methods.</action>
-    <action type="add" issue="LANG-351">Extension to ClassUtils: Obtain the primitive class from a wrapper.</action>
-    <action type="fix" issue="LANG-399">Javadoc bugs - cannot find object.</action>
-    <action type="add" issue="LANG-345">Optimize HashCodeBuilder.append(Object).</action>
-    <action type="fix" issue="LANG-385">http://commons.apache.org/lang/developerguide.html "Building" section is incorrect and incomplete.</action>
-    <action type="fix" issue="LANG-410">Ambiguous / confusing names in StringUtils replace* methods.</action>
-    <action type="add" issue="LANG-257">Add new splitByWholeSeparatorPreserveAllTokens() methods to StringUtils.</action>
-    <action type="add" issue="LANG-356">Add getStartTime to StopWatch.</action>
-    <action type="add" issue="LANG-377">Perhaps add containsAny() methods?.</action>
-    <action type="fix" issue="LANG-353">Javadoc Example for EqualsBuilder is questionable.</action>
-    <action type="fix" issue="LANG-393">EqualsBuilder don't compare BigDecimals correctly.</action>
-    <action type="add" issue="LANG-192">Split camel case strings.</action>
-    <action type="add" issue="LANG-404">Add Calendar flavour format methods to DateFormatUtils.</action>
-    <action type="add" issue="LANG-379">Calculating A date fragment in any time-unit.</action>
-    <action type="add" issue="LANG-413">Memory usage improvement for StringUtils#getLevenshteinDistance().</action>
-    <action type="add" issue="LANG-362">Add ExtendedMessageFormat to org.apache.commons.lang.text.</action>
-    <action type="fix" issue="LANG-363">StringEscapeUtils.escapeJavaScript() method did not escape '/' into '\/', it will make IE render page uncorrectly.</action>
-    <action type="add" issue="LANG-321">Add toArray() method to IntRange and LongRange classes.</action>
-    <action type="add" issue="LANG-375">add SystemUtils.IS_OS_WINDOWS_VISTA field.</action>
-    <action type="add" issue="LANG-329">Pointless synchronized in ThreadLocal.initialValue should be removed.</action>
-    <action type="add" issue="LANG-371">ToStringStyle Javadoc should show examples of styles.</action>
-    <action type="fix" issue="LANG-364">Documentation bug for ignoreEmptyTokens accessors in StrTokenizer.</action>
-    <action type="fix" issue="LANG-361">BooleanUtils toBooleanObject Javadoc does not match implementation.</action>
-    <action type="add" issue="LANG-338">truncateNicely method which avoids truncating in the middle of a word.</action>
-  </release>
-
-  <release version="2.3" date="2007-02-13" description="">
-    <action type="fix" issue="LANG-262">Use of enum prevents a classloader from being garbage collected resuling in out of memory exceptions.</action>
-    <action type="add" issue="LANG-289">NumberUtils.max(byte[]) and NumberUtils.min(byte[]) are missing.</action>
-    <action type="add" issue="LANG-291">Null-safe comparison methods for finding most recent / least recent dates.</action>
-    <action type="fix" issue="LANG-315">StopWatch: suspend() acts as split(), if followed by stop().</action>
-    <action type="fix" issue="LANG-294">StrBuilder.replaceAll and StrBuilder.deleteAll can throw ArrayIndexOutOfBoundsException.</action>
-    <action type="fix" issue="LANG-299">Bug in method appendFixedWidthPadRight of class StrBuilder causes an ArrayIndexOutOfBoundsException.</action>
-    <action type="fix" issue="LANG-69"> ToStringBuilder throws StackOverflowError when an Object cycle exists.</action>
-    <action type="add" issue="LANG-282">Create more tests to test out the +=31 replacement code in DurationFormatUtils.</action>
-    <action type="fix" issue="LANG-295">StrBuilder contains usages of thisBuf.length when they should use size.</action>
-    <action type="add" issue="LANG-258">Enum Javadoc: 1) outline 5.0 native Enum migration 2) warn not to use the switch() , 3) point out approaches for persistence and gui.</action>
-    <action type="fix" issue="LANG-313">Wrong behavior of Entities.unescape.</action>
-    <action type="fix" issue="LANG-300">NumberUtils.createNumber throws NumberFormatException for one digit long.</action>
-    <action type="fix" issue="LANG-304">NullPointerException in isAvailableLocale(Locale).</action>
-    <action type="fix" issue="LANG-303">FastDateFormat.mRules is not transient or serializable.</action>
-    <action type="add" issue="LANG-268">StringUtils.join should allow you to pass a range for it (so it only joins a part of the array).</action>
-    <action type="fix" issue="LANG-102">Refactor Entities methods.</action>
-    <action type="fix" issue="LANG-314">Tests fail to pass when building with Maven 2.</action>
-    <action type="fix" issue="LANG-281">DurationFormatUtils returns wrong result.</action>
-    <action type="fix" issue="LANG-292">unescapeXml("&amp;12345678;") should be "&amp;12345678;".</action>
-    <action type="add" issue="LANG-287">Optimize StringEscapeUtils.unescapeXml(String).</action>
-    <action type="add" issue="LANG-310">BooleanUtils isNotTrue/isNotFalse.</action>
-    <action type="add" issue="LANG-306">Extra StrBuilder methods.</action>
-    <action type="add" issue="LANG-275">Add a pair of StringUtils.substringsBetween;String[] methods.</action>
-    <action type="fix" issue="LANG-279">HashCodeBuilder throws java.lang.StackOverflowError when an object contains a cycle.</action>
-    <action type="add" issue="LANG-266">Wish for StringUtils.join(Collection, *).</action>
-  </release>
-
-  <release version="2.2" date="2006-10-04" description="">
-    <action type="fix" issue="LANG-45">StrBuilderTest#testReplaceStringString fails.</action>
-    <action type="fix" issue="LANG-42">EqualsBuilder.append(Object[], Object[]) crashes with a NullPointerException if an element of the first array is null.</action>
-    <action type="fix" issue="LANG-286">Serialization - not backwards compatible.</action>
-    <action type="fix" issue="LANG-50"> Replace Clover with Cobertura.</action>
-    <action type="fix" issue="LANG-259">ValuedEnum.compareTo(Object other) not typesafe - it easily could be...</action>
-    <action type="fix" issue="LANG-271">LocaleUtils test fails under Mustang.</action>
-    <action type="fix" issue="LANG-2">Javadoc example for StringUtils.splitByWholeSeparator incorrect.</action>
-    <action type="fix" issue="LANG-3">PADDING array in StringUtils overflows on '\uffff'.</action>
-    <action type="fix" issue="LANG-10">ClassUtils.primitiveToWrapper and Void.</action>
-    <action type="fix" issue="LANG-37">unit test for org.apache.commons.lang.text.StrBuilder.</action>
-    <action type="fix" issue="LANG-59">DateUtils.truncate method is buggy when dealing with DST switching hours.</action>
-    <action type="fix" issue="LANG-100">RandomStringUtils.random() family of methods create invalid Unicode sequences.</action>
-    <action type="fix" issue="LANG-106">StringUtils#getLevenshteinDistance() performance is sub-optimal.</action>
-    <action type="fix" issue="LANG-112">Wrong length check in StrTokenizer.StringMatcher.</action>
-    <action type="fix" issue="LANG-105">ExceptionUtils goes into infinite loop in getThrowables is throwable.getCause() == throwable.</action>
-    <action type="fix" issue="LANG-117">FastDateFormat: wrong format for date "01.01.1000".</action>
-    <action type="fix" issue="LANG-123">Unclear Javadoc for DateUtils.iterator().</action>
-    <action type="fix" issue="LANG-130">Memory "leak" in StringUtils.</action>
-    <action type="add" issue="LANG-260">StringEscapeUtils should expose escape*() methods taking Writer argument.</action>
-    <action type="fix" issue="LANG-141">Fraction.toProperString() returns -1/1 for -1.</action>
-    <action type="fix" issue="LANG-152">DurationFormatUtils.formatDurationWords "11 &lt;unit&gt;s" gets converted to "11 &lt;unit&gt;".</action>
-    <action type="fix" issue="LANG-148">Performance modifications on StringUtils.replace.</action>
-    <action type="fix" issue="LANG-150">StringEscapeUtils.unescapeHtml skips first entity after standalone ampersand.</action>
-    <action type="fix" issue="LANG-140">DurationFormatUtils.formatPeriod() returns the wrong result.</action>
-    <action type="add" issue="LANG-186">Request for MutableBoolean implementation.</action>
-    <action type="add" issue="LANG-198">New method for EqualsBuilder.</action>
-    <action type="add" issue="LANG-212">New ExceptionUtils method setCause().</action>
-    <action type="add" issue="LANG-217">Add Mutable&lt;Type&gt; to&lt;Type&gt;() methods.</action>
-    <action type="add" issue="LANG-216">Provides a Class.getPublicMethod which returns public invocable Method.</action>
-    <action type="add" issue="LANG-226">Using ReflectionToStringBuilder and excluding secure fields.</action>
-    <action type="add" issue="LANG-194">add generic add method to DateUtils.</action>
-    <action type="add" issue="LANG-220">Tokenizer Enhancements: reset input string, static CSV/TSV factories.</action>
-    <action type="add" issue="LANG-242">Trivial cleanup of Javadoc in various files.</action>
-    <action type="add" issue="LANG-246">CompositeFormat.</action>
-    <action type="add" issue="LANG-250">Performance boost for RandomStringUtils.</action>
-    <action type="add" issue="LANG-254">Enhanced Class.forName version.</action>
-    <action type="add" issue="LANG-263">Add StringUtils.containsIgnoreCase(...).</action>
-    <action type="add" issue="LANG-267">Support char array converters on ArrayUtils.</action>
-    <action type="fix" issue="LANG-25">DurationFormatUtils.formatDurationISO() Javadoc is missing T in duration string between date and time part.</action>
-    <action type="fix" issue="LANG-272">Minor build and checkstyle changes.</action>
-    <action type="fix" issue="LANG-277">Javadoc errors on StringUtils.splitPreserveAllTokens(String, char).</action>
-    <action type="fix" issue="LANG-122">EscapeUtil.escapeHtml() should clarify that it does not escape ' chars to &amp;apos;.</action>
-    <action type="add" issue="LANG-161">Add methods and tests to StrBuilder.</action>
-    <action type="add" issue="LANG-162">replace() length calculation improvement.</action>
-    <action type="add" issue="LANG-166">New interpolation features.</action>
-    <action type="add" issue="LANG-169">Implementation of escape/unescapeHtml methods with Writer.</action>
-    <action type="add" issue="LANG-176">CompareToBuilder excludeFields for reflection method.</action>
-    <action type="add" issue="LANG-159">Add WordUtils.getInitials(String).</action>
-    <action type="fix" issue="LANG-261">Error in an example in the Javadoc of the StringUtils.splitPreserveAllTokens() method.</action>
-    <action type="fix" issue="LANG-264">ToStringBuilder/HashCodeBuilder Javadoc code examples.</action>
-    <action type="fix" issue="LANG-265">Cannot build tests from latest SVN.</action>
-    <action type="add" issue="LANG-270">minor Javadoc improvements for StringUtils.stripXxx() methods.</action>
-    <action type="fix" issue="LANG-278">Javadoc for StringUtils.removeEnd is incorrect.</action>
-    <action type="fix" issue="LANG-127">Minor tweak to fix of bug # 26616.</action>
-  </release>
-
-  <release version="2.1" date="2005-06-13" description="">
-    <action type="fix" issue="LANG-103">make optional parameters in FastDateFormat really optional.</action>
-    <action type="fix" issue="LANG-149">Nestable.indexOfThrowable(Class) uses Class.equals() to match.</action>
-    <action type="fix" issue="LANG-30">buffer under/overrun on Strings.strip, stripStart &amp; stripEnd.</action>
-    <action type="fix" issue="LANG-19">ToStringStyle.setArrayEnd(String) doesn't replace null with empty string.</action>
-    <action type="fix" issue="LANG-80">New class proposal: CharacterEncoding.</action>
-    <action type="fix" issue="LANG-43">SystemUtils fails init on HP-UX.</action>
-    <action type="fix" issue="LANG-134">Javadoc - 'four basic XML entities' should be 5 (apos is missing).</action>
-    <action type="fix" issue="LANG-156">o.a.c.lang.enum.ValuedEnum: 'enum'is a keyword in JDK1.5.0.</action>
-    <action type="fix" issue="LANG-131">StringEscapeUtils.unescapeHtml() doesn't handle an empty entity.</action>
-    <action type="fix" issue="LANG-6">EqualsBuilder.append(Object[], Object[]) incorrectly checks that rhs[i] is instance of lhs[i]'s class.</action>
-    <action type="fix" issue="LANG-33">Method enums.Enum.equals(Object o) doesn't work correctly.</action>
-    <action type="fix" issue="LANG-31">ExceptionUtils.addCauseMethodName(String) does not check for duplicates.</action>
-    <action type="fix" issue="LANG-136">Make StopWatch validate state transitions.</action>
-    <action type="fix" issue="LANG-124">enum package is not compatible with 1.5 jdk.</action>
-    <action type="fix" issue="LANG-128">WordUtils capitalizeFully() throws a null pointer exception.</action>
-    <action type="fix" issue="LANG-138">ValuedEnum.</action>
-    <action type="fix" issue="LANG-133">parseDate class from HttpClient's DateParser class.</action>
-    <action type="fix" issue="LANG-62">ArrayUtils.isEquals() throws ClassCastException when array1 and array2 are different dimension.</action>
-    <action type="fix" issue="LANG-57">ClassCastException in Enum.equals(Object).</action>
-    <action type="fix" issue="LANG-107">FastDateFormat year bug.</action>
-    <action type="fix" issue="LANG-77">unbalanced ReflectionToStringBuilder.</action>
-    <action type="fix" issue="LANG-86">FastDateFormat.getDateInstance(int, Locale) always uses the pattern from the first invocation.</action>
-    <action type="fix" issue="LANG-79">ReflectionToStringBuilder.toString(null) throws exception by design.</action>
-    <action type="fix" issue="LANG-126">Make ClassUtils methods null-safe and not throw an IAE.</action>
-    <action type="fix" issue="LANG-5">StringUtils.split ignores empty items.</action>
-    <action type="fix" issue="LANG-144">EqualsBuilder.append(Object[], Object[]) throws NPE.</action>
-    <action type="fix" issue="LANG-74">ArrayUtils.addAll doesn't always return new array.</action>
-    <action type="fix" issue="LANG-81">Enum.equals does not handle different class loaders.</action>
-    <action type="fix" issue="LANG-27">Add SystemUtils.AWT_TOOLKIT and others.</action>
-    <action type="fix" issue="LANG-14">Throwable cause for NotImplementedException.</action>
-    <action type="fix" issue="LANG-28">ClassUtils.primitivesToWrappers method.</action>
-    <action type="fix" issue="LANG-120">public static boolean DateUtils.equals(Date dt1, Date dt2) ?.</action>
-    <action type="fix" issue="LANG-7">Documentation error in StringUtils.replace.</action>
-    <action type="fix" issue="LANG-125">DateUtils constants should be long.</action>
-    <action type="fix" issue="LANG-13">DateUtils.truncate() is off by one hour when using a date in DST switch 'zone'.</action>
-    <action type="fix" issue="LANG-118">StringEscapeUtils.unescapeHtml() doesn't handle hex entities.</action>
-    <action type="fix" issue="LANG-99">new StringUtils.replaceChars behaves differently from old CharSetUtils.translate.</action>
-    <action type="fix" issue="LANG-41">last substring returned by StringUtils.split( String, String, int ) is too long.</action>
-    <action type="fix" issue="LANG-119">Can't subclass EqualsBuilder because isEquals is private.</action>
-    <action type="fix" issue="LANG-158">new StringUtils.split methods that split on the whole separator string.</action>
-    <action type="add" issue="LANG-172">New method for converting a primitive Class to its corresponding wrapper Class.</action>
-    <action type="add" issue="LANG-222">Add convenience format(long) methods to FastDateFormat.</action>
-    <action type="fix" issue="LANG-116">Enum's outer class may not be loaded for EnumUtils.</action>
-    <action type="add" issue="LANG-219">WordUtils.capitalizeFully(String str) should take a delimiter.</action>
-    <action type="add" issue="LANG-183">Make Javadoc crosslinking configurable.</action>
-    <action type="fix" issue="LANG-82">Minor Javadoc fixes for StringUtils.contains(String, String).</action>
-    <action type="fix" issue="LANG-32">Error in Javadoc for StringUtils.chomp(String, String).</action>
-    <action type="fix" issue="LANG-95">StringUtils.defaultString: Documentation error.</action>
-    <action type="add" issue="LANG-233">Add hashCode-support to class ObjectUtils.</action>
-    <action type="add" issue="LANG-202">add another "known method" to ExceptionUtils.</action>
-    <action type="add" issue="LANG-235">Enhancement of ExceptionUtils.CAUSE_METHOD_NAMES.</action>
-    <action type="fix" issue="LANG-24">DateUtils.truncate oddity at the far end of the Date spectrum.</action>
-    <action type="add" issue="LANG-232">add getLength() method to ArrayUtils.</action>
-    <action type="add" issue="LANG-171">Validate.java: fixes comment skew, removes unused loop counter.</action>
-    <action type="add" issue="LANG-179">StringUtils.isAsciiPrintable().</action>
-    <action type="add" issue="LANG-167">ExceptionUtils: new getCause() methodname (for tomcat-exception).</action>
-    <action type="fix" issue="LANG-85">fixes 75 typos.</action>
-    <action type="add" issue="LANG-230">mutable numbers.</action>
-    <action type="add" issue="LANG-191">Javadoc fixes for ClassUtils.</action>
-    <action type="add" issue="LANG-184">Add StringUtils.nIndexOf?.</action>
-    <action type="fix" issue="LANG-135">Javadoc fixes for CharSetUtils.</action>
-    <action type="fix" issue="LANG-154">Remove redundant check for null separator in StringUtils#join.</action>
-    <action type="add" issue="LANG-247">Class and Package Comparators for ClassUtils.</action>
-    <action type="add" issue="LANG-256">add remove methods to ArrayUtils.</action>
-    <action type="add" issue="LANG-185">WordUtils capitalize improvement.</action>
-    <action type="add" issue="LANG-173">add isEmpty method to ArrayUtils.</action>
-    <action type="add" issue="LANG-168">lang.math.Fraction class deficiencies.</action>
-    <action type="add" issue="LANG-207">Add methods to ArrayUtils: add at end and insert-like ops.</action>
-    <action type="add" issue="LANG-239">Add SystemUtils methods for directory properties.</action>
-    <action type="add" issue="LANG-189">Add method that validates Collection elements are a certain type.</action>
-    <action type="add" issue="LANG-224">elapsed time formatting utility method.</action>
-  </release>
-
-  <release version="2.0" date="2003-09-02" description="">
-    <action type="fix" issue="LANG-20">Infinite loop in ToStringBuilder.reflectionToString for inner classes.</action>
-    <action type="fix" issue="LANG-75">NumberUtils.createBigDecimal("") NPE in Sun 1.3.1_08.</action>
-    <action type="fix" issue="LANG-38">Rationalize StringUtils slice functions.</action>
-    <action type="fix" issue="LANG-53">SystemUtils.IS_OS_OS2 Javadoc is wrong.</action>
-    <action type="fix" issue="LANG-142">A small, but important Javadoc fix for Fraction proper whole and numerator.</action>
-    <action type="fix" issue="LANG-70">Adding tolerance to double[] search methods in ArrayUtils.</action>
-    <action type="fix" issue="LANG-9">lang.builder classes Javadoc edits (mostly typo fixes).</action>
-    <action type="fix" issue="LANG-63">StringUtils Javadoc and test enhancements.</action>
-    <action type="fix" issue="LANG-132">SystemUtils.IS_OS_*, IS_JAVA_* are always false.</action>
-    <action type="fix" issue="LANG-143">Improve util.Validate tests.</action>
-    <action type="fix" issue="LANG-155">maven-beta10 checkstyle problem.</action>
-    <action type="fix" issue="LANG-147">StringUtils.chopNewLine - StringIndexOutOfBoundsException.</action>
-    <action type="fix" issue="LANG-73">ToStringBuilder doesn't work well in subclasses.</action>
-    <action type="fix" issue="LANG-48">static option for reversing the stacktrace.</action>
-    <action type="fix" issue="LANG-87">NullPointerException in CompareToBuilder.</action>
-    <action type="fix" issue="LANG-84">RandomStringUtils.randomAlpha methods omit 'z'.</action>
-    <action type="fix" issue="LANG-129">test.time fails in Japanese (non-us) locale.</action>
-    <action type="fix" issue="LANG-94">NumberUtils.isNumber allows illegal trailing characters.</action>
-    <action type="fix" issue="LANG-137">Improve Javadoc and overflow behavior of Fraction.</action>
-    <action type="fix" issue="LANG-55">RandomStringUtils infloops with length &gt; 1.</action>
-    <action type="fix" issue="LANG-47">test.lang fails if compiled with non iso-8859-1 locales.</action>
-    <action type="fix" issue="LANG-113">SystemUtils does not play nice in an Applet.</action>
-    <action type="fix" issue="LANG-111">time unit tests fail on Sundays.</action>
-    <action type="fix" issue="LANG-90">java.lang.ExceptionInInitializerError thrown by JVMRandom constructor.</action>
-    <action type="fix" issue="LANG-78">StringUtils.chomp does not match Perl.</action>
-    <action type="fix" issue="LANG-36">patch and test case fixing problem with RandomStringUtils.random().</action>
-    <action type="fix" issue="LANG-151">General case: infinite loop: ToStringBuilder.reflectionToString.</action>
-    <action type="fix" issue="LANG-35">Should ToStringBuilder.reflectionToString handle arrays?.</action>
-    <action type="fix" issue="LANG-83">EnumUtils nit: The import java.io.Serializable is never used.</action>
-    <action type="fix" issue="LANG-12">Example in Javadoc for ToStringBuilder wrong for append.</action>
-    <action type="fix" issue="LANG-110">Added class hierarchy support to HashCodeBuilder.reflectionHashCode().</action>
-    <action type="fix" issue="LANG-71">ExceptionUtils new methods.</action>
-    <action type="fix" issue="LANG-15">Infinite loop in StringUtils.replace(text, repl, with) + FIX.</action>
-    <action type="fix" issue="LANG-93">StackOverflow due to ToStringBuilder.</action>
-    <action type="fix" issue="LANG-39">No Javadoc for NestableDelegate.</action>
-    <action type="fix" issue="LANG-49">Specify initial size for Enum's HashMap.</action>
-    <action type="fix" issue="LANG-146">Enum does not support inner sub-classes.</action>
-    <action type="fix" issue="LANG-157">Removed compile warning in ObjectUtils.</action>
-    <action type="fix" issue="LANG-96">SystemUtils.IS_JAVA_1_5 Javadoc is wrong.</action>
-    <action type="fix" issue="LANG-16">NumberRange inaccurate for Long, etc.</action>
-    <action type="fix" issue="LANG-4">Hierarchy support in ToStringBuilder.reflectionToString().</action>
-    <action type="fix" issue="LANG-56">StringUtils.countMatches loops forever if substring empty.</action>
-    <action type="add" issue="LANG-209">Javadoc fixes (remove @links to non-public identifiers).</action>
-    <action type="add" issue="LANG-210">Add Javadoc examples and tests for StringUtils.</action>
-    <action type="add" issue="LANG-170">Make NumberUtils null handling consistent.</action>
-    <action type="fix" issue="LANG-145">Unused field 'startFinal' in DateIterator.</action>
-    <action type="add" issue="LANG-214">reduce object creation in ToStringBuilder.</action>
-    <action type="add" issue="LANG-228">Improved tests, Javadoc for CharSetUtils, StringEscapeUtils.</action>
-    <action type="add" issue="LANG-252">NumberUtils min/max, BooleanUtils.xor, and ArrayUtils toPrimitive and toObject.</action>
-    <action type="add" issue="LANG-208">Javadoc, tests improvements for CharSet, CharSetUtils.</action>
-    <action type="add" issue="LANG-205">StringUtil enhancement.</action>
-    <action type="add" issue="LANG-164">Javadoc nit.</action>
-    <action type="add" issue="LANG-206">Additional Lang Method Suggestions.</action>
-    <action type="add" issue="LANG-178">Make NestableDelegate methods public instead of package private.</action>
-    <action type="add" issue="LANG-174">Missing @since tags.</action>
-    <action type="add" issue="LANG-245">Refactored reflection feature of ToStringBuilder into new ReflectionToStringBuilder.</action>
-    <action type="fix" issue="LANG-51">Typo in documentation.</action>
-    <action type="fix" issue="LANG-1">Patch for Javadoc.</action>
-    <action type="add" issue="LANG-244">Add join(..., char c) to StringUtils (and some performance fixes). Even contains tests!.</action>
-    <action type="add" issue="LANG-231">Resurrect the WordWrapUtils from commons-sandbox/utils.</action>
-    <action type="fix" issue="LANG-139">EnumTest fails on Linux Sun JDK 1.3.0.</action>
-    <action type="add" issue="LANG-234">What to do with FastDateFormat unused private constructors.</action>
-    <action type="add" issue="LANG-240">Added class hierarchy support to CompareToBuilder.reflectionCompare().</action>
-    <action type="add" issue="LANG-190">Removed compile warning in FastDateFormat.</action>
-    <action type="fix" issue="LANG-97">typo in the Javadoc example code.</action>
-    <action type="add" issue="LANG-249">MethodUtils: Removed unused code/unused local vars.</action>
-    <action type="add" issue="LANG-237">Hierarchy support in EqualsBuilder.reflectionEquals().</action>
-    <action type="fix" issue="LANG-91">Javadoc Errata.</action>
-    <action type="add" issue="LANG-215">ArrayUtils.contains().</action>
-    <action type="add" issue="LANG-221">More flexibility for getRootCause in ExceptionUtils.</action>
-  </release>
-
-  <release version="1.0.1" date="2002-11-25" description="Quick bugfix to 1.0">
-    <action type="fix">NumberRange.getMaximum returns minimum.</action>
-    <action type="fix">Enum constructor validations.</action>
-    <action type="fix">NestableException/Delegate is not serializable.</action>
-    <action type="fix">split using null and max less than actual token count adds "null".</action>
-    <action type="add">ExceptionUtils cannot handle J2EE-Exception in a default way.</action>
-  </release>
-
-  <release version="1.0" date="2002-10-04" description="First release of Commons Lang">
-  </release>
-
-  </body>
-</document>
diff --git a/lang/src/changes/release-notes.vm b/lang/src/changes/release-notes.vm
deleted file mode 100644
index c2df2ff..0000000
--- a/lang/src/changes/release-notes.vm
+++ /dev/null
@@ -1,140 +0,0 @@
-## Licensed to the Apache Software Foundation (ASF) under one
-## or more contributor license agreements.  See the NOTICE file
-## distributed with this work for additional information
-## regarding copyright ownership.  The ASF licenses this file
-## to you under the Apache License, Version 2.0 (the
-## "License"); you may not use this file except in compliance
-## with the License.  You may obtain a copy of the License at
-##
-##  http://www.apache.org/licenses/LICENSE-2.0
-##
-## Unless required by applicable law or agreed to in writing,
-## software distributed under the License is distributed on an
-## "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-## KIND, either express or implied.  See the License for the
-## specific language governing permissions and limitations
-## under the License.
-##
-
-Licensed to the Apache Software Foundation (ASF) under one or more
-contributor license agreements.  See the NOTICE file distributed with
-this work for additional information regarding copyright ownership.
-The ASF licenses this file to You under the Apache License, Version 2.0
-(the "License"); you may not use this file except in compliance with
-the License.  You may obtain a copy of the License at
-
-http://www.apache.org/licenses/LICENSE-2.0
-
-Unless required by applicable law or agreed to in writing, software
-distributed under the License is distributed on an "AS IS" BASIS,
-WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-See the License for the specific language governing permissions and
-limitations under the License.
-
-
-                        ${project.name}
-                            Version ${version}
-                           Release Notes
-
-
-INTRODUCTION:
-
-This document contains the release notes for the ${version} version of Apache Commons Lang.
-Commons Lang is a set of utility functions and reusable components that should be of use in any 
-Java environment.
-
-Lang 3.0 and onwards now targets Java 5.0, making use of features that arrived with Java 5.0 such as generics, 
-variable arguments, autoboxing, concurrency and formatted output.
-
-For the advice on upgrading from 2.x to 3.x, see the following page: 
-
-    http://commons.apache.org/lang/article3_0.html
-
-$introduction.replaceAll("(?<!\015)\012", "
-").replaceAll("(?m)^ +","")
-
-## N.B. the available variables are described here:
-## http://maven.apache.org/plugins/maven-changes-plugin/examples/using-a-custom-announcement-template.html
-##
-## Hack to improve layout: replace all pairs of spaces with a single new-line
-$release.description.replaceAll("  ", "
-")
-
-## set up indent sizes. Only change indent1
-#set($props=${project.properties})
-#set($jiralen=$props.get("commons.jira.id").length())
-## indent1 =   POOL-nnnn:
-#set($blanklen=$jiralen+6)## +6 for "-nnnn:"
-## must be at least as long as the longest JIRA id
-#set($blanks="                                  ")
-#set($indent1=$blanks.substring(0,$blanklen))
-## indent2 allows for issue wrapper
-#set($indent2="$indent1   ")
-##
-#macro ( processaction )
-## Use replaceAll to fix up LF-only line ends on Windows.
-#set($action=$actionItem.getAction().replaceAll("\n","
-"))
-## Fix up indentation for multi-line action descriptions
-#set($action=$action.replaceAll("(?m)^  +",$indent2))
-#if ($actionItem.getIssue())
-#set($issue="$actionItem.getIssue():")
-## Pad shorter issue numbers
-#if ($issue.length() < $indent1.length())#set ($issue="$issue ")#end
-#if ($issue.length() < $indent1.length())#set ($issue="$issue ")#end
-#if ($issue.length() < $indent1.length())#set ($issue="$issue ")#end
-#else
-#set($issue=$indent1)
-#end
-#if ($actionItem.getDueTo())
-#set($dueto=" Thanks to $actionItem.getDueTo().")
-#else
-#set($dueto="")
-#end
-o $issue ${action}$dueto
-#set($action="")
-#set($issue="")
-#set($dueto="")
-#end
-##
-#if ($release.getActions().size() == 0)
-No changes defined in this version.
-#else
-Changes in this version include:
-
-#if ($release.getActions('add').size() !=0)
-New features:
-#foreach($actionItem in $release.getActions('add'))
-#processaction()
-#end 
-#end
-
-#if ($release.getActions('fix').size() !=0)
-Fixed Bugs:
-#foreach($actionItem in $release.getActions('fix'))
-#processaction()
-#end
-#end
-
-#if ($release.getActions('update').size() !=0)
-Changes:
-#foreach($actionItem in $release.getActions('update'))
-#processaction()
-#end
-#end
-
-#if ($release.getActions('remove').size() !=0)
-Removed:
-#foreach($actionItem in $release.getActions('remove'))
-#processaction()
-#end
-#end
-## End of main loop
-#end
-
-Historical list of changes: ${project.url}changes-report.html
-
-For complete information on ${project.name}, including instructions on how to submit bug reports,
-patches, or suggestions for improvement, see the Apache ${project.name} website:
-
-${project.url}
\ No newline at end of file
diff --git a/lang/src/main/java/org/apache/commons/lang3/AnnotationUtils.java b/lang/src/main/java/org/apache/commons/lang3/AnnotationUtils.java
deleted file mode 100644
index b369269..0000000
--- a/lang/src/main/java/org/apache/commons/lang3/AnnotationUtils.java
+++ /dev/null
@@ -1,371 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.commons.lang3;
-
-import java.lang.annotation.Annotation;
-import java.lang.reflect.InvocationTargetException;
-import java.lang.reflect.Method;
-import java.util.Arrays;
-
-import org.apache.commons.lang3.builder.ToStringBuilder;
-import org.apache.commons.lang3.builder.ToStringStyle;
-
-/**
- * <p>Helper methods for working with {@link Annotation} instances.</p>
- *
- * <p>This class contains various utility methods that make working with
- * annotations simpler.</p>
- *
- * <p>{@link Annotation} instances are always proxy objects; unfortunately
- * dynamic proxies cannot be depended upon to know how to implement certain
- * methods in the same manner as would be done by "natural" {@link Annotation}s.
- * The methods presented in this class can be used to avoid that possibility. It
- * is of course also possible for dynamic proxies to actually delegate their
- * e.g. {@link Annotation#equals(Object)}/{@link Annotation#hashCode()}/
- * {@link Annotation#toString()} implementations to {@link AnnotationUtils}.</p>
- *
- * <p>#ThreadSafe#</p>
- *
- * @since 3.0
- * @version $Id$
- */
-public class AnnotationUtils {
-
-    /**
-     * A style that prints annotations as recommended.
-     */
-    private static final ToStringStyle TO_STRING_STYLE = new ToStringStyle() {
-        /** Serialization version */
-        private static final long serialVersionUID = 1L;
-
-        {
-            setDefaultFullDetail(true);
-            setArrayContentDetail(true);
-            setUseClassName(true);
-            setUseShortClassName(true);
-            setUseIdentityHashCode(false);
-            setContentStart("(");
-            setContentEnd(")");
-            setFieldSeparator(", ");
-            setArrayStart("[");
-            setArrayEnd("]");
-        }
-
-        /**
-         * {@inheritDoc}
-         */
-        @Override
-        protected String getShortClassName(final java.lang.Class<?> cls) {
-            Class<? extends Annotation> annotationType = null;
-            for (final Class<?> iface : ClassUtils.getAllInterfaces(cls)) {
-                if (Annotation.class.isAssignableFrom(iface)) {
-                    @SuppressWarnings("unchecked") // OK because we just checked the assignability
-                    final
-                    Class<? extends Annotation> found = (Class<? extends Annotation>) iface;
-                    annotationType = found;
-                    break;
-                }
-            }
-            return new StringBuilder(annotationType == null ? "" : annotationType.getName())
-                    .insert(0, '@').toString();
-        }
-
-        /**
-         * {@inheritDoc}
-         */
-        @Override
-        protected void appendDetail(final StringBuffer buffer, final String fieldName, Object value) {
-            if (value instanceof Annotation) {
-                value = AnnotationUtils.toString((Annotation) value);
-            }
-            super.appendDetail(buffer, fieldName, value);
-        }
-
-    };
-
-    /**
-     * <p>{@code AnnotationUtils} instances should NOT be constructed in
-     * standard programming. Instead, the class should be used statically.</p>
-     *
-     * <p>This constructor is public to permit tools that require a JavaBean
-     * instance to operate.</p>
-     */
-    public AnnotationUtils() {
-    }
-
-    //-----------------------------------------------------------------------
-    /**
-     * <p>Checks if two annotations are equal using the criteria for equality
-     * presented in the {@link Annotation#equals(Object)} API docs.</p>
-     *
-     * @param a1 the first Annotation to compare, {@code null} returns
-     * {@code false} unless both are {@code null}
-     * @param a2 the second Annotation to compare, {@code null} returns
-     * {@code false} unless both are {@code null}
-     * @return {@code true} if the two annotations are {@code equal} or both
-     * {@code null}
-     */
-    public static boolean equals(final Annotation a1, final Annotation a2) {
-        if (a1 == a2) {
-            return true;
-        }
-        if (a1 == null || a2 == null) {
-            return false;
-        }
-        final Class<? extends Annotation> type = a1.annotationType();
-        final Class<? extends Annotation> type2 = a2.annotationType();
-        Validate.notNull(type, "Annotation %s with null annotationType()", a1);
-        Validate.notNull(type2, "Annotation %s with null annotationType()", a2);
-        if (!type.equals(type2)) {
-            return false;
-        }
-        try {
-            for (final Method m : type.getDeclaredMethods()) {
-                if (m.getParameterTypes().length == 0
-                        && isValidAnnotationMemberType(m.getReturnType())) {
-                    final Object v1 = m.invoke(a1);
-                    final Object v2 = m.invoke(a2);
-                    if (!memberEquals(m.getReturnType(), v1, v2)) {
-                        return false;
-                    }
-                }
-            }
-        } catch (final IllegalAccessException ex) {
-            return false;
-        } catch (final InvocationTargetException ex) {
-            return false;
-        }
-        return true;
-    }
-
-    /**
-     * <p>Generate a hash code for the given annotation using the algorithm
-     * presented in the {@link Annotation#hashCode()} API docs.</p>
-     *
-     * @param a the Annotation for a hash code calculation is desired, not
-     * {@code null}
-     * @return the calculated hash code
-     * @throws RuntimeException if an {@code Exception} is encountered during
-     * annotation member access
-     * @throws IllegalStateException if an annotation method invocation returns
-     * {@code null}
-     */
-    public static int hashCode(final Annotation a) {
-        int result = 0;
-        final Class<? extends Annotation> type = a.annotationType();
-        for (final Method m : type.getDeclaredMethods()) {
-            try {
-                final Object value = m.invoke(a);
-                if (value == null) {
-                    throw new IllegalStateException(
-                            String.format("Annotation method %s returned null", m));
-                }
-                result += hashMember(m.getName(), value);
-            } catch (final RuntimeException ex) {
-                throw ex;
-            } catch (final Exception ex) {
-                throw new RuntimeException(ex);
-            }
-        }
-        return result;
-    }
-
-    /**
-     * <p>Generate a string representation of an Annotation, as suggested by
-     * {@link Annotation#toString()}.</p>
-     *
-     * @param a the annotation of which a string representation is desired
-     * @return the standard string representation of an annotation, not
-     * {@code null}
-     */
-    public static String toString(final Annotation a) {
-        final ToStringBuilder builder = new ToStringBuilder(a, TO_STRING_STYLE);
-        for (final Method m : a.annotationType().getDeclaredMethods()) {
-            if (m.getParameterTypes().length > 0) {
-                continue; //wtf?
-            }
-            try {
-                builder.append(m.getName(), m.invoke(a));
-            } catch (final RuntimeException ex) {
-                throw ex;
-            } catch (final Exception ex) {
-                throw new RuntimeException(ex);
-            }
-        }
-        return builder.build();
-    }
-
-    /**
-     * <p>Checks if the specified type is permitted as an annotation member.</p>
-     *
-     * <p>The Java language specification only permits certain types to be used
-     * in annotations. These include {@link String}, {@link Class}, primitive
-     * types, {@link Annotation}, {@link Enum}, and single-dimensional arrays of
-     * these types.</p>
-     *
-     * @param type the type to check, {@code null}
-     * @return {@code true} if the type is a valid type to use in an annotation
-     */
-    public static boolean isValidAnnotationMemberType(Class<?> type) {
-        if (type == null) {
-            return false;
-        }
-        if (type.isArray()) {
-            type = type.getComponentType();
-        }
-        return type.isPrimitive() || type.isEnum() || type.isAnnotation()
-                || String.class.equals(type) || Class.class.equals(type);
-    }
-
-    //besides modularity, this has the advantage of autoboxing primitives:
-    /**
-     * Helper method for generating a hash code for a member of an annotation.
-     *
-     * @param name the name of the member
-     * @param value the value of the member
-     * @return a hash code for this member
-     */
-    private static int hashMember(final String name, final Object value) {
-        final int part1 = name.hashCode() * 127;
-        if (value.getClass().isArray()) {
-            return part1 ^ arrayMemberHash(value.getClass().getComponentType(), value);
-        }
-        if (value instanceof Annotation) {
-            return part1 ^ hashCode((Annotation) value);
-        }
-        return part1 ^ value.hashCode();
-    }
-
-    /**
-     * Helper method for checking whether two objects of the given type are
-     * equal. This method is used to compare the parameters of two annotation
-     * instances.
-     *
-     * @param type the type of the objects to be compared
-     * @param o1 the first object
-     * @param o2 the second object
-     * @return a flag whether these objects are equal
-     */
-    private static boolean memberEquals(final Class<?> type, final Object o1, final Object o2) {
-        if (o1 == o2) {
-            return true;
-        }
-        if (o1 == null || o2 == null) {
-            return false;
-        }
-        if (type.isArray()) {
-            return arrayMemberEquals(type.getComponentType(), o1, o2);
-        }
-        if (type.isAnnotation()) {
-            return equals((Annotation) o1, (Annotation) o2);
-        }
-        return o1.equals(o2);
-    }
-
-    /**
-     * Helper method for comparing two objects of an array type.
-     *
-     * @param componentType the component type of the array
-     * @param o1 the first object
-     * @param o2 the second object
-     * @return a flag whether these objects are equal
-     */
-    private static boolean arrayMemberEquals(final Class<?> componentType, final Object o1, final Object o2) {
-        if (componentType.isAnnotation()) {
-            return annotationArrayMemberEquals((Annotation[]) o1, (Annotation[]) o2);
-        }
-        if (componentType.equals(Byte.TYPE)) {
-            return Arrays.equals((byte[]) o1, (byte[]) o2);
-        }
-        if (componentType.equals(Short.TYPE)) {
-            return Arrays.equals((short[]) o1, (short[]) o2);
-        }
-        if (componentType.equals(Integer.TYPE)) {
-            return Arrays.equals((int[]) o1, (int[]) o2);
-        }
-        if (componentType.equals(Character.TYPE)) {
-            return Arrays.equals((char[]) o1, (char[]) o2);
-        }
-        if (componentType.equals(Long.TYPE)) {
-            return Arrays.equals((long[]) o1, (long[]) o2);
-        }
-        if (componentType.equals(Float.TYPE)) {
-            return Arrays.equals((float[]) o1, (float[]) o2);
-        }
-        if (componentType.equals(Double.TYPE)) {
-            return Arrays.equals((double[]) o1, (double[]) o2);
-        }
-        if (componentType.equals(Boolean.TYPE)) {
-            return Arrays.equals((boolean[]) o1, (boolean[]) o2);
-        }
-        return Arrays.equals((Object[]) o1, (Object[]) o2);
-    }
-
-    /**
-     * Helper method for comparing two arrays of annotations.
-     *
-     * @param a1 the first array
-     * @param a2 the second array
-     * @return a flag whether these arrays are equal
-     */
-    private static boolean annotationArrayMemberEquals(final Annotation[] a1, final Annotation[] a2) {
-        if (a1.length != a2.length) {
-            return false;
-        }
-        for (int i = 0; i < a1.length; i++) {
-            if (!equals(a1[i], a2[i])) {
-                return false;
-            }
-        }
-        return true;
-    }
-
-    /**
-     * Helper method for generating a hash code for an array.
-     *
-     * @param componentType the component type of the array
-     * @param o the array
-     * @return a hash code for the specified array
-     */
-    private static int arrayMemberHash(final Class<?> componentType, final Object o) {
-        if (componentType.equals(Byte.TYPE)) {
-            return Arrays.hashCode((byte[]) o);
-        }
-        if (componentType.equals(Short.TYPE)) {
-            return Arrays.hashCode((short[]) o);
-        }
-        if (componentType.equals(Integer.TYPE)) {
-            return Arrays.hashCode((int[]) o);
-        }
-        if (componentType.equals(Character.TYPE)) {
-            return Arrays.hashCode((char[]) o);
-        }
-        if (componentType.equals(Long.TYPE)) {
-            return Arrays.hashCode((long[]) o);
-        }
-        if (componentType.equals(Float.TYPE)) {
-            return Arrays.hashCode((float[]) o);
-        }
-        if (componentType.equals(Double.TYPE)) {
-            return Arrays.hashCode((double[]) o);
-        }
-        if (componentType.equals(Boolean.TYPE)) {
-            return Arrays.hashCode((boolean[]) o);
-        }
-        return Arrays.hashCode((Object[]) o);
-    }
-}
diff --git a/lang/src/main/java/org/apache/commons/lang3/ArrayUtils.java b/lang/src/main/java/org/apache/commons/lang3/ArrayUtils.java
deleted file mode 100644
index 3d3b76b..0000000
--- a/lang/src/main/java/org/apache/commons/lang3/ArrayUtils.java
+++ /dev/null
@@ -1,6343 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.commons.lang3;
-
-import java.lang.reflect.Array;
-import java.util.Arrays;
-import java.util.BitSet;
-import java.util.Comparator;
-import java.util.HashMap;
-import java.util.Map;
-
-import org.apache.commons.lang3.builder.EqualsBuilder;
-import org.apache.commons.lang3.builder.HashCodeBuilder;
-import org.apache.commons.lang3.builder.ToStringBuilder;
-import org.apache.commons.lang3.builder.ToStringStyle;
-import org.apache.commons.lang3.math.NumberUtils;
-import org.apache.commons.lang3.mutable.MutableInt;
-
-/**
- * <p>Operations on arrays, primitive arrays (like {@code int[]}) and
- * primitive wrapper arrays (like {@code Integer[]}).</p>
- *
- * <p>This class tries to handle {@code null} input gracefully.
- * An exception will not be thrown for a {@code null}
- * array input. However, an Object array that contains a {@code null}
- * element may throw an exception. Each method documents its behaviour.</p>
- *
- * <p>#ThreadSafe#</p>
- * @since 2.0
- * @version $Id$
- */
-public class ArrayUtils {
-
-    /**
-     * An empty immutable {@code Object} array.
-     */
-    public static final Object[] EMPTY_OBJECT_ARRAY = new Object[0];
-    /**
-     * An empty immutable {@code Class} array.
-     */
-    public static final Class<?>[] EMPTY_CLASS_ARRAY = new Class[0];
-    /**
-     * An empty immutable {@code String} array.
-     */
-    public static final String[] EMPTY_STRING_ARRAY = new String[0];
-    /**
-     * An empty immutable {@code long} array.
-     */
-    public static final long[] EMPTY_LONG_ARRAY = new long[0];
-    /**
-     * An empty immutable {@code Long} array.
-     */
-    public static final Long[] EMPTY_LONG_OBJECT_ARRAY = new Long[0];
-    /**
-     * An empty immutable {@code int} array.
-     */
-    public static final int[] EMPTY_INT_ARRAY = new int[0];
-    /**
-     * An empty immutable {@code Integer} array.
-     */
-    public static final Integer[] EMPTY_INTEGER_OBJECT_ARRAY = new Integer[0];
-    /**
-     * An empty immutable {@code short} array.
-     */
-    public static final short[] EMPTY_SHORT_ARRAY = new short[0];
-    /**
-     * An empty immutable {@code Short} array.
-     */
-    public static final Short[] EMPTY_SHORT_OBJECT_ARRAY = new Short[0];
-    /**
-     * An empty immutable {@code byte} array.
-     */
-    public static final byte[] EMPTY_BYTE_ARRAY = new byte[0];
-    /**
-     * An empty immutable {@code Byte} array.
-     */
-    public static final Byte[] EMPTY_BYTE_OBJECT_ARRAY = new Byte[0];
-    /**
-     * An empty immutable {@code double} array.
-     */
-    public static final double[] EMPTY_DOUBLE_ARRAY = new double[0];
-    /**
-     * An empty immutable {@code Double} array.
-     */
-    public static final Double[] EMPTY_DOUBLE_OBJECT_ARRAY = new Double[0];
-    /**
-     * An empty immutable {@code float} array.
-     */
-    public static final float[] EMPTY_FLOAT_ARRAY = new float[0];
-    /**
-     * An empty immutable {@code Float} array.
-     */
-    public static final Float[] EMPTY_FLOAT_OBJECT_ARRAY = new Float[0];
-    /**
-     * An empty immutable {@code boolean} array.
-     */
-    public static final boolean[] EMPTY_BOOLEAN_ARRAY = new boolean[0];
-    /**
-     * An empty immutable {@code Boolean} array.
-     */
-    public static final Boolean[] EMPTY_BOOLEAN_OBJECT_ARRAY = new Boolean[0];
-    /**
-     * An empty immutable {@code char} array.
-     */
-    public static final char[] EMPTY_CHAR_ARRAY = new char[0];
-    /**
-     * An empty immutable {@code Character} array.
-     */
-    public static final Character[] EMPTY_CHARACTER_OBJECT_ARRAY = new Character[0];
-
-    /**
-     * The index value when an element is not found in a list or array: {@code -1}.
-     * This value is returned by methods in this class and can also be used in comparisons with values returned by
-     * various method from {@link java.util.List}.
-     */
-    public static final int INDEX_NOT_FOUND = -1;
-
-    /**
-     * <p>ArrayUtils instances should NOT be constructed in standard programming.
-     * Instead, the class should be used as <code>ArrayUtils.clone(new int[] {2})</code>.</p>
-     *
-     * <p>This constructor is public to permit tools that require a JavaBean instance
-     * to operate.</p>
-     */
-    public ArrayUtils() {
-      super();
-    }
-
-
-    // NOTE: Cannot use {@code} to enclose text which includes {}, but <code></code> is OK
-
-
-    // Basic methods handling multi-dimensional arrays
-    //-----------------------------------------------------------------------
-    /**
-     * <p>Outputs an array as a String, treating {@code null} as an empty array.</p>
-     *
-     * <p>Multi-dimensional arrays are handled correctly, including
-     * multi-dimensional primitive arrays.</p>
-     *
-     * <p>The format is that of Java source code, for example <code>{a,b}</code>.</p>
-     *
-     * @param array  the array to get a toString for, may be {@code null}
-     * @return a String representation of the array, '{}' if null array input
-     */
-    public static String toString(final Object array) {
-        return toString(array, "{}");
-    }
-
-    /**
-     * <p>Outputs an array as a String handling {@code null}s.</p>
-     *
-     * <p>Multi-dimensional arrays are handled correctly, including
-     * multi-dimensional primitive arrays.</p>
-     *
-     * <p>The format is that of Java source code, for example <code>{a,b}</code>.</p>
-     *
-     * @param array  the array to get a toString for, may be {@code null}
-     * @param stringIfNull  the String to return if the array is {@code null}
-     * @return a String representation of the array
-     */
-    public static String toString(final Object array, final String stringIfNull) {
-        if (array == null) {
-            return stringIfNull;
-        }
-        return new ToStringBuilder(array, ToStringStyle.SIMPLE_STYLE).append(array).toString();
-    }
-
-    /**
-     * <p>Get a hash code for an array handling multi-dimensional arrays correctly.</p>
-     *
-     * <p>Multi-dimensional primitive arrays are also handled correctly by this method.</p>
-     *
-     * @param array  the array to get a hash code for, {@code null} returns zero
-     * @return a hash code for the array
-     */
-    public static int hashCode(final Object array) {
-        return new HashCodeBuilder().append(array).toHashCode();
-    }
-
-    /**
-     * <p>Compares two arrays, using equals(), handling multi-dimensional arrays
-     * correctly.</p>
-     *
-     * <p>Multi-dimensional primitive arrays are also handled correctly by this method.</p>
-     *
-     * @param array1  the left hand array to compare, may be {@code null}
-     * @param array2  the right hand array to compare, may be {@code null}
-     * @return {@code true} if the arrays are equal
-     * @deprecated this method has been replaced by {@code java.util.Objects.deepEquals(Object, Object)} and will be
-     * removed from future releases.
-     */
-    @Deprecated
-    public static boolean isEquals(final Object array1, final Object array2) {
-        return new EqualsBuilder().append(array1, array2).isEquals();
-    }
-
-    // To map
-    //-----------------------------------------------------------------------
-    /**
-     * <p>Converts the given array into a {@link java.util.Map}. Each element of the array
-     * must be either a {@link java.util.Map.Entry} or an Array, containing at least two
-     * elements, where the first element is used as key and the second as
-     * value.</p>
-     *
-     * <p>This method can be used to initialize:</p>
-     * <pre>
-     * // Create a Map mapping colors.
-     * Map colorMap = MapUtils.toMap(new String[][] {{
-     *     {"RED", "#FF0000"},
-     *     {"GREEN", "#00FF00"},
-     *     {"BLUE", "#0000FF"}});
-     * </pre>
-     *
-     * <p>This method returns {@code null} for a {@code null} input array.</p>
-     *
-     * @param array  an array whose elements are either a {@link java.util.Map.Entry} or
-     *  an Array containing at least two elements, may be {@code null}
-     * @return a {@code Map} that was created from the array
-     * @throws IllegalArgumentException  if one element of this Array is
-     *  itself an Array containing less then two elements
-     * @throws IllegalArgumentException  if the array contains elements other
-     *  than {@link java.util.Map.Entry} and an Array
-     */
-    public static Map<Object, Object> toMap(final Object[] array) {
-        if (array == null) {
-            return null;
-        }
-        final Map<Object, Object> map = new HashMap<Object, Object>((int) (array.length * 1.5));
-        for (int i = 0; i < array.length; i++) {
-            final Object object = array[i];
-            if (object instanceof Map.Entry<?, ?>) {
-                final Map.Entry<?,?> entry = (Map.Entry<?,?>) object;
-                map.put(entry.getKey(), entry.getValue());
-            } else if (object instanceof Object[]) {
-                final Object[] entry = (Object[]) object;
-                if (entry.length < 2) {
-                    throw new IllegalArgumentException("Array element " + i + ", '"
-                        + object
-                        + "', has a length less than 2");
-                }
-                map.put(entry[0], entry[1]);
-            } else {
-                throw new IllegalArgumentException("Array element " + i + ", '"
-                        + object
-                        + "', is neither of type Map.Entry nor an Array");
-            }
-        }
-        return map;
-    }
-
-    // Generic array
-    //-----------------------------------------------------------------------
-    /**
-     * <p>Create a type-safe generic array.</p>
-     *
-     * <p>The Java language does not allow an array to be created from a generic type:</p>
-     *
-     * <pre>
-    public static &lt;T&gt; T[] createAnArray(int size) {
-        return new T[size]; // compiler error here
-    }
-    public static &lt;T&gt; T[] createAnArray(int size) {
-        return (T[])new Object[size]; // ClassCastException at runtime
-    }
-     * </pre>
-     *
-     * <p>Therefore new arrays of generic types can be created with this method.
-     * For example, an array of Strings can be created:</p>
-     *
-     * <pre>
-    String[] array = ArrayUtils.toArray("1", "2");
-    String[] emptyArray = ArrayUtils.&lt;String&gt;toArray();
-     * </pre>
-     *
-     * <p>The method is typically used in scenarios, where the caller itself uses generic types
-     * that have to be combined into an array.</p>
-     *
-     * <p>Note, this method makes only sense to provide arguments of the same type so that the
-     * compiler can deduce the type of the array itself. While it is possible to select the
-     * type explicitly like in
-     * <code>Number[] array = ArrayUtils.&lt;Number&gt;toArray(Integer.valueOf(42), Double.valueOf(Math.PI))</code>,
-     * there is no real advantage when compared to
-     * <code>new Number[] {Integer.valueOf(42), Double.valueOf(Math.PI)}</code>.</p>
-     *
-     * @param  <T>   the array's element type
-     * @param  items  the varargs array items, null allowed
-     * @return the array, not null unless a null array is passed in
-     * @since  3.0
-     */
-    public static <T> T[] toArray(final T... items) {
-        return items;
-    }
-
-    // Clone
-    //-----------------------------------------------------------------------
-    /**
-     * <p>Shallow clones an array returning a typecast result and handling
-     * {@code null}.</p>
-     *
-     * <p>The objects in the array are not cloned, thus there is no special
-     * handling for multi-dimensional arrays.</p>
-     *
-     * <p>This method returns {@code null} for a {@code null} input array.</p>
-     *
-     * @param <T> the component type of the array
-     * @param array  the array to shallow clone, may be {@code null}
-     * @return the cloned array, {@code null} if {@code null} input
-     */
-    public static <T> T[] clone(final T[] array) {
-        if (array == null) {
-            return null;
-        }
-        return array.clone();
-    }
-
-    /**
-     * <p>Clones an array returning a typecast result and handling
-     * {@code null}.</p>
-     *
-     * <p>This method returns {@code null} for a {@code null} input array.</p>
-     *
-     * @param array  the array to clone, may be {@code null}
-     * @return the cloned array, {@code null} if {@code null} input
-     */
-    public static long[] clone(final long[] array) {
-        if (array == null) {
-            return null;
-        }
-        return array.clone();
-    }
-
-    /**
-     * <p>Clones an array returning a typecast result and handling
-     * {@code null}.</p>
-     *
-     * <p>This method returns {@code null} for a {@code null} input array.</p>
-     *
-     * @param array  the array to clone, may be {@code null}
-     * @return the cloned array, {@code null} if {@code null} input
-     */
-    public static int[] clone(final int[] array) {
-        if (array == null) {
-            return null;
-        }
-        return array.clone();
-    }
-
-    /**
-     * <p>Clones an array returning a typecast result and handling
-     * {@code null}.</p>
-     *
-     * <p>This method returns {@code null} for a {@code null} input array.</p>
-     *
-     * @param array  the array to clone, may be {@code null}
-     * @return the cloned array, {@code null} if {@code null} input
-     */
-    public static short[] clone(final short[] array) {
-        if (array == null) {
-            return null;
-        }
-        return array.clone();
-    }
-
-    /**
-     * <p>Clones an array returning a typecast result and handling
-     * {@code null}.</p>
-     *
-     * <p>This method returns {@code null} for a {@code null} input array.</p>
-     *
-     * @param array  the array to clone, may be {@code null}
-     * @return the cloned array, {@code null} if {@code null} input
-     */
-    public static char[] clone(final char[] array) {
-        if (array == null) {
-            return null;
-        }
-        return array.clone();
-    }
-
-    /**
-     * <p>Clones an array returning a typecast result and handling
-     * {@code null}.</p>
-     *
-     * <p>This method returns {@code null} for a {@code null} input array.</p>
-     *
-     * @param array  the array to clone, may be {@code null}
-     * @return the cloned array, {@code null} if {@code null} input
-     */
-    public static byte[] clone(final byte[] array) {
-        if (array == null) {
-            return null;
-        }
-        return array.clone();
-    }
-
-    /**
-     * <p>Clones an array returning a typecast result and handling
-     * {@code null}.</p>
-     *
-     * <p>This method returns {@code null} for a {@code null} input array.</p>
-     *
-     * @param array  the array to clone, may be {@code null}
-     * @return the cloned array, {@code null} if {@code null} input
-     */
-    public static double[] clone(final double[] array) {
-        if (array == null) {
-            return null;
-        }
-        return array.clone();
-    }
-
-    /**
-     * <p>Clones an array returning a typecast result and handling
-     * {@code null}.</p>
-     *
-     * <p>This method returns {@code null} for a {@code null} input array.</p>
-     *
-     * @param array  the array to clone, may be {@code null}
-     * @return the cloned array, {@code null} if {@code null} input
-     */
-    public static float[] clone(final float[] array) {
-        if (array == null) {
-            return null;
-        }
-        return array.clone();
-    }
-
-    /**
-     * <p>Clones an array returning a typecast result and handling
-     * {@code null}.</p>
-     *
-     * <p>This method returns {@code null} for a {@code null} input array.</p>
-     *
-     * @param array  the array to clone, may be {@code null}
-     * @return the cloned array, {@code null} if {@code null} input
-     */
-    public static boolean[] clone(final boolean[] array) {
-        if (array == null) {
-            return null;
-        }
-        return array.clone();
-    }
-
-    // nullToEmpty
-    //-----------------------------------------------------------------------
-    /**
-     * <p>Defensive programming technique to change a {@code null}
-     * reference to an empty one.</p>
-     *
-     * <p>This method returns an empty array for a {@code null} input array.</p>
-     *
-     * <p>As a memory optimizing technique an empty array passed in will be overridden with
-     * the empty {@code public static} references in this class.</p>
-     *
-     * @param array  the array to check for {@code null} or empty
-     * @return the same array, {@code public static} empty array if {@code null} or empty input
-     * @since 2.5
-     */
-    public static Object[] nullToEmpty(final Object[] array) {
-        if (isEmpty(array)) {
-            return EMPTY_OBJECT_ARRAY;
-        }
-        return array;
-    }
-
-    /**
-     * <p>Defensive programming technique to change a {@code null}
-     * reference to an empty one.</p>
-     *
-     * <p>This method returns an empty array for a {@code null} input array.</p>
-     *
-     * <p>As a memory optimizing technique an empty array passed in will be overridden with
-     * the empty {@code public static} references in this class.</p>
-     *
-     * @param array  the array to check for {@code null} or empty
-     * @return the same array, {@code public static} empty array if {@code null} or empty input
-     * @since 3.2
-     */
-    public static Class<?>[] nullToEmpty(final Class<?>[] array) {
-        if (isEmpty(array)) {
-            return EMPTY_CLASS_ARRAY;
-        }
-        return array;
-    }
-
-    /**
-     * <p>Defensive programming technique to change a {@code null}
-     * reference to an empty one.</p>
-     *
-     * <p>This method returns an empty array for a {@code null} input array.</p>
-     *
-     * <p>As a memory optimizing technique an empty array passed in will be overridden with
-     * the empty {@code public static} references in this class.</p>
-     *
-     * @param array  the array to check for {@code null} or empty
-     * @return the same array, {@code public static} empty array if {@code null} or empty input
-     * @since 2.5
-     */
-    public static String[] nullToEmpty(final String[] array) {
-        if (isEmpty(array)) {
-            return EMPTY_STRING_ARRAY;
-        }
-        return array;
-    }
-
-    /**
-     * <p>Defensive programming technique to change a {@code null}
-     * reference to an empty one.</p>
-     *
-     * <p>This method returns an empty array for a {@code null} input array.</p>
-     *
-     * <p>As a memory optimizing technique an empty array passed in will be overridden with
-     * the empty {@code public static} references in this class.</p>
-     *
-     * @param array  the array to check for {@code null} or empty
-     * @return the same array, {@code public static} empty array if {@code null} or empty input
-     * @since 2.5
-     */
-    public static long[] nullToEmpty(final long[] array) {
-        if (isEmpty(array)) {
-            return EMPTY_LONG_ARRAY;
-        }
-        return array;
-    }
-
-    /**
-     * <p>Defensive programming technique to change a {@code null}
-     * reference to an empty one.</p>
-     *
-     * <p>This method returns an empty array for a {@code null} input array.</p>
-     *
-     * <p>As a memory optimizing technique an empty array passed in will be overridden with
-     * the empty {@code public static} references in this class.</p>
-     *
-     * @param array  the array to check for {@code null} or empty
-     * @return the same array, {@code public static} empty array if {@code null} or empty input
-     * @since 2.5
-     */
-    public static int[] nullToEmpty(final int[] array) {
-        if (isEmpty(array)) {
-            return EMPTY_INT_ARRAY;
-        }
-        return array;
-    }
-
-    /**
-     * <p>Defensive programming technique to change a {@code null}
-     * reference to an empty one.</p>
-     *
-     * <p>This method returns an empty array for a {@code null} input array.</p>
-     *
-     * <p>As a memory optimizing technique an empty array passed in will be overridden with
-     * the empty {@code public static} references in this class.</p>
-     *
-     * @param array  the array to check for {@code null} or empty
-     * @return the same array, {@code public static} empty array if {@code null} or empty input
-     * @since 2.5
-     */
-    public static short[] nullToEmpty(final short[] array) {
-        if (isEmpty(array)) {
-            return EMPTY_SHORT_ARRAY;
-        }
-        return array;
-    }
-
-    /**
-     * <p>Defensive programming technique to change a {@code null}
-     * reference to an empty one.</p>
-     *
-     * <p>This method returns an empty array for a {@code null} input array.</p>
-     *
-     * <p>As a memory optimizing technique an empty array passed in will be overridden with
-     * the empty {@code public static} references in this class.</p>
-     *
-     * @param array  the array to check for {@code null} or empty
-     * @return the same array, {@code public static} empty array if {@code null} or empty input
-     * @since 2.5
-     */
-    public static char[] nullToEmpty(final char[] array) {
-        if (isEmpty(array)) {
-            return EMPTY_CHAR_ARRAY;
-        }
-        return array;
-    }
-
-    /**
-     * <p>Defensive programming technique to change a {@code null}
-     * reference to an empty one.</p>
-     *
-     * <p>This method returns an empty array for a {@code null} input array.</p>
-     *
-     * <p>As a memory optimizing technique an empty array passed in will be overridden with
-     * the empty {@code public static} references in this class.</p>
-     *
-     * @param array  the array to check for {@code null} or empty
-     * @return the same array, {@code public static} empty array if {@code null} or empty input
-     * @since 2.5
-     */
-    public static byte[] nullToEmpty(final byte[] array) {
-        if (isEmpty(array)) {
-            return EMPTY_BYTE_ARRAY;
-        }
-        return array;
-    }
-
-    /**
-     * <p>Defensive programming technique to change a {@code null}
-     * reference to an empty one.</p>
-     *
-     * <p>This method returns an empty array for a {@code null} input array.</p>
-     *
-     * <p>As a memory optimizing technique an empty array passed in will be overridden with
-     * the empty {@code public static} references in this class.</p>
-     *
-     * @param array  the array to check for {@code null} or empty
-     * @return the same array, {@code public static} empty array if {@code null} or empty input
-     * @since 2.5
-     */
-    public static double[] nullToEmpty(final double[] array) {
-        if (isEmpty(array)) {
-            return EMPTY_DOUBLE_ARRAY;
-        }
-        return array;
-    }
-
-    /**
-     * <p>Defensive programming technique to change a {@code null}
-     * reference to an empty one.</p>
-     *
-     * <p>This method returns an empty array for a {@code null} input array.</p>
-     *
-     * <p>As a memory optimizing technique an empty array passed in will be overridden with
-     * the empty {@code public static} references in this class.</p>
-     *
-     * @param array  the array to check for {@code null} or empty
-     * @return the same array, {@code public static} empty array if {@code null} or empty input
-     * @since 2.5
-     */
-    public static float[] nullToEmpty(final float[] array) {
-        if (isEmpty(array)) {
-            return EMPTY_FLOAT_ARRAY;
-        }
-        return array;
-    }
-
-    /**
-     * <p>Defensive programming technique to change a {@code null}
-     * reference to an empty one.</p>
-     *
-     * <p>This method returns an empty array for a {@code null} input array.</p>
-     *
-     * <p>As a memory optimizing technique an empty array passed in will be overridden with
-     * the empty {@code public static} references in this class.</p>
-     *
-     * @param array  the array to check for {@code null} or empty
-     * @return the same array, {@code public static} empty array if {@code null} or empty input
-     * @since 2.5
-     */
-    public static boolean[] nullToEmpty(final boolean[] array) {
-        if (isEmpty(array)) {
-            return EMPTY_BOOLEAN_ARRAY;
-        }
-        return array;
-    }
-
-    /**
-     * <p>Defensive programming technique to change a {@code null}
-     * reference to an empty one.</p>
-     *
-     * <p>This method returns an empty array for a {@code null} input array.</p>
-     *
-     * <p>As a memory optimizing technique an empty array passed in will be overridden with
-     * the empty {@code public static} references in this class.</p>
-     *
-     * @param array  the array to check for {@code null} or empty
-     * @return the same array, {@code public static} empty array if {@code null} or empty input
-     * @since 2.5
-     */
-    public static Long[] nullToEmpty(final Long[] array) {
-        if (isEmpty(array)) {
-            return EMPTY_LONG_OBJECT_ARRAY;
-        }
-        return array;
-    }
-
-    /**
-     * <p>Defensive programming technique to change a {@code null}
-     * reference to an empty one.</p>
-     *
-     * <p>This method returns an empty array for a {@code null} input array.</p>
-     *
-     * <p>As a memory optimizing technique an empty array passed in will be overridden with
-     * the empty {@code public static} references in this class.</p>
-     *
-     * @param array  the array to check for {@code null} or empty
-     * @return the same array, {@code public static} empty array if {@code null} or empty input
-     * @since 2.5
-     */
-    public static Integer[] nullToEmpty(final Integer[] array) {
-        if (isEmpty(array)) {
-            return EMPTY_INTEGER_OBJECT_ARRAY;
-        }
-        return array;
-    }
-
-    /**
-     * <p>Defensive programming technique to change a {@code null}
-     * reference to an empty one.</p>
-     *
-     * <p>This method returns an empty array for a {@code null} input array.</p>
-     *
-     * <p>As a memory optimizing technique an empty array passed in will be overridden with
-     * the empty {@code public static} references in this class.</p>
-     *
-     * @param array  the array to check for {@code null} or empty
-     * @return the same array, {@code public static} empty array if {@code null} or empty input
-     * @since 2.5
-     */
-    public static Short[] nullToEmpty(final Short[] array) {
-        if (isEmpty(array)) {
-            return EMPTY_SHORT_OBJECT_ARRAY;
-        }
-        return array;
-    }
-
-    /**
-     * <p>Defensive programming technique to change a {@code null}
-     * reference to an empty one.</p>
-     *
-     * <p>This method returns an empty array for a {@code null} input array.</p>
-     *
-     * <p>As a memory optimizing technique an empty array passed in will be overridden with
-     * the empty {@code public static} references in this class.</p>
-     *
-     * @param array  the array to check for {@code null} or empty
-     * @return the same array, {@code public static} empty array if {@code null} or empty input
-     * @since 2.5
-     */
-    public static Character[] nullToEmpty(final Character[] array) {
-        if (isEmpty(array)) {
-            return EMPTY_CHARACTER_OBJECT_ARRAY;
-        }
-        return array;
-    }
-
-    /**
-     * <p>Defensive programming technique to change a {@code null}
-     * reference to an empty one.</p>
-     *
-     * <p>This method returns an empty array for a {@code null} input array.</p>
-     *
-     * <p>As a memory optimizing technique an empty array passed in will be overridden with
-     * the empty {@code public static} references in this class.</p>
-     *
-     * @param array  the array to check for {@code null} or empty
-     * @return the same array, {@code public static} empty array if {@code null} or empty input
-     * @since 2.5
-     */
-    public static Byte[] nullToEmpty(final Byte[] array) {
-        if (isEmpty(array)) {
-            return EMPTY_BYTE_OBJECT_ARRAY;
-        }
-        return array;
-    }
-
-    /**
-     * <p>Defensive programming technique to change a {@code null}
-     * reference to an empty one.</p>
-     *
-     * <p>This method returns an empty array for a {@code null} input array.</p>
-     *
-     * <p>As a memory optimizing technique an empty array passed in will be overridden with
-     * the empty {@code public static} references in this class.</p>
-     *
-     * @param array  the array to check for {@code null} or empty
-     * @return the same array, {@code public static} empty array if {@code null} or empty input
-     * @since 2.5
-     */
-    public static Double[] nullToEmpty(final Double[] array) {
-        if (isEmpty(array)) {
-            return EMPTY_DOUBLE_OBJECT_ARRAY;
-        }
-        return array;
-    }
-
-    /**
-     * <p>Defensive programming technique to change a {@code null}
-     * reference to an empty one.</p>
-     *
-     * <p>This method returns an empty array for a {@code null} input array.</p>
-     *
-     * <p>As a memory optimizing technique an empty array passed in will be overridden with
-     * the empty {@code public static} references in this class.</p>
-     *
-     * @param array  the array to check for {@code null} or empty
-     * @return the same array, {@code public static} empty array if {@code null} or empty input
-     * @since 2.5
-     */
-    public static Float[] nullToEmpty(final Float[] array) {
-        if (isEmpty(array)) {
-            return EMPTY_FLOAT_OBJECT_ARRAY;
-        }
-        return array;
-    }
-
-    /**
-     * <p>Defensive programming technique to change a {@code null}
-     * reference to an empty one.</p>
-     *
-     * <p>This method returns an empty array for a {@code null} input array.</p>
-     *
-     * <p>As a memory optimizing technique an empty array passed in will be overridden with
-     * the empty {@code public static} references in this class.</p>
-     *
-     * @param array  the array to check for {@code null} or empty
-     * @return the same array, {@code public static} empty array if {@code null} or empty input
-     * @since 2.5
-     */
-    public static Boolean[] nullToEmpty(final Boolean[] array) {
-        if (isEmpty(array)) {
-            return EMPTY_BOOLEAN_OBJECT_ARRAY;
-        }
-        return array;
-    }
-
-    // Subarrays
-    //-----------------------------------------------------------------------
-    /**
-     * <p>Produces a new array containing the elements between
-     * the start and end indices.</p>
-     *
-     * <p>The start index is inclusive, the end index exclusive.
-     * Null array input produces null output.</p>
-     *
-     * <p>The component type of the subarray is always the same as
-     * that of the input array. Thus, if the input is an array of type
-     * {@code Date}, the following usage is envisaged:</p>
-     *
-     * <pre>
-     * Date[] someDates = (Date[])ArrayUtils.subarray(allDates, 2, 5);
-     * </pre>
-     *
-     * @param <T> the component type of the array
-     * @param array  the array
-     * @param startIndexInclusive  the starting index. Undervalue (&lt;0)
-     *      is promoted to 0, overvalue (&gt;array.length) results
-     *      in an empty array.
-     * @param endIndexExclusive  elements up to endIndex-1 are present in the
-     *      returned subarray. Undervalue (&lt; startIndex) produces
-     *      empty array, overvalue (&gt;array.length) is demoted to
-     *      array length.
-     * @return a new array containing the elements between
-     *      the start and end indices.
-     * @since 2.1
-     * @see Arrays#copyOfRange(Object[], int, int)
-     */
-    public static <T> T[] subarray(final T[] array, int startIndexInclusive, int endIndexExclusive) {
-        if (array == null) {
-            return null;
-        }
-        if (startIndexInclusive < 0) {
-            startIndexInclusive = 0;
-        }
-        if (endIndexExclusive > array.length) {
-            endIndexExclusive = array.length;
-        }
-        final int newSize = endIndexExclusive - startIndexInclusive;
-        final Class<?> type = array.getClass().getComponentType();
-        if (newSize <= 0) {
-            @SuppressWarnings("unchecked") // OK, because array is of type T
-            final T[] emptyArray = (T[]) Array.newInstance(type, 0);
-            return emptyArray;
-        }
-        @SuppressWarnings("unchecked") // OK, because array is of type T
-        final
-        T[] subarray = (T[]) Array.newInstance(type, newSize);
-        System.arraycopy(array, startIndexInclusive, subarray, 0, newSize);
-        return subarray;
-    }
-
-    /**
-     * <p>Produces a new {@code long} array containing the elements
-     * between the start and end indices.</p>
-     *
-     * <p>The start index is inclusive, the end index exclusive.
-     * Null array input produces null output.</p>
-     *
-     * @param array  the array
-     * @param startIndexInclusive  the starting index. Undervalue (&lt;0)
-     *      is promoted to 0, overvalue (&gt;array.length) results
-     *      in an empty array.
-     * @param endIndexExclusive  elements up to endIndex-1 are present in the
-     *      returned subarray. Undervalue (&lt; startIndex) produces
-     *      empty array, overvalue (&gt;array.length) is demoted to
-     *      array length.
-     * @return a new array containing the elements between
-     *      the start and end indices.
-     * @since 2.1
-     * @see Arrays#copyOfRange(long[], int, int)
-     */
-    public static long[] subarray(final long[] array, int startIndexInclusive, int endIndexExclusive) {
-        if (array == null) {
-            return null;
-        }
-        if (startIndexInclusive < 0) {
-            startIndexInclusive = 0;
-        }
-        if (endIndexExclusive > array.length) {
-            endIndexExclusive = array.length;
-        }
-        final int newSize = endIndexExclusive - startIndexInclusive;
-        if (newSize <= 0) {
-            return EMPTY_LONG_ARRAY;
-        }
-
-        final long[] subarray = new long[newSize];
-        System.arraycopy(array, startIndexInclusive, subarray, 0, newSize);
-        return subarray;
-    }
-
-    /**
-     * <p>Produces a new {@code int} array containing the elements
-     * between the start and end indices.</p>
-     *
-     * <p>The start index is inclusive, the end index exclusive.
-     * Null array input produces null output.</p>
-     *
-     * @param array  the array
-     * @param startIndexInclusive  the starting index. Undervalue (&lt;0)
-     *      is promoted to 0, overvalue (&gt;array.length) results
-     *      in an empty array.
-     * @param endIndexExclusive  elements up to endIndex-1 are present in the
-     *      returned subarray. Undervalue (&lt; startIndex) produces
-     *      empty array, overvalue (&gt;array.length) is demoted to
-     *      array length.
-     * @return a new array containing the elements between
-     *      the start and end indices.
-     * @since 2.1
-     * @see Arrays#copyOfRange(int[], int, int)
-     */
-    public static int[] subarray(final int[] array, int startIndexInclusive, int endIndexExclusive) {
-        if (array == null) {
-            return null;
-        }
-        if (startIndexInclusive < 0) {
-            startIndexInclusive = 0;
-        }
-        if (endIndexExclusive > array.length) {
-            endIndexExclusive = array.length;
-        }
-        final int newSize = endIndexExclusive - startIndexInclusive;
-        if (newSize <= 0) {
-            return EMPTY_INT_ARRAY;
-        }
-
-        final int[] subarray = new int[newSize];
-        System.arraycopy(array, startIndexInclusive, subarray, 0, newSize);
-        return subarray;
-    }
-
-    /**
-     * <p>Produces a new {@code short} array containing the elements
-     * between the start and end indices.</p>
-     *
-     * <p>The start index is inclusive, the end index exclusive.
-     * Null array input produces null output.</p>
-     *
-     * @param array  the array
-     * @param startIndexInclusive  the starting index. Undervalue (&lt;0)
-     *      is promoted to 0, overvalue (&gt;array.length) results
-     *      in an empty array.
-     * @param endIndexExclusive  elements up to endIndex-1 are present in the
-     *      returned subarray. Undervalue (&lt; startIndex) produces
-     *      empty array, overvalue (&gt;array.length) is demoted to
-     *      array length.
-     * @return a new array containing the elements between
-     *      the start and end indices.
-     * @since 2.1
-     * @see Arrays#copyOfRange(short[], int, int)
-     */
-    public static short[] subarray(final short[] array, int startIndexInclusive, int endIndexExclusive) {
-        if (array == null) {
-            return null;
-        }
-        if (startIndexInclusive < 0) {
-            startIndexInclusive = 0;
-        }
-        if (endIndexExclusive > array.length) {
-            endIndexExclusive = array.length;
-        }
-        final int newSize = endIndexExclusive - startIndexInclusive;
-        if (newSize <= 0) {
-            return EMPTY_SHORT_ARRAY;
-        }
-
-        final short[] subarray = new short[newSize];
-        System.arraycopy(array, startIndexInclusive, subarray, 0, newSize);
-        return subarray;
-    }
-
-    /**
-     * <p>Produces a new {@code char} array containing the elements
-     * between the start and end indices.</p>
-     *
-     * <p>The start index is inclusive, the end index exclusive.
-     * Null array input produces null output.</p>
-     *
-     * @param array  the array
-     * @param startIndexInclusive  the starting index. Undervalue (&lt;0)
-     *      is promoted to 0, overvalue (&gt;array.length) results
-     *      in an empty array.
-     * @param endIndexExclusive  elements up to endIndex-1 are present in the
-     *      returned subarray. Undervalue (&lt; startIndex) produces
-     *      empty array, overvalue (&gt;array.length) is demoted to
-     *      array length.
-     * @return a new array containing the elements between
-     *      the start and end indices.
-     * @since 2.1
-     * @see Arrays#copyOfRange(char[], int, int)
-     */
-    public static char[] subarray(final char[] array, int startIndexInclusive, int endIndexExclusive) {
-        if (array == null) {
-            return null;
-        }
-        if (startIndexInclusive < 0) {
-            startIndexInclusive = 0;
-        }
-        if (endIndexExclusive > array.length) {
-            endIndexExclusive = array.length;
-        }
-        final int newSize = endIndexExclusive - startIndexInclusive;
-        if (newSize <= 0) {
-            return EMPTY_CHAR_ARRAY;
-        }
-
-        final char[] subarray = new char[newSize];
-        System.arraycopy(array, startIndexInclusive, subarray, 0, newSize);
-        return subarray;
-    }
-
-    /**
-     * <p>Produces a new {@code byte} array containing the elements
-     * between the start and end indices.</p>
-     *
-     * <p>The start index is inclusive, the end index exclusive.
-     * Null array input produces null output.</p>
-     *
-     * @param array  the array
-     * @param startIndexInclusive  the starting index. Undervalue (&lt;0)
-     *      is promoted to 0, overvalue (&gt;array.length) results
-     *      in an empty array.
-     * @param endIndexExclusive  elements up to endIndex-1 are present in the
-     *      returned subarray. Undervalue (&lt; startIndex) produces
-     *      empty array, overvalue (&gt;array.length) is demoted to
-     *      array length.
-     * @return a new array containing the elements between
-     *      the start and end indices.
-     * @since 2.1
-     * @see Arrays#copyOfRange(byte[], int, int)
-     */
-    public static byte[] subarray(final byte[] array, int startIndexInclusive, int endIndexExclusive) {
-        if (array == null) {
-            return null;
-        }
-        if (startIndexInclusive < 0) {
-            startIndexInclusive = 0;
-        }
-        if (endIndexExclusive > array.length) {
-            endIndexExclusive = array.length;
-        }
-        final int newSize = endIndexExclusive - startIndexInclusive;
-        if (newSize <= 0) {
-            return EMPTY_BYTE_ARRAY;
-        }
-
-        final byte[] subarray = new byte[newSize];
-        System.arraycopy(array, startIndexInclusive, subarray, 0, newSize);
-        return subarray;
-    }
-
-    /**
-     * <p>Produces a new {@code double} array containing the elements
-     * between the start and end indices.</p>
-     *
-     * <p>The start index is inclusive, the end index exclusive.
-     * Null array input produces null output.</p>
-     *
-     * @param array  the array
-     * @param startIndexInclusive  the starting index. Undervalue (&lt;0)
-     *      is promoted to 0, overvalue (&gt;array.length) results
-     *      in an empty array.
-     * @param endIndexExclusive  elements up to endIndex-1 are present in the
-     *      returned subarray. Undervalue (&lt; startIndex) produces
-     *      empty array, overvalue (&gt;array.length) is demoted to
-     *      array length.
-     * @return a new array containing the elements between
-     *      the start and end indices.
-     * @since 2.1
-     * @see Arrays#copyOfRange(double[], int, int)
-     */
-    public static double[] subarray(final double[] array, int startIndexInclusive, int endIndexExclusive) {
-        if (array == null) {
-            return null;
-        }
-        if (startIndexInclusive < 0) {
-            startIndexInclusive = 0;
-        }
-        if (endIndexExclusive > array.length) {
-            endIndexExclusive = array.length;
-        }
-        final int newSize = endIndexExclusive - startIndexInclusive;
-        if (newSize <= 0) {
-            return EMPTY_DOUBLE_ARRAY;
-        }
-
-        final double[] subarray = new double[newSize];
-        System.arraycopy(array, startIndexInclusive, subarray, 0, newSize);
-        return subarray;
-    }
-
-    /**
-     * <p>Produces a new {@code float} array containing the elements
-     * between the start and end indices.</p>
-     *
-     * <p>The start index is inclusive, the end index exclusive.
-     * Null array input produces null output.</p>
-     *
-     * @param array  the array
-     * @param startIndexInclusive  the starting index. Undervalue (&lt;0)
-     *      is promoted to 0, overvalue (&gt;array.length) results
-     *      in an empty array.
-     * @param endIndexExclusive  elements up to endIndex-1 are present in the
-     *      returned subarray. Undervalue (&lt; startIndex) produces
-     *      empty array, overvalue (&gt;array.length) is demoted to
-     *      array length.
-     * @return a new array containing the elements between
-     *      the start and end indices.
-     * @since 2.1
-     * @see Arrays#copyOfRange(float[], int, int)
-     */
-    public static float[] subarray(final float[] array, int startIndexInclusive, int endIndexExclusive) {
-        if (array == null) {
-            return null;
-        }
-        if (startIndexInclusive < 0) {
-            startIndexInclusive = 0;
-        }
-        if (endIndexExclusive > array.length) {
-            endIndexExclusive = array.length;
-        }
-        final int newSize = endIndexExclusive - startIndexInclusive;
-        if (newSize <= 0) {
-            return EMPTY_FLOAT_ARRAY;
-        }
-
-        final float[] subarray = new float[newSize];
-        System.arraycopy(array, startIndexInclusive, subarray, 0, newSize);
-        return subarray;
-    }
-
-    /**
-     * <p>Produces a new {@code boolean} array containing the elements
-     * between the start and end indices.</p>
-     *
-     * <p>The start index is inclusive, the end index exclusive.
-     * Null array input produces null output.</p>
-     *
-     * @param array  the array
-     * @param startIndexInclusive  the starting index. Undervalue (&lt;0)
-     *      is promoted to 0, overvalue (&gt;array.length) results
-     *      in an empty array.
-     * @param endIndexExclusive  elements up to endIndex-1 are present in the
-     *      returned subarray. Undervalue (&lt; startIndex) produces
-     *      empty array, overvalue (&gt;array.length) is demoted to
-     *      array length.
-     * @return a new array containing the elements between
-     *      the start and end indices.
-     * @since 2.1
-     * @see Arrays#copyOfRange(boolean[], int, int)
-     */
-    public static boolean[] subarray(final boolean[] array, int startIndexInclusive, int endIndexExclusive) {
-        if (array == null) {
-            return null;
-        }
-        if (startIndexInclusive < 0) {
-            startIndexInclusive = 0;
-        }
-        if (endIndexExclusive > array.length) {
-            endIndexExclusive = array.length;
-        }
-        final int newSize = endIndexExclusive - startIndexInclusive;
-        if (newSize <= 0) {
-            return EMPTY_BOOLEAN_ARRAY;
-        }
-
-        final boolean[] subarray = new boolean[newSize];
-        System.arraycopy(array, startIndexInclusive, subarray, 0, newSize);
-        return subarray;
-    }
-
-    // Is same length
-    //-----------------------------------------------------------------------
-    /**
-     * <p>Checks whether two arrays are the same length, treating
-     * {@code null} arrays as length {@code 0}.
-     *
-     * <p>Any multi-dimensional aspects of the arrays are ignored.</p>
-     *
-     * @param array1 the first array, may be {@code null}
-     * @param array2 the second array, may be {@code null}
-     * @return {@code true} if length of arrays matches, treating
-     *  {@code null} as an empty array
-     */
-    public static boolean isSameLength(final Object[] array1, final Object[] array2) {
-        if ((array1 == null && array2 != null && array2.length > 0) ||
-            (array2 == null && array1 != null && array1.length > 0) ||
-            (array1 != null && array2 != null && array1.length != array2.length)) {
-                return false;
-        }
-        return true;
-    }
-
-    /**
-     * <p>Checks whether two arrays are the same length, treating
-     * {@code null} arrays as length {@code 0}.</p>
-     *
-     * @param array1 the first array, may be {@code null}
-     * @param array2 the second array, may be {@code null}
-     * @return {@code true} if length of arrays matches, treating
-     *  {@code null} as an empty array
-     */
-    public static boolean isSameLength(final long[] array1, final long[] array2) {
-        if ((array1 == null && array2 != null && array2.length > 0) ||
-            (array2 == null && array1 != null && array1.length > 0) ||
-            (array1 != null && array2 != null && array1.length != array2.length)) {
-                return false;
-        }
-        return true;
-    }
-
-    /**
-     * <p>Checks whether two arrays are the same length, treating
-     * {@code null} arrays as length {@code 0}.</p>
-     *
-     * @param array1 the first array, may be {@code null}
-     * @param array2 the second array, may be {@code null}
-     * @return {@code true} if length of arrays matches, treating
-     *  {@code null} as an empty array
-     */
-    public static boolean isSameLength(final int[] array1, final int[] array2) {
-        if ((array1 == null && array2 != null && array2.length > 0) ||
-            (array2 == null && array1 != null && array1.length > 0) ||
-            (array1 != null && array2 != null && array1.length != array2.length)) {
-                return false;
-        }
-        return true;
-    }
-
-    /**
-     * <p>Checks whether two arrays are the same length, treating
-     * {@code null} arrays as length {@code 0}.</p>
-     *
-     * @param array1 the first array, may be {@code null}
-     * @param array2 the second array, may be {@code null}
-     * @return {@code true} if length of arrays matches, treating
-     *  {@code null} as an empty array
-     */
-    public static boolean isSameLength(final short[] array1, final short[] array2) {
-        if ((array1 == null && array2 != null && array2.length > 0) ||
-            (array2 == null && array1 != null && array1.length > 0) ||
-            (array1 != null && array2 != null && array1.length != array2.length)) {
-                return false;
-        }
-        return true;
-    }
-
-    /**
-     * <p>Checks whether two arrays are the same length, treating
-     * {@code null} arrays as length {@code 0}.</p>
-     *
-     * @param array1 the first array, may be {@code null}
-     * @param array2 the second array, may be {@code null}
-     * @return {@code true} if length of arrays matches, treating
-     *  {@code null} as an empty array
-     */
-    public static boolean isSameLength(final char[] array1, final char[] array2) {
-        if ((array1 == null && array2 != null && array2.length > 0) ||
-            (array2 == null && array1 != null && array1.length > 0) ||
-            (array1 != null && array2 != null && array1.length != array2.length)) {
-                return false;
-        }
-        return true;
-    }
-
-    /**
-     * <p>Checks whether two arrays are the same length, treating
-     * {@code null} arrays as length {@code 0}.</p>
-     *
-     * @param array1 the first array, may be {@code null}
-     * @param array2 the second array, may be {@code null}
-     * @return {@code true} if length of arrays matches, treating
-     *  {@code null} as an empty array
-     */
-    public static boolean isSameLength(final byte[] array1, final byte[] array2) {
-        if ((array1 == null && array2 != null && array2.length > 0) ||
-            (array2 == null && array1 != null && array1.length > 0) ||
-            (array1 != null && array2 != null && array1.length != array2.length)) {
-                return false;
-        }
-        return true;
-    }
-
-    /**
-     * <p>Checks whether two arrays are the same length, treating
-     * {@code null} arrays as length {@code 0}.</p>
-     *
-     * @param array1 the first array, may be {@code null}
-     * @param array2 the second array, may be {@code null}
-     * @return {@code true} if length of arrays matches, treating
-     *  {@code null} as an empty array
-     */
-    public static boolean isSameLength(final double[] array1, final double[] array2) {
-        if ((array1 == null && array2 != null && array2.length > 0) ||
-            (array2 == null && array1 != null && array1.length > 0) ||
-            (array1 != null && array2 != null && array1.length != array2.length)) {
-                return false;
-        }
-        return true;
-    }
-
-    /**
-     * <p>Checks whether two arrays are the same length, treating
-     * {@code null} arrays as length {@code 0}.</p>
-     *
-     * @param array1 the first array, may be {@code null}
-     * @param array2 the second array, may be {@code null}
-     * @return {@code true} if length of arrays matches, treating
-     *  {@code null} as an empty array
-     */
-    public static boolean isSameLength(final float[] array1, final float[] array2) {
-        if ((array1 == null && array2 != null && array2.length > 0) ||
-            (array2 == null && array1 != null && array1.length > 0) ||
-            (array1 != null && array2 != null && array1.length != array2.length)) {
-                return false;
-        }
-        return true;
-    }
-
-    /**
-     * <p>Checks whether two arrays are the same length, treating
-     * {@code null} arrays as length {@code 0}.</p>
-     *
-     * @param array1 the first array, may be {@code null}
-     * @param array2 the second array, may be {@code null}
-     * @return {@code true} if length of arrays matches, treating
-     *  {@code null} as an empty array
-     */
-    public static boolean isSameLength(final boolean[] array1, final boolean[] array2) {
-        if ((array1 == null && array2 != null && array2.length > 0) ||
-            (array2 == null && array1 != null && array1.length > 0) ||
-            (array1 != null && array2 != null && array1.length != array2.length)) {
-                return false;
-        }
-        return true;
-    }
-
-    //-----------------------------------------------------------------------
-    /**
-     * <p>Returns the length of the specified array.
-     * This method can deal with {@code Object} arrays and with primitive arrays.</p>
-     *
-     * <p>If the input array is {@code null}, {@code 0} is returned.</p>
-     *
-     * <pre>
-     * ArrayUtils.getLength(null)            = 0
-     * ArrayUtils.getLength([])              = 0
-     * ArrayUtils.getLength([null])          = 1
-     * ArrayUtils.getLength([true, false])   = 2
-     * ArrayUtils.getLength([1, 2, 3])       = 3
-     * ArrayUtils.getLength(["a", "b", "c"]) = 3
-     * </pre>
-     *
-     * @param array  the array to retrieve the length from, may be null
-     * @return The length of the array, or {@code 0} if the array is {@code null}
-     * @throws IllegalArgumentException if the object argument is not an array.
-     * @since 2.1
-     */
-    public static int getLength(final Object array) {
-        if (array == null) {
-            return 0;
-        }
-        return Array.getLength(array);
-    }
-
-    /**
-     * <p>Checks whether two arrays are the same type taking into account
-     * multi-dimensional arrays.</p>
-     *
-     * @param array1 the first array, must not be {@code null}
-     * @param array2 the second array, must not be {@code null}
-     * @return {@code true} if type of arrays matches
-     * @throws IllegalArgumentException if either array is {@code null}
-     */
-    public static boolean isSameType(final Object array1, final Object array2) {
-        if (array1 == null || array2 == null) {
-            throw new IllegalArgumentException("The Array must not be null");
-        }
-        return array1.getClass().getName().equals(array2.getClass().getName());
-    }
-
-    // Reverse
-    //-----------------------------------------------------------------------
-    /**
-     * <p>Reverses the order of the given array.</p>
-     *
-     * <p>There is no special handling for multi-dimensional arrays.</p>
-     *
-     * <p>This method does nothing for a {@code null} input array.</p>
-     *
-     * @param array  the array to reverse, may be {@code null}
-     */
-    public static void reverse(final Object[] array) {
-        if (array == null) {
-            return;
-        }
-        reverse(array, 0, array.length);
-    }
-
-    /**
-     * <p>Reverses the order of the given array.</p>
-     *
-     * <p>This method does nothing for a {@code null} input array.</p>
-     *
-     * @param array  the array to reverse, may be {@code null}
-     */
-    public static void reverse(final long[] array) {
-        if (array == null) {
-            return;
-        }
-        reverse(array, 0, array.length);
-    }
-
-    /**
-     * <p>Reverses the order of the given array.</p>
-     *
-     * <p>This method does nothing for a {@code null} input array.</p>
-     *
-     * @param array  the array to reverse, may be {@code null}
-     */
-    public static void reverse(final int[] array) {
-        if (array == null) {
-            return;
-        }
-        reverse(array, 0, array.length);
-    }
-
-    /**
-     * <p>Reverses the order of the given array.</p>
-     *
-     * <p>This method does nothing for a {@code null} input array.</p>
-     *
-     * @param array  the array to reverse, may be {@code null}
-     */
-    public static void reverse(final short[] array) {
-        if (array == null) {
-            return;
-        }
-        reverse(array, 0, array.length);
-    }
-
-    /**
-     * <p>Reverses the order of the given array.</p>
-     *
-     * <p>This method does nothing for a {@code null} input array.</p>
-     *
-     * @param array  the array to reverse, may be {@code null}
-     */
-    public static void reverse(final char[] array) {
-        if (array == null) {
-            return;
-        }
-        reverse(array, 0, array.length);
-    }
-
-    /**
-     * <p>Reverses the order of the given array.</p>
-     *
-     * <p>This method does nothing for a {@code null} input array.</p>
-     *
-     * @param array  the array to reverse, may be {@code null}
-     */
-    public static void reverse(final byte[] array) {
-        if (array == null) {
-            return;
-        }
-        reverse(array, 0, array.length);
-    }
-
-    /**
-     * <p>Reverses the order of the given array.</p>
-     *
-     * <p>This method does nothing for a {@code null} input array.</p>
-     *
-     * @param array  the array to reverse, may be {@code null}
-     */
-    public static void reverse(final double[] array) {
-        if (array == null) {
-            return;
-        }
-        reverse(array, 0, array.length);
-    }
-
-    /**
-     * <p>Reverses the order of the given array.</p>
-     *
-     * <p>This method does nothing for a {@code null} input array.</p>
-     *
-     * @param array  the array to reverse, may be {@code null}
-     */
-    public static void reverse(final float[] array) {
-        if (array == null) {
-            return;
-        }
-        reverse(array, 0, array.length);
-    }
-
-    /**
-     * <p>Reverses the order of the given array.</p>
-     *
-     * <p>This method does nothing for a {@code null} input array.</p>
-     *
-     * @param array  the array to reverse, may be {@code null}
-     */
-    public static void reverse(final boolean[] array) {
-        if (array == null) {
-            return;
-        }
-        reverse(array, 0, array.length);
-    }
-
-    /**
-     * <p>
-     * Reverses the order of the given array in the given range.
-     * </p>
-     * 
-     * <p>
-     * This method does nothing for a {@code null} input array.
-     * </p>
-     * 
-     * @param array
-     *            the array to reverse, may be {@code null}
-     * @param startIndexInclusive
-     *            the starting index. Undervalue (&lt;0) is promoted to 0, overvalue (&gt;array.length) results in no
-     *            change.
-     * @param endIndexExclusive
-     *            elements up to endIndex-1 are reversed in the array. Undervalue (&lt; start index) results in no
-     *            change. Overvalue (&gt;array.length) is demoted to array length.
-     * @since 3.2
-     */
-    public static void reverse(final boolean[] array, final int startIndexInclusive, final int endIndexExclusive) {
-        if (array == null) {
-            return;
-        }
-        int i = startIndexInclusive < 0 ? 0 : startIndexInclusive;
-        int j = Math.min(array.length, endIndexExclusive) - 1;
-        boolean tmp;
-        while (j > i) {
-            tmp = array[j];
-            array[j] = array[i];
-            array[i] = tmp;
-            j--;
-            i++;
-        }
-    }
-
-    /**
-     * <p>
-     * Reverses the order of the given array in the given range.
-     * </p>
-     * 
-     * <p>
-     * This method does nothing for a {@code null} input array.
-     * </p>
-     * 
-     * @param array
-     *            the array to reverse, may be {@code null}
-     * @param startIndexInclusive
-     *            the starting index. Undervalue (&lt;0) is promoted to 0, overvalue (&gt;array.length) results in no
-     *            change.
-     * @param endIndexExclusive
-     *            elements up to endIndex-1 are reversed in the array. Undervalue (&lt; start index) results in no
-     *            change. Overvalue (&gt;array.length) is demoted to array length.
-     * @since 3.2
-     */
-    public static void reverse(final byte[] array, final int startIndexInclusive, final int endIndexExclusive) {
-        if (array == null) {
-            return;
-        }
-        int i = startIndexInclusive < 0 ? 0 : startIndexInclusive;
-        int j = Math.min(array.length, endIndexExclusive) - 1;
-        byte tmp;
-        while (j > i) {
-            tmp = array[j];
-            array[j] = array[i];
-            array[i] = tmp;
-            j--;
-            i++;
-        }
-    }
-
-    /**
-     * <p>
-     * Reverses the order of the given array in the given range.
-     * </p>
-     * 
-     * <p>
-     * This method does nothing for a {@code null} input array.
-     * </p>
-     * 
-     * @param array
-     *            the array to reverse, may be {@code null}
-     * @param startIndexInclusive
-     *            the starting index. Undervalue (&lt;0) is promoted to 0, overvalue (&gt;array.length) results in no
-     *            change.
-     * @param endIndexExclusive
-     *            elements up to endIndex-1 are reversed in the array. Undervalue (&lt; start index) results in no
-     *            change. Overvalue (&gt;array.length) is demoted to array length.
-     * @since 3.2
-     */
-    public static void reverse(final char[] array, final int startIndexInclusive, final int endIndexExclusive) {
-        if (array == null) {
-            return;
-        }
-        int i = startIndexInclusive < 0 ? 0 : startIndexInclusive;
-        int j = Math.min(array.length, endIndexExclusive) - 1;
-        char tmp;
-        while (j > i) {
-            tmp = array[j];
-            array[j] = array[i];
-            array[i] = tmp;
-            j--;
-            i++;
-        }
-    }
-
-    /**
-     * <p>
-     * Reverses the order of the given array in the given range.
-     * </p>
-     * 
-     * <p>
-     * This method does nothing for a {@code null} input array.
-     * </p>
-     * 
-     * @param array
-     *            the array to reverse, may be {@code null}
-     * @param startIndexInclusive
-     *            the starting index. Undervalue (&lt;0) is promoted to 0, overvalue (&gt;array.length) results in no
-     *            change.
-     * @param endIndexExclusive
-     *            elements up to endIndex-1 are reversed in the array. Undervalue (&lt; start index) results in no
-     *            change. Overvalue (&gt;array.length) is demoted to array length.
-     * @since 3.2
-     */
-    public static void reverse(final double[] array, final int startIndexInclusive, final int endIndexExclusive) {
-        if (array == null) {
-            return;
-        }
-        int i = startIndexInclusive < 0 ? 0 : startIndexInclusive;
-        int j = Math.min(array.length, endIndexExclusive) - 1;
-        double tmp;
-        while (j > i) {
-            tmp = array[j];
-            array[j] = array[i];
-            array[i] = tmp;
-            j--;
-            i++;
-        }
-    }
-
-    /**
-     * <p>
-     * Reverses the order of the given array in the given range.
-     * </p>
-     * 
-     * <p>
-     * This method does nothing for a {@code null} input array.
-     * </p>
-     * 
-     * @param array
-     *            the array to reverse, may be {@code null}
-     * @param startIndexInclusive
-     *            the starting index. Undervalue (&lt;0) is promoted to 0, overvalue (&gt;array.length) results in no
-     *            change.
-     * @param endIndexExclusive
-     *            elements up to endIndex-1 are reversed in the array. Undervalue (&lt; start index) results in no
-     *            change. Overvalue (&gt;array.length) is demoted to array length.
-     * @since 3.2
-     */
-    public static void reverse(final float[] array, final int startIndexInclusive, final int endIndexExclusive) {
-        if (array == null) {
-            return;
-        }
-        int i = startIndexInclusive < 0 ? 0 : startIndexInclusive;
-        int j = Math.min(array.length, endIndexExclusive) - 1;
-        float tmp;
-        while (j > i) {
-            tmp = array[j];
-            array[j] = array[i];
-            array[i] = tmp;
-            j--;
-            i++;
-        }
-    }
-
-    /**
-     * <p>
-     * Reverses the order of the given array in the given range.
-     * </p>
-     * 
-     * <p>
-     * This method does nothing for a {@code null} input array.
-     * </p>
-     * 
-     * @param array
-     *            the array to reverse, may be {@code null}
-     * @param startIndexInclusive
-     *            the starting index. Undervalue (&lt;0) is promoted to 0, overvalue (&gt;array.length) results in no
-     *            change.
-     * @param endIndexExclusive
-     *            elements up to endIndex-1 are reversed in the array. Undervalue (&lt; start index) results in no
-     *            change. Overvalue (&gt;array.length) is demoted to array length.
-     * @since 3.2
-     */
-    public static void reverse(final int[] array, final int startIndexInclusive, final int endIndexExclusive) {
-        if (array == null) {
-            return;
-        }
-        int i = startIndexInclusive < 0 ? 0 : startIndexInclusive;
-        int j = Math.min(array.length, endIndexExclusive) - 1;
-        int tmp;
-        while (j > i) {
-            tmp = array[j];
-            array[j] = array[i];
-            array[i] = tmp;
-            j--;
-            i++;
-        }
-    }
-
-    /**
-     * <p>
-     * Reverses the order of the given array in the given range.
-     * </p>
-     * 
-     * <p>
-     * This method does nothing for a {@code null} input array.
-     * </p>
-     * 
-     * @param array
-     *            the array to reverse, may be {@code null}
-     * @param startIndexInclusive
-     *            the starting index. Undervalue (&lt;0) is promoted to 0, overvalue (&gt;array.length) results in no
-     *            change.
-     * @param endIndexExclusive
-     *            elements up to endIndex-1 are reversed in the array. Undervalue (&lt; start index) results in no
-     *            change. Overvalue (&gt;array.length) is demoted to array length.
-     * @since 3.2
-     */
-    public static void reverse(final long[] array, final int startIndexInclusive, final int endIndexExclusive) {
-        if (array == null) {
-            return;
-        }
-        int i = startIndexInclusive < 0 ? 0 : startIndexInclusive;
-        int j = Math.min(array.length, endIndexExclusive) - 1;
-        long tmp;
-        while (j > i) {
-            tmp = array[j];
-            array[j] = array[i];
-            array[i] = tmp;
-            j--;
-            i++;
-        }
-    }
-
-    /**
-     * <p>
-     * Reverses the order of the given array in the given range.
-     * </p>
-     * 
-     * <p>
-     * This method does nothing for a {@code null} input array.
-     * </p>
-     * 
-     * @param array
-     *            the array to reverse, may be {@code null}
-     * @param startIndexInclusive
-     *            the starting index. Undervalue (&lt;0) is promoted to 0, overvalue (&gt;array.length) results in no
-     *            change.
-     * @param endIndexExclusive
-     *            elements up to endIndex-1 are reversed in the array. Undervalue (&lt; start index) results in no
-     *            change. Overvalue (&gt;array.length) is demoted to array length.
-     * @since 3.2
-     */
-    public static void reverse(final Object[] array, final int startIndexInclusive, final int endIndexExclusive) {
-        if (array == null) {
-            return;
-        }
-        int i = startIndexInclusive < 0 ? 0 : startIndexInclusive;
-        int j = Math.min(array.length, endIndexExclusive) - 1;
-        Object tmp;
-        while (j > i) {
-            tmp = array[j];
-            array[j] = array[i];
-            array[i] = tmp;
-            j--;
-            i++;
-        }
-    }
-
-    /**
-     * <p>
-     * Reverses the order of the given array in the given range.
-     * </p>
-     * 
-     * <p>
-     * This method does nothing for a {@code null} input array.
-     * </p>
-     * 
-     * @param array
-     *            the array to reverse, may be {@code null}
-     * @param startIndexInclusive
-     *            the starting index. Undervalue (&lt;0) is promoted to 0, overvalue (&gt;array.length) results in no
-     *            change.
-     * @param endIndexExclusive
-     *            elements up to endIndex-1 are reversed in the array. Undervalue (&lt; start index) results in no
-     *            change. Overvalue (&gt;array.length) is demoted to array length.
-     * @since 3.2
-     */
-    public static void reverse(final short[] array, final int startIndexInclusive, final int endIndexExclusive) {
-        if (array == null) {
-            return;
-        }
-        int i = startIndexInclusive < 0 ? 0 : startIndexInclusive;
-        int j = Math.min(array.length, endIndexExclusive) - 1;
-        short tmp;
-        while (j > i) {
-            tmp = array[j];
-            array[j] = array[i];
-            array[i] = tmp;
-            j--;
-            i++;
-        }
-    }
-
-    // IndexOf search
-    // ----------------------------------------------------------------------
-
-    // Object IndexOf
-    //-----------------------------------------------------------------------
-    /**
-     * <p>Finds the index of the given object in the array.</p>
-     *
-     * <p>This method returns {@link #INDEX_NOT_FOUND} ({@code -1}) for a {@code null} input array.</p>
-     *
-     * @param array  the array to search through for the object, may be {@code null}
-     * @param objectToFind  the object to find, may be {@code null}
-     * @return the index of the object within the array,
-     *  {@link #INDEX_NOT_FOUND} ({@code -1}) if not found or {@code null} array input
-     */
-    public static int indexOf(final Object[] array, final Object objectToFind) {
-        return indexOf(array, objectToFind, 0);
-    }
-
-    /**
-     * <p>Finds the index of the given object in the array starting at the given index.</p>
-     *
-     * <p>This method returns {@link #INDEX_NOT_FOUND} ({@code -1}) for a {@code null} input array.</p>
-     *
-     * <p>A negative startIndex is treated as zero. A startIndex larger than the array
-     * length will return {@link #INDEX_NOT_FOUND} ({@code -1}).</p>
-     *
-     * @param array  the array to search through for the object, may be {@code null}
-     * @param objectToFind  the object to find, may be {@code null}
-     * @param startIndex  the index to start searching at
-     * @return the index of the object within the array starting at the index,
-     *  {@link #INDEX_NOT_FOUND} ({@code -1}) if not found or {@code null} array input
-     */
-    public static int indexOf(final Object[] array, final Object objectToFind, int startIndex) {
-        if (array == null) {
-            return INDEX_NOT_FOUND;
-        }
-        if (startIndex < 0) {
-            startIndex = 0;
-        }
-        if (objectToFind == null) {
-            for (int i = startIndex; i < array.length; i++) {
-                if (array[i] == null) {
-                    return i;
-                }
-            }
-        } else if (array.getClass().getComponentType().isInstance(objectToFind)) {
-            for (int i = startIndex; i < array.length; i++) {
-                if (objectToFind.equals(array[i])) {
-                    return i;
-                }
-            }
-        }
-        return INDEX_NOT_FOUND;
-    }
-
-    /**
-     * <p>Finds the last index of the given object within the array.</p>
-     *
-     * <p>This method returns {@link #INDEX_NOT_FOUND} ({@code -1}) for a {@code null} input array.</p>
-     *
-     * @param array  the array to travers backwords looking for the object, may be {@code null}
-     * @param objectToFind  the object to find, may be {@code null}
-     * @return the last index of the object within the array,
-     *  {@link #INDEX_NOT_FOUND} ({@code -1}) if not found or {@code null} array input
-     */
-    public static int lastIndexOf(final Object[] array, final Object objectToFind) {
-        return lastIndexOf(array, objectToFind, Integer.MAX_VALUE);
-    }
-
-    /**
-     * <p>Finds the last index of the given object in the array starting at the given index.</p>
-     *
-     * <p>This method returns {@link #INDEX_NOT_FOUND} ({@code -1}) for a {@code null} input array.</p>
-     *
-     * <p>A negative startIndex will return {@link #INDEX_NOT_FOUND} ({@code -1}). A startIndex larger than
-     * the array length will search from the end of the array.</p>
-     *
-     * @param array  the array to traverse for looking for the object, may be {@code null}
-     * @param objectToFind  the object to find, may be {@code null}
-     * @param startIndex  the start index to travers backwards from
-     * @return the last index of the object within the array,
-     *  {@link #INDEX_NOT_FOUND} ({@code -1}) if not found or {@code null} array input
-     */
-    public static int lastIndexOf(final Object[] array, final Object objectToFind, int startIndex) {
-        if (array == null) {
-            return INDEX_NOT_FOUND;
-        }
-        if (startIndex < 0) {
-            return INDEX_NOT_FOUND;
-        } else if (startIndex >= array.length) {
-            startIndex = array.length - 1;
-        }
-        if (objectToFind == null) {
-            for (int i = startIndex; i >= 0; i--) {
-                if (array[i] == null) {
-                    return i;
-                }
-            }
-        } else if (array.getClass().getComponentType().isInstance(objectToFind)) {
-            for (int i = startIndex; i >= 0; i--) {
-                if (objectToFind.equals(array[i])) {
-                    return i;
-                }
-            }
-        }
-        return INDEX_NOT_FOUND;
-    }
-
-    /**
-     * <p>Checks if the object is in the given array.</p>
-     *
-     * <p>The method returns {@code false} if a {@code null} array is passed in.</p>
-     *
-     * @param array  the array to search through
-     * @param objectToFind  the object to find
-     * @return {@code true} if the array contains the object
-     */
-    public static boolean contains(final Object[] array, final Object objectToFind) {
-        return indexOf(array, objectToFind) != INDEX_NOT_FOUND;
-    }
-
-    // long IndexOf
-    //-----------------------------------------------------------------------
-    /**
-     * <p>Finds the index of the given value in the array.</p>
-     *
-     * <p>This method returns {@link #INDEX_NOT_FOUND} ({@code -1}) for a {@code null} input array.</p>
-     *
-     * @param array  the array to search through for the object, may be {@code null}
-     * @param valueToFind  the value to find
-     * @return the index of the value within the array,
-     *  {@link #INDEX_NOT_FOUND} ({@code -1}) if not found or {@code null} array input
-     */
-    public static int indexOf(final long[] array, final long valueToFind) {
-        return indexOf(array, valueToFind, 0);
-    }
-
-    /**
-     * <p>Finds the index of the given value in the array starting at the given index.</p>
-     *
-     * <p>This method returns {@link #INDEX_NOT_FOUND} ({@code -1}) for a {@code null} input array.</p>
-     *
-     * <p>A negative startIndex is treated as zero. A startIndex larger than the array
-     * length will return {@link #INDEX_NOT_FOUND} ({@code -1}).</p>
-     *
-     * @param array  the array to search through for the object, may be {@code null}
-     * @param valueToFind  the value to find
-     * @param startIndex  the index to start searching at
-     * @return the index of the value within the array,
-     *  {@link #INDEX_NOT_FOUND} ({@code -1}) if not found or {@code null} array input
-     */
-    public static int indexOf(final long[] array, final long valueToFind, int startIndex) {
-        if (array == null) {
-            return INDEX_NOT_FOUND;
-        }
-        if (startIndex < 0) {
-            startIndex = 0;
-        }
-        for (int i = startIndex; i < array.length; i++) {
-            if (valueToFind == array[i]) {
-                return i;
-            }
-        }
-        return INDEX_NOT_FOUND;
-    }
-
-    /**
-     * <p>Finds the last index of the given value within the array.</p>
-     *
-     * <p>This method returns {@link #INDEX_NOT_FOUND} ({@code -1}) for a {@code null} input array.</p>
-     *
-     * @param array  the array to travers backwords looking for the object, may be {@code null}
-     * @param valueToFind  the object to find
-     * @return the last index of the value within the array,
-     *  {@link #INDEX_NOT_FOUND} ({@code -1}) if not found or {@code null} array input
-     */
-    public static int lastIndexOf(final long[] array, final long valueToFind) {
-        return lastIndexOf(array, valueToFind, Integer.MAX_VALUE);
-    }
-
-    /**
-     * <p>Finds the last index of the given value in the array starting at the given index.</p>
-     *
-     * <p>This method returns {@link #INDEX_NOT_FOUND} ({@code -1}) for a {@code null} input array.</p>
-     *
-     * <p>A negative startIndex will return {@link #INDEX_NOT_FOUND} ({@code -1}). A startIndex larger than the
-     * array length will search from the end of the array.</p>
-     *
-     * @param array  the array to traverse for looking for the object, may be {@code null}
-     * @param valueToFind  the value to find
-     * @param startIndex  the start index to travers backwards from
-     * @return the last index of the value within the array,
-     *  {@link #INDEX_NOT_FOUND} ({@code -1}) if not found or {@code null} array input
-     */
-    public static int lastIndexOf(final long[] array, final long valueToFind, int startIndex) {
-        if (array == null) {
-            return INDEX_NOT_FOUND;
-        }
-        if (startIndex < 0) {
-            return INDEX_NOT_FOUND;
-        } else if (startIndex >= array.length) {
-            startIndex = array.length - 1;
-        }
-        for (int i = startIndex; i >= 0; i--) {
-            if (valueToFind == array[i]) {
-                return i;
-            }
-        }
-        return INDEX_NOT_FOUND;
-    }
-
-    /**
-     * <p>Checks if the value is in the given array.</p>
-     *
-     * <p>The method returns {@code false} if a {@code null} array is passed in.</p>
-     *
-     * @param array  the array to search through
-     * @param valueToFind  the value to find
-     * @return {@code true} if the array contains the object
-     */
-    public static boolean contains(final long[] array, final long valueToFind) {
-        return indexOf(array, valueToFind) != INDEX_NOT_FOUND;
-    }
-
-    // int IndexOf
-    //-----------------------------------------------------------------------
-    /**
-     * <p>Finds the index of the given value in the array.</p>
-     *
-     * <p>This method returns {@link #INDEX_NOT_FOUND} ({@code -1}) for a {@code null} input array.</p>
-     *
-     * @param array  the array to search through for the object, may be {@code null}
-     * @param valueToFind  the value to find
-     * @return the index of the value within the array,
-     *  {@link #INDEX_NOT_FOUND} ({@code -1}) if not found or {@code null} array input
-     */
-    public static int indexOf(final int[] array, final int valueToFind) {
-        return indexOf(array, valueToFind, 0);
-    }
-
-    /**
-     * <p>Finds the index of the given value in the array starting at the given index.</p>
-     *
-     * <p>This method returns {@link #INDEX_NOT_FOUND} ({@code -1}) for a {@code null} input array.</p>
-     *
-     * <p>A negative startIndex is treated as zero. A startIndex larger than the array
-     * length will return {@link #INDEX_NOT_FOUND} ({@code -1}).</p>
-     *
-     * @param array  the array to search through for the object, may be {@code null}
-     * @param valueToFind  the value to find
-     * @param startIndex  the index to start searching at
-     * @return the index of the value within the array,
-     *  {@link #INDEX_NOT_FOUND} ({@code -1}) if not found or {@code null} array input
-     */
-    public static int indexOf(final int[] array, final int valueToFind, int startIndex) {
-        if (array == null) {
-            return INDEX_NOT_FOUND;
-        }
-        if (startIndex < 0) {
-            startIndex = 0;
-        }
-        for (int i = startIndex; i < array.length; i++) {
-            if (valueToFind == array[i]) {
-                return i;
-            }
-        }
-        return INDEX_NOT_FOUND;
-    }
-
-    /**
-     * <p>Finds the last index of the given value within the array.</p>
-     *
-     * <p>This method returns {@link #INDEX_NOT_FOUND} ({@code -1}) for a {@code null} input array.</p>
-     *
-     * @param array  the array to travers backwords looking for the object, may be {@code null}
-     * @param valueToFind  the object to find
-     * @return the last index of the value within the array,
-     *  {@link #INDEX_NOT_FOUND} ({@code -1}) if not found or {@code null} array input
-     */
-    public static int lastIndexOf(final int[] array, final int valueToFind) {
-        return lastIndexOf(array, valueToFind, Integer.MAX_VALUE);
-    }
-
-    /**
-     * <p>Finds the last index of the given value in the array starting at the given index.</p>
-     *
-     * <p>This method returns {@link #INDEX_NOT_FOUND} ({@code -1}) for a {@code null} input array.</p>
-     *
-     * <p>A negative startIndex will return {@link #INDEX_NOT_FOUND} ({@code -1}). A startIndex larger than the
-     * array length will search from the end of the array.</p>
-     *
-     * @param array  the array to traverse for looking for the object, may be {@code null}
-     * @param valueToFind  the value to find
-     * @param startIndex  the start index to travers backwards from
-     * @return the last index of the value within the array,
-     *  {@link #INDEX_NOT_FOUND} ({@code -1}) if not found or {@code null} array input
-     */
-    public static int lastIndexOf(final int[] array, final int valueToFind, int startIndex) {
-        if (array == null) {
-            return INDEX_NOT_FOUND;
-        }
-        if (startIndex < 0) {
-            return INDEX_NOT_FOUND;
-        } else if (startIndex >= array.length) {
-            startIndex = array.length - 1;
-        }
-        for (int i = startIndex; i >= 0; i--) {
-            if (valueToFind == array[i]) {
-                return i;
-            }
-        }
-        return INDEX_NOT_FOUND;
-    }
-
-    /**
-     * <p>Checks if the value is in the given array.</p>
-     *
-     * <p>The method returns {@code false} if a {@code null} array is passed in.</p>
-     *
-     * @param array  the array to search through
-     * @param valueToFind  the value to find
-     * @return {@code true} if the array contains the object
-     */
-    public static boolean contains(final int[] array, final int valueToFind) {
-        return indexOf(array, valueToFind) != INDEX_NOT_FOUND;
-    }
-
-    // short IndexOf
-    //-----------------------------------------------------------------------
-    /**
-     * <p>Finds the index of the given value in the array.</p>
-     *
-     * <p>This method returns {@link #INDEX_NOT_FOUND} ({@code -1}) for a {@code null} input array.</p>
-     *
-     * @param array  the array to search through for the object, may be {@code null}
-     * @param valueToFind  the value to find
-     * @return the index of the value within the array,
-     *  {@link #INDEX_NOT_FOUND} ({@code -1}) if not found or {@code null} array input
-     */
-    public static int indexOf(final short[] array, final short valueToFind) {
-        return indexOf(array, valueToFind, 0);
-    }
-
-    /**
-     * <p>Finds the index of the given value in the array starting at the given index.</p>
-     *
-     * <p>This method returns {@link #INDEX_NOT_FOUND} ({@code -1}) for a {@code null} input array.</p>
-     *
-     * <p>A negative startIndex is treated as zero. A startIndex larger than the array
-     * length will return {@link #INDEX_NOT_FOUND} ({@code -1}).</p>
-     *
-     * @param array  the array to search through for the object, may be {@code null}
-     * @param valueToFind  the value to find
-     * @param startIndex  the index to start searching at
-     * @return the index of the value within the array,
-     *  {@link #INDEX_NOT_FOUND} ({@code -1}) if not found or {@code null} array input
-     */
-    public static int indexOf(final short[] array, final short valueToFind, int startIndex) {
-        if (array == null) {
-            return INDEX_NOT_FOUND;
-        }
-        if (startIndex < 0) {
-            startIndex = 0;
-        }
-        for (int i = startIndex; i < array.length; i++) {
-            if (valueToFind == array[i]) {
-                return i;
-            }
-        }
-        return INDEX_NOT_FOUND;
-    }
-
-    /**
-     * <p>Finds the last index of the given value within the array.</p>
-     *
-     * <p>This method returns {@link #INDEX_NOT_FOUND} ({@code -1}) for a {@code null} input array.</p>
-     *
-     * @param array  the array to travers backwords looking for the object, may be {@code null}
-     * @param valueToFind  the object to find
-     * @return the last index of the value within the array,
-     *  {@link #INDEX_NOT_FOUND} ({@code -1}) if not found or {@code null} array input
-     */
-    public static int lastIndexOf(final short[] array, final short valueToFind) {
-        return lastIndexOf(array, valueToFind, Integer.MAX_VALUE);
-    }
-
-    /**
-     * <p>Finds the last index of the given value in the array starting at the given index.</p>
-     *
-     * <p>This method returns {@link #INDEX_NOT_FOUND} ({@code -1}) for a {@code null} input array.</p>
-     *
-     * <p>A negative startIndex will return {@link #INDEX_NOT_FOUND} ({@code -1}). A startIndex larger than the
-     * array length will search from the end of the array.</p>
-     *
-     * @param array  the array to traverse for looking for the object, may be {@code null}
-     * @param valueToFind  the value to find
-     * @param startIndex  the start index to travers backwards from
-     * @return the last index of the value within the array,
-     *  {@link #INDEX_NOT_FOUND} ({@code -1}) if not found or {@code null} array input
-     */
-    public static int lastIndexOf(final short[] array, final short valueToFind, int startIndex) {
-        if (array == null) {
-            return INDEX_NOT_FOUND;
-        }
-        if (startIndex < 0) {
-            return INDEX_NOT_FOUND;
-        } else if (startIndex >= array.length) {
-            startIndex = array.length - 1;
-        }
-        for (int i = startIndex; i >= 0; i--) {
-            if (valueToFind == array[i]) {
-                return i;
-            }
-        }
-        return INDEX_NOT_FOUND;
-    }
-
-    /**
-     * <p>Checks if the value is in the given array.</p>
-     *
-     * <p>The method returns {@code false} if a {@code null} array is passed in.</p>
-     *
-     * @param array  the array to search through
-     * @param valueToFind  the value to find
-     * @return {@code true} if the array contains the object
-     */
-    public static boolean contains(final short[] array, final short valueToFind) {
-        return indexOf(array, valueToFind) != INDEX_NOT_FOUND;
-    }
-
-    // char IndexOf
-    //-----------------------------------------------------------------------
-    /**
-     * <p>Finds the index of the given value in the array.</p>
-     *
-     * <p>This method returns {@link #INDEX_NOT_FOUND} ({@code -1}) for a {@code null} input array.</p>
-     *
-     * @param array  the array to search through for the object, may be {@code null}
-     * @param valueToFind  the value to find
-     * @return the index of the value within the array,
-     *  {@link #INDEX_NOT_FOUND} ({@code -1}) if not found or {@code null} array input
-     * @since 2.1
-     */
-    public static int indexOf(final char[] array, final char valueToFind) {
-        return indexOf(array, valueToFind, 0);
-    }
-
-    /**
-     * <p>Finds the index of the given value in the array starting at the given index.</p>
-     *
-     * <p>This method returns {@link #INDEX_NOT_FOUND} ({@code -1}) for a {@code null} input array.</p>
-     *
-     * <p>A negative startIndex is treated as zero. A startIndex larger than the array
-     * length will return {@link #INDEX_NOT_FOUND} ({@code -1}).</p>
-     *
-     * @param array  the array to search through for the object, may be {@code null}
-     * @param valueToFind  the value to find
-     * @param startIndex  the index to start searching at
-     * @return the index of the value within the array,
-     *  {@link #INDEX_NOT_FOUND} ({@code -1}) if not found or {@code null} array input
-     * @since 2.1
-     */
-    public static int indexOf(final char[] array, final char valueToFind, int startIndex) {
-        if (array == null) {
-            return INDEX_NOT_FOUND;
-        }
-        if (startIndex < 0) {
-            startIndex = 0;
-        }
-        for (int i = startIndex; i < array.length; i++) {
-            if (valueToFind == array[i]) {
-                return i;
-            }
-        }
-        return INDEX_NOT_FOUND;
-    }
-
-    /**
-     * <p>Finds the last index of the given value within the array.</p>
-     *
-     * <p>This method returns {@link #INDEX_NOT_FOUND} ({@code -1}) for a {@code null} input array.</p>
-     *
-     * @param array  the array to travers backwords looking for the object, may be {@code null}
-     * @param valueToFind  the object to find
-     * @return the last index of the value within the array,
-     *  {@link #INDEX_NOT_FOUND} ({@code -1}) if not found or {@code null} array input
-     * @since 2.1
-     */
-    public static int lastIndexOf(final char[] array, final char valueToFind) {
-        return lastIndexOf(array, valueToFind, Integer.MAX_VALUE);
-    }
-
-    /**
-     * <p>Finds the last index of the given value in the array starting at the given index.</p>
-     *
-     * <p>This method returns {@link #INDEX_NOT_FOUND} ({@code -1}) for a {@code null} input array.</p>
-     *
-     * <p>A negative startIndex will return {@link #INDEX_NOT_FOUND} ({@code -1}). A startIndex larger than the
-     * array length will search from the end of the array.</p>
-     *
-     * @param array  the array to traverse for looking for the object, may be {@code null}
-     * @param valueToFind  the value to find
-     * @param startIndex  the start index to travers backwards from
-     * @return the last index of the value within the array,
-     *  {@link #INDEX_NOT_FOUND} ({@code -1}) if not found or {@code null} array input
-     * @since 2.1
-     */
-    public static int lastIndexOf(final char[] array, final char valueToFind, int startIndex) {
-        if (array == null) {
-            return INDEX_NOT_FOUND;
-        }
-        if (startIndex < 0) {
-            return INDEX_NOT_FOUND;
-        } else if (startIndex >= array.length) {
-            startIndex = array.length - 1;
-        }
-        for (int i = startIndex; i >= 0; i--) {
-            if (valueToFind == array[i]) {
-                return i;
-            }
-        }
-        return INDEX_NOT_FOUND;
-    }
-
-    /**
-     * <p>Checks if the value is in the given array.</p>
-     *
-     * <p>The method returns {@code false} if a {@code null} array is passed in.</p>
-     *
-     * @param array  the array to search through
-     * @param valueToFind  the value to find
-     * @return {@code true} if the array contains the object
-     * @since 2.1
-     */
-    public static boolean contains(final char[] array, final char valueToFind) {
-        return indexOf(array, valueToFind) != INDEX_NOT_FOUND;
-    }
-
-    // byte IndexOf
-    //-----------------------------------------------------------------------
-    /**
-     * <p>Finds the index of the given value in the array.</p>
-     *
-     * <p>This method returns {@link #INDEX_NOT_FOUND} ({@code -1}) for a {@code null} input array.</p>
-     *
-     * @param array  the array to search through for the object, may be {@code null}
-     * @param valueToFind  the value to find
-     * @return the index of the value within the array,
-     *  {@link #INDEX_NOT_FOUND} ({@code -1}) if not found or {@code null} array input
-     */
-    public static int indexOf(final byte[] array, final byte valueToFind) {
-        return indexOf(array, valueToFind, 0);
-    }
-
-    /**
-     * <p>Finds the index of the given value in the array starting at the given index.</p>
-     *
-     * <p>This method returns {@link #INDEX_NOT_FOUND} ({@code -1}) for a {@code null} input array.</p>
-     *
-     * <p>A negative startIndex is treated as zero. A startIndex larger than the array
-     * length will return {@link #INDEX_NOT_FOUND} ({@code -1}).</p>
-     *
-     * @param array  the array to search through for the object, may be {@code null}
-     * @param valueToFind  the value to find
-     * @param startIndex  the index to start searching at
-     * @return the index of the value within the array,
-     *  {@link #INDEX_NOT_FOUND} ({@code -1}) if not found or {@code null} array input
-     */
-    public static int indexOf(final byte[] array, final byte valueToFind, int startIndex) {
-        if (array == null) {
-            return INDEX_NOT_FOUND;
-        }
-        if (startIndex < 0) {
-            startIndex = 0;
-        }
-        for (int i = startIndex; i < array.length; i++) {
-            if (valueToFind == array[i]) {
-                return i;
-            }
-        }
-        return INDEX_NOT_FOUND;
-    }
-
-    /**
-     * <p>Finds the last index of the given value within the array.</p>
-     *
-     * <p>This method returns {@link #INDEX_NOT_FOUND} ({@code -1}) for a {@code null} input array.</p>
-     *
-     * @param array  the array to travers backwords looking for the object, may be {@code null}
-     * @param valueToFind  the object to find
-     * @return the last index of the value within the array,
-     *  {@link #INDEX_NOT_FOUND} ({@code -1}) if not found or {@code null} array input
-     */
-    public static int lastIndexOf(final byte[] array, final byte valueToFind) {
-        return lastIndexOf(array, valueToFind, Integer.MAX_VALUE);
-    }
-
-    /**
-     * <p>Finds the last index of the given value in the array starting at the given index.</p>
-     *
-     * <p>This method returns {@link #INDEX_NOT_FOUND} ({@code -1}) for a {@code null} input array.</p>
-     *
-     * <p>A negative startIndex will return {@link #INDEX_NOT_FOUND} ({@code -1}). A startIndex larger than the
-     * array length will search from the end of the array.</p>
-     *
-     * @param array  the array to traverse for looking for the object, may be {@code null}
-     * @param valueToFind  the value to find
-     * @param startIndex  the start index to travers backwards from
-     * @return the last index of the value within the array,
-     *  {@link #INDEX_NOT_FOUND} ({@code -1}) if not found or {@code null} array input
-     */
-    public static int lastIndexOf(final byte[] array, final byte valueToFind, int startIndex) {
-        if (array == null) {
-            return INDEX_NOT_FOUND;
-        }
-        if (startIndex < 0) {
-            return INDEX_NOT_FOUND;
-        } else if (startIndex >= array.length) {
-            startIndex = array.length - 1;
-        }
-        for (int i = startIndex; i >= 0; i--) {
-            if (valueToFind == array[i]) {
-                return i;
-            }
-        }
-        return INDEX_NOT_FOUND;
-    }
-
-    /**
-     * <p>Checks if the value is in the given array.</p>
-     *
-     * <p>The method returns {@code false} if a {@code null} array is passed in.</p>
-     *
-     * @param array  the array to search through
-     * @param valueToFind  the value to find
-     * @return {@code true} if the array contains the object
-     */
-    public static boolean contains(final byte[] array, final byte valueToFind) {
-        return indexOf(array, valueToFind) != INDEX_NOT_FOUND;
-    }
-
-    // double IndexOf
-    //-----------------------------------------------------------------------
-    /**
-     * <p>Finds the index of the given value in the array.</p>
-     *
-     * <p>This method returns {@link #INDEX_NOT_FOUND} ({@code -1}) for a {@code null} input array.</p>
-     *
-     * @param array  the array to search through for the object, may be {@code null}
-     * @param valueToFind  the value to find
-     * @return the index of the value within the array,
-     *  {@link #INDEX_NOT_FOUND} ({@code -1}) if not found or {@code null} array input
-     */
-    public static int indexOf(final double[] array, final double valueToFind) {
-        return indexOf(array, valueToFind, 0);
-    }
-
-    /**
-     * <p>Finds the index of the given value within a given tolerance in the array.
-     * This method will return the index of the first value which falls between the region
-     * defined by valueToFind - tolerance and valueToFind + tolerance.</p>
-     *
-     * <p>This method returns {@link #INDEX_NOT_FOUND} ({@code -1}) for a {@code null} input array.</p>
-     *
-     * @param array  the array to search through for the object, may be {@code null}
-     * @param valueToFind  the value to find
-     * @param tolerance tolerance of the search
-     * @return the index of the value within the array,
-     *  {@link #INDEX_NOT_FOUND} ({@code -1}) if not found or {@code null} array input
-     */
-    public static int indexOf(final double[] array, final double valueToFind, final double tolerance) {
-        return indexOf(array, valueToFind, 0, tolerance);
-    }
-
-    /**
-     * <p>Finds the index of the given value in the array starting at the given index.</p>
-     *
-     * <p>This method returns {@link #INDEX_NOT_FOUND} ({@code -1}) for a {@code null} input array.</p>
-     *
-     * <p>A negative startIndex is treated as zero. A startIndex larger than the array
-     * length will return {@link #INDEX_NOT_FOUND} ({@code -1}).</p>
-     *
-     * @param array  the array to search through for the object, may be {@code null}
-     * @param valueToFind  the value to find
-     * @param startIndex  the index to start searching at
-     * @return the index of the value within the array,
-     *  {@link #INDEX_NOT_FOUND} ({@code -1}) if not found or {@code null} array input
-     */
-    public static int indexOf(final double[] array, final double valueToFind, int startIndex) {
-        if (ArrayUtils.isEmpty(array)) {
-            return INDEX_NOT_FOUND;
-        }
-        if (startIndex < 0) {
-            startIndex = 0;
-        }
-        for (int i = startIndex; i < array.length; i++) {
-            if (valueToFind == array[i]) {
-                return i;
-            }
-        }
-        return INDEX_NOT_FOUND;
-    }
-
-    /**
-     * <p>Finds the index of the given value in the array starting at the given index.
-     * This method will return the index of the first value which falls between the region
-     * defined by valueToFind - tolerance and valueToFind + tolerance.</p>
-     *
-     * <p>This method returns {@link #INDEX_NOT_FOUND} ({@code -1}) for a {@code null} input array.</p>
-     *
-     * <p>A negative startIndex is treated as zero. A startIndex larger than the array
-     * length will return {@link #INDEX_NOT_FOUND} ({@code -1}).</p>
-     *
-     * @param array  the array to search through for the object, may be {@code null}
-     * @param valueToFind  the value to find
-     * @param startIndex  the index to start searching at
-     * @param tolerance tolerance of the search
-     * @return the index of the value within the array,
-     *  {@link #INDEX_NOT_FOUND} ({@code -1}) if not found or {@code null} array input
-     */
-    public static int indexOf(final double[] array, final double valueToFind, int startIndex, final double tolerance) {
-        if (ArrayUtils.isEmpty(array)) {
-            return INDEX_NOT_FOUND;
-        }
-        if (startIndex < 0) {
-            startIndex = 0;
-        }
-        final double min = valueToFind - tolerance;
-        final double max = valueToFind + tolerance;
-        for (int i = startIndex; i < array.length; i++) {
-            if (array[i] >= min && array[i] <= max) {
-                return i;
-            }
-        }
-        return INDEX_NOT_FOUND;
-    }
-
-    /**
-     * <p>Finds the last index of the given value within the array.</p>
-     *
-     * <p>This method returns {@link #INDEX_NOT_FOUND} ({@code -1}) for a {@code null} input array.</p>
-     *
-     * @param array  the array to travers backwords looking for the object, may be {@code null}
-     * @param valueToFind  the object to find
-     * @return the last index of the value within the array,
-     *  {@link #INDEX_NOT_FOUND} ({@code -1}) if not found or {@code null} array input
-     */
-    public static int lastIndexOf(final double[] array, final double valueToFind) {
-        return lastIndexOf(array, valueToFind, Integer.MAX_VALUE);
-    }
-
-    /**
-     * <p>Finds the last index of the given value within a given tolerance in the array.
-     * This method will return the index of the last value which falls between the region
-     * defined by valueToFind - tolerance and valueToFind + tolerance.</p>
-     *
-     * <p>This method returns {@link #INDEX_NOT_FOUND} ({@code -1}) for a {@code null} input array.</p>
-     *
-     * @param array  the array to search through for the object, may be {@code null}
-     * @param valueToFind  the value to find
-     * @param tolerance tolerance of the search
-     * @return the index of the value within the array,
-     *  {@link #INDEX_NOT_FOUND} ({@code -1}) if not found or {@code null} array input
-     */
-    public static int lastIndexOf(final double[] array, final double valueToFind, final double tolerance) {
-        return lastIndexOf(array, valueToFind, Integer.MAX_VALUE, tolerance);
-    }
-
-    /**
-     * <p>Finds the last index of the given value in the array starting at the given index.</p>
-     *
-     * <p>This method returns {@link #INDEX_NOT_FOUND} ({@code -1}) for a {@code null} input array.</p>
-     *
-     * <p>A negative startIndex will return {@link #INDEX_NOT_FOUND} ({@code -1}). A startIndex larger than the
-     * array length will search from the end of the array.</p>
-     *
-     * @param array  the array to traverse for looking for the object, may be {@code null}
-     * @param valueToFind  the value to find
-     * @param startIndex  the start index to travers backwards from
-     * @return the last index of the value within the array,
-     *  {@link #INDEX_NOT_FOUND} ({@code -1}) if not found or {@code null} array input
-     */
-    public static int lastIndexOf(final double[] array, final double valueToFind, int startIndex) {
-        if (ArrayUtils.isEmpty(array)) {
-            return INDEX_NOT_FOUND;
-        }
-        if (startIndex < 0) {
-            return INDEX_NOT_FOUND;
-        } else if (startIndex >= array.length) {
-            startIndex = array.length - 1;
-        }
-        for (int i = startIndex; i >= 0; i--) {
-            if (valueToFind == array[i]) {
-                return i;
-            }
-        }
-        return INDEX_NOT_FOUND;
-    }
-
-    /**
-     * <p>Finds the last index of the given value in the array starting at the given index.
-     * This method will return the index of the last value which falls between the region
-     * defined by valueToFind - tolerance and valueToFind + tolerance.</p>
-     *
-     * <p>This method returns {@link #INDEX_NOT_FOUND} ({@code -1}) for a {@code null} input array.</p>
-     *
-     * <p>A negative startIndex will return {@link #INDEX_NOT_FOUND} ({@code -1}). A startIndex larger than the
-     * array length will search from the end of the array.</p>
-     *
-     * @param array  the array to traverse for looking for the object, may be {@code null}
-     * @param valueToFind  the value to find
-     * @param startIndex  the start index to travers backwards from
-     * @param tolerance  search for value within plus/minus this amount
-     * @return the last index of the value within the array,
-     *  {@link #INDEX_NOT_FOUND} ({@code -1}) if not found or {@code null} array input
-     */
-    public static int lastIndexOf(final double[] array, final double valueToFind, int startIndex, final double tolerance) {
-        if (ArrayUtils.isEmpty(array)) {
-            return INDEX_NOT_FOUND;
-        }
-        if (startIndex < 0) {
-            return INDEX_NOT_FOUND;
-        } else if (startIndex >= array.length) {
-            startIndex = array.length - 1;
-        }
-        final double min = valueToFind - tolerance;
-        final double max = valueToFind + tolerance;
-        for (int i = startIndex; i >= 0; i--) {
-            if (array[i] >= min && array[i] <= max) {
-                return i;
-            }
-        }
-        return INDEX_NOT_FOUND;
-    }
-
-    /**
-     * <p>Checks if the value is in the given array.</p>
-     *
-     * <p>The method returns {@code false} if a {@code null} array is passed in.</p>
-     *
-     * @param array  the array to search through
-     * @param valueToFind  the value to find
-     * @return {@code true} if the array contains the object
-     */
-    public static boolean contains(final double[] array, final double valueToFind) {
-        return indexOf(array, valueToFind) != INDEX_NOT_FOUND;
-    }
-
-    /**
-     * <p>Checks if a value falling within the given tolerance is in the
-     * given array.  If the array contains a value within the inclusive range
-     * defined by (value - tolerance) to (value + tolerance).</p>
-     *
-     * <p>The method returns {@code false} if a {@code null} array
-     * is passed in.</p>
-     *
-     * @param array  the array to search
-     * @param valueToFind  the value to find
-     * @param tolerance  the array contains the tolerance of the search
-     * @return true if value falling within tolerance is in array
-     */
-    public static boolean contains(final double[] array, final double valueToFind, final double tolerance) {
-        return indexOf(array, valueToFind, 0, tolerance) != INDEX_NOT_FOUND;
-    }
-
-    // float IndexOf
-    //-----------------------------------------------------------------------
-    /**
-     * <p>Finds the index of the given value in the array.</p>
-     *
-     * <p>This method returns {@link #INDEX_NOT_FOUND} ({@code -1}) for a {@code null} input array.</p>
-     *
-     * @param array  the array to search through for the object, may be {@code null}
-     * @param valueToFind  the value to find
-     * @return the index of the value within the array,
-     *  {@link #INDEX_NOT_FOUND} ({@code -1}) if not found or {@code null} array input
-     */
-    public static int indexOf(final float[] array, final float valueToFind) {
-        return indexOf(array, valueToFind, 0);
-    }
-
-    /**
-     * <p>Finds the index of the given value in the array starting at the given index.</p>
-     *
-     * <p>This method returns {@link #INDEX_NOT_FOUND} ({@code -1}) for a {@code null} input array.</p>
-     *
-     * <p>A negative startIndex is treated as zero. A startIndex larger than the array
-     * length will return {@link #INDEX_NOT_FOUND} ({@code -1}).</p>
-     *
-     * @param array  the array to search through for the object, may be {@code null}
-     * @param valueToFind  the value to find
-     * @param startIndex  the index to start searching at
-     * @return the index of the value within the array,
-     *  {@link #INDEX_NOT_FOUND} ({@code -1}) if not found or {@code null} array input
-     */
-    public static int indexOf(final float[] array, final float valueToFind, int startIndex) {
-        if (ArrayUtils.isEmpty(array)) {
-            return INDEX_NOT_FOUND;
-        }
-        if (startIndex < 0) {
-            startIndex = 0;
-        }
-        for (int i = startIndex; i < array.length; i++) {
-            if (valueToFind == array[i]) {
-                return i;
-            }
-        }
-        return INDEX_NOT_FOUND;
-    }
-
-    /**
-     * <p>Finds the last index of the given value within the array.</p>
-     *
-     * <p>This method returns {@link #INDEX_NOT_FOUND} ({@code -1}) for a {@code null} input array.</p>
-     *
-     * @param array  the array to travers backwords looking for the object, may be {@code null}
-     * @param valueToFind  the object to find
-     * @return the last index of the value within the array,
-     *  {@link #INDEX_NOT_FOUND} ({@code -1}) if not found or {@code null} array input
-     */
-    public static int lastIndexOf(final float[] array, final float valueToFind) {
-        return lastIndexOf(array, valueToFind, Integer.MAX_VALUE);
-    }
-
-    /**
-     * <p>Finds the last index of the given value in the array starting at the given index.</p>
-     *
-     * <p>This method returns {@link #INDEX_NOT_FOUND} ({@code -1}) for a {@code null} input array.</p>
-     *
-     * <p>A negative startIndex will return {@link #INDEX_NOT_FOUND} ({@code -1}). A startIndex larger than the
-     * array length will search from the end of the array.</p>
-     *
-     * @param array  the array to traverse for looking for the object, may be {@code null}
-     * @param valueToFind  the value to find
-     * @param startIndex  the start index to travers backwards from
-     * @return the last index of the value within the array,
-     *  {@link #INDEX_NOT_FOUND} ({@code -1}) if not found or {@code null} array input
-     */
-    public static int lastIndexOf(final float[] array, final float valueToFind, int startIndex) {
-        if (ArrayUtils.isEmpty(array)) {
-            return INDEX_NOT_FOUND;
-        }
-        if (startIndex < 0) {
-            return INDEX_NOT_FOUND;
-        } else if (startIndex >= array.length) {
-            startIndex = array.length - 1;
-        }
-        for (int i = startIndex; i >= 0; i--) {
-            if (valueToFind == array[i]) {
-                return i;
-            }
-        }
-        return INDEX_NOT_FOUND;
-    }
-
-    /**
-     * <p>Checks if the value is in the given array.</p>
-     *
-     * <p>The method returns {@code false} if a {@code null} array is passed in.</p>
-     *
-     * @param array  the array to search through
-     * @param valueToFind  the value to find
-     * @return {@code true} if the array contains the object
-     */
-    public static boolean contains(final float[] array, final float valueToFind) {
-        return indexOf(array, valueToFind) != INDEX_NOT_FOUND;
-    }
-
-    // boolean IndexOf
-    //-----------------------------------------------------------------------
-    /**
-     * <p>Finds the index of the given value in the array.</p>
-     *
-     * <p>This method returns {@link #INDEX_NOT_FOUND} ({@code -1}) for a {@code null} input array.</p>
-     *
-     * @param array  the array to search through for the object, may be {@code null}
-     * @param valueToFind  the value to find
-     * @return the index of the value within the array,
-     *  {@link #INDEX_NOT_FOUND} ({@code -1}) if not found or {@code null} array input
-     */
-    public static int indexOf(final boolean[] array, final boolean valueToFind) {
-        return indexOf(array, valueToFind, 0);
-    }
-
-    /**
-     * <p>Finds the index of the given value in the array starting at the given index.</p>
-     *
-     * <p>This method returns {@link #INDEX_NOT_FOUND} ({@code -1}) for a {@code null} input array.</p>
-     *
-     * <p>A negative startIndex is treated as zero. A startIndex larger than the array
-     * length will return {@link #INDEX_NOT_FOUND} ({@code -1}).</p>
-     *
-     * @param array  the array to search through for the object, may be {@code null}
-     * @param valueToFind  the value to find
-     * @param startIndex  the index to start searching at
-     * @return the index of the value within the array,
-     *  {@link #INDEX_NOT_FOUND} ({@code -1}) if not found or {@code null}
-     *  array input
-     */
-    public static int indexOf(final boolean[] array, final boolean valueToFind, int startIndex) {
-        if (ArrayUtils.isEmpty(array)) {
-            return INDEX_NOT_FOUND;
-        }
-        if (startIndex < 0) {
-            startIndex = 0;
-        }
-        for (int i = startIndex; i < array.length; i++) {
-            if (valueToFind == array[i]) {
-                return i;
-            }
-        }
-        return INDEX_NOT_FOUND;
-    }
-
-    /**
-     * <p>Finds the last index of the given value within the array.</p>
-     *
-     * <p>This method returns {@link #INDEX_NOT_FOUND} ({@code -1}) if
-     * {@code null} array input.</p>
-     *
-     * @param array  the array to travers backwords looking for the object, may be {@code null}
-     * @param valueToFind  the object to find
-     * @return the last index of the value within the array,
-     *  {@link #INDEX_NOT_FOUND} ({@code -1}) if not found or {@code null} array input
-     */
-    public static int lastIndexOf(final boolean[] array, final boolean valueToFind) {
-        return lastIndexOf(array, valueToFind, Integer.MAX_VALUE);
-    }
-
-    /**
-     * <p>Finds the last index of the given value in the array starting at the given index.</p>
-     *
-     * <p>This method returns {@link #INDEX_NOT_FOUND} ({@code -1}) for a {@code null} input array.</p>
-     *
-     * <p>A negative startIndex will return {@link #INDEX_NOT_FOUND} ({@code -1}). A startIndex larger than
-     * the array length will search from the end of the array.</p>
-     *
-     * @param array  the array to traverse for looking for the object, may be {@code null}
-     * @param valueToFind  the value to find
-     * @param startIndex  the start index to travers backwards from
-     * @return the last index of the value within the array,
-     *  {@link #INDEX_NOT_FOUND} ({@code -1}) if not found or {@code null} array input
-     */
-    public static int lastIndexOf(final boolean[] array, final boolean valueToFind, int startIndex) {
-        if (ArrayUtils.isEmpty(array)) {
-            return INDEX_NOT_FOUND;
-        }
-        if (startIndex < 0) {
-            return INDEX_NOT_FOUND;
-        } else if (startIndex >= array.length) {
-            startIndex = array.length - 1;
-        }
-        for (int i = startIndex; i >= 0; i--) {
-            if (valueToFind == array[i]) {
-                return i;
-            }
-        }
-        return INDEX_NOT_FOUND;
-    }
-
-    /**
-     * <p>Checks if the value is in the given array.</p>
-     *
-     * <p>The method returns {@code false} if a {@code null} array is passed in.</p>
-     *
-     * @param array  the array to search through
-     * @param valueToFind  the value to find
-     * @return {@code true} if the array contains the object
-     */
-    public static boolean contains(final boolean[] array, final boolean valueToFind) {
-        return indexOf(array, valueToFind) != INDEX_NOT_FOUND;
-    }
-
-    // Primitive/Object array converters
-    // ----------------------------------------------------------------------
-
-    // Character array converters
-    // ----------------------------------------------------------------------
-    /**
-     * <p>Converts an array of object Characters to primitives.</p>
-     *
-     * <p>This method returns {@code null} for a {@code null} input array.</p>
-     *
-     * @param array  a {@code Character} array, may be {@code null}
-     * @return a {@code char} array, {@code null} if null array input
-     * @throws NullPointerException if array content is {@code null}
-     */
-    public static char[] toPrimitive(final Character[] array) {
-        if (array == null) {
-            return null;
-        } else if (array.length == 0) {
-            return EMPTY_CHAR_ARRAY;
-        }
-        final char[] result = new char[array.length];
-        for (int i = 0; i < array.length; i++) {
-            result[i] = array[i].charValue();
-        }
-        return result;
-    }
-
-    /**
-     * <p>Converts an array of object Character to primitives handling {@code null}.</p>
-     *
-     * <p>This method returns {@code null} for a {@code null} input array.</p>
-     *
-     * @param array  a {@code Character} array, may be {@code null}
-     * @param valueForNull  the value to insert if {@code null} found
-     * @return a {@code char} array, {@code null} if null array input
-     */
-    public static char[] toPrimitive(final Character[] array, final char valueForNull) {
-        if (array == null) {
-            return null;
-        } else if (array.length == 0) {
-            return EMPTY_CHAR_ARRAY;
-        }
-        final char[] result = new char[array.length];
-        for (int i = 0; i < array.length; i++) {
-            final Character b = array[i];
-            result[i] = (b == null ? valueForNull : b.charValue());
-        }
-        return result;
-    }
-
-    /**
-     * <p>Converts an array of primitive chars to objects.</p>
-     *
-     * <p>This method returns {@code null} for a {@code null} input array.</p>
-     *
-     * @param array a {@code char} array
-     * @return a {@code Character} array, {@code null} if null array input
-     */
-    public static Character[] toObject(final char[] array) {
-        if (array == null) {
-            return null;
-        } else if (array.length == 0) {
-            return EMPTY_CHARACTER_OBJECT_ARRAY;
-        }
-        final Character[] result = new Character[array.length];
-        for (int i = 0; i < array.length; i++) {
-            result[i] = Character.valueOf(array[i]);
-        }
-        return result;
-     }
-
-    // Long array converters
-    // ----------------------------------------------------------------------
-    /**
-     * <p>Converts an array of object Longs to primitives.</p>
-     *
-     * <p>This method returns {@code null} for a {@code null} input array.</p>
-     *
-     * @param array  a {@code Long} array, may be {@code null}
-     * @return a {@code long} array, {@code null} if null array input
-     * @throws NullPointerException if array content is {@code null}
-     */
-    public static long[] toPrimitive(final Long[] array) {
-        if (array == null) {
-            return null;
-        } else if (array.length == 0) {
-            return EMPTY_LONG_ARRAY;
-        }
-        final long[] result = new long[array.length];
-        for (int i = 0; i < array.length; i++) {
-            result[i] = array[i].longValue();
-        }
-        return result;
-    }
-
-    /**
-     * <p>Converts an array of object Long to primitives handling {@code null}.</p>
-     *
-     * <p>This method returns {@code null} for a {@code null} input array.</p>
-     *
-     * @param array  a {@code Long} array, may be {@code null}
-     * @param valueForNull  the value to insert if {@code null} found
-     * @return a {@code long} array, {@code null} if null array input
-     */
-    public static long[] toPrimitive(final Long[] array, final long valueForNull) {
-        if (array == null) {
-            return null;
-        } else if (array.length == 0) {
-            return EMPTY_LONG_ARRAY;
-        }
-        final long[] result = new long[array.length];
-        for (int i = 0; i < array.length; i++) {
-            final Long b = array[i];
-            result[i] = (b == null ? valueForNull : b.longValue());
-        }
-        return result;
-    }
-
-    /**
-     * <p>Converts an array of primitive longs to objects.</p>
-     *
-     * <p>This method returns {@code null} for a {@code null} input array.</p>
-     *
-     * @param array  a {@code long} array
-     * @return a {@code Long} array, {@code null} if null array input
-     */
-    public static Long[] toObject(final long[] array) {
-        if (array == null) {
-            return null;
-        } else if (array.length == 0) {
-            return EMPTY_LONG_OBJECT_ARRAY;
-        }
-        final Long[] result = new Long[array.length];
-        for (int i = 0; i < array.length; i++) {
-            result[i] = Long.valueOf(array[i]);
-        }
-        return result;
-    }
-
-    // Int array converters
-    // ----------------------------------------------------------------------
-    /**
-     * <p>Converts an array of object Integers to primitives.</p>
-     *
-     * <p>This method returns {@code null} for a {@code null} input array.</p>
-     *
-     * @param array  a {@code Integer} array, may be {@code null}
-     * @return an {@code int} array, {@code null} if null array input
-     * @throws NullPointerException if array content is {@code null}
-     */
-    public static int[] toPrimitive(final Integer[] array) {
-        if (array == null) {
-            return null;
-        } else if (array.length == 0) {
-            return EMPTY_INT_ARRAY;
-        }
-        final int[] result = new int[array.length];
-        for (int i = 0; i < array.length; i++) {
-            result[i] = array[i].intValue();
-        }
-        return result;
-    }
-
-    /**
-     * <p>Converts an array of object Integer to primitives handling {@code null}.</p>
-     *
-     * <p>This method returns {@code null} for a {@code null} input array.</p>
-     *
-     * @param array  a {@code Integer} array, may be {@code null}
-     * @param valueForNull  the value to insert if {@code null} found
-     * @return an {@code int} array, {@code null} if null array input
-     */
-    public static int[] toPrimitive(final Integer[] array, final int valueForNull) {
-        if (array == null) {
-            return null;
-        } else if (array.length == 0) {
-            return EMPTY_INT_ARRAY;
-        }
-        final int[] result = new int[array.length];
-        for (int i = 0; i < array.length; i++) {
-            final Integer b = array[i];
-            result[i] = (b == null ? valueForNull : b.intValue());
-        }
-        return result;
-    }
-
-    /**
-     * <p>Converts an array of primitive ints to objects.</p>
-     *
-     * <p>This method returns {@code null} for a {@code null} input array.</p>
-     *
-     * @param array  an {@code int} array
-     * @return an {@code Integer} array, {@code null} if null array input
-     */
-    public static Integer[] toObject(final int[] array) {
-        if (array == null) {
-            return null;
-        } else if (array.length == 0) {
-            return EMPTY_INTEGER_OBJECT_ARRAY;
-        }
-        final Integer[] result = new Integer[array.length];
-        for (int i = 0; i < array.length; i++) {
-            result[i] = Integer.valueOf(array[i]);
-        }
-        return result;
-    }
-
-    // Short array converters
-    // ----------------------------------------------------------------------
-    /**
-     * <p>Converts an array of object Shorts to primitives.</p>
-     *
-     * <p>This method returns {@code null} for a {@code null} input array.</p>
-     *
-     * @param array  a {@code Short} array, may be {@code null}
-     * @return a {@code byte} array, {@code null} if null array input
-     * @throws NullPointerException if array content is {@code null}
-     */
-    public static short[] toPrimitive(final Short[] array) {
-        if (array == null) {
-            return null;
-        } else if (array.length == 0) {
-            return EMPTY_SHORT_ARRAY;
-        }
-        final short[] result = new short[array.length];
-        for (int i = 0; i < array.length; i++) {
-            result[i] = array[i].shortValue();
-        }
-        return result;
-    }
-
-    /**
-     * <p>Converts an array of object Short to primitives handling {@code null}.</p>
-     *
-     * <p>This method returns {@code null} for a {@code null} input array.</p>
-     *
-     * @param array  a {@code Short} array, may be {@code null}
-     * @param valueForNull  the value to insert if {@code null} found
-     * @return a {@code byte} array, {@code null} if null array input
-     */
-    public static short[] toPrimitive(final Short[] array, final short valueForNull) {
-        if (array == null) {
-            return null;
-        } else if (array.length == 0) {
-            return EMPTY_SHORT_ARRAY;
-        }
-        final short[] result = new short[array.length];
-        for (int i = 0; i < array.length; i++) {
-            final Short b = array[i];
-            result[i] = (b == null ? valueForNull : b.shortValue());
-        }
-        return result;
-    }
-
-    /**
-     * <p>Converts an array of primitive shorts to objects.</p>
-     *
-     * <p>This method returns {@code null} for a {@code null} input array.</p>
-     *
-     * @param array  a {@code short} array
-     * @return a {@code Short} array, {@code null} if null array input
-     */
-    public static Short[] toObject(final short[] array) {
-        if (array == null) {
-            return null;
-        } else if (array.length == 0) {
-            return EMPTY_SHORT_OBJECT_ARRAY;
-        }
-        final Short[] result = new Short[array.length];
-        for (int i = 0; i < array.length; i++) {
-            result[i] = Short.valueOf(array[i]);
-        }
-        return result;
-    }
-
-    // Byte array converters
-    // ----------------------------------------------------------------------
-    /**
-     * <p>Converts an array of object Bytes to primitives.</p>
-     *
-     * <p>This method returns {@code null} for a {@code null} input array.</p>
-     *
-     * @param array  a {@code Byte} array, may be {@code null}
-     * @return a {@code byte} array, {@code null} if null array input
-     * @throws NullPointerException if array content is {@code null}
-     */
-    public static byte[] toPrimitive(final Byte[] array) {
-        if (array == null) {
-            return null;
-        } else if (array.length == 0) {
-            return EMPTY_BYTE_ARRAY;
-        }
-        final byte[] result = new byte[array.length];
-        for (int i = 0; i < array.length; i++) {
-            result[i] = array[i].byteValue();
-        }
-        return result;
-    }
-
-    /**
-     * <p>Converts an array of object Bytes to primitives handling {@code null}.</p>
-     *
-     * <p>This method returns {@code null} for a {@code null} input array.</p>
-     *
-     * @param array  a {@code Byte} array, may be {@code null}
-     * @param valueForNull  the value to insert if {@code null} found
-     * @return a {@code byte} array, {@code null} if null array input
-     */
-    public static byte[] toPrimitive(final Byte[] array, final byte valueForNull) {
-        if (array == null) {
-            return null;
-        } else if (array.length == 0) {
-            return EMPTY_BYTE_ARRAY;
-        }
-        final byte[] result = new byte[array.length];
-        for (int i = 0; i < array.length; i++) {
-            final Byte b = array[i];
-            result[i] = (b == null ? valueForNull : b.byteValue());
-        }
-        return result;
-    }
-
-    /**
-     * <p>Converts an array of primitive bytes to objects.</p>
-     *
-     * <p>This method returns {@code null} for a {@code null} input array.</p>
-     *
-     * @param array  a {@code byte} array
-     * @return a {@code Byte} array, {@code null} if null array input
-     */
-    public static Byte[] toObject(final byte[] array) {
-        if (array == null) {
-            return null;
-        } else if (array.length == 0) {
-            return EMPTY_BYTE_OBJECT_ARRAY;
-        }
-        final Byte[] result = new Byte[array.length];
-        for (int i = 0; i < array.length; i++) {
-            result[i] = Byte.valueOf(array[i]);
-        }
-        return result;
-    }
-
-    // Double array converters
-    // ----------------------------------------------------------------------
-    /**
-     * <p>Converts an array of object Doubles to primitives.</p>
-     *
-     * <p>This method returns {@code null} for a {@code null} input array.</p>
-     *
-     * @param array  a {@code Double} array, may be {@code null}
-     * @return a {@code double} array, {@code null} if null array input
-     * @throws NullPointerException if array content is {@code null}
-     */
-    public static double[] toPrimitive(final Double[] array) {
-        if (array == null) {
-            return null;
-        } else if (array.length == 0) {
-            return EMPTY_DOUBLE_ARRAY;
-        }
-        final double[] result = new double[array.length];
-        for (int i = 0; i < array.length; i++) {
-            result[i] = array[i].doubleValue();
-        }
-        return result;
-    }
-
-    /**
-     * <p>Converts an array of object Doubles to primitives handling {@code null}.</p>
-     *
-     * <p>This method returns {@code null} for a {@code null} input array.</p>
-     *
-     * @param array  a {@code Double} array, may be {@code null}
-     * @param valueForNull  the value to insert if {@code null} found
-     * @return a {@code double} array, {@code null} if null array input
-     */
-    public static double[] toPrimitive(final Double[] array, final double valueForNull) {
-        if (array == null) {
-            return null;
-        } else if (array.length == 0) {
-            return EMPTY_DOUBLE_ARRAY;
-        }
-        final double[] result = new double[array.length];
-        for (int i = 0; i < array.length; i++) {
-            final Double b = array[i];
-            result[i] = (b == null ? valueForNull : b.doubleValue());
-        }
-        return result;
-    }
-
-    /**
-     * <p>Converts an array of primitive doubles to objects.</p>
-     *
-     * <p>This method returns {@code null} for a {@code null} input array.</p>
-     *
-     * @param array  a {@code double} array
-     * @return a {@code Double} array, {@code null} if null array input
-     */
-    public static Double[] toObject(final double[] array) {
-        if (array == null) {
-            return null;
-        } else if (array.length == 0) {
-            return EMPTY_DOUBLE_OBJECT_ARRAY;
-        }
-        final Double[] result = new Double[array.length];
-        for (int i = 0; i < array.length; i++) {
-            result[i] = Double.valueOf(array[i]);
-        }
-        return result;
-    }
-
-    //   Float array converters
-    // ----------------------------------------------------------------------
-    /**
-     * <p>Converts an array of object Floats to primitives.</p>
-     *
-     * <p>This method returns {@code null} for a {@code null} input array.</p>
-     *
-     * @param array  a {@code Float} array, may be {@code null}
-     * @return a {@code float} array, {@code null} if null array input
-     * @throws NullPointerException if array content is {@code null}
-     */
-    public static float[] toPrimitive(final Float[] array) {
-        if (array == null) {
-            return null;
-        } else if (array.length == 0) {
-            return EMPTY_FLOAT_ARRAY;
-        }
-        final float[] result = new float[array.length];
-        for (int i = 0; i < array.length; i++) {
-            result[i] = array[i].floatValue();
-        }
-        return result;
-    }
-
-    /**
-     * <p>Converts an array of object Floats to primitives handling {@code null}.</p>
-     *
-     * <p>This method returns {@code null} for a {@code null} input array.</p>
-     *
-     * @param array  a {@code Float} array, may be {@code null}
-     * @param valueForNull  the value to insert if {@code null} found
-     * @return a {@code float} array, {@code null} if null array input
-     */
-    public static float[] toPrimitive(final Float[] array, final float valueForNull) {
-        if (array == null) {
-            return null;
-        } else if (array.length == 0) {
-            return EMPTY_FLOAT_ARRAY;
-        }
-        final float[] result = new float[array.length];
-        for (int i = 0; i < array.length; i++) {
-            final Float b = array[i];
-            result[i] = (b == null ? valueForNull : b.floatValue());
-        }
-        return result;
-    }
-
-    /**
-     * <p>Converts an array of primitive floats to objects.</p>
-     *
-     * <p>This method returns {@code null} for a {@code null} input array.</p>
-     *
-     * @param array  a {@code float} array
-     * @return a {@code Float} array, {@code null} if null array input
-     */
-    public static Float[] toObject(final float[] array) {
-        if (array == null) {
-            return null;
-        } else if (array.length == 0) {
-            return EMPTY_FLOAT_OBJECT_ARRAY;
-        }
-        final Float[] result = new Float[array.length];
-        for (int i = 0; i < array.length; i++) {
-            result[i] = Float.valueOf(array[i]);
-        }
-        return result;
-    }
-
-    // Boolean array converters
-    // ----------------------------------------------------------------------
-    /**
-     * <p>Converts an array of object Booleans to primitives.</p>
-     *
-     * <p>This method returns {@code null} for a {@code null} input array.</p>
-     *
-     * @param array  a {@code Boolean} array, may be {@code null}
-     * @return a {@code boolean} array, {@code null} if null array input
-     * @throws NullPointerException if array content is {@code null}
-     */
-    public static boolean[] toPrimitive(final Boolean[] array) {
-        if (array == null) {
-            return null;
-        } else if (array.length == 0) {
-            return EMPTY_BOOLEAN_ARRAY;
-        }
-        final boolean[] result = new boolean[array.length];
-        for (int i = 0; i < array.length; i++) {
-            result[i] = array[i].booleanValue();
-        }
-        return result;
-    }
-
-    /**
-     * <p>Converts an array of object Booleans to primitives handling {@code null}.</p>
-     *
-     * <p>This method returns {@code null} for a {@code null} input array.</p>
-     *
-     * @param array  a {@code Boolean} array, may be {@code null}
-     * @param valueForNull  the value to insert if {@code null} found
-     * @return a {@code boolean} array, {@code null} if null array input
-     */
-    public static boolean[] toPrimitive(final Boolean[] array, final boolean valueForNull) {
-        if (array == null) {
-            return null;
-        } else if (array.length == 0) {
-            return EMPTY_BOOLEAN_ARRAY;
-        }
-        final boolean[] result = new boolean[array.length];
-        for (int i = 0; i < array.length; i++) {
-            final Boolean b = array[i];
-            result[i] = (b == null ? valueForNull : b.booleanValue());
-        }
-        return result;
-    }
-
-    /**
-     * <p>Converts an array of primitive booleans to objects.</p>
-     *
-     * <p>This method returns {@code null} for a {@code null} input array.</p>
-     *
-     * @param array  a {@code boolean} array
-     * @return a {@code Boolean} array, {@code null} if null array input
-     */
-    public static Boolean[] toObject(final boolean[] array) {
-        if (array == null) {
-            return null;
-        } else if (array.length == 0) {
-            return EMPTY_BOOLEAN_OBJECT_ARRAY;
-        }
-        final Boolean[] result = new Boolean[array.length];
-        for (int i = 0; i < array.length; i++) {
-            result[i] = (array[i] ? Boolean.TRUE : Boolean.FALSE);
-        }
-        return result;
-    }
-
-    // ----------------------------------------------------------------------
-    /**
-     * <p>Checks if an array of Objects is empty or {@code null}.</p>
-     *
-     * @param array  the array to test
-     * @return {@code true} if the array is empty or {@code null}
-     * @since 2.1
-     */
-    public static boolean isEmpty(final Object[] array) {
-        return array == null || array.length == 0;
-    }
-
-    /**
-     * <p>Checks if an array of primitive longs is empty or {@code null}.</p>
-     *
-     * @param array  the array to test
-     * @return {@code true} if the array is empty or {@code null}
-     * @since 2.1
-     */
-    public static boolean isEmpty(final long[] array) {
-        return array == null || array.length == 0;
-    }
-
-    /**
-     * <p>Checks if an array of primitive ints is empty or {@code null}.</p>
-     *
-     * @param array  the array to test
-     * @return {@code true} if the array is empty or {@code null}
-     * @since 2.1
-     */
-    public static boolean isEmpty(final int[] array) {
-        return array == null || array.length == 0;
-    }
-
-    /**
-     * <p>Checks if an array of primitive shorts is empty or {@code null}.</p>
-     *
-     * @param array  the array to test
-     * @return {@code true} if the array is empty or {@code null}
-     * @since 2.1
-     */
-    public static boolean isEmpty(final short[] array) {
-        return array == null || array.length == 0;
-    }
-
-    /**
-     * <p>Checks if an array of primitive chars is empty or {@code null}.</p>
-     *
-     * @param array  the array to test
-     * @return {@code true} if the array is empty or {@code null}
-     * @since 2.1
-     */
-    public static boolean isEmpty(final char[] array) {
-        return array == null || array.length == 0;
-    }
-
-    /**
-     * <p>Checks if an array of primitive bytes is empty or {@code null}.</p>
-     *
-     * @param array  the array to test
-     * @return {@code true} if the array is empty or {@code null}
-     * @since 2.1
-     */
-    public static boolean isEmpty(final byte[] array) {
-        return array == null || array.length == 0;
-    }
-
-    /**
-     * <p>Checks if an array of primitive doubles is empty or {@code null}.</p>
-     *
-     * @param array  the array to test
-     * @return {@code true} if the array is empty or {@code null}
-     * @since 2.1
-     */
-    public static boolean isEmpty(final double[] array) {
-        return array == null || array.length == 0;
-    }
-
-    /**
-     * <p>Checks if an array of primitive floats is empty or {@code null}.</p>
-     *
-     * @param array  the array to test
-     * @return {@code true} if the array is empty or {@code null}
-     * @since 2.1
-     */
-    public static boolean isEmpty(final float[] array) {
-        return array == null || array.length == 0;
-    }
-
-    /**
-     * <p>Checks if an array of primitive booleans is empty or {@code null}.</p>
-     *
-     * @param array  the array to test
-     * @return {@code true} if the array is empty or {@code null}
-     * @since 2.1
-     */
-    public static boolean isEmpty(final boolean[] array) {
-        return array == null || array.length == 0;
-    }
-
-    // ----------------------------------------------------------------------
-    /**
-     * <p>Checks if an array of Objects is not empty or not {@code null}.</p>
-     *
-     * @param <T> the component type of the array
-     * @param array  the array to test
-     * @return {@code true} if the array is not empty or not {@code null}
-     * @since 2.5
-     */
-     public static <T> boolean isNotEmpty(final T[] array) {
-         return (array != null && array.length != 0);
-     }
-
-    /**
-     * <p>Checks if an array of primitive longs is not empty or not {@code null}.</p>
-     *
-     * @param array  the array to test
-     * @return {@code true} if the array is not empty or not {@code null}
-     * @since 2.5
-     */
-    public static boolean isNotEmpty(final long[] array) {
-        return (array != null && array.length != 0);
-    }
-
-    /**
-     * <p>Checks if an array of primitive ints is not empty or not {@code null}.</p>
-     *
-     * @param array  the array to test
-     * @return {@code true} if the array is not empty or not {@code null}
-     * @since 2.5
-     */
-    public static boolean isNotEmpty(final int[] array) {
-        return (array != null && array.length != 0);
-    }
-
-    /**
-     * <p>Checks if an array of primitive shorts is not empty or not {@code null}.</p>
-     *
-     * @param array  the array to test
-     * @return {@code true} if the array is not empty or not {@code null}
-     * @since 2.5
-     */
-    public static boolean isNotEmpty(final short[] array) {
-        return (array != null && array.length != 0);
-    }
-
-    /**
-     * <p>Checks if an array of primitive chars is not empty or not {@code null}.</p>
-     *
-     * @param array  the array to test
-     * @return {@code true} if the array is not empty or not {@code null}
-     * @since 2.5
-     */
-    public static boolean isNotEmpty(final char[] array) {
-        return (array != null && array.length != 0);
-    }
-
-    /**
-     * <p>Checks if an array of primitive bytes is not empty or not {@code null}.</p>
-     *
-     * @param array  the array to test
-     * @return {@code true} if the array is not empty or not {@code null}
-     * @since 2.5
-     */
-    public static boolean isNotEmpty(final byte[] array) {
-        return (array != null && array.length != 0);
-    }
-
-    /**
-     * <p>Checks if an array of primitive doubles is not empty or not {@code null}.</p>
-     *
-     * @param array  the array to test
-     * @return {@code true} if the array is not empty or not {@code null}
-     * @since 2.5
-     */
-    public static boolean isNotEmpty(final double[] array) {
-        return (array != null && array.length != 0);
-    }
-
-    /**
-     * <p>Checks if an array of primitive floats is not empty or not {@code null}.</p>
-     *
-     * @param array  the array to test
-     * @return {@code true} if the array is not empty or not {@code null}
-     * @since 2.5
-     */
-    public static boolean isNotEmpty(final float[] array) {
-        return (array != null && array.length != 0);
-    }
-
-    /**
-     * <p>Checks if an array of primitive booleans is not empty or not {@code null}.</p>
-     *
-     * @param array  the array to test
-     * @return {@code true} if the array is not empty or not {@code null}
-     * @since 2.5
-     */
-    public static boolean isNotEmpty(final boolean[] array) {
-        return (array != null && array.length != 0);
-    }
-
-    /**
-     * <p>Adds all the elements of the given arrays into a new array.</p>
-     * <p>The new array contains all of the element of {@code array1} followed
-     * by all of the elements {@code array2}. When an array is returned, it is always
-     * a new array.</p>
-     *
-     * <pre>
-     * ArrayUtils.addAll(null, null)     = null
-     * ArrayUtils.addAll(array1, null)   = cloned copy of array1
-     * ArrayUtils.addAll(null, array2)   = cloned copy of array2
-     * ArrayUtils.addAll([], [])         = []
-     * ArrayUtils.addAll([null], [null]) = [null, null]
-     * ArrayUtils.addAll(["a", "b", "c"], ["1", "2", "3"]) = ["a", "b", "c", "1", "2", "3"]
-     * </pre>
-     *
-     * @param <T> the component type of the array
-     * @param array1  the first array whose elements are added to the new array, may be {@code null}
-     * @param array2  the second array whose elements are added to the new array, may be {@code null}
-     * @return The new array, {@code null} if both arrays are {@code null}.
-     *      The type of the new array is the type of the first array,
-     *      unless the first array is null, in which case the type is the same as the second array.
-     * @since 2.1
-     * @throws IllegalArgumentException if the array types are incompatible
-     */
-    public static <T> T[] addAll(final T[] array1, final T... array2) {
-        if (array1 == null) {
-            return clone(array2);
-        } else if (array2 == null) {
-            return clone(array1);
-        }
-        final Class<?> type1 = array1.getClass().getComponentType();
-        @SuppressWarnings("unchecked") // OK, because array is of type T
-        final
-        T[] joinedArray = (T[]) Array.newInstance(type1, array1.length + array2.length);
-        System.arraycopy(array1, 0, joinedArray, 0, array1.length);
-        try {
-            System.arraycopy(array2, 0, joinedArray, array1.length, array2.length);
-        } catch (final ArrayStoreException ase) {
-            // Check if problem was due to incompatible types
-            /*
-             * We do this here, rather than before the copy because:
-             * - it would be a wasted check most of the time
-             * - safer, in case check turns out to be too strict
-             */
-            final Class<?> type2 = array2.getClass().getComponentType();
-            if (!type1.isAssignableFrom(type2)){
-                throw new IllegalArgumentException("Cannot store "+type2.getName()+" in an array of "
-                        +type1.getName(), ase);
-            }
-            throw ase; // No, so rethrow original
-        }
-        return joinedArray;
-    }
-
-    /**
-     * <p>Adds all the elements of the given arrays into a new array.</p>
-     * <p>The new array contains all of the element of {@code array1} followed
-     * by all of the elements {@code array2}. When an array is returned, it is always
-     * a new array.</p>
-     *
-     * <pre>
-     * ArrayUtils.addAll(array1, null)   = cloned copy of array1
-     * ArrayUtils.addAll(null, array2)   = cloned copy of array2
-     * ArrayUtils.addAll([], [])         = []
-     * </pre>
-     *
-     * @param array1  the first array whose elements are added to the new array.
-     * @param array2  the second array whose elements are added to the new array.
-     * @return The new boolean[] array.
-     * @since 2.1
-     */
-    public static boolean[] addAll(final boolean[] array1, final boolean... array2) {
-        if (array1 == null) {
-            return clone(array2);
-        } else if (array2 == null) {
-            return clone(array1);
-        }
-        final boolean[] joinedArray = new boolean[array1.length + array2.length];
-        System.arraycopy(array1, 0, joinedArray, 0, array1.length);
-        System.arraycopy(array2, 0, joinedArray, array1.length, array2.length);
-        return joinedArray;
-    }
-
-    /**
-     * <p>Adds all the elements of the given arrays into a new array.</p>
-     * <p>The new array contains all of the element of {@code array1} followed
-     * by all of the elements {@code array2}. When an array is returned, it is always
-     * a new array.</p>
-     *
-     * <pre>
-     * ArrayUtils.addAll(array1, null)   = cloned copy of array1
-     * ArrayUtils.addAll(null, array2)   = cloned copy of array2
-     * ArrayUtils.addAll([], [])         = []
-     * </pre>
-     *
-     * @param array1  the first array whose elements are added to the new array.
-     * @param array2  the second array whose elements are added to the new array.
-     * @return The new char[] array.
-     * @since 2.1
-     */
-    public static char[] addAll(final char[] array1, final char... array2) {
-        if (array1 == null) {
-            return clone(array2);
-        } else if (array2 == null) {
-            return clone(array1);
-        }
-        final char[] joinedArray = new char[array1.length + array2.length];
-        System.arraycopy(array1, 0, joinedArray, 0, array1.length);
-        System.arraycopy(array2, 0, joinedArray, array1.length, array2.length);
-        return joinedArray;
-    }
-
-    /**
-     * <p>Adds all the elements of the given arrays into a new array.</p>
-     * <p>The new array contains all of the element of {@code array1} followed
-     * by all of the elements {@code array2}. When an array is returned, it is always
-     * a new array.</p>
-     *
-     * <pre>
-     * ArrayUtils.addAll(array1, null)   = cloned copy of array1
-     * ArrayUtils.addAll(null, array2)   = cloned copy of array2
-     * ArrayUtils.addAll([], [])         = []
-     * </pre>
-     *
-     * @param array1  the first array whose elements are added to the new array.
-     * @param array2  the second array whose elements are added to the new array.
-     * @return The new byte[] array.
-     * @since 2.1
-     */
-    public static byte[] addAll(final byte[] array1, final byte... array2) {
-        if (array1 == null) {
-            return clone(array2);
-        } else if (array2 == null) {
-            return clone(array1);
-        }
-        final byte[] joinedArray = new byte[array1.length + array2.length];
-        System.arraycopy(array1, 0, joinedArray, 0, array1.length);
-        System.arraycopy(array2, 0, joinedArray, array1.length, array2.length);
-        return joinedArray;
-    }
-
-    /**
-     * <p>Adds all the elements of the given arrays into a new array.</p>
-     * <p>The new array contains all of the element of {@code array1} followed
-     * by all of the elements {@code array2}. When an array is returned, it is always
-     * a new array.</p>
-     *
-     * <pre>
-     * ArrayUtils.addAll(array1, null)   = cloned copy of array1
-     * ArrayUtils.addAll(null, array2)   = cloned copy of array2
-     * ArrayUtils.addAll([], [])         = []
-     * </pre>
-     *
-     * @param array1  the first array whose elements are added to the new array.
-     * @param array2  the second array whose elements are added to the new array.
-     * @return The new short[] array.
-     * @since 2.1
-     */
-    public static short[] addAll(final short[] array1, final short... array2) {
-        if (array1 == null) {
-            return clone(array2);
-        } else if (array2 == null) {
-            return clone(array1);
-        }
-        final short[] joinedArray = new short[array1.length + array2.length];
-        System.arraycopy(array1, 0, joinedArray, 0, array1.length);
-        System.arraycopy(array2, 0, joinedArray, array1.length, array2.length);
-        return joinedArray;
-    }
-
-    /**
-     * <p>Adds all the elements of the given arrays into a new array.</p>
-     * <p>The new array contains all of the element of {@code array1} followed
-     * by all of the elements {@code array2}. When an array is returned, it is always
-     * a new array.</p>
-     *
-     * <pre>
-     * ArrayUtils.addAll(array1, null)   = cloned copy of array1
-     * ArrayUtils.addAll(null, array2)   = cloned copy of array2
-     * ArrayUtils.addAll([], [])         = []
-     * </pre>
-     *
-     * @param array1  the first array whose elements are added to the new array.
-     * @param array2  the second array whose elements are added to the new array.
-     * @return The new int[] array.
-     * @since 2.1
-     */
-    public static int[] addAll(final int[] array1, final int... array2) {
-        if (array1 == null) {
-            return clone(array2);
-        } else if (array2 == null) {
-            return clone(array1);
-        }
-        final int[] joinedArray = new int[array1.length + array2.length];
-        System.arraycopy(array1, 0, joinedArray, 0, array1.length);
-        System.arraycopy(array2, 0, joinedArray, array1.length, array2.length);
-        return joinedArray;
-    }
-
-    /**
-     * <p>Adds all the elements of the given arrays into a new array.</p>
-     * <p>The new array contains all of the element of {@code array1} followed
-     * by all of the elements {@code array2}. When an array is returned, it is always
-     * a new array.</p>
-     *
-     * <pre>
-     * ArrayUtils.addAll(array1, null)   = cloned copy of array1
-     * ArrayUtils.addAll(null, array2)   = cloned copy of array2
-     * ArrayUtils.addAll([], [])         = []
-     * </pre>
-     *
-     * @param array1  the first array whose elements are added to the new array.
-     * @param array2  the second array whose elements are added to the new array.
-     * @return The new long[] array.
-     * @since 2.1
-     */
-    public static long[] addAll(final long[] array1, final long... array2) {
-        if (array1 == null) {
-            return clone(array2);
-        } else if (array2 == null) {
-            return clone(array1);
-        }
-        final long[] joinedArray = new long[array1.length + array2.length];
-        System.arraycopy(array1, 0, joinedArray, 0, array1.length);
-        System.arraycopy(array2, 0, joinedArray, array1.length, array2.length);
-        return joinedArray;
-    }
-
-    /**
-     * <p>Adds all the elements of the given arrays into a new array.</p>
-     * <p>The new array contains all of the element of {@code array1} followed
-     * by all of the elements {@code array2}. When an array is returned, it is always
-     * a new array.</p>
-     *
-     * <pre>
-     * ArrayUtils.addAll(array1, null)   = cloned copy of array1
-     * ArrayUtils.addAll(null, array2)   = cloned copy of array2
-     * ArrayUtils.addAll([], [])         = []
-     * </pre>
-     *
-     * @param array1  the first array whose elements are added to the new array.
-     * @param array2  the second array whose elements are added to the new array.
-     * @return The new float[] array.
-     * @since 2.1
-     */
-    public static float[] addAll(final float[] array1, final float... array2) {
-        if (array1 == null) {
-            return clone(array2);
-        } else if (array2 == null) {
-            return clone(array1);
-        }
-        final float[] joinedArray = new float[array1.length + array2.length];
-        System.arraycopy(array1, 0, joinedArray, 0, array1.length);
-        System.arraycopy(array2, 0, joinedArray, array1.length, array2.length);
-        return joinedArray;
-    }
-
-    /**
-     * <p>Adds all the elements of the given arrays into a new array.</p>
-     * <p>The new array contains all of the element of {@code array1} followed
-     * by all of the elements {@code array2}. When an array is returned, it is always
-     * a new array.</p>
-     *
-     * <pre>
-     * ArrayUtils.addAll(array1, null)   = cloned copy of array1
-     * ArrayUtils.addAll(null, array2)   = cloned copy of array2
-     * ArrayUtils.addAll([], [])         = []
-     * </pre>
-     *
-     * @param array1  the first array whose elements are added to the new array.
-     * @param array2  the second array whose elements are added to the new array.
-     * @return The new double[] array.
-     * @since 2.1
-     */
-    public static double[] addAll(final double[] array1, final double... array2) {
-        if (array1 == null) {
-            return clone(array2);
-        } else if (array2 == null) {
-            return clone(array1);
-        }
-        final double[] joinedArray = new double[array1.length + array2.length];
-        System.arraycopy(array1, 0, joinedArray, 0, array1.length);
-        System.arraycopy(array2, 0, joinedArray, array1.length, array2.length);
-        return joinedArray;
-    }
-
-    /**
-     * <p>Copies the given array and adds the given element at the end of the new array.</p>
-     *
-     * <p>The new array contains the same elements of the input
-     * array plus the given element in the last position. The component type of
-     * the new array is the same as that of the input array.</p>
-     *
-     * <p>If the input array is {@code null}, a new one element array is returned
-     *  whose component type is the same as the element, unless the element itself is null,
-     *  in which case the return type is Object[]</p>
-     *
-     * <pre>
-     * ArrayUtils.add(null, null)      = [null]
-     * ArrayUtils.add(null, "a")       = ["a"]
-     * ArrayUtils.add(["a"], null)     = ["a", null]
-     * ArrayUtils.add(["a"], "b")      = ["a", "b"]
-     * ArrayUtils.add(["a", "b"], "c") = ["a", "b", "c"]
-     * </pre>
-     *
-     * @param <T> the component type of the array
-     * @param array  the array to "add" the element to, may be {@code null}
-     * @param element  the object to add, may be {@code null}
-     * @return A new array containing the existing elements plus the new element
-     * The returned array type will be that of the input array (unless null),
-     * in which case it will have the same type as the element.
-     * If both are null, an IllegalArgumentException is thrown
-     * @since 2.1
-     * @throws IllegalArgumentException if both arguments are null
-     */
-    public static <T> T[] add(final T[] array, final T element) {
-        Class<?> type;
-        if (array != null){
-            type = array.getClass().getComponentType();
-        } else if (element != null) {
-            type = element.getClass();
-        } else {
-            throw new IllegalArgumentException("Arguments cannot both be null");
-        }
-        @SuppressWarnings("unchecked") // type must be T
-        final
-        T[] newArray = (T[]) copyArrayGrow1(array, type);
-        newArray[newArray.length - 1] = element;
-        return newArray;
-    }
-
-    /**
-     * <p>Copies the given array and adds the given element at the end of the new array.</p>
-     *
-     * <p>The new array contains the same elements of the input
-     * array plus the given element in the last position. The component type of
-     * the new array is the same as that of the input array.</p>
-     *
-     * <p>If the input array is {@code null}, a new one element array is returned
-     *  whose component type is the same as the element.</p>
-     *
-     * <pre>
-     * ArrayUtils.add(null, true)          = [true]
-     * ArrayUtils.add([true], false)       = [true, false]
-     * ArrayUtils.add([true, false], true) = [true, false, true]
-     * </pre>
-     *
-     * @param array  the array to copy and add the element to, may be {@code null}
-     * @param element  the object to add at the last index of the new array
-     * @return A new array containing the existing elements plus the new element
-     * @since 2.1
-     */
-    public static boolean[] add(final boolean[] array, final boolean element) {
-        final boolean[] newArray = (boolean[])copyArrayGrow1(array, Boolean.TYPE);
-        newArray[newArray.length - 1] = element;
-        return newArray;
-    }
-
-    /**
-     * <p>Copies the given array and adds the given element at the end of the new array.</p>
-     *
-     * <p>The new array contains the same elements of the input
-     * array plus the given element in the last position. The component type of
-     * the new array is the same as that of the input array.</p>
-     *
-     * <p>If the input array is {@code null}, a new one element array is returned
-     *  whose component type is the same as the element.</p>
-     *
-     * <pre>
-     * ArrayUtils.add(null, 0)   = [0]
-     * ArrayUtils.add([1], 0)    = [1, 0]
-     * ArrayUtils.add([1, 0], 1) = [1, 0, 1]
-     * </pre>
-     *
-     * @param array  the array to copy and add the element to, may be {@code null}
-     * @param element  the object to add at the last index of the new array
-     * @return A new array containing the existing elements plus the new element
-     * @since 2.1
-     */
-    public static byte[] add(final byte[] array, final byte element) {
-        final byte[] newArray = (byte[])copyArrayGrow1(array, Byte.TYPE);
-        newArray[newArray.length - 1] = element;
-        return newArray;
-    }
-
-    /**
-     * <p>Copies the given array and adds the given element at the end of the new array.</p>
-     *
-     * <p>The new array contains the same elements of the input
-     * array plus the given element in the last position. The component type of
-     * the new array is the same as that of the input array.</p>
-     *
-     * <p>If the input array is {@code null}, a new one element array is returned
-     *  whose component type is the same as the element.</p>
-     *
-     * <pre>
-     * ArrayUtils.add(null, '0')       = ['0']
-     * ArrayUtils.add(['1'], '0')      = ['1', '0']
-     * ArrayUtils.add(['1', '0'], '1') = ['1', '0', '1']
-     * </pre>
-     *
-     * @param array  the array to copy and add the element to, may be {@code null}
-     * @param element  the object to add at the last index of the new array
-     * @return A new array containing the existing elements plus the new element
-     * @since 2.1
-     */
-    public static char[] add(final char[] array, final char element) {
-        final char[] newArray = (char[])copyArrayGrow1(array, Character.TYPE);
-        newArray[newArray.length - 1] = element;
-        return newArray;
-    }
-
-    /**
-     * <p>Copies the given array and adds the given element at the end of the new array.</p>
-     *
-     * <p>The new array contains the same elements of the input
-     * array plus the given element in the last position. The component type of
-     * the new array is the same as that of the input array.</p>
-     *
-     * <p>If the input array is {@code null}, a new one element array is returned
-     *  whose component type is the same as the element.</p>
-     *
-     * <pre>
-     * ArrayUtils.add(null, 0)   = [0]
-     * ArrayUtils.add([1], 0)    = [1, 0]
-     * ArrayUtils.add([1, 0], 1) = [1, 0, 1]
-     * </pre>
-     *
-     * @param array  the array to copy and add the element to, may be {@code null}
-     * @param element  the object to add at the last index of the new array
-     * @return A new array containing the existing elements plus the new element
-     * @since 2.1
-     */
-    public static double[] add(final double[] array, final double element) {
-        final double[] newArray = (double[])copyArrayGrow1(array, Double.TYPE);
-        newArray[newArray.length - 1] = element;
-        return newArray;
-    }
-
-    /**
-     * <p>Copies the given array and adds the given element at the end of the new array.</p>
-     *
-     * <p>The new array contains the same elements of the input
-     * array plus the given element in the last position. The component type of
-     * the new array is the same as that of the input array.</p>
-     *
-     * <p>If the input array is {@code null}, a new one element array is returned
-     *  whose component type is the same as the element.</p>
-     *
-     * <pre>
-     * ArrayUtils.add(null, 0)   = [0]
-     * ArrayUtils.add([1], 0)    = [1, 0]
-     * ArrayUtils.add([1, 0], 1) = [1, 0, 1]
-     * </pre>
-     *
-     * @param array  the array to copy and add the element to, may be {@code null}
-     * @param element  the object to add at the last index of the new array
-     * @return A new array containing the existing elements plus the new element
-     * @since 2.1
-     */
-    public static float[] add(final float[] array, final float element) {
-        final float[] newArray = (float[])copyArrayGrow1(array, Float.TYPE);
-        newArray[newArray.length - 1] = element;
-        return newArray;
-    }
-
-    /**
-     * <p>Copies the given array and adds the given element at the end of the new array.</p>
-     *
-     * <p>The new array contains the same elements of the input
-     * array plus the given element in the last position. The component type of
-     * the new array is the same as that of the input array.</p>
-     *
-     * <p>If the input array is {@code null}, a new one element array is returned
-     *  whose component type is the same as the element.</p>
-     *
-     * <pre>
-     * ArrayUtils.add(null, 0)   = [0]
-     * ArrayUtils.add([1], 0)    = [1, 0]
-     * ArrayUtils.add([1, 0], 1) = [1, 0, 1]
-     * </pre>
-     *
-     * @param array  the array to copy and add the element to, may be {@code null}
-     * @param element  the object to add at the last index of the new array
-     * @return A new array containing the existing elements plus the new element
-     * @since 2.1
-     */
-    public static int[] add(final int[] array, final int element) {
-        final int[] newArray = (int[])copyArrayGrow1(array, Integer.TYPE);
-        newArray[newArray.length - 1] = element;
-        return newArray;
-    }
-
-    /**
-     * <p>Copies the given array and adds the given element at the end of the new array.</p>
-     *
-     * <p>The new array contains the same elements of the input
-     * array plus the given element in the last position. The component type of
-     * the new array is the same as that of the input array.</p>
-     *
-     * <p>If the input array is {@code null}, a new one element array is returned
-     *  whose component type is the same as the element.</p>
-     *
-     * <pre>
-     * ArrayUtils.add(null, 0)   = [0]
-     * ArrayUtils.add([1], 0)    = [1, 0]
-     * ArrayUtils.add([1, 0], 1) = [1, 0, 1]
-     * </pre>
-     *
-     * @param array  the array to copy and add the element to, may be {@code null}
-     * @param element  the object to add at the last index of the new array
-     * @return A new array containing the existing elements plus the new element
-     * @since 2.1
-     */
-    public static long[] add(final long[] array, final long element) {
-        final long[] newArray = (long[])copyArrayGrow1(array, Long.TYPE);
-        newArray[newArray.length - 1] = element;
-        return newArray;
-    }
-
-    /**
-     * <p>Copies the given array and adds the given element at the end of the new array.</p>
-     *
-     * <p>The new array contains the same elements of the input
-     * array plus the given element in the last position. The component type of
-     * the new array is the same as that of the input array.</p>
-     *
-     * <p>If the input array is {@code null}, a new one element array is returned
-     *  whose component type is the same as the element.</p>
-     *
-     * <pre>
-     * ArrayUtils.add(null, 0)   = [0]
-     * ArrayUtils.add([1], 0)    = [1, 0]
-     * ArrayUtils.add([1, 0], 1) = [1, 0, 1]
-     * </pre>
-     *
-     * @param array  the array to copy and add the element to, may be {@code null}
-     * @param element  the object to add at the last index of the new array
-     * @return A new array containing the existing elements plus the new element
-     * @since 2.1
-     */
-    public static short[] add(final short[] array, final short element) {
-        final short[] newArray = (short[])copyArrayGrow1(array, Short.TYPE);
-        newArray[newArray.length - 1] = element;
-        return newArray;
-    }
-
-    /**
-     * Returns a copy of the given array of size 1 greater than the argument.
-     * The last value of the array is left to the default value.
-     *
-     * @param array The array to copy, must not be {@code null}.
-     * @param newArrayComponentType If {@code array} is {@code null}, create a
-     * size 1 array of this type.
-     * @return A new copy of the array of size 1 greater than the input.
-     */
-    private static Object copyArrayGrow1(final Object array, final Class<?> newArrayComponentType) {
-        if (array != null) {
-            final int arrayLength = Array.getLength(array);
-            final Object newArray = Array.newInstance(array.getClass().getComponentType(), arrayLength + 1);
-            System.arraycopy(array, 0, newArray, 0, arrayLength);
-            return newArray;
-        }
-        return Array.newInstance(newArrayComponentType, 1);
-    }
-
-    /**
-     * <p>Inserts the specified element at the specified position in the array.
-     * Shifts the element currently at that position (if any) and any subsequent
-     * elements to the right (adds one to their indices).</p>
-     *
-     * <p>This method returns a new array with the same elements of the input
-     * array plus the given element on the specified position. The component
-     * type of the returned array is always the same as that of the input
-     * array.</p>
-     *
-     * <p>If the input array is {@code null}, a new one element array is returned
-     *  whose component type is the same as the element.</p>
-     *
-     * <pre>
-     * ArrayUtils.add(null, 0, null)      = [null]
-     * ArrayUtils.add(null, 0, "a")       = ["a"]
-     * ArrayUtils.add(["a"], 1, null)     = ["a", null]
-     * ArrayUtils.add(["a"], 1, "b")      = ["a", "b"]
-     * ArrayUtils.add(["a", "b"], 3, "c") = ["a", "b", "c"]
-     * </pre>
-     *
-     * @param <T> the component type of the array
-     * @param array  the array to add the element to, may be {@code null}
-     * @param index  the position of the new object
-     * @param element  the object to add
-     * @return A new array containing the existing elements and the new element
-     * @throws IndexOutOfBoundsException if the index is out of range (index &lt; 0 || index &gt; array.length).
-     * @throws IllegalArgumentException if both array and element are null
-     */
-    public static <T> T[] add(final T[] array, final int index, final T element) {
-        Class<?> clss = null;
-        if (array != null) {
-            clss = array.getClass().getComponentType();
-        } else if (element != null) {
-            clss = element.getClass();
-        } else {
-            throw new IllegalArgumentException("Array and element cannot both be null");
-        }
-        @SuppressWarnings("unchecked") // the add method creates an array of type clss, which is type T
-        final T[] newArray = (T[]) add(array, index, element, clss);
-        return newArray;
-    }
-
-    /**
-     * <p>Inserts the specified element at the specified position in the array.
-     * Shifts the element currently at that position (if any) and any subsequent
-     * elements to the right (adds one to their indices).</p>
-     *
-     * <p>This method returns a new array with the same elements of the input
-     * array plus the given element on the specified position. The component
-     * type of the returned array is always the same as that of the input
-     * array.</p>
-     *
-     * <p>If the input array is {@code null}, a new one element array is returned
-     *  whose component type is the same as the element.</p>
-     *
-     * <pre>
-     * ArrayUtils.add(null, 0, true)          = [true]
-     * ArrayUtils.add([true], 0, false)       = [false, true]
-     * ArrayUtils.add([false], 1, true)       = [false, true]
-     * ArrayUtils.add([true, false], 1, true) = [true, true, false]
-     * </pre>
-     *
-     * @param array  the array to add the element to, may be {@code null}
-     * @param index  the position of the new object
-     * @param element  the object to add
-     * @return A new array containing the existing elements and the new element
-     * @throws IndexOutOfBoundsException if the index is out of range (index &lt; 0 || index &gt; array.length).
-     */
-    public static boolean[] add(final boolean[] array, final int index, final boolean element) {
-        return (boolean[]) add(array, index, Boolean.valueOf(element), Boolean.TYPE);
-    }
-
-    /**
-     * <p>Inserts the specified element at the specified position in the array.
-     * Shifts the element currently at that position (if any) and any subsequent
-     * elements to the right (adds one to their indices).</p>
-     *
-     * <p>This method returns a new array with the same elements of the input
-     * array plus the given element on the specified position. The component
-     * type of the returned array is always the same as that of the input
-     * array.</p>
-     *
-     * <p>If the input array is {@code null}, a new one element array is returned
-     *  whose component type is the same as the element.</p>
-     *
-     * <pre>
-     * ArrayUtils.add(null, 0, 'a')            = ['a']
-     * ArrayUtils.add(['a'], 0, 'b')           = ['b', 'a']
-     * ArrayUtils.add(['a', 'b'], 0, 'c')      = ['c', 'a', 'b']
-     * ArrayUtils.add(['a', 'b'], 1, 'k')      = ['a', 'k', 'b']
-     * ArrayUtils.add(['a', 'b', 'c'], 1, 't') = ['a', 't', 'b', 'c']
-     * </pre>
-     *
-     * @param array  the array to add the element to, may be {@code null}
-     * @param index  the position of the new object
-     * @param element  the object to add
-     * @return A new array containing the existing elements and the new element
-     * @throws IndexOutOfBoundsException if the index is out of range
-     * (index &lt; 0 || index &gt; array.length).
-     */
-    public static char[] add(final char[] array, final int index, final char element) {
-        return (char[]) add(array, index, Character.valueOf(element), Character.TYPE);
-    }
-
-    /**
-     * <p>Inserts the specified element at the specified position in the array.
-     * Shifts the element currently at that position (if any) and any subsequent
-     * elements to the right (adds one to their indices).</p>
-     *
-     * <p>This method returns a new array with the same elements of the input
-     * array plus the given element on the specified position. The component
-     * type of the returned array is always the same as that of the input
-     * array.</p>
-     *
-     * <p>If the input array is {@code null}, a new one element array is returned
-     *  whose component type is the same as the element.</p>
-     *
-     * <pre>
-     * ArrayUtils.add([1], 0, 2)         = [2, 1]
-     * ArrayUtils.add([2, 6], 2, 3)      = [2, 6, 3]
-     * ArrayUtils.add([2, 6], 0, 1)      = [1, 2, 6]
-     * ArrayUtils.add([2, 6, 3], 2, 1)   = [2, 6, 1, 3]
-     * </pre>
-     *
-     * @param array  the array to add the element to, may be {@code null}
-     * @param index  the position of the new object
-     * @param element  the object to add
-     * @return A new array containing the existing elements and the new element
-     * @throws IndexOutOfBoundsException if the index is out of range
-     * (index &lt; 0 || index &gt; array.length).
-     */
-    public static byte[] add(final byte[] array, final int index, final byte element) {
-        return (byte[]) add(array, index, Byte.valueOf(element), Byte.TYPE);
-    }
-
-    /**
-     * <p>Inserts the specified element at the specified position in the array.
-     * Shifts the element currently at that position (if any) and any subsequent
-     * elements to the right (adds one to their indices).</p>
-     *
-     * <p>This method returns a new array with the same elements of the input
-     * array plus the given element on the specified position. The component
-     * type of the returned array is always the same as that of the input
-     * array.</p>
-     *
-     * <p>If the input array is {@code null}, a new one element array is returned
-     *  whose component type is the same as the element.</p>
-     *
-     * <pre>
-     * ArrayUtils.add([1], 0, 2)         = [2, 1]
-     * ArrayUtils.add([2, 6], 2, 10)     = [2, 6, 10]
-     * ArrayUtils.add([2, 6], 0, -4)     = [-4, 2, 6]
-     * ArrayUtils.add([2, 6, 3], 2, 1)   = [2, 6, 1, 3]
-     * </pre>
-     *
-     * @param array  the array to add the element to, may be {@code null}
-     * @param index  the position of the new object
-     * @param element  the object to add
-     * @return A new array containing the existing elements and the new element
-     * @throws IndexOutOfBoundsException if the index is out of range
-     * (index &lt; 0 || index &gt; array.length).
-     */
-    public static short[] add(final short[] array, final int index, final short element) {
-        return (short[]) add(array, index, Short.valueOf(element), Short.TYPE);
-    }
-
-    /**
-     * <p>Inserts the specified element at the specified position in the array.
-     * Shifts the element currently at that position (if any) and any subsequent
-     * elements to the right (adds one to their indices).</p>
-     *
-     * <p>This method returns a new array with the same elements of the input
-     * array plus the given element on the specified position. The component
-     * type of the returned array is always the same as that of the input
-     * array.</p>
-     *
-     * <p>If the input array is {@code null}, a new one element array is returned
-     *  whose component type is the same as the element.</p>
-     *
-     * <pre>
-     * ArrayUtils.add([1], 0, 2)         = [2, 1]
-     * ArrayUtils.add([2, 6], 2, 10)     = [2, 6, 10]
-     * ArrayUtils.add([2, 6], 0, -4)     = [-4, 2, 6]
-     * ArrayUtils.add([2, 6, 3], 2, 1)   = [2, 6, 1, 3]
-     * </pre>
-     *
-     * @param array  the array to add the element to, may be {@code null}
-     * @param index  the position of the new object
-     * @param element  the object to add
-     * @return A new array containing the existing elements and the new element
-     * @throws IndexOutOfBoundsException if the index is out of range
-     * (index &lt; 0 || index &gt; array.length).
-     */
-    public static int[] add(final int[] array, final int index, final int element) {
-        return (int[]) add(array, index, Integer.valueOf(element), Integer.TYPE);
-    }
-
-    /**
-     * <p>Inserts the specified element at the specified position in the array.
-     * Shifts the element currently at that position (if any) and any subsequent
-     * elements to the right (adds one to their indices).</p>
-     *
-     * <p>This method returns a new array with the same elements of the input
-     * array plus the given element on the specified position. The component
-     * type of the returned array is always the same as that of the input
-     * array.</p>
-     *
-     * <p>If the input array is {@code null}, a new one element array is returned
-     *  whose component type is the same as the element.</p>
-     *
-     * <pre>
-     * ArrayUtils.add([1L], 0, 2L)           = [2L, 1L]
-     * ArrayUtils.add([2L, 6L], 2, 10L)      = [2L, 6L, 10L]
-     * ArrayUtils.add([2L, 6L], 0, -4L)      = [-4L, 2L, 6L]
-     * ArrayUtils.add([2L, 6L, 3L], 2, 1L)   = [2L, 6L, 1L, 3L]
-     * </pre>
-     *
-     * @param array  the array to add the element to, may be {@code null}
-     * @param index  the position of the new object
-     * @param element  the object to add
-     * @return A new array containing the existing elements and the new element
-     * @throws IndexOutOfBoundsException if the index is out of range
-     * (index &lt; 0 || index &gt; array.length).
-     */
-    public static long[] add(final long[] array, final int index, final long element) {
-        return (long[]) add(array, index, Long.valueOf(element), Long.TYPE);
-    }
-
-    /**
-     * <p>Inserts the specified element at the specified position in the array.
-     * Shifts the element currently at that position (if any) and any subsequent
-     * elements to the right (adds one to their indices).</p>
-     *
-     * <p>This method returns a new array with the same elements of the input
-     * array plus the given element on the specified position. The component
-     * type of the returned array is always the same as that of the input
-     * array.</p>
-     *
-     * <p>If the input array is {@code null}, a new one element array is returned
-     *  whose component type is the same as the element.</p>
-     *
-     * <pre>
-     * ArrayUtils.add([1.1f], 0, 2.2f)               = [2.2f, 1.1f]
-     * ArrayUtils.add([2.3f, 6.4f], 2, 10.5f)        = [2.3f, 6.4f, 10.5f]
-     * ArrayUtils.add([2.6f, 6.7f], 0, -4.8f)        = [-4.8f, 2.6f, 6.7f]
-     * ArrayUtils.add([2.9f, 6.0f, 0.3f], 2, 1.0f)   = [2.9f, 6.0f, 1.0f, 0.3f]
-     * </pre>
-     *
-     * @param array  the array to add the element to, may be {@code null}
-     * @param index  the position of the new object
-     * @param element  the object to add
-     * @return A new array containing the existing elements and the new element
-     * @throws IndexOutOfBoundsException if the index is out of range
-     * (index &lt; 0 || index &gt; array.length).
-     */
-    public static float[] add(final float[] array, final int index, final float element) {
-        return (float[]) add(array, index, Float.valueOf(element), Float.TYPE);
-    }
-
-    /**
-     * <p>Inserts the specified element at the specified position in the array.
-     * Shifts the element currently at that position (if any) and any subsequent
-     * elements to the right (adds one to their indices).</p>
-     *
-     * <p>This method returns a new array with the same elements of the input
-     * array plus the given element on the specified position. The component
-     * type of the returned array is always the same as that of the input
-     * array.</p>
-     *
-     * <p>If the input array is {@code null}, a new one element array is returned
-     *  whose component type is the same as the element.</p>
-     *
-     * <pre>
-     * ArrayUtils.add([1.1], 0, 2.2)              = [2.2, 1.1]
-     * ArrayUtils.add([2.3, 6.4], 2, 10.5)        = [2.3, 6.4, 10.5]
-     * ArrayUtils.add([2.6, 6.7], 0, -4.8)        = [-4.8, 2.6, 6.7]
-     * ArrayUtils.add([2.9, 6.0, 0.3], 2, 1.0)    = [2.9, 6.0, 1.0, 0.3]
-     * </pre>
-     *
-     * @param array  the array to add the element to, may be {@code null}
-     * @param index  the position of the new object
-     * @param element  the object to add
-     * @return A new array containing the existing elements and the new element
-     * @throws IndexOutOfBoundsException if the index is out of range
-     * (index &lt; 0 || index &gt; array.length).
-     */
-    public static double[] add(final double[] array, final int index, final double element) {
-        return (double[]) add(array, index, Double.valueOf(element), Double.TYPE);
-    }
-
-    /**
-     * Underlying implementation of add(array, index, element) methods.
-     * The last parameter is the class, which may not equal element.getClass
-     * for primitives.
-     *
-     * @param array  the array to add the element to, may be {@code null}
-     * @param index  the position of the new object
-     * @param element  the object to add
-     * @param clss the type of the element being added
-     * @return A new array containing the existing elements and the new element
-     */
-    private static Object add(final Object array, final int index, final Object element, final Class<?> clss) {
-        if (array == null) {
-            if (index != 0) {
-                throw new IndexOutOfBoundsException("Index: " + index + ", Length: 0");
-            }
-            final Object joinedArray = Array.newInstance(clss, 1);
-            Array.set(joinedArray, 0, element);
-            return joinedArray;
-        }
-        final int length = Array.getLength(array);
-        if (index > length || index < 0) {
-            throw new IndexOutOfBoundsException("Index: " + index + ", Length: " + length);
-        }
-        final Object result = Array.newInstance(clss, length + 1);
-        System.arraycopy(array, 0, result, 0, index);
-        Array.set(result, index, element);
-        if (index < length) {
-            System.arraycopy(array, index, result, index + 1, length - index);
-        }
-        return result;
-    }
-
-    /**
-     * <p>Removes the element at the specified position from the specified array.
-     * All subsequent elements are shifted to the left (subtracts one from
-     * their indices).</p>
-     *
-     * <p>This method returns a new array with the same elements of the input
-     * array except the element on the specified position. The component
-     * type of the returned array is always the same as that of the input
-     * array.</p>
-     *
-     * <p>If the input array is {@code null}, an IndexOutOfBoundsException
-     * will be thrown, because in that case no valid index can be specified.</p>
-     *
-     * <pre>
-     * ArrayUtils.remove(["a"], 0)           = []
-     * ArrayUtils.remove(["a", "b"], 0)      = ["b"]
-     * ArrayUtils.remove(["a", "b"], 1)      = ["a"]
-     * ArrayUtils.remove(["a", "b", "c"], 1) = ["a", "c"]
-     * </pre>
-     *
-     * @param <T> the component type of the array
-     * @param array  the array to remove the element from, may not be {@code null}
-     * @param index  the position of the element to be removed
-     * @return A new array containing the existing elements except the element
-     *         at the specified position.
-     * @throws IndexOutOfBoundsException if the index is out of range
-     * (index &lt; 0 || index &gt;= array.length), or if the array is {@code null}.
-     * @since 2.1
-     */
-    @SuppressWarnings("unchecked") // remove() always creates an array of the same type as its input
-    public static <T> T[] remove(final T[] array, final int index) {
-        return (T[]) remove((Object) array, index);
-    }
-
-    /**
-     * <p>Removes the first occurrence of the specified element from the
-     * specified array. All subsequent elements are shifted to the left
-     * (subtracts one from their indices). If the array doesn't contains
-     * such an element, no elements are removed from the array.</p>
-     *
-     * <p>This method returns a new array with the same elements of the input
-     * array except the first occurrence of the specified element. The component
-     * type of the returned array is always the same as that of the input
-     * array.</p>
-     *
-     * <pre>
-     * ArrayUtils.removeElement(null, "a")            = null
-     * ArrayUtils.removeElement([], "a")              = []
-     * ArrayUtils.removeElement(["a"], "b")           = ["a"]
-     * ArrayUtils.removeElement(["a", "b"], "a")      = ["b"]
-     * ArrayUtils.removeElement(["a", "b", "a"], "a") = ["b", "a"]
-     * </pre>
-     *
-     * @param <T> the component type of the array
-     * @param array  the array to remove the element from, may be {@code null}
-     * @param element  the element to be removed
-     * @return A new array containing the existing elements except the first
-     *         occurrence of the specified element.
-     * @since 2.1
-     */
-    public static <T> T[] removeElement(final T[] array, final Object element) {
-        final int index = indexOf(array, element);
-        if (index == INDEX_NOT_FOUND) {
-            return clone(array);
-        }
-        return remove(array, index);
-    }
-
-    /**
-     * <p>Removes the element at the specified position from the specified array.
-     * All subsequent elements are shifted to the left (subtracts one from
-     * their indices).</p>
-     *
-     * <p>This method returns a new array with the same elements of the input
-     * array except the element on the specified position. The component
-     * type of the returned array is always the same as that of the input
-     * array.</p>
-     *
-     * <p>If the input array is {@code null}, an IndexOutOfBoundsException
-     * will be thrown, because in that case no valid index can be specified.</p>
-     *
-     * <pre>
-     * ArrayUtils.remove([true], 0)              = []
-     * ArrayUtils.remove([true, false], 0)       = [false]
-     * ArrayUtils.remove([true, false], 1)       = [true]
-     * ArrayUtils.remove([true, true, false], 1) = [true, false]
-     * </pre>
-     *
-     * @param array  the array to remove the element from, may not be {@code null}
-     * @param index  the position of the element to be removed
-     * @return A new array containing the existing elements except the element
-     *         at the specified position.
-     * @throws IndexOutOfBoundsException if the index is out of range
-     * (index &lt; 0 || index &gt;= array.length), or if the array is {@code null}.
-     * @since 2.1
-     */
-    public static boolean[] remove(final boolean[] array, final int index) {
-        return (boolean[]) remove((Object) array, index);
-    }
-
-    /**
-     * <p>Removes the first occurrence of the specified element from the
-     * specified array. All subsequent elements are shifted to the left
-     * (subtracts one from their indices). If the array doesn't contains
-     * such an element, no elements are removed from the array.</p>
-     *
-     * <p>This method returns a new array with the same elements of the input
-     * array except the first occurrence of the specified element. The component
-     * type of the returned array is always the same as that of the input
-     * array.</p>
-     *
-     * <pre>
-     * ArrayUtils.removeElement(null, true)                = null
-     * ArrayUtils.removeElement([], true)                  = []
-     * ArrayUtils.removeElement([true], false)             = [true]
-     * ArrayUtils.removeElement([true, false], false)      = [true]
-     * ArrayUtils.removeElement([true, false, true], true) = [false, true]
-     * </pre>
-     *
-     * @param array  the array to remove the element from, may be {@code null}
-     * @param element  the element to be removed
-     * @return A new array containing the existing elements except the first
-     *         occurrence of the specified element.
-     * @since 2.1
-     */
-    public static boolean[] removeElement(final boolean[] array, final boolean element) {
-        final int index = indexOf(array, element);
-        if (index == INDEX_NOT_FOUND) {
-            return clone(array);
-        }
-        return remove(array, index);
-    }
-
-    /**
-     * <p>Removes the element at the specified position from the specified array.
-     * All subsequent elements are shifted to the left (subtracts one from
-     * their indices).</p>
-     *
-     * <p>This method returns a new array with the same elements of the input
-     * array except the element on the specified position. The component
-     * type of the returned array is always the same as that of the input
-     * array.</p>
-     *
-     * <p>If the input array is {@code null}, an IndexOutOfBoundsException
-     * will be thrown, because in that case no valid index can be specified.</p>
-     *
-     * <pre>
-     * ArrayUtils.remove([1], 0)          = []
-     * ArrayUtils.remove([1, 0], 0)       = [0]
-     * ArrayUtils.remove([1, 0], 1)       = [1]
-     * ArrayUtils.remove([1, 0, 1], 1)    = [1, 1]
-     * </pre>
-     *
-     * @param array  the array to remove the element from, may not be {@code null}
-     * @param index  the position of the element to be removed
-     * @return A new array containing the existing elements except the element
-     *         at the specified position.
-     * @throws IndexOutOfBoundsException if the index is out of range
-     * (index &lt; 0 || index &gt;= array.length), or if the array is {@code null}.
-     * @since 2.1
-     */
-    public static byte[] remove(final byte[] array, final int index) {
-        return (byte[]) remove((Object) array, index);
-    }
-
-    /**
-     * <p>Removes the first occurrence of the specified element from the
-     * specified array. All subsequent elements are shifted to the left
-     * (subtracts one from their indices). If the array doesn't contains
-     * such an element, no elements are removed from the array.</p>
-     *
-     * <p>This method returns a new array with the same elements of the input
-     * array except the first occurrence of the specified element. The component
-     * type of the returned array is always the same as that of the input
-     * array.</p>
-     *
-     * <pre>
-     * ArrayUtils.removeElement(null, 1)        = null
-     * ArrayUtils.removeElement([], 1)          = []
-     * ArrayUtils.removeElement([1], 0)         = [1]
-     * ArrayUtils.removeElement([1, 0], 0)      = [1]
-     * ArrayUtils.removeElement([1, 0, 1], 1)   = [0, 1]
-     * </pre>
-     *
-     * @param array  the array to remove the element from, may be {@code null}
-     * @param element  the element to be removed
-     * @return A new array containing the existing elements except the first
-     *         occurrence of the specified element.
-     * @since 2.1
-     */
-    public static byte[] removeElement(final byte[] array, final byte element) {
-        final int index = indexOf(array, element);
-        if (index == INDEX_NOT_FOUND) {
-            return clone(array);
-        }
-        return remove(array, index);
-    }
-
-    /**
-     * <p>Removes the element at the specified position from the specified array.
-     * All subsequent elements are shifted to the left (subtracts one from
-     * their indices).</p>
-     *
-     * <p>This method returns a new array with the same elements of the input
-     * array except the element on the specified position. The component
-     * type of the returned array is always the same as that of the input
-     * array.</p>
-     *
-     * <p>If the input array is {@code null}, an IndexOutOfBoundsException
-     * will be thrown, because in that case no valid index can be specified.</p>
-     *
-     * <pre>
-     * ArrayUtils.remove(['a'], 0)           = []
-     * ArrayUtils.remove(['a', 'b'], 0)      = ['b']
-     * ArrayUtils.remove(['a', 'b'], 1)      = ['a']
-     * ArrayUtils.remove(['a', 'b', 'c'], 1) = ['a', 'c']
-     * </pre>
-     *
-     * @param array  the array to remove the element from, may not be {@code null}
-     * @param index  the position of the element to be removed
-     * @return A new array containing the existing elements except the element
-     *         at the specified position.
-     * @throws IndexOutOfBoundsException if the index is out of range
-     * (index &lt; 0 || index &gt;= array.length), or if the array is {@code null}.
-     * @since 2.1
-     */
-    public static char[] remove(final char[] array, final int index) {
-        return (char[]) remove((Object) array, index);
-    }
-
-    /**
-     * <p>Removes the first occurrence of the specified element from the
-     * specified array. All subsequent elements are shifted to the left
-     * (subtracts one from their indices). If the array doesn't contains
-     * such an element, no elements are removed from the array.</p>
-     *
-     * <p>This method returns a new array with the same elements of the input
-     * array except the first occurrence of the specified element. The component
-     * type of the returned array is always the same as that of the input
-     * array.</p>
-     *
-     * <pre>
-     * ArrayUtils.removeElement(null, 'a')            = null
-     * ArrayUtils.removeElement([], 'a')              = []
-     * ArrayUtils.removeElement(['a'], 'b')           = ['a']
-     * ArrayUtils.removeElement(['a', 'b'], 'a')      = ['b']
-     * ArrayUtils.removeElement(['a', 'b', 'a'], 'a') = ['b', 'a']
-     * </pre>
-     *
-     * @param array  the array to remove the element from, may be {@code null}
-     * @param element  the element to be removed
-     * @return A new array containing the existing elements except the first
-     *         occurrence of the specified element.
-     * @since 2.1
-     */
-    public static char[] removeElement(final char[] array, final char element) {
-        final int index = indexOf(array, element);
-        if (index == INDEX_NOT_FOUND) {
-            return clone(array);
-        }
-        return remove(array, index);
-    }
-
-    /**
-     * <p>Removes the element at the specified position from the specified array.
-     * All subsequent elements are shifted to the left (subtracts one from
-     * their indices).</p>
-     *
-     * <p>This method returns a new array with the same elements of the input
-     * array except the element on the specified position. The component
-     * type of the returned array is always the same as that of the input
-     * array.</p>
-     *
-     * <p>If the input array is {@code null}, an IndexOutOfBoundsException
-     * will be thrown, because in that case no valid index can be specified.</p>
-     *
-     * <pre>
-     * ArrayUtils.remove([1.1], 0)           = []
-     * ArrayUtils.remove([2.5, 6.0], 0)      = [6.0]
-     * ArrayUtils.remove([2.5, 6.0], 1)      = [2.5]
-     * ArrayUtils.remove([2.5, 6.0, 3.8], 1) = [2.5, 3.8]
-     * </pre>
-     *
-     * @param array  the array to remove the element from, may not be {@code null}
-     * @param index  the position of the element to be removed
-     * @return A new array containing the existing elements except the element
-     *         at the specified position.
-     * @throws IndexOutOfBoundsException if the index is out of range
-     * (index &lt; 0 || index &gt;= array.length), or if the array is {@code null}.
-     * @since 2.1
-     */
-    public static double[] remove(final double[] array, final int index) {
-        return (double[]) remove((Object) array, index);
-    }
-
-    /**
-     * <p>Removes the first occurrence of the specified element from the
-     * specified array. All subsequent elements are shifted to the left
-     * (subtracts one from their indices). If the array doesn't contains
-     * such an element, no elements are removed from the array.</p>
-     *
-     * <p>This method returns a new array with the same elements of the input
-     * array except the first occurrence of the specified element. The component
-     * type of the returned array is always the same as that of the input
-     * array.</p>
-     *
-     * <pre>
-     * ArrayUtils.removeElement(null, 1.1)            = null
-     * ArrayUtils.removeElement([], 1.1)              = []
-     * ArrayUtils.removeElement([1.1], 1.2)           = [1.1]
-     * ArrayUtils.removeElement([1.1, 2.3], 1.1)      = [2.3]
-     * ArrayUtils.removeElement([1.1, 2.3, 1.1], 1.1) = [2.3, 1.1]
-     * </pre>
-     *
-     * @param array  the array to remove the element from, may be {@code null}
-     * @param element  the element to be removed
-     * @return A new array containing the existing elements except the first
-     *         occurrence of the specified element.
-     * @since 2.1
-     */
-    public static double[] removeElement(final double[] array, final double element) {
-        final int index = indexOf(array, element);
-        if (index == INDEX_NOT_FOUND) {
-            return clone(array);
-        }
-        return remove(array, index);
-    }
-
-    /**
-     * <p>Removes the element at the specified position from the specified array.
-     * All subsequent elements are shifted to the left (subtracts one from
-     * their indices).</p>
-     *
-     * <p>This method returns a new array with the same elements of the input
-     * array except the element on the specified position. The component
-     * type of the returned array is always the same as that of the input
-     * array.</p>
-     *
-     * <p>If the input array is {@code null}, an IndexOutOfBoundsException
-     * will be thrown, because in that case no valid index can be specified.</p>
-     *
-     * <pre>
-     * ArrayUtils.remove([1.1], 0)           = []
-     * ArrayUtils.remove([2.5, 6.0], 0)      = [6.0]
-     * ArrayUtils.remove([2.5, 6.0], 1)      = [2.5]
-     * ArrayUtils.remove([2.5, 6.0, 3.8], 1) = [2.5, 3.8]
-     * </pre>
-     *
-     * @param array  the array to remove the element from, may not be {@code null}
-     * @param index  the position of the element to be removed
-     * @return A new array containing the existing elements except the element
-     *         at the specified position.
-     * @throws IndexOutOfBoundsException if the index is out of range
-     * (index &lt; 0 || index &gt;= array.length), or if the array is {@code null}.
-     * @since 2.1
-     */
-    public static float[] remove(final float[] array, final int index) {
-        return (float[]) remove((Object) array, index);
-    }
-
-    /**
-     * <p>Removes the first occurrence of the specified element from the
-     * specified array. All subsequent elements are shifted to the left
-     * (subtracts one from their indices). If the array doesn't contains
-     * such an element, no elements are removed from the array.</p>
-     *
-     * <p>This method returns a new array with the same elements of the input
-     * array except the first occurrence of the specified element. The component
-     * type of the returned array is always the same as that of the input
-     * array.</p>
-     *
-     * <pre>
-     * ArrayUtils.removeElement(null, 1.1)            = null
-     * ArrayUtils.removeElement([], 1.1)              = []
-     * ArrayUtils.removeElement([1.1], 1.2)           = [1.1]
-     * ArrayUtils.removeElement([1.1, 2.3], 1.1)      = [2.3]
-     * ArrayUtils.removeElement([1.1, 2.3, 1.1], 1.1) = [2.3, 1.1]
-     * </pre>
-     *
-     * @param array  the array to remove the element from, may be {@code null}
-     * @param element  the element to be removed
-     * @return A new array containing the existing elements except the first
-     *         occurrence of the specified element.
-     * @since 2.1
-     */
-    public static float[] removeElement(final float[] array, final float element) {
-        final int index = indexOf(array, element);
-        if (index == INDEX_NOT_FOUND) {
-            return clone(array);
-        }
-        return remove(array, index);
-    }
-
-    /**
-     * <p>Removes the element at the specified position from the specified array.
-     * All subsequent elements are shifted to the left (subtracts one from
-     * their indices).</p>
-     *
-     * <p>This method returns a new array with the same elements of the input
-     * array except the element on the specified position. The component
-     * type of the returned array is always the same as that of the input
-     * array.</p>
-     *
-     * <p>If the input array is {@code null}, an IndexOutOfBoundsException
-     * will be thrown, because in that case no valid index can be specified.</p>
-     *
-     * <pre>
-     * ArrayUtils.remove([1], 0)         = []
-     * ArrayUtils.remove([2, 6], 0)      = [6]
-     * ArrayUtils.remove([2, 6], 1)      = [2]
-     * ArrayUtils.remove([2, 6, 3], 1)   = [2, 3]
-     * </pre>
-     *
-     * @param array  the array to remove the element from, may not be {@code null}
-     * @param index  the position of the element to be removed
-     * @return A new array containing the existing elements except the element
-     *         at the specified position.
-     * @throws IndexOutOfBoundsException if the index is out of range
-     * (index &lt; 0 || index &gt;= array.length), or if the array is {@code null}.
-     * @since 2.1
-     */
-    public static int[] remove(final int[] array, final int index) {
-        return (int[]) remove((Object) array, index);
-    }
-
-    /**
-     * <p>Removes the first occurrence of the specified element from the
-     * specified array. All subsequent elements are shifted to the left
-     * (subtracts one from their indices). If the array doesn't contains
-     * such an element, no elements are removed from the array.</p>
-     *
-     * <p>This method returns a new array with the same elements of the input
-     * array except the first occurrence of the specified element. The component
-     * type of the returned array is always the same as that of the input
-     * array.</p>
-     *
-     * <pre>
-     * ArrayUtils.removeElement(null, 1)      = null
-     * ArrayUtils.removeElement([], 1)        = []
-     * ArrayUtils.removeElement([1], 2)       = [1]
-     * ArrayUtils.removeElement([1, 3], 1)    = [3]
-     * ArrayUtils.removeElement([1, 3, 1], 1) = [3, 1]
-     * </pre>
-     *
-     * @param array  the array to remove the element from, may be {@code null}
-     * @param element  the element to be removed
-     * @return A new array containing the existing elements except the first
-     *         occurrence of the specified element.
-     * @since 2.1
-     */
-    public static int[] removeElement(final int[] array, final int element) {
-        final int index = indexOf(array, element);
-        if (index == INDEX_NOT_FOUND) {
-            return clone(array);
-        }
-        return remove(array, index);
-    }
-
-    /**
-     * <p>Removes the element at the specified position from the specified array.
-     * All subsequent elements are shifted to the left (subtracts one from
-     * their indices).</p>
-     *
-     * <p>This method returns a new array with the same elements of the input
-     * array except the element on the specified position. The component
-     * type of the returned array is always the same as that of the input
-     * array.</p>
-     *
-     * <p>If the input array is {@code null}, an IndexOutOfBoundsException
-     * will be thrown, because in that case no valid index can be specified.</p>
-     *
-     * <pre>
-     * ArrayUtils.remove([1], 0)         = []
-     * ArrayUtils.remove([2, 6], 0)      = [6]
-     * ArrayUtils.remove([2, 6], 1)      = [2]
-     * ArrayUtils.remove([2, 6, 3], 1)   = [2, 3]
-     * </pre>
-     *
-     * @param array  the array to remove the element from, may not be {@code null}
-     * @param index  the position of the element to be removed
-     * @return A new array containing the existing elements except the element
-     *         at the specified position.
-     * @throws IndexOutOfBoundsException if the index is out of range
-     * (index &lt; 0 || index &gt;= array.length), or if the array is {@code null}.
-     * @since 2.1
-     */
-    public static long[] remove(final long[] array, final int index) {
-        return (long[]) remove((Object) array, index);
-    }
-
-    /**
-     * <p>Removes the first occurrence of the specified element from the
-     * specified array. All subsequent elements are shifted to the left
-     * (subtracts one from their indices). If the array doesn't contains
-     * such an element, no elements are removed from the array.</p>
-     *
-     * <p>This method returns a new array with the same elements of the input
-     * array except the first occurrence of the specified element. The component
-     * type of the returned array is always the same as that of the input
-     * array.</p>
-     *
-     * <pre>
-     * ArrayUtils.removeElement(null, 1)      = null
-     * ArrayUtils.removeElement([], 1)        = []
-     * ArrayUtils.removeElement([1], 2)       = [1]
-     * ArrayUtils.removeElement([1, 3], 1)    = [3]
-     * ArrayUtils.removeElement([1, 3, 1], 1) = [3, 1]
-     * </pre>
-     *
-     * @param array  the array to remove the element from, may be {@code null}
-     * @param element  the element to be removed
-     * @return A new array containing the existing elements except the first
-     *         occurrence of the specified element.
-     * @since 2.1
-     */
-    public static long[] removeElement(final long[] array, final long element) {
-        final int index = indexOf(array, element);
-        if (index == INDEX_NOT_FOUND) {
-            return clone(array);
-        }
-        return remove(array, index);
-    }
-
-    /**
-     * <p>Removes the element at the specified position from the specified array.
-     * All subsequent elements are shifted to the left (subtracts one from
-     * their indices).</p>
-     *
-     * <p>This method returns a new array with the same elements of the input
-     * array except the element on the specified position. The component
-     * type of the returned array is always the same as that of the input
-     * array.</p>
-     *
-     * <p>If the input array is {@code null}, an IndexOutOfBoundsException
-     * will be thrown, because in that case no valid index can be specified.</p>
-     *
-     * <pre>
-     * ArrayUtils.remove([1], 0)         = []
-     * ArrayUtils.remove([2, 6], 0)      = [6]
-     * ArrayUtils.remove([2, 6], 1)      = [2]
-     * ArrayUtils.remove([2, 6, 3], 1)   = [2, 3]
-     * </pre>
-     *
-     * @param array  the array to remove the element from, may not be {@code null}
-     * @param index  the position of the element to be removed
-     * @return A new array containing the existing elements except the element
-     *         at the specified position.
-     * @throws IndexOutOfBoundsException if the index is out of range
-     * (index &lt; 0 || index &gt;= array.length), or if the array is {@code null}.
-     * @since 2.1
-     */
-    public static short[] remove(final short[] array, final int index) {
-        return (short[]) remove((Object) array, index);
-    }
-
-    /**
-     * <p>Removes the first occurrence of the specified element from the
-     * specified array. All subsequent elements are shifted to the left
-     * (subtracts one from their indices). If the array doesn't contains
-     * such an element, no elements are removed from the array.</p>
-     *
-     * <p>This method returns a new array with the same elements of the input
-     * array except the first occurrence of the specified element. The component
-     * type of the returned array is always the same as that of the input
-     * array.</p>
-     *
-     * <pre>
-     * ArrayUtils.removeElement(null, 1)      = null
-     * ArrayUtils.removeElement([], 1)        = []
-     * ArrayUtils.removeElement([1], 2)       = [1]
-     * ArrayUtils.removeElement([1, 3], 1)    = [3]
-     * ArrayUtils.removeElement([1, 3, 1], 1) = [3, 1]
-     * </pre>
-     *
-     * @param array  the array to remove the element from, may be {@code null}
-     * @param element  the element to be removed
-     * @return A new array containing the existing elements except the first
-     *         occurrence of the specified element.
-     * @since 2.1
-     */
-    public static short[] removeElement(final short[] array, final short element) {
-        final int index = indexOf(array, element);
-        if (index == INDEX_NOT_FOUND) {
-            return clone(array);
-        }
-        return remove(array, index);
-    }
-
-    /**
-     * <p>Removes the element at the specified position from the specified array.
-     * All subsequent elements are shifted to the left (subtracts one from
-     * their indices).</p>
-     *
-     * <p>This method returns a new array with the same elements of the input
-     * array except the element on the specified position. The component
-     * type of the returned array is always the same as that of the input
-     * array.</p>
-     *
-     * <p>If the input array is {@code null}, an IndexOutOfBoundsException
-     * will be thrown, because in that case no valid index can be specified.</p>
-     *
-     * @param array  the array to remove the element from, may not be {@code null}
-     * @param index  the position of the element to be removed
-     * @return A new array containing the existing elements except the element
-     *         at the specified position.
-     * @throws IndexOutOfBoundsException if the index is out of range
-     * (index &lt; 0 || index &gt;= array.length), or if the array is {@code null}.
-     * @since 2.1
-     */
-    private static Object remove(final Object array, final int index) {
-        final int length = getLength(array);
-        if (index < 0 || index >= length) {
-            throw new IndexOutOfBoundsException("Index: " + index + ", Length: " + length);
-        }
-
-        final Object result = Array.newInstance(array.getClass().getComponentType(), length - 1);
-        System.arraycopy(array, 0, result, 0, index);
-        if (index < length - 1) {
-            System.arraycopy(array, index + 1, result, index, length - index - 1);
-        }
-
-        return result;
-    }
-
-    /**
-     * <p>Removes the elements at the specified positions from the specified array.
-     * All remaining elements are shifted to the left.</p>
-     *
-     * <p>This method returns a new array with the same elements of the input
-     * array except those at the specified positions. The component
-     * type of the returned array is always the same as that of the input
-     * array.</p>
-     *
-     * <p>If the input array is {@code null}, an IndexOutOfBoundsException
-     * will be thrown, because in that case no valid index can be specified.</p>
-     *
-     * <pre>
-     * ArrayUtils.removeAll(["a", "b", "c"], 0, 2) = ["b"]
-     * ArrayUtils.removeAll(["a", "b", "c"], 1, 2) = ["a"]
-     * </pre>
-     *
-     * @param <T> the component type of the array
-     * @param array   the array to remove the element from, may not be {@code null}
-     * @param indices the positions of the elements to be removed
-     * @return A new array containing the existing elements except those
-     *         at the specified positions.
-     * @throws IndexOutOfBoundsException if any index is out of range
-     * (index &lt; 0 || index &gt;= array.length), or if the array is {@code null}.
-     * @since 3.0.1
-     */
-    @SuppressWarnings("unchecked") // removeAll() always creates an array of the same type as its input
-    public static <T> T[] removeAll(final T[] array, final int... indices) {
-        return (T[]) removeAll((Object) array, clone(indices));
-    }
-
-    /**
-     * <p>Removes occurrences of specified elements, in specified quantities,
-     * from the specified array. All subsequent elements are shifted left.
-     * For any element-to-be-removed specified in greater quantities than
-     * contained in the original array, no change occurs beyond the
-     * removal of the existing matching items.</p>
-     *
-     * <p>This method returns a new array with the same elements of the input
-     * array except for the earliest-encountered occurrences of the specified
-     * elements. The component type of the returned array is always the same
-     * as that of the input array.</p>
-     *
-     * <pre>
-     * ArrayUtils.removeElements(null, "a", "b")            = null
-     * ArrayUtils.removeElements([], "a", "b")              = []
-     * ArrayUtils.removeElements(["a"], "b", "c")           = ["a"]
-     * ArrayUtils.removeElements(["a", "b"], "a", "c")      = ["b"]
-     * ArrayUtils.removeElements(["a", "b", "a"], "a")      = ["b", "a"]
-     * ArrayUtils.removeElements(["a", "b", "a"], "a", "a") = ["b"]
-     * </pre>
-     *
-     * @param <T> the component type of the array
-     * @param array  the array to remove the element from, may be {@code null}
-     * @param values the elements to be removed
-     * @return A new array containing the existing elements except the
-     *         earliest-encountered occurrences of the specified elements.
-     * @since 3.0.1
-     */
-    public static <T> T[] removeElements(final T[] array, final T... values) {
-        if (isEmpty(array) || isEmpty(values)) {
-            return clone(array);
-        }
-        final HashMap<T, MutableInt> occurrences = new HashMap<T, MutableInt>(values.length);
-        for (final T v : values) {
-            final MutableInt count = occurrences.get(v);
-            if (count == null) {
-                occurrences.put(v, new MutableInt(1));
-            } else {
-                count.increment();
-            }
-        }
-        final BitSet toRemove = new BitSet();
-        for (final Map.Entry<T, MutableInt> e : occurrences.entrySet()) {
-            final T v = e.getKey();
-            int found = 0;
-            for (int i = 0, ct = e.getValue().intValue(); i < ct; i++) {
-                found = indexOf(array, v, found);
-                if (found < 0) {
-                    break;
-                }
-                toRemove.set(found++);
-            }
-        }
-        @SuppressWarnings("unchecked") // removeAll() always creates an array of the same type as its input
-        final
-        T[] result = (T[]) removeAll(array, toRemove);
-        return result;
-    }
-
-    /**
-     * <p>Removes the elements at the specified positions from the specified array.
-     * All remaining elements are shifted to the left.</p>
-     *
-     * <p>This method returns a new array with the same elements of the input
-     * array except those at the specified positions. The component
-     * type of the returned array is always the same as that of the input
-     * array.</p>
-     *
-     * <p>If the input array is {@code null}, an IndexOutOfBoundsException
-     * will be thrown, because in that case no valid index can be specified.</p>
-     *
-     * <pre>
-     * ArrayUtils.removeAll([1], 0)             = []
-     * ArrayUtils.removeAll([2, 6], 0)          = [6]
-     * ArrayUtils.removeAll([2, 6], 0, 1)       = []
-     * ArrayUtils.removeAll([2, 6, 3], 1, 2)    = [2]
-     * ArrayUtils.removeAll([2, 6, 3], 0, 2)    = [6]
-     * ArrayUtils.removeAll([2, 6, 3], 0, 1, 2) = []
-     * </pre>
-     *
-     * @param array   the array to remove the element from, may not be {@code null}
-     * @param indices the positions of the elements to be removed
-     * @return A new array containing the existing elements except those
-     *         at the specified positions.
-     * @throws IndexOutOfBoundsException if any index is out of range
-     * (index &lt; 0 || index &gt;= array.length), or if the array is {@code null}.
-     * @since 3.0.1
-     */
-    public static byte[] removeAll(final byte[] array, final int... indices) {
-        return (byte[]) removeAll((Object) array, clone(indices));
-    }
-
-    /**
-     * <p>Removes occurrences of specified elements, in specified quantities,
-     * from the specified array. All subsequent elements are shifted left.
-     * For any element-to-be-removed specified in greater quantities than
-     * contained in the original array, no change occurs beyond the
-     * removal of the existing matching items.</p>
-     *
-     * <p>This method returns a new array with the same elements of the input
-     * array except for the earliest-encountered occurrences of the specified
-     * elements. The component type of the returned array is always the same
-     * as that of the input array.</p>
-     *
-     * <pre>
-     * ArrayUtils.removeElements(null, 1, 2)      = null
-     * ArrayUtils.removeElements([], 1, 2)        = []
-     * ArrayUtils.removeElements([1], 2, 3)       = [1]
-     * ArrayUtils.removeElements([1, 3], 1, 2)    = [3]
-     * ArrayUtils.removeElements([1, 3, 1], 1)    = [3, 1]
-     * ArrayUtils.removeElements([1, 3, 1], 1, 1) = [3]
-     * </pre>
-     *
-     * @param array  the array to remove the element from, may be {@code null}
-     * @param values the elements to be removed
-     * @return A new array containing the existing elements except the
-     *         earliest-encountered occurrences of the specified elements.
-     * @since 3.0.1
-     */
-    public static byte[] removeElements(final byte[] array, final byte... values) {
-        if (isEmpty(array) || isEmpty(values)) {
-            return clone(array);
-        }
-        final Map<Byte, MutableInt> occurrences = new HashMap<Byte, MutableInt>(values.length);
-        for (final byte v : values) {
-            final Byte boxed = Byte.valueOf(v);
-            final MutableInt count = occurrences.get(boxed);
-            if (count == null) {
-                occurrences.put(boxed, new MutableInt(1));
-            } else {
-                count.increment();
-            }
-        }
-        final BitSet toRemove = new BitSet();
-        for (final Map.Entry<Byte, MutableInt> e : occurrences.entrySet()) {
-            final Byte v = e.getKey();
-            int found = 0;
-            for (int i = 0, ct = e.getValue().intValue(); i < ct; i++) {
-                found = indexOf(array, v.byteValue(), found);
-                if (found < 0) {
-                    break;
-                }
-                toRemove.set(found++);
-            }
-        }
-        return (byte[]) removeAll(array, toRemove);
-    }
-
-    /**
-     * <p>Removes the elements at the specified positions from the specified array.
-     * All remaining elements are shifted to the left.</p>
-     *
-     * <p>This method returns a new array with the same elements of the input
-     * array except those at the specified positions. The component
-     * type of the returned array is always the same as that of the input
-     * array.</p>
-     *
-     * <p>If the input array is {@code null}, an IndexOutOfBoundsException
-     * will be thrown, because in that case no valid index can be specified.</p>
-     *
-     * <pre>
-     * ArrayUtils.removeAll([1], 0)             = []
-     * ArrayUtils.removeAll([2, 6], 0)          = [6]
-     * ArrayUtils.removeAll([2, 6], 0, 1)       = []
-     * ArrayUtils.removeAll([2, 6, 3], 1, 2)    = [2]
-     * ArrayUtils.removeAll([2, 6, 3], 0, 2)    = [6]
-     * ArrayUtils.removeAll([2, 6, 3], 0, 1, 2) = []
-     * </pre>
-     *
-     * @param array   the array to remove the element from, may not be {@code null}
-     * @param indices the positions of the elements to be removed
-     * @return A new array containing the existing elements except those
-     *         at the specified positions.
-     * @throws IndexOutOfBoundsException if any index is out of range
-     * (index &lt; 0 || index &gt;= array.length), or if the array is {@code null}.
-     * @since 3.0.1
-     */
-    public static short[] removeAll(final short[] array, final int... indices) {
-        return (short[]) removeAll((Object) array, clone(indices));
-    }
-
-    /**
-     * <p>Removes occurrences of specified elements, in specified quantities,
-     * from the specified array. All subsequent elements are shifted left.
-     * For any element-to-be-removed specified in greater quantities than
-     * contained in the original array, no change occurs beyond the
-     * removal of the existing matching items.</p>
-     *
-     * <p>This method returns a new array with the same elements of the input
-     * array except for the earliest-encountered occurrences of the specified
-     * elements. The component type of the returned array is always the same
-     * as that of the input array.</p>
-     *
-     * <pre>
-     * ArrayUtils.removeElements(null, 1, 2)      = null
-     * ArrayUtils.removeElements([], 1, 2)        = []
-     * ArrayUtils.removeElements([1], 2, 3)       = [1]
-     * ArrayUtils.removeElements([1, 3], 1, 2)    = [3]
-     * ArrayUtils.removeElements([1, 3, 1], 1)    = [3, 1]
-     * ArrayUtils.removeElements([1, 3, 1], 1, 1) = [3]
-     * </pre>
-     *
-     * @param array  the array to remove the element from, may be {@code null}
-     * @param values the elements to be removed
-     * @return A new array containing the existing elements except the
-     *         earliest-encountered occurrences of the specified elements.
-     * @since 3.0.1
-     */
-    public static short[] removeElements(final short[] array, final short... values) {
-        if (isEmpty(array) || isEmpty(values)) {
-            return clone(array);
-        }
-        final HashMap<Short, MutableInt> occurrences = new HashMap<Short, MutableInt>(values.length);
-        for (final short v : values) {
-            final Short boxed = Short.valueOf(v);
-            final MutableInt count = occurrences.get(boxed);
-            if (count == null) {
-                occurrences.put(boxed, new MutableInt(1));
-            } else {
-                count.increment();
-            }
-        }
-        final BitSet toRemove = new BitSet();
-        for (final Map.Entry<Short, MutableInt> e : occurrences.entrySet()) {
-            final Short v = e.getKey();
-            int found = 0;
-            for (int i = 0, ct = e.getValue().intValue(); i < ct; i++) {
-                found = indexOf(array, v.shortValue(), found);
-                if (found < 0) {
-                    break;
-                }
-                toRemove.set(found++);
-            }
-        }
-        return (short[]) removeAll(array, toRemove);
-    }
-
-    /**
-     * <p>Removes the elements at the specified positions from the specified array.
-     * All remaining elements are shifted to the left.</p>
-     *
-     * <p>This method returns a new array with the same elements of the input
-     * array except those at the specified positions. The component
-     * type of the returned array is always the same as that of the input
-     * array.</p>
-     *
-     * <p>If the input array is {@code null}, an IndexOutOfBoundsException
-     * will be thrown, because in that case no valid index can be specified.</p>
-     *
-     * <pre>
-     * ArrayUtils.removeAll([1], 0)             = []
-     * ArrayUtils.removeAll([2, 6], 0)          = [6]
-     * ArrayUtils.removeAll([2, 6], 0, 1)       = []
-     * ArrayUtils.removeAll([2, 6, 3], 1, 2)    = [2]
-     * ArrayUtils.removeAll([2, 6, 3], 0, 2)    = [6]
-     * ArrayUtils.removeAll([2, 6, 3], 0, 1, 2) = []
-     * </pre>
-     *
-     * @param array   the array to remove the element from, may not be {@code null}
-     * @param indices the positions of the elements to be removed
-     * @return A new array containing the existing elements except those
-     *         at the specified positions.
-     * @throws IndexOutOfBoundsException if any index is out of range
-     * (index &lt; 0 || index &gt;= array.length), or if the array is {@code null}.
-     * @since 3.0.1
-     */
-    public static int[] removeAll(final int[] array, final int... indices) {
-        return (int[]) removeAll((Object) array, clone(indices));
-    }
-
-    /**
-     * <p>Removes occurrences of specified elements, in specified quantities,
-     * from the specified array. All subsequent elements are shifted left.
-     * For any element-to-be-removed specified in greater quantities than
-     * contained in the original array, no change occurs beyond the
-     * removal of the existing matching items.</p>
-     *
-     * <p>This method returns a new array with the same elements of the input
-     * array except for the earliest-encountered occurrences of the specified
-     * elements. The component type of the returned array is always the same
-     * as that of the input array.</p>
-     *
-     * <pre>
-     * ArrayUtils.removeElements(null, 1, 2)      = null
-     * ArrayUtils.removeElements([], 1, 2)        = []
-     * ArrayUtils.removeElements([1], 2, 3)       = [1]
-     * ArrayUtils.removeElements([1, 3], 1, 2)    = [3]
-     * ArrayUtils.removeElements([1, 3, 1], 1)    = [3, 1]
-     * ArrayUtils.removeElements([1, 3, 1], 1, 1) = [3]
-     * </pre>
-     *
-     * @param array  the array to remove the element from, may be {@code null}
-     * @param values the elements to be removed
-     * @return A new array containing the existing elements except the
-     *         earliest-encountered occurrences of the specified elements.
-     * @since 3.0.1
-     */
-    public static int[] removeElements(final int[] array, final int... values) {
-        if (isEmpty(array) || isEmpty(values)) {
-            return clone(array);
-        }
-        final HashMap<Integer, MutableInt> occurrences = new HashMap<Integer, MutableInt>(values.length);
-        for (final int v : values) {
-            final Integer boxed = Integer.valueOf(v);
-            final MutableInt count = occurrences.get(boxed);
-            if (count == null) {
-                occurrences.put(boxed, new MutableInt(1));
-            } else {
-                count.increment();
-            }
-        }
-        final BitSet toRemove = new BitSet();
-        for (final Map.Entry<Integer, MutableInt> e : occurrences.entrySet()) {
-            final Integer v = e.getKey();
-            int found = 0;
-            for (int i = 0, ct = e.getValue().intValue(); i < ct; i++) {
-                found = indexOf(array, v.intValue(), found);
-                if (found < 0) {
-                    break;
-                }
-                toRemove.set(found++);
-            }
-        }
-        return (int[]) removeAll(array, toRemove);
-    }
-
-    /**
-     * <p>Removes the elements at the specified positions from the specified array.
-     * All remaining elements are shifted to the left.</p>
-     *
-     * <p>This method returns a new array with the same elements of the input
-     * array except those at the specified positions. The component
-     * type of the returned array is always the same as that of the input
-     * array.</p>
-     *
-     * <p>If the input array is {@code null}, an IndexOutOfBoundsException
-     * will be thrown, because in that case no valid index can be specified.</p>
-     *
-     * <pre>
-     * ArrayUtils.removeAll([1], 0)             = []
-     * ArrayUtils.removeAll([2, 6], 0)          = [6]
-     * ArrayUtils.removeAll([2, 6], 0, 1)       = []
-     * ArrayUtils.removeAll([2, 6, 3], 1, 2)    = [2]
-     * ArrayUtils.removeAll([2, 6, 3], 0, 2)    = [6]
-     * ArrayUtils.removeAll([2, 6, 3], 0, 1, 2) = []
-     * </pre>
-     *
-     * @param array   the array to remove the element from, may not be {@code null}
-     * @param indices the positions of the elements to be removed
-     * @return A new array containing the existing elements except those
-     *         at the specified positions.
-     * @throws IndexOutOfBoundsException if any index is out of range
-     * (index &lt; 0 || index &gt;= array.length), or if the array is {@code null}.
-     * @since 3.0.1
-     */
-    public static char[] removeAll(final char[] array, final int... indices) {
-        return (char[]) removeAll((Object) array, clone(indices));
-    }
-
-    /**
-     * <p>Removes occurrences of specified elements, in specified quantities,
-     * from the specified array. All subsequent elements are shifted left.
-     * For any element-to-be-removed specified in greater quantities than
-     * contained in the original array, no change occurs beyond the
-     * removal of the existing matching items.</p>
-     *
-     * <p>This method returns a new array with the same elements of the input
-     * array except for the earliest-encountered occurrences of the specified
-     * elements. The component type of the returned array is always the same
-     * as that of the input array.</p>
-     *
-     * <pre>
-     * ArrayUtils.removeElements(null, 1, 2)      = null
-     * ArrayUtils.removeElements([], 1, 2)        = []
-     * ArrayUtils.removeElements([1], 2, 3)       = [1]
-     * ArrayUtils.removeElements([1, 3], 1, 2)    = [3]
-     * ArrayUtils.removeElements([1, 3, 1], 1)    = [3, 1]
-     * ArrayUtils.removeElements([1, 3, 1], 1, 1) = [3]
-     * </pre>
-     *
-     * @param array  the array to remove the element from, may be {@code null}
-     * @param values the elements to be removed
-     * @return A new array containing the existing elements except the
-     *         earliest-encountered occurrences of the specified elements.
-     * @since 3.0.1
-     */
-    public static char[] removeElements(final char[] array, final char... values) {
-        if (isEmpty(array) || isEmpty(values)) {
-            return clone(array);
-        }
-        final HashMap<Character, MutableInt> occurrences = new HashMap<Character, MutableInt>(values.length);
-        for (final char v : values) {
-            final Character boxed = Character.valueOf(v);
-            final MutableInt count = occurrences.get(boxed);
-            if (count == null) {
-                occurrences.put(boxed, new MutableInt(1));
-            } else {
-                count.increment();
-            }
-        }
-        final BitSet toRemove = new BitSet();
-        for (final Map.Entry<Character, MutableInt> e : occurrences.entrySet()) {
-            final Character v = e.getKey();
-            int found = 0;
-            for (int i = 0, ct = e.getValue().intValue(); i < ct; i++) {
-                found = indexOf(array, v.charValue(), found);
-                if (found < 0) {
-                    break;
-                }
-                toRemove.set(found++);
-            }
-        }
-        return (char[]) removeAll(array, toRemove);
-    }
-
-    /**
-     * <p>Removes the elements at the specified positions from the specified array.
-     * All remaining elements are shifted to the left.</p>
-     *
-     * <p>This method returns a new array with the same elements of the input
-     * array except those at the specified positions. The component
-     * type of the returned array is always the same as that of the input
-     * array.</p>
-     *
-     * <p>If the input array is {@code null}, an IndexOutOfBoundsException
-     * will be thrown, because in that case no valid index can be specified.</p>
-     *
-     * <pre>
-     * ArrayUtils.removeAll([1], 0)             = []
-     * ArrayUtils.removeAll([2, 6], 0)          = [6]
-     * ArrayUtils.removeAll([2, 6], 0, 1)       = []
-     * ArrayUtils.removeAll([2, 6, 3], 1, 2)    = [2]
-     * ArrayUtils.removeAll([2, 6, 3], 0, 2)    = [6]
-     * ArrayUtils.removeAll([2, 6, 3], 0, 1, 2) = []
-     * </pre>
-     *
-     * @param array   the array to remove the element from, may not be {@code null}
-     * @param indices the positions of the elements to be removed
-     * @return A new array containing the existing elements except those
-     *         at the specified positions.
-     * @throws IndexOutOfBoundsException if any index is out of range
-     * (index &lt; 0 || index &gt;= array.length), or if the array is {@code null}.
-     * @since 3.0.1
-     */
-    public static long[] removeAll(final long[] array, final int... indices) {
-        return (long[]) removeAll((Object) array, clone(indices));
-    }
-
-    /**
-     * <p>Removes occurrences of specified elements, in specified quantities,
-     * from the specified array. All subsequent elements are shifted left.
-     * For any element-to-be-removed specified in greater quantities than
-     * contained in the original array, no change occurs beyond the
-     * removal of the existing matching items.</p>
-     *
-     * <p>This method returns a new array with the same elements of the input
-     * array except for the earliest-encountered occurrences of the specified
-     * elements. The component type of the returned array is always the same
-     * as that of the input array.</p>
-     *
-     * <pre>
-     * ArrayUtils.removeElements(null, 1, 2)      = null
-     * ArrayUtils.removeElements([], 1, 2)        = []
-     * ArrayUtils.removeElements([1], 2, 3)       = [1]
-     * ArrayUtils.removeElements([1, 3], 1, 2)    = [3]
-     * ArrayUtils.removeElements([1, 3, 1], 1)    = [3, 1]
-     * ArrayUtils.removeElements([1, 3, 1], 1, 1) = [3]
-     * </pre>
-     *
-     * @param array  the array to remove the element from, may be {@code null}
-     * @param values the elements to be removed
-     * @return A new array containing the existing elements except the
-     *         earliest-encountered occurrences of the specified elements.
-     * @since 3.0.1
-     */
-    public static long[] removeElements(final long[] array, final long... values) {
-        if (isEmpty(array) || isEmpty(values)) {
-            return clone(array);
-        }
-        final HashMap<Long, MutableInt> occurrences = new HashMap<Long, MutableInt>(values.length);
-        for (final long v : values) {
-            final Long boxed = Long.valueOf(v);
-            final MutableInt count = occurrences.get(boxed);
-            if (count == null) {
-                occurrences.put(boxed, new MutableInt(1));
-            } else {
-                count.increment();
-            }
-        }
-        final BitSet toRemove = new BitSet();
-        for (final Map.Entry<Long, MutableInt> e : occurrences.entrySet()) {
-            final Long v = e.getKey();
-            int found = 0;
-            for (int i = 0, ct = e.getValue().intValue(); i < ct; i++) {
-                found = indexOf(array, v.longValue(), found);
-                if (found < 0) {
-                    break;
-                }
-                toRemove.set(found++);
-            }
-        }
-        return (long[]) removeAll(array, toRemove);
-    }
-
-    /**
-     * <p>Removes the elements at the specified positions from the specified array.
-     * All remaining elements are shifted to the left.</p>
-     *
-     * <p>This method returns a new array with the same elements of the input
-     * array except those at the specified positions. The component
-     * type of the returned array is always the same as that of the input
-     * array.</p>
-     *
-     * <p>If the input array is {@code null}, an IndexOutOfBoundsException
-     * will be thrown, because in that case no valid index can be specified.</p>
-     *
-     * <pre>
-     * ArrayUtils.removeAll([1], 0)             = []
-     * ArrayUtils.removeAll([2, 6], 0)          = [6]
-     * ArrayUtils.removeAll([2, 6], 0, 1)       = []
-     * ArrayUtils.removeAll([2, 6, 3], 1, 2)    = [2]
-     * ArrayUtils.removeAll([2, 6, 3], 0, 2)    = [6]
-     * ArrayUtils.removeAll([2, 6, 3], 0, 1, 2) = []
-     * </pre>
-     *
-     * @param array   the array to remove the element from, may not be {@code null}
-     * @param indices the positions of the elements to be removed
-     * @return A new array containing the existing elements except those
-     *         at the specified positions.
-     * @throws IndexOutOfBoundsException if any index is out of range
-     * (index &lt; 0 || index &gt;= array.length), or if the array is {@code null}.
-     * @since 3.0.1
-     */
-    public static float[] removeAll(final float[] array, final int... indices) {
-        return (float[]) removeAll((Object) array, clone(indices));
-    }
-
-    /**
-     * <p>Removes occurrences of specified elements, in specified quantities,
-     * from the specified array. All subsequent elements are shifted left.
-     * For any element-to-be-removed specified in greater quantities than
-     * contained in the original array, no change occurs beyond the
-     * removal of the existing matching items.</p>
-     *
-     * <p>This method returns a new array with the same elements of the input
-     * array except for the earliest-encountered occurrences of the specified
-     * elements. The component type of the returned array is always the same
-     * as that of the input array.</p>
-     *
-     * <pre>
-     * ArrayUtils.removeElements(null, 1, 2)      = null
-     * ArrayUtils.removeElements([], 1, 2)        = []
-     * ArrayUtils.removeElements([1], 2, 3)       = [1]
-     * ArrayUtils.removeElements([1, 3], 1, 2)    = [3]
-     * ArrayUtils.removeElements([1, 3, 1], 1)    = [3, 1]
-     * ArrayUtils.removeElements([1, 3, 1], 1, 1) = [3]
-     * </pre>
-     *
-     * @param array  the array to remove the element from, may be {@code null}
-     * @param values the elements to be removed
-     * @return A new array containing the existing elements except the
-     *         earliest-encountered occurrences of the specified elements.
-     * @since 3.0.1
-     */
-    public static float[] removeElements(final float[] array, final float... values) {
-        if (isEmpty(array) || isEmpty(values)) {
-            return clone(array);
-        }
-        final HashMap<Float, MutableInt> occurrences = new HashMap<Float, MutableInt>(values.length);
-        for (final float v : values) {
-            final Float boxed = Float.valueOf(v);
-            final MutableInt count = occurrences.get(boxed);
-            if (count == null) {
-                occurrences.put(boxed, new MutableInt(1));
-            } else {
-                count.increment();
-            }
-        }
-        final BitSet toRemove = new BitSet();
-        for (final Map.Entry<Float, MutableInt> e : occurrences.entrySet()) {
-            final Float v = e.getKey();
-            int found = 0;
-            for (int i = 0, ct = e.getValue().intValue(); i < ct; i++) {
-                found = indexOf(array, v.floatValue(), found);
-                if (found < 0) {
-                    break;
-                }
-                toRemove.set(found++);
-            }
-        }
-        return (float[]) removeAll(array, toRemove);
-    }
-
-    /**
-     * <p>Removes the elements at the specified positions from the specified array.
-     * All remaining elements are shifted to the left.</p>
-     *
-     * <p>This method returns a new array with the same elements of the input
-     * array except those at the specified positions. The component
-     * type of the returned array is always the same as that of the input
-     * array.</p>
-     *
-     * <p>If the input array is {@code null}, an IndexOutOfBoundsException
-     * will be thrown, because in that case no valid index can be specified.</p>
-     *
-     * <pre>
-     * ArrayUtils.removeAll([1], 0)             = []
-     * ArrayUtils.removeAll([2, 6], 0)          = [6]
-     * ArrayUtils.removeAll([2, 6], 0, 1)       = []
-     * ArrayUtils.removeAll([2, 6, 3], 1, 2)    = [2]
-     * ArrayUtils.removeAll([2, 6, 3], 0, 2)    = [6]
-     * ArrayUtils.removeAll([2, 6, 3], 0, 1, 2) = []
-     * </pre>
-     *
-     * @param array   the array to remove the element from, may not be {@code null}
-     * @param indices the positions of the elements to be removed
-     * @return A new array containing the existing elements except those
-     *         at the specified positions.
-     * @throws IndexOutOfBoundsException if any index is out of range
-     * (index &lt; 0 || index &gt;= array.length), or if the array is {@code null}.
-     * @since 3.0.1
-     */
-    public static double[] removeAll(final double[] array, final int... indices) {
-        return (double[]) removeAll((Object) array, clone(indices));
-    }
-
-    /**
-     * <p>Removes occurrences of specified elements, in specified quantities,
-     * from the specified array. All subsequent elements are shifted left.
-     * For any element-to-be-removed specified in greater quantities than
-     * contained in the original array, no change occurs beyond the
-     * removal of the existing matching items.</p>
-     *
-     * <p>This method returns a new array with the same elements of the input
-     * array except for the earliest-encountered occurrences of the specified
-     * elements. The component type of the returned array is always the same
-     * as that of the input array.</p>
-     *
-     * <pre>
-     * ArrayUtils.removeElements(null, 1, 2)      = null
-     * ArrayUtils.removeElements([], 1, 2)        = []
-     * ArrayUtils.removeElements([1], 2, 3)       = [1]
-     * ArrayUtils.removeElements([1, 3], 1, 2)    = [3]
-     * ArrayUtils.removeElements([1, 3, 1], 1)    = [3, 1]
-     * ArrayUtils.removeElements([1, 3, 1], 1, 1) = [3]
-     * </pre>
-     *
-     * @param array  the array to remove the element from, may be {@code null}
-     * @param values the elements to be removed
-     * @return A new array containing the existing elements except the
-     *         earliest-encountered occurrences of the specified elements.
-     * @since 3.0.1
-     */
-    public static double[] removeElements(final double[] array, final double... values) {
-        if (isEmpty(array) || isEmpty(values)) {
-            return clone(array);
-        }
-        final HashMap<Double, MutableInt> occurrences = new HashMap<Double, MutableInt>(values.length);
-        for (final double v : values) {
-            final Double boxed = Double.valueOf(v);
-            final MutableInt count = occurrences.get(boxed);
-            if (count == null) {
-                occurrences.put(boxed, new MutableInt(1));
-            } else {
-                count.increment();
-            }
-        }
-        final BitSet toRemove = new BitSet();
-        for (final Map.Entry<Double, MutableInt> e : occurrences.entrySet()) {
-            final Double v = e.getKey();
-            int found = 0;
-            for (int i = 0, ct = e.getValue().intValue(); i < ct; i++) {
-                found = indexOf(array, v.doubleValue(), found);
-                if (found < 0) {
-                    break;
-                }
-                toRemove.set(found++);
-            }
-        }
-        return (double[]) removeAll(array, toRemove);
-    }
-
-    /**
-     * <p>Removes the elements at the specified positions from the specified array.
-     * All remaining elements are shifted to the left.</p>
-     *
-     * <p>This method returns a new array with the same elements of the input
-     * array except those at the specified positions. The component
-     * type of the returned array is always the same as that of the input
-     * array.</p>
-     *
-     * <p>If the input array is {@code null}, an IndexOutOfBoundsException
-     * will be thrown, because in that case no valid index can be specified.</p>
-     *
-     * <pre>
-     * ArrayUtils.removeAll([true, false, true], 0, 2) = [false]
-     * ArrayUtils.removeAll([true, false, true], 1, 2) = [true]
-     * </pre>
-     *
-     * @param array   the array to remove the element from, may not be {@code null}
-     * @param indices the positions of the elements to be removed
-     * @return A new array containing the existing elements except those
-     *         at the specified positions.
-     * @throws IndexOutOfBoundsException if any index is out of range
-     * (index &lt; 0 || index &gt;= array.length), or if the array is {@code null}.
-     * @since 3.0.1
-     */
-    public static boolean[] removeAll(final boolean[] array, final int... indices) {
-        return (boolean[]) removeAll((Object) array, clone(indices));
-    }
-
-    /**
-     * <p>Removes occurrences of specified elements, in specified quantities,
-     * from the specified array. All subsequent elements are shifted left.
-     * For any element-to-be-removed specified in greater quantities than
-     * contained in the original array, no change occurs beyond the
-     * removal of the existing matching items.</p>
-     *
-     * <p>This method returns a new array with the same elements of the input
-     * array except for the earliest-encountered occurrences of the specified
-     * elements. The component type of the returned array is always the same
-     * as that of the input array.</p>
-     *
-     * <pre>
-     * ArrayUtils.removeElements(null, true, false)               = null
-     * ArrayUtils.removeElements([], true, false)                 = []
-     * ArrayUtils.removeElements([true], false, false)            = [true]
-     * ArrayUtils.removeElements([true, false], true, true)       = [false]
-     * ArrayUtils.removeElements([true, false, true], true)       = [false, true]
-     * ArrayUtils.removeElements([true, false, true], true, true) = [false]
-     * </pre>
-     *
-     * @param array  the array to remove the element from, may be {@code null}
-     * @param values the elements to be removed
-     * @return A new array containing the existing elements except the
-     *         earliest-encountered occurrences of the specified elements.
-     * @since 3.0.1
-     */
-    public static boolean[] removeElements(final boolean[] array, final boolean... values) {
-        if (isEmpty(array) || isEmpty(values)) {
-            return clone(array);
-        }
-        final HashMap<Boolean, MutableInt> occurrences = new HashMap<Boolean, MutableInt>(2); // only two possible values here
-        for (final boolean v : values) {
-            final Boolean boxed = Boolean.valueOf(v);
-            final MutableInt count = occurrences.get(boxed);
-            if (count == null) {
-                occurrences.put(boxed, new MutableInt(1));
-            } else {
-                count.increment();
-            }
-        }
-        final BitSet toRemove = new BitSet();
-        for (final Map.Entry<Boolean, MutableInt> e : occurrences.entrySet()) {
-            final Boolean v = e.getKey();
-            int found = 0;
-            for (int i = 0, ct = e.getValue().intValue(); i < ct; i++) {
-                found = indexOf(array, v.booleanValue(), found);
-                if (found < 0) {
-                    break;
-                }
-                toRemove.set(found++);
-            }
-        }
-        return (boolean[]) removeAll(array, toRemove);
-    }
-
-    /**
-     * Removes multiple array elements specified by index.
-     * @param array source
-     * @param indices to remove, WILL BE SORTED--so only clones of user-owned arrays!
-     * @return new array of same type minus elements specified by unique values of {@code indices}
-     * @since 3.0.1
-     */
-    // package protected for access by unit tests
-    static Object removeAll(final Object array, final int... indices) {
-        final int length = getLength(array);
-        int diff = 0; // number of distinct indexes, i.e. number of entries that will be removed
-
-        if (isNotEmpty(indices)) {
-            Arrays.sort(indices);
-
-            int i = indices.length;
-            int prevIndex = length;
-            while (--i >= 0) {
-                final int index = indices[i];
-                if (index < 0 || index >= length) {
-                    throw new IndexOutOfBoundsException("Index: " + index + ", Length: " + length);
-                }
-                if (index >= prevIndex) {
-                    continue;
-                }
-                diff++;
-                prevIndex = index;
-            }
-        }
-        final Object result = Array.newInstance(array.getClass().getComponentType(), length - diff);
-        if (diff < length) {
-            int end = length; // index just after last copy
-            int dest = length - diff; // number of entries so far not copied
-            for (int i = indices.length - 1; i >= 0; i--) {
-                final int index = indices[i];
-                if (end - index > 1) { // same as (cp > 0)
-                    final int cp = end - index - 1;
-                    dest -= cp;
-                    System.arraycopy(array, index + 1, result, dest, cp);
-                    // Afer this copy, we still have room for dest items.
-                }
-                end = index;
-            }
-            if (end > 0) {
-                System.arraycopy(array, 0, result, 0, end);
-            }
-        }
-        return result;
-    }
-
-    /**
-     * Removes multiple array elements specified by indices.
-     * 
-     * @param array source
-     * @param indices to remove
-     * @return new array of same type minus elements specified by the set bits in {@code indices}
-     * @since 3.2
-     */
-    // package protected for access by unit tests
-    static Object removeAll(final Object array, final BitSet indices) {
-        final int srcLength = ArrayUtils.getLength(array);
-        // No need to check maxIndex here, because method only currently called from removeElements()
-        // which guarantee to generate on;y valid bit entries.
-//        final int maxIndex = indices.length();
-//        if (maxIndex > srcLength) { 
-//            throw new IndexOutOfBoundsException("Index: " + (maxIndex-1) + ", Length: " + srcLength);
-//        }
-        final int removals = indices.cardinality(); // true bits are items to remove
-        final Object result = Array.newInstance(array.getClass().getComponentType(), srcLength - removals);
-        int srcIndex=0;
-        int destIndex=0;
-        int count;
-        int set;
-        while((set = indices.nextSetBit(srcIndex)) != -1){
-            count = set - srcIndex;
-            if (count > 0) {
-                System.arraycopy(array, srcIndex, result, destIndex, count);
-                destIndex += count;
-            }
-            srcIndex = indices.nextClearBit(set);
-        }
-        count = srcLength - srcIndex;
-        if (count > 0) {
-            System.arraycopy(array, srcIndex, result, destIndex, count);            
-        }
-        return result;
-    }
-
-    /**
-     * <p>This method checks whether the provided array is sorted according to the class's 
-     * {@code compareTo} method.</p>
-     *
-     * @param array the array to check
-     * @param <T> the datatype of the array to check, it must implement {@code Comparable}
-     * @return whether the array is sorted
-     * @since 3.4
-     */
-    public static <T extends Comparable<? super T>> boolean isSorted(final T[] array) {
-        return isSorted(array, new Comparator<T>() {
-            @Override
-            public int compare(T o1, T o2) {
-                return o1.compareTo(o2);
-            }
-        });
-    }
-   
-
-    /**
-     * <p>This method checks whether the provided array is sorted according to the provided {@code Comparator}.</p>
-     *
-     * @param array the array to check
-     * @param comparator the {@code Comparator} to compare over
-     * @param <T> the datatype of the array
-     * @return whether the array is sorted
-     * @since 3.4
-     */
-    public static <T> boolean isSorted(final T[] array, final Comparator<T> comparator) {
-        if (comparator == null) {
-            throw new IllegalArgumentException("Comparator should not be null.");
-        }
-        
-        if(array == null || array.length < 2) {
-            return true;
-        }
-
-        T previous = array[0];
-        final int n = array.length;
-        for(int i = 1; i < n; i++) {
-            final T current = array[i];
-            if (comparator.compare(previous, current) > 0) {
-                return false;
-            }
-
-            previous = current;
-        }
-        return true;
-    }
-
-    /**
-     * <p>This method checks whether the provided array is sorted according to natural ordering.</p>
-     *
-     * @param array the array to check
-     * @return whether the array is sorted according to natural ordering
-     * @since 3.4
-     */
-    public static boolean isSorted(int[] array) {
-        if(array == null || array.length < 2) {
-            return true;
-        }
-
-        int previous = array[0];
-        final int n = array.length;
-        for(int i = 1; i < n; i++) {
-            final int current = array[i];
-            if(NumberUtils.compare(previous, current) > 0) {
-                return false;
-            }
-
-            previous = current;
-        }
-        return true;
-    }
-
-    /**
-     * <p>This method checks whether the provided array is sorted according to natural ordering.</p>
-     *
-     * @param array the array to check
-     * @return whether the array is sorted according to natural ordering
-     * @since 3.4
-     */
-    public static boolean isSorted(long[] array) {
-        if(array == null || array.length < 2) {
-            return true;
-        }
-
-        long previous = array[0];
-        final int n = array.length;
-        for(int i = 1; i < n; i++) {
-            final long current = array[i];
-            if(NumberUtils.compare(previous, current) > 0) {
-                return false;
-            }
-
-            previous = current;
-        }
-        return true;
-    }
-
-    /**
-     * <p>This method checks whether the provided array is sorted according to natural ordering.</p>
-     *
-     * @param array the array to check
-     * @return whether the array is sorted according to natural ordering
-     * @since 3.4
-     */
-    public static boolean isSorted(short[] array) {
-        if(array == null || array.length < 2) {
-            return true;
-        }
-
-        short previous = array[0];
-        final int n = array.length;
-        for(int i = 1; i < n; i++) {
-            final short current = array[i];
-            if(NumberUtils.compare(previous, current) > 0) {
-                return false;
-            }
-
-            previous = current;
-        }
-        return true;
-    }
-
-    /**
-     * <p>This method checks whether the provided array is sorted according to natural ordering.</p>
-     *
-     * @param array the array to check
-     * @return whether the array is sorted according to natural ordering
-     * @since 3.4
-     */
-    public static boolean isSorted(final double[] array) {
-        if(array == null || array.length < 2) {
-            return true;
-        }
-
-        double previous = array[0];
-        final int n = array.length;
-        for(int i = 1; i < n; i++) {
-            final double current = array[i];
-            if(Double.compare(previous, current) > 0) {
-                return false;
-            }
-
-            previous = current;
-        }
-        return true;
-    }
-
-    /**
-     * <p>This method checks whether the provided array is sorted according to natural ordering.</p>
-     *
-     * @param array the array to check
-     * @return whether the array is sorted according to natural ordering
-     * @since 3.4
-     */
-    public static boolean isSorted(final float[] array) {
-        if(array == null || array.length < 2) {
-            return true;
-        }
-
-        float previous = array[0];
-        final int n = array.length;
-        for(int i = 1; i < n; i++) {
-            final float current = array[i];
-            if(Float.compare(previous, current) > 0) {
-                return false;
-            }
-
-            previous = current;
-        }
-        return true;
-    }
-
-    /**
-     * <p>This method checks whether the provided array is sorted according to natural ordering.</p>
-     *
-     * @param array the array to check
-     * @return whether the array is sorted according to natural ordering
-     * @since 3.4
-     */
-    public static boolean isSorted(byte[] array) {
-        if(array == null || array.length < 2) {
-            return true;
-        }
-
-        byte previous = array[0];
-        final int n = array.length;
-        for(int i = 1; i < n; i++) {
-            final byte current = array[i];
-            if(NumberUtils.compare(previous, current) > 0) {
-                return false;
-            }
-
-            previous = current;
-        }
-        return true;
-    }
-
-    /**
-     * <p>This method checks whether the provided array is sorted according to natural ordering.</p>
-     *
-     * @param array the array to check
-     * @return whether the array is sorted according to natural ordering
-     * @since 3.4
-     */
-    public static boolean isSorted(char[] array) {
-        if(array == null || array.length < 2) {
-            return true;
-        }
-
-        char previous = array[0];
-        final int n = array.length;
-        for(int i = 1; i < n; i++) {
-            final char current = array[i];
-            if(CharUtils.compare(previous, current) > 0) {
-                return false;
-            }
-
-            previous = current;
-        }
-        return true;
-    }
-
-    /**
-     * <p>This method checks whether the provided array is sorted according to natural ordering
-     * ({@code false} before {@code true}).</p>
-     *
-     * @param array the array to check
-     * @return whether the array is sorted according to natural ordering
-     * @since 3.4
-     */
-    public static boolean isSorted(boolean[] array) {
-        if(array == null || array.length < 2) {
-            return true;
-        }
-
-        boolean previous = array[0];
-        final int n = array.length;
-        for(int i = 1; i < n; i++) {
-            final boolean current = array[i];
-            if(BooleanUtils.compare(previous, current) > 0) {
-                return false;
-            }
-
-            previous = current;
-        }
-        return true;
-    }
-}
diff --git a/lang/src/main/java/org/apache/commons/lang3/BitField.java b/lang/src/main/java/org/apache/commons/lang3/BitField.java
deleted file mode 100644
index 06e127e..0000000
--- a/lang/src/main/java/org/apache/commons/lang3/BitField.java
+++ /dev/null
@@ -1,332 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- * 
- *      http://www.apache.org/licenses/LICENSE-2.0
- * 
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.commons.lang3;
-
-/**
- * <p>Supports operations on bit-mapped fields. Instances of this class can be 
- * used to store a flag or data within an {@code int}, {@code short} or 
- * {@code byte}.</p>
- * 
- * <p>Each {@code BitField} is constructed with a mask value, which indicates
- * the bits that will be used to store and retrieve the data for that field. 
- * For instance, the mask {@code 0xFF} indicates the least-significant byte 
- * should be used to store the data.</p>
- * 
- * <p>As an example, consider a car painting machine that accepts
- * paint instructions as integers. Bit fields can be used to encode this:</p>
- *
- *<pre>
- *    // blue, green and red are 1 byte values (0-255) stored in the three least 
- *    // significant bytes
- *    BitField blue = new BitField(0xFF);
- *    BitField green = new BitField(0xFF00);
- *    BitField red = new BitField(0xFF0000);
- * 
- *    // anyColor is a flag triggered if any color is used
- *    BitField anyColor = new BitField(0xFFFFFF);
- * 
- *    // isMetallic is a single bit flag
- *    BitField isMetallic = new BitField(0x1000000);
- *</pre>
- *
- * <p>Using these {@code BitField} instances, a paint instruction can be
- * encoded into an integer:</p>
- *
- *<pre>
- *    int paintInstruction = 0;
- *    paintInstruction = red.setValue(paintInstruction, 35);
- *    paintInstruction = green.setValue(paintInstruction, 100);
- *    paintInstruction = blue.setValue(paintInstruction, 255);
- *</pre>
- *
- * <p>Flags and data can be retrieved from the integer:</p>
- * 
- *<pre>
- *    // Prints true if red, green or blue is non-zero
- *    System.out.println(anyColor.isSet(paintInstruction));   // prints true
- *   
- *    // Prints value of red, green and blue
- *    System.out.println(red.getValue(paintInstruction));     // prints 35
- *    System.out.println(green.getValue(paintInstruction));   // prints 100
- *    System.out.println(blue.getValue(paintInstruction));    // prints 255
- *   
- *    // Prints true if isMetallic was set 
- *    System.out.println(isMetallic.isSet(paintInstruction)); // prints false
- *</pre>
- *
- * @since 2.0
- * @version $Id$
- */
-public class BitField {
-    
-    private final int _mask;
-    private final int _shift_count;
-
-    /**
-     * <p>Creates a BitField instance.</p>
-     *
-     * @param mask the mask specifying which bits apply to this
-     *  BitField. Bits that are set in this mask are the bits
-     *  that this BitField operates on
-     */
-    public BitField(final int mask) {
-        _mask = mask;
-        int count = 0;
-        int bit_pattern = mask;
-
-        if (bit_pattern != 0) {
-            while ((bit_pattern & 1) == 0) {
-                count++;
-                bit_pattern >>= 1;
-            }
-        }
-        _shift_count = count;
-    }
-
-    /**
-     * <p>Obtains the value for the specified BitField, appropriately
-     * shifted right.</p>
-     *
-     * <p>Many users of a BitField will want to treat the specified
-     * bits as an int value, and will not want to be aware that the
-     * value is stored as a BitField (and so shifted left so many
-     * bits).</p>
-     *
-     * @see #setValue(int,int)
-     * @param holder the int data containing the bits we're interested
-     *  in
-     * @return the selected bits, shifted right appropriately
-     */
-    public int getValue(final int holder) {
-        return getRawValue(holder) >> _shift_count;
-    }
-
-    /**
-     * <p>Obtains the value for the specified BitField, appropriately
-     * shifted right, as a short.</p>
-     *
-     * <p>Many users of a BitField will want to treat the specified
-     * bits as an int value, and will not want to be aware that the
-     * value is stored as a BitField (and so shifted left so many
-     * bits).</p>
-     *
-     * @see #setShortValue(short,short)
-     * @param holder the short data containing the bits we're
-     *  interested in
-     * @return the selected bits, shifted right appropriately
-     */
-    public short getShortValue(final short holder) {
-        return (short) getValue(holder);
-    }
-
-    /**
-     * <p>Obtains the value for the specified BitField, unshifted.</p>
-     *
-     * @param holder the int data containing the bits we're
-     *  interested in
-     * @return the selected bits
-     */
-    public int getRawValue(final int holder) {
-        return holder & _mask;
-    }
-
-    /**
-     * <p>Obtains the value for the specified BitField, unshifted.</p>
-     *
-     * @param holder the short data containing the bits we're
-     *  interested in
-     * @return the selected bits
-     */
-    public short getShortRawValue(final short holder) {
-        return (short) getRawValue(holder);
-    }
-
-    /**
-     * <p>Returns whether the field is set or not.</p>
-     *
-     * <p>This is most commonly used for a single-bit field, which is
-     * often used to represent a boolean value; the results of using
-     * it for a multi-bit field is to determine whether *any* of its
-     * bits are set.</p>
-     *
-     * @param holder the int data containing the bits we're interested
-     *  in
-     * @return {@code true} if any of the bits are set,
-     *  else {@code false}
-     */
-    public boolean isSet(final int holder) {
-        return (holder & _mask) != 0;
-    }
-
-    /**
-     * <p>Returns whether all of the bits are set or not.</p>
-     *
-     * <p>This is a stricter test than {@link #isSet(int)},
-     * in that all of the bits in a multi-bit set must be set
-     * for this method to return {@code true}.</p>
-     *
-     * @param holder the int data containing the bits we're
-     *  interested in
-     * @return {@code true} if all of the bits are set,
-     *  else {@code false}
-     */
-    public boolean isAllSet(final int holder) {
-        return (holder & _mask) == _mask;
-    }
-
-    /**
-     * <p>Replaces the bits with new values.</p>
-     *
-     * @see #getValue(int)
-     * @param holder the int data containing the bits we're
-     *  interested in
-     * @param value the new value for the specified bits
-     * @return the value of holder with the bits from the value
-     *  parameter replacing the old bits
-     */
-    public int setValue(final int holder, final int value) {
-        return (holder & ~_mask) | ((value << _shift_count) & _mask);
-    }
-
-    /**
-     * <p>Replaces the bits with new values.</p>
-     *
-     * @see #getShortValue(short)
-     * @param holder the short data containing the bits we're
-     *  interested in
-     * @param value the new value for the specified bits
-     * @return the value of holder with the bits from the value
-     *  parameter replacing the old bits
-     */
-    public short setShortValue(final short holder, final short value) {
-        return (short) setValue(holder, value);
-    }
-
-    /**
-     * <p>Clears the bits.</p>
-     *
-     * @param holder the int data containing the bits we're
-     *  interested in
-     * @return the value of holder with the specified bits cleared
-     *  (set to {@code 0})
-     */
-    public int clear(final int holder) {
-        return holder & ~_mask;
-    }
-
-    /**
-     * <p>Clears the bits.</p>
-     *
-     * @param holder the short data containing the bits we're
-     *  interested in
-     * @return the value of holder with the specified bits cleared
-     *  (set to {@code 0})
-     */
-    public short clearShort(final short holder) {
-        return (short) clear(holder);
-    }
-
-    /**
-     * <p>Clears the bits.</p>
-     *
-     * @param holder the byte data containing the bits we're
-     *  interested in
-     *
-     * @return the value of holder with the specified bits cleared
-     *  (set to {@code 0})
-     */
-    public byte clearByte(final byte holder) {
-        return (byte) clear(holder);
-    }
-
-    /**
-     * <p>Sets the bits.</p>
-     *
-     * @param holder the int data containing the bits we're
-     *  interested in
-     * @return the value of holder with the specified bits set
-     *  to {@code 1}
-     */
-    public int set(final int holder) {
-        return holder | _mask;
-    }
-
-    /**
-     * <p>Sets the bits.</p>
-     *
-     * @param holder the short data containing the bits we're
-     *  interested in
-     * @return the value of holder with the specified bits set
-     *  to {@code 1}
-     */
-    public short setShort(final short holder) {
-        return (short) set(holder);
-    }
-
-    /**
-     * <p>Sets the bits.</p>
-     *
-     * @param holder the byte data containing the bits we're
-     *  interested in
-     *
-     * @return the value of holder with the specified bits set
-     *  to {@code 1}
-     */
-    public byte setByte(final byte holder) {
-        return (byte) set(holder);
-    }
-
-    /**
-     * <p>Sets a boolean BitField.</p>
-     *
-     * @param holder the int data containing the bits we're
-     *  interested in
-     * @param flag indicating whether to set or clear the bits
-     * @return the value of holder with the specified bits set or
-     *         cleared
-     */
-    public int setBoolean(final int holder, final boolean flag) {
-        return flag ? set(holder) : clear(holder);
-    }
-
-    /**
-     * <p>Sets a boolean BitField.</p>
-     *
-     * @param holder the short data containing the bits we're
-     *  interested in
-     * @param flag indicating whether to set or clear the bits
-     * @return the value of holder with the specified bits set or
-     *  cleared
-     */
-    public short setShortBoolean(final short holder, final boolean flag) {
-        return flag ? setShort(holder) : clearShort(holder);
-    }
-
-    /**
-     * <p>Sets a boolean BitField.</p>
-     *
-     * @param holder the byte data containing the bits we're
-     *  interested in
-     * @param flag indicating whether to set or clear the bits
-     * @return the value of holder with the specified bits set or
-     *  cleared
-     */
-    public byte setByteBoolean(final byte holder, final boolean flag) {
-        return flag ? setByte(holder) : clearByte(holder);
-    }
-
-}
diff --git a/lang/src/main/java/org/apache/commons/lang3/BooleanUtils.java b/lang/src/main/java/org/apache/commons/lang3/BooleanUtils.java
deleted file mode 100644
index 1832fe0..0000000
--- a/lang/src/main/java/org/apache/commons/lang3/BooleanUtils.java
+++ /dev/null
@@ -1,1109 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.commons.lang3;
-
-import org.apache.commons.lang3.math.NumberUtils;
-
-/**
- * <p>Operations on boolean primitives and Boolean objects.</p>
- *
- * <p>This class tries to handle {@code null} input gracefully.
- * An exception will not be thrown for a {@code null} input.
- * Each method documents its behaviour in more detail.</p>
- *
- * <p>#ThreadSafe#</p>
- * @since 2.0
- * @version $Id$
- */
-public class BooleanUtils {
-
-    /**
-     * <p>{@code BooleanUtils} instances should NOT be constructed in standard programming.
-     * Instead, the class should be used as {@code BooleanUtils.negate(true);}.</p>
-     *
-     * <p>This constructor is public to permit tools that require a JavaBean instance
-     * to operate.</p>
-     */
-    public BooleanUtils() {
-      super();
-    }
-
-    // Boolean utilities
-    //--------------------------------------------------------------------------
-    /**
-     * <p>Negates the specified boolean.</p>
-     *
-     * <p>If {@code null} is passed in, {@code null} will be returned.</p>
-     *
-     * <p>NOTE: This returns null and will throw a NullPointerException if autoboxed to a boolean. </p>
-     *
-     * <pre>
-     *   BooleanUtils.negate(Boolean.TRUE)  = Boolean.FALSE;
-     *   BooleanUtils.negate(Boolean.FALSE) = Boolean.TRUE;
-     *   BooleanUtils.negate(null)          = null;
-     * </pre>
-     *
-     * @param bool  the Boolean to negate, may be null
-     * @return the negated Boolean, or {@code null} if {@code null} input
-     */
-    public static Boolean negate(final Boolean bool) {
-        if (bool == null) {
-            return null;
-        }
-        return bool.booleanValue() ? Boolean.FALSE : Boolean.TRUE;
-    }
-
-    // boolean Boolean methods
-    //-----------------------------------------------------------------------
-    /**
-     * <p>Checks if a {@code Boolean} value is {@code true},
-     * handling {@code null} by returning {@code false}.</p>
-     *
-     * <pre>
-     *   BooleanUtils.isTrue(Boolean.TRUE)  = true
-     *   BooleanUtils.isTrue(Boolean.FALSE) = false
-     *   BooleanUtils.isTrue(null)          = false
-     * </pre>
-     *
-     * @param bool  the boolean to check, null returns {@code false}
-     * @return {@code true} only if the input is non-null and true
-     * @since 2.1
-     */
-    public static boolean isTrue(final Boolean bool) {
-        return Boolean.TRUE.equals(bool);
-    }
-
-    /**
-     * <p>Checks if a {@code Boolean} value is <i>not</i> {@code true},
-     * handling {@code null} by returning {@code true}.</p>
-     *
-     * <pre>
-     *   BooleanUtils.isNotTrue(Boolean.TRUE)  = false
-     *   BooleanUtils.isNotTrue(Boolean.FALSE) = true
-     *   BooleanUtils.isNotTrue(null)          = true
-     * </pre>
-     *
-     * @param bool  the boolean to check, null returns {@code true}
-     * @return {@code true} if the input is null or false
-     * @since 2.3
-     */
-    public static boolean isNotTrue(final Boolean bool) {
-        return !isTrue(bool);
-    }
-
-    /**
-     * <p>Checks if a {@code Boolean} value is {@code false},
-     * handling {@code null} by returning {@code false}.</p>
-     *
-     * <pre>
-     *   BooleanUtils.isFalse(Boolean.TRUE)  = false
-     *   BooleanUtils.isFalse(Boolean.FALSE) = true
-     *   BooleanUtils.isFalse(null)          = false
-     * </pre>
-     *
-     * @param bool  the boolean to check, null returns {@code false}
-     * @return {@code true} only if the input is non-null and false
-     * @since 2.1
-     */
-    public static boolean isFalse(final Boolean bool) {
-        return Boolean.FALSE.equals(bool);
-    }
-
-    /**
-     * <p>Checks if a {@code Boolean} value is <i>not</i> {@code false},
-     * handling {@code null} by returning {@code true}.</p>
-     *
-     * <pre>
-     *   BooleanUtils.isNotFalse(Boolean.TRUE)  = true
-     *   BooleanUtils.isNotFalse(Boolean.FALSE) = false
-     *   BooleanUtils.isNotFalse(null)          = true
-     * </pre>
-     *
-     * @param bool  the boolean to check, null returns {@code true}
-     * @return {@code true} if the input is null or true
-     * @since 2.3
-     */
-    public static boolean isNotFalse(final Boolean bool) {
-        return !isFalse(bool);
-    }
-
-    //-----------------------------------------------------------------------
-    /**
-     * <p>Converts a Boolean to a boolean handling {@code null}
-     * by returning {@code false}.</p>
-     *
-     * <pre>
-     *   BooleanUtils.toBoolean(Boolean.TRUE)  = true
-     *   BooleanUtils.toBoolean(Boolean.FALSE) = false
-     *   BooleanUtils.toBoolean(null)          = false
-     * </pre>
-     *
-     * @param bool  the boolean to convert
-     * @return {@code true} or {@code false}, {@code null} returns {@code false}
-     */
-    public static boolean toBoolean(final Boolean bool) {
-        return bool != null && bool.booleanValue();
-    }
-
-    /**
-     * <p>Converts a Boolean to a boolean handling {@code null}.</p>
-     *
-     * <pre>
-     *   BooleanUtils.toBooleanDefaultIfNull(Boolean.TRUE, false) = true
-     *   BooleanUtils.toBooleanDefaultIfNull(Boolean.FALSE, true) = false
-     *   BooleanUtils.toBooleanDefaultIfNull(null, true)          = true
-     * </pre>
-     *
-     * @param bool  the boolean to convert
-     * @param valueIfNull  the boolean value to return if {@code null}
-     * @return {@code true} or {@code false}
-     */
-    public static boolean toBooleanDefaultIfNull(final Boolean bool, final boolean valueIfNull) {
-        if (bool == null) {
-            return valueIfNull;
-        }
-        return bool.booleanValue();
-    }
-
-    // Integer to Boolean methods
-    //-----------------------------------------------------------------------
-    /**
-     * <p>Converts an int to a boolean using the convention that {@code zero}
-     * is {@code false}.</p>
-     *
-     * <pre>
-     *   BooleanUtils.toBoolean(0) = false
-     *   BooleanUtils.toBoolean(1) = true
-     *   BooleanUtils.toBoolean(2) = true
-     * </pre>
-     *
-     * @param value  the int to convert
-     * @return {@code true} if non-zero, {@code false}
-     *  if zero
-     */
-    public static boolean toBoolean(final int value) {
-        return value != 0;
-    }
-
-    /**
-     * <p>Converts an int to a Boolean using the convention that {@code zero}
-     * is {@code false}.</p>
-     *
-     * <pre>
-     *   BooleanUtils.toBoolean(0) = Boolean.FALSE
-     *   BooleanUtils.toBoolean(1) = Boolean.TRUE
-     *   BooleanUtils.toBoolean(2) = Boolean.TRUE
-     * </pre>
-     *
-     * @param value  the int to convert
-     * @return Boolean.TRUE if non-zero, Boolean.FALSE if zero,
-     *  {@code null} if {@code null}
-     */
-    public static Boolean toBooleanObject(final int value) {
-        return value == 0 ? Boolean.FALSE : Boolean.TRUE;
-    }
-
-    /**
-     * <p>Converts an Integer to a Boolean using the convention that {@code zero}
-     * is {@code false}.</p>
-     *
-     * <p>{@code null} will be converted to {@code null}.</p>
-     *
-     * <p>NOTE: This returns null and will throw a NullPointerException if autoboxed to a boolean. </p>
-     *
-     * <pre>
-     *   BooleanUtils.toBoolean(Integer.valueOf(0))    = Boolean.FALSE
-     *   BooleanUtils.toBoolean(Integer.valueOf(1))    = Boolean.TRUE
-     *   BooleanUtils.toBoolean(Integer.valueOf(null)) = null
-     * </pre>
-     *
-     * @param value  the Integer to convert
-     * @return Boolean.TRUE if non-zero, Boolean.FALSE if zero,
-     *  {@code null} if {@code null} input
-     */
-    public static Boolean toBooleanObject(final Integer value) {
-        if (value == null) {
-            return null;
-        }
-        return value.intValue() == 0 ? Boolean.FALSE : Boolean.TRUE;
-    }
-
-    /**
-     * <p>Converts an int to a boolean specifying the conversion values.</p>
-     *
-     * <pre>
-     *   BooleanUtils.toBoolean(0, 1, 0) = false
-     *   BooleanUtils.toBoolean(1, 1, 0) = true
-     *   BooleanUtils.toBoolean(2, 1, 2) = false
-     *   BooleanUtils.toBoolean(2, 2, 0) = true
-     * </pre>
-     *
-     * @param value  the Integer to convert
-     * @param trueValue  the value to match for {@code true}
-     * @param falseValue  the value to match for {@code false}
-     * @return {@code true} or {@code false}
-     * @throws IllegalArgumentException if no match
-     */
-    public static boolean toBoolean(final int value, final int trueValue, final int falseValue) {
-        if (value == trueValue) {
-            return true;
-        }
-        if (value == falseValue) {
-            return false;
-        }
-        // no match
-        throw new IllegalArgumentException("The Integer did not match either specified value");
-    }
-
-    /**
-     * <p>Converts an Integer to a boolean specifying the conversion values.</p>
-     *
-     * <pre>
-     *   BooleanUtils.toBoolean(Integer.valueOf(0), Integer.valueOf(1), Integer.valueOf(0)) = false
-     *   BooleanUtils.toBoolean(Integer.valueOf(1), Integer.valueOf(1), Integer.valueOf(0)) = true
-     *   BooleanUtils.toBoolean(Integer.valueOf(2), Integer.valueOf(1), Integer.valueOf(2)) = false
-     *   BooleanUtils.toBoolean(Integer.valueOf(2), Integer.valueOf(2), Integer.valueOf(0)) = true
-     *   BooleanUtils.toBoolean(null, null, Integer.valueOf(0))                     = true
-     * </pre>
-     *
-     * @param value  the Integer to convert
-     * @param trueValue  the value to match for {@code true}, may be {@code null}
-     * @param falseValue  the value to match for {@code false}, may be {@code null}
-     * @return {@code true} or {@code false}
-     * @throws IllegalArgumentException if no match
-     */
-    public static boolean toBoolean(final Integer value, final Integer trueValue, final Integer falseValue) {
-        if (value == null) {
-            if (trueValue == null) {
-                return true;
-            }
-            if (falseValue == null) {
-                return false;
-            }
-        } else if (value.equals(trueValue)) {
-            return true;
-        } else if (value.equals(falseValue)) {
-            return false;
-        }
-        // no match
-        throw new IllegalArgumentException("The Integer did not match either specified value");
-    }
-
-    /**
-     * <p>Converts an int to a Boolean specifying the conversion values.</p>
-     *
-     * <p>NOTE: This returns null and will throw a NullPointerException if autoboxed to a boolean. </p>
-     *
-     * <pre>
-     *   BooleanUtils.toBooleanObject(0, 0, 2, 3) = Boolean.TRUE
-     *   BooleanUtils.toBooleanObject(2, 1, 2, 3) = Boolean.FALSE
-     *   BooleanUtils.toBooleanObject(3, 1, 2, 3) = null
-     * </pre>
-     *
-     * @param value  the Integer to convert
-     * @param trueValue  the value to match for {@code true}
-     * @param falseValue  the value to match for {@code false}
-     * @param nullValue  the value to to match for {@code null}
-     * @return Boolean.TRUE, Boolean.FALSE, or {@code null}
-     * @throws IllegalArgumentException if no match
-     */
-    public static Boolean toBooleanObject(final int value, final int trueValue, final int falseValue, final int nullValue) {
-        if (value == trueValue) {
-            return Boolean.TRUE;
-        }
-        if (value == falseValue) {
-            return Boolean.FALSE;
-        }
-        if (value == nullValue) {
-            return null;
-        }
-        // no match
-        throw new IllegalArgumentException("The Integer did not match any specified value");
-    }
-
-    /**
-     * <p>Converts an Integer to a Boolean specifying the conversion values.</p>
-     *
-     * <p>NOTE: This returns null and will throw a NullPointerException if autoboxed to a boolean. </p>
-     *
-     * <pre>
-     *   BooleanUtils.toBooleanObject(Integer.valueOf(0), Integer.valueOf(0), Integer.valueOf(2), Integer.valueOf(3)) = Boolean.TRUE
-     *   BooleanUtils.toBooleanObject(Integer.valueOf(2), Integer.valueOf(1), Integer.valueOf(2), Integer.valueOf(3)) = Boolean.FALSE
-     *   BooleanUtils.toBooleanObject(Integer.valueOf(3), Integer.valueOf(1), Integer.valueOf(2), Integer.valueOf(3)) = null
-     * </pre>
-     *
-     * @param value  the Integer to convert
-     * @param trueValue  the value to match for {@code true}, may be {@code null}
-     * @param falseValue  the value to match for {@code false}, may be {@code null}
-     * @param nullValue  the value to to match for {@code null}, may be {@code null}
-     * @return Boolean.TRUE, Boolean.FALSE, or {@code null}
-     * @throws IllegalArgumentException if no match
-     */
-    public static Boolean toBooleanObject(final Integer value, final Integer trueValue, final Integer falseValue, final Integer nullValue) {
-        if (value == null) {
-            if (trueValue == null) {
-                return Boolean.TRUE;
-            }
-            if (falseValue == null) {
-                return Boolean.FALSE;
-            }
-            if (nullValue == null) {
-                return null;
-            }
-        } else if (value.equals(trueValue)) {
-            return Boolean.TRUE;
-        } else if (value.equals(falseValue)) {
-            return Boolean.FALSE;
-        } else if (value.equals(nullValue)) {
-            return null;
-        }
-        // no match
-        throw new IllegalArgumentException("The Integer did not match any specified value");
-    }
-
-    // Boolean to Integer methods
-    //-----------------------------------------------------------------------
-    /**
-     * <p>Converts a boolean to an int using the convention that
-     * {@code zero} is {@code false}.</p>
-     *
-     * <pre>
-     *   BooleanUtils.toInteger(true)  = 1
-     *   BooleanUtils.toInteger(false) = 0
-     * </pre>
-     *
-     * @param bool  the boolean to convert
-     * @return one if {@code true}, zero if {@code false}
-     */
-    public static int toInteger(final boolean bool) {
-        return bool ? 1 : 0;
-    }
-
-    /**
-     * <p>Converts a boolean to an Integer using the convention that
-     * {@code zero} is {@code false}.</p>
-     *
-     * <pre>
-     *   BooleanUtils.toIntegerObject(true)  = Integer.valueOf(1)
-     *   BooleanUtils.toIntegerObject(false) = Integer.valueOf(0)
-     * </pre>
-     *
-     * @param bool  the boolean to convert
-     * @return one if {@code true}, zero if {@code false}
-     */
-    public static Integer toIntegerObject(final boolean bool) {
-        return bool ? NumberUtils.INTEGER_ONE : NumberUtils.INTEGER_ZERO;
-    }
-
-    /**
-     * <p>Converts a Boolean to a Integer using the convention that
-     * {@code zero} is {@code false}.</p>
-     *
-     * <p>{@code null} will be converted to {@code null}.</p>
-     *
-     * <pre>
-     *   BooleanUtils.toIntegerObject(Boolean.TRUE)  = Integer.valueOf(1)
-     *   BooleanUtils.toIntegerObject(Boolean.FALSE) = Integer.valueOf(0)
-     * </pre>
-     *
-     * @param bool  the Boolean to convert
-     * @return one if Boolean.TRUE, zero if Boolean.FALSE, {@code null} if {@code null}
-     */
-    public static Integer toIntegerObject(final Boolean bool) {
-        if (bool == null) {
-            return null;
-        }
-        return bool.booleanValue() ? NumberUtils.INTEGER_ONE : NumberUtils.INTEGER_ZERO;
-    }
-
-    /**
-     * <p>Converts a boolean to an int specifying the conversion values.</p>
-     *
-     * <pre>
-     *   BooleanUtils.toInteger(true, 1, 0)  = 1
-     *   BooleanUtils.toInteger(false, 1, 0) = 0
-     * </pre>
-     *
-     * @param bool  the to convert
-     * @param trueValue  the value to return if {@code true}
-     * @param falseValue  the value to return if {@code false}
-     * @return the appropriate value
-     */
-    public static int toInteger(final boolean bool, final int trueValue, final int falseValue) {
-        return bool ? trueValue : falseValue;
-    }
-
-    /**
-     * <p>Converts a Boolean to an int specifying the conversion values.</p>
-     *
-     * <pre>
-     *   BooleanUtils.toInteger(Boolean.TRUE, 1, 0, 2)  = 1
-     *   BooleanUtils.toInteger(Boolean.FALSE, 1, 0, 2) = 0
-     *   BooleanUtils.toInteger(null, 1, 0, 2)          = 2
-     * </pre>
-     *
-     * @param bool  the Boolean to convert
-     * @param trueValue  the value to return if {@code true}
-     * @param falseValue  the value to return if {@code false}
-     * @param nullValue  the value to return if {@code null}
-     * @return the appropriate value
-     */
-    public static int toInteger(final Boolean bool, final int trueValue, final int falseValue, final int nullValue) {
-        if (bool == null) {
-            return nullValue;
-        }
-        return bool.booleanValue() ? trueValue : falseValue;
-    }
-
-    /**
-     * <p>Converts a boolean to an Integer specifying the conversion values.</p>
-     *
-     * <pre>
-     *   BooleanUtils.toIntegerObject(true, Integer.valueOf(1), Integer.valueOf(0))  = Integer.valueOf(1)
-     *   BooleanUtils.toIntegerObject(false, Integer.valueOf(1), Integer.valueOf(0)) = Integer.valueOf(0)
-     * </pre>
-     *
-     * @param bool  the to convert
-     * @param trueValue  the value to return if {@code true}, may be {@code null}
-     * @param falseValue  the value to return if {@code false}, may be {@code null}
-     * @return the appropriate value
-     */
-    public static Integer toIntegerObject(final boolean bool, final Integer trueValue, final Integer falseValue) {
-        return bool ? trueValue : falseValue;
-    }
-
-    /**
-     * <p>Converts a Boolean to an Integer specifying the conversion values.</p>
-     *
-     * <pre>
-     *   BooleanUtils.toIntegerObject(Boolean.TRUE, Integer.valueOf(1), Integer.valueOf(0), Integer.valueOf(2))  = Integer.valueOf(1)
-     *   BooleanUtils.toIntegerObject(Boolean.FALSE, Integer.valueOf(1), Integer.valueOf(0), Integer.valueOf(2)) = Integer.valueOf(0)
-     *   BooleanUtils.toIntegerObject(null, Integer.valueOf(1), Integer.valueOf(0), Integer.valueOf(2))          = Integer.valueOf(2)
-     * </pre>
-     *
-     * @param bool  the Boolean to convert
-     * @param trueValue  the value to return if {@code true}, may be {@code null}
-     * @param falseValue  the value to return if {@code false}, may be {@code null}
-     * @param nullValue  the value to return if {@code null}, may be {@code null}
-     * @return the appropriate value
-     */
-    public static Integer toIntegerObject(final Boolean bool, final Integer trueValue, final Integer falseValue, final Integer nullValue) {
-        if (bool == null) {
-            return nullValue;
-        }
-        return bool.booleanValue() ? trueValue : falseValue;
-    }
-
-    // String to Boolean methods
-    //-----------------------------------------------------------------------
-    /**
-     * <p>Converts a String to a Boolean.</p>
-     *
-     * <p>{@code 'true'}, {@code 'on'}, {@code 'y'}, {@code 't'} or {@code 'yes'}
-     * (case insensitive) will return {@code true}.
-     * {@code 'false'}, {@code 'off'}, {@code 'n'}, {@code 'f'} or {@code 'no'}
-     * (case insensitive) will return {@code false}.
-     * Otherwise, {@code null} is returned.</p>
-     *
-     * <p>NOTE: This returns null and will throw a NullPointerException if autoboxed to a boolean. </p>
-     *
-     * <pre>
-     *   // N.B. case is not significant
-     *   BooleanUtils.toBooleanObject(null)    = null
-     *   BooleanUtils.toBooleanObject("true")  = Boolean.TRUE
-     *   BooleanUtils.toBooleanObject("T")     = Boolean.TRUE // i.e. T[RUE]
-     *   BooleanUtils.toBooleanObject("false") = Boolean.FALSE
-     *   BooleanUtils.toBooleanObject("f")     = Boolean.FALSE // i.e. f[alse]
-     *   BooleanUtils.toBooleanObject("No")    = Boolean.FALSE
-     *   BooleanUtils.toBooleanObject("n")     = Boolean.FALSE // i.e. n[o]
-     *   BooleanUtils.toBooleanObject("on")    = Boolean.TRUE
-     *   BooleanUtils.toBooleanObject("ON")    = Boolean.TRUE
-     *   BooleanUtils.toBooleanObject("off")   = Boolean.FALSE
-     *   BooleanUtils.toBooleanObject("oFf")   = Boolean.FALSE
-     *   BooleanUtils.toBooleanObject("yes")   = Boolean.TRUE
-     *   BooleanUtils.toBooleanObject("Y")     = Boolean.TRUE // i.e. Y[ES]
-     *   BooleanUtils.toBooleanObject("blue")  = null
-     *   BooleanUtils.toBooleanObject("true ") = null // trailing space (too long)
-     *   BooleanUtils.toBooleanObject("ono")   = null // does not match on or no
-     * </pre>
-     *
-     * @param str  the String to check; upper and lower case are treated as the same
-     * @return the Boolean value of the string, {@code null} if no match or {@code null} input
-     */
-    public static Boolean toBooleanObject(final String str) {
-        // Previously used equalsIgnoreCase, which was fast for interned 'true'.
-        // Non interned 'true' matched 15 times slower.
-        //
-        // Optimisation provides same performance as before for interned 'true'.
-        // Similar performance for null, 'false', and other strings not length 2/3/4.
-        // 'true'/'TRUE' match 4 times slower, 'tRUE'/'True' 7 times slower.
-        if (str == "true") {
-            return Boolean.TRUE;
-        }
-        if (str == null) {
-            return null;
-        }
-        switch (str.length()) {
-            case 1: {
-                final char ch0 = str.charAt(0);
-                if (ch0 == 'y' || ch0 == 'Y' ||
-                    ch0 == 't' || ch0 == 'T') {
-                    return Boolean.TRUE;
-                }
-                if (ch0 == 'n' || ch0 == 'N' ||
-                    ch0 == 'f' || ch0 == 'F') {
-                    return Boolean.FALSE;
-                }
-                break;
-            }
-            case 2: {
-                final char ch0 = str.charAt(0);
-                final char ch1 = str.charAt(1);
-                if ((ch0 == 'o' || ch0 == 'O') &&
-                    (ch1 == 'n' || ch1 == 'N') ) {
-                    return Boolean.TRUE;
-                }
-                if ((ch0 == 'n' || ch0 == 'N') &&
-                    (ch1 == 'o' || ch1 == 'O') ) {
-                    return Boolean.FALSE;
-                }
-                break;
-            }
-            case 3: {
-                final char ch0 = str.charAt(0);
-                final char ch1 = str.charAt(1);
-                final char ch2 = str.charAt(2);
-                if ((ch0 == 'y' || ch0 == 'Y') &&
-                    (ch1 == 'e' || ch1 == 'E') &&
-                    (ch2 == 's' || ch2 == 'S') ) {
-                    return Boolean.TRUE;
-                }
-                if ((ch0 == 'o' || ch0 == 'O') &&
-                    (ch1 == 'f' || ch1 == 'F') &&
-                    (ch2 == 'f' || ch2 == 'F') ) {
-                    return Boolean.FALSE;
-                }
-                break;
-            }
-            case 4: {
-                final char ch0 = str.charAt(0);
-                final char ch1 = str.charAt(1);
-                final char ch2 = str.charAt(2);
-                final char ch3 = str.charAt(3);
-                if ((ch0 == 't' || ch0 == 'T') &&
-                    (ch1 == 'r' || ch1 == 'R') &&
-                    (ch2 == 'u' || ch2 == 'U') &&
-                    (ch3 == 'e' || ch3 == 'E') ) {
-                    return Boolean.TRUE;
-                }
-                break;
-            }
-            case 5: {
-                final char ch0 = str.charAt(0);
-                final char ch1 = str.charAt(1);
-                final char ch2 = str.charAt(2);
-                final char ch3 = str.charAt(3);
-                final char ch4 = str.charAt(4);
-                if ((ch0 == 'f' || ch0 == 'F') &&
-                    (ch1 == 'a' || ch1 == 'A') &&
-                    (ch2 == 'l' || ch2 == 'L') &&
-                    (ch3 == 's' || ch3 == 'S') &&
-                    (ch4 == 'e' || ch4 == 'E') ) {
-                    return Boolean.FALSE;
-                }
-                break;
-            }
-        default:
-            break;
-        }
-
-        return null;
-    }
-
-    /**
-     * <p>Converts a String to a Boolean throwing an exception if no match.</p>
-     *
-     * <p>NOTE: This returns null and will throw a NullPointerException if autoboxed to a boolean. </p>
-     *
-     * <pre>
-     *   BooleanUtils.toBooleanObject("true", "true", "false", "null")  = Boolean.TRUE
-     *   BooleanUtils.toBooleanObject("false", "true", "false", "null") = Boolean.FALSE
-     *   BooleanUtils.toBooleanObject("null", "true", "false", "null")  = null
-     * </pre>
-     *
-     * @param str  the String to check
-     * @param trueString  the String to match for {@code true} (case sensitive), may be {@code null}
-     * @param falseString  the String to match for {@code false} (case sensitive), may be {@code null}
-     * @param nullString  the String to match for {@code null} (case sensitive), may be {@code null}
-     * @return the Boolean value of the string, {@code null} if either the String matches {@code nullString}
-     *  or if {@code null} input and {@code nullString} is {@code null}
-     * @throws IllegalArgumentException if the String doesn't match
-     */
-    public static Boolean toBooleanObject(final String str, final String trueString, final String falseString, final String nullString) {
-        if (str == null) {
-            if (trueString == null) {
-                return Boolean.TRUE;
-            }
-            if (falseString == null) {
-                return Boolean.FALSE;
-            }
-            if (nullString == null) {
-                return null;
-            }
-        } else if (str.equals(trueString)) {
-            return Boolean.TRUE;
-        } else if (str.equals(falseString)) {
-            return Boolean.FALSE;
-        } else if (str.equals(nullString)) {
-            return null;
-        }
-        // no match
-        throw new IllegalArgumentException("The String did not match any specified value");
-    }
-
-    // String to boolean methods
-    //-----------------------------------------------------------------------
-    /**
-     * <p>Converts a String to a boolean (optimised for performance).</p>
-     *
-     * <p>{@code 'true'}, {@code 'on'}, {@code 'y'}, {@code 't'} or {@code 'yes'}
-     * (case insensitive) will return {@code true}. Otherwise,
-     * {@code false} is returned.</p>
-     *
-     * <p>This method performs 4 times faster (JDK1.4) than
-     * {@code Boolean.valueOf(String)}. However, this method accepts
-     * 'on' and 'yes', 't', 'y' as true values.
-     *
-     * <pre>
-     *   BooleanUtils.toBoolean(null)    = false
-     *   BooleanUtils.toBoolean("true")  = true
-     *   BooleanUtils.toBoolean("TRUE")  = true
-     *   BooleanUtils.toBoolean("tRUe")  = true
-     *   BooleanUtils.toBoolean("on")    = true
-     *   BooleanUtils.toBoolean("yes")   = true
-     *   BooleanUtils.toBoolean("false") = false
-     *   BooleanUtils.toBoolean("x gti") = false
-     *   BooleanUtils.toBooleanObject("y") = true
-     *   BooleanUtils.toBooleanObject("n") = false
-     *   BooleanUtils.toBooleanObject("t") = true
-     *   BooleanUtils.toBooleanObject("f") = false 
-     * </pre>
-     *
-     * @param str  the String to check
-     * @return the boolean value of the string, {@code false} if no match or the String is null
-     */
-    public static boolean toBoolean(final String str) {
-        return toBooleanObject(str) == Boolean.TRUE;
-    }
-
-    /**
-     * <p>Converts a String to a Boolean throwing an exception if no match found.</p>
-     *
-     * <pre>
-     *   BooleanUtils.toBoolean("true", "true", "false")  = true
-     *   BooleanUtils.toBoolean("false", "true", "false") = false
-     * </pre>
-     *
-     * @param str  the String to check
-     * @param trueString  the String to match for {@code true} (case sensitive), may be {@code null}
-     * @param falseString  the String to match for {@code false} (case sensitive), may be {@code null}
-     * @return the boolean value of the string
-     * @throws IllegalArgumentException if the String doesn't match
-     */
-    public static boolean toBoolean(final String str, final String trueString, final String falseString) {
-        if (str == trueString) {
-            return true;
-        } else if (str == falseString) {
-            return false;
-        } else if (str != null) {
-            if (str.equals(trueString)) {
-                return true;
-            } else if (str.equals(falseString)) {
-                return false;
-            }
-        }
-        // no match
-        throw new IllegalArgumentException("The String did not match either specified value");
-    }
-
-    // Boolean to String methods
-    //-----------------------------------------------------------------------
-    /**
-     * <p>Converts a Boolean to a String returning {@code 'true'},
-     * {@code 'false'}, or {@code null}.</p>
-     *
-     * <pre>
-     *   BooleanUtils.toStringTrueFalse(Boolean.TRUE)  = "true"
-     *   BooleanUtils.toStringTrueFalse(Boolean.FALSE) = "false"
-     *   BooleanUtils.toStringTrueFalse(null)          = null;
-     * </pre>
-     *
-     * @param bool  the Boolean to check
-     * @return {@code 'true'}, {@code 'false'}, or {@code null}
-     */
-    public static String toStringTrueFalse(final Boolean bool) {
-        return toString(bool, "true", "false", null);
-    }
-
-    /**
-     * <p>Converts a Boolean to a String returning {@code 'on'},
-     * {@code 'off'}, or {@code null}.</p>
-     *
-     * <pre>
-     *   BooleanUtils.toStringOnOff(Boolean.TRUE)  = "on"
-     *   BooleanUtils.toStringOnOff(Boolean.FALSE) = "off"
-     *   BooleanUtils.toStringOnOff(null)          = null;
-     * </pre>
-     *
-     * @param bool  the Boolean to check
-     * @return {@code 'on'}, {@code 'off'}, or {@code null}
-     */
-    public static String toStringOnOff(final Boolean bool) {
-        return toString(bool, "on", "off", null);
-    }
-
-    /**
-     * <p>Converts a Boolean to a String returning {@code 'yes'},
-     * {@code 'no'}, or {@code null}.</p>
-     *
-     * <pre>
-     *   BooleanUtils.toStringYesNo(Boolean.TRUE)  = "yes"
-     *   BooleanUtils.toStringYesNo(Boolean.FALSE) = "no"
-     *   BooleanUtils.toStringYesNo(null)          = null;
-     * </pre>
-     *
-     * @param bool  the Boolean to check
-     * @return {@code 'yes'}, {@code 'no'}, or {@code null}
-     */
-    public static String toStringYesNo(final Boolean bool) {
-        return toString(bool, "yes", "no", null);
-    }
-
-    /**
-     * <p>Converts a Boolean to a String returning one of the input Strings.</p>
-     *
-     * <pre>
-     *   BooleanUtils.toString(Boolean.TRUE, "true", "false", null)   = "true"
-     *   BooleanUtils.toString(Boolean.FALSE, "true", "false", null)  = "false"
-     *   BooleanUtils.toString(null, "true", "false", null)           = null;
-     * </pre>
-     *
-     * @param bool  the Boolean to check
-     * @param trueString  the String to return if {@code true}, may be {@code null}
-     * @param falseString  the String to return if {@code false}, may be {@code null}
-     * @param nullString  the String to return if {@code null}, may be {@code null}
-     * @return one of the three input Strings
-     */
-    public static String toString(final Boolean bool, final String trueString, final String falseString, final String nullString) {
-        if (bool == null) {
-            return nullString;
-        }
-        return bool.booleanValue() ? trueString : falseString;
-    }
-
-    // boolean to String methods
-    //-----------------------------------------------------------------------
-    /**
-     * <p>Converts a boolean to a String returning {@code 'true'}
-     * or {@code 'false'}.</p>
-     *
-     * <pre>
-     *   BooleanUtils.toStringTrueFalse(true)   = "true"
-     *   BooleanUtils.toStringTrueFalse(false)  = "false"
-     * </pre>
-     *
-     * @param bool  the Boolean to check
-     * @return {@code 'true'}, {@code 'false'}, or {@code null}
-     */
-    public static String toStringTrueFalse(final boolean bool) {
-        return toString(bool, "true", "false");
-    }
-
-    /**
-     * <p>Converts a boolean to a String returning {@code 'on'}
-     * or {@code 'off'}.</p>
-     *
-     * <pre>
-     *   BooleanUtils.toStringOnOff(true)   = "on"
-     *   BooleanUtils.toStringOnOff(false)  = "off"
-     * </pre>
-     *
-     * @param bool  the Boolean to check
-     * @return {@code 'on'}, {@code 'off'}, or {@code null}
-     */
-    public static String toStringOnOff(final boolean bool) {
-        return toString(bool, "on", "off");
-    }
-
-    /**
-     * <p>Converts a boolean to a String returning {@code 'yes'}
-     * or {@code 'no'}.</p>
-     *
-     * <pre>
-     *   BooleanUtils.toStringYesNo(true)   = "yes"
-     *   BooleanUtils.toStringYesNo(false)  = "no"
-     * </pre>
-     *
-     * @param bool  the Boolean to check
-     * @return {@code 'yes'}, {@code 'no'}, or {@code null}
-     */
-    public static String toStringYesNo(final boolean bool) {
-        return toString(bool, "yes", "no");
-    }
-
-    /**
-     * <p>Converts a boolean to a String returning one of the input Strings.</p>
-     *
-     * <pre>
-     *   BooleanUtils.toString(true, "true", "false")   = "true"
-     *   BooleanUtils.toString(false, "true", "false")  = "false"
-     * </pre>
-     *
-     * @param bool  the Boolean to check
-     * @param trueString  the String to return if {@code true}, may be {@code null}
-     * @param falseString  the String to return if {@code false}, may be {@code null}
-     * @return one of the two input Strings
-     */
-    public static String toString(final boolean bool, final String trueString, final String falseString) {
-        return bool ? trueString : falseString;
-    }
-
-    // logical operations
-    // ----------------------------------------------------------------------
-    /**
-     * <p>Performs an and on a set of booleans.</p>
-     *
-     * <pre>
-     *   BooleanUtils.and(true, true)         = true
-     *   BooleanUtils.and(false, false)       = false
-     *   BooleanUtils.and(true, false)        = false
-     *   BooleanUtils.and(true, true, false)  = false
-     *   BooleanUtils.and(true, true, true)   = true
-     * </pre>
-     *
-     * @param array  an array of {@code boolean}s
-     * @return {@code true} if the and is successful.
-     * @throws IllegalArgumentException if {@code array} is {@code null}
-     * @throws IllegalArgumentException if {@code array} is empty.
-     * @since 3.0.1
-     */
-    public static boolean and(final boolean... array) {
-        // Validates input
-        if (array == null) {
-            throw new IllegalArgumentException("The Array must not be null");
-        }
-        if (array.length == 0) {
-            throw new IllegalArgumentException("Array is empty");
-        }
-        for (final boolean element : array) {
-            if (!element) {
-                return false;
-            }
-        }
-        return true;
-    }
-
-    /**
-     * <p>Performs an and on an array of Booleans.</p>
-     *
-     * <pre>
-     *   BooleanUtils.and(Boolean.TRUE, Boolean.TRUE)                 = Boolean.TRUE
-     *   BooleanUtils.and(Boolean.FALSE, Boolean.FALSE)               = Boolean.FALSE
-     *   BooleanUtils.and(Boolean.TRUE, Boolean.FALSE)                = Boolean.FALSE
-     *   BooleanUtils.and(Boolean.TRUE, Boolean.TRUE, Boolean.TRUE)   = Boolean.TRUE
-     *   BooleanUtils.and(Boolean.FALSE, Boolean.FALSE, Boolean.TRUE) = Boolean.FALSE
-     *   BooleanUtils.and(Boolean.TRUE, Boolean.FALSE, Boolean.TRUE)  = Boolean.FALSE
-     * </pre>
-     *
-     * @param array  an array of {@code Boolean}s
-     * @return {@code true} if the and is successful.
-     * @throws IllegalArgumentException if {@code array} is {@code null}
-     * @throws IllegalArgumentException if {@code array} is empty.
-     * @throws IllegalArgumentException if {@code array} contains a {@code null}
-     * @since 3.0.1
-     */
-    public static Boolean and(final Boolean... array) {
-        if (array == null) {
-            throw new IllegalArgumentException("The Array must not be null");
-        }
-        if (array.length == 0) {
-            throw new IllegalArgumentException("Array is empty");
-        }
-        try {
-            final boolean[] primitive = ArrayUtils.toPrimitive(array);
-            return and(primitive) ? Boolean.TRUE : Boolean.FALSE;
-        } catch (final NullPointerException ex) {
-            throw new IllegalArgumentException("The array must not contain any null elements");
-        }
-    }
-
-    /**
-     * <p>Performs an or on a set of booleans.</p>
-     *
-     * <pre>
-     *   BooleanUtils.or(true, true)          = true
-     *   BooleanUtils.or(false, false)        = false
-     *   BooleanUtils.or(true, false)         = true
-     *   BooleanUtils.or(true, true, false)   = true
-     *   BooleanUtils.or(true, true, true)    = true
-     *   BooleanUtils.or(false, false, false) = false
-     * </pre>
-     *
-     * @param array  an array of {@code boolean}s
-     * @return {@code true} if the or is successful.
-     * @throws IllegalArgumentException if {@code array} is {@code null}
-     * @throws IllegalArgumentException if {@code array} is empty.
-     * @since 3.0.1
-     */
-    public static boolean or(final boolean... array) {
-        // Validates input
-        if (array == null) {
-            throw new IllegalArgumentException("The Array must not be null");
-        }
-        if (array.length == 0) {
-            throw new IllegalArgumentException("Array is empty");
-        }
-        for (final boolean element : array) {
-            if (element) {
-                return true;
-            }
-        }
-        return false;
-    }
-
-    /**
-     * <p>Performs an or on an array of Booleans.</p>
-     *
-     * <pre>
-     *   BooleanUtils.or(Boolean.TRUE, Boolean.TRUE)                  = Boolean.TRUE
-     *   BooleanUtils.or(Boolean.FALSE, Boolean.FALSE)                = Boolean.FALSE
-     *   BooleanUtils.or(Boolean.TRUE, Boolean.FALSE)                 = Boolean.TRUE
-     *   BooleanUtils.or(Boolean.TRUE, Boolean.TRUE, Boolean.TRUE)    = Boolean.TRUE
-     *   BooleanUtils.or(Boolean.FALSE, Boolean.FALSE, Boolean.TRUE)  = Boolean.TRUE
-     *   BooleanUtils.or(Boolean.TRUE, Boolean.FALSE, Boolean.TRUE)   = Boolean.TRUE
-     *   BooleanUtils.or(Boolean.FALSE, Boolean.FALSE, Boolean.FALSE) = Boolean.FALSE
-     * </pre>
-     *
-     * @param array  an array of {@code Boolean}s
-     * @return {@code true} if the or is successful.
-     * @throws IllegalArgumentException if {@code array} is {@code null}
-     * @throws IllegalArgumentException if {@code array} is empty.
-     * @throws IllegalArgumentException if {@code array} contains a {@code null}
-     * @since 3.0.1
-     */
-    public static Boolean or(final Boolean... array) {
-        if (array == null) {
-            throw new IllegalArgumentException("The Array must not be null");
-        }
-        if (array.length == 0) {
-            throw new IllegalArgumentException("Array is empty");
-        }
-        try {
-            final boolean[] primitive = ArrayUtils.toPrimitive(array);
-            return or(primitive) ? Boolean.TRUE : Boolean.FALSE;
-        } catch (final NullPointerException ex) {
-            throw new IllegalArgumentException("The array must not contain any null elements");
-        }
-    }
-
-    /**
-     * <p>Performs an xor on a set of booleans.</p>
-     *
-     * <pre>
-     *   BooleanUtils.xor(true, true)   = false
-     *   BooleanUtils.xor(false, false) = false
-     *   BooleanUtils.xor(true, false)  = true
-     *   BooleanUtils.xor(true, true)   = false
-     *   BooleanUtils.xor(false, false) = false
-     *   BooleanUtils.xor(true, false)  = true
-     * </pre>
-     *
-     * @param array  an array of {@code boolean}s
-     * @return {@code true} if the xor is successful.
-     * @throws IllegalArgumentException if {@code array} is {@code null}
-     * @throws IllegalArgumentException if {@code array} is empty.
-     */
-    public static boolean xor(final boolean... array) {
-        // Validates input
-        if (array == null) {
-            throw new IllegalArgumentException("The Array must not be null");
-        }
-        if (array.length == 0) {
-            throw new IllegalArgumentException("Array is empty");
-        }
-
-        // false if the neutral element of the xor operator
-        boolean result = false;
-        for (final boolean element : array) {
-            result ^= element;
-        }
-
-        return result;
-    }
-
-    /**
-     * <p>Performs an xor on an array of Booleans.</p>
-     *
-     * <pre>
-     *   BooleanUtils.xor(new Boolean[] { Boolean.TRUE, Boolean.TRUE })   = Boolean.FALSE
-     *   BooleanUtils.xor(new Boolean[] { Boolean.FALSE, Boolean.FALSE }) = Boolean.FALSE
-     *   BooleanUtils.xor(new Boolean[] { Boolean.TRUE, Boolean.FALSE })  = Boolean.TRUE
-     * </pre>
-     *
-     * @param array  an array of {@code Boolean}s
-     * @return {@code true} if the xor is successful.
-     * @throws IllegalArgumentException if {@code array} is {@code null}
-     * @throws IllegalArgumentException if {@code array} is empty.
-     * @throws IllegalArgumentException if {@code array} contains a {@code null}
-     */
-    public static Boolean xor(final Boolean... array) {
-        if (array == null) {
-            throw new IllegalArgumentException("The Array must not be null");
-        }
-        if (array.length == 0) {
-            throw new IllegalArgumentException("Array is empty");
-        }
-        try {
-            final boolean[] primitive = ArrayUtils.toPrimitive(array);
-            return xor(primitive) ? Boolean.TRUE : Boolean.FALSE;
-        } catch (final NullPointerException ex) {
-            throw new IllegalArgumentException("The array must not contain any null elements");
-        }
-    }
-
-    /**
-     * <p>Compares two {@code boolean} values. This is the same functionality as provided in Java 7.</p>
-     *
-     * @param x the first {@code boolean} to compare
-     * @param y the second {@code boolean} to compare
-     * @return the value {@code 0} if {@code x == y};
-     *         a value less than {@code 0} if {@code !x && y}; and
-     *         a value greater than {@code 0} if {@code x && !y}
-     * @since 3.4
-     */
-    public static int compare(boolean x, boolean y) {
-        if (x == y) {
-            return 0;
-        }
-        if (x) {
-            return 1;
-        } else {
-            return -1;
-        }
-    }
-
-}
diff --git a/lang/src/main/java/org/apache/commons/lang3/CharEncoding.java b/lang/src/main/java/org/apache/commons/lang3/CharEncoding.java
deleted file mode 100644
index 2b48829..0000000
--- a/lang/src/main/java/org/apache/commons/lang3/CharEncoding.java
+++ /dev/null
@@ -1,105 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package org.apache.commons.lang3;
-
-import java.nio.charset.Charset;
-import java.nio.charset.IllegalCharsetNameException;
-
-/**
- * <p>Character encoding names required of every implementation of the Java platform.</p>
- *
- * <p>According to <a href="http://docs.oracle.com/javase/1.3/docs/api/java/lang/package-summary.html#charenc">JRE character
- * encoding names</a>:</p>
- *
- * <p><cite>Every implementation of the Java platform is required to support the following character encodings.
- * Consult the release documentation for your implementation to see if any other encodings are supported.
- * </cite></p>
- *
- * @see <a href="http://download.oracle.com/javase/1.3/docs/guide/intl/encoding.doc.html">JRE character encoding names</a>
- * @since 2.1
- * @version $Id$
- */
-public class CharEncoding {
-
-    /**
-     * <p>ISO Latin Alphabet #1, also known as ISO-LATIN-1.</p>
-     *
-     * <p>Every implementation of the Java platform is required to support this character encoding.</p>
-     */
-    public static final String ISO_8859_1 = "ISO-8859-1";
-
-    /**
-     * <p>Seven-bit ASCII, also known as ISO646-US, also known as the Basic Latin block
-     * of the Unicode character set.</p>
-     *
-     * <p>Every implementation of the Java platform is required to support this character encoding.</p>
-     */
-    public static final String US_ASCII = "US-ASCII";
-
-    /**
-     * <p>Sixteen-bit Unicode Transformation Format, byte order specified by a mandatory initial
-     * byte-order mark (either order accepted on input, big-endian used on output).</p>
-     *
-     * <p>Every implementation of the Java platform is required to support this character encoding.</p>
-     */
-    public static final String UTF_16 = "UTF-16";
-
-    /**
-     * <p>Sixteen-bit Unicode Transformation Format, big-endian byte order.</p>
-     *
-     * <p>Every implementation of the Java platform is required to support this character encoding.</p>
-     */
-    public static final String UTF_16BE = "UTF-16BE";
-
-    /**
-     * <p>Sixteen-bit Unicode Transformation Format, little-endian byte order.</p>
-     *
-     * <p>Every implementation of the Java platform is required to support this character encoding.</p>
-     */
-    public static final String UTF_16LE = "UTF-16LE";
-
-    /**
-     * <p>Eight-bit Unicode Transformation Format.</p>
-     *
-     * <p>Every implementation of the Java platform is required to support this character encoding.</p>
-     */
-    public static final String UTF_8 = "UTF-8";
-
-    //-----------------------------------------------------------------------
-    /**
-     * <p>Returns whether the named charset is supported.</p>
-     *
-     * <p>This is similar to <a
-     * href="http://download.oracle.com/javase/1.4.2/docs/api/java/nio/charset/Charset.html#isSupported%28java.lang.String%29">
-     * java.nio.charset.Charset.isSupported(String)</a> but handles more formats</p>
-     *
-     * @param name  the name of the requested charset; may be either a canonical name or an alias, null returns false
-     * @return {@code true} if the charset is available in the current Java virtual machine
-     */
-    public static boolean isSupported(final String name) {
-        if (name == null) {
-            return false;
-        }
-        try {
-            return Charset.isSupported(name);
-        } catch (final IllegalCharsetNameException ex) {
-            return false;
-        }
-    }
-
-}
diff --git a/lang/src/main/java/org/apache/commons/lang3/CharRange.java b/lang/src/main/java/org/apache/commons/lang3/CharRange.java
deleted file mode 100644
index 39b26f9..0000000
--- a/lang/src/main/java/org/apache/commons/lang3/CharRange.java
+++ /dev/null
@@ -1,360 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- * 
- *      http://www.apache.org/licenses/LICENSE-2.0
- * 
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.commons.lang3;
-
-import java.io.Serializable;
-import java.util.Iterator;
-import java.util.NoSuchElementException;
-
-/**
- * <p>A contiguous range of characters, optionally negated.</p>
- * 
- * <p>Instances are immutable.</p>
- *
- * <p>#ThreadSafe#</p>
- * @since 1.0
- * @version $Id$
- */
-// TODO: This is no longer public and will be removed later as CharSet is moved 
-// to depend on Range.
-final class CharRange implements Iterable<Character>, Serializable {
-
-    /**
-     * Required for serialization support. Lang version 2.0. 
-     * 
-     * @see java.io.Serializable
-     */
-    private static final long serialVersionUID = 8270183163158333422L;
-    
-    /** The first character, inclusive, in the range. */
-    private final char start;
-    /** The last character, inclusive, in the range. */
-    private final char end;
-    /** True if the range is everything except the characters specified. */
-    private final boolean negated;
-    
-    /** Cached toString. */
-    private transient String iToString;
-
-    /**
-     * <p>Constructs a {@code CharRange} over a set of characters,
-     * optionally negating the range.</p>
-     *
-     * <p>A negated range includes everything except that defined by the
-     * start and end characters.</p>
-     * 
-     * <p>If start and end are in the wrong order, they are reversed.
-     * Thus {@code a-e} is the same as {@code e-a}.</p>
-     *
-     * @param start  first character, inclusive, in this range
-     * @param end  last character, inclusive, in this range
-     * @param negated  true to express everything except the range
-     */
-    private CharRange(char start, char end, final boolean negated) {
-        super();
-        if (start > end) {
-            final char temp = start;
-            start = end;
-            end = temp;
-        }
-        
-        this.start = start;
-        this.end = end;
-        this.negated = negated;
-    }
-
-    /**
-     * <p>Constructs a {@code CharRange} over a single character.</p>
-     *
-     * @param ch  only character in this range
-     * @return the new CharRange object
-     * @see CharRange#CharRange(char, char, boolean)
-     * @since 2.5
-     */
-    public static CharRange is(final char ch) {
-        return new CharRange(ch, ch, false);
-    }
-
-    /**
-     * <p>Constructs a negated {@code CharRange} over a single character.</p>
-     *
-     * @param ch  only character in this range
-     * @return the new CharRange object
-     * @see CharRange#CharRange(char, char, boolean)
-     * @since 2.5
-     */
-    public static CharRange isNot(final char ch) {
-        return new CharRange(ch, ch, true);
-    }
-
-    /**
-     * <p>Constructs a {@code CharRange} over a set of characters.</p>
-     *
-     * @param start  first character, inclusive, in this range
-     * @param end  last character, inclusive, in this range
-     * @return the new CharRange object
-     * @see CharRange#CharRange(char, char, boolean)
-     * @since 2.5
-     */
-    public static CharRange isIn(final char start, final char end) {
-        return new CharRange(start, end, false);
-    }
-
-    /**
-     * <p>Constructs a negated {@code CharRange} over a set of characters.</p>
-     *
-     * @param start  first character, inclusive, in this range
-     * @param end  last character, inclusive, in this range
-     * @return the new CharRange object
-     * @see CharRange#CharRange(char, char, boolean)
-     * @since 2.5
-     */
-    public static CharRange isNotIn(final char start, final char end) {
-        return new CharRange(start, end, true);
-    }
-
-    // Accessors
-    //-----------------------------------------------------------------------
-    /**
-     * <p>Gets the start character for this character range.</p>
-     * 
-     * @return the start char (inclusive)
-     */
-    public char getStart() {
-        return this.start;
-    }
-
-    /**
-     * <p>Gets the end character for this character range.</p>
-     * 
-     * @return the end char (inclusive)
-     */
-    public char getEnd() {
-        return this.end;
-    }
-
-    /**
-     * <p>Is this {@code CharRange} negated.</p>
-     * 
-     * <p>A negated range includes everything except that defined by the
-     * start and end characters.</p>
-     *
-     * @return {@code true} if negated
-     */
-    public boolean isNegated() {
-        return negated;
-    }
-
-    // Contains
-    //-----------------------------------------------------------------------
-    /**
-     * <p>Is the character specified contained in this range.</p>
-     *
-     * @param ch  the character to check
-     * @return {@code true} if this range contains the input character
-     */
-    public boolean contains(final char ch) {
-        return (ch >= start && ch <= end) != negated;
-    }
-
-    /**
-     * <p>Are all the characters of the passed in range contained in
-     * this range.</p>
-     *
-     * @param range  the range to check against
-     * @return {@code true} if this range entirely contains the input range
-     * @throws IllegalArgumentException if {@code null} input
-     */
-    public boolean contains(final CharRange range) {
-        if (range == null) {
-            throw new IllegalArgumentException("The Range must not be null");
-        }
-        if (negated) {
-            if (range.negated) {
-                return start >= range.start && end <= range.end;
-            }
-            return range.end < start || range.start > end;
-        }
-        if (range.negated) {
-            return start == 0 && end == Character.MAX_VALUE;
-        }
-        return start <= range.start && end >= range.end;
-    }
-
-    // Basics
-    //-----------------------------------------------------------------------
-    /**
-     * <p>Compares two CharRange objects, returning true if they represent
-     * exactly the same range of characters defined in the same way.</p>
-     * 
-     * @param obj  the object to compare to
-     * @return true if equal
-     */
-    @Override
-    public boolean equals(final Object obj) {
-        if (obj == this) {
-            return true;
-        }
-        if (obj instanceof CharRange == false) {
-            return false;
-        }
-        final CharRange other = (CharRange) obj;
-        return start == other.start && end == other.end && negated == other.negated;
-    }
-
-    /**
-     * <p>Gets a hashCode compatible with the equals method.</p>
-     * 
-     * @return a suitable hashCode
-     */
-    @Override
-    public int hashCode() {
-        return 83 + start + 7 * end + (negated ? 1 : 0);
-    }
-    
-    /**
-     * <p>Gets a string representation of the character range.</p>
-     * 
-     * @return string representation of this range
-     */
-    @Override
-    public String toString() {
-        if (iToString == null) {
-            final StringBuilder buf = new StringBuilder(4);
-            if (isNegated()) {
-                buf.append('^');
-            }
-            buf.append(start);
-            if (start != end) {
-                buf.append('-');
-                buf.append(end);
-            }
-            iToString = buf.toString();
-        }
-        return iToString;
-    }
-
-    // Expansions
-    //-----------------------------------------------------------------------
-    /**
-     * <p>Returns an iterator which can be used to walk through the characters described by this range.</p>
-     *
-     * <p>#NotThreadSafe# the iterator is not thread-safe</p>
-     * @return an iterator to the chars represented by this range
-     * @since 2.5
-     */
-    @Override
-    public Iterator<Character> iterator() {
-        return new CharacterIterator(this);
-    }
-
-    /**
-     * Character {@link Iterator}.
-     * <p>#NotThreadSafe#</p>
-     */
-    private static class CharacterIterator implements Iterator<Character> {
-        /** The current character */
-        private char current;
-
-        private final CharRange range;
-        private boolean hasNext;
-
-        /**
-         * Construct a new iterator for the character range.
-         *
-         * @param r The character range
-         */
-        private CharacterIterator(final CharRange r) {
-            range = r;
-            hasNext = true;
-
-            if (range.negated) {
-                if (range.start == 0) {
-                    if (range.end == Character.MAX_VALUE) {
-                        // This range is an empty set
-                        hasNext = false;
-                    } else {
-                        current = (char) (range.end + 1);
-                    }
-                } else {
-                    current = 0;
-                }
-            } else {
-                current = range.start;
-            }
-        }
-
-        /**
-         * Prepare the next character in the range.
-         */
-        private void prepareNext() {
-            if (range.negated) {
-                if (current == Character.MAX_VALUE) {
-                    hasNext = false;
-                } else if (current + 1 == range.start) {
-                    if (range.end == Character.MAX_VALUE) {
-                        hasNext = false;
-                    } else {
-                        current = (char) (range.end + 1);
-                    }
-                } else {
-                    current = (char) (current + 1);
-                }
-            } else if (current < range.end) {
-                current = (char) (current + 1);
-            } else {
-                hasNext = false;
-            }
-        }
-
-        /**
-         * Has the iterator not reached the end character yet?
-         *
-         * @return {@code true} if the iterator has yet to reach the character date
-         */
-        @Override
-        public boolean hasNext() {
-            return hasNext;
-        }
-
-        /**
-         * Return the next character in the iteration
-         *
-         * @return {@code Character} for the next character
-         */
-        @Override
-        public Character next() {
-            if (hasNext == false) {
-                throw new NoSuchElementException();
-            }
-            final char cur = current;
-            prepareNext();
-            return Character.valueOf(cur);
-        }
-
-        /**
-         * Always throws UnsupportedOperationException.
-         *
-         * @throws UnsupportedOperationException
-         * @see java.util.Iterator#remove()
-         */
-        @Override
-        public void remove() {
-            throw new UnsupportedOperationException();
-        }
-    }
-}
diff --git a/lang/src/main/java/org/apache/commons/lang3/CharSequenceUtils.java b/lang/src/main/java/org/apache/commons/lang3/CharSequenceUtils.java
deleted file mode 100644
index 2395dc5..0000000
--- a/lang/src/main/java/org/apache/commons/lang3/CharSequenceUtils.java
+++ /dev/null
@@ -1,216 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.commons.lang3;
-
-/**
- * <p>Operations on {@link CharSequence} that are
- * {@code null} safe.</p>
- *
- * @see CharSequence
- * @since 3.0
- * @version $Id$
- */
-public class CharSequenceUtils {
-
-    private static final int NOT_FOUND = -1;
-
-    /**
-     * <p>{@code CharSequenceUtils} instances should NOT be constructed in
-     * standard programming. </p>
-     *
-     * <p>This constructor is public to permit tools that require a JavaBean
-     * instance to operate.</p>
-     */
-    public CharSequenceUtils() {
-        super();
-    }
-
-    //-----------------------------------------------------------------------
-    /**
-     * <p>Returns a new {@code CharSequence} that is a subsequence of this
-     * sequence starting with the {@code char} value at the specified index.</p>
-     *
-     * <p>This provides the {@code CharSequence} equivalent to {@link String#substring(int)}.
-     * The length (in {@code char}) of the returned sequence is {@code length() - start},
-     * so if {@code start == end} then an empty sequence is returned.</p>
-     *
-     * @param cs  the specified subsequence, null returns null
-     * @param start  the start index, inclusive, valid
-     * @return a new subsequence, may be null
-     * @throws IndexOutOfBoundsException if {@code start} is negative or if 
-     *  {@code start} is greater than {@code length()}
-     */
-    public static CharSequence subSequence(final CharSequence cs, final int start) {
-        return cs == null ? null : cs.subSequence(start, cs.length());
-    }
-
-    //-----------------------------------------------------------------------
-    /**
-     * <p>Finds the first index in the {@code CharSequence} that matches the
-     * specified character.</p>
-     *
-     * @param cs  the {@code CharSequence} to be processed, not null
-     * @param searchChar  the char to be searched for
-     * @param start  the start index, negative starts at the string start
-     * @return the index where the search char was found, -1 if not found
-     */
-    static int indexOf(final CharSequence cs, final int searchChar, int start) {
-        if (cs instanceof String) {
-            return ((String) cs).indexOf(searchChar, start);
-        }
-        final int sz = cs.length();
-        if (start < 0) {
-            start = 0;
-        }
-        for (int i = start; i < sz; i++) {
-            if (cs.charAt(i) == searchChar) {
-                return i;
-            }
-        }
-        return NOT_FOUND;
-    }
-
-    /**
-     * Used by the indexOf(CharSequence methods) as a green implementation of indexOf.
-     *
-     * @param cs the {@code CharSequence} to be processed
-     * @param searchChar the {@code CharSequence} to be searched for
-     * @param start the start index
-     * @return the index where the search sequence was found
-     */
-    static int indexOf(final CharSequence cs, final CharSequence searchChar, final int start) {
-        return cs.toString().indexOf(searchChar.toString(), start);
-//        if (cs instanceof String && searchChar instanceof String) {
-//            // TODO: Do we assume searchChar is usually relatively small;
-//            //       If so then calling toString() on it is better than reverting to
-//            //       the green implementation in the else block
-//            return ((String) cs).indexOf((String) searchChar, start);
-//        } else {
-//            // TODO: Implement rather than convert to String
-//            return cs.toString().indexOf(searchChar.toString(), start);
-//        }
-    }
-
-    /**
-     * <p>Finds the last index in the {@code CharSequence} that matches the
-     * specified character.</p>
-     *
-     * @param cs  the {@code CharSequence} to be processed
-     * @param searchChar  the char to be searched for
-     * @param start  the start index, negative returns -1, beyond length starts at end
-     * @return the index where the search char was found, -1 if not found
-     */
-    static int lastIndexOf(final CharSequence cs, final int searchChar, int start) {
-        if (cs instanceof String) {
-            return ((String) cs).lastIndexOf(searchChar, start);
-        }
-        final int sz = cs.length();
-        if (start < 0) {
-            return NOT_FOUND;
-        }
-        if (start >= sz) {
-            start = sz - 1;
-        }
-        for (int i = start; i >= 0; --i) {
-            if (cs.charAt(i) == searchChar) {
-                return i;
-            }
-        }
-        return NOT_FOUND;
-    }
-
-    /**
-     * Used by the lastIndexOf(CharSequence methods) as a green implementation of lastIndexOf
-     *
-     * @param cs the {@code CharSequence} to be processed
-     * @param searchChar the {@code CharSequence} to be searched for
-     * @param start the start index
-     * @return the index where the search sequence was found
-     */
-    static int lastIndexOf(final CharSequence cs, final CharSequence searchChar, final int start) {
-        return cs.toString().lastIndexOf(searchChar.toString(), start);
-//        if (cs instanceof String && searchChar instanceof String) {
-//            // TODO: Do we assume searchChar is usually relatively small;
-//            //       If so then calling toString() on it is better than reverting to
-//            //       the green implementation in the else block
-//            return ((String) cs).lastIndexOf((String) searchChar, start);
-//        } else {
-//            // TODO: Implement rather than convert to String
-//            return cs.toString().lastIndexOf(searchChar.toString(), start);
-//        }
-    }
-
-    /**
-     * Green implementation of toCharArray.
-     *
-     * @param cs the {@code CharSequence} to be processed
-     * @return the resulting char array
-     */
-    static char[] toCharArray(final CharSequence cs) {
-        if (cs instanceof String) {
-            return ((String) cs).toCharArray();
-        }
-        final int sz = cs.length();
-        final char[] array = new char[cs.length()];
-        for (int i = 0; i < sz; i++) {
-            array[i] = cs.charAt(i);
-        }
-        return array;
-    }
-
-    /**
-     * Green implementation of regionMatches.
-     *
-     * @param cs the {@code CharSequence} to be processed
-     * @param ignoreCase whether or not to be case insensitive
-     * @param thisStart the index to start on the {@code cs} CharSequence
-     * @param substring the {@code CharSequence} to be looked for
-     * @param start the index to start on the {@code substring} CharSequence
-     * @param length character length of the region
-     * @return whether the region matched
-     */
-    static boolean regionMatches(final CharSequence cs, final boolean ignoreCase, final int thisStart,
-            final CharSequence substring, final int start, final int length)    {
-        if (cs instanceof String && substring instanceof String) {
-            return ((String) cs).regionMatches(ignoreCase, thisStart, (String) substring, start, length);
-        }
-        int index1 = thisStart;
-        int index2 = start;
-        int tmpLen = length;
-
-        while (tmpLen-- > 0) {
-            final char c1 = cs.charAt(index1++);
-            final char c2 = substring.charAt(index2++);
-
-            if (c1 == c2) {
-                continue;
-            }
-
-            if (!ignoreCase) {
-                return false;
-            }
-
-            // The same check as in String.regionMatches():
-            if (Character.toUpperCase(c1) != Character.toUpperCase(c2)
-                    && Character.toLowerCase(c1) != Character.toLowerCase(c2)) {
-                return false;
-            }
-        }
-
-        return true;
-    }
-}
diff --git a/lang/src/main/java/org/apache/commons/lang3/CharSet.java b/lang/src/main/java/org/apache/commons/lang3/CharSet.java
deleted file mode 100644
index 82f0b9a..0000000
--- a/lang/src/main/java/org/apache/commons/lang3/CharSet.java
+++ /dev/null
@@ -1,278 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- * 
- *      http://www.apache.org/licenses/LICENSE-2.0
- * 
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.commons.lang3;
-
-import java.io.Serializable;
-import java.util.Collections;
-import java.util.HashMap;
-import java.util.HashSet;
-import java.util.Map;
-import java.util.Set;
-
-/**
- * <p>A set of characters.</p>
- *
- * <p>Instances are immutable, but instances of subclasses may not be.</p>
- *
- * <p>#ThreadSafe#</p>
- * @since 1.0
- * @version $Id$
- */
-public class CharSet implements Serializable {
-
-    /**
-     * Required for serialization support. Lang version 2.0. 
-     * 
-     * @see java.io.Serializable
-     */
-    private static final long serialVersionUID = 5947847346149275958L;
-
-    /** 
-     * A CharSet defining no characters. 
-     * @since 2.0
-     */
-    public static final CharSet EMPTY = new CharSet((String) null);
-
-    /** 
-     * A CharSet defining ASCII alphabetic characters "a-zA-Z".
-     * @since 2.0
-     */
-    public static final CharSet ASCII_ALPHA = new CharSet("a-zA-Z");
-
-    /** 
-     * A CharSet defining ASCII alphabetic characters "a-z".
-     * @since 2.0
-     */
-    public static final CharSet ASCII_ALPHA_LOWER = new CharSet("a-z");
-
-    /** 
-     * A CharSet defining ASCII alphabetic characters "A-Z".
-     * @since 2.0
-     */
-    public static final CharSet ASCII_ALPHA_UPPER = new CharSet("A-Z");
-
-    /** 
-     * A CharSet defining ASCII alphabetic characters "0-9".
-     * @since 2.0
-     */
-    public static final CharSet ASCII_NUMERIC = new CharSet("0-9");
-
-    /**
-     * A Map of the common cases used in the factory.
-     * Subclasses can add more common patterns if desired
-     * @since 2.0
-     */
-    protected static final Map<String, CharSet> COMMON = Collections.synchronizedMap(new HashMap<String, CharSet>());
-    
-    static {
-        COMMON.put(null, EMPTY);
-        COMMON.put("", EMPTY);
-        COMMON.put("a-zA-Z", ASCII_ALPHA);
-        COMMON.put("A-Za-z", ASCII_ALPHA);
-        COMMON.put("a-z", ASCII_ALPHA_LOWER);
-        COMMON.put("A-Z", ASCII_ALPHA_UPPER);
-        COMMON.put("0-9", ASCII_NUMERIC);
-    }
-
-    /** The set of CharRange objects. */
-    private final Set<CharRange> set = Collections.synchronizedSet(new HashSet<CharRange>());
-
-    //-----------------------------------------------------------------------
-    /**
-     * <p>Factory method to create a new CharSet using a special syntax.</p>
-     *
-     * <ul>
-     *  <li>{@code null} or empty string ("")
-     * - set containing no characters</li>
-     *  <li>Single character, such as "a"
-     *  - set containing just that character</li>
-     *  <li>Multi character, such as "a-e"
-     *  - set containing characters from one character to the other</li>
-     *  <li>Negated, such as "^a" or "^a-e"
-     *  - set containing all characters except those defined</li>
-     *  <li>Combinations, such as "abe-g"
-     *  - set containing all the characters from the individual sets</li>
-     * </ul>
-     *
-     * <p>The matching order is:</p>
-     * <ol>
-     *  <li>Negated multi character range, such as "^a-e"
-     *  <li>Ordinary multi character range, such as "a-e"
-     *  <li>Negated single character, such as "^a"
-     *  <li>Ordinary single character, such as "a"
-     * </ol>
-     * <p>Matching works left to right. Once a match is found the
-     * search starts again from the next character.</p>
-     *
-     * <p>If the same range is defined twice using the same syntax, only
-     * one range will be kept.
-     * Thus, "a-ca-c" creates only one range of "a-c".</p>
-     *
-     * <p>If the start and end of a range are in the wrong order,
-     * they are reversed. Thus "a-e" is the same as "e-a".
-     * As a result, "a-ee-a" would create only one range,
-     * as the "a-e" and "e-a" are the same.</p>
-     *
-     * <p>The set of characters represented is the union of the specified ranges.</p>
-     *
-     * <p>All CharSet objects returned by this method will be immutable.</p>
-     *
-     * @param setStrs  Strings to merge into the set, may be null
-     * @return a CharSet instance
-     * @since 2.4
-     */
-    public static CharSet getInstance(final String... setStrs) {
-        if (setStrs == null) {
-            return null;
-        }
-        if (setStrs.length == 1) {
-            final CharSet common = COMMON.get(setStrs[0]);
-            if (common != null) {
-                return common;
-            }
-        }
-        return new CharSet(setStrs); 
-    }
-
-    //-----------------------------------------------------------------------
-    /**
-     * <p>Constructs a new CharSet using the set syntax.
-     * Each string is merged in with the set.</p>
-     *
-     * @param set  Strings to merge into the initial set
-     * @throws NullPointerException if set is {@code null}
-     */
-    protected CharSet(final String... set) {
-        super();
-        final int sz = set.length;
-        for (int i = 0; i < sz; i++) {
-            add(set[i]);
-        }
-    }
-
-    //-----------------------------------------------------------------------
-    /**
-     * <p>Add a set definition string to the {@code CharSet}.</p>
-     *
-     * @param str  set definition string
-     */
-    protected void add(final String str) {
-        if (str == null) {
-            return;
-        }
-
-        final int len = str.length();
-        int pos = 0;
-        while (pos < len) {
-            final int remainder = len - pos;
-            if (remainder >= 4 && str.charAt(pos) == '^' && str.charAt(pos + 2) == '-') {
-                // negated range
-                set.add(CharRange.isNotIn(str.charAt(pos + 1), str.charAt(pos + 3)));
-                pos += 4;
-            } else if (remainder >= 3 && str.charAt(pos + 1) == '-') {
-                // range
-                set.add(CharRange.isIn(str.charAt(pos), str.charAt(pos + 2)));
-                pos += 3;
-            } else if (remainder >= 2 && str.charAt(pos) == '^') {
-                // negated char
-                set.add(CharRange.isNot(str.charAt(pos + 1)));
-                pos += 2;
-            } else {
-                // char
-                set.add(CharRange.is(str.charAt(pos)));
-                pos += 1;
-            }
-        }
-    }
-
-    //-----------------------------------------------------------------------
-    /**
-     * <p>Gets the internal set as an array of CharRange objects.</p>
-     *
-     * @return an array of immutable CharRange objects
-     * @since 2.0
-     */
-// NOTE: This is no longer public as CharRange is no longer a public class. 
-//       It may be replaced when CharSet moves to Range.
-    /*public*/ CharRange[] getCharRanges() {
-        return set.toArray(new CharRange[set.size()]);
-    }
-
-    //-----------------------------------------------------------------------
-    /**
-     * <p>Does the {@code CharSet} contain the specified
-     * character {@code ch}.</p>
-     *
-     * @param ch  the character to check for
-     * @return {@code true} if the set contains the characters
-     */
-    public boolean contains(final char ch) {
-        for (final CharRange range : set) {
-            if (range.contains(ch)) {
-                return true;
-            }
-        }
-        return false;
-    }
-
-    // Basics
-    //-----------------------------------------------------------------------
-    /**
-     * <p>Compares two {@code CharSet} objects, returning true if they represent
-     * exactly the same set of characters defined in the same way.</p>
-     *
-     * <p>The two sets {@code abc} and {@code a-c} are <i>not</i>
-     * equal according to this method.</p>
-     *
-     * @param obj  the object to compare to
-     * @return true if equal
-     * @since 2.0
-     */
-    @Override
-    public boolean equals(final Object obj) {
-        if (obj == this) {
-            return true;
-        }
-        if (obj instanceof CharSet == false) {
-            return false;
-        }
-        final CharSet other = (CharSet) obj;
-        return set.equals(other.set);
-    }
-
-    /**
-     * <p>Gets a hash code compatible with the equals method.</p>
-     *
-     * @return a suitable hash code
-     * @since 2.0
-     */
-    @Override
-    public int hashCode() {
-        return 89 + set.hashCode();
-    }
-
-    /**
-     * <p>Gets a string representation of the set.</p>
-     *
-     * @return string representation of the set
-     */
-    @Override
-    public String toString() {
-        return set.toString();
-    }
-
-}
diff --git a/lang/src/main/java/org/apache/commons/lang3/CharSetUtils.java b/lang/src/main/java/org/apache/commons/lang3/CharSetUtils.java
deleted file mode 100644
index 704a8fb..0000000
--- a/lang/src/main/java/org/apache/commons/lang3/CharSetUtils.java
+++ /dev/null
@@ -1,251 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- * 
- *      http://www.apache.org/licenses/LICENSE-2.0
- * 
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.commons.lang3;
-
-/**
- * <p>Operations on {@code CharSet} instances.</p>
- *
- * <p>This class handles {@code null} input gracefully.
- * An exception will not be thrown for a {@code null} input.
- * Each method documents its behaviour in more detail.</p>
- * 
- * <p>#ThreadSafe#</p>
- * @see CharSet
- * @since 1.0
- * @version $Id$
- */
-public class CharSetUtils {
-
-    /**
-     * <p>CharSetUtils instances should NOT be constructed in standard programming.
-     * Instead, the class should be used as {@code CharSetUtils.evaluateSet(null);}.</p>
-     *
-     * <p>This constructor is public to permit tools that require a JavaBean instance
-     * to operate.</p>
-     */
-    public CharSetUtils() {
-      super();
-    }
-
-    // Squeeze
-    //-----------------------------------------------------------------------
-    /**
-     * <p>Squeezes any repetitions of a character that is mentioned in the
-     * supplied set.</p>
-     *
-     * <pre>
-     * CharSetUtils.squeeze(null, *)        = null
-     * CharSetUtils.squeeze("", *)          = ""
-     * CharSetUtils.squeeze(*, null)        = *
-     * CharSetUtils.squeeze(*, "")          = *
-     * CharSetUtils.squeeze("hello", "k-p") = "helo"
-     * CharSetUtils.squeeze("hello", "a-e") = "hello"
-     * </pre>
-     *
-     * @see CharSet#getInstance(java.lang.String...) for set-syntax.
-     * @param str  the string to squeeze, may be null
-     * @param set  the character set to use for manipulation, may be null
-     * @return the modified String, {@code null} if null string input
-     */
-    public static String squeeze(final String str, final String... set) {
-        if (StringUtils.isEmpty(str) || deepEmpty(set)) {
-            return str;
-        }
-        final CharSet chars = CharSet.getInstance(set);
-        final StringBuilder buffer = new StringBuilder(str.length());
-        final char[] chrs = str.toCharArray();
-        final int sz = chrs.length;
-        char lastChar = ' ';
-        char ch = ' ';
-        for (int i = 0; i < sz; i++) {
-            ch = chrs[i];
-            // Compare with contains() last for performance.
-            if (ch == lastChar && i != 0 && chars.contains(ch)) {
-                continue;
-            }
-            buffer.append(ch);
-            lastChar = ch;
-        }
-        return buffer.toString();
-    }
-
-    // ContainsAny
-    //-----------------------------------------------------------------------
-    /**
-     * <p>Takes an argument in set-syntax, see evaluateSet,
-     * and identifies whether any of the characters are present in the specified string.</p>
-     *
-     * <pre>
-     * CharSetUtils.containsAny(null, *)        = false
-     * CharSetUtils.containsAny("", *)          = false
-     * CharSetUtils.containsAny(*, null)        = false
-     * CharSetUtils.containsAny(*, "")          = false
-     * CharSetUtils.containsAny("hello", "k-p") = true
-     * CharSetUtils.containsAny("hello", "a-d") = false
-     * </pre>
-     *
-     * @see CharSet#getInstance(java.lang.String...) for set-syntax.
-     * @param str  String to look for characters in, may be null
-     * @param set  String[] set of characters to identify, may be null
-     * @return whether or not the characters in the set are in the primary string
-     * @since 3.2
-     */
-    public static boolean containsAny(final String str, final String... set) {
-        if (StringUtils.isEmpty(str) || deepEmpty(set)) {
-            return false;
-        }
-        final CharSet chars = CharSet.getInstance(set);
-        for (final char c : str.toCharArray()) {
-            if (chars.contains(c)) {
-                return true;
-            }
-        }
-        return false;
-    }
-
-    // Count
-    //-----------------------------------------------------------------------
-    /**
-     * <p>Takes an argument in set-syntax, see evaluateSet,
-     * and returns the number of characters present in the specified string.</p>
-     *
-     * <pre>
-     * CharSetUtils.count(null, *)        = 0
-     * CharSetUtils.count("", *)          = 0
-     * CharSetUtils.count(*, null)        = 0
-     * CharSetUtils.count(*, "")          = 0
-     * CharSetUtils.count("hello", "k-p") = 3
-     * CharSetUtils.count("hello", "a-e") = 1
-     * </pre>
-     *
-     * @see CharSet#getInstance(java.lang.String...) for set-syntax.
-     * @param str  String to count characters in, may be null
-     * @param set  String[] set of characters to count, may be null
-     * @return the character count, zero if null string input
-     */
-    public static int count(final String str, final String... set) {
-        if (StringUtils.isEmpty(str) || deepEmpty(set)) {
-            return 0;
-        }
-        final CharSet chars = CharSet.getInstance(set);
-        int count = 0;
-        for (final char c : str.toCharArray()) {
-            if (chars.contains(c)) {
-                count++;
-            }
-        }
-        return count;
-    }
-
-    // Keep
-    //-----------------------------------------------------------------------
-    /**
-     * <p>Takes an argument in set-syntax, see evaluateSet,
-     * and keeps any of characters present in the specified string.</p>
-     *
-     * <pre>
-     * CharSetUtils.keep(null, *)        = null
-     * CharSetUtils.keep("", *)          = ""
-     * CharSetUtils.keep(*, null)        = ""
-     * CharSetUtils.keep(*, "")          = ""
-     * CharSetUtils.keep("hello", "hl")  = "hll"
-     * CharSetUtils.keep("hello", "le")  = "ell"
-     * </pre>
-     *
-     * @see CharSet#getInstance(java.lang.String...) for set-syntax.
-     * @param str  String to keep characters from, may be null
-     * @param set  String[] set of characters to keep, may be null
-     * @return the modified String, {@code null} if null string input
-     * @since 2.0
-     */
-    public static String keep(final String str, final String... set) {
-        if (str == null) {
-            return null;
-        }
-        if (str.isEmpty() || deepEmpty(set)) {
-            return StringUtils.EMPTY;
-        }
-        return modify(str, set, true);
-    }
-
-    // Delete
-    //-----------------------------------------------------------------------
-    /**
-     * <p>Takes an argument in set-syntax, see evaluateSet,
-     * and deletes any of characters present in the specified string.</p>
-     *
-     * <pre>
-     * CharSetUtils.delete(null, *)        = null
-     * CharSetUtils.delete("", *)          = ""
-     * CharSetUtils.delete(*, null)        = *
-     * CharSetUtils.delete(*, "")          = *
-     * CharSetUtils.delete("hello", "hl")  = "eo"
-     * CharSetUtils.delete("hello", "le")  = "ho"
-     * </pre>
-     *
-     * @see CharSet#getInstance(java.lang.String...) for set-syntax.
-     * @param str  String to delete characters from, may be null
-     * @param set  String[] set of characters to delete, may be null
-     * @return the modified String, {@code null} if null string input
-     */
-    public static String delete(final String str, final String... set) {
-        if (StringUtils.isEmpty(str) || deepEmpty(set)) {
-            return str;
-        }
-        return modify(str, set, false);
-    }
-
-    //-----------------------------------------------------------------------
-    /**
-     * Implementation of delete and keep
-     *
-     * @param str String to modify characters within
-     * @param set String[] set of characters to modify
-     * @param expect whether to evaluate on match, or non-match
-     * @return the modified String, not null
-     */
-    private static String modify(final String str, final String[] set, final boolean expect) {
-        final CharSet chars = CharSet.getInstance(set);
-        final StringBuilder buffer = new StringBuilder(str.length());
-        final char[] chrs = str.toCharArray();
-        final int sz = chrs.length;
-        for(int i=0; i<sz; i++) {
-            if(chars.contains(chrs[i]) == expect) {
-                buffer.append(chrs[i]);
-            }
-        }
-        return buffer.toString();
-    }
-
-    /** 
-     * Determines whether or not all the Strings in an array are 
-     * empty or not.
-     *
-     * @param strings String[] whose elements are being checked for emptiness
-     * @return whether or not the String is empty
-     */
-    private static boolean deepEmpty(final String[] strings) {
-        if (strings != null) {
-            for (final String s : strings) {
-                if (StringUtils.isNotEmpty(s)) {
-                    return false;
-                }
-            }
-        }
-        return true;
-    }
-}
diff --git a/lang/src/main/java/org/apache/commons/lang3/CharUtils.java b/lang/src/main/java/org/apache/commons/lang3/CharUtils.java
deleted file mode 100644
index eb0c2c6..0000000
--- a/lang/src/main/java/org/apache/commons/lang3/CharUtils.java
+++ /dev/null
@@ -1,553 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- * 
- *      http://www.apache.org/licenses/LICENSE-2.0
- * 
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.commons.lang3;
-
-/**
- * <p>Operations on char primitives and Character objects.</p>
- *
- * <p>This class tries to handle {@code null} input gracefully.
- * An exception will not be thrown for a {@code null} input.
- * Each method documents its behaviour in more detail.</p>
- * 
- * <p>#ThreadSafe#</p>
- * @since 2.1
- * @version $Id$
- */
-public class CharUtils {
-    
-    private static final String[] CHAR_STRING_ARRAY = new String[128];
-    
-    private static final char[] HEX_DIGITS = new char[] {'0','1','2','3','4','5','6','7','8','9','a','b','c','d','e','f'};
-
-    /**
-     * {@code \u000a} linefeed LF ('\n').
-     * 
-     * @see <a href="http://docs.oracle.com/javase/specs/jls/se7/html/jls-3.html#jls-3.10.6">JLF: Escape Sequences
-     *      for Character and String Literals</a>
-     * @since 2.2
-     */
-    public static final char LF = '\n';
-
-    /**
-     * {@code \u000d} carriage return CR ('\r').
-     * 
-     * @see <a href="http://docs.oracle.com/javase/specs/jls/se7/html/jls-3.html#jls-3.10.6">JLF: Escape Sequences
-     *      for Character and String Literals</a>
-     * @since 2.2
-     */
-    public static final char CR = '\r';
-    
-
-    static {
-        for (char c = 0; c < CHAR_STRING_ARRAY.length; c++) {
-            CHAR_STRING_ARRAY[c] = String.valueOf(c);
-        }
-    }
-
-    /**
-     * <p>{@code CharUtils} instances should NOT be constructed in standard programming.
-     * Instead, the class should be used as {@code CharUtils.toString('c');}.</p>
-     *
-     * <p>This constructor is public to permit tools that require a JavaBean instance
-     * to operate.</p>
-     */
-    public CharUtils() {
-      super();
-    }
-
-    //-----------------------------------------------------------------------
-    /**
-     * <p>Converts the character to a Character.</p>
-     * 
-     * <p>For ASCII 7 bit characters, this uses a cache that will return the
-     * same Character object each time.</p>
-     *
-     * <pre>
-     *   CharUtils.toCharacterObject(' ')  = ' '
-     *   CharUtils.toCharacterObject('A')  = 'A'
-     * </pre>
-     *
-     * @deprecated Java 5 introduced {@link Character#valueOf(char)} which caches chars 0 through 127.
-     * @param ch  the character to convert
-     * @return a Character of the specified character
-     */
-    @Deprecated
-    public static Character toCharacterObject(final char ch) {
-        return Character.valueOf(ch);
-    }
-    
-    /**
-     * <p>Converts the String to a Character using the first character, returning
-     * null for empty Strings.</p>
-     * 
-     * <p>For ASCII 7 bit characters, this uses a cache that will return the
-     * same Character object each time.</p>
-     * 
-     * <pre>
-     *   CharUtils.toCharacterObject(null) = null
-     *   CharUtils.toCharacterObject("")   = null
-     *   CharUtils.toCharacterObject("A")  = 'A'
-     *   CharUtils.toCharacterObject("BA") = 'B'
-     * </pre>
-     *
-     * @param str  the character to convert
-     * @return the Character value of the first letter of the String
-     */
-    public static Character toCharacterObject(final String str) {
-        if (StringUtils.isEmpty(str)) {
-            return null;
-        }
-        return Character.valueOf(str.charAt(0));
-    }
-    
-    //-----------------------------------------------------------------------
-    /**
-     * <p>Converts the Character to a char throwing an exception for {@code null}.</p>
-     * 
-     * <pre>
-     *   CharUtils.toChar(' ')  = ' '
-     *   CharUtils.toChar('A')  = 'A'
-     *   CharUtils.toChar(null) throws IllegalArgumentException
-     * </pre>
-     *
-     * @param ch  the character to convert
-     * @return the char value of the Character
-     * @throws IllegalArgumentException if the Character is null
-     */
-    public static char toChar(final Character ch) {
-        if (ch == null) {
-            throw new IllegalArgumentException("The Character must not be null");
-        }
-        return ch.charValue();
-    }
-    
-    /**
-     * <p>Converts the Character to a char handling {@code null}.</p>
-     * 
-     * <pre>
-     *   CharUtils.toChar(null, 'X') = 'X'
-     *   CharUtils.toChar(' ', 'X')  = ' '
-     *   CharUtils.toChar('A', 'X')  = 'A'
-     * </pre>
-     *
-     * @param ch  the character to convert
-     * @param defaultValue  the value to use if the  Character is null
-     * @return the char value of the Character or the default if null
-     */
-    public static char toChar(final Character ch, final char defaultValue) {
-        if (ch == null) {
-            return defaultValue;
-        }
-        return ch.charValue();
-    }
-    
-    //-----------------------------------------------------------------------
-    /**
-     * <p>Converts the String to a char using the first character, throwing
-     * an exception on empty Strings.</p>
-     * 
-     * <pre>
-     *   CharUtils.toChar("A")  = 'A'
-     *   CharUtils.toChar("BA") = 'B'
-     *   CharUtils.toChar(null) throws IllegalArgumentException
-     *   CharUtils.toChar("")   throws IllegalArgumentException
-     * </pre>
-     *
-     * @param str  the character to convert
-     * @return the char value of the first letter of the String
-     * @throws IllegalArgumentException if the String is empty
-     */
-    public static char toChar(final String str) {
-        if (StringUtils.isEmpty(str)) {
-            throw new IllegalArgumentException("The String must not be empty");
-        }
-        return str.charAt(0);
-    }
-    
-    /**
-     * <p>Converts the String to a char using the first character, defaulting
-     * the value on empty Strings.</p>
-     * 
-     * <pre>
-     *   CharUtils.toChar(null, 'X') = 'X'
-     *   CharUtils.toChar("", 'X')   = 'X'
-     *   CharUtils.toChar("A", 'X')  = 'A'
-     *   CharUtils.toChar("BA", 'X') = 'B'
-     * </pre>
-     *
-     * @param str  the character to convert
-     * @param defaultValue  the value to use if the  Character is null
-     * @return the char value of the first letter of the String or the default if null
-     */
-    public static char toChar(final String str, final char defaultValue) {
-        if (StringUtils.isEmpty(str)) {
-            return defaultValue;
-        }
-        return str.charAt(0);
-    }
-    
-    //-----------------------------------------------------------------------
-    /**
-     * <p>Converts the character to the Integer it represents, throwing an
-     * exception if the character is not numeric.</p>
-     * 
-     * <p>This method coverts the char '1' to the int 1 and so on.</p>
-     *
-     * <pre>
-     *   CharUtils.toIntValue('3')  = 3
-     *   CharUtils.toIntValue('A')  throws IllegalArgumentException
-     * </pre>
-     *
-     * @param ch  the character to convert
-     * @return the int value of the character
-     * @throws IllegalArgumentException if the character is not ASCII numeric
-     */
-    public static int toIntValue(final char ch) {
-        if (isAsciiNumeric(ch) == false) {
-            throw new IllegalArgumentException("The character " + ch + " is not in the range '0' - '9'");
-        }
-        return ch - 48;
-    }
-    
-    /**
-     * <p>Converts the character to the Integer it represents, throwing an
-     * exception if the character is not numeric.</p>
-     * 
-     * <p>This method coverts the char '1' to the int 1 and so on.</p>
-     *
-     * <pre>
-     *   CharUtils.toIntValue('3', -1)  = 3
-     *   CharUtils.toIntValue('A', -1)  = -1
-     * </pre>
-     *
-     * @param ch  the character to convert
-     * @param defaultValue  the default value to use if the character is not numeric
-     * @return the int value of the character
-     */
-    public static int toIntValue(final char ch, final int defaultValue) {
-        if (isAsciiNumeric(ch) == false) {
-            return defaultValue;
-        }
-        return ch - 48;
-    }
-    
-    /**
-     * <p>Converts the character to the Integer it represents, throwing an
-     * exception if the character is not numeric.</p>
-     * 
-     * <p>This method coverts the char '1' to the int 1 and so on.</p>
-     *
-     * <pre>
-     *   CharUtils.toIntValue('3')  = 3
-     *   CharUtils.toIntValue(null) throws IllegalArgumentException
-     *   CharUtils.toIntValue('A')  throws IllegalArgumentException
-     * </pre>
-     *
-     * @param ch  the character to convert, not null
-     * @return the int value of the character
-     * @throws IllegalArgumentException if the Character is not ASCII numeric or is null
-     */
-    public static int toIntValue(final Character ch) {
-        if (ch == null) {
-            throw new IllegalArgumentException("The character must not be null");
-        }
-        return toIntValue(ch.charValue());
-    }
-    
-    /**
-     * <p>Converts the character to the Integer it represents, throwing an
-     * exception if the character is not numeric.</p>
-     * 
-     * <p>This method coverts the char '1' to the int 1 and so on.</p>
-     *
-     * <pre>
-     *   CharUtils.toIntValue(null, -1) = -1
-     *   CharUtils.toIntValue('3', -1)  = 3
-     *   CharUtils.toIntValue('A', -1)  = -1
-     * </pre>
-     *
-     * @param ch  the character to convert
-     * @param defaultValue  the default value to use if the character is not numeric
-     * @return the int value of the character
-     */
-    public static int toIntValue(final Character ch, final int defaultValue) {
-        if (ch == null) {
-            return defaultValue;
-        }
-        return toIntValue(ch.charValue(), defaultValue);
-    }
-    
-    //-----------------------------------------------------------------------
-    /**
-     * <p>Converts the character to a String that contains the one character.</p>
-     * 
-     * <p>For ASCII 7 bit characters, this uses a cache that will return the
-     * same String object each time.</p>
-     *
-     * <pre>
-     *   CharUtils.toString(' ')  = " "
-     *   CharUtils.toString('A')  = "A"
-     * </pre>
-     *
-     * @param ch  the character to convert
-     * @return a String containing the one specified character
-     */
-    public static String toString(final char ch) {
-        if (ch < 128) {
-            return CHAR_STRING_ARRAY[ch];
-        }
-        return new String(new char[] {ch});
-    }
-    
-    /**
-     * <p>Converts the character to a String that contains the one character.</p>
-     * 
-     * <p>For ASCII 7 bit characters, this uses a cache that will return the
-     * same String object each time.</p>
-     * 
-     * <p>If {@code null} is passed in, {@code null} will be returned.</p>
-     *
-     * <pre>
-     *   CharUtils.toString(null) = null
-     *   CharUtils.toString(' ')  = " "
-     *   CharUtils.toString('A')  = "A"
-     * </pre>
-     *
-     * @param ch  the character to convert
-     * @return a String containing the one specified character
-     */
-    public static String toString(final Character ch) {
-        if (ch == null) {
-            return null;
-        }
-        return toString(ch.charValue());
-    }
-    
-    //--------------------------------------------------------------------------
-    /**
-     * <p>Converts the string to the Unicode format '\u0020'.</p>
-     * 
-     * <p>This format is the Java source code format.</p>
-     *
-     * <pre>
-     *   CharUtils.unicodeEscaped(' ') = "\u0020"
-     *   CharUtils.unicodeEscaped('A') = "\u0041"
-     * </pre>
-     * 
-     * @param ch  the character to convert
-     * @return the escaped Unicode string
-     */
-    public static String unicodeEscaped(final char ch) {
-        StringBuilder sb = new StringBuilder(6);
-        sb.append("\\u");
-        sb.append(HEX_DIGITS[(ch >> 12) & 15]);
-        sb.append(HEX_DIGITS[(ch >> 8) & 15]);
-        sb.append(HEX_DIGITS[(ch >> 4) & 15]);
-        sb.append(HEX_DIGITS[(ch) & 15]);
-        return sb.toString();
-    }
-    
-    /**
-     * <p>Converts the string to the Unicode format '\u0020'.</p>
-     * 
-     * <p>This format is the Java source code format.</p>
-     * 
-     * <p>If {@code null} is passed in, {@code null} will be returned.</p>
-     *
-     * <pre>
-     *   CharUtils.unicodeEscaped(null) = null
-     *   CharUtils.unicodeEscaped(' ')  = "\u0020"
-     *   CharUtils.unicodeEscaped('A')  = "\u0041"
-     * </pre>
-     * 
-     * @param ch  the character to convert, may be null
-     * @return the escaped Unicode string, null if null input
-     */
-    public static String unicodeEscaped(final Character ch) {
-        if (ch == null) {
-            return null;
-        }
-        return unicodeEscaped(ch.charValue());
-    }
-    
-    //--------------------------------------------------------------------------
-    /**
-     * <p>Checks whether the character is ASCII 7 bit.</p>
-     *
-     * <pre>
-     *   CharUtils.isAscii('a')  = true
-     *   CharUtils.isAscii('A')  = true
-     *   CharUtils.isAscii('3')  = true
-     *   CharUtils.isAscii('-')  = true
-     *   CharUtils.isAscii('\n') = true
-     *   CharUtils.isAscii('&copy;') = false
-     * </pre>
-     * 
-     * @param ch  the character to check
-     * @return true if less than 128
-     */
-    public static boolean isAscii(final char ch) {
-        return ch < 128;
-    }
-    
-    /**
-     * <p>Checks whether the character is ASCII 7 bit printable.</p>
-     *
-     * <pre>
-     *   CharUtils.isAsciiPrintable('a')  = true
-     *   CharUtils.isAsciiPrintable('A')  = true
-     *   CharUtils.isAsciiPrintable('3')  = true
-     *   CharUtils.isAsciiPrintable('-')  = true
-     *   CharUtils.isAsciiPrintable('\n') = false
-     *   CharUtils.isAsciiPrintable('&copy;') = false
-     * </pre>
-     * 
-     * @param ch  the character to check
-     * @return true if between 32 and 126 inclusive
-     */
-    public static boolean isAsciiPrintable(final char ch) {
-        return ch >= 32 && ch < 127;
-    }
-    
-    /**
-     * <p>Checks whether the character is ASCII 7 bit control.</p>
-     *
-     * <pre>
-     *   CharUtils.isAsciiControl('a')  = false
-     *   CharUtils.isAsciiControl('A')  = false
-     *   CharUtils.isAsciiControl('3')  = false
-     *   CharUtils.isAsciiControl('-')  = false
-     *   CharUtils.isAsciiControl('\n') = true
-     *   CharUtils.isAsciiControl('&copy;') = false
-     * </pre>
-     * 
-     * @param ch  the character to check
-     * @return true if less than 32 or equals 127
-     */
-    public static boolean isAsciiControl(final char ch) {
-        return ch < 32 || ch == 127;
-    }
-    
-    /**
-     * <p>Checks whether the character is ASCII 7 bit alphabetic.</p>
-     *
-     * <pre>
-     *   CharUtils.isAsciiAlpha('a')  = true
-     *   CharUtils.isAsciiAlpha('A')  = true
-     *   CharUtils.isAsciiAlpha('3')  = false
-     *   CharUtils.isAsciiAlpha('-')  = false
-     *   CharUtils.isAsciiAlpha('\n') = false
-     *   CharUtils.isAsciiAlpha('&copy;') = false
-     * </pre>
-     * 
-     * @param ch  the character to check
-     * @return true if between 65 and 90 or 97 and 122 inclusive
-     */
-    public static boolean isAsciiAlpha(final char ch) {
-        return isAsciiAlphaUpper(ch) || isAsciiAlphaLower(ch);
-    }
-    
-    /**
-     * <p>Checks whether the character is ASCII 7 bit alphabetic upper case.</p>
-     *
-     * <pre>
-     *   CharUtils.isAsciiAlphaUpper('a')  = false
-     *   CharUtils.isAsciiAlphaUpper('A')  = true
-     *   CharUtils.isAsciiAlphaUpper('3')  = false
-     *   CharUtils.isAsciiAlphaUpper('-')  = false
-     *   CharUtils.isAsciiAlphaUpper('\n') = false
-     *   CharUtils.isAsciiAlphaUpper('&copy;') = false
-     * </pre>
-     * 
-     * @param ch  the character to check
-     * @return true if between 65 and 90 inclusive
-     */
-    public static boolean isAsciiAlphaUpper(final char ch) {
-        return ch >= 'A' && ch <= 'Z';
-    }
-    
-    /**
-     * <p>Checks whether the character is ASCII 7 bit alphabetic lower case.</p>
-     *
-     * <pre>
-     *   CharUtils.isAsciiAlphaLower('a')  = true
-     *   CharUtils.isAsciiAlphaLower('A')  = false
-     *   CharUtils.isAsciiAlphaLower('3')  = false
-     *   CharUtils.isAsciiAlphaLower('-')  = false
-     *   CharUtils.isAsciiAlphaLower('\n') = false
-     *   CharUtils.isAsciiAlphaLower('&copy;') = false
-     * </pre>
-     * 
-     * @param ch  the character to check
-     * @return true if between 97 and 122 inclusive
-     */
-    public static boolean isAsciiAlphaLower(final char ch) {
-        return ch >= 'a' && ch <= 'z';
-    }
-    
-    /**
-     * <p>Checks whether the character is ASCII 7 bit numeric.</p>
-     *
-     * <pre>
-     *   CharUtils.isAsciiNumeric('a')  = false
-     *   CharUtils.isAsciiNumeric('A')  = false
-     *   CharUtils.isAsciiNumeric('3')  = true
-     *   CharUtils.isAsciiNumeric('-')  = false
-     *   CharUtils.isAsciiNumeric('\n') = false
-     *   CharUtils.isAsciiNumeric('&copy;') = false
-     * </pre>
-     * 
-     * @param ch  the character to check
-     * @return true if between 48 and 57 inclusive
-     */
-    public static boolean isAsciiNumeric(final char ch) {
-        return ch >= '0' && ch <= '9';
-    }
-    
-    /**
-     * <p>Checks whether the character is ASCII 7 bit numeric.</p>
-     *
-     * <pre>
-     *   CharUtils.isAsciiAlphanumeric('a')  = true
-     *   CharUtils.isAsciiAlphanumeric('A')  = true
-     *   CharUtils.isAsciiAlphanumeric('3')  = true
-     *   CharUtils.isAsciiAlphanumeric('-')  = false
-     *   CharUtils.isAsciiAlphanumeric('\n') = false
-     *   CharUtils.isAsciiAlphanumeric('&copy;') = false
-     * </pre>
-     * 
-     * @param ch  the character to check
-     * @return true if between 48 and 57 or 65 and 90 or 97 and 122 inclusive
-     */
-    public static boolean isAsciiAlphanumeric(final char ch) {
-        return isAsciiAlpha(ch) || isAsciiNumeric(ch);
-    }
-
-    /**
-     * <p>Compares two {@code char} values numerically. This is the same functionality as provided in Java 7.</p>
-     *
-     * @param x the first {@code char} to compare
-     * @param y the second {@code char} to compare
-     * @return the value {@code 0} if {@code x == y};
-     *         a value less than {@code 0} if {@code x < y}; and
-     *         a value greater than {@code 0} if {@code x > y}
-     * @since 3.4
-     */
-    public static int compare(char x, char y) {
-        return x-y;
-    }
-}
diff --git a/lang/src/main/java/org/apache/commons/lang3/ClassPathUtils.java b/lang/src/main/java/org/apache/commons/lang3/ClassPathUtils.java
deleted file mode 100644
index ea42425..0000000
--- a/lang/src/main/java/org/apache/commons/lang3/ClassPathUtils.java
+++ /dev/null
@@ -1,139 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.commons.lang3;
-
-/**
- * Operations regarding the classpath.
- *
- * <p>The methods of this class do not allow {@code null} inputs.</p>
- *
- * @since 3.3
- * @version $Id$
- */
-//@Immutable
-public class ClassPathUtils {
-
-    /**
-     * <p>{@code ClassPathUtils} instances should NOT be constructed in
-     * standard programming. Instead, the class should be used as
-     * {@code ClassPathUtils.toFullyQualifiedName(MyClass.class, "MyClass.properties");}.</p>
-     *
-     * <p>This constructor is public to permit tools that require a JavaBean
-     * instance to operate.</p>
-     */
-    public ClassPathUtils() {
-        super();
-    }
-
-    /**
-     * Returns the fully qualified name for the resource with name {@code resourceName} relative to the given context.
-     *
-     * <p>Note that this method does not check whether the resource actually exists.
-     * It only constructs the name.
-     * Null inputs are not allowed.</p>
-     *
-     * <pre>
-     * ClassPathUtils.toFullyQualifiedName(StringUtils.class, "StringUtils.properties") = "org.apache.commons.lang3.StringUtils.properties"
-     * </pre>
-     *
-     * @param context The context for constructing the name.
-     * @param resourceName the resource name to construct the fully qualified name for.
-     * @return the fully qualified name of the resource with name {@code resourceName}.
-     * @throws java.lang.NullPointerException if either {@code context} or {@code resourceName} is null.
-     */
-    public static String toFullyQualifiedName(final Class<?> context, final String resourceName) {
-        Validate.notNull(context, "Parameter '%s' must not be null!", "context" );
-        Validate.notNull(resourceName, "Parameter '%s' must not be null!", "resourceName");
-        return toFullyQualifiedName(context.getPackage(), resourceName);
-    }
-
-    /**
-     * Returns the fully qualified name for the resource with name {@code resourceName} relative to the given context.
-     *
-     * <p>Note that this method does not check whether the resource actually exists.
-     * It only constructs the name.
-     * Null inputs are not allowed.</p>
-     *
-     * <pre>
-     * ClassPathUtils.toFullyQualifiedName(StringUtils.class.getPackage(), "StringUtils.properties") = "org.apache.commons.lang3.StringUtils.properties"
-     * </pre>
-     *
-     * @param context The context for constructing the name.
-     * @param resourceName the resource name to construct the fully qualified name for.
-     * @return the fully qualified name of the resource with name {@code resourceName}.
-     * @throws java.lang.NullPointerException if either {@code context} or {@code resourceName} is null.
-     */
-    public static String toFullyQualifiedName(final Package context, final String resourceName) {
-        Validate.notNull(context, "Parameter '%s' must not be null!", "context" );
-        Validate.notNull(resourceName, "Parameter '%s' must not be null!", "resourceName");
-        final StringBuilder sb = new StringBuilder();
-        sb.append(context.getName());
-        sb.append(".");
-        sb.append(resourceName);
-        return sb.toString();
-    }
-
-    /**
-     * Returns the fully qualified path for the resource with name {@code resourceName} relative to the given context.
-     *
-     * <p>Note that this method does not check whether the resource actually exists.
-     * It only constructs the path.
-     * Null inputs are not allowed.</p>
-     *
-     * <pre>
-     * ClassPathUtils.toFullyQualifiedPath(StringUtils.class, "StringUtils.properties") = "org/apache/commons/lang3/StringUtils.properties"
-     * </pre>
-     *
-     * @param context The context for constructing the path.
-     * @param resourceName the resource name to construct the fully qualified path for.
-     * @return the fully qualified path of the resource with name {@code resourceName}.
-     * @throws java.lang.NullPointerException if either {@code context} or {@code resourceName} is null.
-     */
-    public static String toFullyQualifiedPath(final Class<?> context, final String resourceName) {
-        Validate.notNull(context, "Parameter '%s' must not be null!", "context" );
-        Validate.notNull(resourceName, "Parameter '%s' must not be null!", "resourceName");
-        return toFullyQualifiedPath(context.getPackage(), resourceName);
-    }
-
-
-    /**
-     * Returns the fully qualified path for the resource with name {@code resourceName} relative to the given context.
-     *
-     * <p>Note that this method does not check whether the resource actually exists.
-     * It only constructs the path.
-     * Null inputs are not allowed.</p>
-     *
-     * <pre>
-     * ClassPathUtils.toFullyQualifiedPath(StringUtils.class.getPackage(), "StringUtils.properties") = "org/apache/commons/lang3/StringUtils.properties"
-     * </pre>
-     *
-     * @param context The context for constructing the path.
-     * @param resourceName the resource name to construct the fully qualified path for.
-     * @return the fully qualified path of the resource with name {@code resourceName}.
-     * @throws java.lang.NullPointerException if either {@code context} or {@code resourceName} is null.
-     */
-    public static String toFullyQualifiedPath(final Package context, final String resourceName) {
-        Validate.notNull(context, "Parameter '%s' must not be null!", "context" );
-        Validate.notNull(resourceName, "Parameter '%s' must not be null!", "resourceName");
-        final StringBuilder sb = new StringBuilder();
-        sb.append(context.getName().replace('.', '/'));
-        sb.append("/");
-        sb.append(resourceName);
-        return sb.toString();
-    }
-
-}
diff --git a/lang/src/main/java/org/apache/commons/lang3/ClassUtils.java b/lang/src/main/java/org/apache/commons/lang3/ClassUtils.java
deleted file mode 100644
index 92ecb15..0000000
--- a/lang/src/main/java/org/apache/commons/lang3/ClassUtils.java
+++ /dev/null
@@ -1,1320 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.commons.lang3;
-
-import java.lang.reflect.Method;
-import java.lang.reflect.Modifier;
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.HashMap;
-import java.util.HashSet;
-import java.util.Iterator;
-import java.util.LinkedHashSet;
-import java.util.List;
-import java.util.Map;
-import java.util.Set;
-
-import org.apache.commons.lang3.mutable.MutableObject;
-
-/**
- * <p>Operates on classes without using reflection.</p>
- *
- * <p>This class handles invalid {@code null} inputs as best it can.
- * Each method documents its behaviour in more detail.</p>
- *
- * <p>The notion of a {@code canonical name} includes the human
- * readable name for the type, for example {@code int[]}. The
- * non-canonical method variants work with the JVM names, such as
- * {@code [I}. </p>
- *
- * @since 2.0
- * @version $Id$
- */
-public class ClassUtils {
-    /**
-     * Inclusivity literals for {@link #hierarchy(Class, Interfaces)}.
-     * @since 3.2
-     */
-    public enum Interfaces {
-        INCLUDE, EXCLUDE
-    }
-
-    /**
-     * The package separator character: <code>'&#x2e;' == {@value}</code>.
-     */
-    public static final char PACKAGE_SEPARATOR_CHAR = '.';
-
-    /**
-     * The package separator String: <code>"&#x2e;"</code>.
-     */
-    public static final String PACKAGE_SEPARATOR = String.valueOf(PACKAGE_SEPARATOR_CHAR);
-
-    /**
-     * The inner class separator character: <code>'$' == {@value}</code>.
-     */
-    public static final char INNER_CLASS_SEPARATOR_CHAR = '$';
-
-    /**
-     * The inner class separator String: {@code "$"}.
-     */
-    public static final String INNER_CLASS_SEPARATOR = String.valueOf(INNER_CLASS_SEPARATOR_CHAR);
-
-    /**
-     * Maps primitive {@code Class}es to their corresponding wrapper {@code Class}.
-     */
-    private static final Map<Class<?>, Class<?>> primitiveWrapperMap = new HashMap<Class<?>, Class<?>>();
-    static {
-         primitiveWrapperMap.put(Boolean.TYPE, Boolean.class);
-         primitiveWrapperMap.put(Byte.TYPE, Byte.class);
-         primitiveWrapperMap.put(Character.TYPE, Character.class);
-         primitiveWrapperMap.put(Short.TYPE, Short.class);
-         primitiveWrapperMap.put(Integer.TYPE, Integer.class);
-         primitiveWrapperMap.put(Long.TYPE, Long.class);
-         primitiveWrapperMap.put(Double.TYPE, Double.class);
-         primitiveWrapperMap.put(Float.TYPE, Float.class);
-         primitiveWrapperMap.put(Void.TYPE, Void.TYPE);
-    }
-
-    /**
-     * Maps wrapper {@code Class}es to their corresponding primitive types.
-     */
-    private static final Map<Class<?>, Class<?>> wrapperPrimitiveMap = new HashMap<Class<?>, Class<?>>();
-    static {
-        for (final Class<?> primitiveClass : primitiveWrapperMap.keySet()) {
-            final Class<?> wrapperClass = primitiveWrapperMap.get(primitiveClass);
-            if (!primitiveClass.equals(wrapperClass)) {
-                wrapperPrimitiveMap.put(wrapperClass, primitiveClass);
-            }
-        }
-    }
-
-    /**
-     * Maps a primitive class name to its corresponding abbreviation used in array class names.
-     */
-    private static final Map<String, String> abbreviationMap;
-
-    /**
-     * Maps an abbreviation used in array class names to corresponding primitive class name.
-     */
-    private static final Map<String, String> reverseAbbreviationMap;
-
-    /**
-     * Feed abbreviation maps
-     */
-    static {
-        final Map<String, String> m = new HashMap<String, String>();
-        m.put("int", "I");
-        m.put("boolean", "Z");
-        m.put("float", "F");
-        m.put("long", "J");
-        m.put("short", "S");
-        m.put("byte", "B");
-        m.put("double", "D");
-        m.put("char", "C");
-        m.put("void", "V");
-        final Map<String, String> r = new HashMap<String, String>();
-        for (final Map.Entry<String, String> e : m.entrySet()) {
-            r.put(e.getValue(), e.getKey());
-        }
-        abbreviationMap = Collections.unmodifiableMap(m);
-        reverseAbbreviationMap = Collections.unmodifiableMap(r);
-    }
-
-    /**
-     * <p>ClassUtils instances should NOT be constructed in standard programming.
-     * Instead, the class should be used as
-     * {@code ClassUtils.getShortClassName(cls)}.</p>
-     *
-     * <p>This constructor is public to permit tools that require a JavaBean
-     * instance to operate.</p>
-     */
-    public ClassUtils() {
-      super();
-    }
-
-    // Short class name
-    // ----------------------------------------------------------------------
-    /**
-     * <p>Gets the class name minus the package name for an {@code Object}.</p>
-     *
-     * @param object  the class to get the short name for, may be null
-     * @param valueIfNull  the value to return if null
-     * @return the class name of the object without the package name, or the null value
-     */
-    public static String getShortClassName(final Object object, final String valueIfNull) {
-        if (object == null) {
-            return valueIfNull;
-        }
-        return getShortClassName(object.getClass());
-    }
-
-    /**
-     * <p>Gets the class name minus the package name from a {@code Class}.</p>
-     *
-     * <p>Consider using the Java 5 API {@link Class#getSimpleName()} instead.
-     * The one known difference is that this code will return {@code "Map.Entry"} while
-     * the {@code java.lang.Class} variant will simply return {@code "Entry"}. </p>
-     *
-     * @param cls  the class to get the short name for.
-     * @return the class name without the package name or an empty string
-     */
-    public static String getShortClassName(final Class<?> cls) {
-        if (cls == null) {
-            return StringUtils.EMPTY;
-        }
-        return getShortClassName(cls.getName());
-    }
-
-    /**
-     * <p>Gets the class name minus the package name from a String.</p>
-     *
-     * <p>The string passed in is assumed to be a class name - it is not checked.</p>
-
-     * <p>Note that this method differs from Class.getSimpleName() in that this will
-     * return {@code "Map.Entry"} whilst the {@code java.lang.Class} variant will simply
-     * return {@code "Entry"}. </p>
-     *
-     * @param className  the className to get the short name for
-     * @return the class name of the class without the package name or an empty string
-     */
-    public static String getShortClassName(String className) {
-        if (StringUtils.isEmpty(className)) {
-            return StringUtils.EMPTY;
-        }
-
-        final StringBuilder arrayPrefix = new StringBuilder();
-
-        // Handle array encoding
-        if (className.startsWith("[")) {
-            while (className.charAt(0) == '[') {
-                className = className.substring(1);
-                arrayPrefix.append("[]");
-            }
-            // Strip Object type encoding
-            if (className.charAt(0) == 'L' && className.charAt(className.length() - 1) == ';') {
-                className = className.substring(1, className.length() - 1);
-            }
-
-            if (reverseAbbreviationMap.containsKey(className)) {
-                className = reverseAbbreviationMap.get(className);
-            }
-        }
-
-        final int lastDotIdx = className.lastIndexOf(PACKAGE_SEPARATOR_CHAR);
-        final int innerIdx = className.indexOf(
-                INNER_CLASS_SEPARATOR_CHAR, lastDotIdx == -1 ? 0 : lastDotIdx + 1);
-        String out = className.substring(lastDotIdx + 1);
-        if (innerIdx != -1) {
-            out = out.replace(INNER_CLASS_SEPARATOR_CHAR, PACKAGE_SEPARATOR_CHAR);
-        }
-        return out + arrayPrefix;
-    }
-
-    /**
-     * <p>Null-safe version of <code>aClass.getSimpleName()</code></p>
-     *
-     * @param cls the class for which to get the simple name.
-     * @return the simple class name.
-     * @since 3.0
-     * @see Class#getSimpleName()
-     */
-    public static String getSimpleName(final Class<?> cls) {
-        if (cls == null) {
-            return StringUtils.EMPTY;
-        }
-        return cls.getSimpleName();
-    }
-
-    /**
-     * <p>Null-safe version of <code>aClass.getSimpleName()</code></p>
-     *
-     * @param object the object for which to get the simple class name.
-     * @param valueIfNull the value to return if <code>object</code> is <code>null</code>
-     * @return the simple class name.
-     * @since 3.0
-     * @see Class#getSimpleName()
-     */
-    public static String getSimpleName(final Object object, final String valueIfNull) {
-        if (object == null) {
-            return valueIfNull;
-        }
-        return getSimpleName(object.getClass());
-    }
-
-    // Package name
-    // ----------------------------------------------------------------------
-    /**
-     * <p>Gets the package name of an {@code Object}.</p>
-     *
-     * @param object  the class to get the package name for, may be null
-     * @param valueIfNull  the value to return if null
-     * @return the package name of the object, or the null value
-     */
-    public static String getPackageName(final Object object, final String valueIfNull) {
-        if (object == null) {
-            return valueIfNull;
-        }
-        return getPackageName(object.getClass());
-    }
-
-    /**
-     * <p>Gets the package name of a {@code Class}.</p>
-     *
-     * @param cls  the class to get the package name for, may be {@code null}.
-     * @return the package name or an empty string
-     */
-    public static String getPackageName(final Class<?> cls) {
-        if (cls == null) {
-            return StringUtils.EMPTY;
-        }
-        return getPackageName(cls.getName());
-    }
-
-    /**
-     * <p>Gets the package name from a {@code String}.</p>
-     *
-     * <p>The string passed in is assumed to be a class name - it is not checked.</p>
-     * <p>If the class is unpackaged, return an empty string.</p>
-     *
-     * @param className  the className to get the package name for, may be {@code null}
-     * @return the package name or an empty string
-     */
-    public static String getPackageName(String className) {
-        if (StringUtils.isEmpty(className)) {
-            return StringUtils.EMPTY;
-        }
-
-        // Strip array encoding
-        while (className.charAt(0) == '[') {
-            className = className.substring(1);
-        }
-        // Strip Object type encoding
-        if (className.charAt(0) == 'L' && className.charAt(className.length() - 1) == ';') {
-            className = className.substring(1);
-        }
-
-        final int i = className.lastIndexOf(PACKAGE_SEPARATOR_CHAR);
-        if (i == -1) {
-            return StringUtils.EMPTY;
-        }
-        return className.substring(0, i);
-    }
-
-    // Abbreviated name
-    // ----------------------------------------------------------------------
-    /**
-     * <p>Gets the abbreviated name of a {@code Class}.</p>
-     *
-     * @param cls  the class to get the abbreviated name for, may be {@code null}
-     * @param len  the desired length of the abbreviated name
-     * @return the abbreviated name or an empty string
-     * @throws IllegalArgumentException if len &lt;= 0
-     * @see #getAbbreviatedName(String, int)
-     * @since 3.4
-     */
-    public static String getAbbreviatedName(final Class<?> cls, int len) {
-      if (cls == null) {
-        return StringUtils.EMPTY;
-      }
-      return getAbbreviatedName(cls.getName(), len);
-    }
-
-    /**
-     * <p>Gets the abbreviated class name from a {@code String}.</p>
-     *
-     * <p>The string passed in is assumed to be a class name - it is not checked.</p>
-     *
-     * <p>The abbreviation algorithm will shorten the class name, usually without
-     * significant loss of meaning.</p>
-     * <p>The abbreviated class name will always include the complete package hierarchy.
-     * If enough space is available, rightmost sub-packages will be displayed in full
-     * length.</p>
-     *
-     * <p>The following table illustrates the algorithm:</p>
-     * <table summary="abbreviation examples">
-     * <tr><td>className</td><td>len</td><td>return</td></tr>
-     * <tr><td>              null</td><td> 1</td><td>""</td></tr>
-     * <tr><td>"java.lang.String"</td><td> 5</td><td>"j.l.String"</td></tr>
-     * <tr><td>"java.lang.String"</td><td>15</td><td>"j.lang.String"</td></tr>
-     * <tr><td>"java.lang.String"</td><td>30</td><td>"java.lang.String"</td></tr>
-     * </table>
-     * @param className  the className to get the abbreviated name for, may be {@code null}
-     * @param len  the desired length of the abbreviated name
-     * @return the abbreviated name or an empty string
-     * @throws IllegalArgumentException if len &lt;= 0
-     * @since 3.4
-     */
-    public static String getAbbreviatedName(String className, int len) {
-      if (len <= 0) {
-        throw new IllegalArgumentException("len must be > 0");
-      }
-      if (className == null) {
-        return StringUtils.EMPTY;
-      }
-
-      int availableSpace = len;
-      int packageLevels = StringUtils.countMatches(className, '.');
-      String[] output = new String[packageLevels + 1];
-      int endIndex = className.length() - 1;
-      for (int level = packageLevels; level >= 0; level--) {
-        int startIndex = className.lastIndexOf('.', endIndex);
-        String part = className.substring(startIndex + 1, endIndex + 1);
-        availableSpace -= part.length();
-        if (level > 0) {
-          // all elements except top level require an additional char space
-          availableSpace--;
-        }
-        if (level == packageLevels) {
-          // ClassName is always complete
-          output[level] = part;
-        } else {
-          if (availableSpace > 0) {
-            output[level] = part;
-          } else {
-            // if no space is left still the first char is used
-            output[level] = part.substring(0, 1);
-          }
-        }
-        endIndex = startIndex - 1;
-      }
-
-      return StringUtils.join(output, '.');
-    }
-
-    // Superclasses/Superinterfaces
-    // ----------------------------------------------------------------------
-    /**
-     * <p>Gets a {@code List} of superclasses for the given class.</p>
-     *
-     * @param cls  the class to look up, may be {@code null}
-     * @return the {@code List} of superclasses in order going up from this one
-     *  {@code null} if null input
-     */
-    public static List<Class<?>> getAllSuperclasses(final Class<?> cls) {
-        if (cls == null) {
-            return null;
-        }
-        final List<Class<?>> classes = new ArrayList<Class<?>>();
-        Class<?> superclass = cls.getSuperclass();
-        while (superclass != null) {
-            classes.add(superclass);
-            superclass = superclass.getSuperclass();
-        }
-        return classes;
-    }
-
-    /**
-     * <p>Gets a {@code List} of all interfaces implemented by the given
-     * class and its superclasses.</p>
-     *
-     * <p>The order is determined by looking through each interface in turn as
-     * declared in the source file and following its hierarchy up. Then each
-     * superclass is considered in the same way. Later duplicates are ignored,
-     * so the order is maintained.</p>
-     *
-     * @param cls  the class to look up, may be {@code null}
-     * @return the {@code List} of interfaces in order,
-     *  {@code null} if null input
-     */
-    public static List<Class<?>> getAllInterfaces(final Class<?> cls) {
-        if (cls == null) {
-            return null;
-        }
-
-        final LinkedHashSet<Class<?>> interfacesFound = new LinkedHashSet<Class<?>>();
-        getAllInterfaces(cls, interfacesFound);
-
-        return new ArrayList<Class<?>>(interfacesFound);
-    }
-
-    /**
-     * Get the interfaces for the specified class.
-     *
-     * @param cls  the class to look up, may be {@code null}
-     * @param interfacesFound the {@code Set} of interfaces for the class
-     */
-    private static void getAllInterfaces(Class<?> cls, final HashSet<Class<?>> interfacesFound) {
-        while (cls != null) {
-            final Class<?>[] interfaces = cls.getInterfaces();
-
-            for (final Class<?> i : interfaces) {
-                if (interfacesFound.add(i)) {
-                    getAllInterfaces(i, interfacesFound);
-                }
-            }
-
-            cls = cls.getSuperclass();
-         }
-     }
-
-    // Convert list
-    // ----------------------------------------------------------------------
-    /**
-     * <p>Given a {@code List} of class names, this method converts them into classes.</p>
-     *
-     * <p>A new {@code List} is returned. If the class name cannot be found, {@code null}
-     * is stored in the {@code List}. If the class name in the {@code List} is
-     * {@code null}, {@code null} is stored in the output {@code List}.</p>
-     *
-     * @param classNames  the classNames to change
-     * @return a {@code List} of Class objects corresponding to the class names,
-     *  {@code null} if null input
-     * @throws ClassCastException if classNames contains a non String entry
-     */
-    public static List<Class<?>> convertClassNamesToClasses(final List<String> classNames) {
-        if (classNames == null) {
-            return null;
-        }
-        final List<Class<?>> classes = new ArrayList<Class<?>>(classNames.size());
-        for (final String className : classNames) {
-            try {
-                classes.add(Class.forName(className));
-            } catch (final Exception ex) {
-                classes.add(null);
-            }
-        }
-        return classes;
-    }
-
-    /**
-     * <p>Given a {@code List} of {@code Class} objects, this method converts
-     * them into class names.</p>
-     *
-     * <p>A new {@code List} is returned. {@code null} objects will be copied into
-     * the returned list as {@code null}.</p>
-     *
-     * @param classes  the classes to change
-     * @return a {@code List} of class names corresponding to the Class objects,
-     *  {@code null} if null input
-     * @throws ClassCastException if {@code classes} contains a non-{@code Class} entry
-     */
-    public static List<String> convertClassesToClassNames(final List<Class<?>> classes) {
-        if (classes == null) {
-            return null;
-        }
-        final List<String> classNames = new ArrayList<String>(classes.size());
-        for (final Class<?> cls : classes) {
-            if (cls == null) {
-                classNames.add(null);
-            } else {
-                classNames.add(cls.getName());
-            }
-        }
-        return classNames;
-    }
-
-    // Is assignable
-    // ----------------------------------------------------------------------
-    /**
-     * <p>Checks if an array of Classes can be assigned to another array of Classes.</p>
-     *
-     * <p>This method calls {@link #isAssignable(Class, Class) isAssignable} for each
-     * Class pair in the input arrays. It can be used to check if a set of arguments
-     * (the first parameter) are suitably compatible with a set of method parameter types
-     * (the second parameter).</p>
-     *
-     * <p>Unlike the {@link Class#isAssignableFrom(java.lang.Class)} method, this
-     * method takes into account widenings of primitive classes and
-     * {@code null}s.</p>
-     *
-     * <p>Primitive widenings allow an int to be assigned to a {@code long},
-     * {@code float} or {@code double}. This method returns the correct
-     * result for these cases.</p>
-     *
-     * <p>{@code Null} may be assigned to any reference type. This method will
-     * return {@code true} if {@code null} is passed in and the toClass is
-     * non-primitive.</p>
-     *
-     * <p>Specifically, this method tests whether the type represented by the
-     * specified {@code Class} parameter can be converted to the type
-     * represented by this {@code Class} object via an identity conversion
-     * widening primitive or widening reference conversion. See
-     * <em><a href="http://docs.oracle.com/javase/specs/">The Java Language Specification</a></em>,
-     * sections 5.1.1, 5.1.2 and 5.1.4 for details.</p>
-     *
-     * <p><strong>Since Lang 3.0,</strong> this method will default behavior for
-     * calculating assignability between primitive and wrapper types <em>corresponding
-     * to the running Java version</em>; i.e. autoboxing will be the default
-     * behavior in VMs running Java versions &gt; 1.5.</p>
-     *
-     * @param classArray  the array of Classes to check, may be {@code null}
-     * @param toClassArray  the array of Classes to try to assign into, may be {@code null}
-     * @return {@code true} if assignment possible
-     */
-    public static boolean isAssignable(final Class<?>[] classArray, final Class<?>... toClassArray) {
-        return isAssignable(classArray, toClassArray, SystemUtils.isJavaVersionAtLeast(JavaVersion.JAVA_1_5));
-    }
-
-    /**
-     * <p>Checks if an array of Classes can be assigned to another array of Classes.</p>
-     *
-     * <p>This method calls {@link #isAssignable(Class, Class) isAssignable} for each
-     * Class pair in the input arrays. It can be used to check if a set of arguments
-     * (the first parameter) are suitably compatible with a set of method parameter types
-     * (the second parameter).</p>
-     *
-     * <p>Unlike the {@link Class#isAssignableFrom(java.lang.Class)} method, this
-     * method takes into account widenings of primitive classes and
-     * {@code null}s.</p>
-     *
-     * <p>Primitive widenings allow an int to be assigned to a {@code long},
-     * {@code float} or {@code double}. This method returns the correct
-     * result for these cases.</p>
-     *
-     * <p>{@code Null} may be assigned to any reference type. This method will
-     * return {@code true} if {@code null} is passed in and the toClass is
-     * non-primitive.</p>
-     *
-     * <p>Specifically, this method tests whether the type represented by the
-     * specified {@code Class} parameter can be converted to the type
-     * represented by this {@code Class} object via an identity conversion
-     * widening primitive or widening reference conversion. See
-     * <em><a href="http://docs.oracle.com/javase/specs/">The Java Language Specification</a></em>,
-     * sections 5.1.1, 5.1.2 and 5.1.4 for details.</p>
-     *
-     * @param classArray  the array of Classes to check, may be {@code null}
-     * @param toClassArray  the array of Classes to try to assign into, may be {@code null}
-     * @param autoboxing  whether to use implicit autoboxing/unboxing between primitives and wrappers
-     * @return {@code true} if assignment possible
-     */
-    public static boolean isAssignable(Class<?>[] classArray, Class<?>[] toClassArray, final boolean autoboxing) {
-        if (ArrayUtils.isSameLength(classArray, toClassArray) == false) {
-            return false;
-        }
-        if (classArray == null) {
-            classArray = ArrayUtils.EMPTY_CLASS_ARRAY;
-        }
-        if (toClassArray == null) {
-            toClassArray = ArrayUtils.EMPTY_CLASS_ARRAY;
-        }
-        for (int i = 0; i < classArray.length; i++) {
-            if (isAssignable(classArray[i], toClassArray[i], autoboxing) == false) {
-                return false;
-            }
-        }
-        return true;
-    }
-
-    /**
-     * Returns whether the given {@code type} is a primitive or primitive wrapper ({@link Boolean}, {@link Byte}, {@link Character},
-     * {@link Short}, {@link Integer}, {@link Long}, {@link Double}, {@link Float}).
-     *
-     * @param type
-     *            The class to query or null.
-     * @return true if the given {@code type} is a primitive or primitive wrapper ({@link Boolean}, {@link Byte}, {@link Character},
-     *         {@link Short}, {@link Integer}, {@link Long}, {@link Double}, {@link Float}).
-     * @since 3.1
-     */
-    public static boolean isPrimitiveOrWrapper(final Class<?> type) {
-        if (type == null) {
-            return false;
-        }
-        return type.isPrimitive() || isPrimitiveWrapper(type);
-    }
-
-    /**
-     * Returns whether the given {@code type} is a primitive wrapper ({@link Boolean}, {@link Byte}, {@link Character}, {@link Short},
-     * {@link Integer}, {@link Long}, {@link Double}, {@link Float}).
-     *
-     * @param type
-     *            The class to query or null.
-     * @return true if the given {@code type} is a primitive wrapper ({@link Boolean}, {@link Byte}, {@link Character}, {@link Short},
-     *         {@link Integer}, {@link Long}, {@link Double}, {@link Float}).
-     * @since 3.1
-     */
-    public static boolean isPrimitiveWrapper(final Class<?> type) {
-        return wrapperPrimitiveMap.containsKey(type);
-    }
-
-    /**
-     * <p>Checks if one {@code Class} can be assigned to a variable of
-     * another {@code Class}.</p>
-     *
-     * <p>Unlike the {@link Class#isAssignableFrom(java.lang.Class)} method,
-     * this method takes into account widenings of primitive classes and
-     * {@code null}s.</p>
-     *
-     * <p>Primitive widenings allow an int to be assigned to a long, float or
-     * double. This method returns the correct result for these cases.</p>
-     *
-     * <p>{@code Null} may be assigned to any reference type. This method
-     * will return {@code true} if {@code null} is passed in and the
-     * toClass is non-primitive.</p>
-     *
-     * <p>Specifically, this method tests whether the type represented by the
-     * specified {@code Class} parameter can be converted to the type
-     * represented by this {@code Class} object via an identity conversion
-     * widening primitive or widening reference conversion. See
-     * <em><a href="http://docs.oracle.com/javase/specs/">The Java Language Specification</a></em>,
-     * sections 5.1.1, 5.1.2 and 5.1.4 for details.</p>
-     *
-     * <p><strong>Since Lang 3.0,</strong> this method will default behavior for
-     * calculating assignability between primitive and wrapper types <em>corresponding
-     * to the running Java version</em>; i.e. autoboxing will be the default
-     * behavior in VMs running Java versions &gt; 1.5.</p>
-     *
-     * @param cls  the Class to check, may be null
-     * @param toClass  the Class to try to assign into, returns false if null
-     * @return {@code true} if assignment possible
-     */
-    public static boolean isAssignable(final Class<?> cls, final Class<?> toClass) {
-        return isAssignable(cls, toClass, SystemUtils.isJavaVersionAtLeast(JavaVersion.JAVA_1_5));
-    }
-
-    /**
-     * <p>Checks if one {@code Class} can be assigned to a variable of
-     * another {@code Class}.</p>
-     *
-     * <p>Unlike the {@link Class#isAssignableFrom(java.lang.Class)} method,
-     * this method takes into account widenings of primitive classes and
-     * {@code null}s.</p>
-     *
-     * <p>Primitive widenings allow an int to be assigned to a long, float or
-     * double. This method returns the correct result for these cases.</p>
-     *
-     * <p>{@code Null} may be assigned to any reference type. This method
-     * will return {@code true} if {@code null} is passed in and the
-     * toClass is non-primitive.</p>
-     *
-     * <p>Specifically, this method tests whether the type represented by the
-     * specified {@code Class} parameter can be converted to the type
-     * represented by this {@code Class} object via an identity conversion
-     * widening primitive or widening reference conversion. See
-     * <em><a href="http://docs.oracle.com/javase/specs/">The Java Language Specification</a></em>,
-     * sections 5.1.1, 5.1.2 and 5.1.4 for details.</p>
-     *
-     * @param cls  the Class to check, may be null
-     * @param toClass  the Class to try to assign into, returns false if null
-     * @param autoboxing  whether to use implicit autoboxing/unboxing between primitives and wrappers
-     * @return {@code true} if assignment possible
-     */
-    public static boolean isAssignable(Class<?> cls, final Class<?> toClass, final boolean autoboxing) {
-        if (toClass == null) {
-            return false;
-        }
-        // have to check for null, as isAssignableFrom doesn't
-        if (cls == null) {
-            return !toClass.isPrimitive();
-        }
-        //autoboxing:
-        if (autoboxing) {
-            if (cls.isPrimitive() && !toClass.isPrimitive()) {
-                cls = primitiveToWrapper(cls);
-                if (cls == null) {
-                    return false;
-                }
-            }
-            if (toClass.isPrimitive() && !cls.isPrimitive()) {
-                cls = wrapperToPrimitive(cls);
-                if (cls == null) {
-                    return false;
-                }
-            }
-        }
-        if (cls.equals(toClass)) {
-            return true;
-        }
-        if (cls.isPrimitive()) {
-            if (toClass.isPrimitive() == false) {
-                return false;
-            }
-            if (Integer.TYPE.equals(cls)) {
-                return Long.TYPE.equals(toClass)
-                    || Float.TYPE.equals(toClass)
-                    || Double.TYPE.equals(toClass);
-            }
-            if (Long.TYPE.equals(cls)) {
-                return Float.TYPE.equals(toClass)
-                    || Double.TYPE.equals(toClass);
-            }
-            if (Boolean.TYPE.equals(cls)) {
-                return false;
-            }
-            if (Double.TYPE.equals(cls)) {
-                return false;
-            }
-            if (Float.TYPE.equals(cls)) {
-                return Double.TYPE.equals(toClass);
-            }
-            if (Character.TYPE.equals(cls)) {
-                return Integer.TYPE.equals(toClass)
-                    || Long.TYPE.equals(toClass)
-                    || Float.TYPE.equals(toClass)
-                    || Double.TYPE.equals(toClass);
-            }
-            if (Short.TYPE.equals(cls)) {
-                return Integer.TYPE.equals(toClass)
-                    || Long.TYPE.equals(toClass)
-                    || Float.TYPE.equals(toClass)
-                    || Double.TYPE.equals(toClass);
-            }
-            if (Byte.TYPE.equals(cls)) {
-                return Short.TYPE.equals(toClass)
-                    || Integer.TYPE.equals(toClass)
-                    || Long.TYPE.equals(toClass)
-                    || Float.TYPE.equals(toClass)
-                    || Double.TYPE.equals(toClass);
-            }
-            // should never get here
-            return false;
-        }
-        return toClass.isAssignableFrom(cls);
-    }
-
-    /**
-     * <p>Converts the specified primitive Class object to its corresponding
-     * wrapper Class object.</p>
-     *
-     * <p>NOTE: From v2.2, this method handles {@code Void.TYPE},
-     * returning {@code Void.TYPE}.</p>
-     *
-     * @param cls  the class to convert, may be null
-     * @return the wrapper class for {@code cls} or {@code cls} if
-     * {@code cls} is not a primitive. {@code null} if null input.
-     * @since 2.1
-     */
-    public static Class<?> primitiveToWrapper(final Class<?> cls) {
-        Class<?> convertedClass = cls;
-        if (cls != null && cls.isPrimitive()) {
-            convertedClass = primitiveWrapperMap.get(cls);
-        }
-        return convertedClass;
-    }
-
-    /**
-     * <p>Converts the specified array of primitive Class objects to an array of
-     * its corresponding wrapper Class objects.</p>
-     *
-     * @param classes  the class array to convert, may be null or empty
-     * @return an array which contains for each given class, the wrapper class or
-     * the original class if class is not a primitive. {@code null} if null input.
-     * Empty array if an empty array passed in.
-     * @since 2.1
-     */
-    public static Class<?>[] primitivesToWrappers(final Class<?>... classes) {
-        if (classes == null) {
-            return null;
-        }
-
-        if (classes.length == 0) {
-            return classes;
-        }
-
-        final Class<?>[] convertedClasses = new Class[classes.length];
-        for (int i = 0; i < classes.length; i++) {
-            convertedClasses[i] = primitiveToWrapper(classes[i]);
-        }
-        return convertedClasses;
-    }
-
-    /**
-     * <p>Converts the specified wrapper class to its corresponding primitive
-     * class.</p>
-     *
-     * <p>This method is the counter part of {@code primitiveToWrapper()}.
-     * If the passed in class is a wrapper class for a primitive type, this
-     * primitive type will be returned (e.g. {@code Integer.TYPE} for
-     * {@code Integer.class}). For other classes, or if the parameter is
-     * <b>null</b>, the return value is <b>null</b>.</p>
-     *
-     * @param cls the class to convert, may be <b>null</b>
-     * @return the corresponding primitive type if {@code cls} is a
-     * wrapper class, <b>null</b> otherwise
-     * @see #primitiveToWrapper(Class)
-     * @since 2.4
-     */
-    public static Class<?> wrapperToPrimitive(final Class<?> cls) {
-        return wrapperPrimitiveMap.get(cls);
-    }
-
-    /**
-     * <p>Converts the specified array of wrapper Class objects to an array of
-     * its corresponding primitive Class objects.</p>
-     *
-     * <p>This method invokes {@code wrapperToPrimitive()} for each element
-     * of the passed in array.</p>
-     *
-     * @param classes  the class array to convert, may be null or empty
-     * @return an array which contains for each given class, the primitive class or
-     * <b>null</b> if the original class is not a wrapper class. {@code null} if null input.
-     * Empty array if an empty array passed in.
-     * @see #wrapperToPrimitive(Class)
-     * @since 2.4
-     */
-    public static Class<?>[] wrappersToPrimitives(final Class<?>... classes) {
-        if (classes == null) {
-            return null;
-        }
-
-        if (classes.length == 0) {
-            return classes;
-        }
-
-        final Class<?>[] convertedClasses = new Class[classes.length];
-        for (int i = 0; i < classes.length; i++) {
-            convertedClasses[i] = wrapperToPrimitive(classes[i]);
-        }
-        return convertedClasses;
-    }
-
-    // Inner class
-    // ----------------------------------------------------------------------
-    /**
-     * <p>Is the specified class an inner class or static nested class.</p>
-     *
-     * @param cls  the class to check, may be null
-     * @return {@code true} if the class is an inner or static nested class,
-     *  false if not or {@code null}
-     */
-    public static boolean isInnerClass(final Class<?> cls) {
-        return cls != null && cls.getEnclosingClass() != null;
-    }
-
-    // Class loading
-    // ----------------------------------------------------------------------
-    /**
-     * Returns the class represented by {@code className} using the
-     * {@code classLoader}.  This implementation supports the syntaxes
-     * "{@code java.util.Map.Entry[]}", "{@code java.util.Map$Entry[]}",
-     * "{@code [Ljava.util.Map.Entry;}", and "{@code [Ljava.util.Map$Entry;}".
-     *
-     * @param classLoader  the class loader to use to load the class
-     * @param className  the class name
-     * @param initialize  whether the class must be initialized
-     * @return the class represented by {@code className} using the {@code classLoader}
-     * @throws ClassNotFoundException if the class is not found
-     */
-    public static Class<?> getClass(
-            final ClassLoader classLoader, final String className, final boolean initialize) throws ClassNotFoundException {
-        try {
-            Class<?> clazz;
-            if (abbreviationMap.containsKey(className)) {
-                final String clsName = "[" + abbreviationMap.get(className);
-                clazz = Class.forName(clsName, initialize, classLoader).getComponentType();
-            } else {
-                clazz = Class.forName(toCanonicalName(className), initialize, classLoader);
-            }
-            return clazz;
-        } catch (final ClassNotFoundException ex) {
-            // allow path separators (.) as inner class name separators
-            final int lastDotIndex = className.lastIndexOf(PACKAGE_SEPARATOR_CHAR);
-
-            if (lastDotIndex != -1) {
-                try {
-                    return getClass(classLoader, className.substring(0, lastDotIndex) +
-                            INNER_CLASS_SEPARATOR_CHAR + className.substring(lastDotIndex + 1),
-                            initialize);
-                } catch (final ClassNotFoundException ex2) { // NOPMD
-                    // ignore exception
-                }
-            }
-
-            throw ex;
-        }
-    }
-
-    /**
-     * Returns the (initialized) class represented by {@code className}
-     * using the {@code classLoader}.  This implementation supports
-     * the syntaxes "{@code java.util.Map.Entry[]}",
-     * "{@code java.util.Map$Entry[]}", "{@code [Ljava.util.Map.Entry;}",
-     * and "{@code [Ljava.util.Map$Entry;}".
-     *
-     * @param classLoader  the class loader to use to load the class
-     * @param className  the class name
-     * @return the class represented by {@code className} using the {@code classLoader}
-     * @throws ClassNotFoundException if the class is not found
-     */
-    public static Class<?> getClass(final ClassLoader classLoader, final String className) throws ClassNotFoundException {
-        return getClass(classLoader, className, true);
-    }
-
-    /**
-     * Returns the (initialized) class represented by {@code className}
-     * using the current thread's context class loader. This implementation
-     * supports the syntaxes "{@code java.util.Map.Entry[]}",
-     * "{@code java.util.Map$Entry[]}", "{@code [Ljava.util.Map.Entry;}",
-     * and "{@code [Ljava.util.Map$Entry;}".
-     *
-     * @param className  the class name
-     * @return the class represented by {@code className} using the current thread's context class loader
-     * @throws ClassNotFoundException if the class is not found
-     */
-    public static Class<?> getClass(final String className) throws ClassNotFoundException {
-        return getClass(className, true);
-    }
-
-    /**
-     * Returns the class represented by {@code className} using the
-     * current thread's context class loader. This implementation supports the
-     * syntaxes "{@code java.util.Map.Entry[]}", "{@code java.util.Map$Entry[]}",
-     * "{@code [Ljava.util.Map.Entry;}", and "{@code [Ljava.util.Map$Entry;}".
-     *
-     * @param className  the class name
-     * @param initialize  whether the class must be initialized
-     * @return the class represented by {@code className} using the current thread's context class loader
-     * @throws ClassNotFoundException if the class is not found
-     */
-    public static Class<?> getClass(final String className, final boolean initialize) throws ClassNotFoundException {
-        final ClassLoader contextCL = Thread.currentThread().getContextClassLoader();
-        final ClassLoader loader = contextCL == null ? ClassUtils.class.getClassLoader() : contextCL;
-        return getClass(loader, className, initialize);
-    }
-
-    // Public method
-    // ----------------------------------------------------------------------
-    /**
-     * <p>Returns the desired Method much like {@code Class.getMethod}, however
-     * it ensures that the returned Method is from a public class or interface and not
-     * from an anonymous inner class. This means that the Method is invokable and
-     * doesn't fall foul of Java bug
-     * <a href="http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=4071957">4071957</a>).</p>
-     *
-     *  <pre>
-     *  <code>Set set = Collections.unmodifiableSet(...);
-     *  Method method = ClassUtils.getPublicMethod(set.getClass(), "isEmpty",  new Class[0]);
-     *  Object result = method.invoke(set, new Object[]);</code>
-     *  </pre>
-     *
-     * @param cls  the class to check, not null
-     * @param methodName  the name of the method
-     * @param parameterTypes  the list of parameters
-     * @return the method
-     * @throws NullPointerException if the class is null
-     * @throws SecurityException if a security violation occurred
-     * @throws NoSuchMethodException if the method is not found in the given class
-     *  or if the method doesn't conform with the requirements
-     */
-    public static Method getPublicMethod(final Class<?> cls, final String methodName, final Class<?>... parameterTypes)
-            throws SecurityException, NoSuchMethodException {
-
-        final Method declaredMethod = cls.getMethod(methodName, parameterTypes);
-        if (Modifier.isPublic(declaredMethod.getDeclaringClass().getModifiers())) {
-            return declaredMethod;
-        }
-
-        final List<Class<?>> candidateClasses = new ArrayList<Class<?>>();
-        candidateClasses.addAll(getAllInterfaces(cls));
-        candidateClasses.addAll(getAllSuperclasses(cls));
-
-        for (final Class<?> candidateClass : candidateClasses) {
-            if (!Modifier.isPublic(candidateClass.getModifiers())) {
-                continue;
-            }
-            Method candidateMethod;
-            try {
-                candidateMethod = candidateClass.getMethod(methodName, parameterTypes);
-            } catch (final NoSuchMethodException ex) {
-                continue;
-            }
-            if (Modifier.isPublic(candidateMethod.getDeclaringClass().getModifiers())) {
-                return candidateMethod;
-            }
-        }
-
-        throw new NoSuchMethodException("Can't find a public method for " +
-                methodName + " " + ArrayUtils.toString(parameterTypes));
-    }
-
-    // ----------------------------------------------------------------------
-    /**
-     * Converts a class name to a JLS style class name.
-     *
-     * @param className  the class name
-     * @return the converted name
-     */
-    private static String toCanonicalName(String className) {
-        className = StringUtils.deleteWhitespace(className);
-        if (className == null) {
-            throw new NullPointerException("className must not be null.");
-        } else if (className.endsWith("[]")) {
-            final StringBuilder classNameBuffer = new StringBuilder();
-            while (className.endsWith("[]")) {
-                className = className.substring(0, className.length() - 2);
-                classNameBuffer.append("[");
-            }
-            final String abbreviation = abbreviationMap.get(className);
-            if (abbreviation != null) {
-                classNameBuffer.append(abbreviation);
-            } else {
-                classNameBuffer.append("L").append(className).append(";");
-            }
-            className = classNameBuffer.toString();
-        }
-        return className;
-    }
-
-    /**
-     * <p>Converts an array of {@code Object} in to an array of {@code Class} objects.
-     * If any of these objects is null, a null element will be inserted into the array.</p>
-     *
-     * <p>This method returns {@code null} for a {@code null} input array.</p>
-     *
-     * @param array an {@code Object} array
-     * @return a {@code Class} array, {@code null} if null array input
-     * @since 2.4
-     */
-    public static Class<?>[] toClass(final Object... array) {
-        if (array == null) {
-            return null;
-        } else if (array.length == 0) {
-            return ArrayUtils.EMPTY_CLASS_ARRAY;
-        }
-        final Class<?>[] classes = new Class[array.length];
-        for (int i = 0; i < array.length; i++) {
-            classes[i] = array[i] == null ? null : array[i].getClass();
-        }
-        return classes;
-    }
-
-    // Short canonical name
-    // ----------------------------------------------------------------------
-    /**
-     * <p>Gets the canonical name minus the package name for an {@code Object}.</p>
-     *
-     * @param object  the class to get the short name for, may be null
-     * @param valueIfNull  the value to return if null
-     * @return the canonical name of the object without the package name, or the null value
-     * @since 2.4
-     */
-    public static String getShortCanonicalName(final Object object, final String valueIfNull) {
-        if (object == null) {
-            return valueIfNull;
-        }
-        return getShortCanonicalName(object.getClass().getName());
-    }
-
-    /**
-     * <p>Gets the canonical name minus the package name from a {@code Class}.</p>
-     *
-     * @param cls  the class to get the short name for.
-     * @return the canonical name without the package name or an empty string
-     * @since 2.4
-     */
-    public static String getShortCanonicalName(final Class<?> cls) {
-        if (cls == null) {
-            return StringUtils.EMPTY;
-        }
-        return getShortCanonicalName(cls.getName());
-    }
-
-    /**
-     * <p>Gets the canonical name minus the package name from a String.</p>
-     *
-     * <p>The string passed in is assumed to be a canonical name - it is not checked.</p>
-     *
-     * @param canonicalName  the class name to get the short name for
-     * @return the canonical name of the class without the package name or an empty string
-     * @since 2.4
-     */
-    public static String getShortCanonicalName(final String canonicalName) {
-        return ClassUtils.getShortClassName(getCanonicalName(canonicalName));
-    }
-
-    // Package name
-    // ----------------------------------------------------------------------
-    /**
-     * <p>Gets the package name from the canonical name of an {@code Object}.</p>
-     *
-     * @param object  the class to get the package name for, may be null
-     * @param valueIfNull  the value to return if null
-     * @return the package name of the object, or the null value
-     * @since 2.4
-     */
-    public static String getPackageCanonicalName(final Object object, final String valueIfNull) {
-        if (object == null) {
-            return valueIfNull;
-        }
-        return getPackageCanonicalName(object.getClass().getName());
-    }
-
-    /**
-     * <p>Gets the package name from the canonical name of a {@code Class}.</p>
-     *
-     * @param cls  the class to get the package name for, may be {@code null}.
-     * @return the package name or an empty string
-     * @since 2.4
-     */
-    public static String getPackageCanonicalName(final Class<?> cls) {
-        if (cls == null) {
-            return StringUtils.EMPTY;
-        }
-        return getPackageCanonicalName(cls.getName());
-    }
-
-    /**
-     * <p>Gets the package name from the canonical name. </p>
-     *
-     * <p>The string passed in is assumed to be a canonical name - it is not checked.</p>
-     * <p>If the class is unpackaged, return an empty string.</p>
-     *
-     * @param canonicalName  the canonical name to get the package name for, may be {@code null}
-     * @return the package name or an empty string
-     * @since 2.4
-     */
-    public static String getPackageCanonicalName(final String canonicalName) {
-        return ClassUtils.getPackageName(getCanonicalName(canonicalName));
-    }
-
-    /**
-     * <p>Converts a given name of class into canonical format.
-     * If name of class is not a name of array class it returns
-     * unchanged name.</p>
-     * <p>Example:
-     * <ul>
-     * <li>{@code getCanonicalName("[I") = "int[]"}</li>
-     * <li>{@code getCanonicalName("[Ljava.lang.String;") = "java.lang.String[]"}</li>
-     * <li>{@code getCanonicalName("java.lang.String") = "java.lang.String"}</li>
-     * </ul>
-     * </p>
-     *
-     * @param className the name of class
-     * @return canonical form of class name
-     * @since 2.4
-     */
-    private static String getCanonicalName(String className) {
-        className = StringUtils.deleteWhitespace(className);
-        if (className == null) {
-            return null;
-        }
-        int dim = 0;
-        while (className.startsWith("[")) {
-            dim++;
-            className = className.substring(1);
-        }
-        if (dim < 1) {
-            return className;
-        }
-        if (className.startsWith("L")) {
-            className = className.substring(
-                1,
-                className.endsWith(";")
-                    ? className.length() - 1
-                    : className.length());
-        } else {
-            if (className.length() > 0) {
-                className = reverseAbbreviationMap.get(className.substring(0, 1));
-            }
-        }
-        final StringBuilder canonicalClassNameBuffer = new StringBuilder(className);
-        for (int i = 0; i < dim; i++) {
-            canonicalClassNameBuffer.append("[]");
-        }
-        return canonicalClassNameBuffer.toString();
-    }
-
-    /**
-     * Get an {@link Iterable} that can iterate over a class hierarchy in ascending (subclass to superclass) order,
-     * excluding interfaces.
-     *
-     * @param type the type to get the class hierarchy from
-     * @return Iterable an Iterable over the class hierarchy of the given class
-     * @since 3.2
-     */
-    public static Iterable<Class<?>> hierarchy(final Class<?> type) {
-        return hierarchy(type, Interfaces.EXCLUDE);
-    }
-
-    /**
-     * Get an {@link Iterable} that can iterate over a class hierarchy in ascending (subclass to superclass) order.
-     *
-     * @param type the type to get the class hierarchy from
-     * @param interfacesBehavior switch indicating whether to include or exclude interfaces
-     * @return Iterable an Iterable over the class hierarchy of the given class
-     * @since 3.2
-     */
-    public static Iterable<Class<?>> hierarchy(final Class<?> type, final Interfaces interfacesBehavior) {
-        final Iterable<Class<?>> classes = new Iterable<Class<?>>() {
-    
-            @Override
-            public Iterator<Class<?>> iterator() {
-                final MutableObject<Class<?>> next = new MutableObject<Class<?>>(type);
-                return new Iterator<Class<?>>() {
-    
-                    @Override
-                    public boolean hasNext() {
-                        return next.getValue() != null;
-                    }
-    
-                    @Override
-                    public Class<?> next() {
-                        final Class<?> result = next.getValue();
-                        next.setValue(result.getSuperclass());
-                        return result;
-                    }
-    
-                    @Override
-                    public void remove() {
-                        throw new UnsupportedOperationException();
-                    }
-    
-                };
-            }
-    
-        };
-        if (interfacesBehavior != Interfaces.INCLUDE) {
-            return classes;
-        }
-        return new Iterable<Class<?>>() {
-    
-            @Override
-            public Iterator<Class<?>> iterator() {
-                final Set<Class<?>> seenInterfaces = new HashSet<Class<?>>();
-                final Iterator<Class<?>> wrapped = classes.iterator();
-    
-                return new Iterator<Class<?>>() {
-                    Iterator<Class<?>> interfaces = Collections.<Class<?>> emptySet().iterator();
-    
-                    @Override
-                    public boolean hasNext() {
-                        return interfaces.hasNext() || wrapped.hasNext();
-                    }
-    
-                    @Override
-                    public Class<?> next() {
-                        if (interfaces.hasNext()) {
-                            final Class<?> nextInterface = interfaces.next();
-                            seenInterfaces.add(nextInterface);
-                            return nextInterface;
-                        }
-                        final Class<?> nextSuperclass = wrapped.next();
-                        final Set<Class<?>> currentInterfaces = new LinkedHashSet<Class<?>>();
-                        walkInterfaces(currentInterfaces, nextSuperclass);
-                        interfaces = currentInterfaces.iterator();
-                        return nextSuperclass;
-                    }
-    
-                    private void walkInterfaces(final Set<Class<?>> addTo, final Class<?> c) {
-                        for (final Class<?> iface : c.getInterfaces()) {
-                            if (!seenInterfaces.contains(iface)) {
-                                addTo.add(iface);
-                            }
-                            walkInterfaces(addTo, iface);
-                        }
-                    }
-    
-                    @Override
-                    public void remove() {
-                        throw new UnsupportedOperationException();
-                    }
-    
-                };
-            }
-        };
-    }
-
-}
diff --git a/lang/src/main/java/org/apache/commons/lang3/Conversion.java b/lang/src/main/java/org/apache/commons/lang3/Conversion.java
deleted file mode 100644
index 3dbc759..0000000
--- a/lang/src/main/java/org/apache/commons/lang3/Conversion.java
+++ /dev/null
@@ -1,1594 +0,0 @@
-/*******************************************************************************
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- *******************************************************************************/
-package org.apache.commons.lang3;
-
-import java.util.UUID;
-
-
-/**
- * <p>
- * Static methods to convert a type into another, with endianness and bit ordering awareness.
- * </p>
- * <p>
- * The methods names follow a naming rule:<br>
- * {@code <source type>[source endianness][source bit ordering]To<destination type>[destination endianness][destination bit ordering]}
- * </p>
- * <p>
- * Source/destination type fields is one of the following:
- * </p>
- * <ul>
- * <li>binary: an array of booleans</li>
- * <li>byte or byteArray</li>
- * <li>int or intArray</li>
- * <li>long or longArray</li>
- * <li>hex: a String containing hexadecimal digits (lowercase in destination)</li>
- * <li>hexDigit: a Char containing a hexadecimal digit (lowercase in destination)</li>
- * <li>uuid</li>
- * </ul>
- * <p>
- * Endianness field: little endian is the default, in this case the field is absent. In case of
- * big endian, the field is "Be".<br> Bit ordering: Lsb0 is the default, in this case the field
- * is absent. In case of Msb0, the field is "Msb0".
- * </p>
- * <p>
- * Example: intBeMsb0ToHex convert an int with big endian byte order and Msb0 bit order into its
- * hexadecimal string representation
- * </p>
- * <p>
- * Most of the methods provide only default encoding for destination, this limits the number of
- * ways to do one thing. Unless you are dealing with data from/to outside of the JVM platform,
- * you should not need to use "Be" and "Msb0" methods.
- * </p>
- * <p>
- * Development status: work on going, only a part of the little endian, Lsb0 methods implemented
- * so far.
- * </p>
- * 
- * @since Lang 3.2
- * @version $Id$
- */
-
-public class Conversion {
-    
-    private static final boolean[] TTTT = new boolean[] { true, true, true, true };
-    private static final boolean[] FTTT = new boolean[] { false, true, true, true };
-    private static final boolean[] TFTT = new boolean[] { true, false, true, true };
-    private static final boolean[] FFTT = new boolean[] { false, false, true, true };
-    private static final boolean[] TTFT = new boolean[] { true, true, false, true };
-    private static final boolean[] FTFT = new boolean[] { false, true, false, true };
-    private static final boolean[] TFFT = new boolean[] { true, false, false, true };
-    private static final boolean[] FFFT = new boolean[] { false, false, false, true };
-    private static final boolean[] TTTF = new boolean[] { true, true, true, false };
-    private static final boolean[] FTTF = new boolean[] { false, true, true, false };
-    private static final boolean[] TFTF = new boolean[] { true, false, true, false };
-    private static final boolean[] FFTF = new boolean[] { false, false, true, false };
-    private static final boolean[] TTFF = new boolean[] { true, true, false, false };
-    private static final boolean[] FTFF = new boolean[] { false, true, false, false };
-    private static final boolean[] TFFF = new boolean[] { true, false, false, false };
-    private static final boolean[] FFFF = new boolean[] { false, false, false, false };
-
-    /**
-     * <p>
-     * Converts a hexadecimal digit into an int using the default (Lsb0) bit ordering.
-     * </p>
-     * <p>
-     * '1' is converted to 1
-     * </p>
-     * 
-     * @param hexDigit the hexadecimal digit to convert
-     * @return an int equals to {@code hexDigit}
-     * @throws IllegalArgumentException if {@code hexDigit} is not a hexadecimal digit
-     */
-    public static int hexDigitToInt(final char hexDigit) {
-        final int digit = Character.digit(hexDigit, 16);
-        if (digit < 0) {
-            throw new IllegalArgumentException("Cannot interpret '" + hexDigit + "' as a hexadecimal digit");
-        }
-        return digit;
-    }
-
-    /**
-     * <p>
-     * Converts a hexadecimal digit into an int using the Msb0 bit ordering.
-     * </p>
-     * <p>
-     * '1' is converted to 8
-     * </p>
-     * 
-     * @param hexDigit the hexadecimal digit to convert
-     * @return an int equals to {@code hexDigit}
-     * @throws IllegalArgumentException if {@code hexDigit} is not a hexadecimal digit
-     */
-    public static int hexDigitMsb0ToInt(final char hexDigit) {
-        switch (hexDigit) {
-        case '0':
-            return 0x0;
-        case '1':
-            return 0x8;
-        case '2':
-            return 0x4;
-        case '3':
-            return 0xC;
-        case '4':
-            return 0x2;
-        case '5':
-            return 0xA;
-        case '6':
-            return 0x6;
-        case '7':
-            return 0xE;
-        case '8':
-            return 0x1;
-        case '9':
-            return 0x9;
-        case 'a':// fall through
-        case 'A':
-            return 0x5;
-        case 'b':// fall through
-        case 'B':
-            return 0xD;
-        case 'c':// fall through
-        case 'C':
-            return 0x3;
-        case 'd':// fall through
-        case 'D':
-            return 0xB;
-        case 'e':// fall through
-        case 'E':
-            return 0x7;
-        case 'f':// fall through
-        case 'F':
-            return 0xF;
-        default:
-            throw new IllegalArgumentException("Cannot interpret '" + hexDigit + "' as a hexadecimal digit");
-        }
-    }
-
-    /**
-     * <p>
-     * Converts a hexadecimal digit into binary (represented as boolean array) using the default
-     * (Lsb0) bit ordering.
-     * </p>
-     * <p>
-     * '1' is converted as follow: (1, 0, 0, 0)
-     * </p>
-     * 
-     * @param hexDigit the hexadecimal digit to convert
-     * @return a boolean array with the binary representation of {@code hexDigit}
-     * @throws IllegalArgumentException if {@code hexDigit} is not a hexadecimal digit
-     */
-    public static boolean[] hexDigitToBinary(final char hexDigit) {
-        switch (hexDigit) {
-        case '0':
-            return FFFF.clone();
-        case '1':
-            return TFFF.clone();
-        case '2':
-            return FTFF.clone();
-        case '3':
-            return TTFF.clone();
-        case '4':
-            return FFTF.clone();
-        case '5':
-            return TFTF.clone();
-        case '6':
-            return FTTF.clone();
-        case '7':
-            return TTTF.clone();
-        case '8':
-            return FFFT.clone();
-        case '9':
-            return TFFT.clone();
-        case 'a':// fall through
-        case 'A':
-            return FTFT.clone();
-        case 'b':// fall through
-        case 'B':
-            return TTFT.clone();
-        case 'c':// fall through
-        case 'C':
-            return FFTT.clone();
-        case 'd':// fall through
-        case 'D':
-            return TFTT.clone();
-        case 'e':// fall through
-        case 'E':
-            return FTTT.clone();
-        case 'f':// fall through
-        case 'F':
-            return TTTT.clone();
-        default:
-            throw new IllegalArgumentException("Cannot interpret '" + hexDigit + "' as a hexadecimal digit");
-        }
-    }
-
-    /**
-     * <p>
-     * Converts a hexadecimal digit into binary (represented as boolean array) using the Msb0
-     * bit ordering.
-     * </p>
-     * <p>
-     * '1' is converted as follow: (0, 0, 0, 1)
-     * </p>
-     * 
-     * @param hexDigit the hexadecimal digit to convert
-     * @return a boolean array with the binary representation of {@code hexDigit}
-     * @throws IllegalArgumentException if {@code hexDigit} is not a hexadecimal digit
-     */
-    public static boolean[] hexDigitMsb0ToBinary(final char hexDigit) {
-        switch (hexDigit) {
-        case '0':
-            return FFFF.clone();
-        case '1':
-            return FFFT.clone();
-        case '2':
-            return FFTF.clone();
-        case '3':
-            return FFTT.clone();
-        case '4':
-            return FTFF.clone();
-        case '5':
-            return FTFT.clone();
-        case '6':
-            return FTTF.clone();
-        case '7':
-            return FTTT.clone();
-        case '8':
-            return TFFF.clone();
-        case '9':
-            return TFFT.clone();
-        case 'a':// fall through
-        case 'A':
-            return TFTF.clone();
-        case 'b':// fall through
-        case 'B':
-            return TFTT.clone();
-        case 'c':// fall through
-        case 'C':
-            return TTFF.clone();
-        case 'd':// fall through
-        case 'D':
-            return TTFT.clone();
-        case 'e':// fall through
-        case 'E':
-            return TTTF.clone();
-        case 'f':// fall through
-        case 'F':
-            return TTTT.clone();
-        default:
-            throw new IllegalArgumentException("Cannot interpret '" + hexDigit + "' as a hexadecimal digit");
-        }
-    }
-
-    /**
-     * <p>
-     * Converts binary (represented as boolean array) to a hexadecimal digit using the default
-     * (Lsb0) bit ordering.
-     * </p>
-     * <p>
-     * (1, 0, 0, 0) is converted as follow: '1'
-     * </p>
-     * 
-     * @param src the binary to convert
-     * @return a hexadecimal digit representing the selected bits
-     * @throws IllegalArgumentException if {@code src} is empty
-     * @throws NullPointerException if {@code src} is {@code null}
-     */
-    public static char binaryToHexDigit(final boolean[] src) {
-        return binaryToHexDigit(src, 0);
-    }
-
-    /**
-     * <p>
-     * Converts binary (represented as boolean array) to a hexadecimal digit using the default
-     * (Lsb0) bit ordering.
-     * </p>
-     * <p>
-     * (1, 0, 0, 0) is converted as follow: '1'
-     * </p>
-     * 
-     * @param src the binary to convert
-     * @param srcPos the position of the lsb to start the conversion
-     * @return a hexadecimal digit representing the selected bits
-     * @throws IllegalArgumentException if {@code src} is empty
-     * @throws NullPointerException if {@code src} is {@code null}
-     */
-    public static char binaryToHexDigit(final boolean[] src, final int srcPos) {
-        if (src.length == 0) {
-            throw new IllegalArgumentException("Cannot convert an empty array.");
-        }
-        if (src.length > srcPos + 3 && src[srcPos + 3]) {
-            if (src.length > srcPos + 2 && src[srcPos + 2]) {
-                if (src.length > srcPos + 1 && src[srcPos + 1]) {
-                    return src[srcPos] ? 'f' : 'e';
-                }
-                return src[srcPos] ? 'd' : 'c';
-            }
-            if (src.length > srcPos + 1 && src[srcPos + 1]) {
-                return src[srcPos] ? 'b' : 'a';
-            }
-            return src[srcPos] ? '9' : '8';
-        }
-        if (src.length > srcPos + 2 && src[srcPos + 2]) {
-            if (src.length > srcPos + 1 && src[srcPos + 1]) {
-                return src[srcPos] ? '7' : '6';
-            }
-            return src[srcPos] ? '5' : '4';
-        }
-        if (src.length > srcPos + 1 && src[srcPos + 1]) {
-            return src[srcPos] ? '3' : '2';
-        }
-        return src[srcPos] ? '1' : '0';
-    }
-
-    /**
-     * <p>
-     * Converts binary (represented as boolean array) to a hexadecimal digit using the Msb0 bit
-     * ordering.
-     * </p>
-     * <p>
-     * (1, 0, 0, 0) is converted as follow: '8'
-     * </p>
-     * 
-     * @param src the binary to convert
-     * @return a hexadecimal digit representing the selected bits
-     * @throws IllegalArgumentException if {@code src} is empty, {@code src.length < 4} or
-     *             {@code src.length > 8}
-     * @throws NullPointerException if {@code src} is {@code null}
-     */
-    public static char binaryToHexDigitMsb0_4bits(final boolean[] src) {
-        return binaryToHexDigitMsb0_4bits(src, 0);
-    }
-
-    /**
-     * <p>
-     * Converts binary (represented as boolean array) to a hexadecimal digit using the Msb0 bit
-     * ordering.
-     * </p>
-     * <p>
-     * (1, 0, 0, 0) is converted as follow: '8' (1,0,0,1,1,0,1,0) with srcPos = 3 is converted
-     * to 'D'
-     * </p>
-     * 
-     * @param src the binary to convert
-     * @param srcPos the position of the lsb to start the conversion
-     * @return a hexadecimal digit representing the selected bits
-     * @throws IllegalArgumentException if {@code src} is empty, {@code src.length > 8} or
-     *             {@code src.length - srcPos < 4}
-     * @throws NullPointerException if {@code src} is {@code null}
-     */
-    public static char binaryToHexDigitMsb0_4bits(final boolean[] src, final int srcPos) {
-        if (src.length > 8) {
-            throw new IllegalArgumentException("src.length>8: src.length=" + src.length);
-        }
-        if (src.length - srcPos < 4) {
-            throw new IllegalArgumentException("src.length-srcPos<4: src.length=" + src.length + ", srcPos=" + srcPos);
-        }
-        if (src[srcPos + 3]) {
-            if (src[srcPos + 2]) {
-                if (src[srcPos + 1]) {
-                    return src[srcPos] ? 'f' : '7';
-                }
-                return src[srcPos] ? 'b' : '3';
-            }
-            if (src[srcPos + 1]) {
-                return src[srcPos] ? 'd' : '5';
-            }
-            return src[srcPos] ? '9' : '1';
-        }
-        if (src[srcPos + 2]) {
-            if (src[srcPos + 1]) {
-                return src[srcPos] ? 'e' : '6';
-            }
-            return src[srcPos] ? 'a' : '2';
-        }
-        if (src[srcPos + 1]) {
-            return src[srcPos] ? 'c' : '4';
-        }
-        return src[srcPos] ? '8' : '0';
-    }
-
-    /**
-     * <p>
-     * Converts the first 4 bits of a binary (represented as boolean array) in big endian Msb0
-     * bit ordering to a hexadecimal digit.
-     * </p>
-     * <p>
-     * (1, 0, 0, 0) is converted as follow: '8' (1,0,0,0,0,0,0,0, 0,0,0,0,0,1,0,0) is converted
-     * to '4'
-     * </p>
-     * 
-     * @param src the binary to convert
-     * @return a hexadecimal digit representing the selected bits
-     * @throws IllegalArgumentException if {@code src} is empty
-     * @throws NullPointerException if {@code src} is {@code null}
-     */
-    public static char binaryBeMsb0ToHexDigit(final boolean[] src) {
-        return binaryBeMsb0ToHexDigit(src, 0);
-    }
-
-    /**
-     * <p>
-     * Converts a binary (represented as boolean array) in big endian Msb0 bit ordering to a
-     * hexadecimal digit.
-     * </p>
-     * <p>
-     * (1, 0, 0, 0) with srcPos = 0 is converted as follow: '8' (1,0,0,0,0,0,0,0,
-     * 0,0,0,1,0,1,0,0) with srcPos = 2 is converted to '5'
-     * </p>
-     * 
-     * @param src the binary to convert
-     * @param srcPos the position of the lsb to start the conversion
-     * @return a hexadecimal digit representing the selected bits
-     * @throws IllegalArgumentException if {@code src} is empty
-     * @throws NullPointerException if {@code src} is {@code null}
-     */
-    public static char binaryBeMsb0ToHexDigit(boolean[] src, int srcPos) {
-        if (src.length == 0) {
-            throw new IllegalArgumentException("Cannot convert an empty array.");
-        }
-        final int beSrcPos = src.length - 1 - srcPos;
-        final int srcLen = Math.min(4, beSrcPos + 1);
-        final boolean[] paddedSrc = new boolean[4];
-        System.arraycopy(src, beSrcPos + 1 - srcLen, paddedSrc, 4 - srcLen, srcLen);
-        src = paddedSrc;
-        srcPos = 0;
-        if (src[srcPos]) {
-            if (src.length > srcPos + 1 && src[srcPos + 1]) {
-                if (src.length > srcPos + 2 && src[srcPos + 2]) {
-                    return src.length > srcPos + 3 && src[srcPos + 3] ? 'f' : 'e';
-                }
-                return src.length > srcPos + 3 && src[srcPos + 3] ? 'd' : 'c';
-            }
-            if (src.length > srcPos + 2 && src[srcPos + 2]) {
-                return src.length > srcPos + 3 && src[srcPos + 3] ? 'b' : 'a';
-            }
-            return src.length > srcPos + 3 && src[srcPos + 3] ? '9' : '8';
-        }
-        if (src.length > srcPos + 1 && src[srcPos + 1]) {
-            if (src.length > srcPos + 2 && src[srcPos + 2]) {
-                return src.length > srcPos + 3 && src[srcPos + 3] ? '7' : '6';
-            }
-            return src.length > srcPos + 3 && src[srcPos + 3] ? '5' : '4';
-        }
-        if (src.length > srcPos + 2 && src[srcPos + 2]) {
-            return src.length > srcPos + 3 && src[srcPos + 3] ? '3' : '2';
-        }
-        return src.length > srcPos + 3 && src[srcPos + 3] ? '1' : '0';
-    }
-
-    /**
-     * <p>
-     * Converts the 4 lsb of an int to a hexadecimal digit.
-     * </p>
-     * <p>
-     * 0 returns '0'
-     * </p>
-     * <p>
-     * 1 returns '1'
-     * </p>
-     * <p>
-     * 10 returns 'A' and so on...
-     * </p>
-     * 
-     * @param nibble the 4 bits to convert
-     * @return a hexadecimal digit representing the 4 lsb of {@code nibble}
-     * @throws IllegalArgumentException if {@code nibble < 0} or {@code nibble > 15}
-     */
-    public static char intToHexDigit(final int nibble) {
-        final char c = Character.forDigit(nibble, 16);
-        if (c == Character.MIN_VALUE) {
-            throw new IllegalArgumentException("nibble value not between 0 and 15: " + nibble);
-        }
-        return c;
-    }
-
-    /**
-     * <p>
-     * Converts the 4 lsb of an int to a hexadecimal digit encoded using the Msb0 bit ordering.
-     * </p>
-     * <p>
-     * 0 returns '0'
-     * </p>
-     * <p>
-     * 1 returns '8'
-     * </p>
-     * <p>
-     * 10 returns '5' and so on...
-     * </p>
-     * 
-     * @param nibble the 4 bits to convert
-     * @return a hexadecimal digit representing the 4 lsb of {@code nibble}
-     * @throws IllegalArgumentException if {@code nibble < 0} or {@code nibble > 15}
-     */
-    public static char intToHexDigitMsb0(final int nibble) {
-        switch (nibble) {
-        case 0x0:
-            return '0';
-        case 0x1:
-            return '8';
-        case 0x2:
-            return '4';
-        case 0x3:
-            return 'c';
-        case 0x4:
-            return '2';
-        case 0x5:
-            return 'a';
-        case 0x6:
-            return '6';
-        case 0x7:
-            return 'e';
-        case 0x8:
-            return '1';
-        case 0x9:
-            return '9';
-        case 0xA:
-            return '5';
-        case 0xB:
-            return 'd';
-        case 0xC:
-            return '3';
-        case 0xD:
-            return 'b';
-        case 0xE:
-            return '7';
-        case 0xF:
-            return 'f';
-        default:
-            throw new IllegalArgumentException("nibble value not between 0 and 15: " + nibble);
-        }
-    }
-
-    /**
-     * <p>
-     * Converts an array of int into a long using the default (little endian, Lsb0) byte and bit
-     * ordering.
-     * </p>
-     * 
-     * @param src the int array to convert
-     * @param srcPos the position in {@code src}, in int unit, from where to start the
-     *            conversion
-     * @param dstInit initial value of the destination long
-     * @param dstPos the position of the lsb, in bits, in the result long
-     * @param nInts the number of ints to convert
-     * @return a long containing the selected bits
-     * @throws IllegalArgumentException if {@code (nInts-1)*32+dstPos >= 64}
-     * @throws NullPointerException if {@code src} is {@code null}
-     * @throws ArrayIndexOutOfBoundsException if {@code srcPos + nInts > src.length}
-     */
-    public static long intArrayToLong(final int[] src, final int srcPos, final long dstInit, final int dstPos,
-            final int nInts) {
-        if ((src.length == 0 && srcPos == 0) || 0 == nInts) {
-            return dstInit;
-        }
-        if ((nInts - 1) * 32 + dstPos >= 64) {
-            throw new IllegalArgumentException("(nInts-1)*32+dstPos is greather or equal to than 64");
-        }
-        long out = dstInit;
-        int shift = 0;
-        for (int i = 0; i < nInts; i++) {
-            shift = i * 32 + dstPos;
-            final long bits = ((0xffffffffL & src[i + srcPos]) << shift);
-            final long mask = 0xffffffffL << shift;
-            out = (out & ~mask) | bits;
-        }
-        return out;
-    }
-
-    /**
-     * <p>
-     * Converts an array of short into a long using the default (little endian, Lsb0) byte and
-     * bit ordering.
-     * </p>
-     * 
-     * @param src the short array to convert
-     * @param srcPos the position in {@code src}, in short unit, from where to start the
-     *            conversion
-     * @param dstInit initial value of the destination long
-     * @param dstPos the position of the lsb, in bits, in the result long
-     * @param nShorts the number of shorts to convert
-     * @return a long containing the selected bits
-     * @throws NullPointerException if {@code src} is {@code null}
-     * @throws IllegalArgumentException if {@code (nShorts-1)*16+dstPos >= 64}
-     * @throws ArrayIndexOutOfBoundsException if {@code srcPos + nShorts > src.length}
-     */
-    public static long shortArrayToLong(final short[] src, final int srcPos, final long dstInit, final int dstPos,
-            final int nShorts) {
-        if ((src.length == 0 && srcPos == 0) || 0 == nShorts) {
-            return dstInit;
-        }
-        if ((nShorts - 1) * 16 + dstPos >= 64) {
-            throw new IllegalArgumentException("(nShorts-1)*16+dstPos is greather or equal to than 64");
-        }
-        long out = dstInit;
-        int shift = 0;
-        for (int i = 0; i < nShorts; i++) {
-            shift = i * 16 + dstPos;
-            final long bits = (0xffffL & src[i + srcPos]) << shift;
-            final long mask = 0xffffL << shift;
-            out = (out & ~mask) | bits;
-        }
-        return out;
-    }
-
-    /**
-     * <p>
-     * Converts an array of short into a int using the default (little endian, Lsb0) byte and
-     * bit ordering.
-     * </p>
-     * 
-     * @param src the short array to convert
-     * @param srcPos the position in {@code src}, in short unit, from where to start the
-     *            conversion
-     * @param dstInit initial value of the destination int
-     * @param dstPos the position of the lsb, in bits, in the result int
-     * @param nShorts the number of shorts to convert
-     * @return a int containing the selected bits
-     * @throws NullPointerException if {@code src} is {@code null}
-     * @throws IllegalArgumentException if {@code (nShorts-1)*16+dstPos >= 32}
-     * @throws ArrayIndexOutOfBoundsException if {@code srcPos + nShorts > src.length}
-     */
-    public static int shortArrayToInt(final short[] src, final int srcPos, final int dstInit, final int dstPos,
-            final int nShorts) {
-        if ((src.length == 0 && srcPos == 0) || 0 == nShorts) {
-            return dstInit;
-        }
-        if ((nShorts - 1) * 16 + dstPos >= 32) {
-            throw new IllegalArgumentException("(nShorts-1)*16+dstPos is greather or equal to than 32");
-        }
-        int out = dstInit;
-        int shift = 0;
-        for (int i = 0; i < nShorts; i++) {
-            shift = i * 16 + dstPos;
-            final int bits = (0xffff & src[i + srcPos]) << shift;
-            final int mask = 0xffff << shift;
-            out = (out & ~mask) | bits;
-        }
-        return out;
-    }
-
-    /**
-     * <p>
-     * Converts an array of byte into a long using the default (little endian, Lsb0) byte and
-     * bit ordering.
-     * </p>
-     * 
-     * @param src the byte array to convert
-     * @param srcPos the position in {@code src}, in byte unit, from where to start the
-     *            conversion
-     * @param dstInit initial value of the destination long
-     * @param dstPos the position of the lsb, in bits, in the result long
-     * @param nBytes the number of bytes to convert
-     * @return a long containing the selected bits
-     * @throws NullPointerException if {@code src} is {@code null}
-     * @throws IllegalArgumentException if {@code (nBytes-1)*8+dstPos >= 64}
-     * @throws ArrayIndexOutOfBoundsException if {@code srcPos + nBytes > src.length}
-     */
-    public static long byteArrayToLong(final byte[] src, final int srcPos, final long dstInit, final int dstPos,
-            final int nBytes) {
-        if ((src.length == 0 && srcPos == 0) || 0 == nBytes) {
-            return dstInit;
-        }
-        if ((nBytes - 1) * 8 + dstPos >= 64) {
-            throw new IllegalArgumentException("(nBytes-1)*8+dstPos is greather or equal to than 64");
-        }
-        long out = dstInit;
-        int shift = 0;
-        for (int i = 0; i < nBytes; i++) {
-            shift = i * 8 + dstPos;
-            final long bits = (0xffL & src[i + srcPos]) << shift;
-            final long mask = 0xffL << shift;
-            out = (out & ~mask) | bits;
-        }
-        return out;
-    }
-
-    /**
-     * <p>
-     * Converts an array of byte into a int using the default (little endian, Lsb0) byte and bit
-     * ordering.
-     * </p>
-     * 
-     * @param src the byte array to convert
-     * @param srcPos the position in {@code src}, in byte unit, from where to start the
-     *            conversion
-     * @param dstInit initial value of the destination int
-     * @param dstPos the position of the lsb, in bits, in the result int
-     * @param nBytes the number of bytes to convert
-     * @return a int containing the selected bits
-     * @throws NullPointerException if {@code src} is {@code null}
-     * @throws IllegalArgumentException if {@code (nBytes-1)*8+dstPos >= 32}
-     * @throws ArrayIndexOutOfBoundsException if {@code srcPos + nBytes > src.length}
-     */
-    public static int byteArrayToInt(final byte[] src, final int srcPos, final int dstInit, final int dstPos,
-            final int nBytes) {
-        if ((src.length == 0 && srcPos == 0) || 0 == nBytes) {
-            return dstInit;
-        }
-        if ((nBytes - 1) * 8 + dstPos >= 32) {
-            throw new IllegalArgumentException("(nBytes-1)*8+dstPos is greather or equal to than 32");
-        }
-        int out = dstInit;
-        int shift = 0;
-        for (int i = 0; i < nBytes; i++) {
-            shift = i * 8 + dstPos;
-            final int bits = (0xff & src[i + srcPos]) << shift;
-            final int mask = 0xff << shift;
-            out = (out & ~mask) | bits;
-        }
-        return out;
-    }
-
-    /**
-     * <p>
-     * Converts an array of byte into a short using the default (little endian, Lsb0) byte and
-     * bit ordering.
-     * </p>
-     * 
-     * @param src the byte array to convert
-     * @param srcPos the position in {@code src}, in byte unit, from where to start the
-     *            conversion
-     * @param dstInit initial value of the destination short
-     * @param dstPos the position of the lsb, in bits, in the result short
-     * @param nBytes the number of bytes to convert
-     * @return a short containing the selected bits
-     * @throws NullPointerException if {@code src} is {@code null}
-     * @throws IllegalArgumentException if {@code (nBytes-1)*8+dstPos >= 16}
-     * @throws ArrayIndexOutOfBoundsException if {@code srcPos + nBytes > src.length}
-     */
-    public static short byteArrayToShort(final byte[] src, final int srcPos, final short dstInit, final int dstPos,
-            final int nBytes) {
-        if ((src.length == 0 && srcPos == 0) || 0 == nBytes) {
-            return dstInit;
-        }
-        if ((nBytes - 1) * 8 + dstPos >= 16) {
-            throw new IllegalArgumentException("(nBytes-1)*8+dstPos is greather or equal to than 16");
-        }
-        short out = dstInit;
-        int shift = 0;
-        for (int i = 0; i < nBytes; i++) {
-            shift = i * 8 + dstPos;
-            final int bits = (0xff & src[i + srcPos]) << shift;
-            final int mask = 0xff << shift;
-            out = (short) ((out & ~mask) | bits);
-        }
-        return out;
-    }
-
-    /**
-     * <p>
-     * Converts an array of Char into a long using the default (little endian, Lsb0) byte and
-     * bit ordering.
-     * </p>
-     * 
-     * @param src the hex string to convert
-     * @param srcPos the position in {@code src}, in Char unit, from where to start the
-     *            conversion
-     * @param dstInit initial value of the destination long
-     * @param dstPos the position of the lsb, in bits, in the result long
-     * @param nHex the number of Chars to convert
-     * @return a long containing the selected bits
-     * @throws IllegalArgumentException if {@code (nHexs-1)*4+dstPos >= 64}
-     */
-    public static long hexToLong(final String src, final int srcPos, final long dstInit, final int dstPos,
-            final int nHex) {
-        if (0 == nHex) {
-            return dstInit;
-        }
-        if ((nHex - 1) * 4 + dstPos >= 64) {
-            throw new IllegalArgumentException("(nHexs-1)*4+dstPos is greather or equal to than 64");
-        }
-        long out = dstInit;
-        int shift = 0;
-        for (int i = 0; i < nHex; i++) {
-            shift = i * 4 + dstPos;
-            final long bits = (0xfL & hexDigitToInt(src.charAt(i + srcPos))) << shift;
-            final long mask = 0xfL << shift;
-            out = (out & ~mask) | bits;
-        }
-        return out;
-    }
-
-    /**
-     * <p>
-     * Converts an array of Char into a int using the default (little endian, Lsb0) byte and bit
-     * ordering.
-     * </p>
-     * 
-     * @param src the hex string to convert
-     * @param srcPos the position in {@code src}, in Char unit, from where to start the
-     *            conversion
-     * @param dstInit initial value of the destination int
-     * @param dstPos the position of the lsb, in bits, in the result int
-     * @param nHex the number of Chars to convert
-     * @return a int containing the selected bits
-     * @throws IllegalArgumentException if {@code (nHexs-1)*4+dstPos >= 32}
-     */
-    public static int hexToInt(final String src, final int srcPos, final int dstInit, final int dstPos, final int nHex) {
-        if (0 == nHex) {
-            return dstInit;
-        }
-        if ((nHex - 1) * 4 + dstPos >= 32) {
-            throw new IllegalArgumentException("(nHexs-1)*4+dstPos is greather or equal to than 32");
-        }
-        int out = dstInit;
-        int shift = 0;
-        for (int i = 0; i < nHex; i++) {
-            shift = i * 4 + dstPos;
-            final int bits = (0xf & hexDigitToInt(src.charAt(i + srcPos))) << shift;
-            final int mask = 0xf << shift;
-            out = (out & ~mask) | bits;
-        }
-        return out;
-    }
-
-    /**
-     * <p>
-     * Converts an array of Char into a short using the default (little endian, Lsb0) byte and
-     * bit ordering.
-     * </p>
-     * 
-     * @param src the hex string to convert
-     * @param srcPos the position in {@code src}, in Char unit, from where to start the
-     *            conversion
-     * @param dstInit initial value of the destination short
-     * @param dstPos the position of the lsb, in bits, in the result short
-     * @param nHex the number of Chars to convert
-     * @return a short containing the selected bits
-     * @throws IllegalArgumentException if {@code (nHexs-1)*4+dstPos >= 16}
-     */
-    public static short hexToShort(final String src, final int srcPos, final short dstInit, final int dstPos,
-            final int nHex) {
-        if (0 == nHex) {
-            return dstInit;
-        }
-        if ((nHex - 1) * 4 + dstPos >= 16) {
-            throw new IllegalArgumentException("(nHexs-1)*4+dstPos is greather or equal to than 16");
-        }
-        short out = dstInit;
-        int shift = 0;
-        for (int i = 0; i < nHex; i++) {
-            shift = i * 4 + dstPos;
-            final int bits = (0xf & hexDigitToInt(src.charAt(i + srcPos))) << shift;
-            final int mask = 0xf << shift;
-            out = (short) ((out & ~mask) | bits);
-        }
-        return out;
-    }
-
-    /**
-     * <p>
-     * Converts an array of Char into a byte using the default (little endian, Lsb0) byte and
-     * bit ordering.
-     * </p>
-     * 
-     * @param src the hex string to convert
-     * @param srcPos the position in {@code src}, in Char unit, from where to start the
-     *            conversion
-     * @param dstInit initial value of the destination byte
-     * @param dstPos the position of the lsb, in bits, in the result byte
-     * @param nHex the number of Chars to convert
-     * @return a byte containing the selected bits
-     * @throws IllegalArgumentException if {@code (nHexs-1)*4+dstPos >= 8}
-     */
-    public static byte hexToByte(final String src, final int srcPos, final byte dstInit, final int dstPos,
-            final int nHex) {
-        if (0 == nHex) {
-            return dstInit;
-        }
-        if ((nHex - 1) * 4 + dstPos >= 8) {
-            throw new IllegalArgumentException("(nHexs-1)*4+dstPos is greather or equal to than 8");
-        }
-        byte out = dstInit;
-        int shift = 0;
-        for (int i = 0; i < nHex; i++) {
-            shift = i * 4 + dstPos;
-            final int bits = (0xf & hexDigitToInt(src.charAt(i + srcPos))) << shift;
-            final int mask = 0xf << shift;
-            out = (byte) ((out & ~mask) | bits);
-        }
-        return out;
-    }
-
-    /**
-     * <p>
-     * Converts binary (represented as boolean array) into a long using the default (little
-     * endian, Lsb0) byte and bit ordering.
-     * </p>
-     * 
-     * @param src the binary to convert
-     * @param srcPos the position in {@code src}, in boolean unit, from where to start the
-     *            conversion
-     * @param dstInit initial value of the destination long
-     * @param dstPos the position of the lsb, in bits, in the result long
-     * @param nBools the number of booleans to convert
-     * @return a long containing the selected bits
-     * @throws NullPointerException if {@code src} is {@code null}
-     * @throws IllegalArgumentException if {@code nBools-1+dstPos >= 64}
-     * @throws ArrayIndexOutOfBoundsException if {@code srcPos + nBools > src.length}
-     */
-    public static long binaryToLong(final boolean[] src, final int srcPos, final long dstInit, final int dstPos,
-            final int nBools) {
-        if ((src.length == 0 && srcPos == 0) || 0 == nBools) {
-            return dstInit;
-        }
-        if (nBools - 1 + dstPos >= 64) {
-            throw new IllegalArgumentException("nBools-1+dstPos is greather or equal to than 64");
-        }
-        long out = dstInit;
-        int shift = 0;
-        for (int i = 0; i < nBools; i++) {
-            shift = i + dstPos;
-            final long bits = (src[i + srcPos] ? 1L : 0) << shift;
-            final long mask = 0x1L << shift;
-            out = (out & ~mask) | bits;
-        }
-        return out;
-    }
-
-    /**
-     * <p>
-     * Converts binary (represented as boolean array) into a int using the default (little
-     * endian, Lsb0) byte and bit ordering.
-     * </p>
-     * 
-     * @param src the binary to convert
-     * @param srcPos the position in {@code src}, in boolean unit, from where to start the
-     *            conversion
-     * @param dstInit initial value of the destination int
-     * @param dstPos the position of the lsb, in bits, in the result int
-     * @param nBools the number of booleans to convert
-     * @return a int containing the selected bits
-     * @throws NullPointerException if {@code src} is {@code null}
-     * @throws IllegalArgumentException if {@code nBools-1+dstPos >= 32}
-     * @throws ArrayIndexOutOfBoundsException if {@code srcPos + nBools > src.length}
-     */
-    public static int binaryToInt(final boolean[] src, final int srcPos, final int dstInit, final int dstPos,
-            final int nBools) {
-        if ((src.length == 0 && srcPos == 0) || 0 == nBools) {
-            return dstInit;
-        }
-        if (nBools - 1 + dstPos >= 32) {
-            throw new IllegalArgumentException("nBools-1+dstPos is greather or equal to than 32");
-        }
-        int out = dstInit;
-        int shift = 0;
-        for (int i = 0; i < nBools; i++) {
-            shift = i + dstPos;
-            final int bits = (src[i + srcPos] ? 1 : 0) << shift;
-            final int mask = 0x1 << shift;
-            out = (out & ~mask) | bits;
-        }
-        return out;
-    }
-
-    /**
-     * <p>
-     * Converts binary (represented as boolean array) into a short using the default (little
-     * endian, Lsb0) byte and bit ordering.
-     * </p>
-     * 
-     * @param src the binary to convert
-     * @param srcPos the position in {@code src}, in boolean unit, from where to start the
-     *            conversion
-     * @param dstInit initial value of the destination short
-     * @param dstPos the position of the lsb, in bits, in the result short
-     * @param nBools the number of booleans to convert
-     * @return a short containing the selected bits
-     * @throws NullPointerException if {@code src} is {@code null}
-     * @throws IllegalArgumentException if {@code nBools-1+dstPos >= 16}
-     * @throws ArrayIndexOutOfBoundsException if {@code srcPos + nBools > src.length}
-     */
-    public static short binaryToShort(final boolean[] src, final int srcPos, final short dstInit, final int dstPos,
-            final int nBools) {
-        if ((src.length == 0 && srcPos == 0) || 0 == nBools) {
-            return dstInit;
-        }
-        if (nBools - 1 + dstPos >= 16) {
-            throw new IllegalArgumentException("nBools-1+dstPos is greather or equal to than 16");
-        }
-        short out = dstInit;
-        int shift = 0;
-        for (int i = 0; i < nBools; i++) {
-            shift = i + dstPos;
-            final int bits = (src[i + srcPos] ? 1 : 0) << shift;
-            final int mask = 0x1 << shift;
-            out = (short) ((out & ~mask) | bits);
-        }
-        return out;
-    }
-
-    /**
-     * <p>
-     * Converts binary (represented as boolean array) into a byte using the default (little
-     * endian, Lsb0) byte and bit ordering.
-     * </p>
-     * 
-     * @param src the binary to convert
-     * @param srcPos the position in {@code src}, in boolean unit, from where to start the
-     *            conversion
-     * @param dstInit initial value of the destination byte
-     * @param dstPos the position of the lsb, in bits, in the result byte
-     * @param nBools the number of booleans to convert
-     * @return a byte containing the selected bits
-     * @throws NullPointerException if {@code src} is {@code null}
-     * @throws IllegalArgumentException if {@code nBools-1+dstPos >= 8}
-     * @throws ArrayIndexOutOfBoundsException if {@code srcPos + nBools > src.length}
-     */
-    public static byte binaryToByte(final boolean[] src, final int srcPos, final byte dstInit, final int dstPos,
-            final int nBools) {
-        if ((src.length == 0 && srcPos == 0) || 0 == nBools) {
-            return dstInit;
-        }
-        if (nBools - 1 + dstPos >= 8) {
-            throw new IllegalArgumentException("nBools-1+dstPos is greather or equal to than 8");
-        }
-        byte out = dstInit;
-        int shift = 0;
-        for (int i = 0; i < nBools; i++) {
-            shift = i + dstPos;
-            final int bits = (src[i + srcPos] ? 1 : 0) << shift;
-            final int mask = 0x1 << shift;
-            out = (byte) ((out & ~mask) | bits);
-        }
-        return out;
-    }
-
-    /**
-     * <p>
-     * Converts a long into an array of int using the default (little endian, Lsb0) byte and bit
-     * ordering.
-     * </p>
-     * 
-     * @param src the long to convert
-     * @param srcPos the position in {@code src}, in bits, from where to start the conversion
-     * @param dst the destination array
-     * @param dstPos the position in {@code dst} where to copy the result
-     * @param nInts the number of ints to copy to {@code dst}, must be smaller or equal to the
-     *            width of the input (from srcPos to msb)
-     * @return {@code dst}
-     * @throws NullPointerException if {@code dst} is {@code null} and {@code nInts > 0}
-     * @throws IllegalArgumentException if {@code (nInts-1)*32+srcPos >= 64}
-     * @throws ArrayIndexOutOfBoundsException if {@code dstPos + nInts > dst.length}
-     */
-    public static int[] longToIntArray(final long src, final int srcPos, final int[] dst, final int dstPos,
-            final int nInts) {
-        if (0 == nInts) {
-            return dst;
-        }
-        if ((nInts - 1) * 32 + srcPos >= 64) {
-            throw new IllegalArgumentException("(nInts-1)*32+srcPos is greather or equal to than 64");
-        }
-        int shift = 0;
-        for (int i = 0; i < nInts; i++) {
-            shift = i * 32 + srcPos;
-            dst[dstPos + i] = (int) (0xffffffff & (src >> shift));
-        }
-        return dst;
-    }
-
-    /**
-     * <p>
-     * Converts a long into an array of short using the default (little endian, Lsb0) byte and
-     * bit ordering.
-     * </p>
-     * 
-     * @param src the long to convert
-     * @param srcPos the position in {@code src}, in bits, from where to start the conversion
-     * @param dst the destination array
-     * @param dstPos the position in {@code dst} where to copy the result
-     * @param nShorts the number of shorts to copy to {@code dst}, must be smaller or equal to
-     *            the width of the input (from srcPos to msb)
-     * @return {@code dst}
-     * @throws NullPointerException if {@code dst} is {@code null}
-     * @throws IllegalArgumentException if {@code (nShorts-1)*16+srcPos >= 64}
-     * @throws ArrayIndexOutOfBoundsException if {@code dstPos + nShorts > dst.length}
-     */
-    public static short[] longToShortArray(final long src, final int srcPos, final short[] dst, final int dstPos,
-            final int nShorts) {
-        if (0 == nShorts) {
-            return dst;
-        }
-        if ((nShorts - 1) * 16 + srcPos >= 64) {
-            throw new IllegalArgumentException("(nShorts-1)*16+srcPos is greather or equal to than 64");
-        }
-        int shift = 0;
-        for (int i = 0; i < nShorts; i++) {
-            shift = i * 16 + srcPos;
-            dst[dstPos + i] = (short) (0xffff & (src >> shift));
-        }
-        return dst;
-    }
-
-    /**
-     * <p>
-     * Converts a int into an array of short using the default (little endian, Lsb0) byte and
-     * bit ordering.
-     * </p>
-     * 
-     * @param src the int to convert
-     * @param srcPos the position in {@code src}, in bits, from where to start the conversion
-     * @param dst the destination array
-     * @param dstPos the position in {@code dst} where to copy the result
-     * @param nShorts the number of shorts to copy to {@code dst}, must be smaller or equal to
-     *            the width of the input (from srcPos to msb)
-     * @return {@code dst}
-     * @throws NullPointerException if {@code dst} is {@code null}
-     * @throws IllegalArgumentException if {@code (nShorts-1)*16+srcPos >= 32}
-     * @throws ArrayIndexOutOfBoundsException if {@code dstPos + nShorts > dst.length}
-     */
-    public static short[] intToShortArray(final int src, final int srcPos, final short[] dst, final int dstPos,
-            final int nShorts) {
-        if (0 == nShorts) {
-            return dst;
-        }
-        if ((nShorts - 1) * 16 + srcPos >= 32) {
-            throw new IllegalArgumentException("(nShorts-1)*16+srcPos is greather or equal to than 32");
-        }
-        int shift = 0;
-        for (int i = 0; i < nShorts; i++) {
-            shift = i * 16 + srcPos;
-            dst[dstPos + i] = (short) (0xffff & (src >> shift));
-        }
-        return dst;
-    }
-
-    /**
-     * <p>
-     * Converts a long into an array of byte using the default (little endian, Lsb0) byte and
-     * bit ordering.
-     * </p>
-     * 
-     * @param src the long to convert
-     * @param srcPos the position in {@code src}, in bits, from where to start the conversion
-     * @param dst the destination array
-     * @param dstPos the position in {@code dst} where to copy the result
-     * @param nBytes the number of bytes to copy to {@code dst}, must be smaller or equal to the
-     *            width of the input (from srcPos to msb)
-     * @return {@code dst}
-     * @throws NullPointerException if {@code dst} is {@code null}
-     * @throws IllegalArgumentException if {@code (nBytes-1)*8+srcPos >= 64}
-     * @throws ArrayIndexOutOfBoundsException if {@code dstPos + nBytes > dst.length}
-     */
-    public static byte[] longToByteArray(final long src, final int srcPos, final byte[] dst, final int dstPos,
-            final int nBytes) {
-        if (0 == nBytes) {
-            return dst;
-        }
-        if ((nBytes - 1) * 8 + srcPos >= 64) {
-            throw new IllegalArgumentException("(nBytes-1)*8+srcPos is greather or equal to than 64");
-        }
-        int shift = 0;
-        for (int i = 0; i < nBytes; i++) {
-            shift = i * 8 + srcPos;
-            dst[dstPos + i] = (byte) (0xff & (src >> shift));
-        }
-        return dst;
-    }
-
-    /**
-     * <p>
-     * Converts a int into an array of byte using the default (little endian, Lsb0) byte and bit
-     * ordering.
-     * </p>
-     * 
-     * @param src the int to convert
-     * @param srcPos the position in {@code src}, in bits, from where to start the conversion
-     * @param dst the destination array
-     * @param dstPos the position in {@code dst} where to copy the result
-     * @param nBytes the number of bytes to copy to {@code dst}, must be smaller or equal to the
-     *            width of the input (from srcPos to msb)
-     * @return {@code dst}
-     * @throws NullPointerException if {@code dst} is {@code null}
-     * @throws IllegalArgumentException if {@code (nBytes-1)*8+srcPos >= 32}
-     * @throws ArrayIndexOutOfBoundsException if {@code dstPos + nBytes > dst.length}
-     */
-    public static byte[] intToByteArray(final int src, final int srcPos, final byte[] dst, final int dstPos,
-            final int nBytes) {
-        if (0 == nBytes) {
-            return dst;
-        }
-        if ((nBytes - 1) * 8 + srcPos >= 32) {
-            throw new IllegalArgumentException("(nBytes-1)*8+srcPos is greather or equal to than 32");
-        }
-        int shift = 0;
-        for (int i = 0; i < nBytes; i++) {
-            shift = i * 8 + srcPos;
-            dst[dstPos + i] = (byte) (0xff & (src >> shift));
-        }
-        return dst;
-    }
-
-    /**
-     * <p>
-     * Converts a short into an array of byte using the default (little endian, Lsb0) byte and
-     * bit ordering.
-     * </p>
-     * 
-     * @param src the short to convert
-     * @param srcPos the position in {@code src}, in bits, from where to start the conversion
-     * @param dst the destination array
-     * @param dstPos the position in {@code dst} where to copy the result
-     * @param nBytes the number of bytes to copy to {@code dst}, must be smaller or equal to the
-     *            width of the input (from srcPos to msb)
-     * @return {@code dst}
-     * @throws NullPointerException if {@code dst} is {@code null}
-     * @throws IllegalArgumentException if {@code (nBytes-1)*8+srcPos >= 16}
-     * @throws ArrayIndexOutOfBoundsException if {@code dstPos + nBytes > dst.length}
-     */
-    public static byte[] shortToByteArray(final short src, final int srcPos, final byte[] dst, final int dstPos,
-            final int nBytes) {
-        if (0 == nBytes) {
-            return dst;
-        }
-        if ((nBytes - 1) * 8 + srcPos >= 16) {
-            throw new IllegalArgumentException("(nBytes-1)*8+srcPos is greather or equal to than 16");
-        }
-        int shift = 0;
-        for (int i = 0; i < nBytes; i++) {
-            shift = i * 8 + srcPos;
-            dst[dstPos + i] = (byte) (0xff & (src >> shift));
-        }
-        return dst;
-    }
-
-    /**
-     * <p>
-     * Converts a long into an array of Char using the default (little endian, Lsb0) byte and
-     * bit ordering.
-     * </p>
-     * 
-     * @param src the long to convert
-     * @param srcPos the position in {@code src}, in bits, from where to start the conversion
-     * @param dstInit the initial value for the result String
-     * @param dstPos the position in {@code dst} where to copy the result
-     * @param nHexs the number of Chars to copy to {@code dst}, must be smaller or equal to the
-     *            width of the input (from srcPos to msb)
-     * @return {@code dst}
-     * @throws IllegalArgumentException if {@code (nHexs-1)*4+srcPos >= 64}
-     * @throws StringIndexOutOfBoundsException if {@code dst.init.length() < dstPos}
-     */
-    public static String longToHex(final long src, final int srcPos, final String dstInit, final int dstPos,
-            final int nHexs) {
-        if (0 == nHexs) {
-            return dstInit;
-        }
-        if ((nHexs - 1) * 4 + srcPos >= 64) {
-            throw new IllegalArgumentException("(nHexs-1)*4+srcPos is greather or equal to than 64");
-        }
-        final StringBuilder sb = new StringBuilder(dstInit);
-        int shift = 0;
-        int append = sb.length();
-        for (int i = 0; i < nHexs; i++) {
-            shift = i * 4 + srcPos;
-            final int bits = (int) (0xF & (src >> shift));
-            if (dstPos + i == append) {
-                ++append;
-                sb.append(intToHexDigit(bits));
-            } else {
-                sb.setCharAt(dstPos + i, intToHexDigit(bits));
-            }
-        }
-        return sb.toString();
-    }
-
-    /**
-     * <p>
-     * Converts a int into an array of Char using the default (little endian, Lsb0) byte and bit
-     * ordering.
-     * </p>
-     * 
-     * @param src the int to convert
-     * @param srcPos the position in {@code src}, in bits, from where to start the conversion
-     * @param dstInit the initial value for the result String
-     * @param dstPos the position in {@code dst} where to copy the result
-     * @param nHexs the number of Chars to copy to {@code dst}, must be smaller or equal to the
-     *            width of the input (from srcPos to msb)
-     * @return {@code dst}
-     * @throws IllegalArgumentException if {@code (nHexs-1)*4+srcPos >= 32}
-     * @throws StringIndexOutOfBoundsException if {@code dst.init.length() < dstPos}
-     */
-    public static String intToHex(final int src, final int srcPos, final String dstInit, final int dstPos,
-            final int nHexs) {
-        if (0 == nHexs) {
-            return dstInit;
-        }
-        if ((nHexs - 1) * 4 + srcPos >= 32) {
-            throw new IllegalArgumentException("(nHexs-1)*4+srcPos is greather or equal to than 32");
-        }
-        final StringBuilder sb = new StringBuilder(dstInit);
-        int shift = 0;
-        int append = sb.length();
-        for (int i = 0; i < nHexs; i++) {
-            shift = i * 4 + srcPos;
-            final int bits = 0xF & (src >> shift);
-            if (dstPos + i == append) {
-                ++append;
-                sb.append(intToHexDigit(bits));
-            } else {
-                sb.setCharAt(dstPos + i, intToHexDigit(bits));
-            }
-        }
-        return sb.toString();
-    }
-
-    /**
-     * <p>
-     * Converts a short into an array of Char using the default (little endian, Lsb0) byte and
-     * bit ordering.
-     * </p>
-     * 
-     * @param src the short to convert
-     * @param srcPos the position in {@code src}, in bits, from where to start the conversion
-     * @param dstInit the initial value for the result String
-     * @param dstPos the position in {@code dst} where to copy the result
-     * @param nHexs the number of Chars to copy to {@code dst}, must be smaller or equal to the
-     *            width of the input (from srcPos to msb)
-     * @return {@code dst}
-     * @throws IllegalArgumentException if {@code (nHexs-1)*4+srcPos >= 16}
-     * @throws StringIndexOutOfBoundsException if {@code dst.init.length() < dstPos}
-     */
-    public static String shortToHex(final short src, final int srcPos, final String dstInit, final int dstPos,
-            final int nHexs) {
-        if (0 == nHexs) {
-            return dstInit;
-        }
-        if ((nHexs - 1) * 4 + srcPos >= 16) {
-            throw new IllegalArgumentException("(nHexs-1)*4+srcPos is greather or equal to than 16");
-        }
-        final StringBuilder sb = new StringBuilder(dstInit);
-        int shift = 0;
-        int append = sb.length();
-        for (int i = 0; i < nHexs; i++) {
-            shift = i * 4 + srcPos;
-            final int bits = 0xF & (src >> shift);
-            if (dstPos + i == append) {
-                ++append;
-                sb.append(intToHexDigit(bits));
-            } else {
-                sb.setCharAt(dstPos + i, intToHexDigit(bits));
-            }
-        }
-        return sb.toString();
-    }
-
-    /**
-     * <p>
-     * Converts a byte into an array of Char using the default (little endian, Lsb0) byte and
-     * bit ordering.
-     * </p>
-     * 
-     * @param src the byte to convert
-     * @param srcPos the position in {@code src}, in bits, from where to start the conversion
-     * @param dstInit the initial value for the result String
-     * @param dstPos the position in {@code dst} where to copy the result
-     * @param nHexs the number of Chars to copy to {@code dst}, must be smaller or equal to the
-     *            width of the input (from srcPos to msb)
-     * @return {@code dst}
-     * @throws IllegalArgumentException if {@code (nHexs-1)*4+srcPos >= 8}
-     * @throws StringIndexOutOfBoundsException if {@code dst.init.length() < dstPos}
-     */
-    public static String byteToHex(final byte src, final int srcPos, final String dstInit, final int dstPos,
-            final int nHexs) {
-        if (0 == nHexs) {
-            return dstInit;
-        }
-        if ((nHexs - 1) * 4 + srcPos >= 8) {
-            throw new IllegalArgumentException("(nHexs-1)*4+srcPos is greather or equal to than 8");
-        }
-        final StringBuilder sb = new StringBuilder(dstInit);
-        int shift = 0;
-        int append = sb.length();
-        for (int i = 0; i < nHexs; i++) {
-            shift = i * 4 + srcPos;
-            final int bits = 0xF & (src >> shift);
-            if (dstPos + i == append) {
-                ++append;
-                sb.append(intToHexDigit(bits));
-            } else {
-                sb.setCharAt(dstPos + i, intToHexDigit(bits));
-            }
-        }
-        return sb.toString();
-    }
-
-    /**
-     * <p>
-     * Converts a long into an array of boolean using the default (little endian, Lsb0) byte and
-     * bit ordering.
-     * </p>
-     * 
-     * @param src the long to convert
-     * @param srcPos the position in {@code src}, in bits, from where to start the conversion
-     * @param dst the destination array
-     * @param dstPos the position in {@code dst} where to copy the result
-     * @param nBools the number of booleans to copy to {@code dst}, must be smaller or equal to
-     *            the width of the input (from srcPos to msb)
-     * @return {@code dst}
-     * @throws NullPointerException if {@code dst} is {@code null}
-     * @throws IllegalArgumentException if {@code nBools-1+srcPos >= 64}
-     * @throws ArrayIndexOutOfBoundsException if {@code dstPos + nBools > dst.length}
-     */
-    public static boolean[] longToBinary(final long src, final int srcPos, final boolean[] dst, final int dstPos,
-            final int nBools) {
-        if (0 == nBools) {
-            return dst;
-        }
-        if (nBools - 1 + srcPos >= 64) {
-            throw new IllegalArgumentException("nBools-1+srcPos is greather or equal to than 64");
-        }
-        int shift = 0;
-        for (int i = 0; i < nBools; i++) {
-            shift = i + srcPos;
-            dst[dstPos + i] = ((0x1 & (src >> shift)) != 0);
-        }
-        return dst;
-    }
-
-    /**
-     * <p>
-     * Converts a int into an array of boolean using the default (little endian, Lsb0) byte and
-     * bit ordering.
-     * </p>
-     * 
-     * @param src the int to convert
-     * @param srcPos the position in {@code src}, in bits, from where to start the conversion
-     * @param dst the destination array
-     * @param dstPos the position in {@code dst} where to copy the result
-     * @param nBools the number of booleans to copy to {@code dst}, must be smaller or equal to
-     *            the width of the input (from srcPos to msb)
-     * @return {@code dst}
-     * @throws NullPointerException if {@code dst} is {@code null}
-     * @throws IllegalArgumentException if {@code nBools-1+srcPos >= 32}
-     * @throws ArrayIndexOutOfBoundsException if {@code dstPos + nBools > dst.length}
-     */
-    public static boolean[] intToBinary(final int src, final int srcPos, final boolean[] dst, final int dstPos,
-            final int nBools) {
-        if (0 == nBools) {
-            return dst;
-        }
-        if (nBools - 1 + srcPos >= 32) {
-            throw new IllegalArgumentException("nBools-1+srcPos is greather or equal to than 32");
-        }
-        int shift = 0;
-        for (int i = 0; i < nBools; i++) {
-            shift = i + srcPos;
-            dst[dstPos + i] = ((0x1 & (src >> shift)) != 0);
-        }
-        return dst;
-    }
-
-    /**
-     * <p>
-     * Converts a short into an array of boolean using the default (little endian, Lsb0) byte
-     * and bit ordering.
-     * </p>
-     * 
-     * @param src the short to convert
-     * @param srcPos the position in {@code src}, in bits, from where to start the conversion
-     * @param dst the destination array
-     * @param dstPos the position in {@code dst} where to copy the result
-     * @param nBools the number of booleans to copy to {@code dst}, must be smaller or equal to
-     *            the width of the input (from srcPos to msb)
-     * @return {@code dst}
-     * @throws NullPointerException if {@code dst} is {@code null}
-     * @throws IllegalArgumentException if {@code nBools-1+srcPos >= 16}
-     * @throws ArrayIndexOutOfBoundsException if {@code dstPos + nBools > dst.length}
-     */
-    public static boolean[] shortToBinary(final short src, final int srcPos, final boolean[] dst, final int dstPos,
-            final int nBools) {
-        if (0 == nBools) {
-            return dst;
-        }
-        if (nBools - 1 + srcPos >= 16) {
-            throw new IllegalArgumentException("nBools-1+srcPos is greather or equal to than 16");
-        }
-        int shift = 0;
-        assert ((nBools - 1) < 16 - srcPos);
-        for (int i = 0; i < nBools; i++) {
-            shift = i + srcPos;
-            dst[dstPos + i] = ((0x1 & (src >> shift)) != 0);
-        }
-        return dst;
-    }
-
-    /**
-     * <p>
-     * Converts a byte into an array of boolean using the default (little endian, Lsb0) byte and
-     * bit ordering.
-     * </p>
-     * 
-     * @param src the byte to convert
-     * @param srcPos the position in {@code src}, in bits, from where to start the conversion
-     * @param dst the destination array
-     * @param dstPos the position in {@code dst} where to copy the result
-     * @param nBools the number of booleans to copy to {@code dst}, must be smaller or equal to
-     *            the width of the input (from srcPos to msb)
-     * @return {@code dst}
-     * @throws NullPointerException if {@code dst} is {@code null}
-     * @throws IllegalArgumentException if {@code nBools-1+srcPos >= 8}
-     * @throws ArrayIndexOutOfBoundsException if {@code dstPos + nBools > dst.length}
-     */
-    public static boolean[] byteToBinary(final byte src, final int srcPos, final boolean[] dst, final int dstPos,
-            final int nBools) {
-        if (0 == nBools) {
-            return dst;
-        }
-        if (nBools - 1 + srcPos >= 8) {
-            throw new IllegalArgumentException("nBools-1+srcPos is greather or equal to than 8");
-        }
-        int shift = 0;
-        for (int i = 0; i < nBools; i++) {
-            shift = i + srcPos;
-            dst[dstPos + i] = ((0x1 & (src >> shift)) != 0);
-        }
-        return dst;
-    }
-
-    /**
-     * <p>
-     * Converts UUID into an array of byte using the default (little endian, Lsb0) byte and bit
-     * ordering.
-     * </p>
-     * 
-     * @param src the UUID to convert
-     * @param dst the destination array
-     * @param dstPos the position in {@code dst} where to copy the result
-     * @param nBytes the number of bytes to copy to {@code dst}, must be smaller or equal to the
-     *            width of the input (from srcPos to msb)
-     * @return {@code dst}
-     * @throws NullPointerException if {@code dst} is {@code null}
-     * @throws IllegalArgumentException if {@code nBytes > 16}
-     * @throws ArrayIndexOutOfBoundsException if {@code dstPos + nBytes > dst.length}
-     */
-    public static byte[] uuidToByteArray(final UUID src, final byte[] dst, final int dstPos, final int nBytes) {
-        if (0 == nBytes) {
-            return dst;
-        }
-        if (nBytes > 16) {
-            throw new IllegalArgumentException("nBytes is greather than 16");
-        }
-        longToByteArray(src.getMostSignificantBits(), 0, dst, dstPos, nBytes > 8 ? 8 : nBytes);
-        if (nBytes >= 8) {
-            longToByteArray(src.getLeastSignificantBits(), 0, dst, dstPos + 8, nBytes - 8);
-        }
-        return dst;
-    }
-
-    /**
-     * <p>
-     * Converts bytes from an array into a UUID using the default (little endian, Lsb0) byte and
-     * bit ordering.
-     * </p>
-     * 
-     * @param src the byte array to convert
-     * @param srcPos the position in {@code src} where to copy the result from
-     * @return a UUID
-     * @throws NullPointerException if {@code src} is {@code null}
-     * @throws IllegalArgumentException if array does not contain at least 16 bytes beginning
-     *             with {@code srcPos}
-     */
-    public static UUID byteArrayToUuid(final byte[] src, final int srcPos) {
-        if (src.length - srcPos < 16) {
-            throw new IllegalArgumentException("Need at least 16 bytes for UUID");
-        }
-        return new UUID(byteArrayToLong(src, srcPos, 0, 0, 8), byteArrayToLong(src, srcPos + 8, 0, 0, 8));
-    }
-}
diff --git a/lang/src/main/java/org/apache/commons/lang3/EnumUtils.java b/lang/src/main/java/org/apache/commons/lang3/EnumUtils.java
deleted file mode 100644
index 242ed40..0000000
--- a/lang/src/main/java/org/apache/commons/lang3/EnumUtils.java
+++ /dev/null
@@ -1,311 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.commons.lang3;
-
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.Collections;
-import java.util.EnumSet;
-import java.util.LinkedHashMap;
-import java.util.List;
-import java.util.Map;
-
-/**
- * <p>Utility library to provide helper methods for Java enums.</p>
- *
- * <p>#ThreadSafe#</p>
- *
- * @since 3.0
- * @version $Id$
- */
-public class EnumUtils {
-
-    private static final String NULL_ELEMENTS_NOT_PERMITTED = "null elements not permitted";
-    private static final String CANNOT_STORE_S_S_VALUES_IN_S_BITS = "Cannot store %s %s values in %s bits";
-    private static final String S_DOES_NOT_SEEM_TO_BE_AN_ENUM_TYPE = "%s does not seem to be an Enum type";
-    private static final String ENUM_CLASS_MUST_BE_DEFINED = "EnumClass must be defined.";
-
-    /**
-     * This constructor is public to permit tools that require a JavaBean
-     * instance to operate.
-     */
-    public EnumUtils() {
-    }
-
-    /**
-     * <p>Gets the {@code Map} of enums by name.</p>
-     *
-     * <p>This method is useful when you need a map of enums by name.</p>
-     *
-     * @param <E> the type of the enumeration
-     * @param enumClass  the class of the enum to query, not null
-     * @return the modifiable map of enum names to enums, never null
-     */
-    public static <E extends Enum<E>> Map<String, E> getEnumMap(final Class<E> enumClass) {
-        final Map<String, E> map = new LinkedHashMap<String, E>();
-        for (final E e: enumClass.getEnumConstants()) {
-            map.put(e.name(), e);
-        }
-        return map;
-    }
-
-    /**
-     * <p>Gets the {@code List} of enums.</p>
-     *
-     * <p>This method is useful when you need a list of enums rather than an array.</p>
-     *
-     * @param <E> the type of the enumeration
-     * @param enumClass  the class of the enum to query, not null
-     * @return the modifiable list of enums, never null
-     */
-    public static <E extends Enum<E>> List<E> getEnumList(final Class<E> enumClass) {
-        return new ArrayList<E>(Arrays.asList(enumClass.getEnumConstants()));
-    }
-
-    /**
-     * <p>Checks if the specified name is a valid enum for the class.</p>
-     *
-     * <p>This method differs from {@link Enum#valueOf} in that checks if the name is
-     * a valid enum without needing to catch the exception.</p>
-     *
-     * @param <E> the type of the enumeration
-     * @param enumClass  the class of the enum to query, not null
-     * @param enumName   the enum name, null returns false
-     * @return true if the enum name is valid, otherwise false
-     */
-    public static <E extends Enum<E>> boolean isValidEnum(final Class<E> enumClass, final String enumName) {
-        if (enumName == null) {
-            return false;
-        }
-        try {
-            Enum.valueOf(enumClass, enumName);
-            return true;
-        } catch (final IllegalArgumentException ex) {
-            return false;
-        }
-    }
-
-    /**
-     * <p>Gets the enum for the class, returning {@code null} if not found.</p>
-     *
-     * <p>This method differs from {@link Enum#valueOf} in that it does not throw an exception
-     * for an invalid enum name.</p>
-     *
-     * @param <E> the type of the enumeration
-     * @param enumClass  the class of the enum to query, not null
-     * @param enumName   the enum name, null returns null
-     * @return the enum, null if not found
-     */
-    public static <E extends Enum<E>> E getEnum(final Class<E> enumClass, final String enumName) {
-        if (enumName == null) {
-            return null;
-        }
-        try {
-            return Enum.valueOf(enumClass, enumName);
-        } catch (final IllegalArgumentException ex) {
-            return null;
-        }
-    }
-
-    /**
-     * <p>Creates a long bit vector representation of the given subset of an Enum.</p>
-     *
-     * <p>This generates a value that is usable by {@link EnumUtils#processBitVector}.</p>
-     *
-     * <p>Do not use this method if you have more than 64 values in your Enum, as this
-     * would create a value greater than a long can hold.</p>
-     *
-     * @param enumClass the class of the enum we are working with, not {@code null}
-     * @param values    the values we want to convert, not {@code null}, neither containing {@code null}
-     * @param <E>       the type of the enumeration
-     * @return a long whose value provides a binary representation of the given set of enum values.
-     * @throws NullPointerException if {@code enumClass} or {@code values} is {@code null}
-     * @throws IllegalArgumentException if {@code enumClass} is not an enum class or has more than 64 values,
-     *                                  or if any {@code values} {@code null}
-     * @since 3.0.1
-     * @see #generateBitVectors(Class, Iterable)
-     */
-    public static <E extends Enum<E>> long generateBitVector(final Class<E> enumClass, final Iterable<? extends E> values) {
-        checkBitVectorable(enumClass);
-        Validate.notNull(values);
-        long total = 0;
-        for (final E constant : values) {
-            Validate.isTrue(constant != null, NULL_ELEMENTS_NOT_PERMITTED);
-            total |= 1 << constant.ordinal();
-        }
-        return total;
-    }
-
-    /**
-     * <p>Creates a bit vector representation of the given subset of an Enum using as many {@code long}s as needed.</p>
-     *
-     * <p>This generates a value that is usable by {@link EnumUtils#processBitVectors}.</p>
-     *
-     * <p>Use this method if you have more than 64 values in your Enum.</p>
-     *
-     * @param enumClass the class of the enum we are working with, not {@code null}
-     * @param values    the values we want to convert, not {@code null}, neither containing {@code null}
-     * @param <E>       the type of the enumeration
-     * @return a long[] whose values provide a binary representation of the given set of enum values
-     *         with least significant digits rightmost.
-     * @throws NullPointerException if {@code enumClass} or {@code values} is {@code null}
-     * @throws IllegalArgumentException if {@code enumClass} is not an enum class, or if any {@code values} {@code null}
-     * @since 3.2
-     */
-    public static <E extends Enum<E>> long[] generateBitVectors(final Class<E> enumClass, final Iterable<? extends E> values) {
-        asEnum(enumClass);
-        Validate.notNull(values);
-        final EnumSet<E> condensed = EnumSet.noneOf(enumClass);
-        for (final E constant : values) {
-            Validate.isTrue(constant != null, NULL_ELEMENTS_NOT_PERMITTED);
-            condensed.add(constant);
-        }
-        final long[] result = new long[(enumClass.getEnumConstants().length - 1) / Long.SIZE + 1];
-        for (final E value : condensed) {
-            result[value.ordinal() / Long.SIZE] |= 1 << (value.ordinal() % Long.SIZE);
-        }
-        ArrayUtils.reverse(result);
-        return result;
-    }
-
-    /**
-     * <p>Creates a long bit vector representation of the given array of Enum values.</p>
-     *
-     * <p>This generates a value that is usable by {@link EnumUtils#processBitVector}.</p>
-     *
-     * <p>Do not use this method if you have more than 64 values in your Enum, as this
-     * would create a value greater than a long can hold.</p>
-     *
-     * @param enumClass the class of the enum we are working with, not {@code null}
-     * @param values    the values we want to convert, not {@code null}
-     * @param <E>       the type of the enumeration
-     * @return a long whose value provides a binary representation of the given set of enum values.
-     * @throws NullPointerException if {@code enumClass} or {@code values} is {@code null}
-     * @throws IllegalArgumentException if {@code enumClass} is not an enum class or has more than 64 values
-     * @since 3.0.1
-     * @see #generateBitVectors(Class, Iterable)
-     */
-    public static <E extends Enum<E>> long generateBitVector(final Class<E> enumClass, final E... values) {
-        Validate.noNullElements(values);
-        return generateBitVector(enumClass, Arrays.<E> asList(values));
-    }
-
-    /**
-     * <p>Creates a bit vector representation of the given subset of an Enum using as many {@code long}s as needed.</p>
-     *
-     * <p>This generates a value that is usable by {@link EnumUtils#processBitVectors}.</p>
-     *
-     * <p>Use this method if you have more than 64 values in your Enum.</p>
-     *
-     * @param enumClass the class of the enum we are working with, not {@code null}
-     * @param values    the values we want to convert, not {@code null}, neither containing {@code null}
-     * @param <E>       the type of the enumeration
-     * @return a long[] whose values provide a binary representation of the given set of enum values
-     *         with least significant digits rightmost.
-     * @throws NullPointerException if {@code enumClass} or {@code values} is {@code null}
-     * @throws IllegalArgumentException if {@code enumClass} is not an enum class, or if any {@code values} {@code null}
-     * @since 3.2
-     */
-    public static <E extends Enum<E>> long[] generateBitVectors(final Class<E> enumClass, final E... values) {
-        asEnum(enumClass);
-        Validate.noNullElements(values);
-        final EnumSet<E> condensed = EnumSet.noneOf(enumClass);
-        Collections.addAll(condensed, values);
-        final long[] result = new long[(enumClass.getEnumConstants().length - 1) / Long.SIZE + 1];
-        for (final E value : condensed) {
-            result[value.ordinal() / Long.SIZE] |= 1 << (value.ordinal() % Long.SIZE);
-        }
-        ArrayUtils.reverse(result);
-        return result;
-    }
-
-    /**
-     * <p>Convert a long value created by {@link EnumUtils#generateBitVector} into the set of
-     * enum values that it represents.</p>
-     *
-     * <p>If you store this value, beware any changes to the enum that would affect ordinal values.</p>
-     * @param enumClass the class of the enum we are working with, not {@code null}
-     * @param value     the long value representation of a set of enum values
-     * @param <E>       the type of the enumeration
-     * @return a set of enum values
-     * @throws NullPointerException if {@code enumClass} is {@code null}
-     * @throws IllegalArgumentException if {@code enumClass} is not an enum class or has more than 64 values
-     * @since 3.0.1
-     */
-    public static <E extends Enum<E>> EnumSet<E> processBitVector(final Class<E> enumClass, final long value) {
-        checkBitVectorable(enumClass).getEnumConstants();
-        return processBitVectors(enumClass, value);
-    }
-
-    /**
-     * <p>Convert a {@code long[]} created by {@link EnumUtils#generateBitVectors} into the set of
-     * enum values that it represents.</p>
-     *
-     * <p>If you store this value, beware any changes to the enum that would affect ordinal values.</p>
-     * @param enumClass the class of the enum we are working with, not {@code null}
-     * @param values     the long[] bearing the representation of a set of enum values, least significant digits rightmost, not {@code null}
-     * @param <E>       the type of the enumeration
-     * @return a set of enum values
-     * @throws NullPointerException if {@code enumClass} is {@code null}
-     * @throws IllegalArgumentException if {@code enumClass} is not an enum class
-     * @since 3.2
-     */
-    public static <E extends Enum<E>> EnumSet<E> processBitVectors(final Class<E> enumClass, final long... values) {
-        final EnumSet<E> results = EnumSet.noneOf(asEnum(enumClass));
-        final long[] lvalues = ArrayUtils.clone(Validate.notNull(values));
-        ArrayUtils.reverse(lvalues);
-        for (final E constant : enumClass.getEnumConstants()) {
-            final int block = constant.ordinal() / Long.SIZE;
-            if (block < lvalues.length && (lvalues[block] & 1 << (constant.ordinal() % Long.SIZE)) != 0) {
-                results.add(constant);
-            }
-        }
-        return results;
-    }
-
-    /**
-     * Validate that {@code enumClass} is compatible with representation in a {@code long}.
-     * @param <E> the type of the enumeration
-     * @param enumClass to check
-     * @return {@code enumClass}
-     * @throws NullPointerException if {@code enumClass} is {@code null}
-     * @throws IllegalArgumentException if {@code enumClass} is not an enum class or has more than 64 values
-     * @since 3.0.1
-     */
-    private static <E extends Enum<E>> Class<E> checkBitVectorable(final Class<E> enumClass) {
-        final E[] constants = asEnum(enumClass).getEnumConstants();
-        Validate.isTrue(constants.length <= Long.SIZE, CANNOT_STORE_S_S_VALUES_IN_S_BITS, 
-            Integer.valueOf(constants.length), enumClass.getSimpleName(), Integer.valueOf(Long.SIZE));
-
-        return enumClass;
-    }
-
-    /**
-     * Validate {@code enumClass}.
-     * @param <E> the type of the enumeration
-     * @param enumClass to check
-     * @return {@code enumClass}
-     * @throws NullPointerException if {@code enumClass} is {@code null}
-     * @throws IllegalArgumentException if {@code enumClass} is not an enum class
-     * @since 3.2
-     */
-    private static <E extends Enum<E>> Class<E> asEnum(final Class<E> enumClass) {
-        Validate.notNull(enumClass, ENUM_CLASS_MUST_BE_DEFINED);
-        Validate.isTrue(enumClass.isEnum(), S_DOES_NOT_SEEM_TO_BE_AN_ENUM_TYPE, enumClass);
-        return enumClass;
-    }
-}
diff --git a/lang/src/main/java/org/apache/commons/lang3/JavaVersion.java b/lang/src/main/java/org/apache/commons/lang3/JavaVersion.java
deleted file mode 100644
index 822699d..0000000
--- a/lang/src/main/java/org/apache/commons/lang3/JavaVersion.java
+++ /dev/null
@@ -1,220 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.commons.lang3;
-
-/**
- * <p>An enum representing all the versions of the Java specification.
- * This is intended to mirror available values from the
- * <em>java.specification.version</em> System property. </p>
- *
- * @since 3.0
- * @version $Id$
- */
-public enum JavaVersion {
-    
-    /**
-     * The Java version reported by Android. This is not an official Java version number.
-     */
-    JAVA_0_9(1.5f, "0.9"),
-    
-    /**
-     * Java 1.1.
-     */
-    JAVA_1_1(1.1f, "1.1"),
-
-    /**
-     * Java 1.2.
-     */
-    JAVA_1_2(1.2f, "1.2"),
-
-    /**
-     * Java 1.3.
-     */
-    JAVA_1_3(1.3f, "1.3"),
-
-    /**
-     * Java 1.4.
-     */
-    JAVA_1_4(1.4f, "1.4"),
-
-    /**
-     * Java 1.5.
-     */
-    JAVA_1_5(1.5f, "1.5"),
-
-    /**
-     * Java 1.6.
-     */
-    JAVA_1_6(1.6f, "1.6"),
-
-    /**
-     * Java 1.7.
-     */
-    JAVA_1_7(1.7f, "1.7"),
-
-    /**
-     * Java 1.8.
-     */
-    JAVA_1_8(1.8f, "1.8"),
-
-    /**
-     * Java 1.9.
-     */
-    JAVA_1_9(1.9f, "1.9"),
-
-    /**
-     * Java 1.x, x &gt; 9. Mainly introduced to avoid to break when a new version of Java is used.
-     */
-    JAVA_RECENT(maxVersion(), Float.toString(maxVersion()));
-
-    /**
-     * The float value.
-     */
-    private final float value;
-    /**
-     * The standard name.
-     */
-    private final String name;
-
-    /**
-     * Constructor.
-     *
-     * @param value  the float value
-     * @param name  the standard name, not null
-     */
-    JavaVersion(final float value, final String name) {
-        this.value = value;
-        this.name = name;
-    }
-
-    //-----------------------------------------------------------------------
-    /**
-     * <p>Whether this version of Java is at least the version of Java passed in.</p>
-     *
-     * <p>For example:<br>
-     *  {@code myVersion.atLeast(JavaVersion.JAVA_1_4)}<p>
-     *
-     * @param requiredVersion  the version to check against, not null
-     * @return true if this version is equal to or greater than the specified version
-     */
-    public boolean atLeast(final JavaVersion requiredVersion) {
-        return this.value >= requiredVersion.value;
-    }
-
-    /**
-     * Transforms the given string with a Java version number to the
-     * corresponding constant of this enumeration class. This method is used
-     * internally.
-     *
-     * @param nom the Java version as string
-     * @return the corresponding enumeration constant or <b>null</b> if the
-     * version is unknown
-     */
-    // helper for static importing
-    static JavaVersion getJavaVersion(final String nom) {
-        return get(nom);
-    }
-
-    /**
-     * Transforms the given string with a Java version number to the
-     * corresponding constant of this enumeration class. This method is used
-     * internally.
-     *
-     * @param nom the Java version as string
-     * @return the corresponding enumeration constant or <b>null</b> if the
-     * version is unknown
-     */
-    static JavaVersion get(final String nom) {
-        if ("0.9".equals(nom)) {
-            return JAVA_0_9;
-        } else if ("1.1".equals(nom)) {
-            return JAVA_1_1;
-        } else if ("1.2".equals(nom)) {
-            return JAVA_1_2;
-        } else if ("1.3".equals(nom)) {
-            return JAVA_1_3;
-        } else if ("1.4".equals(nom)) {
-            return JAVA_1_4;
-        } else if ("1.5".equals(nom)) {
-            return JAVA_1_5;
-        } else if ("1.6".equals(nom)) {
-            return JAVA_1_6;
-        } else if ("1.7".equals(nom)) {
-            return JAVA_1_7;
-        } else if ("1.8".equals(nom)) {
-            return JAVA_1_8;
-        } else if ("1.9".equals(nom)) {
-            return JAVA_1_9;
-        }
-        if (nom == null) {
-            return null;
-        }
-        final float v = toFloatVersion(nom);
-        if ((v - 1.) < 1.) { // then we need to check decimals > .9
-            final int firstComma = Math.max(nom.indexOf('.'), nom.indexOf(','));
-            final int end = Math.max(nom.length(), nom.indexOf(',', firstComma));
-            if (Float.parseFloat(nom.substring(firstComma + 1, end)) > .9f) {
-                return JAVA_RECENT;
-            }
-        }
-        return null;
-    }
-
-    //-----------------------------------------------------------------------
-    /**
-     * <p>The string value is overridden to return the standard name.</p>
-     *
-     * <p>For example, <code>"1.5"</code>.</p>
-     *
-     * @return the name, not null
-     */
-    @Override
-    public String toString() {
-        return name;
-    }
-
-    /**
-     * Gets the Java Version from the system or 2.0 if the {@code java.version} system property is not set.
-     * 
-     * @return the value of {@code java.version} system property or 2.0 if it is not set.
-     */
-    private static float maxVersion() {
-        final float v = toFloatVersion(System.getProperty("java.version", "2.0"));
-        if (v > 0) {
-            return v;
-        }
-        return 2f;
-    }
-
-    /**
-     * Parses a float value from a String.
-     * 
-     * @param value the String to parse.
-     * @return the float value represented by teh string or -1 if the given String can not be parsed.
-     */
-    private static float toFloatVersion(final String value) {
-        final String[] toParse = value.split("\\.");
-        if (toParse.length >= 2) {
-            try {
-                return Float.parseFloat(toParse[0] + '.' + toParse[1]);
-            } catch (final NumberFormatException nfe) {
-                // no-op, let use default
-            }
-        }
-        return -1;
-    }
-}
diff --git a/lang/src/main/java/org/apache/commons/lang3/LocaleUtils.java b/lang/src/main/java/org/apache/commons/lang3/LocaleUtils.java
deleted file mode 100644
index cf2e859..0000000
--- a/lang/src/main/java/org/apache/commons/lang3/LocaleUtils.java
+++ /dev/null
@@ -1,328 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- * 
- *      http://www.apache.org/licenses/LICENSE-2.0
- * 
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.commons.lang3;
-
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.Collections;
-import java.util.HashSet;
-import java.util.List;
-import java.util.Locale;
-import java.util.Set;
-import java.util.concurrent.ConcurrentHashMap;
-import java.util.concurrent.ConcurrentMap;
-
-/**
- * <p>Operations to assist when working with a {@link Locale}.</p>
- *
- * <p>This class tries to handle {@code null} input gracefully.
- * An exception will not be thrown for a {@code null} input.
- * Each method documents its behaviour in more detail.</p>
- *
- * @since 2.2
- * @version $Id$
- */
-public class LocaleUtils {
-
-    /** Concurrent map of language locales by country. */
-    private static final ConcurrentMap<String, List<Locale>> cLanguagesByCountry = 
-        new ConcurrentHashMap<String, List<Locale>>();
-
-    /** Concurrent map of country locales by language. */
-    private static final ConcurrentMap<String, List<Locale>> cCountriesByLanguage = 
-        new ConcurrentHashMap<String, List<Locale>>();
-
-    /**
-     * <p>{@code LocaleUtils} instances should NOT be constructed in standard programming.
-     * Instead, the class should be used as {@code LocaleUtils.toLocale("en_GB");}.</p>
-     *
-     * <p>This constructor is public to permit tools that require a JavaBean instance
-     * to operate.</p>
-     */
-    public LocaleUtils() {
-      super();
-    }
-
-    //-----------------------------------------------------------------------
-    /**
-     * <p>Converts a String to a Locale.</p>
-     *
-     * <p>This method takes the string format of a locale and creates the
-     * locale object from it.</p>
-     *
-     * <pre>
-     *   LocaleUtils.toLocale("")           = new Locale("", "")
-     *   LocaleUtils.toLocale("en")         = new Locale("en", "")
-     *   LocaleUtils.toLocale("en_GB")      = new Locale("en", "GB")
-     *   LocaleUtils.toLocale("en_GB_xxx")  = new Locale("en", "GB", "xxx")   (#)
-     * </pre>
-     *
-     * <p>(#) The behaviour of the JDK variant constructor changed between JDK1.3 and JDK1.4.
-     * In JDK1.3, the constructor upper cases the variant, in JDK1.4, it doesn't.
-     * Thus, the result from getVariant() may vary depending on your JDK.</p>
-     *
-     * <p>This method validates the input strictly.
-     * The language code must be lowercase.
-     * The country code must be uppercase.
-     * The separator must be an underscore.
-     * The length must be correct.
-     * </p>
-     *
-     * @param str  the locale String to convert, null returns null
-     * @return a Locale, null if null input
-     * @throws IllegalArgumentException if the string is an invalid format
-     * @see Locale#forLanguageTag(String)
-     */
-    public static Locale toLocale(final String str) {
-        if (str == null) {
-            return null;
-        }
-        if (str.isEmpty()) { // LANG-941 - JDK 8 introduced an empty locale where all fields are blank
-            return new Locale("", "");
-        }
-        if (str.contains("#")) { // LANG-879 - Cannot handle Java 7 script & extensions
-            throw new IllegalArgumentException("Invalid locale format: " + str);
-        }
-        final int len = str.length();
-        if (len < 2) {
-            throw new IllegalArgumentException("Invalid locale format: " + str);
-        }
-        final char ch0 = str.charAt(0);
-        if (ch0 == '_') {
-            if (len < 3) {
-                throw new IllegalArgumentException("Invalid locale format: " + str);
-            }
-            final char ch1 = str.charAt(1);
-            final char ch2 = str.charAt(2);
-            if (!Character.isUpperCase(ch1) || !Character.isUpperCase(ch2)) {
-                throw new IllegalArgumentException("Invalid locale format: " + str);
-            }
-            if (len == 3) {
-                return new Locale("", str.substring(1, 3));
-            }
-            if (len < 5) {
-                throw new IllegalArgumentException("Invalid locale format: " + str);
-            }
-            if (str.charAt(3) != '_') {
-                throw new IllegalArgumentException("Invalid locale format: " + str);
-            }
-            return new Locale("", str.substring(1, 3), str.substring(4));
-        }
-        
-        final String[] split = str.split("_", -1);
-        final int occurrences = split.length -1;
-        switch (occurrences) {
-            case 0:
-                if (StringUtils.isAllLowerCase(str) && (len == 2 || len == 3)) {
-                    return new Locale(str);
-                }
-            throw new IllegalArgumentException("Invalid locale format: " + str);
-                
-            case 1:
-                if (StringUtils.isAllLowerCase(split[0]) &&
-                    (split[0].length() == 2 || split[0].length() == 3) &&
-                     split[1].length() == 2 && StringUtils.isAllUpperCase(split[1])) {
-                    return new Locale(split[0], split[1]);
-                }
-            throw new IllegalArgumentException("Invalid locale format: " + str);
-
-            case 2:
-                if (StringUtils.isAllLowerCase(split[0]) && 
-                    (split[0].length() == 2 || split[0].length() == 3) &&
-                    (split[1].length() == 0 || (split[1].length() == 2 && StringUtils.isAllUpperCase(split[1]))) &&
-                     split[2].length() > 0) {
-                    return new Locale(split[0], split[1], split[2]);
-                }
-
-                //$FALL-THROUGH$
-            default:
-                throw new IllegalArgumentException("Invalid locale format: " + str);
-        }
-    }
-
-    //-----------------------------------------------------------------------
-    /**
-     * <p>Obtains the list of locales to search through when performing
-     * a locale search.</p>
-     *
-     * <pre>
-     * localeLookupList(Locale("fr","CA","xxx"))
-     *   = [Locale("fr","CA","xxx"), Locale("fr","CA"), Locale("fr")]
-     * </pre>
-     *
-     * @param locale  the locale to start from
-     * @return the unmodifiable list of Locale objects, 0 being locale, not null
-     */
-    public static List<Locale> localeLookupList(final Locale locale) {
-        return localeLookupList(locale, locale);
-    }
-
-    //-----------------------------------------------------------------------
-    /**
-     * <p>Obtains the list of locales to search through when performing
-     * a locale search.</p>
-     *
-     * <pre>
-     * localeLookupList(Locale("fr", "CA", "xxx"), Locale("en"))
-     *   = [Locale("fr","CA","xxx"), Locale("fr","CA"), Locale("fr"), Locale("en"]
-     * </pre>
-     *
-     * <p>The result list begins with the most specific locale, then the
-     * next more general and so on, finishing with the default locale.
-     * The list will never contain the same locale twice.</p>
-     *
-     * @param locale  the locale to start from, null returns empty list
-     * @param defaultLocale  the default locale to use if no other is found
-     * @return the unmodifiable list of Locale objects, 0 being locale, not null
-     */
-    public static List<Locale> localeLookupList(final Locale locale, final Locale defaultLocale) {
-        final List<Locale> list = new ArrayList<Locale>(4);
-        if (locale != null) {
-            list.add(locale);
-            if (locale.getVariant().length() > 0) {
-                list.add(new Locale(locale.getLanguage(), locale.getCountry()));
-            }
-            if (locale.getCountry().length() > 0) {
-                list.add(new Locale(locale.getLanguage(), ""));
-            }
-            if (list.contains(defaultLocale) == false) {
-                list.add(defaultLocale);
-            }
-        }
-        return Collections.unmodifiableList(list);
-    }
-
-    //-----------------------------------------------------------------------
-    /**
-     * <p>Obtains an unmodifiable list of installed locales.</p>
-     * 
-     * <p>This method is a wrapper around {@link Locale#getAvailableLocales()}.
-     * It is more efficient, as the JDK method must create a new array each
-     * time it is called.</p>
-     *
-     * @return the unmodifiable list of available locales
-     */
-    public static List<Locale> availableLocaleList() {
-        return SyncAvoid.AVAILABLE_LOCALE_LIST;
-    }
-
-    //-----------------------------------------------------------------------
-    /**
-     * <p>Obtains an unmodifiable set of installed locales.</p>
-     * 
-     * <p>This method is a wrapper around {@link Locale#getAvailableLocales()}.
-     * It is more efficient, as the JDK method must create a new array each
-     * time it is called.</p>
-     *
-     * @return the unmodifiable set of available locales
-     */
-    public static Set<Locale> availableLocaleSet() {
-        return SyncAvoid.AVAILABLE_LOCALE_SET;
-    }
-
-    //-----------------------------------------------------------------------
-    /**
-     * <p>Checks if the locale specified is in the list of available locales.</p>
-     *
-     * @param locale the Locale object to check if it is available
-     * @return true if the locale is a known locale
-     */
-    public static boolean isAvailableLocale(final Locale locale) {
-        return availableLocaleList().contains(locale);
-    }
-
-    //-----------------------------------------------------------------------
-    /**
-     * <p>Obtains the list of languages supported for a given country.</p>
-     *
-     * <p>This method takes a country code and searches to find the
-     * languages available for that country. Variant locales are removed.</p>
-     *
-     * @param countryCode  the 2 letter country code, null returns empty
-     * @return an unmodifiable List of Locale objects, not null
-     */
-    public static List<Locale> languagesByCountry(final String countryCode) {
-        if (countryCode == null) {
-            return Collections.emptyList();
-        }
-        List<Locale> langs = cLanguagesByCountry.get(countryCode);
-        if (langs == null) {
-            langs = new ArrayList<Locale>();
-            final List<Locale> locales = availableLocaleList();
-            for (int i = 0; i < locales.size(); i++) {
-                final Locale locale = locales.get(i);
-                if (countryCode.equals(locale.getCountry()) &&
-                        locale.getVariant().isEmpty()) {
-                    langs.add(locale);
-                }
-            }
-            langs = Collections.unmodifiableList(langs);
-            cLanguagesByCountry.putIfAbsent(countryCode, langs);
-            langs = cLanguagesByCountry.get(countryCode);
-        }
-        return langs;
-    }
-
-    //-----------------------------------------------------------------------
-    /**
-     * <p>Obtains the list of countries supported for a given language.</p>
-     * 
-     * <p>This method takes a language code and searches to find the
-     * countries available for that language. Variant locales are removed.</p>
-     *
-     * @param languageCode  the 2 letter language code, null returns empty
-     * @return an unmodifiable List of Locale objects, not null
-     */
-    public static List<Locale> countriesByLanguage(final String languageCode) {
-        if (languageCode == null) {
-            return Collections.emptyList();
-        }
-        List<Locale> countries = cCountriesByLanguage.get(languageCode);
-        if (countries == null) {
-            countries = new ArrayList<Locale>();
-            final List<Locale> locales = availableLocaleList();
-            for (int i = 0; i < locales.size(); i++) {
-                final Locale locale = locales.get(i);
-                if (languageCode.equals(locale.getLanguage()) &&
-                        locale.getCountry().length() != 0 &&
-                        locale.getVariant().isEmpty()) {
-                    countries.add(locale);
-                }
-            }
-            countries = Collections.unmodifiableList(countries);
-            cCountriesByLanguage.putIfAbsent(languageCode, countries);
-            countries = cCountriesByLanguage.get(languageCode);
-        }
-        return countries;
-    }
-
-    //-----------------------------------------------------------------------
-    // class to avoid synchronization (Init on demand)
-    static class SyncAvoid {
-        /** Unmodifiable list of available locales. */
-        private static final List<Locale> AVAILABLE_LOCALE_LIST;
-        /** Unmodifiable set of available locales. */
-        private static final Set<Locale> AVAILABLE_LOCALE_SET;
-        
-        static {
-            final List<Locale> list = new ArrayList<Locale>(Arrays.asList(Locale.getAvailableLocales()));  // extra safe
-            AVAILABLE_LOCALE_LIST = Collections.unmodifiableList(list);
-            AVAILABLE_LOCALE_SET = Collections.unmodifiableSet(new HashSet<Locale>(list));
-        }
-    }
-
-}
diff --git a/lang/src/main/java/org/apache/commons/lang3/NotImplementedException.java b/lang/src/main/java/org/apache/commons/lang3/NotImplementedException.java
deleted file mode 100644
index 5103829..0000000
--- a/lang/src/main/java/org/apache/commons/lang3/NotImplementedException.java
+++ /dev/null
@@ -1,128 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- * 
- *      http://www.apache.org/licenses/LICENSE-2.0
- * 
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.commons.lang3;
-
-/**
- * <p>Thrown to indicate that a block of code has not been implemented.
- * This exception supplements <code>UnsupportedOperationException</code>
- * by providing a more semantically rich description of the problem.</p>
- * 
- * <p><code>NotImplementedException</code> represents the case where the
- * author has yet to implement the logic at this point in the program.
- * This can act as an exception based TODO tag. </p>
- * 
- * <pre>
- * public void foo() {
- *   try {
- *     // do something that throws an Exception
- *   } catch (Exception ex) {
- *     // don't know what to do here yet
- *     throw new NotImplementedException("TODO", ex);
- *   }
- * }
- * </pre>
- *
- * This class was originally added in Lang 2.0, but removed in 3.0.
- *
- * @since 3.2 
- * @version $Id: NotImplementedException.java 905636 2010-02-02 14:03:32Z niallp $
- */
-public class NotImplementedException extends UnsupportedOperationException {
-
-    private static final long serialVersionUID = 20131021L;
-
-    private final String code;
-
-    /**
-     * Constructs a NotImplementedException.
-     * 
-     * @param message description of the exception
-     * @since 3.2
-     */
-    public NotImplementedException(final String message) {
-        this(message, (String) null);
-    }
-
-    /**
-     * Constructs a NotImplementedException.
-     * 
-     * @param cause cause of the exception
-     * @since 3.2
-     */
-    public NotImplementedException(final Throwable cause) {
-        this(cause, null);
-    }
-
-    /**
-     * Constructs a NotImplementedException.
-     * 
-     * @param message description of the exception
-     * @param cause cause of the exception
-     * @since 3.2
-     */
-    public NotImplementedException(final String message, final Throwable cause) {
-        this(message, cause, null);
-    }
-
-    /**
-     * Constructs a NotImplementedException.
-     * 
-     * @param message description of the exception
-     * @param code code indicating a resource for more information regarding the lack of implementation
-     * @since 3.2
-     */
-    public NotImplementedException(final String message, final String code) {
-        super(message);
-        this.code = code;
-    }
-
-    /**
-     * Constructs a NotImplementedException.
-     * 
-     * @param cause cause of the exception
-     * @param code code indicating a resource for more information regarding the lack of implementation
-     * @since 3.2
-     */
-    public NotImplementedException(final Throwable cause, final String code) {
-        super(cause);
-        this.code = code;
-    }
-
-    /**
-     * Constructs a NotImplementedException.
-     * 
-     * @param message description of the exception
-     * @param cause cause of the exception
-     * @param code code indicating a resource for more information regarding the lack of implementation
-     * @since 3.2
-     */
-    public NotImplementedException(final String message, final Throwable cause, final String code) {
-        super(message, cause);
-        this.code = code;
-    }
-
-    /**
-     * Obtain the not implemented code. This is an unformatted piece of text intended to point to 
-     * further information regarding the lack of implementation. It might, for example, be an issue 
-     * tracker ID or a URL.
-     *
-     * @return a code indicating a resource for more information regarding the lack of implementation
-     */
-    public String getCode() {
-        return this.code;
-    }
-}
diff --git a/lang/src/main/java/org/apache/commons/lang3/ObjectUtils.java b/lang/src/main/java/org/apache/commons/lang3/ObjectUtils.java
deleted file mode 100644
index 8a8a7ab..0000000
--- a/lang/src/main/java/org/apache/commons/lang3/ObjectUtils.java
+++ /dev/null
@@ -1,951 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.commons.lang3;
-
-import java.io.IOException;
-import java.io.Serializable;
-import java.lang.reflect.Array;
-import java.lang.reflect.InvocationTargetException;
-import java.lang.reflect.Method;
-import java.util.Collections;
-import java.util.Comparator;
-import java.util.HashMap;
-import java.util.Map;
-import java.util.TreeSet;
-
-import org.apache.commons.lang3.exception.CloneFailedException;
-import org.apache.commons.lang3.mutable.MutableInt;
-import org.apache.commons.lang3.text.StrBuilder;
-
-/**
- * <p>Operations on {@code Object}.</p>
- *
- * <p>This class tries to handle {@code null} input gracefully.
- * An exception will generally not be thrown for a {@code null} input.
- * Each method documents its behaviour in more detail.</p>
- *
- * <p>#ThreadSafe#</p>
- * @since 1.0
- * @version $Id$
- */
-//@Immutable
-public class ObjectUtils {
-
-    /**
-     * <p>Singleton used as a {@code null} placeholder where
-     * {@code null} has another meaning.</p>
-     *
-     * <p>For example, in a {@code HashMap} the
-     * {@link java.util.HashMap#get(java.lang.Object)} method returns
-     * {@code null} if the {@code Map} contains {@code null} or if there
-     * is no matching key. The {@code Null} placeholder can be used to
-     * distinguish between these two cases.</p>
-     *
-     * <p>Another example is {@code Hashtable}, where {@code null}
-     * cannot be stored.</p>
-     *
-     * <p>This instance is Serializable.</p>
-     */
-    public static final Null NULL = new Null();
-
-    /**
-     * <p>{@code ObjectUtils} instances should NOT be constructed in
-     * standard programming. Instead, the static methods on the class should
-     * be used, such as {@code ObjectUtils.defaultIfNull("a","b");}.</p>
-     *
-     * <p>This constructor is public to permit tools that require a JavaBean
-     * instance to operate.</p>
-     */
-    public ObjectUtils() {
-        super();
-    }
-
-    // Defaulting
-    //-----------------------------------------------------------------------
-    /**
-     * <p>Returns a default value if the object passed is {@code null}.</p>
-     *
-     * <pre>
-     * ObjectUtils.defaultIfNull(null, null)      = null
-     * ObjectUtils.defaultIfNull(null, "")        = ""
-     * ObjectUtils.defaultIfNull(null, "zz")      = "zz"
-     * ObjectUtils.defaultIfNull("abc", *)        = "abc"
-     * ObjectUtils.defaultIfNull(Boolean.TRUE, *) = Boolean.TRUE
-     * </pre>
-     *
-     * @param <T> the type of the object
-     * @param object  the {@code Object} to test, may be {@code null}
-     * @param defaultValue  the default value to return, may be {@code null}
-     * @return {@code object} if it is not {@code null}, defaultValue otherwise
-     */
-    public static <T> T defaultIfNull(final T object, final T defaultValue) {
-        return object != null ? object : defaultValue;
-    }
-
-    /**
-     * <p>Returns the first value in the array which is not {@code null}.
-     * If all the values are {@code null} or the array is {@code null}
-     * or empty then {@code null} is returned.</p>
-     *
-     * <pre>
-     * ObjectUtils.firstNonNull(null, null)      = null
-     * ObjectUtils.firstNonNull(null, "")        = ""
-     * ObjectUtils.firstNonNull(null, null, "")  = ""
-     * ObjectUtils.firstNonNull(null, "zz")      = "zz"
-     * ObjectUtils.firstNonNull("abc", *)        = "abc"
-     * ObjectUtils.firstNonNull(null, "xyz", *)  = "xyz"
-     * ObjectUtils.firstNonNull(Boolean.TRUE, *) = Boolean.TRUE
-     * ObjectUtils.firstNonNull()                = null
-     * </pre>
-     *
-     * @param <T> the component type of the array
-     * @param values  the values to test, may be {@code null} or empty
-     * @return the first value from {@code values} which is not {@code null},
-     *  or {@code null} if there are no non-null values
-     * @since 3.0
-     */
-    public static <T> T firstNonNull(final T... values) {
-        if (values != null) {
-            for (final T val : values) {
-                if (val != null) {
-                    return val;
-                }
-            }
-        }
-        return null;
-    }
-
-    // Null-safe equals/hashCode
-    //-----------------------------------------------------------------------
-    /**
-     * <p>Compares two objects for equality, where either one or both
-     * objects may be {@code null}.</p>
-     *
-     * <pre>
-     * ObjectUtils.equals(null, null)                  = true
-     * ObjectUtils.equals(null, "")                    = false
-     * ObjectUtils.equals("", null)                    = false
-     * ObjectUtils.equals("", "")                      = true
-     * ObjectUtils.equals(Boolean.TRUE, null)          = false
-     * ObjectUtils.equals(Boolean.TRUE, "true")        = false
-     * ObjectUtils.equals(Boolean.TRUE, Boolean.TRUE)  = true
-     * ObjectUtils.equals(Boolean.TRUE, Boolean.FALSE) = false
-     * </pre>
-     *
-     * @param object1  the first object, may be {@code null}
-     * @param object2  the second object, may be {@code null}
-     * @return {@code true} if the values of both objects are the same
-     * @deprecated this method has been replaced by {@code java.util.Objects.equals(Object, Object)} in Java 7 and will
-     * be removed from future releases.
-     */
-    @Deprecated
-    public static boolean equals(final Object object1, final Object object2) {
-        if (object1 == object2) {
-            return true;
-        }
-        if (object1 == null || object2 == null) {
-            return false;
-        }
-        return object1.equals(object2);
-    }
-
-    /**
-     * <p>Compares two objects for inequality, where either one or both
-     * objects may be {@code null}.</p>
-     *
-     * <pre>
-     * ObjectUtils.notEqual(null, null)                  = false
-     * ObjectUtils.notEqual(null, "")                    = true
-     * ObjectUtils.notEqual("", null)                    = true
-     * ObjectUtils.notEqual("", "")                      = false
-     * ObjectUtils.notEqual(Boolean.TRUE, null)          = true
-     * ObjectUtils.notEqual(Boolean.TRUE, "true")        = true
-     * ObjectUtils.notEqual(Boolean.TRUE, Boolean.TRUE)  = false
-     * ObjectUtils.notEqual(Boolean.TRUE, Boolean.FALSE) = true
-     * </pre>
-     *
-     * @param object1  the first object, may be {@code null}
-     * @param object2  the second object, may be {@code null}
-     * @return {@code false} if the values of both objects are the same
-     */
-    public static boolean notEqual(final Object object1, final Object object2) {
-        return ObjectUtils.equals(object1, object2) == false;
-    }
-
-    /**
-     * <p>Gets the hash code of an object returning zero when the
-     * object is {@code null}.</p>
-     *
-     * <pre>
-     * ObjectUtils.hashCode(null)   = 0
-     * ObjectUtils.hashCode(obj)    = obj.hashCode()
-     * </pre>
-     *
-     * @param obj  the object to obtain the hash code of, may be {@code null}
-     * @return the hash code of the object, or zero if null
-     * @since 2.1
-     * @deprecated this method has been replaced by {@code java.util.Objects.hashCode(Object)} in Java 7 and will be
-     * removed in future releases
-     */
-    @Deprecated
-    public static int hashCode(final Object obj) {
-        // hashCode(Object) retained for performance, as hash code is often critical
-        return obj == null ? 0 : obj.hashCode();
-    }
-
-    /**
-     * <p>Gets the hash code for multiple objects.</p>
-     * 
-     * <p>This allows a hash code to be rapidly calculated for a number of objects.
-     * The hash code for a single object is the <em>not</em> same as {@link #hashCode(Object)}.
-     * The hash code for multiple objects is the same as that calculated by an
-     * {@code ArrayList} containing the specified objects.</p>
-     *
-     * <pre>
-     * ObjectUtils.hashCodeMulti()                 = 1
-     * ObjectUtils.hashCodeMulti((Object[]) null)  = 1
-     * ObjectUtils.hashCodeMulti(a)                = 31 + a.hashCode()
-     * ObjectUtils.hashCodeMulti(a,b)              = (31 + a.hashCode()) * 31 + b.hashCode()
-     * ObjectUtils.hashCodeMulti(a,b,c)            = ((31 + a.hashCode()) * 31 + b.hashCode()) * 31 + c.hashCode()
-     * </pre>
-     *
-     * @param objects  the objects to obtain the hash code of, may be {@code null}
-     * @return the hash code of the objects, or zero if null
-     * @since 3.0
-     * @deprecated this method has been replaced by {@code java.util.Objects.hash(Object...)} in Java 7 and will be
-     * removed in future releases.
-     */
-    @Deprecated
-    public static int hashCodeMulti(final Object... objects) {
-        int hash = 1;
-        if (objects != null) {
-            for (final Object object : objects) {
-                final int tmpHash = ObjectUtils.hashCode(object);
-                hash = hash * 31 + tmpHash;
-            }
-        }
-        return hash;
-    }
-
-    // Identity ToString
-    //-----------------------------------------------------------------------
-    /**
-     * <p>Gets the toString that would be produced by {@code Object}
-     * if a class did not override toString itself. {@code null}
-     * will return {@code null}.</p>
-     *
-     * <pre>
-     * ObjectUtils.identityToString(null)         = null
-     * ObjectUtils.identityToString("")           = "java.lang.String@1e23"
-     * ObjectUtils.identityToString(Boolean.TRUE) = "java.lang.Boolean@7fa"
-     * </pre>
-     *
-     * @param object  the object to create a toString for, may be
-     *  {@code null}
-     * @return the default toString text, or {@code null} if
-     *  {@code null} passed in
-     */
-    public static String identityToString(final Object object) {
-        if (object == null) {
-            return null;
-        }
-        final StringBuilder builder = new StringBuilder();
-        identityToString(builder, object);
-        return builder.toString();
-    }
-
-    /**
-     * <p>Appends the toString that would be produced by {@code Object}
-     * if a class did not override toString itself. {@code null}
-     * will throw a NullPointerException for either of the two parameters. </p>
-     *
-     * <pre>
-     * ObjectUtils.identityToString(appendable, "")            = appendable.append("java.lang.String@1e23"
-     * ObjectUtils.identityToString(appendable, Boolean.TRUE)  = appendable.append("java.lang.Boolean@7fa"
-     * ObjectUtils.identityToString(appendable, Boolean.TRUE)  = appendable.append("java.lang.Boolean@7fa")
-     * </pre>
-     *
-     * @param appendable  the appendable to append to
-     * @param object  the object to create a toString for
-     * @throws IOException if an I/O error occurs
-     * @since 3.2
-     */
-    public static void identityToString(final Appendable appendable, final Object object) throws IOException {
-        if (object == null) {
-            throw new NullPointerException("Cannot get the toString of a null identity");
-        }
-        appendable.append(object.getClass().getName())
-              .append('@')
-              .append(Integer.toHexString(System.identityHashCode(object)));
-    }
-
-    /**
-     * <p>Appends the toString that would be produced by {@code Object}
-     * if a class did not override toString itself. {@code null}
-     * will throw a NullPointerException for either of the two parameters. </p>
-     *
-     * <pre>
-     * ObjectUtils.identityToString(builder, "")            = builder.append("java.lang.String@1e23"
-     * ObjectUtils.identityToString(builder, Boolean.TRUE)  = builder.append("java.lang.Boolean@7fa"
-     * ObjectUtils.identityToString(builder, Boolean.TRUE)  = builder.append("java.lang.Boolean@7fa")
-     * </pre>
-     *
-     * @param builder  the builder to append to
-     * @param object  the object to create a toString for
-     * @since 3.2
-     */
-    public static void identityToString(final StrBuilder builder, final Object object) {
-        if (object == null) {
-            throw new NullPointerException("Cannot get the toString of a null identity");
-        }
-        builder.append(object.getClass().getName())
-              .append('@')
-              .append(Integer.toHexString(System.identityHashCode(object)));
-    }
-
-    /**
-     * <p>Appends the toString that would be produced by {@code Object}
-     * if a class did not override toString itself. {@code null}
-     * will throw a NullPointerException for either of the two parameters. </p>
-     *
-     * <pre>
-     * ObjectUtils.identityToString(buf, "")            = buf.append("java.lang.String@1e23"
-     * ObjectUtils.identityToString(buf, Boolean.TRUE)  = buf.append("java.lang.Boolean@7fa"
-     * ObjectUtils.identityToString(buf, Boolean.TRUE)  = buf.append("java.lang.Boolean@7fa")
-     * </pre>
-     *
-     * @param buffer  the buffer to append to
-     * @param object  the object to create a toString for
-     * @since 2.4
-     */
-    public static void identityToString(final StringBuffer buffer, final Object object) {
-        if (object == null) {
-            throw new NullPointerException("Cannot get the toString of a null identity");
-        }
-        buffer.append(object.getClass().getName())
-              .append('@')
-              .append(Integer.toHexString(System.identityHashCode(object)));
-    }
-
-    /**
-     * <p>Appends the toString that would be produced by {@code Object}
-     * if a class did not override toString itself. {@code null}
-     * will throw a NullPointerException for either of the two parameters. </p>
-     *
-     * <pre>
-     * ObjectUtils.identityToString(builder, "")            = builder.append("java.lang.String@1e23"
-     * ObjectUtils.identityToString(builder, Boolean.TRUE)  = builder.append("java.lang.Boolean@7fa"
-     * ObjectUtils.identityToString(builder, Boolean.TRUE)  = builder.append("java.lang.Boolean@7fa")
-     * </pre>
-     *
-     * @param builder  the builder to append to
-     * @param object  the object to create a toString for
-     * @since 3.2
-     */
-    public static void identityToString(final StringBuilder builder, final Object object) {
-        if (object == null) {
-            throw new NullPointerException("Cannot get the toString of a null identity");
-        }
-        builder.append(object.getClass().getName())
-              .append('@')
-              .append(Integer.toHexString(System.identityHashCode(object)));
-    }
-
-    // ToString
-    //-----------------------------------------------------------------------
-    /**
-     * <p>Gets the {@code toString} of an {@code Object} returning
-     * an empty string ("") if {@code null} input.</p>
-     *
-     * <pre>
-     * ObjectUtils.toString(null)         = ""
-     * ObjectUtils.toString("")           = ""
-     * ObjectUtils.toString("bat")        = "bat"
-     * ObjectUtils.toString(Boolean.TRUE) = "true"
-     * </pre>
-     *
-     * @see StringUtils#defaultString(String)
-     * @see String#valueOf(Object)
-     * @param obj  the Object to {@code toString}, may be null
-     * @return the passed in Object's toString, or {@code ""} if {@code null} input
-     * @since 2.0
-     * @deprecated this method has been replaced by {@code java.util.Objects.toString(Object)} in Java 7 and will be
-     * removed in future releases. Note however that said method will return "null" for null references, while this
-     * method returns and empty String. To preserve behavior use {@code java.util.Objects.toString(myObject, "")}
-     */
-    @Deprecated
-    public static String toString(final Object obj) {
-        return obj == null ? "" : obj.toString();
-    }
-
-    /**
-     * <p>Gets the {@code toString} of an {@code Object} returning
-     * a specified text if {@code null} input.</p>
-     *
-     * <pre>
-     * ObjectUtils.toString(null, null)           = null
-     * ObjectUtils.toString(null, "null")         = "null"
-     * ObjectUtils.toString("", "null")           = ""
-     * ObjectUtils.toString("bat", "null")        = "bat"
-     * ObjectUtils.toString(Boolean.TRUE, "null") = "true"
-     * </pre>
-     *
-     * @see StringUtils#defaultString(String,String)
-     * @see String#valueOf(Object)
-     * @param obj  the Object to {@code toString}, may be null
-     * @param nullStr  the String to return if {@code null} input, may be null
-     * @return the passed in Object's toString, or {@code nullStr} if {@code null} input
-     * @since 2.0
-     * @deprecated this method has been replaced by {@code java.util.Objects.toString(Object, String)} in Java 7 and
-     * will be removed in future releases.
-     */
-    @Deprecated
-    public static String toString(final Object obj, final String nullStr) {
-        return obj == null ? nullStr : obj.toString();
-    }
-
-    // Comparable
-    //-----------------------------------------------------------------------
-    /**
-     * <p>Null safe comparison of Comparables.</p>
-     *
-     * @param <T> type of the values processed by this method
-     * @param values the set of comparable values, may be null
-     * @return
-     *  <ul>
-     *   <li>If any objects are non-null and unequal, the lesser object.
-     *   <li>If all objects are non-null and equal, the first.
-     *   <li>If any of the comparables are null, the lesser of the non-null objects.
-     *   <li>If all the comparables are null, null is returned.
-     *  </ul>
-     */
-    public static <T extends Comparable<? super T>> T min(final T... values) {
-        T result = null;
-        if (values != null) {
-            for (final T value : values) {
-                if (compare(value, result, true) < 0) {
-                    result = value;
-                }
-            }
-        }
-        return result;
-    }
-
-    /**
-     * <p>Null safe comparison of Comparables.</p>
-     *
-     * @param <T> type of the values processed by this method
-     * @param values the set of comparable values, may be null
-     * @return
-     *  <ul>
-     *   <li>If any objects are non-null and unequal, the greater object.
-     *   <li>If all objects are non-null and equal, the first.
-     *   <li>If any of the comparables are null, the greater of the non-null objects.
-     *   <li>If all the comparables are null, null is returned.
-     *  </ul>
-     */
-    public static <T extends Comparable<? super T>> T max(final T... values) {
-        T result = null;
-        if (values != null) {
-            for (final T value : values) {
-                if (compare(value, result, false) > 0) {
-                    result = value;
-                }
-            }
-        }
-        return result;
-    }
-
-    /**
-     * <p>Null safe comparison of Comparables.
-     * {@code null} is assumed to be less than a non-{@code null} value.</p>
-     *
-     * @param <T> type of the values processed by this method
-     * @param c1  the first comparable, may be null
-     * @param c2  the second comparable, may be null
-     * @return a negative value if c1 &lt; c2, zero if c1 = c2
-     *  and a positive value if c1 &gt; c2
-     */
-    public static <T extends Comparable<? super T>> int compare(final T c1, final T c2) {
-        return compare(c1, c2, false);
-    }
-
-    /**
-     * <p>Null safe comparison of Comparables.</p>
-     *
-     * @param <T> type of the values processed by this method
-     * @param c1  the first comparable, may be null
-     * @param c2  the second comparable, may be null
-     * @param nullGreater if true {@code null} is considered greater
-     *  than a non-{@code null} value or if false {@code null} is
-     *  considered less than a Non-{@code null} value
-     * @return a negative value if c1 &lt; c2, zero if c1 = c2
-     *  and a positive value if c1 &gt; c2
-     * @see java.util.Comparator#compare(Object, Object)
-     */
-    public static <T extends Comparable<? super T>> int compare(final T c1, final T c2, final boolean nullGreater) {
-        if (c1 == c2) {
-            return 0;
-        } else if (c1 == null) {
-            return nullGreater ? 1 : -1;
-        } else if (c2 == null) {
-            return nullGreater ? -1 : 1;
-        }
-        return c1.compareTo(c2);
-    }
-
-    /**
-     * Find the "best guess" middle value among comparables. If there is an even
-     * number of total values, the lower of the two middle values will be returned.
-     * @param <T> type of values processed by this method
-     * @param items to compare
-     * @return T at middle position
-     * @throws NullPointerException if items is {@code null}
-     * @throws IllegalArgumentException if items is empty or contains {@code null} values
-     * @since 3.0.1
-     */
-    public static <T extends Comparable<? super T>> T median(final T... items) {
-        Validate.notEmpty(items);
-        Validate.noNullElements(items);
-        final TreeSet<T> sort = new TreeSet<T>();
-        Collections.addAll(sort, items);
-        @SuppressWarnings("unchecked") //we know all items added were T instances
-        final
-        T result = (T) sort.toArray()[(sort.size() - 1) / 2];
-        return result;
-    }
-
-    /**
-     * Find the "best guess" middle value among comparables. If there is an even
-     * number of total values, the lower of the two middle values will be returned.
-     * @param <T> type of values processed by this method
-     * @param comparator to use for comparisons
-     * @param items to compare
-     * @return T at middle position
-     * @throws NullPointerException if items or comparator is {@code null}
-     * @throws IllegalArgumentException if items is empty or contains {@code null} values
-     * @since 3.0.1
-     */
-    public static <T> T median(final Comparator<T> comparator, final T... items) {
-        Validate.notEmpty(items, "null/empty items");
-        Validate.noNullElements(items);
-        Validate.notNull(comparator, "null comparator");
-        final TreeSet<T> sort = new TreeSet<T>(comparator);
-        Collections.addAll(sort, items);
-        @SuppressWarnings("unchecked") //we know all items added were T instances
-        final
-        T result = (T) sort.toArray()[(sort.size() - 1) / 2];
-        return result;
-    }
-
-    // Mode
-    //-----------------------------------------------------------------------
-    /**
-     * Find the most frequently occurring item.
-     * 
-     * @param <T> type of values processed by this method
-     * @param items to check
-     * @return most populous T, {@code null} if non-unique or no items supplied
-     * @since 3.0.1
-     */
-    public static <T> T mode(final T... items) {
-        if (ArrayUtils.isNotEmpty(items)) {
-            final HashMap<T, MutableInt> occurrences = new HashMap<T, MutableInt>(items.length);
-            for (final T t : items) {
-                final MutableInt count = occurrences.get(t);
-                if (count == null) {
-                    occurrences.put(t, new MutableInt(1));
-                } else {
-                    count.increment();
-                }
-            }
-            T result = null;
-            int max = 0;
-            for (final Map.Entry<T, MutableInt> e : occurrences.entrySet()) {
-                final int cmp = e.getValue().intValue();
-                if (cmp == max) {
-                    result = null;
-                } else if (cmp > max) {
-                    max = cmp;
-                    result = e.getKey();
-                }
-            }
-            return result;
-        }
-        return null;
-    }
-
-    // cloning
-    //-----------------------------------------------------------------------
-    /**
-     * <p>Clone an object.</p>
-     *
-     * @param <T> the type of the object
-     * @param obj  the object to clone, null returns null
-     * @return the clone if the object implements {@link Cloneable} otherwise {@code null}
-     * @throws CloneFailedException if the object is cloneable and the clone operation fails
-     * @since 3.0
-     */
-    public static <T> T clone(final T obj) {
-        if (obj instanceof Cloneable) {
-            final Object result;
-            if (obj.getClass().isArray()) {
-                final Class<?> componentType = obj.getClass().getComponentType();
-                if (!componentType.isPrimitive()) {
-                    result = ((Object[]) obj).clone();
-                } else {
-                    int length = Array.getLength(obj);
-                    result = Array.newInstance(componentType, length);
-                    while (length-- > 0) {
-                        Array.set(result, length, Array.get(obj, length));
-                    }
-                }
-            } else {
-                try {
-                    final Method clone = obj.getClass().getMethod("clone");
-                    result = clone.invoke(obj);
-                } catch (final NoSuchMethodException e) {
-                    throw new CloneFailedException("Cloneable type "
-                        + obj.getClass().getName()
-                        + " has no clone method", e);
-                } catch (final IllegalAccessException e) {
-                    throw new CloneFailedException("Cannot clone Cloneable type "
-                        + obj.getClass().getName(), e);
-                } catch (final InvocationTargetException e) {
-                    throw new CloneFailedException("Exception cloning Cloneable type "
-                        + obj.getClass().getName(), e.getCause());
-                }
-            }
-            @SuppressWarnings("unchecked") // OK because input is of type T
-            final T checked = (T) result;
-            return checked;
-        }
-
-        return null;
-    }
-
-    /**
-     * <p>Clone an object if possible.</p>
-     *
-     * <p>This method is similar to {@link #clone(Object)}, but will return the provided
-     * instance as the return value instead of {@code null} if the instance
-     * is not cloneable. This is more convenient if the caller uses different
-     * implementations (e.g. of a service) and some of the implementations do not allow concurrent
-     * processing or have state. In such cases the implementation can simply provide a proper
-     * clone implementation and the caller's code does not have to change.</p>
-     *
-     * @param <T> the type of the object
-     * @param obj  the object to clone, null returns null
-     * @return the clone if the object implements {@link Cloneable} otherwise the object itself
-     * @throws CloneFailedException if the object is cloneable and the clone operation fails
-     * @since 3.0
-     */
-    public static <T> T cloneIfPossible(final T obj) {
-        final T clone = clone(obj);
-        return clone == null ? obj : clone;
-    }
-
-    // Null
-    //-----------------------------------------------------------------------
-    /**
-     * <p>Class used as a null placeholder where {@code null}
-     * has another meaning.</p>
-     *
-     * <p>For example, in a {@code HashMap} the
-     * {@link java.util.HashMap#get(java.lang.Object)} method returns
-     * {@code null} if the {@code Map} contains {@code null} or if there is
-     * no matching key. The {@code Null} placeholder can be used to distinguish
-     * between these two cases.</p>
-     *
-     * <p>Another example is {@code Hashtable}, where {@code null}
-     * cannot be stored.</p>
-     */
-    public static class Null implements Serializable {
-        /**
-         * Required for serialization support. Declare serialization compatibility with Commons Lang 1.0
-         *
-         * @see java.io.Serializable
-         */
-        private static final long serialVersionUID = 7092611880189329093L;
-
-        /**
-         * Restricted constructor - singleton.
-         */
-        Null() {
-            super();
-        }
-
-        /**
-         * <p>Ensure singleton.</p>
-         *
-         * @return the singleton value
-         */
-        private Object readResolve() {
-            return ObjectUtils.NULL;
-        }
-    }
-
-
-    // Constants (LANG-816):
-    /*
-        These methods ensure constants are not inlined by javac.
-        For example, typically a developer might declare a constant like so:
-
-            public final static int MAGIC_NUMBER = 5;
-
-        Should a different jar file refer to this, and the MAGIC_NUMBER
-        is changed a later date (e.g., MAGIC_NUMBER = 6), the different jar
-        file will need to recompile itself.  This is because javac
-        typically inlines the primitive or String constant directly into
-        the bytecode, and removes the reference to the MAGIC_NUMBER field.
-
-        To help the other jar (so that it does not need to recompile
-        when constants are changed) the original developer can declare
-        their constant using one of the CONST() utility methods, instead:
-
-            public final static int MAGIC_NUMBER = CONST(5);
-     */
-
-
-    /**
-     * This method returns the provided value unchanged.
-     * This can prevent javac from inlining a constant
-     * field, e.g.,
-     *
-     * <pre>
-     *     public final static boolean MAGIC_FLAG = ObjectUtils.CONST(true);
-     * </pre>
-     *
-     * This way any jars that refer to this field do not
-     * have to recompile themselves if the field's value
-     * changes at some future date.
-     *
-     * @param v the boolean value to return
-     * @return the boolean v, unchanged
-     * @since 3.2
-     */
-    public static boolean CONST(final boolean v) { return v; }
-
-    /**
-     * This method returns the provided value unchanged.
-     * This can prevent javac from inlining a constant
-     * field, e.g.,
-     *
-     * <pre>
-     *     public final static byte MAGIC_BYTE = ObjectUtils.CONST((byte) 127);
-     * </pre>
-     *
-     * This way any jars that refer to this field do not
-     * have to recompile themselves if the field's value
-     * changes at some future date.
-     *
-     * @param v the byte value to return
-     * @return the byte v, unchanged
-     * @since 3.2
-     */
-    public static byte CONST(final byte v) { return v; }
-
-    /**
-     * This method returns the provided value unchanged.
-     * This can prevent javac from inlining a constant
-     * field, e.g.,
-     *
-     * <pre>
-     *     public final static byte MAGIC_BYTE = ObjectUtils.CONST_BYTE(127);
-     * </pre>
-     *
-     * This way any jars that refer to this field do not
-     * have to recompile themselves if the field's value
-     * changes at some future date.
-     *
-     * @param v the byte literal (as an int) value to return
-     * @throws IllegalArgumentException if the value passed to v
-     *         is larger than a byte, that is, smaller than -128 or
-     *         larger than 127.
-     * @return the byte v, unchanged
-     * @since 3.2
-     */
-    public static byte CONST_BYTE(final int v) throws IllegalArgumentException {
-        if (v < Byte.MIN_VALUE || v > Byte.MAX_VALUE) {
-            throw new IllegalArgumentException("Supplied value must be a valid byte literal between -128 and 127: [" + v + "]");
-        }
-        return (byte) v;
-    }
-
-    /**
-     * This method returns the provided value unchanged.
-     * This can prevent javac from inlining a constant
-     * field, e.g.,
-     *
-     * <pre>
-     *     public final static char MAGIC_CHAR = ObjectUtils.CONST('a');
-     * </pre>
-     *
-     * This way any jars that refer to this field do not
-     * have to recompile themselves if the field's value
-     * changes at some future date.
-     *
-     * @param v the char value to return
-     * @return the char v, unchanged
-     * @since 3.2
-     */
-    public static char CONST(final char v) { return v; }
-
-    /**
-     * This method returns the provided value unchanged.
-     * This can prevent javac from inlining a constant
-     * field, e.g.,
-     *
-     * <pre>
-     *     public final static short MAGIC_SHORT = ObjectUtils.CONST((short) 123);
-     * </pre>
-     *
-     * This way any jars that refer to this field do not
-     * have to recompile themselves if the field's value
-     * changes at some future date.
-     *
-     * @param v the short value to return
-     * @return the short v, unchanged
-     * @since 3.2
-     */
-    public static short CONST(final short v) { return v; }
-
-    /**
-     * This method returns the provided value unchanged.
-     * This can prevent javac from inlining a constant
-     * field, e.g.,
-     *
-     * <pre>
-     *     public final static short MAGIC_SHORT = ObjectUtils.CONST_SHORT(127);
-     * </pre>
-     *
-     * This way any jars that refer to this field do not
-     * have to recompile themselves if the field's value
-     * changes at some future date.
-     *
-     * @param v the short literal (as an int) value to return
-     * @throws IllegalArgumentException if the value passed to v
-     *         is larger than a short, that is, smaller than -32768 or
-     *         larger than 32767.
-     * @return the byte v, unchanged
-     * @since 3.2
-     */
-    public static short CONST_SHORT(final int v) throws IllegalArgumentException {
-        if (v < Short.MIN_VALUE || v > Short.MAX_VALUE) {
-            throw new IllegalArgumentException("Supplied value must be a valid byte literal between -32768 and 32767: [" + v + "]");
-        }
-        return (short) v;
-    }
-
-
-    /**
-     * This method returns the provided value unchanged.
-     * This can prevent javac from inlining a constant
-     * field, e.g.,
-     *
-     * <pre>
-     *     public final static int MAGIC_INT = ObjectUtils.CONST(123);
-     * </pre>
-     *
-     * This way any jars that refer to this field do not
-     * have to recompile themselves if the field's value
-     * changes at some future date.
-     *
-     * @param v the int value to return
-     * @return the int v, unchanged
-     * @since 3.2
-     */
-    public static int CONST(final int v) { return v; }
-
-    /**
-     * This method returns the provided value unchanged.
-     * This can prevent javac from inlining a constant
-     * field, e.g.,
-     *
-     * <pre>
-     *     public final static long MAGIC_LONG = ObjectUtils.CONST(123L);
-     * </pre>
-     *
-     * This way any jars that refer to this field do not
-     * have to recompile themselves if the field's value
-     * changes at some future date.
-     *
-     * @param v the long value to return
-     * @return the long v, unchanged
-     * @since 3.2
-     */
-    public static long CONST(final long v) { return v; }
-
-    /**
-     * This method returns the provided value unchanged.
-     * This can prevent javac from inlining a constant
-     * field, e.g.,
-     *
-     * <pre>
-     *     public final static float MAGIC_FLOAT = ObjectUtils.CONST(1.0f);
-     * </pre>
-     *
-     * This way any jars that refer to this field do not
-     * have to recompile themselves if the field's value
-     * changes at some future date.
-     *
-     * @param v the float value to return
-     * @return the float v, unchanged
-     * @since 3.2
-     */
-    public static float CONST(final float v) { return v; }
-
-    /**
-     * This method returns the provided value unchanged.
-     * This can prevent javac from inlining a constant
-     * field, e.g.,
-     *
-     * <pre>
-     *     public final static double MAGIC_DOUBLE = ObjectUtils.CONST(1.0);
-     * </pre>
-     *
-     * This way any jars that refer to this field do not
-     * have to recompile themselves if the field's value
-     * changes at some future date.
-     *
-     * @param v the double value to return
-     * @return the double v, unchanged
-     * @since 3.2
-     */
-    public static double CONST(final double v) { return v; }
-
-    /**
-     * This method returns the provided value unchanged.
-     * This can prevent javac from inlining a constant
-     * field, e.g.,
-     *
-     * <pre>
-     *     public final static String MAGIC_STRING = ObjectUtils.CONST("abc");
-     * </pre>
-     *
-     * This way any jars that refer to this field do not
-     * have to recompile themselves if the field's value
-     * changes at some future date.
-     *
-     * @param <T> the Object type 
-     * @param v the genericized Object value to return (typically a String).
-     * @return the genericized Object v, unchanged (typically a String).
-     * @since 3.2
-     */
-    public static <T> T CONST(final T v) { return v; }
-
-}
diff --git a/lang/src/main/java/org/apache/commons/lang3/RandomStringUtils.java b/lang/src/main/java/org/apache/commons/lang3/RandomStringUtils.java
deleted file mode 100644
index 9c09f54..0000000
--- a/lang/src/main/java/org/apache/commons/lang3/RandomStringUtils.java
+++ /dev/null
@@ -1,335 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- * 
- *      http://www.apache.org/licenses/LICENSE-2.0
- * 
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.commons.lang3;
-
-import java.util.Random;
-
-/**
- * <p>Operations for random {@code String}s.</p>
- * <p>Currently <em>private high surrogate</em> characters are ignored. 
- * These are Unicode characters that fall between the values 56192 (db80)
- * and 56319 (dbff) as we don't know how to handle them. 
- * High and low surrogates are correctly dealt with - that is if a 
- * high surrogate is randomly chosen, 55296 (d800) to 56191 (db7f) 
- * then it is followed by a low surrogate. If a low surrogate is chosen, 
- * 56320 (dc00) to 57343 (dfff) then it is placed after a randomly 
- * chosen high surrogate. </p>
- *
- * <p>#ThreadSafe#</p>
- * @since 1.0
- * @version $Id$
- */
-public class RandomStringUtils {
-
-    /**
-     * <p>Random object used by random method. This has to be not local
-     * to the random method so as to not return the same value in the 
-     * same millisecond.</p>
-     */
-    private static final Random RANDOM = new Random();
-
-    /**
-     * <p>{@code RandomStringUtils} instances should NOT be constructed in
-     * standard programming. Instead, the class should be used as
-     * {@code RandomStringUtils.random(5);}.</p>
-     *
-     * <p>This constructor is public to permit tools that require a JavaBean instance
-     * to operate.</p>
-     */
-    public RandomStringUtils() {
-      super();
-    }
-
-    // Random
-    //-----------------------------------------------------------------------
-    /**
-     * <p>Creates a random string whose length is the number of characters
-     * specified.</p>
-     *
-     * <p>Characters will be chosen from the set of all characters.</p>
-     *
-     * @param count  the length of random string to create
-     * @return the random string
-     */
-    public static String random(final int count) {
-        return random(count, false, false);
-    }
-
-    /**
-     * <p>Creates a random string whose length is the number of characters
-     * specified.</p>
-     *
-     * <p>Characters will be chosen from the set of characters whose
-     * ASCII value is between {@code 32} and {@code 126} (inclusive).</p>
-     *
-     * @param count  the length of random string to create
-     * @return the random string
-     */
-    public static String randomAscii(final int count) {
-        return random(count, 32, 127, false, false);
-    }
-    
-    /**
-     * <p>Creates a random string whose length is the number of characters
-     * specified.</p>
-     *
-     * <p>Characters will be chosen from the set of alphabetic
-     * characters.</p>
-     *
-     * @param count  the length of random string to create
-     * @return the random string
-     */
-    public static String randomAlphabetic(final int count) {
-        return random(count, true, false);
-    }
-    
-    /**
-     * <p>Creates a random string whose length is the number of characters
-     * specified.</p>
-     *
-     * <p>Characters will be chosen from the set of alpha-numeric
-     * characters.</p>
-     *
-     * @param count  the length of random string to create
-     * @return the random string
-     */
-    public static String randomAlphanumeric(final int count) {
-        return random(count, true, true);
-    }
-    
-    /**
-     * <p>Creates a random string whose length is the number of characters
-     * specified.</p>
-     *
-     * <p>Characters will be chosen from the set of numeric
-     * characters.</p>
-     *
-     * @param count  the length of random string to create
-     * @return the random string
-     */
-    public static String randomNumeric(final int count) {
-        return random(count, false, true);
-    }
-
-    /**
-     * <p>Creates a random string whose length is the number of characters
-     * specified.</p>
-     *
-     * <p>Characters will be chosen from the set of alpha-numeric
-     * characters as indicated by the arguments.</p>
-     *
-     * @param count  the length of random string to create
-     * @param letters  if {@code true}, generated string may include
-     *  alphabetic characters
-     * @param numbers  if {@code true}, generated string may include
-     *  numeric characters
-     * @return the random string
-     */
-    public static String random(final int count, final boolean letters, final boolean numbers) {
-        return random(count, 0, 0, letters, numbers);
-    }
-    
-    /**
-     * <p>Creates a random string whose length is the number of characters
-     * specified.</p>
-     *
-     * <p>Characters will be chosen from the set of alpha-numeric
-     * characters as indicated by the arguments.</p>
-     *
-     * @param count  the length of random string to create
-     * @param start  the position in set of chars to start at
-     * @param end  the position in set of chars to end before
-     * @param letters  if {@code true}, generated string may include
-     *  alphabetic characters
-     * @param numbers  if {@code true}, generated string may include
-     *  numeric characters
-     * @return the random string
-     */
-    public static String random(final int count, final int start, final int end, final boolean letters, final boolean numbers) {
-        return random(count, start, end, letters, numbers, null, RANDOM);
-    }
-
-    /**
-     * <p>Creates a random string based on a variety of options, using
-     * default source of randomness.</p>
-     *
-     * <p>This method has exactly the same semantics as
-     * {@link #random(int,int,int,boolean,boolean,char[],Random)}, but
-     * instead of using an externally supplied source of randomness, it uses
-     * the internal static {@link Random} instance.</p>
-     *
-     * @param count  the length of random string to create
-     * @param start  the position in set of chars to start at
-     * @param end  the position in set of chars to end before
-     * @param letters  only allow letters?
-     * @param numbers  only allow numbers?
-     * @param chars  the set of chars to choose randoms from.
-     *  If {@code null}, then it will use the set of all chars.
-     * @return the random string
-     * @throws ArrayIndexOutOfBoundsException if there are not
-     *  {@code (end - start) + 1} characters in the set array.
-     */
-    public static String random(final int count, final int start, final int end, final boolean letters, final boolean numbers, final char... chars) {
-        return random(count, start, end, letters, numbers, chars, RANDOM);
-    }
-
-    /**
-     * <p>Creates a random string based on a variety of options, using
-     * supplied source of randomness.</p>
-     *
-     * <p>If start and end are both {@code 0}, start and end are set
-     * to {@code ' '} and {@code 'z'}, the ASCII printable
-     * characters, will be used, unless letters and numbers are both
-     * {@code false}, in which case, start and end are set to
-     * {@code 0} and {@code Integer.MAX_VALUE}.
-     *
-     * <p>If set is not {@code null}, characters between start and
-     * end are chosen.</p>
-     *
-     * <p>This method accepts a user-supplied {@link Random}
-     * instance to use as a source of randomness. By seeding a single 
-     * {@link Random} instance with a fixed seed and using it for each call,
-     * the same random sequence of strings can be generated repeatedly
-     * and predictably.</p>
-     *
-     * @param count  the length of random string to create
-     * @param start  the position in set of chars to start at
-     * @param end  the position in set of chars to end before
-     * @param letters  only allow letters?
-     * @param numbers  only allow numbers?
-     * @param chars  the set of chars to choose randoms from, must not be empty.
-     *  If {@code null}, then it will use the set of all chars.
-     * @param random  a source of randomness.
-     * @return the random string
-     * @throws ArrayIndexOutOfBoundsException if there are not
-     *  {@code (end - start) + 1} characters in the set array.
-     * @throws IllegalArgumentException if {@code count} &lt; 0 or the provided chars array is empty.
-     * @since 2.0
-     */
-    public static String random(int count, int start, int end, final boolean letters, final boolean numbers,
-                                final char[] chars, final Random random) {
-        if (count == 0) {
-            return "";
-        } else if (count < 0) {
-            throw new IllegalArgumentException("Requested random string length " + count + " is less than 0.");
-        }
-        if (chars != null && chars.length == 0) {
-            throw new IllegalArgumentException("The chars array must not be empty");
-        }
-
-        if (start == 0 && end == 0) {
-            if (chars != null) {
-                end = chars.length;
-            } else {
-                if (!letters && !numbers) {
-                    end = Integer.MAX_VALUE;
-                } else {
-                    end = 'z' + 1;
-                    start = ' ';                
-                }
-            }
-        } else {
-            if (end <= start) {
-                throw new IllegalArgumentException("Parameter end (" + end + ") must be greater than start (" + start + ")");
-            }
-        }
-
-        final char[] buffer = new char[count];
-        final int gap = end - start;
-
-        while (count-- != 0) {
-            char ch;
-            if (chars == null) {
-                ch = (char) (random.nextInt(gap) + start);
-            } else {
-                ch = chars[random.nextInt(gap) + start];
-            }
-            if (letters && Character.isLetter(ch)
-                    || numbers && Character.isDigit(ch)
-                    || !letters && !numbers) {
-                if(ch >= 56320 && ch <= 57343) {
-                    if(count == 0) {
-                        count++;
-                    } else {
-                        // low surrogate, insert high surrogate after putting it in
-                        buffer[count] = ch;
-                        count--;
-                        buffer[count] = (char) (55296 + random.nextInt(128));
-                    }
-                } else if(ch >= 55296 && ch <= 56191) {
-                    if(count == 0) {
-                        count++;
-                    } else {
-                        // high surrogate, insert low surrogate before putting it in
-                        buffer[count] = (char) (56320 + random.nextInt(128));
-                        count--;
-                        buffer[count] = ch;
-                    }
-                } else if(ch >= 56192 && ch <= 56319) {
-                    // private high surrogate, no effing clue, so skip it
-                    count++;
-                } else {
-                    buffer[count] = ch;
-                }
-            } else {
-                count++;
-            }
-        }
-        return new String(buffer);
-    }
-
-    /**
-     * <p>Creates a random string whose length is the number of characters
-     * specified.</p>
-     *
-     * <p>Characters will be chosen from the set of characters
-     * specified by the string, must not be empty. 
-     * If null, the set of all characters is used.</p>
-     *
-     * @param count  the length of random string to create
-     * @param chars  the String containing the set of characters to use,
-     *  may be null, but must not be empty
-     * @return the random string
-     * @throws IllegalArgumentException if {@code count} &lt; 0 or the string is empty.
-     */
-    public static String random(final int count, final String chars) {
-        if (chars == null) {
-            return random(count, 0, 0, false, false, null, RANDOM);
-        }
-        return random(count, chars.toCharArray());
-    }
-
-    /**
-     * <p>Creates a random string whose length is the number of characters
-     * specified.</p>
-     *
-     * <p>Characters will be chosen from the set of characters specified.</p>
-     *
-     * @param count  the length of random string to create
-     * @param chars  the character array containing the set of characters to use,
-     *  may be null
-     * @return the random string
-     * @throws IllegalArgumentException if {@code count} &lt; 0.
-     */
-    public static String random(final int count, final char... chars) {
-        if (chars == null) {
-            return random(count, 0, 0, false, false, null, RANDOM);
-        }
-        return random(count, 0, chars.length, false, false, chars, RANDOM);
-    }
-    
-}
diff --git a/lang/src/main/java/org/apache/commons/lang3/RandomUtils.java b/lang/src/main/java/org/apache/commons/lang3/RandomUtils.java
deleted file mode 100644
index 0846a23..0000000
--- a/lang/src/main/java/org/apache/commons/lang3/RandomUtils.java
+++ /dev/null
@@ -1,174 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.commons.lang3;
-
-import java.util.Random;
-
-/**
- * <p>Utility library that supplements the standard {@link Random} class.</p>
- * 
- * @since 3.3
- *
- * @version $Id$
- */
-public class RandomUtils {
-
-    /**
-     * Random object used by random method. This has to be not local to the
-     * random method so as to not return the same value in the same millisecond.
-     */
-    private static final Random RANDOM = new Random();
-
-    /**
-     * <p>
-     * {@code RandomUtils} instances should NOT be constructed in standard
-     * programming. Instead, the class should be used as
-     * {@code RandomUtils.nextBytes(5);}.
-     * </p>
-     * 
-     * <p>
-     * This constructor is public to permit tools that require a JavaBean
-     * instance to operate.
-     * </p>
-     */
-    public RandomUtils() {
-        super();
-    }
-
-    /**
-     * <p>
-     * Creates an array of random bytes.
-     * </p>
-     * 
-     * @param count
-     *            the size of the returned array
-     * @return the random byte array
-     * @throws IllegalArgumentException if {@code count} is negative
-     */
-    public static byte[] nextBytes(final int count) {
-        Validate.isTrue(count >= 0, "Count cannot be negative.");
-
-        final byte[] result = new byte[count];
-        RANDOM.nextBytes(result);
-        return result;
-    }
-
-    /**
-     * <p>
-     * Returns a random integer within the specified range.
-     * </p>
-     * 
-     * @param startInclusive
-     *            the smallest value that can be returned, must be non-negative
-     * @param endExclusive
-     *            the upper bound (not included)
-     * @throws IllegalArgumentException
-     *             if {@code startInclusive > endExclusive} or if
-     *             {@code startInclusive} is negative
-     * @return the random integer
-     */
-    public static int nextInt(final int startInclusive, final int endExclusive) {
-        Validate.isTrue(endExclusive >= startInclusive,
-                "Start value must be smaller or equal to end value.");
-        Validate.isTrue(startInclusive >= 0, "Both range values must be non-negative.");
-
-        if (startInclusive == endExclusive) {
-            return startInclusive;
-        }
-        
-        return startInclusive + RANDOM.nextInt(endExclusive - startInclusive);
-    }
-    
-    /**
-     * <p>
-     * Returns a random long within the specified range.
-     * </p>
-     * 
-     * @param startInclusive
-     *            the smallest value that can be returned, must be non-negative
-     * @param endExclusive
-     *            the upper bound (not included)
-     * @throws IllegalArgumentException
-     *             if {@code startInclusive > endExclusive} or if
-     *             {@code startInclusive} is negative
-     * @return the random long
-     */
-    public static long nextLong(final long startInclusive, final long endExclusive) {
-        Validate.isTrue(endExclusive >= startInclusive,
-                "Start value must be smaller or equal to end value.");
-        Validate.isTrue(startInclusive >= 0, "Both range values must be non-negative.");
-
-        if (startInclusive == endExclusive) {
-            return startInclusive;
-        }
-
-        return (long) nextDouble(startInclusive, endExclusive);
-    }    
-    
-    
-    /**
-     * <p> 
-     * Returns a random double within the specified range.
-     * </p>
-     * 
-     * @param startInclusive
-     *            the smallest value that can be returned, must be non-negative
-     * @param endInclusive
-     *            the upper bound (included)
-     * @throws IllegalArgumentException
-     *             if {@code startInclusive > endInclusive} or if
-     *             {@code startInclusive} is negative
-     * @return the random double
-     */
-    public static double nextDouble(final double startInclusive, final double endInclusive) {
-        Validate.isTrue(endInclusive >= startInclusive,
-                "Start value must be smaller or equal to end value.");
-        Validate.isTrue(startInclusive >= 0, "Both range values must be non-negative.");
-        
-        if (startInclusive == endInclusive) {
-            return startInclusive;
-        }
-        
-        return startInclusive + ((endInclusive - startInclusive) * RANDOM.nextDouble());
-    }
-    
-    /**
-     * <p>
-     * Returns a random float within the specified range.
-     * </p>
-     * 
-     * @param startInclusive
-     *            the smallest value that can be returned, must be non-negative
-     * @param endInclusive
-     *            the upper bound (included)
-     * @throws IllegalArgumentException
-     *             if {@code startInclusive > endInclusive} or if
-     *             {@code startInclusive} is negative
-     * @return the random float
-     */
-    public static float nextFloat(final float startInclusive, final float endInclusive) {
-        Validate.isTrue(endInclusive >= startInclusive,
-                "Start value must be smaller or equal to end value.");
-        Validate.isTrue(startInclusive >= 0, "Both range values must be non-negative.");
-        
-        if (startInclusive == endInclusive) {
-            return startInclusive;
-        }
-        
-        return startInclusive + ((endInclusive - startInclusive) * RANDOM.nextFloat());
-    }    
-}
diff --git a/lang/src/main/java/org/apache/commons/lang3/Range.java b/lang/src/main/java/org/apache/commons/lang3/Range.java
deleted file mode 100644
index 62d219c..0000000
--- a/lang/src/main/java/org/apache/commons/lang3/Range.java
+++ /dev/null
@@ -1,496 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.commons.lang3;
-
-import java.io.Serializable;
-import java.util.Comparator;
-
-/**
- * <p>An immutable range of objects from a minimum to maximum point inclusive.</p>
- * 
- * <p>The objects need to either be implementations of {@code Comparable}
- * or you need to supply a {@code Comparator}. </p>
- *
- * <p>#ThreadSafe# if the objects and comparator are thread-safe</p>
- * 
- * @since 3.0
- * @version $Id$
- */
-public final class Range<T> implements Serializable {
-
-    /**
-     * Serialization version.
-     * @see java.io.Serializable
-     */
-    private static final long serialVersionUID = 1L;
-
-    /**
-     * The ordering scheme used in this range.
-     */
-    private final Comparator<T> comparator;
-    /**
-     * The minimum value in this range (inclusive).
-     */
-    private final T minimum;
-    /**
-     * The maximum value in this range (inclusive).
-     */
-    private final T maximum;
-    /**
-     * Cached output hashCode (class is immutable).
-     */
-    private transient int hashCode;
-    /**
-     * Cached output toString (class is immutable).
-     */
-    private transient String toString;
-
-    /**
-     * <p>Obtains a range using the specified element as both the minimum
-     * and maximum in this range.</p>
-     * 
-     * <p>The range uses the natural ordering of the elements to determine where
-     * values lie in the range.</p>
-     *
-     * @param <T> the type of the elements in this range
-     * @param element  the value to use for this range, not null
-     * @return the range object, not null
-     * @throws IllegalArgumentException if the element is null
-     * @throws ClassCastException if the element is not {@code Comparable}
-     */
-    public static <T extends Comparable<T>> Range<T> is(final T element) {
-        return between(element, element, null);
-    }
-
-    /**
-     * <p>Obtains a range using the specified element as both the minimum
-     * and maximum in this range.</p>
-     * 
-     * <p>The range uses the specified {@code Comparator} to determine where
-     * values lie in the range.</p>
-     *
-     * @param <T> the type of the elements in this range
-     * @param element  the value to use for this range, must not be {@code null}
-     * @param comparator  the comparator to be used, null for natural ordering
-     * @return the range object, not null
-     * @throws IllegalArgumentException if the element is null
-     * @throws ClassCastException if using natural ordering and the elements are not {@code Comparable}
-     */
-    public static <T> Range<T> is(final T element, final Comparator<T> comparator) {
-        return between(element, element, comparator);
-    }
-
-    /**
-     * <p>Obtains a range with the specified minimum and maximum values (both inclusive).</p>
-     * 
-     * <p>The range uses the natural ordering of the elements to determine where
-     * values lie in the range.</p>
-     *
-     * <p>The arguments may be passed in the order (min,max) or (max,min).
-     * The getMinimum and getMaximum methods will return the correct values.</p>
-     *
-     * @param <T> the type of the elements in this range
-     * @param fromInclusive  the first value that defines the edge of the range, inclusive
-     * @param toInclusive  the second value that defines the edge of the range, inclusive
-     * @return the range object, not null
-     * @throws IllegalArgumentException if either element is null
-     * @throws ClassCastException if the elements are not {@code Comparable}
-     */
-    public static <T extends Comparable<T>> Range<T> between(final T fromInclusive, final T toInclusive) {
-        return between(fromInclusive, toInclusive, null);
-    }
-
-    /**
-     * <p>Obtains a range with the specified minimum and maximum values (both inclusive).</p>
-     * 
-     * <p>The range uses the specified {@code Comparator} to determine where
-     * values lie in the range.</p>
-     *
-     * <p>The arguments may be passed in the order (min,max) or (max,min).
-     * The getMinimum and getMaximum methods will return the correct values.</p>
-     *
-     * @param <T> the type of the elements in this range
-     * @param fromInclusive  the first value that defines the edge of the range, inclusive
-     * @param toInclusive  the second value that defines the edge of the range, inclusive
-     * @param comparator  the comparator to be used, null for natural ordering
-     * @return the range object, not null
-     * @throws IllegalArgumentException if either element is null
-     * @throws ClassCastException if using natural ordering and the elements are not {@code Comparable}
-     */
-    public static <T> Range<T> between(final T fromInclusive, final T toInclusive, final Comparator<T> comparator) {
-        return new Range<T>(fromInclusive, toInclusive, comparator);
-    }
-
-    /**
-     * Creates an instance.
-     *
-     * @param element1  the first element, not null
-     * @param element2  the second element, not null
-     * @param comp  the comparator to be used, null for natural ordering
-     */
-    @SuppressWarnings("unchecked")
-    private Range(final T element1, final T element2, final Comparator<T> comp) {
-        if (element1 == null || element2 == null) {
-            throw new IllegalArgumentException("Elements in a range must not be null: element1=" +
-                                               element1 + ", element2=" + element2);
-        }
-        if (comp == null) {
-            this.comparator = ComparableComparator.INSTANCE;
-        } else {
-            this.comparator = comp;            
-        }
-        if (this.comparator.compare(element1, element2) < 1) {
-            this.minimum = element1;
-            this.maximum = element2;
-        } else {
-            this.minimum = element2;
-            this.maximum = element1;
-        }
-    }
-
-    // Accessors
-    //--------------------------------------------------------------------
-
-    /**
-     * <p>Gets the minimum value in this range.</p>
-     *
-     * @return the minimum value in this range, not null
-     */
-    public T getMinimum() {
-        return minimum;
-    }
-
-    /**
-     * <p>Gets the maximum value in this range.</p>
-     *
-     * @return the maximum value in this range, not null
-     */
-    public T getMaximum() {
-        return maximum;
-    }
-
-    /**
-     * <p>Gets the comparator being used to determine if objects are within the range.</p>
-     * 
-     * <p>Natural ordering uses an internal comparator implementation, thus this
-     * method never returns null. See {@link #isNaturalOrdering()}.</p>
-     *
-     * @return the comparator being used, not null
-     */
-    public Comparator<T> getComparator() {
-        return comparator;
-    }
-
-    /**
-     * <p>Whether or not the Range is using the natural ordering of the elements.</p>
-     * 
-     * <p>Natural ordering uses an internal comparator implementation, thus this
-     * method is the only way to check if a null comparator was specified.</p>
-     *
-     * @return true if using natural ordering
-     */
-    public boolean isNaturalOrdering() {
-        return comparator == ComparableComparator.INSTANCE;
-    }
-
-    // Element tests
-    //--------------------------------------------------------------------
-
-    /**
-     * <p>Checks whether the specified element occurs within this range.</p>
-     *
-     * @param element  the element to check for, null returns false
-     * @return true if the specified element occurs within this range
-     */
-    public boolean contains(final T element) {
-        if (element == null) {
-            return false;
-        }
-        return comparator.compare(element, minimum) > -1 && comparator.compare(element, maximum) < 1;
-    }
-
-    /**
-     * <p>Checks whether this range is after the specified element.</p>
-     *
-     * @param element  the element to check for, null returns false
-     * @return true if this range is entirely after the specified element
-     */
-    public boolean isAfter(final T element) {
-        if (element == null) {
-            return false;
-        }
-        return comparator.compare(element, minimum) < 0;
-    }
-
-    /**
-     * <p>Checks whether this range starts with the specified element.</p>
-     *
-     * @param element  the element to check for, null returns false
-     * @return true if the specified element occurs within this range
-     */
-    public boolean isStartedBy(final T element) {
-        if (element == null) {
-            return false;
-        }
-        return comparator.compare(element, minimum) == 0;
-    }
-
-    /**
-     * <p>Checks whether this range starts with the specified element.</p>
-     *
-     * @param element  the element to check for, null returns false
-     * @return true if the specified element occurs within this range
-     */
-    public boolean isEndedBy(final T element) {
-        if (element == null) {
-            return false;
-        }
-        return comparator.compare(element, maximum) == 0;
-    }
-
-    /**
-     * <p>Checks whether this range is before the specified element.</p>
-     *
-     * @param element  the element to check for, null returns false
-     * @return true if this range is entirely before the specified element
-     */
-    public boolean isBefore(final T element) {
-        if (element == null) {
-            return false;
-        }
-        return comparator.compare(element, maximum) > 0;
-    }
-
-    /**
-     * <p>Checks where the specified element occurs relative to this range.</p>
-     * 
-     * <p>The API is reminiscent of the Comparable interface returning {@code -1} if
-     * the element is before the range, {@code 0} if contained within the range and
-     * {@code 1} if the element is after the range. </p>
-     *
-     * @param element  the element to check for, not null
-     * @return -1, 0 or +1 depending on the element's location relative to the range
-     */
-    public int elementCompareTo(final T element) {
-        if (element == null) {
-            // Comparable API says throw NPE on null
-            throw new NullPointerException("Element is null");
-        }
-        if (isAfter(element)) {
-            return -1;
-        } else if (isBefore(element)) {
-            return 1;
-        } else {
-            return 0;
-        }
-    }
-
-    // Range tests
-    //--------------------------------------------------------------------
-
-    /**
-     * <p>Checks whether this range contains all the elements of the specified range.</p>
-     *
-     * <p>This method may fail if the ranges have two different comparators or element types.</p>
-     *
-     * @param otherRange  the range to check, null returns false
-     * @return true if this range contains the specified range
-     * @throws RuntimeException if ranges cannot be compared
-     */
-    public boolean containsRange(final Range<T> otherRange) {
-        if (otherRange == null) {
-            return false;
-        }
-        return contains(otherRange.minimum)
-            && contains(otherRange.maximum);
-    }
-
-    /**
-     * <p>Checks whether this range is completely after the specified range.</p>
-     *
-     * <p>This method may fail if the ranges have two different comparators or element types.</p>
-     *
-     * @param otherRange  the range to check, null returns false
-     * @return true if this range is completely after the specified range
-     * @throws RuntimeException if ranges cannot be compared
-     */
-    public boolean isAfterRange(final Range<T> otherRange) {
-        if (otherRange == null) {
-            return false;
-        }
-        return isAfter(otherRange.maximum);
-    }
-
-    /**
-     * <p>Checks whether this range is overlapped by the specified range.</p>
-     * 
-     * <p>Two ranges overlap if there is at least one element in common.</p>
-     *
-     * <p>This method may fail if the ranges have two different comparators or element types.</p>
-     *
-     * @param otherRange  the range to test, null returns false
-     * @return true if the specified range overlaps with this
-     *  range; otherwise, {@code false}
-     * @throws RuntimeException if ranges cannot be compared
-     */
-    public boolean isOverlappedBy(final Range<T> otherRange) {
-        if (otherRange == null) {
-            return false;
-        }
-        return otherRange.contains(minimum)
-            || otherRange.contains(maximum)
-            || contains(otherRange.minimum);
-    }
-
-    /**
-     * <p>Checks whether this range is completely before the specified range.</p>
-     *
-     * <p>This method may fail if the ranges have two different comparators or element types.</p>
-     *
-     * @param otherRange  the range to check, null returns false
-     * @return true if this range is completely before the specified range
-     * @throws RuntimeException if ranges cannot be compared
-     */
-    public boolean isBeforeRange(final Range<T> otherRange) {
-        if (otherRange == null) {
-            return false;
-        }
-        return isBefore(otherRange.minimum);
-    }
-
-    /**
-     * Calculate the intersection of {@code this} and an overlapping Range.
-     * @param other overlapping Range
-     * @return range representing the intersection of {@code this} and {@code other} ({@code this} if equal)
-     * @throws IllegalArgumentException if {@code other} does not overlap {@code this}
-     * @since 3.0.1
-     */
-    public Range<T> intersectionWith(final Range<T> other) {
-        if (!this.isOverlappedBy(other)) {
-            throw new IllegalArgumentException(String.format(
-                "Cannot calculate intersection with non-overlapping range %s", other));
-        }
-        if (this.equals(other)) {
-            return this;
-        }
-        final T min = getComparator().compare(minimum, other.minimum) < 0 ? other.minimum : minimum;
-        final T max = getComparator().compare(maximum, other.maximum) < 0 ? maximum : other.maximum;
-        return between(min, max, getComparator());
-    }
-
-    // Basics
-    //--------------------------------------------------------------------
-
-    /**
-     * <p>Compares this range to another object to test if they are equal.</p>.
-     *
-     * <p>To be equal, the minimum and maximum values must be equal, which
-     * ignores any differences in the comparator.</p>
-     *
-     * @param obj the reference object with which to compare
-     * @return true if this object is equal
-     */
-    @Override
-    public boolean equals(final Object obj) {
-        if (obj == this) {
-            return true;
-        } else if (obj == null || obj.getClass() != getClass()) {
-            return false;
-        } else {
-            @SuppressWarnings("unchecked") // OK because we checked the class above
-            final
-            Range<T> range = (Range<T>) obj;
-            return minimum.equals(range.minimum) &&
-                   maximum.equals(range.maximum);
-        }
-    }
-
-    /**
-     * <p>Gets a suitable hash code for the range.</p>
-     *
-     * @return a hash code value for this object
-     */
-    @Override
-    public int hashCode() {
-        int result = hashCode;
-        if (hashCode == 0) {
-            result = 17;
-            result = 37 * result + getClass().hashCode();
-            result = 37 * result + minimum.hashCode();
-            result = 37 * result + maximum.hashCode();
-            hashCode = result;
-        }
-        return result;
-    }
-
-    /**
-     * <p>Gets the range as a {@code String}.</p>
-     *
-     * <p>The format of the String is '[<i>min</i>..<i>max</i>]'.</p>
-     *
-     * @return the {@code String} representation of this range
-     */
-    @Override
-    public String toString() {
-        String result = toString;
-        if (result == null) {
-            final StringBuilder buf = new StringBuilder(32);
-            buf.append('[');
-            buf.append(minimum);
-            buf.append("..");
-            buf.append(maximum);
-            buf.append(']');
-            result = buf.toString();
-            toString = result;
-        }
-        return result;
-    }
-
-    /**
-     * <p>Formats the receiver using the given format.</p>
-     * 
-     * <p>This uses {@link java.util.Formattable} to perform the formatting. Three variables may
-     * be used to embed the minimum, maximum and comparator.
-     * Use {@code %1$s} for the minimum element, {@code %2$s} for the maximum element
-     * and {@code %3$s} for the comparator.
-     * The default format used by {@code toString()} is {@code [%1$s..%2$s]}.</p>
-     * 
-     * @param format  the format string, optionally containing {@code %1$s}, {@code %2$s} and  {@code %3$s}, not null
-     * @return the formatted string, not null
-     */
-    public String toString(final String format) {
-        return String.format(format, minimum, maximum, comparator);
-    }
-
-    //-----------------------------------------------------------------------
-    @SuppressWarnings({"rawtypes", "unchecked"})
-    private enum ComparableComparator implements Comparator {
-        INSTANCE;
-        /**
-         * Comparable based compare implementation. 
-         *
-         * @param obj1 left hand side of comparison
-         * @param obj2 right hand side of comparison
-         * @return negative, 0, positive comparison value
-         */
-        @Override
-        public int compare(final Object obj1, final Object obj2) {
-            return ((Comparable) obj1).compareTo(obj2);
-        }
-    }
-
-}
diff --git a/lang/src/main/java/org/apache/commons/lang3/SerializationException.java b/lang/src/main/java/org/apache/commons/lang3/SerializationException.java
deleted file mode 100644
index 20e6cc4..0000000
--- a/lang/src/main/java/org/apache/commons/lang3/SerializationException.java
+++ /dev/null
@@ -1,78 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- * 
- *      http://www.apache.org/licenses/LICENSE-2.0
- * 
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.commons.lang3;
-
-/**
- * <p>Exception thrown when the Serialization process fails.</p>
- *
- * <p>The original error is wrapped within this one.</p>
- *
- * <p>#NotThreadSafe# because Throwable is not thread-safe</p>
- * @since 1.0
- * @version $Id$
- */
-public class SerializationException extends RuntimeException {
-
-    /**
-     * Required for serialization support.
-     * 
-     * @see java.io.Serializable
-     */
-    private static final long serialVersionUID = 4029025366392702726L;
-
-    /**
-     * <p>Constructs a new {@code SerializationException} without specified
-     * detail message.</p>
-     */
-    public SerializationException() {
-        super();
-    }
-
-    /**
-     * <p>Constructs a new {@code SerializationException} with specified
-     * detail message.</p>
-     *
-     * @param msg  The error message.
-     */
-    public SerializationException(final String msg) {
-        super(msg);
-    }
-
-    /**
-     * <p>Constructs a new {@code SerializationException} with specified
-     * nested {@code Throwable}.</p>
-     *
-     * @param cause  The {@code Exception} or {@code Error}
-     *  that caused this exception to be thrown.
-     */
-    public SerializationException(final Throwable cause) {
-        super(cause);
-    }
-
-    /**
-     * <p>Constructs a new {@code SerializationException} with specified
-     * detail message and nested {@code Throwable}.</p>
-     *
-     * @param msg    The error message.
-     * @param cause  The {@code Exception} or {@code Error}
-     *  that caused this exception to be thrown.
-     */
-    public SerializationException(final String msg, final Throwable cause) {
-        super(msg, cause);
-    }
-
-}
diff --git a/lang/src/main/java/org/apache/commons/lang3/SerializationUtils.java b/lang/src/main/java/org/apache/commons/lang3/SerializationUtils.java
deleted file mode 100644
index 175157c..0000000
--- a/lang/src/main/java/org/apache/commons/lang3/SerializationUtils.java
+++ /dev/null
@@ -1,338 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.commons.lang3;
-
-import java.io.ByteArrayInputStream;
-import java.io.ByteArrayOutputStream;
-import java.io.IOException;
-import java.io.InputStream;
-import java.io.ObjectInputStream;
-import java.io.ObjectOutputStream;
-import java.io.ObjectStreamClass;
-import java.io.OutputStream;
-import java.io.Serializable;
-import java.util.HashMap;
-import java.util.Map;
-
-/**
- * <p>Assists with the serialization process and performs additional functionality based
- * on serialization.</p>
- *
- * <ul>
- * <li>Deep clone using serialization
- * <li>Serialize managing finally and IOException
- * <li>Deserialize managing finally and IOException
- * </ul>
- *
- * <p>This class throws exceptions for invalid {@code null} inputs.
- * Each method documents its behaviour in more detail.</p>
- *
- * <p>#ThreadSafe#</p>
- * @since 1.0
- * @version $Id$
- */
-public class SerializationUtils {
-
-    /**
-     * <p>SerializationUtils instances should NOT be constructed in standard programming.
-     * Instead, the class should be used as {@code SerializationUtils.clone(object)}.</p>
-     *
-     * <p>This constructor is public to permit tools that require a JavaBean instance
-     * to operate.</p>
-     * @since 2.0
-     */
-    public SerializationUtils() {
-        super();
-    }
-
-    // Clone
-    //-----------------------------------------------------------------------
-    /**
-     * <p>Deep clone an {@code Object} using serialization.</p>
-     *
-     * <p>This is many times slower than writing clone methods by hand
-     * on all objects in your object graph. However, for complex object
-     * graphs, or for those that don't support deep cloning this can
-     * be a simple alternative implementation. Of course all the objects
-     * must be {@code Serializable}.</p>
-     *
-     * @param <T> the type of the object involved
-     * @param object  the {@code Serializable} object to clone
-     * @return the cloned object
-     * @throws SerializationException (runtime) if the serialization fails
-     */
-    public static <T extends Serializable> T clone(final T object) {
-        if (object == null) {
-            return null;
-        }
-        final byte[] objectData = serialize(object);
-        final ByteArrayInputStream bais = new ByteArrayInputStream(objectData);
-
-        ClassLoaderAwareObjectInputStream in = null;
-        try {
-            // stream closed in the finally
-            in = new ClassLoaderAwareObjectInputStream(bais, object.getClass().getClassLoader());
-            /*
-             * when we serialize and deserialize an object,
-             * it is reasonable to assume the deserialized object
-             * is of the same type as the original serialized object
-             */
-            @SuppressWarnings("unchecked") // see above
-            final T readObject = (T) in.readObject();
-            return readObject;
-
-        } catch (final ClassNotFoundException ex) {
-            throw new SerializationException("ClassNotFoundException while reading cloned object data", ex);
-        } catch (final IOException ex) {
-            throw new SerializationException("IOException while reading cloned object data", ex);
-        } finally {
-            try {
-                if (in != null) {
-                    in.close();
-                }
-            } catch (final IOException ex) {
-                throw new SerializationException("IOException on closing cloned object data InputStream.", ex);
-            }
-        }
-    }
-
-    /**
-     * Performs a serialization roundtrip. Serializes and deserializes the given object, great for testing objects that
-     * implement {@link Serializable}.
-     *
-     * @param <T>
-     *           the type of the object involved
-     * @param msg
-     *            the object to roundtrip
-     * @return the serialized and deseralized object
-     * @since 3.3
-     */
-    public static <T extends Serializable> T roundtrip(final T msg) {
-        return (T) SerializationUtils.deserialize(SerializationUtils.serialize(msg));
-    }
-
-    // Serialize
-    //-----------------------------------------------------------------------
-    /**
-     * <p>Serializes an {@code Object} to the specified stream.</p>
-     *
-     * <p>The stream will be closed once the object is written.
-     * This avoids the need for a finally clause, and maybe also exception
-     * handling, in the application code.</p>
-     *
-     * <p>The stream passed in is not buffered internally within this method.
-     * This is the responsibility of your application if desired.</p>
-     *
-     * @param obj  the object to serialize to bytes, may be null
-     * @param outputStream  the stream to write to, must not be null
-     * @throws IllegalArgumentException if {@code outputStream} is {@code null}
-     * @throws SerializationException (runtime) if the serialization fails
-     */
-    public static void serialize(final Serializable obj, final OutputStream outputStream) {
-        if (outputStream == null) {
-            throw new IllegalArgumentException("The OutputStream must not be null");
-        }
-        ObjectOutputStream out = null;
-        try {
-            // stream closed in the finally
-            out = new ObjectOutputStream(outputStream);
-            out.writeObject(obj);
-
-        } catch (final IOException ex) {
-            throw new SerializationException(ex);
-        } finally {
-            try {
-                if (out != null) {
-                    out.close();
-                }
-            } catch (final IOException ex) { // NOPMD
-                // ignore close exception
-            }
-        }
-    }
-
-    /**
-     * <p>Serializes an {@code Object} to a byte array for
-     * storage/serialization.</p>
-     *
-     * @param obj  the object to serialize to bytes
-     * @return a byte[] with the converted Serializable
-     * @throws SerializationException (runtime) if the serialization fails
-     */
-    public static byte[] serialize(final Serializable obj) {
-        final ByteArrayOutputStream baos = new ByteArrayOutputStream(512);
-        serialize(obj, baos);
-        return baos.toByteArray();
-    }
-
-    // Deserialize
-    //-----------------------------------------------------------------------
-    /**
-     * <p>
-     * Deserializes an {@code Object} from the specified stream.
-     * </p>
-     * 
-     * <p>
-     * The stream will be closed once the object is written. This avoids the need for a finally clause, and maybe also
-     * exception handling, in the application code.
-     * </p>
-     * 
-     * <p>
-     * The stream passed in is not buffered internally within this method. This is the responsibility of your
-     * application if desired.
-     * </p>
-     * 
-     * <p>
-     * If the call site incorrectly types the return value, a {@link ClassCastException} is thrown from the call site.
-     * Without Generics in this declaration, the call site must type cast and can cause the same ClassCastException.
-     * Note that in both cases, the ClassCastException is in the call site, not in this method.
-     * </p>
-     *
-     * @param <T>  the object type to be deserialized
-     * @param inputStream
-     *            the serialized object input stream, must not be null
-     * @return the deserialized object
-     * @throws IllegalArgumentException
-     *             if {@code inputStream} is {@code null}
-     * @throws SerializationException
-     *             (runtime) if the serialization fails
-     */
-    public static <T> T deserialize(final InputStream inputStream) {
-        if (inputStream == null) {
-            throw new IllegalArgumentException("The InputStream must not be null");
-        }
-        ObjectInputStream in = null;
-        try {
-            // stream closed in the finally
-            in = new ObjectInputStream(inputStream);
-            @SuppressWarnings("unchecked") // may fail with CCE if serialised form is incorrect
-            final T obj = (T) in.readObject();
-            return obj;
-
-        } catch (final ClassCastException ex) {
-            throw new SerializationException(ex);
-        } catch (final ClassNotFoundException ex) {
-            throw new SerializationException(ex);
-        } catch (final IOException ex) {
-            throw new SerializationException(ex);
-        } finally {
-            try {
-                if (in != null) {
-                    in.close();
-                }
-            } catch (final IOException ex) { // NOPMD
-                // ignore close exception
-            }
-        }
-    }
-
-    /**
-     * <p>
-     * Deserializes a single {@code Object} from an array of bytes.
-     * </p>
-     * 
-     * <p>
-     * If the call site incorrectly types the return value, a {@link ClassCastException} is thrown from the call site.
-     * Without Generics in this declaration, the call site must type cast and can cause the same ClassCastException.
-     * Note that in both cases, the ClassCastException is in the call site, not in this method.
-     * </p>
-     * 
-     * @param <T>  the object type to be deserialized
-     * @param objectData
-     *            the serialized object, must not be null
-     * @return the deserialized object
-     * @throws IllegalArgumentException
-     *             if {@code objectData} is {@code null}
-     * @throws SerializationException
-     *             (runtime) if the serialization fails
-     */
-    public static <T> T deserialize(final byte[] objectData) {
-        if (objectData == null) {
-            throw new IllegalArgumentException("The byte[] must not be null");
-        }
-        return SerializationUtils.<T>deserialize(new ByteArrayInputStream(objectData));
-    }
-
-    /**
-     * <p>Custom specialization of the standard JDK {@link java.io.ObjectInputStream}
-     * that uses a custom  <code>ClassLoader</code> to resolve a class.
-     * If the specified <code>ClassLoader</code> is not able to resolve the class,
-     * the context classloader of the current thread will be used.
-     * This way, the standard deserialization work also in web-application
-     * containers and application servers, no matter in which of the
-     * <code>ClassLoader</code> the particular class that encapsulates
-     * serialization/deserialization lives. </p>
-     * 
-     * <p>For more in-depth information about the problem for which this
-     * class here is a workaround, see the JIRA issue LANG-626. </p>
-     */
-     static class ClassLoaderAwareObjectInputStream extends ObjectInputStream {
-        private static final Map<String, Class<?>> primitiveTypes = 
-                new HashMap<String, Class<?>>();
-        private final ClassLoader classLoader;
-        
-        /**
-         * Constructor.
-         * @param in The <code>InputStream</code>.
-         * @param classLoader classloader to use
-         * @throws IOException if an I/O error occurs while reading stream header.
-         * @see java.io.ObjectInputStream
-         */
-        public ClassLoaderAwareObjectInputStream(final InputStream in, final ClassLoader classLoader) throws IOException {
-            super(in);
-            this.classLoader = classLoader;
-
-            primitiveTypes.put("byte", byte.class);
-            primitiveTypes.put("short", short.class);
-            primitiveTypes.put("int", int.class);
-            primitiveTypes.put("long", long.class);
-            primitiveTypes.put("float", float.class);
-            primitiveTypes.put("double", double.class);
-            primitiveTypes.put("boolean", boolean.class);
-            primitiveTypes.put("char", char.class);
-            primitiveTypes.put("void", void.class);
-        }
-
-        /**
-         * Overriden version that uses the parametrized <code>ClassLoader</code> or the <code>ClassLoader</code>
-         * of the current <code>Thread</code> to resolve the class.
-         * @param desc An instance of class <code>ObjectStreamClass</code>.
-         * @return A <code>Class</code> object corresponding to <code>desc</code>.
-         * @throws IOException Any of the usual Input/Output exceptions.
-         * @throws ClassNotFoundException If class of a serialized object cannot be found.
-         */
-        @Override
-        protected Class<?> resolveClass(final ObjectStreamClass desc) throws IOException, ClassNotFoundException {
-            final String name = desc.getName();
-            try {
-                return Class.forName(name, false, classLoader);
-            } catch (final ClassNotFoundException ex) {
-                try {
-                    return Class.forName(name, false, Thread.currentThread().getContextClassLoader());
-                } catch (final ClassNotFoundException cnfe) {
-                    final Class<?> cls = primitiveTypes.get(name);
-                    if (cls != null) {
-                        return cls;
-                    }
-                    throw cnfe;
-                }
-            }
-        }
-
-    }
-
-}
diff --git a/lang/src/main/java/org/apache/commons/lang3/StringEscapeUtils.java b/lang/src/main/java/org/apache/commons/lang3/StringEscapeUtils.java
deleted file mode 100644
index da19c00..0000000
--- a/lang/src/main/java/org/apache/commons/lang3/StringEscapeUtils.java
+++ /dev/null
@@ -1,805 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- * 
- *      http://www.apache.org/licenses/LICENSE-2.0
- * 
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.commons.lang3;
-
-import java.io.IOException;
-import java.io.Writer;
-
-import org.apache.commons.lang3.text.translate.AggregateTranslator;
-import org.apache.commons.lang3.text.translate.CharSequenceTranslator;
-import org.apache.commons.lang3.text.translate.EntityArrays;
-import org.apache.commons.lang3.text.translate.JavaUnicodeEscaper;
-import org.apache.commons.lang3.text.translate.LookupTranslator;
-import org.apache.commons.lang3.text.translate.NumericEntityEscaper;
-import org.apache.commons.lang3.text.translate.NumericEntityUnescaper;
-import org.apache.commons.lang3.text.translate.OctalUnescaper;
-import org.apache.commons.lang3.text.translate.UnicodeUnescaper;
-import org.apache.commons.lang3.text.translate.UnicodeUnpairedSurrogateRemover;
-
-/**
- * <p>Escapes and unescapes {@code String}s for
- * Java, Java Script, HTML and XML.</p>
- *
- * <p>#ThreadSafe#</p>
- * @since 2.0
- * @version $Id$
- */
-public class StringEscapeUtils {
-
-    /* ESCAPE TRANSLATORS */
-
-    /**
-     * Translator object for escaping Java. 
-     * 
-     * While {@link #escapeJava(String)} is the expected method of use, this 
-     * object allows the Java escaping functionality to be used 
-     * as the foundation for a custom translator. 
-     *
-     * @since 3.0
-     */
-    public static final CharSequenceTranslator ESCAPE_JAVA = 
-          new LookupTranslator(
-            new String[][] { 
-              {"\"", "\\\""},
-              {"\\", "\\\\"},
-          }).with(
-            new LookupTranslator(EntityArrays.JAVA_CTRL_CHARS_ESCAPE())
-          ).with(
-            JavaUnicodeEscaper.outsideOf(32, 0x7f) 
-        );
-
-    /**
-     * Translator object for escaping EcmaScript/JavaScript. 
-     * 
-     * While {@link #escapeEcmaScript(String)} is the expected method of use, this 
-     * object allows the EcmaScript escaping functionality to be used 
-     * as the foundation for a custom translator. 
-     *
-     * @since 3.0
-     */
-    public static final CharSequenceTranslator ESCAPE_ECMASCRIPT = 
-        new AggregateTranslator(
-            new LookupTranslator(
-                      new String[][] { 
-                            {"'", "\\'"},
-                            {"\"", "\\\""},
-                            {"\\", "\\\\"},
-                            {"/", "\\/"}
-                      }),
-            new LookupTranslator(EntityArrays.JAVA_CTRL_CHARS_ESCAPE()),
-            JavaUnicodeEscaper.outsideOf(32, 0x7f) 
-        );
-
-    /**
-     * Translator object for escaping Json.
-     *
-     * While {@link #escapeJson(String)} is the expected method of use, this
-     * object allows the Json escaping functionality to be used
-     * as the foundation for a custom translator.
-     *
-     * @since 3.2
-     */
-    public static final CharSequenceTranslator ESCAPE_JSON =
-        new AggregateTranslator(
-            new LookupTranslator(
-                      new String[][] {
-                            {"\"", "\\\""},
-                            {"\\", "\\\\"},
-                            {"/", "\\/"}
-                      }),
-            new LookupTranslator(EntityArrays.JAVA_CTRL_CHARS_ESCAPE()),
-            JavaUnicodeEscaper.outsideOf(32, 0x7f)
-        );
-
-    /**
-     * Translator object for escaping XML.
-     * 
-     * While {@link #escapeXml(String)} is the expected method of use, this 
-     * object allows the XML escaping functionality to be used 
-     * as the foundation for a custom translator. 
-     *
-     * @since 3.0
-     * @deprecated use {@link #ESCAPE_XML10} or {@link #ESCAPE_XML11} instead.
-     */
-    @Deprecated
-    public static final CharSequenceTranslator ESCAPE_XML = 
-        new AggregateTranslator(
-            new LookupTranslator(EntityArrays.BASIC_ESCAPE()),
-            new LookupTranslator(EntityArrays.APOS_ESCAPE())
-        );
-    
-    /**
-     * Translator object for escaping XML 1.0.
-     * 
-     * While {@link #escapeXml10(String)} is the expected method of use, this
-     * object allows the XML escaping functionality to be used
-     * as the foundation for a custom translator.
-     *
-     * @since 3.3
-     */
-    public static final CharSequenceTranslator ESCAPE_XML10 =
-        new AggregateTranslator(
-            new LookupTranslator(EntityArrays.BASIC_ESCAPE()),
-            new LookupTranslator(EntityArrays.APOS_ESCAPE()),
-            new LookupTranslator(
-                    new String[][] {
-                            { "\u0000", "" },
-                            { "\u0001", "" },
-                            { "\u0002", "" },
-                            { "\u0003", "" },
-                            { "\u0004", "" },
-                            { "\u0005", "" },
-                            { "\u0006", "" },
-                            { "\u0007", "" },
-                            { "\u0008", "" },
-                            { "\u000b", "" },
-                            { "\u000c", "" },
-                            { "\u000e", "" },
-                            { "\u000f", "" },
-                            { "\u0010", "" },
-                            { "\u0011", "" },
-                            { "\u0012", "" },
-                            { "\u0013", "" },
-                            { "\u0014", "" },
-                            { "\u0015", "" },
-                            { "\u0016", "" },
-                            { "\u0017", "" },
-                            { "\u0018", "" },
-                            { "\u0019", "" },
-                            { "\u001a", "" },
-                            { "\u001b", "" },
-                            { "\u001c", "" },
-                            { "\u001d", "" },
-                            { "\u001e", "" },
-                            { "\u001f", "" },
-                            { "\ufffe", "" },
-                            { "\uffff", "" }
-                    }),
-            NumericEntityEscaper.between(0x7f, 0x84),
-            NumericEntityEscaper.between(0x86, 0x9f),
-            new UnicodeUnpairedSurrogateRemover()
-        );
-    
-    /**
-     * Translator object for escaping XML 1.1.
-     * 
-     * While {@link #escapeXml11(String)} is the expected method of use, this
-     * object allows the XML escaping functionality to be used
-     * as the foundation for a custom translator.
-     *
-     * @since 3.3
-     */
-    public static final CharSequenceTranslator ESCAPE_XML11 =
-        new AggregateTranslator(
-            new LookupTranslator(EntityArrays.BASIC_ESCAPE()),
-            new LookupTranslator(EntityArrays.APOS_ESCAPE()),
-            new LookupTranslator(
-                    new String[][] {
-                            { "\u0000", "" },
-                            { "\u000b", "&#11;" },
-                            { "\u000c", "&#12;" },
-                            { "\ufffe", "" },
-                            { "\uffff", "" }
-                    }),
-            NumericEntityEscaper.between(0x1, 0x8),
-            NumericEntityEscaper.between(0xe, 0x1f),
-            NumericEntityEscaper.between(0x7f, 0x84),
-            NumericEntityEscaper.between(0x86, 0x9f),
-            new UnicodeUnpairedSurrogateRemover()
-        );
-
-    /**
-     * Translator object for escaping HTML version 3.0.
-     * 
-     * While {@link #escapeHtml3(String)} is the expected method of use, this 
-     * object allows the HTML escaping functionality to be used 
-     * as the foundation for a custom translator. 
-     *
-     * @since 3.0
-     */
-    public static final CharSequenceTranslator ESCAPE_HTML3 = 
-        new AggregateTranslator(
-            new LookupTranslator(EntityArrays.BASIC_ESCAPE()),
-            new LookupTranslator(EntityArrays.ISO8859_1_ESCAPE())
-        );
-
-    /**
-     * Translator object for escaping HTML version 4.0.
-     * 
-     * While {@link #escapeHtml4(String)} is the expected method of use, this 
-     * object allows the HTML escaping functionality to be used 
-     * as the foundation for a custom translator. 
-     *
-     * @since 3.0
-     */
-    public static final CharSequenceTranslator ESCAPE_HTML4 = 
-        new AggregateTranslator(
-            new LookupTranslator(EntityArrays.BASIC_ESCAPE()),
-            new LookupTranslator(EntityArrays.ISO8859_1_ESCAPE()),
-            new LookupTranslator(EntityArrays.HTML40_EXTENDED_ESCAPE())
-        );
-
-    /**
-     * Translator object for escaping individual Comma Separated Values. 
-     * 
-     * While {@link #escapeCsv(String)} is the expected method of use, this 
-     * object allows the CSV escaping functionality to be used 
-     * as the foundation for a custom translator. 
-     *
-     * @since 3.0
-     */
-    public static final CharSequenceTranslator ESCAPE_CSV = new CsvEscaper();
-
-    // TODO: Create a parent class - 'SinglePassTranslator' ?
-    //       It would handle the index checking + length returning, 
-    //       and could also have an optimization check method.
-    static class CsvEscaper extends CharSequenceTranslator {
-
-        private static final char CSV_DELIMITER = ',';
-        private static final char CSV_QUOTE = '"';
-        private static final String CSV_QUOTE_STR = String.valueOf(CSV_QUOTE);
-        private static final char[] CSV_SEARCH_CHARS = 
-            new char[] {CSV_DELIMITER, CSV_QUOTE, CharUtils.CR, CharUtils.LF};
-
-        @Override
-        public int translate(final CharSequence input, final int index, final Writer out) throws IOException {
-
-            if(index != 0) {
-                throw new IllegalStateException("CsvEscaper should never reach the [1] index");
-            }
-
-            if (StringUtils.containsNone(input.toString(), CSV_SEARCH_CHARS)) {
-                out.write(input.toString());
-            } else {
-                out.write(CSV_QUOTE);
-                out.write(StringUtils.replace(input.toString(), CSV_QUOTE_STR, CSV_QUOTE_STR + CSV_QUOTE_STR));
-                out.write(CSV_QUOTE);
-            }
-            return Character.codePointCount(input, 0, input.length());
-        }
-    }
-
-    /* UNESCAPE TRANSLATORS */
-
-    /**
-     * Translator object for unescaping escaped Java. 
-     * 
-     * While {@link #unescapeJava(String)} is the expected method of use, this 
-     * object allows the Java unescaping functionality to be used 
-     * as the foundation for a custom translator. 
-     *
-     * @since 3.0
-     */
-    // TODO: throw "illegal character: \92" as an Exception if a \ on the end of the Java (as per the compiler)?
-    public static final CharSequenceTranslator UNESCAPE_JAVA = 
-        new AggregateTranslator(
-            new OctalUnescaper(),     // .between('\1', '\377'),
-            new UnicodeUnescaper(),
-            new LookupTranslator(EntityArrays.JAVA_CTRL_CHARS_UNESCAPE()),
-            new LookupTranslator(
-                      new String[][] { 
-                            {"\\\\", "\\"},
-                            {"\\\"", "\""},
-                            {"\\'", "'"},
-                            {"\\", ""}
-                      })
-        );
-
-    /**
-     * Translator object for unescaping escaped EcmaScript. 
-     * 
-     * While {@link #unescapeEcmaScript(String)} is the expected method of use, this 
-     * object allows the EcmaScript unescaping functionality to be used 
-     * as the foundation for a custom translator. 
-     *
-     * @since 3.0
-     */
-    public static final CharSequenceTranslator UNESCAPE_ECMASCRIPT = UNESCAPE_JAVA;
-
-    /**
-     * Translator object for unescaping escaped Json.
-     *
-     * While {@link #unescapeJson(String)} is the expected method of use, this
-     * object allows the Json unescaping functionality to be used
-     * as the foundation for a custom translator.
-     *
-     * @since 3.2
-     */
-    public static final CharSequenceTranslator UNESCAPE_JSON = UNESCAPE_JAVA;
-
-    /**
-     * Translator object for unescaping escaped HTML 3.0. 
-     * 
-     * While {@link #unescapeHtml3(String)} is the expected method of use, this 
-     * object allows the HTML unescaping functionality to be used 
-     * as the foundation for a custom translator. 
-     *
-     * @since 3.0
-     */
-    public static final CharSequenceTranslator UNESCAPE_HTML3 = 
-        new AggregateTranslator(
-            new LookupTranslator(EntityArrays.BASIC_UNESCAPE()),
-            new LookupTranslator(EntityArrays.ISO8859_1_UNESCAPE()),
-            new NumericEntityUnescaper()
-        );
-
-    /**
-     * Translator object for unescaping escaped HTML 4.0. 
-     * 
-     * While {@link #unescapeHtml4(String)} is the expected method of use, this 
-     * object allows the HTML unescaping functionality to be used 
-     * as the foundation for a custom translator. 
-     *
-     * @since 3.0
-     */
-    public static final CharSequenceTranslator UNESCAPE_HTML4 = 
-        new AggregateTranslator(
-            new LookupTranslator(EntityArrays.BASIC_UNESCAPE()),
-            new LookupTranslator(EntityArrays.ISO8859_1_UNESCAPE()),
-            new LookupTranslator(EntityArrays.HTML40_EXTENDED_UNESCAPE()),
-            new NumericEntityUnescaper()
-        );
-
-    /**
-     * Translator object for unescaping escaped XML.
-     * 
-     * While {@link #unescapeXml(String)} is the expected method of use, this 
-     * object allows the XML unescaping functionality to be used 
-     * as the foundation for a custom translator. 
-     *
-     * @since 3.0
-     */
-    public static final CharSequenceTranslator UNESCAPE_XML = 
-        new AggregateTranslator(
-            new LookupTranslator(EntityArrays.BASIC_UNESCAPE()),
-            new LookupTranslator(EntityArrays.APOS_UNESCAPE()),
-            new NumericEntityUnescaper()
-        );
-
-    /**
-     * Translator object for unescaping escaped Comma Separated Value entries.
-     * 
-     * While {@link #unescapeCsv(String)} is the expected method of use, this 
-     * object allows the CSV unescaping functionality to be used 
-     * as the foundation for a custom translator. 
-     *
-     * @since 3.0
-     */
-    public static final CharSequenceTranslator UNESCAPE_CSV = new CsvUnescaper();
-
-    static class CsvUnescaper extends CharSequenceTranslator {
-
-        private static final char CSV_DELIMITER = ',';
-        private static final char CSV_QUOTE = '"';
-        private static final String CSV_QUOTE_STR = String.valueOf(CSV_QUOTE);
-        private static final char[] CSV_SEARCH_CHARS = 
-            new char[] {CSV_DELIMITER, CSV_QUOTE, CharUtils.CR, CharUtils.LF};
-
-        @Override
-        public int translate(final CharSequence input, final int index, final Writer out) throws IOException {
-
-            if(index != 0) {
-                throw new IllegalStateException("CsvUnescaper should never reach the [1] index");
-            }
-
-            if ( input.charAt(0) != CSV_QUOTE || input.charAt(input.length() - 1) != CSV_QUOTE ) {
-                out.write(input.toString());
-                return Character.codePointCount(input, 0, input.length());
-            }
-
-            // strip quotes
-            final String quoteless = input.subSequence(1, input.length() - 1).toString();
-
-            if ( StringUtils.containsAny(quoteless, CSV_SEARCH_CHARS) ) {
-                // deal with escaped quotes; ie) ""
-                out.write(StringUtils.replace(quoteless, CSV_QUOTE_STR + CSV_QUOTE_STR, CSV_QUOTE_STR));
-            } else {
-                out.write(input.toString());
-            }
-            return Character.codePointCount(input, 0, input.length());
-        }
-    }
-
-    /* Helper functions */
-
-    /**
-     * <p>{@code StringEscapeUtils} instances should NOT be constructed in
-     * standard programming.</p>
-     *
-     * <p>Instead, the class should be used as:</p>
-     * <pre>StringEscapeUtils.escapeJava("foo");</pre>
-     *
-     * <p>This constructor is public to permit tools that require a JavaBean
-     * instance to operate.</p>
-     */
-    public StringEscapeUtils() {
-      super();
-    }
-
-    // Java and JavaScript
-    //--------------------------------------------------------------------------
-    /**
-     * <p>Escapes the characters in a {@code String} using Java String rules.</p>
-     *
-     * <p>Deals correctly with quotes and control-chars (tab, backslash, cr, ff, etc.) </p>
-     *
-     * <p>So a tab becomes the characters {@code '\\'} and
-     * {@code 't'}.</p>
-     *
-     * <p>The only difference between Java strings and JavaScript strings
-     * is that in JavaScript, a single quote and forward-slash (/) are escaped.</p>
-     *
-     * <p>Example:</p>
-     * <pre>
-     * input string: He didn't say, "Stop!"
-     * output string: He didn't say, \"Stop!\"
-     * </pre>
-     *
-     * @param input  String to escape values in, may be null
-     * @return String with escaped values, {@code null} if null string input
-     */
-    public static final String escapeJava(final String input) {
-        return ESCAPE_JAVA.translate(input);
-    }
-
-    /**
-     * <p>Escapes the characters in a {@code String} using EcmaScript String rules.</p>
-     * <p>Escapes any values it finds into their EcmaScript String form.
-     * Deals correctly with quotes and control-chars (tab, backslash, cr, ff, etc.) </p>
-     *
-     * <p>So a tab becomes the characters {@code '\\'} and
-     * {@code 't'}.</p>
-     *
-     * <p>The only difference between Java strings and EcmaScript strings
-     * is that in EcmaScript, a single quote and forward-slash (/) are escaped.</p>
-     *
-     * <p>Note that EcmaScript is best known by the JavaScript and ActionScript dialects. </p>
-     *
-     * <p>Example:</p>
-     * <pre>
-     * input string: He didn't say, "Stop!"
-     * output string: He didn\'t say, \"Stop!\"
-     * </pre>
-     *
-     * @param input  String to escape values in, may be null
-     * @return String with escaped values, {@code null} if null string input
-     *
-     * @since 3.0
-     */
-    public static final String escapeEcmaScript(final String input) {
-        return ESCAPE_ECMASCRIPT.translate(input);
-    }
-
-    /**
-     * <p>Escapes the characters in a {@code String} using Json String rules.</p>
-     * <p>Escapes any values it finds into their Json String form.
-     * Deals correctly with quotes and control-chars (tab, backslash, cr, ff, etc.) </p>
-     *
-     * <p>So a tab becomes the characters {@code '\\'} and
-     * {@code 't'}.</p>
-     *
-     * <p>The only difference between Java strings and Json strings
-     * is that in Json, forward-slash (/) is escaped.</p>
-     *
-     * <p>See http://www.ietf.org/rfc/rfc4627.txt for further details. </p>
-     *
-     * <p>Example:</p>
-     * <pre>
-     * input string: He didn't say, "Stop!"
-     * output string: He didn't say, \"Stop!\"
-     * </pre>
-     *
-     * @param input  String to escape values in, may be null
-     * @return String with escaped values, {@code null} if null string input
-     *
-     * @since 3.2
-     */
-    public static final String escapeJson(final String input) {
-        return ESCAPE_JSON.translate(input);
-    }
-
-    /**
-     * <p>Unescapes any Java literals found in the {@code String}.
-     * For example, it will turn a sequence of {@code '\'} and
-     * {@code 'n'} into a newline character, unless the {@code '\'}
-     * is preceded by another {@code '\'}.</p>
-     * 
-     * @param input  the {@code String} to unescape, may be null
-     * @return a new unescaped {@code String}, {@code null} if null string input
-     */
-    public static final String unescapeJava(final String input) {
-        return UNESCAPE_JAVA.translate(input);
-    }
-
-    /**
-     * <p>Unescapes any EcmaScript literals found in the {@code String}.</p>
-     *
-     * <p>For example, it will turn a sequence of {@code '\'} and {@code 'n'}
-     * into a newline character, unless the {@code '\'} is preceded by another
-     * {@code '\'}.</p>
-     *
-     * @see #unescapeJava(String)
-     * @param input  the {@code String} to unescape, may be null
-     * @return A new unescaped {@code String}, {@code null} if null string input
-     *
-     * @since 3.0
-     */
-    public static final String unescapeEcmaScript(final String input) {
-        return UNESCAPE_ECMASCRIPT.translate(input);
-    }
-
-    /**
-     * <p>Unescapes any Json literals found in the {@code String}.</p>
-     *
-     * <p>For example, it will turn a sequence of {@code '\'} and {@code 'n'}
-     * into a newline character, unless the {@code '\'} is preceded by another
-     * {@code '\'}.</p>
-     *
-     * @see #unescapeJava(String)
-     * @param input  the {@code String} to unescape, may be null
-     * @return A new unescaped {@code String}, {@code null} if null string input
-     *
-     * @since 3.2
-     */
-    public static final String unescapeJson(final String input) {
-        return UNESCAPE_JSON.translate(input);
-    }
-
-    // HTML and XML
-    //--------------------------------------------------------------------------
-    /**
-     * <p>Escapes the characters in a {@code String} using HTML entities.</p>
-     *
-     * <p>
-     * For example:
-     * </p> 
-     * <p><code>"bread" &amp; "butter"</code></p>
-     * becomes:
-     * <p>
-     * <code>&amp;quot;bread&amp;quot; &amp;amp; &amp;quot;butter&amp;quot;</code>.
-     * </p>
-     *
-     * <p>Supports all known HTML 4.0 entities, including funky accents.
-     * Note that the commonly used apostrophe escape character (&amp;apos;)
-     * is not a legal entity and so is not supported). </p>
-     *
-     * @param input  the {@code String} to escape, may be null
-     * @return a new escaped {@code String}, {@code null} if null string input
-     * 
-     * @see <a href="http://hotwired.lycos.com/webmonkey/reference/special_characters/">ISO Entities</a>
-     * @see <a href="http://www.w3.org/TR/REC-html32#latin1">HTML 3.2 Character Entities for ISO Latin-1</a>
-     * @see <a href="http://www.w3.org/TR/REC-html40/sgml/entities.html">HTML 4.0 Character entity references</a>
-     * @see <a href="http://www.w3.org/TR/html401/charset.html#h-5.3">HTML 4.01 Character References</a>
-     * @see <a href="http://www.w3.org/TR/html401/charset.html#code-position">HTML 4.01 Code positions</a>
-     * 
-     * @since 3.0
-     */
-    public static final String escapeHtml4(final String input) {
-        return ESCAPE_HTML4.translate(input);
-    }
-
-    /**
-     * <p>Escapes the characters in a {@code String} using HTML entities.</p>
-     * <p>Supports only the HTML 3.0 entities. </p>
-     *
-     * @param input  the {@code String} to escape, may be null
-     * @return a new escaped {@code String}, {@code null} if null string input
-     * 
-     * @since 3.0
-     */
-    public static final String escapeHtml3(final String input) {
-        return ESCAPE_HTML3.translate(input);
-    }
-
-    //-----------------------------------------------------------------------
-    /**
-     * <p>Unescapes a string containing entity escapes to a string
-     * containing the actual Unicode characters corresponding to the
-     * escapes. Supports HTML 4.0 entities.</p>
-     *
-     * <p>For example, the string {@code "&lt;Fran&ccedil;ais&gt;"}
-     * will become {@code "<Français>"}</p>
-     *
-     * <p>If an entity is unrecognized, it is left alone, and inserted
-     * verbatim into the result string. e.g. {@code "&gt;&zzzz;x"} will
-     * become {@code ">&zzzz;x"}.</p>
-     *
-     * @param input  the {@code String} to unescape, may be null
-     * @return a new unescaped {@code String}, {@code null} if null string input
-     * 
-     * @since 3.0
-     */
-    public static final String unescapeHtml4(final String input) {
-        return UNESCAPE_HTML4.translate(input);
-    }
-
-    /**
-     * <p>Unescapes a string containing entity escapes to a string
-     * containing the actual Unicode characters corresponding to the
-     * escapes. Supports only HTML 3.0 entities.</p>
-     *
-     * @param input  the {@code String} to unescape, may be null
-     * @return a new unescaped {@code String}, {@code null} if null string input
-     * 
-     * @since 3.0
-     */
-    public static final String unescapeHtml3(final String input) {
-        return UNESCAPE_HTML3.translate(input);
-    }
-
-    //-----------------------------------------------------------------------
-    /**
-     * <p>Escapes the characters in a {@code String} using XML entities.</p>
-     *
-     * <p>For example: {@code "bread" & "butter"} =&gt;
-     * {@code &quot;bread&quot; &amp; &quot;butter&quot;}.
-     * </p>
-     *
-     * <p>Supports only the five basic XML entities (gt, lt, quot, amp, apos).
-     * Does not support DTDs or external entities.</p>
-     *
-     * <p>Note that Unicode characters greater than 0x7f are as of 3.0, no longer 
-     *    escaped. If you still wish this functionality, you can achieve it 
-     *    via the following: 
-     * {@code StringEscapeUtils.ESCAPE_XML.with( NumericEntityEscaper.between(0x7f, Integer.MAX_VALUE) );}</p>
-     *
-     * @param input  the {@code String} to escape, may be null
-     * @return a new escaped {@code String}, {@code null} if null string input
-     * @see #unescapeXml(java.lang.String)
-     * @deprecated use {@link #escapeXml10(java.lang.String)} or {@link #escapeXml11(java.lang.String)} instead.
-     */
-    @Deprecated
-    public static final String escapeXml(final String input) {
-        return ESCAPE_XML.translate(input);
-    }
-
-    /**
-     * <p>Escapes the characters in a {@code String} using XML entities.</p>
-     *
-     * <p>For example: {@code "bread" & "butter"} =&gt;
-     * {@code &quot;bread&quot; &amp; &quot;butter&quot;}.
-     * </p>
-     *
-     * <p>Note that XML 1.0 is a text-only format: it cannot represent control
-     * characters or unpaired Unicode surrogate codepoints, even after escaping.
-     * {@code escapeXml10} will remove characters that do not fit in the
-     * following ranges:</p>
-     * 
-     * <p>{@code #x9 | #xA | #xD | [#x20-#xD7FF] | [#xE000-#xFFFD] | [#x10000-#x10FFFF]}</p>
-     * 
-     * <p>Though not strictly necessary, {@code escapeXml10} will escape
-     * characters in the following ranges:</p>
-     * 
-     * <p>{@code [#x7F-#x84] | [#x86-#x9F]}</p>
-     * 
-     * <p>The returned string can be inserted into a valid XML 1.0 or XML 1.1
-     * document. If you want to allow more non-text characters in an XML 1.1
-     * document, use {@link #escapeXml11(String)}.</p>
-     *
-     * @param input  the {@code String} to escape, may be null
-     * @return a new escaped {@code String}, {@code null} if null string input
-     * @see #unescapeXml(java.lang.String)
-     * @since 3.3
-     */
-    public static String escapeXml10(final String input) {
-        return ESCAPE_XML10.translate(input);
-    }
-    
-    /**
-     * <p>Escapes the characters in a {@code String} using XML entities.</p>
-     *
-     * <p>For example: {@code "bread" & "butter"} =&gt;
-     * {@code &quot;bread&quot; &amp; &quot;butter&quot;}.
-     * </p>
-     *
-     * <p>XML 1.1 can represent certain control characters, but it cannot represent
-     * the null byte or unpaired Unicode surrogate codepoints, even after escaping.
-     * {@code escapeXml11} will remove characters that do not fit in the following
-     * ranges:</p>
-     * 
-     * <p>{@code [#x1-#xD7FF] | [#xE000-#xFFFD] | [#x10000-#x10FFFF]}</p>
-     * 
-     * <p>{@code escapeXml11} will escape characters in the following ranges:</p>
-     * 
-     * <p>{@code [#x1-#x8] | [#xB-#xC] | [#xE-#x1F] | [#x7F-#x84] | [#x86-#x9F]}</p>
-     * 
-     * <p>The returned string can be inserted into a valid XML 1.1 document. Do not
-     * use it for XML 1.0 documents.</p>
-     *
-     * @param input  the {@code String} to escape, may be null
-     * @return a new escaped {@code String}, {@code null} if null string input
-     * @see #unescapeXml(java.lang.String)
-     * @since 3.3
-     */
-    public static String escapeXml11(final String input) {
-        return ESCAPE_XML11.translate(input);
-    }
-
-    //-----------------------------------------------------------------------
-    /**
-     * <p>Unescapes a string containing XML entity escapes to a string
-     * containing the actual Unicode characters corresponding to the
-     * escapes.</p>
-     *
-     * <p>Supports only the five basic XML entities (gt, lt, quot, amp, apos).
-     * Does not support DTDs or external entities.</p>
-     *
-     * <p>Note that numerical \\u Unicode codes are unescaped to their respective 
-     *    Unicode characters. This may change in future releases. </p>
-     *
-     * @param input  the {@code String} to unescape, may be null
-     * @return a new unescaped {@code String}, {@code null} if null string input
-     * @see #escapeXml(String)
-     * @see #escapeXml10(String)
-     * @see #escapeXml11(String)
-     */
-    public static final String unescapeXml(final String input) {
-        return UNESCAPE_XML.translate(input);
-    }
-
-    //-----------------------------------------------------------------------
-
-    /**
-     * <p>Returns a {@code String} value for a CSV column enclosed in double quotes,
-     * if required.</p>
-     *
-     * <p>If the value contains a comma, newline or double quote, then the
-     *    String value is returned enclosed in double quotes.</p>
-     *
-     * <p>Any double quote characters in the value are escaped with another double quote.</p>
-     *
-     * <p>If the value does not contain a comma, newline or double quote, then the
-     *    String value is returned unchanged.</p>
-     *
-     * see <a href="http://en.wikipedia.org/wiki/Comma-separated_values">Wikipedia</a> and
-     * <a href="http://tools.ietf.org/html/rfc4180">RFC 4180</a>.
-     *
-     * @param input the input CSV column String, may be null
-     * @return the input String, enclosed in double quotes if the value contains a comma,
-     * newline or double quote, {@code null} if null string input
-     * @since 2.4
-     */
-    public static final String escapeCsv(final String input) {
-        return ESCAPE_CSV.translate(input);
-    }
-
-    /**
-     * <p>Returns a {@code String} value for an unescaped CSV column. </p>
-     *
-     * <p>If the value is enclosed in double quotes, and contains a comma, newline 
-     *    or double quote, then quotes are removed. 
-     * </p>
-     *
-     * <p>Any double quote escaped characters (a pair of double quotes) are unescaped 
-     *    to just one double quote. </p>
-     *
-     * <p>If the value is not enclosed in double quotes, or is and does not contain a 
-     *    comma, newline or double quote, then the String value is returned unchanged.</p>
-     *
-     * see <a href="http://en.wikipedia.org/wiki/Comma-separated_values">Wikipedia</a> and
-     * <a href="http://tools.ietf.org/html/rfc4180">RFC 4180</a>.
-     *
-     * @param input the input CSV column String, may be null
-     * @return the input String, with enclosing double quotes removed and embedded double 
-     * quotes unescaped, {@code null} if null string input
-     * @since 2.4
-     */
-    public static final String unescapeCsv(final String input) {
-        return UNESCAPE_CSV.translate(input);
-    }
-
-}
diff --git a/lang/src/main/java/org/apache/commons/lang3/StringUtils.java b/lang/src/main/java/org/apache/commons/lang3/StringUtils.java
deleted file mode 100644
index b742f60..0000000
--- a/lang/src/main/java/org/apache/commons/lang3/StringUtils.java
+++ /dev/null
@@ -1,7877 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.commons.lang3;
-
-import java.io.UnsupportedEncodingException;
-
-import java.nio.charset.Charset;
-import java.text.Normalizer;
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.Iterator;
-import java.util.List;
-import java.util.Locale;
-import java.util.regex.Pattern;
-
-/**
- * <p>Operations on {@link java.lang.String} that are
- * {@code null} safe.</p>
- *
- * <ul>
- *  <li><b>IsEmpty/IsBlank</b>
- *      - checks if a String contains text</li>
- *  <li><b>Trim/Strip</b>
- *      - removes leading and trailing whitespace</li>
- *  <li><b>Equals</b>
- *      - compares two strings null-safe</li>
- *  <li><b>startsWith</b>
- *      - check if a String starts with a prefix null-safe</li>
- *  <li><b>endsWith</b>
- *      - check if a String ends with a suffix null-safe</li>
- *  <li><b>IndexOf/LastIndexOf/Contains</b>
- *      - null-safe index-of checks
- *  <li><b>IndexOfAny/LastIndexOfAny/IndexOfAnyBut/LastIndexOfAnyBut</b>
- *      - index-of any of a set of Strings</li>
- *  <li><b>ContainsOnly/ContainsNone/ContainsAny</b>
- *      - does String contains only/none/any of these characters</li>
- *  <li><b>Substring/Left/Right/Mid</b>
- *      - null-safe substring extractions</li>
- *  <li><b>SubstringBefore/SubstringAfter/SubstringBetween</b>
- *      - substring extraction relative to other strings</li>
- *  <li><b>Split/Join</b>
- *      - splits a String into an array of substrings and vice versa</li>
- *  <li><b>Remove/Delete</b>
- *      - removes part of a String</li>
- *  <li><b>Replace/Overlay</b>
- *      - Searches a String and replaces one String with another</li>
- *  <li><b>Chomp/Chop</b>
- *      - removes the last part of a String</li>
- *  <li><b>AppendIfMissing</b>
- *      - appends a suffix to the end of the String if not present</li>
- *  <li><b>PrependIfMissing</b>
- *      - prepends a prefix to the start of the String if not present</li>
- *  <li><b>LeftPad/RightPad/Center/Repeat</b>
- *      - pads a String</li>
- *  <li><b>UpperCase/LowerCase/SwapCase/Capitalize/Uncapitalize</b>
- *      - changes the case of a String</li>
- *  <li><b>CountMatches</b>
- *      - counts the number of occurrences of one String in another</li>
- *  <li><b>IsAlpha/IsNumeric/IsWhitespace/IsAsciiPrintable</b>
- *      - checks the characters in a String</li>
- *  <li><b>DefaultString</b>
- *      - protects against a null input String</li>
- *  <li><b>Reverse/ReverseDelimited</b>
- *      - reverses a String</li>
- *  <li><b>Abbreviate</b>
- *      - abbreviates a string using ellipsis</li>
- *  <li><b>Difference</b>
- *      - compares Strings and reports on their differences</li>
- *  <li><b>LevenshteinDistance</b>
- *      - the number of changes needed to change one String into another</li>
- * </ul>
- *
- * <p>The {@code StringUtils} class defines certain words related to
- * String handling.</p>
- *
- * <ul>
- *  <li>null - {@code null}</li>
- *  <li>empty - a zero-length string ({@code ""})</li>
- *  <li>space - the space character ({@code ' '}, char 32)</li>
- *  <li>whitespace - the characters defined by {@link Character#isWhitespace(char)}</li>
- *  <li>trim - the characters &lt;= 32 as in {@link String#trim()}</li>
- * </ul>
- *
- * <p>{@code StringUtils} handles {@code null} input Strings quietly.
- * That is to say that a {@code null} input will return {@code null}.
- * Where a {@code boolean} or {@code int} is being returned
- * details vary by method.</p>
- *
- * <p>A side effect of the {@code null} handling is that a
- * {@code NullPointerException} should be considered a bug in
- * {@code StringUtils}.</p>
- *
- * <p>Methods in this class give sample code to explain their operation.
- * The symbol {@code *} is used to indicate any input including {@code null}.</p>
- *
- * <p>#ThreadSafe#</p>
- * @see java.lang.String
- * @since 1.0
- * @version $Id$
- */
-//@Immutable
-public class StringUtils {
-    // Performance testing notes (JDK 1.4, Jul03, scolebourne)
-    // Whitespace:
-    // Character.isWhitespace() is faster than WHITESPACE.indexOf()
-    // where WHITESPACE is a string of all whitespace characters
-    //
-    // Character access:
-    // String.charAt(n) versus toCharArray(), then array[n]
-    // String.charAt(n) is about 15% worse for a 10K string
-    // They are about equal for a length 50 string
-    // String.charAt(n) is about 4 times better for a length 3 string
-    // String.charAt(n) is best bet overall
-    //
-    // Append:
-    // String.concat about twice as fast as StringBuffer.append
-    // (not sure who tested this)
-
-    /**
-     * A String for a space character.
-     *
-     * @since 3.2
-     */
-    public static final String SPACE = " ";
-
-    /**
-     * The empty String {@code ""}.
-     * @since 2.0
-     */
-    public static final String EMPTY = "";
-
-    /**
-     * A String for linefeed LF ("\n").
-     *
-     * @see <a href="http://docs.oracle.com/javase/specs/jls/se7/html/jls-3.html#jls-3.10.6">JLF: Escape Sequences
-     *      for Character and String Literals</a>
-     * @since 3.2
-     */
-    public static final String LF = "\n";
-
-    /**
-     * A String for carriage return CR ("\r").
-     *
-     * @see <a href="http://docs.oracle.com/javase/specs/jls/se7/html/jls-3.html#jls-3.10.6">JLF: Escape Sequences
-     *      for Character and String Literals</a>
-     * @since 3.2
-     */
-    public static final String CR = "\r";
-
-    /**
-     * Represents a failed index search.
-     * @since 2.1
-     */
-    public static final int INDEX_NOT_FOUND = -1;
-
-    /**
-     * <p>The maximum size to which the padding constant(s) can expand.</p>
-     */
-    private static final int PAD_LIMIT = 8192;
-
-    /**
-     * <p>{@code StringUtils} instances should NOT be constructed in
-     * standard programming. Instead, the class should be used as
-     * {@code StringUtils.trim(" foo ");}.</p>
-     *
-     * <p>This constructor is public to permit tools that require a JavaBean
-     * instance to operate.</p>
-     */
-    public StringUtils() {
-        super();
-    }
-
-    // Empty checks
-    //-----------------------------------------------------------------------
-    /**
-     * <p>Checks if a CharSequence is empty ("") or null.</p>
-     *
-     * <pre>
-     * StringUtils.isEmpty(null)      = true
-     * StringUtils.isEmpty("")        = true
-     * StringUtils.isEmpty(" ")       = false
-     * StringUtils.isEmpty("bob")     = false
-     * StringUtils.isEmpty("  bob  ") = false
-     * </pre>
-     *
-     * <p>NOTE: This method changed in Lang version 2.0.
-     * It no longer trims the CharSequence.
-     * That functionality is available in isBlank().</p>
-     *
-     * @param cs  the CharSequence to check, may be null
-     * @return {@code true} if the CharSequence is empty or null
-     * @since 3.0 Changed signature from isEmpty(String) to isEmpty(CharSequence)
-     */
-    public static boolean isEmpty(final CharSequence cs) {
-        return cs == null || cs.length() == 0;
-    }
-
-    /**
-     * <p>Checks if a CharSequence is not empty ("") and not null.</p>
-     *
-     * <pre>
-     * StringUtils.isNotEmpty(null)      = false
-     * StringUtils.isNotEmpty("")        = false
-     * StringUtils.isNotEmpty(" ")       = true
-     * StringUtils.isNotEmpty("bob")     = true
-     * StringUtils.isNotEmpty("  bob  ") = true
-     * </pre>
-     *
-     * @param cs  the CharSequence to check, may be null
-     * @return {@code true} if the CharSequence is not empty and not null
-     * @since 3.0 Changed signature from isNotEmpty(String) to isNotEmpty(CharSequence)
-     */
-    public static boolean isNotEmpty(final CharSequence cs) {
-        return !isEmpty(cs);
-    }
-       
-    /**
-     * <p>Checks if any one of the CharSequences are empty ("") or null.</p>
-     *
-     * <pre>
-     * StringUtils.isAnyEmpty(null)             = true
-     * StringUtils.isAnyEmpty(null, "foo")      = true
-     * StringUtils.isAnyEmpty("", "bar")        = true
-     * StringUtils.isAnyEmpty("bob", "")        = true
-     * StringUtils.isAnyEmpty("  bob  ", null)  = true
-     * StringUtils.isAnyEmpty(" ", "bar")       = false
-     * StringUtils.isAnyEmpty("foo", "bar")     = false
-     * </pre>
-     *
-     * @param css  the CharSequences to check, may be null or empty
-     * @return {@code true} if any of the CharSequences are empty or null
-     * @since 3.2
-     */
-    public static boolean isAnyEmpty(final CharSequence... css) {
-      if (ArrayUtils.isEmpty(css)) {
-        return true;
-      }
-      for (final CharSequence cs : css){
-        if (isEmpty(cs)) {
-          return true;
-        }
-      }
-      return false;
-    }
-    
-    /**
-     * <p>Checks if none of the CharSequences are empty ("") or null.</p>
-     *
-     * <pre>
-     * StringUtils.isNoneEmpty(null)             = false
-     * StringUtils.isNoneEmpty(null, "foo")      = false
-     * StringUtils.isNoneEmpty("", "bar")        = false
-     * StringUtils.isNoneEmpty("bob", "")        = false
-     * StringUtils.isNoneEmpty("  bob  ", null)  = false
-     * StringUtils.isNoneEmpty(" ", "bar")       = true
-     * StringUtils.isNoneEmpty("foo", "bar")     = true
-     * </pre>
-     *
-     * @param css  the CharSequences to check, may be null or empty
-     * @return {@code true} if none of the CharSequences are empty or null
-     * @since 3.2
-     */
-    public static boolean isNoneEmpty(final CharSequence... css) {
-      return !isAnyEmpty(css);
-    }    
-    /**
-     * <p>Checks if a CharSequence is whitespace, empty ("") or null.</p>
-     *
-     * <pre>
-     * StringUtils.isBlank(null)      = true
-     * StringUtils.isBlank("")        = true
-     * StringUtils.isBlank(" ")       = true
-     * StringUtils.isBlank("bob")     = false
-     * StringUtils.isBlank("  bob  ") = false
-     * </pre>
-     *
-     * @param cs  the CharSequence to check, may be null
-     * @return {@code true} if the CharSequence is null, empty or whitespace
-     * @since 2.0
-     * @since 3.0 Changed signature from isBlank(String) to isBlank(CharSequence)
-     */
-    public static boolean isBlank(final CharSequence cs) {
-        int strLen;
-        if (cs == null || (strLen = cs.length()) == 0) {
-            return true;
-        }
-        for (int i = 0; i < strLen; i++) {
-            if (Character.isWhitespace(cs.charAt(i)) == false) {
-                return false;
-            }
-        }
-        return true;
-    }
-
-    /**
-     * <p>Checks if a CharSequence is not empty (""), not null and not whitespace only.</p>
-     *
-     * <pre>
-     * StringUtils.isNotBlank(null)      = false
-     * StringUtils.isNotBlank("")        = false
-     * StringUtils.isNotBlank(" ")       = false
-     * StringUtils.isNotBlank("bob")     = true
-     * StringUtils.isNotBlank("  bob  ") = true
-     * </pre>
-     *
-     * @param cs  the CharSequence to check, may be null
-     * @return {@code true} if the CharSequence is
-     *  not empty and not null and not whitespace
-     * @since 2.0
-     * @since 3.0 Changed signature from isNotBlank(String) to isNotBlank(CharSequence)
-     */
-    public static boolean isNotBlank(final CharSequence cs) {
-        return !isBlank(cs);
-    }
-    
-        /**
-     * <p>Checks if any one of the CharSequences are blank ("") or null and not whitespace only..</p>
-     *
-     * <pre>
-     * StringUtils.isAnyBlank(null)             = true
-     * StringUtils.isAnyBlank(null, "foo")      = true
-     * StringUtils.isAnyBlank(null, null)       = true
-     * StringUtils.isAnyBlank("", "bar")        = true
-     * StringUtils.isAnyBlank("bob", "")        = true
-     * StringUtils.isAnyBlank("  bob  ", null)  = true
-     * StringUtils.isAnyBlank(" ", "bar")       = true
-     * StringUtils.isAnyBlank("foo", "bar")     = false
-     * </pre>
-     *
-     * @param css  the CharSequences to check, may be null or empty
-     * @return {@code true} if any of the CharSequences are blank or null or whitespace only
-     * @since 3.2
-     */
-    public static boolean isAnyBlank(final CharSequence... css) {
-      if (ArrayUtils.isEmpty(css)) {
-        return true;
-      }
-      for (final CharSequence cs : css){
-        if (isBlank(cs)) {
-          return true;
-        }
-      }
-      return false;
-    }
-    
-    /**
-     * <p>Checks if none of the CharSequences are blank ("") or null and whitespace only..</p>
-     *
-     * <pre>
-     * StringUtils.isNoneBlank(null)             = false
-     * StringUtils.isNoneBlank(null, "foo")      = false
-     * StringUtils.isNoneBlank(null, null)       = false
-     * StringUtils.isNoneBlank("", "bar")        = false
-     * StringUtils.isNoneBlank("bob", "")        = false
-     * StringUtils.isNoneBlank("  bob  ", null)  = false
-     * StringUtils.isNoneBlank(" ", "bar")       = false
-     * StringUtils.isNoneBlank("foo", "bar")     = true
-     * </pre>
-     *
-     * @param css  the CharSequences to check, may be null or empty
-     * @return {@code true} if none of the CharSequences are blank or null or whitespace only
-     * @since 3.2
-     */
-    public static boolean isNoneBlank(final CharSequence... css) {
-      return !isAnyBlank(css);
-    }
-
-    // Trim
-    //-----------------------------------------------------------------------
-    /**
-     * <p>Removes control characters (char &lt;= 32) from both
-     * ends of this String, handling {@code null} by returning
-     * {@code null}.</p>
-     *
-     * <p>The String is trimmed using {@link String#trim()}.
-     * Trim removes start and end characters &lt;= 32.
-     * To strip whitespace use {@link #strip(String)}.</p>
-     *
-     * <p>To trim your choice of characters, use the
-     * {@link #strip(String, String)} methods.</p>
-     *
-     * <pre>
-     * StringUtils.trim(null)          = null
-     * StringUtils.trim("")            = ""
-     * StringUtils.trim("     ")       = ""
-     * StringUtils.trim("abc")         = "abc"
-     * StringUtils.trim("    abc    ") = "abc"
-     * </pre>
-     *
-     * @param str  the String to be trimmed, may be null
-     * @return the trimmed string, {@code null} if null String input
-     */
-    public static String trim(final String str) {
-        return str == null ? null : str.trim();
-    }
-
-    /**
-     * <p>Removes control characters (char &lt;= 32) from both
-     * ends of this String returning {@code null} if the String is
-     * empty ("") after the trim or if it is {@code null}.
-     *
-     * <p>The String is trimmed using {@link String#trim()}.
-     * Trim removes start and end characters &lt;= 32.
-     * To strip whitespace use {@link #stripToNull(String)}.</p>
-     *
-     * <pre>
-     * StringUtils.trimToNull(null)          = null
-     * StringUtils.trimToNull("")            = null
-     * StringUtils.trimToNull("     ")       = null
-     * StringUtils.trimToNull("abc")         = "abc"
-     * StringUtils.trimToNull("    abc    ") = "abc"
-     * </pre>
-     *
-     * @param str  the String to be trimmed, may be null
-     * @return the trimmed String,
-     *  {@code null} if only chars &lt;= 32, empty or null String input
-     * @since 2.0
-     */
-    public static String trimToNull(final String str) {
-        final String ts = trim(str);
-        return isEmpty(ts) ? null : ts;
-    }
-
-    /**
-     * <p>Removes control characters (char &lt;= 32) from both
-     * ends of this String returning an empty String ("") if the String
-     * is empty ("") after the trim or if it is {@code null}.
-     *
-     * <p>The String is trimmed using {@link String#trim()}.
-     * Trim removes start and end characters &lt;= 32.
-     * To strip whitespace use {@link #stripToEmpty(String)}.</p>
-     *
-     * <pre>
-     * StringUtils.trimToEmpty(null)          = ""
-     * StringUtils.trimToEmpty("")            = ""
-     * StringUtils.trimToEmpty("     ")       = ""
-     * StringUtils.trimToEmpty("abc")         = "abc"
-     * StringUtils.trimToEmpty("    abc    ") = "abc"
-     * </pre>
-     *
-     * @param str  the String to be trimmed, may be null
-     * @return the trimmed String, or an empty String if {@code null} input
-     * @since 2.0
-     */
-    public static String trimToEmpty(final String str) {
-        return str == null ? EMPTY : str.trim();
-    }
-
-    // Stripping
-    //-----------------------------------------------------------------------
-    /**
-     * <p>Strips whitespace from the start and end of a String.</p>
-     *
-     * <p>This is similar to {@link #trim(String)} but removes whitespace.
-     * Whitespace is defined by {@link Character#isWhitespace(char)}.</p>
-     *
-     * <p>A {@code null} input String returns {@code null}.</p>
-     *
-     * <pre>
-     * StringUtils.strip(null)     = null
-     * StringUtils.strip("")       = ""
-     * StringUtils.strip("   ")    = ""
-     * StringUtils.strip("abc")    = "abc"
-     * StringUtils.strip("  abc")  = "abc"
-     * StringUtils.strip("abc  ")  = "abc"
-     * StringUtils.strip(" abc ")  = "abc"
-     * StringUtils.strip(" ab c ") = "ab c"
-     * </pre>
-     *
-     * @param str  the String to remove whitespace from, may be null
-     * @return the stripped String, {@code null} if null String input
-     */
-    public static String strip(final String str) {
-        return strip(str, null);
-    }
-
-    /**
-     * <p>Strips whitespace from the start and end of a String  returning
-     * {@code null} if the String is empty ("") after the strip.</p>
-     *
-     * <p>This is similar to {@link #trimToNull(String)} but removes whitespace.
-     * Whitespace is defined by {@link Character#isWhitespace(char)}.</p>
-     *
-     * <pre>
-     * StringUtils.stripToNull(null)     = null
-     * StringUtils.stripToNull("")       = null
-     * StringUtils.stripToNull("   ")    = null
-     * StringUtils.stripToNull("abc")    = "abc"
-     * StringUtils.stripToNull("  abc")  = "abc"
-     * StringUtils.stripToNull("abc  ")  = "abc"
-     * StringUtils.stripToNull(" abc ")  = "abc"
-     * StringUtils.stripToNull(" ab c ") = "ab c"
-     * </pre>
-     *
-     * @param str  the String to be stripped, may be null
-     * @return the stripped String,
-     *  {@code null} if whitespace, empty or null String input
-     * @since 2.0
-     */
-    public static String stripToNull(String str) {
-        if (str == null) {
-            return null;
-        }
-        str = strip(str, null);
-        return str.isEmpty() ? null : str;
-    }
-
-    /**
-     * <p>Strips whitespace from the start and end of a String  returning
-     * an empty String if {@code null} input.</p>
-     *
-     * <p>This is similar to {@link #trimToEmpty(String)} but removes whitespace.
-     * Whitespace is defined by {@link Character#isWhitespace(char)}.</p>
-     *
-     * <pre>
-     * StringUtils.stripToEmpty(null)     = ""
-     * StringUtils.stripToEmpty("")       = ""
-     * StringUtils.stripToEmpty("   ")    = ""
-     * StringUtils.stripToEmpty("abc")    = "abc"
-     * StringUtils.stripToEmpty("  abc")  = "abc"
-     * StringUtils.stripToEmpty("abc  ")  = "abc"
-     * StringUtils.stripToEmpty(" abc ")  = "abc"
-     * StringUtils.stripToEmpty(" ab c ") = "ab c"
-     * </pre>
-     *
-     * @param str  the String to be stripped, may be null
-     * @return the trimmed String, or an empty String if {@code null} input
-     * @since 2.0
-     */
-    public static String stripToEmpty(final String str) {
-        return str == null ? EMPTY : strip(str, null);
-    }
-
-    /**
-     * <p>Strips any of a set of characters from the start and end of a String.
-     * This is similar to {@link String#trim()} but allows the characters
-     * to be stripped to be controlled.</p>
-     *
-     * <p>A {@code null} input String returns {@code null}.
-     * An empty string ("") input returns the empty string.</p>
-     *
-     * <p>If the stripChars String is {@code null}, whitespace is
-     * stripped as defined by {@link Character#isWhitespace(char)}.
-     * Alternatively use {@link #strip(String)}.</p>
-     *
-     * <pre>
-     * StringUtils.strip(null, *)          = null
-     * StringUtils.strip("", *)            = ""
-     * StringUtils.strip("abc", null)      = "abc"
-     * StringUtils.strip("  abc", null)    = "abc"
-     * StringUtils.strip("abc  ", null)    = "abc"
-     * StringUtils.strip(" abc ", null)    = "abc"
-     * StringUtils.strip("  abcyx", "xyz") = "  abc"
-     * </pre>
-     *
-     * @param str  the String to remove characters from, may be null
-     * @param stripChars  the characters to remove, null treated as whitespace
-     * @return the stripped String, {@code null} if null String input
-     */
-    public static String strip(String str, final String stripChars) {
-        if (isEmpty(str)) {
-            return str;
-        }
-        str = stripStart(str, stripChars);
-        return stripEnd(str, stripChars);
-    }
-    
-    /**
-     * <p>Strips any of a set of characters from the start of a String.</p>
-     *
-     * <p>A {@code null} input String returns {@code null}.
-     * An empty string ("") input returns the empty string.</p>
-     *
-     * <p>If the stripChars String is {@code null}, whitespace is
-     * stripped as defined by {@link Character#isWhitespace(char)}.</p>
-     *
-     * <pre>
-     * StringUtils.stripStart(null, *)          = null
-     * StringUtils.stripStart("", *)            = ""
-     * StringUtils.stripStart("abc", "")        = "abc"
-     * StringUtils.stripStart("abc", null)      = "abc"
-     * StringUtils.stripStart("  abc", null)    = "abc"
-     * StringUtils.stripStart("abc  ", null)    = "abc  "
-     * StringUtils.stripStart(" abc ", null)    = "abc "
-     * StringUtils.stripStart("yxabc  ", "xyz") = "abc  "
-     * </pre>
-     *
-     * @param str  the String to remove characters from, may be null
-     * @param stripChars  the characters to remove, null treated as whitespace
-     * @return the stripped String, {@code null} if null String input
-     */
-    public static String stripStart(final String str, final String stripChars) {
-        int strLen;
-        if (str == null || (strLen = str.length()) == 0) {
-            return str;
-        }
-        int start = 0;
-        if (stripChars == null) {
-            while (start != strLen && Character.isWhitespace(str.charAt(start))) {
-                start++;
-            }
-        } else if (stripChars.isEmpty()) {
-            return str;
-        } else {
-            while (start != strLen && stripChars.indexOf(str.charAt(start)) != INDEX_NOT_FOUND) {
-                start++;
-            }
-        }
-        return str.substring(start);
-    }
-
-    /**
-     * <p>Strips any of a set of characters from the end of a String.</p>
-     *
-     * <p>A {@code null} input String returns {@code null}.
-     * An empty string ("") input returns the empty string.</p>
-     *
-     * <p>If the stripChars String is {@code null}, whitespace is
-     * stripped as defined by {@link Character#isWhitespace(char)}.</p>
-     *
-     * <pre>
-     * StringUtils.stripEnd(null, *)          = null
-     * StringUtils.stripEnd("", *)            = ""
-     * StringUtils.stripEnd("abc", "")        = "abc"
-     * StringUtils.stripEnd("abc", null)      = "abc"
-     * StringUtils.stripEnd("  abc", null)    = "  abc"
-     * StringUtils.stripEnd("abc  ", null)    = "abc"
-     * StringUtils.stripEnd(" abc ", null)    = " abc"
-     * StringUtils.stripEnd("  abcyx", "xyz") = "  abc"
-     * StringUtils.stripEnd("120.00", ".0")   = "12"
-     * </pre>
-     *
-     * @param str  the String to remove characters from, may be null
-     * @param stripChars  the set of characters to remove, null treated as whitespace
-     * @return the stripped String, {@code null} if null String input
-     */
-    public static String stripEnd(final String str, final String stripChars) {
-        int end;
-        if (str == null || (end = str.length()) == 0) {
-            return str;
-        }
-
-        if (stripChars == null) {
-            while (end != 0 && Character.isWhitespace(str.charAt(end - 1))) {
-                end--;
-            }
-        } else if (stripChars.isEmpty()) {
-            return str;
-        } else {
-            while (end != 0 && stripChars.indexOf(str.charAt(end - 1)) != INDEX_NOT_FOUND) {
-                end--;
-            }
-        }
-        return str.substring(0, end);
-    }
-
-    // StripAll
-    //-----------------------------------------------------------------------
-    /**
-     * <p>Strips whitespace from the start and end of every String in an array.
-     * Whitespace is defined by {@link Character#isWhitespace(char)}.</p>
-     *
-     * <p>A new array is returned each time, except for length zero.
-     * A {@code null} array will return {@code null}.
-     * An empty array will return itself.
-     * A {@code null} array entry will be ignored.</p>
-     *
-     * <pre>
-     * StringUtils.stripAll(null)             = null
-     * StringUtils.stripAll([])               = []
-     * StringUtils.stripAll(["abc", "  abc"]) = ["abc", "abc"]
-     * StringUtils.stripAll(["abc  ", null])  = ["abc", null]
-     * </pre>
-     *
-     * @param strs  the array to remove whitespace from, may be null
-     * @return the stripped Strings, {@code null} if null array input
-     */
-    public static String[] stripAll(final String... strs) {
-        return stripAll(strs, null);
-    }
-
-    /**
-     * <p>Strips any of a set of characters from the start and end of every
-     * String in an array.</p>
-     * <p>Whitespace is defined by {@link Character#isWhitespace(char)}.</p>
-     *
-     * <p>A new array is returned each time, except for length zero.
-     * A {@code null} array will return {@code null}.
-     * An empty array will return itself.
-     * A {@code null} array entry will be ignored.
-     * A {@code null} stripChars will strip whitespace as defined by
-     * {@link Character#isWhitespace(char)}.</p>
-     *
-     * <pre>
-     * StringUtils.stripAll(null, *)                = null
-     * StringUtils.stripAll([], *)                  = []
-     * StringUtils.stripAll(["abc", "  abc"], null) = ["abc", "abc"]
-     * StringUtils.stripAll(["abc  ", null], null)  = ["abc", null]
-     * StringUtils.stripAll(["abc  ", null], "yz")  = ["abc  ", null]
-     * StringUtils.stripAll(["yabcz", null], "yz")  = ["abc", null]
-     * </pre>
-     *
-     * @param strs  the array to remove characters from, may be null
-     * @param stripChars  the characters to remove, null treated as whitespace
-     * @return the stripped Strings, {@code null} if null array input
-     */
-    public static String[] stripAll(final String[] strs, final String stripChars) {
-        int strsLen;
-        if (strs == null || (strsLen = strs.length) == 0) {
-            return strs;
-        }
-        final String[] newArr = new String[strsLen];
-        for (int i = 0; i < strsLen; i++) {
-            newArr[i] = strip(strs[i], stripChars);
-        }
-        return newArr;
-    }
-
-    /**
-     * <p>Removes diacritics (~= accents) from a string. The case will not be altered.</p>
-     * <p>For instance, '&agrave;' will be replaced by 'a'.</p>
-     * <p>Note that ligatures will be left as is.</p>
-     *
-     * <pre>
-     * StringUtils.stripAccents(null)                = null
-     * StringUtils.stripAccents("")                  = ""
-     * StringUtils.stripAccents("control")           = "control"
-     * StringUtils.stripAccents("&eacute;clair")     = "eclair"
-     * </pre>
-     *
-     * @param input String to be stripped
-     * @return input text with diacritics removed
-     *
-     * @since 3.0
-     */
-    // See also Lucene's ASCIIFoldingFilter (Lucene 2.9) that replaces accented characters by their unaccented equivalent (and uncommitted bug fix: https://issues.apache.org/jira/browse/LUCENE-1343?focusedCommentId=12858907&page=com.atlassian.jira.plugin.system.issuetabpanels%3Acomment-tabpanel#action_12858907).
-    public static String stripAccents(final String input) {
-        if(input == null) {
-            return null;
-        }
-        final Pattern pattern = Pattern.compile("\\p{InCombiningDiacriticalMarks}+");//$NON-NLS-1$
-        final String decomposed = Normalizer.normalize(input, Normalizer.Form.NFD);
-        // Note that this doesn't correctly remove ligatures...
-        return pattern.matcher(decomposed).replaceAll("");//$NON-NLS-1$
-    }
-
-    // Equals
-    //-----------------------------------------------------------------------
-    /**
-     * <p>Compares two CharSequences, returning {@code true} if they represent
-     * equal sequences of characters.</p>
-     *
-     * <p>{@code null}s are handled without exceptions. Two {@code null}
-     * references are considered to be equal. The comparison is case sensitive.</p>
-     *
-     * <pre>
-     * StringUtils.equals(null, null)   = true
-     * StringUtils.equals(null, "abc")  = false
-     * StringUtils.equals("abc", null)  = false
-     * StringUtils.equals("abc", "abc") = true
-     * StringUtils.equals("abc", "ABC") = false
-     * </pre>
-     *
-     * @see Object#equals(Object)
-     * @param cs1  the first CharSequence, may be {@code null}
-     * @param cs2  the second CharSequence, may be {@code null}
-     * @return {@code true} if the CharSequences are equal (case-sensitive), or both {@code null}
-     * @since 3.0 Changed signature from equals(String, String) to equals(CharSequence, CharSequence)
-     */
-    public static boolean equals(final CharSequence cs1, final CharSequence cs2) {
-        if (cs1 == cs2) {
-            return true;
-        }
-        if (cs1 == null || cs2 == null) {
-            return false;
-        }
-        if (cs1 instanceof String && cs2 instanceof String) {
-            return cs1.equals(cs2);
-        }
-        return CharSequenceUtils.regionMatches(cs1, false, 0, cs2, 0, Math.max(cs1.length(), cs2.length()));
-    }
-
-    /**
-     * <p>Compares two CharSequences, returning {@code true} if they represent
-     * equal sequences of characters, ignoring case.</p>
-     *
-     * <p>{@code null}s are handled without exceptions. Two {@code null}
-     * references are considered equal. Comparison is case insensitive.</p>
-     *
-     * <pre>
-     * StringUtils.equalsIgnoreCase(null, null)   = true
-     * StringUtils.equalsIgnoreCase(null, "abc")  = false
-     * StringUtils.equalsIgnoreCase("abc", null)  = false
-     * StringUtils.equalsIgnoreCase("abc", "abc") = true
-     * StringUtils.equalsIgnoreCase("abc", "ABC") = true
-     * </pre>
-     *
-     * @param str1  the first CharSequence, may be null
-     * @param str2  the second CharSequence, may be null
-     * @return {@code true} if the CharSequence are equal, case insensitive, or
-     *  both {@code null}
-     * @since 3.0 Changed signature from equalsIgnoreCase(String, String) to equalsIgnoreCase(CharSequence, CharSequence)
-     */
-    public static boolean equalsIgnoreCase(final CharSequence str1, final CharSequence str2) {
-        if (str1 == null || str2 == null) {
-            return str1 == str2;
-        } else if (str1 == str2) {
-            return true;
-        } else if (str1.length() != str2.length()) {
-            return false;
-        } else {
-            return CharSequenceUtils.regionMatches(str1, true, 0, str2, 0, str1.length());
-        }
-    }
-
-    // IndexOf
-    //-----------------------------------------------------------------------
-    /**
-     * <p>Finds the first index within a CharSequence, handling {@code null}.
-     * This method uses {@link String#indexOf(int, int)} if possible.</p>
-     *
-     * <p>A {@code null} or empty ("") CharSequence will return {@code INDEX_NOT_FOUND (-1)}.</p>
-     *
-     * <pre>
-     * StringUtils.indexOf(null, *)         = -1
-     * StringUtils.indexOf("", *)           = -1
-     * StringUtils.indexOf("aabaabaa", 'a') = 0
-     * StringUtils.indexOf("aabaabaa", 'b') = 2
-     * </pre>
-     *
-     * @param seq  the CharSequence to check, may be null
-     * @param searchChar  the character to find
-     * @return the first index of the search character,
-     *  -1 if no match or {@code null} string input
-     * @since 2.0
-     * @since 3.0 Changed signature from indexOf(String, int) to indexOf(CharSequence, int)
-     */
-    public static int indexOf(final CharSequence seq, final int searchChar) {
-        if (isEmpty(seq)) {
-            return INDEX_NOT_FOUND;
-        }
-        return CharSequenceUtils.indexOf(seq, searchChar, 0);
-    }
-
-    /**
-     * <p>Finds the first index within a CharSequence from a start position,
-     * handling {@code null}.
-     * This method uses {@link String#indexOf(int, int)} if possible.</p>
-     *
-     * <p>A {@code null} or empty ("") CharSequence will return {@code (INDEX_NOT_FOUND) -1}.
-     * A negative start position is treated as zero.
-     * A start position greater than the string length returns {@code -1}.</p>
-     *
-     * <pre>
-     * StringUtils.indexOf(null, *, *)          = -1
-     * StringUtils.indexOf("", *, *)            = -1
-     * StringUtils.indexOf("aabaabaa", 'b', 0)  = 2
-     * StringUtils.indexOf("aabaabaa", 'b', 3)  = 5
-     * StringUtils.indexOf("aabaabaa", 'b', 9)  = -1
-     * StringUtils.indexOf("aabaabaa", 'b', -1) = 2
-     * </pre>
-     *
-     * @param seq  the CharSequence to check, may be null
-     * @param searchChar  the character to find
-     * @param startPos  the start position, negative treated as zero
-     * @return the first index of the search character (always &ge; startPos),
-     *  -1 if no match or {@code null} string input
-     * @since 2.0
-     * @since 3.0 Changed signature from indexOf(String, int, int) to indexOf(CharSequence, int, int)
-     */
-    public static int indexOf(final CharSequence seq, final int searchChar, final int startPos) {
-        if (isEmpty(seq)) {
-            return INDEX_NOT_FOUND;
-        }
-        return CharSequenceUtils.indexOf(seq, searchChar, startPos);
-    }
-
-    /**
-     * <p>Finds the first index within a CharSequence, handling {@code null}.
-     * This method uses {@link String#indexOf(String, int)} if possible.</p>
-     *
-     * <p>A {@code null} CharSequence will return {@code -1}.</p>
-     *
-     * <pre>
-     * StringUtils.indexOf(null, *)          = -1
-     * StringUtils.indexOf(*, null)          = -1
-     * StringUtils.indexOf("", "")           = 0
-     * StringUtils.indexOf("", *)            = -1 (except when * = "")
-     * StringUtils.indexOf("aabaabaa", "a")  = 0
-     * StringUtils.indexOf("aabaabaa", "b")  = 2
-     * StringUtils.indexOf("aabaabaa", "ab") = 1
-     * StringUtils.indexOf("aabaabaa", "")   = 0
-     * </pre>
-     *
-     * @param seq  the CharSequence to check, may be null
-     * @param searchSeq  the CharSequence to find, may be null
-     * @return the first index of the search CharSequence,
-     *  -1 if no match or {@code null} string input
-     * @since 2.0
-     * @since 3.0 Changed signature from indexOf(String, String) to indexOf(CharSequence, CharSequence)
-     */
-    public static int indexOf(final CharSequence seq, final CharSequence searchSeq) {
-        if (seq == null || searchSeq == null) {
-            return INDEX_NOT_FOUND;
-        }
-        return CharSequenceUtils.indexOf(seq, searchSeq, 0);
-    }
-
-    /**
-     * <p>Finds the first index within a CharSequence, handling {@code null}.
-     * This method uses {@link String#indexOf(String, int)} if possible.</p>
-     *
-     * <p>A {@code null} CharSequence will return {@code -1}.
-     * A negative start position is treated as zero.
-     * An empty ("") search CharSequence always matches.
-     * A start position greater than the string length only matches
-     * an empty search CharSequence.</p>
-     *
-     * <pre>
-     * StringUtils.indexOf(null, *, *)          = -1
-     * StringUtils.indexOf(*, null, *)          = -1
-     * StringUtils.indexOf("", "", 0)           = 0
-     * StringUtils.indexOf("", *, 0)            = -1 (except when * = "")
-     * StringUtils.indexOf("aabaabaa", "a", 0)  = 0
-     * StringUtils.indexOf("aabaabaa", "b", 0)  = 2
-     * StringUtils.indexOf("aabaabaa", "ab", 0) = 1
-     * StringUtils.indexOf("aabaabaa", "b", 3)  = 5
-     * StringUtils.indexOf("aabaabaa", "b", 9)  = -1
-     * StringUtils.indexOf("aabaabaa", "b", -1) = 2
-     * StringUtils.indexOf("aabaabaa", "", 2)   = 2
-     * StringUtils.indexOf("abc", "", 9)        = 3
-     * </pre>
-     *
-     * @param seq  the CharSequence to check, may be null
-     * @param searchSeq  the CharSequence to find, may be null
-     * @param startPos  the start position, negative treated as zero
-     * @return the first index of the search CharSequence (always &ge; startPos),
-     *  -1 if no match or {@code null} string input
-     * @since 2.0
-     * @since 3.0 Changed signature from indexOf(String, String, int) to indexOf(CharSequence, CharSequence, int)
-     */
-    public static int indexOf(final CharSequence seq, final CharSequence searchSeq, final int startPos) {
-        if (seq == null || searchSeq == null) {
-            return INDEX_NOT_FOUND;
-        }
-        return CharSequenceUtils.indexOf(seq, searchSeq, startPos);
-    }
-
-    /**
-     * <p>Finds the n-th index within a CharSequence, handling {@code null}.
-     * This method uses {@link String#indexOf(String)} if possible.</p>
-     *
-     * <p>A {@code null} CharSequence will return {@code -1}.</p>
-     *
-     * <pre>
-     * StringUtils.ordinalIndexOf(null, *, *)          = -1
-     * StringUtils.ordinalIndexOf(*, null, *)          = -1
-     * StringUtils.ordinalIndexOf("", "", *)           = 0
-     * StringUtils.ordinalIndexOf("aabaabaa", "a", 1)  = 0
-     * StringUtils.ordinalIndexOf("aabaabaa", "a", 2)  = 1
-     * StringUtils.ordinalIndexOf("aabaabaa", "b", 1)  = 2
-     * StringUtils.ordinalIndexOf("aabaabaa", "b", 2)  = 5
-     * StringUtils.ordinalIndexOf("aabaabaa", "ab", 1) = 1
-     * StringUtils.ordinalIndexOf("aabaabaa", "ab", 2) = 4
-     * StringUtils.ordinalIndexOf("aabaabaa", "", 1)   = 0
-     * StringUtils.ordinalIndexOf("aabaabaa", "", 2)   = 0
-     * </pre>
-     *
-     * <p>Note that 'head(CharSequence str, int n)' may be implemented as: </p>
-     *
-     * <pre>
-     *   str.substring(0, lastOrdinalIndexOf(str, "\n", n))
-     * </pre>
-     *
-     * @param str  the CharSequence to check, may be null
-     * @param searchStr  the CharSequence to find, may be null
-     * @param ordinal  the n-th {@code searchStr} to find
-     * @return the n-th index of the search CharSequence,
-     *  {@code -1} ({@code INDEX_NOT_FOUND}) if no match or {@code null} string input
-     * @since 2.1
-     * @since 3.0 Changed signature from ordinalIndexOf(String, String, int) to ordinalIndexOf(CharSequence, CharSequence, int)
-     */
-    public static int ordinalIndexOf(final CharSequence str, final CharSequence searchStr, final int ordinal) {
-        return ordinalIndexOf(str, searchStr, ordinal, false);
-    }
-
-    /**
-     * <p>Finds the n-th index within a String, handling {@code null}.
-     * This method uses {@link String#indexOf(String)} if possible.</p>
-     *
-     * <p>A {@code null} CharSequence will return {@code -1}.</p>
-     *
-     * @param str  the CharSequence to check, may be null
-     * @param searchStr  the CharSequence to find, may be null
-     * @param ordinal  the n-th {@code searchStr} to find
-     * @param lastIndex true if lastOrdinalIndexOf() otherwise false if ordinalIndexOf()
-     * @return the n-th index of the search CharSequence,
-     *  {@code -1} ({@code INDEX_NOT_FOUND}) if no match or {@code null} string input
-     */
-    // Shared code between ordinalIndexOf(String,String,int) and lastOrdinalIndexOf(String,String,int)
-    private static int ordinalIndexOf(final CharSequence str, final CharSequence searchStr, final int ordinal, final boolean lastIndex) {
-        if (str == null || searchStr == null || ordinal <= 0) {
-            return INDEX_NOT_FOUND;
-        }
-        if (searchStr.length() == 0) {
-            return lastIndex ? str.length() : 0;
-        }
-        int found = 0;
-        int index = lastIndex ? str.length() : INDEX_NOT_FOUND;
-        do {
-            if (lastIndex) {
-                index = CharSequenceUtils.lastIndexOf(str, searchStr, index - searchStr.length());
-            } else {
-                index = CharSequenceUtils.indexOf(str, searchStr, index + searchStr.length());
-            }
-            if (index < 0) {
-                return index;
-            }
-            found++;
-        } while (found < ordinal);
-        return index;
-    }
-
-    /**
-     * <p>Case in-sensitive find of the first index within a CharSequence.</p>
-     *
-     * <p>A {@code null} CharSequence will return {@code -1}.
-     * A negative start position is treated as zero.
-     * An empty ("") search CharSequence always matches.
-     * A start position greater than the string length only matches
-     * an empty search CharSequence.</p>
-     *
-     * <pre>
-     * StringUtils.indexOfIgnoreCase(null, *)          = -1
-     * StringUtils.indexOfIgnoreCase(*, null)          = -1
-     * StringUtils.indexOfIgnoreCase("", "")           = 0
-     * StringUtils.indexOfIgnoreCase("aabaabaa", "a")  = 0
-     * StringUtils.indexOfIgnoreCase("aabaabaa", "b")  = 2
-     * StringUtils.indexOfIgnoreCase("aabaabaa", "ab") = 1
-     * </pre>
-     *
-     * @param str  the CharSequence to check, may be null
-     * @param searchStr  the CharSequence to find, may be null
-     * @return the first index of the search CharSequence,
-     *  -1 if no match or {@code null} string input
-     * @since 2.5
-     * @since 3.0 Changed signature from indexOfIgnoreCase(String, String) to indexOfIgnoreCase(CharSequence, CharSequence)
-     */
-    public static int indexOfIgnoreCase(final CharSequence str, final CharSequence searchStr) {
-        return indexOfIgnoreCase(str, searchStr, 0);
-    }
-
-    /**
-     * <p>Case in-sensitive find of the first index within a CharSequence
-     * from the specified position.</p>
-     *
-     * <p>A {@code null} CharSequence will return {@code -1}.
-     * A negative start position is treated as zero.
-     * An empty ("") search CharSequence always matches.
-     * A start position greater than the string length only matches
-     * an empty search CharSequence.</p>
-     *
-     * <pre>
-     * StringUtils.indexOfIgnoreCase(null, *, *)          = -1
-     * StringUtils.indexOfIgnoreCase(*, null, *)          = -1
-     * StringUtils.indexOfIgnoreCase("", "", 0)           = 0
-     * StringUtils.indexOfIgnoreCase("aabaabaa", "A", 0)  = 0
-     * StringUtils.indexOfIgnoreCase("aabaabaa", "B", 0)  = 2
-     * StringUtils.indexOfIgnoreCase("aabaabaa", "AB", 0) = 1
-     * StringUtils.indexOfIgnoreCase("aabaabaa", "B", 3)  = 5
-     * StringUtils.indexOfIgnoreCase("aabaabaa", "B", 9)  = -1
-     * StringUtils.indexOfIgnoreCase("aabaabaa", "B", -1) = 2
-     * StringUtils.indexOfIgnoreCase("aabaabaa", "", 2)   = 2
-     * StringUtils.indexOfIgnoreCase("abc", "", 9)        = 3
-     * </pre>
-     *
-     * @param str  the CharSequence to check, may be null
-     * @param searchStr  the CharSequence to find, may be null
-     * @param startPos  the start position, negative treated as zero
-     * @return the first index of the search CharSequence (always &ge; startPos),
-     *  -1 if no match or {@code null} string input
-     * @since 2.5
-     * @since 3.0 Changed signature from indexOfIgnoreCase(String, String, int) to indexOfIgnoreCase(CharSequence, CharSequence, int)
-     */
-    public static int indexOfIgnoreCase(final CharSequence str, final CharSequence searchStr, int startPos) {
-        if (str == null || searchStr == null) {
-            return INDEX_NOT_FOUND;
-        }
-        if (startPos < 0) {
-            startPos = 0;
-        }
-        final int endLimit = str.length() - searchStr.length() + 1;
-        if (startPos > endLimit) {
-            return INDEX_NOT_FOUND;
-        }
-        if (searchStr.length() == 0) {
-            return startPos;
-        }
-        for (int i = startPos; i < endLimit; i++) {
-            if (CharSequenceUtils.regionMatches(str, true, i, searchStr, 0, searchStr.length())) {
-                return i;
-            }
-        }
-        return INDEX_NOT_FOUND;
-    }
-
-    // LastIndexOf
-    //-----------------------------------------------------------------------
-    /**
-     * <p>Finds the last index within a CharSequence, handling {@code null}.
-     * This method uses {@link String#lastIndexOf(int)} if possible.</p>
-     *
-     * <p>A {@code null} or empty ("") CharSequence will return {@code -1}.</p>
-     *
-     * <pre>
-     * StringUtils.lastIndexOf(null, *)         = -1
-     * StringUtils.lastIndexOf("", *)           = -1
-     * StringUtils.lastIndexOf("aabaabaa", 'a') = 7
-     * StringUtils.lastIndexOf("aabaabaa", 'b') = 5
-     * </pre>
-     *
-     * @param seq  the CharSequence to check, may be null
-     * @param searchChar  the character to find
-     * @return the last index of the search character,
-     *  -1 if no match or {@code null} string input
-     * @since 2.0
-     * @since 3.0 Changed signature from lastIndexOf(String, int) to lastIndexOf(CharSequence, int)
-     */
-    public static int lastIndexOf(final CharSequence seq, final int searchChar) {
-        if (isEmpty(seq)) {
-            return INDEX_NOT_FOUND;
-        }
-        return CharSequenceUtils.lastIndexOf(seq, searchChar, seq.length());
-    }
-
-    /**
-     * <p>Finds the last index within a CharSequence from a start position,
-     * handling {@code null}.
-     * This method uses {@link String#lastIndexOf(int, int)} if possible.</p>
-     *
-     * <p>A {@code null} or empty ("") CharSequence will return {@code -1}.
-     * A negative start position returns {@code -1}.
-     * A start position greater than the string length searches the whole string.
-     * The search starts at the startPos and works backwards; matches starting after the start
-     * position are ignored.
-     * </p>
-     *
-     * <pre>
-     * StringUtils.lastIndexOf(null, *, *)          = -1
-     * StringUtils.lastIndexOf("", *,  *)           = -1
-     * StringUtils.lastIndexOf("aabaabaa", 'b', 8)  = 5
-     * StringUtils.lastIndexOf("aabaabaa", 'b', 4)  = 2
-     * StringUtils.lastIndexOf("aabaabaa", 'b', 0)  = -1
-     * StringUtils.lastIndexOf("aabaabaa", 'b', 9)  = 5
-     * StringUtils.lastIndexOf("aabaabaa", 'b', -1) = -1
-     * StringUtils.lastIndexOf("aabaabaa", 'a', 0)  = 0
-     * </pre>
-     *
-     * @param seq  the CharSequence to check, may be null
-     * @param searchChar  the character to find
-     * @param startPos  the start position
-     * @return the last index of the search character (always &le; startPos),
-     *  -1 if no match or {@code null} string input
-     * @since 2.0
-     * @since 3.0 Changed signature from lastIndexOf(String, int, int) to lastIndexOf(CharSequence, int, int)
-     */
-    public static int lastIndexOf(final CharSequence seq, final int searchChar, final int startPos) {
-        if (isEmpty(seq)) {
-            return INDEX_NOT_FOUND;
-        }
-        return CharSequenceUtils.lastIndexOf(seq, searchChar, startPos);
-    }
-
-    /**
-     * <p>Finds the last index within a CharSequence, handling {@code null}.
-     * This method uses {@link String#lastIndexOf(String)} if possible.</p>
-     *
-     * <p>A {@code null} CharSequence will return {@code -1}.</p>
-     *
-     * <pre>
-     * StringUtils.lastIndexOf(null, *)          = -1
-     * StringUtils.lastIndexOf(*, null)          = -1
-     * StringUtils.lastIndexOf("", "")           = 0
-     * StringUtils.lastIndexOf("aabaabaa", "a")  = 7
-     * StringUtils.lastIndexOf("aabaabaa", "b")  = 5
-     * StringUtils.lastIndexOf("aabaabaa", "ab") = 4
-     * StringUtils.lastIndexOf("aabaabaa", "")   = 8
-     * </pre>
-     *
-     * @param seq  the CharSequence to check, may be null
-     * @param searchSeq  the CharSequence to find, may be null
-     * @return the last index of the search String,
-     *  -1 if no match or {@code null} string input
-     * @since 2.0
-     * @since 3.0 Changed signature from lastIndexOf(String, String) to lastIndexOf(CharSequence, CharSequence)
-     */
-    public static int lastIndexOf(final CharSequence seq, final CharSequence searchSeq) {
-        if (seq == null || searchSeq == null) {
-            return INDEX_NOT_FOUND;
-        }
-        return CharSequenceUtils.lastIndexOf(seq, searchSeq, seq.length());
-    }
-
-    /**
-     * <p>Finds the n-th last index within a String, handling {@code null}.
-     * This method uses {@link String#lastIndexOf(String)}.</p>
-     *
-     * <p>A {@code null} String will return {@code -1}.</p>
-     *
-     * <pre>
-     * StringUtils.lastOrdinalIndexOf(null, *, *)          = -1
-     * StringUtils.lastOrdinalIndexOf(*, null, *)          = -1
-     * StringUtils.lastOrdinalIndexOf("", "", *)           = 0
-     * StringUtils.lastOrdinalIndexOf("aabaabaa", "a", 1)  = 7
-     * StringUtils.lastOrdinalIndexOf("aabaabaa", "a", 2)  = 6
-     * StringUtils.lastOrdinalIndexOf("aabaabaa", "b", 1)  = 5
-     * StringUtils.lastOrdinalIndexOf("aabaabaa", "b", 2)  = 2
-     * StringUtils.lastOrdinalIndexOf("aabaabaa", "ab", 1) = 4
-     * StringUtils.lastOrdinalIndexOf("aabaabaa", "ab", 2) = 1
-     * StringUtils.lastOrdinalIndexOf("aabaabaa", "", 1)   = 8
-     * StringUtils.lastOrdinalIndexOf("aabaabaa", "", 2)   = 8
-     * </pre>
-     *
-     * <p>Note that 'tail(CharSequence str, int n)' may be implemented as: </p>
-     *
-     * <pre>
-     *   str.substring(lastOrdinalIndexOf(str, "\n", n) + 1)
-     * </pre>
-     *
-     * @param str  the CharSequence to check, may be null
-     * @param searchStr  the CharSequence to find, may be null
-     * @param ordinal  the n-th last {@code searchStr} to find
-     * @return the n-th last index of the search CharSequence,
-     *  {@code -1} ({@code INDEX_NOT_FOUND}) if no match or {@code null} string input
-     * @since 2.5
-     * @since 3.0 Changed signature from lastOrdinalIndexOf(String, String, int) to lastOrdinalIndexOf(CharSequence, CharSequence, int)
-     */
-    public static int lastOrdinalIndexOf(final CharSequence str, final CharSequence searchStr, final int ordinal) {
-        return ordinalIndexOf(str, searchStr, ordinal, true);
-    }
-
-    /**
-     * <p>Finds the last index within a CharSequence, handling {@code null}.
-     * This method uses {@link String#lastIndexOf(String, int)} if possible.</p>
-     *
-     * <p>A {@code null} CharSequence will return {@code -1}.
-     * A negative start position returns {@code -1}.
-     * An empty ("") search CharSequence always matches unless the start position is negative.
-     * A start position greater than the string length searches the whole string.
-     * The search starts at the startPos and works backwards; matches starting after the start
-     * position are ignored.
-     * </p>
-     *
-     * <pre>
-     * StringUtils.lastIndexOf(null, *, *)          = -1
-     * StringUtils.lastIndexOf(*, null, *)          = -1
-     * StringUtils.lastIndexOf("aabaabaa", "a", 8)  = 7
-     * StringUtils.lastIndexOf("aabaabaa", "b", 8)  = 5
-     * StringUtils.lastIndexOf("aabaabaa", "ab", 8) = 4
-     * StringUtils.lastIndexOf("aabaabaa", "b", 9)  = 5
-     * StringUtils.lastIndexOf("aabaabaa", "b", -1) = -1
-     * StringUtils.lastIndexOf("aabaabaa", "a", 0)  = 0
-     * StringUtils.lastIndexOf("aabaabaa", "b", 0)  = -1
-     * StringUtils.lastIndexOf("aabaabaa", "b", 1)  = -1
-     * StringUtils.lastIndexOf("aabaabaa", "b", 2)  = 2
-     * StringUtils.lastIndexOf("aabaabaa", "ba", 2)  = -1
-     * StringUtils.lastIndexOf("aabaabaa", "ba", 2)  = 2
-     * </pre>
-     *
-     * @param seq  the CharSequence to check, may be null
-     * @param searchSeq  the CharSequence to find, may be null
-     * @param startPos  the start position, negative treated as zero
-     * @return the last index of the search CharSequence (always &le; startPos),
-     *  -1 if no match or {@code null} string input
-     * @since 2.0
-     * @since 3.0 Changed signature from lastIndexOf(String, String, int) to lastIndexOf(CharSequence, CharSequence, int)
-     */
-    public static int lastIndexOf(final CharSequence seq, final CharSequence searchSeq, final int startPos) {
-        if (seq == null || searchSeq == null) {
-            return INDEX_NOT_FOUND;
-        }
-        return CharSequenceUtils.lastIndexOf(seq, searchSeq, startPos);
-    }
-
-    /**
-     * <p>Case in-sensitive find of the last index within a CharSequence.</p>
-     *
-     * <p>A {@code null} CharSequence will return {@code -1}.
-     * A negative start position returns {@code -1}.
-     * An empty ("") search CharSequence always matches unless the start position is negative.
-     * A start position greater than the string length searches the whole string.</p>
-     *
-     * <pre>
-     * StringUtils.lastIndexOfIgnoreCase(null, *)          = -1
-     * StringUtils.lastIndexOfIgnoreCase(*, null)          = -1
-     * StringUtils.lastIndexOfIgnoreCase("aabaabaa", "A")  = 7
-     * StringUtils.lastIndexOfIgnoreCase("aabaabaa", "B")  = 5
-     * StringUtils.lastIndexOfIgnoreCase("aabaabaa", "AB") = 4
-     * </pre>
-     *
-     * @param str  the CharSequence to check, may be null
-     * @param searchStr  the CharSequence to find, may be null
-     * @return the first index of the search CharSequence,
-     *  -1 if no match or {@code null} string input
-     * @since 2.5
-     * @since 3.0 Changed signature from lastIndexOfIgnoreCase(String, String) to lastIndexOfIgnoreCase(CharSequence, CharSequence)
-     */
-    public static int lastIndexOfIgnoreCase(final CharSequence str, final CharSequence searchStr) {
-        if (str == null || searchStr == null) {
-            return INDEX_NOT_FOUND;
-        }
-        return lastIndexOfIgnoreCase(str, searchStr, str.length());
-    }
-
-    /**
-     * <p>Case in-sensitive find of the last index within a CharSequence
-     * from the specified position.</p>
-     *
-     * <p>A {@code null} CharSequence will return {@code -1}.
-     * A negative start position returns {@code -1}.
-     * An empty ("") search CharSequence always matches unless the start position is negative.
-     * A start position greater than the string length searches the whole string.
-     * The search starts at the startPos and works backwards; matches starting after the start
-     * position are ignored.
-     * </p>
-     *
-     * <pre>
-     * StringUtils.lastIndexOfIgnoreCase(null, *, *)          = -1
-     * StringUtils.lastIndexOfIgnoreCase(*, null, *)          = -1
-     * StringUtils.lastIndexOfIgnoreCase("aabaabaa", "A", 8)  = 7
-     * StringUtils.lastIndexOfIgnoreCase("aabaabaa", "B", 8)  = 5
-     * StringUtils.lastIndexOfIgnoreCase("aabaabaa", "AB", 8) = 4
-     * StringUtils.lastIndexOfIgnoreCase("aabaabaa", "B", 9)  = 5
-     * StringUtils.lastIndexOfIgnoreCase("aabaabaa", "B", -1) = -1
-     * StringUtils.lastIndexOfIgnoreCase("aabaabaa", "A", 0)  = 0
-     * StringUtils.lastIndexOfIgnoreCase("aabaabaa", "B", 0)  = -1
-     * </pre>
-     *
-     * @param str  the CharSequence to check, may be null
-     * @param searchStr  the CharSequence to find, may be null
-     * @param startPos  the start position
-     * @return the last index of the search CharSequence (always &le; startPos),
-     *  -1 if no match or {@code null} input
-     * @since 2.5
-     * @since 3.0 Changed signature from lastIndexOfIgnoreCase(String, String, int) to lastIndexOfIgnoreCase(CharSequence, CharSequence, int)
-     */
-    public static int lastIndexOfIgnoreCase(final CharSequence str, final CharSequence searchStr, int startPos) {
-        if (str == null || searchStr == null) {
-            return INDEX_NOT_FOUND;
-        }
-        if (startPos > str.length() - searchStr.length()) {
-            startPos = str.length() - searchStr.length();
-        }
-        if (startPos < 0) {
-            return INDEX_NOT_FOUND;
-        }
-        if (searchStr.length() == 0) {
-            return startPos;
-        }
-
-        for (int i = startPos; i >= 0; i--) {
-            if (CharSequenceUtils.regionMatches(str, true, i, searchStr, 0, searchStr.length())) {
-                return i;
-            }
-        }
-        return INDEX_NOT_FOUND;
-    }
-
-    // Contains
-    //-----------------------------------------------------------------------
-    /**
-     * <p>Checks if CharSequence contains a search character, handling {@code null}.
-     * This method uses {@link String#indexOf(int)} if possible.</p>
-     *
-     * <p>A {@code null} or empty ("") CharSequence will return {@code false}.</p>
-     *
-     * <pre>
-     * StringUtils.contains(null, *)    = false
-     * StringUtils.contains("", *)      = false
-     * StringUtils.contains("abc", 'a') = true
-     * StringUtils.contains("abc", 'z') = false
-     * </pre>
-     *
-     * @param seq  the CharSequence to check, may be null
-     * @param searchChar  the character to find
-     * @return true if the CharSequence contains the search character,
-     *  false if not or {@code null} string input
-     * @since 2.0
-     * @since 3.0 Changed signature from contains(String, int) to contains(CharSequence, int)
-     */
-    public static boolean contains(final CharSequence seq, final int searchChar) {
-        if (isEmpty(seq)) {
-            return false;
-        }
-        return CharSequenceUtils.indexOf(seq, searchChar, 0) >= 0;
-    }
-
-    /**
-     * <p>Checks if CharSequence contains a search CharSequence, handling {@code null}.
-     * This method uses {@link String#indexOf(String)} if possible.</p>
-     *
-     * <p>A {@code null} CharSequence will return {@code false}.</p>
-     *
-     * <pre>
-     * StringUtils.contains(null, *)     = false
-     * StringUtils.contains(*, null)     = false
-     * StringUtils.contains("", "")      = true
-     * StringUtils.contains("abc", "")   = true
-     * StringUtils.contains("abc", "a")  = true
-     * StringUtils.contains("abc", "z")  = false
-     * </pre>
-     *
-     * @param seq  the CharSequence to check, may be null
-     * @param searchSeq  the CharSequence to find, may be null
-     * @return true if the CharSequence contains the search CharSequence,
-     *  false if not or {@code null} string input
-     * @since 2.0
-     * @since 3.0 Changed signature from contains(String, String) to contains(CharSequence, CharSequence)
-     */
-    public static boolean contains(final CharSequence seq, final CharSequence searchSeq) {
-        if (seq == null || searchSeq == null) {
-            return false;
-        }
-        return CharSequenceUtils.indexOf(seq, searchSeq, 0) >= 0;
-    }
-
-    /**
-     * <p>Checks if CharSequence contains a search CharSequence irrespective of case,
-     * handling {@code null}. Case-insensitivity is defined as by
-     * {@link String#equalsIgnoreCase(String)}.
-     *
-     * <p>A {@code null} CharSequence will return {@code false}.</p>
-     *
-     * <pre>
-     * StringUtils.contains(null, *) = false
-     * StringUtils.contains(*, null) = false
-     * StringUtils.contains("", "") = true
-     * StringUtils.contains("abc", "") = true
-     * StringUtils.contains("abc", "a") = true
-     * StringUtils.contains("abc", "z") = false
-     * StringUtils.contains("abc", "A") = true
-     * StringUtils.contains("abc", "Z") = false
-     * </pre>
-     *
-     * @param str  the CharSequence to check, may be null
-     * @param searchStr  the CharSequence to find, may be null
-     * @return true if the CharSequence contains the search CharSequence irrespective of
-     * case or false if not or {@code null} string input
-     * @since 3.0 Changed signature from containsIgnoreCase(String, String) to containsIgnoreCase(CharSequence, CharSequence)
-     */
-    public static boolean containsIgnoreCase(final CharSequence str, final CharSequence searchStr) {
-        if (str == null || searchStr == null) {
-            return false;
-        }
-        final int len = searchStr.length();
-        final int max = str.length() - len;
-        for (int i = 0; i <= max; i++) {
-            if (CharSequenceUtils.regionMatches(str, true, i, searchStr, 0, len)) {
-                return true;
-            }
-        }
-        return false;
-    }
-
-    /**
-     * Check whether the given CharSequence contains any whitespace characters.
-     * @param seq the CharSequence to check (may be {@code null})
-     * @return {@code true} if the CharSequence is not empty and
-     * contains at least 1 whitespace character
-     * @see java.lang.Character#isWhitespace
-     * @since 3.0
-     */
-    // From org.springframework.util.StringUtils, under Apache License 2.0
-    public static boolean containsWhitespace(final CharSequence seq) {
-        if (isEmpty(seq)) {
-            return false;
-        }
-        final int strLen = seq.length();
-        for (int i = 0; i < strLen; i++) {
-            if (Character.isWhitespace(seq.charAt(i))) {
-                return true;
-            }
-        }
-        return false;
-    }
-
-    // IndexOfAny chars
-    //-----------------------------------------------------------------------
-    /**
-     * <p>Search a CharSequence to find the first index of any
-     * character in the given set of characters.</p>
-     *
-     * <p>A {@code null} String will return {@code -1}.
-     * A {@code null} or zero length search array will return {@code -1}.</p>
-     *
-     * <pre>
-     * StringUtils.indexOfAny(null, *)                = -1
-     * StringUtils.indexOfAny("", *)                  = -1
-     * StringUtils.indexOfAny(*, null)                = -1
-     * StringUtils.indexOfAny(*, [])                  = -1
-     * StringUtils.indexOfAny("zzabyycdxx",['z','a']) = 0
-     * StringUtils.indexOfAny("zzabyycdxx",['b','y']) = 3
-     * StringUtils.indexOfAny("aba", ['z'])           = -1
-     * </pre>
-     *
-     * @param cs  the CharSequence to check, may be null
-     * @param searchChars  the chars to search for, may be null
-     * @return the index of any of the chars, -1 if no match or null input
-     * @since 2.0
-     * @since 3.0 Changed signature from indexOfAny(String, char[]) to indexOfAny(CharSequence, char...)
-     */
-    public static int indexOfAny(final CharSequence cs, final char... searchChars) {
-        if (isEmpty(cs) || ArrayUtils.isEmpty(searchChars)) {
-            return INDEX_NOT_FOUND;
-        }
-        final int csLen = cs.length();
-        final int csLast = csLen - 1;
-        final int searchLen = searchChars.length;
-        final int searchLast = searchLen - 1;
-        for (int i = 0; i < csLen; i++) {
-            final char ch = cs.charAt(i);
-            for (int j = 0; j < searchLen; j++) {
-                if (searchChars[j] == ch) {
-                    if (i < csLast && j < searchLast && Character.isHighSurrogate(ch)) {
-                        // ch is a supplementary character
-                        if (searchChars[j + 1] == cs.charAt(i + 1)) {
-                            return i;
-                        }
-                    } else {
-                        return i;
-                    }
-                }
-            }
-        }
-        return INDEX_NOT_FOUND;
-    }
-
-    /**
-     * <p>Search a CharSequence to find the first index of any
-     * character in the given set of characters.</p>
-     *
-     * <p>A {@code null} String will return {@code -1}.
-     * A {@code null} search string will return {@code -1}.</p>
-     *
-     * <pre>
-     * StringUtils.indexOfAny(null, *)            = -1
-     * StringUtils.indexOfAny("", *)              = -1
-     * StringUtils.indexOfAny(*, null)            = -1
-     * StringUtils.indexOfAny(*, "")              = -1
-     * StringUtils.indexOfAny("zzabyycdxx", "za") = 0
-     * StringUtils.indexOfAny("zzabyycdxx", "by") = 3
-     * StringUtils.indexOfAny("aba","z")          = -1
-     * </pre>
-     *
-     * @param cs  the CharSequence to check, may be null
-     * @param searchChars  the chars to search for, may be null
-     * @return the index of any of the chars, -1 if no match or null input
-     * @since 2.0
-     * @since 3.0 Changed signature from indexOfAny(String, String) to indexOfAny(CharSequence, String)
-     */
-    public static int indexOfAny(final CharSequence cs, final String searchChars) {
-        if (isEmpty(cs) || isEmpty(searchChars)) {
-            return INDEX_NOT_FOUND;
-        }
-        return indexOfAny(cs, searchChars.toCharArray());
-    }
-
-    // ContainsAny
-    //-----------------------------------------------------------------------
-    /**
-     * <p>Checks if the CharSequence contains any character in the given
-     * set of characters.</p>
-     *
-     * <p>A {@code null} CharSequence will return {@code false}.
-     * A {@code null} or zero length search array will return {@code false}.</p>
-     *
-     * <pre>
-     * StringUtils.containsAny(null, *)                = false
-     * StringUtils.containsAny("", *)                  = false
-     * StringUtils.containsAny(*, null)                = false
-     * StringUtils.containsAny(*, [])                  = false
-     * StringUtils.containsAny("zzabyycdxx",['z','a']) = true
-     * StringUtils.containsAny("zzabyycdxx",['b','y']) = true
-     * StringUtils.containsAny("aba", ['z'])           = false
-     * </pre>
-     *
-     * @param cs  the CharSequence to check, may be null
-     * @param searchChars  the chars to search for, may be null
-     * @return the {@code true} if any of the chars are found,
-     * {@code false} if no match or null input
-     * @since 2.4
-     * @since 3.0 Changed signature from containsAny(String, char[]) to containsAny(CharSequence, char...)
-     */
-    public static boolean containsAny(final CharSequence cs, final char... searchChars) {
-        if (isEmpty(cs) || ArrayUtils.isEmpty(searchChars)) {
-            return false;
-        }
-        final int csLength = cs.length();
-        final int searchLength = searchChars.length;
-        final int csLast = csLength - 1;
-        final int searchLast = searchLength - 1;
-        for (int i = 0; i < csLength; i++) {
-            final char ch = cs.charAt(i);
-            for (int j = 0; j < searchLength; j++) {
-                if (searchChars[j] == ch) {
-                    if (Character.isHighSurrogate(ch)) {
-                        if (j == searchLast) {
-                            // missing low surrogate, fine, like String.indexOf(String)
-                            return true;
-                        }
-                        if (i < csLast && searchChars[j + 1] == cs.charAt(i + 1)) {
-                            return true;
-                        }
-                    } else {
-                        // ch is in the Basic Multilingual Plane
-                        return true;
-                    }
-                }
-            }
-        }
-        return false;
-    }
-
-    /**
-     * <p>
-     * Checks if the CharSequence contains any character in the given set of characters.
-     * </p>
-     *
-     * <p>
-     * A {@code null} CharSequence will return {@code false}. A {@code null} search CharSequence will return
-     * {@code false}.
-     * </p>
-     *
-     * <pre>
-     * StringUtils.containsAny(null, *)            = false
-     * StringUtils.containsAny("", *)              = false
-     * StringUtils.containsAny(*, null)            = false
-     * StringUtils.containsAny(*, "")              = false
-     * StringUtils.containsAny("zzabyycdxx", "za") = true
-     * StringUtils.containsAny("zzabyycdxx", "by") = true
-     * StringUtils.containsAny("aba","z")          = false
-     * </pre>
-     *
-     * @param cs
-     *            the CharSequence to check, may be null
-     * @param searchChars
-     *            the chars to search for, may be null
-     * @return the {@code true} if any of the chars are found, {@code false} if no match or null input
-     * @since 2.4
-     * @since 3.0 Changed signature from containsAny(String, String) to containsAny(CharSequence, CharSequence)
-     */
-    public static boolean containsAny(final CharSequence cs, final CharSequence searchChars) {
-        if (searchChars == null) {
-            return false;
-        }
-        return containsAny(cs, CharSequenceUtils.toCharArray(searchChars));
-    }
-
-    /**
-     * <p>Checks if the CharSequence contains any of the CharSequences in the given array.</p>
-     *
-     * <p>
-     * A {@code null} CharSequence will return {@code false}. A {@code null} or zero
-     * length search array will return {@code false}.
-     * </p>
-     *
-     * <pre>
-     * StringUtils.containsAny(null, *)            = false
-     * StringUtils.containsAny("", *)              = false
-     * StringUtils.containsAny(*, null)            = false
-     * StringUtils.containsAny(*, [])              = false
-     * StringUtils.containsAny("abcd", "ab", "cd") = false
-     * StringUtils.containsAny("abc", "d", "abc")  = true
-     * </pre>
-     *
-     * 
-     * @param cs The CharSequence to check, may be null
-     * @param searchCharSequences The array of CharSequences to search for, may be null
-     * @return {@code true} if any of the search CharSequences are found, {@code false} otherwise
-     * @since 3.4
-     */
-    public static boolean containsAny(CharSequence cs, CharSequence... searchCharSequences) {
-        if (isEmpty(cs) || ArrayUtils.isEmpty(searchCharSequences)) {
-            return false;
-        }
-        for (CharSequence searchCharSequence : searchCharSequences) {
-            if (contains(cs, searchCharSequence)) {
-                return true;
-            }
-        }
-        return false;
-    }
-
-    // IndexOfAnyBut chars
-    //-----------------------------------------------------------------------
-    /**
-     * <p>Searches a CharSequence to find the first index of any
-     * character not in the given set of characters.</p>
-     *
-     * <p>A {@code null} CharSequence will return {@code -1}.
-     * A {@code null} or zero length search array will return {@code -1}.</p>
-     *
-     * <pre>
-     * StringUtils.indexOfAnyBut(null, *)                              = -1
-     * StringUtils.indexOfAnyBut("", *)                                = -1
-     * StringUtils.indexOfAnyBut(*, null)                              = -1
-     * StringUtils.indexOfAnyBut(*, [])                                = -1
-     * StringUtils.indexOfAnyBut("zzabyycdxx", new char[] {'z', 'a'} ) = 3
-     * StringUtils.indexOfAnyBut("aba", new char[] {'z'} )             = 0
-     * StringUtils.indexOfAnyBut("aba", new char[] {'a', 'b'} )        = -1
-
-     * </pre>
-     *
-     * @param cs  the CharSequence to check, may be null
-     * @param searchChars  the chars to search for, may be null
-     * @return the index of any of the chars, -1 if no match or null input
-     * @since 2.0
-     * @since 3.0 Changed signature from indexOfAnyBut(String, char[]) to indexOfAnyBut(CharSequence, char...)
-     */
-    public static int indexOfAnyBut(final CharSequence cs, final char... searchChars) {
-        if (isEmpty(cs) || ArrayUtils.isEmpty(searchChars)) {
-            return INDEX_NOT_FOUND;
-        }
-        final int csLen = cs.length();
-        final int csLast = csLen - 1;
-        final int searchLen = searchChars.length;
-        final int searchLast = searchLen - 1;
-        outer:
-        for (int i = 0; i < csLen; i++) {
-            final char ch = cs.charAt(i);
-            for (int j = 0; j < searchLen; j++) {
-                if (searchChars[j] == ch) {
-                    if (i < csLast && j < searchLast && Character.isHighSurrogate(ch)) {
-                        if (searchChars[j + 1] == cs.charAt(i + 1)) {
-                            continue outer;
-                        }
-                    } else {
-                        continue outer;
-                    }
-                }
-            }
-            return i;
-        }
-        return INDEX_NOT_FOUND;
-    }
-
-    /**
-     * <p>Search a CharSequence to find the first index of any
-     * character not in the given set of characters.</p>
-     *
-     * <p>A {@code null} CharSequence will return {@code -1}.
-     * A {@code null} or empty search string will return {@code -1}.</p>
-     *
-     * <pre>
-     * StringUtils.indexOfAnyBut(null, *)            = -1
-     * StringUtils.indexOfAnyBut("", *)              = -1
-     * StringUtils.indexOfAnyBut(*, null)            = -1
-     * StringUtils.indexOfAnyBut(*, "")              = -1
-     * StringUtils.indexOfAnyBut("zzabyycdxx", "za") = 3
-     * StringUtils.indexOfAnyBut("zzabyycdxx", "")   = -1
-     * StringUtils.indexOfAnyBut("aba","ab")         = -1
-     * </pre>
-     *
-     * @param seq  the CharSequence to check, may be null
-     * @param searchChars  the chars to search for, may be null
-     * @return the index of any of the chars, -1 if no match or null input
-     * @since 2.0
-     * @since 3.0 Changed signature from indexOfAnyBut(String, String) to indexOfAnyBut(CharSequence, CharSequence)
-     */
-    public static int indexOfAnyBut(final CharSequence seq, final CharSequence searchChars) {
-        if (isEmpty(seq) || isEmpty(searchChars)) {
-            return INDEX_NOT_FOUND;
-        }
-        final int strLen = seq.length();
-        for (int i = 0; i < strLen; i++) {
-            final char ch = seq.charAt(i);
-            final boolean chFound = CharSequenceUtils.indexOf(searchChars, ch, 0) >= 0;
-            if (i + 1 < strLen && Character.isHighSurrogate(ch)) {
-                final char ch2 = seq.charAt(i + 1);
-                if (chFound && CharSequenceUtils.indexOf(searchChars, ch2, 0) < 0) {
-                    return i;
-                }
-            } else {
-                if (!chFound) {
-                    return i;
-                }
-            }
-        }
-        return INDEX_NOT_FOUND;
-    }
-
-    // ContainsOnly
-    //-----------------------------------------------------------------------
-    /**
-     * <p>Checks if the CharSequence contains only certain characters.</p>
-     *
-     * <p>A {@code null} CharSequence will return {@code false}.
-     * A {@code null} valid character array will return {@code false}.
-     * An empty CharSequence (length()=0) always returns {@code true}.</p>
-     *
-     * <pre>
-     * StringUtils.containsOnly(null, *)       = false
-     * StringUtils.containsOnly(*, null)       = false
-     * StringUtils.containsOnly("", *)         = true
-     * StringUtils.containsOnly("ab", '')      = false
-     * StringUtils.containsOnly("abab", 'abc') = true
-     * StringUtils.containsOnly("ab1", 'abc')  = false
-     * StringUtils.containsOnly("abz", 'abc')  = false
-     * </pre>
-     *
-     * @param cs  the String to check, may be null
-     * @param valid  an array of valid chars, may be null
-     * @return true if it only contains valid chars and is non-null
-     * @since 3.0 Changed signature from containsOnly(String, char[]) to containsOnly(CharSequence, char...)
-     */
-    public static boolean containsOnly(final CharSequence cs, final char... valid) {
-        // All these pre-checks are to maintain API with an older version
-        if (valid == null || cs == null) {
-            return false;
-        }
-        if (cs.length() == 0) {
-            return true;
-        }
-        if (valid.length == 0) {
-            return false;
-        }
-        return indexOfAnyBut(cs, valid) == INDEX_NOT_FOUND;
-    }
-
-    /**
-     * <p>Checks if the CharSequence contains only certain characters.</p>
-     *
-     * <p>A {@code null} CharSequence will return {@code false}.
-     * A {@code null} valid character String will return {@code false}.
-     * An empty String (length()=0) always returns {@code true}.</p>
-     *
-     * <pre>
-     * StringUtils.containsOnly(null, *)       = false
-     * StringUtils.containsOnly(*, null)       = false
-     * StringUtils.containsOnly("", *)         = true
-     * StringUtils.containsOnly("ab", "")      = false
-     * StringUtils.containsOnly("abab", "abc") = true
-     * StringUtils.containsOnly("ab1", "abc")  = false
-     * StringUtils.containsOnly("abz", "abc")  = false
-     * </pre>
-     *
-     * @param cs  the CharSequence to check, may be null
-     * @param validChars  a String of valid chars, may be null
-     * @return true if it only contains valid chars and is non-null
-     * @since 2.0
-     * @since 3.0 Changed signature from containsOnly(String, String) to containsOnly(CharSequence, String)
-     */
-    public static boolean containsOnly(final CharSequence cs, final String validChars) {
-        if (cs == null || validChars == null) {
-            return false;
-        }
-        return containsOnly(cs, validChars.toCharArray());
-    }
-
-    // ContainsNone
-    //-----------------------------------------------------------------------
-    /**
-     * <p>Checks that the CharSequence does not contain certain characters.</p>
-     *
-     * <p>A {@code null} CharSequence will return {@code true}.
-     * A {@code null} invalid character array will return {@code true}.
-     * An empty CharSequence (length()=0) always returns true.</p>
-     *
-     * <pre>
-     * StringUtils.containsNone(null, *)       = true
-     * StringUtils.containsNone(*, null)       = true
-     * StringUtils.containsNone("", *)         = true
-     * StringUtils.containsNone("ab", '')      = true
-     * StringUtils.containsNone("abab", 'xyz') = true
-     * StringUtils.containsNone("ab1", 'xyz')  = true
-     * StringUtils.containsNone("abz", 'xyz')  = false
-     * </pre>
-     *
-     * @param cs  the CharSequence to check, may be null
-     * @param searchChars  an array of invalid chars, may be null
-     * @return true if it contains none of the invalid chars, or is null
-     * @since 2.0
-     * @since 3.0 Changed signature from containsNone(String, char[]) to containsNone(CharSequence, char...)
-     */
-    public static boolean containsNone(final CharSequence cs, final char... searchChars) {
-        if (cs == null || searchChars == null) {
-            return true;
-        }
-        final int csLen = cs.length();
-        final int csLast = csLen - 1;
-        final int searchLen = searchChars.length;
-        final int searchLast = searchLen - 1;
-        for (int i = 0; i < csLen; i++) {
-            final char ch = cs.charAt(i);
-            for (int j = 0; j < searchLen; j++) {
-                if (searchChars[j] == ch) {
-                    if (Character.isHighSurrogate(ch)) {
-                        if (j == searchLast) {
-                            // missing low surrogate, fine, like String.indexOf(String)
-                            return false;
-                        }
-                        if (i < csLast && searchChars[j + 1] == cs.charAt(i + 1)) {
-                            return false;
-                        }
-                    } else {
-                        // ch is in the Basic Multilingual Plane
-                        return false;
-                    }
-                }
-            }
-        }
-        return true;
-    }
-
-    /**
-     * <p>Checks that the CharSequence does not contain certain characters.</p>
-     *
-     * <p>A {@code null} CharSequence will return {@code true}.
-     * A {@code null} invalid character array will return {@code true}.
-     * An empty String ("") always returns true.</p>
-     *
-     * <pre>
-     * StringUtils.containsNone(null, *)       = true
-     * StringUtils.containsNone(*, null)       = true
-     * StringUtils.containsNone("", *)         = true
-     * StringUtils.containsNone("ab", "")      = true
-     * StringUtils.containsNone("abab", "xyz") = true
-     * StringUtils.containsNone("ab1", "xyz")  = true
-     * StringUtils.containsNone("abz", "xyz")  = false
-     * </pre>
-     *
-     * @param cs  the CharSequence to check, may be null
-     * @param invalidChars  a String of invalid chars, may be null
-     * @return true if it contains none of the invalid chars, or is null
-     * @since 2.0
-     * @since 3.0 Changed signature from containsNone(String, String) to containsNone(CharSequence, String)
-     */
-    public static boolean containsNone(final CharSequence cs, final String invalidChars) {
-        if (cs == null || invalidChars == null) {
-            return true;
-        }
-        return containsNone(cs, invalidChars.toCharArray());
-    }
-
-    // IndexOfAny strings
-    //-----------------------------------------------------------------------
-    /**
-     * <p>Find the first index of any of a set of potential substrings.</p>
-     *
-     * <p>A {@code null} CharSequence will return {@code -1}.
-     * A {@code null} or zero length search array will return {@code -1}.
-     * A {@code null} search array entry will be ignored, but a search
-     * array containing "" will return {@code 0} if {@code str} is not
-     * null. This method uses {@link String#indexOf(String)} if possible.</p>
-     *
-     * <pre>
-     * StringUtils.indexOfAny(null, *)                     = -1
-     * StringUtils.indexOfAny(*, null)                     = -1
-     * StringUtils.indexOfAny(*, [])                       = -1
-     * StringUtils.indexOfAny("zzabyycdxx", ["ab","cd"])   = 2
-     * StringUtils.indexOfAny("zzabyycdxx", ["cd","ab"])   = 2
-     * StringUtils.indexOfAny("zzabyycdxx", ["mn","op"])   = -1
-     * StringUtils.indexOfAny("zzabyycdxx", ["zab","aby"]) = 1
-     * StringUtils.indexOfAny("zzabyycdxx", [""])          = 0
-     * StringUtils.indexOfAny("", [""])                    = 0
-     * StringUtils.indexOfAny("", ["a"])                   = -1
-     * </pre>
-     *
-     * @param str  the CharSequence to check, may be null
-     * @param searchStrs  the CharSequences to search for, may be null
-     * @return the first index of any of the searchStrs in str, -1 if no match
-     * @since 3.0 Changed signature from indexOfAny(String, String[]) to indexOfAny(CharSequence, CharSequence...)
-     */
-    public static int indexOfAny(final CharSequence str, final CharSequence... searchStrs) {
-        if (str == null || searchStrs == null) {
-            return INDEX_NOT_FOUND;
-        }
-        final int sz = searchStrs.length;
-
-        // String's can't have a MAX_VALUEth index.
-        int ret = Integer.MAX_VALUE;
-
-        int tmp = 0;
-        for (int i = 0; i < sz; i++) {
-            final CharSequence search = searchStrs[i];
-            if (search == null) {
-                continue;
-            }
-            tmp = CharSequenceUtils.indexOf(str, search, 0);
-            if (tmp == INDEX_NOT_FOUND) {
-                continue;
-            }
-
-            if (tmp < ret) {
-                ret = tmp;
-            }
-        }
-
-        return ret == Integer.MAX_VALUE ? INDEX_NOT_FOUND : ret;
-    }
-
-    /**
-     * <p>Find the latest index of any of a set of potential substrings.</p>
-     *
-     * <p>A {@code null} CharSequence will return {@code -1}.
-     * A {@code null} search array will return {@code -1}.
-     * A {@code null} or zero length search array entry will be ignored,
-     * but a search array containing "" will return the length of {@code str}
-     * if {@code str} is not null. This method uses {@link String#indexOf(String)} if possible</p>
-     *
-     * <pre>
-     * StringUtils.lastIndexOfAny(null, *)                   = -1
-     * StringUtils.lastIndexOfAny(*, null)                   = -1
-     * StringUtils.lastIndexOfAny(*, [])                     = -1
-     * StringUtils.lastIndexOfAny(*, [null])                 = -1
-     * StringUtils.lastIndexOfAny("zzabyycdxx", ["ab","cd"]) = 6
-     * StringUtils.lastIndexOfAny("zzabyycdxx", ["cd","ab"]) = 6
-     * StringUtils.lastIndexOfAny("zzabyycdxx", ["mn","op"]) = -1
-     * StringUtils.lastIndexOfAny("zzabyycdxx", ["mn","op"]) = -1
-     * StringUtils.lastIndexOfAny("zzabyycdxx", ["mn",""])   = 10
-     * </pre>
-     *
-     * @param str  the CharSequence to check, may be null
-     * @param searchStrs  the CharSequences to search for, may be null
-     * @return the last index of any of the CharSequences, -1 if no match
-     * @since 3.0 Changed signature from lastIndexOfAny(String, String[]) to lastIndexOfAny(CharSequence, CharSequence)
-     */
-    public static int lastIndexOfAny(final CharSequence str, final CharSequence... searchStrs) {
-        if (str == null || searchStrs == null) {
-            return INDEX_NOT_FOUND;
-        }
-        final int sz = searchStrs.length;
-        int ret = INDEX_NOT_FOUND;
-        int tmp = 0;
-        for (int i = 0; i < sz; i++) {
-            final CharSequence search = searchStrs[i];
-            if (search == null) {
-                continue;
-            }
-            tmp = CharSequenceUtils.lastIndexOf(str, search, str.length());
-            if (tmp > ret) {
-                ret = tmp;
-            }
-        }
-        return ret;
-    }
-
-    // Substring
-    //-----------------------------------------------------------------------
-    /**
-     * <p>Gets a substring from the specified String avoiding exceptions.</p>
-     *
-     * <p>A negative start position can be used to start {@code n}
-     * characters from the end of the String.</p>
-     *
-     * <p>A {@code null} String will return {@code null}.
-     * An empty ("") String will return "".</p>
-     *
-     * <pre>
-     * StringUtils.substring(null, *)   = null
-     * StringUtils.substring("", *)     = ""
-     * StringUtils.substring("abc", 0)  = "abc"
-     * StringUtils.substring("abc", 2)  = "c"
-     * StringUtils.substring("abc", 4)  = ""
-     * StringUtils.substring("abc", -2) = "bc"
-     * StringUtils.substring("abc", -4) = "abc"
-     * </pre>
-     *
-     * @param str  the String to get the substring from, may be null
-     * @param start  the position to start from, negative means
-     *  count back from the end of the String by this many characters
-     * @return substring from start position, {@code null} if null String input
-     */
-    public static String substring(final String str, int start) {
-        if (str == null) {
-            return null;
-        }
-
-        // handle negatives, which means last n characters
-        if (start < 0) {
-            start = str.length() + start; // remember start is negative
-        }
-
-        if (start < 0) {
-            start = 0;
-        }
-        if (start > str.length()) {
-            return EMPTY;
-        }
-
-        return str.substring(start);
-    }
-
-    /**
-     * <p>Gets a substring from the specified String avoiding exceptions.</p>
-     *
-     * <p>A negative start position can be used to start/end {@code n}
-     * characters from the end of the String.</p>
-     *
-     * <p>The returned substring starts with the character in the {@code start}
-     * position and ends before the {@code end} position. All position counting is
-     * zero-based -- i.e., to start at the beginning of the string use
-     * {@code start = 0}. Negative start and end positions can be used to
-     * specify offsets relative to the end of the String.</p>
-     *
-     * <p>If {@code start} is not strictly to the left of {@code end}, ""
-     * is returned.</p>
-     *
-     * <pre>
-     * StringUtils.substring(null, *, *)    = null
-     * StringUtils.substring("", * ,  *)    = "";
-     * StringUtils.substring("abc", 0, 2)   = "ab"
-     * StringUtils.substring("abc", 2, 0)   = ""
-     * StringUtils.substring("abc", 2, 4)   = "c"
-     * StringUtils.substring("abc", 4, 6)   = ""
-     * StringUtils.substring("abc", 2, 2)   = ""
-     * StringUtils.substring("abc", -2, -1) = "b"
-     * StringUtils.substring("abc", -4, 2)  = "ab"
-     * </pre>
-     *
-     * @param str  the String to get the substring from, may be null
-     * @param start  the position to start from, negative means
-     *  count back from the end of the String by this many characters
-     * @param end  the position to end at (exclusive), negative means
-     *  count back from the end of the String by this many characters
-     * @return substring from start position to end position,
-     *  {@code null} if null String input
-     */
-    public static String substring(final String str, int start, int end) {
-        if (str == null) {
-            return null;
-        }
-
-        // handle negatives
-        if (end < 0) {
-            end = str.length() + end; // remember end is negative
-        }
-        if (start < 0) {
-            start = str.length() + start; // remember start is negative
-        }
-
-        // check length next
-        if (end > str.length()) {
-            end = str.length();
-        }
-
-        // if start is greater than end, return ""
-        if (start > end) {
-            return EMPTY;
-        }
-
-        if (start < 0) {
-            start = 0;
-        }
-        if (end < 0) {
-            end = 0;
-        }
-
-        return str.substring(start, end);
-    }
-
-    // Left/Right/Mid
-    //-----------------------------------------------------------------------
-    /**
-     * <p>Gets the leftmost {@code len} characters of a String.</p>
-     *
-     * <p>If {@code len} characters are not available, or the
-     * String is {@code null}, the String will be returned without
-     * an exception. An empty String is returned if len is negative.</p>
-     *
-     * <pre>
-     * StringUtils.left(null, *)    = null
-     * StringUtils.left(*, -ve)     = ""
-     * StringUtils.left("", *)      = ""
-     * StringUtils.left("abc", 0)   = ""
-     * StringUtils.left("abc", 2)   = "ab"
-     * StringUtils.left("abc", 4)   = "abc"
-     * </pre>
-     *
-     * @param str  the String to get the leftmost characters from, may be null
-     * @param len  the length of the required String
-     * @return the leftmost characters, {@code null} if null String input
-     */
-    public static String left(final String str, final int len) {
-        if (str == null) {
-            return null;
-        }
-        if (len < 0) {
-            return EMPTY;
-        }
-        if (str.length() <= len) {
-            return str;
-        }
-        return str.substring(0, len);
-    }
-
-    /**
-     * <p>Gets the rightmost {@code len} characters of a String.</p>
-     *
-     * <p>If {@code len} characters are not available, or the String
-     * is {@code null}, the String will be returned without an
-     * an exception. An empty String is returned if len is negative.</p>
-     *
-     * <pre>
-     * StringUtils.right(null, *)    = null
-     * StringUtils.right(*, -ve)     = ""
-     * StringUtils.right("", *)      = ""
-     * StringUtils.right("abc", 0)   = ""
-     * StringUtils.right("abc", 2)   = "bc"
-     * StringUtils.right("abc", 4)   = "abc"
-     * </pre>
-     *
-     * @param str  the String to get the rightmost characters from, may be null
-     * @param len  the length of the required String
-     * @return the rightmost characters, {@code null} if null String input
-     */
-    public static String right(final String str, final int len) {
-        if (str == null) {
-            return null;
-        }
-        if (len < 0) {
-            return EMPTY;
-        }
-        if (str.length() <= len) {
-            return str;
-        }
-        return str.substring(str.length() - len);
-    }
-
-    /**
-     * <p>Gets {@code len} characters from the middle of a String.</p>
-     *
-     * <p>If {@code len} characters are not available, the remainder
-     * of the String will be returned without an exception. If the
-     * String is {@code null}, {@code null} will be returned.
-     * An empty String is returned if len is negative or exceeds the
-     * length of {@code str}.</p>
-     *
-     * <pre>
-     * StringUtils.mid(null, *, *)    = null
-     * StringUtils.mid(*, *, -ve)     = ""
-     * StringUtils.mid("", 0, *)      = ""
-     * StringUtils.mid("abc", 0, 2)   = "ab"
-     * StringUtils.mid("abc", 0, 4)   = "abc"
-     * StringUtils.mid("abc", 2, 4)   = "c"
-     * StringUtils.mid("abc", 4, 2)   = ""
-     * StringUtils.mid("abc", -2, 2)  = "ab"
-     * </pre>
-     *
-     * @param str  the String to get the characters from, may be null
-     * @param pos  the position to start from, negative treated as zero
-     * @param len  the length of the required String
-     * @return the middle characters, {@code null} if null String input
-     */
-    public static String mid(final String str, int pos, final int len) {
-        if (str == null) {
-            return null;
-        }
-        if (len < 0 || pos > str.length()) {
-            return EMPTY;
-        }
-        if (pos < 0) {
-            pos = 0;
-        }
-        if (str.length() <= pos + len) {
-            return str.substring(pos);
-        }
-        return str.substring(pos, pos + len);
-    }
-
-    // SubStringAfter/SubStringBefore
-    //-----------------------------------------------------------------------
-    /**
-     * <p>Gets the substring before the first occurrence of a separator.
-     * The separator is not returned.</p>
-     *
-     * <p>A {@code null} string input will return {@code null}.
-     * An empty ("") string input will return the empty string.
-     * A {@code null} separator will return the input string.</p>
-     *
-     * <p>If nothing is found, the string input is returned.</p>
-     *
-     * <pre>
-     * StringUtils.substringBefore(null, *)      = null
-     * StringUtils.substringBefore("", *)        = ""
-     * StringUtils.substringBefore("abc", "a")   = ""
-     * StringUtils.substringBefore("abcba", "b") = "a"
-     * StringUtils.substringBefore("abc", "c")   = "ab"
-     * StringUtils.substringBefore("abc", "d")   = "abc"
-     * StringUtils.substringBefore("abc", "")    = ""
-     * StringUtils.substringBefore("abc", null)  = "abc"
-     * </pre>
-     *
-     * @param str  the String to get a substring from, may be null
-     * @param separator  the String to search for, may be null
-     * @return the substring before the first occurrence of the separator,
-     *  {@code null} if null String input
-     * @since 2.0
-     */
-    public static String substringBefore(final String str, final String separator) {
-        if (isEmpty(str) || separator == null) {
-            return str;
-        }
-        if (separator.isEmpty()) {
-            return EMPTY;
-        }
-        final int pos = str.indexOf(separator);
-        if (pos == INDEX_NOT_FOUND) {
-            return str;
-        }
-        return str.substring(0, pos);
-    }
-
-    /**
-     * <p>Gets the substring after the first occurrence of a separator.
-     * The separator is not returned.</p>
-     *
-     * <p>A {@code null} string input will return {@code null}.
-     * An empty ("") string input will return the empty string.
-     * A {@code null} separator will return the empty string if the
-     * input string is not {@code null}.</p>
-     *
-     * <p>If nothing is found, the empty string is returned.</p>
-     *
-     * <pre>
-     * StringUtils.substringAfter(null, *)      = null
-     * StringUtils.substringAfter("", *)        = ""
-     * StringUtils.substringAfter(*, null)      = ""
-     * StringUtils.substringAfter("abc", "a")   = "bc"
-     * StringUtils.substringAfter("abcba", "b") = "cba"
-     * StringUtils.substringAfter("abc", "c")   = ""
-     * StringUtils.substringAfter("abc", "d")   = ""
-     * StringUtils.substringAfter("abc", "")    = "abc"
-     * </pre>
-     *
-     * @param str  the String to get a substring from, may be null
-     * @param separator  the String to search for, may be null
-     * @return the substring after the first occurrence of the separator,
-     *  {@code null} if null String input
-     * @since 2.0
-     */
-    public static String substringAfter(final String str, final String separator) {
-        if (isEmpty(str)) {
-            return str;
-        }
-        if (separator == null) {
-            return EMPTY;
-        }
-        final int pos = str.indexOf(separator);
-        if (pos == INDEX_NOT_FOUND) {
-            return EMPTY;
-        }
-        return str.substring(pos + separator.length());
-    }
-
-    /**
-     * <p>Gets the substring before the last occurrence of a separator.
-     * The separator is not returned.</p>
-     *
-     * <p>A {@code null} string input will return {@code null}.
-     * An empty ("") string input will return the empty string.
-     * An empty or {@code null} separator will return the input string.</p>
-     *
-     * <p>If nothing is found, the string input is returned.</p>
-     *
-     * <pre>
-     * StringUtils.substringBeforeLast(null, *)      = null
-     * StringUtils.substringBeforeLast("", *)        = ""
-     * StringUtils.substringBeforeLast("abcba", "b") = "abc"
-     * StringUtils.substringBeforeLast("abc", "c")   = "ab"
-     * StringUtils.substringBeforeLast("a", "a")     = ""
-     * StringUtils.substringBeforeLast("a", "z")     = "a"
-     * StringUtils.substringBeforeLast("a", null)    = "a"
-     * StringUtils.substringBeforeLast("a", "")      = "a"
-     * </pre>
-     *
-     * @param str  the String to get a substring from, may be null
-     * @param separator  the String to search for, may be null
-     * @return the substring before the last occurrence of the separator,
-     *  {@code null} if null String input
-     * @since 2.0
-     */
-    public static String substringBeforeLast(final String str, final String separator) {
-        if (isEmpty(str) || isEmpty(separator)) {
-            return str;
-        }
-        final int pos = str.lastIndexOf(separator);
-        if (pos == INDEX_NOT_FOUND) {
-            return str;
-        }
-        return str.substring(0, pos);
-    }
-
-    /**
-     * <p>Gets the substring after the last occurrence of a separator.
-     * The separator is not returned.</p>
-     *
-     * <p>A {@code null} string input will return {@code null}.
-     * An empty ("") string input will return the empty string.
-     * An empty or {@code null} separator will return the empty string if
-     * the input string is not {@code null}.</p>
-     *
-     * <p>If nothing is found, the empty string is returned.</p>
-     *
-     * <pre>
-     * StringUtils.substringAfterLast(null, *)      = null
-     * StringUtils.substringAfterLast("", *)        = ""
-     * StringUtils.substringAfterLast(*, "")        = ""
-     * StringUtils.substringAfterLast(*, null)      = ""
-     * StringUtils.substringAfterLast("abc", "a")   = "bc"
-     * StringUtils.substringAfterLast("abcba", "b") = "a"
-     * StringUtils.substringAfterLast("abc", "c")   = ""
-     * StringUtils.substringAfterLast("a", "a")     = ""
-     * StringUtils.substringAfterLast("a", "z")     = ""
-     * </pre>
-     *
-     * @param str  the String to get a substring from, may be null
-     * @param separator  the String to search for, may be null
-     * @return the substring after the last occurrence of the separator,
-     *  {@code null} if null String input
-     * @since 2.0
-     */
-    public static String substringAfterLast(final String str, final String separator) {
-        if (isEmpty(str)) {
-            return str;
-        }
-        if (isEmpty(separator)) {
-            return EMPTY;
-        }
-        final int pos = str.lastIndexOf(separator);
-        if (pos == INDEX_NOT_FOUND || pos == str.length() - separator.length()) {
-            return EMPTY;
-        }
-        return str.substring(pos + separator.length());
-    }
-
-    // Substring between
-    //-----------------------------------------------------------------------
-    /**
-     * <p>Gets the String that is nested in between two instances of the
-     * same String.</p>
-     *
-     * <p>A {@code null} input String returns {@code null}.
-     * A {@code null} tag returns {@code null}.</p>
-     *
-     * <pre>
-     * StringUtils.substringBetween(null, *)            = null
-     * StringUtils.substringBetween("", "")             = ""
-     * StringUtils.substringBetween("", "tag")          = null
-     * StringUtils.substringBetween("tagabctag", null)  = null
-     * StringUtils.substringBetween("tagabctag", "")    = ""
-     * StringUtils.substringBetween("tagabctag", "tag") = "abc"
-     * </pre>
-     *
-     * @param str  the String containing the substring, may be null
-     * @param tag  the String before and after the substring, may be null
-     * @return the substring, {@code null} if no match
-     * @since 2.0
-     */
-    public static String substringBetween(final String str, final String tag) {
-        return substringBetween(str, tag, tag);
-    }
-
-    /**
-     * <p>Gets the String that is nested in between two Strings.
-     * Only the first match is returned.</p>
-     *
-     * <p>A {@code null} input String returns {@code null}.
-     * A {@code null} open/close returns {@code null} (no match).
-     * An empty ("") open and close returns an empty string.</p>
-     *
-     * <pre>
-     * StringUtils.substringBetween("wx[b]yz", "[", "]") = "b"
-     * StringUtils.substringBetween(null, *, *)          = null
-     * StringUtils.substringBetween(*, null, *)          = null
-     * StringUtils.substringBetween(*, *, null)          = null
-     * StringUtils.substringBetween("", "", "")          = ""
-     * StringUtils.substringBetween("", "", "]")         = null
-     * StringUtils.substringBetween("", "[", "]")        = null
-     * StringUtils.substringBetween("yabcz", "", "")     = ""
-     * StringUtils.substringBetween("yabcz", "y", "z")   = "abc"
-     * StringUtils.substringBetween("yabczyabcz", "y", "z")   = "abc"
-     * </pre>
-     *
-     * @param str  the String containing the substring, may be null
-     * @param open  the String before the substring, may be null
-     * @param close  the String after the substring, may be null
-     * @return the substring, {@code null} if no match
-     * @since 2.0
-     */
-    public static String substringBetween(final String str, final String open, final String close) {
-        if (str == null || open == null || close == null) {
-            return null;
-        }
-        final int start = str.indexOf(open);
-        if (start != INDEX_NOT_FOUND) {
-            final int end = str.indexOf(close, start + open.length());
-            if (end != INDEX_NOT_FOUND) {
-                return str.substring(start + open.length(), end);
-            }
-        }
-        return null;
-    }
-
-    /**
-     * <p>Searches a String for substrings delimited by a start and end tag,
-     * returning all matching substrings in an array.</p>
-     *
-     * <p>A {@code null} input String returns {@code null}.
-     * A {@code null} open/close returns {@code null} (no match).
-     * An empty ("") open/close returns {@code null} (no match).</p>
-     *
-     * <pre>
-     * StringUtils.substringsBetween("[a][b][c]", "[", "]") = ["a","b","c"]
-     * StringUtils.substringsBetween(null, *, *)            = null
-     * StringUtils.substringsBetween(*, null, *)            = null
-     * StringUtils.substringsBetween(*, *, null)            = null
-     * StringUtils.substringsBetween("", "[", "]")          = []
-     * </pre>
-     *
-     * @param str  the String containing the substrings, null returns null, empty returns empty
-     * @param open  the String identifying the start of the substring, empty returns null
-     * @param close  the String identifying the end of the substring, empty returns null
-     * @return a String Array of substrings, or {@code null} if no match
-     * @since 2.3
-     */
-    public static String[] substringsBetween(final String str, final String open, final String close) {
-        if (str == null || isEmpty(open) || isEmpty(close)) {
-            return null;
-        }
-        final int strLen = str.length();
-        if (strLen == 0) {
-            return ArrayUtils.EMPTY_STRING_ARRAY;
-        }
-        final int closeLen = close.length();
-        final int openLen = open.length();
-        final List<String> list = new ArrayList<String>();
-        int pos = 0;
-        while (pos < strLen - closeLen) {
-            int start = str.indexOf(open, pos);
-            if (start < 0) {
-                break;
-            }
-            start += openLen;
-            final int end = str.indexOf(close, start);
-            if (end < 0) {
-                break;
-            }
-            list.add(str.substring(start, end));
-            pos = end + closeLen;
-        }
-        if (list.isEmpty()) {
-            return null;
-        }
-        return list.toArray(new String [list.size()]);
-    }
-
-    // Nested extraction
-    //-----------------------------------------------------------------------
-
-    // Splitting
-    //-----------------------------------------------------------------------
-    /**
-     * <p>Splits the provided text into an array, using whitespace as the
-     * separator.
-     * Whitespace is defined by {@link Character#isWhitespace(char)}.</p>
-     *
-     * <p>The separator is not included in the returned String array.
-     * Adjacent separators are treated as one separator.
-     * For more control over the split use the StrTokenizer class.</p>
-     *
-     * <p>A {@code null} input String returns {@code null}.</p>
-     *
-     * <pre>
-     * StringUtils.split(null)       = null
-     * StringUtils.split("")         = []
-     * StringUtils.split("abc def")  = ["abc", "def"]
-     * StringUtils.split("abc  def") = ["abc", "def"]
-     * StringUtils.split(" abc ")    = ["abc"]
-     * </pre>
-     *
-     * @param str  the String to parse, may be null
-     * @return an array of parsed Strings, {@code null} if null String input
-     */
-    public static String[] split(final String str) {
-        return split(str, null, -1);
-    }
-
-    /**
-     * <p>Splits the provided text into an array, separator specified.
-     * This is an alternative to using StringTokenizer.</p>
-     *
-     * <p>The separator is not included in the returned String array.
-     * Adjacent separators are treated as one separator.
-     * For more control over the split use the StrTokenizer class.</p>
-     *
-     * <p>A {@code null} input String returns {@code null}.</p>
-     *
-     * <pre>
-     * StringUtils.split(null, *)         = null
-     * StringUtils.split("", *)           = []
-     * StringUtils.split("a.b.c", '.')    = ["a", "b", "c"]
-     * StringUtils.split("a..b.c", '.')   = ["a", "b", "c"]
-     * StringUtils.split("a:b:c", '.')    = ["a:b:c"]
-     * StringUtils.split("a b c", ' ')    = ["a", "b", "c"]
-     * </pre>
-     *
-     * @param str  the String to parse, may be null
-     * @param separatorChar  the character used as the delimiter
-     * @return an array of parsed Strings, {@code null} if null String input
-     * @since 2.0
-     */
-    public static String[] split(final String str, final char separatorChar) {
-        return splitWorker(str, separatorChar, false);
-    }
-
-    /**
-     * <p>Splits the provided text into an array, separators specified.
-     * This is an alternative to using StringTokenizer.</p>
-     *
-     * <p>The separator is not included in the returned String array.
-     * Adjacent separators are treated as one separator.
-     * For more control over the split use the StrTokenizer class.</p>
-     *
-     * <p>A {@code null} input String returns {@code null}.
-     * A {@code null} separatorChars splits on whitespace.</p>
-     *
-     * <pre>
-     * StringUtils.split(null, *)         = null
-     * StringUtils.split("", *)           = []
-     * StringUtils.split("abc def", null) = ["abc", "def"]
-     * StringUtils.split("abc def", " ")  = ["abc", "def"]
-     * StringUtils.split("abc  def", " ") = ["abc", "def"]
-     * StringUtils.split("ab:cd:ef", ":") = ["ab", "cd", "ef"]
-     * </pre>
-     *
-     * @param str  the String to parse, may be null
-     * @param separatorChars  the characters used as the delimiters,
-     *  {@code null} splits on whitespace
-     * @return an array of parsed Strings, {@code null} if null String input
-     */
-    public static String[] split(final String str, final String separatorChars) {
-        return splitWorker(str, separatorChars, -1, false);
-    }
-
-    /**
-     * <p>Splits the provided text into an array with a maximum length,
-     * separators specified.</p>
-     *
-     * <p>The separator is not included in the returned String array.
-     * Adjacent separators are treated as one separator.</p>
-     *
-     * <p>A {@code null} input String returns {@code null}.
-     * A {@code null} separatorChars splits on whitespace.</p>
-     *
-     * <p>If more than {@code max} delimited substrings are found, the last
-     * returned string includes all characters after the first {@code max - 1}
-     * returned strings (including separator characters).</p>
-     *
-     * <pre>
-     * StringUtils.split(null, *, *)            = null
-     * StringUtils.split("", *, *)              = []
-     * StringUtils.split("ab cd ef", null, 0)   = ["ab", "cd", "ef"]
-     * StringUtils.split("ab   cd ef", null, 0) = ["ab", "cd", "ef"]
-     * StringUtils.split("ab:cd:ef", ":", 0)    = ["ab", "cd", "ef"]
-     * StringUtils.split("ab:cd:ef", ":", 2)    = ["ab", "cd:ef"]
-     * </pre>
-     *
-     * @param str  the String to parse, may be null
-     * @param separatorChars  the characters used as the delimiters,
-     *  {@code null} splits on whitespace
-     * @param max  the maximum number of elements to include in the
-     *  array. A zero or negative value implies no limit
-     * @return an array of parsed Strings, {@code null} if null String input
-     */
-    public static String[] split(final String str, final String separatorChars, final int max) {
-        return splitWorker(str, separatorChars, max, false);
-    }
-
-    /**
-     * <p>Splits the provided text into an array, separator string specified.</p>
-     *
-     * <p>The separator(s) will not be included in the returned String array.
-     * Adjacent separators are treated as one separator.</p>
-     *
-     * <p>A {@code null} input String returns {@code null}.
-     * A {@code null} separator splits on whitespace.</p>
-     *
-     * <pre>
-     * StringUtils.splitByWholeSeparator(null, *)               = null
-     * StringUtils.splitByWholeSeparator("", *)                 = []
-     * StringUtils.splitByWholeSeparator("ab de fg", null)      = ["ab", "de", "fg"]
-     * StringUtils.splitByWholeSeparator("ab   de fg", null)    = ["ab", "de", "fg"]
-     * StringUtils.splitByWholeSeparator("ab:cd:ef", ":")       = ["ab", "cd", "ef"]
-     * StringUtils.splitByWholeSeparator("ab-!-cd-!-ef", "-!-") = ["ab", "cd", "ef"]
-     * </pre>
-     *
-     * @param str  the String to parse, may be null
-     * @param separator  String containing the String to be used as a delimiter,
-     *  {@code null} splits on whitespace
-     * @return an array of parsed Strings, {@code null} if null String was input
-     */
-    public static String[] splitByWholeSeparator(final String str, final String separator) {
-        return splitByWholeSeparatorWorker( str, separator, -1, false ) ;
-    }
-
-    /**
-     * <p>Splits the provided text into an array, separator string specified.
-     * Returns a maximum of {@code max} substrings.</p>
-     *
-     * <p>The separator(s) will not be included in the returned String array.
-     * Adjacent separators are treated as one separator.</p>
-     *
-     * <p>A {@code null} input String returns {@code null}.
-     * A {@code null} separator splits on whitespace.</p>
-     *
-     * <pre>
-     * StringUtils.splitByWholeSeparator(null, *, *)               = null
-     * StringUtils.splitByWholeSeparator("", *, *)                 = []
-     * StringUtils.splitByWholeSeparator("ab de fg", null, 0)      = ["ab", "de", "fg"]
-     * StringUtils.splitByWholeSeparator("ab   de fg", null, 0)    = ["ab", "de", "fg"]
-     * StringUtils.splitByWholeSeparator("ab:cd:ef", ":", 2)       = ["ab", "cd:ef"]
-     * StringUtils.splitByWholeSeparator("ab-!-cd-!-ef", "-!-", 5) = ["ab", "cd", "ef"]
-     * StringUtils.splitByWholeSeparator("ab-!-cd-!-ef", "-!-", 2) = ["ab", "cd-!-ef"]
-     * </pre>
-     *
-     * @param str  the String to parse, may be null
-     * @param separator  String containing the String to be used as a delimiter,
-     *  {@code null} splits on whitespace
-     * @param max  the maximum number of elements to include in the returned
-     *  array. A zero or negative value implies no limit.
-     * @return an array of parsed Strings, {@code null} if null String was input
-     */
-    public static String[] splitByWholeSeparator( final String str, final String separator, final int max ) {
-        return splitByWholeSeparatorWorker(str, separator, max, false);
-    }
-
-    /**
-     * <p>Splits the provided text into an array, separator string specified. </p>
-     *
-     * <p>The separator is not included in the returned String array.
-     * Adjacent separators are treated as separators for empty tokens.
-     * For more control over the split use the StrTokenizer class.</p>
-     *
-     * <p>A {@code null} input String returns {@code null}.
-     * A {@code null} separator splits on whitespace.</p>
-     *
-     * <pre>
-     * StringUtils.splitByWholeSeparatorPreserveAllTokens(null, *)               = null
-     * StringUtils.splitByWholeSeparatorPreserveAllTokens("", *)                 = []
-     * StringUtils.splitByWholeSeparatorPreserveAllTokens("ab de fg", null)      = ["ab", "de", "fg"]
-     * StringUtils.splitByWholeSeparatorPreserveAllTokens("ab   de fg", null)    = ["ab", "", "", "de", "fg"]
-     * StringUtils.splitByWholeSeparatorPreserveAllTokens("ab:cd:ef", ":")       = ["ab", "cd", "ef"]
-     * StringUtils.splitByWholeSeparatorPreserveAllTokens("ab-!-cd-!-ef", "-!-") = ["ab", "cd", "ef"]
-     * </pre>
-     *
-     * @param str  the String to parse, may be null
-     * @param separator  String containing the String to be used as a delimiter,
-     *  {@code null} splits on whitespace
-     * @return an array of parsed Strings, {@code null} if null String was input
-     * @since 2.4
-     */
-    public static String[] splitByWholeSeparatorPreserveAllTokens(final String str, final String separator) {
-        return splitByWholeSeparatorWorker(str, separator, -1, true);
-    }
-
-    /**
-     * <p>Splits the provided text into an array, separator string specified.
-     * Returns a maximum of {@code max} substrings.</p>
-     *
-     * <p>The separator is not included in the returned String array.
-     * Adjacent separators are treated as separators for empty tokens.
-     * For more control over the split use the StrTokenizer class.</p>
-     *
-     * <p>A {@code null} input String returns {@code null}.
-     * A {@code null} separator splits on whitespace.</p>
-     *
-     * <pre>
-     * StringUtils.splitByWholeSeparatorPreserveAllTokens(null, *, *)               = null
-     * StringUtils.splitByWholeSeparatorPreserveAllTokens("", *, *)                 = []
-     * StringUtils.splitByWholeSeparatorPreserveAllTokens("ab de fg", null, 0)      = ["ab", "de", "fg"]
-     * StringUtils.splitByWholeSeparatorPreserveAllTokens("ab   de fg", null, 0)    = ["ab", "", "", "de", "fg"]
-     * StringUtils.splitByWholeSeparatorPreserveAllTokens("ab:cd:ef", ":", 2)       = ["ab", "cd:ef"]
-     * StringUtils.splitByWholeSeparatorPreserveAllTokens("ab-!-cd-!-ef", "-!-", 5) = ["ab", "cd", "ef"]
-     * StringUtils.splitByWholeSeparatorPreserveAllTokens("ab-!-cd-!-ef", "-!-", 2) = ["ab", "cd-!-ef"]
-     * </pre>
-     *
-     * @param str  the String to parse, may be null
-     * @param separator  String containing the String to be used as a delimiter,
-     *  {@code null} splits on whitespace
-     * @param max  the maximum number of elements to include in the returned
-     *  array. A zero or negative value implies no limit.
-     * @return an array of parsed Strings, {@code null} if null String was input
-     * @since 2.4
-     */
-    public static String[] splitByWholeSeparatorPreserveAllTokens(final String str, final String separator, final int max) {
-        return splitByWholeSeparatorWorker(str, separator, max, true);
-    }
-
-    /**
-     * Performs the logic for the {@code splitByWholeSeparatorPreserveAllTokens} methods.
-     *
-     * @param str  the String to parse, may be {@code null}
-     * @param separator  String containing the String to be used as a delimiter,
-     *  {@code null} splits on whitespace
-     * @param max  the maximum number of elements to include in the returned
-     *  array. A zero or negative value implies no limit.
-     * @param preserveAllTokens if {@code true}, adjacent separators are
-     * treated as empty token separators; if {@code false}, adjacent
-     * separators are treated as one separator.
-     * @return an array of parsed Strings, {@code null} if null String input
-     * @since 2.4
-     */
-    private static String[] splitByWholeSeparatorWorker(
-            final String str, final String separator, final int max, final boolean preserveAllTokens) {
-        if (str == null) {
-            return null;
-        }
-
-        final int len = str.length();
-
-        if (len == 0) {
-            return ArrayUtils.EMPTY_STRING_ARRAY;
-        }
-
-        if (separator == null || EMPTY.equals(separator)) {
-            // Split on whitespace.
-            return splitWorker(str, null, max, preserveAllTokens);
-        }
-
-        final int separatorLength = separator.length();
-
-        final ArrayList<String> substrings = new ArrayList<String>();
-        int numberOfSubstrings = 0;
-        int beg = 0;
-        int end = 0;
-        while (end < len) {
-            end = str.indexOf(separator, beg);
-
-            if (end > -1) {
-                if (end > beg) {
-                    numberOfSubstrings += 1;
-
-                    if (numberOfSubstrings == max) {
-                        end = len;
-                        substrings.add(str.substring(beg));
-                    } else {
-                        // The following is OK, because String.substring( beg, end ) excludes
-                        // the character at the position 'end'.
-                        substrings.add(str.substring(beg, end));
-
-                        // Set the starting point for the next search.
-                        // The following is equivalent to beg = end + (separatorLength - 1) + 1,
-                        // which is the right calculation:
-                        beg = end + separatorLength;
-                    }
-                } else {
-                    // We found a consecutive occurrence of the separator, so skip it.
-                    if (preserveAllTokens) {
-                        numberOfSubstrings += 1;
-                        if (numberOfSubstrings == max) {
-                            end = len;
-                            substrings.add(str.substring(beg));
-                        } else {
-                            substrings.add(EMPTY);
-                        }
-                    }
-                    beg = end + separatorLength;
-                }
-            } else {
-                // String.substring( beg ) goes from 'beg' to the end of the String.
-                substrings.add(str.substring(beg));
-                end = len;
-            }
-        }
-
-        return substrings.toArray(new String[substrings.size()]);
-    }
-
-    // -----------------------------------------------------------------------
-    /**
-     * <p>Splits the provided text into an array, using whitespace as the
-     * separator, preserving all tokens, including empty tokens created by
-     * adjacent separators. This is an alternative to using StringTokenizer.
-     * Whitespace is defined by {@link Character#isWhitespace(char)}.</p>
-     *
-     * <p>The separator is not included in the returned String array.
-     * Adjacent separators are treated as separators for empty tokens.
-     * For more control over the split use the StrTokenizer class.</p>
-     *
-     * <p>A {@code null} input String returns {@code null}.</p>
-     *
-     * <pre>
-     * StringUtils.splitPreserveAllTokens(null)       = null
-     * StringUtils.splitPreserveAllTokens("")         = []
-     * StringUtils.splitPreserveAllTokens("abc def")  = ["abc", "def"]
-     * StringUtils.splitPreserveAllTokens("abc  def") = ["abc", "", "def"]
-     * StringUtils.splitPreserveAllTokens(" abc ")    = ["", "abc", ""]
-     * </pre>
-     *
-     * @param str  the String to parse, may be {@code null}
-     * @return an array of parsed Strings, {@code null} if null String input
-     * @since 2.1
-     */
-    public static String[] splitPreserveAllTokens(final String str) {
-        return splitWorker(str, null, -1, true);
-    }
-
-    /**
-     * <p>Splits the provided text into an array, separator specified,
-     * preserving all tokens, including empty tokens created by adjacent
-     * separators. This is an alternative to using StringTokenizer.</p>
-     *
-     * <p>The separator is not included in the returned String array.
-     * Adjacent separators are treated as separators for empty tokens.
-     * For more control over the split use the StrTokenizer class.</p>
-     *
-     * <p>A {@code null} input String returns {@code null}.</p>
-     *
-     * <pre>
-     * StringUtils.splitPreserveAllTokens(null, *)         = null
-     * StringUtils.splitPreserveAllTokens("", *)           = []
-     * StringUtils.splitPreserveAllTokens("a.b.c", '.')    = ["a", "b", "c"]
-     * StringUtils.splitPreserveAllTokens("a..b.c", '.')   = ["a", "", "b", "c"]
-     * StringUtils.splitPreserveAllTokens("a:b:c", '.')    = ["a:b:c"]
-     * StringUtils.splitPreserveAllTokens("a\tb\nc", null) = ["a", "b", "c"]
-     * StringUtils.splitPreserveAllTokens("a b c", ' ')    = ["a", "b", "c"]
-     * StringUtils.splitPreserveAllTokens("a b c ", ' ')   = ["a", "b", "c", ""]
-     * StringUtils.splitPreserveAllTokens("a b c  ", ' ')   = ["a", "b", "c", "", ""]
-     * StringUtils.splitPreserveAllTokens(" a b c", ' ')   = ["", a", "b", "c"]
-     * StringUtils.splitPreserveAllTokens("  a b c", ' ')  = ["", "", a", "b", "c"]
-     * StringUtils.splitPreserveAllTokens(" a b c ", ' ')  = ["", a", "b", "c", ""]
-     * </pre>
-     *
-     * @param str  the String to parse, may be {@code null}
-     * @param separatorChar  the character used as the delimiter,
-     *  {@code null} splits on whitespace
-     * @return an array of parsed Strings, {@code null} if null String input
-     * @since 2.1
-     */
-    public static String[] splitPreserveAllTokens(final String str, final char separatorChar) {
-        return splitWorker(str, separatorChar, true);
-    }
-
-    /**
-     * Performs the logic for the {@code split} and
-     * {@code splitPreserveAllTokens} methods that do not return a
-     * maximum array length.
-     *
-     * @param str  the String to parse, may be {@code null}
-     * @param separatorChar the separate character
-     * @param preserveAllTokens if {@code true}, adjacent separators are
-     * treated as empty token separators; if {@code false}, adjacent
-     * separators are treated as one separator.
-     * @return an array of parsed Strings, {@code null} if null String input
-     */
-    private static String[] splitWorker(final String str, final char separatorChar, final boolean preserveAllTokens) {
-        // Performance tuned for 2.0 (JDK1.4)
-
-        if (str == null) {
-            return null;
-        }
-        final int len = str.length();
-        if (len == 0) {
-            return ArrayUtils.EMPTY_STRING_ARRAY;
-        }
-        final List<String> list = new ArrayList<String>();
-        int i = 0, start = 0;
-        boolean match = false;
-        boolean lastMatch = false;
-        while (i < len) {
-            if (str.charAt(i) == separatorChar) {
-                if (match || preserveAllTokens) {
-                    list.add(str.substring(start, i));
-                    match = false;
-                    lastMatch = true;
-                }
-                start = ++i;
-                continue;
-            }
-            lastMatch = false;
-            match = true;
-            i++;
-        }
-        if (match || preserveAllTokens && lastMatch) {
-            list.add(str.substring(start, i));
-        }
-        return list.toArray(new String[list.size()]);
-    }
-
-    /**
-     * <p>Splits the provided text into an array, separators specified,
-     * preserving all tokens, including empty tokens created by adjacent
-     * separators. This is an alternative to using StringTokenizer.</p>
-     *
-     * <p>The separator is not included in the returned String array.
-     * Adjacent separators are treated as separators for empty tokens.
-     * For more control over the split use the StrTokenizer class.</p>
-     *
-     * <p>A {@code null} input String returns {@code null}.
-     * A {@code null} separatorChars splits on whitespace.</p>
-     *
-     * <pre>
-     * StringUtils.splitPreserveAllTokens(null, *)           = null
-     * StringUtils.splitPreserveAllTokens("", *)             = []
-     * StringUtils.splitPreserveAllTokens("abc def", null)   = ["abc", "def"]
-     * StringUtils.splitPreserveAllTokens("abc def", " ")    = ["abc", "def"]
-     * StringUtils.splitPreserveAllTokens("abc  def", " ")   = ["abc", "", def"]
-     * StringUtils.splitPreserveAllTokens("ab:cd:ef", ":")   = ["ab", "cd", "ef"]
-     * StringUtils.splitPreserveAllTokens("ab:cd:ef:", ":")  = ["ab", "cd", "ef", ""]
-     * StringUtils.splitPreserveAllTokens("ab:cd:ef::", ":") = ["ab", "cd", "ef", "", ""]
-     * StringUtils.splitPreserveAllTokens("ab::cd:ef", ":")  = ["ab", "", cd", "ef"]
-     * StringUtils.splitPreserveAllTokens(":cd:ef", ":")     = ["", cd", "ef"]
-     * StringUtils.splitPreserveAllTokens("::cd:ef", ":")    = ["", "", cd", "ef"]
-     * StringUtils.splitPreserveAllTokens(":cd:ef:", ":")    = ["", cd", "ef", ""]
-     * </pre>
-     *
-     * @param str  the String to parse, may be {@code null}
-     * @param separatorChars  the characters used as the delimiters,
-     *  {@code null} splits on whitespace
-     * @return an array of parsed Strings, {@code null} if null String input
-     * @since 2.1
-     */
-    public static String[] splitPreserveAllTokens(final String str, final String separatorChars) {
-        return splitWorker(str, separatorChars, -1, true);
-    }
-
-    /**
-     * <p>Splits the provided text into an array with a maximum length,
-     * separators specified, preserving all tokens, including empty tokens
-     * created by adjacent separators.</p>
-     *
-     * <p>The separator is not included in the returned String array.
-     * Adjacent separators are treated as separators for empty tokens.
-     * Adjacent separators are treated as one separator.</p>
-     *
-     * <p>A {@code null} input String returns {@code null}.
-     * A {@code null} separatorChars splits on whitespace.</p>
-     *
-     * <p>If more than {@code max} delimited substrings are found, the last
-     * returned string includes all characters after the first {@code max - 1}
-     * returned strings (including separator characters).</p>
-     *
-     * <pre>
-     * StringUtils.splitPreserveAllTokens(null, *, *)            = null
-     * StringUtils.splitPreserveAllTokens("", *, *)              = []
-     * StringUtils.splitPreserveAllTokens("ab de fg", null, 0)   = ["ab", "cd", "ef"]
-     * StringUtils.splitPreserveAllTokens("ab   de fg", null, 0) = ["ab", "cd", "ef"]
-     * StringUtils.splitPreserveAllTokens("ab:cd:ef", ":", 0)    = ["ab", "cd", "ef"]
-     * StringUtils.splitPreserveAllTokens("ab:cd:ef", ":", 2)    = ["ab", "cd:ef"]
-     * StringUtils.splitPreserveAllTokens("ab   de fg", null, 2) = ["ab", "  de fg"]
-     * StringUtils.splitPreserveAllTokens("ab   de fg", null, 3) = ["ab", "", " de fg"]
-     * StringUtils.splitPreserveAllTokens("ab   de fg", null, 4) = ["ab", "", "", "de fg"]
-     * </pre>
-     *
-     * @param str  the String to parse, may be {@code null}
-     * @param separatorChars  the characters used as the delimiters,
-     *  {@code null} splits on whitespace
-     * @param max  the maximum number of elements to include in the
-     *  array. A zero or negative value implies no limit
-     * @return an array of parsed Strings, {@code null} if null String input
-     * @since 2.1
-     */
-    public static String[] splitPreserveAllTokens(final String str, final String separatorChars, final int max) {
-        return splitWorker(str, separatorChars, max, true);
-    }
-
-    /**
-     * Performs the logic for the {@code split} and
-     * {@code splitPreserveAllTokens} methods that return a maximum array
-     * length.
-     *
-     * @param str  the String to parse, may be {@code null}
-     * @param separatorChars the separate character
-     * @param max  the maximum number of elements to include in the
-     *  array. A zero or negative value implies no limit.
-     * @param preserveAllTokens if {@code true}, adjacent separators are
-     * treated as empty token separators; if {@code false}, adjacent
-     * separators are treated as one separator.
-     * @return an array of parsed Strings, {@code null} if null String input
-     */
-    private static String[] splitWorker(final String str, final String separatorChars, final int max, final boolean preserveAllTokens) {
-        // Performance tuned for 2.0 (JDK1.4)
-        // Direct code is quicker than StringTokenizer.
-        // Also, StringTokenizer uses isSpace() not isWhitespace()
-
-        if (str == null) {
-            return null;
-        }
-        final int len = str.length();
-        if (len == 0) {
-            return ArrayUtils.EMPTY_STRING_ARRAY;
-        }
-        final List<String> list = new ArrayList<String>();
-        int sizePlus1 = 1;
-        int i = 0, start = 0;
-        boolean match = false;
-        boolean lastMatch = false;
-        if (separatorChars == null) {
-            // Null separator means use whitespace
-            while (i < len) {
-                if (Character.isWhitespace(str.charAt(i))) {
-                    if (match || preserveAllTokens) {
-                        lastMatch = true;
-                        if (sizePlus1++ == max) {
-                            i = len;
-                            lastMatch = false;
-                        }
-                        list.add(str.substring(start, i));
-                        match = false;
-                    }
-                    start = ++i;
-                    continue;
-                }
-                lastMatch = false;
-                match = true;
-                i++;
-            }
-        } else if (separatorChars.length() == 1) {
-            // Optimise 1 character case
-            final char sep = separatorChars.charAt(0);
-            while (i < len) {
-                if (str.charAt(i) == sep) {
-                    if (match || preserveAllTokens) {
-                        lastMatch = true;
-                        if (sizePlus1++ == max) {
-                            i = len;
-                            lastMatch = false;
-                        }
-                        list.add(str.substring(start, i));
-                        match = false;
-                    }
-                    start = ++i;
-                    continue;
-                }
-                lastMatch = false;
-                match = true;
-                i++;
-            }
-        } else {
-            // standard case
-            while (i < len) {
-                if (separatorChars.indexOf(str.charAt(i)) >= 0) {
-                    if (match || preserveAllTokens) {
-                        lastMatch = true;
-                        if (sizePlus1++ == max) {
-                            i = len;
-                            lastMatch = false;
-                        }
-                        list.add(str.substring(start, i));
-                        match = false;
-                    }
-                    start = ++i;
-                    continue;
-                }
-                lastMatch = false;
-                match = true;
-                i++;
-            }
-        }
-        if (match || preserveAllTokens && lastMatch) {
-            list.add(str.substring(start, i));
-        }
-        return list.toArray(new String[list.size()]);
-    }
-
-    /**
-     * <p>Splits a String by Character type as returned by
-     * {@code java.lang.Character.getType(char)}. Groups of contiguous
-     * characters of the same type are returned as complete tokens.
-     * <pre>
-     * StringUtils.splitByCharacterType(null)         = null
-     * StringUtils.splitByCharacterType("")           = []
-     * StringUtils.splitByCharacterType("ab de fg")   = ["ab", " ", "de", " ", "fg"]
-     * StringUtils.splitByCharacterType("ab   de fg") = ["ab", "   ", "de", " ", "fg"]
-     * StringUtils.splitByCharacterType("ab:cd:ef")   = ["ab", ":", "cd", ":", "ef"]
-     * StringUtils.splitByCharacterType("number5")    = ["number", "5"]
-     * StringUtils.splitByCharacterType("fooBar")     = ["foo", "B", "ar"]
-     * StringUtils.splitByCharacterType("foo200Bar")  = ["foo", "200", "B", "ar"]
-     * StringUtils.splitByCharacterType("ASFRules")   = ["ASFR", "ules"]
-     * </pre>
-     * @param str the String to split, may be {@code null}
-     * @return an array of parsed Strings, {@code null} if null String input
-     * @since 2.4
-     */
-    public static String[] splitByCharacterType(final String str) {
-        return splitByCharacterType(str, false);
-    }
-
-    /**
-     * <p>Splits a String by Character type as returned by
-     * {@code java.lang.Character.getType(char)}. Groups of contiguous
-     * characters of the same type are returned as complete tokens, with the
-     * following exception: the character of type
-     * {@code Character.UPPERCASE_LETTER}, if any, immediately
-     * preceding a token of type {@code Character.LOWERCASE_LETTER}
-     * will belong to the following token rather than to the preceding, if any,
-     * {@code Character.UPPERCASE_LETTER} token.
-     * <pre>
-     * StringUtils.splitByCharacterTypeCamelCase(null)         = null
-     * StringUtils.splitByCharacterTypeCamelCase("")           = []
-     * StringUtils.splitByCharacterTypeCamelCase("ab de fg")   = ["ab", " ", "de", " ", "fg"]
-     * StringUtils.splitByCharacterTypeCamelCase("ab   de fg") = ["ab", "   ", "de", " ", "fg"]
-     * StringUtils.splitByCharacterTypeCamelCase("ab:cd:ef")   = ["ab", ":", "cd", ":", "ef"]
-     * StringUtils.splitByCharacterTypeCamelCase("number5")    = ["number", "5"]
-     * StringUtils.splitByCharacterTypeCamelCase("fooBar")     = ["foo", "Bar"]
-     * StringUtils.splitByCharacterTypeCamelCase("foo200Bar")  = ["foo", "200", "Bar"]
-     * StringUtils.splitByCharacterTypeCamelCase("ASFRules")   = ["ASF", "Rules"]
-     * </pre>
-     * @param str the String to split, may be {@code null}
-     * @return an array of parsed Strings, {@code null} if null String input
-     * @since 2.4
-     */
-    public static String[] splitByCharacterTypeCamelCase(final String str) {
-        return splitByCharacterType(str, true);
-    }
-
-    /**
-     * <p>Splits a String by Character type as returned by
-     * {@code java.lang.Character.getType(char)}. Groups of contiguous
-     * characters of the same type are returned as complete tokens, with the
-     * following exception: if {@code camelCase} is {@code true},
-     * the character of type {@code Character.UPPERCASE_LETTER}, if any,
-     * immediately preceding a token of type {@code Character.LOWERCASE_LETTER}
-     * will belong to the following token rather than to the preceding, if any,
-     * {@code Character.UPPERCASE_LETTER} token.
-     * @param str the String to split, may be {@code null}
-     * @param camelCase whether to use so-called "camel-case" for letter types
-     * @return an array of parsed Strings, {@code null} if null String input
-     * @since 2.4
-     */
-    private static String[] splitByCharacterType(final String str, final boolean camelCase) {
-        if (str == null) {
-            return null;
-        }
-        if (str.isEmpty()) {
-            return ArrayUtils.EMPTY_STRING_ARRAY;
-        }
-        final char[] c = str.toCharArray();
-        final List<String> list = new ArrayList<String>();
-        int tokenStart = 0;
-        int currentType = Character.getType(c[tokenStart]);
-        for (int pos = tokenStart + 1; pos < c.length; pos++) {
-            final int type = Character.getType(c[pos]);
-            if (type == currentType) {
-                continue;
-            }
-            if (camelCase && type == Character.LOWERCASE_LETTER && currentType == Character.UPPERCASE_LETTER) {
-                final int newTokenStart = pos - 1;
-                if (newTokenStart != tokenStart) {
-                    list.add(new String(c, tokenStart, newTokenStart - tokenStart));
-                    tokenStart = newTokenStart;
-                }
-            } else {
-                list.add(new String(c, tokenStart, pos - tokenStart));
-                tokenStart = pos;
-            }
-            currentType = type;
-        }
-        list.add(new String(c, tokenStart, c.length - tokenStart));
-        return list.toArray(new String[list.size()]);
-    }
-
-    // Joining
-    //-----------------------------------------------------------------------
-    /**
-     * <p>Joins the elements of the provided array into a single String
-     * containing the provided list of elements.</p>
-     *
-     * <p>No separator is added to the joined String.
-     * Null objects or empty strings within the array are represented by
-     * empty strings.</p>
-     *
-     * <pre>
-     * StringUtils.join(null)            = null
-     * StringUtils.join([])              = ""
-     * StringUtils.join([null])          = ""
-     * StringUtils.join(["a", "b", "c"]) = "abc"
-     * StringUtils.join([null, "", "a"]) = "a"
-     * </pre>
-     *
-     * @param <T> the specific type of values to join together
-     * @param elements  the values to join together, may be null
-     * @return the joined String, {@code null} if null array input
-     * @since 2.0
-     * @since 3.0 Changed signature to use varargs
-     */
-    public static <T> String join(final T... elements) {
-        return join(elements, null);
-    }
-
-    /**
-     * <p>Joins the elements of the provided array into a single String
-     * containing the provided list of elements.</p>
-     *
-     * <p>No delimiter is added before or after the list.
-     * Null objects or empty strings within the array are represented by
-     * empty strings.</p>
-     *
-     * <pre>
-     * StringUtils.join(null, *)               = null
-     * StringUtils.join([], *)                 = ""
-     * StringUtils.join([null], *)             = ""
-     * StringUtils.join(["a", "b", "c"], ';')  = "a;b;c"
-     * StringUtils.join(["a", "b", "c"], null) = "abc"
-     * StringUtils.join([null, "", "a"], ';')  = ";;a"
-     * </pre>
-     *
-     * @param array  the array of values to join together, may be null
-     * @param separator  the separator character to use
-     * @return the joined String, {@code null} if null array input
-     * @since 2.0
-     */
-    public static String join(final Object[] array, final char separator) {
-        if (array == null) {
-            return null;
-        }
-        return join(array, separator, 0, array.length);
-    }
-
-    /**
-     * <p>
-     * Joins the elements of the provided array into a single String containing the provided list of elements.
-     * </p>
-     *
-     * <p>
-     * No delimiter is added before or after the list. Null objects or empty strings within the array are represented
-     * by empty strings.
-     * </p>
-     *
-     * <pre>
-     * StringUtils.join(null, *)               = null
-     * StringUtils.join([], *)                 = ""
-     * StringUtils.join([null], *)             = ""
-     * StringUtils.join([1, 2, 3], ';')  = "1;2;3"
-     * StringUtils.join([1, 2, 3], null) = "123"
-     * </pre>
-     *
-     * @param array
-     *            the array of values to join together, may be null
-     * @param separator
-     *            the separator character to use
-     * @return the joined String, {@code null} if null array input
-     * @since 3.2
-     */
-    public static String join(final long[] array, final char separator) {
-        if (array == null) {
-            return null;
-        }
-        return join(array, separator, 0, array.length);
-    }
-
-    /**
-     * <p>
-     * Joins the elements of the provided array into a single String containing the provided list of elements.
-     * </p>
-     *
-     * <p>
-     * No delimiter is added before or after the list. Null objects or empty strings within the array are represented
-     * by empty strings.
-     * </p>
-     *
-     * <pre>
-     * StringUtils.join(null, *)               = null
-     * StringUtils.join([], *)                 = ""
-     * StringUtils.join([null], *)             = ""
-     * StringUtils.join([1, 2, 3], ';')  = "1;2;3"
-     * StringUtils.join([1, 2, 3], null) = "123"
-     * </pre>
-     *
-     * @param array
-     *            the array of values to join together, may be null
-     * @param separator
-     *            the separator character to use
-     * @return the joined String, {@code null} if null array input
-     * @since 3.2
-     */
-    public static String join(final int[] array, final char separator) {
-        if (array == null) {
-            return null;
-        }
-        return join(array, separator, 0, array.length);
-    }
-
-    /**
-     * <p>
-     * Joins the elements of the provided array into a single String containing the provided list of elements.
-     * </p>
-     *
-     * <p>
-     * No delimiter is added before or after the list. Null objects or empty strings within the array are represented
-     * by empty strings.
-     * </p>
-     *
-     * <pre>
-     * StringUtils.join(null, *)               = null
-     * StringUtils.join([], *)                 = ""
-     * StringUtils.join([null], *)             = ""
-     * StringUtils.join([1, 2, 3], ';')  = "1;2;3"
-     * StringUtils.join([1, 2, 3], null) = "123"
-     * </pre>
-     *
-     * @param array
-     *            the array of values to join together, may be null
-     * @param separator
-     *            the separator character to use
-     * @return the joined String, {@code null} if null array input
-     * @since 3.2
-     */
-    public static String join(final short[] array, final char separator) {
-        if (array == null) {
-            return null;
-        }
-        return join(array, separator, 0, array.length);
-    }
-
-    /**
-     * <p>
-     * Joins the elements of the provided array into a single String containing the provided list of elements.
-     * </p>
-     *
-     * <p>
-     * No delimiter is added before or after the list. Null objects or empty strings within the array are represented
-     * by empty strings.
-     * </p>
-     *
-     * <pre>
-     * StringUtils.join(null, *)               = null
-     * StringUtils.join([], *)                 = ""
-     * StringUtils.join([null], *)             = ""
-     * StringUtils.join([1, 2, 3], ';')  = "1;2;3"
-     * StringUtils.join([1, 2, 3], null) = "123"
-     * </pre>
-     *
-     * @param array
-     *            the array of values to join together, may be null
-     * @param separator
-     *            the separator character to use
-     * @return the joined String, {@code null} if null array input
-     * @since 3.2
-     */
-    public static String join(final byte[] array, final char separator) {
-        if (array == null) {
-            return null;
-        }
-        return join(array, separator, 0, array.length);
-    }
-
-    /**
-     * <p>
-     * Joins the elements of the provided array into a single String containing the provided list of elements.
-     * </p>
-     *
-     * <p>
-     * No delimiter is added before or after the list. Null objects or empty strings within the array are represented
-     * by empty strings.
-     * </p>
-     *
-     * <pre>
-     * StringUtils.join(null, *)               = null
-     * StringUtils.join([], *)                 = ""
-     * StringUtils.join([null], *)             = ""
-     * StringUtils.join([1, 2, 3], ';')  = "1;2;3"
-     * StringUtils.join([1, 2, 3], null) = "123"
-     * </pre>
-     *
-     * @param array
-     *            the array of values to join together, may be null
-     * @param separator
-     *            the separator character to use
-     * @return the joined String, {@code null} if null array input
-     * @since 3.2
-     */
-    public static String join(final char[] array, final char separator) {
-        if (array == null) {
-            return null;
-        }
-        return join(array, separator, 0, array.length);
-    }
-
-    /**
-     * <p>
-     * Joins the elements of the provided array into a single String containing the provided list of elements.
-     * </p>
-     *
-     * <p>
-     * No delimiter is added before or after the list. Null objects or empty strings within the array are represented
-     * by empty strings.
-     * </p>
-     *
-     * <pre>
-     * StringUtils.join(null, *)               = null
-     * StringUtils.join([], *)                 = ""
-     * StringUtils.join([null], *)             = ""
-     * StringUtils.join([1, 2, 3], ';')  = "1;2;3"
-     * StringUtils.join([1, 2, 3], null) = "123"
-     * </pre>
-     *
-     * @param array
-     *            the array of values to join together, may be null
-     * @param separator
-     *            the separator character to use
-     * @return the joined String, {@code null} if null array input
-     * @since 3.2
-     */
-    public static String join(final float[] array, final char separator) {
-        if (array == null) {
-            return null;
-        }
-        return join(array, separator, 0, array.length);
-    }
-
-    /**
-     * <p>
-     * Joins the elements of the provided array into a single String containing the provided list of elements.
-     * </p>
-     *
-     * <p>
-     * No delimiter is added before or after the list. Null objects or empty strings within the array are represented
-     * by empty strings.
-     * </p>
-     *
-     * <pre>
-     * StringUtils.join(null, *)               = null
-     * StringUtils.join([], *)                 = ""
-     * StringUtils.join([null], *)             = ""
-     * StringUtils.join([1, 2, 3], ';')  = "1;2;3"
-     * StringUtils.join([1, 2, 3], null) = "123"
-     * </pre>
-     *
-     * @param array
-     *            the array of values to join together, may be null
-     * @param separator
-     *            the separator character to use
-     * @return the joined String, {@code null} if null array input
-     * @since 3.2
-     */
-    public static String join(final double[] array, final char separator) {
-        if (array == null) {
-            return null;
-        }
-        return join(array, separator, 0, array.length);
-    }
-
-
-    /**
-     * <p>Joins the elements of the provided array into a single String
-     * containing the provided list of elements.</p>
-     *
-     * <p>No delimiter is added before or after the list.
-     * Null objects or empty strings within the array are represented by
-     * empty strings.</p>
-     *
-     * <pre>
-     * StringUtils.join(null, *)               = null
-     * StringUtils.join([], *)                 = ""
-     * StringUtils.join([null], *)             = ""
-     * StringUtils.join(["a", "b", "c"], ';')  = "a;b;c"
-     * StringUtils.join(["a", "b", "c"], null) = "abc"
-     * StringUtils.join([null, "", "a"], ';')  = ";;a"
-     * </pre>
-     *
-     * @param array  the array of values to join together, may be null
-     * @param separator  the separator character to use
-     * @param startIndex the first index to start joining from.  It is
-     * an error to pass in an end index past the end of the array
-     * @param endIndex the index to stop joining from (exclusive). It is
-     * an error to pass in an end index past the end of the array
-     * @return the joined String, {@code null} if null array input
-     * @since 2.0
-     */
-    public static String join(final Object[] array, final char separator, final int startIndex, final int endIndex) {
-        if (array == null) {
-            return null;
-        }
-        final int noOfItems = endIndex - startIndex;
-        if (noOfItems <= 0) {
-            return EMPTY;
-        }
-        final StringBuilder buf = new StringBuilder(noOfItems * 16);
-        for (int i = startIndex; i < endIndex; i++) {
-            if (i > startIndex) {
-                buf.append(separator);
-            }
-            if (array[i] != null) {
-                buf.append(array[i]);
-            }
-        }
-        return buf.toString();
-    }
-
-    /**
-     * <p>
-     * Joins the elements of the provided array into a single String containing the provided list of elements.
-     * </p>
-     *
-     * <p>
-     * No delimiter is added before or after the list. Null objects or empty strings within the array are represented
-     * by empty strings.
-     * </p>
-     *
-     * <pre>
-     * StringUtils.join(null, *)               = null
-     * StringUtils.join([], *)                 = ""
-     * StringUtils.join([null], *)             = ""
-     * StringUtils.join([1, 2, 3], ';')  = "1;2;3"
-     * StringUtils.join([1, 2, 3], null) = "123"
-     * </pre>
-     *
-     * @param array
-     *            the array of values to join together, may be null
-     * @param separator
-     *            the separator character to use
-     * @param startIndex
-     *            the first index to start joining from. It is an error to pass in an end index past the end of the
-     *            array
-     * @param endIndex
-     *            the index to stop joining from (exclusive). It is an error to pass in an end index past the end of
-     *            the array
-     * @return the joined String, {@code null} if null array input
-     * @since 3.2
-     */
-    public static String join(final long[] array, final char separator, final int startIndex, final int endIndex) {
-        if (array == null) {
-            return null;
-        }
-        final int noOfItems = endIndex - startIndex;
-        if (noOfItems <= 0) {
-            return EMPTY;
-        }
-        final StringBuilder buf = new StringBuilder(noOfItems * 16);
-        for (int i = startIndex; i < endIndex; i++) {
-            if (i > startIndex) {
-                buf.append(separator);
-            }
-            buf.append(array[i]);
-        }
-        return buf.toString();
-    }
-
-    /**
-     * <p>
-     * Joins the elements of the provided array into a single String containing the provided list of elements.
-     * </p>
-     *
-     * <p>
-     * No delimiter is added before or after the list. Null objects or empty strings within the array are represented
-     * by empty strings.
-     * </p>
-     *
-     * <pre>
-     * StringUtils.join(null, *)               = null
-     * StringUtils.join([], *)                 = ""
-     * StringUtils.join([null], *)             = ""
-     * StringUtils.join([1, 2, 3], ';')  = "1;2;3"
-     * StringUtils.join([1, 2, 3], null) = "123"
-     * </pre>
-     *
-     * @param array
-     *            the array of values to join together, may be null
-     * @param separator
-     *            the separator character to use
-     * @param startIndex
-     *            the first index to start joining from. It is an error to pass in an end index past the end of the
-     *            array
-     * @param endIndex
-     *            the index to stop joining from (exclusive). It is an error to pass in an end index past the end of
-     *            the array
-     * @return the joined String, {@code null} if null array input
-     * @since 3.2
-     */
-    public static String join(final int[] array, final char separator, final int startIndex, final int endIndex) {
-        if (array == null) {
-            return null;
-        }
-        final int noOfItems = endIndex - startIndex;
-        if (noOfItems <= 0) {
-            return EMPTY;
-        }
-        final StringBuilder buf = new StringBuilder(noOfItems * 16);
-        for (int i = startIndex; i < endIndex; i++) {
-            if (i > startIndex) {
-                buf.append(separator);
-            }
-            buf.append(array[i]);
-        }
-        return buf.toString();
-    }
-
-    /**
-     * <p>
-     * Joins the elements of the provided array into a single String containing the provided list of elements.
-     * </p>
-     *
-     * <p>
-     * No delimiter is added before or after the list. Null objects or empty strings within the array are represented
-     * by empty strings.
-     * </p>
-     *
-     * <pre>
-     * StringUtils.join(null, *)               = null
-     * StringUtils.join([], *)                 = ""
-     * StringUtils.join([null], *)             = ""
-     * StringUtils.join([1, 2, 3], ';')  = "1;2;3"
-     * StringUtils.join([1, 2, 3], null) = "123"
-     * </pre>
-     *
-     * @param array
-     *            the array of values to join together, may be null
-     * @param separator
-     *            the separator character to use
-     * @param startIndex
-     *            the first index to start joining from. It is an error to pass in an end index past the end of the
-     *            array
-     * @param endIndex
-     *            the index to stop joining from (exclusive). It is an error to pass in an end index past the end of
-     *            the array
-     * @return the joined String, {@code null} if null array input
-     * @since 3.2
-     */
-    public static String join(final byte[] array, final char separator, final int startIndex, final int endIndex) {
-        if (array == null) {
-            return null;
-        }
-        final int noOfItems = endIndex - startIndex;
-        if (noOfItems <= 0) {
-            return EMPTY;
-        }
-        final StringBuilder buf = new StringBuilder(noOfItems * 16);
-        for (int i = startIndex; i < endIndex; i++) {
-            if (i > startIndex) {
-                buf.append(separator);
-            }
-            buf.append(array[i]);
-        }
-        return buf.toString();
-    }
-
-    /**
-     * <p>
-     * Joins the elements of the provided array into a single String containing the provided list of elements.
-     * </p>
-     *
-     * <p>
-     * No delimiter is added before or after the list. Null objects or empty strings within the array are represented
-     * by empty strings.
-     * </p>
-     *
-     * <pre>
-     * StringUtils.join(null, *)               = null
-     * StringUtils.join([], *)                 = ""
-     * StringUtils.join([null], *)             = ""
-     * StringUtils.join([1, 2, 3], ';')  = "1;2;3"
-     * StringUtils.join([1, 2, 3], null) = "123"
-     * </pre>
-     *
-     * @param array
-     *            the array of values to join together, may be null
-     * @param separator
-     *            the separator character to use
-     * @param startIndex
-     *            the first index to start joining from. It is an error to pass in an end index past the end of the
-     *            array
-     * @param endIndex
-     *            the index to stop joining from (exclusive). It is an error to pass in an end index past the end of
-     *            the array
-     * @return the joined String, {@code null} if null array input
-     * @since 3.2
-     */
-    public static String join(final short[] array, final char separator, final int startIndex, final int endIndex) {
-        if (array == null) {
-            return null;
-        }
-        final int noOfItems = endIndex - startIndex;
-        if (noOfItems <= 0) {
-            return EMPTY;
-        }
-        final StringBuilder buf = new StringBuilder(noOfItems * 16);
-        for (int i = startIndex; i < endIndex; i++) {
-            if (i > startIndex) {
-                buf.append(separator);
-            }
-            buf.append(array[i]);
-        }
-        return buf.toString();
-    }
-
-    /**
-     * <p>
-     * Joins the elements of the provided array into a single String containing the provided list of elements.
-     * </p>
-     *
-     * <p>
-     * No delimiter is added before or after the list. Null objects or empty strings within the array are represented
-     * by empty strings.
-     * </p>
-     *
-     * <pre>
-     * StringUtils.join(null, *)               = null
-     * StringUtils.join([], *)                 = ""
-     * StringUtils.join([null], *)             = ""
-     * StringUtils.join([1, 2, 3], ';')  = "1;2;3"
-     * StringUtils.join([1, 2, 3], null) = "123"
-     * </pre>
-     *
-     * @param array
-     *            the array of values to join together, may be null
-     * @param separator
-     *            the separator character to use
-     * @param startIndex
-     *            the first index to start joining from. It is an error to pass in an end index past the end of the
-     *            array
-     * @param endIndex
-     *            the index to stop joining from (exclusive). It is an error to pass in an end index past the end of
-     *            the array
-     * @return the joined String, {@code null} if null array input
-     * @since 3.2
-     */
-    public static String join(final char[] array, final char separator, final int startIndex, final int endIndex) {
-        if (array == null) {
-            return null;
-        }
-        final int noOfItems = endIndex - startIndex;
-        if (noOfItems <= 0) {
-            return EMPTY;
-        }
-        final StringBuilder buf = new StringBuilder(noOfItems * 16);
-        for (int i = startIndex; i < endIndex; i++) {
-            if (i > startIndex) {
-                buf.append(separator);
-            }
-            buf.append(array[i]);
-        }
-        return buf.toString();
-    }
-
-    /**
-     * <p>
-     * Joins the elements of the provided array into a single String containing the provided list of elements.
-     * </p>
-     *
-     * <p>
-     * No delimiter is added before or after the list. Null objects or empty strings within the array are represented
-     * by empty strings.
-     * </p>
-     *
-     * <pre>
-     * StringUtils.join(null, *)               = null
-     * StringUtils.join([], *)                 = ""
-     * StringUtils.join([null], *)             = ""
-     * StringUtils.join([1, 2, 3], ';')  = "1;2;3"
-     * StringUtils.join([1, 2, 3], null) = "123"
-     * </pre>
-     *
-     * @param array
-     *            the array of values to join together, may be null
-     * @param separator
-     *            the separator character to use
-     * @param startIndex
-     *            the first index to start joining from. It is an error to pass in an end index past the end of the
-     *            array
-     * @param endIndex
-     *            the index to stop joining from (exclusive). It is an error to pass in an end index past the end of
-     *            the array
-     * @return the joined String, {@code null} if null array input
-     * @since 3.2
-     */
-    public static String join(final double[] array, final char separator, final int startIndex, final int endIndex) {
-        if (array == null) {
-            return null;
-        }
-        final int noOfItems = endIndex - startIndex;
-        if (noOfItems <= 0) {
-            return EMPTY;
-        }
-        final StringBuilder buf = new StringBuilder(noOfItems * 16);
-        for (int i = startIndex; i < endIndex; i++) {
-            if (i > startIndex) {
-                buf.append(separator);
-            }
-            buf.append(array[i]);
-        }
-        return buf.toString();
-    }
-
-    /**
-     * <p>
-     * Joins the elements of the provided array into a single String containing the provided list of elements.
-     * </p>
-     *
-     * <p>
-     * No delimiter is added before or after the list. Null objects or empty strings within the array are represented
-     * by empty strings.
-     * </p>
-     *
-     * <pre>
-     * StringUtils.join(null, *)               = null
-     * StringUtils.join([], *)                 = ""
-     * StringUtils.join([null], *)             = ""
-     * StringUtils.join([1, 2, 3], ';')  = "1;2;3"
-     * StringUtils.join([1, 2, 3], null) = "123"
-     * </pre>
-     *
-     * @param array
-     *            the array of values to join together, may be null
-     * @param separator
-     *            the separator character to use
-     * @param startIndex
-     *            the first index to start joining from. It is an error to pass in an end index past the end of the
-     *            array
-     * @param endIndex
-     *            the index to stop joining from (exclusive). It is an error to pass in an end index past the end of
-     *            the array
-     * @return the joined String, {@code null} if null array input
-     * @since 3.2
-     */
-    public static String join(final float[] array, final char separator, final int startIndex, final int endIndex) {
-        if (array == null) {
-            return null;
-        }
-        final int noOfItems = endIndex - startIndex;
-        if (noOfItems <= 0) {
-            return EMPTY;
-        }
-        final StringBuilder buf = new StringBuilder(noOfItems * 16);
-        for (int i = startIndex; i < endIndex; i++) {
-            if (i > startIndex) {
-                buf.append(separator);
-            }
-            buf.append(array[i]);
-        }
-        return buf.toString();
-    }
-
-
-    /**
-     * <p>Joins the elements of the provided array into a single String
-     * containing the provided list of elements.</p>
-     *
-     * <p>No delimiter is added before or after the list.
-     * A {@code null} separator is the same as an empty String ("").
-     * Null objects or empty strings within the array are represented by
-     * empty strings.</p>
-     *
-     * <pre>
-     * StringUtils.join(null, *)                = null
-     * StringUtils.join([], *)                  = ""
-     * StringUtils.join([null], *)              = ""
-     * StringUtils.join(["a", "b", "c"], "--")  = "a--b--c"
-     * StringUtils.join(["a", "b", "c"], null)  = "abc"
-     * StringUtils.join(["a", "b", "c"], "")    = "abc"
-     * StringUtils.join([null, "", "a"], ',')   = ",,a"
-     * </pre>
-     *
-     * @param array  the array of values to join together, may be null
-     * @param separator  the separator character to use, null treated as ""
-     * @return the joined String, {@code null} if null array input
-     */
-    public static String join(final Object[] array, final String separator) {
-        if (array == null) {
-            return null;
-        }
-        return join(array, separator, 0, array.length);
-    }
-
-    /**
-     * <p>Joins the elements of the provided array into a single String
-     * containing the provided list of elements.</p>
-     *
-     * <p>No delimiter is added before or after the list.
-     * A {@code null} separator is the same as an empty String ("").
-     * Null objects or empty strings within the array are represented by
-     * empty strings.</p>
-     *
-     * <pre>
-     * StringUtils.join(null, *, *, *)                = null
-     * StringUtils.join([], *, *, *)                  = ""
-     * StringUtils.join([null], *, *, *)              = ""
-     * StringUtils.join(["a", "b", "c"], "--", 0, 3)  = "a--b--c"
-     * StringUtils.join(["a", "b", "c"], "--", 1, 3)  = "b--c"
-     * StringUtils.join(["a", "b", "c"], "--", 2, 3)  = "c"
-     * StringUtils.join(["a", "b", "c"], "--", 2, 2)  = ""
-     * StringUtils.join(["a", "b", "c"], null, 0, 3)  = "abc"
-     * StringUtils.join(["a", "b", "c"], "", 0, 3)    = "abc"
-     * StringUtils.join([null, "", "a"], ',', 0, 3)   = ",,a"
-     * </pre>
-     *
-     * @param array  the array of values to join together, may be null
-     * @param separator  the separator character to use, null treated as ""
-     * @param startIndex the first index to start joining from.
-     * @param endIndex the index to stop joining from (exclusive).
-     * @return the joined String, {@code null} if null array input; or the empty string
-     * if {@code endIndex - startIndex <= 0}. The number of joined entries is given by
-     * {@code endIndex - startIndex}
-     * @throws ArrayIndexOutOfBoundsException ife<br>
-     * {@code startIndex < 0} or <br>
-     * {@code startIndex >= array.length()} or <br>
-     * {@code endIndex < 0} or <br>
-     * {@code endIndex > array.length()}
-     */
-    public static String join(final Object[] array, String separator, final int startIndex, final int endIndex) {
-        if (array == null) {
-            return null;
-        }
-        if (separator == null) {
-            separator = EMPTY;
-        }
-
-        // endIndex - startIndex > 0:   Len = NofStrings *(len(firstString) + len(separator))
-        //           (Assuming that all Strings are roughly equally long)
-        final int noOfItems = endIndex - startIndex;
-        if (noOfItems <= 0) {
-            return EMPTY;
-        }
-
-        final StringBuilder buf = new StringBuilder(noOfItems * 16);
-
-        for (int i = startIndex; i < endIndex; i++) {
-            if (i > startIndex) {
-                buf.append(separator);
-            }
-            if (array[i] != null) {
-                buf.append(array[i]);
-            }
-        }
-        return buf.toString();
-    }
-
-    /**
-     * <p>Joins the elements of the provided {@code Iterator} into
-     * a single String containing the provided elements.</p>
-     *
-     * <p>No delimiter is added before or after the list. Null objects or empty
-     * strings within the iteration are represented by empty strings.</p>
-     *
-     * <p>See the examples here: {@link #join(Object[],char)}. </p>
-     *
-     * @param iterator  the {@code Iterator} of values to join together, may be null
-     * @param separator  the separator character to use
-     * @return the joined String, {@code null} if null iterator input
-     * @since 2.0
-     */
-    public static String join(final Iterator<?> iterator, final char separator) {
-
-        // handle null, zero and one elements before building a buffer
-        if (iterator == null) {
-            return null;
-        }
-        if (!iterator.hasNext()) {
-            return EMPTY;
-        }
-        final Object first = iterator.next();
-        if (!iterator.hasNext()) {
-            @SuppressWarnings( "deprecation" ) // ObjectUtils.toString(Object) has been deprecated in 3.2
-            final
-            String result = ObjectUtils.toString(first);
-            return result;
-        }
-
-        // two or more elements
-        final StringBuilder buf = new StringBuilder(256); // Java default is 16, probably too small
-        if (first != null) {
-            buf.append(first);
-        }
-
-        while (iterator.hasNext()) {
-            buf.append(separator);
-            final Object obj = iterator.next();
-            if (obj != null) {
-                buf.append(obj);
-            }
-        }
-
-        return buf.toString();
-    }
-
-    /**
-     * <p>Joins the elements of the provided {@code Iterator} into
-     * a single String containing the provided elements.</p>
-     *
-     * <p>No delimiter is added before or after the list.
-     * A {@code null} separator is the same as an empty String ("").</p>
-     *
-     * <p>See the examples here: {@link #join(Object[],String)}. </p>
-     *
-     * @param iterator  the {@code Iterator} of values to join together, may be null
-     * @param separator  the separator character to use, null treated as ""
-     * @return the joined String, {@code null} if null iterator input
-     */
-    public static String join(final Iterator<?> iterator, final String separator) {
-
-        // handle null, zero and one elements before building a buffer
-        if (iterator == null) {
-            return null;
-        }
-        if (!iterator.hasNext()) {
-            return EMPTY;
-        }
-        final Object first = iterator.next();
-        if (!iterator.hasNext()) {
-            @SuppressWarnings( "deprecation" ) // ObjectUtils.toString(Object) has been deprecated in 3.2
-            final String result = ObjectUtils.toString(first);
-            return result;
-        }
-
-        // two or more elements
-        final StringBuilder buf = new StringBuilder(256); // Java default is 16, probably too small
-        if (first != null) {
-            buf.append(first);
-        }
-
-        while (iterator.hasNext()) {
-            if (separator != null) {
-                buf.append(separator);
-            }
-            final Object obj = iterator.next();
-            if (obj != null) {
-                buf.append(obj);
-            }
-        }
-        return buf.toString();
-    }
-
-    /**
-     * <p>Joins the elements of the provided {@code Iterable} into
-     * a single String containing the provided elements.</p>
-     *
-     * <p>No delimiter is added before or after the list. Null objects or empty
-     * strings within the iteration are represented by empty strings.</p>
-     *
-     * <p>See the examples here: {@link #join(Object[],char)}. </p>
-     *
-     * @param iterable  the {@code Iterable} providing the values to join together, may be null
-     * @param separator  the separator character to use
-     * @return the joined String, {@code null} if null iterator input
-     * @since 2.3
-     */
-    public static String join(final Iterable<?> iterable, final char separator) {
-        if (iterable == null) {
-            return null;
-        }
-        return join(iterable.iterator(), separator);
-    }
-
-    /**
-     * <p>Joins the elements of the provided {@code Iterable} into
-     * a single String containing the provided elements.</p>
-     *
-     * <p>No delimiter is added before or after the list.
-     * A {@code null} separator is the same as an empty String ("").</p>
-     *
-     * <p>See the examples here: {@link #join(Object[],String)}. </p>
-     *
-     * @param iterable  the {@code Iterable} providing the values to join together, may be null
-     * @param separator  the separator character to use, null treated as ""
-     * @return the joined String, {@code null} if null iterator input
-     * @since 2.3
-     */
-    public static String join(final Iterable<?> iterable, final String separator) {
-        if (iterable == null) {
-            return null;
-        }
-        return join(iterable.iterator(), separator);
-    }
-
-    // Delete
-    //-----------------------------------------------------------------------
-    /**
-     * <p>Deletes all whitespaces from a String as defined by
-     * {@link Character#isWhitespace(char)}.</p>
-     *
-     * <pre>
-     * StringUtils.deleteWhitespace(null)         = null
-     * StringUtils.deleteWhitespace("")           = ""
-     * StringUtils.deleteWhitespace("abc")        = "abc"
-     * StringUtils.deleteWhitespace("   ab  c  ") = "abc"
-     * </pre>
-     *
-     * @param str  the String to delete whitespace from, may be null
-     * @return the String without whitespaces, {@code null} if null String input
-     */
-    public static String deleteWhitespace(final String str) {
-        if (isEmpty(str)) {
-            return str;
-        }
-        final int sz = str.length();
-        final char[] chs = new char[sz];
-        int count = 0;
-        for (int i = 0; i < sz; i++) {
-            if (!Character.isWhitespace(str.charAt(i))) {
-                chs[count++] = str.charAt(i);
-            }
-        }
-        if (count == sz) {
-            return str;
-        }
-        return new String(chs, 0, count);
-    }
-
-    // Remove
-    //-----------------------------------------------------------------------
-    /**
-     * <p>Removes a substring only if it is at the beginning of a source string,
-     * otherwise returns the source string.</p>
-     *
-     * <p>A {@code null} source string will return {@code null}.
-     * An empty ("") source string will return the empty string.
-     * A {@code null} search string will return the source string.</p>
-     *
-     * <pre>
-     * StringUtils.removeStart(null, *)      = null
-     * StringUtils.removeStart("", *)        = ""
-     * StringUtils.removeStart(*, null)      = *
-     * StringUtils.removeStart("www.domain.com", "www.")   = "domain.com"
-     * StringUtils.removeStart("domain.com", "www.")       = "domain.com"
-     * StringUtils.removeStart("www.domain.com", "domain") = "www.domain.com"
-     * StringUtils.removeStart("abc", "")    = "abc"
-     * </pre>
-     *
-     * @param str  the source String to search, may be null
-     * @param remove  the String to search for and remove, may be null
-     * @return the substring with the string removed if found,
-     *  {@code null} if null String input
-     * @since 2.1
-     */
-    public static String removeStart(final String str, final String remove) {
-        if (isEmpty(str) || isEmpty(remove)) {
-            return str;
-        }
-        if (str.startsWith(remove)){
-            return str.substring(remove.length());
-        }
-        return str;
-    }
-
-    /**
-     * <p>Case insensitive removal of a substring if it is at the beginning of a source string,
-     * otherwise returns the source string.</p>
-     *
-     * <p>A {@code null} source string will return {@code null}.
-     * An empty ("") source string will return the empty string.
-     * A {@code null} search string will return the source string.</p>
-     *
-     * <pre>
-     * StringUtils.removeStartIgnoreCase(null, *)      = null
-     * StringUtils.removeStartIgnoreCase("", *)        = ""
-     * StringUtils.removeStartIgnoreCase(*, null)      = *
-     * StringUtils.removeStartIgnoreCase("www.domain.com", "www.")   = "domain.com"
-     * StringUtils.removeStartIgnoreCase("www.domain.com", "WWW.")   = "domain.com"
-     * StringUtils.removeStartIgnoreCase("domain.com", "www.")       = "domain.com"
-     * StringUtils.removeStartIgnoreCase("www.domain.com", "domain") = "www.domain.com"
-     * StringUtils.removeStartIgnoreCase("abc", "")    = "abc"
-     * </pre>
-     *
-     * @param str  the source String to search, may be null
-     * @param remove  the String to search for (case insensitive) and remove, may be null
-     * @return the substring with the string removed if found,
-     *  {@code null} if null String input
-     * @since 2.4
-     */
-    public static String removeStartIgnoreCase(final String str, final String remove) {
-        if (isEmpty(str) || isEmpty(remove)) {
-            return str;
-        }
-        if (startsWithIgnoreCase(str, remove)) {
-            return str.substring(remove.length());
-        }
-        return str;
-    }
-
-    /**
-     * <p>Removes a substring only if it is at the end of a source string,
-     * otherwise returns the source string.</p>
-     *
-     * <p>A {@code null} source string will return {@code null}.
-     * An empty ("") source string will return the empty string.
-     * A {@code null} search string will return the source string.</p>
-     *
-     * <pre>
-     * StringUtils.removeEnd(null, *)      = null
-     * StringUtils.removeEnd("", *)        = ""
-     * StringUtils.removeEnd(*, null)      = *
-     * StringUtils.removeEnd("www.domain.com", ".com.")  = "www.domain.com"
-     * StringUtils.removeEnd("www.domain.com", ".com")   = "www.domain"
-     * StringUtils.removeEnd("www.domain.com", "domain") = "www.domain.com"
-     * StringUtils.removeEnd("abc", "")    = "abc"
-     * </pre>
-     *
-     * @param str  the source String to search, may be null
-     * @param remove  the String to search for and remove, may be null
-     * @return the substring with the string removed if found,
-     *  {@code null} if null String input
-     * @since 2.1
-     */
-    public static String removeEnd(final String str, final String remove) {
-        if (isEmpty(str) || isEmpty(remove)) {
-            return str;
-        }
-        if (str.endsWith(remove)) {
-            return str.substring(0, str.length() - remove.length());
-        }
-        return str;
-    }
-
-    /**
-     * <p>Case insensitive removal of a substring if it is at the end of a source string,
-     * otherwise returns the source string.</p>
-     *
-     * <p>A {@code null} source string will return {@code null}.
-     * An empty ("") source string will return the empty string.
-     * A {@code null} search string will return the source string.</p>
-     *
-     * <pre>
-     * StringUtils.removeEndIgnoreCase(null, *)      = null
-     * StringUtils.removeEndIgnoreCase("", *)        = ""
-     * StringUtils.removeEndIgnoreCase(*, null)      = *
-     * StringUtils.removeEndIgnoreCase("www.domain.com", ".com.")  = "www.domain.com"
-     * StringUtils.removeEndIgnoreCase("www.domain.com", ".com")   = "www.domain"
-     * StringUtils.removeEndIgnoreCase("www.domain.com", "domain") = "www.domain.com"
-     * StringUtils.removeEndIgnoreCase("abc", "")    = "abc"
-     * StringUtils.removeEndIgnoreCase("www.domain.com", ".COM") = "www.domain")
-     * StringUtils.removeEndIgnoreCase("www.domain.COM", ".com") = "www.domain")
-     * </pre>
-     *
-     * @param str  the source String to search, may be null
-     * @param remove  the String to search for (case insensitive) and remove, may be null
-     * @return the substring with the string removed if found,
-     *  {@code null} if null String input
-     * @since 2.4
-     */
-    public static String removeEndIgnoreCase(final String str, final String remove) {
-        if (isEmpty(str) || isEmpty(remove)) {
-            return str;
-        }
-        if (endsWithIgnoreCase(str, remove)) {
-            return str.substring(0, str.length() - remove.length());
-        }
-        return str;
-    }
-
-    /**
-     * <p>Removes all occurrences of a substring from within the source string.</p>
-     *
-     * <p>A {@code null} source string will return {@code null}.
-     * An empty ("") source string will return the empty string.
-     * A {@code null} remove string will return the source string.
-     * An empty ("") remove string will return the source string.</p>
-     *
-     * <pre>
-     * StringUtils.remove(null, *)        = null
-     * StringUtils.remove("", *)          = ""
-     * StringUtils.remove(*, null)        = *
-     * StringUtils.remove(*, "")          = *
-     * StringUtils.remove("queued", "ue") = "qd"
-     * StringUtils.remove("queued", "zz") = "queued"
-     * </pre>
-     *
-     * @param str  the source String to search, may be null
-     * @param remove  the String to search for and remove, may be null
-     * @return the substring with the string removed if found,
-     *  {@code null} if null String input
-     * @since 2.1
-     */
-    public static String remove(final String str, final String remove) {
-        if (isEmpty(str) || isEmpty(remove)) {
-            return str;
-        }
-        return replace(str, remove, EMPTY, -1);
-    }
-
-    /**
-     * <p>Removes all occurrences of a character from within the source string.</p>
-     *
-     * <p>A {@code null} source string will return {@code null}.
-     * An empty ("") source string will return the empty string.</p>
-     *
-     * <pre>
-     * StringUtils.remove(null, *)       = null
-     * StringUtils.remove("", *)         = ""
-     * StringUtils.remove("queued", 'u') = "qeed"
-     * StringUtils.remove("queued", 'z') = "queued"
-     * </pre>
-     *
-     * @param str  the source String to search, may be null
-     * @param remove  the char to search for and remove, may be null
-     * @return the substring with the char removed if found,
-     *  {@code null} if null String input
-     * @since 2.1
-     */
-    public static String remove(final String str, final char remove) {
-        if (isEmpty(str) || str.indexOf(remove) == INDEX_NOT_FOUND) {
-            return str;
-        }
-        final char[] chars = str.toCharArray();
-        int pos = 0;
-        for (int i = 0; i < chars.length; i++) {
-            if (chars[i] != remove) {
-                chars[pos++] = chars[i];
-            }
-        }
-        return new String(chars, 0, pos);
-    }
-
-    // Replacing
-    //-----------------------------------------------------------------------
-    /**
-     * <p>Replaces a String with another String inside a larger String, once.</p>
-     *
-     * <p>A {@code null} reference passed to this method is a no-op.</p>
-     *
-     * <pre>
-     * StringUtils.replaceOnce(null, *, *)        = null
-     * StringUtils.replaceOnce("", *, *)          = ""
-     * StringUtils.replaceOnce("any", null, *)    = "any"
-     * StringUtils.replaceOnce("any", *, null)    = "any"
-     * StringUtils.replaceOnce("any", "", *)      = "any"
-     * StringUtils.replaceOnce("aba", "a", null)  = "aba"
-     * StringUtils.replaceOnce("aba", "a", "")    = "ba"
-     * StringUtils.replaceOnce("aba", "a", "z")   = "zba"
-     * </pre>
-     *
-     * @see #replace(String text, String searchString, String replacement, int max)
-     * @param text  text to search and replace in, may be null
-     * @param searchString  the String to search for, may be null
-     * @param replacement  the String to replace with, may be null
-     * @return the text with any replacements processed,
-     *  {@code null} if null String input
-     */
-    public static String replaceOnce(final String text, final String searchString, final String replacement) {
-        return replace(text, searchString, replacement, 1);
-    }
-
-    /**
-     * Replaces each substring of the source String that matches the given regular expression with the given
-     * replacement using the {@link Pattern#DOTALL} option. DOTALL is also know as single-line mode in Perl. This call
-     * is also equivalent to:
-     * <ul>
-     * <li>{@code source.replaceAll(&quot;(?s)&quot; + regex, replacement)}</li>
-     * <li>{@code Pattern.compile(regex, Pattern.DOTALL).matcher(source).replaceAll(replacement)}</li>
-     * </ul>
-     *
-     * @param source
-     *            the source string
-     * @param regex
-     *            the regular expression to which this string is to be matched
-     * @param replacement
-     *            the string to be substituted for each match
-     * @return The resulting {@code String}
-     * @see String#replaceAll(String, String)
-     * @see Pattern#DOTALL
-     * @since 3.2
-     */
-    public static String replacePattern(final String source, final String regex, final String replacement) {
-        return Pattern.compile(regex, Pattern.DOTALL).matcher(source).replaceAll(replacement);
-    }
-
-    /**
-     * Removes each substring of the source String that matches the given regular expression using the DOTALL option.
-     *
-     * @param source
-     *            the source string
-     * @param regex
-     *            the regular expression to which this string is to be matched
-     * @return The resulting {@code String}
-     * @see String#replaceAll(String, String)
-     * @see Pattern#DOTALL
-     * @since 3.2
-     */
-    public static String removePattern(final String source, final String regex) {
-        return replacePattern(source, regex, StringUtils.EMPTY);
-    }
-
-    /**
-     * <p>Replaces all occurrences of a String within another String.</p>
-     *
-     * <p>A {@code null} reference passed to this method is a no-op.</p>
-     *
-     * <pre>
-     * StringUtils.replace(null, *, *)        = null
-     * StringUtils.replace("", *, *)          = ""
-     * StringUtils.replace("any", null, *)    = "any"
-     * StringUtils.replace("any", *, null)    = "any"
-     * StringUtils.replace("any", "", *)      = "any"
-     * StringUtils.replace("aba", "a", null)  = "aba"
-     * StringUtils.replace("aba", "a", "")    = "b"
-     * StringUtils.replace("aba", "a", "z")   = "zbz"
-     * </pre>
-     *
-     * @see #replace(String text, String searchString, String replacement, int max)
-     * @param text  text to search and replace in, may be null
-     * @param searchString  the String to search for, may be null
-     * @param replacement  the String to replace it with, may be null
-     * @return the text with any replacements processed,
-     *  {@code null} if null String input
-     */
-    public static String replace(final String text, final String searchString, final String replacement) {
-        return replace(text, searchString, replacement, -1);
-    }
-
-    /**
-     * <p>Replaces a String with another String inside a larger String,
-     * for the first {@code max} values of the search String.</p>
-     *
-     * <p>A {@code null} reference passed to this method is a no-op.</p>
-     *
-     * <pre>
-     * StringUtils.replace(null, *, *, *)         = null
-     * StringUtils.replace("", *, *, *)           = ""
-     * StringUtils.replace("any", null, *, *)     = "any"
-     * StringUtils.replace("any", *, null, *)     = "any"
-     * StringUtils.replace("any", "", *, *)       = "any"
-     * StringUtils.replace("any", *, *, 0)        = "any"
-     * StringUtils.replace("abaa", "a", null, -1) = "abaa"
-     * StringUtils.replace("abaa", "a", "", -1)   = "b"
-     * StringUtils.replace("abaa", "a", "z", 0)   = "abaa"
-     * StringUtils.replace("abaa", "a", "z", 1)   = "zbaa"
-     * StringUtils.replace("abaa", "a", "z", 2)   = "zbza"
-     * StringUtils.replace("abaa", "a", "z", -1)  = "zbzz"
-     * </pre>
-     *
-     * @param text  text to search and replace in, may be null
-     * @param searchString  the String to search for, may be null
-     * @param replacement  the String to replace it with, may be null
-     * @param max  maximum number of values to replace, or {@code -1} if no maximum
-     * @return the text with any replacements processed,
-     *  {@code null} if null String input
-     */
-    public static String replace(final String text, final String searchString, final String replacement, int max) {
-        if (isEmpty(text) || isEmpty(searchString) || replacement == null || max == 0) {
-            return text;
-        }
-        int start = 0;
-        int end = text.indexOf(searchString, start);
-        if (end == INDEX_NOT_FOUND) {
-            return text;
-        }
-        final int replLength = searchString.length();
-        int increase = replacement.length() - replLength;
-        increase = increase < 0 ? 0 : increase;
-        increase *= max < 0 ? 16 : max > 64 ? 64 : max;
-        final StringBuilder buf = new StringBuilder(text.length() + increase);
-        while (end != INDEX_NOT_FOUND) {
-            buf.append(text.substring(start, end)).append(replacement);
-            start = end + replLength;
-            if (--max == 0) {
-                break;
-            }
-            end = text.indexOf(searchString, start);
-        }
-        buf.append(text.substring(start));
-        return buf.toString();
-    }
-
-    /**
-     * <p>
-     * Replaces all occurrences of Strings within another String.
-     * </p>
-     *
-     * <p>
-     * A {@code null} reference passed to this method is a no-op, or if
-     * any "search string" or "string to replace" is null, that replace will be
-     * ignored. This will not repeat. For repeating replaces, call the
-     * overloaded method.
-     * </p>
-     *
-     * <pre>
-     *  StringUtils.replaceEach(null, *, *)        = null
-     *  StringUtils.replaceEach("", *, *)          = ""
-     *  StringUtils.replaceEach("aba", null, null) = "aba"
-     *  StringUtils.replaceEach("aba", new String[0], null) = "aba"
-     *  StringUtils.replaceEach("aba", null, new String[0]) = "aba"
-     *  StringUtils.replaceEach("aba", new String[]{"a"}, null)  = "aba"
-     *  StringUtils.replaceEach("aba", new String[]{"a"}, new String[]{""})  = "b"
-     *  StringUtils.replaceEach("aba", new String[]{null}, new String[]{"a"})  = "aba"
-     *  StringUtils.replaceEach("abcde", new String[]{"ab", "d"}, new String[]{"w", "t"})  = "wcte"
-     *  (example of how it does not repeat)
-     *  StringUtils.replaceEach("abcde", new String[]{"ab", "d"}, new String[]{"d", "t"})  = "dcte"
-     * </pre>
-     *
-     * @param text
-     *            text to search and replace in, no-op if null
-     * @param searchList
-     *            the Strings to search for, no-op if null
-     * @param replacementList
-     *            the Strings to replace them with, no-op if null
-     * @return the text with any replacements processed, {@code null} if
-     *         null String input
-     * @throws IllegalArgumentException
-     *             if the lengths of the arrays are not the same (null is ok,
-     *             and/or size 0)
-     * @since 2.4
-     */
-    public static String replaceEach(final String text, final String[] searchList, final String[] replacementList) {
-        return replaceEach(text, searchList, replacementList, false, 0);
-    }
-
-    /**
-     * <p>
-     * Replaces all occurrences of Strings within another String.
-     * </p>
-     *
-     * <p>
-     * A {@code null} reference passed to this method is a no-op, or if
-     * any "search string" or "string to replace" is null, that replace will be
-     * ignored.
-     * </p>
-     *
-     * <pre>
-     *  StringUtils.replaceEachRepeatedly(null, *, *) = null
-     *  StringUtils.replaceEachRepeatedly("", *, *) = ""
-     *  StringUtils.replaceEachRepeatedly("aba", null, null) = "aba"
-     *  StringUtils.replaceEachRepeatedly("aba", new String[0], null) = "aba"
-     *  StringUtils.replaceEachRepeatedly("aba", null, new String[0]) = "aba"
-     *  StringUtils.replaceEachRepeatedly("aba", new String[]{"a"}, null) = "aba"
-     *  StringUtils.replaceEachRepeatedly("aba", new String[]{"a"}, new String[]{""}) = "b"
-     *  StringUtils.replaceEachRepeatedly("aba", new String[]{null}, new String[]{"a"}) = "aba"
-     *  StringUtils.replaceEachRepeatedly("abcde", new String[]{"ab", "d"}, new String[]{"w", "t"}) = "wcte"
-     *  (example of how it repeats)
-     *  StringUtils.replaceEachRepeatedly("abcde", new String[]{"ab", "d"}, new String[]{"d", "t"}) = "tcte"
-     *  StringUtils.replaceEachRepeatedly("abcde", new String[]{"ab", "d"}, new String[]{"d", "ab"}) = IllegalStateException
-     * </pre>
-     *
-     * @param text
-     *            text to search and replace in, no-op if null
-     * @param searchList
-     *            the Strings to search for, no-op if null
-     * @param replacementList
-     *            the Strings to replace them with, no-op if null
-     * @return the text with any replacements processed, {@code null} if
-     *         null String input
-     * @throws IllegalStateException
-     *             if the search is repeating and there is an endless loop due
-     *             to outputs of one being inputs to another
-     * @throws IllegalArgumentException
-     *             if the lengths of the arrays are not the same (null is ok,
-     *             and/or size 0)
-     * @since 2.4
-     */
-    public static String replaceEachRepeatedly(final String text, final String[] searchList, final String[] replacementList) {
-        // timeToLive should be 0 if not used or nothing to replace, else it's
-        // the length of the replace array
-        final int timeToLive = searchList == null ? 0 : searchList.length;
-        return replaceEach(text, searchList, replacementList, true, timeToLive);
-    }
-
-    /**
-     * <p>
-     * Replace all occurrences of Strings within another String.
-     * This is a private recursive helper method for {@link #replaceEachRepeatedly(String, String[], String[])} and
-     * {@link #replaceEach(String, String[], String[])}
-     * </p>
-     *
-     * <p>
-     * A {@code null} reference passed to this method is a no-op, or if
-     * any "search string" or "string to replace" is null, that replace will be
-     * ignored.
-     * </p>
-     *
-     * <pre>
-     *  StringUtils.replaceEach(null, *, *, *, *) = null
-     *  StringUtils.replaceEach("", *, *, *, *) = ""
-     *  StringUtils.replaceEach("aba", null, null, *, *) = "aba"
-     *  StringUtils.replaceEach("aba", new String[0], null, *, *) = "aba"
-     *  StringUtils.replaceEach("aba", null, new String[0], *, *) = "aba"
-     *  StringUtils.replaceEach("aba", new String[]{"a"}, null, *, *) = "aba"
-     *  StringUtils.replaceEach("aba", new String[]{"a"}, new String[]{""}, *, >=0) = "b"
-     *  StringUtils.replaceEach("aba", new String[]{null}, new String[]{"a"}, *, >=0) = "aba"
-     *  StringUtils.replaceEach("abcde", new String[]{"ab", "d"}, new String[]{"w", "t"}, *, >=0) = "wcte"
-     *  (example of how it repeats)
-     *  StringUtils.replaceEach("abcde", new String[]{"ab", "d"}, new String[]{"d", "t"}, false, >=0) = "dcte"
-     *  StringUtils.replaceEach("abcde", new String[]{"ab", "d"}, new String[]{"d", "t"}, true, >=2) = "tcte"
-     *  StringUtils.replaceEach("abcde", new String[]{"ab", "d"}, new String[]{"d", "ab"}, *, *) = IllegalStateException
-     * </pre>
-     *
-     * @param text
-     *            text to search and replace in, no-op if null
-     * @param searchList
-     *            the Strings to search for, no-op if null
-     * @param replacementList
-     *            the Strings to replace them with, no-op if null
-     * @param repeat if true, then replace repeatedly
-     *       until there are no more possible replacements or timeToLive < 0
-     * @param timeToLive
-     *            if less than 0 then there is a circular reference and endless
-     *            loop
-     * @return the text with any replacements processed, {@code null} if
-     *         null String input
-     * @throws IllegalStateException
-     *             if the search is repeating and there is an endless loop due
-     *             to outputs of one being inputs to another
-     * @throws IllegalArgumentException
-     *             if the lengths of the arrays are not the same (null is ok,
-     *             and/or size 0)
-     * @since 2.4
-     */
-    private static String replaceEach(
-            final String text, final String[] searchList, final String[] replacementList, final boolean repeat, final int timeToLive) {
-
-        // mchyzer Performance note: This creates very few new objects (one major goal)
-        // let me know if there are performance requests, we can create a harness to measure
-
-        if (text == null || text.isEmpty() || searchList == null ||
-                searchList.length == 0 || replacementList == null || replacementList.length == 0) {
-            return text;
-        }
-
-        // if recursing, this shouldn't be less than 0
-        if (timeToLive < 0) {
-            throw new IllegalStateException("Aborting to protect against StackOverflowError - " +
-                                            "output of one loop is the input of another");
-        }
-
-        final int searchLength = searchList.length;
-        final int replacementLength = replacementList.length;
-
-        // make sure lengths are ok, these need to be equal
-        if (searchLength != replacementLength) {
-            throw new IllegalArgumentException("Search and Replace array lengths don't match: "
-                + searchLength
-                + " vs "
-                + replacementLength);
-        }
-
-        // keep track of which still have matches
-        final boolean[] noMoreMatchesForReplIndex = new boolean[searchLength];
-
-        // index on index that the match was found
-        int textIndex = -1;
-        int replaceIndex = -1;
-        int tempIndex = -1;
-
-        // index of replace array that will replace the search string found
-        // NOTE: logic duplicated below START
-        for (int i = 0; i < searchLength; i++) {
-            if (noMoreMatchesForReplIndex[i] || searchList[i] == null ||
-                    searchList[i].isEmpty() || replacementList[i] == null) {
-                continue;
-            }
-            tempIndex = text.indexOf(searchList[i]);
-
-            // see if we need to keep searching for this
-            if (tempIndex == -1) {
-                noMoreMatchesForReplIndex[i] = true;
-            } else {
-                if (textIndex == -1 || tempIndex < textIndex) {
-                    textIndex = tempIndex;
-                    replaceIndex = i;
-                }
-            }
-        }
-        // NOTE: logic mostly below END
-
-        // no search strings found, we are done
-        if (textIndex == -1) {
-            return text;
-        }
-
-        int start = 0;
-
-        // get a good guess on the size of the result buffer so it doesn't have to double if it goes over a bit
-        int increase = 0;
-
-        // count the replacement text elements that are larger than their corresponding text being replaced
-        for (int i = 0; i < searchList.length; i++) {
-            if (searchList[i] == null || replacementList[i] == null) {
-                continue;
-            }
-            final int greater = replacementList[i].length() - searchList[i].length();
-            if (greater > 0) {
-                increase += 3 * greater; // assume 3 matches
-            }
-        }
-        // have upper-bound at 20% increase, then let Java take over
-        increase = Math.min(increase, text.length() / 5);
-
-        final StringBuilder buf = new StringBuilder(text.length() + increase);
-
-        while (textIndex != -1) {
-
-            for (int i = start; i < textIndex; i++) {
-                buf.append(text.charAt(i));
-            }
-            buf.append(replacementList[replaceIndex]);
-
-            start = textIndex + searchList[replaceIndex].length();
-
-            textIndex = -1;
-            replaceIndex = -1;
-            tempIndex = -1;
-            // find the next earliest match
-            // NOTE: logic mostly duplicated above START
-            for (int i = 0; i < searchLength; i++) {
-                if (noMoreMatchesForReplIndex[i] || searchList[i] == null ||
-                        searchList[i].isEmpty() || replacementList[i] == null) {
-                    continue;
-                }
-                tempIndex = text.indexOf(searchList[i], start);
-
-                // see if we need to keep searching for this
-                if (tempIndex == -1) {
-                    noMoreMatchesForReplIndex[i] = true;
-                } else {
-                    if (textIndex == -1 || tempIndex < textIndex) {
-                        textIndex = tempIndex;
-                        replaceIndex = i;
-                    }
-                }
-            }
-            // NOTE: logic duplicated above END
-
-        }
-        final int textLength = text.length();
-        for (int i = start; i < textLength; i++) {
-            buf.append(text.charAt(i));
-        }
-        final String result = buf.toString();
-        if (!repeat) {
-            return result;
-        }
-
-        return replaceEach(result, searchList, replacementList, repeat, timeToLive - 1);
-    }
-
-    // Replace, character based
-    //-----------------------------------------------------------------------
-    /**
-     * <p>Replaces all occurrences of a character in a String with another.
-     * This is a null-safe version of {@link String#replace(char, char)}.</p>
-     *
-     * <p>A {@code null} string input returns {@code null}.
-     * An empty ("") string input returns an empty string.</p>
-     *
-     * <pre>
-     * StringUtils.replaceChars(null, *, *)        = null
-     * StringUtils.replaceChars("", *, *)          = ""
-     * StringUtils.replaceChars("abcba", 'b', 'y') = "aycya"
-     * StringUtils.replaceChars("abcba", 'z', 'y') = "abcba"
-     * </pre>
-     *
-     * @param str  String to replace characters in, may be null
-     * @param searchChar  the character to search for, may be null
-     * @param replaceChar  the character to replace, may be null
-     * @return modified String, {@code null} if null string input
-     * @since 2.0
-     */
-    public static String replaceChars(final String str, final char searchChar, final char replaceChar) {
-        if (str == null) {
-            return null;
-        }
-        return str.replace(searchChar, replaceChar);
-    }
-
-    /**
-     * <p>Replaces multiple characters in a String in one go.
-     * This method can also be used to delete characters.</p>
-     *
-     * <p>For example:<br>
-     * <code>replaceChars(&quot;hello&quot;, &quot;ho&quot;, &quot;jy&quot;) = jelly</code>.</p>
-     *
-     * <p>A {@code null} string input returns {@code null}.
-     * An empty ("") string input returns an empty string.
-     * A null or empty set of search characters returns the input string.</p>
-     *
-     * <p>The length of the search characters should normally equal the length
-     * of the replace characters.
-     * If the search characters is longer, then the extra search characters
-     * are deleted.
-     * If the search characters is shorter, then the extra replace characters
-     * are ignored.</p>
-     *
-     * <pre>
-     * StringUtils.replaceChars(null, *, *)           = null
-     * StringUtils.replaceChars("", *, *)             = ""
-     * StringUtils.replaceChars("abc", null, *)       = "abc"
-     * StringUtils.replaceChars("abc", "", *)         = "abc"
-     * StringUtils.replaceChars("abc", "b", null)     = "ac"
-     * StringUtils.replaceChars("abc", "b", "")       = "ac"
-     * StringUtils.replaceChars("abcba", "bc", "yz")  = "ayzya"
-     * StringUtils.replaceChars("abcba", "bc", "y")   = "ayya"
-     * StringUtils.replaceChars("abcba", "bc", "yzx") = "ayzya"
-     * </pre>
-     *
-     * @param str  String to replace characters in, may be null
-     * @param searchChars  a set of characters to search for, may be null
-     * @param replaceChars  a set of characters to replace, may be null
-     * @return modified String, {@code null} if null string input
-     * @since 2.0
-     */
-    public static String replaceChars(final String str, final String searchChars, String replaceChars) {
-        if (isEmpty(str) || isEmpty(searchChars)) {
-            return str;
-        }
-        if (replaceChars == null) {
-            replaceChars = EMPTY;
-        }
-        boolean modified = false;
-        final int replaceCharsLength = replaceChars.length();
-        final int strLength = str.length();
-        final StringBuilder buf = new StringBuilder(strLength);
-        for (int i = 0; i < strLength; i++) {
-            final char ch = str.charAt(i);
-            final int index = searchChars.indexOf(ch);
-            if (index >= 0) {
-                modified = true;
-                if (index < replaceCharsLength) {
-                    buf.append(replaceChars.charAt(index));
-                }
-            } else {
-                buf.append(ch);
-            }
-        }
-        if (modified) {
-            return buf.toString();
-        }
-        return str;
-    }
-
-    // Overlay
-    //-----------------------------------------------------------------------
-    /**
-     * <p>Overlays part of a String with another String.</p>
-     *
-     * <p>A {@code null} string input returns {@code null}.
-     * A negative index is treated as zero.
-     * An index greater than the string length is treated as the string length.
-     * The start index is always the smaller of the two indices.</p>
-     *
-     * <pre>
-     * StringUtils.overlay(null, *, *, *)            = null
-     * StringUtils.overlay("", "abc", 0, 0)          = "abc"
-     * StringUtils.overlay("abcdef", null, 2, 4)     = "abef"
-     * StringUtils.overlay("abcdef", "", 2, 4)       = "abef"
-     * StringUtils.overlay("abcdef", "", 4, 2)       = "abef"
-     * StringUtils.overlay("abcdef", "zzzz", 2, 4)   = "abzzzzef"
-     * StringUtils.overlay("abcdef", "zzzz", 4, 2)   = "abzzzzef"
-     * StringUtils.overlay("abcdef", "zzzz", -1, 4)  = "zzzzef"
-     * StringUtils.overlay("abcdef", "zzzz", 2, 8)   = "abzzzz"
-     * StringUtils.overlay("abcdef", "zzzz", -2, -3) = "zzzzabcdef"
-     * StringUtils.overlay("abcdef", "zzzz", 8, 10)  = "abcdefzzzz"
-     * </pre>
-     *
-     * @param str  the String to do overlaying in, may be null
-     * @param overlay  the String to overlay, may be null
-     * @param start  the position to start overlaying at
-     * @param end  the position to stop overlaying before
-     * @return overlayed String, {@code null} if null String input
-     * @since 2.0
-     */
-    public static String overlay(final String str, String overlay, int start, int end) {
-        if (str == null) {
-            return null;
-        }
-        if (overlay == null) {
-            overlay = EMPTY;
-        }
-        final int len = str.length();
-        if (start < 0) {
-            start = 0;
-        }
-        if (start > len) {
-            start = len;
-        }
-        if (end < 0) {
-            end = 0;
-        }
-        if (end > len) {
-            end = len;
-        }
-        if (start > end) {
-            final int temp = start;
-            start = end;
-            end = temp;
-        }
-        return new StringBuilder(len + start - end + overlay.length() + 1)
-            .append(str.substring(0, start))
-            .append(overlay)
-            .append(str.substring(end))
-            .toString();
-    }
-
-    // Chomping
-    //-----------------------------------------------------------------------
-    /**
-     * <p>Removes one newline from end of a String if it's there,
-     * otherwise leave it alone.  A newline is &quot;{@code \n}&quot;,
-     * &quot;{@code \r}&quot;, or &quot;{@code \r\n}&quot;.</p>
-     *
-     * <p>NOTE: This method changed in 2.0.
-     * It now more closely matches Perl chomp.</p>
-     *
-     * <pre>
-     * StringUtils.chomp(null)          = null
-     * StringUtils.chomp("")            = ""
-     * StringUtils.chomp("abc \r")      = "abc "
-     * StringUtils.chomp("abc\n")       = "abc"
-     * StringUtils.chomp("abc\r\n")     = "abc"
-     * StringUtils.chomp("abc\r\n\r\n") = "abc\r\n"
-     * StringUtils.chomp("abc\n\r")     = "abc\n"
-     * StringUtils.chomp("abc\n\rabc")  = "abc\n\rabc"
-     * StringUtils.chomp("\r")          = ""
-     * StringUtils.chomp("\n")          = ""
-     * StringUtils.chomp("\r\n")        = ""
-     * </pre>
-     *
-     * @param str  the String to chomp a newline from, may be null
-     * @return String without newline, {@code null} if null String input
-     */
-    public static String chomp(final String str) {
-        if (isEmpty(str)) {
-            return str;
-        }
-
-        if (str.length() == 1) {
-            final char ch = str.charAt(0);
-            if (ch == CharUtils.CR || ch == CharUtils.LF) {
-                return EMPTY;
-            }
-            return str;
-        }
-
-        int lastIdx = str.length() - 1;
-        final char last = str.charAt(lastIdx);
-
-        if (last == CharUtils.LF) {
-            if (str.charAt(lastIdx - 1) == CharUtils.CR) {
-                lastIdx--;
-            }
-        } else if (last != CharUtils.CR) {
-            lastIdx++;
-        }
-        return str.substring(0, lastIdx);
-    }
-
-    /**
-     * <p>Removes {@code separator} from the end of
-     * {@code str} if it's there, otherwise leave it alone.</p>
-     *
-     * <p>NOTE: This method changed in version 2.0.
-     * It now more closely matches Perl chomp.
-     * For the previous behavior, use {@link #substringBeforeLast(String, String)}.
-     * This method uses {@link String#endsWith(String)}.</p>
-     *
-     * <pre>
-     * StringUtils.chomp(null, *)         = null
-     * StringUtils.chomp("", *)           = ""
-     * StringUtils.chomp("foobar", "bar") = "foo"
-     * StringUtils.chomp("foobar", "baz") = "foobar"
-     * StringUtils.chomp("foo", "foo")    = ""
-     * StringUtils.chomp("foo ", "foo")   = "foo "
-     * StringUtils.chomp(" foo", "foo")   = " "
-     * StringUtils.chomp("foo", "foooo")  = "foo"
-     * StringUtils.chomp("foo", "")       = "foo"
-     * StringUtils.chomp("foo", null)     = "foo"
-     * </pre>
-     *
-     * @param str  the String to chomp from, may be null
-     * @param separator  separator String, may be null
-     * @return String without trailing separator, {@code null} if null String input
-     * @deprecated This feature will be removed in Lang 4.0, use {@link StringUtils#removeEnd(String, String)} instead
-     */
-    @Deprecated
-    public static String chomp(final String str, final String separator) {
-        return removeEnd(str,separator);
-    }
-
-    // Chopping
-    //-----------------------------------------------------------------------
-    /**
-     * <p>Remove the last character from a String.</p>
-     *
-     * <p>If the String ends in {@code \r\n}, then remove both
-     * of them.</p>
-     *
-     * <pre>
-     * StringUtils.chop(null)          = null
-     * StringUtils.chop("")            = ""
-     * StringUtils.chop("abc \r")      = "abc "
-     * StringUtils.chop("abc\n")       = "abc"
-     * StringUtils.chop("abc\r\n")     = "abc"
-     * StringUtils.chop("abc")         = "ab"
-     * StringUtils.chop("abc\nabc")    = "abc\nab"
-     * StringUtils.chop("a")           = ""
-     * StringUtils.chop("\r")          = ""
-     * StringUtils.chop("\n")          = ""
-     * StringUtils.chop("\r\n")        = ""
-     * </pre>
-     *
-     * @param str  the String to chop last character from, may be null
-     * @return String without last character, {@code null} if null String input
-     */
-    public static String chop(final String str) {
-        if (str == null) {
-            return null;
-        }
-        final int strLen = str.length();
-        if (strLen < 2) {
-            return EMPTY;
-        }
-        final int lastIdx = strLen - 1;
-        final String ret = str.substring(0, lastIdx);
-        final char last = str.charAt(lastIdx);
-        if (last == CharUtils.LF && ret.charAt(lastIdx - 1) == CharUtils.CR) {
-            return ret.substring(0, lastIdx - 1);
-        }
-        return ret;
-    }
-
-    // Conversion
-    //-----------------------------------------------------------------------
-
-    // Padding
-    //-----------------------------------------------------------------------
-    /**
-     * <p>Repeat a String {@code repeat} times to form a
-     * new String.</p>
-     *
-     * <pre>
-     * StringUtils.repeat(null, 2) = null
-     * StringUtils.repeat("", 0)   = ""
-     * StringUtils.repeat("", 2)   = ""
-     * StringUtils.repeat("a", 3)  = "aaa"
-     * StringUtils.repeat("ab", 2) = "abab"
-     * StringUtils.repeat("a", -2) = ""
-     * </pre>
-     *
-     * @param str  the String to repeat, may be null
-     * @param repeat  number of times to repeat str, negative treated as zero
-     * @return a new String consisting of the original String repeated,
-     *  {@code null} if null String input
-     */
-    public static String repeat(final String str, final int repeat) {
-        // Performance tuned for 2.0 (JDK1.4)
-
-        if (str == null) {
-            return null;
-        }
-        if (repeat <= 0) {
-            return EMPTY;
-        }
-        final int inputLength = str.length();
-        if (repeat == 1 || inputLength == 0) {
-            return str;
-        }
-        if (inputLength == 1 && repeat <= PAD_LIMIT) {
-            return repeat(str.charAt(0), repeat);
-        }
-
-        final int outputLength = inputLength * repeat;
-        switch (inputLength) {
-            case 1 :
-                return repeat(str.charAt(0), repeat);
-            case 2 :
-                final char ch0 = str.charAt(0);
-                final char ch1 = str.charAt(1);
-                final char[] output2 = new char[outputLength];
-                for (int i = repeat * 2 - 2; i >= 0; i--, i--) {
-                    output2[i] = ch0;
-                    output2[i + 1] = ch1;
-                }
-                return new String(output2);
-            default :
-                final StringBuilder buf = new StringBuilder(outputLength);
-                for (int i = 0; i < repeat; i++) {
-                    buf.append(str);
-                }
-                return buf.toString();
-        }
-    }
-
-    /**
-     * <p>Repeat a String {@code repeat} times to form a
-     * new String, with a String separator injected each time. </p>
-     *
-     * <pre>
-     * StringUtils.repeat(null, null, 2) = null
-     * StringUtils.repeat(null, "x", 2)  = null
-     * StringUtils.repeat("", null, 0)   = ""
-     * StringUtils.repeat("", "", 2)     = ""
-     * StringUtils.repeat("", "x", 3)    = "xxx"
-     * StringUtils.repeat("?", ", ", 3)  = "?, ?, ?"
-     * </pre>
-     *
-     * @param str        the String to repeat, may be null
-     * @param separator  the String to inject, may be null
-     * @param repeat     number of times to repeat str, negative treated as zero
-     * @return a new String consisting of the original String repeated,
-     *  {@code null} if null String input
-     * @since 2.5
-     */
-    public static String repeat(final String str, final String separator, final int repeat) {
-        if(str == null || separator == null) {
-            return repeat(str, repeat);
-        }
-        // given that repeat(String, int) is quite optimized, better to rely on it than try and splice this into it
-        final String result = repeat(str + separator, repeat);
-        return removeEnd(result, separator);
-    }
-
-    /**
-     * <p>Returns padding using the specified delimiter repeated
-     * to a given length.</p>
-     *
-     * <pre>
-     * StringUtils.repeat('e', 0)  = ""
-     * StringUtils.repeat('e', 3)  = "eee"
-     * StringUtils.repeat('e', -2) = ""
-     * </pre>
-     *
-     * <p>Note: this method doesn't not support padding with
-     * <a href="http://www.unicode.org/glossary/#supplementary_character">Unicode Supplementary Characters</a>
-     * as they require a pair of {@code char}s to be represented.
-     * If you are needing to support full I18N of your applications
-     * consider using {@link #repeat(String, int)} instead.
-     * </p>
-     *
-     * @param ch  character to repeat
-     * @param repeat  number of times to repeat char, negative treated as zero
-     * @return String with repeated character
-     * @see #repeat(String, int)
-     */
-    public static String repeat(final char ch, final int repeat) {
-        final char[] buf = new char[repeat];
-        for (int i = repeat - 1; i >= 0; i--) {
-            buf[i] = ch;
-        }
-        return new String(buf);
-    }
-
-    /**
-     * <p>Right pad a String with spaces (' ').</p>
-     *
-     * <p>The String is padded to the size of {@code size}.</p>
-     *
-     * <pre>
-     * StringUtils.rightPad(null, *)   = null
-     * StringUtils.rightPad("", 3)     = "   "
-     * StringUtils.rightPad("bat", 3)  = "bat"
-     * StringUtils.rightPad("bat", 5)  = "bat  "
-     * StringUtils.rightPad("bat", 1)  = "bat"
-     * StringUtils.rightPad("bat", -1) = "bat"
-     * </pre>
-     *
-     * @param str  the String to pad out, may be null
-     * @param size  the size to pad to
-     * @return right padded String or original String if no padding is necessary,
-     *  {@code null} if null String input
-     */
-    public static String rightPad(final String str, final int size) {
-        return rightPad(str, size, ' ');
-    }
-
-    /**
-     * <p>Right pad a String with a specified character.</p>
-     *
-     * <p>The String is padded to the size of {@code size}.</p>
-     *
-     * <pre>
-     * StringUtils.rightPad(null, *, *)     = null
-     * StringUtils.rightPad("", 3, 'z')     = "zzz"
-     * StringUtils.rightPad("bat", 3, 'z')  = "bat"
-     * StringUtils.rightPad("bat", 5, 'z')  = "batzz"
-     * StringUtils.rightPad("bat", 1, 'z')  = "bat"
-     * StringUtils.rightPad("bat", -1, 'z') = "bat"
-     * </pre>
-     *
-     * @param str  the String to pad out, may be null
-     * @param size  the size to pad to
-     * @param padChar  the character to pad with
-     * @return right padded String or original String if no padding is necessary,
-     *  {@code null} if null String input
-     * @since 2.0
-     */
-    public static String rightPad(final String str, final int size, final char padChar) {
-        if (str == null) {
-            return null;
-        }
-        final int pads = size - str.length();
-        if (pads <= 0) {
-            return str; // returns original String when possible
-        }
-        if (pads > PAD_LIMIT) {
-            return rightPad(str, size, String.valueOf(padChar));
-        }
-        return str.concat(repeat(padChar, pads));
-    }
-
-    /**
-     * <p>Right pad a String with a specified String.</p>
-     *
-     * <p>The String is padded to the size of {@code size}.</p>
-     *
-     * <pre>
-     * StringUtils.rightPad(null, *, *)      = null
-     * StringUtils.rightPad("", 3, "z")      = "zzz"
-     * StringUtils.rightPad("bat", 3, "yz")  = "bat"
-     * StringUtils.rightPad("bat", 5, "yz")  = "batyz"
-     * StringUtils.rightPad("bat", 8, "yz")  = "batyzyzy"
-     * StringUtils.rightPad("bat", 1, "yz")  = "bat"
-     * StringUtils.rightPad("bat", -1, "yz") = "bat"
-     * StringUtils.rightPad("bat", 5, null)  = "bat  "
-     * StringUtils.rightPad("bat", 5, "")    = "bat  "
-     * </pre>
-     *
-     * @param str  the String to pad out, may be null
-     * @param size  the size to pad to
-     * @param padStr  the String to pad with, null or empty treated as single space
-     * @return right padded String or original String if no padding is necessary,
-     *  {@code null} if null String input
-     */
-    public static String rightPad(final String str, final int size, String padStr) {
-        if (str == null) {
-            return null;
-        }
-        if (isEmpty(padStr)) {
-            padStr = SPACE;
-        }
-        final int padLen = padStr.length();
-        final int strLen = str.length();
-        final int pads = size - strLen;
-        if (pads <= 0) {
-            return str; // returns original String when possible
-        }
-        if (padLen == 1 && pads <= PAD_LIMIT) {
-            return rightPad(str, size, padStr.charAt(0));
-        }
-
-        if (pads == padLen) {
-            return str.concat(padStr);
-        } else if (pads < padLen) {
-            return str.concat(padStr.substring(0, pads));
-        } else {
-            final char[] padding = new char[pads];
-            final char[] padChars = padStr.toCharArray();
-            for (int i = 0; i < pads; i++) {
-                padding[i] = padChars[i % padLen];
-            }
-            return str.concat(new String(padding));
-        }
-    }
-
-    /**
-     * <p>Left pad a String with spaces (' ').</p>
-     *
-     * <p>The String is padded to the size of {@code size}.</p>
-     *
-     * <pre>
-     * StringUtils.leftPad(null, *)   = null
-     * StringUtils.leftPad("", 3)     = "   "
-     * StringUtils.leftPad("bat", 3)  = "bat"
-     * StringUtils.leftPad("bat", 5)  = "  bat"
-     * StringUtils.leftPad("bat", 1)  = "bat"
-     * StringUtils.leftPad("bat", -1) = "bat"
-     * </pre>
-     *
-     * @param str  the String to pad out, may be null
-     * @param size  the size to pad to
-     * @return left padded String or original String if no padding is necessary,
-     *  {@code null} if null String input
-     */
-    public static String leftPad(final String str, final int size) {
-        return leftPad(str, size, ' ');
-    }
-
-    /**
-     * <p>Left pad a String with a specified character.</p>
-     *
-     * <p>Pad to a size of {@code size}.</p>
-     *
-     * <pre>
-     * StringUtils.leftPad(null, *, *)     = null
-     * StringUtils.leftPad("", 3, 'z')     = "zzz"
-     * StringUtils.leftPad("bat", 3, 'z')  = "bat"
-     * StringUtils.leftPad("bat", 5, 'z')  = "zzbat"
-     * StringUtils.leftPad("bat", 1, 'z')  = "bat"
-     * StringUtils.leftPad("bat", -1, 'z') = "bat"
-     * </pre>
-     *
-     * @param str  the String to pad out, may be null
-     * @param size  the size to pad to
-     * @param padChar  the character to pad with
-     * @return left padded String or original String if no padding is necessary,
-     *  {@code null} if null String input
-     * @since 2.0
-     */
-    public static String leftPad(final String str, final int size, final char padChar) {
-        if (str == null) {
-            return null;
-        }
-        final int pads = size - str.length();
-        if (pads <= 0) {
-            return str; // returns original String when possible
-        }
-        if (pads > PAD_LIMIT) {
-            return leftPad(str, size, String.valueOf(padChar));
-        }
-        return repeat(padChar, pads).concat(str);
-    }
-
-    /**
-     * <p>Left pad a String with a specified String.</p>
-     *
-     * <p>Pad to a size of {@code size}.</p>
-     *
-     * <pre>
-     * StringUtils.leftPad(null, *, *)      = null
-     * StringUtils.leftPad("", 3, "z")      = "zzz"
-     * StringUtils.leftPad("bat", 3, "yz")  = "bat"
-     * StringUtils.leftPad("bat", 5, "yz")  = "yzbat"
-     * StringUtils.leftPad("bat", 8, "yz")  = "yzyzybat"
-     * StringUtils.leftPad("bat", 1, "yz")  = "bat"
-     * StringUtils.leftPad("bat", -1, "yz") = "bat"
-     * StringUtils.leftPad("bat", 5, null)  = "  bat"
-     * StringUtils.leftPad("bat", 5, "")    = "  bat"
-     * </pre>
-     *
-     * @param str  the String to pad out, may be null
-     * @param size  the size to pad to
-     * @param padStr  the String to pad with, null or empty treated as single space
-     * @return left padded String or original String if no padding is necessary,
-     *  {@code null} if null String input
-     */
-    public static String leftPad(final String str, final int size, String padStr) {
-        if (str == null) {
-            return null;
-        }
-        if (isEmpty(padStr)) {
-            padStr = SPACE;
-        }
-        final int padLen = padStr.length();
-        final int strLen = str.length();
-        final int pads = size - strLen;
-        if (pads <= 0) {
-            return str; // returns original String when possible
-        }
-        if (padLen == 1 && pads <= PAD_LIMIT) {
-            return leftPad(str, size, padStr.charAt(0));
-        }
-
-        if (pads == padLen) {
-            return padStr.concat(str);
-        } else if (pads < padLen) {
-            return padStr.substring(0, pads).concat(str);
-        } else {
-            final char[] padding = new char[pads];
-            final char[] padChars = padStr.toCharArray();
-            for (int i = 0; i < pads; i++) {
-                padding[i] = padChars[i % padLen];
-            }
-            return new String(padding).concat(str);
-        }
-    }
-
-    /**
-     * Gets a CharSequence length or {@code 0} if the CharSequence is
-     * {@code null}.
-     *
-     * @param cs
-     *            a CharSequence or {@code null}
-     * @return CharSequence length or {@code 0} if the CharSequence is
-     *         {@code null}.
-     * @since 2.4
-     * @since 3.0 Changed signature from length(String) to length(CharSequence)
-     */
-    public static int length(final CharSequence cs) {
-        return cs == null ? 0 : cs.length();
-    }
-
-    // Centering
-    //-----------------------------------------------------------------------
-    /**
-     * <p>Centers a String in a larger String of size {@code size}
-     * using the space character (' ').</p>
-     *
-     * <p>If the size is less than the String length, the String is returned.
-     * A {@code null} String returns {@code null}.
-     * A negative size is treated as zero.</p>
-     *
-     * <p>Equivalent to {@code center(str, size, " ")}.</p>
-     *
-     * <pre>
-     * StringUtils.center(null, *)   = null
-     * StringUtils.center("", 4)     = "    "
-     * StringUtils.center("ab", -1)  = "ab"
-     * StringUtils.center("ab", 4)   = " ab "
-     * StringUtils.center("abcd", 2) = "abcd"
-     * StringUtils.center("a", 4)    = " a  "
-     * </pre>
-     *
-     * @param str  the String to center, may be null
-     * @param size  the int size of new String, negative treated as zero
-     * @return centered String, {@code null} if null String input
-     */
-    public static String center(final String str, final int size) {
-        return center(str, size, ' ');
-    }
-
-    /**
-     * <p>Centers a String in a larger String of size {@code size}.
-     * Uses a supplied character as the value to pad the String with.</p>
-     *
-     * <p>If the size is less than the String length, the String is returned.
-     * A {@code null} String returns {@code null}.
-     * A negative size is treated as zero.</p>
-     *
-     * <pre>
-     * StringUtils.center(null, *, *)     = null
-     * StringUtils.center("", 4, ' ')     = "    "
-     * StringUtils.center("ab", -1, ' ')  = "ab"
-     * StringUtils.center("ab", 4, ' ')   = " ab "
-     * StringUtils.center("abcd", 2, ' ') = "abcd"
-     * StringUtils.center("a", 4, ' ')    = " a  "
-     * StringUtils.center("a", 4, 'y')    = "yayy"
-     * </pre>
-     *
-     * @param str  the String to center, may be null
-     * @param size  the int size of new String, negative treated as zero
-     * @param padChar  the character to pad the new String with
-     * @return centered String, {@code null} if null String input
-     * @since 2.0
-     */
-    public static String center(String str, final int size, final char padChar) {
-        if (str == null || size <= 0) {
-            return str;
-        }
-        final int strLen = str.length();
-        final int pads = size - strLen;
-        if (pads <= 0) {
-            return str;
-        }
-        str = leftPad(str, strLen + pads / 2, padChar);
-        str = rightPad(str, size, padChar);
-        return str;
-    }
-
-    /**
-     * <p>Centers a String in a larger String of size {@code size}.
-     * Uses a supplied String as the value to pad the String with.</p>
-     *
-     * <p>If the size is less than the String length, the String is returned.
-     * A {@code null} String returns {@code null}.
-     * A negative size is treated as zero.</p>
-     *
-     * <pre>
-     * StringUtils.center(null, *, *)     = null
-     * StringUtils.center("", 4, " ")     = "    "
-     * StringUtils.center("ab", -1, " ")  = "ab"
-     * StringUtils.center("ab", 4, " ")   = " ab "
-     * StringUtils.center("abcd", 2, " ") = "abcd"
-     * StringUtils.center("a", 4, " ")    = " a  "
-     * StringUtils.center("a", 4, "yz")   = "yayz"
-     * StringUtils.center("abc", 7, null) = "  abc  "
-     * StringUtils.center("abc", 7, "")   = "  abc  "
-     * </pre>
-     *
-     * @param str  the String to center, may be null
-     * @param size  the int size of new String, negative treated as zero
-     * @param padStr  the String to pad the new String with, must not be null or empty
-     * @return centered String, {@code null} if null String input
-     * @throws IllegalArgumentException if padStr is {@code null} or empty
-     */
-    public static String center(String str, final int size, String padStr) {
-        if (str == null || size <= 0) {
-            return str;
-        }
-        if (isEmpty(padStr)) {
-            padStr = SPACE;
-        }
-        final int strLen = str.length();
-        final int pads = size - strLen;
-        if (pads <= 0) {
-            return str;
-        }
-        str = leftPad(str, strLen + pads / 2, padStr);
-        str = rightPad(str, size, padStr);
-        return str;
-    }
-
-    // Case conversion
-    //-----------------------------------------------------------------------
-    /**
-     * <p>Converts a String to upper case as per {@link String#toUpperCase()}.</p>
-     *
-     * <p>A {@code null} input String returns {@code null}.</p>
-     *
-     * <pre>
-     * StringUtils.upperCase(null)  = null
-     * StringUtils.upperCase("")    = ""
-     * StringUtils.upperCase("aBc") = "ABC"
-     * </pre>
-     *
-     * <p><strong>Note:</strong> As described in the documentation for {@link String#toUpperCase()},
-     * the result of this method is affected by the current locale.
-     * For platform-independent case transformations, the method {@link #lowerCase(String, Locale)}
-     * should be used with a specific locale (e.g. {@link Locale#ENGLISH}).</p>
-     *
-     * @param str  the String to upper case, may be null
-     * @return the upper cased String, {@code null} if null String input
-     */
-    public static String upperCase(final String str) {
-        if (str == null) {
-            return null;
-        }
-        return str.toUpperCase();
-    }
-
-    /**
-     * <p>Converts a String to upper case as per {@link String#toUpperCase(Locale)}.</p>
-     *
-     * <p>A {@code null} input String returns {@code null}.</p>
-     *
-     * <pre>
-     * StringUtils.upperCase(null, Locale.ENGLISH)  = null
-     * StringUtils.upperCase("", Locale.ENGLISH)    = ""
-     * StringUtils.upperCase("aBc", Locale.ENGLISH) = "ABC"
-     * </pre>
-     *
-     * @param str  the String to upper case, may be null
-     * @param locale  the locale that defines the case transformation rules, must not be null
-     * @return the upper cased String, {@code null} if null String input
-     * @since 2.5
-     */
-    public static String upperCase(final String str, final Locale locale) {
-        if (str == null) {
-            return null;
-        }
-        return str.toUpperCase(locale);
-    }
-
-    /**
-     * <p>Converts a String to lower case as per {@link String#toLowerCase()}.</p>
-     *
-     * <p>A {@code null} input String returns {@code null}.</p>
-     *
-     * <pre>
-     * StringUtils.lowerCase(null)  = null
-     * StringUtils.lowerCase("")    = ""
-     * StringUtils.lowerCase("aBc") = "abc"
-     * </pre>
-     *
-     * <p><strong>Note:</strong> As described in the documentation for {@link String#toLowerCase()},
-     * the result of this method is affected by the current locale.
-     * For platform-independent case transformations, the method {@link #lowerCase(String, Locale)}
-     * should be used with a specific locale (e.g. {@link Locale#ENGLISH}).</p>
-     *
-     * @param str  the String to lower case, may be null
-     * @return the lower cased String, {@code null} if null String input
-     */
-    public static String lowerCase(final String str) {
-        if (str == null) {
-            return null;
-        }
-        return str.toLowerCase();
-    }
-
-    /**
-     * <p>Converts a String to lower case as per {@link String#toLowerCase(Locale)}.</p>
-     *
-     * <p>A {@code null} input String returns {@code null}.</p>
-     *
-     * <pre>
-     * StringUtils.lowerCase(null, Locale.ENGLISH)  = null
-     * StringUtils.lowerCase("", Locale.ENGLISH)    = ""
-     * StringUtils.lowerCase("aBc", Locale.ENGLISH) = "abc"
-     * </pre>
-     *
-     * @param str  the String to lower case, may be null
-     * @param locale  the locale that defines the case transformation rules, must not be null
-     * @return the lower cased String, {@code null} if null String input
-     * @since 2.5
-     */
-    public static String lowerCase(final String str, final Locale locale) {
-        if (str == null) {
-            return null;
-        }
-        return str.toLowerCase(locale);
-    }
-
-    /**
-     * <p>Capitalizes a String changing the first letter to title case as
-     * per {@link Character#toTitleCase(char)}. No other letters are changed.</p>
-     *
-     * <p>For a word based algorithm, see {@link org.apache.commons.lang3.text.WordUtils#capitalize(String)}.
-     * A {@code null} input String returns {@code null}.</p>
-     *
-     * <pre>
-     * StringUtils.capitalize(null)  = null
-     * StringUtils.capitalize("")    = ""
-     * StringUtils.capitalize("cat") = "Cat"
-     * StringUtils.capitalize("cAt") = "CAt"
-     * </pre>
-     *
-     * @param str the String to capitalize, may be null
-     * @return the capitalized String, {@code null} if null String input
-     * @see org.apache.commons.lang3.text.WordUtils#capitalize(String)
-     * @see #uncapitalize(String)
-     * @since 2.0
-     */
-    public static String capitalize(final String str) {
-        int strLen;
-        if (str == null || (strLen = str.length()) == 0) {
-            return str;
-        }
-
-        final char firstChar = str.charAt(0);
-        if (Character.isTitleCase(firstChar)) {
-            // already capitalized
-            return str;
-        }
-
-        return new StringBuilder(strLen)
-            .append(Character.toTitleCase(firstChar))
-            .append(str.substring(1))
-            .toString();
-    }
-
-    /**
-     * <p>Uncapitalizes a String changing the first letter to title case as
-     * per {@link Character#toLowerCase(char)}. No other letters are changed.</p>
-     *
-     * <p>For a word based algorithm, see {@link org.apache.commons.lang3.text.WordUtils#uncapitalize(String)}.
-     * A {@code null} input String returns {@code null}.</p>
-     *
-     * <pre>
-     * StringUtils.uncapitalize(null)  = null
-     * StringUtils.uncapitalize("")    = ""
-     * StringUtils.uncapitalize("Cat") = "cat"
-     * StringUtils.uncapitalize("CAT") = "cAT"
-     * </pre>
-     *
-     * @param str the String to uncapitalize, may be null
-     * @return the uncapitalized String, {@code null} if null String input
-     * @see org.apache.commons.lang3.text.WordUtils#uncapitalize(String)
-     * @see #capitalize(String)
-     * @since 2.0
-     */
-    public static String uncapitalize(final String str) {
-        int strLen;
-        if (str == null || (strLen = str.length()) == 0) {
-            return str;
-        }
-
-        final char firstChar = str.charAt(0);
-        if (Character.isLowerCase(firstChar)) {
-            // already uncapitalized
-            return str;
-        }
-
-        return new StringBuilder(strLen)
-            .append(Character.toLowerCase(firstChar))
-            .append(str.substring(1))
-            .toString();
-    }
-
-    /**
-     * <p>Swaps the case of a String changing upper and title case to
-     * lower case, and lower case to upper case.</p>
-     *
-     * <ul>
-     *  <li>Upper case character converts to Lower case</li>
-     *  <li>Title case character converts to Lower case</li>
-     *  <li>Lower case character converts to Upper case</li>
-     * </ul>
-     *
-     * <p>For a word based algorithm, see {@link org.apache.commons.lang3.text.WordUtils#swapCase(String)}.
-     * A {@code null} input String returns {@code null}.</p>
-     *
-     * <pre>
-     * StringUtils.swapCase(null)                 = null
-     * StringUtils.swapCase("")                   = ""
-     * StringUtils.swapCase("The dog has a BONE") = "tHE DOG HAS A bone"
-     * </pre>
-     *
-     * <p>NOTE: This method changed in Lang version 2.0.
-     * It no longer performs a word based algorithm.
-     * If you only use ASCII, you will notice no change.
-     * That functionality is available in org.apache.commons.lang3.text.WordUtils.</p>
-     *
-     * @param str  the String to swap case, may be null
-     * @return the changed String, {@code null} if null String input
-     */
-    public static String swapCase(final String str) {
-        if (StringUtils.isEmpty(str)) {
-            return str;
-        }
-
-        final char[] buffer = str.toCharArray();
-
-        for (int i = 0; i < buffer.length; i++) {
-            final char ch = buffer[i];
-            if (Character.isUpperCase(ch)) {
-                buffer[i] = Character.toLowerCase(ch);
-            } else if (Character.isTitleCase(ch)) {
-                buffer[i] = Character.toLowerCase(ch);
-            } else if (Character.isLowerCase(ch)) {
-                buffer[i] = Character.toUpperCase(ch);
-            }
-        }
-        return new String(buffer);
-    }
-
-    // Count matches
-    //-----------------------------------------------------------------------
-    /**
-     * <p>Counts how many times the substring appears in the larger string.</p>
-     *
-     * <p>A {@code null} or empty ("") String input returns {@code 0}.</p>
-     *
-     * <pre>
-     * StringUtils.countMatches(null, *)       = 0
-     * StringUtils.countMatches("", *)         = 0
-     * StringUtils.countMatches("abba", null)  = 0
-     * StringUtils.countMatches("abba", "")    = 0
-     * StringUtils.countMatches("abba", "a")   = 2
-     * StringUtils.countMatches("abba", "ab")  = 1
-     * StringUtils.countMatches("abba", "xxx") = 0
-     * </pre>
-     *
-     * @param str  the CharSequence to check, may be null
-     * @param sub  the substring to count, may be null
-     * @return the number of occurrences, 0 if either CharSequence is {@code null}
-     * @since 3.0 Changed signature from countMatches(String, String) to countMatches(CharSequence, CharSequence)
-     */
-    public static int countMatches(final CharSequence str, final CharSequence sub) {
-        if (isEmpty(str) || isEmpty(sub)) {
-            return 0;
-        }
-        int count = 0;
-        int idx = 0;
-        while ((idx = CharSequenceUtils.indexOf(str, sub, idx)) != INDEX_NOT_FOUND) {
-            count++;
-            idx += sub.length();
-        }
-        return count;
-    }
-
-    /**
-     * <p>Counts how many times the char appears in the given string.</p>
-     *
-     * <p>A {@code null} or empty ("") String input returns {@code 0}.</p>
-     *
-     * <pre>
-     * StringUtils.countMatches(null, *)       = 0
-     * StringUtils.countMatches("", *)         = 0
-     * StringUtils.countMatches("abba", 0)  = 0
-     * StringUtils.countMatches("abba", 'a')   = 2
-     * StringUtils.countMatches("abba", 'b')  = 2
-     * StringUtils.countMatches("abba", 'x') = 0
-     * </pre>
-     *
-     * @param str  the CharSequence to check, may be null
-     * @param ch  the char to count
-     * @return the number of occurrences, 0 if the CharSequence is {@code null}
-     * @since 3.4
-     */
-    public static int countMatches(final CharSequence str, final char ch) {
-        if (isEmpty(str)) {
-            return 0;
-        }
-        int count = 0;
-        // We could also call str.toCharArray() for faster look ups but that would generate more garbage.
-        for (int i = 0; i < str.length(); i++) {
-            if (ch == str.charAt(i)) {
-                count++;
-            }
-        }
-        return count;
-    }
-
-    // Character Tests
-    //-----------------------------------------------------------------------
-    /**
-     * <p>Checks if the CharSequence contains only Unicode letters.</p>
-     *
-     * <p>{@code null} will return {@code false}.
-     * An empty CharSequence (length()=0) will return {@code false}.</p>
-     *
-     * <pre>
-     * StringUtils.isAlpha(null)   = false
-     * StringUtils.isAlpha("")     = false
-     * StringUtils.isAlpha("  ")   = false
-     * StringUtils.isAlpha("abc")  = true
-     * StringUtils.isAlpha("ab2c") = false
-     * StringUtils.isAlpha("ab-c") = false
-     * </pre>
-     *
-     * @param cs  the CharSequence to check, may be null
-     * @return {@code true} if only contains letters, and is non-null
-     * @since 3.0 Changed signature from isAlpha(String) to isAlpha(CharSequence)
-     * @since 3.0 Changed "" to return false and not true
-     */
-    public static boolean isAlpha(final CharSequence cs) {
-        if (isEmpty(cs)) {
-            return false;
-        }
-        final int sz = cs.length();
-        for (int i = 0; i < sz; i++) {
-            if (Character.isLetter(cs.charAt(i)) == false) {
-                return false;
-            }
-        }
-        return true;
-    }
-
-    /**
-     * <p>Checks if the CharSequence contains only Unicode letters and
-     * space (' ').</p>
-     *
-     * <p>{@code null} will return {@code false}
-     * An empty CharSequence (length()=0) will return {@code true}.</p>
-     *
-     * <pre>
-     * StringUtils.isAlphaSpace(null)   = false
-     * StringUtils.isAlphaSpace("")     = true
-     * StringUtils.isAlphaSpace("  ")   = true
-     * StringUtils.isAlphaSpace("abc")  = true
-     * StringUtils.isAlphaSpace("ab c") = true
-     * StringUtils.isAlphaSpace("ab2c") = false
-     * StringUtils.isAlphaSpace("ab-c") = false
-     * </pre>
-     *
-     * @param cs  the CharSequence to check, may be null
-     * @return {@code true} if only contains letters and space,
-     *  and is non-null
-     * @since 3.0 Changed signature from isAlphaSpace(String) to isAlphaSpace(CharSequence)
-     */
-    public static boolean isAlphaSpace(final CharSequence cs) {
-        if (cs == null) {
-            return false;
-        }
-        final int sz = cs.length();
-        for (int i = 0; i < sz; i++) {
-            if (Character.isLetter(cs.charAt(i)) == false && cs.charAt(i) != ' ') {
-                return false;
-            }
-        }
-        return true;
-    }
-
-    /**
-     * <p>Checks if the CharSequence contains only Unicode letters or digits.</p>
-     *
-     * <p>{@code null} will return {@code false}.
-     * An empty CharSequence (length()=0) will return {@code false}.</p>
-     *
-     * <pre>
-     * StringUtils.isAlphanumeric(null)   = false
-     * StringUtils.isAlphanumeric("")     = false
-     * StringUtils.isAlphanumeric("  ")   = false
-     * StringUtils.isAlphanumeric("abc")  = true
-     * StringUtils.isAlphanumeric("ab c") = false
-     * StringUtils.isAlphanumeric("ab2c") = true
-     * StringUtils.isAlphanumeric("ab-c") = false
-     * </pre>
-     *
-     * @param cs  the CharSequence to check, may be null
-     * @return {@code true} if only contains letters or digits,
-     *  and is non-null
-     * @since 3.0 Changed signature from isAlphanumeric(String) to isAlphanumeric(CharSequence)
-     * @since 3.0 Changed "" to return false and not true
-     */
-    public static boolean isAlphanumeric(final CharSequence cs) {
-        if (isEmpty(cs)) {
-            return false;
-        }
-        final int sz = cs.length();
-        for (int i = 0; i < sz; i++) {
-            if (Character.isLetterOrDigit(cs.charAt(i)) == false) {
-                return false;
-            }
-        }
-        return true;
-    }
-
-    /**
-     * <p>Checks if the CharSequence contains only Unicode letters, digits
-     * or space ({@code ' '}).</p>
-     *
-     * <p>{@code null} will return {@code false}.
-     * An empty CharSequence (length()=0) will return {@code true}.</p>
-     *
-     * <pre>
-     * StringUtils.isAlphanumericSpace(null)   = false
-     * StringUtils.isAlphanumericSpace("")     = true
-     * StringUtils.isAlphanumericSpace("  ")   = true
-     * StringUtils.isAlphanumericSpace("abc")  = true
-     * StringUtils.isAlphanumericSpace("ab c") = true
-     * StringUtils.isAlphanumericSpace("ab2c") = true
-     * StringUtils.isAlphanumericSpace("ab-c") = false
-     * </pre>
-     *
-     * @param cs  the CharSequence to check, may be null
-     * @return {@code true} if only contains letters, digits or space,
-     *  and is non-null
-     * @since 3.0 Changed signature from isAlphanumericSpace(String) to isAlphanumericSpace(CharSequence)
-     */
-    public static boolean isAlphanumericSpace(final CharSequence cs) {
-        if (cs == null) {
-            return false;
-        }
-        final int sz = cs.length();
-        for (int i = 0; i < sz; i++) {
-            if (Character.isLetterOrDigit(cs.charAt(i)) == false && cs.charAt(i) != ' ') {
-                return false;
-            }
-        }
-        return true;
-    }
-
-    /**
-     * <p>Checks if the CharSequence contains only ASCII printable characters.</p>
-     *
-     * <p>{@code null} will return {@code false}.
-     * An empty CharSequence (length()=0) will return {@code true}.</p>
-     *
-     * <pre>
-     * StringUtils.isAsciiPrintable(null)     = false
-     * StringUtils.isAsciiPrintable("")       = true
-     * StringUtils.isAsciiPrintable(" ")      = true
-     * StringUtils.isAsciiPrintable("Ceki")   = true
-     * StringUtils.isAsciiPrintable("ab2c")   = true
-     * StringUtils.isAsciiPrintable("!ab-c~") = true
-     * StringUtils.isAsciiPrintable("\u0020") = true
-     * StringUtils.isAsciiPrintable("\u0021") = true
-     * StringUtils.isAsciiPrintable("\u007e") = true
-     * StringUtils.isAsciiPrintable("\u007f") = false
-     * StringUtils.isAsciiPrintable("Ceki G\u00fclc\u00fc") = false
-     * </pre>
-     *
-     * @param cs the CharSequence to check, may be null
-     * @return {@code true} if every character is in the range
-     *  32 thru 126
-     * @since 2.1
-     * @since 3.0 Changed signature from isAsciiPrintable(String) to isAsciiPrintable(CharSequence)
-     */
-    public static boolean isAsciiPrintable(final CharSequence cs) {
-        if (cs == null) {
-            return false;
-        }
-        final int sz = cs.length();
-        for (int i = 0; i < sz; i++) {
-            if (CharUtils.isAsciiPrintable(cs.charAt(i)) == false) {
-                return false;
-            }
-        }
-        return true;
-    }
-
-    /**
-     * <p>Checks if the CharSequence contains only Unicode digits.
-     * A decimal point is not a Unicode digit and returns false.</p>
-     *
-     * <p>{@code null} will return {@code false}.
-     * An empty CharSequence (length()=0) will return {@code false}.</p>
-     *
-     * <p>Note that the method does not allow for a leading sign, either positive or negative.
-     * Also, if a String passes the numeric test, it may still generate a NumberFormatException
-     * when parsed by Integer.parseInt or Long.parseLong, e.g. if the value is outside the range
-     * for int or long respectively.</p>
-     *
-     * <pre>
-     * StringUtils.isNumeric(null)   = false
-     * StringUtils.isNumeric("")     = false
-     * StringUtils.isNumeric("  ")   = false
-     * StringUtils.isNumeric("123")  = true
-     * StringUtils.isNumeric("\u0967\u0968\u0969")  = true
-     * StringUtils.isNumeric("12 3") = false
-     * StringUtils.isNumeric("ab2c") = false
-     * StringUtils.isNumeric("12-3") = false
-     * StringUtils.isNumeric("12.3") = false
-     * StringUtils.isNumeric("-123") = false
-     * StringUtils.isNumeric("+123") = false
-     * </pre>
-     *
-     * @param cs  the CharSequence to check, may be null
-     * @return {@code true} if only contains digits, and is non-null
-     * @since 3.0 Changed signature from isNumeric(String) to isNumeric(CharSequence)
-     * @since 3.0 Changed "" to return false and not true
-     */
-    public static boolean isNumeric(final CharSequence cs) {
-        if (isEmpty(cs)) {
-            return false;
-        }
-        final int sz = cs.length();
-        for (int i = 0; i < sz; i++) {
-            if (Character.isDigit(cs.charAt(i)) == false) {
-                return false;
-            }
-        }
-        return true;
-    }
-
-    /**
-     * <p>Checks if the CharSequence contains only Unicode digits or space
-     * ({@code ' '}).
-     * A decimal point is not a Unicode digit and returns false.</p>
-     *
-     * <p>{@code null} will return {@code false}.
-     * An empty CharSequence (length()=0) will return {@code true}.</p>
-     *
-     * <pre>
-     * StringUtils.isNumericSpace(null)   = false
-     * StringUtils.isNumericSpace("")     = true
-     * StringUtils.isNumericSpace("  ")   = true
-     * StringUtils.isNumericSpace("123")  = true
-     * StringUtils.isNumericSpace("12 3") = true
-     * StringUtils.isNumeric("\u0967\u0968\u0969")  = true
-     * StringUtils.isNumeric("\u0967\u0968 \u0969")  = true
-     * StringUtils.isNumericSpace("ab2c") = false
-     * StringUtils.isNumericSpace("12-3") = false
-     * StringUtils.isNumericSpace("12.3") = false
-     * </pre>
-     *
-     * @param cs  the CharSequence to check, may be null
-     * @return {@code true} if only contains digits or space,
-     *  and is non-null
-     * @since 3.0 Changed signature from isNumericSpace(String) to isNumericSpace(CharSequence)
-     */
-    public static boolean isNumericSpace(final CharSequence cs) {
-        if (cs == null) {
-            return false;
-        }
-        final int sz = cs.length();
-        for (int i = 0; i < sz; i++) {
-            if (Character.isDigit(cs.charAt(i)) == false && cs.charAt(i) != ' ') {
-                return false;
-            }
-        }
-        return true;
-    }
-
-    /**
-     * <p>Checks if the CharSequence contains only whitespace.</p>
-     *
-     * <p>{@code null} will return {@code false}.
-     * An empty CharSequence (length()=0) will return {@code true}.</p>
-     *
-     * <pre>
-     * StringUtils.isWhitespace(null)   = false
-     * StringUtils.isWhitespace("")     = true
-     * StringUtils.isWhitespace("  ")   = true
-     * StringUtils.isWhitespace("abc")  = false
-     * StringUtils.isWhitespace("ab2c") = false
-     * StringUtils.isWhitespace("ab-c") = false
-     * </pre>
-     *
-     * @param cs  the CharSequence to check, may be null
-     * @return {@code true} if only contains whitespace, and is non-null
-     * @since 2.0
-     * @since 3.0 Changed signature from isWhitespace(String) to isWhitespace(CharSequence)
-     */
-    public static boolean isWhitespace(final CharSequence cs) {
-        if (cs == null) {
-            return false;
-        }
-        final int sz = cs.length();
-        for (int i = 0; i < sz; i++) {
-            if (Character.isWhitespace(cs.charAt(i)) == false) {
-                return false;
-            }
-        }
-        return true;
-    }
-
-    /**
-     * <p>Checks if the CharSequence contains only lowercase characters.</p>
-     *
-     * <p>{@code null} will return {@code false}.
-     * An empty CharSequence (length()=0) will return {@code false}.</p>
-     *
-     * <pre>
-     * StringUtils.isAllLowerCase(null)   = false
-     * StringUtils.isAllLowerCase("")     = false
-     * StringUtils.isAllLowerCase("  ")   = false
-     * StringUtils.isAllLowerCase("abc")  = true
-     * StringUtils.isAllLowerCase("abC")  = false
-     * StringUtils.isAllLowerCase("ab c") = false
-     * StringUtils.isAllLowerCase("ab1c") = false
-     * StringUtils.isAllLowerCase("ab/c") = false
-     * </pre>
-     *
-     * @param cs  the CharSequence to check, may be null
-     * @return {@code true} if only contains lowercase characters, and is non-null
-     * @since 2.5
-     * @since 3.0 Changed signature from isAllLowerCase(String) to isAllLowerCase(CharSequence)
-     */
-    public static boolean isAllLowerCase(final CharSequence cs) {
-        if (cs == null || isEmpty(cs)) {
-            return false;
-        }
-        final int sz = cs.length();
-        for (int i = 0; i < sz; i++) {
-            if (Character.isLowerCase(cs.charAt(i)) == false) {
-                return false;
-            }
-        }
-        return true;
-    }
-
-    /**
-     * <p>Checks if the CharSequence contains only uppercase characters.</p>
-     *
-     * <p>{@code null} will return {@code false}.
-     * An empty String (length()=0) will return {@code false}.</p>
-     *
-     * <pre>
-     * StringUtils.isAllUpperCase(null)   = false
-     * StringUtils.isAllUpperCase("")     = false
-     * StringUtils.isAllUpperCase("  ")   = false
-     * StringUtils.isAllUpperCase("ABC")  = true
-     * StringUtils.isAllUpperCase("aBC")  = false
-     * StringUtils.isAllUpperCase("A C")  = false
-     * StringUtils.isAllUpperCase("A1C")  = false
-     * StringUtils.isAllUpperCase("A/C")  = false
-     * </pre>
-     *
-     * @param cs the CharSequence to check, may be null
-     * @return {@code true} if only contains uppercase characters, and is non-null
-     * @since 2.5
-     * @since 3.0 Changed signature from isAllUpperCase(String) to isAllUpperCase(CharSequence)
-     */
-    public static boolean isAllUpperCase(final CharSequence cs) {
-        if (cs == null || isEmpty(cs)) {
-            return false;
-        }
-        final int sz = cs.length();
-        for (int i = 0; i < sz; i++) {
-            if (Character.isUpperCase(cs.charAt(i)) == false) {
-                return false;
-            }
-        }
-        return true;
-    }
-
-    // Defaults
-    //-----------------------------------------------------------------------
-    /**
-     * <p>Returns either the passed in String,
-     * or if the String is {@code null}, an empty String ("").</p>
-     *
-     * <pre>
-     * StringUtils.defaultString(null)  = ""
-     * StringUtils.defaultString("")    = ""
-     * StringUtils.defaultString("bat") = "bat"
-     * </pre>
-     *
-     * @see ObjectUtils#toString(Object)
-     * @see String#valueOf(Object)
-     * @param str  the String to check, may be null
-     * @return the passed in String, or the empty String if it
-     *  was {@code null}
-     */
-    public static String defaultString(final String str) {
-        return str == null ? EMPTY : str;
-    }
-
-    /**
-     * <p>Returns either the passed in String, or if the String is
-     * {@code null}, the value of {@code defaultStr}.</p>
-     *
-     * <pre>
-     * StringUtils.defaultString(null, "NULL")  = "NULL"
-     * StringUtils.defaultString("", "NULL")    = ""
-     * StringUtils.defaultString("bat", "NULL") = "bat"
-     * </pre>
-     *
-     * @see ObjectUtils#toString(Object,String)
-     * @see String#valueOf(Object)
-     * @param str  the String to check, may be null
-     * @param defaultStr  the default String to return
-     *  if the input is {@code null}, may be null
-     * @return the passed in String, or the default if it was {@code null}
-     */
-    public static String defaultString(final String str, final String defaultStr) {
-        return str == null ? defaultStr : str;
-    }
-
-    /**
-     * <p>Returns either the passed in CharSequence, or if the CharSequence is
-     * whitespace, empty ("") or {@code null}, the value of {@code defaultStr}.</p>
-     *
-     * <pre>
-     * StringUtils.defaultIfBlank(null, "NULL")  = "NULL"
-     * StringUtils.defaultIfBlank("", "NULL")    = "NULL"
-     * StringUtils.defaultIfBlank(" ", "NULL")   = "NULL"
-     * StringUtils.defaultIfBlank("bat", "NULL") = "bat"
-     * StringUtils.defaultIfBlank("", null)      = null
-     * </pre>
-     * @param <T> the specific kind of CharSequence
-     * @param str the CharSequence to check, may be null
-     * @param defaultStr  the default CharSequence to return
-     *  if the input is whitespace, empty ("") or {@code null}, may be null
-     * @return the passed in CharSequence, or the default
-     * @see StringUtils#defaultString(String, String)
-     */
-    public static <T extends CharSequence> T defaultIfBlank(final T str, final T defaultStr) {
-        return isBlank(str) ? defaultStr : str;
-    }
-
-    /**
-     * <p>Returns either the passed in CharSequence, or if the CharSequence is
-     * empty or {@code null}, the value of {@code defaultStr}.</p>
-     *
-     * <pre>
-     * StringUtils.defaultIfEmpty(null, "NULL")  = "NULL"
-     * StringUtils.defaultIfEmpty("", "NULL")    = "NULL"
-     * StringUtils.defaultIfEmpty(" ", "NULL")   = " "
-     * StringUtils.defaultIfEmpty("bat", "NULL") = "bat"
-     * StringUtils.defaultIfEmpty("", null)      = null
-     * </pre>
-     * @param <T> the specific kind of CharSequence
-     * @param str  the CharSequence to check, may be null
-     * @param defaultStr  the default CharSequence to return
-     *  if the input is empty ("") or {@code null}, may be null
-     * @return the passed in CharSequence, or the default
-     * @see StringUtils#defaultString(String, String)
-     */
-    public static <T extends CharSequence> T defaultIfEmpty(final T str, final T defaultStr) {
-        return isEmpty(str) ? defaultStr : str;
-    }
-
-    // Reversing
-    //-----------------------------------------------------------------------
-    /**
-     * <p>Reverses a String as per {@link StringBuilder#reverse()}.</p>
-     *
-     * <p>A {@code null} String returns {@code null}.</p>
-     *
-     * <pre>
-     * StringUtils.reverse(null)  = null
-     * StringUtils.reverse("")    = ""
-     * StringUtils.reverse("bat") = "tab"
-     * </pre>
-     *
-     * @param str  the String to reverse, may be null
-     * @return the reversed String, {@code null} if null String input
-     */
-    public static String reverse(final String str) {
-        if (str == null) {
-            return null;
-        }
-        return new StringBuilder(str).reverse().toString();
-    }
-
-    /**
-     * <p>Reverses a String that is delimited by a specific character.</p>
-     *
-     * <p>The Strings between the delimiters are not reversed.
-     * Thus java.lang.String becomes String.lang.java (if the delimiter
-     * is {@code '.'}).</p>
-     *
-     * <pre>
-     * StringUtils.reverseDelimited(null, *)      = null
-     * StringUtils.reverseDelimited("", *)        = ""
-     * StringUtils.reverseDelimited("a.b.c", 'x') = "a.b.c"
-     * StringUtils.reverseDelimited("a.b.c", ".") = "c.b.a"
-     * </pre>
-     *
-     * @param str  the String to reverse, may be null
-     * @param separatorChar  the separator character to use
-     * @return the reversed String, {@code null} if null String input
-     * @since 2.0
-     */
-    public static String reverseDelimited(final String str, final char separatorChar) {
-        if (str == null) {
-            return null;
-        }
-        // could implement manually, but simple way is to reuse other,
-        // probably slower, methods.
-        final String[] strs = split(str, separatorChar);
-        ArrayUtils.reverse(strs);
-        return join(strs, separatorChar);
-    }
-
-    // Abbreviating
-    //-----------------------------------------------------------------------
-    /**
-     * <p>Abbreviates a String using ellipses. This will turn
-     * "Now is the time for all good men" into "Now is the time for..."</p>
-     *
-     * <p>Specifically:</p>
-     * <ul>
-     *   <li>If the number of characters in {@code str} is less than or equal to 
-     *       {@code maxWidth}, return {@code str}.</li>
-     *   <li>Else abbreviate it to {@code (substring(str, 0, max-3) + "...")}.</li>
-     *   <li>If {@code maxWidth} is less than {@code 4}, throw an
-     *       {@code IllegalArgumentException}.</li>
-     *   <li>In no case will it return a String of length greater than
-     *       {@code maxWidth}.</li>
-     * </ul>
-     *
-     * <pre>
-     * StringUtils.abbreviate(null, *)      = null
-     * StringUtils.abbreviate("", 4)        = ""
-     * StringUtils.abbreviate("abcdefg", 6) = "abc..."
-     * StringUtils.abbreviate("abcdefg", 7) = "abcdefg"
-     * StringUtils.abbreviate("abcdefg", 8) = "abcdefg"
-     * StringUtils.abbreviate("abcdefg", 4) = "a..."
-     * StringUtils.abbreviate("abcdefg", 3) = IllegalArgumentException
-     * </pre>
-     *
-     * @param str  the String to check, may be null
-     * @param maxWidth  maximum length of result String, must be at least 4
-     * @return abbreviated String, {@code null} if null String input
-     * @throws IllegalArgumentException if the width is too small
-     * @since 2.0
-     */
-    public static String abbreviate(final String str, final int maxWidth) {
-        return abbreviate(str, 0, maxWidth);
-    }
-
-    /**
-     * <p>Abbreviates a String using ellipses. This will turn
-     * "Now is the time for all good men" into "...is the time for..."</p>
-     *
-     * <p>Works like {@code abbreviate(String, int)}, but allows you to specify
-     * a "left edge" offset.  Note that this left edge is not necessarily going to
-     * be the leftmost character in the result, or the first character following the
-     * ellipses, but it will appear somewhere in the result.
-     *
-     * <p>In no case will it return a String of length greater than
-     * {@code maxWidth}.</p>
-     *
-     * <pre>
-     * StringUtils.abbreviate(null, *, *)                = null
-     * StringUtils.abbreviate("", 0, 4)                  = ""
-     * StringUtils.abbreviate("abcdefghijklmno", -1, 10) = "abcdefg..."
-     * StringUtils.abbreviate("abcdefghijklmno", 0, 10)  = "abcdefg..."
-     * StringUtils.abbreviate("abcdefghijklmno", 1, 10)  = "abcdefg..."
-     * StringUtils.abbreviate("abcdefghijklmno", 4, 10)  = "abcdefg..."
-     * StringUtils.abbreviate("abcdefghijklmno", 5, 10)  = "...fghi..."
-     * StringUtils.abbreviate("abcdefghijklmno", 6, 10)  = "...ghij..."
-     * StringUtils.abbreviate("abcdefghijklmno", 8, 10)  = "...ijklmno"
-     * StringUtils.abbreviate("abcdefghijklmno", 10, 10) = "...ijklmno"
-     * StringUtils.abbreviate("abcdefghijklmno", 12, 10) = "...ijklmno"
-     * StringUtils.abbreviate("abcdefghij", 0, 3)        = IllegalArgumentException
-     * StringUtils.abbreviate("abcdefghij", 5, 6)        = IllegalArgumentException
-     * </pre>
-     *
-     * @param str  the String to check, may be null
-     * @param offset  left edge of source String
-     * @param maxWidth  maximum length of result String, must be at least 4
-     * @return abbreviated String, {@code null} if null String input
-     * @throws IllegalArgumentException if the width is too small
-     * @since 2.0
-     */
-    public static String abbreviate(final String str, int offset, final int maxWidth) {
-        if (str == null) {
-            return null;
-        }
-        if (maxWidth < 4) {
-            throw new IllegalArgumentException("Minimum abbreviation width is 4");
-        }
-        if (str.length() <= maxWidth) {
-            return str;
-        }
-        if (offset > str.length()) {
-            offset = str.length();
-        }
-        if (str.length() - offset < maxWidth - 3) {
-            offset = str.length() - (maxWidth - 3);
-        }
-        final String abrevMarker = "...";
-        if (offset <= 4) {
-            return str.substring(0, maxWidth - 3) + abrevMarker;
-        }
-        if (maxWidth < 7) {
-            throw new IllegalArgumentException("Minimum abbreviation width with offset is 7");
-        }
-        if (offset + maxWidth - 3 < str.length()) {
-            return abrevMarker + abbreviate(str.substring(offset), maxWidth - 3);
-        }
-        return abrevMarker + str.substring(str.length() - (maxWidth - 3));
-    }
-
-    /**
-     * <p>Abbreviates a String to the length passed, replacing the middle characters with the supplied
-     * replacement String.</p>
-     *
-     * <p>This abbreviation only occurs if the following criteria is met:</p>
-     * <ul>
-     * <li>Neither the String for abbreviation nor the replacement String are null or empty </li>
-     * <li>The length to truncate to is less than the length of the supplied String</li>
-     * <li>The length to truncate to is greater than 0</li>
-     * <li>The abbreviated String will have enough room for the length supplied replacement String
-     * and the first and last characters of the supplied String for abbreviation</li>
-     * </ul>
-     * <p>Otherwise, the returned String will be the same as the supplied String for abbreviation.
-     * </p>
-     *
-     * <pre>
-     * StringUtils.abbreviateMiddle(null, null, 0)      = null
-     * StringUtils.abbreviateMiddle("abc", null, 0)      = "abc"
-     * StringUtils.abbreviateMiddle("abc", ".", 0)      = "abc"
-     * StringUtils.abbreviateMiddle("abc", ".", 3)      = "abc"
-     * StringUtils.abbreviateMiddle("abcdef", ".", 4)     = "ab.f"
-     * </pre>
-     *
-     * @param str  the String to abbreviate, may be null
-     * @param middle the String to replace the middle characters with, may be null
-     * @param length the length to abbreviate {@code str} to.
-     * @return the abbreviated String if the above criteria is met, or the original String supplied for abbreviation.
-     * @since 2.5
-     */
-    public static String abbreviateMiddle(final String str, final String middle, final int length) {
-        if (isEmpty(str) || isEmpty(middle)) {
-            return str;
-        }
-
-        if (length >= str.length() || length < middle.length()+2) {
-            return str;
-        }
-
-        final int targetSting = length-middle.length();
-        final int startOffset = targetSting/2+targetSting%2;
-        final int endOffset = str.length()-targetSting/2;
-
-        final StringBuilder builder = new StringBuilder(length);
-        builder.append(str.substring(0,startOffset));
-        builder.append(middle);
-        builder.append(str.substring(endOffset));
-
-        return builder.toString();
-    }
-
-    // Difference
-    //-----------------------------------------------------------------------
-    /**
-     * <p>Compares two Strings, and returns the portion where they differ.
-     * More precisely, return the remainder of the second String,
-     * starting from where it's different from the first. This means that
-     * the difference between "abc" and "ab" is the empty String and not "c". </p>
-     *
-     * <p>For example,
-     * {@code difference("i am a machine", "i am a robot") -> "robot"}.</p>
-     *
-     * <pre>
-     * StringUtils.difference(null, null) = null
-     * StringUtils.difference("", "") = ""
-     * StringUtils.difference("", "abc") = "abc"
-     * StringUtils.difference("abc", "") = ""
-     * StringUtils.difference("abc", "abc") = ""
-     * StringUtils.difference("abc", "ab") = ""
-     * StringUtils.difference("ab", "abxyz") = "xyz"
-     * StringUtils.difference("abcde", "abxyz") = "xyz"
-     * StringUtils.difference("abcde", "xyz") = "xyz"
-     * </pre>
-     *
-     * @param str1  the first String, may be null
-     * @param str2  the second String, may be null
-     * @return the portion of str2 where it differs from str1; returns the
-     * empty String if they are equal
-     * @see #indexOfDifference(CharSequence,CharSequence)
-     * @since 2.0
-     */
-    public static String difference(final String str1, final String str2) {
-        if (str1 == null) {
-            return str2;
-        }
-        if (str2 == null) {
-            return str1;
-        }
-        final int at = indexOfDifference(str1, str2);
-        if (at == INDEX_NOT_FOUND) {
-            return EMPTY;
-        }
-        return str2.substring(at);
-    }
-
-    /**
-     * <p>Compares two CharSequences, and returns the index at which the
-     * CharSequences begin to differ.</p>
-     *
-     * <p>For example,
-     * {@code indexOfDifference("i am a machine", "i am a robot") -> 7}</p>
-     *
-     * <pre>
-     * StringUtils.indexOfDifference(null, null) = -1
-     * StringUtils.indexOfDifference("", "") = -1
-     * StringUtils.indexOfDifference("", "abc") = 0
-     * StringUtils.indexOfDifference("abc", "") = 0
-     * StringUtils.indexOfDifference("abc", "abc") = -1
-     * StringUtils.indexOfDifference("ab", "abxyz") = 2
-     * StringUtils.indexOfDifference("abcde", "abxyz") = 2
-     * StringUtils.indexOfDifference("abcde", "xyz") = 0
-     * </pre>
-     *
-     * @param cs1  the first CharSequence, may be null
-     * @param cs2  the second CharSequence, may be null
-     * @return the index where cs1 and cs2 begin to differ; -1 if they are equal
-     * @since 2.0
-     * @since 3.0 Changed signature from indexOfDifference(String, String) to
-     * indexOfDifference(CharSequence, CharSequence)
-     */
-    public static int indexOfDifference(final CharSequence cs1, final CharSequence cs2) {
-        if (cs1 == cs2) {
-            return INDEX_NOT_FOUND;
-        }
-        if (cs1 == null || cs2 == null) {
-            return 0;
-        }
-        int i;
-        for (i = 0; i < cs1.length() && i < cs2.length(); ++i) {
-            if (cs1.charAt(i) != cs2.charAt(i)) {
-                break;
-            }
-        }
-        if (i < cs2.length() || i < cs1.length()) {
-            return i;
-        }
-        return INDEX_NOT_FOUND;
-    }
-
-    /**
-     * <p>Compares all CharSequences in an array and returns the index at which the
-     * CharSequences begin to differ.</p>
-     *
-     * <p>For example,
-     * <code>indexOfDifference(new String[] {"i am a machine", "i am a robot"}) -&gt; 7</code></p>
-     *
-     * <pre>
-     * StringUtils.indexOfDifference(null) = -1
-     * StringUtils.indexOfDifference(new String[] {}) = -1
-     * StringUtils.indexOfDifference(new String[] {"abc"}) = -1
-     * StringUtils.indexOfDifference(new String[] {null, null}) = -1
-     * StringUtils.indexOfDifference(new String[] {"", ""}) = -1
-     * StringUtils.indexOfDifference(new String[] {"", null}) = 0
-     * StringUtils.indexOfDifference(new String[] {"abc", null, null}) = 0
-     * StringUtils.indexOfDifference(new String[] {null, null, "abc"}) = 0
-     * StringUtils.indexOfDifference(new String[] {"", "abc"}) = 0
-     * StringUtils.indexOfDifference(new String[] {"abc", ""}) = 0
-     * StringUtils.indexOfDifference(new String[] {"abc", "abc"}) = -1
-     * StringUtils.indexOfDifference(new String[] {"abc", "a"}) = 1
-     * StringUtils.indexOfDifference(new String[] {"ab", "abxyz"}) = 2
-     * StringUtils.indexOfDifference(new String[] {"abcde", "abxyz"}) = 2
-     * StringUtils.indexOfDifference(new String[] {"abcde", "xyz"}) = 0
-     * StringUtils.indexOfDifference(new String[] {"xyz", "abcde"}) = 0
-     * StringUtils.indexOfDifference(new String[] {"i am a machine", "i am a robot"}) = 7
-     * </pre>
-     *
-     * @param css  array of CharSequences, entries may be null
-     * @return the index where the strings begin to differ; -1 if they are all equal
-     * @since 2.4
-     * @since 3.0 Changed signature from indexOfDifference(String...) to indexOfDifference(CharSequence...)
-     */
-    public static int indexOfDifference(final CharSequence... css) {
-        if (css == null || css.length <= 1) {
-            return INDEX_NOT_FOUND;
-        }
-        boolean anyStringNull = false;
-        boolean allStringsNull = true;
-        final int arrayLen = css.length;
-        int shortestStrLen = Integer.MAX_VALUE;
-        int longestStrLen = 0;
-
-        // find the min and max string lengths; this avoids checking to make
-        // sure we are not exceeding the length of the string each time through
-        // the bottom loop.
-        for (int i = 0; i < arrayLen; i++) {
-            if (css[i] == null) {
-                anyStringNull = true;
-                shortestStrLen = 0;
-            } else {
-                allStringsNull = false;
-                shortestStrLen = Math.min(css[i].length(), shortestStrLen);
-                longestStrLen = Math.max(css[i].length(), longestStrLen);
-            }
-        }
-
-        // handle lists containing all nulls or all empty strings
-        if (allStringsNull || longestStrLen == 0 && !anyStringNull) {
-            return INDEX_NOT_FOUND;
-        }
-
-        // handle lists containing some nulls or some empty strings
-        if (shortestStrLen == 0) {
-            return 0;
-        }
-
-        // find the position with the first difference across all strings
-        int firstDiff = -1;
-        for (int stringPos = 0; stringPos < shortestStrLen; stringPos++) {
-            final char comparisonChar = css[0].charAt(stringPos);
-            for (int arrayPos = 1; arrayPos < arrayLen; arrayPos++) {
-                if (css[arrayPos].charAt(stringPos) != comparisonChar) {
-                    firstDiff = stringPos;
-                    break;
-                }
-            }
-            if (firstDiff != -1) {
-                break;
-            }
-        }
-
-        if (firstDiff == -1 && shortestStrLen != longestStrLen) {
-            // we compared all of the characters up to the length of the
-            // shortest string and didn't find a match, but the string lengths
-            // vary, so return the length of the shortest string.
-            return shortestStrLen;
-        }
-        return firstDiff;
-    }
-
-    /**
-     * <p>Compares all Strings in an array and returns the initial sequence of
-     * characters that is common to all of them.</p>
-     *
-     * <p>For example,
-     * <code>getCommonPrefix(new String[] {"i am a machine", "i am a robot"}) -&gt; "i am a "</code></p>
-     *
-     * <pre>
-     * StringUtils.getCommonPrefix(null) = ""
-     * StringUtils.getCommonPrefix(new String[] {}) = ""
-     * StringUtils.getCommonPrefix(new String[] {"abc"}) = "abc"
-     * StringUtils.getCommonPrefix(new String[] {null, null}) = ""
-     * StringUtils.getCommonPrefix(new String[] {"", ""}) = ""
-     * StringUtils.getCommonPrefix(new String[] {"", null}) = ""
-     * StringUtils.getCommonPrefix(new String[] {"abc", null, null}) = ""
-     * StringUtils.getCommonPrefix(new String[] {null, null, "abc"}) = ""
-     * StringUtils.getCommonPrefix(new String[] {"", "abc"}) = ""
-     * StringUtils.getCommonPrefix(new String[] {"abc", ""}) = ""
-     * StringUtils.getCommonPrefix(new String[] {"abc", "abc"}) = "abc"
-     * StringUtils.getCommonPrefix(new String[] {"abc", "a"}) = "a"
-     * StringUtils.getCommonPrefix(new String[] {"ab", "abxyz"}) = "ab"
-     * StringUtils.getCommonPrefix(new String[] {"abcde", "abxyz"}) = "ab"
-     * StringUtils.getCommonPrefix(new String[] {"abcde", "xyz"}) = ""
-     * StringUtils.getCommonPrefix(new String[] {"xyz", "abcde"}) = ""
-     * StringUtils.getCommonPrefix(new String[] {"i am a machine", "i am a robot"}) = "i am a "
-     * </pre>
-     *
-     * @param strs  array of String objects, entries may be null
-     * @return the initial sequence of characters that are common to all Strings
-     * in the array; empty String if the array is null, the elements are all null
-     * or if there is no common prefix.
-     * @since 2.4
-     */
-    public static String getCommonPrefix(final String... strs) {
-        if (strs == null || strs.length == 0) {
-            return EMPTY;
-        }
-        final int smallestIndexOfDiff = indexOfDifference(strs);
-        if (smallestIndexOfDiff == INDEX_NOT_FOUND) {
-            // all strings were identical
-            if (strs[0] == null) {
-                return EMPTY;
-            }
-            return strs[0];
-        } else if (smallestIndexOfDiff == 0) {
-            // there were no common initial characters
-            return EMPTY;
-        } else {
-            // we found a common initial character sequence
-            return strs[0].substring(0, smallestIndexOfDiff);
-        }
-    }
-
-    // Misc
-    //-----------------------------------------------------------------------
-    /**
-     * <p>Find the Levenshtein distance between two Strings.</p>
-     *
-     * <p>This is the number of changes needed to change one String into
-     * another, where each change is a single character modification (deletion,
-     * insertion or substitution).</p>
-     *
-     * <p>The previous implementation of the Levenshtein distance algorithm
-     * was from <a href="http://www.merriampark.com/ld.htm">http://www.merriampark.com/ld.htm</a></p>
-     *
-     * <p>Chas Emerick has written an implementation in Java, which avoids an OutOfMemoryError
-     * which can occur when my Java implementation is used with very large strings.<br>
-     * This implementation of the Levenshtein distance algorithm
-     * is from <a href="http://www.merriampark.com/ldjava.htm">http://www.merriampark.com/ldjava.htm</a></p>
-     *
-     * <pre>
-     * StringUtils.getLevenshteinDistance(null, *)             = IllegalArgumentException
-     * StringUtils.getLevenshteinDistance(*, null)             = IllegalArgumentException
-     * StringUtils.getLevenshteinDistance("","")               = 0
-     * StringUtils.getLevenshteinDistance("","a")              = 1
-     * StringUtils.getLevenshteinDistance("aaapppp", "")       = 7
-     * StringUtils.getLevenshteinDistance("frog", "fog")       = 1
-     * StringUtils.getLevenshteinDistance("fly", "ant")        = 3
-     * StringUtils.getLevenshteinDistance("elephant", "hippo") = 7
-     * StringUtils.getLevenshteinDistance("hippo", "elephant") = 7
-     * StringUtils.getLevenshteinDistance("hippo", "zzzzzzzz") = 8
-     * StringUtils.getLevenshteinDistance("hello", "hallo")    = 1
-     * </pre>
-     *
-     * @param s  the first String, must not be null
-     * @param t  the second String, must not be null
-     * @return result distance
-     * @throws IllegalArgumentException if either String input {@code null}
-     * @since 3.0 Changed signature from getLevenshteinDistance(String, String) to
-     * getLevenshteinDistance(CharSequence, CharSequence)
-     */
-    public static int getLevenshteinDistance(CharSequence s, CharSequence t) {
-        if (s == null || t == null) {
-            throw new IllegalArgumentException("Strings must not be null");
-        }
-
-        /*
-           The difference between this impl. and the previous is that, rather
-           than creating and retaining a matrix of size s.length() + 1 by t.length() + 1,
-           we maintain two single-dimensional arrays of length s.length() + 1.  The first, d,
-           is the 'current working' distance array that maintains the newest distance cost
-           counts as we iterate through the characters of String s.  Each time we increment
-           the index of String t we are comparing, d is copied to p, the second int[].  Doing so
-           allows us to retain the previous cost counts as required by the algorithm (taking
-           the minimum of the cost count to the left, up one, and diagonally up and to the left
-           of the current cost count being calculated).  (Note that the arrays aren't really
-           copied anymore, just switched...this is clearly much better than cloning an array
-           or doing a System.arraycopy() each time  through the outer loop.)
-
-           Effectively, the difference between the two implementations is this one does not
-           cause an out of memory condition when calculating the LD over two very large strings.
-         */
-
-        int n = s.length(); // length of s
-        int m = t.length(); // length of t
-
-        if (n == 0) {
-            return m;
-        } else if (m == 0) {
-            return n;
-        }
-
-        if (n > m) {
-            // swap the input strings to consume less memory
-            final CharSequence tmp = s;
-            s = t;
-            t = tmp;
-            n = m;
-            m = t.length();
-        }
-
-        int p[] = new int[n + 1]; //'previous' cost array, horizontally
-        int d[] = new int[n + 1]; // cost array, horizontally
-        int _d[]; //placeholder to assist in swapping p and d
-
-        // indexes into strings s and t
-        int i; // iterates through s
-        int j; // iterates through t
-
-        char t_j; // jth character of t
-
-        int cost; // cost
-
-        for (i = 0; i <= n; i++) {
-            p[i] = i;
-        }
-
-        for (j = 1; j <= m; j++) {
-            t_j = t.charAt(j - 1);
-            d[0] = j;
-
-            for (i = 1; i <= n; i++) {
-                cost = s.charAt(i - 1) == t_j ? 0 : 1;
-                // minimum of cell to the left+1, to the top+1, diagonally left and up +cost
-                d[i] = Math.min(Math.min(d[i - 1] + 1, p[i] + 1), p[i - 1] + cost);
-            }
-
-            // copy current distance counts to 'previous row' distance counts
-            _d = p;
-            p = d;
-            d = _d;
-        }
-
-        // our last action in the above loop was to switch d and p, so p now
-        // actually has the most recent cost counts
-        return p[n];
-    }
-
-    /**
-     * <p>Find the Levenshtein distance between two Strings if it's less than or equal to a given
-     * threshold.</p>
-     *
-     * <p>This is the number of changes needed to change one String into
-     * another, where each change is a single character modification (deletion,
-     * insertion or substitution).</p>
-     *
-     * <p>This implementation follows from Algorithms on Strings, Trees and Sequences by Dan Gusfield
-     * and Chas Emerick's implementation of the Levenshtein distance algorithm from
-     * <a href="http://www.merriampark.com/ld.htm">http://www.merriampark.com/ld.htm</a></p>
-     *
-     * <pre>
-     * StringUtils.getLevenshteinDistance(null, *, *)             = IllegalArgumentException
-     * StringUtils.getLevenshteinDistance(*, null, *)             = IllegalArgumentException
-     * StringUtils.getLevenshteinDistance(*, *, -1)               = IllegalArgumentException
-     * StringUtils.getLevenshteinDistance("","", 0)               = 0
-     * StringUtils.getLevenshteinDistance("aaapppp", "", 8)       = 7
-     * StringUtils.getLevenshteinDistance("aaapppp", "", 7)       = 7
-     * StringUtils.getLevenshteinDistance("aaapppp", "", 6))      = -1
-     * StringUtils.getLevenshteinDistance("elephant", "hippo", 7) = 7
-     * StringUtils.getLevenshteinDistance("elephant", "hippo", 6) = -1
-     * StringUtils.getLevenshteinDistance("hippo", "elephant", 7) = 7
-     * StringUtils.getLevenshteinDistance("hippo", "elephant", 6) = -1
-     * </pre>
-     *
-     * @param s  the first String, must not be null
-     * @param t  the second String, must not be null
-     * @param threshold the target threshold, must not be negative
-     * @return result distance, or {@code -1} if the distance would be greater than the threshold
-     * @throws IllegalArgumentException if either String input {@code null} or negative threshold
-     */
-    public static int getLevenshteinDistance(CharSequence s, CharSequence t, final int threshold) {
-        if (s == null || t == null) {
-            throw new IllegalArgumentException("Strings must not be null");
-        }
-        if (threshold < 0) {
-            throw new IllegalArgumentException("Threshold must not be negative");
-        }
-
-        /*
-        This implementation only computes the distance if it's less than or equal to the
-        threshold value, returning -1 if it's greater.  The advantage is performance: unbounded
-        distance is O(nm), but a bound of k allows us to reduce it to O(km) time by only
-        computing a diagonal stripe of width 2k + 1 of the cost table.
-        It is also possible to use this to compute the unbounded Levenshtein distance by starting
-        the threshold at 1 and doubling each time until the distance is found; this is O(dm), where
-        d is the distance.
-
-        One subtlety comes from needing to ignore entries on the border of our stripe
-        eg.
-        p[] = |#|#|#|*
-        d[] =  *|#|#|#|
-        We must ignore the entry to the left of the leftmost member
-        We must ignore the entry above the rightmost member
-
-        Another subtlety comes from our stripe running off the matrix if the strings aren't
-        of the same size.  Since string s is always swapped to be the shorter of the two,
-        the stripe will always run off to the upper right instead of the lower left of the matrix.
-
-        As a concrete example, suppose s is of length 5, t is of length 7, and our threshold is 1.
-        In this case we're going to walk a stripe of length 3.  The matrix would look like so:
-
-           1 2 3 4 5
-        1 |#|#| | | |
-        2 |#|#|#| | |
-        3 | |#|#|#| |
-        4 | | |#|#|#|
-        5 | | | |#|#|
-        6 | | | | |#|
-        7 | | | | | |
-
-        Note how the stripe leads off the table as there is no possible way to turn a string of length 5
-        into one of length 7 in edit distance of 1.
-
-        Additionally, this implementation decreases memory usage by using two
-        single-dimensional arrays and swapping them back and forth instead of allocating
-        an entire n by m matrix.  This requires a few minor changes, such as immediately returning
-        when it's detected that the stripe has run off the matrix and initially filling the arrays with
-        large values so that entries we don't compute are ignored.
-
-        See Algorithms on Strings, Trees and Sequences by Dan Gusfield for some discussion.
-         */
-
-        int n = s.length(); // length of s
-        int m = t.length(); // length of t
-
-        // if one string is empty, the edit distance is necessarily the length of the other
-        if (n == 0) {
-            return m <= threshold ? m : -1;
-        } else if (m == 0) {
-            return n <= threshold ? n : -1;
-        }
-
-        if (n > m) {
-            // swap the two strings to consume less memory
-            final CharSequence tmp = s;
-            s = t;
-            t = tmp;
-            n = m;
-            m = t.length();
-        }
-
-        int p[] = new int[n + 1]; // 'previous' cost array, horizontally
-        int d[] = new int[n + 1]; // cost array, horizontally
-        int _d[]; // placeholder to assist in swapping p and d
-
-        // fill in starting table values
-        final int boundary = Math.min(n, threshold) + 1;
-        for (int i = 0; i < boundary; i++) {
-            p[i] = i;
-        }
-        // these fills ensure that the value above the rightmost entry of our
-        // stripe will be ignored in following loop iterations
-        Arrays.fill(p, boundary, p.length, Integer.MAX_VALUE);
-        Arrays.fill(d, Integer.MAX_VALUE);
-
-        // iterates through t
-        for (int j = 1; j <= m; j++) {
-            final char t_j = t.charAt(j - 1); // jth character of t
-            d[0] = j;
-
-            // compute stripe indices, constrain to array size
-            final int min = Math.max(1, j - threshold);
-            final int max = (j > Integer.MAX_VALUE - threshold) ? n : Math.min(n, j + threshold);
-
-            // the stripe may lead off of the table if s and t are of different sizes
-            if (min > max) {
-                return -1;
-            }
-
-            // ignore entry left of leftmost
-            if (min > 1) {
-                d[min - 1] = Integer.MAX_VALUE;
-            }
-
-            // iterates through [min, max] in s
-            for (int i = min; i <= max; i++) {
-                if (s.charAt(i - 1) == t_j) {
-                    // diagonally left and up
-                    d[i] = p[i - 1];
-                } else {
-                    // 1 + minimum of cell to the left, to the top, diagonally left and up
-                    d[i] = 1 + Math.min(Math.min(d[i - 1], p[i]), p[i - 1]);
-                }
-            }
-
-            // copy current distance counts to 'previous row' distance counts
-            _d = p;
-            p = d;
-            d = _d;
-        }
-
-        // if p[n] is greater than the threshold, there's no guarantee on it being the correct
-        // distance
-        if (p[n] <= threshold) {
-            return p[n];
-        }
-        return -1;
-    }
-    
-    /**
-     * <p>Find the Jaro Winkler Distance which indicates the similarity score between two Strings.</p>
-     *
-     * <p>The Jaro measure is the weighted sum of percentage of matched characters from each file and transposed characters. 
-     * Winkler increased this measure for matching initial characters.</p>
-     *
-     * <p>This implementation is based on the Jaro Winkler similarity algorithm
-     * from <a href="http://en.wikipedia.org/wiki/Jaro%E2%80%93Winkler_distance">http://en.wikipedia.org/wiki/Jaro%E2%80%93Winkler_distance</a>.</p>
-     * 
-     * <pre>
-     * StringUtils.getJaroWinklerDistance(null, null)          = IllegalArgumentException
-     * StringUtils.getJaroWinklerDistance("","")               = 0.0
-     * StringUtils.getJaroWinklerDistance("","a")              = 0.0
-     * StringUtils.getJaroWinklerDistance("aaapppp", "")       = 0.0
-     * StringUtils.getJaroWinklerDistance("frog", "fog")       = 0.93
-     * StringUtils.getJaroWinklerDistance("fly", "ant")        = 0.0
-     * StringUtils.getJaroWinklerDistance("elephant", "hippo") = 0.44
-     * StringUtils.getJaroWinklerDistance("hippo", "elephant") = 0.44
-     * StringUtils.getJaroWinklerDistance("hippo", "zzzzzzzz") = 0.0
-     * StringUtils.getJaroWinklerDistance("hello", "hallo")    = 0.88
-     * StringUtils.getJaroWinklerDistance("ABC Corporation", "ABC Corp") = 0.91
-     * StringUtils.getJaroWinklerDistance("D N H Enterprises Inc", "D &amp; H Enterprises, Inc.") = 0.93
-     * StringUtils.getJaroWinklerDistance("My Gym Children's Fitness Center", "My Gym. Childrens Fitness") = 0.94
-     * StringUtils.getJaroWinklerDistance("PENNSYLVANIA", "PENNCISYLVNIA")    = 0.9
-     * </pre>
-     *
-     * @param first the first String, must not be null
-     * @param second the second String, must not be null
-     * @return result distance
-     * @throws IllegalArgumentException if either String input {@code null}
-     * @since 3.3
-     */
-    public static double getJaroWinklerDistance(final CharSequence first, final CharSequence second) {
-        final double DEFAULT_SCALING_FACTOR = 0.1;
-
-        if (first == null || second == null) {
-            throw new IllegalArgumentException("Strings must not be null");
-        }
-
-        final double jaro = score(first,second);
-        final int cl = commonPrefixLength(first, second);
-        final double matchScore = Math.round((jaro + (DEFAULT_SCALING_FACTOR * cl * (1.0 - jaro))) *100.0)/100.0;
-
-        return  matchScore;
-    }
-
-    /**
-     * This method returns the Jaro-Winkler score for string matching.
-     * @param first the first string to be matched
-     * @param second the second string to be machted
-     * @return matching score without scaling factor impact
-     */
-    private static double score(final CharSequence first, final CharSequence second) {
-        String shorter;
-        String longer;
-
-        // Determine which String is longer.
-        if (first.length() > second.length()) {
-            longer = first.toString().toLowerCase();
-            shorter = second.toString().toLowerCase();
-        } else {
-            longer = second.toString().toLowerCase();
-            shorter = first.toString().toLowerCase();
-        }
-
-        // Calculate the half length() distance of the shorter String.
-        final int halflength = (shorter.length() / 2) + 1;
-
-        // Find the set of matching characters between the shorter and longer strings. Note that
-        // the set of matching characters may be different depending on the order of the strings.
-        final String m1 = getSetOfMatchingCharacterWithin(shorter, longer, halflength);
-        final String m2 = getSetOfMatchingCharacterWithin(longer, shorter, halflength);
-
-        // If one or both of the sets of common characters is empty, then
-        // there is no similarity between the two strings.
-        if (m1.length() == 0 || m2.length() == 0) {
-            return 0.0;
-        }
-
-        // If the set of common characters is not the same size, then
-        // there is no similarity between the two strings, either.
-        if (m1.length() != m2.length()) {
-            return 0.0;
-        }
-
-        // Calculate the number of transposition between the two sets
-        // of common characters.
-        final int transpositions = transpositions(m1, m2);
-
-        // Calculate the distance.
-        final double dist =
-                (m1.length() / ((double)shorter.length()) +
-                        m2.length() / ((double)longer.length()) +
-                        (m1.length() - transpositions) / ((double)m1.length())) / 3.0;
-        return dist;
-    }
-
-    /**
-     * <p>Find the Fuzzy Distance which indicates the similarity score between two Strings.</p>
-     *
-     * <p>This string matching algorithm is similar to the algorithms of editors such as Sublime Text,
-     * TextMate, Atom and others. One point is given for every matched character. Subsequent
-     * matches yield two bonus points. A higher score indicates a higher similarity.</p>
-     *
-     * <pre>
-     * StringUtils.getFuzzyDistance(null, null, null)                                    = IllegalArgumentException
-     * StringUtils.getFuzzyDistance("", "", Locale.ENGLISH)                              = 0
-     * StringUtils.getFuzzyDistance("Workshop", "b", Locale.ENGLISH)                     = 0
-     * StringUtils.getFuzzyDistance("Room", "o", Locale.ENGLISH)                         = 1
-     * StringUtils.getFuzzyDistance("Workshop", "w", Locale.ENGLISH)                     = 1
-     * StringUtils.getFuzzyDistance("Workshop", "ws", Locale.ENGLISH)                    = 2
-     * StringUtils.getFuzzyDistance("Workshop", "wo", Locale.ENGLISH)                    = 4
-     * StringUtils.getFuzzyDistance("Apache Software Foundation", "asf", Locale.ENGLISH) = 3
-     * </pre>
-     *
-     * @param term a full term that should be matched against, must not be null
-     * @param query the query that will be matched against a term, must not be null
-     * @param locale This string matching logic is case insensitive. A locale is necessary to normalize
-     *  both Strings to lower case.
-     * @return result score
-     * @throws IllegalArgumentException if either String input {@code null} or Locale input {@code null}
-     * @since 3.4
-     */
-    public static int getFuzzyDistance(final CharSequence term, final CharSequence query, final Locale locale) {
-        if (term == null || query == null) {
-            throw new IllegalArgumentException("Strings must not be null");
-        } else if (locale == null) {
-            throw new IllegalArgumentException("Locale must not be null");
-        }
-
-        // fuzzy logic is case insensitive. We normalize the Strings to lower
-        // case right from the start. Turning characters to lower case
-        // via Character.toLowerCase(char) is unfortunately insufficient
-        // as it does not accept a locale.
-        final String termLowerCase = term.toString().toLowerCase(locale);
-        final String queryLowerCase = query.toString().toLowerCase(locale);
-
-        // the resulting score
-        int score = 0;
-
-        // the position in the term which will be scanned next for potential
-        // query character matches
-        int termIndex = 0;
-
-        // index of the previously matched character in the term
-        int previousMatchingCharacterIndex = Integer.MIN_VALUE;
-
-        for (int queryIndex = 0; queryIndex < queryLowerCase.length(); queryIndex++) {
-            final char queryChar = queryLowerCase.charAt(queryIndex);
-
-            boolean termCharacterMatchFound = false;
-            for (; termIndex < termLowerCase.length() && !termCharacterMatchFound; termIndex++) {
-                final char termChar = termLowerCase.charAt(termIndex);
-
-                if (queryChar == termChar) {
-                    // simple character matches result in one point
-                    score++;
-
-                    // subsequent character matches further improve
-                    // the score.
-                    if (previousMatchingCharacterIndex + 1 == termIndex) {
-                        score += 2;
-                    }
-
-                    previousMatchingCharacterIndex = termIndex;
-
-                    // we can leave the nested loop. Every character in the
-                    // query can match at most one character in the term.
-                    termCharacterMatchFound = true;
-                }
-            }
-        }
-
-        return score;
-    }
-
-    /**
-     * Gets a set of matching characters between two strings.
-     *
-     * <p><Two characters from the first string and the second string are considered matching if the character's
-     * respective positions are no farther than the limit value.</p>
-     *
-     * @param first The first string.
-     * @param second The second string.
-     * @param limit The maximum distance to consider.
-     * @return A string contain the set of common characters.
-     */
-    private static String getSetOfMatchingCharacterWithin(final CharSequence first, final CharSequence second, final int limit) {
-        final StringBuilder common = new StringBuilder();
-        final StringBuilder copy = new StringBuilder(second);
-
-        for (int i = 0; i < first.length(); i++) {
-            final char ch = first.charAt(i);
-            boolean found = false;
-
-            // See if the character is within the limit positions away from the original position of that character.
-            for (int j = Math.max(0, i - limit); !found && j < Math.min(i + limit, second.length()); j++) {
-                if (copy.charAt(j) == ch) {
-                    found = true;
-                    common.append(ch);
-                    copy.setCharAt(j,'*');
-                }
-            }
-        }
-        return common.toString();
-    }
-
-    /**
-     * Calculates the number of transposition between two strings.
-     * @param first The first string.
-     * @param second The second string.
-     * @return The number of transposition between the two strings.
-     */
-    private static int transpositions(final CharSequence first, final CharSequence second) {
-        int transpositions = 0;
-        for (int i = 0; i < first.length(); i++) {
-            if (first.charAt(i) != second.charAt(i)) {
-                transpositions++;
-            }
-        }
-        return transpositions / 2;
-    }
-    
-    /**
-     * Calculates the number of characters from the beginning of the strings that match exactly one-to-one, 
-     * up to a maximum of four (4) characters.
-     * @param first The first string.
-     * @param second The second string.
-     * @return A number between 0 and 4.
-     */
-    private static int commonPrefixLength(final CharSequence first, final CharSequence second) {
-        final int result = getCommonPrefix(first.toString(), second.toString()).length();
-
-        // Limit the result to 4.
-        return result > 4 ? 4 : result;
-    }
-    
-    // startsWith
-    //-----------------------------------------------------------------------
-
-    /**
-     * <p>Check if a CharSequence starts with a specified prefix.</p>
-     *
-     * <p>{@code null}s are handled without exceptions. Two {@code null}
-     * references are considered to be equal. The comparison is case sensitive.</p>
-     *
-     * <pre>
-     * StringUtils.startsWith(null, null)      = true
-     * StringUtils.startsWith(null, "abc")     = false
-     * StringUtils.startsWith("abcdef", null)  = false
-     * StringUtils.startsWith("abcdef", "abc") = true
-     * StringUtils.startsWith("ABCDEF", "abc") = false
-     * </pre>
-     *
-     * @see java.lang.String#startsWith(String)
-     * @param str  the CharSequence to check, may be null
-     * @param prefix the prefix to find, may be null
-     * @return {@code true} if the CharSequence starts with the prefix, case sensitive, or
-     *  both {@code null}
-     * @since 2.4
-     * @since 3.0 Changed signature from startsWith(String, String) to startsWith(CharSequence, CharSequence)
-     */
-    public static boolean startsWith(final CharSequence str, final CharSequence prefix) {
-        return startsWith(str, prefix, false);
-    }
-
-    /**
-     * <p>Case insensitive check if a CharSequence starts with a specified prefix.</p>
-     *
-     * <p>{@code null}s are handled without exceptions. Two {@code null}
-     * references are considered to be equal. The comparison is case insensitive.</p>
-     *
-     * <pre>
-     * StringUtils.startsWithIgnoreCase(null, null)      = true
-     * StringUtils.startsWithIgnoreCase(null, "abc")     = false
-     * StringUtils.startsWithIgnoreCase("abcdef", null)  = false
-     * StringUtils.startsWithIgnoreCase("abcdef", "abc") = true
-     * StringUtils.startsWithIgnoreCase("ABCDEF", "abc") = true
-     * </pre>
-     *
-     * @see java.lang.String#startsWith(String)
-     * @param str  the CharSequence to check, may be null
-     * @param prefix the prefix to find, may be null
-     * @return {@code true} if the CharSequence starts with the prefix, case insensitive, or
-     *  both {@code null}
-     * @since 2.4
-     * @since 3.0 Changed signature from startsWithIgnoreCase(String, String) to startsWithIgnoreCase(CharSequence, CharSequence)
-     */
-    public static boolean startsWithIgnoreCase(final CharSequence str, final CharSequence prefix) {
-        return startsWith(str, prefix, true);
-    }
-
-    /**
-     * <p>Check if a CharSequence starts with a specified prefix (optionally case insensitive).</p>
-     *
-     * @see java.lang.String#startsWith(String)
-     * @param str  the CharSequence to check, may be null
-     * @param prefix the prefix to find, may be null
-     * @param ignoreCase indicates whether the compare should ignore case
-     *  (case insensitive) or not.
-     * @return {@code true} if the CharSequence starts with the prefix or
-     *  both {@code null}
-     */
-    private static boolean startsWith(final CharSequence str, final CharSequence prefix, final boolean ignoreCase) {
-        if (str == null || prefix == null) {
-            return str == null && prefix == null;
-        }
-        if (prefix.length() > str.length()) {
-            return false;
-        }
-        return CharSequenceUtils.regionMatches(str, ignoreCase, 0, prefix, 0, prefix.length());
-    }
-
-    /**
-     * <p>Check if a CharSequence starts with any of an array of specified strings.</p>
-     *
-     * <pre>
-     * StringUtils.startsWithAny(null, null)      = false
-     * StringUtils.startsWithAny(null, new String[] {"abc"})  = false
-     * StringUtils.startsWithAny("abcxyz", null)     = false
-     * StringUtils.startsWithAny("abcxyz", new String[] {""}) = false
-     * StringUtils.startsWithAny("abcxyz", new String[] {"abc"}) = true
-     * StringUtils.startsWithAny("abcxyz", new String[] {null, "xyz", "abc"}) = true
-     * </pre>
-     *
-     * @param string  the CharSequence to check, may be null
-     * @param searchStrings the CharSequences to find, may be null or empty
-     * @return {@code true} if the CharSequence starts with any of the the prefixes, case insensitive, or
-     *  both {@code null}
-     * @since 2.5
-     * @since 3.0 Changed signature from startsWithAny(String, String[]) to startsWithAny(CharSequence, CharSequence...)
-     */
-    public static boolean startsWithAny(final CharSequence string, final CharSequence... searchStrings) {
-        if (isEmpty(string) || ArrayUtils.isEmpty(searchStrings)) {
-            return false;
-        }
-        for (final CharSequence searchString : searchStrings) {
-            if (startsWith(string, searchString)) {
-                return true;
-            }
-        }
-        return false;
-    }
-
-    // endsWith
-    //-----------------------------------------------------------------------
-
-    /**
-     * <p>Check if a CharSequence ends with a specified suffix.</p>
-     *
-     * <p>{@code null}s are handled without exceptions. Two {@code null}
-     * references are considered to be equal. The comparison is case sensitive.</p>
-     *
-     * <pre>
-     * StringUtils.endsWith(null, null)      = true
-     * StringUtils.endsWith(null, "def")     = false
-     * StringUtils.endsWith("abcdef", null)  = false
-     * StringUtils.endsWith("abcdef", "def") = true
-     * StringUtils.endsWith("ABCDEF", "def") = false
-     * StringUtils.endsWith("ABCDEF", "cde") = false
-     * </pre>
-     *
-     * @see java.lang.String#endsWith(String)
-     * @param str  the CharSequence to check, may be null
-     * @param suffix the suffix to find, may be null
-     * @return {@code true} if the CharSequence ends with the suffix, case sensitive, or
-     *  both {@code null}
-     * @since 2.4
-     * @since 3.0 Changed signature from endsWith(String, String) to endsWith(CharSequence, CharSequence)
-     */
-    public static boolean endsWith(final CharSequence str, final CharSequence suffix) {
-        return endsWith(str, suffix, false);
-    }
-
-    /**
-     * <p>Case insensitive check if a CharSequence ends with a specified suffix.</p>
-     *
-     * <p>{@code null}s are handled without exceptions. Two {@code null}
-     * references are considered to be equal. The comparison is case insensitive.</p>
-     *
-     * <pre>
-     * StringUtils.endsWithIgnoreCase(null, null)      = true
-     * StringUtils.endsWithIgnoreCase(null, "def")     = false
-     * StringUtils.endsWithIgnoreCase("abcdef", null)  = false
-     * StringUtils.endsWithIgnoreCase("abcdef", "def") = true
-     * StringUtils.endsWithIgnoreCase("ABCDEF", "def") = true
-     * StringUtils.endsWithIgnoreCase("ABCDEF", "cde") = false
-     * </pre>
-     *
-     * @see java.lang.String#endsWith(String)
-     * @param str  the CharSequence to check, may be null
-     * @param suffix the suffix to find, may be null
-     * @return {@code true} if the CharSequence ends with the suffix, case insensitive, or
-     *  both {@code null}
-     * @since 2.4
-     * @since 3.0 Changed signature from endsWithIgnoreCase(String, String) to endsWithIgnoreCase(CharSequence, CharSequence)
-     */
-    public static boolean endsWithIgnoreCase(final CharSequence str, final CharSequence suffix) {
-        return endsWith(str, suffix, true);
-    }
-
-    /**
-     * <p>Check if a CharSequence ends with a specified suffix (optionally case insensitive).</p>
-     *
-     * @see java.lang.String#endsWith(String)
-     * @param str  the CharSequence to check, may be null
-     * @param suffix the suffix to find, may be null
-     * @param ignoreCase indicates whether the compare should ignore case
-     *  (case insensitive) or not.
-     * @return {@code true} if the CharSequence starts with the prefix or
-     *  both {@code null}
-     */
-    private static boolean endsWith(final CharSequence str, final CharSequence suffix, final boolean ignoreCase) {
-        if (str == null || suffix == null) {
-            return str == null && suffix == null;
-        }
-        if (suffix.length() > str.length()) {
-            return false;
-        }
-        final int strOffset = str.length() - suffix.length();
-        return CharSequenceUtils.regionMatches(str, ignoreCase, strOffset, suffix, 0, suffix.length());
-    }
-
-    /**
-     * <p>
-     * Similar to <a
-     * href="http://www.w3.org/TR/xpath/#function-normalize-space">http://www.w3.org/TR/xpath/#function-normalize
-     * -space</a>
-     * </p>
-     * <p>
-     * The function returns the argument string with whitespace normalized by using
-     * <code>{@link #trim(String)}</code> to remove leading and trailing whitespace
-     * and then replacing sequences of whitespace characters by a single space.
-     * </p>
-     * In XML Whitespace characters are the same as those allowed by the <a
-     * href="http://www.w3.org/TR/REC-xml/#NT-S">S</a> production, which is S ::= (#x20 | #x9 | #xD | #xA)+
-     * <p>
-     * Java's regexp pattern \s defines whitespace as [ \t\n\x0B\f\r]
-     *
-     * <p>For reference:</p>
-     * <ul>
-     * <li>\x0B = vertical tab</li>
-     * <li>\f = #xC = form feed</li>
-     * <li>#x20 = space</li>
-     * <li>#x9 = \t</li>
-     * <li>#xA = \n</li>
-     * <li>#xD = \r</li>
-     * </ul>
-     *
-     * <p>
-     * The difference is that Java's whitespace includes vertical tab and form feed, which this functional will also
-     * normalize. Additionally <code>{@link #trim(String)}</code> removes control characters (char &lt;= 32) from both
-     * ends of this String.
-     * </p>
-     *
-     * @see Pattern
-     * @see #trim(String)
-     * @see <a
-     *      href="http://www.w3.org/TR/xpath/#function-normalize-space">http://www.w3.org/TR/xpath/#function-normalize-space</a>
-     * @param str the source String to normalize whitespaces from, may be null
-     * @return the modified string with whitespace normalized, {@code null} if null String input
-     *
-     * @since 3.0
-     */
-    public static String normalizeSpace(final String str) {
-        // LANG-1020: Improved performance significantly by normalizing manually instead of using regex
-        // See https://github.com/librucha/commons-lang-normalizespaces-benchmark for performance test
-        if (isEmpty(str)) {
-            return str;
-        }
-        final int size = str.length();
-        final char[] newChars = new char[size];
-        int count = 0;
-        int whitespacesCount = 0;
-        boolean startWhitespaces = true;
-        for (int i = 0; i < size; i++) {
-            char actualChar = str.charAt(i);
-            boolean isWhitespace = Character.isWhitespace(actualChar);
-            if (!isWhitespace) {
-                startWhitespaces = false;
-                newChars[count++] = (actualChar == 160 ? 32 : actualChar);
-                whitespacesCount = 0;
-            } else {
-                if (whitespacesCount == 0 && !startWhitespaces) {
-                    newChars[count++] = SPACE.charAt(0);
-                }
-                whitespacesCount++;
-            }
-        }
-        if (startWhitespaces) {
-            return EMPTY;
-        }
-        return new String(newChars, 0, count - (whitespacesCount > 0 ? 1 : 0));
-    }
-
-    /**
-     * <p>Check if a CharSequence ends with any of an array of specified strings.</p>
-     *
-     * <pre>
-     * StringUtils.endsWithAny(null, null)      = false
-     * StringUtils.endsWithAny(null, new String[] {"abc"})  = false
-     * StringUtils.endsWithAny("abcxyz", null)     = false
-     * StringUtils.endsWithAny("abcxyz", new String[] {""}) = true
-     * StringUtils.endsWithAny("abcxyz", new String[] {"xyz"}) = true
-     * StringUtils.endsWithAny("abcxyz", new String[] {null, "xyz", "abc"}) = true
-     * </pre>
-     *
-     * @param string  the CharSequence to check, may be null
-     * @param searchStrings the CharSequences to find, may be null or empty
-     * @return {@code true} if the CharSequence ends with any of the the prefixes, case insensitive, or
-     *  both {@code null}
-     * @since 3.0
-     */
-    public static boolean endsWithAny(final CharSequence string, final CharSequence... searchStrings) {
-        if (isEmpty(string) || ArrayUtils.isEmpty(searchStrings)) {
-            return false;
-        }
-        for (final CharSequence searchString : searchStrings) {
-            if (endsWith(string, searchString)) {
-                return true;
-            }
-        }
-        return false;
-    }
-
-    /**
-     * Appends the suffix to the end of the string if the string does not
-     * already end in the suffix.
-     *
-     * @param str The string.
-     * @param suffix The suffix to append to the end of the string.
-     * @param ignoreCase Indicates whether the compare should ignore case.
-     * @param suffixes Additional suffixes that are valid terminators (optional).
-     *
-     * @return A new String if suffix was appened, the same string otherwise.
-     */
-    private static String appendIfMissing(final String str, final CharSequence suffix, final boolean ignoreCase, final CharSequence... suffixes) {
-        if (str == null || isEmpty(suffix) || endsWith(str, suffix, ignoreCase)) {
-            return str;
-        }
-        if (suffixes != null && suffixes.length > 0) {
-            for (final CharSequence s : suffixes) {
-                if (endsWith(str, s, ignoreCase)) {
-                    return str;
-                }
-            }
-        }
-        return str + suffix.toString();
-    }
-
-    /**
-     * Appends the suffix to the end of the string if the string does not
-     * already end with any the suffixes.
-     *
-     * <pre>
-     * StringUtils.appendIfMissing(null, null) = null
-     * StringUtils.appendIfMissing("abc", null) = "abc"
-     * StringUtils.appendIfMissing("", "xyz") = "xyz"
-     * StringUtils.appendIfMissing("abc", "xyz") = "abcxyz"
-     * StringUtils.appendIfMissing("abcxyz", "xyz") = "abcxyz"
-     * StringUtils.appendIfMissing("abcXYZ", "xyz") = "abcXYZxyz"
-     * </pre>
-     * <p>With additional suffixes,</p>
-     * <pre>
-     * StringUtils.appendIfMissing(null, null, null) = null
-     * StringUtils.appendIfMissing("abc", null, null) = "abc"
-     * StringUtils.appendIfMissing("", "xyz", null) = "xyz"
-     * StringUtils.appendIfMissing("abc", "xyz", new CharSequence[]{null}) = "abcxyz"
-     * StringUtils.appendIfMissing("abc", "xyz", "") = "abc"
-     * StringUtils.appendIfMissing("abc", "xyz", "mno") = "abcxyz"
-     * StringUtils.appendIfMissing("abcxyz", "xyz", "mno") = "abcxyz"
-     * StringUtils.appendIfMissing("abcmno", "xyz", "mno") = "abcmno"
-     * StringUtils.appendIfMissing("abcXYZ", "xyz", "mno") = "abcXYZxyz"
-     * StringUtils.appendIfMissing("abcMNO", "xyz", "mno") = "abcMNOxyz"
-     * </pre>
-     *
-     * @param str The string.
-     * @param suffix The suffix to append to the end of the string.
-     * @param suffixes Additional suffixes that are valid terminators.
-     *
-     * @return A new String if suffix was appened, the same string otherwise.
-     *
-     * @since 3.2
-     */
-    public static String appendIfMissing(final String str, final CharSequence suffix, final CharSequence... suffixes) {
-        return appendIfMissing(str, suffix, false, suffixes);
-    }
-
-    /**
-     * Appends the suffix to the end of the string if the string does not
-     * already end, case insensitive, with any of the suffixes.
-     *
-     * <pre>
-     * StringUtils.appendIfMissingIgnoreCase(null, null) = null
-     * StringUtils.appendIfMissingIgnoreCase("abc", null) = "abc"
-     * StringUtils.appendIfMissingIgnoreCase("", "xyz") = "xyz"
-     * StringUtils.appendIfMissingIgnoreCase("abc", "xyz") = "abcxyz"
-     * StringUtils.appendIfMissingIgnoreCase("abcxyz", "xyz") = "abcxyz"
-     * StringUtils.appendIfMissingIgnoreCase("abcXYZ", "xyz") = "abcXYZ"
-     * </pre>
-     * <p>With additional suffixes,</p>
-     * <pre>
-     * StringUtils.appendIfMissingIgnoreCase(null, null, null) = null
-     * StringUtils.appendIfMissingIgnoreCase("abc", null, null) = "abc"
-     * StringUtils.appendIfMissingIgnoreCase("", "xyz", null) = "xyz"
-     * StringUtils.appendIfMissingIgnoreCase("abc", "xyz", new CharSequence[]{null}) = "abcxyz"
-     * StringUtils.appendIfMissingIgnoreCase("abc", "xyz", "") = "abc"
-     * StringUtils.appendIfMissingIgnoreCase("abc", "xyz", "mno") = "axyz"
-     * StringUtils.appendIfMissingIgnoreCase("abcxyz", "xyz", "mno") = "abcxyz"
-     * StringUtils.appendIfMissingIgnoreCase("abcmno", "xyz", "mno") = "abcmno"
-     * StringUtils.appendIfMissingIgnoreCase("abcXYZ", "xyz", "mno") = "abcXYZ"
-     * StringUtils.appendIfMissingIgnoreCase("abcMNO", "xyz", "mno") = "abcMNO"
-     * </pre>
-     *
-     * @param str The string.
-     * @param suffix The suffix to append to the end of the string.
-     * @param suffixes Additional suffixes that are valid terminators.
-     *
-     * @return A new String if suffix was appened, the same string otherwise.
-     *
-     * @since 3.2
-     */
-    public static String appendIfMissingIgnoreCase(final String str, final CharSequence suffix, final CharSequence... suffixes) {
-        return appendIfMissing(str, suffix, true, suffixes);
-    }
-
-    /**
-     * Prepends the prefix to the start of the string if the string does not
-     * already start with any of the prefixes.
-     *
-     * @param str The string.
-     * @param prefix The prefix to prepend to the start of the string.
-     * @param ignoreCase Indicates whether the compare should ignore case.
-     * @param prefixes Additional prefixes that are valid (optional).
-     *
-     * @return A new String if prefix was prepended, the same string otherwise.
-     */
-    private static String prependIfMissing(final String str, final CharSequence prefix, final boolean ignoreCase, final CharSequence... prefixes) {
-        if (str == null || isEmpty(prefix) || startsWith(str, prefix, ignoreCase)) {
-            return str;
-        }
-        if (prefixes != null && prefixes.length > 0) {
-            for (final CharSequence p : prefixes) {
-                if (startsWith(str, p, ignoreCase)) {
-                    return str;
-                }
-            }
-        }
-        return prefix.toString() + str;
-    }
-
-    /**
-     * Prepends the prefix to the start of the string if the string does not
-     * already start with any of the prefixes.
-     *
-     * <pre>
-     * StringUtils.prependIfMissing(null, null) = null
-     * StringUtils.prependIfMissing("abc", null) = "abc"
-     * StringUtils.prependIfMissing("", "xyz") = "xyz"
-     * StringUtils.prependIfMissing("abc", "xyz") = "xyzabc"
-     * StringUtils.prependIfMissing("xyzabc", "xyz") = "xyzabc"
-     * StringUtils.prependIfMissing("XYZabc", "xyz") = "xyzXYZabc"
-     * </pre>
-     * <p>With additional prefixes,</p>
-     * <pre>
-     * StringUtils.prependIfMissing(null, null, null) = null
-     * StringUtils.prependIfMissing("abc", null, null) = "abc"
-     * StringUtils.prependIfMissing("", "xyz", null) = "xyz"
-     * StringUtils.prependIfMissing("abc", "xyz", new CharSequence[]{null}) = "xyzabc"
-     * StringUtils.prependIfMissing("abc", "xyz", "") = "abc"
-     * StringUtils.prependIfMissing("abc", "xyz", "mno") = "xyzabc"
-     * StringUtils.prependIfMissing("xyzabc", "xyz", "mno") = "xyzabc"
-     * StringUtils.prependIfMissing("mnoabc", "xyz", "mno") = "mnoabc"
-     * StringUtils.prependIfMissing("XYZabc", "xyz", "mno") = "xyzXYZabc"
-     * StringUtils.prependIfMissing("MNOabc", "xyz", "mno") = "xyzMNOabc"
-     * </pre>
-     *
-     * @param str The string.
-     * @param prefix The prefix to prepend to the start of the string.
-     * @param prefixes Additional prefixes that are valid.
-     *
-     * @return A new String if prefix was prepended, the same string otherwise.
-     *
-     * @since 3.2
-     */
-    public static String prependIfMissing(final String str, final CharSequence prefix, final CharSequence... prefixes) {
-        return prependIfMissing(str, prefix, false, prefixes);
-    }
-
-    /**
-     * Prepends the prefix to the start of the string if the string does not
-     * already start, case insensitive, with any of the prefixes.
-     *
-     * <pre>
-     * StringUtils.prependIfMissingIgnoreCase(null, null) = null
-     * StringUtils.prependIfMissingIgnoreCase("abc", null) = "abc"
-     * StringUtils.prependIfMissingIgnoreCase("", "xyz") = "xyz"
-     * StringUtils.prependIfMissingIgnoreCase("abc", "xyz") = "xyzabc"
-     * StringUtils.prependIfMissingIgnoreCase("xyzabc", "xyz") = "xyzabc"
-     * StringUtils.prependIfMissingIgnoreCase("XYZabc", "xyz") = "XYZabc"
-     * </pre>
-     * <p>With additional prefixes,</p>
-     * <pre>
-     * StringUtils.prependIfMissingIgnoreCase(null, null, null) = null
-     * StringUtils.prependIfMissingIgnoreCase("abc", null, null) = "abc"
-     * StringUtils.prependIfMissingIgnoreCase("", "xyz", null) = "xyz"
-     * StringUtils.prependIfMissingIgnoreCase("abc", "xyz", new CharSequence[]{null}) = "xyzabc"
-     * StringUtils.prependIfMissingIgnoreCase("abc", "xyz", "") = "abc"
-     * StringUtils.prependIfMissingIgnoreCase("abc", "xyz", "mno") = "xyzabc"
-     * StringUtils.prependIfMissingIgnoreCase("xyzabc", "xyz", "mno") = "xyzabc"
-     * StringUtils.prependIfMissingIgnoreCase("mnoabc", "xyz", "mno") = "mnoabc"
-     * StringUtils.prependIfMissingIgnoreCase("XYZabc", "xyz", "mno") = "XYZabc"
-     * StringUtils.prependIfMissingIgnoreCase("MNOabc", "xyz", "mno") = "MNOabc"
-     * </pre>
-     *
-     * @param str The string.
-     * @param prefix The prefix to prepend to the start of the string.
-     * @param prefixes Additional prefixes that are valid (optional).
-     *
-     * @return A new String if prefix was prepended, the same string otherwise.
-     *
-     * @since 3.2
-     */
-    public static String prependIfMissingIgnoreCase(final String str, final CharSequence prefix, final CharSequence... prefixes) {
-        return prependIfMissing(str, prefix, true, prefixes);
-    }
-
-    /**
-     * Converts a <code>byte[]</code> to a String using the specified character encoding.
-     *
-     * @param bytes
-     *            the byte array to read from
-     * @param charsetName
-     *            the encoding to use, if null then use the platform default
-     * @return a new String
-     * @throws UnsupportedEncodingException
-     *             If the named charset is not supported
-     * @throws NullPointerException
-     *             if the input is null
-     * @deprecated use {@link StringUtils#toEncodedString(byte[], Charset)} instead of String constants in your code
-     * @since 3.1
-     */
-    @Deprecated
-    public static String toString(final byte[] bytes, final String charsetName) throws UnsupportedEncodingException {
-        return charsetName != null ? new String(bytes, charsetName) : new String(bytes, Charset.defaultCharset());
-    }
-
-    /**
-     * Converts a <code>byte[]</code> to a String using the specified character encoding.
-     * 
-     * @param bytes
-     *            the byte array to read from
-     * @param charset
-     *            the encoding to use, if null then use the platform default
-     * @return a new String
-     * @throws NullPointerException
-     *             if {@code bytes} is null
-     * @since 3.2
-     * @since 3.3 No longer throws {@link UnsupportedEncodingException}.
-     */
-    public static String toEncodedString(final byte[] bytes, final Charset charset) {
-        return new String(bytes, charset != null ? charset : Charset.defaultCharset());
-    }
-
-    /**
-     * <p>
-     * Wraps a string with a char.
-     * </p>
-     * 
-     * <pre>
-     * StringUtils.wrap(null, *)        = null
-     * StringUtils.wrap("", *)          = ""
-     * StringUtils.wrap("ab", '\0')     = "ab"
-     * StringUtils.wrap("ab", 'x')      = "xabx"
-     * StringUtils.wrap("ab", '\'')     = "'ab'"
-     * StringUtils.wrap("\"ab\"", '\"') = "\"\"ab\"\""
-     * </pre>
-     * 
-     * @param str
-     *            the string to be wrapped, may be {@code null}
-     * @param wrapWith
-     *            the char that will wrap {@code str}
-     * @return the wrapped string, or {@code null} if {@code str==null}
-     * @since 3.4
-     */
-    public static String wrap(final String str, final char wrapWith) {
-
-        if (isEmpty(str) || wrapWith == '\0') {
-            return str;
-        }
-
-        return wrapWith + str + wrapWith;
-    }
-
-    /**
-     * <p>
-     * Wraps a String with another String.
-     * </p>
-     * 
-     * <p>
-     * A {@code null} input String returns {@code null}.
-     * </p>
-     * 
-     * <pre>
-     * StringUtils.wrap(null, *)         = null
-     * StringUtils.wrap("", *)           = ""
-     * StringUtils.wrap("ab", null)      = "ab"
-     * StringUtils.wrap("ab", "x")       = "xabx"
-     * StringUtils.wrap("ab", "\"")      = "\"ab\""
-     * StringUtils.wrap("\"ab\"", "\"")  = "\"\"ab\"\""
-     * StringUtils.wrap("ab", "'")       = "'ab'"
-     * StringUtils.wrap("'abcd'", "'")   = "''abcd''"
-     * StringUtils.wrap("\"abcd\"", "'") = "'\"abcd\"'"
-     * StringUtils.wrap("'abcd'", "\"")  = "\"'abcd'\""
-     * </pre>
-     * 
-     * @param str
-     *            the String to be wrapper, may be null
-     * @param wrapWith
-     *            the String that will wrap str
-     * @return wrapped String, {@code null} if null String input
-     * @since 3.4
-     */
-    public static String wrap(final String str, final String wrapWith) {
-
-        if (isEmpty(str) || isEmpty(wrapWith)) {
-            return str;
-        }
-
-        return wrapWith.concat(str).concat(wrapWith);
-    }
-}
diff --git a/lang/src/main/java/org/apache/commons/lang3/SystemUtils.java b/lang/src/main/java/org/apache/commons/lang3/SystemUtils.java
deleted file mode 100644
index c23450b..0000000
--- a/lang/src/main/java/org/apache/commons/lang3/SystemUtils.java
+++ /dev/null
@@ -1,1523 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.commons.lang3;
-
-import java.io.File;
-
-/**
- * <p>
- * Helpers for {@code java.lang.System}.
- * </p>
- * <p>
- * If a system property cannot be read due to security restrictions, the corresponding field in this class will be set
- * to {@code null} and a message will be written to {@code System.err}.
- * </p>
- * <p>
- * #ThreadSafe#
- * </p>
- *
- * @since 1.0
- * @version $Id$
- */
-public class SystemUtils {
-
-    /**
-     * The prefix String for all Windows OS.
-     */
-    private static final String OS_NAME_WINDOWS_PREFIX = "Windows";
-
-    // System property constants
-    // -----------------------------------------------------------------------
-    // These MUST be declared first. Other constants depend on this.
-
-    /**
-     * The System property key for the user home directory.
-     */
-    private static final String USER_HOME_KEY = "user.home";
-
-    /**
-     * The System property key for the user directory.
-     */
-    private static final String USER_DIR_KEY = "user.dir";
-
-    /**
-     * The System property key for the Java IO temporary directory.
-     */
-    private static final String JAVA_IO_TMPDIR_KEY = "java.io.tmpdir";
-
-    /**
-     * The System property key for the Java home directory.
-     */
-    private static final String JAVA_HOME_KEY = "java.home";
-
-    /**
-     * <p>
-     * The {@code awt.toolkit} System Property.
-     * </p>
-     * <p>
-     * Holds a class name, on Windows XP this is {@code sun.awt.windows.WToolkit}.
-     * </p>
-     * <p>
-     * <b>On platforms without a GUI, this value is {@code null}.</b>
-     * </p>
-     * <p>
-     * Defaults to {@code null} if the runtime does not have security access to read this property or the property does
-     * not exist.
-     * </p>
-     * <p>
-     * This value is initialized when the class is loaded. If {@link System#setProperty(String,String)} or
-     * {@link System#setProperties(java.util.Properties)} is called after this class is loaded, the value will be out of
-     * sync with that System property.
-     * </p>
-     *
-     * @since 2.1
-     */
-    public static final String AWT_TOOLKIT = getSystemProperty("awt.toolkit");
-
-    /**
-     * <p>
-     * The {@code file.encoding} System Property.
-     * </p>
-     * <p>
-     * File encoding, such as {@code Cp1252}.
-     * </p>
-     * <p>
-     * Defaults to {@code null} if the runtime does not have security access to read this property or the property does
-     * not exist.
-     * </p>
-     * <p>
-     * This value is initialized when the class is loaded. If {@link System#setProperty(String,String)} or
-     * {@link System#setProperties(java.util.Properties)} is called after this class is loaded, the value will be out of
-     * sync with that System property.
-     * </p>
-     *
-     * @since 2.0
-     * @since Java 1.2
-     */
-    public static final String FILE_ENCODING = getSystemProperty("file.encoding");
-
-    /**
-     * <p>
-     * The {@code file.separator} System Property.
-     * The file separator is:
-     * </p>
-     * <ul>
-     * <li>{@code "/"} on UNIX</li>
-     * <li>{@code "\"} on Windows.</li>
-     * </ul>
-     *
-     * <p>
-     * Defaults to {@code null} if the runtime does not have security access to read this property or the property does
-     * not exist.
-     * </p>
-     * <p>
-     * This value is initialized when the class is loaded. If {@link System#setProperty(String,String)} or
-     * {@link System#setProperties(java.util.Properties)} is called after this class is loaded, the value will be out of
-     * sync with that System property.
-     * </p>
-     *
-     * @since Java 1.1
-     */
-    public static final String FILE_SEPARATOR = getSystemProperty("file.separator");
-
-    /**
-     * <p>
-     * The {@code java.awt.fonts} System Property.
-     * </p>
-     * <p>
-     * Defaults to {@code null} if the runtime does not have security access to read this property or the property does
-     * not exist.
-     * </p>
-     * <p>
-     * This value is initialized when the class is loaded. If {@link System#setProperty(String,String)} or
-     * {@link System#setProperties(java.util.Properties)} is called after this class is loaded, the value will be out of
-     * sync with that System property.
-     * </p>
-     *
-     * @since 2.1
-     */
-    public static final String JAVA_AWT_FONTS = getSystemProperty("java.awt.fonts");
-
-    /**
-     * <p>
-     * The {@code java.awt.graphicsenv} System Property.
-     * </p>
-     * <p>
-     * Defaults to {@code null} if the runtime does not have security access to read this property or the property does
-     * not exist.
-     * </p>
-     * <p>
-     * This value is initialized when the class is loaded. If {@link System#setProperty(String,String)} or
-     * {@link System#setProperties(java.util.Properties)} is called after this class is loaded, the value will be out of
-     * sync with that System property.
-     * </p>
-     *
-     * @since 2.1
-     */
-    public static final String JAVA_AWT_GRAPHICSENV = getSystemProperty("java.awt.graphicsenv");
-
-    /**
-     * <p>
-     * The {@code java.awt.headless} System Property. The value of this property is the String {@code "true"} or
-     * {@code "false"}.
-     * </p>
-     * <p>
-     * Defaults to {@code null} if the runtime does not have security access to read this property or the property does
-     * not exist.
-     * </p>
-     * <p>
-     * This value is initialized when the class is loaded. If {@link System#setProperty(String,String)} or
-     * {@link System#setProperties(java.util.Properties)} is called after this class is loaded, the value will be out of
-     * sync with that System property.
-     * </p>
-     *
-     * @see #isJavaAwtHeadless()
-     * @since 2.1
-     * @since Java 1.4
-     */
-    public static final String JAVA_AWT_HEADLESS = getSystemProperty("java.awt.headless");
-
-    /**
-     * <p>
-     * The {@code java.awt.printerjob} System Property.
-     * </p>
-     * <p>
-     * Defaults to {@code null} if the runtime does not have security access to read this property or the property does
-     * not exist.
-     * </p>
-     * <p>
-     * This value is initialized when the class is loaded. If {@link System#setProperty(String,String)} or
-     * {@link System#setProperties(java.util.Properties)} is called after this class is loaded, the value will be out of
-     * sync with that System property.
-     * </p>
-     *
-     * @since 2.1
-     */
-    public static final String JAVA_AWT_PRINTERJOB = getSystemProperty("java.awt.printerjob");
-
-    /**
-     * <p>
-     * The {@code java.class.path} System Property. Java class path.
-     * </p>
-     * <p>
-     * Defaults to {@code null} if the runtime does not have security access to read this property or the property does
-     * not exist.
-     * </p>
-     * <p>
-     * This value is initialized when the class is loaded. If {@link System#setProperty(String,String)} or
-     * {@link System#setProperties(java.util.Properties)} is called after this class is loaded, the value will be out of
-     * sync with that System property.
-     * </p>
-     *
-     * @since Java 1.1
-     */
-    public static final String JAVA_CLASS_PATH = getSystemProperty("java.class.path");
-
-    /**
-     * <p>
-     * The {@code java.class.version} System Property. Java class format version number.
-     * </p>
-     * <p>
-     * Defaults to {@code null} if the runtime does not have security access to read this property or the property does
-     * not exist.
-     * </p>
-     * <p>
-     * This value is initialized when the class is loaded. If {@link System#setProperty(String,String)} or
-     * {@link System#setProperties(java.util.Properties)} is called after this class is loaded, the value will be out of
-     * sync with that System property.
-     * </p>
-     *
-     * @since Java 1.1
-     */
-    public static final String JAVA_CLASS_VERSION = getSystemProperty("java.class.version");
-
-    /**
-     * <p>
-     * The {@code java.compiler} System Property. Name of JIT compiler to use. First in JDK version 1.2. Not used in Sun
-     * JDKs after 1.2.
-     * </p>
-     * <p>
-     * Defaults to {@code null} if the runtime does not have security access to read this property or the property does
-     * not exist.
-     * </p>
-     * <p>
-     * This value is initialized when the class is loaded. If {@link System#setProperty(String,String)} or
-     * {@link System#setProperties(java.util.Properties)} is called after this class is loaded, the value will be out of
-     * sync with that System property.
-     * </p>
-     *
-     * @since Java 1.2. Not used in Sun versions after 1.2.
-     */
-    public static final String JAVA_COMPILER = getSystemProperty("java.compiler");
-
-    /**
-     * <p>
-     * The {@code java.endorsed.dirs} System Property. Path of endorsed directory or directories.
-     * </p>
-     * <p>
-     * Defaults to {@code null} if the runtime does not have security access to read this property or the property does
-     * not exist.
-     * </p>
-     * <p>
-     * This value is initialized when the class is loaded. If {@link System#setProperty(String,String)} or
-     * {@link System#setProperties(java.util.Properties)} is called after this class is loaded, the value will be out of
-     * sync with that System property.
-     * </p>
-     *
-     * @since Java 1.4
-     */
-    public static final String JAVA_ENDORSED_DIRS = getSystemProperty("java.endorsed.dirs");
-
-    /**
-     * <p>
-     * The {@code java.ext.dirs} System Property. Path of extension directory or directories.
-     * </p>
-     * <p>
-     * Defaults to {@code null} if the runtime does not have security access to read this property or the property does
-     * not exist.
-     * </p>
-     * <p>
-     * This value is initialized when the class is loaded. If {@link System#setProperty(String,String)} or
-     * {@link System#setProperties(java.util.Properties)} is called after this class is loaded, the value will be out of
-     * sync with that System property.
-     * </p>
-     *
-     * @since Java 1.3
-     */
-    public static final String JAVA_EXT_DIRS = getSystemProperty("java.ext.dirs");
-
-    /**
-     * <p>
-     * The {@code java.home} System Property. Java installation directory.
-     * </p>
-     * <p>
-     * Defaults to {@code null} if the runtime does not have security access to read this property or the property does
-     * not exist.
-     * </p>
-     * <p>
-     * This value is initialized when the class is loaded. If {@link System#setProperty(String,String)} or
-     * {@link System#setProperties(java.util.Properties)} is called after this class is loaded, the value will be out of
-     * sync with that System property.
-     * </p>
-     *
-     * @since Java 1.1
-     */
-    public static final String JAVA_HOME = getSystemProperty(JAVA_HOME_KEY);
-
-    /**
-     * <p>
-     * The {@code java.io.tmpdir} System Property. Default temp file path.
-     * </p>
-     * <p>
-     * Defaults to {@code null} if the runtime does not have security access to read this property or the property does
-     * not exist.
-     * </p>
-     * <p>
-     * This value is initialized when the class is loaded. If {@link System#setProperty(String,String)} or
-     * {@link System#setProperties(java.util.Properties)} is called after this class is loaded, the value will be out of
-     * sync with that System property.
-     * </p>
-     *
-     * @since Java 1.2
-     */
-    public static final String JAVA_IO_TMPDIR = getSystemProperty(JAVA_IO_TMPDIR_KEY);
-
-    /**
-     * <p>
-     * The {@code java.library.path} System Property. List of paths to search when loading libraries.
-     * </p>
-     * <p>
-     * Defaults to {@code null} if the runtime does not have security access to read this property or the property does
-     * not exist.
-     * </p>
-     * <p>
-     * This value is initialized when the class is loaded. If {@link System#setProperty(String,String)} or
-     * {@link System#setProperties(java.util.Properties)} is called after this class is loaded, the value will be out of
-     * sync with that System property.
-     * </p>
-     *
-     * @since Java 1.2
-     */
-    public static final String JAVA_LIBRARY_PATH = getSystemProperty("java.library.path");
-
-    /**
-     * <p>
-     * The {@code java.runtime.name} System Property. Java Runtime Environment name.
-     * </p>
-     * <p>
-     * Defaults to {@code null} if the runtime does not have security access to read this property or the property does
-     * not exist.
-     * </p>
-     * <p>
-     * This value is initialized when the class is loaded. If {@link System#setProperty(String,String)} or
-     * {@link System#setProperties(java.util.Properties)} is called after this class is loaded, the value will be out of
-     * sync with that System property.
-     * </p>
-     *
-     * @since 2.0
-     * @since Java 1.3
-     */
-    public static final String JAVA_RUNTIME_NAME = getSystemProperty("java.runtime.name");
-
-    /**
-     * <p>
-     * The {@code java.runtime.version} System Property. Java Runtime Environment version.
-     * </p>
-     * <p>
-     * Defaults to {@code null} if the runtime does not have security access to read this property or the property does
-     * not exist.
-     * </p>
-     * <p>
-     * This value is initialized when the class is loaded. If {@link System#setProperty(String,String)} or
-     * {@link System#setProperties(java.util.Properties)} is called after this class is loaded, the value will be out of
-     * sync with that System property.
-     * </p>
-     *
-     * @since 2.0
-     * @since Java 1.3
-     */
-    public static final String JAVA_RUNTIME_VERSION = getSystemProperty("java.runtime.version");
-
-    /**
-     * <p>
-     * The {@code java.specification.name} System Property. Java Runtime Environment specification name.
-     * </p>
-     * <p>
-     * Defaults to {@code null} if the runtime does not have security access to read this property or the property does
-     * not exist.
-     * </p>
-     * <p>
-     * This value is initialized when the class is loaded. If {@link System#setProperty(String,String)} or
-     * {@link System#setProperties(java.util.Properties)} is called after this class is loaded, the value will be out of
-     * sync with that System property.
-     * </p>
-     *
-     * @since Java 1.2
-     */
-    public static final String JAVA_SPECIFICATION_NAME = getSystemProperty("java.specification.name");
-
-    /**
-     * <p>
-     * The {@code java.specification.vendor} System Property. Java Runtime Environment specification vendor.
-     * </p>
-     * <p>
-     * Defaults to {@code null} if the runtime does not have security access to read this property or the property does
-     * not exist.
-     * </p>
-     * <p>
-     * This value is initialized when the class is loaded. If {@link System#setProperty(String,String)} or
-     * {@link System#setProperties(java.util.Properties)} is called after this class is loaded, the value will be out of
-     * sync with that System property.
-     * </p>
-     *
-     * @since Java 1.2
-     */
-    public static final String JAVA_SPECIFICATION_VENDOR = getSystemProperty("java.specification.vendor");
-
-    /**
-     * <p>
-     * The {@code java.specification.version} System Property. Java Runtime Environment specification version.
-     * </p>
-     * <p>
-     * Defaults to {@code null} if the runtime does not have security access to read this property or the property does
-     * not exist.
-     * </p>
-     * <p>
-     * This value is initialized when the class is loaded. If {@link System#setProperty(String,String)} or
-     * {@link System#setProperties(java.util.Properties)} is called after this class is loaded, the value will be out of
-     * sync with that System property.
-     * </p>
-     *
-     * @since Java 1.3
-     */
-    public static final String JAVA_SPECIFICATION_VERSION = getSystemProperty("java.specification.version");
-    private static final JavaVersion JAVA_SPECIFICATION_VERSION_AS_ENUM = JavaVersion.get(JAVA_SPECIFICATION_VERSION);
-
-    /**
-     * <p>
-     * The {@code java.util.prefs.PreferencesFactory} System Property. A class name.
-     * </p>
-     * <p>
-     * Defaults to {@code null} if the runtime does not have security access to read this property or the property does
-     * not exist.
-     * </p>
-     * <p>
-     * This value is initialized when the class is loaded. If {@link System#setProperty(String,String)} or
-     * {@link System#setProperties(java.util.Properties)} is called after this class is loaded, the value will be out of
-     * sync with that System property.
-     * </p>
-     *
-     * @since 2.1
-     * @since Java 1.4
-     */
-    public static final String JAVA_UTIL_PREFS_PREFERENCES_FACTORY =
-        getSystemProperty("java.util.prefs.PreferencesFactory");
-
-    /**
-     * <p>
-     * The {@code java.vendor} System Property. Java vendor-specific string.
-     * </p>
-     * <p>
-     * Defaults to {@code null} if the runtime does not have security access to read this property or the property does
-     * not exist.
-     * </p>
-     * <p>
-     * This value is initialized when the class is loaded. If {@link System#setProperty(String,String)} or
-     * {@link System#setProperties(java.util.Properties)} is called after this class is loaded, the value will be out of
-     * sync with that System property.
-     * </p>
-     *
-     * @since Java 1.1
-     */
-    public static final String JAVA_VENDOR = getSystemProperty("java.vendor");
-
-    /**
-     * <p>
-     * The {@code java.vendor.url} System Property. Java vendor URL.
-     * </p>
-     * <p>
-     * Defaults to {@code null} if the runtime does not have security access to read this property or the property does
-     * not exist.
-     * </p>
-     * <p>
-     * This value is initialized when the class is loaded. If {@link System#setProperty(String,String)} or
-     * {@link System#setProperties(java.util.Properties)} is called after this class is loaded, the value will be out of
-     * sync with that System property.
-     * </p>
-     *
-     * @since Java 1.1
-     */
-    public static final String JAVA_VENDOR_URL = getSystemProperty("java.vendor.url");
-
-    /**
-     * <p>
-     * The {@code java.version} System Property. Java version number.
-     * </p>
-     * <p>
-     * Defaults to {@code null} if the runtime does not have security access to read this property or the property does
-     * not exist.
-     * </p>
-     * <p>
-     * This value is initialized when the class is loaded. If {@link System#setProperty(String,String)} or
-     * {@link System#setProperties(java.util.Properties)} is called after this class is loaded, the value will be out of
-     * sync with that System property.
-     * </p>
-     *
-     * @since Java 1.1
-     */
-    public static final String JAVA_VERSION = getSystemProperty("java.version");
-
-    /**
-     * <p>
-     * The {@code java.vm.info} System Property. Java Virtual Machine implementation info.
-     * </p>
-     * <p>
-     * Defaults to {@code null} if the runtime does not have security access to read this property or the property does
-     * not exist.
-     * </p>
-     * <p>
-     * This value is initialized when the class is loaded. If {@link System#setProperty(String,String)} or
-     * {@link System#setProperties(java.util.Properties)} is called after this class is loaded, the value will be out of
-     * sync with that System property.
-     * </p>
-     *
-     * @since 2.0
-     * @since Java 1.2
-     */
-    public static final String JAVA_VM_INFO = getSystemProperty("java.vm.info");
-
-    /**
-     * <p>
-     * The {@code java.vm.name} System Property. Java Virtual Machine implementation name.
-     * </p>
-     * <p>
-     * Defaults to {@code null} if the runtime does not have security access to read this property or the property does
-     * not exist.
-     * </p>
-     * <p>
-     * This value is initialized when the class is loaded. If {@link System#setProperty(String,String)} or
-     * {@link System#setProperties(java.util.Properties)} is called after this class is loaded, the value will be out of
-     * sync with that System property.
-     * </p>
-     *
-     * @since Java 1.2
-     */
-    public static final String JAVA_VM_NAME = getSystemProperty("java.vm.name");
-
-    /**
-     * <p>
-     * The {@code java.vm.specification.name} System Property. Java Virtual Machine specification name.
-     * </p>
-     * <p>
-     * Defaults to {@code null} if the runtime does not have security access to read this property or the property does
-     * not exist.
-     * </p>
-     * <p>
-     * This value is initialized when the class is loaded. If {@link System#setProperty(String,String)} or
-     * {@link System#setProperties(java.util.Properties)} is called after this class is loaded, the value will be out of
-     * sync with that System property.
-     * </p>
-     *
-     * @since Java 1.2
-     */
-    public static final String JAVA_VM_SPECIFICATION_NAME = getSystemProperty("java.vm.specification.name");
-
-    /**
-     * <p>
-     * The {@code java.vm.specification.vendor} System Property. Java Virtual Machine specification vendor.
-     * </p>
-     * <p>
-     * Defaults to {@code null} if the runtime does not have security access to read this property or the property does
-     * not exist.
-     * </p>
-     * <p>
-     * This value is initialized when the class is loaded. If {@link System#setProperty(String,String)} or
-     * {@link System#setProperties(java.util.Properties)} is called after this class is loaded, the value will be out of
-     * sync with that System property.
-     * </p>
-     *
-     * @since Java 1.2
-     */
-    public static final String JAVA_VM_SPECIFICATION_VENDOR = getSystemProperty("java.vm.specification.vendor");
-
-    /**
-     * <p>
-     * The {@code java.vm.specification.version} System Property. Java Virtual Machine specification version.
-     * </p>
-     * <p>
-     * Defaults to {@code null} if the runtime does not have security access to read this property or the property does
-     * not exist.
-     * </p>
-     * <p>
-     * This value is initialized when the class is loaded. If {@link System#setProperty(String,String)} or
-     * {@link System#setProperties(java.util.Properties)} is called after this class is loaded, the value will be out of
-     * sync with that System property.
-     * </p>
-     *
-     * @since Java 1.2
-     */
-    public static final String JAVA_VM_SPECIFICATION_VERSION = getSystemProperty("java.vm.specification.version");
-
-    /**
-     * <p>
-     * The {@code java.vm.vendor} System Property. Java Virtual Machine implementation vendor.
-     * </p>
-     * <p>
-     * Defaults to {@code null} if the runtime does not have security access to read this property or the property does
-     * not exist.
-     * </p>
-     * <p>
-     * This value is initialized when the class is loaded. If {@link System#setProperty(String,String)} or
-     * {@link System#setProperties(java.util.Properties)} is called after this class is loaded, the value will be out of
-     * sync with that System property.
-     * </p>
-     *
-     * @since Java 1.2
-     */
-    public static final String JAVA_VM_VENDOR = getSystemProperty("java.vm.vendor");
-
-    /**
-     * <p>
-     * The {@code java.vm.version} System Property. Java Virtual Machine implementation version.
-     * </p>
-     * <p>
-     * Defaults to {@code null} if the runtime does not have security access to read this property or the property does
-     * not exist.
-     * </p>
-     * <p>
-     * This value is initialized when the class is loaded. If {@link System#setProperty(String,String)} or
-     * {@link System#setProperties(java.util.Properties)} is called after this class is loaded, the value will be out of
-     * sync with that System property.
-     * </p>
-     *
-     * @since Java 1.2
-     */
-    public static final String JAVA_VM_VERSION = getSystemProperty("java.vm.version");
-
-    /**
-     * <p>
-     * The {@code line.separator} System Property. Line separator (<code>&quot;\n&quot;</code> on UNIX).
-     * </p>
-     * <p>
-     * Defaults to {@code null} if the runtime does not have security access to read this property or the property does
-     * not exist.
-     * </p>
-     * <p>
-     * This value is initialized when the class is loaded. If {@link System#setProperty(String,String)} or
-     * {@link System#setProperties(java.util.Properties)} is called after this class is loaded, the value will be out of
-     * sync with that System property.
-     * </p>
-     *
-     * @since Java 1.1
-     */
-    public static final String LINE_SEPARATOR = getSystemProperty("line.separator");
-
-    /**
-     * <p>
-     * The {@code os.arch} System Property. Operating system architecture.
-     * </p>
-     * <p>
-     * Defaults to {@code null} if the runtime does not have security access to read this property or the property does
-     * not exist.
-     * </p>
-     * <p>
-     * This value is initialized when the class is loaded. If {@link System#setProperty(String,String)} or
-     * {@link System#setProperties(java.util.Properties)} is called after this class is loaded, the value will be out of
-     * sync with that System property.
-     * </p>
-     *
-     * @since Java 1.1
-     */
-    public static final String OS_ARCH = getSystemProperty("os.arch");
-
-    /**
-     * <p>
-     * The {@code os.name} System Property. Operating system name.
-     * </p>
-     * <p>
-     * Defaults to {@code null} if the runtime does not have security access to read this property or the property does
-     * not exist.
-     * </p>
-     * <p>
-     * This value is initialized when the class is loaded. If {@link System#setProperty(String,String)} or
-     * {@link System#setProperties(java.util.Properties)} is called after this class is loaded, the value will be out of
-     * sync with that System property.
-     * </p>
-     *
-     * @since Java 1.1
-     */
-    public static final String OS_NAME = getSystemProperty("os.name");
-
-    /**
-     * <p>
-     * The {@code os.version} System Property. Operating system version.
-     * </p>
-     * <p>
-     * Defaults to {@code null} if the runtime does not have security access to read this property or the property does
-     * not exist.
-     * </p>
-     * <p>
-     * This value is initialized when the class is loaded. If {@link System#setProperty(String,String)} or
-     * {@link System#setProperties(java.util.Properties)} is called after this class is loaded, the value will be out of
-     * sync with that System property.
-     * </p>
-     *
-     * @since Java 1.1
-     */
-    public static final String OS_VERSION = getSystemProperty("os.version");
-
-    /**
-     * <p>
-     * The {@code path.separator} System Property. Path separator (<code>&quot;:&quot;</code> on UNIX).
-     * </p>
-     * <p>
-     * Defaults to {@code null} if the runtime does not have security access to read this property or the property does
-     * not exist.
-     * </p>
-     * <p>
-     * This value is initialized when the class is loaded. If {@link System#setProperty(String,String)} or
-     * {@link System#setProperties(java.util.Properties)} is called after this class is loaded, the value will be out of
-     * sync with that System property.
-     * </p>
-     *
-     * @since Java 1.1
-     */
-    public static final String PATH_SEPARATOR = getSystemProperty("path.separator");
-
-    /**
-     * <p>
-     * The {@code user.country} or {@code user.region} System Property. User's country code, such as {@code GB}. First
-     * in Java version 1.2 as {@code user.region}. Renamed to {@code user.country} in 1.4
-     * </p>
-     * <p>
-     * Defaults to {@code null} if the runtime does not have security access to read this property or the property does
-     * not exist.
-     * </p>
-     * <p>
-     * This value is initialized when the class is loaded. If {@link System#setProperty(String,String)} or
-     * {@link System#setProperties(java.util.Properties)} is called after this class is loaded, the value will be out of
-     * sync with that System property.
-     * </p>
-     *
-     * @since 2.0
-     * @since Java 1.2
-     */
-    public static final String USER_COUNTRY = getSystemProperty("user.country") == null ?
-            getSystemProperty("user.region") : getSystemProperty("user.country");
-
-    /**
-     * <p>
-     * The {@code user.dir} System Property. User's current working directory.
-     * </p>
-     * <p>
-     * Defaults to {@code null} if the runtime does not have security access to read this property or the property does
-     * not exist.
-     * </p>
-     * <p>
-     * This value is initialized when the class is loaded. If {@link System#setProperty(String,String)} or
-     * {@link System#setProperties(java.util.Properties)} is called after this class is loaded, the value will be out of
-     * sync with that System property.
-     * </p>
-     *
-     * @since Java 1.1
-     */
-    public static final String USER_DIR = getSystemProperty(USER_DIR_KEY);
-
-    /**
-     * <p>
-     * The {@code user.home} System Property. User's home directory.
-     * </p>
-     * <p>
-     * Defaults to {@code null} if the runtime does not have security access to read this property or the property does
-     * not exist.
-     * </p>
-     * <p>
-     * This value is initialized when the class is loaded. If {@link System#setProperty(String,String)} or
-     * {@link System#setProperties(java.util.Properties)} is called after this class is loaded, the value will be out of
-     * sync with that System property.
-     * </p>
-     *
-     * @since Java 1.1
-     */
-    public static final String USER_HOME = getSystemProperty(USER_HOME_KEY);
-
-    /**
-     * <p>
-     * The {@code user.language} System Property. User's language code, such as {@code "en"}.
-     * </p>
-     * <p>
-     * Defaults to {@code null} if the runtime does not have security access to read this property or the property does
-     * not exist.
-     * </p>
-     * <p>
-     * This value is initialized when the class is loaded. If {@link System#setProperty(String,String)} or
-     * {@link System#setProperties(java.util.Properties)} is called after this class is loaded, the value will be out of
-     * sync with that System property.
-     * </p>
-     *
-     * @since 2.0
-     * @since Java 1.2
-     */
-    public static final String USER_LANGUAGE = getSystemProperty("user.language");
-
-    /**
-     * <p>
-     * The {@code user.name} System Property. User's account name.
-     * </p>
-     * <p>
-     * Defaults to {@code null} if the runtime does not have security access to read this property or the property does
-     * not exist.
-     * </p>
-     * <p>
-     * This value is initialized when the class is loaded. If {@link System#setProperty(String,String)} or
-     * {@link System#setProperties(java.util.Properties)} is called after this class is loaded, the value will be out of
-     * sync with that System property.
-     * </p>
-     *
-     * @since Java 1.1
-     */
-    public static final String USER_NAME = getSystemProperty("user.name");
-
-    /**
-     * <p>
-     * The {@code user.timezone} System Property. For example: {@code "America/Los_Angeles"}.
-     * </p>
-     * <p>
-     * Defaults to {@code null} if the runtime does not have security access to read this property or the property does
-     * not exist.
-     * </p>
-     * <p>
-     * This value is initialized when the class is loaded. If {@link System#setProperty(String,String)} or
-     * {@link System#setProperties(java.util.Properties)} is called after this class is loaded, the value will be out of
-     * sync with that System property.
-     * </p>
-     *
-     * @since 2.1
-     */
-    public static final String USER_TIMEZONE = getSystemProperty("user.timezone");
-
-    // Java version checks
-    // -----------------------------------------------------------------------
-    // These MUST be declared after those above as they depend on the
-    // values being set up
-
-    /**
-     * <p>
-     * Is {@code true} if this is Java version 1.1 (also 1.1.x versions).
-     * </p>
-     * <p>
-     * The field will return {@code false} if {@link #JAVA_VERSION} is {@code null}.
-     * </p>
-     */
-    public static final boolean IS_JAVA_1_1 = getJavaVersionMatches("1.1");
-
-    /**
-     * <p>
-     * Is {@code true} if this is Java version 1.2 (also 1.2.x versions).
-     * </p>
-     * <p>
-     * The field will return {@code false} if {@link #JAVA_VERSION} is {@code null}.
-     * </p>
-     */
-    public static final boolean IS_JAVA_1_2 = getJavaVersionMatches("1.2");
-
-    /**
-     * <p>
-     * Is {@code true} if this is Java version 1.3 (also 1.3.x versions).
-     * </p>
-     * <p>
-     * The field will return {@code false} if {@link #JAVA_VERSION} is {@code null}.
-     * </p>
-     */
-    public static final boolean IS_JAVA_1_3 = getJavaVersionMatches("1.3");
-
-    /**
-     * <p>
-     * Is {@code true} if this is Java version 1.4 (also 1.4.x versions).
-     * </p>
-     * <p>
-     * The field will return {@code false} if {@link #JAVA_VERSION} is {@code null}.
-     * </p>
-     */
-    public static final boolean IS_JAVA_1_4 = getJavaVersionMatches("1.4");
-
-    /**
-     * <p>
-     * Is {@code true} if this is Java version 1.5 (also 1.5.x versions).
-     * </p>
-     * <p>
-     * The field will return {@code false} if {@link #JAVA_VERSION} is {@code null}.
-     * </p>
-     */
-    public static final boolean IS_JAVA_1_5 = getJavaVersionMatches("1.5");
-
-    /**
-     * <p>
-     * Is {@code true} if this is Java version 1.6 (also 1.6.x versions).
-     * </p>
-     * <p>
-     * The field will return {@code false} if {@link #JAVA_VERSION} is {@code null}.
-     * </p>
-     */
-    public static final boolean IS_JAVA_1_6 = getJavaVersionMatches("1.6");
-
-    /**
-     * <p>
-     * Is {@code true} if this is Java version 1.7 (also 1.7.x versions).
-     * </p>
-     * <p>
-     * The field will return {@code false} if {@link #JAVA_VERSION} is {@code null}.
-     * </p>
-     *
-     * @since 3.0
-     */
-    public static final boolean IS_JAVA_1_7 = getJavaVersionMatches("1.7");
-
-    /**
-     * <p>
-     * Is {@code true} if this is Java version 1.8 (also 1.8.x versions).
-     * </p>
-     * <p>
-     * The field will return {@code false} if {@link #JAVA_VERSION} is {@code null}.
-     * </p>
-     *
-     * @since 3.3.2
-     */
-    public static final boolean IS_JAVA_1_8 = getJavaVersionMatches("1.8");
-
-    /**
-     * <p>
-     * Is {@code true} if this is Java version 1.9 (also 1.9.x versions).
-     * </p>
-     * <p>
-     * The field will return {@code false} if {@link #JAVA_VERSION} is {@code null}.
-     * </p>
-     *
-     * @since 3.4
-     */
-    public static final boolean IS_JAVA_1_9 = getJavaVersionMatches("1.9");
-
-    // Operating system checks
-    // -----------------------------------------------------------------------
-    // These MUST be declared after those above as they depend on the
-    // values being set up
-    // OS names from http://www.vamphq.com/os.html
-    // Selected ones included - please advise dev@commons.apache.org
-    // if you want another added or a mistake corrected
-
-    /**
-     * <p>
-     * Is {@code true} if this is AIX.
-     * </p>
-     * <p>
-     * The field will return {@code false} if {@code OS_NAME} is {@code null}.
-     * </p>
-     *
-     * @since 2.0
-     */
-    public static final boolean IS_OS_AIX = getOSMatchesName("AIX");
-
-    /**
-     * <p>
-     * Is {@code true} if this is HP-UX.
-     * </p>
-     * <p>
-     * The field will return {@code false} if {@code OS_NAME} is {@code null}.
-     * </p>
-     *
-     * @since 2.0
-     */
-    public static final boolean IS_OS_HP_UX = getOSMatchesName("HP-UX");
-
-    /**
-     * <p>
-     * Is {@code true} if this is IBM OS/400.
-     * </p>
-     * <p>
-     * The field will return {@code false} if {@code OS_NAME} is {@code null}.
-     * </p>
-     *
-     * @since 3.3
-     */
-    public static final boolean IS_OS_400 = getOSMatchesName("OS/400");
-
-    /**
-     * <p>
-     * Is {@code true} if this is Irix.
-     * </p>
-     * <p>
-     * The field will return {@code false} if {@code OS_NAME} is {@code null}.
-     * </p>
-     *
-     * @since 2.0
-     */
-    public static final boolean IS_OS_IRIX = getOSMatchesName("Irix");
-
-    /**
-     * <p>
-     * Is {@code true} if this is Linux.
-     * </p>
-     * <p>
-     * The field will return {@code false} if {@code OS_NAME} is {@code null}.
-     * </p>
-     *
-     * @since 2.0
-     */
-    public static final boolean IS_OS_LINUX = getOSMatchesName("Linux") || getOSMatchesName("LINUX");
-
-    /**
-     * <p>
-     * Is {@code true} if this is Mac.
-     * </p>
-     * <p>
-     * The field will return {@code false} if {@code OS_NAME} is {@code null}.
-     * </p>
-     *
-     * @since 2.0
-     */
-    public static final boolean IS_OS_MAC = getOSMatchesName("Mac");
-
-    /**
-     * <p>
-     * Is {@code true} if this is Mac.
-     * </p>
-     * <p>
-     * The field will return {@code false} if {@code OS_NAME} is {@code null}.
-     * </p>
-     *
-     * @since 2.0
-     */
-    public static final boolean IS_OS_MAC_OSX = getOSMatchesName("Mac OS X");
-
-    /**
-     * <p>
-     * Is {@code true} if this is FreeBSD.
-     * </p>
-     * <p>
-     * The field will return {@code false} if {@code OS_NAME} is {@code null}.
-     * </p>
-     *
-     * @since 3.1
-     */
-    public static final boolean IS_OS_FREE_BSD = getOSMatchesName("FreeBSD");
-
-    /**
-     * <p>
-     * Is {@code true} if this is OpenBSD.
-     * </p>
-     * <p>
-     * The field will return {@code false} if {@code OS_NAME} is {@code null}.
-     * </p>
-     *
-     * @since 3.1
-     */
-    public static final boolean IS_OS_OPEN_BSD = getOSMatchesName("OpenBSD");
-
-    /**
-     * <p>
-     * Is {@code true} if this is NetBSD.
-     * </p>
-     * <p>
-     * The field will return {@code false} if {@code OS_NAME} is {@code null}.
-     * </p>
-     *
-     * @since 3.1
-     */
-    public static final boolean IS_OS_NET_BSD = getOSMatchesName("NetBSD");
-
-    /**
-     * <p>
-     * Is {@code true} if this is OS/2.
-     * </p>
-     * <p>
-     * The field will return {@code false} if {@code OS_NAME} is {@code null}.
-     * </p>
-     *
-     * @since 2.0
-     */
-    public static final boolean IS_OS_OS2 = getOSMatchesName("OS/2");
-
-    /**
-     * <p>
-     * Is {@code true} if this is Solaris.
-     * </p>
-     * <p>
-     * The field will return {@code false} if {@code OS_NAME} is {@code null}.
-     * </p>
-     *
-     * @since 2.0
-     */
-    public static final boolean IS_OS_SOLARIS = getOSMatchesName("Solaris");
-
-    /**
-     * <p>
-     * Is {@code true} if this is SunOS.
-     * </p>
-     * <p>
-     * The field will return {@code false} if {@code OS_NAME} is {@code null}.
-     * </p>
-     *
-     * @since 2.0
-     */
-    public static final boolean IS_OS_SUN_OS = getOSMatchesName("SunOS");
-
-    /**
-     * <p>
-     * Is {@code true} if this is a UNIX like system, as in any of AIX, HP-UX, Irix, Linux, MacOSX, Solaris or SUN OS.
-     * </p>
-     * <p>
-     * The field will return {@code false} if {@code OS_NAME} is {@code null}.
-     * </p>
-     *
-     * @since 2.1
-     */
-    public static final boolean IS_OS_UNIX = IS_OS_AIX || IS_OS_HP_UX || IS_OS_IRIX || IS_OS_LINUX || IS_OS_MAC_OSX
-            || IS_OS_SOLARIS || IS_OS_SUN_OS || IS_OS_FREE_BSD || IS_OS_OPEN_BSD || IS_OS_NET_BSD;
-
-    /**
-     * <p>
-     * Is {@code true} if this is Windows.
-     * </p>
-     * <p>
-     * The field will return {@code false} if {@code OS_NAME} is {@code null}.
-     * </p>
-     *
-     * @since 2.0
-     */
-    public static final boolean IS_OS_WINDOWS = getOSMatchesName(OS_NAME_WINDOWS_PREFIX);
-
-    /**
-     * <p>
-     * Is {@code true} if this is Windows 2000.
-     * </p>
-     * <p>
-     * The field will return {@code false} if {@code OS_NAME} is {@code null}.
-     * </p>
-     *
-     * @since 2.0
-     */
-    public static final boolean IS_OS_WINDOWS_2000 = getOSMatches(OS_NAME_WINDOWS_PREFIX, "5.0");
-
-    /**
-     * <p>
-     * Is {@code true} if this is Windows 2003.
-     * </p>
-     * <p>
-     * The field will return {@code false} if {@code OS_NAME} is {@code null}.
-     * </p>
-     *
-     * @since 3.1
-     */
-    public static final boolean IS_OS_WINDOWS_2003 = getOSMatches(OS_NAME_WINDOWS_PREFIX, "5.2");
-
-    /**
-     * <p>
-     * Is {@code true} if this is Windows 2008.
-     * </p>
-     * <p>
-     * The field will return {@code false} if {@code OS_NAME} is {@code null}.
-     * </p>
-     *
-     * @since 3.1
-     */
-    public static final boolean IS_OS_WINDOWS_2008 = getOSMatches(OS_NAME_WINDOWS_PREFIX + " Server 2008", "6.1");
-
-    /**
-     * <p>
-     * Is {@code true} if this is Windows 95.
-     * </p>
-     * <p>
-     * The field will return {@code false} if {@code OS_NAME} is {@code null}.
-     * </p>
-     *
-     * @since 2.0
-     */
-    public static final boolean IS_OS_WINDOWS_95 = getOSMatches(OS_NAME_WINDOWS_PREFIX + " 9", "4.0");
-    // Java 1.2 running on Windows98 returns 'Windows 95', hence the above
-
-    /**
-     * <p>
-     * Is {@code true} if this is Windows 98.
-     * </p>
-     * <p>
-     * The field will return {@code false} if {@code OS_NAME} is {@code null}.
-     * </p>
-     *
-     * @since 2.0
-     */
-    public static final boolean IS_OS_WINDOWS_98 = getOSMatches(OS_NAME_WINDOWS_PREFIX + " 9", "4.1");
-    // Java 1.2 running on Windows98 returns 'Windows 95', hence the above
-
-    /**
-     * <p>
-     * Is {@code true} if this is Windows ME.
-     * </p>
-     * <p>
-     * The field will return {@code false} if {@code OS_NAME} is {@code null}.
-     * </p>
-     *
-     * @since 2.0
-     */
-    public static final boolean IS_OS_WINDOWS_ME = getOSMatches(OS_NAME_WINDOWS_PREFIX, "4.9");
-    // Java 1.2 running on WindowsME may return 'Windows 95', hence the above
-
-    /**
-     * <p>
-     * Is {@code true} if this is Windows NT.
-     * </p>
-     * <p>
-     * The field will return {@code false} if {@code OS_NAME} is {@code null}.
-     * </p>
-     *
-     * @since 2.0
-     */
-    public static final boolean IS_OS_WINDOWS_NT = getOSMatchesName(OS_NAME_WINDOWS_PREFIX + " NT");
-    // Windows 2000 returns 'Windows 2000' but may suffer from same Java1.2 problem
-
-    /**
-     * <p>
-     * Is {@code true} if this is Windows XP.
-     * </p>
-     * <p>
-     * The field will return {@code false} if {@code OS_NAME} is {@code null}.
-     * </p>
-     *
-     * @since 2.0
-     */
-    public static final boolean IS_OS_WINDOWS_XP = getOSMatches(OS_NAME_WINDOWS_PREFIX, "5.1");
-
-    // -----------------------------------------------------------------------
-    /**
-     * <p>
-     * Is {@code true} if this is Windows Vista.
-     * </p>
-     * <p>
-     * The field will return {@code false} if {@code OS_NAME} is {@code null}.
-     * </p>
-     *
-     * @since 2.4
-     */
-    public static final boolean IS_OS_WINDOWS_VISTA = getOSMatches(OS_NAME_WINDOWS_PREFIX, "6.0");
-
-    /**
-     * <p>
-     * Is {@code true} if this is Windows 7.
-     * </p>
-     * <p>
-     * The field will return {@code false} if {@code OS_NAME} is {@code null}.
-     * </p>
-     *
-     * @since 3.0
-     */
-    public static final boolean IS_OS_WINDOWS_7 = getOSMatches(OS_NAME_WINDOWS_PREFIX, "6.1");
-
-    /**
-     * <p>
-     * Is {@code true} if this is Windows 8.
-     * </p>
-     * <p>
-     * The field will return {@code false} if {@code OS_NAME} is {@code null}.
-     * </p>
-     *
-     * @since 3.2
-     */
-    public static final boolean IS_OS_WINDOWS_8 = getOSMatches(OS_NAME_WINDOWS_PREFIX, "6.2");
-
-    /**
-     * <p>
-     * Gets the Java home directory as a {@code File}.
-     * </p>
-     *
-     * @return a directory
-     * @throws SecurityException if a security manager exists and its {@code checkPropertyAccess} method doesn't allow
-     * access to the specified system property.
-     * @see System#getProperty(String)
-     * @since 2.1
-     */
-    public static File getJavaHome() {
-        return new File(System.getProperty(JAVA_HOME_KEY));
-    }
-
-    /**
-     * <p>
-     * Gets the Java IO temporary directory as a {@code File}.
-     * </p>
-     *
-     * @return a directory
-     * @throws SecurityException if a security manager exists and its {@code checkPropertyAccess} method doesn't allow
-     * access to the specified system property.
-     * @see System#getProperty(String)
-     * @since 2.1
-     */
-    public static File getJavaIoTmpDir() {
-        return new File(System.getProperty(JAVA_IO_TMPDIR_KEY));
-    }
-
-    /**
-     * <p>
-     * Decides if the Java version matches.
-     * </p>
-     *
-     * @param versionPrefix the prefix for the java version
-     * @return true if matches, or false if not or can't determine
-     */
-    private static boolean getJavaVersionMatches(final String versionPrefix) {
-        return isJavaVersionMatch(JAVA_SPECIFICATION_VERSION, versionPrefix);
-    }
-
-    /**
-     * Decides if the operating system matches.
-     *
-     * @param osNamePrefix the prefix for the os name
-     * @param osVersionPrefix the prefix for the version
-     * @return true if matches, or false if not or can't determine
-     */
-    private static boolean getOSMatches(final String osNamePrefix, final String osVersionPrefix) {
-        return isOSMatch(OS_NAME, OS_VERSION, osNamePrefix, osVersionPrefix);
-    }
-
-    /**
-     * Decides if the operating system matches.
-     *
-     * @param osNamePrefix the prefix for the os name
-     * @return true if matches, or false if not or can't determine
-     */
-    private static boolean getOSMatchesName(final String osNamePrefix) {
-        return isOSNameMatch(OS_NAME, osNamePrefix);
-    }
-
-    // -----------------------------------------------------------------------
-    /**
-     * <p>
-     * Gets a System property, defaulting to {@code null} if the property cannot be read.
-     * </p>
-     * <p>
-     * If a {@code SecurityException} is caught, the return value is {@code null} and a message is written to
-     * {@code System.err}.
-     * </p>
-     *
-     * @param property the system property name
-     * @return the system property value or {@code null} if a security problem occurs
-     */
-    private static String getSystemProperty(final String property) {
-        try {
-            return System.getProperty(property);
-        } catch (final SecurityException ex) {
-            // we are not allowed to look at this property
-            System.err.println("Caught a SecurityException reading the system property '" + property
-                    + "'; the SystemUtils property value will default to null.");
-            return null;
-        }
-    }
-
-    /**
-     * <p>
-     * Gets the user directory as a {@code File}.
-     * </p>
-     *
-     * @return a directory
-     * @throws SecurityException if a security manager exists and its {@code checkPropertyAccess} method doesn't allow
-     * access to the specified system property.
-     * @see System#getProperty(String)
-     * @since 2.1
-     */
-    public static File getUserDir() {
-        return new File(System.getProperty(USER_DIR_KEY));
-    }
-
-    /**
-     * <p>
-     * Gets the user home directory as a {@code File}.
-     * </p>
-     *
-     * @return a directory
-     * @throws SecurityException if a security manager exists and its {@code checkPropertyAccess} method doesn't allow
-     * access to the specified system property.
-     * @see System#getProperty(String)
-     * @since 2.1
-     */
-    public static File getUserHome() {
-        return new File(System.getProperty(USER_HOME_KEY));
-    }
-
-    /**
-     * Returns whether the {@link #JAVA_AWT_HEADLESS} value is {@code true}.
-     *
-     * @return {@code true} if {@code JAVA_AWT_HEADLESS} is {@code "true"}, {@code false} otherwise.
-     * @see #JAVA_AWT_HEADLESS
-     * @since 2.1
-     * @since Java 1.4
-     */
-    public static boolean isJavaAwtHeadless() {
-        return JAVA_AWT_HEADLESS != null ? JAVA_AWT_HEADLESS.equals(Boolean.TRUE.toString()) : false;
-    }
-
-    /**
-     * <p>
-     * Is the Java version at least the requested version.
-     * </p>
-     * <p>
-     * Example input:
-     * </p>
-     * <ul>
-     * <li>{@code 1.2f} to test for Java 1.2</li>
-     * <li>{@code 1.31f} to test for Java 1.3.1</li>
-     * </ul>
-     *
-     * @param requiredVersion the required version, for example 1.31f
-     * @return {@code true} if the actual version is equal or greater than the required version
-     */
-    public static boolean isJavaVersionAtLeast(final JavaVersion requiredVersion) {
-        return JAVA_SPECIFICATION_VERSION_AS_ENUM.atLeast(requiredVersion);
-    }
-
-    /**
-     * <p>
-     * Decides if the Java version matches.
-     * </p>
-     * <p>
-     * This method is package private instead of private to support unit test invocation.
-     * </p>
-     *
-     * @param version the actual Java version
-     * @param versionPrefix the prefix for the expected Java version
-     * @return true if matches, or false if not or can't determine
-     */
-    static boolean isJavaVersionMatch(final String version, final String versionPrefix) {
-        if (version == null) {
-            return false;
-        }
-        return version.startsWith(versionPrefix);
-    }
-
-    /**
-     * Decides if the operating system matches.
-     * <p>
-     * This method is package private instead of private to support unit test invocation.
-     * </p>
-     *
-     * @param osName the actual OS name
-     * @param osVersion the actual OS version
-     * @param osNamePrefix the prefix for the expected OS name
-     * @param osVersionPrefix the prefix for the expected OS version
-     * @return true if matches, or false if not or can't determine
-     */
-    static boolean isOSMatch(final String osName, final String osVersion, final String osNamePrefix, final String osVersionPrefix) {
-        if (osName == null || osVersion == null) {
-            return false;
-        }
-        return isOSNameMatch(osName, osNamePrefix) && isOSVersionMatch(osVersion, osVersionPrefix);
-    }
-
-    /**
-     * Decides if the operating system matches.
-     * <p>
-     * This method is package private instead of private to support unit test invocation.
-     * </p>
-     *
-     * @param osName the actual OS name
-     * @param osNamePrefix the prefix for the expected OS name
-     * @return true if matches, or false if not or can't determine
-     */
-    static boolean isOSNameMatch(final String osName, final String osNamePrefix) {
-        if (osName == null) {
-            return false;
-        }
-        return osName.startsWith(osNamePrefix);
-    }
-    
-    /**
-     * Decides if the operating system version matches.
-     * <p>
-     * This method is package private instead of private to support unit test invocation.
-     * </p>
-     *
-     * @param osVersion the actual OS version
-     * @param osVersionPrefix the prefix for the expected OS version
-     * @return true if matches, or false if not or can't determine
-     */
-    static boolean isOSVersionMatch(final String osVersion, final String osVersionPrefix) {
-        if (StringUtils.isEmpty(osVersion)) {
-            return false;
-        }
-        // Compare parts of the version string instead of using String.startsWith(String) because otherwise
-        // osVersionPrefix 10.1 would also match osVersion 10.10
-        String[] versionPrefixParts = osVersionPrefix.split("\\.");
-        String[] versionParts = osVersion.split("\\.");
-        for (int i = 0; i < Math.min(versionPrefixParts.length, versionParts.length); i++) {
-            if (!versionPrefixParts[i].equals(versionParts[i])) {
-                return false;
-            }
-        }
-        return true;
-    }
-
-    // -----------------------------------------------------------------------
-    /**
-     * <p>
-     * SystemUtils instances should NOT be constructed in standard programming. Instead, the class should be used as
-     * {@code SystemUtils.FILE_SEPARATOR}.
-     * </p>
-     * <p>
-     * This constructor is public to permit tools that require a JavaBean instance to operate.
-     * </p>
-     */
-    public SystemUtils() {
-        super();
-    }
-
-}
diff --git a/lang/src/main/java/org/apache/commons/lang3/Validate.java b/lang/src/main/java/org/apache/commons/lang3/Validate.java
deleted file mode 100644
index 3b7c766..0000000
--- a/lang/src/main/java/org/apache/commons/lang3/Validate.java
+++ /dev/null
@@ -1,1256 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.commons.lang3;
-
-import java.util.Collection;
-import java.util.Iterator;
-import java.util.Map;
-import java.util.regex.Pattern;
-
-/**
- * <p>This class assists in validating arguments. The validation methods are
- * based along the following principles:
- * <ul>
- *   <li>An invalid {@code null} argument causes a {@link NullPointerException}.</li>
- *   <li>A non-{@code null} argument causes an {@link IllegalArgumentException}.</li>
- *   <li>An invalid index into an array/collection/map/string causes an {@link IndexOutOfBoundsException}.</li>
- * </ul>
- *
- * <p>All exceptions messages are
- * <a href="http://docs.oracle.com/javase/1.5.0/docs/api/java/util/Formatter.html#syntax">format strings</a>
- * as defined by the Java platform. For example:</p>
- *
- * <pre>
- * Validate.isTrue(i &gt; 0, "The value must be greater than zero: %d", i);
- * Validate.notNull(surname, "The surname must not be %s", null);
- * </pre>
- *
- * <p>#ThreadSafe#</p>
- * @version $Id$
- * @see java.lang.String#format(String, Object...)
- * @since 2.0
- */
-public class Validate {
-
-    private static final String DEFAULT_EXCLUSIVE_BETWEEN_EX_MESSAGE =
-        "The value %s is not in the specified exclusive range of %s to %s";
-    private static final String DEFAULT_INCLUSIVE_BETWEEN_EX_MESSAGE =
-        "The value %s is not in the specified inclusive range of %s to %s";
-    private static final String DEFAULT_MATCHES_PATTERN_EX = "The string %s does not match the pattern %s";
-    private static final String DEFAULT_IS_NULL_EX_MESSAGE = "The validated object is null";
-    private static final String DEFAULT_IS_TRUE_EX_MESSAGE = "The validated expression is false";
-    private static final String DEFAULT_NO_NULL_ELEMENTS_ARRAY_EX_MESSAGE =
-        "The validated array contains null element at index: %d";
-    private static final String DEFAULT_NO_NULL_ELEMENTS_COLLECTION_EX_MESSAGE =
-        "The validated collection contains null element at index: %d";
-    private static final String DEFAULT_NOT_BLANK_EX_MESSAGE = "The validated character sequence is blank";
-    private static final String DEFAULT_NOT_EMPTY_ARRAY_EX_MESSAGE = "The validated array is empty";
-    private static final String DEFAULT_NOT_EMPTY_CHAR_SEQUENCE_EX_MESSAGE =
-        "The validated character sequence is empty";
-    private static final String DEFAULT_NOT_EMPTY_COLLECTION_EX_MESSAGE = "The validated collection is empty";
-    private static final String DEFAULT_NOT_EMPTY_MAP_EX_MESSAGE = "The validated map is empty";
-    private static final String DEFAULT_VALID_INDEX_ARRAY_EX_MESSAGE = "The validated array index is invalid: %d";
-    private static final String DEFAULT_VALID_INDEX_CHAR_SEQUENCE_EX_MESSAGE =
-        "The validated character sequence index is invalid: %d";
-    private static final String DEFAULT_VALID_INDEX_COLLECTION_EX_MESSAGE =
-        "The validated collection index is invalid: %d";
-    private static final String DEFAULT_VALID_STATE_EX_MESSAGE = "The validated state is false";
-    private static final String DEFAULT_IS_ASSIGNABLE_EX_MESSAGE = "Cannot assign a %s to a %s";
-    private static final String DEFAULT_IS_INSTANCE_OF_EX_MESSAGE = "Expected type: %s, actual: %s";
-
-    /**
-     * Constructor. This class should not normally be instantiated.
-     */
-    public Validate() {
-      super();
-    }
-
-    // isTrue
-    //---------------------------------------------------------------------------------
-
-    /**
-     * <p>Validate that the argument condition is {@code true}; otherwise
-     * throwing an exception with the specified message. This method is useful when
-     * validating according to an arbitrary boolean expression, such as validating a
-     * primitive number or using your own custom validation expression.</p>
-     *
-     * <pre>Validate.isTrue(i &gt; 0.0, "The value must be greater than zero: &#37;d", i);</pre>
-     *
-     * <p>For performance reasons, the long value is passed as a separate parameter and
-     * appended to the exception message only in the case of an error.</p>
-     *
-     * @param expression  the boolean expression to check
-     * @param message  the {@link String#format(String, Object...)} exception message if invalid, not null
-     * @param value  the value to append to the message when invalid
-     * @throws IllegalArgumentException if expression is {@code false}
-     * @see #isTrue(boolean)
-     * @see #isTrue(boolean, String, double)
-     * @see #isTrue(boolean, String, Object...)
-     */
-    public static void isTrue(final boolean expression, final String message, final long value) {
-        if (expression == false) {
-            throw new IllegalArgumentException(String.format(message, Long.valueOf(value)));
-        }
-    }
-
-    /**
-     * <p>Validate that the argument condition is {@code true}; otherwise
-     * throwing an exception with the specified message. This method is useful when
-     * validating according to an arbitrary boolean expression, such as validating a
-     * primitive number or using your own custom validation expression.</p>
-     *
-     * <pre>Validate.isTrue(d &gt; 0.0, "The value must be greater than zero: &#37;s", d);</pre>
-     *
-     * <p>For performance reasons, the double value is passed as a separate parameter and
-     * appended to the exception message only in the case of an error.</p>
-     *
-     * @param expression  the boolean expression to check
-     * @param message  the {@link String#format(String, Object...)} exception message if invalid, not null
-     * @param value  the value to append to the message when invalid
-     * @throws IllegalArgumentException if expression is {@code false}
-     * @see #isTrue(boolean)
-     * @see #isTrue(boolean, String, long)
-     * @see #isTrue(boolean, String, Object...)
-     */
-    public static void isTrue(final boolean expression, final String message, final double value) {
-        if (expression == false) {
-            throw new IllegalArgumentException(String.format(message, Double.valueOf(value)));
-        }
-    }
-
-    /**
-     * <p>Validate that the argument condition is {@code true}; otherwise
-     * throwing an exception with the specified message. This method is useful when
-     * validating according to an arbitrary boolean expression, such as validating a
-     * primitive number or using your own custom validation expression.</p>
-     *
-     * <pre>
-     * Validate.isTrue(i &gt;= min &amp;&amp; i &lt;= max, "The value must be between &#37;d and &#37;d", min, max);
-     * Validate.isTrue(myObject.isOk(), "The object is not okay");</pre>
-     *
-     * @param expression  the boolean expression to check
-     * @param message  the {@link String#format(String, Object...)} exception message if invalid, not null
-     * @param values  the optional values for the formatted exception message, null array not recommended
-     * @throws IllegalArgumentException if expression is {@code false}
-     * @see #isTrue(boolean)
-     * @see #isTrue(boolean, String, long)
-     * @see #isTrue(boolean, String, double)
-     */
-    public static void isTrue(final boolean expression, final String message, final Object... values) {
-        if (expression == false) {
-            throw new IllegalArgumentException(String.format(message, values));
-        }
-    }
-
-    /**
-     * <p>Validate that the argument condition is {@code true}; otherwise
-     * throwing an exception. This method is useful when validating according
-     * to an arbitrary boolean expression, such as validating a
-     * primitive number or using your own custom validation expression.</p>
-     *
-     * <pre>
-     * Validate.isTrue(i &gt; 0);
-     * Validate.isTrue(myObject.isOk());</pre>
-     *
-     * <p>The message of the exception is &quot;The validated expression is
-     * false&quot;.</p>
-     *
-     * @param expression  the boolean expression to check
-     * @throws IllegalArgumentException if expression is {@code false}
-     * @see #isTrue(boolean, String, long)
-     * @see #isTrue(boolean, String, double)
-     * @see #isTrue(boolean, String, Object...)
-     */
-    public static void isTrue(final boolean expression) {
-        if (expression == false) {
-            throw new IllegalArgumentException(DEFAULT_IS_TRUE_EX_MESSAGE);
-        }
-    }
-
-    // notNull
-    //---------------------------------------------------------------------------------
-
-    /**
-     * <p>Validate that the specified argument is not {@code null};
-     * otherwise throwing an exception.
-     *
-     * <pre>Validate.notNull(myObject, "The object must not be null");</pre>
-     *
-     * <p>The message of the exception is &quot;The validated object is
-     * null&quot;.</p>
-     *
-     * @param <T> the object type
-     * @param object  the object to check
-     * @return the validated object (never {@code null} for method chaining)
-     * @throws NullPointerException if the object is {@code null}
-     * @see #notNull(Object, String, Object...)
-     */
-    public static <T> T notNull(final T object) {
-        return notNull(object, DEFAULT_IS_NULL_EX_MESSAGE);
-    }
-
-    /**
-     * <p>Validate that the specified argument is not {@code null};
-     * otherwise throwing an exception with the specified message.
-     *
-     * <pre>Validate.notNull(myObject, "The object must not be null");</pre>
-     *
-     * @param <T> the object type
-     * @param object  the object to check
-     * @param message  the {@link String#format(String, Object...)} exception message if invalid, not null
-     * @param values  the optional values for the formatted exception message
-     * @return the validated object (never {@code null} for method chaining)
-     * @throws NullPointerException if the object is {@code null}
-     * @see #notNull(Object)
-     */
-    public static <T> T notNull(final T object, final String message, final Object... values) {
-        if (object == null) {
-            throw new NullPointerException(String.format(message, values));
-        }
-        return object;
-    }
-
-    // notEmpty array
-    //---------------------------------------------------------------------------------
-
-    /**
-     * <p>Validate that the specified argument array is neither {@code null}
-     * nor a length of zero (no elements); otherwise throwing an exception
-     * with the specified message.
-     *
-     * <pre>Validate.notEmpty(myArray, "The array must not be empty");</pre>
-     *
-     * @param <T> the array type
-     * @param array  the array to check, validated not null by this method
-     * @param message  the {@link String#format(String, Object...)} exception message if invalid, not null
-     * @param values  the optional values for the formatted exception message, null array not recommended
-     * @return the validated array (never {@code null} method for chaining)
-     * @throws NullPointerException if the array is {@code null}
-     * @throws IllegalArgumentException if the array is empty
-     * @see #notEmpty(Object[])
-     */
-    public static <T> T[] notEmpty(final T[] array, final String message, final Object... values) {
-        if (array == null) {
-            throw new NullPointerException(String.format(message, values));
-        }
-        if (array.length == 0) {
-            throw new IllegalArgumentException(String.format(message, values));
-        }
-        return array;
-    }
-
-    /**
-     * <p>Validate that the specified argument array is neither {@code null}
-     * nor a length of zero (no elements); otherwise throwing an exception.
-     *
-     * <pre>Validate.notEmpty(myArray);</pre>
-     *
-     * <p>The message in the exception is &quot;The validated array is
-     * empty&quot;.
-     *
-     * @param <T> the array type
-     * @param array  the array to check, validated not null by this method
-     * @return the validated array (never {@code null} method for chaining)
-     * @throws NullPointerException if the array is {@code null}
-     * @throws IllegalArgumentException if the array is empty
-     * @see #notEmpty(Object[], String, Object...)
-     */
-    public static <T> T[] notEmpty(final T[] array) {
-        return notEmpty(array, DEFAULT_NOT_EMPTY_ARRAY_EX_MESSAGE);
-    }
-
-    // notEmpty collection
-    //---------------------------------------------------------------------------------
-
-    /**
-     * <p>Validate that the specified argument collection is neither {@code null}
-     * nor a size of zero (no elements); otherwise throwing an exception
-     * with the specified message.
-     *
-     * <pre>Validate.notEmpty(myCollection, "The collection must not be empty");</pre>
-     *
-     * @param <T> the collection type
-     * @param collection  the collection to check, validated not null by this method
-     * @param message  the {@link String#format(String, Object...)} exception message if invalid, not null
-     * @param values  the optional values for the formatted exception message, null array not recommended
-     * @return the validated collection (never {@code null} method for chaining)
-     * @throws NullPointerException if the collection is {@code null}
-     * @throws IllegalArgumentException if the collection is empty
-     * @see #notEmpty(Object[])
-     */
-    public static <T extends Collection<?>> T notEmpty(final T collection, final String message, final Object... values) {
-        if (collection == null) {
-            throw new NullPointerException(String.format(message, values));
-        }
-        if (collection.isEmpty()) {
-            throw new IllegalArgumentException(String.format(message, values));
-        }
-        return collection;
-    }
-
-    /**
-     * <p>Validate that the specified argument collection is neither {@code null}
-     * nor a size of zero (no elements); otherwise throwing an exception.
-     *
-     * <pre>Validate.notEmpty(myCollection);</pre>
-     *
-     * <p>The message in the exception is &quot;The validated collection is
-     * empty&quot;.</p>
-     *
-     * @param <T> the collection type
-     * @param collection  the collection to check, validated not null by this method
-     * @return the validated collection (never {@code null} method for chaining)
-     * @throws NullPointerException if the collection is {@code null}
-     * @throws IllegalArgumentException if the collection is empty
-     * @see #notEmpty(Collection, String, Object...)
-     */
-    public static <T extends Collection<?>> T notEmpty(final T collection) {
-        return notEmpty(collection, DEFAULT_NOT_EMPTY_COLLECTION_EX_MESSAGE);
-    }
-
-    // notEmpty map
-    //---------------------------------------------------------------------------------
-
-    /**
-     * <p>Validate that the specified argument map is neither {@code null}
-     * nor a size of zero (no elements); otherwise throwing an exception
-     * with the specified message.
-     *
-     * <pre>Validate.notEmpty(myMap, "The map must not be empty");</pre>
-     *
-     * @param <T> the map type
-     * @param map  the map to check, validated not null by this method
-     * @param message  the {@link String#format(String, Object...)} exception message if invalid, not null
-     * @param values  the optional values for the formatted exception message, null array not recommended
-     * @return the validated map (never {@code null} method for chaining)
-     * @throws NullPointerException if the map is {@code null}
-     * @throws IllegalArgumentException if the map is empty
-     * @see #notEmpty(Object[])
-     */
-    public static <T extends Map<?, ?>> T notEmpty(final T map, final String message, final Object... values) {
-        if (map == null) {
-            throw new NullPointerException(String.format(message, values));
-        }
-        if (map.isEmpty()) {
-            throw new IllegalArgumentException(String.format(message, values));
-        }
-        return map;
-    }
-
-    /**
-     * <p>Validate that the specified argument map is neither {@code null}
-     * nor a size of zero (no elements); otherwise throwing an exception.
-     *
-     * <pre>Validate.notEmpty(myMap);</pre>
-     *
-     * <p>The message in the exception is &quot;The validated map is
-     * empty&quot;.</p>
-     *
-     * @param <T> the map type
-     * @param map  the map to check, validated not null by this method
-     * @return the validated map (never {@code null} method for chaining)
-     * @throws NullPointerException if the map is {@code null}
-     * @throws IllegalArgumentException if the map is empty
-     * @see #notEmpty(Map, String, Object...)
-     */
-    public static <T extends Map<?, ?>> T notEmpty(final T map) {
-        return notEmpty(map, DEFAULT_NOT_EMPTY_MAP_EX_MESSAGE);
-    }
-
-    // notEmpty string
-    //---------------------------------------------------------------------------------
-
-    /**
-     * <p>Validate that the specified argument character sequence is
-     * neither {@code null} nor a length of zero (no characters);
-     * otherwise throwing an exception with the specified message.
-     *
-     * <pre>Validate.notEmpty(myString, "The string must not be empty");</pre>
-     *
-     * @param <T> the character sequence type
-     * @param chars  the character sequence to check, validated not null by this method
-     * @param message  the {@link String#format(String, Object...)} exception message if invalid, not null
-     * @param values  the optional values for the formatted exception message, null array not recommended
-     * @return the validated character sequence (never {@code null} method for chaining)
-     * @throws NullPointerException if the character sequence is {@code null}
-     * @throws IllegalArgumentException if the character sequence is empty
-     * @see #notEmpty(CharSequence)
-     */
-    public static <T extends CharSequence> T notEmpty(final T chars, final String message, final Object... values) {
-        if (chars == null) {
-            throw new NullPointerException(String.format(message, values));
-        }
-        if (chars.length() == 0) {
-            throw new IllegalArgumentException(String.format(message, values));
-        }
-        return chars;
-    }
-
-    /**
-     * <p>Validate that the specified argument character sequence is
-     * neither {@code null} nor a length of zero (no characters);
-     * otherwise throwing an exception with the specified message.
-     *
-     * <pre>Validate.notEmpty(myString);</pre>
-     *
-     * <p>The message in the exception is &quot;The validated
-     * character sequence is empty&quot;.</p>
-     *
-     * @param <T> the character sequence type
-     * @param chars  the character sequence to check, validated not null by this method
-     * @return the validated character sequence (never {@code null} method for chaining)
-     * @throws NullPointerException if the character sequence is {@code null}
-     * @throws IllegalArgumentException if the character sequence is empty
-     * @see #notEmpty(CharSequence, String, Object...)
-     */
-    public static <T extends CharSequence> T notEmpty(final T chars) {
-        return notEmpty(chars, DEFAULT_NOT_EMPTY_CHAR_SEQUENCE_EX_MESSAGE);
-    }
-
-    // notBlank string
-    //---------------------------------------------------------------------------------
-
-    /**
-     * <p>Validate that the specified argument character sequence is
-     * neither {@code null}, a length of zero (no characters), empty
-     * nor whitespace; otherwise throwing an exception with the specified
-     * message.
-     *
-     * <pre>Validate.notBlank(myString, "The string must not be blank");</pre>
-     *
-     * @param <T> the character sequence type
-     * @param chars  the character sequence to check, validated not null by this method
-     * @param message  the {@link String#format(String, Object...)} exception message if invalid, not null
-     * @param values  the optional values for the formatted exception message, null array not recommended
-     * @return the validated character sequence (never {@code null} method for chaining)
-     * @throws NullPointerException if the character sequence is {@code null}
-     * @throws IllegalArgumentException if the character sequence is blank
-     * @see #notBlank(CharSequence)
-     *
-     * @since 3.0
-     */
-    public static <T extends CharSequence> T notBlank(final T chars, final String message, final Object... values) {
-        if (chars == null) {
-            throw new NullPointerException(String.format(message, values));
-        }
-        if (StringUtils.isBlank(chars)) {
-            throw new IllegalArgumentException(String.format(message, values));
-        }
-        return chars;
-    }
-
-    /**
-     * <p>Validate that the specified argument character sequence is
-     * neither {@code null}, a length of zero (no characters), empty
-     * nor whitespace; otherwise throwing an exception.
-     *
-     * <pre>Validate.notBlank(myString);</pre>
-     *
-     * <p>The message in the exception is &quot;The validated character
-     * sequence is blank&quot;.</p>
-     *
-     * @param <T> the character sequence type
-     * @param chars  the character sequence to check, validated not null by this method
-     * @return the validated character sequence (never {@code null} method for chaining)
-     * @throws NullPointerException if the character sequence is {@code null}
-     * @throws IllegalArgumentException if the character sequence is blank
-     * @see #notBlank(CharSequence, String, Object...)
-     *
-     * @since 3.0
-     */
-    public static <T extends CharSequence> T notBlank(final T chars) {
-        return notBlank(chars, DEFAULT_NOT_BLANK_EX_MESSAGE);
-    }
-
-    // noNullElements array
-    //---------------------------------------------------------------------------------
-
-    /**
-     * <p>Validate that the specified argument array is neither
-     * {@code null} nor contains any elements that are {@code null};
-     * otherwise throwing an exception with the specified message.
-     *
-     * <pre>Validate.noNullElements(myArray, "The array contain null at position %d");</pre>
-     *
-     * <p>If the array is {@code null}, then the message in the exception
-     * is &quot;The validated object is null&quot;.</p>
-     *
-     * <p>If the array has a {@code null} element, then the iteration
-     * index of the invalid element is appended to the {@code values}
-     * argument.</p>
-     *
-     * @param <T> the array type
-     * @param array  the array to check, validated not null by this method
-     * @param message  the {@link String#format(String, Object...)} exception message if invalid, not null
-     * @param values  the optional values for the formatted exception message, null array not recommended
-     * @return the validated array (never {@code null} method for chaining)
-     * @throws NullPointerException if the array is {@code null}
-     * @throws IllegalArgumentException if an element is {@code null}
-     * @see #noNullElements(Object[])
-     */
-    public static <T> T[] noNullElements(final T[] array, final String message, final Object... values) {
-        Validate.notNull(array);
-        for (int i = 0; i < array.length; i++) {
-            if (array[i] == null) {
-                final Object[] values2 = ArrayUtils.add(values, Integer.valueOf(i));
-                throw new IllegalArgumentException(String.format(message, values2));
-            }
-        }
-        return array;
-    }
-
-    /**
-     * <p>Validate that the specified argument array is neither
-     * {@code null} nor contains any elements that are {@code null};
-     * otherwise throwing an exception.</p>
-     *
-     * <pre>Validate.noNullElements(myArray);</pre>
-     *
-     * <p>If the array is {@code null}, then the message in the exception
-     * is &quot;The validated object is null&quot;.</p>
-     *
-     * <p>If the array has a {@code null} element, then the message in the
-     * exception is &quot;The validated array contains null element at index:
-     * &quot; followed by the index.</p>
-     *
-     * @param <T> the array type
-     * @param array  the array to check, validated not null by this method
-     * @return the validated array (never {@code null} method for chaining)
-     * @throws NullPointerException if the array is {@code null}
-     * @throws IllegalArgumentException if an element is {@code null}
-     * @see #noNullElements(Object[], String, Object...)
-     */
-    public static <T> T[] noNullElements(final T[] array) {
-        return noNullElements(array, DEFAULT_NO_NULL_ELEMENTS_ARRAY_EX_MESSAGE);
-    }
-
-    // noNullElements iterable
-    //---------------------------------------------------------------------------------
-
-    /**
-     * <p>Validate that the specified argument iterable is neither
-     * {@code null} nor contains any elements that are {@code null};
-     * otherwise throwing an exception with the specified message.
-     *
-     * <pre>Validate.noNullElements(myCollection, "The collection contains null at position %d");</pre>
-     *
-     * <p>If the iterable is {@code null}, then the message in the exception
-     * is &quot;The validated object is null&quot;.</p>
-     *
-     * <p>If the iterable has a {@code null} element, then the iteration
-     * index of the invalid element is appended to the {@code values}
-     * argument.</p>
-     *
-     * @param <T> the iterable type
-     * @param iterable  the iterable to check, validated not null by this method
-     * @param message  the {@link String#format(String, Object...)} exception message if invalid, not null
-     * @param values  the optional values for the formatted exception message, null array not recommended
-     * @return the validated iterable (never {@code null} method for chaining)
-     * @throws NullPointerException if the array is {@code null}
-     * @throws IllegalArgumentException if an element is {@code null}
-     * @see #noNullElements(Iterable)
-     */
-    public static <T extends Iterable<?>> T noNullElements(final T iterable, final String message, final Object... values) {
-        Validate.notNull(iterable);
-        int i = 0;
-        for (final Iterator<?> it = iterable.iterator(); it.hasNext(); i++) {
-            if (it.next() == null) {
-                final Object[] values2 = ArrayUtils.addAll(values, Integer.valueOf(i));
-                throw new IllegalArgumentException(String.format(message, values2));
-            }
-        }
-        return iterable;
-    }
-
-    /**
-     * <p>Validate that the specified argument iterable is neither
-     * {@code null} nor contains any elements that are {@code null};
-     * otherwise throwing an exception.
-     *
-     * <pre>Validate.noNullElements(myCollection);</pre>
-     *
-     * <p>If the iterable is {@code null}, then the message in the exception
-     * is &quot;The validated object is null&quot;.</p>
-     *
-     * <p>If the array has a {@code null} element, then the message in the
-     * exception is &quot;The validated iterable contains null element at index:
-     * &quot; followed by the index.</p>
-     *
-     * @param <T> the iterable type
-     * @param iterable  the iterable to check, validated not null by this method
-     * @return the validated iterable (never {@code null} method for chaining)
-     * @throws NullPointerException if the array is {@code null}
-     * @throws IllegalArgumentException if an element is {@code null}
-     * @see #noNullElements(Iterable, String, Object...)
-     */
-    public static <T extends Iterable<?>> T noNullElements(final T iterable) {
-        return noNullElements(iterable, DEFAULT_NO_NULL_ELEMENTS_COLLECTION_EX_MESSAGE);
-    }
-
-    // validIndex array
-    //---------------------------------------------------------------------------------
-
-    /**
-     * <p>Validates that the index is within the bounds of the argument
-     * array; otherwise throwing an exception with the specified message.</p>
-     *
-     * <pre>Validate.validIndex(myArray, 2, "The array index is invalid: ");</pre>
-     *
-     * <p>If the array is {@code null}, then the message of the exception
-     * is &quot;The validated object is null&quot;.</p>
-     *
-     * @param <T> the array type
-     * @param array  the array to check, validated not null by this method
-     * @param index  the index to check
-     * @param message  the {@link String#format(String, Object...)} exception message if invalid, not null
-     * @param values  the optional values for the formatted exception message, null array not recommended
-     * @return the validated array (never {@code null} for method chaining)
-     * @throws NullPointerException if the array is {@code null}
-     * @throws IndexOutOfBoundsException if the index is invalid
-     * @see #validIndex(Object[], int)
-     *
-     * @since 3.0
-     */
-    public static <T> T[] validIndex(final T[] array, final int index, final String message, final Object... values) {
-        Validate.notNull(array);
-        if (index < 0 || index >= array.length) {
-            throw new IndexOutOfBoundsException(String.format(message, values));
-        }
-        return array;
-    }
-
-    /**
-     * <p>Validates that the index is within the bounds of the argument
-     * array; otherwise throwing an exception.</p>
-     *
-     * <pre>Validate.validIndex(myArray, 2);</pre>
-     *
-     * <p>If the array is {@code null}, then the message of the exception
-     * is &quot;The validated object is null&quot;.</p>
-     *
-     * <p>If the index is invalid, then the message of the exception is
-     * &quot;The validated array index is invalid: &quot; followed by the
-     * index.</p>
-     *
-     * @param <T> the array type
-     * @param array  the array to check, validated not null by this method
-     * @param index  the index to check
-     * @return the validated array (never {@code null} for method chaining)
-     * @throws NullPointerException if the array is {@code null}
-     * @throws IndexOutOfBoundsException if the index is invalid
-     * @see #validIndex(Object[], int, String, Object...)
-     *
-     * @since 3.0
-     */
-    public static <T> T[] validIndex(final T[] array, final int index) {
-        return validIndex(array, index, DEFAULT_VALID_INDEX_ARRAY_EX_MESSAGE, Integer.valueOf(index));
-    }
-
-    // validIndex collection
-    //---------------------------------------------------------------------------------
-
-    /**
-     * <p>Validates that the index is within the bounds of the argument
-     * collection; otherwise throwing an exception with the specified message.</p>
-     *
-     * <pre>Validate.validIndex(myCollection, 2, "The collection index is invalid: ");</pre>
-     *
-     * <p>If the collection is {@code null}, then the message of the
-     * exception is &quot;The validated object is null&quot;.</p>
-     *
-     * @param <T> the collection type
-     * @param collection  the collection to check, validated not null by this method
-     * @param index  the index to check
-     * @param message  the {@link String#format(String, Object...)} exception message if invalid, not null
-     * @param values  the optional values for the formatted exception message, null array not recommended
-     * @return the validated collection (never {@code null} for chaining)
-     * @throws NullPointerException if the collection is {@code null}
-     * @throws IndexOutOfBoundsException if the index is invalid
-     * @see #validIndex(Collection, int)
-     *
-     * @since 3.0
-     */
-    public static <T extends Collection<?>> T validIndex(final T collection, final int index, final String message, final Object... values) {
-        Validate.notNull(collection);
-        if (index < 0 || index >= collection.size()) {
-            throw new IndexOutOfBoundsException(String.format(message, values));
-        }
-        return collection;
-    }
-
-    /**
-     * <p>Validates that the index is within the bounds of the argument
-     * collection; otherwise throwing an exception.</p>
-     *
-     * <pre>Validate.validIndex(myCollection, 2);</pre>
-     *
-     * <p>If the index is invalid, then the message of the exception
-     * is &quot;The validated collection index is invalid: &quot;
-     * followed by the index.</p>
-     *
-     * @param <T> the collection type
-     * @param collection  the collection to check, validated not null by this method
-     * @param index  the index to check
-     * @return the validated collection (never {@code null} for method chaining)
-     * @throws NullPointerException if the collection is {@code null}
-     * @throws IndexOutOfBoundsException if the index is invalid
-     * @see #validIndex(Collection, int, String, Object...)
-     *
-     * @since 3.0
-     */
-    public static <T extends Collection<?>> T validIndex(final T collection, final int index) {
-        return validIndex(collection, index, DEFAULT_VALID_INDEX_COLLECTION_EX_MESSAGE, Integer.valueOf(index));
-    }
-
-    // validIndex string
-    //---------------------------------------------------------------------------------
-
-    /**
-     * <p>Validates that the index is within the bounds of the argument
-     * character sequence; otherwise throwing an exception with the
-     * specified message.</p>
-     *
-     * <pre>Validate.validIndex(myStr, 2, "The string index is invalid: ");</pre>
-     *
-     * <p>If the character sequence is {@code null}, then the message
-     * of the exception is &quot;The validated object is null&quot;.</p>
-     *
-     * @param <T> the character sequence type
-     * @param chars  the character sequence to check, validated not null by this method
-     * @param index  the index to check
-     * @param message  the {@link String#format(String, Object...)} exception message if invalid, not null
-     * @param values  the optional values for the formatted exception message, null array not recommended
-     * @return the validated character sequence (never {@code null} for method chaining)
-     * @throws NullPointerException if the character sequence is {@code null}
-     * @throws IndexOutOfBoundsException if the index is invalid
-     * @see #validIndex(CharSequence, int)
-     *
-     * @since 3.0
-     */
-    public static <T extends CharSequence> T validIndex(final T chars, final int index, final String message, final Object... values) {
-        Validate.notNull(chars);
-        if (index < 0 || index >= chars.length()) {
-            throw new IndexOutOfBoundsException(String.format(message, values));
-        }
-        return chars;
-    }
-
-    /**
-     * <p>Validates that the index is within the bounds of the argument
-     * character sequence; otherwise throwing an exception.</p>
-     *
-     * <pre>Validate.validIndex(myStr, 2);</pre>
-     *
-     * <p>If the character sequence is {@code null}, then the message
-     * of the exception is &quot;The validated object is
-     * null&quot;.</p>
-     *
-     * <p>If the index is invalid, then the message of the exception
-     * is &quot;The validated character sequence index is invalid: &quot;
-     * followed by the index.</p>
-     *
-     * @param <T> the character sequence type
-     * @param chars  the character sequence to check, validated not null by this method
-     * @param index  the index to check
-     * @return the validated character sequence (never {@code null} for method chaining)
-     * @throws NullPointerException if the character sequence is {@code null}
-     * @throws IndexOutOfBoundsException if the index is invalid
-     * @see #validIndex(CharSequence, int, String, Object...)
-     *
-     * @since 3.0
-     */
-    public static <T extends CharSequence> T validIndex(final T chars, final int index) {
-        return validIndex(chars, index, DEFAULT_VALID_INDEX_CHAR_SEQUENCE_EX_MESSAGE, Integer.valueOf(index));
-    }
-
-    // validState
-    //---------------------------------------------------------------------------------
-
-    /**
-     * <p>Validate that the stateful condition is {@code true}; otherwise
-     * throwing an exception. This method is useful when validating according
-     * to an arbitrary boolean expression, such as validating a
-     * primitive number or using your own custom validation expression.</p>
-     *
-     * <pre>
-     * Validate.validState(field &gt; 0);
-     * Validate.validState(this.isOk());</pre>
-     *
-     * <p>The message of the exception is &quot;The validated state is
-     * false&quot;.</p>
-     *
-     * @param expression  the boolean expression to check
-     * @throws IllegalStateException if expression is {@code false}
-     * @see #validState(boolean, String, Object...)
-     *
-     * @since 3.0
-     */
-    public static void validState(final boolean expression) {
-        if (expression == false) {
-            throw new IllegalStateException(DEFAULT_VALID_STATE_EX_MESSAGE);
-        }
-    }
-
-    /**
-     * <p>Validate that the stateful condition is {@code true}; otherwise
-     * throwing an exception with the specified message. This method is useful when
-     * validating according to an arbitrary boolean expression, such as validating a
-     * primitive number or using your own custom validation expression.</p>
-     *
-     * <pre>Validate.validState(this.isOk(), "The state is not OK: %s", myObject);</pre>
-     *
-     * @param expression  the boolean expression to check
-     * @param message  the {@link String#format(String, Object...)} exception message if invalid, not null
-     * @param values  the optional values for the formatted exception message, null array not recommended
-     * @throws IllegalStateException if expression is {@code false}
-     * @see #validState(boolean)
-     *
-     * @since 3.0
-     */
-    public static void validState(final boolean expression, final String message, final Object... values) {
-        if (expression == false) {
-            throw new IllegalStateException(String.format(message, values));
-        }
-    }
-
-    // matchesPattern
-    //---------------------------------------------------------------------------------
-
-    /**
-     * <p>Validate that the specified argument character sequence matches the specified regular
-     * expression pattern; otherwise throwing an exception.</p>
-     *
-     * <pre>Validate.matchesPattern("hi", "[a-z]*");</pre>
-     *
-     * <p>The syntax of the pattern is the one used in the {@link Pattern} class.</p>
-     *
-     * @param input  the character sequence to validate, not null
-     * @param pattern  the regular expression pattern, not null
-     * @throws IllegalArgumentException if the character sequence does not match the pattern
-     * @see #matchesPattern(CharSequence, String, String, Object...)
-     *
-     * @since 3.0
-     */
-    public static void matchesPattern(final CharSequence input, final String pattern) {
-        // TODO when breaking BC, consider returning input
-        if (Pattern.matches(pattern, input) == false) {
-            throw new IllegalArgumentException(String.format(DEFAULT_MATCHES_PATTERN_EX, input, pattern));
-        }
-    }
-
-    /**
-     * <p>Validate that the specified argument character sequence matches the specified regular
-     * expression pattern; otherwise throwing an exception with the specified message.</p>
-     *
-     * <pre>Validate.matchesPattern("hi", "[a-z]*", "%s does not match %s", "hi" "[a-z]*");</pre>
-     *
-     * <p>The syntax of the pattern is the one used in the {@link Pattern} class.</p>
-     *
-     * @param input  the character sequence to validate, not null
-     * @param pattern  the regular expression pattern, not null
-     * @param message  the {@link String#format(String, Object...)} exception message if invalid, not null
-     * @param values  the optional values for the formatted exception message, null array not recommended
-     * @throws IllegalArgumentException if the character sequence does not match the pattern
-     * @see #matchesPattern(CharSequence, String)
-     *
-     * @since 3.0
-     */
-    public static void matchesPattern(final CharSequence input, final String pattern, final String message, final Object... values) {
-        // TODO when breaking BC, consider returning input
-        if (Pattern.matches(pattern, input) == false) {
-            throw new IllegalArgumentException(String.format(message, values));
-        }
-    }
-
-    // inclusiveBetween
-    //---------------------------------------------------------------------------------
-
-    /**
-     * <p>Validate that the specified argument object fall between the two
-     * inclusive values specified; otherwise, throws an exception.</p>
-     *
-     * <pre>Validate.inclusiveBetween(0, 2, 1);</pre>
-     *
-     * @param <T> the type of the argument object
-     * @param start  the inclusive start value, not null
-     * @param end  the inclusive end value, not null
-     * @param value  the object to validate, not null
-     * @throws IllegalArgumentException if the value falls outside the boundaries
-     * @see #inclusiveBetween(Object, Object, Comparable, String, Object...)
-     *
-     * @since 3.0
-     */
-    public static <T> void inclusiveBetween(final T start, final T end, final Comparable<T> value) {
-        // TODO when breaking BC, consider returning value
-        if (value.compareTo(start) < 0 || value.compareTo(end) > 0) {
-            throw new IllegalArgumentException(String.format(DEFAULT_INCLUSIVE_BETWEEN_EX_MESSAGE, value, start, end));
-        }
-    }
-
-    /**
-     * <p>Validate that the specified argument object fall between the two
-     * inclusive values specified; otherwise, throws an exception with the
-     * specified message.</p>
-     *
-     * <pre>Validate.inclusiveBetween(0, 2, 1, "Not in boundaries");</pre>
-     *
-     * @param <T> the type of the argument object
-     * @param start  the inclusive start value, not null
-     * @param end  the inclusive end value, not null
-     * @param value  the object to validate, not null
-     * @param message  the {@link String#format(String, Object...)} exception message if invalid, not null
-     * @param values  the optional values for the formatted exception message, null array not recommended
-     * @throws IllegalArgumentException if the value falls outside the boundaries
-     * @see #inclusiveBetween(Object, Object, Comparable)
-     *
-     * @since 3.0
-     */
-    public static <T> void inclusiveBetween(final T start, final T end, final Comparable<T> value, final String message, final Object... values) {
-        // TODO when breaking BC, consider returning value
-        if (value.compareTo(start) < 0 || value.compareTo(end) > 0) {
-            throw new IllegalArgumentException(String.format(message, values));
-        }
-    }
-
-    /**
-    * Validate that the specified primitive value falls between the two
-    * inclusive values specified; otherwise, throws an exception.
-    *
-    * <pre>Validate.inclusiveBetween(0, 2, 1);</pre>
-    *
-    * @param start the inclusive start value
-    * @param end   the inclusive end value
-    * @param value the value to validate
-    * @throws IllegalArgumentException if the value falls outside the boundaries (inclusive)
-    *
-    * @since 3.3
-    */
-    @SuppressWarnings("boxing")
-    public static void inclusiveBetween(final long start, final long end, final long value) {
-        // TODO when breaking BC, consider returning value
-        if (value < start || value > end) {
-            throw new IllegalArgumentException(String.format(DEFAULT_INCLUSIVE_BETWEEN_EX_MESSAGE, value, start, end));
-        }
-    }
-
-    /**
-    * Validate that the specified primitive value falls between the two
-    * inclusive values specified; otherwise, throws an exception with the
-    * specified message.
-    *
-    * <pre>Validate.inclusiveBetween(0, 2, 1, "Not in range");</pre>
-    *
-    * @param start the inclusive start value
-    * @param end   the inclusive end value
-    * @param value the value to validate
-    * @param message the exception message if invalid, not null
-    *
-    * @throws IllegalArgumentException if the value falls outside the boundaries
-    *
-    * @since 3.3
-    */
-    public static void inclusiveBetween(final long start, final long end, final long value, final String message) {
-        // TODO when breaking BC, consider returning value
-        if (value < start || value > end) {
-            throw new IllegalArgumentException(String.format(message));
-        }
-    }
-
-    /**
-    * Validate that the specified primitive value falls between the two
-    * inclusive values specified; otherwise, throws an exception.
-    *
-    * <pre>Validate.inclusiveBetween(0.1, 2.1, 1.1);</pre>
-    *
-    * @param start the inclusive start value
-    * @param end   the inclusive end value
-    * @param value the value to validate
-    * @throws IllegalArgumentException if the value falls outside the boundaries (inclusive)
-    *
-    * @since 3.3
-    */
-    @SuppressWarnings("boxing")
-    public static void inclusiveBetween(final double start, final double end, final double value) {
-        // TODO when breaking BC, consider returning value
-        if (value < start || value > end) {
-            throw new IllegalArgumentException(String.format(DEFAULT_INCLUSIVE_BETWEEN_EX_MESSAGE, value, start, end));
-        }
-    }
-
-    /**
-    * Validate that the specified primitive value falls between the two
-    * inclusive values specified; otherwise, throws an exception with the
-    * specified message.
-    *
-    * <pre>Validate.inclusiveBetween(0.1, 2.1, 1.1, "Not in range");</pre>
-    *
-    * @param start the inclusive start value
-    * @param end   the inclusive end value
-    * @param value the value to validate
-    * @param message the exception message if invalid, not null
-    *
-    * @throws IllegalArgumentException if the value falls outside the boundaries
-    *
-    * @since 3.3
-    */
-    public static void inclusiveBetween(final double start, final double end, final double value, final String message) {
-        // TODO when breaking BC, consider returning value
-        if (value < start || value > end) {
-            throw new IllegalArgumentException(String.format(message));
-        }
-    }
-
-    // exclusiveBetween
-    //---------------------------------------------------------------------------------
-
-    /**
-     * <p>Validate that the specified argument object fall between the two
-     * exclusive values specified; otherwise, throws an exception.</p>
-     *
-     * <pre>Validate.exclusiveBetween(0, 2, 1);</pre>
-     *
-     * @param <T> the type of the argument object
-     * @param start  the exclusive start value, not null
-     * @param end  the exclusive end value, not null
-     * @param value  the object to validate, not null
-     * @throws IllegalArgumentException if the value falls outside the boundaries
-     * @see #exclusiveBetween(Object, Object, Comparable, String, Object...)
-     *
-     * @since 3.0
-     */
-    public static <T> void exclusiveBetween(final T start, final T end, final Comparable<T> value) {
-        // TODO when breaking BC, consider returning value
-        if (value.compareTo(start) <= 0 || value.compareTo(end) >= 0) {
-            throw new IllegalArgumentException(String.format(DEFAULT_EXCLUSIVE_BETWEEN_EX_MESSAGE, value, start, end));
-        }
-    }
-
-    /**
-     * <p>Validate that the specified argument object fall between the two
-     * exclusive values specified; otherwise, throws an exception with the
-     * specified message.</p>
-     *
-     * <pre>Validate.exclusiveBetween(0, 2, 1, "Not in boundaries");</pre>
-     *
-     * @param <T> the type of the argument object
-     * @param start  the exclusive start value, not null
-     * @param end  the exclusive end value, not null
-     * @param value  the object to validate, not null
-     * @param message  the {@link String#format(String, Object...)} exception message if invalid, not null
-     * @param values  the optional values for the formatted exception message, null array not recommended
-     * @throws IllegalArgumentException if the value falls outside the boundaries
-     * @see #exclusiveBetween(Object, Object, Comparable)
-     *
-     * @since 3.0
-     */
-    public static <T> void exclusiveBetween(final T start, final T end, final Comparable<T> value, final String message, final Object... values) {
-        // TODO when breaking BC, consider returning value
-        if (value.compareTo(start) <= 0 || value.compareTo(end) >= 0) {
-            throw new IllegalArgumentException(String.format(message, values));
-        }
-    }
-
-    /**
-    * Validate that the specified primitive value falls between the two
-    * exclusive values specified; otherwise, throws an exception.
-    *
-    * <pre>Validate.exclusiveBetween(0, 2, 1);</pre>
-    *
-    * @param start the exclusive start value
-    * @param end   the exclusive end value
-    * @param value the value to validate
-    * @throws IllegalArgumentException if the value falls out of the boundaries
-    *
-    * @since 3.3
-    */
-    @SuppressWarnings("boxing")
-    public static void exclusiveBetween(final long start, final long end, final long value) {
-        // TODO when breaking BC, consider returning value
-        if (value <= start || value >= end) {
-            throw new IllegalArgumentException(String.format(DEFAULT_EXCLUSIVE_BETWEEN_EX_MESSAGE, value, start, end));
-        }
-    }
-
-    /**
-    * Validate that the specified primitive value falls between the two
-    * exclusive values specified; otherwise, throws an exception with the
-    * specified message.
-    *
-    * <pre>Validate.exclusiveBetween(0, 2, 1, "Not in range");</pre>
-    *
-    * @param start the exclusive start value
-    * @param end   the exclusive end value
-    * @param value the value to validate
-    * @param message the exception message if invalid, not null
-    *
-    * @throws IllegalArgumentException if the value falls outside the boundaries
-    *
-    * @since 3.3
-    */
-    public static void exclusiveBetween(final long start, final long end, final long value, final String message) {
-        // TODO when breaking BC, consider returning value
-        if (value <= start || value >= end) {
-            throw new IllegalArgumentException(String.format(message));
-        }
-    }
-
-    /**
-    * Validate that the specified primitive value falls between the two
-    * exclusive values specified; otherwise, throws an exception.
-    *
-    * <pre>Validate.exclusiveBetween(0.1, 2.1, 1.1);</pre>
-    *
-    * @param start the exclusive start value
-    * @param end   the exclusive end value
-    * @param value the value to validate
-    * @throws IllegalArgumentException if the value falls out of the boundaries
-    *
-    * @since 3.3
-    */
-    @SuppressWarnings("boxing")
-    public static void exclusiveBetween(final double start, final double end, final double value) {
-        // TODO when breaking BC, consider returning value
-        if (value <= start || value >= end) {
-            throw new IllegalArgumentException(String.format(DEFAULT_EXCLUSIVE_BETWEEN_EX_MESSAGE, value, start, end));
-        }
-    }
-
-    /**
-    * Validate that the specified primitive value falls between the two
-    * exclusive values specified; otherwise, throws an exception with the
-    * specified message.
-    *
-    * <pre>Validate.exclusiveBetween(0.1, 2.1, 1.1, "Not in range");</pre>
-    *
-    * @param start the exclusive start value
-    * @param end   the exclusive end value
-    * @param value the value to validate
-    * @param message the exception message if invalid, not null
-    *
-    * @throws IllegalArgumentException if the value falls outside the boundaries
-    *
-    * @since 3.3
-    */
-    public static void exclusiveBetween(final double start, final double end, final double value, final String message) {
-        // TODO when breaking BC, consider returning value
-        if (value <= start || value >= end) {
-            throw new IllegalArgumentException(String.format(message));
-        }
-    }
-
-    // isInstanceOf
-    //---------------------------------------------------------------------------------
-
-    /**
-     * Validates that the argument is an instance of the specified class, if not throws an exception.
-     *  
-     * <p>This method is useful when validating according to an arbitrary class</p>
-     *
-     * <pre>Validate.isInstanceOf(OkClass.class, object);</pre>
-     *
-     * <p>The message of the exception is &quot;Expected type: {type}, actual: {obj_type}&quot;</p>
-     *
-     * @param type  the class the object must be validated against, not null
-     * @param obj  the object to check, null throws an exception
-     * @throws IllegalArgumentException if argument is not of specified class
-     * @see #isInstanceOf(Class, Object, String, Object...)
-     *
-     * @since 3.0
-     */
-    public static void isInstanceOf(final Class<?> type, final Object obj) {
-        // TODO when breaking BC, consider returning obj
-        if (type.isInstance(obj) == false) {
-            throw new IllegalArgumentException(String.format(DEFAULT_IS_INSTANCE_OF_EX_MESSAGE, type.getName(),
-                    obj == null ? "null" : obj.getClass().getName()));
-        }
-    }
-
-    /**
-     * <p>Validate that the argument is an instance of the specified class; otherwise
-     * throwing an exception with the specified message. This method is useful when
-     * validating according to an arbitrary class</p>
-     *
-     * <pre>Validate.isInstanceOf(OkClass.classs, object, "Wrong class, object is of class %s",
-     *   object.getClass().getName());</pre>
-     *
-     * @param type  the class the object must be validated against, not null
-     * @param obj  the object to check, null throws an exception
-     * @param message  the {@link String#format(String, Object...)} exception message if invalid, not null
-     * @param values  the optional values for the formatted exception message, null array not recommended
-     * @throws IllegalArgumentException if argument is not of specified class
-     * @see #isInstanceOf(Class, Object)
-     *
-     * @since 3.0
-     */
-    public static void isInstanceOf(final Class<?> type, final Object obj, final String message, final Object... values) {
-        // TODO when breaking BC, consider returning obj
-        if (type.isInstance(obj) == false) {
-            throw new IllegalArgumentException(String.format(message, values));
-        }
-    }
-
-    // isAssignableFrom
-    //---------------------------------------------------------------------------------
-
-    /**
-     * Validates that the argument can be converted to the specified class, if not, throws an exception.
-     * 
-     * <p>This method is useful when validating that there will be no casting errors.</p>
-     *
-     * <pre>Validate.isAssignableFrom(SuperClass.class, object.getClass());</pre>
-     *
-     * <p>The message format of the exception is &quot;Cannot assign {type} to {superType}&quot;</p>
-     *
-     * @param superType  the class the class must be validated against, not null
-     * @param type  the class to check, not null
-     * @throws IllegalArgumentException if type argument is not assignable to the specified superType
-     * @see #isAssignableFrom(Class, Class, String, Object...)
-     *
-     * @since 3.0
-     */
-    public static void isAssignableFrom(final Class<?> superType, final Class<?> type) {
-        // TODO when breaking BC, consider returning type
-        if (superType.isAssignableFrom(type) == false) {
-            throw new IllegalArgumentException(String.format(DEFAULT_IS_ASSIGNABLE_EX_MESSAGE, type == null ? "null" : type.getName(),
-                    superType.getName()));
-        }
-    }
-
-    /**
-     * Validates that the argument can be converted to the specified class, if not throws an exception.
-     *  
-     * <p>This method is useful when validating if there will be no casting errors.</p>
-     *
-     * <pre>Validate.isAssignableFrom(SuperClass.class, object.getClass());</pre>
-     *
-     * <p>The message of the exception is &quot;The validated object can not be converted to the&quot;
-     * followed by the name of the class and &quot;class&quot;</p>
-     *
-     * @param superType  the class the class must be validated against, not null
-     * @param type  the class to check, not null
-     * @param message  the {@link String#format(String, Object...)} exception message if invalid, not null
-     * @param values  the optional values for the formatted exception message, null array not recommended
-     * @throws IllegalArgumentException if argument can not be converted to the specified class
-     * @see #isAssignableFrom(Class, Class)
-     */
-    public static void isAssignableFrom(final Class<?> superType, final Class<?> type, final String message, final Object... values) {
-        // TODO when breaking BC, consider returning type
-        if (superType.isAssignableFrom(type) == false) {
-            throw new IllegalArgumentException(String.format(message, values));
-        }
-    }
-}
diff --git a/lang/src/main/java/org/apache/commons/lang3/builder/Builder.java b/lang/src/main/java/org/apache/commons/lang3/builder/Builder.java
deleted file mode 100644
index eeb207d..0000000
--- a/lang/src/main/java/org/apache/commons/lang3/builder/Builder.java
+++ /dev/null
@@ -1,89 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- * 
- *      http://www.apache.org/licenses/LICENSE-2.0
- * 
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.commons.lang3.builder;
-
-/**
- * <p>
- * The Builder interface is designed to designate a class as a <em>builder</em> 
- * object in the Builder design pattern. Builders are capable of creating and 
- * configuring objects or results that normally take multiple steps to construct 
- * or are very complex to derive. 
- * </p>
- * 
- * <p>
- * The builder interface defines a single method, {@link #build()}, that 
- * classes must implement. The result of this method should be the final 
- * configured object or result after all building operations are performed.
- * </p>
- * 
- * <p>
- * It is a recommended practice that the methods supplied to configure the 
- * object or result being built return a reference to {@code this} so that
- * method calls can be chained together.
- * </p>
- * 
- * <p>
- * Example Builder:
- * <pre><code>
- * class FontBuilder implements Builder&lt;Font&gt; {
- *     private Font font;
- *     
- *     public FontBuilder(String fontName) {
- *         this.font = new Font(fontName, Font.PLAIN, 12);
- *     }
- * 
- *     public FontBuilder bold() {
- *         this.font = this.font.deriveFont(Font.BOLD);
- *         return this; // Reference returned so calls can be chained
- *     }
- *     
- *     public FontBuilder size(float pointSize) {
- *         this.font = this.font.deriveFont(pointSize);
- *         return this; // Reference returned so calls can be chained
- *     }
- * 
- *     // Other Font construction methods
- * 
- *     public Font build() {
- *         return this.font;
- *     }
- * }
- * </code></pre>
- * 
- * Example Builder Usage:
- * <pre><code>
- * Font bold14ptSansSerifFont = new FontBuilder(Font.SANS_SERIF).bold()
- *                                                              .size(14.0f)
- *                                                              .build();
- * </code></pre>
- *
- * 
- * @param <T> the type of object that the builder will construct or compute.
- * 
- * @since 3.0
- * @version $Id$
- */
-public interface Builder<T> {
-
-    /**
-     * Returns a reference to the object being constructed or result being 
-     * calculated by the builder.
-     * 
-     * @return the object constructed or result calculated by the builder.
-     */
-    T build();
-}
diff --git a/lang/src/main/java/org/apache/commons/lang3/builder/CompareToBuilder.java b/lang/src/main/java/org/apache/commons/lang3/builder/CompareToBuilder.java
deleted file mode 100644
index 9a8f464..0000000
--- a/lang/src/main/java/org/apache/commons/lang3/builder/CompareToBuilder.java
+++ /dev/null
@@ -1,1029 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- * 
- *      http://www.apache.org/licenses/LICENSE-2.0
- * 
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.commons.lang3.builder;
-
-import java.lang.reflect.AccessibleObject;
-import java.lang.reflect.Field;
-import java.lang.reflect.Modifier;
-import java.util.Collection;
-import java.util.Comparator;
-
-import org.apache.commons.lang3.ArrayUtils;
-
-/** 
- * Assists in implementing {@link java.lang.Comparable#compareTo(Object)} methods.
- *
- * <p>It is consistent with <code>equals(Object)</code> and
- * <code>hashcode()</code> built with {@link EqualsBuilder} and
- * {@link HashCodeBuilder}.</p>
- *
- * <p>Two Objects that compare equal using <code>equals(Object)</code> should normally
- * also compare equal using <code>compareTo(Object)</code>.</p>
- *
- * <p>All relevant fields should be included in the calculation of the
- * comparison. Derived fields may be ignored. The same fields, in the same
- * order, should be used in both <code>compareTo(Object)</code> and
- * <code>equals(Object)</code>.</p>
- *
- * <p>To use this class write code as follows:</p>
- *
- * <pre>
- * public class MyClass {
- *   String field1;
- *   int field2;
- *   boolean field3;
- *
- *   ...
- *
- *   public int compareTo(Object o) {
- *     MyClass myClass = (MyClass) o;
- *     return new CompareToBuilder()
- *       .appendSuper(super.compareTo(o)
- *       .append(this.field1, myClass.field1)
- *       .append(this.field2, myClass.field2)
- *       .append(this.field3, myClass.field3)
- *       .toComparison();
- *   }
- * }
- * </pre>
- * 
- * <p>Values are compared in the order they are appended to the builder. If any comparison returns
- * a non-zero result, then that value will be the result returned by {@code toComparison()} and all
- * subsequent comparisons are skipped.</p>
- *
- * <p>Alternatively, there are {@link #reflectionCompare(Object, Object) reflectionCompare} methods that use
- * reflection to determine the fields to append. Because fields can be private,
- * <code>reflectionCompare</code> uses {@link java.lang.reflect.AccessibleObject#setAccessible(boolean)} to
- * bypass normal access control checks. This will fail under a security manager,
- * unless the appropriate permissions are set up correctly. It is also
- * slower than appending explicitly.</p>
- *
- * <p>A typical implementation of <code>compareTo(Object)</code> using
- * <code>reflectionCompare</code> looks like:</p>
-
- * <pre>
- * public int compareTo(Object o) {
- *   return CompareToBuilder.reflectionCompare(this, o);
- * }
- * </pre>
- * 
- * <p>The reflective methods compare object fields in the order returned by 
- * {@link Class#getDeclaredFields()}. The fields of the class are compared first, followed by those
- * of its parent classes (in order from the bottom to the top of the class hierarchy).</p>
- *
- * @see java.lang.Comparable
- * @see java.lang.Object#equals(Object)
- * @see java.lang.Object#hashCode()
- * @see EqualsBuilder
- * @see HashCodeBuilder
- * @since 1.0
- * @version $Id$
- */
-public class CompareToBuilder implements Builder<Integer> {
-    
-    /**
-     * Current state of the comparison as appended fields are checked.
-     */
-    private int comparison;
-
-    /**
-     * <p>Constructor for CompareToBuilder.</p>
-     *
-     * <p>Starts off assuming that the objects are equal. Multiple calls are 
-     * then made to the various append methods, followed by a call to 
-     * {@link #toComparison} to get the result.</p>
-     */
-    public CompareToBuilder() {
-        super();
-        comparison = 0;
-    }
-
-    //-----------------------------------------------------------------------
-    /** 
-     * <p>Compares two <code>Object</code>s via reflection.</p>
-     *
-     * <p>Fields can be private, thus <code>AccessibleObject.setAccessible</code>
-     * is used to bypass normal access control checks. This will fail under a 
-     * security manager unless the appropriate permissions are set.</p>
-     *
-     * <ul>
-     * <li>Static fields will not be compared</li>
-     * <li>Transient members will be not be compared, as they are likely derived
-     *     fields</li>
-     * <li>Superclass fields will be compared</li>
-     * </ul>
-     *
-     * <p>If both <code>lhs</code> and <code>rhs</code> are <code>null</code>,
-     * they are considered equal.</p>
-     *
-     * @param lhs  left-hand object
-     * @param rhs  right-hand object
-     * @return a negative integer, zero, or a positive integer as <code>lhs</code>
-     *  is less than, equal to, or greater than <code>rhs</code>
-     * @throws NullPointerException  if either (but not both) parameters are
-     *  <code>null</code>
-     * @throws ClassCastException  if <code>rhs</code> is not assignment-compatible
-     *  with <code>lhs</code>
-     */
-    public static int reflectionCompare(final Object lhs, final Object rhs) {
-        return reflectionCompare(lhs, rhs, false, null);
-    }
-
-    /**
-     * <p>Compares two <code>Object</code>s via reflection.</p>
-     *
-     * <p>Fields can be private, thus <code>AccessibleObject.setAccessible</code>
-     * is used to bypass normal access control checks. This will fail under a 
-     * security manager unless the appropriate permissions are set.</p>
-     *
-     * <ul>
-     * <li>Static fields will not be compared</li>
-     * <li>If <code>compareTransients</code> is <code>true</code>,
-     *     compares transient members.  Otherwise ignores them, as they
-     *     are likely derived fields.</li>
-     * <li>Superclass fields will be compared</li>
-     * </ul>
-     *
-     * <p>If both <code>lhs</code> and <code>rhs</code> are <code>null</code>,
-     * they are considered equal.</p>
-     *
-     * @param lhs  left-hand object
-     * @param rhs  right-hand object
-     * @param compareTransients  whether to compare transient fields
-     * @return a negative integer, zero, or a positive integer as <code>lhs</code>
-     *  is less than, equal to, or greater than <code>rhs</code>
-     * @throws NullPointerException  if either <code>lhs</code> or <code>rhs</code>
-     *  (but not both) is <code>null</code>
-     * @throws ClassCastException  if <code>rhs</code> is not assignment-compatible
-     *  with <code>lhs</code>
-     */
-    public static int reflectionCompare(final Object lhs, final Object rhs, final boolean compareTransients) {
-        return reflectionCompare(lhs, rhs, compareTransients, null);
-    }
-
-    /**
-     * <p>Compares two <code>Object</code>s via reflection.</p>
-     *
-     * <p>Fields can be private, thus <code>AccessibleObject.setAccessible</code>
-     * is used to bypass normal access control checks. This will fail under a 
-     * security manager unless the appropriate permissions are set.</p>
-     *
-     * <ul>
-     * <li>Static fields will not be compared</li>
-     * <li>If <code>compareTransients</code> is <code>true</code>,
-     *     compares transient members.  Otherwise ignores them, as they
-     *     are likely derived fields.</li>
-     * <li>Superclass fields will be compared</li>
-     * </ul>
-     *
-     * <p>If both <code>lhs</code> and <code>rhs</code> are <code>null</code>,
-     * they are considered equal.</p>
-     *
-     * @param lhs  left-hand object
-     * @param rhs  right-hand object
-     * @param excludeFields  Collection of String fields to exclude
-     * @return a negative integer, zero, or a positive integer as <code>lhs</code>
-     *  is less than, equal to, or greater than <code>rhs</code>
-     * @throws NullPointerException  if either <code>lhs</code> or <code>rhs</code>
-     *  (but not both) is <code>null</code>
-     * @throws ClassCastException  if <code>rhs</code> is not assignment-compatible
-     *  with <code>lhs</code>
-     * @since 2.2
-     */
-    public static int reflectionCompare(final Object lhs, final Object rhs, final Collection<String> excludeFields) {
-        return reflectionCompare(lhs, rhs, ReflectionToStringBuilder.toNoNullStringArray(excludeFields));
-    }
-
-    /**
-     * <p>Compares two <code>Object</code>s via reflection.</p>
-     *
-     * <p>Fields can be private, thus <code>AccessibleObject.setAccessible</code>
-     * is used to bypass normal access control checks. This will fail under a 
-     * security manager unless the appropriate permissions are set.</p>
-     *
-     * <ul>
-     * <li>Static fields will not be compared</li>
-     * <li>If <code>compareTransients</code> is <code>true</code>,
-     *     compares transient members.  Otherwise ignores them, as they
-     *     are likely derived fields.</li>
-     * <li>Superclass fields will be compared</li>
-     * </ul>
-     *
-     * <p>If both <code>lhs</code> and <code>rhs</code> are <code>null</code>,
-     * they are considered equal.</p>
-     *
-     * @param lhs  left-hand object
-     * @param rhs  right-hand object
-     * @param excludeFields  array of fields to exclude
-     * @return a negative integer, zero, or a positive integer as <code>lhs</code>
-     *  is less than, equal to, or greater than <code>rhs</code>
-     * @throws NullPointerException  if either <code>lhs</code> or <code>rhs</code>
-     *  (but not both) is <code>null</code>
-     * @throws ClassCastException  if <code>rhs</code> is not assignment-compatible
-     *  with <code>lhs</code>
-     * @since 2.2
-     */
-    public static int reflectionCompare(final Object lhs, final Object rhs, final String... excludeFields) {
-        return reflectionCompare(lhs, rhs, false, null, excludeFields);
-    }
-
-    /**
-     * <p>Compares two <code>Object</code>s via reflection.</p>
-     *
-     * <p>Fields can be private, thus <code>AccessibleObject.setAccessible</code>
-     * is used to bypass normal access control checks. This will fail under a 
-     * security manager unless the appropriate permissions are set.</p>
-     *
-     * <ul>
-     * <li>Static fields will not be compared</li>
-     * <li>If the <code>compareTransients</code> is <code>true</code>,
-     *     compares transient members.  Otherwise ignores them, as they
-     *     are likely derived fields.</li>
-     * <li>Compares superclass fields up to and including <code>reflectUpToClass</code>.
-     *     If <code>reflectUpToClass</code> is <code>null</code>, compares all superclass fields.</li>
-     * </ul>
-     *
-     * <p>If both <code>lhs</code> and <code>rhs</code> are <code>null</code>,
-     * they are considered equal.</p>
-     *
-     * @param lhs  left-hand object
-     * @param rhs  right-hand object
-     * @param compareTransients  whether to compare transient fields
-     * @param reflectUpToClass  last superclass for which fields are compared
-     * @param excludeFields  fields to exclude
-     * @return a negative integer, zero, or a positive integer as <code>lhs</code>
-     *  is less than, equal to, or greater than <code>rhs</code>
-     * @throws NullPointerException  if either <code>lhs</code> or <code>rhs</code>
-     *  (but not both) is <code>null</code>
-     * @throws ClassCastException  if <code>rhs</code> is not assignment-compatible
-     *  with <code>lhs</code>
-     * @since 2.2 (2.0 as <code>reflectionCompare(Object, Object, boolean, Class)</code>)
-     */
-    public static int reflectionCompare(
-        final Object lhs, 
-        final Object rhs, 
-        final boolean compareTransients, 
-        final Class<?> reflectUpToClass, 
-        final String... excludeFields) {
-
-        if (lhs == rhs) {
-            return 0;
-        }
-        if (lhs == null || rhs == null) {
-            throw new NullPointerException();
-        }
-        Class<?> lhsClazz = lhs.getClass();
-        if (!lhsClazz.isInstance(rhs)) {
-            throw new ClassCastException();
-        }
-        final CompareToBuilder compareToBuilder = new CompareToBuilder();
-        reflectionAppend(lhs, rhs, lhsClazz, compareToBuilder, compareTransients, excludeFields);
-        while (lhsClazz.getSuperclass() != null && lhsClazz != reflectUpToClass) {
-            lhsClazz = lhsClazz.getSuperclass();
-            reflectionAppend(lhs, rhs, lhsClazz, compareToBuilder, compareTransients, excludeFields);
-        }
-        return compareToBuilder.toComparison();
-    }
-
-    /**
-     * <p>Appends to <code>builder</code> the comparison of <code>lhs</code>
-     * to <code>rhs</code> using the fields defined in <code>clazz</code>.</p>
-     * 
-     * @param lhs  left-hand object
-     * @param rhs  right-hand object
-     * @param clazz  <code>Class</code> that defines fields to be compared
-     * @param builder  <code>CompareToBuilder</code> to append to
-     * @param useTransients  whether to compare transient fields
-     * @param excludeFields  fields to exclude
-     */
-    private static void reflectionAppend(
-        final Object lhs,
-        final Object rhs,
-        final Class<?> clazz,
-        final CompareToBuilder builder,
-        final boolean useTransients,
-        final String[] excludeFields) {
-        
-        final Field[] fields = clazz.getDeclaredFields();
-        AccessibleObject.setAccessible(fields, true);
-        for (int i = 0; i < fields.length && builder.comparison == 0; i++) {
-            final Field f = fields[i];
-            if (!ArrayUtils.contains(excludeFields, f.getName())
-                && (f.getName().indexOf('$') == -1)
-                && (useTransients || !Modifier.isTransient(f.getModifiers()))
-                && (!Modifier.isStatic(f.getModifiers()))) {
-                try {
-                    builder.append(f.get(lhs), f.get(rhs));
-                } catch (final IllegalAccessException e) {
-                    // This can't happen. Would get a Security exception instead.
-                    // Throw a runtime exception in case the impossible happens.
-                    throw new InternalError("Unexpected IllegalAccessException");
-                }
-            }
-        }
-    }
-
-    //-----------------------------------------------------------------------
-    /**
-     * <p>Appends to the <code>builder</code> the <code>compareTo(Object)</code>
-     * result of the superclass.</p>
-     *
-     * @param superCompareTo  result of calling <code>super.compareTo(Object)</code>
-     * @return this - used to chain append calls
-     * @since 2.0
-     */
-    public CompareToBuilder appendSuper(final int superCompareTo) {
-        if (comparison != 0) {
-            return this;
-        }
-        comparison = superCompareTo;
-        return this;
-    }
-    
-    //-----------------------------------------------------------------------
-    /**
-     * <p>Appends to the <code>builder</code> the comparison of
-     * two <code>Object</code>s.</p>
-     *
-     * <ol>
-     * <li>Check if <code>lhs == rhs</code></li>
-     * <li>Check if either <code>lhs</code> or <code>rhs</code> is <code>null</code>,
-     *     a <code>null</code> object is less than a non-<code>null</code> object</li>
-     * <li>Check the object contents</li>
-     * </ol>
-     * 
-     * <p><code>lhs</code> must either be an array or implement {@link Comparable}.</p>
-     *
-     * @param lhs  left-hand object
-     * @param rhs  right-hand object
-     * @return this - used to chain append calls
-     * @throws ClassCastException  if <code>rhs</code> is not assignment-compatible
-     *  with <code>lhs</code>
-     */
-    public CompareToBuilder append(final Object lhs, final Object rhs) {
-        return append(lhs, rhs, null);
-    }
-
-    /**
-     * <p>Appends to the <code>builder</code> the comparison of
-     * two <code>Object</code>s.</p>
-     *
-     * <ol>
-     * <li>Check if <code>lhs == rhs</code></li>
-     * <li>Check if either <code>lhs</code> or <code>rhs</code> is <code>null</code>,
-     *     a <code>null</code> object is less than a non-<code>null</code> object</li>
-     * <li>Check the object contents</li>
-     * </ol>
-     *
-     * <p>If <code>lhs</code> is an array, array comparison methods will be used.
-     * Otherwise <code>comparator</code> will be used to compare the objects.
-     * If <code>comparator</code> is <code>null</code>, <code>lhs</code> must
-     * implement {@link Comparable} instead.</p>
-     *
-     * @param lhs  left-hand object
-     * @param rhs  right-hand object
-     * @param comparator  <code>Comparator</code> used to compare the objects,
-     *  <code>null</code> means treat lhs as <code>Comparable</code>
-     * @return this - used to chain append calls
-     * @throws ClassCastException  if <code>rhs</code> is not assignment-compatible
-     *  with <code>lhs</code>
-     * @since 2.0
-     */
-    public CompareToBuilder append(final Object lhs, final Object rhs, final Comparator<?> comparator) {
-        if (comparison != 0) {
-            return this;
-        }
-        if (lhs == rhs) {
-            return this;
-        }
-        if (lhs == null) {
-            comparison = -1;
-            return this;
-        }
-        if (rhs == null) {
-            comparison = +1;
-            return this;
-        }
-        if (lhs.getClass().isArray()) {
-            // switch on type of array, to dispatch to the correct handler
-            // handles multi dimensional arrays
-            // throws a ClassCastException if rhs is not the correct array type
-            if (lhs instanceof long[]) {
-                append((long[]) lhs, (long[]) rhs);
-            } else if (lhs instanceof int[]) {
-                append((int[]) lhs, (int[]) rhs);
-            } else if (lhs instanceof short[]) {
-                append((short[]) lhs, (short[]) rhs);
-            } else if (lhs instanceof char[]) {
-                append((char[]) lhs, (char[]) rhs);
-            } else if (lhs instanceof byte[]) {
-                append((byte[]) lhs, (byte[]) rhs);
-            } else if (lhs instanceof double[]) {
-                append((double[]) lhs, (double[]) rhs);
-            } else if (lhs instanceof float[]) {
-                append((float[]) lhs, (float[]) rhs);
-            } else if (lhs instanceof boolean[]) {
-                append((boolean[]) lhs, (boolean[]) rhs);
-            } else {
-                // not an array of primitives
-                // throws a ClassCastException if rhs is not an array
-                append((Object[]) lhs, (Object[]) rhs, comparator);
-            }
-        } else {
-            // the simple case, not an array, just test the element
-            if (comparator == null) {
-                @SuppressWarnings("unchecked") // assume this can be done; if not throw CCE as per Javadoc
-                final Comparable<Object> comparable = (Comparable<Object>) lhs;
-                comparison = comparable.compareTo(rhs);
-            } else {
-                @SuppressWarnings("unchecked") // assume this can be done; if not throw CCE as per Javadoc
-                final Comparator<Object> comparator2 = (Comparator<Object>) comparator;
-                comparison = comparator2.compare(lhs, rhs);
-            }
-        }
-        return this;
-    }
-
-    //-------------------------------------------------------------------------
-    /**
-     * Appends to the <code>builder</code> the comparison of
-     * two <code>long</code>s.
-     *
-     * @param lhs  left-hand value
-     * @param rhs  right-hand value
-     * @return this - used to chain append calls
-     */
-    public CompareToBuilder append(final long lhs, final long rhs) {
-        if (comparison != 0) {
-            return this;
-        }
-        comparison = ((lhs < rhs) ? -1 : ((lhs > rhs) ? 1 : 0));
-        return this;
-    }
-
-    /**
-     * Appends to the <code>builder</code> the comparison of
-     * two <code>int</code>s.
-     *
-     * @param lhs  left-hand value
-     * @param rhs  right-hand value
-     * @return this - used to chain append calls
-     */
-    public CompareToBuilder append(final int lhs, final int rhs) {
-        if (comparison != 0) {
-            return this;
-        }
-        comparison = ((lhs < rhs) ? -1 : ((lhs > rhs) ? 1 : 0));
-        return this;
-    }
-
-    /**
-     * Appends to the <code>builder</code> the comparison of
-     * two <code>short</code>s.
-     * 
-     * @param lhs  left-hand value
-     * @param rhs  right-hand value
-     * @return this - used to chain append calls
-     */
-    public CompareToBuilder append(final short lhs, final short rhs) {
-        if (comparison != 0) {
-            return this;
-        }
-        comparison = ((lhs < rhs) ? -1 : ((lhs > rhs) ? 1 : 0));
-        return this;
-    }
-
-    /**
-     * Appends to the <code>builder</code> the comparison of
-     * two <code>char</code>s.
-     *
-     * @param lhs  left-hand value
-     * @param rhs  right-hand value
-     * @return this - used to chain append calls
-     */
-    public CompareToBuilder append(final char lhs, final char rhs) {
-        if (comparison != 0) {
-            return this;
-        }
-        comparison = ((lhs < rhs) ? -1 : ((lhs > rhs) ? 1 : 0));
-        return this;
-    }
-
-    /**
-     * Appends to the <code>builder</code> the comparison of
-     * two <code>byte</code>s.
-     * 
-     * @param lhs  left-hand value
-     * @param rhs  right-hand value
-     * @return this - used to chain append calls
-     */
-    public CompareToBuilder append(final byte lhs, final byte rhs) {
-        if (comparison != 0) {
-            return this;
-        }
-        comparison = ((lhs < rhs) ? -1 : ((lhs > rhs) ? 1 : 0));
-        return this;
-    }
-
-    /**
-     * <p>Appends to the <code>builder</code> the comparison of
-     * two <code>double</code>s.</p>
-     *
-     * <p>This handles NaNs, Infinities, and <code>-0.0</code>.</p>
-     *
-     * <p>It is compatible with the hash code generated by
-     * <code>HashCodeBuilder</code>.</p>
-     *
-     * @param lhs  left-hand value
-     * @param rhs  right-hand value
-     * @return this - used to chain append calls
-     */
-    public CompareToBuilder append(final double lhs, final double rhs) {
-        if (comparison != 0) {
-            return this;
-        }
-        comparison = Double.compare(lhs, rhs);
-        return this;
-    }
-
-    /**
-     * <p>Appends to the <code>builder</code> the comparison of
-     * two <code>float</code>s.</p>
-     *
-     * <p>This handles NaNs, Infinities, and <code>-0.0</code>.</p>
-     *
-     * <p>It is compatible with the hash code generated by
-     * <code>HashCodeBuilder</code>.</p>
-     *
-     * @param lhs  left-hand value
-     * @param rhs  right-hand value
-     * @return this - used to chain append calls
-     */
-    public CompareToBuilder append(final float lhs, final float rhs) {
-        if (comparison != 0) {
-            return this;
-        }
-        comparison = Float.compare(lhs, rhs);
-        return this;
-    }
-
-    /**
-     * Appends to the <code>builder</code> the comparison of
-     * two <code>booleans</code>s.
-     *
-     * @param lhs  left-hand value
-     * @param rhs  right-hand value
-     * @return this - used to chain append calls
-      */
-    public CompareToBuilder append(final boolean lhs, final boolean rhs) {
-        if (comparison != 0) {
-            return this;
-        }
-        if (lhs == rhs) {
-            return this;
-        }
-        if (lhs == false) {
-            comparison = -1;
-        } else {
-            comparison = +1;
-        }
-        return this;
-    }
-
-    //-----------------------------------------------------------------------
-    /**
-     * <p>Appends to the <code>builder</code> the deep comparison of
-     * two <code>Object</code> arrays.</p>
-     *
-     * <ol>
-     *  <li>Check if arrays are the same using <code>==</code></li>
-     *  <li>Check if for <code>null</code>, <code>null</code> is less than non-<code>null</code></li>
-     *  <li>Check array length, a short length array is less than a long length array</li>
-     *  <li>Check array contents element by element using {@link #append(Object, Object, Comparator)}</li>
-     * </ol>
-     *
-     * <p>This method will also will be called for the top level of multi-dimensional,
-     * ragged, and multi-typed arrays.</p>
-     *
-     * @param lhs  left-hand array
-     * @param rhs  right-hand array
-     * @return this - used to chain append calls
-     * @throws ClassCastException  if <code>rhs</code> is not assignment-compatible
-     *  with <code>lhs</code>
-     */
-    public CompareToBuilder append(final Object[] lhs, final Object[] rhs) {
-        return append(lhs, rhs, null);
-    }
-    
-    /**
-     * <p>Appends to the <code>builder</code> the deep comparison of
-     * two <code>Object</code> arrays.</p>
-     *
-     * <ol>
-     *  <li>Check if arrays are the same using <code>==</code></li>
-     *  <li>Check if for <code>null</code>, <code>null</code> is less than non-<code>null</code></li>
-     *  <li>Check array length, a short length array is less than a long length array</li>
-     *  <li>Check array contents element by element using {@link #append(Object, Object, Comparator)}</li>
-     * </ol>
-     *
-     * <p>This method will also will be called for the top level of multi-dimensional,
-     * ragged, and multi-typed arrays.</p>
-     *
-     * @param lhs  left-hand array
-     * @param rhs  right-hand array
-     * @param comparator  <code>Comparator</code> to use to compare the array elements,
-     *  <code>null</code> means to treat <code>lhs</code> elements as <code>Comparable</code>.
-     * @return this - used to chain append calls
-     * @throws ClassCastException  if <code>rhs</code> is not assignment-compatible
-     *  with <code>lhs</code>
-     * @since 2.0
-     */
-    public CompareToBuilder append(final Object[] lhs, final Object[] rhs, final Comparator<?> comparator) {
-        if (comparison != 0) {
-            return this;
-        }
-        if (lhs == rhs) {
-            return this;
-        }
-        if (lhs == null) {
-            comparison = -1;
-            return this;
-        }
-        if (rhs == null) {
-            comparison = +1;
-            return this;
-        }
-        if (lhs.length != rhs.length) {
-            comparison = (lhs.length < rhs.length) ? -1 : +1;
-            return this;
-        }
-        for (int i = 0; i < lhs.length && comparison == 0; i++) {
-            append(lhs[i], rhs[i], comparator);
-        }
-        return this;
-    }
-
-    /**
-     * <p>Appends to the <code>builder</code> the deep comparison of
-     * two <code>long</code> arrays.</p>
-     *
-     * <ol>
-     *  <li>Check if arrays are the same using <code>==</code></li>
-     *  <li>Check if for <code>null</code>, <code>null</code> is less than non-<code>null</code></li>
-     *  <li>Check array length, a shorter length array is less than a longer length array</li>
-     *  <li>Check array contents element by element using {@link #append(long, long)}</li>
-     * </ol>
-     *
-     * @param lhs  left-hand array
-     * @param rhs  right-hand array
-     * @return this - used to chain append calls
-     */
-    public CompareToBuilder append(final long[] lhs, final long[] rhs) {
-        if (comparison != 0) {
-            return this;
-        }
-        if (lhs == rhs) {
-            return this;
-        }
-        if (lhs == null) {
-            comparison = -1;
-            return this;
-        }
-        if (rhs == null) {
-            comparison = +1;
-            return this;
-        }
-        if (lhs.length != rhs.length) {
-            comparison = (lhs.length < rhs.length) ? -1 : +1;
-            return this;
-        }
-        for (int i = 0; i < lhs.length && comparison == 0; i++) {
-            append(lhs[i], rhs[i]);
-        }
-        return this;
-    }
-
-    /**
-     * <p>Appends to the <code>builder</code> the deep comparison of
-     * two <code>int</code> arrays.</p>
-     *
-     * <ol>
-     *  <li>Check if arrays are the same using <code>==</code></li>
-     *  <li>Check if for <code>null</code>, <code>null</code> is less than non-<code>null</code></li>
-     *  <li>Check array length, a shorter length array is less than a longer length array</li>
-     *  <li>Check array contents element by element using {@link #append(int, int)}</li>
-     * </ol>
-     *
-     * @param lhs  left-hand array
-     * @param rhs  right-hand array
-     * @return this - used to chain append calls
-     */
-    public CompareToBuilder append(final int[] lhs, final int[] rhs) {
-        if (comparison != 0) {
-            return this;
-        }
-        if (lhs == rhs) {
-            return this;
-        }
-        if (lhs == null) {
-            comparison = -1;
-            return this;
-        }
-        if (rhs == null) {
-            comparison = +1;
-            return this;
-        }
-        if (lhs.length != rhs.length) {
-            comparison = (lhs.length < rhs.length) ? -1 : +1;
-            return this;
-        }
-        for (int i = 0; i < lhs.length && comparison == 0; i++) {
-            append(lhs[i], rhs[i]);
-        }
-        return this;
-    }
-
-    /**
-     * <p>Appends to the <code>builder</code> the deep comparison of
-     * two <code>short</code> arrays.</p>
-     *
-     * <ol>
-     *  <li>Check if arrays are the same using <code>==</code></li>
-     *  <li>Check if for <code>null</code>, <code>null</code> is less than non-<code>null</code></li>
-     *  <li>Check array length, a shorter length array is less than a longer length array</li>
-     *  <li>Check array contents element by element using {@link #append(short, short)}</li>
-     * </ol>
-     *
-     * @param lhs  left-hand array
-     * @param rhs  right-hand array
-     * @return this - used to chain append calls
-     */
-    public CompareToBuilder append(final short[] lhs, final short[] rhs) {
-        if (comparison != 0) {
-            return this;
-        }
-        if (lhs == rhs) {
-            return this;
-        }
-        if (lhs == null) {
-            comparison = -1;
-            return this;
-        }
-        if (rhs == null) {
-            comparison = +1;
-            return this;
-        }
-        if (lhs.length != rhs.length) {
-            comparison = (lhs.length < rhs.length) ? -1 : +1;
-            return this;
-        }
-        for (int i = 0; i < lhs.length && comparison == 0; i++) {
-            append(lhs[i], rhs[i]);
-        }
-        return this;
-    }
-
-    /**
-     * <p>Appends to the <code>builder</code> the deep comparison of
-     * two <code>char</code> arrays.</p>
-     *
-     * <ol>
-     *  <li>Check if arrays are the same using <code>==</code></li>
-     *  <li>Check if for <code>null</code>, <code>null</code> is less than non-<code>null</code></li>
-     *  <li>Check array length, a shorter length array is less than a longer length array</li>
-     *  <li>Check array contents element by element using {@link #append(char, char)}</li>
-     * </ol>
-     *
-     * @param lhs  left-hand array
-     * @param rhs  right-hand array
-     * @return this - used to chain append calls
-     */
-    public CompareToBuilder append(final char[] lhs, final char[] rhs) {
-        if (comparison != 0) {
-            return this;
-        }
-        if (lhs == rhs) {
-            return this;
-        }
-        if (lhs == null) {
-            comparison = -1;
-            return this;
-        }
-        if (rhs == null) {
-            comparison = +1;
-            return this;
-        }
-        if (lhs.length != rhs.length) {
-            comparison = (lhs.length < rhs.length) ? -1 : +1;
-            return this;
-        }
-        for (int i = 0; i < lhs.length && comparison == 0; i++) {
-            append(lhs[i], rhs[i]);
-        }
-        return this;
-    }
-
-    /**
-     * <p>Appends to the <code>builder</code> the deep comparison of
-     * two <code>byte</code> arrays.</p>
-     *
-     * <ol>
-     *  <li>Check if arrays are the same using <code>==</code></li>
-     *  <li>Check if for <code>null</code>, <code>null</code> is less than non-<code>null</code></li>
-     *  <li>Check array length, a shorter length array is less than a longer length array</li>
-     *  <li>Check array contents element by element using {@link #append(byte, byte)}</li>
-     * </ol>
-     *
-     * @param lhs  left-hand array
-     * @param rhs  right-hand array
-     * @return this - used to chain append calls
-     */
-    public CompareToBuilder append(final byte[] lhs, final byte[] rhs) {
-        if (comparison != 0) {
-            return this;
-        }
-        if (lhs == rhs) {
-            return this;
-        }
-        if (lhs == null) {
-            comparison = -1;
-            return this;
-        }
-        if (rhs == null) {
-            comparison = +1;
-            return this;
-        }
-        if (lhs.length != rhs.length) {
-            comparison = (lhs.length < rhs.length) ? -1 : +1;
-            return this;
-        }
-        for (int i = 0; i < lhs.length && comparison == 0; i++) {
-            append(lhs[i], rhs[i]);
-        }
-        return this;
-    }
-
-    /**
-     * <p>Appends to the <code>builder</code> the deep comparison of
-     * two <code>double</code> arrays.</p>
-     *
-     * <ol>
-     *  <li>Check if arrays are the same using <code>==</code></li>
-     *  <li>Check if for <code>null</code>, <code>null</code> is less than non-<code>null</code></li>
-     *  <li>Check array length, a shorter length array is less than a longer length array</li>
-     *  <li>Check array contents element by element using {@link #append(double, double)}</li>
-     * </ol>
-     *
-     * @param lhs  left-hand array
-     * @param rhs  right-hand array
-     * @return this - used to chain append calls
-     */
-    public CompareToBuilder append(final double[] lhs, final double[] rhs) {
-        if (comparison != 0) {
-            return this;
-        }
-        if (lhs == rhs) {
-            return this;
-        }
-        if (lhs == null) {
-            comparison = -1;
-            return this;
-        }
-        if (rhs == null) {
-            comparison = +1;
-            return this;
-        }
-        if (lhs.length != rhs.length) {
-            comparison = (lhs.length < rhs.length) ? -1 : +1;
-            return this;
-        }
-        for (int i = 0; i < lhs.length && comparison == 0; i++) {
-            append(lhs[i], rhs[i]);
-        }
-        return this;
-    }
-
-    /**
-     * <p>Appends to the <code>builder</code> the deep comparison of
-     * two <code>float</code> arrays.</p>
-     *
-     * <ol>
-     *  <li>Check if arrays are the same using <code>==</code></li>
-     *  <li>Check if for <code>null</code>, <code>null</code> is less than non-<code>null</code></li>
-     *  <li>Check array length, a shorter length array is less than a longer length array</li>
-     *  <li>Check array contents element by element using {@link #append(float, float)}</li>
-     * </ol>
-     *
-     * @param lhs  left-hand array
-     * @param rhs  right-hand array
-     * @return this - used to chain append calls
-     */
-    public CompareToBuilder append(final float[] lhs, final float[] rhs) {
-        if (comparison != 0) {
-            return this;
-        }
-        if (lhs == rhs) {
-            return this;
-        }
-        if (lhs == null) {
-            comparison = -1;
-            return this;
-        }
-        if (rhs == null) {
-            comparison = +1;
-            return this;
-        }
-        if (lhs.length != rhs.length) {
-            comparison = (lhs.length < rhs.length) ? -1 : +1;
-            return this;
-        }
-        for (int i = 0; i < lhs.length && comparison == 0; i++) {
-            append(lhs[i], rhs[i]);
-        }
-        return this;
-    }
-
-    /**
-     * <p>Appends to the <code>builder</code> the deep comparison of
-     * two <code>boolean</code> arrays.</p>
-     *
-     * <ol>
-     *  <li>Check if arrays are the same using <code>==</code></li>
-     *  <li>Check if for <code>null</code>, <code>null</code> is less than non-<code>null</code></li>
-     *  <li>Check array length, a shorter length array is less than a longer length array</li>
-     *  <li>Check array contents element by element using {@link #append(boolean, boolean)}</li>
-     * </ol>
-     *
-     * @param lhs  left-hand array
-     * @param rhs  right-hand array
-     * @return this - used to chain append calls
-     */
-    public CompareToBuilder append(final boolean[] lhs, final boolean[] rhs) {
-        if (comparison != 0) {
-            return this;
-        }
-        if (lhs == rhs) {
-            return this;
-        }
-        if (lhs == null) {
-            comparison = -1;
-            return this;
-        }
-        if (rhs == null) {
-            comparison = +1;
-            return this;
-        }
-        if (lhs.length != rhs.length) {
-            comparison = (lhs.length < rhs.length) ? -1 : +1;
-            return this;
-        }
-        for (int i = 0; i < lhs.length && comparison == 0; i++) {
-            append(lhs[i], rhs[i]);
-        }
-        return this;
-    }
-
-    //-----------------------------------------------------------------------
-    /**
-     * Returns a negative integer, a positive integer, or zero as
-     * the <code>builder</code> has judged the "left-hand" side
-     * as less than, greater than, or equal to the "right-hand"
-     * side.
-     * 
-     * @return final comparison result
-     * @see #build()
-     */
-    public int toComparison() {
-        return comparison;
-    }
-
-    /**
-     * Returns a negative Integer, a positive Integer, or zero as
-     * the <code>builder</code> has judged the "left-hand" side
-     * as less than, greater than, or equal to the "right-hand"
-     * side.
-     * 
-     * @return final comparison result as an Integer
-     * @see #toComparison()
-     * @since 3.0
-     */
-    @Override
-    public Integer build() {
-        return Integer.valueOf(toComparison());
-    }
-}
-
diff --git a/lang/src/main/java/org/apache/commons/lang3/builder/Diff.java b/lang/src/main/java/org/apache/commons/lang3/builder/Diff.java
deleted file mode 100644
index 7d3f28d..0000000
--- a/lang/src/main/java/org/apache/commons/lang3/builder/Diff.java
+++ /dev/null
@@ -1,118 +0,0 @@
-/**
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.commons.lang3.builder;
-
-import java.lang.reflect.Type;
-
-import org.apache.commons.lang3.ObjectUtils;
-import org.apache.commons.lang3.reflect.TypeUtils;
-import org.apache.commons.lang3.tuple.Pair;
-
-/**
- * <p>
- * A {@code Diff} contains the differences between two {@link Diffable} class
- * fields.
- * </p>
- * 
- * <p>
- * Typically, {@code Diff}s are retrieved by using a {@link DiffBuilder} to
- * produce a {@link DiffResult}, containing the differences between two objects.
- * </p>
- * 
- * 
- * @param <T>
- *            The type of object contained within this {@code Diff}. Differences
- *            between primitive objects are stored as their Object wrapper
- *            equivalent.
- * @since 3.3
- * @version $Id$
- */
-public abstract class Diff<T> extends Pair<T, T> {
-
-    private static final long serialVersionUID = 1L;
-
-    private final Type type;
-    private final String fieldName;
-
-    /**
-     * <p>
-     * Constructs a new {@code Diff} for the given field name.
-     * </p>
-     * 
-     * @param fieldName
-     *            the name of the field
-     */
-    protected Diff(final String fieldName) {
-        this.type = ObjectUtils.defaultIfNull(
-                TypeUtils.getTypeArguments(getClass(), Diff.class).get(
-                        Diff.class.getTypeParameters()[0]), Object.class);
-        this.fieldName = fieldName;
-    }
-
-    /**
-     * <p>
-     * Returns the type of the field.
-     * </p>
-     * 
-     * @return the field type
-     */
-    public final Type getType() {
-        return type;
-    }
-
-    /**
-     * <p>
-     * Returns the name of the field.
-     * </p>
-     * 
-     * @return the field name
-     */
-    public final String getFieldName() {
-        return fieldName;
-    }
-
-    /**
-     * <p>
-     * Returns a {@code String} representation of the {@code Diff}, with the
-     * following format:</p>
-     * 
-     * <pre>
-     * [fieldname: left-value, right-value]
-     * </pre>
-     * 
-     * 
-     * @return the string representation
-     */
-    @Override
-    public final String toString() {
-        return String.format("[%s: %s, %s]", fieldName, getLeft(), getRight());
-    }
-
-    /**
-     * <p>
-     * Throws {@code UnsupportedOperationException}.
-     * </p>
-     * 
-     * @param value
-     *            ignored
-     * @return nothing
-     */
-    @Override
-    public final T setValue(final T value) {
-        throw new UnsupportedOperationException("Cannot alter Diff object.");
-    }
-}
diff --git a/lang/src/main/java/org/apache/commons/lang3/builder/DiffBuilder.java b/lang/src/main/java/org/apache/commons/lang3/builder/DiffBuilder.java
deleted file mode 100644
index e4f4ed0..0000000
--- a/lang/src/main/java/org/apache/commons/lang3/builder/DiffBuilder.java
+++ /dev/null
@@ -1,958 +0,0 @@
-/**
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.commons.lang3.builder;
-
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.List;
-
-import org.apache.commons.lang3.ArrayUtils;
-
-/**
- * <p>
- * Assists in implementing {@link Diffable#diff(Object)} methods.
- * </p>
- * 
- * <p>
- * To use this class, write code as follows:
- * </p>
- * 
- * <pre>
- * public class Person implements Diffable&lt;Person&gt; {
- *   String name;
- *   int age;
- *   boolean smoker;
- *   
- *   ...
- *   
- *   public DiffResult diff(Person obj) {
- *     // No need for null check, as NullPointerException correct if obj is null
- *     return new DiffBuilder(this, obj, ToStringStyle.SHORT_PREFIX_STYLE)
- *       .append("name", this.name, obj.name)
- *       .append("age", this.age, obj.age)
- *       .append("smoker", this.smoker, obj.smoker)
- *       .build();
- *   }
- * }
- * </pre>
- * 
- * <p>
- * The {@code ToStringStyle} passed to the constructor is embedded in the
- * returned {@code DiffResult} and influences the style of the
- * {@code DiffResult.toString()} method. This style choice can be overridden by
- * calling {@link DiffResult#toString(ToStringStyle)}.
- * </p>
- * 
- * @since 3.3
- * @version $Id$
- * @see Diffable
- * @see Diff
- * @see DiffResult
- * @see ToStringStyle
- */
-public class DiffBuilder implements Builder<DiffResult> {
-
-    private final List<Diff<?>> diffs;
-    private final boolean objectsTriviallyEqual;
-    private final Object left;
-    private final Object right;
-    private final ToStringStyle style;
-
-    /**
-     * <p>
-     * Constructs a builder for the specified objects with the specified style.
-     * </p>
-     * 
-     * <p>
-     * If {@code lhs == rhs} or {@code lhs.equals(rhs)} then the builder will
-     * not evaluate any calls to {@code append(...)} and will return an empty
-     * {@link DiffResult} when {@link #build()} is executed.
-     * </p>
-     * 
-     * @param lhs
-     *            {@code this} object
-     * @param rhs
-     *            the object to diff against
-     * @param style
-     *            the style will use when outputting the objects, {@code null}
-     *            uses the default
-     * @param testTriviallyEqual
-     *            If true, this will test if lhs and rhs are the same or equal.
-     *            All of the append(fieldName, lhs, rhs) methods will abort
-     *            without creating a field {@link Diff} if the trivially equal
-     *            test is enabled and returns true.  The result of this test
-     *            is never changed throughout the life of this {@link DiffBuilder}.
-     * @throws IllegalArgumentException
-     *             if {@code lhs} or {@code rhs} is {@code null}
-     * @since 3.4
-     */
-    public DiffBuilder(final Object lhs, final Object rhs,
-            final ToStringStyle style, final boolean testTriviallyEqual) {
-
-        if (lhs == null) {
-            throw new IllegalArgumentException("lhs cannot be null");
-        }
-        if (rhs == null) {
-            throw new IllegalArgumentException("rhs cannot be null");
-        }
-
-        this.diffs = new ArrayList<Diff<?>>();
-        this.left = lhs;
-        this.right = rhs;
-        this.style = style;
-
-        // Don't compare any fields if objects equal
-        this.objectsTriviallyEqual = testTriviallyEqual && (lhs == rhs || lhs.equals(rhs));
-    }
-
-    /**
-     * <p>
-     * Constructs a builder for the specified objects with the specified style.
-     * </p>
-     * 
-     * <p>
-     * If {@code lhs == rhs} or {@code lhs.equals(rhs)} then the builder will
-     * not evaluate any calls to {@code append(...)} and will return an empty
-     * {@link DiffResult} when {@link #build()} is executed.
-     * </p>
-     * 
-     * <p>
-     * This delegates to {@link #DiffBuilder(Object, Object, ToStringStyle, boolean)}
-     * with the testTriviallyEqual flag enabled.
-     * </p>
-     *
-     * @param lhs
-     *            {@code this} object
-     * @param rhs
-     *            the object to diff against
-     * @param style
-     *            the style will use when outputting the objects, {@code null}
-     *            uses the default
-     * @throws IllegalArgumentException
-     *             if {@code lhs} or {@code rhs} is {@code null}
-     */
-    public DiffBuilder(final Object lhs, final Object rhs,
-            final ToStringStyle style) {
-
-            this(lhs, rhs, style, true);
-    }
-
-    /**
-     * <p>
-     * Test if two {@code boolean}s are equal.
-     * </p>
-     * 
-     * @param fieldName
-     *            the field name
-     * @param lhs
-     *            the left hand {@code boolean}
-     * @param rhs
-     *            the right hand {@code boolean}
-     * @return this
-     * @throws IllegalArgumentException
-     *             if field name is {@code null}
-     */
-    public DiffBuilder append(final String fieldName, final boolean lhs,
-            final boolean rhs) {
-        if (fieldName == null) {
-            throw new IllegalArgumentException("Field name cannot be null");
-        }
-
-        if (objectsTriviallyEqual) {
-            return this;
-        }
-        if (lhs != rhs) {
-            diffs.add(new Diff<Boolean>(fieldName) {
-                private static final long serialVersionUID = 1L;
-
-                @Override
-                public Boolean getLeft() {
-                    return Boolean.valueOf(lhs);
-                }
-
-                @Override
-                public Boolean getRight() {
-                    return Boolean.valueOf(rhs);
-                }
-            });
-        }
-        return this;
-    }
-
-    /**
-     * <p>
-     * Test if two {@code boolean[]}s are equal.
-     * </p>
-     * 
-     * @param fieldName
-     *            the field name
-     * @param lhs
-     *            the left hand {@code boolean[]}
-     * @param rhs
-     *            the right hand {@code boolean[]}
-     * @return this
-     * @throws IllegalArgumentException
-     *             if field name is {@code null}
-     */
-    public DiffBuilder append(final String fieldName, final boolean[] lhs,
-            final boolean[] rhs) {
-        if (fieldName == null) {
-            throw new IllegalArgumentException("Field name cannot be null");
-        }
-        if (objectsTriviallyEqual) {
-            return this;
-        }
-        if (!Arrays.equals(lhs, rhs)) {
-            diffs.add(new Diff<Boolean[]>(fieldName) {
-                private static final long serialVersionUID = 1L;
-
-                @Override
-                public Boolean[] getLeft() {
-                    return ArrayUtils.toObject(lhs);
-                }
-
-                @Override
-                public Boolean[] getRight() {
-                    return ArrayUtils.toObject(rhs);
-                }
-            });
-        }
-        return this;
-    }
-
-    /**
-     * <p>
-     * Test if two {@code byte}s are equal.
-     * </p>
-     * 
-     * @param fieldName
-     *            the field name
-     * @param lhs
-     *            the left hand {@code byte}
-     * @param rhs
-     *            the right hand {@code byte}
-     * @return this
-     * @throws IllegalArgumentException
-     *             if field name is {@code null}
-     */
-    public DiffBuilder append(final String fieldName, final byte lhs,
-            final byte rhs) {
-        if (fieldName == null) {
-            throw new IllegalArgumentException("Field name cannot be null");
-        }
-        if (objectsTriviallyEqual) {
-            return this;
-        }
-        if (lhs != rhs) {
-            diffs.add(new Diff<Byte>(fieldName) {
-                private static final long serialVersionUID = 1L;
-
-                @Override
-                public Byte getLeft() {
-                    return Byte.valueOf(lhs);
-                }
-
-                @Override
-                public Byte getRight() {
-                    return Byte.valueOf(rhs);
-                }
-            });
-        }
-        return this;
-    }
-
-    /**
-     * <p>
-     * Test if two {@code byte[]}s are equal.
-     * </p>
-     * 
-     * @param fieldName
-     *            the field name
-     * @param lhs
-     *            the left hand {@code byte[]}
-     * @param rhs
-     *            the right hand {@code byte[]}
-     * @return this
-     * @throws IllegalArgumentException
-     *             if field name is {@code null}
-     */
-    public DiffBuilder append(final String fieldName, final byte[] lhs,
-            final byte[] rhs) {
-        if (fieldName == null) {
-            throw new IllegalArgumentException("Field name cannot be null");
-        }
-
-        if (objectsTriviallyEqual) {
-            return this;
-        }
-        if (!Arrays.equals(lhs, rhs)) {
-            diffs.add(new Diff<Byte[]>(fieldName) {
-                private static final long serialVersionUID = 1L;
-
-                @Override
-                public Byte[] getLeft() {
-                    return ArrayUtils.toObject(lhs);
-                }
-
-                @Override
-                public Byte[] getRight() {
-                    return ArrayUtils.toObject(rhs);
-                }
-            });
-        }
-        return this;
-    }
-
-    /**
-     * <p>
-     * Test if two {@code char}s are equal.
-     * </p>
-     * 
-     * @param fieldName
-     *            the field name
-     * @param lhs
-     *            the left hand {@code char}
-     * @param rhs
-     *            the right hand {@code char}
-     * @return this
-     * @throws IllegalArgumentException
-     *             if field name is {@code null}
-     */
-    public DiffBuilder append(final String fieldName, final char lhs,
-            final char rhs) {
-        if (fieldName == null) {
-            throw new IllegalArgumentException("Field name cannot be null");
-        }
-
-        if (objectsTriviallyEqual) {
-            return this;
-        }
-        if (lhs != rhs) {
-            diffs.add(new Diff<Character>(fieldName) {
-                private static final long serialVersionUID = 1L;
-
-                @Override
-                public Character getLeft() {
-                    return Character.valueOf(lhs);
-                }
-
-                @Override
-                public Character getRight() {
-                    return Character.valueOf(rhs);
-                }
-            });
-        }
-        return this;
-    }
-
-    /**
-     * <p>
-     * Test if two {@code char[]}s are equal.
-     * </p>
-     * 
-     * @param fieldName
-     *            the field name
-     * @param lhs
-     *            the left hand {@code char[]}
-     * @param rhs
-     *            the right hand {@code char[]}
-     * @return this
-     * @throws IllegalArgumentException
-     *             if field name is {@code null}
-     */
-    public DiffBuilder append(final String fieldName, final char[] lhs,
-            final char[] rhs) {
-        if (fieldName == null) {
-            throw new IllegalArgumentException("Field name cannot be null");
-        }
-
-        if (objectsTriviallyEqual) {
-            return this;
-        }
-        if (!Arrays.equals(lhs, rhs)) {
-            diffs.add(new Diff<Character[]>(fieldName) {
-                private static final long serialVersionUID = 1L;
-
-                @Override
-                public Character[] getLeft() {
-                    return ArrayUtils.toObject(lhs);
-                }
-
-                @Override
-                public Character[] getRight() {
-                    return ArrayUtils.toObject(rhs);
-                }
-            });
-        }
-        return this;
-    }
-
-    /**
-     * <p>
-     * Test if two {@code double}s are equal.
-     * </p>
-     * 
-     * @param fieldName
-     *            the field name
-     * @param lhs
-     *            the left hand {@code double}
-     * @param rhs
-     *            the right hand {@code double}
-     * @return this
-     * @throws IllegalArgumentException
-     *             if field name is {@code null}
-     */
-    public DiffBuilder append(final String fieldName, final double lhs,
-            final double rhs) {
-        if (fieldName == null) {
-            throw new IllegalArgumentException("Field name cannot be null");
-        }
-
-        if (objectsTriviallyEqual) {
-            return this;
-        }
-        if (Double.doubleToLongBits(lhs) != Double.doubleToLongBits(rhs)) {
-            diffs.add(new Diff<Double>(fieldName) {
-                private static final long serialVersionUID = 1L;
-
-                @Override
-                public Double getLeft() {
-                    return Double.valueOf(lhs);
-                }
-
-                @Override
-                public Double getRight() {
-                    return Double.valueOf(rhs);
-                }
-            });
-        }
-        return this;
-    }
-
-    /**
-     * <p>
-     * Test if two {@code double[]}s are equal.
-     * </p>
-     * 
-     * @param fieldName
-     *            the field name
-     * @param lhs
-     *            the left hand {@code double[]}
-     * @param rhs
-     *            the right hand {@code double[]}
-     * @return this
-     * @throws IllegalArgumentException
-     *             if field name is {@code null}
-     */
-    public DiffBuilder append(final String fieldName, final double[] lhs,
-            final double[] rhs) {
-        if (fieldName == null) {
-            throw new IllegalArgumentException("Field name cannot be null");
-        }
-
-        if (objectsTriviallyEqual) {
-            return this;
-        }
-        if (!Arrays.equals(lhs, rhs)) {
-            diffs.add(new Diff<Double[]>(fieldName) {
-                private static final long serialVersionUID = 1L;
-
-                @Override
-                public Double[] getLeft() {
-                    return ArrayUtils.toObject(lhs);
-                }
-
-                @Override
-                public Double[] getRight() {
-                    return ArrayUtils.toObject(rhs);
-                }
-            });
-        }
-        return this;
-    }
-
-    /**
-     * <p>
-     * Test if two {@code float}s are equal.
-     * </p>
-     * 
-     * @param fieldName
-     *            the field name
-     * @param lhs
-     *            the left hand {@code float}
-     * @param rhs
-     *            the right hand {@code float}
-     * @return this
-     * @throws IllegalArgumentException
-     *             if field name is {@code null}
-     */
-    public DiffBuilder append(final String fieldName, final float lhs,
-            final float rhs) {
-        if (fieldName == null) {
-            throw new IllegalArgumentException("Field name cannot be null");
-        }
-
-        if (objectsTriviallyEqual) {
-            return this;
-        }
-        if (Float.floatToIntBits(lhs) != Float.floatToIntBits(rhs)) {
-            diffs.add(new Diff<Float>(fieldName) {
-                private static final long serialVersionUID = 1L;
-
-                @Override
-                public Float getLeft() {
-                    return Float.valueOf(lhs);
-                }
-
-                @Override
-                public Float getRight() {
-                    return Float.valueOf(rhs);
-                }
-            });
-        }
-        return this;
-    }
-
-    /**
-     * <p>
-     * Test if two {@code float[]}s are equal.
-     * </p>
-     * 
-     * @param fieldName
-     *            the field name
-     * @param lhs
-     *            the left hand {@code float[]}
-     * @param rhs
-     *            the right hand {@code float[]}
-     * @return this
-     * @throws IllegalArgumentException
-     *             if field name is {@code null}
-     */
-    public DiffBuilder append(final String fieldName, final float[] lhs,
-            final float[] rhs) {
-        if (fieldName == null) {
-            throw new IllegalArgumentException("Field name cannot be null");
-        }
-
-        if (objectsTriviallyEqual) {
-            return this;
-        }
-        if (!Arrays.equals(lhs, rhs)) {
-            diffs.add(new Diff<Float[]>(fieldName) {
-                private static final long serialVersionUID = 1L;
-
-                @Override
-                public Float[] getLeft() {
-                    return ArrayUtils.toObject(lhs);
-                }
-
-                @Override
-                public Float[] getRight() {
-                    return ArrayUtils.toObject(rhs);
-                }
-            });
-        }
-        return this;
-    }
-
-    /**
-     * <p>
-     * Test if two {@code int}s are equal.
-     * </p>
-     * 
-     * @param fieldName
-     *            the field name
-     * @param lhs
-     *            the left hand {@code int}
-     * @param rhs
-     *            the right hand {@code int}
-     * @return this
-     * @throws IllegalArgumentException
-     *             if field name is {@code null}
-     */
-    public DiffBuilder append(final String fieldName, final int lhs,
-            final int rhs) {
-        if (fieldName == null) {
-            throw new IllegalArgumentException("Field name cannot be null");
-        }
-
-        if (objectsTriviallyEqual) {
-            return this;
-        }
-        if (lhs != rhs) {
-            diffs.add(new Diff<Integer>(fieldName) {
-                private static final long serialVersionUID = 1L;
-
-                @Override
-                public Integer getLeft() {
-                    return Integer.valueOf(lhs);
-                }
-
-                @Override
-                public Integer getRight() {
-                    return Integer.valueOf(rhs);
-                }
-            });
-        }
-        return this;
-    }
-
-    /**
-     * <p>
-     * Test if two {@code int[]}s are equal.
-     * </p>
-     * 
-     * @param fieldName
-     *            the field name
-     * @param lhs
-     *            the left hand {@code int[]}
-     * @param rhs
-     *            the right hand {@code int[]}
-     * @return this
-     * @throws IllegalArgumentException
-     *             if field name is {@code null}
-     */
-    public DiffBuilder append(final String fieldName, final int[] lhs,
-            final int[] rhs) {
-        if (fieldName == null) {
-            throw new IllegalArgumentException("Field name cannot be null");
-        }
-
-        if (objectsTriviallyEqual) {
-            return this;
-        }
-        if (!Arrays.equals(lhs, rhs)) {
-            diffs.add(new Diff<Integer[]>(fieldName) {
-                private static final long serialVersionUID = 1L;
-
-                @Override
-                public Integer[] getLeft() {
-                    return ArrayUtils.toObject(lhs);
-                }
-
-                @Override
-                public Integer[] getRight() {
-                    return ArrayUtils.toObject(rhs);
-                }
-            });
-        }
-        return this;
-    }
-
-    /**
-     * <p>
-     * Test if two {@code long}s are equal.
-     * </p>
-     * 
-     * @param fieldName
-     *            the field name
-     * @param lhs
-     *            the left hand {@code long}
-     * @param rhs
-     *            the right hand {@code long}
-     * @return this
-     * @throws IllegalArgumentException
-     *             if field name is {@code null}
-     */
-    public DiffBuilder append(final String fieldName, final long lhs,
-            final long rhs) {
-        if (fieldName == null) {
-            throw new IllegalArgumentException("Field name cannot be null");
-        }
-
-        if (objectsTriviallyEqual) {
-            return this;
-        }
-        if (lhs != rhs) {
-            diffs.add(new Diff<Long>(fieldName) {
-                private static final long serialVersionUID = 1L;
-
-                @Override
-                public Long getLeft() {
-                    return Long.valueOf(lhs);
-                }
-
-                @Override
-                public Long getRight() {
-                    return Long.valueOf(rhs);
-                }
-            });
-        }
-        return this;
-    }
-
-    /**
-     * <p>
-     * Test if two {@code long[]}s are equal.
-     * </p>
-     * 
-     * @param fieldName
-     *            the field name
-     * @param lhs
-     *            the left hand {@code long[]}
-     * @param rhs
-     *            the right hand {@code long[]}
-     * @return this
-     * @throws IllegalArgumentException
-     *             if field name is {@code null}
-     */
-    public DiffBuilder append(final String fieldName, final long[] lhs,
-            final long[] rhs) {
-        if (fieldName == null) {
-            throw new IllegalArgumentException("Field name cannot be null");
-        }
-
-        if (objectsTriviallyEqual) {
-            return this;
-        }
-        if (!Arrays.equals(lhs, rhs)) {
-            diffs.add(new Diff<Long[]>(fieldName) {
-                private static final long serialVersionUID = 1L;
-
-                @Override
-                public Long[] getLeft() {
-                    return ArrayUtils.toObject(lhs);
-                }
-
-                @Override
-                public Long[] getRight() {
-                    return ArrayUtils.toObject(rhs);
-                }
-            });
-        }
-        return this;
-    }
-
-    /**
-     * <p>
-     * Test if two {@code short}s are equal.
-     * </p>
-     * 
-     * @param fieldName
-     *            the field name
-     * @param lhs
-     *            the left hand {@code short}
-     * @param rhs
-     *            the right hand {@code short}
-     * @return this
-     * @throws IllegalArgumentException
-     *             if field name is {@code null}
-     */
-    public DiffBuilder append(final String fieldName, final short lhs,
-            final short rhs) {
-        if (fieldName == null) {
-            throw new IllegalArgumentException("Field name cannot be null");
-        }
-
-        if (objectsTriviallyEqual) {
-            return this;
-        }
-        if (lhs != rhs) {
-            diffs.add(new Diff<Short>(fieldName) {
-                private static final long serialVersionUID = 1L;
-
-                @Override
-                public Short getLeft() {
-                    return Short.valueOf(lhs);
-                }
-
-                @Override
-                public Short getRight() {
-                    return Short.valueOf(rhs);
-                }
-            });
-        }
-        return this;
-    }
-
-    /**
-     * <p>
-     * Test if two {@code short[]}s are equal.
-     * </p>
-     * 
-     * @param fieldName
-     *            the field name
-     * @param lhs
-     *            the left hand {@code short[]}
-     * @param rhs
-     *            the right hand {@code short[]}
-     * @return this
-     * @throws IllegalArgumentException
-     *             if field name is {@code null}
-     */
-    public DiffBuilder append(final String fieldName, final short[] lhs,
-            final short[] rhs) {
-        if (fieldName == null) {
-            throw new IllegalArgumentException("Field name cannot be null");
-        }
-
-        if (objectsTriviallyEqual) {
-            return this;
-        }
-        if (!Arrays.equals(lhs, rhs)) {
-            diffs.add(new Diff<Short[]>(fieldName) {
-                private static final long serialVersionUID = 1L;
-
-                @Override
-                public Short[] getLeft() {
-                    return ArrayUtils.toObject(lhs);
-                }
-
-                @Override
-                public Short[] getRight() {
-                    return ArrayUtils.toObject(rhs);
-                }
-            });
-        }
-        return this;
-    }
-
-    /**
-     * <p>
-     * Test if two {@code Objects}s are equal.
-     * </p>
-     * 
-     * @param fieldName
-     *            the field name
-     * @param lhs
-     *            the left hand {@code Object}
-     * @param rhs
-     *            the right hand {@code Object}
-     * @return this
-     */
-    public DiffBuilder append(final String fieldName, final Object lhs,
-            final Object rhs) {
-
-        if (objectsTriviallyEqual) {
-            return this;
-        }
-        if (lhs == rhs) {
-            return this;
-        }
-
-        Object objectToTest;
-        if (lhs != null) {
-            objectToTest = lhs;
-        } else {
-            // rhs cannot be null, as lhs != rhs
-            objectToTest = rhs;
-        }
-
-        if (objectToTest.getClass().isArray()) {
-            if (objectToTest instanceof boolean[]) {
-                return append(fieldName, (boolean[]) lhs, (boolean[]) rhs);
-            }
-            if (objectToTest instanceof byte[]) {
-                return append(fieldName, (byte[]) lhs, (byte[]) rhs);
-            }
-            if (objectToTest instanceof char[]) {
-                return append(fieldName, (char[]) lhs, (char[]) rhs);
-            }
-            if (objectToTest instanceof double[]) {
-                return append(fieldName, (double[]) lhs, (double[]) rhs);
-            }
-            if (objectToTest instanceof float[]) {
-                return append(fieldName, (float[]) lhs, (float[]) rhs);
-            }
-            if (objectToTest instanceof int[]) {
-                return append(fieldName, (int[]) lhs, (int[]) rhs);
-            }
-            if (objectToTest instanceof long[]) {
-                return append(fieldName, (long[]) lhs, (long[]) rhs);
-            }
-            if (objectToTest instanceof short[]) {
-                return append(fieldName, (short[]) lhs, (short[]) rhs);
-            }
-
-            return append(fieldName, (Object[]) lhs, (Object[]) rhs);
-        }
-
-        // Not array type
-        if (lhs != null && lhs.equals(rhs)) {
-            return this;
-        }
-
-        diffs.add(new Diff<Object>(fieldName) {
-            private static final long serialVersionUID = 1L;
-
-            @Override
-            public Object getLeft() {
-                return lhs;
-            }
-
-            @Override
-            public Object getRight() {
-                return rhs;
-            }
-        });
-
-        return this;
-    }
-
-    /**
-     * <p>
-     * Test if two {@code Object[]}s are equal.
-     * </p>
-     * 
-     * @param fieldName
-     *            the field name
-     * @param lhs
-     *            the left hand {@code Object[]}
-     * @param rhs
-     *            the right hand {@code Object[]}
-     * @return this
-     */
-    public DiffBuilder append(final String fieldName, final Object[] lhs,
-            final Object[] rhs) {
-        if (objectsTriviallyEqual) {
-            return this;
-        }
-
-        if (!Arrays.equals(lhs, rhs)) {
-            diffs.add(new Diff<Object[]>(fieldName) {
-                private static final long serialVersionUID = 1L;
-
-                @Override
-                public Object[] getLeft() {
-                    return lhs;
-                }
-
-                @Override
-                public Object[] getRight() {
-                    return rhs;
-                }
-            });
-        }
-
-        return this;
-    }
-
-    /**
-     * <p>
-     * Builds a {@link DiffResult} based on the differences appended to this
-     * builder.
-     * </p>
-     * 
-     * @return a {@code DiffResult} containing the differences between the two
-     *         objects.
-     */
-    @Override
-    public DiffResult build() {
-        return new DiffResult(left, right, diffs, style);
-    }
-
-}
diff --git a/lang/src/main/java/org/apache/commons/lang3/builder/DiffResult.java b/lang/src/main/java/org/apache/commons/lang3/builder/DiffResult.java
deleted file mode 100644
index c321ba5..0000000
--- a/lang/src/main/java/org/apache/commons/lang3/builder/DiffResult.java
+++ /dev/null
@@ -1,208 +0,0 @@
-/**
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.commons.lang3.builder;
-
-import java.util.Collections;
-import java.util.Iterator;
-import java.util.List;
-
-/**
- * <p>
- * A {@code DiffResult} contains a collection of the differences between two
- * {@link Diffable} objects. Typically these differences are displayed using
- * {@link #toString()} method, which returns a string describing the fields that
- * differ between the objects.
- * </p>
- * <p>
- * Use a {@link DiffBuilder} to build a {@code DiffResult} comparing two objects.
- * </p>
- * 
- * @since 3.3
- * @version $Id$
- */
-public class DiffResult implements Iterable<Diff<?>> {
-
-    /**
-     * <p>
-     * The {@code String} returned when the objects have no differences:
-     * {@value}
-     * </p>
-     */
-    public static final String OBJECTS_SAME_STRING = "";
-
-    private static final String DIFFERS_STRING = "differs from";
-
-    private final List<Diff<?>> diffs;
-    private final Object lhs;
-    private final Object rhs;
-    private final ToStringStyle style;
-
-    /**
-     * <p>
-     * Creates a {@link DiffResult} containing the differences between two
-     * objects.
-     * </p>
-     * 
-     * @param lhs
-     *            the left hand object
-     * @param rhs
-     *            the right hand object
-     * @param diffs
-     *            the list of differences, may be empty
-     * @param style
-     *            the style to use for the {@link #toString()} method. May be
-     *            {@code null}, in which case
-     *            {@link ToStringStyle#DEFAULT_STYLE} is used
-     * @throws IllegalArgumentException
-     *             if {@code lhs}, {@code rhs} or {@code diffs} is {@code null}
-     */
-    DiffResult(final Object lhs, final Object rhs, final List<Diff<?>> diffs,
-            final ToStringStyle style) {
-        if (lhs == null) {
-            throw new IllegalArgumentException(
-                    "Left hand object cannot be null");
-        }
-        if (rhs == null) {
-            throw new IllegalArgumentException(
-                    "Right hand object cannot be null");
-        }
-        if (diffs == null) {
-            throw new IllegalArgumentException(
-                    "List of differences cannot be null");
-        }
-
-        this.diffs = diffs;
-        this.lhs = lhs;
-        this.rhs = rhs;
-
-        if (style == null) {
-            this.style = ToStringStyle.DEFAULT_STYLE;
-        } else {
-            this.style = style;
-        }
-    }
-
-    /**
-     * <p>
-     * Returns an unmodifiable list of {@code Diff}s. The list may be empty if
-     * there were no differences between the objects.
-     * </p>
-     * 
-     * @return an unmodifiable list of {@code Diff}s
-     */
-    public List<Diff<?>> getDiffs() {
-        return Collections.unmodifiableList(diffs);
-    }
-
-    /**
-     * <p>
-     * Returns the number of differences between the two objects.
-     * </p>
-     * 
-     * @return the number of differences
-     */
-    public int getNumberOfDiffs() {
-        return diffs.size();
-    }
-
-    /**
-     * <p>
-     * Returns the style used by the {@link #toString()} method.
-     * </p>
-     * 
-     * @return the style
-     */
-    public ToStringStyle getToStringStyle() {
-        return style;
-    }
-
-    /**
-     * <p>
-     * Builds a {@code String} description of the differences contained within
-     * this {@code DiffResult}. A {@link ToStringBuilder} is used for each object
-     * and the style of the output is governed by the {@code ToStringStyle}
-     * passed to the constructor.
-     * </p>
-     * 
-     * <p>
-     * If there are no differences stored in this list, the method will return
-     * {@link #OBJECTS_SAME_STRING}. Otherwise, using the example given in
-     * {@link Diffable} and {@link ToStringStyle#SHORT_PREFIX_STYLE}, an output
-     * might be:
-     * </p>
-     * 
-     * <pre>
-     * Person[name=John Doe,age=32] differs from Person[name=Joe Bloggs,age=26]
-     * </pre>
-     * 
-     * <p>
-     * This indicates that the objects differ in name and age, but not in
-     * smoking status.
-     * </p>
-     * 
-     * <p>
-     * To use a different {@code ToStringStyle} for an instance of this class,
-     * use {@link #toString(ToStringStyle)}.
-     * </p>
-     * 
-     * @return a {@code String} description of the differences.
-     */
-    @Override
-    public String toString() {
-        return toString(style);
-    }
-
-    /**
-     * <p>
-     * Builds a {@code String} description of the differences contained within
-     * this {@code DiffResult}, using the supplied {@code ToStringStyle}.
-     * </p>
-     * 
-     * @param style
-     *            the {@code ToStringStyle} to use when outputting the objects
-     * 
-     * @return a {@code String} description of the differences.
-     */
-    public String toString(final ToStringStyle style) {
-        if (diffs.size() == 0) {
-            return OBJECTS_SAME_STRING;
-        }
-
-        final ToStringBuilder lhsBuilder = new ToStringBuilder(lhs, style);
-        final ToStringBuilder rhsBuilder = new ToStringBuilder(rhs, style);
-
-        for (final Diff<?> diff : diffs) {
-            lhsBuilder.append(diff.getFieldName(), diff.getLeft());
-            rhsBuilder.append(diff.getFieldName(), diff.getRight());
-        }
-
-        return String.format("%s %s %s", lhsBuilder.build(), DIFFERS_STRING,
-                rhsBuilder.build());
-    }
-
-    /**
-     * <p>
-     * Returns an iterator over the {@code Diff} objects contained in this list.
-     * </p>
-     * 
-     * @return the iterator
-     */
-    @Override
-    public Iterator<Diff<?>> iterator() {
-        return diffs.iterator();
-    }
-}
diff --git a/lang/src/main/java/org/apache/commons/lang3/builder/Diffable.java b/lang/src/main/java/org/apache/commons/lang3/builder/Diffable.java
deleted file mode 100644
index 6fc5bdb..0000000
--- a/lang/src/main/java/org/apache/commons/lang3/builder/Diffable.java
+++ /dev/null
@@ -1,54 +0,0 @@
-/**
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.commons.lang3.builder;
-
-/**
- * <p>{@code Diffable} classes can be compared with other objects
- * for differences. The {@link DiffResult} object retrieved can be queried
- * for a list of differences or printed using the {@link DiffResult#toString()}.</p>
- * 
- * <p>The calculation of the differences is <i>consistent with equals</i> if
- * and only if {@code d1.equals(d2)} implies {@code d1.diff(d2) == ""}.
- * It is strongly recommended that implementations are consistent with equals
- * to avoid confusion. Note that {@code null} is not an instance of any class
- * and {@code d1.diff(null)} should throw a {@code NullPointerException}.</p>
- * 
- * <p>
- * {@code Diffable} classes lend themselves well to unit testing, in which a
- * easily readable description of the differences between an anticipated result and
- * an actual result can be retrieved. For example:
- * </p>
- * <pre>
- * Assert.assertEquals(expected.diff(result), expected, result);
- * </pre>
- *
- * @param <T> the type of objects that this object may be differentiated against
- * @since 3.3
- * @version $Id$
- */
-public interface Diffable<T> {
-
-    /**
-     * <p>Retrieves a list of the differences between
-     * this object and the supplied object.</p>
-     * 
-     * @param obj the object to diff against, can be {@code null}
-     * @return a list of differences
-     * @throws NullPointerException if the specified object is {@code null}
-     */
-    DiffResult diff(T obj);
-}
diff --git a/lang/src/main/java/org/apache/commons/lang3/builder/EqualsBuilder.java b/lang/src/main/java/org/apache/commons/lang3/builder/EqualsBuilder.java
deleted file mode 100644
index 75de0a0..0000000
--- a/lang/src/main/java/org/apache/commons/lang3/builder/EqualsBuilder.java
+++ /dev/null
@@ -1,954 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.commons.lang3.builder;
-
-import java.lang.reflect.AccessibleObject;
-import java.lang.reflect.Field;
-import java.lang.reflect.Modifier;
-import java.util.Collection;
-import java.util.HashSet;
-import java.util.Set;
-
-import org.apache.commons.lang3.ArrayUtils;
-import org.apache.commons.lang3.tuple.Pair;
-
-/**
- * <p>Assists in implementing {@link Object#equals(Object)} methods.</p>
- *
- * <p> This class provides methods to build a good equals method for any
- * class. It follows rules laid out in
- * <a href="http://www.oracle.com/technetwork/java/effectivejava-136174.html">Effective Java</a>
- * , by Joshua Bloch. In particular the rule for comparing <code>doubles</code>,
- * <code>floats</code>, and arrays can be tricky. Also, making sure that
- * <code>equals()</code> and <code>hashCode()</code> are consistent can be
- * difficult.</p>
- *
- * <p>Two Objects that compare as equals must generate the same hash code,
- * but two Objects with the same hash code do not have to be equal.</p>
- *
- * <p>All relevant fields should be included in the calculation of equals.
- * Derived fields may be ignored. In particular, any field used in
- * generating a hash code must be used in the equals method, and vice
- * versa.</p>
- *
- * <p>Typical use for the code is as follows:</p>
- * <pre>
- * public boolean equals(Object obj) {
- *   if (obj == null) { return false; }
- *   if (obj == this) { return true; }
- *   if (obj.getClass() != getClass()) {
- *     return false;
- *   }
- *   MyClass rhs = (MyClass) obj;
- *   return new EqualsBuilder()
- *                 .appendSuper(super.equals(obj))
- *                 .append(field1, rhs.field1)
- *                 .append(field2, rhs.field2)
- *                 .append(field3, rhs.field3)
- *                 .isEquals();
- *  }
- * </pre>
- *
- * <p> Alternatively, there is a method that uses reflection to determine
- * the fields to test. Because these fields are usually private, the method,
- * <code>reflectionEquals</code>, uses <code>AccessibleObject.setAccessible</code> to
- * change the visibility of the fields. This will fail under a security
- * manager, unless the appropriate permissions are set up correctly. It is
- * also slower than testing explicitly.  Non-primitive fields are compared using 
- * <code>equals()</code>.</p>
- *
- * <p> A typical invocation for this method would look like:</p>
- * <pre>
- * public boolean equals(Object obj) {
- *   return EqualsBuilder.reflectionEquals(this, obj);
- * }
- * </pre>
- *
- * @since 1.0
- * @version $Id$
- */
-public class EqualsBuilder implements Builder<Boolean> {
-
-    /**
-     * <p>
-     * A registry of objects used by reflection methods to detect cyclical object references and avoid infinite loops.
-     * </p>
-     *
-     * @since 3.0
-     */
-    private static final ThreadLocal<Set<Pair<IDKey, IDKey>>> REGISTRY = new ThreadLocal<Set<Pair<IDKey, IDKey>>>();
-
-    /*
-     * NOTE: we cannot store the actual objects in a HashSet, as that would use the very hashCode()
-     * we are in the process of calculating.
-     *
-     * So we generate a one-to-one mapping from the original object to a new object.
-     *
-     * Now HashSet uses equals() to determine if two elements with the same hashcode really
-     * are equal, so we also need to ensure that the replacement objects are only equal
-     * if the original objects are identical.
-     *
-     * The original implementation (2.4 and before) used the System.indentityHashCode()
-     * method - however this is not guaranteed to generate unique ids (e.g. LANG-459)
-     *
-     * We now use the IDKey helper class (adapted from org.apache.axis.utils.IDKey)
-     * to disambiguate the duplicate ids.
-     */
-
-    /**
-     * <p>
-     * Returns the registry of object pairs being traversed by the reflection
-     * methods in the current thread.
-     * </p>
-     *
-     * @return Set the registry of objects being traversed
-     * @since 3.0
-     */
-    static Set<Pair<IDKey, IDKey>> getRegistry() {
-        return REGISTRY.get();
-    }
-
-    /**
-     * <p>
-     * Converters value pair into a register pair.
-     * </p>
-     *
-     * @param lhs <code>this</code> object
-     * @param rhs the other object
-     *
-     * @return the pair
-     */
-    static Pair<IDKey, IDKey> getRegisterPair(final Object lhs, final Object rhs) {
-        final IDKey left = new IDKey(lhs);
-        final IDKey right = new IDKey(rhs);
-        return Pair.of(left, right);
-    }
-
-    /**
-     * <p>
-     * Returns <code>true</code> if the registry contains the given object pair.
-     * Used by the reflection methods to avoid infinite loops.
-     * Objects might be swapped therefore a check is needed if the object pair
-     * is registered in given or swapped order.
-     * </p>
-     *
-     * @param lhs <code>this</code> object to lookup in registry
-     * @param rhs the other object to lookup on registry
-     * @return boolean <code>true</code> if the registry contains the given object.
-     * @since 3.0
-     */
-    static boolean isRegistered(final Object lhs, final Object rhs) {
-        final Set<Pair<IDKey, IDKey>> registry = getRegistry();
-        final Pair<IDKey, IDKey> pair = getRegisterPair(lhs, rhs);
-        final Pair<IDKey, IDKey> swappedPair = Pair.of(pair.getLeft(), pair.getRight());
-
-        return registry != null
-                && (registry.contains(pair) || registry.contains(swappedPair));
-    }
-
-    /**
-     * <p>
-     * Registers the given object pair.
-     * Used by the reflection methods to avoid infinite loops.
-     * </p>
-     *
-     * @param lhs <code>this</code> object to register
-     * @param rhs the other object to register
-     */
-    static void register(final Object lhs, final Object rhs) {
-        synchronized (EqualsBuilder.class) {
-            if (getRegistry() == null) {
-                REGISTRY.set(new HashSet<Pair<IDKey, IDKey>>());
-            }
-        }
-
-        final Set<Pair<IDKey, IDKey>> registry = getRegistry();
-        final Pair<IDKey, IDKey> pair = getRegisterPair(lhs, rhs);
-        registry.add(pair);
-    }
-
-    /**
-     * <p>
-     * Unregisters the given object pair.
-     * </p>
-     *
-     * <p>
-     * Used by the reflection methods to avoid infinite loops.
-     *
-     * @param lhs <code>this</code> object to unregister
-     * @param rhs the other object to unregister
-     * @since 3.0
-     */
-    static void unregister(final Object lhs, final Object rhs) {
-        Set<Pair<IDKey, IDKey>> registry = getRegistry();
-        if (registry != null) {
-            final Pair<IDKey, IDKey> pair = getRegisterPair(lhs, rhs);
-            registry.remove(pair);
-            synchronized (EqualsBuilder.class) {
-                //read again
-                registry = getRegistry();
-                if (registry != null && registry.isEmpty()) {
-                    REGISTRY.remove();
-                }
-            }
-        }
-    }
-
-    /**
-     * If the fields tested are equals.
-     * The default value is <code>true</code>.
-     */
-    private boolean isEquals = true;
-
-    /**
-     * <p>Constructor for EqualsBuilder.</p>
-     *
-     * <p>Starts off assuming that equals is <code>true</code>.</p>
-     * @see Object#equals(Object)
-     */
-    public EqualsBuilder() {
-        // do nothing for now.
-    }
-
-    //-------------------------------------------------------------------------
-
-    /**
-     * <p>This method uses reflection to determine if the two <code>Object</code>s
-     * are equal.</p>
-     *
-     * <p>It uses <code>AccessibleObject.setAccessible</code> to gain access to private
-     * fields. This means that it will throw a security exception if run under
-     * a security manager, if the permissions are not set up correctly. It is also
-     * not as efficient as testing explicitly. Non-primitive fields are compared using 
-     * <code>equals()</code>.</p>
-     * 
-     * <p>Transient members will be not be tested, as they are likely derived
-     * fields, and not part of the value of the Object.</p>
-     *
-     * <p>Static fields will not be tested. Superclass fields will be included.</p>
-     *
-     * @param lhs  <code>this</code> object
-     * @param rhs  the other object
-     * @param excludeFields  Collection of String field names to exclude from testing
-     * @return <code>true</code> if the two Objects have tested equals.
-     */
-    public static boolean reflectionEquals(final Object lhs, final Object rhs, final Collection<String> excludeFields) {
-        return reflectionEquals(lhs, rhs, ReflectionToStringBuilder.toNoNullStringArray(excludeFields));
-    }
-
-    /**
-     * <p>This method uses reflection to determine if the two <code>Object</code>s
-     * are equal.</p>
-     *
-     * <p>It uses <code>AccessibleObject.setAccessible</code> to gain access to private
-     * fields. This means that it will throw a security exception if run under
-     * a security manager, if the permissions are not set up correctly. It is also
-     * not as efficient as testing explicitly. Non-primitive fields are compared using 
-     * <code>equals()</code>.</p>
-     *
-     * <p>Transient members will be not be tested, as they are likely derived
-     * fields, and not part of the value of the Object.</p>
-     *
-     * <p>Static fields will not be tested. Superclass fields will be included.</p>
-     *
-     * @param lhs  <code>this</code> object
-     * @param rhs  the other object
-     * @param excludeFields  array of field names to exclude from testing
-     * @return <code>true</code> if the two Objects have tested equals.
-     */
-    public static boolean reflectionEquals(final Object lhs, final Object rhs, final String... excludeFields) {
-        return reflectionEquals(lhs, rhs, false, null, excludeFields);
-    }
-
-    /**
-     * <p>This method uses reflection to determine if the two <code>Object</code>s
-     * are equal.</p>
-     *
-     * <p>It uses <code>AccessibleObject.setAccessible</code> to gain access to private
-     * fields. This means that it will throw a security exception if run under
-     * a security manager, if the permissions are not set up correctly. It is also
-     * not as efficient as testing explicitly. Non-primitive fields are compared using 
-     * <code>equals()</code>.</p>
-     *
-     * <p>If the TestTransients parameter is set to <code>true</code>, transient
-     * members will be tested, otherwise they are ignored, as they are likely
-     * derived fields, and not part of the value of the <code>Object</code>.</p>
-     *
-     * <p>Static fields will not be tested. Superclass fields will be included.</p>
-     *
-     * @param lhs  <code>this</code> object
-     * @param rhs  the other object
-     * @param testTransients  whether to include transient fields
-     * @return <code>true</code> if the two Objects have tested equals.
-     */
-    public static boolean reflectionEquals(final Object lhs, final Object rhs, final boolean testTransients) {
-        return reflectionEquals(lhs, rhs, testTransients, null);
-    }
-
-    /**
-     * <p>This method uses reflection to determine if the two <code>Object</code>s
-     * are equal.</p>
-     *
-     * <p>It uses <code>AccessibleObject.setAccessible</code> to gain access to private
-     * fields. This means that it will throw a security exception if run under
-     * a security manager, if the permissions are not set up correctly. It is also
-     * not as efficient as testing explicitly. Non-primitive fields are compared using 
-     * <code>equals()</code>.</p>
-     *
-     * <p>If the testTransients parameter is set to <code>true</code>, transient
-     * members will be tested, otherwise they are ignored, as they are likely
-     * derived fields, and not part of the value of the <code>Object</code>.</p>
-     *
-     * <p>Static fields will not be included. Superclass fields will be appended
-     * up to and including the specified superclass. A null superclass is treated
-     * as java.lang.Object.</p>
-     *
-     * @param lhs  <code>this</code> object
-     * @param rhs  the other object
-     * @param testTransients  whether to include transient fields
-     * @param reflectUpToClass  the superclass to reflect up to (inclusive),
-     *  may be <code>null</code>
-     * @param excludeFields  array of field names to exclude from testing
-     * @return <code>true</code> if the two Objects have tested equals.
-     * @since 2.0
-     */
-    public static boolean reflectionEquals(final Object lhs, final Object rhs, final boolean testTransients, final Class<?> reflectUpToClass,
-            final String... excludeFields) {
-        if (lhs == rhs) {
-            return true;
-        }
-        if (lhs == null || rhs == null) {
-            return false;
-        }
-        // Find the leaf class since there may be transients in the leaf
-        // class or in classes between the leaf and root.
-        // If we are not testing transients or a subclass has no ivars,
-        // then a subclass can test equals to a superclass.
-        final Class<?> lhsClass = lhs.getClass();
-        final Class<?> rhsClass = rhs.getClass();
-        Class<?> testClass;
-        if (lhsClass.isInstance(rhs)) {
-            testClass = lhsClass;
-            if (!rhsClass.isInstance(lhs)) {
-                // rhsClass is a subclass of lhsClass
-                testClass = rhsClass;
-            }
-        } else if (rhsClass.isInstance(lhs)) {
-            testClass = rhsClass;
-            if (!lhsClass.isInstance(rhs)) {
-                // lhsClass is a subclass of rhsClass
-                testClass = lhsClass;
-            }
-        } else {
-            // The two classes are not related.
-            return false;
-        }
-        final EqualsBuilder equalsBuilder = new EqualsBuilder();
-        try {
-            if (testClass.isArray()) {
-                equalsBuilder.append(lhs, rhs);
-            } else {
-                reflectionAppend(lhs, rhs, testClass, equalsBuilder, testTransients, excludeFields);
-                while (testClass.getSuperclass() != null && testClass != reflectUpToClass) {
-                    testClass = testClass.getSuperclass();
-                    reflectionAppend(lhs, rhs, testClass, equalsBuilder, testTransients, excludeFields);
-                }
-            }
-        } catch (final IllegalArgumentException e) {
-            // In this case, we tried to test a subclass vs. a superclass and
-            // the subclass has ivars or the ivars are transient and
-            // we are testing transients.
-            // If a subclass has ivars that we are trying to test them, we get an
-            // exception and we know that the objects are not equal.
-            return false;
-        }
-        return equalsBuilder.isEquals();
-    }
-
-    /**
-     * <p>Appends the fields and values defined by the given object of the
-     * given Class.</p>
-     *
-     * @param lhs  the left hand object
-     * @param rhs  the right hand object
-     * @param clazz  the class to append details of
-     * @param builder  the builder to append to
-     * @param useTransients  whether to test transient fields
-     * @param excludeFields  array of field names to exclude from testing
-     */
-    private static void reflectionAppend(
-        final Object lhs,
-        final Object rhs,
-        final Class<?> clazz,
-        final EqualsBuilder builder,
-        final boolean useTransients,
-        final String[] excludeFields) {
-
-        if (isRegistered(lhs, rhs)) {
-            return;
-        }
-
-        try {
-            register(lhs, rhs);
-            final Field[] fields = clazz.getDeclaredFields();
-            AccessibleObject.setAccessible(fields, true);
-            for (int i = 0; i < fields.length && builder.isEquals; i++) {
-                final Field f = fields[i];
-                if (!ArrayUtils.contains(excludeFields, f.getName())
-                    && (f.getName().indexOf('$') == -1)
-                    && (useTransients || !Modifier.isTransient(f.getModifiers()))
-                    && (!Modifier.isStatic(f.getModifiers()))) {
-                    try {
-                        builder.append(f.get(lhs), f.get(rhs));
-                    } catch (final IllegalAccessException e) {
-                        //this can't happen. Would get a Security exception instead
-                        //throw a runtime exception in case the impossible happens.
-                        throw new InternalError("Unexpected IllegalAccessException");
-                    }
-                }
-            }
-        } finally {
-            unregister(lhs, rhs);
-        }
-    }
-
-    //-------------------------------------------------------------------------
-
-    /**
-     * <p>Adds the result of <code>super.equals()</code> to this builder.</p>
-     *
-     * @param superEquals  the result of calling <code>super.equals()</code>
-     * @return EqualsBuilder - used to chain calls.
-     * @since 2.0
-     */
-    public EqualsBuilder appendSuper(final boolean superEquals) {
-        if (isEquals == false) {
-            return this;
-        }
-        isEquals = superEquals;
-        return this;
-    }
-
-    //-------------------------------------------------------------------------
-
-    /**
-     * <p>Test if two <code>Object</code>s are equal using their
-     * <code>equals</code> method.</p>
-     *
-     * @param lhs  the left hand object
-     * @param rhs  the right hand object
-     * @return EqualsBuilder - used to chain calls.
-     */
-    public EqualsBuilder append(final Object lhs, final Object rhs) {
-        if (isEquals == false) {
-            return this;
-        }
-        if (lhs == rhs) {
-            return this;
-        }
-        if (lhs == null || rhs == null) {
-            this.setEquals(false);
-            return this;
-        }
-        final Class<?> lhsClass = lhs.getClass();
-        if (!lhsClass.isArray()) {
-            // The simple case, not an array, just test the element
-            isEquals = lhs.equals(rhs);
-        } else if (lhs.getClass() != rhs.getClass()) {
-            // Here when we compare different dimensions, for example: a boolean[][] to a boolean[]
-            this.setEquals(false);
-        }
-        // 'Switch' on type of array, to dispatch to the correct handler
-        // This handles multi dimensional arrays of the same depth
-        else if (lhs instanceof long[]) {
-            append((long[]) lhs, (long[]) rhs);
-        } else if (lhs instanceof int[]) {
-            append((int[]) lhs, (int[]) rhs);
-        } else if (lhs instanceof short[]) {
-            append((short[]) lhs, (short[]) rhs);
-        } else if (lhs instanceof char[]) {
-            append((char[]) lhs, (char[]) rhs);
-        } else if (lhs instanceof byte[]) {
-            append((byte[]) lhs, (byte[]) rhs);
-        } else if (lhs instanceof double[]) {
-            append((double[]) lhs, (double[]) rhs);
-        } else if (lhs instanceof float[]) {
-            append((float[]) lhs, (float[]) rhs);
-        } else if (lhs instanceof boolean[]) {
-            append((boolean[]) lhs, (boolean[]) rhs);
-        } else {
-            // Not an array of primitives
-            append((Object[]) lhs, (Object[]) rhs);
-        }
-        return this;
-    }
-
-    /**
-     * <p>
-     * Test if two <code>long</code> s are equal.
-     * </p>
-     *
-     * @param lhs
-     *                  the left hand <code>long</code>
-     * @param rhs
-     *                  the right hand <code>long</code>
-     * @return EqualsBuilder - used to chain calls.
-     */
-    public EqualsBuilder append(final long lhs, final long rhs) {
-        if (isEquals == false) {
-            return this;
-        }
-        isEquals = (lhs == rhs);
-        return this;
-    }
-
-    /**
-     * <p>Test if two <code>int</code>s are equal.</p>
-     *
-     * @param lhs  the left hand <code>int</code>
-     * @param rhs  the right hand <code>int</code>
-     * @return EqualsBuilder - used to chain calls.
-     */
-    public EqualsBuilder append(final int lhs, final int rhs) {
-        if (isEquals == false) {
-            return this;
-        }
-        isEquals = (lhs == rhs);
-        return this;
-    }
-
-    /**
-     * <p>Test if two <code>short</code>s are equal.</p>
-     *
-     * @param lhs  the left hand <code>short</code>
-     * @param rhs  the right hand <code>short</code>
-     * @return EqualsBuilder - used to chain calls.
-     */
-    public EqualsBuilder append(final short lhs, final short rhs) {
-        if (isEquals == false) {
-            return this;
-        }
-        isEquals = (lhs == rhs);
-        return this;
-    }
-
-    /**
-     * <p>Test if two <code>char</code>s are equal.</p>
-     *
-     * @param lhs  the left hand <code>char</code>
-     * @param rhs  the right hand <code>char</code>
-     * @return EqualsBuilder - used to chain calls.
-     */
-    public EqualsBuilder append(final char lhs, final char rhs) {
-        if (isEquals == false) {
-            return this;
-        }
-        isEquals = (lhs == rhs);
-        return this;
-    }
-
-    /**
-     * <p>Test if two <code>byte</code>s are equal.</p>
-     *
-     * @param lhs  the left hand <code>byte</code>
-     * @param rhs  the right hand <code>byte</code>
-     * @return EqualsBuilder - used to chain calls.
-     */
-    public EqualsBuilder append(final byte lhs, final byte rhs) {
-        if (isEquals == false) {
-            return this;
-        }
-        isEquals = (lhs == rhs);
-        return this;
-    }
-
-    /**
-     * <p>Test if two <code>double</code>s are equal by testing that the
-     * pattern of bits returned by <code>doubleToLong</code> are equal.</p>
-     *
-     * <p>This handles NaNs, Infinities, and <code>-0.0</code>.</p>
-     *
-     * <p>It is compatible with the hash code generated by
-     * <code>HashCodeBuilder</code>.</p>
-     *
-     * @param lhs  the left hand <code>double</code>
-     * @param rhs  the right hand <code>double</code>
-     * @return EqualsBuilder - used to chain calls.
-     */
-    public EqualsBuilder append(final double lhs, final double rhs) {
-        if (isEquals == false) {
-            return this;
-        }
-        return append(Double.doubleToLongBits(lhs), Double.doubleToLongBits(rhs));
-    }
-
-    /**
-     * <p>Test if two <code>float</code>s are equal byt testing that the
-     * pattern of bits returned by doubleToLong are equal.</p>
-     *
-     * <p>This handles NaNs, Infinities, and <code>-0.0</code>.</p>
-     *
-     * <p>It is compatible with the hash code generated by
-     * <code>HashCodeBuilder</code>.</p>
-     *
-     * @param lhs  the left hand <code>float</code>
-     * @param rhs  the right hand <code>float</code>
-     * @return EqualsBuilder - used to chain calls.
-     */
-    public EqualsBuilder append(final float lhs, final float rhs) {
-        if (isEquals == false) {
-            return this;
-        }
-        return append(Float.floatToIntBits(lhs), Float.floatToIntBits(rhs));
-    }
-
-    /**
-     * <p>Test if two <code>booleans</code>s are equal.</p>
-     *
-     * @param lhs  the left hand <code>boolean</code>
-     * @param rhs  the right hand <code>boolean</code>
-     * @return EqualsBuilder - used to chain calls.
-      */
-    public EqualsBuilder append(final boolean lhs, final boolean rhs) {
-        if (isEquals == false) {
-            return this;
-        }
-        isEquals = (lhs == rhs);
-        return this;
-    }
-
-    /**
-     * <p>Performs a deep comparison of two <code>Object</code> arrays.</p>
-     *
-     * <p>This also will be called for the top level of
-     * multi-dimensional, ragged, and multi-typed arrays.</p>
-     *
-     * @param lhs  the left hand <code>Object[]</code>
-     * @param rhs  the right hand <code>Object[]</code>
-     * @return EqualsBuilder - used to chain calls.
-     */
-    public EqualsBuilder append(final Object[] lhs, final Object[] rhs) {
-        if (isEquals == false) {
-            return this;
-        }
-        if (lhs == rhs) {
-            return this;
-        }
-        if (lhs == null || rhs == null) {
-            this.setEquals(false);
-            return this;
-        }
-        if (lhs.length != rhs.length) {
-            this.setEquals(false);
-            return this;
-        }
-        for (int i = 0; i < lhs.length && isEquals; ++i) {
-            append(lhs[i], rhs[i]);
-        }
-        return this;
-    }
-
-    /**
-     * <p>Deep comparison of array of <code>long</code>. Length and all
-     * values are compared.</p>
-     *
-     * <p>The method {@link #append(long, long)} is used.</p>
-     *
-     * @param lhs  the left hand <code>long[]</code>
-     * @param rhs  the right hand <code>long[]</code>
-     * @return EqualsBuilder - used to chain calls.
-     */
-    public EqualsBuilder append(final long[] lhs, final long[] rhs) {
-        if (isEquals == false) {
-            return this;
-        }
-        if (lhs == rhs) {
-            return this;
-        }
-        if (lhs == null || rhs == null) {
-            this.setEquals(false);
-            return this;
-        }
-        if (lhs.length != rhs.length) {
-            this.setEquals(false);
-            return this;
-        }
-        for (int i = 0; i < lhs.length && isEquals; ++i) {
-            append(lhs[i], rhs[i]);
-        }
-        return this;
-    }
-
-    /**
-     * <p>Deep comparison of array of <code>int</code>. Length and all
-     * values are compared.</p>
-     *
-     * <p>The method {@link #append(int, int)} is used.</p>
-     *
-     * @param lhs  the left hand <code>int[]</code>
-     * @param rhs  the right hand <code>int[]</code>
-     * @return EqualsBuilder - used to chain calls.
-     */
-    public EqualsBuilder append(final int[] lhs, final int[] rhs) {
-        if (isEquals == false) {
-            return this;
-        }
-        if (lhs == rhs) {
-            return this;
-        }
-        if (lhs == null || rhs == null) {
-            this.setEquals(false);
-            return this;
-        }
-        if (lhs.length != rhs.length) {
-            this.setEquals(false);
-            return this;
-        }
-        for (int i = 0; i < lhs.length && isEquals; ++i) {
-            append(lhs[i], rhs[i]);
-        }
-        return this;
-    }
-
-    /**
-     * <p>Deep comparison of array of <code>short</code>. Length and all
-     * values are compared.</p>
-     *
-     * <p>The method {@link #append(short, short)} is used.</p>
-     *
-     * @param lhs  the left hand <code>short[]</code>
-     * @param rhs  the right hand <code>short[]</code>
-     * @return EqualsBuilder - used to chain calls.
-     */
-    public EqualsBuilder append(final short[] lhs, final short[] rhs) {
-        if (isEquals == false) {
-            return this;
-        }
-        if (lhs == rhs) {
-            return this;
-        }
-        if (lhs == null || rhs == null) {
-            this.setEquals(false);
-            return this;
-        }
-        if (lhs.length != rhs.length) {
-            this.setEquals(false);
-            return this;
-        }
-        for (int i = 0; i < lhs.length && isEquals; ++i) {
-            append(lhs[i], rhs[i]);
-        }
-        return this;
-    }
-
-    /**
-     * <p>Deep comparison of array of <code>char</code>. Length and all
-     * values are compared.</p>
-     *
-     * <p>The method {@link #append(char, char)} is used.</p>
-     *
-     * @param lhs  the left hand <code>char[]</code>
-     * @param rhs  the right hand <code>char[]</code>
-     * @return EqualsBuilder - used to chain calls.
-     */
-    public EqualsBuilder append(final char[] lhs, final char[] rhs) {
-        if (isEquals == false) {
-            return this;
-        }
-        if (lhs == rhs) {
-            return this;
-        }
-        if (lhs == null || rhs == null) {
-            this.setEquals(false);
-            return this;
-        }
-        if (lhs.length != rhs.length) {
-            this.setEquals(false);
-            return this;
-        }
-        for (int i = 0; i < lhs.length && isEquals; ++i) {
-            append(lhs[i], rhs[i]);
-        }
-        return this;
-    }
-
-    /**
-     * <p>Deep comparison of array of <code>byte</code>. Length and all
-     * values are compared.</p>
-     *
-     * <p>The method {@link #append(byte, byte)} is used.</p>
-     *
-     * @param lhs  the left hand <code>byte[]</code>
-     * @param rhs  the right hand <code>byte[]</code>
-     * @return EqualsBuilder - used to chain calls.
-     */
-    public EqualsBuilder append(final byte[] lhs, final byte[] rhs) {
-        if (isEquals == false) {
-            return this;
-        }
-        if (lhs == rhs) {
-            return this;
-        }
-        if (lhs == null || rhs == null) {
-            this.setEquals(false);
-            return this;
-        }
-        if (lhs.length != rhs.length) {
-            this.setEquals(false);
-            return this;
-        }
-        for (int i = 0; i < lhs.length && isEquals; ++i) {
-            append(lhs[i], rhs[i]);
-        }
-        return this;
-    }
-
-    /**
-     * <p>Deep comparison of array of <code>double</code>. Length and all
-     * values are compared.</p>
-     *
-     * <p>The method {@link #append(double, double)} is used.</p>
-     *
-     * @param lhs  the left hand <code>double[]</code>
-     * @param rhs  the right hand <code>double[]</code>
-     * @return EqualsBuilder - used to chain calls.
-     */
-    public EqualsBuilder append(final double[] lhs, final double[] rhs) {
-        if (isEquals == false) {
-            return this;
-        }
-        if (lhs == rhs) {
-            return this;
-        }
-        if (lhs == null || rhs == null) {
-            this.setEquals(false);
-            return this;
-        }
-        if (lhs.length != rhs.length) {
-            this.setEquals(false);
-            return this;
-        }
-        for (int i = 0; i < lhs.length && isEquals; ++i) {
-            append(lhs[i], rhs[i]);
-        }
-        return this;
-    }
-
-    /**
-     * <p>Deep comparison of array of <code>float</code>. Length and all
-     * values are compared.</p>
-     *
-     * <p>The method {@link #append(float, float)} is used.</p>
-     *
-     * @param lhs  the left hand <code>float[]</code>
-     * @param rhs  the right hand <code>float[]</code>
-     * @return EqualsBuilder - used to chain calls.
-     */
-    public EqualsBuilder append(final float[] lhs, final float[] rhs) {
-        if (isEquals == false) {
-            return this;
-        }
-        if (lhs == rhs) {
-            return this;
-        }
-        if (lhs == null || rhs == null) {
-            this.setEquals(false);
-            return this;
-        }
-        if (lhs.length != rhs.length) {
-            this.setEquals(false);
-            return this;
-        }
-        for (int i = 0; i < lhs.length && isEquals; ++i) {
-            append(lhs[i], rhs[i]);
-        }
-        return this;
-    }
-
-    /**
-     * <p>Deep comparison of array of <code>boolean</code>. Length and all
-     * values are compared.</p>
-     *
-     * <p>The method {@link #append(boolean, boolean)} is used.</p>
-     *
-     * @param lhs  the left hand <code>boolean[]</code>
-     * @param rhs  the right hand <code>boolean[]</code>
-     * @return EqualsBuilder - used to chain calls.
-     */
-    public EqualsBuilder append(final boolean[] lhs, final boolean[] rhs) {
-        if (isEquals == false) {
-            return this;
-        }
-        if (lhs == rhs) {
-            return this;
-        }
-        if (lhs == null || rhs == null) {
-            this.setEquals(false);
-            return this;
-        }
-        if (lhs.length != rhs.length) {
-            this.setEquals(false);
-            return this;
-        }
-        for (int i = 0; i < lhs.length && isEquals; ++i) {
-            append(lhs[i], rhs[i]);
-        }
-        return this;
-    }
-
-    /**
-     * <p>Returns <code>true</code> if the fields that have been checked
-     * are all equal.</p>
-     *
-     * @return boolean
-     */
-    public boolean isEquals() {
-        return this.isEquals;
-    }
-
-    /**
-     * <p>Returns <code>true</code> if the fields that have been checked
-     * are all equal.</p>
-     *
-     * @return <code>true</code> if all of the fields that have been checked
-     *         are equal, <code>false</code> otherwise.
-     *
-     * @since 3.0
-     */
-    @Override
-    public Boolean build() {
-        return Boolean.valueOf(isEquals());
-    }
-
-    /**
-     * Sets the <code>isEquals</code> value.
-     *
-     * @param isEquals The value to set.
-     * @since 2.1
-     */
-    protected void setEquals(final boolean isEquals) {
-        this.isEquals = isEquals;
-    }
-
-    /**
-     * Reset the EqualsBuilder so you can use the same object again
-     * @since 2.5
-     */
-    public void reset() {
-        this.isEquals = true;
-    }
-}
diff --git a/lang/src/main/java/org/apache/commons/lang3/builder/HashCodeBuilder.java b/lang/src/main/java/org/apache/commons/lang3/builder/HashCodeBuilder.java
deleted file mode 100644
index 1fc3742..0000000
--- a/lang/src/main/java/org/apache/commons/lang3/builder/HashCodeBuilder.java
+++ /dev/null
@@ -1,971 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package org.apache.commons.lang3.builder;
-
-import java.lang.reflect.AccessibleObject;
-import java.lang.reflect.Field;
-import java.lang.reflect.Modifier;
-import java.util.Collection;
-import java.util.HashSet;
-import java.util.Set;
-
-import org.apache.commons.lang3.ArrayUtils;
-import org.apache.commons.lang3.Validate;
-
-/**
- * <p>
- * Assists in implementing {@link Object#hashCode()} methods.
- * </p>
- *
- * <p>
- * This class enables a good <code>hashCode</code> method to be built for any class. It follows the rules laid out in
- * the book <a href="http://www.oracle.com/technetwork/java/effectivejava-136174.html">Effective Java</a> by Joshua Bloch. Writing a
- * good <code>hashCode</code> method is actually quite difficult. This class aims to simplify the process.
- * </p>
- *
- * <p>
- * The following is the approach taken. When appending a data field, the current total is multiplied by the
- * multiplier then a relevant value
- * for that data type is added. For example, if the current hashCode is 17, and the multiplier is 37, then
- * appending the integer 45 will create a hashcode of 674, namely 17 * 37 + 45.
- * </p>
- *
- * <p>
- * All relevant fields from the object should be included in the <code>hashCode</code> method. Derived fields may be
- * excluded. In general, any field used in the <code>equals</code> method must be used in the <code>hashCode</code>
- * method.
- * </p>
- *
- * <p>
- * To use this class write code as follows:
- * </p>
- *
- * <pre>
- * public class Person {
- *   String name;
- *   int age;
- *   boolean smoker;
- *   ...
- *
- *   public int hashCode() {
- *     // you pick a hard-coded, randomly chosen, non-zero, odd number
- *     // ideally different for each class
- *     return new HashCodeBuilder(17, 37).
- *       append(name).
- *       append(age).
- *       append(smoker).
- *       toHashCode();
- *   }
- * }
- * </pre>
- *
- * <p>
- * If required, the superclass <code>hashCode()</code> can be added using {@link #appendSuper}.
- * </p>
- *
- * <p>
- * Alternatively, there is a method that uses reflection to determine the fields to test. Because these fields are
- * usually private, the method, <code>reflectionHashCode</code>, uses <code>AccessibleObject.setAccessible</code>
- * to change the visibility of the fields. This will fail under a security manager, unless the appropriate permissions
- * are set up correctly. It is also slower than testing explicitly.
- * </p>
- *
- * <p>
- * A typical invocation for this method would look like:
- * </p>
- *
- * <pre>
- * public int hashCode() {
- *   return HashCodeBuilder.reflectionHashCode(this);
- * }
- * </pre>
- *
- * @since 1.0
- * @version $Id$
- */
-public class HashCodeBuilder implements Builder<Integer> {
-    /**
-     * The default initial value to use in reflection hash code building.
-     */
-    private static final int DEFAULT_INITIAL_VALUE = 17;
-    
-    /**
-     * The default multipler value to use in reflection hash code building.
-     */
-    private static final int DEFAULT_MULTIPLIER_VALUE = 37;
-    
-    /**
-     * <p>
-     * A registry of objects used by reflection methods to detect cyclical object references and avoid infinite loops.
-     * </p>
-     *
-     * @since 2.3
-     */
-    private static final ThreadLocal<Set<IDKey>> REGISTRY = new ThreadLocal<Set<IDKey>>();
-
-    /*
-     * NOTE: we cannot store the actual objects in a HashSet, as that would use the very hashCode()
-     * we are in the process of calculating.
-     *
-     * So we generate a one-to-one mapping from the original object to a new object.
-     *
-     * Now HashSet uses equals() to determine if two elements with the same hashcode really
-     * are equal, so we also need to ensure that the replacement objects are only equal
-     * if the original objects are identical.
-     *
-     * The original implementation (2.4 and before) used the System.indentityHashCode()
-     * method - however this is not guaranteed to generate unique ids (e.g. LANG-459)
-     *
-     * We now use the IDKey helper class (adapted from org.apache.axis.utils.IDKey)
-     * to disambiguate the duplicate ids.
-     */
-
-    /**
-     * <p>
-     * Returns the registry of objects being traversed by the reflection methods in the current thread.
-     * </p>
-     *
-     * @return Set the registry of objects being traversed
-     * @since 2.3
-     */
-    static Set<IDKey> getRegistry() {
-        return REGISTRY.get();
-    }
-
-    /**
-     * <p>
-     * Returns <code>true</code> if the registry contains the given object. Used by the reflection methods to avoid
-     * infinite loops.
-     * </p>
-     *
-     * @param value
-     *            The object to lookup in the registry.
-     * @return boolean <code>true</code> if the registry contains the given object.
-     * @since 2.3
-     */
-    static boolean isRegistered(final Object value) {
-        final Set<IDKey> registry = getRegistry();
-        return registry != null && registry.contains(new IDKey(value));
-    }
-
-    /**
-     * <p>
-     * Appends the fields and values defined by the given object of the given <code>Class</code>.
-     * </p>
-     *
-     * @param object
-     *            the object to append details of
-     * @param clazz
-     *            the class to append details of
-     * @param builder
-     *            the builder to append to
-     * @param useTransients
-     *            whether to use transient fields
-     * @param excludeFields
-     *            Collection of String field names to exclude from use in calculation of hash code
-     */
-    private static void reflectionAppend(final Object object, final Class<?> clazz, final HashCodeBuilder builder, final boolean useTransients,
-            final String[] excludeFields) {
-        if (isRegistered(object)) {
-            return;
-        }
-        try {
-            register(object);
-            final Field[] fields = clazz.getDeclaredFields();
-            AccessibleObject.setAccessible(fields, true);
-            for (final Field field : fields) {
-                if (!ArrayUtils.contains(excludeFields, field.getName())
-                    && (field.getName().indexOf('$') == -1)
-                    && (useTransients || !Modifier.isTransient(field.getModifiers()))
-                    && (!Modifier.isStatic(field.getModifiers()))) {
-                    try {
-                        final Object fieldValue = field.get(object);
-                        builder.append(fieldValue);
-                    } catch (final IllegalAccessException e) {
-                        // this can't happen. Would get a Security exception instead
-                        // throw a runtime exception in case the impossible happens.
-                        throw new InternalError("Unexpected IllegalAccessException");
-                    }
-                }
-            }
-        } finally {
-            unregister(object);
-        }
-    }
-
-    /**
-     * <p>
-     * Uses reflection to build a valid hash code from the fields of {@code object}.
-     * </p>
-     *
-     * <p>
-     * It uses <code>AccessibleObject.setAccessible</code> to gain access to private fields. This means that it will
-     * throw a security exception if run under a security manager, if the permissions are not set up correctly. It is
-     * also not as efficient as testing explicitly.
-     * </p>
-     *
-     * <p>
-     * Transient members will be not be used, as they are likely derived fields, and not part of the value of the
-     * <code>Object</code>.
-     * </p>
-     *
-     * <p>
-     * Static fields will not be tested. Superclass fields will be included.
-     * </p>
-     *
-     * <p>
-     * Two randomly chosen, non-zero, odd numbers must be passed in. Ideally these should be different for each class,
-     * however this is not vital. Prime numbers are preferred, especially for the multiplier.
-     * </p>
-     *
-     * @param initialNonZeroOddNumber
-     *            a non-zero, odd number used as the initial value. This will be the returned
-     *            value if no fields are found to include in the hash code
-     * @param multiplierNonZeroOddNumber
-     *            a non-zero, odd number used as the multiplier
-     * @param object
-     *            the Object to create a <code>hashCode</code> for
-     * @return int hash code
-     * @throws IllegalArgumentException
-     *             if the Object is <code>null</code>
-     * @throws IllegalArgumentException
-     *             if the number is zero or even
-     */
-    public static int reflectionHashCode(final int initialNonZeroOddNumber, final int multiplierNonZeroOddNumber, final Object object) {
-        return reflectionHashCode(initialNonZeroOddNumber, multiplierNonZeroOddNumber, object, false, null);
-    }
-
-    /**
-     * <p>
-     * Uses reflection to build a valid hash code from the fields of {@code object}.
-     * </p>
-     *
-     * <p>
-     * It uses <code>AccessibleObject.setAccessible</code> to gain access to private fields. This means that it will
-     * throw a security exception if run under a security manager, if the permissions are not set up correctly. It is
-     * also not as efficient as testing explicitly.
-     * </p>
-     *
-     * <p>
-     * If the TestTransients parameter is set to <code>true</code>, transient members will be tested, otherwise they
-     * are ignored, as they are likely derived fields, and not part of the value of the <code>Object</code>.
-     * </p>
-     *
-     * <p>
-     * Static fields will not be tested. Superclass fields will be included.
-     * </p>
-     *
-     * <p>
-     * Two randomly chosen, non-zero, odd numbers must be passed in. Ideally these should be different for each class,
-     * however this is not vital. Prime numbers are preferred, especially for the multiplier.
-     * </p>
-     *
-     * @param initialNonZeroOddNumber
-     *            a non-zero, odd number used as the initial value. This will be the returned
-     *            value if no fields are found to include in the hash code
-     * @param multiplierNonZeroOddNumber
-     *            a non-zero, odd number used as the multiplier
-     * @param object
-     *            the Object to create a <code>hashCode</code> for
-     * @param testTransients
-     *            whether to include transient fields
-     * @return int hash code
-     * @throws IllegalArgumentException
-     *             if the Object is <code>null</code>
-     * @throws IllegalArgumentException
-     *             if the number is zero or even
-     */
-    public static int reflectionHashCode(final int initialNonZeroOddNumber, final int multiplierNonZeroOddNumber, final Object object,
-            final boolean testTransients) {
-        return reflectionHashCode(initialNonZeroOddNumber, multiplierNonZeroOddNumber, object, testTransients, null);
-    }
-
-    /**
-     * <p>
-     * Uses reflection to build a valid hash code from the fields of {@code object}.
-     * </p>
-     *
-     * <p>
-     * It uses <code>AccessibleObject.setAccessible</code> to gain access to private fields. This means that it will
-     * throw a security exception if run under a security manager, if the permissions are not set up correctly. It is
-     * also not as efficient as testing explicitly.
-     * </p>
-     *
-     * <p>
-     * If the TestTransients parameter is set to <code>true</code>, transient members will be tested, otherwise they
-     * are ignored, as they are likely derived fields, and not part of the value of the <code>Object</code>.
-     * </p>
-     *
-     * <p>
-     * Static fields will not be included. Superclass fields will be included up to and including the specified
-     * superclass. A null superclass is treated as java.lang.Object.
-     * </p>
-     *
-     * <p>
-     * Two randomly chosen, non-zero, odd numbers must be passed in. Ideally these should be different for each class,
-     * however this is not vital. Prime numbers are preferred, especially for the multiplier.
-     * </p>
-     *
-     * @param <T>
-     *            the type of the object involved
-     * @param initialNonZeroOddNumber
-     *            a non-zero, odd number used as the initial value. This will be the returned
-     *            value if no fields are found to include in the hash code
-     * @param multiplierNonZeroOddNumber
-     *            a non-zero, odd number used as the multiplier
-     * @param object
-     *            the Object to create a <code>hashCode</code> for
-     * @param testTransients
-     *            whether to include transient fields
-     * @param reflectUpToClass
-     *            the superclass to reflect up to (inclusive), may be <code>null</code>
-     * @param excludeFields
-     *            array of field names to exclude from use in calculation of hash code
-     * @return int hash code
-     * @throws IllegalArgumentException
-     *             if the Object is <code>null</code>
-     * @throws IllegalArgumentException
-     *             if the number is zero or even
-     * @since 2.0
-     */
-    public static <T> int reflectionHashCode(final int initialNonZeroOddNumber, final int multiplierNonZeroOddNumber, final T object,
-            final boolean testTransients, final Class<? super T> reflectUpToClass, final String... excludeFields) {
-
-        if (object == null) {
-            throw new IllegalArgumentException("The object to build a hash code for must not be null");
-        }
-        final HashCodeBuilder builder = new HashCodeBuilder(initialNonZeroOddNumber, multiplierNonZeroOddNumber);
-        Class<?> clazz = object.getClass();
-        reflectionAppend(object, clazz, builder, testTransients, excludeFields);
-        while (clazz.getSuperclass() != null && clazz != reflectUpToClass) {
-            clazz = clazz.getSuperclass();
-            reflectionAppend(object, clazz, builder, testTransients, excludeFields);
-        }
-        return builder.toHashCode();
-    }
-
-    /**
-     * <p>
-     * Uses reflection to build a valid hash code from the fields of {@code object}.
-     * </p>
-     *
-     * <p>
-     * This constructor uses two hard coded choices for the constants needed to build a hash code.
-     * </p>
-     *
-     * <p>
-     * It uses <code>AccessibleObject.setAccessible</code> to gain access to private fields. This means that it will
-     * throw a security exception if run under a security manager, if the permissions are not set up correctly. It is
-     * also not as efficient as testing explicitly.
-     * </p>
-     *
-     * <P>
-     * If the TestTransients parameter is set to <code>true</code>, transient members will be tested, otherwise they
-     * are ignored, as they are likely derived fields, and not part of the value of the <code>Object</code>.
-     * </p>
-     *
-     * <p>
-     * Static fields will not be tested. Superclass fields will be included. If no fields are found to include
-     * in the hash code, the result of this method will be constant.
-     * </p>
-     *
-     * @param object
-     *            the Object to create a <code>hashCode</code> for
-     * @param testTransients
-     *            whether to include transient fields
-     * @return int hash code
-     * @throws IllegalArgumentException
-     *             if the object is <code>null</code>
-     */
-    public static int reflectionHashCode(final Object object, final boolean testTransients) {
-        return reflectionHashCode(DEFAULT_INITIAL_VALUE, DEFAULT_MULTIPLIER_VALUE, object, 
-                testTransients, null);
-    }
-
-    /**
-     * <p>
-     * Uses reflection to build a valid hash code from the fields of {@code object}.
-     * </p>
-     *
-     * <p>
-     * This constructor uses two hard coded choices for the constants needed to build a hash code.
-     * </p>
-     *
-     * <p>
-     * It uses <code>AccessibleObject.setAccessible</code> to gain access to private fields. This means that it will
-     * throw a security exception if run under a security manager, if the permissions are not set up correctly. It is
-     * also not as efficient as testing explicitly.
-     * </p>
-     *
-     * <p>
-     * Transient members will be not be used, as they are likely derived fields, and not part of the value of the
-     * <code>Object</code>.
-     * </p>
-     *
-     * <p>
-     * Static fields will not be tested. Superclass fields will be included. If no fields are found to include
-     * in the hash code, the result of this method will be constant.
-     * </p>
-     *
-     * @param object
-     *            the Object to create a <code>hashCode</code> for
-     * @param excludeFields
-     *            Collection of String field names to exclude from use in calculation of hash code
-     * @return int hash code
-     * @throws IllegalArgumentException
-     *             if the object is <code>null</code>
-     */
-    public static int reflectionHashCode(final Object object, final Collection<String> excludeFields) {
-        return reflectionHashCode(object, ReflectionToStringBuilder.toNoNullStringArray(excludeFields));
-    }
-
-    // -------------------------------------------------------------------------
-
-    /**
-     * <p>
-     * Uses reflection to build a valid hash code from the fields of {@code object}.
-     * </p>
-     *
-     * <p>
-     * This constructor uses two hard coded choices for the constants needed to build a hash code.
-     * </p>
-     *
-     * <p>
-     * It uses <code>AccessibleObject.setAccessible</code> to gain access to private fields. This means that it will
-     * throw a security exception if run under a security manager, if the permissions are not set up correctly. It is
-     * also not as efficient as testing explicitly.
-     * </p>
-     *
-     * <p>
-     * Transient members will be not be used, as they are likely derived fields, and not part of the value of the
-     * <code>Object</code>.
-     * </p>
-     *
-     * <p>
-     * Static fields will not be tested. Superclass fields will be included. If no fields are found to include
-     * in the hash code, the result of this method will be constant.
-     * </p>
-     *
-     * @param object
-     *            the Object to create a <code>hashCode</code> for
-     * @param excludeFields
-     *            array of field names to exclude from use in calculation of hash code
-     * @return int hash code
-     * @throws IllegalArgumentException
-     *             if the object is <code>null</code>
-     */
-    public static int reflectionHashCode(final Object object, final String... excludeFields) {
-        return reflectionHashCode(DEFAULT_INITIAL_VALUE, DEFAULT_MULTIPLIER_VALUE, object, false, 
-                null, excludeFields);
-    }
-
-    /**
-     * <p>
-     * Registers the given object. Used by the reflection methods to avoid infinite loops.
-     * </p>
-     *
-     * @param value
-     *            The object to register.
-     */
-    static void register(final Object value) {
-        synchronized (HashCodeBuilder.class) {
-            if (getRegistry() == null) {
-                REGISTRY.set(new HashSet<IDKey>());
-            }
-        }
-        getRegistry().add(new IDKey(value));
-    }
-
-    /**
-     * <p>
-     * Unregisters the given object.
-     * </p>
-     *
-     * <p>
-     * Used by the reflection methods to avoid infinite loops.
-     *
-     * @param value
-     *            The object to unregister.
-     * @since 2.3
-     */
-    static void unregister(final Object value) {
-        Set<IDKey> registry = getRegistry();
-        if (registry != null) {
-            registry.remove(new IDKey(value));
-            synchronized (HashCodeBuilder.class) {
-                //read again
-                registry = getRegistry();
-                if (registry != null && registry.isEmpty()) {
-                    REGISTRY.remove();
-                }
-            }
-        }
-    }
-
-    /**
-     * Constant to use in building the hashCode.
-     */
-    private final int iConstant;
-
-    /**
-     * Running total of the hashCode.
-     */
-    private int iTotal = 0;
-
-    /**
-     * <p>
-     * Uses two hard coded choices for the constants needed to build a <code>hashCode</code>.
-     * </p>
-     */
-    public HashCodeBuilder() {
-        iConstant = 37;
-        iTotal = 17;
-    }
-
-    /**
-     * <p>
-     * Two randomly chosen, odd numbers must be passed in. Ideally these should be different for each class,
-     * however this is not vital.
-     * </p>
-     *
-     * <p>
-     * Prime numbers are preferred, especially for the multiplier.
-     * </p>
-     *
-     * @param initialOddNumber
-     *            an odd number used as the initial value
-     * @param multiplierOddNumber
-     *            an odd number used as the multiplier
-     * @throws IllegalArgumentException
-     *             if the number is even
-     */
-    public HashCodeBuilder(final int initialOddNumber, final int multiplierOddNumber) {
-        Validate.isTrue(initialOddNumber % 2 != 0, "HashCodeBuilder requires an odd initial value");
-        Validate.isTrue(multiplierOddNumber % 2 != 0, "HashCodeBuilder requires an odd multiplier");
-        iConstant = multiplierOddNumber;
-        iTotal = initialOddNumber;
-    }
-
-    /**
-     * <p>
-     * Append a <code>hashCode</code> for a <code>boolean</code>.
-     * </p>
-     * <p>
-     * This adds <code>1</code> when true, and <code>0</code> when false to the <code>hashCode</code>.
-     * </p>
-     * <p>
-     * This is in contrast to the standard <code>java.lang.Boolean.hashCode</code> handling, which computes
-     * a <code>hashCode</code> value of <code>1231</code> for <code>java.lang.Boolean</code> instances
-     * that represent <code>true</code> or <code>1237</code> for <code>java.lang.Boolean</code> instances
-     * that represent <code>false</code>.
-     * </p>
-     * <p>
-     * This is in accordance with the <i>Effective Java</i> design.
-     * </p>
-     *
-     * @param value
-     *            the boolean to add to the <code>hashCode</code>
-     * @return this
-     */
-    public HashCodeBuilder append(final boolean value) {
-        iTotal = iTotal * iConstant + (value ? 0 : 1);
-        return this;
-    }
-
-    /**
-     * <p>
-     * Append a <code>hashCode</code> for a <code>boolean</code> array.
-     * </p>
-     *
-     * @param array
-     *            the array to add to the <code>hashCode</code>
-     * @return this
-     */
-    public HashCodeBuilder append(final boolean[] array) {
-        if (array == null) {
-            iTotal = iTotal * iConstant;
-        } else {
-            for (final boolean element : array) {
-                append(element);
-            }
-        }
-        return this;
-    }
-
-    // -------------------------------------------------------------------------
-
-    /**
-     * <p>
-     * Append a <code>hashCode</code> for a <code>byte</code>.
-     * </p>
-     *
-     * @param value
-     *            the byte to add to the <code>hashCode</code>
-     * @return this
-     */
-    public HashCodeBuilder append(final byte value) {
-        iTotal = iTotal * iConstant + value;
-        return this;
-    }
-
-    // -------------------------------------------------------------------------
-
-    /**
-     * <p>
-     * Append a <code>hashCode</code> for a <code>byte</code> array.
-     * </p>
-     *
-     * @param array
-     *            the array to add to the <code>hashCode</code>
-     * @return this
-     */
-    public HashCodeBuilder append(final byte[] array) {
-        if (array == null) {
-            iTotal = iTotal * iConstant;
-        } else {
-            for (final byte element : array) {
-                append(element);
-            }
-        }
-        return this;
-    }
-
-    /**
-     * <p>
-     * Append a <code>hashCode</code> for a <code>char</code>.
-     * </p>
-     *
-     * @param value
-     *            the char to add to the <code>hashCode</code>
-     * @return this
-     */
-    public HashCodeBuilder append(final char value) {
-        iTotal = iTotal * iConstant + value;
-        return this;
-    }
-
-    /**
-     * <p>
-     * Append a <code>hashCode</code> for a <code>char</code> array.
-     * </p>
-     *
-     * @param array
-     *            the array to add to the <code>hashCode</code>
-     * @return this
-     */
-    public HashCodeBuilder append(final char[] array) {
-        if (array == null) {
-            iTotal = iTotal * iConstant;
-        } else {
-            for (final char element : array) {
-                append(element);
-            }
-        }
-        return this;
-    }
-
-    /**
-     * <p>
-     * Append a <code>hashCode</code> for a <code>double</code>.
-     * </p>
-     *
-     * @param value
-     *            the double to add to the <code>hashCode</code>
-     * @return this
-     */
-    public HashCodeBuilder append(final double value) {
-        return append(Double.doubleToLongBits(value));
-    }
-
-    /**
-     * <p>
-     * Append a <code>hashCode</code> for a <code>double</code> array.
-     * </p>
-     *
-     * @param array
-     *            the array to add to the <code>hashCode</code>
-     * @return this
-     */
-    public HashCodeBuilder append(final double[] array) {
-        if (array == null) {
-            iTotal = iTotal * iConstant;
-        } else {
-            for (final double element : array) {
-                append(element);
-            }
-        }
-        return this;
-    }
-
-    /**
-     * <p>
-     * Append a <code>hashCode</code> for a <code>float</code>.
-     * </p>
-     *
-     * @param value
-     *            the float to add to the <code>hashCode</code>
-     * @return this
-     */
-    public HashCodeBuilder append(final float value) {
-        iTotal = iTotal * iConstant + Float.floatToIntBits(value);
-        return this;
-    }
-
-    /**
-     * <p>
-     * Append a <code>hashCode</code> for a <code>float</code> array.
-     * </p>
-     *
-     * @param array
-     *            the array to add to the <code>hashCode</code>
-     * @return this
-     */
-    public HashCodeBuilder append(final float[] array) {
-        if (array == null) {
-            iTotal = iTotal * iConstant;
-        } else {
-            for (final float element : array) {
-                append(element);
-            }
-        }
-        return this;
-    }
-
-    /**
-     * <p>
-     * Append a <code>hashCode</code> for an <code>int</code>.
-     * </p>
-     *
-     * @param value
-     *            the int to add to the <code>hashCode</code>
-     * @return this
-     */
-    public HashCodeBuilder append(final int value) {
-        iTotal = iTotal * iConstant + value;
-        return this;
-    }
-
-    /**
-     * <p>
-     * Append a <code>hashCode</code> for an <code>int</code> array.
-     * </p>
-     *
-     * @param array
-     *            the array to add to the <code>hashCode</code>
-     * @return this
-     */
-    public HashCodeBuilder append(final int[] array) {
-        if (array == null) {
-            iTotal = iTotal * iConstant;
-        } else {
-            for (final int element : array) {
-                append(element);
-            }
-        }
-        return this;
-    }
-
-    /**
-     * <p>
-     * Append a <code>hashCode</code> for a <code>long</code>.
-     * </p>
-     *
-     * @param value
-     *            the long to add to the <code>hashCode</code>
-     * @return this
-     */
-    // NOTE: This method uses >> and not >>> as Effective Java and
-    //       Long.hashCode do. Ideally we should switch to >>> at
-    //       some stage. There are backwards compat issues, so
-    //       that will have to wait for the time being. cf LANG-342.
-    public HashCodeBuilder append(final long value) {
-        iTotal = iTotal * iConstant + ((int) (value ^ (value >> 32)));
-        return this;
-    }
-
-    /**
-     * <p>
-     * Append a <code>hashCode</code> for a <code>long</code> array.
-     * </p>
-     *
-     * @param array
-     *            the array to add to the <code>hashCode</code>
-     * @return this
-     */
-    public HashCodeBuilder append(final long[] array) {
-        if (array == null) {
-            iTotal = iTotal * iConstant;
-        } else {
-            for (final long element : array) {
-                append(element);
-            }
-        }
-        return this;
-    }
-
-    /**
-     * <p>
-     * Append a <code>hashCode</code> for an <code>Object</code>.
-     * </p>
-     *
-     * @param object
-     *            the Object to add to the <code>hashCode</code>
-     * @return this
-     */
-    public HashCodeBuilder append(final Object object) {
-        if (object == null) {
-            iTotal = iTotal * iConstant;
-
-        } else {
-            if(object.getClass().isArray()) {
-                // 'Switch' on type of array, to dispatch to the correct handler
-                // This handles multi dimensional arrays
-                if (object instanceof long[]) {
-                    append((long[]) object);
-                } else if (object instanceof int[]) {
-                    append((int[]) object);
-                } else if (object instanceof short[]) {
-                    append((short[]) object);
-                } else if (object instanceof char[]) {
-                    append((char[]) object);
-                } else if (object instanceof byte[]) {
-                    append((byte[]) object);
-                } else if (object instanceof double[]) {
-                    append((double[]) object);
-                } else if (object instanceof float[]) {
-                    append((float[]) object);
-                } else if (object instanceof boolean[]) {
-                    append((boolean[]) object);
-                } else {
-                    // Not an array of primitives
-                    append((Object[]) object);
-                }
-            } else {
-                iTotal = iTotal * iConstant + object.hashCode();
-            }
-        }
-        return this;
-    }
-
-    /**
-     * <p>
-     * Append a <code>hashCode</code> for an <code>Object</code> array.
-     * </p>
-     *
-     * @param array
-     *            the array to add to the <code>hashCode</code>
-     * @return this
-     */
-    public HashCodeBuilder append(final Object[] array) {
-        if (array == null) {
-            iTotal = iTotal * iConstant;
-        } else {
-            for (final Object element : array) {
-                append(element);
-            }
-        }
-        return this;
-    }
-
-    /**
-     * <p>
-     * Append a <code>hashCode</code> for a <code>short</code>.
-     * </p>
-     *
-     * @param value
-     *            the short to add to the <code>hashCode</code>
-     * @return this
-     */
-    public HashCodeBuilder append(final short value) {
-        iTotal = iTotal * iConstant + value;
-        return this;
-    }
-
-    /**
-     * <p>
-     * Append a <code>hashCode</code> for a <code>short</code> array.
-     * </p>
-     *
-     * @param array
-     *            the array to add to the <code>hashCode</code>
-     * @return this
-     */
-    public HashCodeBuilder append(final short[] array) {
-        if (array == null) {
-            iTotal = iTotal * iConstant;
-        } else {
-            for (final short element : array) {
-                append(element);
-            }
-        }
-        return this;
-    }
-
-    /**
-     * <p>
-     * Adds the result of super.hashCode() to this builder.
-     * </p>
-     *
-     * @param superHashCode
-     *            the result of calling <code>super.hashCode()</code>
-     * @return this HashCodeBuilder, used to chain calls.
-     * @since 2.0
-     */
-    public HashCodeBuilder appendSuper(final int superHashCode) {
-        iTotal = iTotal * iConstant + superHashCode;
-        return this;
-    }
-
-    /**
-     * <p>
-     * Return the computed <code>hashCode</code>.
-     * </p>
-     *
-     * @return <code>hashCode</code> based on the fields appended
-     */
-    public int toHashCode() {
-        return iTotal;
-    }
-
-    /**
-     * Returns the computed <code>hashCode</code>.
-     *
-     * @return <code>hashCode</code> based on the fields appended
-     *
-     * @since 3.0
-     */
-    @Override
-    public Integer build() {
-        return Integer.valueOf(toHashCode());
-    }
-
-    /**
-     * <p>
-     * The computed <code>hashCode</code> from toHashCode() is returned due to the likelihood
-     * of bugs in mis-calling toHashCode() and the unlikeliness of it mattering what the hashCode for
-     * HashCodeBuilder itself is.</p>
-     *
-     * @return <code>hashCode</code> based on the fields appended
-     * @since 2.5
-     */
-    @Override
-    public int hashCode() {
-        return toHashCode();
-    }
-
-}
diff --git a/lang/src/main/java/org/apache/commons/lang3/builder/IDKey.java b/lang/src/main/java/org/apache/commons/lang3/builder/IDKey.java
deleted file mode 100644
index 4f20919..0000000
--- a/lang/src/main/java/org/apache/commons/lang3/builder/IDKey.java
+++ /dev/null
@@ -1,74 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- * 
- */
-
-package org.apache.commons.lang3.builder;
-
-// adapted from org.apache.axis.utils.IDKey
-
-/**
- * Wrap an identity key (System.identityHashCode()) 
- * so that an object can only be equal() to itself.
- * 
- * This is necessary to disambiguate the occasional duplicate
- * identityHashCodes that can occur.
- * 
- */ 
-final class IDKey {
-        private final Object value;
-        private final int id;
-
-        /**
-         * Constructor for IDKey
-         * @param _value The value
-         */ 
-        public IDKey(final Object _value) {
-            // This is the Object hashcode 
-            id = System.identityHashCode(_value);  
-            // There have been some cases (LANG-459) that return the 
-            // same identity hash code for different objects.  So 
-            // the value is also added to disambiguate these cases.
-            value = _value;
-        }
-
-        /**
-         * returns hashcode - i.e. the system identity hashcode.
-         * @return the hashcode
-         */ 
-        @Override
-        public int hashCode() {
-           return id;
-        }
-
-        /**
-         * checks if instances are equal
-         * @param other The other object to compare to
-         * @return if the instances are for the same object
-         */ 
-        @Override
-        public boolean equals(final Object other) {
-            if (!(other instanceof IDKey)) {
-                return false;
-            }
-            final IDKey idKey = (IDKey) other;
-            if (id != idKey.id) {
-                return false;
-            }
-            // Note that identity equals is used.
-            return value == idKey.value;
-         }
-}
diff --git a/lang/src/main/java/org/apache/commons/lang3/builder/MultilineRecursiveToStringStyle.java b/lang/src/main/java/org/apache/commons/lang3/builder/MultilineRecursiveToStringStyle.java
deleted file mode 100644
index a417915..0000000
--- a/lang/src/main/java/org/apache/commons/lang3/builder/MultilineRecursiveToStringStyle.java
+++ /dev/null
@@ -1,220 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- * 
- *      http://www.apache.org/licenses/LICENSE-2.0
- * 
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package org.apache.commons.lang3.builder;
-
-import org.apache.commons.lang3.ClassUtils;
-import org.apache.commons.lang3.SystemUtils;
-
-/**
- * <p>Works with {@link ToStringBuilder} to create a "deep" <code>toString</code>.
- * But instead a single line like the {@link RecursiveToStringStyle} this creates a multiline String 
- * similar to the {@link ToStringStyle#MULTI_LINE_STYLE}.</p>
- * 
- * <p>To use this class write code as follows:</p>
- *
- * <pre>
- * public class Job {
- *   String title;
- *   ...
- * }
- * 
- * public class Person {
- *   String name;
- *   int age;
- *   boolean smoker;
- *   Job job;
- * 
- *   ...
- * 
- *   public String toString() {
- *     return new ReflectionToStringBuilder(this, new MultilineRecursiveToStringStyle()).toString();
- *   }
- * }
- * </pre>
- *
- * <p>
- * This will produce a toString of the format:<br>
- * <code>Person@7f54[ <br>
- * &nbsp; name=Stephen, <br>
- * &nbsp; age=29, <br>
- * &nbsp; smoker=false, <br>
- * &nbsp; job=Job@43cd2[ <br>
- * &nbsp; &nbsp; title=Manager <br>
- * &nbsp;  ] <br>
- * ]
- * </code>
- * </p>
- * 
- * @since 3.4
- * @version $Id$
- */
-class MultilineRecursiveToStringStyle extends RecursiveToStringStyle {
-
-    /**
-     * Required for serialization support.
-     * @see java.io.Serializable
-     */
-    private static final long serialVersionUID = 1L;
-
-    /** Indenting of inner lines. */
-    private int indent = 2;
-
-    /** Current indenting. */
-    private int spaces = 2;
-
-    /**
-     * Constructor.
-     */
-    public MultilineRecursiveToStringStyle() {
-        super();
-        resetIndent();
-    }
-
-    /**
-     * Resets the fields responsible for the line breaks and indenting. 
-     * Must be invoked after changing the {@link #spaces} value.
-     */
-    private void resetIndent() {
-        setArrayStart("{" + SystemUtils.LINE_SEPARATOR + spacer(spaces));
-        setArraySeparator("," + SystemUtils.LINE_SEPARATOR + spacer(spaces));
-        setArrayEnd(SystemUtils.LINE_SEPARATOR + spacer(spaces - indent) + "}");
-
-        setContentStart("[" + SystemUtils.LINE_SEPARATOR + spacer(spaces));
-        setFieldSeparator("," + SystemUtils.LINE_SEPARATOR + spacer(spaces));
-        setContentEnd(SystemUtils.LINE_SEPARATOR + spacer(spaces - indent) + "]");
-    }
-
-    /**
-     * Creates a StringBuilder responsible for the indenting.
-     * 
-     * @param spaces how far to indent
-     * @return a StringBuilder with {spaces} leading space characters.
-     */
-    private StringBuilder spacer(int spaces) {
-        StringBuilder sb = new StringBuilder();
-        for (int i = 0; i < spaces; i++) {
-            sb.append(" ");
-        }
-        return sb;
-    }
-
-    @Override
-    public void appendDetail(StringBuffer buffer, String fieldName, Object value) {
-        if (!ClassUtils.isPrimitiveWrapper(value.getClass()) && !String.class.equals(value.getClass())
-                && accept(value.getClass())) {
-            spaces += indent;
-            resetIndent();
-            buffer.append(ReflectionToStringBuilder.toString(value, this));
-            spaces -= indent;
-            resetIndent();
-        } else {
-            super.appendDetail(buffer, fieldName, value);
-        }
-    }
-
-    @Override
-    protected void appendDetail(final StringBuffer buffer, final String fieldName, final Object[] array) {
-        spaces += indent;
-        resetIndent();
-        super.appendDetail(buffer, fieldName, array);
-        spaces -= indent;
-        resetIndent();
-    }
-
-    @Override
-    protected void reflectionAppendArrayDetail(final StringBuffer buffer, final String fieldName, final Object array) {
-        spaces += indent;
-        resetIndent();
-        super.appendDetail(buffer, fieldName, array);
-        spaces -= indent;
-        resetIndent();
-    }
-
-    @Override
-    protected void appendDetail(final StringBuffer buffer, final String fieldName, final long[] array) {
-        spaces += indent;
-        resetIndent();
-        super.appendDetail(buffer, fieldName, array);
-        spaces -= indent;
-        resetIndent();
-    }
-
-    @Override
-    protected void appendDetail(final StringBuffer buffer, final String fieldName, final int[] array) {
-        spaces += indent;
-        resetIndent();
-        super.appendDetail(buffer, fieldName, array);
-        spaces -= indent;
-        resetIndent();
-    }
-
-    @Override
-    protected void appendDetail(final StringBuffer buffer, final String fieldName, final short[] array) {
-        spaces += indent;
-        resetIndent();
-        super.appendDetail(buffer, fieldName, array);
-        spaces -= indent;
-        resetIndent();
-    }
-
-    @Override
-    protected void appendDetail(final StringBuffer buffer, final String fieldName, final byte[] array) {
-        spaces += indent;
-        resetIndent();
-        super.appendDetail(buffer, fieldName, array);
-        spaces -= indent;
-        resetIndent();
-    }
-
-    @Override
-    protected void appendDetail(final StringBuffer buffer, final String fieldName, final char[] array) {
-        spaces += indent;
-        resetIndent();
-        super.appendDetail(buffer, fieldName, array);
-        spaces -= indent;
-        resetIndent();
-    }
-
-    @Override
-    protected void appendDetail(final StringBuffer buffer, final String fieldName, final double[] array) {
-        spaces += indent;
-        resetIndent();
-        super.appendDetail(buffer, fieldName, array);
-        spaces -= indent;
-        resetIndent();
-    }
-
-    @Override
-    protected void appendDetail(final StringBuffer buffer, final String fieldName, final float[] array) {
-        spaces += indent;
-        resetIndent();
-        super.appendDetail(buffer, fieldName, array);
-        spaces -= indent;
-        resetIndent();
-    }
-
-    @Override
-    protected void appendDetail(final StringBuffer buffer, final String fieldName, final boolean[] array) {
-        spaces += indent;
-        resetIndent();
-        super.appendDetail(buffer, fieldName, array);
-        spaces -= indent;
-        resetIndent();
-    }
-
-}
\ No newline at end of file
diff --git a/lang/src/main/java/org/apache/commons/lang3/builder/RecursiveToStringStyle.java b/lang/src/main/java/org/apache/commons/lang3/builder/RecursiveToStringStyle.java
deleted file mode 100644
index 99fb5e4..0000000
--- a/lang/src/main/java/org/apache/commons/lang3/builder/RecursiveToStringStyle.java
+++ /dev/null
@@ -1,100 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.commons.lang3.builder;
-
-import java.util.Collection;
-
-import org.apache.commons.lang3.ClassUtils;
-
-/**
- * <p>Works with {@link ToStringBuilder} to create a "deep" <code>toString</code>.</p>
- *
- * <p>To use this class write code as follows:</p>
- *
- * <pre>
- * public class Job {
- *   String title;
- *   ...
- * }
- * 
- * public class Person {
- *   String name;
- *   int age;
- *   boolean smoker;
- *   Job job;
- *
- *   ...
- *
- *   public String toString() {
- *     return new ReflectionToStringBuilder(this, new RecursiveToStringStyle()).toString();
- *   }
- * }
- * </pre>
- *
- * <p>This will produce a toString of the format:
- * <code>Person@7f54[name=Stephen,age=29,smoker=false,job=Job@43cd2[title=Manager]]</code></p>
- * 
- * @since 3.2
- * @version $Id$
- */
-public class RecursiveToStringStyle extends ToStringStyle {
-
-    /**
-     * Required for serialization support.
-     * 
-     * @see java.io.Serializable
-     */
-    private static final long serialVersionUID = 1L;
-
-    /**
-     * <p>Constructor.</p>
-     */
-    public RecursiveToStringStyle() {
-        super();
-    }
-
-    @Override
-    public void appendDetail(final StringBuffer buffer, final String fieldName, final Object value) {
-        if (!ClassUtils.isPrimitiveWrapper(value.getClass()) &&
-            !String.class.equals(value.getClass()) &&
-            accept(value.getClass())) {
-            buffer.append(ReflectionToStringBuilder.toString(value, this));
-        } else {
-            super.appendDetail(buffer, fieldName, value);
-        }
-    }
-
-    @Override
-    protected void appendDetail(final StringBuffer buffer, final String fieldName, final Collection<?> coll) {
-        appendClassName(buffer, coll);
-        appendIdentityHashCode(buffer, coll);
-        appendDetail(buffer, fieldName, coll.toArray());
-    }
-    
-    /**
-     * Returns whether or not to recursively format the given <code>Class</code>.
-     * By default, this method always returns {@code true}, but may be overwritten by
-     * sub-classes to filter specific classes.
-     *
-     * @param clazz
-     *            The class to test.
-     * @return Whether or not to recursively format the given <code>Class</code>.
-     */
-    protected boolean accept(final Class<?> clazz) {
-        return true;
-    }
-}
diff --git a/lang/src/main/java/org/apache/commons/lang3/builder/ReflectionToStringBuilder.java b/lang/src/main/java/org/apache/commons/lang3/builder/ReflectionToStringBuilder.java
deleted file mode 100644
index 5b992bd..0000000
--- a/lang/src/main/java/org/apache/commons/lang3/builder/ReflectionToStringBuilder.java
+++ /dev/null
@@ -1,696 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package org.apache.commons.lang3.builder;
-
-import java.lang.reflect.AccessibleObject;
-import java.lang.reflect.Field;
-import java.lang.reflect.Modifier;
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.Collection;
-import java.util.List;
-
-import org.apache.commons.lang3.ArrayUtils;
-import org.apache.commons.lang3.ClassUtils;
-
-/**
- * <p>
- * Assists in implementing {@link Object#toString()} methods using reflection.
- * </p>
- * <p>
- * This class uses reflection to determine the fields to append. Because these fields are usually private, the class
- * uses {@link java.lang.reflect.AccessibleObject#setAccessible(java.lang.reflect.AccessibleObject[], boolean)} to
- * change the visibility of the fields. This will fail under a security manager, unless the appropriate permissions are
- * set up correctly.
- * </p>
- * <p>
- * Using reflection to access (private) fields circumvents any synchronization protection guarding access to these
- * fields. If a toString method cannot safely read a field, you should exclude it from the toString method, or use
- * synchronization consistent with the class' lock management around the invocation of the method. Take special care to
- * exclude non-thread-safe collection classes, because these classes may throw ConcurrentModificationException if
- * modified while the toString method is executing.
- * </p>
- * <p>
- * A typical invocation for this method would look like:
- * </p>
- * <pre>
- * public String toString() {
- *     return ReflectionToStringBuilder.toString(this);
- * }
- * </pre>
- * <p>
- * You can also use the builder to debug 3rd party objects:
- * </p>
- * <pre>
- * System.out.println(&quot;An object: &quot; + ReflectionToStringBuilder.toString(anObject));
- * </pre>
- * <p>
- * A subclass can control field output by overriding the methods:
- * </p>
- * <ul>
- * <li>{@link #accept(java.lang.reflect.Field)}</li>
- * <li>{@link #getValue(java.lang.reflect.Field)}</li>
- * </ul>
- * <p>
- * For example, this method does <i>not</i> include the <code>password</code> field in the returned <code>String</code>:
- * </p>
- * <pre>
- * public String toString() {
- *     return (new ReflectionToStringBuilder(this) {
- *         protected boolean accept(Field f) {
- *             return super.accept(f) &amp;&amp; !f.getName().equals(&quot;password&quot;);
- *         }
- *     }).toString();
- * }
- * </pre>
- * <p>
- * The exact format of the <code>toString</code> is determined by the {@link ToStringStyle} passed into the constructor.
- * </p>
- *
- * <p>
- * <b>Note:</b> the default {@link ToStringStyle} will only do a "shallow" formatting, i.e. composed objects are not
- * further traversed. To get "deep" formatting, use an instance of {@link RecursiveToStringStyle}.
- * </p>
- *
- * @since 2.0
- * @version $Id$
- */
-public class ReflectionToStringBuilder extends ToStringBuilder {
-
-    /**
-     * <p>
-     * Builds a <code>toString</code> value using the default <code>ToStringStyle</code> through reflection.
-     * </p>
-     *
-     * <p>
-     * It uses <code>AccessibleObject.setAccessible</code> to gain access to private fields. This means that it will
-     * throw a security exception if run under a security manager, if the permissions are not set up correctly. It is
-     * also not as efficient as testing explicitly.
-     * </p>
-     *
-     * <p>
-     * Transient members will be not be included, as they are likely derived. Static fields will not be included.
-     * Superclass fields will be appended.
-     * </p>
-     *
-     * @param object
-     *            the Object to be output
-     * @return the String result
-     * @throws IllegalArgumentException
-     *             if the Object is <code>null</code>
-     */
-    public static String toString(final Object object) {
-        return toString(object, null, false, false, null);
-    }
-
-    /**
-     * <p>
-     * Builds a <code>toString</code> value through reflection.
-     * </p>
-     *
-     * <p>
-     * It uses <code>AccessibleObject.setAccessible</code> to gain access to private fields. This means that it will
-     * throw a security exception if run under a security manager, if the permissions are not set up correctly. It is
-     * also not as efficient as testing explicitly.
-     * </p>
-     *
-     * <p>
-     * Transient members will be not be included, as they are likely derived. Static fields will not be included.
-     * Superclass fields will be appended.
-     * </p>
-     *
-     * <p>
-     * If the style is <code>null</code>, the default <code>ToStringStyle</code> is used.
-     * </p>
-     *
-     * @param object
-     *            the Object to be output
-     * @param style
-     *            the style of the <code>toString</code> to create, may be <code>null</code>
-     * @return the String result
-     * @throws IllegalArgumentException
-     *             if the Object or <code>ToStringStyle</code> is <code>null</code>
-     */
-    public static String toString(final Object object, final ToStringStyle style) {
-        return toString(object, style, false, false, null);
-    }
-
-    /**
-     * <p>
-     * Builds a <code>toString</code> value through reflection.
-     * </p>
-     *
-     * <p>
-     * It uses <code>AccessibleObject.setAccessible</code> to gain access to private fields. This means that it will
-     * throw a security exception if run under a security manager, if the permissions are not set up correctly. It is
-     * also not as efficient as testing explicitly.
-     * </p>
-     *
-     * <p>
-     * If the <code>outputTransients</code> is <code>true</code>, transient members will be output, otherwise they
-     * are ignored, as they are likely derived fields, and not part of the value of the Object.
-     * </p>
-     *
-     * <p>
-     * Static fields will not be included. Superclass fields will be appended.
-     * </p>
-     *
-     * <p>
-     * If the style is <code>null</code>, the default <code>ToStringStyle</code> is used.
-     * </p>
-     *
-     * @param object
-     *            the Object to be output
-     * @param style
-     *            the style of the <code>toString</code> to create, may be <code>null</code>
-     * @param outputTransients
-     *            whether to include transient fields
-     * @return the String result
-     * @throws IllegalArgumentException
-     *             if the Object is <code>null</code>
-     */
-    public static String toString(final Object object, final ToStringStyle style, final boolean outputTransients) {
-        return toString(object, style, outputTransients, false, null);
-    }
-
-    /**
-     * <p>
-     * Builds a <code>toString</code> value through reflection.
-     * </p>
-     *
-     * <p>
-     * It uses <code>AccessibleObject.setAccessible</code> to gain access to private fields. This means that it will
-     * throw a security exception if run under a security manager, if the permissions are not set up correctly. It is
-     * also not as efficient as testing explicitly.
-     * </p>
-     *
-     * <p>
-     * If the <code>outputTransients</code> is <code>true</code>, transient fields will be output, otherwise they
-     * are ignored, as they are likely derived fields, and not part of the value of the Object.
-     * </p>
-     *
-     * <p>
-     * If the <code>outputStatics</code> is <code>true</code>, static fields will be output, otherwise they are
-     * ignored.
-     * </p>
-     *
-     * <p>
-     * Static fields will not be included. Superclass fields will be appended.
-     * </p>
-     *
-     * <p>
-     * If the style is <code>null</code>, the default <code>ToStringStyle</code> is used.
-     * </p>
-     *
-     * @param object
-     *            the Object to be output
-     * @param style
-     *            the style of the <code>toString</code> to create, may be <code>null</code>
-     * @param outputTransients
-     *            whether to include transient fields
-     * @param outputStatics
-     *            whether to include transient fields
-     * @return the String result
-     * @throws IllegalArgumentException
-     *             if the Object is <code>null</code>
-     * @since 2.1
-     */
-    public static String toString(final Object object, final ToStringStyle style, final boolean outputTransients, final boolean outputStatics) {
-        return toString(object, style, outputTransients, outputStatics, null);
-    }
-
-    /**
-     * <p>
-     * Builds a <code>toString</code> value through reflection.
-     * </p>
-     *
-     * <p>
-     * It uses <code>AccessibleObject.setAccessible</code> to gain access to private fields. This means that it will
-     * throw a security exception if run under a security manager, if the permissions are not set up correctly. It is
-     * also not as efficient as testing explicitly.
-     * </p>
-     *
-     * <p>
-     * If the <code>outputTransients</code> is <code>true</code>, transient fields will be output, otherwise they
-     * are ignored, as they are likely derived fields, and not part of the value of the Object.
-     * </p>
-     *
-     * <p>
-     * If the <code>outputStatics</code> is <code>true</code>, static fields will be output, otherwise they are
-     * ignored.
-     * </p>
-     *
-     * <p>
-     * Superclass fields will be appended up to and including the specified superclass. A null superclass is treated as
-     * <code>java.lang.Object</code>.
-     * </p>
-     *
-     * <p>
-     * If the style is <code>null</code>, the default <code>ToStringStyle</code> is used.
-     * </p>
-     *
-     * @param <T>
-     *            the type of the object
-     * @param object
-     *            the Object to be output
-     * @param style
-     *            the style of the <code>toString</code> to create, may be <code>null</code>
-     * @param outputTransients
-     *            whether to include transient fields
-     * @param outputStatics
-     *            whether to include static fields
-     * @param reflectUpToClass
-     *            the superclass to reflect up to (inclusive), may be <code>null</code>
-     * @return the String result
-     * @throws IllegalArgumentException
-     *             if the Object is <code>null</code>
-     * @since 2.1
-     */
-    public static <T> String toString(
-            final T object, final ToStringStyle style, final boolean outputTransients,
-            final boolean outputStatics, final Class<? super T> reflectUpToClass) {
-        return new ReflectionToStringBuilder(object, style, null, reflectUpToClass, outputTransients, outputStatics)
-                .toString();
-    }
-
-    /**
-     * Builds a String for a toString method excluding the given field names.
-     *
-     * @param object
-     *            The object to "toString".
-     * @param excludeFieldNames
-     *            The field names to exclude. Null excludes nothing.
-     * @return The toString value.
-     */
-    public static String toStringExclude(final Object object, final Collection<String> excludeFieldNames) {
-        return toStringExclude(object, toNoNullStringArray(excludeFieldNames));
-    }
-
-    /**
-     * Converts the given Collection into an array of Strings. The returned array does not contain <code>null</code>
-     * entries. Note that {@link Arrays#sort(Object[])} will throw an {@link NullPointerException} if an array element
-     * is <code>null</code>.
-     *
-     * @param collection
-     *            The collection to convert
-     * @return A new array of Strings.
-     */
-    static String[] toNoNullStringArray(final Collection<String> collection) {
-        if (collection == null) {
-            return ArrayUtils.EMPTY_STRING_ARRAY;
-        }
-        return toNoNullStringArray(collection.toArray());
-    }
-
-    /**
-     * Returns a new array of Strings without null elements. Internal method used to normalize exclude lists
-     * (arrays and collections). Note that {@link Arrays#sort(Object[])} will throw an {@link NullPointerException}
-     * if an array element is <code>null</code>.
-     *
-     * @param array
-     *            The array to check
-     * @return The given array or a new array without null.
-     */
-    static String[] toNoNullStringArray(final Object[] array) {
-        final List<String> list = new ArrayList<String>(array.length);
-        for (final Object e : array) {
-            if (e != null) {
-                list.add(e.toString());
-            }
-        }
-        return list.toArray(ArrayUtils.EMPTY_STRING_ARRAY);
-    }
-
-
-    /**
-     * Builds a String for a toString method excluding the given field names.
-     *
-     * @param object
-     *            The object to "toString".
-     * @param excludeFieldNames
-     *            The field names to exclude
-     * @return The toString value.
-     */
-    public static String toStringExclude(final Object object, final String... excludeFieldNames) {
-        return new ReflectionToStringBuilder(object).setExcludeFieldNames(excludeFieldNames).toString();
-    }
-
-    /**
-     * Whether or not to append static fields.
-     */
-    private boolean appendStatics = false;
-
-    /**
-     * Whether or not to append transient fields.
-     */
-    private boolean appendTransients = false;
-
-    /**
-     * Which field names to exclude from output. Intended for fields like <code>"password"</code>.
-     *
-     * @since 3.0 this is protected instead of private
-     */
-    protected String[] excludeFieldNames;
-
-    /**
-     * The last super class to stop appending fields for.
-     */
-    private Class<?> upToClass = null;
-
-    /**
-     * <p>
-     * Constructor.
-     * </p>
-     *
-     * <p>
-     * This constructor outputs using the default style set with <code>setDefaultStyle</code>.
-     * </p>
-     *
-     * @param object
-     *            the Object to build a <code>toString</code> for, must not be <code>null</code>
-     * @throws IllegalArgumentException
-     *             if the Object passed in is <code>null</code>
-     */
-    public ReflectionToStringBuilder(final Object object) {
-        super(object);
-    }
-
-    /**
-     * <p>
-     * Constructor.
-     * </p>
-     *
-     * <p>
-     * If the style is <code>null</code>, the default style is used.
-     * </p>
-     *
-     * @param object
-     *            the Object to build a <code>toString</code> for, must not be <code>null</code>
-     * @param style
-     *            the style of the <code>toString</code> to create, may be <code>null</code>
-     * @throws IllegalArgumentException
-     *             if the Object passed in is <code>null</code>
-     */
-    public ReflectionToStringBuilder(final Object object, final ToStringStyle style) {
-        super(object, style);
-    }
-
-    /**
-     * <p>
-     * Constructor.
-     * </p>
-     *
-     * <p>
-     * If the style is <code>null</code>, the default style is used.
-     * </p>
-     *
-     * <p>
-     * If the buffer is <code>null</code>, a new one is created.
-     * </p>
-     *
-     * @param object
-     *            the Object to build a <code>toString</code> for
-     * @param style
-     *            the style of the <code>toString</code> to create, may be <code>null</code>
-     * @param buffer
-     *            the <code>StringBuffer</code> to populate, may be <code>null</code>
-     * @throws IllegalArgumentException
-     *             if the Object passed in is <code>null</code>
-     */
-    public ReflectionToStringBuilder(final Object object, final ToStringStyle style, final StringBuffer buffer) {
-        super(object, style, buffer);
-    }
-
-    /**
-     * Constructor.
-     *
-     * @param <T>
-     *            the type of the object
-     * @param object
-     *            the Object to build a <code>toString</code> for
-     * @param style
-     *            the style of the <code>toString</code> to create, may be <code>null</code>
-     * @param buffer
-     *            the <code>StringBuffer</code> to populate, may be <code>null</code>
-     * @param reflectUpToClass
-     *            the superclass to reflect up to (inclusive), may be <code>null</code>
-     * @param outputTransients
-     *            whether to include transient fields
-     * @param outputStatics
-     *            whether to include static fields
-     * @since 2.1
-     */
-    public <T> ReflectionToStringBuilder(
-            final T object, final ToStringStyle style, final StringBuffer buffer,
-            final Class<? super T> reflectUpToClass, final boolean outputTransients, final boolean outputStatics) {
-        super(object, style, buffer);
-        this.setUpToClass(reflectUpToClass);
-        this.setAppendTransients(outputTransients);
-        this.setAppendStatics(outputStatics);
-    }
-
-    /**
-     * Returns whether or not to append the given <code>Field</code>.
-     * <ul>
-     * <li>Transient fields are appended only if {@link #isAppendTransients()} returns <code>true</code>.
-     * <li>Static fields are appended only if {@link #isAppendStatics()} returns <code>true</code>.
-     * <li>Inner class fields are not appended.</li>
-     * </ul>
-     *
-     * @param field
-     *            The Field to test.
-     * @return Whether or not to append the given <code>Field</code>.
-     */
-    protected boolean accept(final Field field) {
-        if (field.getName().indexOf(ClassUtils.INNER_CLASS_SEPARATOR_CHAR) != -1) {
-            // Reject field from inner class.
-            return false;
-        }
-        if (Modifier.isTransient(field.getModifiers()) && !this.isAppendTransients()) {
-            // Reject transient fields.
-            return false;
-        }
-        if (Modifier.isStatic(field.getModifiers()) && !this.isAppendStatics()) {
-            // Reject static fields.
-            return false;
-        }
-        if (this.excludeFieldNames != null
-            && Arrays.binarySearch(this.excludeFieldNames, field.getName()) >= 0) {
-            // Reject fields from the getExcludeFieldNames list.
-            return false;
-        }
-        return true;
-    }
-
-    /**
-     * <p>
-     * Appends the fields and values defined by the given object of the given Class.
-     * </p>
-     *
-     * <p>
-     * If a cycle is detected as an object is &quot;toString()'ed&quot;, such an object is rendered as if
-     * <code>Object.toString()</code> had been called and not implemented by the object.
-     * </p>
-     *
-     * @param clazz
-     *            The class of object parameter
-     */
-    protected void appendFieldsIn(final Class<?> clazz) {
-        if (clazz.isArray()) {
-            this.reflectionAppendArray(this.getObject());
-            return;
-        }
-        final Field[] fields = clazz.getDeclaredFields();
-        AccessibleObject.setAccessible(fields, true);
-        for (final Field field : fields) {
-            final String fieldName = field.getName();
-            if (this.accept(field)) {
-                try {
-                    // Warning: Field.get(Object) creates wrappers objects
-                    // for primitive types.
-                    final Object fieldValue = this.getValue(field);
-                    this.append(fieldName, fieldValue);
-                } catch (final IllegalAccessException ex) {
-                    //this can't happen. Would get a Security exception
-                    // instead
-                    //throw a runtime exception in case the impossible
-                    // happens.
-                    throw new InternalError("Unexpected IllegalAccessException: " + ex.getMessage());
-                }
-            }
-        }
-    }
-
-    /**
-     * @return Returns the excludeFieldNames.
-     */
-    public String[] getExcludeFieldNames() {
-        return this.excludeFieldNames.clone();
-    }
-
-    /**
-     * <p>
-     * Gets the last super class to stop appending fields for.
-     * </p>
-     *
-     * @return The last super class to stop appending fields for.
-     */
-    public Class<?> getUpToClass() {
-        return this.upToClass;
-    }
-
-    /**
-     * <p>
-     * Calls <code>java.lang.reflect.Field.get(Object)</code>.
-     * </p>
-     *
-     * @param field
-     *            The Field to query.
-     * @return The Object from the given Field.
-     *
-     * @throws IllegalArgumentException
-     *             see {@link java.lang.reflect.Field#get(Object)}
-     * @throws IllegalAccessException
-     *             see {@link java.lang.reflect.Field#get(Object)}
-     *
-     * @see java.lang.reflect.Field#get(Object)
-     */
-    protected Object getValue(final Field field) throws IllegalArgumentException, IllegalAccessException {
-        return field.get(this.getObject());
-    }
-
-    /**
-     * <p>
-     * Gets whether or not to append static fields.
-     * </p>
-     *
-     * @return Whether or not to append static fields.
-     * @since 2.1
-     */
-    public boolean isAppendStatics() {
-        return this.appendStatics;
-    }
-
-    /**
-     * <p>
-     * Gets whether or not to append transient fields.
-     * </p>
-     *
-     * @return Whether or not to append transient fields.
-     */
-    public boolean isAppendTransients() {
-        return this.appendTransients;
-    }
-
-    /**
-     * <p>
-     * Append to the <code>toString</code> an <code>Object</code> array.
-     * </p>
-     *
-     * @param array
-     *            the array to add to the <code>toString</code>
-     * @return this
-     */
-    public ReflectionToStringBuilder reflectionAppendArray(final Object array) {
-        this.getStyle().reflectionAppendArrayDetail(this.getStringBuffer(), null, array);
-        return this;
-    }
-
-    /**
-     * <p>
-     * Sets whether or not to append static fields.
-     * </p>
-     *
-     * @param appendStatics
-     *            Whether or not to append static fields.
-     * @since 2.1
-     */
-    public void setAppendStatics(final boolean appendStatics) {
-        this.appendStatics = appendStatics;
-    }
-
-    /**
-     * <p>
-     * Sets whether or not to append transient fields.
-     * </p>
-     *
-     * @param appendTransients
-     *            Whether or not to append transient fields.
-     */
-    public void setAppendTransients(final boolean appendTransients) {
-        this.appendTransients = appendTransients;
-    }
-
-    /**
-     * Sets the field names to exclude.
-     *
-     * @param excludeFieldNamesParam
-     *            The excludeFieldNames to excluding from toString or <code>null</code>.
-     * @return <code>this</code>
-     */
-    public ReflectionToStringBuilder setExcludeFieldNames(final String... excludeFieldNamesParam) {
-        if (excludeFieldNamesParam == null) {
-            this.excludeFieldNames = null;
-        } else {
-            //clone and remove nulls
-            this.excludeFieldNames = toNoNullStringArray(excludeFieldNamesParam);
-            Arrays.sort(this.excludeFieldNames);
-        }
-        return this;
-    }
-
-    /**
-     * <p>
-     * Sets the last super class to stop appending fields for.
-     * </p>
-     *
-     * @param clazz
-     *            The last super class to stop appending fields for.
-     */
-    public void setUpToClass(final Class<?> clazz) {
-        if (clazz != null) {
-            final Object object = getObject();
-            if (object != null && clazz.isInstance(object) == false) {
-                throw new IllegalArgumentException("Specified class is not a superclass of the object");
-            }
-        }
-        this.upToClass = clazz;
-    }
-
-    /**
-     * <p>
-     * Gets the String built by this builder.
-     * </p>
-     *
-     * @return the built string
-     */
-    @Override
-    public String toString() {
-        if (this.getObject() == null) {
-            return this.getStyle().getNullText();
-        }
-        Class<?> clazz = this.getObject().getClass();
-        this.appendFieldsIn(clazz);
-        while (clazz.getSuperclass() != null && clazz != this.getUpToClass()) {
-            clazz = clazz.getSuperclass();
-            this.appendFieldsIn(clazz);
-        }
-        return super.toString();
-    }
-
-}
diff --git a/lang/src/main/java/org/apache/commons/lang3/builder/StandardToStringStyle.java b/lang/src/main/java/org/apache/commons/lang3/builder/StandardToStringStyle.java
deleted file mode 100644
index 9291038..0000000
--- a/lang/src/main/java/org/apache/commons/lang3/builder/StandardToStringStyle.java
+++ /dev/null
@@ -1,560 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- * 
- *      http://www.apache.org/licenses/LICENSE-2.0
- * 
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.commons.lang3.builder;
-
-/**
- * <p>Works with {@link ToStringBuilder} to create a <code>toString</code>.</p>
- *
- * <p>This class is intended to be used as a singleton.
- * There is no need to instantiate a new style each time.
- * Simply instantiate the class once, customize the values as required, and
- * store the result in a public static final variable for the rest of the
- * program to access.</p>
- *
- * @since 1.0
- * @version $Id$
- */
-public class StandardToStringStyle extends ToStringStyle {
-    
-    /**
-     * Required for serialization support.
-     * 
-     * @see java.io.Serializable
-     */
-    private static final long serialVersionUID = 1L;
-
-    /**
-     * <p>Constructor.</p>
-     */
-    public StandardToStringStyle() {
-        super();
-    }
-    
-    //---------------------------------------------------------------------
-    
-    /**
-     * <p>Gets whether to use the class name.</p>
-     *
-     * @return the current useClassName flag
-     */
-    @Override
-    public boolean isUseClassName() { // NOPMD as this is implementing the abstract class
-        return super.isUseClassName();
-    }
-
-    /**
-     * <p>Sets whether to use the class name.</p>
-     *
-     * @param useClassName  the new useClassName flag
-     */
-    @Override
-    public void setUseClassName(final boolean useClassName) { // NOPMD as this is implementing the abstract class
-        super.setUseClassName(useClassName);
-    }
-
-    //---------------------------------------------------------------------
-    
-    /**
-     * <p>Gets whether to output short or long class names.</p>
-     *
-     * @return the current useShortClassName flag
-     * @since 2.0
-     */
-    @Override
-    public boolean isUseShortClassName() { // NOPMD as this is implementing the abstract class
-        return super.isUseShortClassName();
-    }
-
-    /**
-     * <p>Sets whether to output short or long class names.</p>
-     *
-     * @param useShortClassName  the new useShortClassName flag
-     * @since 2.0
-     */
-    @Override
-    public void setUseShortClassName(final boolean useShortClassName) { // NOPMD as this is implementing the abstract class
-        super.setUseShortClassName(useShortClassName);
-    }
-
-    //---------------------------------------------------------------------
-    
-    /**
-     * <p>Gets whether to use the identity hash code.</p>
-     * @return the current useIdentityHashCode flag
-     */
-    @Override
-    public boolean isUseIdentityHashCode() { // NOPMD as this is implementing the abstract class
-        return super.isUseIdentityHashCode();
-    }
-
-    /**
-     * <p>Sets whether to use the identity hash code.</p>
-     *
-     * @param useIdentityHashCode  the new useIdentityHashCode flag
-     */
-    @Override
-    public void setUseIdentityHashCode(final boolean useIdentityHashCode) { // NOPMD as this is implementing the abstract class
-        super.setUseIdentityHashCode(useIdentityHashCode);
-    }
-
-    //---------------------------------------------------------------------
-    
-    /**
-     * <p>Gets whether to use the field names passed in.</p>
-     *
-     * @return the current useFieldNames flag
-     */
-    @Override
-    public boolean isUseFieldNames() { // NOPMD as this is implementing the abstract class
-        return super.isUseFieldNames();
-    }
-
-    /**
-     * <p>Sets whether to use the field names passed in.</p>
-     *
-     * @param useFieldNames  the new useFieldNames flag
-     */
-    @Override
-    public void setUseFieldNames(final boolean useFieldNames) { // NOPMD as this is implementing the abstract class
-        super.setUseFieldNames(useFieldNames);
-    }
-
-    //---------------------------------------------------------------------
-    
-    /**
-     * <p>Gets whether to use full detail when the caller doesn't
-     * specify.</p>
-     *
-     * @return the current defaultFullDetail flag
-     */
-    @Override
-    public boolean isDefaultFullDetail() { // NOPMD as this is implementing the abstract class
-        return super.isDefaultFullDetail();
-    }
-
-    /**
-     * <p>Sets whether to use full detail when the caller doesn't
-     * specify.</p>
-     *
-     * @param defaultFullDetail  the new defaultFullDetail flag
-     */
-    @Override
-    public void setDefaultFullDetail(final boolean defaultFullDetail) { // NOPMD as this is implementing the abstract class
-        super.setDefaultFullDetail(defaultFullDetail);
-    }
-
-    //---------------------------------------------------------------------
-    
-    /**
-     * <p>Gets whether to output array content detail.</p>
-     *
-     * @return the current array content detail setting
-     */
-    @Override
-    public boolean isArrayContentDetail() { // NOPMD as this is implementing the abstract class
-        return super.isArrayContentDetail();
-    }
-    
-    /**
-     * <p>Sets whether to output array content detail.</p>
-     *
-     * @param arrayContentDetail  the new arrayContentDetail flag
-     */
-    @Override
-    public void setArrayContentDetail(final boolean arrayContentDetail) { // NOPMD as this is implementing the abstract class
-        super.setArrayContentDetail(arrayContentDetail);
-    }
-
-    //---------------------------------------------------------------------
-    
-    /**
-     * <p>Gets the array start text.</p>
-     *
-     * @return the current array start text
-     */
-    @Override
-    public String getArrayStart() { // NOPMD as this is implementing the abstract class
-        return super.getArrayStart();
-    }
-
-    /**
-     * <p>Sets the array start text.</p>
-     *
-     * <p><code>null</code> is accepted, but will be converted
-     * to an empty String.</p>
-     *
-     * @param arrayStart  the new array start text
-     */
-    @Override
-    public void setArrayStart(final String arrayStart) { // NOPMD as this is implementing the abstract class
-        super.setArrayStart(arrayStart);
-    }
-
-    //---------------------------------------------------------------------
-    
-    /**
-     * <p>Gets the array end text.</p>
-     *
-     * @return the current array end text
-     */
-    @Override
-    public String getArrayEnd() { // NOPMD as this is implementing the abstract class
-        return super.getArrayEnd();
-    }
-
-    /**
-     * <p>Sets the array end text.</p>
-     *
-     * <p><code>null</code> is accepted, but will be converted
-     * to an empty String.</p>
-     *
-     * @param arrayEnd  the new array end text
-     */
-    @Override
-    public void setArrayEnd(final String arrayEnd) { // NOPMD as this is implementing the abstract class
-        super.setArrayEnd(arrayEnd);
-    }
-
-    //---------------------------------------------------------------------
-    
-    /**
-     * <p>Gets the array separator text.</p>
-     *
-     * @return the current array separator text
-     */
-    @Override
-    public String getArraySeparator() { // NOPMD as this is implementing the abstract class
-        return super.getArraySeparator();
-    }
-
-    /**
-     * <p>Sets the array separator text.</p>
-     *
-     * <p><code>null</code> is accepted, but will be converted
-     * to an empty String.</p>
-     *
-     * @param arraySeparator  the new array separator text
-     */
-    @Override
-    public void setArraySeparator(final String arraySeparator) { // NOPMD as this is implementing the abstract class
-        super.setArraySeparator(arraySeparator);
-    }
-
-    //---------------------------------------------------------------------
-    
-    /**
-     * <p>Gets the content start text.</p>
-     *
-     * @return the current content start text
-     */
-    @Override
-    public String getContentStart() { // NOPMD as this is implementing the abstract class
-        return super.getContentStart();
-    }
-
-    /**
-     * <p>Sets the content start text.</p>
-     *
-     * <p><code>null</code> is accepted, but will be converted
-     * to an empty String.</p>
-     *
-     * @param contentStart  the new content start text
-     */
-    @Override
-    public void setContentStart(final String contentStart) { // NOPMD as this is implementing the abstract class
-        super.setContentStart(contentStart);
-    }
-
-    //---------------------------------------------------------------------
-    
-    /**
-     * <p>Gets the content end text.</p>
-     *
-     * @return the current content end text
-     */
-    @Override
-    public String getContentEnd() { // NOPMD as this is implementing the abstract class
-        return super.getContentEnd();
-    }
-
-    /**
-     * <p>Sets the content end text.</p>
-     *
-     * <p><code>null</code> is accepted, but will be converted
-     * to an empty String.</p>
-     *
-     * @param contentEnd  the new content end text
-     */
-    @Override
-    public void setContentEnd(final String contentEnd) { // NOPMD as this is implementing the abstract class
-        super.setContentEnd(contentEnd);
-    }
-
-    //---------------------------------------------------------------------
-    
-    /**
-     * <p>Gets the field name value separator text.</p>
-     *
-     * @return the current field name value separator text
-     */
-    @Override
-    public String getFieldNameValueSeparator() { // NOPMD as this is implementing the abstract class
-        return super.getFieldNameValueSeparator();
-    }
-
-    /**
-     * <p>Sets the field name value separator text.</p>
-     *
-     * <p><code>null</code> is accepted, but will be converted
-     * to an empty String.</p>
-     *
-     * @param fieldNameValueSeparator  the new field name value separator text
-     */
-    @Override
-    public void setFieldNameValueSeparator(final String fieldNameValueSeparator) { // NOPMD as this is implementing the abstract class
-        super.setFieldNameValueSeparator(fieldNameValueSeparator);
-    }
-
-    //---------------------------------------------------------------------
-    
-    /**
-     * <p>Gets the field separator text.</p>
-     *
-     * @return the current field separator text
-     */
-    @Override
-    public String getFieldSeparator() { // NOPMD as this is implementing the abstract class
-        return super.getFieldSeparator();
-    }
-
-    /**
-     * <p>Sets the field separator text.</p>
-     *
-     * <p><code>null</code> is accepted, but will be converted
-     * to an empty String.</p>
-     *
-     * @param fieldSeparator  the new field separator text
-     */
-    @Override
-    public void setFieldSeparator(final String fieldSeparator) { // NOPMD as this is implementing the abstract class
-        super.setFieldSeparator(fieldSeparator);
-    }
-
-    //---------------------------------------------------------------------
-    
-    /**
-     * <p>Gets whether the field separator should be added at the start 
-     * of each buffer.</p>
-     * 
-     * @return the fieldSeparatorAtStart flag
-     * @since 2.0
-     */
-    @Override
-    public boolean isFieldSeparatorAtStart() { // NOPMD as this is implementing the abstract class
-        return super.isFieldSeparatorAtStart();
-    }
-
-    /**
-     * <p>Sets whether the field separator should be added at the start 
-     * of each buffer.</p>
-     * 
-     * @param fieldSeparatorAtStart  the fieldSeparatorAtStart flag
-     * @since 2.0
-     */
-    @Override
-    public void setFieldSeparatorAtStart(final boolean fieldSeparatorAtStart) { // NOPMD as this is implementing the abstract class
-        super.setFieldSeparatorAtStart(fieldSeparatorAtStart);
-    }
-
-    //---------------------------------------------------------------------
-    
-    /**
-     * <p>Gets whether the field separator should be added at the end 
-     * of each buffer.</p>
-     * 
-     * @return fieldSeparatorAtEnd flag
-     * @since 2.0
-     */
-    @Override
-    public boolean isFieldSeparatorAtEnd() { // NOPMD as this is implementing the abstract class
-        return super.isFieldSeparatorAtEnd();
-    }
-
-    /**
-     * <p>Sets whether the field separator should be added at the end 
-     * of each buffer.</p>
-     * 
-     * @param fieldSeparatorAtEnd  the fieldSeparatorAtEnd flag
-     * @since 2.0
-     */
-    @Override
-    public void setFieldSeparatorAtEnd(final boolean fieldSeparatorAtEnd) { // NOPMD as this is implementing the abstract class
-        super.setFieldSeparatorAtEnd(fieldSeparatorAtEnd);
-    }
-
-    //---------------------------------------------------------------------
-    
-    /**
-     * <p>Gets the text to output when <code>null</code> found.</p>
-     *
-     * @return the current text to output when <code>null</code> found
-     */
-    @Override
-    public String getNullText() { // NOPMD as this is implementing the abstract class
-        return super.getNullText();
-    }
-
-    /**
-     * <p>Sets the text to output when <code>null</code> found.</p>
-     *
-     * <p><code>null</code> is accepted, but will be converted
-     * to an empty String.</p>
-     *
-     * @param nullText  the new text to output when <code>null</code> found
-     */
-    @Override
-    public void setNullText(final String nullText) { // NOPMD as this is implementing the abstract class
-        super.setNullText(nullText);
-    }
-
-    //---------------------------------------------------------------------
-    
-    /**
-     * <p>Gets the text to output when a <code>Collection</code>,
-     * <code>Map</code> or <code>Array</code> size is output.</p>
-     *
-     * <p>This is output before the size value.</p>
-     *
-     * @return the current start of size text
-     */
-    @Override
-    public String getSizeStartText() { // NOPMD as this is implementing the abstract class
-        return super.getSizeStartText();
-    }
-
-    /**
-     * <p>Sets the start text to output when a <code>Collection</code>,
-     * <code>Map</code> or <code>Array</code> size is output.</p>
-     *
-     * <p>This is output before the size value.</p>
-     *
-     * <p><code>null</code> is accepted, but will be converted to
-     * an empty String.</p>
-     *
-     * @param sizeStartText  the new start of size text
-     */
-    @Override
-    public void setSizeStartText(final String sizeStartText) { // NOPMD as this is implementing the abstract class
-        super.setSizeStartText(sizeStartText);
-    }
-
-    //---------------------------------------------------------------------
-    
-    /**
-     * <p>Gets the end text to output when a <code>Collection</code>,
-     * <code>Map</code> or <code>Array</code> size is output.</p>
-     *
-     * <p>This is output after the size value.</p>
-     *
-     * @return the current end of size text
-     */
-    @Override
-    public String getSizeEndText() { // NOPMD as this is implementing the abstract class
-        return super.getSizeEndText();
-    }
-
-    /**
-     * <p>Sets the end text to output when a <code>Collection</code>,
-     * <code>Map</code> or <code>Array</code> size is output.</p>
-     *
-     * <p>This is output after the size value.</p>
-     *
-     * <p><code>null</code> is accepted, but will be converted
-     * to an empty String.</p>
-     *
-     * @param sizeEndText  the new end of size text
-     */
-    @Override
-    public void setSizeEndText(final String sizeEndText) { // NOPMD as this is implementing the abstract class
-        super.setSizeEndText(sizeEndText);
-    }
-
-    //---------------------------------------------------------------------
-    
-    /**
-     * <p>Gets the start text to output when an <code>Object</code> is
-     * output in summary mode.</p>
-     *
-     * <P>This is output before the size value.</p>
-     *
-     * @return the current start of summary text
-     */
-    @Override
-    public String getSummaryObjectStartText() { // NOPMD as this is implementing the abstract class
-        return super.getSummaryObjectStartText();
-    }
-
-    /**
-     * <p>Sets the start text to output when an <code>Object</code> is
-     * output in summary mode.</p>
-     *
-     * <p>This is output before the size value.</p>
-     *
-     * <p><code>null</code> is accepted, but will be converted to
-     * an empty String.</p>
-     *
-     * @param summaryObjectStartText  the new start of summary text
-     */
-    @Override
-    public void setSummaryObjectStartText(final String summaryObjectStartText) { // NOPMD as this is implementing the abstract class
-        super.setSummaryObjectStartText(summaryObjectStartText);
-    }
-
-    //---------------------------------------------------------------------
-    
-    /**
-     * <p>Gets the end text to output when an <code>Object</code> is
-     * output in summary mode.</p>
-     *
-     * <p>This is output after the size value.</p>
-     *
-     * @return the current end of summary text
-     */
-    @Override
-    public String getSummaryObjectEndText() { // NOPMD as this is implementing the abstract class
-        return super.getSummaryObjectEndText();
-    }
-
-    /**
-     * <p>Sets the end text to output when an <code>Object</code> is
-     * output in summary mode.</p>
-     *
-     * <p>This is output after the size value.</p>
-     *
-     * <p><code>null</code> is accepted, but will be converted to
-     * an empty String.</p>
-     *
-     * @param summaryObjectEndText  the new end of summary text
-     */
-    @Override
-    public void setSummaryObjectEndText(final String summaryObjectEndText) { // NOPMD as this is implementing the abstract class
-        super.setSummaryObjectEndText(summaryObjectEndText);
-    }
-
-    //---------------------------------------------------------------------
-    
-}
diff --git a/lang/src/main/java/org/apache/commons/lang3/builder/ToStringBuilder.java b/lang/src/main/java/org/apache/commons/lang3/builder/ToStringBuilder.java
deleted file mode 100644
index e933665..0000000
--- a/lang/src/main/java/org/apache/commons/lang3/builder/ToStringBuilder.java
+++ /dev/null
@@ -1,1080 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.commons.lang3.builder;
-
-import org.apache.commons.lang3.ObjectUtils;
-
-/**
- * <p>Assists in implementing {@link Object#toString()} methods.</p>
- *
- * <p>This class enables a good and consistent <code>toString()</code> to be built for any
- * class or object. This class aims to simplify the process by:</p>
- * <ul>
- *  <li>allowing field names</li>
- *  <li>handling all types consistently</li>
- *  <li>handling nulls consistently</li>
- *  <li>outputting arrays and multi-dimensional arrays</li>
- *  <li>enabling the detail level to be controlled for Objects and Collections</li>
- *  <li>handling class hierarchies</li>
- * </ul>
- *
- * <p>To use this class write code as follows:</p>
- *
- * <pre>
- * public class Person {
- *   String name;
- *   int age;
- *   boolean smoker;
- *
- *   ...
- *
- *   public String toString() {
- *     return new ToStringBuilder(this).
- *       append("name", name).
- *       append("age", age).
- *       append("smoker", smoker).
- *       toString();
- *   }
- * }
- * </pre>
- *
- * <p>This will produce a toString of the format:
- * <code>Person@7f54[name=Stephen,age=29,smoker=false]</code></p>
- *
- * <p>To add the superclass <code>toString</code>, use {@link #appendSuper}.
- * To append the <code>toString</code> from an object that is delegated
- * to (or any other object), use {@link #appendToString}.</p>
- *
- * <p>Alternatively, there is a method that uses reflection to determine
- * the fields to test. Because these fields are usually private, the method,
- * <code>reflectionToString</code>, uses <code>AccessibleObject.setAccessible</code> to
- * change the visibility of the fields. This will fail under a security manager,
- * unless the appropriate permissions are set up correctly. It is also
- * slower than testing explicitly.</p>
- *
- * <p>A typical invocation for this method would look like:</p>
- *
- * <pre>
- * public String toString() {
- *   return ToStringBuilder.reflectionToString(this);
- * }
- * </pre>
- *
- * <p>You can also use the builder to debug 3rd party objects:</p>
- *
- * <pre>
- * System.out.println("An object: " + ToStringBuilder.reflectionToString(anObject));
- * </pre>
- *
- * <p>The exact format of the <code>toString</code> is determined by
- * the {@link ToStringStyle} passed into the constructor.</p>
- *
- * @since 1.0
- * @version $Id$
- */
-public class ToStringBuilder implements Builder<String> {
-
-    /**
-     * The default style of output to use, not null.
-     */
-    private static volatile ToStringStyle defaultStyle = ToStringStyle.DEFAULT_STYLE;
-
-    //----------------------------------------------------------------------------
-
-    /**
-     * <p>Gets the default <code>ToStringStyle</code> to use.</p>
-     *
-     * <p>This method gets a singleton default value, typically for the whole JVM.
-     * Changing this default should generally only be done during application startup.
-     * It is recommended to pass a <code>ToStringStyle</code> to the constructor instead
-     * of using this global default.</p>
-     *
-     * <p>This method can be used from multiple threads.
-     * Internally, a <code>volatile</code> variable is used to provide the guarantee
-     * that the latest value set using {@link #setDefaultStyle} is the value returned.
-     * It is strongly recommended that the default style is only changed during application startup.</p>
-     *
-     * <p>One reason for changing the default could be to have a verbose style during
-     * development and a compact style in production.</p>
-     *
-     * @return the default <code>ToStringStyle</code>, never null
-     */
-    public static ToStringStyle getDefaultStyle() {
-        return defaultStyle;
-    }
-
-    /**
-     * <p>Sets the default <code>ToStringStyle</code> to use.</p>
-     *
-     * <p>This method sets a singleton default value, typically for the whole JVM.
-     * Changing this default should generally only be done during application startup.
-     * It is recommended to pass a <code>ToStringStyle</code> to the constructor instead
-     * of changing this global default.</p>
-     *
-     * <p>This method is not intended for use from multiple threads.
-     * Internally, a <code>volatile</code> variable is used to provide the guarantee
-     * that the latest value set is the value returned from {@link #getDefaultStyle}.</p>
-     *
-     * @param style  the default <code>ToStringStyle</code>
-     * @throws IllegalArgumentException if the style is <code>null</code>
-     */
-    public static void setDefaultStyle(final ToStringStyle style) {
-        if (style == null) {
-            throw new IllegalArgumentException("The style must not be null");
-        }
-        defaultStyle = style;
-    }
-
-    //----------------------------------------------------------------------------
-    /**
-     * <p>Uses <code>ReflectionToStringBuilder</code> to generate a
-     * <code>toString</code> for the specified object.</p>
-     *
-     * @param object  the Object to be output
-     * @return the String result
-     * @see ReflectionToStringBuilder#toString(Object)
-     */
-    public static String reflectionToString(final Object object) {
-        return ReflectionToStringBuilder.toString(object);
-    }
-
-    /**
-     * <p>Uses <code>ReflectionToStringBuilder</code> to generate a
-     * <code>toString</code> for the specified object.</p>
-     *
-     * @param object  the Object to be output
-     * @param style  the style of the <code>toString</code> to create, may be <code>null</code>
-     * @return the String result
-     * @see ReflectionToStringBuilder#toString(Object,ToStringStyle)
-     */
-    public static String reflectionToString(final Object object, final ToStringStyle style) {
-        return ReflectionToStringBuilder.toString(object, style);
-    }
-
-    /**
-     * <p>Uses <code>ReflectionToStringBuilder</code> to generate a
-     * <code>toString</code> for the specified object.</p>
-     *
-     * @param object  the Object to be output
-     * @param style  the style of the <code>toString</code> to create, may be <code>null</code>
-     * @param outputTransients  whether to include transient fields
-     * @return the String result
-     * @see ReflectionToStringBuilder#toString(Object,ToStringStyle,boolean)
-     */
-    public static String reflectionToString(final Object object, final ToStringStyle style, final boolean outputTransients) {
-        return ReflectionToStringBuilder.toString(object, style, outputTransients, false, null);
-    }
-
-    /**
-     * <p>Uses <code>ReflectionToStringBuilder</code> to generate a
-     * <code>toString</code> for the specified object.</p>
-     *
-     * @param <T> the type of the object
-     * @param object  the Object to be output
-     * @param style  the style of the <code>toString</code> to create, may be <code>null</code>
-     * @param outputTransients  whether to include transient fields
-     * @param reflectUpToClass  the superclass to reflect up to (inclusive), may be <code>null</code>
-     * @return the String result
-     * @see ReflectionToStringBuilder#toString(Object,ToStringStyle,boolean,boolean,Class)
-     * @since 2.0
-     */
-    public static <T> String reflectionToString(
-        final T object,
-        final ToStringStyle style,
-        final boolean outputTransients,
-        final Class<? super T> reflectUpToClass) {
-        return ReflectionToStringBuilder.toString(object, style, outputTransients, false, reflectUpToClass);
-    }
-
-    //----------------------------------------------------------------------------
-
-    /**
-     * Current toString buffer, not null.
-     */
-    private final StringBuffer buffer;
-    /**
-     * The object being output, may be null.
-     */
-    private final Object object;
-    /**
-     * The style of output to use, not null.
-     */
-    private final ToStringStyle style;
-
-    /**
-     * <p>Constructs a builder for the specified object using the default output style.</p>
-     *
-     * <p>This default style is obtained from {@link #getDefaultStyle()}.</p>
-     *
-     * @param object  the Object to build a <code>toString</code> for, not recommended to be null
-     */
-    public ToStringBuilder(final Object object) {
-        this(object, null, null);
-    }
-
-    /**
-     * <p>Constructs a builder for the specified object using the a defined output style.</p>
-     *
-     * <p>If the style is <code>null</code>, the default style is used.</p>
-     *
-     * @param object  the Object to build a <code>toString</code> for, not recommended to be null
-     * @param style  the style of the <code>toString</code> to create, null uses the default style
-     */
-    public ToStringBuilder(final Object object, final ToStringStyle style) {
-        this(object, style, null);
-    }
-
-    /**
-     * <p>Constructs a builder for the specified object.</p>
-     *
-     * <p>If the style is <code>null</code>, the default style is used.</p>
-     *
-     * <p>If the buffer is <code>null</code>, a new one is created.</p>
-     *
-     * @param object  the Object to build a <code>toString</code> for, not recommended to be null
-     * @param style  the style of the <code>toString</code> to create, null uses the default style
-     * @param buffer  the <code>StringBuffer</code> to populate, may be null
-     */
-    public ToStringBuilder(final Object object, ToStringStyle style, StringBuffer buffer) {
-        if (style == null) {
-            style = getDefaultStyle();
-        }
-        if (buffer == null) {
-            buffer = new StringBuffer(512);
-        }
-        this.buffer = buffer;
-        this.style = style;
-        this.object = object;
-
-        style.appendStart(buffer, object);
-    }
-
-    //----------------------------------------------------------------------------
-
-    /**
-     * <p>Append to the <code>toString</code> a <code>boolean</code>
-     * value.</p>
-     *
-     * @param value  the value to add to the <code>toString</code>
-     * @return this
-     */
-    public ToStringBuilder append(final boolean value) {
-        style.append(buffer, null, value);
-        return this;
-    }
-
-    //----------------------------------------------------------------------------
-
-    /**
-     * <p>Append to the <code>toString</code> a <code>boolean</code>
-     * array.</p>
-     *
-     * @param array  the array to add to the <code>toString</code>
-     * @return this
-     */
-    public ToStringBuilder append(final boolean[] array) {
-        style.append(buffer, null, array, null);
-        return this;
-    }
-
-    //----------------------------------------------------------------------------
-
-    /**
-     * <p>Append to the <code>toString</code> a <code>byte</code>
-     * value.</p>
-     *
-     * @param value  the value to add to the <code>toString</code>
-     * @return this
-     */
-    public ToStringBuilder append(final byte value) {
-        style.append(buffer, null, value);
-        return this;
-    }
-
-    //----------------------------------------------------------------------------
-
-    /**
-     * <p>Append to the <code>toString</code> a <code>byte</code>
-     * array.</p>
-     *
-     * @param array  the array to add to the <code>toString</code>
-     * @return this
-     */
-    public ToStringBuilder append(final byte[] array) {
-        style.append(buffer, null, array, null);
-        return this;
-    }
-
-    //----------------------------------------------------------------------------
-
-    /**
-     * <p>Append to the <code>toString</code> a <code>char</code>
-     * value.</p>
-     *
-     * @param value  the value to add to the <code>toString</code>
-     * @return this
-     */
-    public ToStringBuilder append(final char value) {
-        style.append(buffer, null, value);
-        return this;
-    }
-
-    //----------------------------------------------------------------------------
-
-    /**
-     * <p>Append to the <code>toString</code> a <code>char</code>
-     * array.</p>
-     *
-     * @param array  the array to add to the <code>toString</code>
-     * @return this
-     */
-    public ToStringBuilder append(final char[] array) {
-        style.append(buffer, null, array, null);
-        return this;
-    }
-
-    //----------------------------------------------------------------------------
-
-    /**
-     * <p>Append to the <code>toString</code> a <code>double</code>
-     * value.</p>
-     *
-     * @param value  the value to add to the <code>toString</code>
-     * @return this
-     */
-    public ToStringBuilder append(final double value) {
-        style.append(buffer, null, value);
-        return this;
-    }
-
-    //----------------------------------------------------------------------------
-
-    /**
-     * <p>Append to the <code>toString</code> a <code>double</code>
-     * array.</p>
-     *
-     * @param array  the array to add to the <code>toString</code>
-     * @return this
-     */
-    public ToStringBuilder append(final double[] array) {
-        style.append(buffer, null, array, null);
-        return this;
-    }
-
-    //----------------------------------------------------------------------------
-
-    /**
-     * <p>Append to the <code>toString</code> a <code>float</code>
-     * value.</p>
-     *
-     * @param value  the value to add to the <code>toString</code>
-     * @return this
-     */
-    public ToStringBuilder append(final float value) {
-        style.append(buffer, null, value);
-        return this;
-    }
-
-    //----------------------------------------------------------------------------
-
-    /**
-     * <p>Append to the <code>toString</code> a <code>float</code>
-     * array.</p>
-     *
-     * @param array  the array to add to the <code>toString</code>
-     * @return this
-     */
-    public ToStringBuilder append(final float[] array) {
-        style.append(buffer, null, array, null);
-        return this;
-    }
-
-    //----------------------------------------------------------------------------
-
-    /**
-     * <p>Append to the <code>toString</code> an <code>int</code>
-     * value.</p>
-     *
-     * @param value  the value to add to the <code>toString</code>
-     * @return this
-     */
-    public ToStringBuilder append(final int value) {
-        style.append(buffer, null, value);
-        return this;
-    }
-
-    //----------------------------------------------------------------------------
-
-    /**
-     * <p>Append to the <code>toString</code> an <code>int</code>
-     * array.</p>
-     *
-     * @param array  the array to add to the <code>toString</code>
-     * @return this
-     */
-    public ToStringBuilder append(final int[] array) {
-        style.append(buffer, null, array, null);
-        return this;
-    }
-
-    //----------------------------------------------------------------------------
-
-    /**
-     * <p>Append to the <code>toString</code> a <code>long</code>
-     * value.</p>
-     *
-     * @param value  the value to add to the <code>toString</code>
-     * @return this
-     */
-    public ToStringBuilder append(final long value) {
-        style.append(buffer, null, value);
-        return this;
-    }
-
-    //----------------------------------------------------------------------------
-
-    /**
-     * <p>Append to the <code>toString</code> a <code>long</code>
-     * array.</p>
-     *
-     * @param array  the array to add to the <code>toString</code>
-     * @return this
-     */
-    public ToStringBuilder append(final long[] array) {
-        style.append(buffer, null, array, null);
-        return this;
-    }
-
-    //----------------------------------------------------------------------------
-
-    /**
-     * <p>Append to the <code>toString</code> an <code>Object</code>
-     * value.</p>
-     *
-     * @param obj  the value to add to the <code>toString</code>
-     * @return this
-     */
-    public ToStringBuilder append(final Object obj) {
-        style.append(buffer, null, obj, null);
-        return this;
-    }
-
-    //----------------------------------------------------------------------------
-
-    /**
-     * <p>Append to the <code>toString</code> an <code>Object</code>
-     * array.</p>
-     *
-     * @param array  the array to add to the <code>toString</code>
-     * @return this
-     */
-    public ToStringBuilder append(final Object[] array) {
-        style.append(buffer, null, array, null);
-        return this;
-    }
-
-    //----------------------------------------------------------------------------
-
-    /**
-     * <p>Append to the <code>toString</code> a <code>short</code>
-     * value.</p>
-     *
-     * @param value  the value to add to the <code>toString</code>
-     * @return this
-     */
-    public ToStringBuilder append(final short value) {
-        style.append(buffer, null, value);
-        return this;
-    }
-
-    //----------------------------------------------------------------------------
-
-    /**
-     * <p>Append to the <code>toString</code> a <code>short</code>
-     * array.</p>
-     *
-     * @param array  the array to add to the <code>toString</code>
-     * @return this
-     */
-    public ToStringBuilder append(final short[] array) {
-        style.append(buffer, null, array, null);
-        return this;
-    }
-
-    /**
-     * <p>Append to the <code>toString</code> a <code>boolean</code>
-     * value.</p>
-     *
-     * @param fieldName  the field name
-     * @param value  the value to add to the <code>toString</code>
-     * @return this
-     */
-    public ToStringBuilder append(final String fieldName, final boolean value) {
-        style.append(buffer, fieldName, value);
-        return this;
-    }
-
-    /**
-     * <p>Append to the <code>toString</code> a <code>boolean</code>
-     * array.</p>
-     *
-     * @param fieldName  the field name
-     * @param array  the array to add to the <code>hashCode</code>
-     * @return this
-     */
-    public ToStringBuilder append(final String fieldName, final boolean[] array) {
-        style.append(buffer, fieldName, array, null);
-        return this;
-    }
-
-    /**
-     * <p>Append to the <code>toString</code> a <code>boolean</code>
-     * array.</p>
-     *
-     * <p>A boolean parameter controls the level of detail to show.
-     * Setting <code>true</code> will output the array in full. Setting
-     * <code>false</code> will output a summary, typically the size of
-     * the array.</p>
-     *
-     * @param fieldName  the field name
-     * @param array  the array to add to the <code>toString</code>
-     * @param fullDetail  <code>true</code> for detail, <code>false</code>
-     *  for summary info
-     * @return this
-     */
-    public ToStringBuilder append(final String fieldName, final boolean[] array, final boolean fullDetail) {
-        style.append(buffer, fieldName, array, Boolean.valueOf(fullDetail));
-        return this;
-    }
-
-    /**
-     * <p>Append to the <code>toString</code> an <code>byte</code>
-     * value.</p>
-     *
-     * @param fieldName  the field name
-     * @param value  the value to add to the <code>toString</code>
-     * @return this
-     */
-    public ToStringBuilder append(final String fieldName, final byte value) {
-        style.append(buffer, fieldName, value);
-        return this;
-    }
-
-    /**
-     * <p>Append to the <code>toString</code> a <code>byte</code> array.</p>
-     *
-     * @param fieldName  the field name
-     * @param array  the array to add to the <code>toString</code>
-     * @return this
-     */
-    public ToStringBuilder append(final String fieldName, final byte[] array) {
-        style.append(buffer, fieldName, array, null);
-        return this;
-    }
-
-    /**
-     * <p>Append to the <code>toString</code> a <code>byte</code>
-     * array.</p>
-     *
-     * <p>A boolean parameter controls the level of detail to show.
-     * Setting <code>true</code> will output the array in full. Setting
-     * <code>false</code> will output a summary, typically the size of
-     * the array.
-     *
-     * @param fieldName  the field name
-     * @param array  the array to add to the <code>toString</code>
-     * @param fullDetail  <code>true</code> for detail, <code>false</code>
-     *  for summary info
-     * @return this
-     */
-    public ToStringBuilder append(final String fieldName, final byte[] array, final boolean fullDetail) {
-        style.append(buffer, fieldName, array, Boolean.valueOf(fullDetail));
-        return this;
-    }
-
-    /**
-     * <p>Append to the <code>toString</code> a <code>char</code>
-     * value.</p>
-     *
-     * @param fieldName  the field name
-     * @param value  the value to add to the <code>toString</code>
-     * @return this
-     */
-    public ToStringBuilder append(final String fieldName, final char value) {
-        style.append(buffer, fieldName, value);
-        return this;
-    }
-
-    /**
-     * <p>Append to the <code>toString</code> a <code>char</code>
-     * array.</p>
-     *
-     * @param fieldName  the field name
-     * @param array  the array to add to the <code>toString</code>
-     * @return this
-     */
-    public ToStringBuilder append(final String fieldName, final char[] array) {
-        style.append(buffer, fieldName, array, null);
-        return this;
-    }
-
-    /**
-     * <p>Append to the <code>toString</code> a <code>char</code>
-     * array.</p>
-     *
-     * <p>A boolean parameter controls the level of detail to show.
-     * Setting <code>true</code> will output the array in full. Setting
-     * <code>false</code> will output a summary, typically the size of
-     * the array.</p>
-     *
-     * @param fieldName  the field name
-     * @param array  the array to add to the <code>toString</code>
-     * @param fullDetail  <code>true</code> for detail, <code>false</code>
-     *  for summary info
-     * @return this
-     */
-    public ToStringBuilder append(final String fieldName, final char[] array, final boolean fullDetail) {
-        style.append(buffer, fieldName, array, Boolean.valueOf(fullDetail));
-        return this;
-    }
-
-    /**
-     * <p>Append to the <code>toString</code> a <code>double</code>
-     * value.</p>
-     *
-     * @param fieldName  the field name
-     * @param value  the value to add to the <code>toString</code>
-     * @return this
-     */
-    public ToStringBuilder append(final String fieldName, final double value) {
-        style.append(buffer, fieldName, value);
-        return this;
-    }
-
-    /**
-     * <p>Append to the <code>toString</code> a <code>double</code>
-     * array.</p>
-     *
-     * @param fieldName  the field name
-     * @param array  the array to add to the <code>toString</code>
-     * @return this
-     */
-    public ToStringBuilder append(final String fieldName, final double[] array) {
-        style.append(buffer, fieldName, array, null);
-        return this;
-    }
-
-    /**
-     * <p>Append to the <code>toString</code> a <code>double</code>
-     * array.</p>
-     *
-     * <p>A boolean parameter controls the level of detail to show.
-     * Setting <code>true</code> will output the array in full. Setting
-     * <code>false</code> will output a summary, typically the size of
-     * the array.</p>
-     *
-     * @param fieldName  the field name
-     * @param array  the array to add to the <code>toString</code>
-     * @param fullDetail  <code>true</code> for detail, <code>false</code>
-     *  for summary info
-     * @return this
-     */
-    public ToStringBuilder append(final String fieldName, final double[] array, final boolean fullDetail) {
-        style.append(buffer, fieldName, array, Boolean.valueOf(fullDetail));
-        return this;
-    }
-
-    /**
-     * <p>Append to the <code>toString</code> an <code>float</code>
-     * value.</p>
-     *
-     * @param fieldName  the field name
-     * @param value  the value to add to the <code>toString</code>
-     * @return this
-     */
-    public ToStringBuilder append(final String fieldName, final float value) {
-        style.append(buffer, fieldName, value);
-        return this;
-    }
-
-    /**
-     * <p>Append to the <code>toString</code> a <code>float</code>
-     * array.</p>
-     *
-     * @param fieldName  the field name
-     * @param array  the array to add to the <code>toString</code>
-     * @return this
-     */
-    public ToStringBuilder append(final String fieldName, final float[] array) {
-        style.append(buffer, fieldName, array, null);
-        return this;
-    }
-
-    /**
-     * <p>Append to the <code>toString</code> a <code>float</code>
-     * array.</p>
-     *
-     * <p>A boolean parameter controls the level of detail to show.
-     * Setting <code>true</code> will output the array in full. Setting
-     * <code>false</code> will output a summary, typically the size of
-     * the array.</p>
-     *
-     * @param fieldName  the field name
-     * @param array  the array to add to the <code>toString</code>
-     * @param fullDetail  <code>true</code> for detail, <code>false</code>
-     *  for summary info
-     * @return this
-     */
-    public ToStringBuilder append(final String fieldName, final float[] array, final boolean fullDetail) {
-        style.append(buffer, fieldName, array, Boolean.valueOf(fullDetail));
-        return this;
-    }
-
-    /**
-     * <p>Append to the <code>toString</code> an <code>int</code>
-     * value.</p>
-     *
-     * @param fieldName  the field name
-     * @param value  the value to add to the <code>toString</code>
-     * @return this
-     */
-    public ToStringBuilder append(final String fieldName, final int value) {
-        style.append(buffer, fieldName, value);
-        return this;
-    }
-
-    /**
-     * <p>Append to the <code>toString</code> an <code>int</code>
-     * array.</p>
-     *
-     * @param fieldName  the field name
-     * @param array  the array to add to the <code>toString</code>
-     * @return this
-     */
-    public ToStringBuilder append(final String fieldName, final int[] array) {
-        style.append(buffer, fieldName, array, null);
-        return this;
-    }
-
-    /**
-     * <p>Append to the <code>toString</code> an <code>int</code>
-     * array.</p>
-     *
-     * <p>A boolean parameter controls the level of detail to show.
-     * Setting <code>true</code> will output the array in full. Setting
-     * <code>false</code> will output a summary, typically the size of
-     * the array.</p>
-     *
-     * @param fieldName  the field name
-     * @param array  the array to add to the <code>toString</code>
-     * @param fullDetail  <code>true</code> for detail, <code>false</code>
-     *  for summary info
-     * @return this
-     */
-    public ToStringBuilder append(final String fieldName, final int[] array, final boolean fullDetail) {
-        style.append(buffer, fieldName, array, Boolean.valueOf(fullDetail));
-        return this;
-    }
-
-    /**
-     * <p>Append to the <code>toString</code> a <code>long</code>
-     * value.</p>
-     *
-     * @param fieldName  the field name
-     * @param value  the value to add to the <code>toString</code>
-     * @return this
-     */
-    public ToStringBuilder append(final String fieldName, final long value) {
-        style.append(buffer, fieldName, value);
-        return this;
-    }
-
-    /**
-     * <p>Append to the <code>toString</code> a <code>long</code>
-     * array.</p>
-     *
-     * @param fieldName  the field name
-     * @param array  the array to add to the <code>toString</code>
-     * @return this
-     */
-    public ToStringBuilder append(final String fieldName, final long[] array) {
-        style.append(buffer, fieldName, array, null);
-        return this;
-    }
-
-    /**
-     * <p>Append to the <code>toString</code> a <code>long</code>
-     * array.</p>
-     *
-     * <p>A boolean parameter controls the level of detail to show.
-     * Setting <code>true</code> will output the array in full. Setting
-     * <code>false</code> will output a summary, typically the size of
-     * the array.</p>
-     *
-     * @param fieldName  the field name
-     * @param array  the array to add to the <code>toString</code>
-     * @param fullDetail  <code>true</code> for detail, <code>false</code>
-     *  for summary info
-     * @return this
-     */
-    public ToStringBuilder append(final String fieldName, final long[] array, final boolean fullDetail) {
-        style.append(buffer, fieldName, array, Boolean.valueOf(fullDetail));
-        return this;
-    }
-
-    /**
-     * <p>Append to the <code>toString</code> an <code>Object</code>
-     * value.</p>
-     *
-     * @param fieldName  the field name
-     * @param obj  the value to add to the <code>toString</code>
-     * @return this
-     */
-    public ToStringBuilder append(final String fieldName, final Object obj) {
-        style.append(buffer, fieldName, obj, null);
-        return this;
-    }
-
-    /**
-     * <p>Append to the <code>toString</code> an <code>Object</code>
-     * value.</p>
-     *
-     * @param fieldName  the field name
-     * @param obj  the value to add to the <code>toString</code>
-     * @param fullDetail  <code>true</code> for detail,
-     *  <code>false</code> for summary info
-     * @return this
-     */
-    public ToStringBuilder append(final String fieldName, final Object obj, final boolean fullDetail) {
-        style.append(buffer, fieldName, obj, Boolean.valueOf(fullDetail));
-        return this;
-    }
-
-    /**
-     * <p>Append to the <code>toString</code> an <code>Object</code>
-     * array.</p>
-     *
-     * @param fieldName  the field name
-     * @param array  the array to add to the <code>toString</code>
-     * @return this
-     */
-    public ToStringBuilder append(final String fieldName, final Object[] array) {
-        style.append(buffer, fieldName, array, null);
-        return this;
-    }
-
-    /**
-     * <p>Append to the <code>toString</code> an <code>Object</code>
-     * array.</p>
-     *
-     * <p>A boolean parameter controls the level of detail to show.
-     * Setting <code>true</code> will output the array in full. Setting
-     * <code>false</code> will output a summary, typically the size of
-     * the array.</p>
-     *
-     * @param fieldName  the field name
-     * @param array  the array to add to the <code>toString</code>
-     * @param fullDetail  <code>true</code> for detail, <code>false</code>
-     *  for summary info
-     * @return this
-     */
-    public ToStringBuilder append(final String fieldName, final Object[] array, final boolean fullDetail) {
-        style.append(buffer, fieldName, array, Boolean.valueOf(fullDetail));
-        return this;
-    }
-
-    /**
-     * <p>Append to the <code>toString</code> an <code>short</code>
-     * value.</p>
-     *
-     * @param fieldName  the field name
-     * @param value  the value to add to the <code>toString</code>
-     * @return this
-     */
-    public ToStringBuilder append(final String fieldName, final short value) {
-        style.append(buffer, fieldName, value);
-        return this;
-    }
-
-    /**
-     * <p>Append to the <code>toString</code> a <code>short</code>
-     * array.</p>
-     *
-     * @param fieldName  the field name
-     * @param array  the array to add to the <code>toString</code>
-     * @return this
-     */
-    public ToStringBuilder append(final String fieldName, final short[] array) {
-        style.append(buffer, fieldName, array, null);
-        return this;
-    }
-
-    /**
-     * <p>Append to the <code>toString</code> a <code>short</code>
-     * array.</p>
-     *
-     * <p>A boolean parameter controls the level of detail to show.
-     * Setting <code>true</code> will output the array in full. Setting
-     * <code>false</code> will output a summary, typically the size of
-     * the array.
-     *
-     * @param fieldName  the field name
-     * @param array  the array to add to the <code>toString</code>
-     * @param fullDetail  <code>true</code> for detail, <code>false</code>
-     *  for summary info
-     * @return this
-     */
-    public ToStringBuilder append(final String fieldName, final short[] array, final boolean fullDetail) {
-        style.append(buffer, fieldName, array, Boolean.valueOf(fullDetail));
-        return this;
-    }
-
-    /**
-     * <p>Appends with the same format as the default <code>Object toString()
-     * </code> method. Appends the class name followed by
-     * {@link System#identityHashCode(java.lang.Object)}.</p>
-     *
-     * @param srcObject  the <code>Object</code> whose class name and id to output
-     * @return this
-     * @since 2.0
-     */
-    public ToStringBuilder appendAsObjectToString(final Object srcObject) {
-        ObjectUtils.identityToString(this.getStringBuffer(), srcObject);
-        return this;
-    }
-
-    //----------------------------------------------------------------------------
-
-    /**
-     * <p>Append the <code>toString</code> from the superclass.</p>
-     *
-     * <p>This method assumes that the superclass uses the same <code>ToStringStyle</code>
-     * as this one.</p>
-     *
-     * <p>If <code>superToString</code> is <code>null</code>, no change is made.</p>
-     *
-     * @param superToString  the result of <code>super.toString()</code>
-     * @return this
-     * @since 2.0
-     */
-    public ToStringBuilder appendSuper(final String superToString) {
-        if (superToString != null) {
-            style.appendSuper(buffer, superToString);
-        }
-        return this;
-    }
-
-    /**
-     * <p>Append the <code>toString</code> from another object.</p>
-     *
-     * <p>This method is useful where a class delegates most of the implementation of
-     * its properties to another class. You can then call <code>toString()</code> on
-     * the other class and pass the result into this method.</p>
-     *
-     * <pre>
-     *   private AnotherObject delegate;
-     *   private String fieldInThisClass;
-     *
-     *   public String toString() {
-     *     return new ToStringBuilder(this).
-     *       appendToString(delegate.toString()).
-     *       append(fieldInThisClass).
-     *       toString();
-     *   }</pre>
-     *
-     * <p>This method assumes that the other object uses the same <code>ToStringStyle</code>
-     * as this one.</p>
-     *
-     * <p>If the <code>toString</code> is <code>null</code>, no change is made.</p>
-     *
-     * @param toString  the result of <code>toString()</code> on another object
-     * @return this
-     * @since 2.0
-     */
-    public ToStringBuilder appendToString(final String toString) {
-        if (toString != null) {
-            style.appendToString(buffer, toString);
-        }
-        return this;
-    }
-
-    /**
-     * <p>Returns the <code>Object</code> being output.</p>
-     *
-     * @return The object being output.
-     * @since 2.0
-     */
-    public Object getObject() {
-        return object;
-    }
-
-    /**
-     * <p>Gets the <code>StringBuffer</code> being populated.</p>
-     *
-     * @return the <code>StringBuffer</code> being populated
-     */
-    public StringBuffer getStringBuffer() {
-        return buffer;
-    }
-
-    //----------------------------------------------------------------------------
-
-    /**
-     * <p>Gets the <code>ToStringStyle</code> being used.</p>
-     *
-     * @return the <code>ToStringStyle</code> being used
-     * @since 2.0
-     */
-    public ToStringStyle getStyle() {
-        return style;
-    }
-
-    /**
-     * <p>Returns the built <code>toString</code>.</p>
-     *
-     * <p>This method appends the end of data indicator, and can only be called once.
-     * Use {@link #getStringBuffer} to get the current string state.</p>
-     *
-     * <p>If the object is <code>null</code>, return the style's <code>nullText</code></p>
-     *
-     * @return the String <code>toString</code>
-     */
-    @Override
-    public String toString() {
-        if (this.getObject() == null) {
-            this.getStringBuffer().append(this.getStyle().getNullText());
-        } else {
-            style.appendEnd(this.getStringBuffer(), this.getObject());
-        }
-        return this.getStringBuffer().toString();
-    }
-
-    /**
-     * Returns the String that was build as an object representation. The
-     * default implementation utilizes the {@link #toString()} implementation.
-     *
-     * @return the String <code>toString</code>
-     *
-     * @see #toString()
-     *
-     * @since 3.0
-     */
-    @Override
-    public String build() {
-        return toString();
-    }
-}
diff --git a/lang/src/main/java/org/apache/commons/lang3/builder/ToStringStyle.java b/lang/src/main/java/org/apache/commons/lang3/builder/ToStringStyle.java
deleted file mode 100644
index 658556b..0000000
--- a/lang/src/main/java/org/apache/commons/lang3/builder/ToStringStyle.java
+++ /dev/null
@@ -1,2614 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.commons.lang3.builder;
-
-import java.io.Serializable;
-import java.lang.reflect.Array;
-import java.util.Collection;
-import java.util.Map;
-import java.util.WeakHashMap;
-
-import org.apache.commons.lang3.ClassUtils;
-import org.apache.commons.lang3.ObjectUtils;
-import org.apache.commons.lang3.SystemUtils;
-
-/**
- * <p>Controls <code>String</code> formatting for {@link ToStringBuilder}.
- * The main public interface is always via <code>ToStringBuilder</code>.</p>
- *
- * <p>These classes are intended to be used as <code>Singletons</code>.
- * There is no need to instantiate a new style each time. A program
- * will generally use one of the predefined constants on this class.
- * Alternatively, the {@link StandardToStringStyle} class can be used
- * to set the individual settings. Thus most styles can be achieved
- * without subclassing.</p>
- *
- * <p>If required, a subclass can override as many or as few of the
- * methods as it requires. Each object type (from <code>boolean</code>
- * to <code>long</code> to <code>Object</code> to <code>int[]</code>) has
- * its own methods to output it. Most have two versions, detail and summary.
- *
- * <p>For example, the detail version of the array based methods will
- * output the whole array, whereas the summary method will just output
- * the array length.</p>
- *
- * <p>If you want to format the output of certain objects, such as dates, you
- * must create a subclass and override a method.
- * </p>
- * <pre>
- * public class MyStyle extends ToStringStyle {
- *   protected void appendDetail(StringBuffer buffer, String fieldName, Object value) {
- *     if (value instanceof Date) {
- *       value = new SimpleDateFormat("yyyy-MM-dd").format(value);
- *     }
- *     buffer.append(value);
- *   }
- * }
- * </pre>
- *
- * @since 1.0
- * @version $Id$
- */
-public abstract class ToStringStyle implements Serializable {
-
-    /**
-     * Serialization version ID.
-     */
-    private static final long serialVersionUID = -2587890625525655916L;
-
-    /**
-     * The default toString style. Using the <code>Person</code>
-     * example from {@link ToStringBuilder}, the output would look like this:
-     *
-     * <pre>
-     * Person@182f0db[name=John Doe,age=33,smoker=false]
-     * </pre>
-     */
-    public static final ToStringStyle DEFAULT_STYLE = new DefaultToStringStyle();
-
-    /**
-     * The multi line toString style. Using the <code>Person</code>
-     * example from {@link ToStringBuilder}, the output would look like this:
-     *
-     * <pre>
-     * Person@182f0db[
-     *   name=John Doe
-     *   age=33
-     *   smoker=false
-     * ]
-     * </pre>
-     */
-    public static final ToStringStyle MULTI_LINE_STYLE = new MultiLineToStringStyle();
-
-    /**
-     * The no field names toString style. Using the
-     * <code>Person</code> example from {@link ToStringBuilder}, the output
-     * would look like this:
-     *
-     * <pre>
-     * Person@182f0db[John Doe,33,false]
-     * </pre>
-     */
-    public static final ToStringStyle NO_FIELD_NAMES_STYLE = new NoFieldNameToStringStyle();
-
-    /**
-     * The short prefix toString style. Using the <code>Person</code> example
-     * from {@link ToStringBuilder}, the output would look like this:
-     *
-     * <pre>
-     * Person[name=John Doe,age=33,smoker=false]
-     * </pre>
-     *
-     * @since 2.1
-     */
-    public static final ToStringStyle SHORT_PREFIX_STYLE = new ShortPrefixToStringStyle();
-
-    /**
-     * The simple toString style. Using the <code>Person</code>
-     * example from {@link ToStringBuilder}, the output would look like this:
-     *
-     * <pre>
-     * John Doe,33,false
-     * </pre>
-     */
-    public static final ToStringStyle SIMPLE_STYLE = new SimpleToStringStyle();
-
-    /**
-     * The no class name toString style. Using the <code>Person</code>
-     * example from {@link ToStringBuilder}, the output would look like this:
-     *
-     * <pre>
-     * [name=John Doe,age=33,smoker=false]
-     * </pre>
-     *
-     * @since 3.4
-     */
-    public static final ToStringStyle NO_CLASS_NAME_STYLE = new NoClassNameToStringStyle();
-
-    /**
-     * The JSON toString style. Using the <code>Person</code> example from
-     * {@link ToStringBuilder}, the output would look like this:
-     *
-     * <pre>
-     * {"name": "John Doe", "age": 33, "smoker": true}
-     * </pre>
-     *
-     * <strong>Note:</strong> Since field names are mandatory in JSON, this
-     * ToStringStyle will throw an {@link UnsupportedOperationException} if no
-     * field name is passed in while appending. Furthermore This ToStringStyle
-     * will only generate valid JSON if referenced objects also produce JSON
-     * when calling {@code toString()} on them.
-     *
-     * @since 3.4
-     * @see <a href="http://json.org">json.org</a>
-     */
-    public static final ToStringStyle JSON_STYLE = new JsonToStringStyle();
-
-    /**
-     * <p>
-     * A registry of objects used by <code>reflectionToString</code> methods
-     * to detect cyclical object references and avoid infinite loops.
-     * </p>
-     */
-    private static final ThreadLocal<WeakHashMap<Object, Object>> REGISTRY =
-        new ThreadLocal<WeakHashMap<Object,Object>>();
-    /*
-     * Note that objects of this class are generally shared between threads, so
-     * an instance variable would not be suitable here.
-     * 
-     * In normal use the registry should always be left empty, because the caller
-     * should call toString() which will clean up.
-     * 
-     * See LANG-792
-     */
-
-    /**
-     * <p>
-     * Returns the registry of objects being traversed by the <code>reflectionToString</code>
-     * methods in the current thread.
-     * </p>
-     *
-     * @return Set the registry of objects being traversed
-     */
-    static Map<Object, Object> getRegistry() {
-        return REGISTRY.get();
-    }
-
-    /**
-     * <p>
-     * Returns <code>true</code> if the registry contains the given object.
-     * Used by the reflection methods to avoid infinite loops.
-     * </p>
-     *
-     * @param value
-     *                  The object to lookup in the registry.
-     * @return boolean <code>true</code> if the registry contains the given
-     *             object.
-     */
-    static boolean isRegistered(final Object value) {
-        final Map<Object, Object> m = getRegistry();
-        return m != null && m.containsKey(value);
-    }
-
-    /**
-     * <p>
-     * Registers the given object. Used by the reflection methods to avoid
-     * infinite loops.
-     * </p>
-     *
-     * @param value
-     *                  The object to register.
-     */
-    static void register(final Object value) {
-        if (value != null) {
-            final Map<Object, Object> m = getRegistry();
-            if (m == null) {
-                REGISTRY.set(new WeakHashMap<Object, Object>());
-            }
-            getRegistry().put(value, null);
-        }
-    }
-
-    /**
-     * <p>
-     * Unregisters the given object.
-     * </p>
-     *
-     * <p>
-     * Used by the reflection methods to avoid infinite loops.
-     * </p>
-     *
-     * @param value
-     *                  The object to unregister.
-     */
-    static void unregister(final Object value) {
-        if (value != null) {
-            final Map<Object, Object> m = getRegistry();
-            if (m != null) {
-                m.remove(value);
-                if (m.isEmpty()) {
-                    REGISTRY.remove();
-                }
-            }
-        }
-    }
-
-    /**
-     * Whether to use the field names, the default is <code>true</code>.
-     */
-    private boolean useFieldNames = true;
-
-    /**
-     * Whether to use the class name, the default is <code>true</code>.
-     */
-    private boolean useClassName = true;
-
-    /**
-     * Whether to use short class names, the default is <code>false</code>.
-     */
-    private boolean useShortClassName = false;
-
-    /**
-     * Whether to use the identity hash code, the default is <code>true</code>.
-     */
-    private boolean useIdentityHashCode = true;
-
-    /**
-     * The content start <code>'['</code>.
-     */
-    private String contentStart = "[";
-
-    /**
-     * The content end <code>']'</code>.
-     */
-    private String contentEnd = "]";
-
-    /**
-     * The field name value separator <code>'='</code>.
-     */
-    private String fieldNameValueSeparator = "=";
-
-    /**
-     * Whether the field separator should be added before any other fields.
-     */
-    private boolean fieldSeparatorAtStart = false;
-
-    /**
-     * Whether the field separator should be added after any other fields.
-     */
-    private boolean fieldSeparatorAtEnd = false;
-
-    /**
-     * The field separator <code>','</code>.
-     */
-    private String fieldSeparator = ",";
-
-    /**
-     * The array start <code>'{'</code>.
-     */
-    private String arrayStart = "{";
-
-    /**
-     * The array separator <code>','</code>.
-     */
-    private String arraySeparator = ",";
-
-    /**
-     * The detail for array content.
-     */
-    private boolean arrayContentDetail = true;
-
-    /**
-     * The array end <code>'}'</code>.
-     */
-    private String arrayEnd = "}";
-
-    /**
-     * The value to use when fullDetail is <code>null</code>,
-     * the default value is <code>true</code>.
-     */
-    private boolean defaultFullDetail = true;
-
-    /**
-     * The <code>null</code> text <code>'&lt;null&gt;'</code>.
-     */
-    private String nullText = "<null>";
-
-    /**
-     * The summary size text start <code>'&lt;size'</code>.
-     */
-    private String sizeStartText = "<size=";
-
-    /**
-     * The summary size text start <code>'&gt;'</code>.
-     */
-    private String sizeEndText = ">";
-
-    /**
-     * The summary object text start <code>'&lt;'</code>.
-     */
-    private String summaryObjectStartText = "<";
-
-    /**
-     * The summary object text start <code>'&gt;'</code>.
-     */
-    private String summaryObjectEndText = ">";
-
-    //----------------------------------------------------------------------------
-
-    /**
-     * <p>Constructor.</p>
-     */
-    protected ToStringStyle() {
-        super();
-    }
-
-    //----------------------------------------------------------------------------
-
-    /**
-     * <p>Append to the <code>toString</code> the superclass toString.</p>
-     * <p>NOTE: It assumes that the toString has been created from the same ToStringStyle. </p>
-     *
-     * <p>A <code>null</code> <code>superToString</code> is ignored.</p>
-     *
-     * @param buffer  the <code>StringBuffer</code> to populate
-     * @param superToString  the <code>super.toString()</code>
-     * @since 2.0
-     */
-    public void appendSuper(final StringBuffer buffer, final String superToString) {
-        appendToString(buffer, superToString);
-    }
-
-    /**
-     * <p>Append to the <code>toString</code> another toString.</p>
-     * <p>NOTE: It assumes that the toString has been created from the same ToStringStyle. </p>
-     *
-     * <p>A <code>null</code> <code>toString</code> is ignored.</p>
-     *
-     * @param buffer  the <code>StringBuffer</code> to populate
-     * @param toString  the additional <code>toString</code>
-     * @since 2.0
-     */
-    public void appendToString(final StringBuffer buffer, final String toString) {
-        if (toString != null) {
-            final int pos1 = toString.indexOf(contentStart) + contentStart.length();
-            final int pos2 = toString.lastIndexOf(contentEnd);
-            if (pos1 != pos2 && pos1 >= 0 && pos2 >= 0) {
-                final String data = toString.substring(pos1, pos2);
-                if (fieldSeparatorAtStart) {
-                    removeLastFieldSeparator(buffer);
-                }
-                buffer.append(data);
-                appendFieldSeparator(buffer);
-            }
-        }
-    }
-
-    /**
-     * <p>Append to the <code>toString</code> the start of data indicator.</p>
-     *
-     * @param buffer  the <code>StringBuffer</code> to populate
-     * @param object  the <code>Object</code> to build a <code>toString</code> for
-     */
-    public void appendStart(final StringBuffer buffer, final Object object) {
-        if (object != null) {
-            appendClassName(buffer, object);
-            appendIdentityHashCode(buffer, object);
-            appendContentStart(buffer);
-            if (fieldSeparatorAtStart) {
-                appendFieldSeparator(buffer);
-            }
-        }
-    }
-
-    /**
-     * <p>Append to the <code>toString</code> the end of data indicator.</p>
-     *
-     * @param buffer  the <code>StringBuffer</code> to populate
-     * @param object  the <code>Object</code> to build a
-     *  <code>toString</code> for.
-     */
-    public void appendEnd(final StringBuffer buffer, final Object object) {
-        if (this.fieldSeparatorAtEnd == false) {
-            removeLastFieldSeparator(buffer);
-        }
-        appendContentEnd(buffer);
-        unregister(object);
-    }
-
-    /**
-     * <p>Remove the last field separator from the buffer.</p>
-     *
-     * @param buffer  the <code>StringBuffer</code> to populate
-     * @since 2.0
-     */
-    protected void removeLastFieldSeparator(final StringBuffer buffer) {
-        final int len = buffer.length();
-        final int sepLen = fieldSeparator.length();
-        if (len > 0 && sepLen > 0 && len >= sepLen) {
-            boolean match = true;
-            for (int i = 0; i < sepLen; i++) {
-                if (buffer.charAt(len - 1 - i) != fieldSeparator.charAt(sepLen - 1 - i)) {
-                    match = false;
-                    break;
-                }
-            }
-            if (match) {
-                buffer.setLength(len - sepLen);
-            }
-        }
-    }
-
-    //----------------------------------------------------------------------------
-
-    /**
-     * <p>Append to the <code>toString</code> an <code>Object</code>
-     * value, printing the full <code>toString</code> of the
-     * <code>Object</code> passed in.</p>
-     *
-     * @param buffer  the <code>StringBuffer</code> to populate
-     * @param fieldName  the field name
-     * @param value  the value to add to the <code>toString</code>
-     * @param fullDetail  <code>true</code> for detail, <code>false</code>
-     *  for summary info, <code>null</code> for style decides
-     */
-    public void append(final StringBuffer buffer, final String fieldName, final Object value, final Boolean fullDetail) {
-        appendFieldStart(buffer, fieldName);
-
-        if (value == null) {
-            appendNullText(buffer, fieldName);
-
-        } else {
-            appendInternal(buffer, fieldName, value, isFullDetail(fullDetail));
-        }
-
-        appendFieldEnd(buffer, fieldName);
-    }
-
-    /**
-     * <p>Append to the <code>toString</code> an <code>Object</code>,
-     * correctly interpreting its type.</p>
-     *
-     * <p>This method performs the main lookup by Class type to correctly
-     * route arrays, <code>Collections</code>, <code>Maps</code> and
-     * <code>Objects</code> to the appropriate method.</p>
-     *
-     * <p>Either detail or summary views can be specified.</p>
-     *
-     * <p>If a cycle is detected, an object will be appended with the
-     * <code>Object.toString()</code> format.</p>
-     *
-     * @param buffer  the <code>StringBuffer</code> to populate
-     * @param fieldName  the field name, typically not used as already appended
-     * @param value  the value to add to the <code>toString</code>,
-     *  not <code>null</code>
-     * @param detail  output detail or not
-     */
-    protected void appendInternal(final StringBuffer buffer, final String fieldName, final Object value, final boolean detail) {
-        if (isRegistered(value)
-            && !(value instanceof Number || value instanceof Boolean || value instanceof Character)) {
-           appendCyclicObject(buffer, fieldName, value);
-           return;
-        }
-
-        register(value);
-
-        try {
-            if (value instanceof Collection<?>) {
-                if (detail) {
-                    appendDetail(buffer, fieldName, (Collection<?>) value);
-                } else {
-                    appendSummarySize(buffer, fieldName, ((Collection<?>) value).size());
-                }
-
-            } else if (value instanceof Map<?, ?>) {
-                if (detail) {
-                    appendDetail(buffer, fieldName, (Map<?, ?>) value);
-                } else {
-                    appendSummarySize(buffer, fieldName, ((Map<?, ?>) value).size());
-                }
-
-            } else if (value instanceof long[]) {
-                if (detail) {
-                    appendDetail(buffer, fieldName, (long[]) value);
-                } else {
-                    appendSummary(buffer, fieldName, (long[]) value);
-                }
-
-            } else if (value instanceof int[]) {
-                if (detail) {
-                    appendDetail(buffer, fieldName, (int[]) value);
-                } else {
-                    appendSummary(buffer, fieldName, (int[]) value);
-                }
-
-            } else if (value instanceof short[]) {
-                if (detail) {
-                    appendDetail(buffer, fieldName, (short[]) value);
-                } else {
-                    appendSummary(buffer, fieldName, (short[]) value);
-                }
-
-            } else if (value instanceof byte[]) {
-                if (detail) {
-                    appendDetail(buffer, fieldName, (byte[]) value);
-                } else {
-                    appendSummary(buffer, fieldName, (byte[]) value);
-                }
-
-            } else if (value instanceof char[]) {
-                if (detail) {
-                    appendDetail(buffer, fieldName, (char[]) value);
-                } else {
-                    appendSummary(buffer, fieldName, (char[]) value);
-                }
-
-            } else if (value instanceof double[]) {
-                if (detail) {
-                    appendDetail(buffer, fieldName, (double[]) value);
-                } else {
-                    appendSummary(buffer, fieldName, (double[]) value);
-                }
-
-            } else if (value instanceof float[]) {
-                if (detail) {
-                    appendDetail(buffer, fieldName, (float[]) value);
-                } else {
-                    appendSummary(buffer, fieldName, (float[]) value);
-                }
-
-            } else if (value instanceof boolean[]) {
-                if (detail) {
-                    appendDetail(buffer, fieldName, (boolean[]) value);
-                } else {
-                    appendSummary(buffer, fieldName, (boolean[]) value);
-                }
-
-            } else if (value.getClass().isArray()) {
-                if (detail) {
-                    appendDetail(buffer, fieldName, (Object[]) value);
-                } else {
-                    appendSummary(buffer, fieldName, (Object[]) value);
-                }
-
-            } else {
-                if (detail) {
-                    appendDetail(buffer, fieldName, value);
-                } else {
-                    appendSummary(buffer, fieldName, value);
-                }
-            }
-        } finally {
-            unregister(value);
-        }
-    }
-
-    /**
-     * <p>Append to the <code>toString</code> an <code>Object</code>
-     * value that has been detected to participate in a cycle. This
-     * implementation will print the standard string value of the value.</p>
-     *
-     * @param buffer  the <code>StringBuffer</code> to populate
-     * @param fieldName  the field name, typically not used as already appended
-     * @param value  the value to add to the <code>toString</code>,
-     *  not <code>null</code>
-     *
-     * @since 2.2
-     */
-    protected void appendCyclicObject(final StringBuffer buffer, final String fieldName, final Object value) {
-       ObjectUtils.identityToString(buffer, value);
-    }
-
-    /**
-     * <p>Append to the <code>toString</code> an <code>Object</code>
-     * value, printing the full detail of the <code>Object</code>.</p>
-     *
-     * @param buffer  the <code>StringBuffer</code> to populate
-     * @param fieldName  the field name, typically not used as already appended
-     * @param value  the value to add to the <code>toString</code>,
-     *  not <code>null</code>
-     */
-    protected void appendDetail(final StringBuffer buffer, final String fieldName, final Object value) {
-        buffer.append(value);
-    }
-
-    /**
-     * <p>Append to the <code>toString</code> a <code>Collection</code>.</p>
-     *
-     * @param buffer  the <code>StringBuffer</code> to populate
-     * @param fieldName  the field name, typically not used as already appended
-     * @param coll  the <code>Collection</code> to add to the
-     *  <code>toString</code>, not <code>null</code>
-     */
-    protected void appendDetail(final StringBuffer buffer, final String fieldName, final Collection<?> coll) {
-        buffer.append(coll);
-    }
-
-    /**
-     * <p>Append to the <code>toString</code> a <code>Map</code>.</p>
-     *
-     * @param buffer  the <code>StringBuffer</code> to populate
-     * @param fieldName  the field name, typically not used as already appended
-     * @param map  the <code>Map</code> to add to the <code>toString</code>,
-     *  not <code>null</code>
-     */
-    protected void appendDetail(final StringBuffer buffer, final String fieldName, final Map<?, ?> map) {
-        buffer.append(map);
-    }
-
-    /**
-     * <p>Append to the <code>toString</code> an <code>Object</code>
-     * value, printing a summary of the <code>Object</code>.</P>
-     *
-     * @param buffer  the <code>StringBuffer</code> to populate
-     * @param fieldName  the field name, typically not used as already appended
-     * @param value  the value to add to the <code>toString</code>,
-     *  not <code>null</code>
-     */
-    protected void appendSummary(final StringBuffer buffer, final String fieldName, final Object value) {
-        buffer.append(summaryObjectStartText);
-        buffer.append(getShortClassName(value.getClass()));
-        buffer.append(summaryObjectEndText);
-    }
-
-    //----------------------------------------------------------------------------
-
-    /**
-     * <p>Append to the <code>toString</code> a <code>long</code>
-     * value.</p>
-     *
-     * @param buffer  the <code>StringBuffer</code> to populate
-     * @param fieldName  the field name
-     * @param value  the value to add to the <code>toString</code>
-     */
-    public void append(final StringBuffer buffer, final String fieldName, final long value) {
-        appendFieldStart(buffer, fieldName);
-        appendDetail(buffer, fieldName, value);
-        appendFieldEnd(buffer, fieldName);
-    }
-
-    /**
-     * <p>Append to the <code>toString</code> a <code>long</code>
-     * value.</p>
-     *
-     * @param buffer  the <code>StringBuffer</code> to populate
-     * @param fieldName  the field name, typically not used as already appended
-     * @param value  the value to add to the <code>toString</code>
-     */
-    protected void appendDetail(final StringBuffer buffer, final String fieldName, final long value) {
-        buffer.append(value);
-    }
-
-    //----------------------------------------------------------------------------
-
-    /**
-     * <p>Append to the <code>toString</code> an <code>int</code>
-     * value.</p>
-     *
-     * @param buffer  the <code>StringBuffer</code> to populate
-     * @param fieldName  the field name
-     * @param value  the value to add to the <code>toString</code>
-     */
-    public void append(final StringBuffer buffer, final String fieldName, final int value) {
-        appendFieldStart(buffer, fieldName);
-        appendDetail(buffer, fieldName, value);
-        appendFieldEnd(buffer, fieldName);
-    }
-
-    /**
-     * <p>Append to the <code>toString</code> an <code>int</code>
-     * value.</p>
-     *
-     * @param buffer  the <code>StringBuffer</code> to populate
-     * @param fieldName  the field name, typically not used as already appended
-     * @param value  the value to add to the <code>toString</code>
-     */
-    protected void appendDetail(final StringBuffer buffer, final String fieldName, final int value) {
-        buffer.append(value);
-    }
-
-    //----------------------------------------------------------------------------
-
-    /**
-     * <p>Append to the <code>toString</code> a <code>short</code>
-     * value.</p>
-     *
-     * @param buffer  the <code>StringBuffer</code> to populate
-     * @param fieldName  the field name
-     * @param value  the value to add to the <code>toString</code>
-     */
-    public void append(final StringBuffer buffer, final String fieldName, final short value) {
-        appendFieldStart(buffer, fieldName);
-        appendDetail(buffer, fieldName, value);
-        appendFieldEnd(buffer, fieldName);
-    }
-
-    /**
-     * <p>Append to the <code>toString</code> a <code>short</code>
-     * value.</p>
-     *
-     * @param buffer  the <code>StringBuffer</code> to populate
-     * @param fieldName  the field name, typically not used as already appended
-     * @param value  the value to add to the <code>toString</code>
-     */
-    protected void appendDetail(final StringBuffer buffer, final String fieldName, final short value) {
-        buffer.append(value);
-    }
-
-    //----------------------------------------------------------------------------
-
-    /**
-     * <p>Append to the <code>toString</code> a <code>byte</code>
-     * value.</p>
-     *
-     * @param buffer  the <code>StringBuffer</code> to populate
-     * @param fieldName  the field name
-     * @param value  the value to add to the <code>toString</code>
-     */
-    public void append(final StringBuffer buffer, final String fieldName, final byte value) {
-        appendFieldStart(buffer, fieldName);
-        appendDetail(buffer, fieldName, value);
-        appendFieldEnd(buffer, fieldName);
-    }
-
-    /**
-     * <p>Append to the <code>toString</code> a <code>byte</code>
-     * value.</p>
-     *
-     * @param buffer  the <code>StringBuffer</code> to populate
-     * @param fieldName  the field name, typically not used as already appended
-     * @param value  the value to add to the <code>toString</code>
-     */
-    protected void appendDetail(final StringBuffer buffer, final String fieldName, final byte value) {
-        buffer.append(value);
-    }
-
-    //----------------------------------------------------------------------------
-
-    /**
-     * <p>Append to the <code>toString</code> a <code>char</code>
-     * value.</p>
-     *
-     * @param buffer  the <code>StringBuffer</code> to populate
-     * @param fieldName  the field name
-     * @param value  the value to add to the <code>toString</code>
-     */
-    public void append(final StringBuffer buffer, final String fieldName, final char value) {
-        appendFieldStart(buffer, fieldName);
-        appendDetail(buffer, fieldName, value);
-        appendFieldEnd(buffer, fieldName);
-    }
-
-    /**
-     * <p>Append to the <code>toString</code> a <code>char</code>
-     * value.</p>
-     *
-     * @param buffer  the <code>StringBuffer</code> to populate
-     * @param fieldName  the field name, typically not used as already appended
-     * @param value  the value to add to the <code>toString</code>
-     */
-    protected void appendDetail(final StringBuffer buffer, final String fieldName, final char value) {
-        buffer.append(value);
-    }
-
-    //----------------------------------------------------------------------------
-
-    /**
-     * <p>Append to the <code>toString</code> a <code>double</code>
-     * value.</p>
-     *
-     * @param buffer  the <code>StringBuffer</code> to populate
-     * @param fieldName  the field name
-     * @param value  the value to add to the <code>toString</code>
-     */
-    public void append(final StringBuffer buffer, final String fieldName, final double value) {
-        appendFieldStart(buffer, fieldName);
-        appendDetail(buffer, fieldName, value);
-        appendFieldEnd(buffer, fieldName);
-    }
-
-    /**
-     * <p>Append to the <code>toString</code> a <code>double</code>
-     * value.</p>
-     *
-     * @param buffer  the <code>StringBuffer</code> to populate
-     * @param fieldName  the field name, typically not used as already appended
-     * @param value  the value to add to the <code>toString</code>
-     */
-    protected void appendDetail(final StringBuffer buffer, final String fieldName, final double value) {
-        buffer.append(value);
-    }
-
-    //----------------------------------------------------------------------------
-
-    /**
-     * <p>Append to the <code>toString</code> a <code>float</code>
-     * value.</p>
-     *
-     * @param buffer  the <code>StringBuffer</code> to populate
-     * @param fieldName  the field name
-     * @param value  the value to add to the <code>toString</code>
-     */
-    public void append(final StringBuffer buffer, final String fieldName, final float value) {
-        appendFieldStart(buffer, fieldName);
-        appendDetail(buffer, fieldName, value);
-        appendFieldEnd(buffer, fieldName);
-    }
-
-    /**
-     * <p>Append to the <code>toString</code> a <code>float</code>
-     * value.</p>
-     *
-     * @param buffer  the <code>StringBuffer</code> to populate
-     * @param fieldName  the field name, typically not used as already appended
-     * @param value  the value to add to the <code>toString</code>
-     */
-    protected void appendDetail(final StringBuffer buffer, final String fieldName, final float value) {
-        buffer.append(value);
-    }
-
-    //----------------------------------------------------------------------------
-
-    /**
-     * <p>Append to the <code>toString</code> a <code>boolean</code>
-     * value.</p>
-     *
-     * @param buffer  the <code>StringBuffer</code> to populate
-     * @param fieldName  the field name
-     * @param value  the value to add to the <code>toString</code>
-     */
-    public void append(final StringBuffer buffer, final String fieldName, final boolean value) {
-        appendFieldStart(buffer, fieldName);
-        appendDetail(buffer, fieldName, value);
-        appendFieldEnd(buffer, fieldName);
-    }
-
-    /**
-     * <p>Append to the <code>toString</code> a <code>boolean</code>
-     * value.</p>
-     *
-     * @param buffer  the <code>StringBuffer</code> to populate
-     * @param fieldName  the field name, typically not used as already appended
-     * @param value  the value to add to the <code>toString</code>
-     */
-    protected void appendDetail(final StringBuffer buffer, final String fieldName, final boolean value) {
-        buffer.append(value);
-    }
-
-    /**
-     * <p>Append to the <code>toString</code> an <code>Object</code>
-     * array.</p>
-     *
-     * @param buffer  the <code>StringBuffer</code> to populate
-     * @param fieldName  the field name
-     * @param array  the array to add to the toString
-     * @param fullDetail  <code>true</code> for detail, <code>false</code>
-     *  for summary info, <code>null</code> for style decides
-     */
-    public void append(final StringBuffer buffer, final String fieldName, final Object[] array, final Boolean fullDetail) {
-        appendFieldStart(buffer, fieldName);
-
-        if (array == null) {
-            appendNullText(buffer, fieldName);
-
-        } else if (isFullDetail(fullDetail)) {
-            appendDetail(buffer, fieldName, array);
-
-        } else {
-            appendSummary(buffer, fieldName, array);
-        }
-
-        appendFieldEnd(buffer, fieldName);
-    }
-
-    //----------------------------------------------------------------------------
-
-    /**
-     * <p>Append to the <code>toString</code> the detail of an
-     * <code>Object</code> array.</p>
-     *
-     * @param buffer  the <code>StringBuffer</code> to populate
-     * @param fieldName  the field name, typically not used as already appended
-     * @param array  the array to add to the <code>toString</code>,
-     *  not <code>null</code>
-     */
-    protected void appendDetail(final StringBuffer buffer, final String fieldName, final Object[] array) {
-        buffer.append(arrayStart);
-        for (int i = 0; i < array.length; i++) {
-            final Object item = array[i];
-            if (i > 0) {
-                buffer.append(arraySeparator);
-            }
-            if (item == null) {
-                appendNullText(buffer, fieldName);
-
-            } else {
-                appendInternal(buffer, fieldName, item, arrayContentDetail);
-            }
-        }
-        buffer.append(arrayEnd);
-    }
-
-    /**
-     * <p>Append to the <code>toString</code> the detail of an array type.</p>
-     *
-     * @param buffer  the <code>StringBuffer</code> to populate
-     * @param fieldName  the field name, typically not used as already appended
-     * @param array  the array to add to the <code>toString</code>,
-     *  not <code>null</code>
-     * @since 2.0
-     */
-    protected void reflectionAppendArrayDetail(final StringBuffer buffer, final String fieldName, final Object array) {
-        buffer.append(arrayStart);
-        final int length = Array.getLength(array);
-        for (int i = 0; i < length; i++) {
-            final Object item = Array.get(array, i);
-            if (i > 0) {
-                buffer.append(arraySeparator);
-            }
-            if (item == null) {
-                appendNullText(buffer, fieldName);
-
-            } else {
-                appendInternal(buffer, fieldName, item, arrayContentDetail);
-            }
-        }
-        buffer.append(arrayEnd);
-    }
-
-    /**
-     * <p>Append to the <code>toString</code> a summary of an
-     * <code>Object</code> array.</p>
-     *
-     * @param buffer  the <code>StringBuffer</code> to populate
-     * @param fieldName  the field name, typically not used as already appended
-     * @param array  the array to add to the <code>toString</code>,
-     *  not <code>null</code>
-     */
-    protected void appendSummary(final StringBuffer buffer, final String fieldName, final Object[] array) {
-        appendSummarySize(buffer, fieldName, array.length);
-    }
-
-    //----------------------------------------------------------------------------
-
-    /**
-     * <p>Append to the <code>toString</code> a <code>long</code>
-     * array.</p>
-     *
-     * @param buffer  the <code>StringBuffer</code> to populate
-     * @param fieldName  the field name
-     * @param array  the array to add to the <code>toString</code>
-     * @param fullDetail  <code>true</code> for detail, <code>false</code>
-     *  for summary info, <code>null</code> for style decides
-     */
-    public void append(final StringBuffer buffer, final String fieldName, final long[] array, final Boolean fullDetail) {
-        appendFieldStart(buffer, fieldName);
-
-        if (array == null) {
-            appendNullText(buffer, fieldName);
-
-        } else if (isFullDetail(fullDetail)) {
-            appendDetail(buffer, fieldName, array);
-
-        } else {
-            appendSummary(buffer, fieldName, array);
-        }
-
-        appendFieldEnd(buffer, fieldName);
-    }
-
-    /**
-     * <p>Append to the <code>toString</code> the detail of a
-     * <code>long</code> array.</p>
-     *
-     * @param buffer  the <code>StringBuffer</code> to populate
-     * @param fieldName  the field name, typically not used as already appended
-     * @param array  the array to add to the <code>toString</code>,
-     *  not <code>null</code>
-     */
-    protected void appendDetail(final StringBuffer buffer, final String fieldName, final long[] array) {
-        buffer.append(arrayStart);
-        for (int i = 0; i < array.length; i++) {
-            if (i > 0) {
-                buffer.append(arraySeparator);
-            }
-            appendDetail(buffer, fieldName, array[i]);
-        }
-        buffer.append(arrayEnd);
-    }
-
-    /**
-     * <p>Append to the <code>toString</code> a summary of a
-     * <code>long</code> array.</p>
-     *
-     * @param buffer  the <code>StringBuffer</code> to populate
-     * @param fieldName  the field name, typically not used as already appended
-     * @param array  the array to add to the <code>toString</code>,
-     *  not <code>null</code>
-     */
-    protected void appendSummary(final StringBuffer buffer, final String fieldName, final long[] array) {
-        appendSummarySize(buffer, fieldName, array.length);
-    }
-
-    //----------------------------------------------------------------------------
-
-    /**
-     * <p>Append to the <code>toString</code> an <code>int</code>
-     * array.</p>
-     *
-     * @param buffer  the <code>StringBuffer</code> to populate
-     * @param fieldName  the field name
-     * @param array  the array to add to the <code>toString</code>
-     * @param fullDetail  <code>true</code> for detail, <code>false</code>
-     *  for summary info, <code>null</code> for style decides
-     */
-    public void append(final StringBuffer buffer, final String fieldName, final int[] array, final Boolean fullDetail) {
-        appendFieldStart(buffer, fieldName);
-
-        if (array == null) {
-            appendNullText(buffer, fieldName);
-
-        } else if (isFullDetail(fullDetail)) {
-            appendDetail(buffer, fieldName, array);
-
-        } else {
-            appendSummary(buffer, fieldName, array);
-        }
-
-        appendFieldEnd(buffer, fieldName);
-    }
-
-    /**
-     * <p>Append to the <code>toString</code> the detail of an
-     * <code>int</code> array.</p>
-     *
-     * @param buffer  the <code>StringBuffer</code> to populate
-     * @param fieldName  the field name, typically not used as already appended
-     * @param array  the array to add to the <code>toString</code>,
-     *  not <code>null</code>
-     */
-    protected void appendDetail(final StringBuffer buffer, final String fieldName, final int[] array) {
-        buffer.append(arrayStart);
-        for (int i = 0; i < array.length; i++) {
-            if (i > 0) {
-                buffer.append(arraySeparator);
-            }
-            appendDetail(buffer, fieldName, array[i]);
-        }
-        buffer.append(arrayEnd);
-    }
-
-    /**
-     * <p>Append to the <code>toString</code> a summary of an
-     * <code>int</code> array.</p>
-     *
-     * @param buffer  the <code>StringBuffer</code> to populate
-     * @param fieldName  the field name, typically not used as already appended
-     * @param array  the array to add to the <code>toString</code>,
-     *  not <code>null</code>
-     */
-    protected void appendSummary(final StringBuffer buffer, final String fieldName, final int[] array) {
-        appendSummarySize(buffer, fieldName, array.length);
-    }
-
-    //----------------------------------------------------------------------------
-
-    /**
-     * <p>Append to the <code>toString</code> a <code>short</code>
-     * array.</p>
-     *
-     * @param buffer  the <code>StringBuffer</code> to populate
-     * @param fieldName  the field name
-     * @param array  the array to add to the <code>toString</code>
-     * @param fullDetail  <code>true</code> for detail, <code>false</code>
-     *  for summary info, <code>null</code> for style decides
-     */
-    public void append(final StringBuffer buffer, final String fieldName, final short[] array, final Boolean fullDetail) {
-        appendFieldStart(buffer, fieldName);
-
-        if (array == null) {
-            appendNullText(buffer, fieldName);
-
-        } else if (isFullDetail(fullDetail)) {
-            appendDetail(buffer, fieldName, array);
-
-        } else {
-            appendSummary(buffer, fieldName, array);
-        }
-
-        appendFieldEnd(buffer, fieldName);
-    }
-
-    /**
-     * <p>Append to the <code>toString</code> the detail of a
-     * <code>short</code> array.</p>
-     *
-     * @param buffer  the <code>StringBuffer</code> to populate
-     * @param fieldName  the field name, typically not used as already appended
-     * @param array  the array to add to the <code>toString</code>,
-     *  not <code>null</code>
-     */
-    protected void appendDetail(final StringBuffer buffer, final String fieldName, final short[] array) {
-        buffer.append(arrayStart);
-        for (int i = 0; i < array.length; i++) {
-            if (i > 0) {
-                buffer.append(arraySeparator);
-            }
-            appendDetail(buffer, fieldName, array[i]);
-        }
-        buffer.append(arrayEnd);
-    }
-
-    /**
-     * <p>Append to the <code>toString</code> a summary of a
-     * <code>short</code> array.</p>
-     *
-     * @param buffer  the <code>StringBuffer</code> to populate
-     * @param fieldName  the field name, typically not used as already appended
-     * @param array  the array to add to the <code>toString</code>,
-     *  not <code>null</code>
-     */
-    protected void appendSummary(final StringBuffer buffer, final String fieldName, final short[] array) {
-        appendSummarySize(buffer, fieldName, array.length);
-    }
-
-    //----------------------------------------------------------------------------
-
-    /**
-     * <p>Append to the <code>toString</code> a <code>byte</code>
-     * array.</p>
-     *
-     * @param buffer  the <code>StringBuffer</code> to populate
-     * @param fieldName  the field name
-     * @param array  the array to add to the <code>toString</code>
-     * @param fullDetail  <code>true</code> for detail, <code>false</code>
-     *  for summary info, <code>null</code> for style decides
-     */
-    public void append(final StringBuffer buffer, final String fieldName, final byte[] array, final Boolean fullDetail) {
-        appendFieldStart(buffer, fieldName);
-
-        if (array == null) {
-            appendNullText(buffer, fieldName);
-
-        } else if (isFullDetail(fullDetail)) {
-            appendDetail(buffer, fieldName, array);
-
-        } else {
-            appendSummary(buffer, fieldName, array);
-        }
-
-        appendFieldEnd(buffer, fieldName);
-    }
-
-    /**
-     * <p>Append to the <code>toString</code> the detail of a
-     * <code>byte</code> array.</p>
-     *
-     * @param buffer  the <code>StringBuffer</code> to populate
-     * @param fieldName  the field name, typically not used as already appended
-     * @param array  the array to add to the <code>toString</code>,
-     *  not <code>null</code>
-     */
-    protected void appendDetail(final StringBuffer buffer, final String fieldName, final byte[] array) {
-        buffer.append(arrayStart);
-        for (int i = 0; i < array.length; i++) {
-            if (i > 0) {
-                buffer.append(arraySeparator);
-            }
-            appendDetail(buffer, fieldName, array[i]);
-        }
-        buffer.append(arrayEnd);
-    }
-
-    /**
-     * <p>Append to the <code>toString</code> a summary of a
-     * <code>byte</code> array.</p>
-     *
-     * @param buffer  the <code>StringBuffer</code> to populate
-     * @param fieldName  the field name, typically not used as already appended
-     * @param array  the array to add to the <code>toString</code>,
-     *  not <code>null</code>
-     */
-    protected void appendSummary(final StringBuffer buffer, final String fieldName, final byte[] array) {
-        appendSummarySize(buffer, fieldName, array.length);
-    }
-
-    //----------------------------------------------------------------------------
-
-    /**
-     * <p>Append to the <code>toString</code> a <code>char</code>
-     * array.</p>
-     *
-     * @param buffer  the <code>StringBuffer</code> to populate
-     * @param fieldName  the field name
-     * @param array  the array to add to the <code>toString</code>
-     * @param fullDetail  <code>true</code> for detail, <code>false</code>
-     *  for summary info, <code>null</code> for style decides
-     */
-    public void append(final StringBuffer buffer, final String fieldName, final char[] array, final Boolean fullDetail) {
-        appendFieldStart(buffer, fieldName);
-
-        if (array == null) {
-            appendNullText(buffer, fieldName);
-
-        } else if (isFullDetail(fullDetail)) {
-            appendDetail(buffer, fieldName, array);
-
-        } else {
-            appendSummary(buffer, fieldName, array);
-        }
-
-        appendFieldEnd(buffer, fieldName);
-    }
-
-    /**
-     * <p>Append to the <code>toString</code> the detail of a
-     * <code>char</code> array.</p>
-     *
-     * @param buffer  the <code>StringBuffer</code> to populate
-     * @param fieldName  the field name, typically not used as already appended
-     * @param array  the array to add to the <code>toString</code>,
-     *  not <code>null</code>
-     */
-    protected void appendDetail(final StringBuffer buffer, final String fieldName, final char[] array) {
-        buffer.append(arrayStart);
-        for (int i = 0; i < array.length; i++) {
-            if (i > 0) {
-                buffer.append(arraySeparator);
-            }
-            appendDetail(buffer, fieldName, array[i]);
-        }
-        buffer.append(arrayEnd);
-    }
-
-    /**
-     * <p>Append to the <code>toString</code> a summary of a
-     * <code>char</code> array.</p>
-     *
-     * @param buffer  the <code>StringBuffer</code> to populate
-     * @param fieldName  the field name, typically not used as already appended
-     * @param array  the array to add to the <code>toString</code>,
-     *  not <code>null</code>
-     */
-    protected void appendSummary(final StringBuffer buffer, final String fieldName, final char[] array) {
-        appendSummarySize(buffer, fieldName, array.length);
-    }
-
-    //----------------------------------------------------------------------------
-
-    /**
-     * <p>Append to the <code>toString</code> a <code>double</code>
-     * array.</p>
-     *
-     * @param buffer  the <code>StringBuffer</code> to populate
-     * @param fieldName  the field name
-     * @param array  the array to add to the toString
-     * @param fullDetail  <code>true</code> for detail, <code>false</code>
-     *  for summary info, <code>null</code> for style decides
-     */
-    public void append(final StringBuffer buffer, final String fieldName, final double[] array, final Boolean fullDetail) {
-        appendFieldStart(buffer, fieldName);
-
-        if (array == null) {
-            appendNullText(buffer, fieldName);
-
-        } else if (isFullDetail(fullDetail)) {
-            appendDetail(buffer, fieldName, array);
-
-        } else {
-            appendSummary(buffer, fieldName, array);
-        }
-
-        appendFieldEnd(buffer, fieldName);
-    }
-
-    /**
-     * <p>Append to the <code>toString</code> the detail of a
-     * <code>double</code> array.</p>
-     *
-     * @param buffer  the <code>StringBuffer</code> to populate
-     * @param fieldName  the field name, typically not used as already appended
-     * @param array  the array to add to the <code>toString</code>,
-     *  not <code>null</code>
-     */
-    protected void appendDetail(final StringBuffer buffer, final String fieldName, final double[] array) {
-        buffer.append(arrayStart);
-        for (int i = 0; i < array.length; i++) {
-            if (i > 0) {
-                buffer.append(arraySeparator);
-            }
-            appendDetail(buffer, fieldName, array[i]);
-        }
-        buffer.append(arrayEnd);
-    }
-
-    /**
-     * <p>Append to the <code>toString</code> a summary of a
-     * <code>double</code> array.</p>
-     *
-     * @param buffer  the <code>StringBuffer</code> to populate
-     * @param fieldName  the field name, typically not used as already appended
-     * @param array  the array to add to the <code>toString</code>,
-     *  not <code>null</code>
-     */
-    protected void appendSummary(final StringBuffer buffer, final String fieldName, final double[] array) {
-        appendSummarySize(buffer, fieldName, array.length);
-    }
-
-    //----------------------------------------------------------------------------
-
-    /**
-     * <p>Append to the <code>toString</code> a <code>float</code>
-     * array.</p>
-     *
-     * @param buffer  the <code>StringBuffer</code> to populate
-     * @param fieldName  the field name
-     * @param array  the array to add to the toString
-     * @param fullDetail  <code>true</code> for detail, <code>false</code>
-     *  for summary info, <code>null</code> for style decides
-     */
-    public void append(final StringBuffer buffer, final String fieldName, final float[] array, final Boolean fullDetail) {
-        appendFieldStart(buffer, fieldName);
-
-        if (array == null) {
-            appendNullText(buffer, fieldName);
-
-        } else if (isFullDetail(fullDetail)) {
-            appendDetail(buffer, fieldName, array);
-
-        } else {
-            appendSummary(buffer, fieldName, array);
-        }
-
-        appendFieldEnd(buffer, fieldName);
-    }
-
-    /**
-     * <p>Append to the <code>toString</code> the detail of a
-     * <code>float</code> array.</p>
-     *
-     * @param buffer  the <code>StringBuffer</code> to populate
-     * @param fieldName  the field name, typically not used as already appended
-     * @param array  the array to add to the <code>toString</code>,
-     *  not <code>null</code>
-     */
-    protected void appendDetail(final StringBuffer buffer, final String fieldName, final float[] array) {
-        buffer.append(arrayStart);
-        for (int i = 0; i < array.length; i++) {
-            if (i > 0) {
-                buffer.append(arraySeparator);
-            }
-            appendDetail(buffer, fieldName, array[i]);
-        }
-        buffer.append(arrayEnd);
-    }
-
-    /**
-     * <p>Append to the <code>toString</code> a summary of a
-     * <code>float</code> array.</p>
-     *
-     * @param buffer  the <code>StringBuffer</code> to populate
-     * @param fieldName  the field name, typically not used as already appended
-     * @param array  the array to add to the <code>toString</code>,
-     *  not <code>null</code>
-     */
-    protected void appendSummary(final StringBuffer buffer, final String fieldName, final float[] array) {
-        appendSummarySize(buffer, fieldName, array.length);
-    }
-
-    //----------------------------------------------------------------------------
-
-    /**
-     * <p>Append to the <code>toString</code> a <code>boolean</code>
-     * array.</p>
-     *
-     * @param buffer  the <code>StringBuffer</code> to populate
-     * @param fieldName  the field name
-     * @param array  the array to add to the toString
-     * @param fullDetail  <code>true</code> for detail, <code>false</code>
-     *  for summary info, <code>null</code> for style decides
-     */
-    public void append(final StringBuffer buffer, final String fieldName, final boolean[] array, final Boolean fullDetail) {
-        appendFieldStart(buffer, fieldName);
-
-        if (array == null) {
-            appendNullText(buffer, fieldName);
-
-        } else if (isFullDetail(fullDetail)) {
-            appendDetail(buffer, fieldName, array);
-
-        } else {
-            appendSummary(buffer, fieldName, array);
-        }
-
-        appendFieldEnd(buffer, fieldName);
-    }
-
-    /**
-     * <p>Append to the <code>toString</code> the detail of a
-     * <code>boolean</code> array.</p>
-     *
-     * @param buffer  the <code>StringBuffer</code> to populate
-     * @param fieldName  the field name, typically not used as already appended
-     * @param array  the array to add to the <code>toString</code>,
-     *  not <code>null</code>
-     */
-    protected void appendDetail(final StringBuffer buffer, final String fieldName, final boolean[] array) {
-        buffer.append(arrayStart);
-        for (int i = 0; i < array.length; i++) {
-            if (i > 0) {
-                buffer.append(arraySeparator);
-            }
-            appendDetail(buffer, fieldName, array[i]);
-        }
-        buffer.append(arrayEnd);
-    }
-
-    /**
-     * <p>Append to the <code>toString</code> a summary of a
-     * <code>boolean</code> array.</p>
-     *
-     * @param buffer  the <code>StringBuffer</code> to populate
-     * @param fieldName  the field name, typically not used as already appended
-     * @param array  the array to add to the <code>toString</code>,
-     *  not <code>null</code>
-     */
-    protected void appendSummary(final StringBuffer buffer, final String fieldName, final boolean[] array) {
-        appendSummarySize(buffer, fieldName, array.length);
-    }
-
-    //----------------------------------------------------------------------------
-
-    /**
-     * <p>Append to the <code>toString</code> the class name.</p>
-     *
-     * @param buffer  the <code>StringBuffer</code> to populate
-     * @param object  the <code>Object</code> whose name to output
-     */
-    protected void appendClassName(final StringBuffer buffer, final Object object) {
-        if (useClassName && object != null) {
-            register(object);
-            if (useShortClassName) {
-                buffer.append(getShortClassName(object.getClass()));
-            } else {
-                buffer.append(object.getClass().getName());
-            }
-        }
-    }
-
-    /**
-     * <p>Append the {@link System#identityHashCode(java.lang.Object)}.</p>
-     *
-     * @param buffer  the <code>StringBuffer</code> to populate
-     * @param object  the <code>Object</code> whose id to output
-     */
-    protected void appendIdentityHashCode(final StringBuffer buffer, final Object object) {
-        if (this.isUseIdentityHashCode() && object!=null) {
-            register(object);
-            buffer.append('@');
-            buffer.append(Integer.toHexString(System.identityHashCode(object)));
-        }
-    }
-
-    /**
-     * <p>Append to the <code>toString</code> the content start.</p>
-     *
-     * @param buffer  the <code>StringBuffer</code> to populate
-     */
-    protected void appendContentStart(final StringBuffer buffer) {
-        buffer.append(contentStart);
-    }
-
-    /**
-     * <p>Append to the <code>toString</code> the content end.</p>
-     *
-     * @param buffer  the <code>StringBuffer</code> to populate
-     */
-    protected void appendContentEnd(final StringBuffer buffer) {
-        buffer.append(contentEnd);
-    }
-
-    /**
-     * <p>Append to the <code>toString</code> an indicator for <code>null</code>.</p>
-     *
-     * <p>The default indicator is <code>'&lt;null&gt;'</code>.</p>
-     *
-     * @param buffer  the <code>StringBuffer</code> to populate
-     * @param fieldName  the field name, typically not used as already appended
-     */
-    protected void appendNullText(final StringBuffer buffer, final String fieldName) {
-        buffer.append(nullText);
-    }
-
-    /**
-     * <p>Append to the <code>toString</code> the field separator.</p>
-     *
-     * @param buffer  the <code>StringBuffer</code> to populate
-     */
-    protected void appendFieldSeparator(final StringBuffer buffer) {
-        buffer.append(fieldSeparator);
-    }
-
-    /**
-     * <p>Append to the <code>toString</code> the field start.</p>
-     *
-     * @param buffer  the <code>StringBuffer</code> to populate
-     * @param fieldName  the field name
-     */
-    protected void appendFieldStart(final StringBuffer buffer, final String fieldName) {
-        if (useFieldNames && fieldName != null) {
-            buffer.append(fieldName);
-            buffer.append(fieldNameValueSeparator);
-        }
-    }
-
-    /**
-     * <p>Append to the <code>toString</code> the field end.</p>
-     *
-     * @param buffer  the <code>StringBuffer</code> to populate
-     * @param fieldName  the field name, typically not used as already appended
-     */
-    protected void appendFieldEnd(final StringBuffer buffer, final String fieldName) {
-        appendFieldSeparator(buffer);
-    }
-
-    /**
-     * <p>Append to the <code>toString</code> a size summary.</p>
-     *
-     * <p>The size summary is used to summarize the contents of
-     * <code>Collections</code>, <code>Maps</code> and arrays.</p>
-     *
-     * <p>The output consists of a prefix, the passed in size
-     * and a suffix.</p>
-     *
-     * <p>The default format is <code>'&lt;size=n&gt;'</code>.</p>
-     *
-     * @param buffer  the <code>StringBuffer</code> to populate
-     * @param fieldName  the field name, typically not used as already appended
-     * @param size  the size to append
-     */
-    protected void appendSummarySize(final StringBuffer buffer, final String fieldName, final int size) {
-        buffer.append(sizeStartText);
-        buffer.append(size);
-        buffer.append(sizeEndText);
-    }
-
-    /**
-     * <p>Is this field to be output in full detail.</p>
-     *
-     * <p>This method converts a detail request into a detail level.
-     * The calling code may request full detail (<code>true</code>),
-     * but a subclass might ignore that and always return
-     * <code>false</code>. The calling code may pass in
-     * <code>null</code> indicating that it doesn't care about
-     * the detail level. In this case the default detail level is
-     * used.</p>
-     *
-     * @param fullDetailRequest  the detail level requested
-     * @return whether full detail is to be shown
-     */
-    protected boolean isFullDetail(final Boolean fullDetailRequest) {
-        if (fullDetailRequest == null) {
-            return defaultFullDetail;
-        }
-        return fullDetailRequest.booleanValue();
-    }
-
-    /**
-     * <p>Gets the short class name for a class.</p>
-     *
-     * <p>The short class name is the classname excluding
-     * the package name.</p>
-     *
-     * @param cls  the <code>Class</code> to get the short name of
-     * @return the short name
-     */
-    protected String getShortClassName(final Class<?> cls) {
-        return ClassUtils.getShortClassName(cls);
-    }
-
-    // Setters and getters for the customizable parts of the style
-    // These methods are not expected to be overridden, except to make public
-    // (They are not public so that immutable subclasses can be written)
-    //---------------------------------------------------------------------
-
-    /**
-     * <p>Gets whether to use the class name.</p>
-     *
-     * @return the current useClassName flag
-     */
-    protected boolean isUseClassName() {
-        return useClassName;
-    }
-
-    /**
-     * <p>Sets whether to use the class name.</p>
-     *
-     * @param useClassName  the new useClassName flag
-     */
-    protected void setUseClassName(final boolean useClassName) {
-        this.useClassName = useClassName;
-    }
-
-    //---------------------------------------------------------------------
-
-    /**
-     * <p>Gets whether to output short or long class names.</p>
-     *
-     * @return the current useShortClassName flag
-     * @since 2.0
-     */
-    protected boolean isUseShortClassName() {
-        return useShortClassName;
-    }
-
-    /**
-     * <p>Sets whether to output short or long class names.</p>
-     *
-     * @param useShortClassName  the new useShortClassName flag
-     * @since 2.0
-     */
-    protected void setUseShortClassName(final boolean useShortClassName) {
-        this.useShortClassName = useShortClassName;
-    }
-
-    //---------------------------------------------------------------------
-
-    /**
-     * <p>Gets whether to use the identity hash code.</p>
-     *
-     * @return the current useIdentityHashCode flag
-     */
-    protected boolean isUseIdentityHashCode() {
-        return useIdentityHashCode;
-    }
-
-    /**
-     * <p>Sets whether to use the identity hash code.</p>
-     *
-     * @param useIdentityHashCode  the new useIdentityHashCode flag
-     */
-    protected void setUseIdentityHashCode(final boolean useIdentityHashCode) {
-        this.useIdentityHashCode = useIdentityHashCode;
-    }
-
-    //---------------------------------------------------------------------
-
-    /**
-     * <p>Gets whether to use the field names passed in.</p>
-     *
-     * @return the current useFieldNames flag
-     */
-    protected boolean isUseFieldNames() {
-        return useFieldNames;
-    }
-
-    /**
-     * <p>Sets whether to use the field names passed in.</p>
-     *
-     * @param useFieldNames  the new useFieldNames flag
-     */
-    protected void setUseFieldNames(final boolean useFieldNames) {
-        this.useFieldNames = useFieldNames;
-    }
-
-    //---------------------------------------------------------------------
-
-    /**
-     * <p>Gets whether to use full detail when the caller doesn't
-     * specify.</p>
-     *
-     * @return the current defaultFullDetail flag
-     */
-    protected boolean isDefaultFullDetail() {
-        return defaultFullDetail;
-    }
-
-    /**
-     * <p>Sets whether to use full detail when the caller doesn't
-     * specify.</p>
-     *
-     * @param defaultFullDetail  the new defaultFullDetail flag
-     */
-    protected void setDefaultFullDetail(final boolean defaultFullDetail) {
-        this.defaultFullDetail = defaultFullDetail;
-    }
-
-    //---------------------------------------------------------------------
-
-    /**
-     * <p>Gets whether to output array content detail.</p>
-     *
-     * @return the current array content detail setting
-     */
-    protected boolean isArrayContentDetail() {
-        return arrayContentDetail;
-    }
-
-    /**
-     * <p>Sets whether to output array content detail.</p>
-     *
-     * @param arrayContentDetail  the new arrayContentDetail flag
-     */
-    protected void setArrayContentDetail(final boolean arrayContentDetail) {
-        this.arrayContentDetail = arrayContentDetail;
-    }
-
-    //---------------------------------------------------------------------
-
-    /**
-     * <p>Gets the array start text.</p>
-     *
-     * @return the current array start text
-     */
-    protected String getArrayStart() {
-        return arrayStart;
-    }
-
-    /**
-     * <p>Sets the array start text.</p>
-     *
-     * <p><code>null</code> is accepted, but will be converted to
-     * an empty String.</p>
-     *
-     * @param arrayStart  the new array start text
-     */
-    protected void setArrayStart(String arrayStart) {
-        if (arrayStart == null) {
-            arrayStart = "";
-        }
-        this.arrayStart = arrayStart;
-    }
-
-    //---------------------------------------------------------------------
-
-    /**
-     * <p>Gets the array end text.</p>
-     *
-     * @return the current array end text
-     */
-    protected String getArrayEnd() {
-        return arrayEnd;
-    }
-
-    /**
-     * <p>Sets the array end text.</p>
-     *
-     * <p><code>null</code> is accepted, but will be converted to
-     * an empty String.</p>
-     *
-     * @param arrayEnd  the new array end text
-     */
-    protected void setArrayEnd(String arrayEnd) {
-        if (arrayEnd == null) {
-            arrayEnd = "";
-        }
-        this.arrayEnd = arrayEnd;
-    }
-
-    //---------------------------------------------------------------------
-
-    /**
-     * <p>Gets the array separator text.</p>
-     *
-     * @return the current array separator text
-     */
-    protected String getArraySeparator() {
-        return arraySeparator;
-    }
-
-    /**
-     * <p>Sets the array separator text.</p>
-     *
-     * <p><code>null</code> is accepted, but will be converted to
-     * an empty String.</p>
-     *
-     * @param arraySeparator  the new array separator text
-     */
-    protected void setArraySeparator(String arraySeparator) {
-        if (arraySeparator == null) {
-            arraySeparator = "";
-        }
-        this.arraySeparator = arraySeparator;
-    }
-
-    //---------------------------------------------------------------------
-
-    /**
-     * <p>Gets the content start text.</p>
-     *
-     * @return the current content start text
-     */
-    protected String getContentStart() {
-        return contentStart;
-    }
-
-    /**
-     * <p>Sets the content start text.</p>
-     *
-     * <p><code>null</code> is accepted, but will be converted to
-     * an empty String.</p>
-     *
-     * @param contentStart  the new content start text
-     */
-    protected void setContentStart(String contentStart) {
-        if (contentStart == null) {
-            contentStart = "";
-        }
-        this.contentStart = contentStart;
-    }
-
-    //---------------------------------------------------------------------
-
-    /**
-     * <p>Gets the content end text.</p>
-     *
-     * @return the current content end text
-     */
-    protected String getContentEnd() {
-        return contentEnd;
-    }
-
-    /**
-     * <p>Sets the content end text.</p>
-     *
-     * <p><code>null</code> is accepted, but will be converted to
-     * an empty String.</p>
-     *
-     * @param contentEnd  the new content end text
-     */
-    protected void setContentEnd(String contentEnd) {
-        if (contentEnd == null) {
-            contentEnd = "";
-        }
-        this.contentEnd = contentEnd;
-    }
-
-    //---------------------------------------------------------------------
-
-    /**
-     * <p>Gets the field name value separator text.</p>
-     *
-     * @return the current field name value separator text
-     */
-    protected String getFieldNameValueSeparator() {
-        return fieldNameValueSeparator;
-    }
-
-    /**
-     * <p>Sets the field name value separator text.</p>
-     *
-     * <p><code>null</code> is accepted, but will be converted to
-     * an empty String.</p>
-     *
-     * @param fieldNameValueSeparator  the new field name value separator text
-     */
-    protected void setFieldNameValueSeparator(String fieldNameValueSeparator) {
-        if (fieldNameValueSeparator == null) {
-            fieldNameValueSeparator = "";
-        }
-        this.fieldNameValueSeparator = fieldNameValueSeparator;
-    }
-
-    //---------------------------------------------------------------------
-
-    /**
-     * <p>Gets the field separator text.</p>
-     *
-     * @return the current field separator text
-     */
-    protected String getFieldSeparator() {
-        return fieldSeparator;
-    }
-
-    /**
-     * <p>Sets the field separator text.</p>
-     *
-     * <p><code>null</code> is accepted, but will be converted to
-     * an empty String.</p>
-     *
-     * @param fieldSeparator  the new field separator text
-     */
-    protected void setFieldSeparator(String fieldSeparator) {
-        if (fieldSeparator == null) {
-            fieldSeparator = "";
-        }
-        this.fieldSeparator = fieldSeparator;
-    }
-
-    //---------------------------------------------------------------------
-
-    /**
-     * <p>Gets whether the field separator should be added at the start
-     * of each buffer.</p>
-     *
-     * @return the fieldSeparatorAtStart flag
-     * @since 2.0
-     */
-    protected boolean isFieldSeparatorAtStart() {
-        return fieldSeparatorAtStart;
-    }
-
-    /**
-     * <p>Sets whether the field separator should be added at the start
-     * of each buffer.</p>
-     *
-     * @param fieldSeparatorAtStart  the fieldSeparatorAtStart flag
-     * @since 2.0
-     */
-    protected void setFieldSeparatorAtStart(final boolean fieldSeparatorAtStart) {
-        this.fieldSeparatorAtStart = fieldSeparatorAtStart;
-    }
-
-    //---------------------------------------------------------------------
-
-    /**
-     * <p>Gets whether the field separator should be added at the end
-     * of each buffer.</p>
-     *
-     * @return fieldSeparatorAtEnd flag
-     * @since 2.0
-     */
-    protected boolean isFieldSeparatorAtEnd() {
-        return fieldSeparatorAtEnd;
-    }
-
-    /**
-     * <p>Sets whether the field separator should be added at the end
-     * of each buffer.</p>
-     *
-     * @param fieldSeparatorAtEnd  the fieldSeparatorAtEnd flag
-     * @since 2.0
-     */
-    protected void setFieldSeparatorAtEnd(final boolean fieldSeparatorAtEnd) {
-        this.fieldSeparatorAtEnd = fieldSeparatorAtEnd;
-    }
-
-    //---------------------------------------------------------------------
-
-    /**
-     * <p>Gets the text to output when <code>null</code> found.</p>
-     *
-     * @return the current text to output when null found
-     */
-    protected String getNullText() {
-        return nullText;
-    }
-
-    /**
-     * <p>Sets the text to output when <code>null</code> found.</p>
-     *
-     * <p><code>null</code> is accepted, but will be converted to
-     * an empty String.</p>
-     *
-     * @param nullText  the new text to output when null found
-     */
-    protected void setNullText(String nullText) {
-        if (nullText == null) {
-            nullText = "";
-        }
-        this.nullText = nullText;
-    }
-
-    //---------------------------------------------------------------------
-
-    /**
-     * <p>Gets the start text to output when a <code>Collection</code>,
-     * <code>Map</code> or array size is output.</p>
-     *
-     * <p>This is output before the size value.</p>
-     *
-     * @return the current start of size text
-     */
-    protected String getSizeStartText() {
-        return sizeStartText;
-    }
-
-    /**
-     * <p>Sets the start text to output when a <code>Collection</code>,
-     * <code>Map</code> or array size is output.</p>
-     *
-     * <p>This is output before the size value.</p>
-     *
-     * <p><code>null</code> is accepted, but will be converted to
-     * an empty String.</p>
-     *
-     * @param sizeStartText  the new start of size text
-     */
-    protected void setSizeStartText(String sizeStartText) {
-        if (sizeStartText == null) {
-            sizeStartText = "";
-        }
-        this.sizeStartText = sizeStartText;
-    }
-
-    //---------------------------------------------------------------------
-
-    /**
-     * <p>Gets the end text to output when a <code>Collection</code>,
-     * <code>Map</code> or array size is output.</p>
-     *
-     * <p>This is output after the size value.</p>
-     *
-     * @return the current end of size text
-     */
-    protected String getSizeEndText() {
-        return sizeEndText;
-    }
-
-    /**
-     * <p>Sets the end text to output when a <code>Collection</code>,
-     * <code>Map</code> or array size is output.</p>
-     *
-     * <p>This is output after the size value.</p>
-     *
-     * <p><code>null</code> is accepted, but will be converted to
-     * an empty String.</p>
-     *
-     * @param sizeEndText  the new end of size text
-     */
-    protected void setSizeEndText(String sizeEndText) {
-        if (sizeEndText == null) {
-            sizeEndText = "";
-        }
-        this.sizeEndText = sizeEndText;
-    }
-
-    //---------------------------------------------------------------------
-
-    /**
-     * <p>Gets the start text to output when an <code>Object</code> is
-     * output in summary mode.</p>
-     *
-     * <p>This is output before the size value.</p>
-     *
-     * @return the current start of summary text
-     */
-    protected String getSummaryObjectStartText() {
-        return summaryObjectStartText;
-    }
-
-    /**
-     * <p>Sets the start text to output when an <code>Object</code> is
-     * output in summary mode.</p>
-     *
-     * <p>This is output before the size value.</p>
-     *
-     * <p><code>null</code> is accepted, but will be converted to
-     * an empty String.</p>
-     *
-     * @param summaryObjectStartText  the new start of summary text
-     */
-    protected void setSummaryObjectStartText(String summaryObjectStartText) {
-        if (summaryObjectStartText == null) {
-            summaryObjectStartText = "";
-        }
-        this.summaryObjectStartText = summaryObjectStartText;
-    }
-
-    //---------------------------------------------------------------------
-
-    /**
-     * <p>Gets the end text to output when an <code>Object</code> is
-     * output in summary mode.</p>
-     *
-     * <p>This is output after the size value.</p>
-     *
-     * @return the current end of summary text
-     */
-    protected String getSummaryObjectEndText() {
-        return summaryObjectEndText;
-    }
-
-    /**
-     * <p>Sets the end text to output when an <code>Object</code> is
-     * output in summary mode.</p>
-     *
-     * <p>This is output after the size value.</p>
-     *
-     * <p><code>null</code> is accepted, but will be converted to
-     * an empty String.</p>
-     *
-     * @param summaryObjectEndText  the new end of summary text
-     */
-    protected void setSummaryObjectEndText(String summaryObjectEndText) {
-        if (summaryObjectEndText == null) {
-            summaryObjectEndText = "";
-        }
-        this.summaryObjectEndText = summaryObjectEndText;
-    }
-
-    //----------------------------------------------------------------------------
-
-    /**
-     * <p>Default <code>ToStringStyle</code>.</p>
-     *
-     * <p>This is an inner class rather than using
-     * <code>StandardToStringStyle</code> to ensure its immutability.</p>
-     */
-    private static final class DefaultToStringStyle extends ToStringStyle {
-
-        /**
-         * Required for serialization support.
-         *
-         * @see java.io.Serializable
-         */
-        private static final long serialVersionUID = 1L;
-
-        /**
-         * <p>Constructor.</p>
-         *
-         * <p>Use the static constant rather than instantiating.</p>
-         */
-        DefaultToStringStyle() {
-            super();
-        }
-
-        /**
-         * <p>Ensure <code>Singleton</code> after serialization.</p>
-         *
-         * @return the singleton
-         */
-        private Object readResolve() {
-            return ToStringStyle.DEFAULT_STYLE;
-        }
-
-    }
-
-    //----------------------------------------------------------------------------
-
-    /**
-     * <p><code>ToStringStyle</code> that does not print out
-     * the field names.</p>
-     *
-     * <p>This is an inner class rather than using
-     * <code>StandardToStringStyle</code> to ensure its immutability.
-     */
-    private static final class NoFieldNameToStringStyle extends ToStringStyle {
-
-        private static final long serialVersionUID = 1L;
-
-        /**
-         * <p>Constructor.</p>
-         *
-         * <p>Use the static constant rather than instantiating.</p>
-         */
-        NoFieldNameToStringStyle() {
-            super();
-            this.setUseFieldNames(false);
-        }
-
-        /**
-         * <p>Ensure <code>Singleton</code> after serialization.</p>
-         *
-         * @return the singleton
-         */
-        private Object readResolve() {
-            return ToStringStyle.NO_FIELD_NAMES_STYLE;
-        }
-
-    }
-
-    //----------------------------------------------------------------------------
-
-    /**
-     * <p><code>ToStringStyle</code> that prints out the short
-     * class name and no identity hashcode.</p>
-     *
-     * <p>This is an inner class rather than using
-     * <code>StandardToStringStyle</code> to ensure its immutability.</p>
-     */
-    private static final class ShortPrefixToStringStyle extends ToStringStyle {
-
-        private static final long serialVersionUID = 1L;
-
-        /**
-         * <p>Constructor.</p>
-         *
-         * <p>Use the static constant rather than instantiating.</p>
-         */
-        ShortPrefixToStringStyle() {
-            super();
-            this.setUseShortClassName(true);
-            this.setUseIdentityHashCode(false);
-        }
-
-        /**
-         * <p>Ensure <code>Singleton</ode> after serialization.</p>
-         * @return the singleton
-         */
-        private Object readResolve() {
-            return ToStringStyle.SHORT_PREFIX_STYLE;
-        }
-
-    }
-
-    //----------------------------------------------------------------------------
-
-    /**
-     * <p><code>ToStringStyle</code> that does not print out the
-     * classname, identity hashcode, content start or field name.</p>
-     *
-     * <p>This is an inner class rather than using
-     * <code>StandardToStringStyle</code> to ensure its immutability.</p>
-     */
-    private static final class SimpleToStringStyle extends ToStringStyle {
-
-        private static final long serialVersionUID = 1L;
-
-        /**
-         * <p>Constructor.</p>
-         *
-         * <p>Use the static constant rather than instantiating.</p>
-         */
-        SimpleToStringStyle() {
-            super();
-            this.setUseClassName(false);
-            this.setUseIdentityHashCode(false);
-            this.setUseFieldNames(false);
-            this.setContentStart("");
-            this.setContentEnd("");
-        }
-
-        /**
-         * <p>Ensure <code>Singleton</ode> after serialization.</p>
-         * @return the singleton
-         */
-        private Object readResolve() {
-            return ToStringStyle.SIMPLE_STYLE;
-        }
-
-    }
-
-    //----------------------------------------------------------------------------
-
-    /**
-     * <p><code>ToStringStyle</code> that outputs on multiple lines.</p>
-     *
-     * <p>This is an inner class rather than using
-     * <code>StandardToStringStyle</code> to ensure its immutability.</p>
-     */
-    private static final class MultiLineToStringStyle extends ToStringStyle {
-
-        private static final long serialVersionUID = 1L;
-
-        /**
-         * <p>Constructor.</p>
-         *
-         * <p>Use the static constant rather than instantiating.</p>
-         */
-        MultiLineToStringStyle() {
-            super();
-            this.setContentStart("[");
-            this.setFieldSeparator(SystemUtils.LINE_SEPARATOR + "  ");
-            this.setFieldSeparatorAtStart(true);
-            this.setContentEnd(SystemUtils.LINE_SEPARATOR + "]");
-        }
-
-        /**
-         * <p>Ensure <code>Singleton</code> after serialization.</p>
-         *
-         * @return the singleton
-         */
-        private Object readResolve() {
-            return ToStringStyle.MULTI_LINE_STYLE;
-        }
-
-    }
-
-    //----------------------------------------------------------------------------
-
-    /**
-     * <p><code>ToStringStyle</code> that does not print out the classname
-     * and identity hashcode but prints content start and field names.</p>
-     *
-     * <p>This is an inner class rather than using
-     * <code>StandardToStringStyle</code> to ensure its immutability.</p>
-     */
-    private static final class NoClassNameToStringStyle extends ToStringStyle {
-
-        private static final long serialVersionUID = 1L;
-
-        /**
-         * <p>Constructor.</p>
-         *
-         * <p>Use the static constant rather than instantiating.</p>
-         */
-        NoClassNameToStringStyle() {
-            super();
-            this.setUseClassName(false);
-            this.setUseIdentityHashCode(false);
-        }
-
-        /**
-         * <p>Ensure <code>Singleton</code> after serialization.</p>
-         *
-         * @return the singleton
-         */
-        private Object readResolve() {
-            return ToStringStyle.NO_CLASS_NAME_STYLE;
-        }
-
-    }
-
-    // ----------------------------------------------------------------------------
-
-    /**
-     * <p>
-     * <code>ToStringStyle</code> that outputs with JSON format.
-     * </p>
-     *
-     * <p>
-     * This is an inner class rather than using
-     * <code>StandardToStringStyle</code> to ensure its immutability.
-     * </p>
-     */
-    private static final class JsonToStringStyle extends ToStringStyle {
-
-        private static final long serialVersionUID = 1L;
-
-        /**
-         * The summary size text start <code>'&gt;'</code>.
-         */
-        private String FIELD_NAME_PREFIX = "\"";
-
-        /**
-         * <p>
-         * Constructor.
-         * </p>
-         *
-         * <p>
-         * Use the static constant rather than instantiating.
-         * </p>
-         */
-        JsonToStringStyle() {
-            super();
-
-            this.setUseClassName(false);
-            this.setUseIdentityHashCode(false);
-
-            this.setContentStart("{");
-            this.setContentEnd("}");
-
-            this.setArrayStart("[");
-            this.setArrayEnd("]");
-
-            this.setFieldSeparator(",");
-            this.setFieldNameValueSeparator(":");
-
-            this.setNullText("null");
-
-            this.setSummaryObjectStartText("\"<");
-            this.setSummaryObjectEndText(">\"");
-
-            this.setSizeStartText("\"<size=");
-            this.setSizeEndText(">\"");
-        }
-
-        @Override
-        public void append(StringBuffer buffer, String fieldName,
-                           Object[] array, Boolean fullDetail) {
-
-            if (fieldName == null) {
-                throw new UnsupportedOperationException(
-                        "Field names are mandatory when using JsonToStringStyle");
-            }
-            if (!isFullDetail(fullDetail)){
-                throw new UnsupportedOperationException(
-                        "FullDetail must be true when using JsonToStringStyle");
-            }
-
-            super.append(buffer, fieldName, array, fullDetail);
-        }
-
-        @Override
-        public void append(StringBuffer buffer, String fieldName, long[] array,
-                           Boolean fullDetail) {
-
-            if (fieldName == null) {
-                throw new UnsupportedOperationException(
-                        "Field names are mandatory when using JsonToStringStyle");
-            }
-            if (!isFullDetail(fullDetail)){
-                throw new UnsupportedOperationException(
-                        "FullDetail must be true when using JsonToStringStyle");
-            }
-
-            super.append(buffer, fieldName, array, fullDetail);
-        }
-
-        @Override
-        public void append(StringBuffer buffer, String fieldName, int[] array,
-                           Boolean fullDetail) {
-
-            if (fieldName == null) {
-                throw new UnsupportedOperationException(
-                        "Field names are mandatory when using JsonToStringStyle");
-            }
-            if (!isFullDetail(fullDetail)){
-                throw new UnsupportedOperationException(
-                        "FullDetail must be true when using JsonToStringStyle");
-            }
-
-            super.append(buffer, fieldName, array, fullDetail);
-        }
-
-        @Override
-        public void append(StringBuffer buffer, String fieldName,
-                           short[] array, Boolean fullDetail) {
-
-            if (fieldName == null) {
-                throw new UnsupportedOperationException(
-                        "Field names are mandatory when using JsonToStringStyle");
-            }
-            if (!isFullDetail(fullDetail)){
-                throw new UnsupportedOperationException(
-                        "FullDetail must be true when using JsonToStringStyle");
-            }
-
-            super.append(buffer, fieldName, array, fullDetail);
-        }
-
-        @Override
-        public void append(StringBuffer buffer, String fieldName, byte[] array,
-                           Boolean fullDetail) {
-
-            if (fieldName == null) {
-                throw new UnsupportedOperationException(
-                        "Field names are mandatory when using JsonToStringStyle");
-            }
-            if (!isFullDetail(fullDetail)){
-                throw new UnsupportedOperationException(
-                        "FullDetail must be true when using JsonToStringStyle");
-            }
-
-            super.append(buffer, fieldName, array, fullDetail);
-        }
-
-        @Override
-        public void append(StringBuffer buffer, String fieldName, char[] array,
-                           Boolean fullDetail) {
-
-            if (fieldName == null) {
-                throw new UnsupportedOperationException(
-                        "Field names are mandatory when using JsonToStringStyle");
-            }
-            if (!isFullDetail(fullDetail)){
-                throw new UnsupportedOperationException(
-                        "FullDetail must be true when using JsonToStringStyle");
-            }
-
-            super.append(buffer, fieldName, array, fullDetail);
-        }
-
-        @Override
-        public void append(StringBuffer buffer, String fieldName,
-                           double[] array, Boolean fullDetail) {
-
-            if (fieldName == null) {
-                throw new UnsupportedOperationException(
-                        "Field names are mandatory when using JsonToStringStyle");
-            }
-            if (!isFullDetail(fullDetail)){
-                throw new UnsupportedOperationException(
-                        "FullDetail must be true when using JsonToStringStyle");
-            }
-
-            super.append(buffer, fieldName, array, fullDetail);
-        }
-
-        @Override
-        public void append(StringBuffer buffer, String fieldName,
-                           float[] array, Boolean fullDetail) {
-
-            if (fieldName == null) {
-                throw new UnsupportedOperationException(
-                        "Field names are mandatory when using JsonToStringStyle");
-            }
-            if (!isFullDetail(fullDetail)){
-                throw new UnsupportedOperationException(
-                        "FullDetail must be true when using JsonToStringStyle");
-            }
-
-            super.append(buffer, fieldName, array, fullDetail);
-        }
-
-        @Override
-        public void append(StringBuffer buffer, String fieldName,
-                           boolean[] array, Boolean fullDetail) {
-
-            if (fieldName == null) {
-                throw new UnsupportedOperationException(
-                        "Field names are mandatory when using JsonToStringStyle");
-            }
-            if (!isFullDetail(fullDetail)){
-                throw new UnsupportedOperationException(
-                        "FullDetail must be true when using JsonToStringStyle");
-            }
-
-            super.append(buffer, fieldName, array, fullDetail);
-        }
-
-        @Override
-        public void append(StringBuffer buffer, String fieldName, Object value,
-                           Boolean fullDetail) {
-
-            if (fieldName == null) {
-                throw new UnsupportedOperationException(
-                        "Field names are mandatory when using JsonToStringStyle");
-            }
-            if (!isFullDetail(fullDetail)){
-                throw new UnsupportedOperationException(
-                        "FullDetail must be true when using JsonToStringStyle");
-            }
-
-            super.append(buffer, fieldName, value, fullDetail);
-        }
-
-        @Override
-        protected void appendDetail(StringBuffer buffer, String fieldName, Object value) {
-
-            if (value == null) {
-
-                appendNullText(buffer, fieldName);
-                return;
-            }
-
-            if (value.getClass() == String.class) {
-
-                appendValueAsString(buffer, (String)value);
-                return;
-            }
-
-            buffer.append(value);
-        }
-
-        /**
-         * Appends the given String in parenthesis to the given StringBuffer.
-         * 
-         * @param buffer the StringBuffer to append the value to.
-         * @param value the value to append.
-         */
-        private void appendValueAsString(StringBuffer buffer, String value) {
-            buffer.append("\"" + value + "\"");
-        }
-
-        @Override
-        protected void appendFieldStart(StringBuffer buffer, String fieldName) {
-
-            if (fieldName == null) {
-                throw new UnsupportedOperationException(
-                        "Field names are mandatory when using JsonToStringStyle");
-            }
-
-            super.appendFieldStart(buffer, FIELD_NAME_PREFIX + fieldName
-                    + FIELD_NAME_PREFIX);
-        }
-
-        /**
-         * <p>
-         * Ensure <code>Singleton</code> after serialization.
-         * </p>
-         *
-         * @return the singleton
-         */
-        private Object readResolve() {
-            return ToStringStyle.JSON_STYLE;
-        }
-
-    }
-}
diff --git a/lang/src/main/java/org/apache/commons/lang3/builder/package-info.java b/lang/src/main/java/org/apache/commons/lang3/builder/package-info.java
deleted file mode 100644
index 401fce7..0000000
--- a/lang/src/main/java/org/apache/commons/lang3/builder/package-info.java
+++ /dev/null
@@ -1,34 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-/**
- * <p>Assists in creating consistent {@code equals(Object)}, {@code toString()}, {@code hashCode()}, and {@code compareTo(Object)} methods.
- * These classes are not thread-safe.</p>
- *
- * <p>When you write a {@link java.lang.Object#hashCode() hashCode()}, do you check Bloch's Effective Java? No?
- * You just hack in a quick number?
- * Well {@link org.apache.commons.lang3.builder.HashCodeBuilder} will save your day.
- * It, and its buddies ({@link org.apache.commons.lang3.builder.EqualsBuilder}, {@link org.apache.commons.lang3.builder.CompareToBuilder}, {@link org.apache.commons.lang3.builder.ToStringBuilder}), take care of the nasty bits while you focus on the important bits, like which fields will go into making up the hashcode.</p>
- *
- * @see java.lang.Object#equals(Object)
- * @see java.lang.Object#toString()
- * @see java.lang.Object#hashCode()
- * @see java.lang.Comparable#compareTo(Object)
- *
- * @since 1.0
- * @version $Id$
- */
-package org.apache.commons.lang3.builder;
diff --git a/lang/src/main/java/org/apache/commons/lang3/concurrent/AtomicInitializer.java b/lang/src/main/java/org/apache/commons/lang3/concurrent/AtomicInitializer.java
deleted file mode 100644
index e6219ee..0000000
--- a/lang/src/main/java/org/apache/commons/lang3/concurrent/AtomicInitializer.java
+++ /dev/null
@@ -1,107 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.commons.lang3.concurrent;
-
-import java.util.concurrent.atomic.AtomicReference;
-
-/**
- * <p>
- * A specialized implementation of the {@code ConcurrentInitializer} interface
- * based on an {@link AtomicReference} variable.
- * </p>
- * <p>
- * This class maintains a member field of type {@code AtomicReference}. It
- * implements the following algorithm to create and initialize an object in its
- * {@link #get()} method:
- * </p>
- * <ul>
- * <li>First it is checked whether the {@code AtomicReference} variable contains
- * already a value. If this is the case, the value is directly returned.</li>
- * <li>Otherwise the {@link #initialize()} method is called. This method must be
- * defined in concrete subclasses to actually create the managed object.</li>
- * <li>After the object was created by {@link #initialize()} it is checked
- * whether the {@code AtomicReference} variable is still undefined. This has to
- * be done because in the meantime another thread may have initialized the
- * object. If the reference is still empty, the newly created object is stored
- * in it and returned by this method.</li>
- * <li>Otherwise the value stored in the {@code AtomicReference} is returned.</li>
- * </ul>
- * <p>
- * Because atomic variables are used this class does not need any
- * synchronization. So there is no danger of deadlock, and access to the managed
- * object is efficient. However, if multiple threads access the {@code
- * AtomicInitializer} object before it has been initialized almost at the same
- * time, it can happen that {@link #initialize()} is called multiple times. The
- * algorithm outlined above guarantees that {@link #get()} always returns the
- * same object though.
- * </p>
- * <p>
- * Compared with the {@link LazyInitializer} class, this class can be more
- * efficient because it does not need synchronization. The drawback is that the
- * {@link #initialize()} method can be called multiple times which may be
- * problematic if the creation of the managed object is expensive. As a rule of
- * thumb this initializer implementation is preferable if there are not too many
- * threads involved and the probability that multiple threads access an
- * uninitialized object is small. If there is high parallelism,
- * {@link LazyInitializer} is more appropriate.
- * </p>
- *
- * @since 3.0
- * @version $Id$
- * @param <T> the type of the object managed by this initializer class
- */
-public abstract class AtomicInitializer<T> implements ConcurrentInitializer<T> {
-    /** Holds the reference to the managed object. */
-    private final AtomicReference<T> reference = new AtomicReference<T>();
-
-    /**
-     * Returns the object managed by this initializer. The object is created if
-     * it is not available yet and stored internally. This method always returns
-     * the same object.
-     *
-     * @return the object created by this {@code AtomicInitializer}
-     * @throws ConcurrentException if an error occurred during initialization of
-     * the object
-     */
-    @Override
-    public T get() throws ConcurrentException {
-        T result = reference.get();
-
-        if (result == null) {
-            result = initialize();
-            if (!reference.compareAndSet(null, result)) {
-                // another thread has initialized the reference
-                result = reference.get();
-            }
-        }
-
-        return result;
-    }
-
-    /**
-     * Creates and initializes the object managed by this {@code
-     * AtomicInitializer}. This method is called by {@link #get()} when the
-     * managed object is not available yet. An implementation can focus on the
-     * creation of the object. No synchronization is needed, as this is already
-     * handled by {@code get()}. As stated by the class comment, it is possible
-     * that this method is called multiple times.
-     *
-     * @return the managed data object
-     * @throws ConcurrentException if an error occurs during object creation
-     */
-    protected abstract T initialize() throws ConcurrentException;
-}
diff --git a/lang/src/main/java/org/apache/commons/lang3/concurrent/AtomicSafeInitializer.java b/lang/src/main/java/org/apache/commons/lang3/concurrent/AtomicSafeInitializer.java
deleted file mode 100644
index 5bb5096..0000000
--- a/lang/src/main/java/org/apache/commons/lang3/concurrent/AtomicSafeInitializer.java
+++ /dev/null
@@ -1,97 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.commons.lang3.concurrent;
-
-import java.util.concurrent.atomic.AtomicReference;
-
-/**
- * <p>
- * A specialized {@code ConcurrentInitializer} implementation which is similar
- * to {@link AtomicInitializer}, but ensures that the {@link #initialize()}
- * method is called only once.
- * </p>
- * <p>
- * As {@link AtomicInitializer} this class is based on atomic variables, so it
- * can create an object under concurrent access without synchronization.
- * However, it implements an additional check to guarantee that the
- * {@link #initialize()} method which actually creates the object cannot be
- * called multiple times.
- * </p>
- * <p>
- * Because of this additional check this implementation is slightly less
- * efficient than {@link AtomicInitializer}, but if the object creation in the
- * {@code initialize()} method is expensive or if multiple invocations of
- * {@code initialize()} are problematic, it is the better alternative.
- * </p>
- * <p>
- * From its semantics this class has the same properties as
- * {@link LazyInitializer}. It is a &quot;save&quot; implementation of the lazy
- * initializer pattern. Comparing both classes in terms of efficiency is
- * difficult because which one is faster depends on multiple factors. Because
- * {@code AtomicSafeInitializer} does not use synchronization at all it probably
- * outruns {@link LazyInitializer}, at least under low or moderate concurrent
- * access. Developers should run their own benchmarks on the expected target
- * platform to decide which implementation is suitable for their specific use
- * case.
- * </p>
- *
- * @since 3.0
- * @version $Id$
- * @param <T> the type of the object managed by this initializer class
- */
-public abstract class AtomicSafeInitializer<T> implements
-        ConcurrentInitializer<T> {
-    /** A guard which ensures that initialize() is called only once. */
-    private final AtomicReference<AtomicSafeInitializer<T>> factory =
-            new AtomicReference<AtomicSafeInitializer<T>>();
-
-    /** Holds the reference to the managed object. */
-    private final AtomicReference<T> reference = new AtomicReference<T>();
-
-    /**
-     * Get (and initialize, if not initialized yet) the required object
-     *
-     * @return lazily initialized object
-     * @throws ConcurrentException if the initialization of the object causes an
-     * exception
-     */
-    @Override
-    public final T get() throws ConcurrentException {
-        T result;
-
-        while ((result = reference.get()) == null) {
-            if (factory.compareAndSet(null, this)) {
-                reference.set(initialize());
-            }
-        }
-
-        return result;
-    }
-
-    /**
-     * Creates and initializes the object managed by this
-     * {@code AtomicInitializer}. This method is called by {@link #get()} when
-     * the managed object is not available yet. An implementation can focus on
-     * the creation of the object. No synchronization is needed, as this is
-     * already handled by {@code get()}. This method is guaranteed to be called
-     * only once.
-     *
-     * @return the managed data object
-     * @throws ConcurrentException if an error occurs during object creation
-     */
-    protected abstract T initialize() throws ConcurrentException;
-}
diff --git a/lang/src/main/java/org/apache/commons/lang3/concurrent/BackgroundInitializer.java b/lang/src/main/java/org/apache/commons/lang3/concurrent/BackgroundInitializer.java
deleted file mode 100644
index 7b6043b..0000000
--- a/lang/src/main/java/org/apache/commons/lang3/concurrent/BackgroundInitializer.java
+++ /dev/null
@@ -1,335 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.commons.lang3.concurrent;
-
-import java.util.concurrent.Callable;
-import java.util.concurrent.ExecutionException;
-import java.util.concurrent.ExecutorService;
-import java.util.concurrent.Executors;
-import java.util.concurrent.Future;
-
-/**
- * <p>
- * A class that allows complex initialization operations in a background task.
- * </p>
- * <p>
- * Applications often have to do some expensive initialization steps when they
- * are started, e.g. constructing a connection to a database, reading a
- * configuration file, etc. Doing these things in parallel can enhance
- * performance as the CPU load can be improved. However, when access to the
- * resources initialized in a background thread is actually required,
- * synchronization has to be performed to ensure that their initialization is
- * complete.
- * </p>
- * <p>
- * This abstract base class provides support for this use case. A concrete
- * subclass must implement the {@link #initialize()} method. Here an arbitrary
- * initialization can be implemented, and a result object can be returned. With
- * this method in place the basic usage of this class is as follows (where
- * {@code MyBackgroundInitializer} is a concrete subclass):
- * </p>
- *
- * <pre>
- * MyBackgroundInitializer initializer = new MyBackgroundInitializer();
- * initializer.start();
- * // Now do some other things. Initialization runs in a parallel thread
- * ...
- * // Wait for the end of initialization and access the result object
- * Object result = initializer.get();
- * </pre>
- *
- * <p>
- * After the construction of a {@code BackgroundInitializer} object its
- * {@link #start()} method has to be called. This starts the background
- * processing. The application can now continue to do other things. When it
- * needs access to the object produced by the {@code BackgroundInitializer} it
- * calls its {@link #get()} method. If initialization is already complete,
- * {@link #get()} returns the result object immediately. Otherwise it blocks
- * until the result object is fully constructed.
- * </p>
- * <p>
- * {@code BackgroundInitializer} is a thin wrapper around a {@code Future}
- * object and uses an {@code ExecutorService} for running the background
- * initialization task. It is possible to pass in an {@code ExecutorService} at
- * construction time or set one using {@code setExternalExecutor()} before
- * {@code start()} was called. Then this object is used to spawn the background
- * task. If no {@code ExecutorService} has been provided, {@code
- * BackgroundInitializer} creates a temporary {@code ExecutorService} and
- * destroys it when initialization is complete.
- * </p>
- * <p>
- * The methods provided by {@code BackgroundInitializer} provide for minimal
- * interaction with the wrapped {@code Future} object. It is also possible to
- * obtain the {@code Future} object directly. Then the enhanced functionality
- * offered by {@code Future} can be used, e.g. to check whether the background
- * operation is complete or to cancel the operation.
- * </p>
- *
- * @since 3.0
- * @version $Id$
- * @param <T> the type of the object managed by this initializer class
- */
-public abstract class BackgroundInitializer<T> implements
-        ConcurrentInitializer<T> {
-    /** The external executor service for executing tasks. */
-    private ExecutorService externalExecutor; // @GuardedBy("this")
-
-    /** A reference to the executor service that is actually used. */
-    private ExecutorService executor; // @GuardedBy("this")
-
-    /** Stores the handle to the background task. */
-    private Future<T> future;  // @GuardedBy("this")
-
-    /**
-     * Creates a new instance of {@code BackgroundInitializer}. No external
-     * {@code ExecutorService} is used.
-     */
-    protected BackgroundInitializer() {
-        this(null);
-    }
-
-    /**
-     * Creates a new instance of {@code BackgroundInitializer} and initializes
-     * it with the given {@code ExecutorService}. If the {@code ExecutorService}
-     * is not null, the background task for initializing this object will be
-     * scheduled at this service. Otherwise a new temporary {@code
-     * ExecutorService} is created.
-     *
-     * @param exec an external {@code ExecutorService} to be used for task
-     * execution
-     */
-    protected BackgroundInitializer(final ExecutorService exec) {
-        setExternalExecutor(exec);
-    }
-
-    /**
-     * Returns the external {@code ExecutorService} to be used by this class.
-     *
-     * @return the {@code ExecutorService}
-     */
-    public final synchronized ExecutorService getExternalExecutor() {
-        return externalExecutor;
-    }
-
-    /**
-     * Returns a flag whether this {@code BackgroundInitializer} has already
-     * been started.
-     *
-     * @return a flag whether the {@link #start()} method has already been
-     * called
-     */
-    public synchronized boolean isStarted() {
-        return future != null;
-    }
-
-    /**
-     * Sets an {@code ExecutorService} to be used by this class. The {@code
-     * ExecutorService} passed to this method is used for executing the
-     * background task. Thus it is possible to re-use an already existing
-     * {@code ExecutorService} or to use a specially configured one. If no
-     * {@code ExecutorService} is set, this instance creates a temporary one and
-     * destroys it after background initialization is complete. Note that this
-     * method must be called before {@link #start()}; otherwise an exception is
-     * thrown.
-     *
-     * @param externalExecutor the {@code ExecutorService} to be used
-     * @throws IllegalStateException if this initializer has already been
-     * started
-     */
-    public final synchronized void setExternalExecutor(
-            final ExecutorService externalExecutor) {
-        if (isStarted()) {
-            throw new IllegalStateException(
-                    "Cannot set ExecutorService after start()!");
-        }
-
-        this.externalExecutor = externalExecutor;
-    }
-
-    /**
-     * Starts the background initialization. With this method the initializer
-     * becomes active and invokes the {@link #initialize()} method in a
-     * background task. A {@code BackgroundInitializer} can be started exactly
-     * once. The return value of this method determines whether the start was
-     * successful: only the first invocation of this method returns <b>true</b>,
-     * following invocations will return <b>false</b>.
-     *
-     * @return a flag whether the initializer could be started successfully
-     */
-    public synchronized boolean start() {
-        // Not yet started?
-        if (!isStarted()) {
-
-            // Determine the executor to use and whether a temporary one has to
-            // be created
-            ExecutorService tempExec;
-            executor = getExternalExecutor();
-            if (executor == null) {
-                executor = tempExec = createExecutor();
-            } else {
-                tempExec = null;
-            }
-
-            future = executor.submit(createTask(tempExec));
-
-            return true;
-        }
-
-        return false;
-    }
-
-    /**
-     * Returns the result of the background initialization. This method blocks
-     * until initialization is complete. If the background processing caused a
-     * runtime exception, it is directly thrown by this method. Checked
-     * exceptions, including {@code InterruptedException} are wrapped in a
-     * {@link ConcurrentException}. Calling this method before {@link #start()}
-     * was called causes an {@code IllegalStateException} exception to be
-     * thrown.
-     *
-     * @return the object produced by this initializer
-     * @throws ConcurrentException if a checked exception occurred during
-     * background processing
-     * @throws IllegalStateException if {@link #start()} has not been called
-     */
-    @Override
-    public T get() throws ConcurrentException {
-        try {
-            return getFuture().get();
-        } catch (final ExecutionException execex) {
-            ConcurrentUtils.handleCause(execex);
-            return null; // should not be reached
-        } catch (final InterruptedException iex) {
-            // reset interrupted state
-            Thread.currentThread().interrupt();
-            throw new ConcurrentException(iex);
-        }
-    }
-
-    /**
-     * Returns the {@code Future} object that was created when {@link #start()}
-     * was called. Therefore this method can only be called after {@code
-     * start()}.
-     *
-     * @return the {@code Future} object wrapped by this initializer
-     * @throws IllegalStateException if {@link #start()} has not been called
-     */
-    public synchronized Future<T> getFuture() {
-        if (future == null) {
-            throw new IllegalStateException("start() must be called first!");
-        }
-
-        return future;
-    }
-
-    /**
-     * Returns the {@code ExecutorService} that is actually used for executing
-     * the background task. This method can be called after {@link #start()}
-     * (before {@code start()} it returns <b>null</b>). If an external executor
-     * was set, this is also the active executor. Otherwise this method returns
-     * the temporary executor that was created by this object.
-     *
-     * @return the {@code ExecutorService} for executing the background task
-     */
-    protected synchronized final ExecutorService getActiveExecutor() {
-        return executor;
-    }
-
-    /**
-     * Returns the number of background tasks to be created for this
-     * initializer. This information is evaluated when a temporary {@code
-     * ExecutorService} is created. This base implementation returns 1. Derived
-     * classes that do more complex background processing can override it. This
-     * method is called from a synchronized block by the {@link #start()}
-     * method. Therefore overriding methods should be careful with obtaining
-     * other locks and return as fast as possible.
-     *
-     * @return the number of background tasks required by this initializer
-     */
-    protected int getTaskCount() {
-        return 1;
-    }
-
-    /**
-     * Performs the initialization. This method is called in a background task
-     * when this {@code BackgroundInitializer} is started. It must be
-     * implemented by a concrete subclass. An implementation is free to perform
-     * arbitrary initialization. The object returned by this method can be
-     * queried using the {@link #get()} method.
-     *
-     * @return a result object
-     * @throws Exception if an error occurs
-     */
-    protected abstract T initialize() throws Exception;
-
-    /**
-     * Creates a task for the background initialization. The {@code Callable}
-     * object returned by this method is passed to the {@code ExecutorService}.
-     * This implementation returns a task that invokes the {@link #initialize()}
-     * method. If a temporary {@code ExecutorService} is used, it is destroyed
-     * at the end of the task.
-     *
-     * @param execDestroy the {@code ExecutorService} to be destroyed by the
-     * task
-     * @return a task for the background initialization
-     */
-    private Callable<T> createTask(final ExecutorService execDestroy) {
-        return new InitializationTask(execDestroy);
-    }
-
-    /**
-     * Creates the {@code ExecutorService} to be used. This method is called if
-     * no {@code ExecutorService} was provided at construction time.
-     *
-     * @return the {@code ExecutorService} to be used
-     */
-    private ExecutorService createExecutor() {
-        return Executors.newFixedThreadPool(getTaskCount());
-    }
-
-    private class InitializationTask implements Callable<T> {
-        /** Stores the executor service to be destroyed at the end. */
-        private final ExecutorService execFinally;
-
-        /**
-         * Creates a new instance of {@code InitializationTask} and initializes
-         * it with the {@code ExecutorService} to be destroyed at the end.
-         *
-         * @param exec the {@code ExecutorService}
-         */
-        public InitializationTask(final ExecutorService exec) {
-            execFinally = exec;
-        }
-
-        /**
-         * Initiates initialization and returns the result.
-         *
-         * @return the result object
-         * @throws Exception if an error occurs
-         */
-        @Override
-        public T call() throws Exception {
-            try {
-                return initialize();
-            } finally {
-                if (execFinally != null) {
-                    execFinally.shutdown();
-                }
-            }
-        }
-    }
-}
diff --git a/lang/src/main/java/org/apache/commons/lang3/concurrent/BasicThreadFactory.java b/lang/src/main/java/org/apache/commons/lang3/concurrent/BasicThreadFactory.java
deleted file mode 100644
index 6c61189..0000000
--- a/lang/src/main/java/org/apache/commons/lang3/concurrent/BasicThreadFactory.java
+++ /dev/null
@@ -1,383 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.commons.lang3.concurrent;
-
-import java.util.concurrent.Executors;
-import java.util.concurrent.ThreadFactory;
-import java.util.concurrent.atomic.AtomicLong;
-
-/**
- * <p>
- * An implementation of the {@code ThreadFactory} interface that provides some
- * configuration options for the threads it creates.
- * </p>
- * <p>
- * A {@code ThreadFactory} is used for instance by an {@code ExecutorService} to
- * create the threads it uses for executing tasks. In many cases users do not
- * have to care about a {@code ThreadFactory} because the default one used by an
- * {@code ExecutorService} will do. However, if there are special requirements
- * for the threads, a custom {@code ThreadFactory} has to be created.
- * </p>
- * <p>
- * This class provides some frequently needed configuration options for the
- * threads it creates. These are the following:
- * </p>
- * <ul>
- * <li>A name pattern for the threads created by this factory can be specified.
- * This is often useful if an application uses multiple executor services for
- * different purposes. If the names of the threads used by these services have
- * meaningful names, log output or exception traces can be much easier to read.
- * Naming patterns are <em>format strings</em> as used by the {@code
- * String.format()} method. The string can contain the place holder {@code %d}
- * which will be replaced by the number of the current thread ({@code
- * ThreadFactoryImpl} keeps a counter of the threads it has already created).
- * For instance, the naming pattern {@code "My %d. worker thread"} will result
- * in thread names like {@code "My 1. worker thread"}, {@code
- * "My 2. worker thread"} and so on.</li>
- * <li>A flag whether the threads created by this factory should be daemon
- * threads. This can impact the exit behavior of the current Java application
- * because the JVM shuts down if there are only daemon threads running.</li>
- * <li>The priority of the thread. Here an integer value can be provided. The
- * {@code java.lang.Thread} class defines constants for valid ranges of priority
- * values.</li>
- * <li>The {@code UncaughtExceptionHandler} for the thread. This handler is
- * called if an uncaught exception occurs within the thread.</li>
- * </ul>
- * <p>
- * {@code BasicThreadFactory} wraps another thread factory which actually
- * creates new threads. The configuration options are set on the threads created
- * by the wrapped thread factory. On construction time the factory to be wrapped
- * can be specified. If none is provided, a default {@code ThreadFactory} is
- * used.
- * </p>
- * <p>
- * Instances of {@code BasicThreadFactory} are not created directly, but the
- * nested {@code Builder} class is used for this purpose. Using the builder only
- * the configuration options an application is interested in need to be set. The
- * following example shows how a {@code BasicThreadFactory} is created and
- * installed in an {@code ExecutorService}:
- * </p>
- *
- * <pre>
- * // Create a factory that produces daemon threads with a naming pattern and
- * // a priority
- * BasicThreadFactory factory = new BasicThreadFactory.Builder()
- *     .namingPattern(&quot;workerthread-%d&quot;)
- *     .daemon(true)
- *     .priority(Thread.MAX_PRIORITY)
- *     .build();
- * // Create an executor service for single-threaded execution
- * ExecutorService exec = Executors.newSingleThreadExecutor(factory);
- * </pre>
- *
- * @since 3.0
- * @version $Id$
- */
-public class BasicThreadFactory implements ThreadFactory {
-    /** A counter for the threads created by this factory. */
-    private final AtomicLong threadCounter;
-
-    /** Stores the wrapped factory. */
-    private final ThreadFactory wrappedFactory;
-
-    /** Stores the uncaught exception handler. */
-    private final Thread.UncaughtExceptionHandler uncaughtExceptionHandler;
-
-    /** Stores the naming pattern for newly created threads. */
-    private final String namingPattern;
-
-    /** Stores the priority. */
-    private final Integer priority;
-
-    /** Stores the daemon status flag. */
-    private final Boolean daemonFlag;
-
-    /**
-     * Creates a new instance of {@code ThreadFactoryImpl} and configures it
-     * from the specified {@code Builder} object.
-     *
-     * @param builder the {@code Builder} object
-     */
-    private BasicThreadFactory(final Builder builder) {
-        if (builder.wrappedFactory == null) {
-            wrappedFactory = Executors.defaultThreadFactory();
-        } else {
-            wrappedFactory = builder.wrappedFactory;
-        }
-
-        namingPattern = builder.namingPattern;
-        priority = builder.priority;
-        daemonFlag = builder.daemonFlag;
-        uncaughtExceptionHandler = builder.exceptionHandler;
-
-        threadCounter = new AtomicLong();
-    }
-
-    /**
-     * Returns the wrapped {@code ThreadFactory}. This factory is used for
-     * actually creating threads. This method never returns <b>null</b>. If no
-     * {@code ThreadFactory} was passed when this object was created, a default
-     * thread factory is returned.
-     *
-     * @return the wrapped {@code ThreadFactory}
-     */
-    public final ThreadFactory getWrappedFactory() {
-        return wrappedFactory;
-    }
-
-    /**
-     * Returns the naming pattern for naming newly created threads. Result can
-     * be <b>null</b> if no naming pattern was provided.
-     *
-     * @return the naming pattern
-     */
-    public final String getNamingPattern() {
-        return namingPattern;
-    }
-
-    /**
-     * Returns the daemon flag. This flag determines whether newly created
-     * threads should be daemon threads. If <b>true</b>, this factory object
-     * calls {@code setDaemon(true)} on the newly created threads. Result can be
-     * <b>null</b> if no daemon flag was provided at creation time.
-     *
-     * @return the daemon flag
-     */
-    public final Boolean getDaemonFlag() {
-        return daemonFlag;
-    }
-
-    /**
-     * Returns the priority of the threads created by this factory. Result can
-     * be <b>null</b> if no priority was specified.
-     *
-     * @return the priority for newly created threads
-     */
-    public final Integer getPriority() {
-        return priority;
-    }
-
-    /**
-     * Returns the {@code UncaughtExceptionHandler} for the threads created by
-     * this factory. Result can be <b>null</b> if no handler was provided.
-     *
-     * @return the {@code UncaughtExceptionHandler}
-     */
-    public final Thread.UncaughtExceptionHandler getUncaughtExceptionHandler() {
-        return uncaughtExceptionHandler;
-    }
-
-    /**
-     * Returns the number of threads this factory has already created. This
-     * class maintains an internal counter that is incremented each time the
-     * {@link #newThread(Runnable)} method is invoked.
-     *
-     * @return the number of threads created by this factory
-     */
-    public long getThreadCount() {
-        return threadCounter.get();
-    }
-
-    /**
-     * Creates a new thread. This implementation delegates to the wrapped
-     * factory for creating the thread. Then, on the newly created thread the
-     * corresponding configuration options are set.
-     *
-     * @param r the {@code Runnable} to be executed by the new thread
-     * @return the newly created thread
-     */
-    @Override
-    public Thread newThread(final Runnable r) {
-        final Thread t = getWrappedFactory().newThread(r);
-        initializeThread(t);
-
-        return t;
-    }
-
-    /**
-     * Initializes the specified thread. This method is called by
-     * {@link #newThread(Runnable)} after a new thread has been obtained from
-     * the wrapped thread factory. It initializes the thread according to the
-     * options set for this factory.
-     *
-     * @param t the thread to be initialized
-     */
-    private void initializeThread(final Thread t) {
-
-        if (getNamingPattern() != null) {
-            final Long count = Long.valueOf(threadCounter.incrementAndGet());
-            t.setName(String.format(getNamingPattern(), count));
-        }
-
-        if (getUncaughtExceptionHandler() != null) {
-            t.setUncaughtExceptionHandler(getUncaughtExceptionHandler());
-        }
-
-        if (getPriority() != null) {
-            t.setPriority(getPriority().intValue());
-        }
-
-        if (getDaemonFlag() != null) {
-            t.setDaemon(getDaemonFlag().booleanValue());
-        }
-    }
-
-    /**
-     * <p>
-     * A <em>builder</em> class for creating instances of {@code
-     * BasicThreadFactory}.
-     * </p>
-     * <p>
-     * Using this builder class instances of {@code BasicThreadFactory} can be
-     * created and initialized. The class provides methods that correspond to
-     * the configuration options supported by {@code BasicThreadFactory}. Method
-     * chaining is supported. Refer to the documentation of {@code
-     * BasicThreadFactory} for a usage example.
-     * </p>
-     *
-     * @version $Id$
-     */
-    public static class Builder 
-        implements org.apache.commons.lang3.builder.Builder<BasicThreadFactory> {
-        
-        /** The wrapped factory. */
-        private ThreadFactory wrappedFactory;
-
-        /** The uncaught exception handler. */
-        private Thread.UncaughtExceptionHandler exceptionHandler;
-
-        /** The naming pattern. */
-        private String namingPattern;
-
-        /** The priority. */
-        private Integer priority;
-
-        /** The daemon flag. */
-        private Boolean daemonFlag;
-
-        /**
-         * Sets the {@code ThreadFactory} to be wrapped by the new {@code
-         * BasicThreadFactory}.
-         *
-         * @param factory the wrapped {@code ThreadFactory} (must not be
-         * <b>null</b>)
-         * @return a reference to this {@code Builder}
-         * @throws NullPointerException if the passed in {@code ThreadFactory}
-         * is <b>null</b>
-         */
-        public Builder wrappedFactory(final ThreadFactory factory) {
-            if (factory == null) {
-                throw new NullPointerException(
-                        "Wrapped ThreadFactory must not be null!");
-            }
-
-            wrappedFactory = factory;
-            return this;
-        }
-
-        /**
-         * Sets the naming pattern to be used by the new {@code
-         * BasicThreadFactory}.
-         *
-         * @param pattern the naming pattern (must not be <b>null</b>)
-         * @return a reference to this {@code Builder}
-         * @throws NullPointerException if the naming pattern is <b>null</b>
-         */
-        public Builder namingPattern(final String pattern) {
-            if (pattern == null) {
-                throw new NullPointerException(
-                        "Naming pattern must not be null!");
-            }
-
-            namingPattern = pattern;
-            return this;
-        }
-
-        /**
-         * Sets the daemon flag for the new {@code BasicThreadFactory}. If this
-         * flag is set to <b>true</b> the new thread factory will create daemon
-         * threads.
-         *
-         * @param f the value of the daemon flag
-         * @return a reference to this {@code Builder}
-         */
-        public Builder daemon(final boolean f) {
-            daemonFlag = Boolean.valueOf(f);
-            return this;
-        }
-
-        /**
-         * Sets the priority for the threads created by the new {@code
-         * BasicThreadFactory}.
-         *
-         * @param prio the priority
-         * @return a reference to this {@code Builder}
-         */
-        public Builder priority(final int prio) {
-            priority = Integer.valueOf(prio);
-            return this;
-        }
-
-        /**
-         * Sets the uncaught exception handler for the threads created by the
-         * new {@code BasicThreadFactory}.
-         *
-         * @param handler the {@code UncaughtExceptionHandler} (must not be
-         * <b>null</b>)
-         * @return a reference to this {@code Builder}
-         * @throws NullPointerException if the exception handler is <b>null</b>
-         */
-        public Builder uncaughtExceptionHandler(
-                final Thread.UncaughtExceptionHandler handler) {
-            if (handler == null) {
-                throw new NullPointerException(
-                        "Uncaught exception handler must not be null!");
-            }
-
-            exceptionHandler = handler;
-            return this;
-        }
-
-        /**
-         * Resets this builder. All configuration options are set to default
-         * values. Note: If the {@link #build()} method was called, it is not
-         * necessary to call {@code reset()} explicitly because this is done
-         * automatically.
-         */
-        public void reset() {
-            wrappedFactory = null;
-            exceptionHandler = null;
-            namingPattern = null;
-            priority = null;
-            daemonFlag = null;
-        }
-
-        /**
-         * Creates a new {@code BasicThreadFactory} with all configuration
-         * options that have been specified by calling methods on this builder.
-         * After creating the factory {@link #reset()} is called.
-         *
-         * @return the new {@code BasicThreadFactory}
-         */
-        @Override
-        public BasicThreadFactory build() {
-            final BasicThreadFactory factory = new BasicThreadFactory(this);
-            reset();
-            return factory;
-        }
-    }
-}
diff --git a/lang/src/main/java/org/apache/commons/lang3/concurrent/CallableBackgroundInitializer.java b/lang/src/main/java/org/apache/commons/lang3/concurrent/CallableBackgroundInitializer.java
deleted file mode 100644
index b95bf2a..0000000
--- a/lang/src/main/java/org/apache/commons/lang3/concurrent/CallableBackgroundInitializer.java
+++ /dev/null
@@ -1,126 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.commons.lang3.concurrent;
-
-import java.util.concurrent.Callable;
-import java.util.concurrent.ExecutorService;
-
-/**
- * <p>
- * A specialized {@link BackgroundInitializer} implementation that wraps a
- * {@code Callable} object.
- * </p>
- * <p>
- * An instance of this class is initialized with a {@code Callable} object when
- * it is constructed. The implementation of the {@link #initialize()} method
- * defined in the super class delegates to this {@code Callable} so that the
- * {@code Callable} is executed in the background thread.
- * </p>
- * <p>
- * The {@code java.util.concurrent.Callable} interface is a standard mechanism
- * of the JDK to define tasks to be executed by another thread. The {@code
- * CallableBackgroundInitializer} class allows combining this standard interface
- * with the background initializer API.
- * </p>
- * <p>
- * Usage of this class is very similar to the default usage pattern of the
- * {@link BackgroundInitializer} class: Just create an instance and provide the
- * {@code Callable} object to be executed, then call the initializer's
- * {@link #start()} method. This causes the {@code Callable} to be executed in
- * another thread. When the results of the {@code Callable} are needed the
- * initializer's {@link #get()} method can be called (which may block until
- * background execution is complete). The following code fragment shows a
- * typical usage example:
- * </p>
- *
- * <pre>
- * // a Callable that performs a complex computation
- * Callable&lt;Integer&gt; computationCallable = new MyComputationCallable();
- * // setup the background initializer
- * CallableBackgroundInitializer&lt;Integer&gt; initializer =
- *     new CallableBackgroundInitializer(computationCallable);
- * initializer.start();
- * // Now do some other things. Initialization runs in a parallel thread
- * ...
- * // Wait for the end of initialization and access the result
- * Integer result = initializer.get();
- * </pre>
- *
- *
- * @since 3.0
- * @version $Id$
- * @param <T> the type of the object managed by this initializer class
- */
-public class CallableBackgroundInitializer<T> extends BackgroundInitializer<T> {
-    /** The Callable to be executed. */
-    private final Callable<T> callable;
-
-    /**
-     * Creates a new instance of {@code CallableBackgroundInitializer} and sets
-     * the {@code Callable} to be executed in a background thread.
-     *
-     * @param call the {@code Callable} (must not be <b>null</b>)
-     * @throws IllegalArgumentException if the {@code Callable} is <b>null</b>
-     */
-    public CallableBackgroundInitializer(final Callable<T> call) {
-        checkCallable(call);
-        callable = call;
-    }
-
-    /**
-     * Creates a new instance of {@code CallableBackgroundInitializer} and
-     * initializes it with the {@code Callable} to be executed in a background
-     * thread and the {@code ExecutorService} for managing the background
-     * execution.
-     *
-     * @param call the {@code Callable} (must not be <b>null</b>)
-     * @param exec an external {@code ExecutorService} to be used for task
-     * execution
-     * @throws IllegalArgumentException if the {@code Callable} is <b>null</b>
-     */
-    public CallableBackgroundInitializer(final Callable<T> call, final ExecutorService exec) {
-        super(exec);
-        checkCallable(call);
-        callable = call;
-    }
-
-    /**
-     * Performs initialization in a background thread. This implementation
-     * delegates to the {@code Callable} passed at construction time of this
-     * object.
-     *
-     * @return the result of the initialization
-     * @throws Exception if an error occurs
-     */
-    @Override
-    protected T initialize() throws Exception {
-        return callable.call();
-    }
-
-    /**
-     * Tests the passed in {@code Callable} and throws an exception if it is
-     * undefined.
-     *
-     * @param call the object to check
-     * @throws IllegalArgumentException if the {@code Callable} is <b>null</b>
-     */
-    private void checkCallable(final Callable<T> call) {
-        if (call == null) {
-            throw new IllegalArgumentException("Callable must not be null!");
-        }
-    }
-}
diff --git a/lang/src/main/java/org/apache/commons/lang3/concurrent/ConcurrentException.java b/lang/src/main/java/org/apache/commons/lang3/concurrent/ConcurrentException.java
deleted file mode 100644
index 8d6fb54..0000000
--- a/lang/src/main/java/org/apache/commons/lang3/concurrent/ConcurrentException.java
+++ /dev/null
@@ -1,70 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.commons.lang3.concurrent;
-
-/**
- * <p>
- * An exception class used for reporting error conditions related to accessing
- * data of background tasks.
- * </p>
- * <p>
- * The purpose of this exception class is analogous to the default JDK exception
- * class {@link java.util.concurrent.ExecutionException}, i.e. it wraps an
- * exception that occurred during the execution of a task. However, in contrast
- * to {@code ExecutionException}, it wraps only checked exceptions. Runtime
- * exceptions are thrown directly.
- * </p>
- *
- * @since 3.0
- * @version $Id$
- */
-public class ConcurrentException extends Exception {
-    /**
-     * The serial version UID.
-     */
-    private static final long serialVersionUID = 6622707671812226130L;
-
-    /**
-     * Creates a new, uninitialized instance of {@code ConcurrentException}.
-     */
-    protected ConcurrentException() {
-        super();
-    }
-
-    /**
-     * Creates a new instance of {@code ConcurrentException} and initializes it
-     * with the given cause.
-     *
-     * @param cause the cause of this exception
-     * @throws IllegalArgumentException if the cause is not a checked exception
-     */
-    public ConcurrentException(final Throwable cause) {
-        super(ConcurrentUtils.checkedException(cause));
-    }
-
-    /**
-     * Creates a new instance of {@code ConcurrentException} and initializes it
-     * with the given message and cause.
-     *
-     * @param msg the error message
-     * @param cause the cause of this exception
-     * @throws IllegalArgumentException if the cause is not a checked exception
-     */
-    public ConcurrentException(final String msg, final Throwable cause) {
-        super(msg, ConcurrentUtils.checkedException(cause));
-    }
-}
diff --git a/lang/src/main/java/org/apache/commons/lang3/concurrent/ConcurrentInitializer.java b/lang/src/main/java/org/apache/commons/lang3/concurrent/ConcurrentInitializer.java
deleted file mode 100644
index 7d5974d..0000000
--- a/lang/src/main/java/org/apache/commons/lang3/concurrent/ConcurrentInitializer.java
+++ /dev/null
@@ -1,54 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.commons.lang3.concurrent;
-
-/**
- * <p>
- * Definition of an interface for the thread-safe initialization of objects.
- * </p>
- * <p>
- * The idea behind this interface is to provide access to an object in a
- * thread-safe manner. A {@code ConcurrentInitializer} can be passed to multiple
- * threads which can all access the object produced by the initializer. Through
- * the {@link #get()} method the object can be queried.
- * </p>
- * <p>
- * Concrete implementations of this interface will use different strategies for
- * the creation of the managed object, e.g. lazy initialization or
- * initialization in a background thread. This is completely transparent to
- * client code, so it is possible to change the initialization strategy without
- * affecting clients.
- * </p>
- *
- * @since 3.0
- * @version $Id$
- * @param <T> the type of the object managed by this initializer class
- */
-public interface ConcurrentInitializer<T> {
-    /**
-     * Returns the fully initialized object produced by this {@code
-     * ConcurrentInitializer}. A concrete implementation here returns the
-     * results of the initialization process. This method may block until
-     * results are available. Typically, once created the result object is
-     * always the same.
-     *
-     * @return the object created by this {@code ConcurrentException}
-     * @throws ConcurrentException if an error occurred during initialization of
-     * the object
-     */
-    T get() throws ConcurrentException;
-}
diff --git a/lang/src/main/java/org/apache/commons/lang3/concurrent/ConcurrentRuntimeException.java b/lang/src/main/java/org/apache/commons/lang3/concurrent/ConcurrentRuntimeException.java
deleted file mode 100644
index f329f8f..0000000
--- a/lang/src/main/java/org/apache/commons/lang3/concurrent/ConcurrentRuntimeException.java
+++ /dev/null
@@ -1,72 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.commons.lang3.concurrent;
-
-/**
- * <p>
- * An exception class used for reporting runtime error conditions related to
- * accessing data of background tasks.
- * </p>
- * <p>
- * This class is an analogon of the {@link ConcurrentException} exception class.
- * However, it is a runtime exception and thus does not need explicit catch
- * clauses. Some methods of {@link ConcurrentUtils} throw {@code
- * ConcurrentRuntimeException} exceptions rather than
- * {@link ConcurrentException} exceptions. They can be used by client code that
- * does not want to be bothered with checked exceptions.
- * </p>
- *
- * @since 3.0
- * @version $Id$
- */
-public class ConcurrentRuntimeException extends RuntimeException {
-    /**
-     * The serial version UID.
-     */
-    private static final long serialVersionUID = -6582182735562919670L;
-
-    /**
-     * Creates a new, uninitialized instance of {@code
-     * ConcurrentRuntimeException}.
-     */
-    protected ConcurrentRuntimeException() {
-        super();
-    }
-
-    /**
-     * Creates a new instance of {@code ConcurrentRuntimeException} and
-     * initializes it with the given cause.
-     *
-     * @param cause the cause of this exception
-     * @throws IllegalArgumentException if the cause is not a checked exception
-     */
-    public ConcurrentRuntimeException(final Throwable cause) {
-        super(ConcurrentUtils.checkedException(cause));
-    }
-
-    /**
-     * Creates a new instance of {@code ConcurrentRuntimeException} and
-     * initializes it with the given message and cause.
-     *
-     * @param msg the error message
-     * @param cause the cause of this exception
-     * @throws IllegalArgumentException if the cause is not a checked exception
-     */
-    public ConcurrentRuntimeException(final String msg, final Throwable cause) {
-        super(msg, ConcurrentUtils.checkedException(cause));
-    }
-}
diff --git a/lang/src/main/java/org/apache/commons/lang3/concurrent/ConcurrentUtils.java b/lang/src/main/java/org/apache/commons/lang3/concurrent/ConcurrentUtils.java
deleted file mode 100644
index 8a98893..0000000
--- a/lang/src/main/java/org/apache/commons/lang3/concurrent/ConcurrentUtils.java
+++ /dev/null
@@ -1,393 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.commons.lang3.concurrent;
-
-import java.util.concurrent.ConcurrentMap;
-import java.util.concurrent.ExecutionException;
-import java.util.concurrent.Future;
-import java.util.concurrent.TimeUnit;
-
-import org.apache.commons.lang3.Validate;
-
-/**
- * <p>
- * An utility class providing functionality related to the {@code
- * java.util.concurrent} package.
- * </p>
- *
- * @since 3.0
- * @version $Id$
- */
-public class ConcurrentUtils {
-
-    /**
-     * Private constructor so that no instances can be created. This class
-     * contains only static utility methods.
-     */
-    private ConcurrentUtils() {
-    }
-
-    /**
-     * Inspects the cause of the specified {@code ExecutionException} and
-     * creates a {@code ConcurrentException} with the checked cause if
-     * necessary. This method performs the following checks on the cause of the
-     * passed in exception:
-     * <ul>
-     * <li>If the passed in exception is <b>null</b> or the cause is
-     * <b>null</b>, this method returns <b>null</b>.</li>
-     * <li>If the cause is a runtime exception, it is directly thrown.</li>
-     * <li>If the cause is an error, it is directly thrown, too.</li>
-     * <li>In any other case the cause is a checked exception. The method then
-     * creates a {@link ConcurrentException}, initializes it with the cause, and
-     * returns it.</li>
-     * </ul>
-     *
-     * @param ex the exception to be processed
-     * @return a {@code ConcurrentException} with the checked cause
-     */
-    public static ConcurrentException extractCause(final ExecutionException ex) {
-        if (ex == null || ex.getCause() == null) {
-            return null;
-        }
-
-        throwCause(ex);
-        return new ConcurrentException(ex.getMessage(), ex.getCause());
-    }
-
-    /**
-     * Inspects the cause of the specified {@code ExecutionException} and
-     * creates a {@code ConcurrentRuntimeException} with the checked cause if
-     * necessary. This method works exactly like
-     * {@link #extractCause(ExecutionException)}. The only difference is that
-     * the cause of the specified {@code ExecutionException} is extracted as a
-     * runtime exception. This is an alternative for client code that does not
-     * want to deal with checked exceptions.
-     *
-     * @param ex the exception to be processed
-     * @return a {@code ConcurrentRuntimeException} with the checked cause
-     */
-    public static ConcurrentRuntimeException extractCauseUnchecked(
-            final ExecutionException ex) {
-        if (ex == null || ex.getCause() == null) {
-            return null;
-        }
-
-        throwCause(ex);
-        return new ConcurrentRuntimeException(ex.getMessage(), ex.getCause());
-    }
-
-    /**
-     * Handles the specified {@code ExecutionException}. This method calls
-     * {@link #extractCause(ExecutionException)} for obtaining the cause of the
-     * exception - which might already cause an unchecked exception or an error
-     * being thrown. If the cause is a checked exception however, it is wrapped
-     * in a {@code ConcurrentException}, which is thrown. If the passed in
-     * exception is <b>null</b> or has no cause, the method simply returns
-     * without throwing an exception.
-     *
-     * @param ex the exception to be handled
-     * @throws ConcurrentException if the cause of the {@code
-     * ExecutionException} is a checked exception
-     */
-    public static void handleCause(final ExecutionException ex)
-            throws ConcurrentException {
-        final ConcurrentException cex = extractCause(ex);
-
-        if (cex != null) {
-            throw cex;
-        }
-    }
-
-    /**
-     * Handles the specified {@code ExecutionException} and transforms it into a
-     * runtime exception. This method works exactly like
-     * {@link #handleCause(ExecutionException)}, but instead of a
-     * {@link ConcurrentException} it throws a
-     * {@link ConcurrentRuntimeException}. This is an alternative for client
-     * code that does not want to deal with checked exceptions.
-     *
-     * @param ex the exception to be handled
-     * @throws ConcurrentRuntimeException if the cause of the {@code
-     * ExecutionException} is a checked exception; this exception is then
-     * wrapped in the thrown runtime exception
-     */
-    public static void handleCauseUnchecked(final ExecutionException ex) {
-        final ConcurrentRuntimeException crex = extractCauseUnchecked(ex);
-
-        if (crex != null) {
-            throw crex;
-        }
-    }
-
-    /**
-     * Tests whether the specified {@code Throwable} is a checked exception. If
-     * not, an exception is thrown.
-     *
-     * @param ex the {@code Throwable} to check
-     * @return a flag whether the passed in exception is a checked exception
-     * @throws IllegalArgumentException if the {@code Throwable} is not a
-     * checked exception
-     */
-    static Throwable checkedException(final Throwable ex) {
-        Validate.isTrue(ex != null && !(ex instanceof RuntimeException)
-                && !(ex instanceof Error), "Not a checked exception: " + ex);
-        
-        return ex;
-    }
-
-    /**
-     * Tests whether the cause of the specified {@code ExecutionException}
-     * should be thrown and does it if necessary.
-     *
-     * @param ex the exception in question
-     */
-    private static void throwCause(final ExecutionException ex) {
-        if (ex.getCause() instanceof RuntimeException) {
-            throw (RuntimeException) ex.getCause();
-        }
-
-        if (ex.getCause() instanceof Error) {
-            throw (Error) ex.getCause();
-        }
-    }
-
-    //-----------------------------------------------------------------------
-    /**
-     * Invokes the specified {@code ConcurrentInitializer} and returns the
-     * object produced by the initializer. This method just invokes the {@code
-     * get()} method of the given {@code ConcurrentInitializer}. It is
-     * <b>null</b>-safe: if the argument is <b>null</b>, result is also
-     * <b>null</b>.
-     *
-     * @param <T> the type of the object produced by the initializer
-     * @param initializer the {@code ConcurrentInitializer} to be invoked
-     * @return the object managed by the {@code ConcurrentInitializer}
-     * @throws ConcurrentException if the {@code ConcurrentInitializer} throws
-     * an exception
-     */
-    public static <T> T initialize(final ConcurrentInitializer<T> initializer)
-            throws ConcurrentException {
-        return initializer != null ? initializer.get() : null;
-    }
-
-    /**
-     * Invokes the specified {@code ConcurrentInitializer} and transforms
-     * occurring exceptions to runtime exceptions. This method works like
-     * {@link #initialize(ConcurrentInitializer)}, but if the {@code
-     * ConcurrentInitializer} throws a {@link ConcurrentException}, it is
-     * caught, and the cause is wrapped in a {@link ConcurrentRuntimeException}.
-     * So client code does not have to deal with checked exceptions.
-     *
-     * @param <T> the type of the object produced by the initializer
-     * @param initializer the {@code ConcurrentInitializer} to be invoked
-     * @return the object managed by the {@code ConcurrentInitializer}
-     * @throws ConcurrentRuntimeException if the initializer throws an exception
-     */
-    public static <T> T initializeUnchecked(final ConcurrentInitializer<T> initializer) {
-        try {
-            return initialize(initializer);
-        } catch (final ConcurrentException cex) {
-            throw new ConcurrentRuntimeException(cex.getCause());
-        }
-    }
-
-    //-----------------------------------------------------------------------
-    /**
-     * <p>
-     * Puts a value in the specified {@code ConcurrentMap} if the key is not yet
-     * present. This method works similar to the {@code putIfAbsent()} method of
-     * the {@code ConcurrentMap} interface, but the value returned is different.
-     * Basically, this method is equivalent to the following code fragment:
-     * </p>
-     *
-     * <pre>
-     * if (!map.containsKey(key)) {
-     *     map.put(key, value);
-     *     return value;
-     * } else {
-     *     return map.get(key);
-     * }
-     * </pre>
-     *
-     * <p>
-     * except that the action is performed atomically. So this method always
-     * returns the value which is stored in the map.
-     * </p>
-     * <p>
-     * This method is <b>null</b>-safe: It accepts a <b>null</b> map as input
-     * without throwing an exception. In this case the return value is
-     * <b>null</b>, too.
-     * </p>
-     *
-     * @param <K> the type of the keys of the map
-     * @param <V> the type of the values of the map
-     * @param map the map to be modified
-     * @param key the key of the value to be added
-     * @param value the value to be added
-     * @return the value stored in the map after this operation
-     */
-    public static <K, V> V putIfAbsent(final ConcurrentMap<K, V> map, final K key, final V value) {
-        if (map == null) {
-            return null;
-        }
-
-        final V result = map.putIfAbsent(key, value);
-        return result != null ? result : value;
-    }
-
-    /**
-     * Checks if a concurrent map contains a key and creates a corresponding
-     * value if not. This method first checks the presence of the key in the
-     * given map. If it is already contained, its value is returned. Otherwise
-     * the {@code get()} method of the passed in {@link ConcurrentInitializer}
-     * is called. With the resulting object
-     * {@link #putIfAbsent(ConcurrentMap, Object, Object)} is called. This
-     * handles the case that in the meantime another thread has added the key to
-     * the map. Both the map and the initializer can be <b>null</b>; in this
-     * case this method simply returns <b>null</b>.
-     *
-     * @param <K> the type of the keys of the map
-     * @param <V> the type of the values of the map
-     * @param map the map to be modified
-     * @param key the key of the value to be added
-     * @param init the {@link ConcurrentInitializer} for creating the value
-     * @return the value stored in the map after this operation; this may or may
-     * not be the object created by the {@link ConcurrentInitializer}
-     * @throws ConcurrentException if the initializer throws an exception
-     */
-    public static <K, V> V createIfAbsent(final ConcurrentMap<K, V> map, final K key,
-            final ConcurrentInitializer<V> init) throws ConcurrentException {
-        if (map == null || init == null) {
-            return null;
-        }
-
-        final V value = map.get(key);
-        if (value == null) {
-            return putIfAbsent(map, key, init.get());
-        }
-        return value;
-    }
-
-    /**
-     * Checks if a concurrent map contains a key and creates a corresponding
-     * value if not, suppressing checked exceptions. This method calls
-     * {@code createIfAbsent()}. If a {@link ConcurrentException} is thrown, it
-     * is caught and re-thrown as a {@link ConcurrentRuntimeException}.
-     *
-     * @param <K> the type of the keys of the map
-     * @param <V> the type of the values of the map
-     * @param map the map to be modified
-     * @param key the key of the value to be added
-     * @param init the {@link ConcurrentInitializer} for creating the value
-     * @return the value stored in the map after this operation; this may or may
-     * not be the object created by the {@link ConcurrentInitializer}
-     * @throws ConcurrentRuntimeException if the initializer throws an exception
-     */
-    public static <K, V> V createIfAbsentUnchecked(final ConcurrentMap<K, V> map,
-            final K key, final ConcurrentInitializer<V> init) {
-        try {
-            return createIfAbsent(map, key, init);
-        } catch (final ConcurrentException cex) {
-            throw new ConcurrentRuntimeException(cex.getCause());
-        }
-    }
-
-    //-----------------------------------------------------------------------
-    /**
-     * <p>
-     * Gets an implementation of <code>Future</code> that is immediately done
-     * and returns the specified constant value.
-     * </p>
-     * <p>
-     * This can be useful to return a simple constant immediately from the
-     * concurrent processing, perhaps as part of avoiding nulls.
-     * A constant future can also be useful in testing.
-     * </p>
-     *
-     * @param <T> the type of the value used by this {@code Future} object
-     * @param value  the constant value to return, may be null
-     * @return an instance of Future that will return the value, never null
-     */
-    public static <T> Future<T> constantFuture(final T value) {
-        return new ConstantFuture<T>(value);
-    }
-
-    /**
-     * A specialized {@code Future} implementation which wraps a constant value.
-     * @param <T> the type of the value wrapped by this class
-     */
-    static final class ConstantFuture<T> implements Future<T> {
-        /** The constant value. */
-        private final T value;
-
-        /**
-         * Creates a new instance of {@code ConstantFuture} and initializes it
-         * with the constant value.
-         *
-         * @param value the value (may be <b>null</b>)
-         */
-        ConstantFuture(final T value) {
-            this.value = value;
-        }
-
-        /**
-         * {@inheritDoc} This implementation always returns <b>true</b> because
-         * the constant object managed by this {@code Future} implementation is
-         * always available.
-         */
-        @Override
-        public boolean isDone() {
-            return true;
-        }
-
-        /**
-         * {@inheritDoc} This implementation just returns the constant value.
-         */
-        @Override
-        public T get() {
-            return value;
-        }
-
-        /**
-         * {@inheritDoc} This implementation just returns the constant value; it
-         * does not block, therefore the timeout has no meaning.
-         */
-        @Override
-        public T get(final long timeout, final TimeUnit unit) {
-            return value;
-        }
-
-        /**
-         * {@inheritDoc} This implementation always returns <b>false</b>; there
-         * is no background process which could be cancelled.
-         */
-        @Override
-        public boolean isCancelled() {
-            return false;
-        }
-
-        /**
-         * {@inheritDoc} The cancel operation is not supported. This
-         * implementation always returns <b>false</b>.
-         */
-        @Override
-        public boolean cancel(final boolean mayInterruptIfRunning) {
-            return false;
-        }
-    }
-
-}
diff --git a/lang/src/main/java/org/apache/commons/lang3/concurrent/ConstantInitializer.java b/lang/src/main/java/org/apache/commons/lang3/concurrent/ConstantInitializer.java
deleted file mode 100644
index 0d15711..0000000
--- a/lang/src/main/java/org/apache/commons/lang3/concurrent/ConstantInitializer.java
+++ /dev/null
@@ -1,130 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.commons.lang3.concurrent;
-
-import org.apache.commons.lang3.ObjectUtils;
-
-/**
- * <p>
- * A very simple implementation of the {@link ConcurrentInitializer} interface
- * which always returns the same object.
- * </p>
- * <p>
- * An instance of this class is passed a reference to an object when it is
- * constructed. The {@link #get()} method just returns this object. No
- * synchronization is required.
- * </p>
- * <p>
- * This class is useful for instance for unit testing or in cases where a
- * specific object has to be passed to an object which expects a
- * {@link ConcurrentInitializer}.
- * </p>
- *
- * @since 3.0
- * @version $Id$
- * @param <T> the type of the object managed by this initializer
- */
-public class ConstantInitializer<T> implements ConcurrentInitializer<T> {
-    /** Constant for the format of the string representation. */
-    private static final String FMT_TO_STRING = "ConstantInitializer@%d [ object = %s ]";
-
-    /** Stores the managed object. */
-    private final T object;
-
-    /**
-     * Creates a new instance of {@code ConstantInitializer} and initializes it
-     * with the object to be managed. The {@code get()} method will always
-     * return the object passed here. This class does not place any restrictions
-     * on the object. It may be <b>null</b>, then {@code get()} will return
-     * <b>null</b>, too.
-     *
-     * @param obj the object to be managed by this initializer
-     */
-    public ConstantInitializer(final T obj) {
-        object = obj;
-    }
-
-    /**
-     * Directly returns the object that was passed to the constructor. This is
-     * the same object as returned by {@code get()}. However, this method does
-     * not declare that it throws an exception.
-     *
-     * @return the object managed by this initializer
-     */
-    public final T getObject() {
-        return object;
-    }
-
-    /**
-     * Returns the object managed by this initializer. This implementation just
-     * returns the object passed to the constructor.
-     *
-     * @return the object managed by this initializer
-     * @throws ConcurrentException if an error occurs
-     */
-    @Override
-    public T get() throws ConcurrentException {
-        return getObject();
-    }
-
-    /**
-     * Returns a hash code for this object. This implementation returns the hash
-     * code of the managed object.
-     *
-     * @return a hash code for this object
-     */
-    @Override
-    public int hashCode() {
-        return getObject() != null ? getObject().hashCode() : 0;
-    }
-
-    /**
-     * Compares this object with another one. This implementation returns
-     * <b>true</b> if and only if the passed in object is an instance of
-     * {@code ConstantInitializer} which refers to an object equals to the
-     * object managed by this instance.
-     *
-     * @param obj the object to compare to
-     * @return a flag whether the objects are equal
-     */
-    @SuppressWarnings( "deprecation" ) // ObjectUtils.equals(Object, Object) has been deprecated in 3.2
-    @Override
-    public boolean equals(final Object obj) {
-        if (this == obj) {
-            return true;
-        }
-        if (!(obj instanceof ConstantInitializer<?>)) {
-            return false;
-        }
-
-        final ConstantInitializer<?> c = (ConstantInitializer<?>) obj;
-        return ObjectUtils.equals(getObject(), c.getObject());
-    }
-
-    /**
-     * Returns a string representation for this object. This string also
-     * contains a string representation of the object managed by this
-     * initializer.
-     *
-     * @return a string for this object
-     */
-    @Override
-    public String toString() {
-        return String.format(FMT_TO_STRING, Integer.valueOf(System.identityHashCode(this)),
-                String.valueOf(getObject()));
-    }
-}
diff --git a/lang/src/main/java/org/apache/commons/lang3/concurrent/LazyInitializer.java b/lang/src/main/java/org/apache/commons/lang3/concurrent/LazyInitializer.java
deleted file mode 100644
index a13e6de..0000000
--- a/lang/src/main/java/org/apache/commons/lang3/concurrent/LazyInitializer.java
+++ /dev/null
@@ -1,122 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.commons.lang3.concurrent;
-
-/**
- * <p>
- * This class provides a generic implementation of the lazy initialization
- * pattern.
- * </p>
- * <p>
- * Sometimes an application has to deal with an object only under certain
- * circumstances, e.g. when the user selects a specific menu item or if a
- * special event is received. If the creation of the object is costly or the
- * consumption of memory or other system resources is significant, it may make
- * sense to defer the creation of this object until it is really needed. This is
- * a use case for the lazy initialization pattern.
- * </p>
- * <p>
- * This abstract base class provides an implementation of the double-check idiom
- * for an instance field as discussed in Joshua Bloch's "Effective Java", 2nd
- * edition, item 71. The class already implements all necessary synchronization.
- * A concrete subclass has to implement the {@code initialize()} method, which
- * actually creates the wrapped data object.
- * </p>
- * <p>
- * As an usage example consider that we have a class {@code ComplexObject} whose
- * instantiation is a complex operation. In order to apply lazy initialization
- * to this class, a subclass of {@code LazyInitializer} has to be created:
- * </p>
- *
- * <pre>
- * public class ComplexObjectInitializer extends LazyInitializer&lt;ComplexObject&gt; {
- *     &#064;Override
- *     protected ComplexObject initialize() {
- *         return new ComplexObject();
- *     }
- * }
- * </pre>
- *
- * <p>
- * Access to the data object is provided through the {@code get()} method. So,
- * code that wants to obtain the {@code ComplexObject} instance would simply
- * look like this:
- * </p>
- *
- * <pre>
- * // Create an instance of the lazy initializer
- * ComplexObjectInitializer initializer = new ComplexObjectInitializer();
- * ...
- * // When the object is actually needed:
- * ComplexObject cobj = initializer.get();
- * </pre>
- *
- * <p>
- * If multiple threads call the {@code get()} method when the object has not yet
- * been created, they are blocked until initialization completes. The algorithm
- * guarantees that only a single instance of the wrapped object class is
- * created, which is passed to all callers. Once initialized, calls to the
- * {@code get()} method are pretty fast because no synchronization is needed
- * (only an access to a <b>volatile</b> member field).
- * </p>
- *
- * @since 3.0
- * @version $Id$
- * @param <T> the type of the object managed by this initializer class
- */
-public abstract class LazyInitializer<T> implements ConcurrentInitializer<T> {
-    /** Stores the managed object. */
-    private volatile T object;
-
-    /**
-     * Returns the object wrapped by this instance. On first access the object
-     * is created. After that it is cached and can be accessed pretty fast.
-     *
-     * @return the object initialized by this {@code LazyInitializer}
-     * @throws ConcurrentException if an error occurred during initialization of
-     * the object
-     */
-    @Override
-    public T get() throws ConcurrentException {
-        // use a temporary variable to reduce the number of reads of the
-        // volatile field
-        T result = object;
-
-        if (result == null) {
-            synchronized (this) {
-                result = object;
-                if (result == null) {
-                    object = result = initialize();
-                }
-            }
-        }
-
-        return result;
-    }
-
-    /**
-     * Creates and initializes the object managed by this {@code
-     * LazyInitializer}. This method is called by {@link #get()} when the object
-     * is accessed for the first time. An implementation can focus on the
-     * creation of the object. No synchronization is needed, as this is already
-     * handled by {@code get()}.
-     *
-     * @return the managed data object
-     * @throws ConcurrentException if an error occurs during object creation
-     */
-    protected abstract T initialize() throws ConcurrentException;
-}
diff --git a/lang/src/main/java/org/apache/commons/lang3/concurrent/MultiBackgroundInitializer.java b/lang/src/main/java/org/apache/commons/lang3/concurrent/MultiBackgroundInitializer.java
deleted file mode 100644
index 61e0bd9..0000000
--- a/lang/src/main/java/org/apache/commons/lang3/concurrent/MultiBackgroundInitializer.java
+++ /dev/null
@@ -1,352 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.commons.lang3.concurrent;
-
-import java.util.Collections;
-import java.util.HashMap;
-import java.util.Map;
-import java.util.NoSuchElementException;
-import java.util.Set;
-import java.util.concurrent.ExecutorService;
-
-/**
- * <p>
- * A specialized {@link BackgroundInitializer} implementation that can deal with
- * multiple background initialization tasks.
- * </p>
- * <p>
- * This class has a similar purpose as {@link BackgroundInitializer}. However,
- * it is not limited to a single background initialization task. Rather it
- * manages an arbitrary number of {@code BackgroundInitializer} objects,
- * executes them, and waits until they are completely initialized. This is
- * useful for applications that have to perform multiple initialization tasks
- * that can run in parallel (i.e. that do not depend on each other). This class
- * takes care about the management of an {@code ExecutorService} and shares it
- * with the {@code BackgroundInitializer} objects it is responsible for; so the
- * using application need not bother with these details.
- * </p>
- * <p>
- * The typical usage scenario for {@code MultiBackgroundInitializer} is as
- * follows:
- * </p>
- * <ul>
- * <li>Create a new instance of the class. Optionally pass in a pre-configured
- * {@code ExecutorService}. Alternatively {@code MultiBackgroundInitializer} can
- * create a temporary {@code ExecutorService} and delete it after initialization
- * is complete.</li>
- * <li>Create specialized {@link BackgroundInitializer} objects for the
- * initialization tasks to be performed and add them to the {@code
- * MultiBackgroundInitializer} using the
- * {@link #addInitializer(String, BackgroundInitializer)} method.</li>
- * <li>After all initializers have been added, call the {@link #start()} method.
- * </li>
- * <li>When access to the result objects produced by the {@code
- * BackgroundInitializer} objects is needed call the {@link #get()} method. The
- * object returned here provides access to all result objects created during
- * initialization. It also stores information about exceptions that have
- * occurred.</li>
- * </ul>
- * <p>
- * {@code MultiBackgroundInitializer} starts a special controller task that
- * starts all {@code BackgroundInitializer} objects added to the instance.
- * Before the an initializer is started it is checked whether this initializer
- * already has an {@code ExecutorService} set. If this is the case, this {@code
- * ExecutorService} is used for running the background task. Otherwise the
- * current {@code ExecutorService} of this {@code MultiBackgroundInitializer} is
- * shared with the initializer.
- * </p>
- * <p>
- * The easiest way of using this class is to let it deal with the management of
- * an {@code ExecutorService} itself: If no external {@code ExecutorService} is
- * provided, the class creates a temporary {@code ExecutorService} (that is
- * capable of executing all background tasks in parallel) and destroys it at the
- * end of background processing.
- * </p>
- * <p>
- * Alternatively an external {@code ExecutorService} can be provided - either at
- * construction time or later by calling the
- * {@link #setExternalExecutor(ExecutorService)} method. In this case all
- * background tasks are scheduled at this external {@code ExecutorService}.
- * <strong>Important note:</strong> When using an external {@code
- * ExecutorService} be sure that the number of threads managed by the service is
- * large enough. Otherwise a deadlock can happen! This is the case in the
- * following scenario: {@code MultiBackgroundInitializer} starts a task that
- * starts all registered {@code BackgroundInitializer} objects and waits for
- * their completion. If for instance a single threaded {@code ExecutorService}
- * is used, none of the background tasks can be executed, and the task created
- * by {@code MultiBackgroundInitializer} waits forever.
- * </p>
- *
- * @since 3.0
- * @version $Id$
- */
-public class MultiBackgroundInitializer
-        extends
-        BackgroundInitializer<MultiBackgroundInitializer.MultiBackgroundInitializerResults> {
-    /** A map with the child initializers. */
-    private final Map<String, BackgroundInitializer<?>> childInitializers =
-        new HashMap<String, BackgroundInitializer<?>>();
-
-    /**
-     * Creates a new instance of {@code MultiBackgroundInitializer}.
-     */
-    public MultiBackgroundInitializer() {
-        super();
-    }
-
-    /**
-     * Creates a new instance of {@code MultiBackgroundInitializer} and
-     * initializes it with the given external {@code ExecutorService}.
-     *
-     * @param exec the {@code ExecutorService} for executing the background
-     * tasks
-     */
-    public MultiBackgroundInitializer(final ExecutorService exec) {
-        super(exec);
-    }
-
-    /**
-     * Adds a new {@code BackgroundInitializer} to this object. When this
-     * {@code MultiBackgroundInitializer} is started, the given initializer will
-     * be processed. This method must not be called after {@link #start()} has
-     * been invoked.
-     *
-     * @param name the name of the initializer (must not be <b>null</b>)
-     * @param init the {@code BackgroundInitializer} to add (must not be
-     * <b>null</b>)
-     * @throws IllegalArgumentException if a required parameter is missing
-     * @throws IllegalStateException if {@code start()} has already been called
-     */
-    public void addInitializer(final String name, final BackgroundInitializer<?> init) {
-        if (name == null) {
-            throw new IllegalArgumentException(
-                    "Name of child initializer must not be null!");
-        }
-        if (init == null) {
-            throw new IllegalArgumentException(
-                    "Child initializer must not be null!");
-        }
-
-        synchronized (this) {
-            if (isStarted()) {
-                throw new IllegalStateException(
-                        "addInitializer() must not be called after start()!");
-            }
-            childInitializers.put(name, init);
-        }
-    }
-
-    /**
-     * Returns the number of tasks needed for executing all child {@code
-     * BackgroundInitializer} objects in parallel. This implementation sums up
-     * the required tasks for all child initializers (which is necessary if one
-     * of the child initializers is itself a {@code MultiBackgroundInitializer}
-     * ). Then it adds 1 for the control task that waits for the completion of
-     * the children.
-     *
-     * @return the number of tasks required for background processing
-     */
-    @Override
-    protected int getTaskCount() {
-        int result = 1;
-
-        for (final BackgroundInitializer<?> bi : childInitializers.values()) {
-            result += bi.getTaskCount();
-        }
-
-        return result;
-    }
-
-    /**
-     * Creates the results object. This implementation starts all child {@code
-     * BackgroundInitializer} objects. Then it collects their results and
-     * creates a {@code MultiBackgroundInitializerResults} object with this
-     * data. If a child initializer throws a checked exceptions, it is added to
-     * the results object. Unchecked exceptions are propagated.
-     *
-     * @return the results object
-     * @throws Exception if an error occurs
-     */
-    @Override
-    protected MultiBackgroundInitializerResults initialize() throws Exception {
-        Map<String, BackgroundInitializer<?>> inits;
-        synchronized (this) {
-            // create a snapshot to operate on
-            inits = new HashMap<String, BackgroundInitializer<?>>(
-                    childInitializers);
-        }
-
-        // start the child initializers
-        final ExecutorService exec = getActiveExecutor();
-        for (final BackgroundInitializer<?> bi : inits.values()) {
-            if (bi.getExternalExecutor() == null) {
-                // share the executor service if necessary
-                bi.setExternalExecutor(exec);
-            }
-            bi.start();
-        }
-
-        // collect the results
-        final Map<String, Object> results = new HashMap<String, Object>();
-        final Map<String, ConcurrentException> excepts = new HashMap<String, ConcurrentException>();
-        for (final Map.Entry<String, BackgroundInitializer<?>> e : inits.entrySet()) {
-            try {
-                results.put(e.getKey(), e.getValue().get());
-            } catch (final ConcurrentException cex) {
-                excepts.put(e.getKey(), cex);
-            }
-        }
-
-        return new MultiBackgroundInitializerResults(inits, results, excepts);
-    }
-
-    /**
-     * A data class for storing the results of the background initialization
-     * performed by {@code MultiBackgroundInitializer}. Objects of this inner
-     * class are returned by {@link MultiBackgroundInitializer#initialize()}.
-     * They allow access to all result objects produced by the
-     * {@link BackgroundInitializer} objects managed by the owning instance. It
-     * is also possible to retrieve status information about single
-     * {@link BackgroundInitializer}s, i.e. whether they completed normally or
-     * caused an exception.
-     */
-    public static class MultiBackgroundInitializerResults {
-        /** A map with the child initializers. */
-        private final Map<String, BackgroundInitializer<?>> initializers;
-
-        /** A map with the result objects. */
-        private final Map<String, Object> resultObjects;
-
-        /** A map with the exceptions. */
-        private final Map<String, ConcurrentException> exceptions;
-
-        /**
-         * Creates a new instance of {@code MultiBackgroundInitializerResults}
-         * and initializes it with maps for the {@code BackgroundInitializer}
-         * objects, their result objects and the exceptions thrown by them.
-         *
-         * @param inits the {@code BackgroundInitializer} objects
-         * @param results the result objects
-         * @param excepts the exceptions
-         */
-        private MultiBackgroundInitializerResults(
-                final Map<String, BackgroundInitializer<?>> inits,
-                final Map<String, Object> results,
-                final Map<String, ConcurrentException> excepts) {
-            initializers = inits;
-            resultObjects = results;
-            exceptions = excepts;
-        }
-
-        /**
-         * Returns the {@code BackgroundInitializer} with the given name. If the
-         * name cannot be resolved, an exception is thrown.
-         *
-         * @param name the name of the {@code BackgroundInitializer}
-         * @return the {@code BackgroundInitializer} with this name
-         * @throws NoSuchElementException if the name cannot be resolved
-         */
-        public BackgroundInitializer<?> getInitializer(final String name) {
-            return checkName(name);
-        }
-
-        /**
-         * Returns the result object produced by the {@code
-         * BackgroundInitializer} with the given name. This is the object
-         * returned by the initializer's {@code initialize()} method. If this
-         * {@code BackgroundInitializer} caused an exception, <b>null</b> is
-         * returned. If the name cannot be resolved, an exception is thrown.
-         *
-         * @param name the name of the {@code BackgroundInitializer}
-         * @return the result object produced by this {@code
-         * BackgroundInitializer}
-         * @throws NoSuchElementException if the name cannot be resolved
-         */
-        public Object getResultObject(final String name) {
-            checkName(name);
-            return resultObjects.get(name);
-        }
-
-        /**
-         * Returns a flag whether the {@code BackgroundInitializer} with the
-         * given name caused an exception.
-         *
-         * @param name the name of the {@code BackgroundInitializer}
-         * @return a flag whether this initializer caused an exception
-         * @throws NoSuchElementException if the name cannot be resolved
-         */
-        public boolean isException(final String name) {
-            checkName(name);
-            return exceptions.containsKey(name);
-        }
-
-        /**
-         * Returns the {@code ConcurrentException} object that was thrown by the
-         * {@code BackgroundInitializer} with the given name. If this
-         * initializer did not throw an exception, the return value is
-         * <b>null</b>. If the name cannot be resolved, an exception is thrown.
-         *
-         * @param name the name of the {@code BackgroundInitializer}
-         * @return the exception thrown by this initializer
-         * @throws NoSuchElementException if the name cannot be resolved
-         */
-        public ConcurrentException getException(final String name) {
-            checkName(name);
-            return exceptions.get(name);
-        }
-
-        /**
-         * Returns a set with the names of all {@code BackgroundInitializer}
-         * objects managed by the {@code MultiBackgroundInitializer}.
-         *
-         * @return an (unmodifiable) set with the names of the managed {@code
-         * BackgroundInitializer} objects
-         */
-        public Set<String> initializerNames() {
-            return Collections.unmodifiableSet(initializers.keySet());
-        }
-
-        /**
-         * Returns a flag whether the whole initialization was successful. This
-         * is the case if no child initializer has thrown an exception.
-         *
-         * @return a flag whether the initialization was successful
-         */
-        public boolean isSuccessful() {
-            return exceptions.isEmpty();
-        }
-
-        /**
-         * Checks whether an initializer with the given name exists. If not,
-         * throws an exception. If it exists, the associated child initializer
-         * is returned.
-         *
-         * @param name the name to check
-         * @return the initializer with this name
-         * @throws NoSuchElementException if the name is unknown
-         */
-        private BackgroundInitializer<?> checkName(final String name) {
-            final BackgroundInitializer<?> init = initializers.get(name);
-            if (init == null) {
-                throw new NoSuchElementException(
-                        "No child initializer with name " + name);
-            }
-
-            return init;
-        }
-    }
-}
diff --git a/lang/src/main/java/org/apache/commons/lang3/concurrent/TimedSemaphore.java b/lang/src/main/java/org/apache/commons/lang3/concurrent/TimedSemaphore.java
deleted file mode 100644
index a3c19b3..0000000
--- a/lang/src/main/java/org/apache/commons/lang3/concurrent/TimedSemaphore.java
+++ /dev/null
@@ -1,424 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.commons.lang3.concurrent;
-
-import java.util.concurrent.ScheduledExecutorService;
-import java.util.concurrent.ScheduledFuture;
-import java.util.concurrent.ScheduledThreadPoolExecutor;
-import java.util.concurrent.TimeUnit;
-
-import org.apache.commons.lang3.Validate;
-
-/**
- * <p>
- * A specialized <em>semaphore</em> implementation that provides a number of
- * permits in a given time frame.
- * </p>
- * <p>
- * This class is similar to the {@code java.util.concurrent.Semaphore} class
- * provided by the JDK in that it manages a configurable number of permits.
- * Using the {@link #acquire()} method a permit can be requested by a thread.
- * However, there is an additional timing dimension: there is no {@code
- * release()} method for freeing a permit, but all permits are automatically
- * released at the end of a configurable time frame. If a thread calls
- * {@link #acquire()} and the available permits are already exhausted for this
- * time frame, the thread is blocked. When the time frame ends all permits
- * requested so far are restored, and blocking threads are waked up again, so
- * that they can try to acquire a new permit. This basically means that in the
- * specified time frame only the given number of operations is possible.
- * </p>
- * <p>
- * A use case for this class is to artificially limit the load produced by a
- * process. As an example consider an application that issues database queries
- * on a production system in a background process to gather statistical
- * information. This background processing should not produce so much database
- * load that the functionality and the performance of the production system are
- * impacted. Here a {@code TimedSemaphore} could be installed to guarantee that
- * only a given number of database queries are issued per second.
- * </p>
- * <p>
- * A thread class for performing database queries could look as follows:
- * </p>
- *
- * <pre>
- * public class StatisticsThread extends Thread {
- *     // The semaphore for limiting database load.
- *     private final TimedSemaphore semaphore;
- *     // Create an instance and set the semaphore
- *     public StatisticsThread(TimedSemaphore timedSemaphore) {
- *         semaphore = timedSemaphore;
- *     }
- *     // Gather statistics
- *     public void run() {
- *         try {
- *             while(true) {
- *                 semaphore.acquire();   // limit database load
- *                 performQuery();        // issue a query
- *             }
- *         } catch(InterruptedException) {
- *             // fall through
- *         }
- *     }
- *     ...
- * }
- * </pre>
- *
- * <p>
- * The following code fragment shows how a {@code TimedSemaphore} is created
- * that allows only 10 operations per second and passed to the statistics
- * thread:
- * </p>
- *
- * <pre>
- * TimedSemaphore sem = new TimedSemaphore(1, TimeUnit.SECOND, 10);
- * StatisticsThread thread = new StatisticsThread(sem);
- * thread.start();
- * </pre>
- *
- * <p>
- * When creating an instance the time period for the semaphore must be
- * specified. {@code TimedSemaphore} uses an executor service with a
- * corresponding period to monitor this interval. The {@code
- * ScheduledExecutorService} to be used for this purpose can be provided at
- * construction time. Alternatively the class creates an internal executor
- * service.
- * </p>
- * <p>
- * Client code that uses {@code TimedSemaphore} has to call the
- * {@link #acquire()} method in aach processing step. {@code TimedSemaphore}
- * keeps track of the number of invocations of the {@link #acquire()} method and
- * blocks the calling thread if the counter exceeds the limit specified. When
- * the timer signals the end of the time period the counter is reset and all
- * waiting threads are released. Then another cycle can start.
- * </p>
- * <p>
- * It is possible to modify the limit at any time using the
- * {@link #setLimit(int)} method. This is useful if the load produced by an
- * operation has to be adapted dynamically. In the example scenario with the
- * thread collecting statistics it may make sense to specify a low limit during
- * day time while allowing a higher load in the night time. Reducing the limit
- * takes effect immediately by blocking incoming callers. If the limit is
- * increased, waiting threads are not released immediately, but wake up when the
- * timer runs out. Then, in the next period more processing steps can be
- * performed without blocking. By setting the limit to 0 the semaphore can be
- * switched off: in this mode the {@link #acquire()} method never blocks, but
- * lets all callers pass directly.
- * </p>
- * <p>
- * When the {@code TimedSemaphore} is no more needed its {@link #shutdown()}
- * method should be called. This causes the periodic task that monitors the time
- * interval to be canceled. If the {@code ScheduledExecutorService} has been
- * created by the semaphore at construction time, it is also shut down.
- * resources. After that {@link #acquire()} must not be called any more.
- * </p>
- *
- * @since 3.0
- * @version $Id$
- */
-public class TimedSemaphore {
-    /**
-     * Constant for a value representing no limit. If the limit is set to a
-     * value less or equal this constant, the {@code TimedSemaphore} will be
-     * effectively switched off.
-     */
-    public static final int NO_LIMIT = 0;
-
-    /** Constant for the thread pool size for the executor. */
-    private static final int THREAD_POOL_SIZE = 1;
-
-    /** The executor service for managing the timer thread. */
-    private final ScheduledExecutorService executorService;
-
-    /** Stores the period for this timed semaphore. */
-    private final long period;
-
-    /** The time unit for the period. */
-    private final TimeUnit unit;
-
-    /** A flag whether the executor service was created by this object. */
-    private final boolean ownExecutor;
-
-    /** A future object representing the timer task. */
-    private ScheduledFuture<?> task; // @GuardedBy("this")
-
-    /** Stores the total number of invocations of the acquire() method. */
-    private long totalAcquireCount; // @GuardedBy("this")
-
-    /**
-     * The counter for the periods. This counter is increased every time a
-     * period ends.
-     */
-    private long periodCount; // @GuardedBy("this")
-
-    /** The limit. */
-    private int limit; // @GuardedBy("this")
-
-    /** The current counter. */
-    private int acquireCount;  // @GuardedBy("this")
-
-    /** The number of invocations of acquire() in the last period. */
-    private int lastCallsPerPeriod; // @GuardedBy("this")
-
-    /** A flag whether shutdown() was called. */
-    private boolean shutdown;  // @GuardedBy("this")
-
-    /**
-     * Creates a new instance of {@link TimedSemaphore} and initializes it with
-     * the given time period and the limit.
-     *
-     * @param timePeriod the time period
-     * @param timeUnit the unit for the period
-     * @param limit the limit for the semaphore
-     * @throws IllegalArgumentException if the period is less or equals 0
-     */
-    public TimedSemaphore(final long timePeriod, final TimeUnit timeUnit, final int limit) {
-        this(null, timePeriod, timeUnit, limit);
-    }
-
-    /**
-     * Creates a new instance of {@link TimedSemaphore} and initializes it with
-     * an executor service, the given time period, and the limit. The executor
-     * service will be used for creating a periodic task for monitoring the time
-     * period. It can be <b>null</b>, then a default service will be created.
-     *
-     * @param service the executor service
-     * @param timePeriod the time period
-     * @param timeUnit the unit for the period
-     * @param limit the limit for the semaphore
-     * @throws IllegalArgumentException if the period is less or equals 0
-     */
-    public TimedSemaphore(final ScheduledExecutorService service, final long timePeriod,
-            final TimeUnit timeUnit, final int limit) {
-        Validate.inclusiveBetween(1, Long.MAX_VALUE, timePeriod, "Time period must be greater than 0!");
-
-        period = timePeriod;
-        unit = timeUnit;
-
-        if (service != null) {
-            executorService = service;
-            ownExecutor = false;
-        } else {
-            final ScheduledThreadPoolExecutor s = new ScheduledThreadPoolExecutor(
-                    THREAD_POOL_SIZE);
-            s.setContinueExistingPeriodicTasksAfterShutdownPolicy(false);
-            s.setExecuteExistingDelayedTasksAfterShutdownPolicy(false);
-            executorService = s;
-            ownExecutor = true;
-        }
-
-        setLimit(limit);
-    }
-
-    /**
-     * Returns the limit enforced by this semaphore. The limit determines how
-     * many invocations of {@link #acquire()} are allowed within the monitored
-     * period.
-     *
-     * @return the limit
-     */
-    public final synchronized int getLimit() {
-        return limit;
-    }
-
-    /**
-     * Sets the limit. This is the number of times the {@link #acquire()} method
-     * can be called within the time period specified. If this limit is reached,
-     * further invocations of {@link #acquire()} will block. Setting the limit
-     * to a value &lt;= {@link #NO_LIMIT} will cause the limit to be disabled,
-     * i.e. an arbitrary number of{@link #acquire()} invocations is allowed in
-     * the time period.
-     *
-     * @param limit the limit
-     */
-    public final synchronized void setLimit(final int limit) {
-        this.limit = limit;
-    }
-
-    /**
-     * Initializes a shutdown. After that the object cannot be used any more.
-     * This method can be invoked an arbitrary number of times. All invocations
-     * after the first one do not have any effect.
-     */
-    public synchronized void shutdown() {
-        if (!shutdown) {
-
-            if (ownExecutor) {
-                // if the executor was created by this instance, it has
-                // to be shutdown
-                getExecutorService().shutdownNow();
-            }
-            if (task != null) {
-                task.cancel(false);
-            }
-
-            shutdown = true;
-        }
-    }
-
-    /**
-     * Tests whether the {@link #shutdown()} method has been called on this
-     * object. If this method returns <b>true</b>, this instance cannot be used
-     * any longer.
-     *
-     * @return a flag whether a shutdown has been performed
-     */
-    public synchronized boolean isShutdown() {
-        return shutdown;
-    }
-
-    /**
-     * Tries to acquire a permit from this semaphore. This method will block if
-     * the limit for the current period has already been reached. If
-     * {@link #shutdown()} has already been invoked, calling this method will
-     * cause an exception. The very first call of this method starts the timer
-     * task which monitors the time period set for this {@code TimedSemaphore}.
-     * From now on the semaphore is active.
-     *
-     * @throws InterruptedException if the thread gets interrupted
-     * @throws IllegalStateException if this semaphore is already shut down
-     */
-    public synchronized void acquire() throws InterruptedException {
-        if (isShutdown()) {
-            throw new IllegalStateException("TimedSemaphore is shut down!");
-        }
-
-        if (task == null) {
-            task = startTimer();
-        }
-
-        boolean canPass = false;
-        do {
-            canPass = getLimit() <= NO_LIMIT || acquireCount < getLimit();
-            if (!canPass) {
-                wait();
-            } else {
-                acquireCount++;
-            }
-        } while (!canPass);
-    }
-
-    /**
-     * Returns the number of (successful) acquire invocations during the last
-     * period. This is the number of times the {@link #acquire()} method was
-     * called without blocking. This can be useful for testing or debugging
-     * purposes or to determine a meaningful threshold value. If a limit is set,
-     * the value returned by this method won't be greater than this limit.
-     *
-     * @return the number of non-blocking invocations of the {@link #acquire()}
-     * method
-     */
-    public synchronized int getLastAcquiresPerPeriod() {
-        return lastCallsPerPeriod;
-    }
-
-    /**
-     * Returns the number of invocations of the {@link #acquire()} method for
-     * the current period. This may be useful for testing or debugging purposes.
-     *
-     * @return the current number of {@link #acquire()} invocations
-     */
-    public synchronized int getAcquireCount() {
-        return acquireCount;
-    }
-
-    /**
-     * Returns the number of calls to the {@link #acquire()} method that can
-     * still be performed in the current period without blocking. This method
-     * can give an indication whether it is safe to call the {@link #acquire()}
-     * method without risking to be suspended. However, there is no guarantee
-     * that a subsequent call to {@link #acquire()} actually is not-blocking
-     * because in the mean time other threads may have invoked the semaphore.
-     *
-     * @return the current number of available {@link #acquire()} calls in the
-     * current period
-     */
-    public synchronized int getAvailablePermits() {
-        return getLimit() - getAcquireCount();
-    }
-
-    /**
-     * Returns the average number of successful (i.e. non-blocking)
-     * {@link #acquire()} invocations for the entire life-time of this {@code
-     * TimedSemaphore}. This method can be used for instance for statistical
-     * calculations.
-     *
-     * @return the average number of {@link #acquire()} invocations per time
-     * unit
-     */
-    public synchronized double getAverageCallsPerPeriod() {
-        return periodCount == 0 ? 0 : (double) totalAcquireCount
-                / (double) periodCount;
-    }
-
-    /**
-     * Returns the time period. This is the time monitored by this semaphore.
-     * Only a given number of invocations of the {@link #acquire()} method is
-     * possible in this period.
-     *
-     * @return the time period
-     */
-    public long getPeriod() {
-        return period;
-    }
-
-    /**
-     * Returns the time unit. This is the unit used by {@link #getPeriod()}.
-     *
-     * @return the time unit
-     */
-    public TimeUnit getUnit() {
-        return unit;
-    }
-
-    /**
-     * Returns the executor service used by this instance.
-     *
-     * @return the executor service
-     */
-    protected ScheduledExecutorService getExecutorService() {
-        return executorService;
-    }
-
-    /**
-     * Starts the timer. This method is called when {@link #acquire()} is called
-     * for the first time. It schedules a task to be executed at fixed rate to
-     * monitor the time period specified.
-     *
-     * @return a future object representing the task scheduled
-     */
-    protected ScheduledFuture<?> startTimer() {
-        return getExecutorService().scheduleAtFixedRate(new Runnable() {
-            @Override
-            public void run() {
-                endOfPeriod();
-            }
-        }, getPeriod(), getPeriod(), getUnit());
-    }
-
-    /**
-     * The current time period is finished. This method is called by the timer
-     * used internally to monitor the time period. It resets the counter and
-     * releases the threads waiting for this barrier.
-     */
-    synchronized void endOfPeriod() {
-        lastCallsPerPeriod = acquireCount;
-        totalAcquireCount += acquireCount;
-        periodCount++;
-        acquireCount = 0;
-        notifyAll();
-    }
-}
diff --git a/lang/src/main/java/org/apache/commons/lang3/concurrent/package-info.java b/lang/src/main/java/org/apache/commons/lang3/concurrent/package-info.java
deleted file mode 100644
index 9b5b088..0000000
--- a/lang/src/main/java/org/apache/commons/lang3/concurrent/package-info.java
+++ /dev/null
@@ -1,440 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-/**
- * <p>Provides support classes for multi-threaded programming.
- * This package is intended to be an extension to {@link java.util.concurrent}.
- * These classes are thread-safe.</p>
- *
- * <h3></h3>
- *
- * <p> A group of classes deals with the correct creation and initialization of objects that are accessed by multiple threads.
- * All these classes implement the {@link org.apache.commons.lang3.concurrent.ConcurrentInitializer} interface which provides just a
- * single method:
- * </p>
- *
- * <pre>
- * <code>
- * public interface ConcurrentInitializer&lt;T&gt; {
- *    T get() throws ConcurrentException;
- * }
- * </code>
- * </pre>
- *
- * <p>A <code>ConcurrentInitializer</code> produces an object.
- * By calling the {@link org.apache.commons.lang3.concurrent.ConcurrentInitializer#get() get()} method the object managed by the initializer can be obtained.
- * There are different implementations of the interface available
- * addressing various use cases:
- * </p>
- *
- * <p> {@link org.apache.commons.lang3.concurrent.ConstantInitializer} is a very straightforward implementation of the <code>ConcurrentInitializer</code> interface:
- * An instance is passed an object when it is constructed.
- * In its <code>get()</code> method it simply returns this object.
- * This is useful, for instance in unit tests or in cases when you want to pass a specific object to a component which expects a <code>ConcurrentInitializer</code>.
- * </p>
- *
- * <p>The {@link org.apache.commons.lang3.concurrent.LazyInitializer} class can be used to defer the creation of an object until it is actually used.
- * This makes sense, for instance, if the creation of the object is expensive and would slow down application startup or if the object is needed only for special executions.
- * <code>LazyInitializer</code> implements the <em>double-check idiom for an instance field</em> as discussed in Joshua Bloch's "Effective Java", 2nd edition, item 71.
- * It uses <strong>volatile</strong> fields to reduce the amount of synchronization.
- * Note that this idiom is appropriate for instance fields only.
- * For <strong>static</strong> fields there are superior alternatives.</p>
- *
- * <p>We provide an example use case to demonstrate the usage of this class:
- * A server application uses multiple worker threads to process client requests.
- * If such a request causes a fatal error, an administrator is to be notified using a special messaging service.
- * We assume that the creation of the messaging service is an expensive operation.
- * So it should only be performed if an error actually occurs.
- * Here is where <code>LazyInitializer</code> comes into play.
- * We create a specialized subclass for creating and initializing an instance of our messaging service.
- * <code>LazyInitializer</code> declares an abstract {@link org.apache.commons.lang3.concurrent.LazyInitializer#initialize() initialize()} method which we have to implement to create the messaging service object:</p>
- *
- * <pre>
- * <code>
- * public class MessagingServiceInitializer extends LazyInitializer&lt;MessagingService&gt; {
- *   protected MessagingService initialize() throws ConcurrentException {
- *     // Do all necessary steps to create and initialize the service object
- *     MessagingService service = ...
- *     return service;
- *   }
- * }
- * </code>
- * </pre>
- *
- * <p> Now each server thread is passed a reference to a shared instance of our new <code>MessagingServiceInitializer</code> class.
- * The threads run in a loop processing client requests. If an error is detected, the messaging service is obtained from the initializer, and the administrator is notified:</p>
- *
- * <pre>
- * <code>
- * public class ServerThread implements Runnable {
- *  // The initializer for obtaining the messaging service.
- *  private final ConcurrentInitializer&lt;MessagingService&gt; initializer;
- *
- *  public ServerThread(ConcurrentInitializer&lt;MessagingService&gt; init) {
- *    initializer = init;
- *  }
- *
- *  public void run() {
- *    while (true) {
- *      try {
- *        // wait for request
- *        // process request
- *      } catch (FatalServerException ex) {
- *        // get messaging service
- *        try {
- *          MessagingService svc = initializer.get();
- *          svc.notifyAdministrator(ex);
- *        } catch (ConcurrentException cex) {
- *          cex.printStackTrace();
- *        }
- *      }
- *    }
- *  }
- * }
- * </code>
- * </pre>
- *
- * <p>The {@link org.apache.commons.lang3.concurrent.AtomicInitializer} class is very similar to <code>LazyInitializer</code>.
- * It serves the same purpose: to defer the creation of an object until it is needed.
- * The internal structure is also very similar.
- * Again there is an abstract {@link org.apache.commons.lang3.concurrent.AtomicInitializer#initialize() initialize()} method which has to be implemented by concrete subclasses in order to create and initialize the managed object.
- * Actually, in our example above we can turn the <code>MessagingServiceInitializer</code> into an atomic initializer by simply changing the <strong>extends</strong> declaration to refer to <code>AtomicInitializer&lt;MessagingService&gt;</code> as super class.</p>
- *
- * <p>With {@link org.apache.commons.lang3.concurrent.AtomicSafeInitializer} there is yet another variant implementing the lazy initializing pattern.
- * Its implementation is close to <code>AtomicInitializer</code>; it also uses atomic variables internally and therefore does not need synchronization.
- * The name &quot;Safe&quot; is derived from the fact that it implements an additional check which guarantees that the {@link org.apache.commons.lang3.concurrent.AtomicSafeInitializer#initialize() initialize()} method is called only once.
- * So it behaves exactly in the same way as <code>LazyInitializer</code>.</p>
- *
- * <p>Now, which one of the lazy initializer implementations should you use?
- * First of all we have to state that is is problematic to give general recommendations regarding the performance of these classes.
- * The initializers  make use of low-level functionality whose efficiency depends on multiple factors including the target platform and the number of concurrent threads.
- * So developers should make their own benchmarks in scenarios close to their specific use cases.
- * The following statements are rules of thumb which have to be verified in practice.</p>
- *
- * <p><code>AtomicInitializer</code> is probably the most efficient implementation due to its lack of synchronization and further checks.
- * Its main drawback is that the <code>initialize()</code> method can be called multiple times.
- * In cases where this is not an issue <code>AtomicInitializer</code> is a good choice.
- * <code>AtomicSafeInitializer</code> and  <code>LazyInitializer</code> both guarantee that the initialization method is called only once.
- * Because <code>AtomicSafeInitializer</code> does not use synchronization it is probably slightly more efficient than <code>LazyInitializer</code>, but the concrete numbers might depend on the level of concurrency.</p>
- *
- * <p>Another implementation of the <code>ConcurrentInitializer</code> interface is {@link org.apache.commons.lang3.concurrent.BackgroundInitializer}.
- * It is again an abstract base class with an {@link org.apache.commons.lang3.concurrent.BackgroundInitializer#initialize() initialize()} method that has to be defined by concrete subclasses.
- * The idea of <code>BackgroundInitializer</code> is that it calls the <code>initialize()</code> method in a separate worker thread.
- * An application creates a background initializer and starts it.
- * Then it can continue with its work while the initializer runs in parallel.
- * When the application needs the results of the initializer it calls its <code>get()</code> method.
- * <code>get()</code> blocks until the initialization is complete.
- * This is useful for instance at application startup.
- * Here initialization steps (e.g. reading configuration files, opening a database connection, etc.) can be run in background threads while the application shows a splash screen and constructs its UI.</p>
- *
- * <p>As a concrete example consider an application that has to read the content of a URL - maybe a page with news - which is to be displayed to the user after login.
- * Because loading the data over the network can take some time a specialized implementation of <code>BackgroundInitializer</code> can be created for this purpose:</p>
- *
- * <pre>
- * <code>
- * public class URLLoader extends BackgroundInitializer&lt;String&gt; {
- *   // The URL to be loaded.
- *   private final URL url;
- *
- *   public URLLoader(URL u) {
- *     url = u;
- *   }
- *
- *   protected String initialize() throws ConcurrentException {
- *     try {
- *       InputStream in = url.openStream();
- *       // read content into string
- *       ...
- *       return content;
- *     } catch (IOException ioex) {
- *       throw new ConcurrentException(ioex);
- *     }
- *   }
- * }
- * </code>
- * </pre>
- *
- * <p>An application creates an instance of <code>URLLoader</code> and starts it.
- * Then it can do other things.
- * When it needs the content of the URL it calls the initializer's <code>get()</code> method:</p>
- *
- * <pre>
- * <code>
- * URL url = new URL("http://www.application-home-page.com/");
- * URLLoader loader = new URLLoader(url);
- * loader.start();  // this starts the background initialization
- *
- * // do other stuff
- * ...
- * // now obtain the content of the URL
- * String content;
- * try {
- *   content = loader.get();  // this may block
- * } catch (ConcurrentException cex) {
- *   content = "Error when loading URL " + url;
- * }
- * // display content
- * </code>
- * </pre>
- *
- * <p> Related to <code>BackgroundInitializer</code> is the {@link org.apache.commons.lang3.concurrent.MultiBackgroundInitializer} class.
- * As the name implies, this class can handle multiplie initializations in parallel.
- * The basic usage scenario is that a <code>MultiBackgroundInitializer</code> instance is created.
- * Then an arbitrary number of <code>BackgroundInitializer</code> objects is added using the {@link org.apache.commons.lang3.concurrent.MultiBackgroundInitializer#addInitializer(String, BackgroundInitializer)} method.
- * When adding an initializer a string has to be provided which is later used to obtain the result for this initializer.
- * When all initializers have been added the {@link org.apache.commons.lang3.concurrent.MultiBackgroundInitializer#start()} method is called.
- * This starts processing of all initializers.
- * Later the <code>get()</code> method can be called.
- * It waits until all initializers have finished their initialization.
- * <code>get()</code> returns an object of type {@link org.apache.commons.lang3.concurrent.MultiBackgroundInitializer.MultiBackgroundInitializerResults}.
- * This object provides information about all initializations that have been performed.
- * It can be checked whether a specific initializer was successful or threw an exception.
- * Of course, all initialization results can be queried.</p>
- *
- * <p>With <code>MultiBackgroundInitializer</code> we can extend our example to perform multiple initialization steps.
- * Suppose that in addition to loading a web site we also want to create a JPA entity manager factory and read a configuration file.
- * We assume that corresponding <code>BackgroundInitializer</code> implementations exist.
- * The following example fragment shows the usage of <code>MultiBackgroundInitializer</code> for this purpose:</p>
- *
- * <pre>
- * <code>
- * MultiBackgroundInitializer initializer = new MultiBackgroundInitializer();
- * initializer.addInitializer("url", new URLLoader(url));
- * initializer.addInitializer("jpa", new JPAEMFInitializer());
- * initializer.addInitializer("config", new ConfigurationInitializer());
- * initializer.start();  // start background processing
- *
- * // do other interesting things in parallel
- * ...
- * // evaluate the results of background initialization
- * MultiBackgroundInitializer.MultiBackgroundInitializerResults results =
- * initializer.get();
- * String urlContent = (String) results.getResultObject("url");
- * EntityManagerFactory emf =
- * (EntityManagerFactory) results.getResultObject("jpa");
- * ...
- * </code>
- * </pre>
- *
- * <p>The child initializers are added to the multi initializer and are assigned a unique name.
- * The object returned by the <code>get()</code> method is then queried for the single results using these unique names.</p>
- *
- * <p> If background initializers - including <code>MultiBackgroundInitializer</code> - are created using the standard constructor, they create their own {@link java.util.concurrent.ExecutorService} which is used behind the scenes to execute the worker tasks.
- * It is also possible to pass in an <code>ExecutorService</code> when the initializer is constructed.
- * That way client code can configure the <code>ExecutorService</code> according to its specific needs; for instance, the number of threads available could be limited.</p>
- *
- * <h3>Utility Classes</h3>
- *
- * <p>Another group of classes in the new <code>concurrent</code> package offers some generic functionality related to concurrency.
- * There is the {@link org.apache.commons.lang3.concurrent.ConcurrentUtils} class with a bunch of static utility methods.
- * One focus of this class is dealing with exceptions thrown by JDK classes.
- * Many JDK classes of the executor framework throw exceptions of type {@link java.util.concurrent.ExecutionException} if something goes wrong.
- * The root cause of these exceptions can also be a runtime exception or even an error.
- * In typical Java programming you often do not want to deal with runtime exceptions directly; rather you let them fall through the hierarchy of method invocations until they reach a central exception handler.
- * Checked exceptions in contrast are usually handled close to their occurrence.
- * With <code>ExecutionException</code> this principle is violated.
- * Because it is a checked exception, an application is forced to handle it even if the cause is a runtime exception.
- * So you typically have to inspect the cause of the <code>ExecutionException</code> and test whether it is a checked exception which has to be handled. If this is not the case, the causing exception can be rethrown.
- * </p>
- *
- * <p>The {@link org.apache.commons.lang3.concurrent.ConcurrentUtils#extractCause(java.util.concurrent.ExecutionException)} method does this work for you.
- * It is passed an <code>ExecutionException</code> and tests its root cause.
- * If this is an error or a runtime exception, it is directly rethrown.
- * Otherwise, an instance of {@link org.apache.commons.lang3.concurrent.ConcurrentException} is created and initialized with the root cause
- * (<code>ConcurrentException</code> is a new exception class in the <code>o.a.c.l.concurrent</code> package).
- * So if you get such a <code>ConcurrentException</code>, you can be sure that the original cause for the <code>ExecutionException</code> was a checked exception.
- * For users who prefer runtime exceptions in general there is also an {@link org.apache.commons.lang3.concurrent.ConcurrentUtils#extractCauseUnchecked(java.util.concurrent.ExecutionException)} method which behaves like <code>extractCause()</code>, but returns the unchecked exception {@link org.apache.commons.lang3.concurrent.ConcurrentRuntimeException} instead.</p>
- *
- * <p>In addition to the <code>extractCause()</code> methods there are corresponding {@link org.apache.commons.lang3.concurrent.ConcurrentUtils#handleCause(java.util.concurrent.ExecutionException)} and {@link org.apache.commons.lang3.concurrent.ConcurrentUtils#handleCauseUnchecked(java.util.concurrent.ExecutionException)} methods.
- * These methods extract the cause of the passed in <code>ExecutionException</code> and throw the resulting <code>ConcurrentException</code> or <code>ConcurrentRuntimeException</code>.
- * This makes it easy to transform an <code>ExecutionException</code> into a <code>ConcurrentException</code> ignoring unchecked exceptions:</p>
- *
- * <pre>
- * <code>
- * Future&lt;Object&gt; future = ...;
- * try {
- *   Object result = future.get();
- *   ...
- * } catch (ExecutionException eex) {
- *   ConcurrentUtils.handleCause(eex);
- * }
- * </code>
- * </pre>
- *
- * <p>There is also some support for the concurrent initializers introduced in the last sub section.
- * The <code>initialize()</code> method is passed a <code>ConcurrentInitializer</code> object and returns the object created by this initializer.
- * It is null-safe.
- * The <code>initializeUnchecked()</code> method works analogously, but a <code>ConcurrentException</code> throws by the initializer is rethrown as a <code>ConcurrentRuntimeException</code>.
- * This is especially useful if the specific <code>ConcurrentInitializer</code> does not throw checked exceptions.
- * Using this method the code for requesting the object of an initializer becomes less verbose.
- * The direct invocation looks as follows:</p>
- *
- * <pre>
- * <code>
- * ConcurrentInitializer&lt;MyClass&gt; initializer = ...;
- * try {
- *   MyClass obj = initializer.get();
- *   // do something with obj
- * } catch (ConcurrentException cex) {
- *   // exception handling
- * }
- * </code>
- * </pre>
- *
- * <p>Using the {@link org.apache.commons.lang3.concurrent.ConcurrentUtils#initializeUnchecked(ConcurrentInitializer)} method, this becomes:</p>
- *
- * <pre>
- * <code>
- * ConcurrentInitializer&lt;MyClass&gt; initializer = ...;
- * MyClass obj = ConcurrentUtils.initializeUnchecked(initializer);
- * // do something with obj
- * </code>
- * </pre>
- *
- * <p>Another utility class deals with the creation of threads.
- * When using the <em>Executor</em> framework new in JDK 1.5 the developer usually does not have to care about creating threads; the executors create the threads they need on demand.
- * However, sometimes it is desired to set some properties of the newly created worker threads.
- * This is possible through the {@link java.util.concurrent.ThreadFactory} interface; an implementation of this interface has to be created and passed to an executor on creation time.
- * Currently, the JDK does not provide an implementation of <code>ThreadFactory</code>, so one has to start from scratch. </p>
- *
- * <p> With {@link org.apache.commons.lang3.concurrent.BasicThreadFactory} Commons Lang has an implementation of <code>ThreadFactory</code> that works out of the box for many common use cases.
- * For instance, it is possible to set a naming pattern for the new threads, set the daemon flag and a priority, or install a handler for uncaught exceptions.
- * Instances of <code>BasicThreadFactory</code> are created and configured using the nested {@link org.apache.commons.lang3.concurrent.BasicThreadFactory.Builder} class.
- * The following example shows a typical usage scenario:</p>
- *
- * <pre>
- * <code>
- * BasicThreadFactory factory = new BasicThreadFactory.Builder()
- *   .namingPattern("worker-thread-%d")
- *   .daemon(true)
- *   .uncaughtExceptionHandler(myHandler)
- *   .build();
- * ExecutorService exec = Executors.newSingleThreadExecutor(factory);
- * </code>
- * </pre>
- *
- * <p>The nested <code>Builder</code> class defines some methods for configuring the new <code>BasicThreadFactory</code> instance.
- * Objects of this class are immutable, so these attributes cannot be changed later.
- * The naming pattern is a string which can be passed to <code>String.format()</code>.
- * The placeholder <em>%d</em> is replaced by an increasing counter value.
- * An instance can wrap another <code>ThreadFactory</code> implementation; this is achieved by calling the builder's {@link org.apache.commons.lang3.concurrent.BasicThreadFactory.Builder#wrappedFactory(java.util.concurrent.ThreadFactory) wrappedFactory(ThreadFactory)} method.
- * This factory is then used for creating new threads; after that the specific attributes are applied to the new thread.
- * If no wrapped factory is set, the default factory provided by the JDK is used.</p>
- *
- * <h3>Synchronization objects</h3>
- *
- * <p>The <code>concurrent</code> package also provides some support for specific synchronization problems with threads.</p>
- *
- * <p> {@link org.apache.commons.lang3.concurrent.TimedSemaphore} allows restricted access to a resource in a given time frame.
- * Similar to a semaphore, a number of permits can be acquired.
- * What is new is the fact that the permits available are related to a given time unit.
- * For instance, the timed semaphore can be configured to allow 10 permits in a second.
- * Now multiple threads access the semaphore and call its {@link org.apache.commons.lang3.concurrent.TimedSemaphore#acquire()} method.
- * The semaphore keeps track about the number of granted permits in the current time frame.
- * Only 10 calls are allowed; if there are further callers, they are blocked until the time frame (one second in this example) is over.
- * Then all blocking threads are released, and the counter of available permits is reset to 0.
- * So the game can start anew.</p>
- *
- * <p> What are use cases for <code>TimedSemaphore</code>?
- * One example is to artificially limit the load produced by multiple threads.
- * Consider a batch application accessing a database to extract statistical data.
- * The application runs multiple threads which issue database queries in parallel and perform some calculation on the results.
- * If the database to be processed is huge and is also used by a production system, multiple factors have to be balanced:
- * On one hand, the time required for the statistical evaluation should not take too long.
- * Therefore you will probably use a larger number of threads because most of its life time a thread will just wait for the database to return query results.
- * On the other hand, the load on the database generated by all these threads should be limited so that the responsiveness of the production system is not affected.
- * With a <code>TimedSemaphore</code> object this can be achieved.
- * The semaphore can be configured to allow e.g. 100 queries per second.
- * After these queries have been sent to the database the threads have to wait until the second is over - then they can query again.
- * By fine-tuning the limit enforced by the semaphore a good balance between performance and database load can be established.
- * It is even possible to chang? the number of available permits at runtime.
- * So this number can be reduced during the typical working hours and increased at night.</p>
- *
- * <p>The following code examples demonstrate parts of the implementation of such a scenario.
- * First the batch application has to create an instance of <code>TimedSemaphore</code> and to initialize its properties with default values:</p>
- *
- * <code>TimedSemaphore semaphore = new TimedSemaphore(1, TimeUnit.SECONDS, 100);</code>
- *
- * <p>Here we specify that the semaphore should allow 100 permits in one second.
- * This is effectively the limit of database queries per second in our example use case.
- * Next the server threads issuing database queries and performing statistical operations can be initialized.
- * They are passed a reference to the semaphore at creation time. Before they execute a query they have to acquire a permit.</p>
- *
- * <pre>
- * <code>
- * public class StatisticsTask implements Runnable {
- * // The semaphore for limiting database load.
- *   private final TimedSemaphore semaphore;
- *
- *   public StatisticsTask(TimedSemaphore sem, Connection con) {
- *     semaphore = sem;
- *      ...
- *   }
- *
- *   //The main processing method. Executes queries and evaluates their results.
- *   public void run() {
- *     try {
- *       while (!isDone()) {
- *         semaphore.acquire();    // enforce the load limit
- *         executeAndEvaluateQuery();
- *       }
- *     } catch (InterruptedException iex) {
- *       // fall through
- *     }
- *   }
- * }
- * </code>
- * </pre>
- *
- * <p>The important line here is the call to <code>semaphore.acquire()</code>.
- * If the number of permits in the current time frame has not yet been reached, the call returns immediately.
- * Otherwise, it blocks until the end of the time frame.
- * The last piece missing is a scheduler service which adapts the number of permits allowed by the semaphore according to the time of day.
- * We assume that this service is pretty simple and knows only two different time slots:
- * working shift and night shift.
- * The service is triggered periodically.
- * It then determines the current time slot and configures the timed semaphore accordingly.</p>
- *
- * <pre>
- * <code>
- * public class SchedulerService {
- *   // The semaphore for limiting database load.
- *   private final TimedSemaphore semaphore;
- *     ...
- *
- *   // Configures the timed semaphore based on the current time of day. This method is called periodically.
- *   public void configureTimedSemaphore() {
- *      int limit;
- *      if (isWorkshift()) {
- *        limit = 50;    // low database load
- *      } else {
- *        limit = 250;   // high database load
- *      }
- *
- *      semaphore.setLimit(limit);
- *   }
- * }
- * </code>
- * </pre>
- *
- * <p>With the {@link org.apache.commons.lang3.concurrent.TimedSemaphore#setLimit(int)} method the number of permits allowed for a time frame can be changed.
- * There are some other methods for querying the internal state of a timed semaphore.
- * Also some statistical data is available, e.g. the average number of <code>acquire()</code> calls per time frame.
- * When a timed semaphore is no more needed, its <code>shutdown()</code> method has to be called.</p>
- *
- * @version $Id$
- */
-package org.apache.commons.lang3.concurrent;
diff --git a/lang/src/main/java/org/apache/commons/lang3/event/EventListenerSupport.java b/lang/src/main/java/org/apache/commons/lang3/event/EventListenerSupport.java
deleted file mode 100644
index f9857ef..0000000
--- a/lang/src/main/java/org/apache/commons/lang3/event/EventListenerSupport.java
+++ /dev/null
@@ -1,322 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package org.apache.commons.lang3.event;
-
-import java.io.ByteArrayOutputStream;
-import java.io.IOException;
-import java.io.ObjectInputStream;
-import java.io.ObjectOutputStream;
-import java.io.Serializable;
-import java.lang.reflect.Array;
-import java.lang.reflect.InvocationHandler;
-import java.lang.reflect.Method;
-import java.lang.reflect.Proxy;
-import java.util.ArrayList;
-import java.util.List;
-import java.util.concurrent.CopyOnWriteArrayList;
-
-import org.apache.commons.lang3.Validate;
-
-/**
- * <p>An EventListenerSupport object can be used to manage a list of event
- * listeners of a particular type. The class provides
- * {@link #addListener(Object)} and {@link #removeListener(Object)} methods
- * for registering listeners, as well as a {@link #fire()} method for firing
- * events to the listeners.
- * </p>
- *
- * <p>
- * To use this class, suppose you want to support ActionEvents.  You would do:
- * </p>
- * <pre><code>
- * public class MyActionEventSource
- * {
- *   private EventListenerSupport&lt;ActionListener&gt; actionListeners =
- *       EventListenerSupport.create(ActionListener.class);
- *
- *   public void someMethodThatFiresAction()
- *   {
- *     ActionEvent e = new ActionEvent(this, ActionEvent.ACTION_PERFORMED, "somethingCool");
- *     actionListeners.fire().actionPerformed(e);
- *   }
- * }
- * </code></pre>
- *
- * <p>
- * Serializing an {@link EventListenerSupport} instance will result in any
- * non-{@link Serializable} listeners being silently dropped.
- * </p>
- *
- * @param <L> the type of event listener that is supported by this proxy.
- *
- * @since 3.0
- * @version $Id$
- */
-public class EventListenerSupport<L> implements Serializable {
-
-    /** Serialization version */
-    private static final long serialVersionUID = 3593265990380473632L;
-
-    /**
-     * The list used to hold the registered listeners. This list is
-     * intentionally a thread-safe copy-on-write-array so that traversals over
-     * the list of listeners will be atomic.
-     */
-    private List<L> listeners = new CopyOnWriteArrayList<L>();
-
-    /**
-     * The proxy representing the collection of listeners. Calls to this proxy
-     * object will sent to all registered listeners.
-     */
-    private transient L proxy;
-
-    /**
-     * Empty typed array for #getListeners().
-     */
-    private transient L[] prototypeArray;
-
-    /**
-     * Creates an EventListenerSupport object which supports the specified
-     * listener type.
-     *
-     * @param <T> the type of the listener interface
-     * @param listenerInterface the type of listener interface that will receive
-     *        events posted using this class.
-     *
-     * @return an EventListenerSupport object which supports the specified
-     *         listener type.
-     *
-     * @throws NullPointerException if <code>listenerInterface</code> is
-     *         <code>null</code>.
-     * @throws IllegalArgumentException if <code>listenerInterface</code> is
-     *         not an interface.
-     */
-    public static <T> EventListenerSupport<T> create(final Class<T> listenerInterface) {
-        return new EventListenerSupport<T>(listenerInterface);
-    }
-
-    /**
-     * Creates an EventListenerSupport object which supports the provided
-     * listener interface.
-     *
-     * @param listenerInterface the type of listener interface that will receive
-     *        events posted using this class.
-     *
-     * @throws NullPointerException if <code>listenerInterface</code> is
-     *         <code>null</code>.
-     * @throws IllegalArgumentException if <code>listenerInterface</code> is
-     *         not an interface.
-     */
-    public EventListenerSupport(final Class<L> listenerInterface) {
-        this(listenerInterface, Thread.currentThread().getContextClassLoader());
-    }
-
-    /**
-     * Creates an EventListenerSupport object which supports the provided
-     * listener interface using the specified class loader to create the JDK
-     * dynamic proxy.
-     *
-     * @param listenerInterface the listener interface.
-     * @param classLoader       the class loader.
-     *
-     * @throws NullPointerException if <code>listenerInterface</code> or
-     *         <code>classLoader</code> is <code>null</code>.
-     * @throws IllegalArgumentException if <code>listenerInterface</code> is
-     *         not an interface.
-     */
-    public EventListenerSupport(final Class<L> listenerInterface, final ClassLoader classLoader) {
-        this();
-        Validate.notNull(listenerInterface, "Listener interface cannot be null.");
-        Validate.notNull(classLoader, "ClassLoader cannot be null.");
-        Validate.isTrue(listenerInterface.isInterface(), "Class {0} is not an interface",
-                listenerInterface.getName());
-        initializeTransientFields(listenerInterface, classLoader);
-    }
-
-    /**
-     * Create a new EventListenerSupport instance.
-     * Serialization-friendly constructor.
-     */
-    private EventListenerSupport() {
-    }
-
-    /**
-     * Returns a proxy object which can be used to call listener methods on all
-     * of the registered event listeners. All calls made to this proxy will be
-     * forwarded to all registered listeners.
-     *
-     * @return a proxy object which can be used to call listener methods on all
-     * of the registered event listeners
-     */
-    public L fire() {
-        return proxy;
-    }
-
-//**********************************************************************************************************************
-// Other Methods
-//**********************************************************************************************************************
-
-    /**
-     * Registers an event listener.
-     *
-     * @param listener the event listener (may not be <code>null</code>).
-     *
-     * @throws NullPointerException if <code>listener</code> is
-     *         <code>null</code>.
-     */
-    public void addListener(final L listener) {
-        Validate.notNull(listener, "Listener object cannot be null.");
-        listeners.add(listener);
-    }
-
-    /**
-     * Returns the number of registered listeners.
-     *
-     * @return the number of registered listeners.
-     */
-    int getListenerCount() {
-        return listeners.size();
-    }
-
-    /**
-     * Unregisters an event listener.
-     *
-     * @param listener the event listener (may not be <code>null</code>).
-     *
-     * @throws NullPointerException if <code>listener</code> is
-     *         <code>null</code>.
-     */
-    public void removeListener(final L listener) {
-        Validate.notNull(listener, "Listener object cannot be null.");
-        listeners.remove(listener);
-    }
-
-    /**
-     * Get an array containing the currently registered listeners.
-     * Modification to this array's elements will have no effect on the
-     * {@link EventListenerSupport} instance.
-     * @return L[]
-     */
-    public L[] getListeners() {
-        return listeners.toArray(prototypeArray);
-    }
-
-    /**
-     * Serialize.
-     * @param objectOutputStream the output stream
-     * @throws IOException if an IO error occurs
-     */
-    private void writeObject(final ObjectOutputStream objectOutputStream) throws IOException {
-        final ArrayList<L> serializableListeners = new ArrayList<L>();
-
-        // don't just rely on instanceof Serializable:
-        ObjectOutputStream testObjectOutputStream = new ObjectOutputStream(new ByteArrayOutputStream());
-        for (final L listener : listeners) {
-            try {
-                testObjectOutputStream.writeObject(listener);
-                serializableListeners.add(listener);
-            } catch (final IOException exception) {
-                //recreate test stream in case of indeterminate state
-                testObjectOutputStream = new ObjectOutputStream(new ByteArrayOutputStream());
-            }
-        }
-        /*
-         * we can reconstitute everything we need from an array of our listeners,
-         * which has the additional advantage of typically requiring less storage than a list:
-         */
-        objectOutputStream.writeObject(serializableListeners.toArray(prototypeArray));
-    }
-
-    /**
-     * Deserialize.
-     * @param objectInputStream the input stream
-     * @throws IOException if an IO error occurs
-     * @throws ClassNotFoundException if the class cannot be resolved
-     */
-    private void readObject(final ObjectInputStream objectInputStream) throws IOException, ClassNotFoundException {
-        @SuppressWarnings("unchecked") // Will throw CCE here if not correct
-        final
-        L[] srcListeners = (L[]) objectInputStream.readObject();
-
-        this.listeners = new CopyOnWriteArrayList<L>(srcListeners);
-
-        @SuppressWarnings("unchecked") // Will throw CCE here if not correct
-        final
-        Class<L> listenerInterface = (Class<L>) srcListeners.getClass().getComponentType();
-
-        initializeTransientFields(listenerInterface, Thread.currentThread().getContextClassLoader());
-    }
-
-    /**
-     * Initialize transient fields.
-     * @param listenerInterface the class of the listener interface
-     * @param classLoader the class loader to be used
-     */
-    private void initializeTransientFields(final Class<L> listenerInterface, final ClassLoader classLoader) {
-        @SuppressWarnings("unchecked") // Will throw CCE here if not correct
-        final
-        L[] array = (L[]) Array.newInstance(listenerInterface, 0);
-        this.prototypeArray = array;
-        createProxy(listenerInterface, classLoader);
-    }
-
-    /**
-     * Create the proxy object.
-     * @param listenerInterface the class of the listener interface
-     * @param classLoader the class loader to be used
-     */
-    private void createProxy(final Class<L> listenerInterface, final ClassLoader classLoader) {
-        proxy = listenerInterface.cast(Proxy.newProxyInstance(classLoader,
-                new Class[] { listenerInterface }, createInvocationHandler()));
-    }
-
-    /**
-     * Create the {@link InvocationHandler} responsible for broadcasting calls
-     * to the managed listeners.  Subclasses can override to provide custom behavior.
-     * @return ProxyInvocationHandler
-     */
-    protected InvocationHandler createInvocationHandler() {
-        return new ProxyInvocationHandler();
-    }
-
-    /**
-     * An invocation handler used to dispatch the event(s) to all the listeners.
-     */
-    protected class ProxyInvocationHandler implements InvocationHandler {
-
-        /**
-         * Propagates the method call to all registered listeners in place of
-         * the proxy listener object.
-         *
-         * @param unusedProxy the proxy object representing a listener on which the
-         *        invocation was called; not used
-         * @param method the listener method that will be called on all of the
-         *        listeners.
-         * @param args event arguments to propagate to the listeners.
-         * @return the result of the method call
-         * @throws Throwable if an error occurs
-         */
-        @Override
-        public Object invoke(final Object unusedProxy, final Method method, final Object[] args) throws Throwable {
-            for (final L listener : listeners) {
-                method.invoke(listener, args);
-            }
-            return null;
-        }
-    }
-}
diff --git a/lang/src/main/java/org/apache/commons/lang3/event/EventUtils.java b/lang/src/main/java/org/apache/commons/lang3/event/EventUtils.java
deleted file mode 100644
index fc19b9b..0000000
--- a/lang/src/main/java/org/apache/commons/lang3/event/EventUtils.java
+++ /dev/null
@@ -1,130 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package org.apache.commons.lang3.event;
-
-import java.lang.reflect.InvocationHandler;
-import java.lang.reflect.InvocationTargetException;
-import java.lang.reflect.Method;
-import java.lang.reflect.Proxy;
-import java.util.Arrays;
-import java.util.HashSet;
-import java.util.Set;
-
-import org.apache.commons.lang3.reflect.MethodUtils;
-
-/**
- * Provides some useful event-based utility methods.
- *
- * @since 3.0
- * @version $Id$
- */
-public class EventUtils {
-
-    /**
-     * Adds an event listener to the specified source.  This looks for an "add" method corresponding to the event
-     * type (addActionListener, for example).
-     * @param eventSource   the event source
-     * @param listenerType  the event listener type
-     * @param listener      the listener
-     * @param <L>           the event listener type
-     *
-     * @throws IllegalArgumentException if the object doesn't support the listener type
-     */
-    public static <L> void addEventListener(final Object eventSource, final Class<L> listenerType, final L listener) {
-        try {
-            MethodUtils.invokeMethod(eventSource, "add" + listenerType.getSimpleName(), listener);
-        } catch (final NoSuchMethodException e) {
-            throw new IllegalArgumentException("Class " + eventSource.getClass().getName()
-                    + " does not have a public add" + listenerType.getSimpleName()
-                    + " method which takes a parameter of type " + listenerType.getName() + ".");
-        } catch (final IllegalAccessException e) {
-            throw new IllegalArgumentException("Class " + eventSource.getClass().getName()
-                    + " does not have an accessible add" + listenerType.getSimpleName ()
-                    + " method which takes a parameter of type " + listenerType.getName() + ".");
-        } catch (final InvocationTargetException e) {
-            throw new RuntimeException("Unable to add listener.", e.getCause());
-        }
-    }
-
-    /**
-     * Binds an event listener to a specific method on a specific object.
-     *
-     * @param <L>          the event listener type
-     * @param target       the target object
-     * @param methodName   the name of the method to be called
-     * @param eventSource  the object which is generating events (JButton, JList, etc.)
-     * @param listenerType the listener interface (ActionListener.class, SelectionListener.class, etc.)
-     * @param eventTypes   the event types (method names) from the listener interface (if none specified, all will be
-     *                     supported)
-     */
-    public static <L> void bindEventsToMethod(final Object target, final String methodName, final Object eventSource,
-            final Class<L> listenerType, final String... eventTypes) {
-        final L listener = listenerType.cast(Proxy.newProxyInstance(target.getClass().getClassLoader(),
-                new Class[] { listenerType }, new EventBindingInvocationHandler(target, methodName, eventTypes)));
-        addEventListener(eventSource, listenerType, listener);
-    }
-
-    private static class EventBindingInvocationHandler implements InvocationHandler {
-        private final Object target;
-        private final String methodName;
-        private final Set<String> eventTypes;
-
-        /**
-         * Creates a new instance of {@code EventBindingInvocationHandler}.
-         *
-         * @param target the target object for method invocations
-         * @param methodName the name of the method to be invoked
-         * @param eventTypes the names of the supported event types
-         */
-        EventBindingInvocationHandler(final Object target, final String methodName, final String[] eventTypes) {
-            this.target = target;
-            this.methodName = methodName;
-            this.eventTypes = new HashSet<String>(Arrays.asList(eventTypes));
-        }
-
-        /**
-         * Handles a method invocation on the proxy object.
-         *
-         * @param proxy the proxy instance
-         * @param method the method to be invoked
-         * @param parameters the parameters for the method invocation
-         * @return the result of the method call
-         * @throws Throwable if an error occurs
-         */
-        @Override
-        public Object invoke(final Object proxy, final Method method, final Object[] parameters) throws Throwable {
-            if (eventTypes.isEmpty() || eventTypes.contains(method.getName())) {
-                if (hasMatchingParametersMethod(method)) {
-                    return MethodUtils.invokeMethod(target, methodName, parameters);
-                }
-                return MethodUtils.invokeMethod(target, methodName);
-            }
-            return null;
-        }
-
-        /**
-         * Checks whether a method for the passed in parameters can be found.
-         *
-         * @param method the listener method invoked
-         * @return a flag whether the parameters could be matched
-         */
-        private boolean hasMatchingParametersMethod(final Method method) {
-            return MethodUtils.getAccessibleMethod(target.getClass(), methodName, method.getParameterTypes()) != null;
-        }
-    }
-}
diff --git a/lang/src/main/java/org/apache/commons/lang3/event/package-info.java b/lang/src/main/java/org/apache/commons/lang3/event/package-info.java
deleted file mode 100644
index 4b70c15..0000000
--- a/lang/src/main/java/org/apache/commons/lang3/event/package-info.java
+++ /dev/null
@@ -1,23 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-/**
- * Provides some useful event-based utilities.
- *
- * @since 3.0
- * @version $Id$
- */
-package org.apache.commons.lang3.event;
diff --git a/lang/src/main/java/org/apache/commons/lang3/exception/CloneFailedException.java b/lang/src/main/java/org/apache/commons/lang3/exception/CloneFailedException.java
deleted file mode 100644
index 138b250..0000000
--- a/lang/src/main/java/org/apache/commons/lang3/exception/CloneFailedException.java
+++ /dev/null
@@ -1,62 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- * 
- *      http://www.apache.org/licenses/LICENSE-2.0
- * 
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.commons.lang3.exception;
-
-/**
- * Exception thrown when a clone cannot be created. In contrast to
- * {@link CloneNotSupportedException} this is a {@link RuntimeException}.
- * 
- * @since 3.0
- */
-public class CloneFailedException extends RuntimeException {
-    // ~ Static fields/initializers ---------------------------------------------
-
-    private static final long serialVersionUID = 20091223L;
-
-    // ~ Constructors -----------------------------------------------------------
-
-    /**
-     * Constructs a CloneFailedException.
-     * 
-     * @param message description of the exception
-     * @since upcoming
-     */
-    public CloneFailedException(final String message) {
-        super(message);
-    }
-
-    /**
-     * Constructs a CloneFailedException.
-     * 
-     * @param cause cause of the exception
-     * @since upcoming
-     */
-    public CloneFailedException(final Throwable cause) {
-        super(cause);
-    }
-
-    /**
-     * Constructs a CloneFailedException.
-     * 
-     * @param message description of the exception
-     * @param cause cause of the exception
-     * @since upcoming
-     */
-    public CloneFailedException(final String message, final Throwable cause) {
-        super(message, cause);
-    }
-}
diff --git a/lang/src/main/java/org/apache/commons/lang3/exception/ContextedException.java b/lang/src/main/java/org/apache/commons/lang3/exception/ContextedException.java
deleted file mode 100644
index 326152a..0000000
--- a/lang/src/main/java/org/apache/commons/lang3/exception/ContextedException.java
+++ /dev/null
@@ -1,256 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- * 
- *      http://www.apache.org/licenses/LICENSE-2.0
- * 
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.commons.lang3.exception;
-
-import java.util.List;
-import java.util.Set;
-
-import org.apache.commons.lang3.tuple.Pair;
-
-/**
- * <p>
- * An exception that provides an easy and safe way to add contextual information.
- * </p><p>
- * An exception trace itself is often insufficient to provide rapid diagnosis of the issue.
- * Frequently what is needed is a select few pieces of local contextual data.
- * Providing this data is tricky however, due to concerns over formatting and nulls.
- * </p><p>
- * The contexted exception approach allows the exception to be created together with a
- * list of context label-value pairs. This additional information is automatically included in
- * the message and printed stack trace.
- * </p><p>
- * An unchecked version of this exception is provided by ContextedRuntimeException.
- * </p>
- * <p>
- * To use this class write code as follows:
- * </p>
- * <pre>
- *   try {
- *     ...
- *   } catch (Exception e) {
- *     throw new ContextedException("Error posting account transaction", e)
- *          .addContextValue("Account Number", accountNumber)
- *          .addContextValue("Amount Posted", amountPosted)
- *          .addContextValue("Previous Balance", previousBalance)
- *   }
- * }
- * </pre>
- * <p>
- * or improve diagnose data at a higher level:
- * </p>
- * <pre>
- *   try {
- *     ...
- *   } catch (ContextedException e) {
- *     throw e.setContextValue("Transaction Id", transactionId);
- *   } catch (Exception e) {
- *     if (e instanceof ExceptionContext) {
- *       e.setContextValue("Transaction Id", transactionId);
- *     }
- *     throw e;
- *   }
- * }
- * </pre>
- * <p>
- * The output in a printStacktrace() (which often is written to a log) would look something like the following:
- * </p>
- * <pre>
- * org.apache.commons.lang3.exception.ContextedException: java.lang.Exception: Error posting account transaction
- *  Exception Context:
- *  [1:Account Number=null]
- *  [2:Amount Posted=100.00]
- *  [3:Previous Balance=-2.17]
- *  [4:Transaction Id=94ef1d15-d443-46c4-822b-637f26244899]
- *
- *  ---------------------------------
- *  at org.apache.commons.lang3.exception.ContextedExceptionTest.testAddValue(ContextedExceptionTest.java:88)
- *  ..... (rest of trace)
- * </pre>
- * 
- * @see ContextedRuntimeException
- * @since 3.0
- */
-public class ContextedException extends Exception implements ExceptionContext {
-
-    /** The serialization version. */
-    private static final long serialVersionUID = 20110706L;
-    /** The context where the data is stored. */
-    private final ExceptionContext exceptionContext;
-
-    /**
-     * Instantiates ContextedException without message or cause.
-     * <p>
-     * The context information is stored using a default implementation.
-     */
-    public ContextedException() {
-        super();
-        exceptionContext = new DefaultExceptionContext();
-    }
-
-    /**
-     * Instantiates ContextedException with message, but without cause.
-     * <p>
-     * The context information is stored using a default implementation.
-     * 
-     * @param message  the exception message, may be null
-     */
-    public ContextedException(final String message) {
-        super(message);
-        exceptionContext = new DefaultExceptionContext();
-    }
-
-    /**
-     * Instantiates ContextedException with cause, but without message.
-     * <p>
-     * The context information is stored using a default implementation.
-     * 
-     * @param cause  the underlying cause of the exception, may be null
-     */
-    public ContextedException(final Throwable cause) {
-        super(cause);
-        exceptionContext = new DefaultExceptionContext();
-    }
-
-    /**
-     * Instantiates ContextedException with cause and message.
-     * <p>
-     * The context information is stored using a default implementation.
-     * 
-     * @param message  the exception message, may be null
-     * @param cause  the underlying cause of the exception, may be null
-     */
-    public ContextedException(final String message, final Throwable cause) {
-        super(message, cause);
-        exceptionContext = new DefaultExceptionContext();
-    }
-
-    /**
-     * Instantiates ContextedException with cause, message, and ExceptionContext.
-     * 
-     * @param message  the exception message, may be null
-     * @param cause  the underlying cause of the exception, may be null
-     * @param context  the context used to store the additional information, null uses default implementation
-     */
-    public ContextedException(final String message, final Throwable cause, ExceptionContext context) {
-        super(message, cause);
-        if (context == null) {
-            context = new DefaultExceptionContext();
-        }
-        exceptionContext = context;
-    }
-
-    //-----------------------------------------------------------------------
-    /**
-     * Adds information helpful to a developer in diagnosing and correcting the problem.
-     * For the information to be meaningful, the value passed should have a reasonable
-     * toString() implementation.
-     * Different values can be added with the same label multiple times.
-     * <p>
-     * Note: This exception is only serializable if the object added is serializable.
-     * </p>
-     * 
-     * @param label  a textual label associated with information, {@code null} not recommended
-     * @param value  information needed to understand exception, may be {@code null}
-     * @return {@code this}, for method chaining, not {@code null}
-     */
-    @Override
-    public ContextedException addContextValue(final String label, final Object value) {        
-        exceptionContext.addContextValue(label, value);
-        return this;
-    }
-
-    /**
-     * Sets information helpful to a developer in diagnosing and correcting the problem.
-     * For the information to be meaningful, the value passed should have a reasonable
-     * toString() implementation.
-     * Any existing values with the same labels are removed before the new one is added.
-     * <p>
-     * Note: This exception is only serializable if the object added as value is serializable.
-     * </p>
-     * 
-     * @param label  a textual label associated with information, {@code null} not recommended
-     * @param value  information needed to understand exception, may be {@code null}
-     * @return {@code this}, for method chaining, not {@code null}
-     */
-    @Override
-    public ContextedException setContextValue(final String label, final Object value) {        
-        exceptionContext.setContextValue(label, value);
-        return this;
-    }
-
-    /**
-     * {@inheritDoc}
-     */
-    @Override
-    public List<Object> getContextValues(final String label) {
-        return this.exceptionContext.getContextValues(label);
-    }
-
-    /**
-     * {@inheritDoc}
-     */
-    @Override
-    public Object getFirstContextValue(final String label) {
-        return this.exceptionContext.getFirstContextValue(label);
-    }
-
-    /**
-     * {@inheritDoc}
-     */
-    @Override
-    public List<Pair<String, Object>> getContextEntries() {
-        return this.exceptionContext.getContextEntries();
-    }
-
-    /**
-     * {@inheritDoc}
-     */
-    @Override
-    public Set<String> getContextLabels() {
-        return exceptionContext.getContextLabels();
-    }
-
-    /**
-     * Provides the message explaining the exception, including the contextual data.
-     * 
-     * @see java.lang.Throwable#getMessage()
-     * @return the message, never null
-     */
-    @Override
-    public String getMessage(){
-        return getFormattedExceptionMessage(super.getMessage());
-    }
-
-    /**
-     * Provides the message explaining the exception without the contextual data.
-     * 
-     * @see java.lang.Throwable#getMessage()
-     * @return the message
-     * @since 3.0.1
-     */
-    public String getRawMessage() {
-        return super.getMessage();
-    }
-
-    /**
-     * {@inheritDoc}
-     */
-    @Override
-    public String getFormattedExceptionMessage(final String baseMessage) {
-        return exceptionContext.getFormattedExceptionMessage(baseMessage);
-    }
-}
diff --git a/lang/src/main/java/org/apache/commons/lang3/exception/ContextedRuntimeException.java b/lang/src/main/java/org/apache/commons/lang3/exception/ContextedRuntimeException.java
deleted file mode 100644
index 0120883..0000000
--- a/lang/src/main/java/org/apache/commons/lang3/exception/ContextedRuntimeException.java
+++ /dev/null
@@ -1,257 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- * 
- *      http://www.apache.org/licenses/LICENSE-2.0
- * 
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.commons.lang3.exception;
-
-import java.util.List;
-import java.util.Set;
-
-import org.apache.commons.lang3.tuple.Pair;
-
-/**
- * <p>
- * A runtime exception that provides an easy and safe way to add contextual information.
- * </p><p>
- * An exception trace itself is often insufficient to provide rapid diagnosis of the issue.
- * Frequently what is needed is a select few pieces of local contextual data.
- * Providing this data is tricky however, due to concerns over formatting and nulls.
- * </p><p>
- * The contexted exception approach allows the exception to be created together with a
- * list of context label-value pairs. This additional information is automatically included in
- * the message and printed stack trace.
- * </p><p>
- * A checked version of this exception is provided by ContextedException.
- * </p>
- * <p>
- * To use this class write code as follows:
- * </p>
- * <pre>
- *   try {
- *     ...
- *   } catch (Exception e) {
- *     throw new ContextedRuntimeException("Error posting account transaction", e)
- *          .addContextValue("Account Number", accountNumber)
- *          .addContextValue("Amount Posted", amountPosted)
- *          .addContextValue("Previous Balance", previousBalance)
- *   }
- * }
- * </pre>
- * <p>
- * or improve diagnose data at a higher level:
- * </p>
- * <pre>
- *   try {
- *     ...
- *   } catch (ContextedRuntimeException e) {
- *     throw e.setContextValue("Transaction Id", transactionId);
- *   } catch (Exception e) {
- *     if (e instanceof ExceptionContext) {
- *       e.setContextValue("Transaction Id", transactionId);
- *     }
- *     throw e;
- *   }
- * }
- * </pre>
- * <p>
- * The output in a printStacktrace() (which often is written to a log) would look something like the following:
- * </p>
- * <pre>
- * org.apache.commons.lang3.exception.ContextedRuntimeException: java.lang.Exception: Error posting account transaction
- *  Exception Context:
- *  [1:Account Number=null]
- *  [2:Amount Posted=100.00]
- *  [3:Previous Balance=-2.17]
- *  [4:Transaction Id=94ef1d15-d443-46c4-822b-637f26244899]
- *
- *  ---------------------------------
- *  at org.apache.commons.lang3.exception.ContextedRuntimeExceptionTest.testAddValue(ContextedExceptionTest.java:88)
- *  ..... (rest of trace)
- * </pre>
- * 
- * @see ContextedException
- * @since 3.0
- */
-public class ContextedRuntimeException extends RuntimeException implements ExceptionContext {
-
-    /** The serialization version. */
-    private static final long serialVersionUID = 20110706L;
-    /** The context where the data is stored. */
-    private final ExceptionContext exceptionContext;
-
-    /**
-     * Instantiates ContextedRuntimeException without message or cause.
-     * <p>
-     * The context information is stored using a default implementation.
-     */
-    public ContextedRuntimeException() {
-        super();
-        exceptionContext = new DefaultExceptionContext();
-    }
-
-    /**
-     * Instantiates ContextedRuntimeException with message, but without cause.
-     * <p>
-     * The context information is stored using a default implementation.
-     * 
-     * @param message  the exception message, may be null
-     */
-    public ContextedRuntimeException(final String message) {
-        super(message);
-        exceptionContext = new DefaultExceptionContext();
-    }
-
-    /**
-     * Instantiates ContextedRuntimeException with cause, but without message.
-     * <p>
-     * The context information is stored using a default implementation.
-     * 
-     * @param cause  the underlying cause of the exception, may be null
-     */
-    public ContextedRuntimeException(final Throwable cause) {
-        super(cause);
-        exceptionContext = new DefaultExceptionContext();
-    }
-
-    /**
-     * Instantiates ContextedRuntimeException with cause and message.
-     * <p>
-     * The context information is stored using a default implementation.
-     * 
-     * @param message  the exception message, may be null
-     * @param cause  the underlying cause of the exception, may be null
-     */
-    public ContextedRuntimeException(final String message, final Throwable cause) {
-        super(message, cause);
-        exceptionContext = new DefaultExceptionContext();
-    }
-
-    /**
-     * Instantiates ContextedRuntimeException with cause, message, and ExceptionContext.
-     * 
-     * @param message  the exception message, may be null
-     * @param cause  the underlying cause of the exception, may be null
-     * @param context  the context used to store the additional information, null uses default implementation
-     */
-    public ContextedRuntimeException(final String message, final Throwable cause, ExceptionContext context) {
-        super(message, cause);
-        if (context == null) {
-            context = new DefaultExceptionContext();
-        }
-        exceptionContext = context;
-    }
-
-    //-----------------------------------------------------------------------
-    /**
-     * Adds information helpful to a developer in diagnosing and correcting the problem.
-     * For the information to be meaningful, the value passed should have a reasonable
-     * toString() implementation.
-     * Different values can be added with the same label multiple times.
-     * <p>
-     * Note: This exception is only serializable if the object added is serializable.
-     * </p>
-     * 
-     * @param label  a textual label associated with information, {@code null} not recommended
-     * @param value  information needed to understand exception, may be {@code null}
-     * @return {@code this}, for method chaining, not {@code null}
-     */
-    @Override
-    public ContextedRuntimeException addContextValue(final String label, final Object value) {        
-        exceptionContext.addContextValue(label, value);
-        return this;
-    }
-
-    /**
-     * Sets information helpful to a developer in diagnosing and correcting the problem.
-     * For the information to be meaningful, the value passed should have a reasonable
-     * toString() implementation.
-     * Any existing values with the same labels are removed before the new one is added.
-     * <p>
-     * Note: This exception is only serializable if the object added as value is serializable.
-     * </p>
-     * 
-     * @param label  a textual label associated with information, {@code null} not recommended
-     * @param value  information needed to understand exception, may be {@code null}
-     * @return {@code this}, for method chaining, not {@code null}
-     */
-    @Override
-    public ContextedRuntimeException setContextValue(final String label, final Object value) {        
-        exceptionContext.setContextValue(label, value);
-        return this;
-    }
-
-    /**
-     * {@inheritDoc}
-     */
-    @Override
-    public List<Object> getContextValues(final String label) {
-        return this.exceptionContext.getContextValues(label);
-    }
-
-    /**
-     * {@inheritDoc}
-     */
-    @Override
-    public Object getFirstContextValue(final String label) {
-        return this.exceptionContext.getFirstContextValue(label);
-    }
-
-    /**
-     * {@inheritDoc}
-     */
-    @Override
-    public List<Pair<String, Object>> getContextEntries() {
-        return this.exceptionContext.getContextEntries();
-    }
-
-    /**
-     * {@inheritDoc}
-     */
-    @Override
-    public Set<String> getContextLabels() {
-        return exceptionContext.getContextLabels();
-    }
-
-    /**
-     * Provides the message explaining the exception, including the contextual data.
-     * 
-     * @see java.lang.Throwable#getMessage()
-     * @return the message, never null
-     */
-    @Override
-    public String getMessage(){
-        return getFormattedExceptionMessage(super.getMessage());
-    }
-
-    /**
-     * Provides the message explaining the exception without the contextual data.
-     * 
-     * @see java.lang.Throwable#getMessage()
-     * @return the message
-     * @since 3.0.1
-     */
-    public String getRawMessage() {
-        return super.getMessage();
-    }
-
-    /**
-     * {@inheritDoc}
-     */
-    @Override
-    public String getFormattedExceptionMessage(final String baseMessage) {
-        return exceptionContext.getFormattedExceptionMessage(baseMessage);
-    }
-
-}
diff --git a/lang/src/main/java/org/apache/commons/lang3/exception/DefaultExceptionContext.java b/lang/src/main/java/org/apache/commons/lang3/exception/DefaultExceptionContext.java
deleted file mode 100644
index adaf058..0000000
--- a/lang/src/main/java/org/apache/commons/lang3/exception/DefaultExceptionContext.java
+++ /dev/null
@@ -1,165 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- * 
- *      http://www.apache.org/licenses/LICENSE-2.0
- * 
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.commons.lang3.exception;
-
-import java.io.Serializable;
-import java.util.ArrayList;
-import java.util.HashSet;
-import java.util.Iterator;
-import java.util.List;
-import java.util.Set;
-
-import org.apache.commons.lang3.StringUtils;
-import org.apache.commons.lang3.tuple.ImmutablePair;
-import org.apache.commons.lang3.tuple.Pair;
-
-/**
- * Default implementation of the context storing the label-value pairs for contexted exceptions.
- * <p>
- * This implementation is serializable, however this is dependent on the values that
- * are added also being serializable.
- * </p>
- * 
- * @see ContextedException
- * @see ContextedRuntimeException
- * @since 3.0
- */
-public class DefaultExceptionContext implements ExceptionContext, Serializable {
-
-    /** The serialization version. */
-    private static final long serialVersionUID = 20110706L;
-
-    /** The list storing the label-data pairs. */
-    private final List<Pair<String, Object>> contextValues = new ArrayList<Pair<String,Object>>();
-
-    /**
-     * {@inheritDoc}
-     */
-    @Override
-    public DefaultExceptionContext addContextValue(final String label, final Object value) {
-        contextValues.add(new ImmutablePair<String, Object>(label, value));
-        return this;
-    }
-
-    /**
-     * {@inheritDoc}
-     */
-    @Override
-    public DefaultExceptionContext setContextValue(final String label, final Object value) {
-        for (final Iterator<Pair<String, Object>> iter = contextValues.iterator(); iter.hasNext();) {
-            final Pair<String, Object> p = iter.next();
-            if (StringUtils.equals(label, p.getKey())) {
-                iter.remove();
-            }
-        }
-        addContextValue(label, value);
-        return this;
-    }
-
-    /**
-     * {@inheritDoc}
-     */
-    @Override
-    public List<Object> getContextValues(final String label) {
-        final List<Object> values = new ArrayList<Object>();
-        for (final Pair<String, Object> pair : contextValues) {
-            if (StringUtils.equals(label, pair.getKey())) {
-                values.add(pair.getValue());
-            }
-        }
-        return values;
-    }
-
-    /**
-     * {@inheritDoc}
-     */
-    @Override
-    public Object getFirstContextValue(final String label) {
-        for (final Pair<String, Object> pair : contextValues) {
-            if (StringUtils.equals(label, pair.getKey())) {
-                return pair.getValue();
-            }
-        }
-        return null;
-    }
-
-    /**
-     * {@inheritDoc}
-     */
-    @Override
-    public Set<String> getContextLabels() {
-        final Set<String> labels = new HashSet<String>();
-        for (final Pair<String, Object> pair : contextValues) {
-            labels.add(pair.getKey());
-        }
-        return labels;
-    }
-
-    /**
-     * {@inheritDoc}
-     */
-    @Override
-    public List<Pair<String, Object>> getContextEntries() {
-        return contextValues;
-    }
-
-    /**
-     * Builds the message containing the contextual information.
-     * 
-     * @param baseMessage  the base exception message <b>without</b> context information appended
-     * @return the exception message <b>with</b> context information appended, never null
-     */
-    @Override
-    public String getFormattedExceptionMessage(final String baseMessage){
-        final StringBuilder buffer = new StringBuilder(256);
-        if (baseMessage != null) {
-            buffer.append(baseMessage);
-        }
-        
-        if (contextValues.size() > 0) {
-            if (buffer.length() > 0) {
-                buffer.append('\n');
-            }
-            buffer.append("Exception Context:\n");
-            
-            int i = 0;
-            for (final Pair<String, Object> pair : contextValues) {
-                buffer.append("\t[");
-                buffer.append(++i);
-                buffer.append(':');
-                buffer.append(pair.getKey());
-                buffer.append("=");
-                final Object value = pair.getValue();
-                if (value == null) {
-                    buffer.append("null");
-                } else {
-                    String valueStr;
-                    try {
-                        valueStr = value.toString();
-                    } catch (final Exception e) {
-                        valueStr = "Exception thrown on toString(): " + ExceptionUtils.getStackTrace(e);
-                    }
-                    buffer.append(valueStr);
-                }
-                buffer.append("]\n");
-            }
-            buffer.append("---------------------------------");
-        }
-        return buffer.toString();
-    }
-
-}
diff --git a/lang/src/main/java/org/apache/commons/lang3/exception/ExceptionContext.java b/lang/src/main/java/org/apache/commons/lang3/exception/ExceptionContext.java
deleted file mode 100644
index 1e84659..0000000
--- a/lang/src/main/java/org/apache/commons/lang3/exception/ExceptionContext.java
+++ /dev/null
@@ -1,103 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- * 
- *      http://www.apache.org/licenses/LICENSE-2.0
- * 
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.commons.lang3.exception;
-
-import java.util.List;
-import java.util.Set;
-
-import org.apache.commons.lang3.tuple.Pair;
-
-/**
- * Allows the storage and retrieval of contextual information based on label-value
- * pairs for exceptions.
- * <p>
- * Implementations are expected to manage the pairs in a list-style collection
- * that keeps the pairs in the sequence of their addition.
- * </p>
- * 
- * @see ContextedException
- * @see ContextedRuntimeException
- * @since 3.0
- */
-public interface ExceptionContext {
-
-    /**
-     * Adds a contextual label-value pair into this context.
-     * <p>
-     * The pair will be added to the context, independently of an already
-     * existing pair with the same label.
-     * </p>
-     * 
-     * @param label  the label of the item to add, {@code null} not recommended
-     * @param value  the value of item to add, may be {@code null}
-     * @return {@code this}, for method chaining, not {@code null}
-     */
-    ExceptionContext addContextValue(String label, Object value);
-
-    /**
-     * Sets a contextual label-value pair into this context.
-     * <p>
-     * The pair will be added normally, but any existing label-value pair with
-     * the same label is removed from the context.
-     * </p>
-     * 
-     * @param label  the label of the item to add, {@code null} not recommended
-     * @param value  the value of item to add, may be {@code null}
-     * @return {@code this}, for method chaining, not {@code null}
-     */
-    ExceptionContext setContextValue(String label, Object value);
-
-    /**
-     * Retrieves all the contextual data values associated with the label.
-     * 
-     * @param label  the label to get the contextual values for, may be {@code null}
-     * @return the contextual values associated with the label, never {@code null}
-     */
-    List<Object> getContextValues(String label);
-
-    /**
-     * Retrieves the first available contextual data value associated with the label.
-     * 
-     * @param label  the label to get the contextual value for, may be {@code null}
-     * @return the first contextual value associated with the label, may be {@code null}
-     */
-    Object getFirstContextValue(String label);
-
-    /**
-     * Retrieves the full set of labels defined in the contextual data.
-     * 
-     * @return the set of labels, not {@code null}
-     */
-    Set<String> getContextLabels();
-
-    /**
-     * Retrieves the full list of label-value pairs defined in the contextual data.
-     * 
-     * @return the list of pairs, not {@code null}
-     */
-    List<Pair<String, Object>> getContextEntries();
-
-    /**
-     * Gets the contextualized error message based on a base message.
-     * This will add the context label-value pairs to the message.
-     * 
-     * @param baseMessage  the base exception message <b>without</b> context information appended
-     * @return the exception message <b>with</b> context information appended, not {@code null}
-     */
-    String getFormattedExceptionMessage(String baseMessage);
-
-}
diff --git a/lang/src/main/java/org/apache/commons/lang3/exception/ExceptionUtils.java b/lang/src/main/java/org/apache/commons/lang3/exception/ExceptionUtils.java
deleted file mode 100644
index 7e803dd..0000000
--- a/lang/src/main/java/org/apache/commons/lang3/exception/ExceptionUtils.java
+++ /dev/null
@@ -1,697 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- * 
- *      http://www.apache.org/licenses/LICENSE-2.0
- * 
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.commons.lang3.exception;
-
-import java.io.PrintStream;
-import java.io.PrintWriter;
-import java.io.StringWriter;
-import java.lang.reflect.InvocationTargetException;
-import java.lang.reflect.Method;
-import java.util.ArrayList;
-import java.util.List;
-import java.util.StringTokenizer;
-
-import org.apache.commons.lang3.ArrayUtils;
-import org.apache.commons.lang3.ClassUtils;
-import org.apache.commons.lang3.StringUtils;
-import org.apache.commons.lang3.SystemUtils;
-
-/**
- * <p>Provides utilities for manipulating and examining 
- * <code>Throwable</code> objects.</p>
- *
- * @since 1.0
- * @version $Id$
- */
-public class ExceptionUtils {
-    
-    /**
-     * <p>Used when printing stack frames to denote the start of a
-     * wrapped exception.</p>
-     *
-     * <p>Package private for accessibility by test suite.</p>
-     */
-    static final String WRAPPED_MARKER = " [wrapped] ";
-
-    /**
-     * <p>The names of methods commonly used to access a wrapped exception.</p>
-     */
-    // TODO: Remove in Lang 4.0
-    private static final String[] CAUSE_METHOD_NAMES = {
-        "getCause",
-        "getNextException",
-        "getTargetException",
-        "getException",
-        "getSourceException",
-        "getRootCause",
-        "getCausedByException",
-        "getNested",
-        "getLinkedException",
-        "getNestedException",
-        "getLinkedCause",
-        "getThrowable",
-    };
-
-    /**
-     * <p>
-     * Public constructor allows an instance of <code>ExceptionUtils</code> to be created, although that is not
-     * normally necessary.
-     * </p>
-     */
-    public ExceptionUtils() {
-        super();
-    }
-
-    //-----------------------------------------------------------------------
-    /**
-     * <p>Returns the default names used when searching for the cause of an exception.</p>
-     *
-     * <p>This may be modified and used in the overloaded getCause(Throwable, String[]) method.</p>
-     *
-     * @return cloned array of the default method names
-     * @since 3.0
-     * @deprecated This feature will be removed in Lang 4.0
-     */
-    @Deprecated
-    public static String[] getDefaultCauseMethodNames() {
-        return ArrayUtils.clone(CAUSE_METHOD_NAMES);
-    }
-
-    //-----------------------------------------------------------------------
-    /**
-     * <p>Introspects the <code>Throwable</code> to obtain the cause.</p>
-     *
-     * <p>The method searches for methods with specific names that return a 
-     * <code>Throwable</code> object. This will pick up most wrapping exceptions,
-     * including those from JDK 1.4.
-     *
-     * <p>The default list searched for are:</p>
-     * <ul>
-     *  <li><code>getCause()</code></li>
-     *  <li><code>getNextException()</code></li>
-     *  <li><code>getTargetException()</code></li>
-     *  <li><code>getException()</code></li>
-     *  <li><code>getSourceException()</code></li>
-     *  <li><code>getRootCause()</code></li>
-     *  <li><code>getCausedByException()</code></li>
-     *  <li><code>getNested()</code></li>
-     * </ul>
-     * 
-     * <p>If none of the above is found, returns <code>null</code>.</p>
-     *
-     * @param throwable  the throwable to introspect for a cause, may be null
-     * @return the cause of the <code>Throwable</code>,
-     *  <code>null</code> if none found or null throwable input
-     * @since 1.0
-     * @deprecated This feature will be removed in Lang 4.0
-     */
-    @Deprecated
-    public static Throwable getCause(final Throwable throwable) {
-        return getCause(throwable, CAUSE_METHOD_NAMES);
-    }
-
-    /**
-     * <p>Introspects the <code>Throwable</code> to obtain the cause.</p>
-     *
-     * <p>A <code>null</code> set of method names means use the default set.
-     * A <code>null</code> in the set of method names will be ignored.</p>
-     *
-     * @param throwable  the throwable to introspect for a cause, may be null
-     * @param methodNames  the method names, null treated as default set
-     * @return the cause of the <code>Throwable</code>,
-     *  <code>null</code> if none found or null throwable input
-     * @since 1.0
-     * @deprecated This feature will be removed in Lang 4.0
-     */
-    @Deprecated
-    public static Throwable getCause(final Throwable throwable, String[] methodNames) {
-        if (throwable == null) {
-            return null;
-        }
-
-        if (methodNames == null) {
-            methodNames = CAUSE_METHOD_NAMES;
-        }
-
-        for (final String methodName : methodNames) {
-            if (methodName != null) {
-                final Throwable cause = getCauseUsingMethodName(throwable, methodName);
-                if (cause != null) {
-                    return cause;
-                }
-            }
-        }
-
-        return null;
-    }
-
-    /**
-     * <p>Introspects the <code>Throwable</code> to obtain the root cause.</p>
-     *
-     * <p>This method walks through the exception chain to the last element,
-     * "root" of the tree, using {@link #getCause(Throwable)}, and
-     * returns that exception.</p>
-     *
-     * <p>From version 2.2, this method handles recursive cause structures
-     * that might otherwise cause infinite loops. If the throwable parameter
-     * has a cause of itself, then null will be returned. If the throwable
-     * parameter cause chain loops, the last element in the chain before the
-     * loop is returned.</p>
-     *
-     * @param throwable  the throwable to get the root cause for, may be null
-     * @return the root cause of the <code>Throwable</code>,
-     *  <code>null</code> if none found or null throwable input
-     */
-    public static Throwable getRootCause(final Throwable throwable) {
-        final List<Throwable> list = getThrowableList(throwable);
-        return list.size() < 2 ? null : (Throwable)list.get(list.size() - 1);
-    }
-
-    /**
-     * <p>Finds a <code>Throwable</code> by method name.</p>
-     *
-     * @param throwable  the exception to examine
-     * @param methodName  the name of the method to find and invoke
-     * @return the wrapped exception, or <code>null</code> if not found
-     */
-    // TODO: Remove in Lang 4.0
-    private static Throwable getCauseUsingMethodName(final Throwable throwable, final String methodName) {
-        Method method = null;
-        try {
-            method = throwable.getClass().getMethod(methodName);
-        } catch (final NoSuchMethodException ignored) { // NOPMD
-            // exception ignored
-        } catch (final SecurityException ignored) { // NOPMD
-            // exception ignored
-        }
-
-        if (method != null && Throwable.class.isAssignableFrom(method.getReturnType())) {
-            try {
-                return (Throwable) method.invoke(throwable);
-            } catch (final IllegalAccessException ignored) { // NOPMD
-                // exception ignored
-            } catch (final IllegalArgumentException ignored) { // NOPMD
-                // exception ignored
-            } catch (final InvocationTargetException ignored) { // NOPMD
-                // exception ignored
-            }
-        }
-        return null;
-    }
-
-    //-----------------------------------------------------------------------
-    /**
-     * <p>Counts the number of <code>Throwable</code> objects in the
-     * exception chain.</p>
-     *
-     * <p>A throwable without cause will return <code>1</code>.
-     * A throwable with one cause will return <code>2</code> and so on.
-     * A <code>null</code> throwable will return <code>0</code>.</p>
-     *
-     * <p>From version 2.2, this method handles recursive cause structures
-     * that might otherwise cause infinite loops. The cause chain is
-     * processed until the end is reached, or until the next item in the
-     * chain is already in the result set.</p>
-     *
-     * @param throwable  the throwable to inspect, may be null
-     * @return the count of throwables, zero if null input
-     */
-    public static int getThrowableCount(final Throwable throwable) {
-        return getThrowableList(throwable).size();
-    }
-
-    /**
-     * <p>Returns the list of <code>Throwable</code> objects in the
-     * exception chain.</p>
-     *
-     * <p>A throwable without cause will return an array containing
-     * one element - the input throwable.
-     * A throwable with one cause will return an array containing
-     * two elements. - the input throwable and the cause throwable.
-     * A <code>null</code> throwable will return an array of size zero.</p>
-     *
-     * <p>From version 2.2, this method handles recursive cause structures
-     * that might otherwise cause infinite loops. The cause chain is
-     * processed until the end is reached, or until the next item in the
-     * chain is already in the result set.</p>
-     *
-     * @see #getThrowableList(Throwable)
-     * @param throwable  the throwable to inspect, may be null
-     * @return the array of throwables, never null
-     */
-    public static Throwable[] getThrowables(final Throwable throwable) {
-        final List<Throwable> list = getThrowableList(throwable);
-        return list.toArray(new Throwable[list.size()]);
-    }
-
-    /**
-     * <p>Returns the list of <code>Throwable</code> objects in the
-     * exception chain.</p>
-     *
-     * <p>A throwable without cause will return a list containing
-     * one element - the input throwable.
-     * A throwable with one cause will return a list containing
-     * two elements. - the input throwable and the cause throwable.
-     * A <code>null</code> throwable will return a list of size zero.</p>
-     *
-     * <p>This method handles recursive cause structures that might
-     * otherwise cause infinite loops. The cause chain is processed until
-     * the end is reached, or until the next item in the chain is already
-     * in the result set.</p>
-     *
-     * @param throwable  the throwable to inspect, may be null
-     * @return the list of throwables, never null
-     * @since Commons Lang 2.2
-     */
-    public static List<Throwable> getThrowableList(Throwable throwable) {
-        final List<Throwable> list = new ArrayList<Throwable>();
-        while (throwable != null && list.contains(throwable) == false) {
-            list.add(throwable);
-            throwable = ExceptionUtils.getCause(throwable);
-        }
-        return list;
-    }
-
-    //-----------------------------------------------------------------------
-    /**
-     * <p>Returns the (zero based) index of the first <code>Throwable</code>
-     * that matches the specified class (exactly) in the exception chain.
-     * Subclasses of the specified class do not match - see
-     * {@link #indexOfType(Throwable, Class)} for the opposite.</p>
-     *
-     * <p>A <code>null</code> throwable returns <code>-1</code>.
-     * A <code>null</code> type returns <code>-1</code>.
-     * No match in the chain returns <code>-1</code>.</p>
-     *
-     * @param throwable  the throwable to inspect, may be null
-     * @param clazz  the class to search for, subclasses do not match, null returns -1
-     * @return the index into the throwable chain, -1 if no match or null input
-     */
-    public static int indexOfThrowable(final Throwable throwable, final Class<?> clazz) {
-        return indexOf(throwable, clazz, 0, false);
-    }
-
-    /**
-     * <p>Returns the (zero based) index of the first <code>Throwable</code>
-     * that matches the specified type in the exception chain from
-     * a specified index.
-     * Subclasses of the specified class do not match - see
-     * {@link #indexOfType(Throwable, Class, int)} for the opposite.</p>
-     *
-     * <p>A <code>null</code> throwable returns <code>-1</code>.
-     * A <code>null</code> type returns <code>-1</code>.
-     * No match in the chain returns <code>-1</code>.
-     * A negative start index is treated as zero.
-     * A start index greater than the number of throwables returns <code>-1</code>.</p>
-     *
-     * @param throwable  the throwable to inspect, may be null
-     * @param clazz  the class to search for, subclasses do not match, null returns -1
-     * @param fromIndex  the (zero based) index of the starting position,
-     *  negative treated as zero, larger than chain size returns -1
-     * @return the index into the throwable chain, -1 if no match or null input
-     */
-    public static int indexOfThrowable(final Throwable throwable, final Class<?> clazz, final int fromIndex) {
-        return indexOf(throwable, clazz, fromIndex, false);
-    }
-
-    //-----------------------------------------------------------------------
-    /**
-     * <p>Returns the (zero based) index of the first <code>Throwable</code>
-     * that matches the specified class or subclass in the exception chain.
-     * Subclasses of the specified class do match - see
-     * {@link #indexOfThrowable(Throwable, Class)} for the opposite.</p>
-     *
-     * <p>A <code>null</code> throwable returns <code>-1</code>.
-     * A <code>null</code> type returns <code>-1</code>.
-     * No match in the chain returns <code>-1</code>.</p>
-     *
-     * @param throwable  the throwable to inspect, may be null
-     * @param type  the type to search for, subclasses match, null returns -1
-     * @return the index into the throwable chain, -1 if no match or null input
-     * @since 2.1
-     */
-    public static int indexOfType(final Throwable throwable, final Class<?> type) {
-        return indexOf(throwable, type, 0, true);
-    }
-
-    /**
-     * <p>Returns the (zero based) index of the first <code>Throwable</code>
-     * that matches the specified type in the exception chain from
-     * a specified index.
-     * Subclasses of the specified class do match - see
-     * {@link #indexOfThrowable(Throwable, Class)} for the opposite.</p>
-     *
-     * <p>A <code>null</code> throwable returns <code>-1</code>.
-     * A <code>null</code> type returns <code>-1</code>.
-     * No match in the chain returns <code>-1</code>.
-     * A negative start index is treated as zero.
-     * A start index greater than the number of throwables returns <code>-1</code>.</p>
-     *
-     * @param throwable  the throwable to inspect, may be null
-     * @param type  the type to search for, subclasses match, null returns -1
-     * @param fromIndex  the (zero based) index of the starting position,
-     *  negative treated as zero, larger than chain size returns -1
-     * @return the index into the throwable chain, -1 if no match or null input
-     * @since 2.1
-     */
-    public static int indexOfType(final Throwable throwable, final Class<?> type, final int fromIndex) {
-        return indexOf(throwable, type, fromIndex, true);
-    }
-
-    /**
-     * <p>Worker method for the <code>indexOfType</code> methods.</p>
-     *
-     * @param throwable  the throwable to inspect, may be null
-     * @param type  the type to search for, subclasses match, null returns -1
-     * @param fromIndex  the (zero based) index of the starting position,
-     *  negative treated as zero, larger than chain size returns -1
-     * @param subclass if <code>true</code>, compares with {@link Class#isAssignableFrom(Class)}, otherwise compares
-     * using references
-     * @return index of the <code>type</code> within throwables nested within the specified <code>throwable</code>
-     */
-    private static int indexOf(final Throwable throwable, final Class<?> type, int fromIndex, final boolean subclass) {
-        if (throwable == null || type == null) {
-            return -1;
-        }
-        if (fromIndex < 0) {
-            fromIndex = 0;
-        }
-        final Throwable[] throwables = ExceptionUtils.getThrowables(throwable);
-        if (fromIndex >= throwables.length) {
-            return -1;
-        }
-        if (subclass) {
-            for (int i = fromIndex; i < throwables.length; i++) {
-                if (type.isAssignableFrom(throwables[i].getClass())) {
-                    return i;
-                }
-            }
-        } else {
-            for (int i = fromIndex; i < throwables.length; i++) {
-                if (type.equals(throwables[i].getClass())) {
-                    return i;
-                }
-            }
-        }
-        return -1;
-    }
-
-    //-----------------------------------------------------------------------
-    /**
-     * <p>Prints a compact stack trace for the root cause of a throwable
-     * to <code>System.err</code>.</p>
-     *
-     * <p>The compact stack trace starts with the root cause and prints
-     * stack frames up to the place where it was caught and wrapped.
-     * Then it prints the wrapped exception and continues with stack frames
-     * until the wrapper exception is caught and wrapped again, etc.</p>
-     *
-     * <p>The output of this method is consistent across JDK versions.
-     * Note that this is the opposite order to the JDK1.4 display.</p>
-     *
-     * <p>The method is equivalent to <code>printStackTrace</code> for throwables
-     * that don't have nested causes.</p>
-     *
-     * @param throwable  the throwable to output
-     * @since 2.0
-     */
-    public static void printRootCauseStackTrace(final Throwable throwable) {
-        printRootCauseStackTrace(throwable, System.err);
-    }
-
-    /**
-     * <p>Prints a compact stack trace for the root cause of a throwable.</p>
-     *
-     * <p>The compact stack trace starts with the root cause and prints
-     * stack frames up to the place where it was caught and wrapped.
-     * Then it prints the wrapped exception and continues with stack frames
-     * until the wrapper exception is caught and wrapped again, etc.</p>
-     *
-     * <p>The output of this method is consistent across JDK versions.
-     * Note that this is the opposite order to the JDK1.4 display.</p>
-     *
-     * <p>The method is equivalent to <code>printStackTrace</code> for throwables
-     * that don't have nested causes.</p>
-     *
-     * @param throwable  the throwable to output, may be null
-     * @param stream  the stream to output to, may not be null
-     * @throws IllegalArgumentException if the stream is <code>null</code>
-     * @since 2.0
-     */
-    public static void printRootCauseStackTrace(final Throwable throwable, final PrintStream stream) {
-        if (throwable == null) {
-            return;
-        }
-        if (stream == null) {
-            throw new IllegalArgumentException("The PrintStream must not be null");
-        }
-        final String trace[] = getRootCauseStackTrace(throwable);
-        for (final String element : trace) {
-            stream.println(element);
-        }
-        stream.flush();
-    }
-
-    /**
-     * <p>Prints a compact stack trace for the root cause of a throwable.</p>
-     *
-     * <p>The compact stack trace starts with the root cause and prints
-     * stack frames up to the place where it was caught and wrapped.
-     * Then it prints the wrapped exception and continues with stack frames
-     * until the wrapper exception is caught and wrapped again, etc.</p>
-     *
-     * <p>The output of this method is consistent across JDK versions.
-     * Note that this is the opposite order to the JDK1.4 display.</p>
-     *
-     * <p>The method is equivalent to <code>printStackTrace</code> for throwables
-     * that don't have nested causes.</p>
-     *
-     * @param throwable  the throwable to output, may be null
-     * @param writer  the writer to output to, may not be null
-     * @throws IllegalArgumentException if the writer is <code>null</code>
-     * @since 2.0
-     */
-    public static void printRootCauseStackTrace(final Throwable throwable, final PrintWriter writer) {
-        if (throwable == null) {
-            return;
-        }
-        if (writer == null) {
-            throw new IllegalArgumentException("The PrintWriter must not be null");
-        }
-        final String trace[] = getRootCauseStackTrace(throwable);
-        for (final String element : trace) {
-            writer.println(element);
-        }
-        writer.flush();
-    }
-
-    //-----------------------------------------------------------------------
-    /**
-     * <p>Creates a compact stack trace for the root cause of the supplied
-     * <code>Throwable</code>.</p>
-     *
-     * <p>The output of this method is consistent across JDK versions.
-     * It consists of the root exception followed by each of its wrapping
-     * exceptions separated by '[wrapped]'. Note that this is the opposite
-     * order to the JDK1.4 display.</p>
-     *
-     * @param throwable  the throwable to examine, may be null
-     * @return an array of stack trace frames, never null
-     * @since 2.0
-     */
-    public static String[] getRootCauseStackTrace(final Throwable throwable) {
-        if (throwable == null) {
-            return ArrayUtils.EMPTY_STRING_ARRAY;
-        }
-        final Throwable throwables[] = getThrowables(throwable);
-        final int count = throwables.length;
-        final List<String> frames = new ArrayList<String>();
-        List<String> nextTrace = getStackFrameList(throwables[count - 1]);
-        for (int i = count; --i >= 0;) {
-            final List<String> trace = nextTrace;
-            if (i != 0) {
-                nextTrace = getStackFrameList(throwables[i - 1]);
-                removeCommonFrames(trace, nextTrace);
-            }
-            if (i == count - 1) {
-                frames.add(throwables[i].toString());
-            } else {
-                frames.add(WRAPPED_MARKER + throwables[i].toString());
-            }
-            for (int j = 0; j < trace.size(); j++) {
-                frames.add(trace.get(j));
-            }
-        }
-        return frames.toArray(new String[frames.size()]);
-    }
-
-    /**
-     * <p>Removes common frames from the cause trace given the two stack traces.</p>
-     *
-     * @param causeFrames  stack trace of a cause throwable
-     * @param wrapperFrames  stack trace of a wrapper throwable
-     * @throws IllegalArgumentException if either argument is null
-     * @since 2.0
-     */
-    public static void removeCommonFrames(final List<String> causeFrames, final List<String> wrapperFrames) {
-        if (causeFrames == null || wrapperFrames == null) {
-            throw new IllegalArgumentException("The List must not be null");
-        }
-        int causeFrameIndex = causeFrames.size() - 1;
-        int wrapperFrameIndex = wrapperFrames.size() - 1;
-        while (causeFrameIndex >= 0 && wrapperFrameIndex >= 0) {
-            // Remove the frame from the cause trace if it is the same
-            // as in the wrapper trace
-            final String causeFrame = causeFrames.get(causeFrameIndex);
-            final String wrapperFrame = wrapperFrames.get(wrapperFrameIndex);
-            if (causeFrame.equals(wrapperFrame)) {
-                causeFrames.remove(causeFrameIndex);
-            }
-            causeFrameIndex--;
-            wrapperFrameIndex--;
-        }
-    }
-
-    //-----------------------------------------------------------------------
-    /**
-     * <p>Gets the stack trace from a Throwable as a String.</p>
-     *
-     * <p>The result of this method vary by JDK version as this method
-     * uses {@link Throwable#printStackTrace(java.io.PrintWriter)}.
-     * On JDK1.3 and earlier, the cause exception will not be shown
-     * unless the specified throwable alters printStackTrace.</p>
-     *
-     * @param throwable  the <code>Throwable</code> to be examined
-     * @return the stack trace as generated by the exception's
-     *  <code>printStackTrace(PrintWriter)</code> method
-     */
-    public static String getStackTrace(final Throwable throwable) {
-        final StringWriter sw = new StringWriter();
-        final PrintWriter pw = new PrintWriter(sw, true);
-        throwable.printStackTrace(pw);
-        return sw.getBuffer().toString();
-    }
-
-    /**
-     * <p>Captures the stack trace associated with the specified
-     * <code>Throwable</code> object, decomposing it into a list of
-     * stack frames.</p>
-     *
-     * <p>The result of this method vary by JDK version as this method
-     * uses {@link Throwable#printStackTrace(java.io.PrintWriter)}.
-     * On JDK1.3 and earlier, the cause exception will not be shown
-     * unless the specified throwable alters printStackTrace.</p>
-     *
-     * @param throwable  the <code>Throwable</code> to examine, may be null
-     * @return an array of strings describing each stack frame, never null
-     */
-    public static String[] getStackFrames(final Throwable throwable) {
-        if (throwable == null) {
-            return ArrayUtils.EMPTY_STRING_ARRAY;
-        }
-        return getStackFrames(getStackTrace(throwable));
-    }
-
-    //-----------------------------------------------------------------------
-    /**
-     * <p>Returns an array where each element is a line from the argument.</p>
-     *
-     * <p>The end of line is determined by the value of {@link SystemUtils#LINE_SEPARATOR}.</p>
-     *
-     * @param stackTrace  a stack trace String
-     * @return an array where each element is a line from the argument
-     */
-    static String[] getStackFrames(final String stackTrace) {
-        final String linebreak = SystemUtils.LINE_SEPARATOR;
-        final StringTokenizer frames = new StringTokenizer(stackTrace, linebreak);
-        final List<String> list = new ArrayList<String>();
-        while (frames.hasMoreTokens()) {
-            list.add(frames.nextToken());
-        }
-        return list.toArray(new String[list.size()]);
-    }
-
-    /**
-     * <p>Produces a <code>List</code> of stack frames - the message
-     * is not included. Only the trace of the specified exception is
-     * returned, any caused by trace is stripped.</p>
-     *
-     * <p>This works in most cases - it will only fail if the exception
-     * message contains a line that starts with:
-     * <code>&quot;&nbsp;&nbsp;&nbsp;at&quot;.</code></p>
-     * 
-     * @param t is any throwable
-     * @return List of stack frames
-     */
-    static List<String> getStackFrameList(final Throwable t) {
-        final String stackTrace = getStackTrace(t);
-        final String linebreak = SystemUtils.LINE_SEPARATOR;
-        final StringTokenizer frames = new StringTokenizer(stackTrace, linebreak);
-        final List<String> list = new ArrayList<String>();
-        boolean traceStarted = false;
-        while (frames.hasMoreTokens()) {
-            final String token = frames.nextToken();
-            // Determine if the line starts with <whitespace>at
-            final int at = token.indexOf("at");
-            if (at != -1 && token.substring(0, at).trim().isEmpty()) {
-                traceStarted = true;
-                list.add(token);
-            } else if (traceStarted) {
-                break;
-            }
-        }
-        return list;
-    }
-
-    //-----------------------------------------------------------------------
-    /**
-     * Gets a short message summarising the exception.
-     * <p>
-     * The message returned is of the form
-     * {ClassNameWithoutPackage}: {ThrowableMessage}
-     *
-     * @param th  the throwable to get a message for, null returns empty string
-     * @return the message, non-null
-     * @since Commons Lang 2.2
-     */
-    public static String getMessage(final Throwable th) {
-        if (th == null) {
-            return "";
-        }
-        final String clsName = ClassUtils.getShortClassName(th, null);
-        final String msg = th.getMessage();
-        return clsName + ": " + StringUtils.defaultString(msg);
-    }
-
-    //-----------------------------------------------------------------------
-    /**
-     * Gets a short message summarising the root cause exception.
-     * <p>
-     * The message returned is of the form
-     * {ClassNameWithoutPackage}: {ThrowableMessage}
-     *
-     * @param th  the throwable to get a message for, null returns empty string
-     * @return the message, non-null
-     * @since Commons Lang 2.2
-     */
-    public static String getRootCauseMessage(final Throwable th) {
-        Throwable root = ExceptionUtils.getRootCause(th);
-        root = root == null ? th : root;
-        return getMessage(root);
-    }
-
-}
diff --git a/lang/src/main/java/org/apache/commons/lang3/exception/package-info.java b/lang/src/main/java/org/apache/commons/lang3/exception/package-info.java
deleted file mode 100644
index 713f608..0000000
--- a/lang/src/main/java/org/apache/commons/lang3/exception/package-info.java
+++ /dev/null
@@ -1,27 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-/**
- * <p>Provides functionality for Exceptions.</p>
- * <p>Contains the concept of an exception with context i.e. such an exception will contain a map with keys and values.
- * This provides an easy way to pass valuable state information at exception time in useful form to a calling process.</p>
- * <p>Lastly, {@link org.apache.commons.lang3.exception.ExceptionUtils} also contains <code>Throwable</code> manipulation
- * and examination routines.</p>
- *
- * @since 1.0
- * @version $Id$
- */
-package org.apache.commons.lang3.exception;
diff --git a/lang/src/main/java/org/apache/commons/lang3/math/Fraction.java b/lang/src/main/java/org/apache/commons/lang3/math/Fraction.java
deleted file mode 100644
index 100bd16..0000000
--- a/lang/src/main/java/org/apache/commons/lang3/math/Fraction.java
+++ /dev/null
@@ -1,942 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- * 
- *      http://www.apache.org/licenses/LICENSE-2.0
- * 
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.commons.lang3.math;
-
-import java.math.BigInteger;
-
-/**
- * <p><code>Fraction</code> is a <code>Number</code> implementation that
- * stores fractions accurately.</p>
- *
- * <p>This class is immutable, and interoperable with most methods that accept
- * a <code>Number</code>.</p>
- *
- * <p>Note that this class is intended for common use cases, it is <i>int</i>
- * based and thus suffers from various overflow issues. For a BigInteger based 
- * equivalent, please see the Commons Math BigFraction class. </p>
- *
- * @since 2.0
- * @version $Id$
- */
-public final class Fraction extends Number implements Comparable<Fraction> {
-
-    /**
-     * Required for serialization support. Lang version 2.0.
-     * 
-     * @see java.io.Serializable
-     */
-    private static final long serialVersionUID = 65382027393090L;
-
-    /**
-     * <code>Fraction</code> representation of 0.
-     */
-    public static final Fraction ZERO = new Fraction(0, 1);
-    /**
-     * <code>Fraction</code> representation of 1.
-     */
-    public static final Fraction ONE = new Fraction(1, 1);
-    /**
-     * <code>Fraction</code> representation of 1/2.
-     */
-    public static final Fraction ONE_HALF = new Fraction(1, 2);
-    /**
-     * <code>Fraction</code> representation of 1/3.
-     */
-    public static final Fraction ONE_THIRD = new Fraction(1, 3);
-    /**
-     * <code>Fraction</code> representation of 2/3.
-     */
-    public static final Fraction TWO_THIRDS = new Fraction(2, 3);
-    /**
-     * <code>Fraction</code> representation of 1/4.
-     */
-    public static final Fraction ONE_QUARTER = new Fraction(1, 4);
-    /**
-     * <code>Fraction</code> representation of 2/4.
-     */
-    public static final Fraction TWO_QUARTERS = new Fraction(2, 4);
-    /**
-     * <code>Fraction</code> representation of 3/4.
-     */
-    public static final Fraction THREE_QUARTERS = new Fraction(3, 4);
-    /**
-     * <code>Fraction</code> representation of 1/5.
-     */
-    public static final Fraction ONE_FIFTH = new Fraction(1, 5);
-    /**
-     * <code>Fraction</code> representation of 2/5.
-     */
-    public static final Fraction TWO_FIFTHS = new Fraction(2, 5);
-    /**
-     * <code>Fraction</code> representation of 3/5.
-     */
-    public static final Fraction THREE_FIFTHS = new Fraction(3, 5);
-    /**
-     * <code>Fraction</code> representation of 4/5.
-     */
-    public static final Fraction FOUR_FIFTHS = new Fraction(4, 5);
-
-
-    /**
-     * The numerator number part of the fraction (the three in three sevenths).
-     */
-    private final int numerator;
-    /**
-     * The denominator number part of the fraction (the seven in three sevenths).
-     */
-    private final int denominator;
-
-    /**
-     * Cached output hashCode (class is immutable).
-     */
-    private transient int hashCode = 0;
-    /**
-     * Cached output toString (class is immutable).
-     */
-    private transient String toString = null;
-    /**
-     * Cached output toProperString (class is immutable).
-     */
-    private transient String toProperString = null;
-
-    /**
-     * <p>Constructs a <code>Fraction</code> instance with the 2 parts
-     * of a fraction Y/Z.</p>
-     *
-     * @param numerator  the numerator, for example the three in 'three sevenths'
-     * @param denominator  the denominator, for example the seven in 'three sevenths'
-     */
-    private Fraction(final int numerator, final int denominator) {
-        super();
-        this.numerator = numerator;
-        this.denominator = denominator;
-    }
-
-    /**
-     * <p>Creates a <code>Fraction</code> instance with the 2 parts
-     * of a fraction Y/Z.</p>
-     *
-     * <p>Any negative signs are resolved to be on the numerator.</p>
-     *
-     * @param numerator  the numerator, for example the three in 'three sevenths'
-     * @param denominator  the denominator, for example the seven in 'three sevenths'
-     * @return a new fraction instance
-     * @throws ArithmeticException if the denominator is <code>zero</code>
-     * or the denominator is {@code negative} and the numerator is {@code Integer#MIN_VALUE}
-     */
-    public static Fraction getFraction(int numerator, int denominator) {
-        if (denominator == 0) {
-            throw new ArithmeticException("The denominator must not be zero");
-        }
-        if (denominator < 0) {
-            if (numerator == Integer.MIN_VALUE || denominator == Integer.MIN_VALUE) {
-                throw new ArithmeticException("overflow: can't negate");
-            }
-            numerator = -numerator;
-            denominator = -denominator;
-        }
-        return new Fraction(numerator, denominator);
-    }
-
-    /**
-     * <p>Creates a <code>Fraction</code> instance with the 3 parts
-     * of a fraction X Y/Z.</p>
-     *
-     * <p>The negative sign must be passed in on the whole number part.</p>
-     *
-     * @param whole  the whole number, for example the one in 'one and three sevenths'
-     * @param numerator  the numerator, for example the three in 'one and three sevenths'
-     * @param denominator  the denominator, for example the seven in 'one and three sevenths'
-     * @return a new fraction instance
-     * @throws ArithmeticException if the denominator is <code>zero</code>
-     * @throws ArithmeticException if the denominator is negative
-     * @throws ArithmeticException if the numerator is negative
-     * @throws ArithmeticException if the resulting numerator exceeds 
-     *  <code>Integer.MAX_VALUE</code>
-     */
-    public static Fraction getFraction(final int whole, final int numerator, final int denominator) {
-        if (denominator == 0) {
-            throw new ArithmeticException("The denominator must not be zero");
-        }
-        if (denominator < 0) {
-            throw new ArithmeticException("The denominator must not be negative");
-        }
-        if (numerator < 0) {
-            throw new ArithmeticException("The numerator must not be negative");
-        }
-        long numeratorValue;
-        if (whole < 0) {
-            numeratorValue = whole * (long) denominator - numerator;
-        } else {
-            numeratorValue = whole * (long) denominator + numerator;
-        }
-        if (numeratorValue < Integer.MIN_VALUE || numeratorValue > Integer.MAX_VALUE) {
-            throw new ArithmeticException("Numerator too large to represent as an Integer.");
-        }
-        return new Fraction((int) numeratorValue, denominator);
-    }
-
-    /**
-     * <p>Creates a reduced <code>Fraction</code> instance with the 2 parts
-     * of a fraction Y/Z.</p>
-     *
-     * <p>For example, if the input parameters represent 2/4, then the created
-     * fraction will be 1/2.</p>
-     *
-     * <p>Any negative signs are resolved to be on the numerator.</p>
-     *
-     * @param numerator  the numerator, for example the three in 'three sevenths'
-     * @param denominator  the denominator, for example the seven in 'three sevenths'
-     * @return a new fraction instance, with the numerator and denominator reduced
-     * @throws ArithmeticException if the denominator is <code>zero</code>
-     */
-    public static Fraction getReducedFraction(int numerator, int denominator) {
-        if (denominator == 0) {
-            throw new ArithmeticException("The denominator must not be zero");
-        }
-        if (numerator == 0) {
-            return ZERO; // normalize zero.
-        }
-        // allow 2^k/-2^31 as a valid fraction (where k>0)
-        if (denominator == Integer.MIN_VALUE && (numerator & 1) == 0) {
-            numerator /= 2;
-            denominator /= 2;
-        }
-        if (denominator < 0) {
-            if (numerator == Integer.MIN_VALUE || denominator == Integer.MIN_VALUE) {
-                throw new ArithmeticException("overflow: can't negate");
-            }
-            numerator = -numerator;
-            denominator = -denominator;
-        }
-        // simplify fraction.
-        final int gcd = greatestCommonDivisor(numerator, denominator);
-        numerator /= gcd;
-        denominator /= gcd;
-        return new Fraction(numerator, denominator);
-    }
-
-    /**
-     * <p>Creates a <code>Fraction</code> instance from a <code>double</code> value.</p>
-     *
-     * <p>This method uses the <a href="http://archives.math.utk.edu/articles/atuyl/confrac/">
-     *  continued fraction algorithm</a>, computing a maximum of
-     *  25 convergents and bounding the denominator by 10,000.</p>
-     *
-     * @param value  the double value to convert
-     * @return a new fraction instance that is close to the value
-     * @throws ArithmeticException if <code>|value| &gt; Integer.MAX_VALUE</code> 
-     *  or <code>value = NaN</code>
-     * @throws ArithmeticException if the calculated denominator is <code>zero</code>
-     * @throws ArithmeticException if the the algorithm does not converge
-     */
-    public static Fraction getFraction(double value) {
-        final int sign = value < 0 ? -1 : 1;
-        value = Math.abs(value);
-        if (value > Integer.MAX_VALUE || Double.isNaN(value)) {
-            throw new ArithmeticException("The value must not be greater than Integer.MAX_VALUE or NaN");
-        }
-        final int wholeNumber = (int) value;
-        value -= wholeNumber;
-
-        int numer0 = 0; // the pre-previous
-        int denom0 = 1; // the pre-previous
-        int numer1 = 1; // the previous
-        int denom1 = 0; // the previous
-        int numer2 = 0; // the current, setup in calculation
-        int denom2 = 0; // the current, setup in calculation
-        int a1 = (int) value;
-        int a2 = 0;
-        double x1 = 1;
-        double x2 = 0;
-        double y1 = value - a1;
-        double y2 = 0;
-        double delta1, delta2 = Double.MAX_VALUE;
-        double fraction;
-        int i = 1;
-        // System.out.println("---");
-        do {
-            delta1 = delta2;
-            a2 = (int) (x1 / y1);
-            x2 = y1;
-            y2 = x1 - a2 * y1;
-            numer2 = a1 * numer1 + numer0;
-            denom2 = a1 * denom1 + denom0;
-            fraction = (double) numer2 / (double) denom2;
-            delta2 = Math.abs(value - fraction);
-            // System.out.println(numer2 + " " + denom2 + " " + fraction + " " + delta2 + " " + y1);
-            a1 = a2;
-            x1 = x2;
-            y1 = y2;
-            numer0 = numer1;
-            denom0 = denom1;
-            numer1 = numer2;
-            denom1 = denom2;
-            i++;
-            // System.out.println(">>" + delta1 +" "+ delta2+" "+(delta1 > delta2)+" "+i+" "+denom2);
-        } while (delta1 > delta2 && denom2 <= 10000 && denom2 > 0 && i < 25);
-        if (i == 25) {
-            throw new ArithmeticException("Unable to convert double to fraction");
-        }
-        return getReducedFraction((numer0 + wholeNumber * denom0) * sign, denom0);
-    }
-
-    /**
-     * <p>Creates a Fraction from a <code>String</code>.</p>
-     *
-     * <p>The formats accepted are:</p>
-     *
-     * <ol>
-     *  <li><code>double</code> String containing a dot</li>
-     *  <li>'X Y/Z'</li>
-     *  <li>'Y/Z'</li>
-     *  <li>'X' (a simple whole number)</li>
-     * </ol>
-     * <p>and a .</p>
-     *
-     * @param str  the string to parse, must not be <code>null</code>
-     * @return the new <code>Fraction</code> instance
-     * @throws IllegalArgumentException if the string is <code>null</code>
-     * @throws NumberFormatException if the number format is invalid
-     */
-    public static Fraction getFraction(String str) {
-        if (str == null) {
-            throw new IllegalArgumentException("The string must not be null");
-        }
-        // parse double format
-        int pos = str.indexOf('.');
-        if (pos >= 0) {
-            return getFraction(Double.parseDouble(str));
-        }
-
-        // parse X Y/Z format
-        pos = str.indexOf(' ');
-        if (pos > 0) {
-            final int whole = Integer.parseInt(str.substring(0, pos));
-            str = str.substring(pos + 1);
-            pos = str.indexOf('/');
-            if (pos < 0) {
-                throw new NumberFormatException("The fraction could not be parsed as the format X Y/Z");
-            }
-            final int numer = Integer.parseInt(str.substring(0, pos));
-            final int denom = Integer.parseInt(str.substring(pos + 1));
-            return getFraction(whole, numer, denom);
-        }
-
-        // parse Y/Z format
-        pos = str.indexOf('/');
-        if (pos < 0) {
-            // simple whole number
-            return getFraction(Integer.parseInt(str), 1);
-        }
-        final int numer = Integer.parseInt(str.substring(0, pos));
-        final int denom = Integer.parseInt(str.substring(pos + 1));
-        return getFraction(numer, denom);
-    }
-
-    // Accessors
-    //-------------------------------------------------------------------
-
-    /**
-     * <p>Gets the numerator part of the fraction.</p>
-     *
-     * <p>This method may return a value greater than the denominator, an
-     * improper fraction, such as the seven in 7/4.</p>
-     *
-     * @return the numerator fraction part
-     */
-    public int getNumerator() {
-        return numerator;
-    }
-
-    /**
-     * <p>Gets the denominator part of the fraction.</p>
-     *
-     * @return the denominator fraction part
-     */
-    public int getDenominator() {
-        return denominator;
-    }
-
-    /**
-     * <p>Gets the proper numerator, always positive.</p>
-     *
-     * <p>An improper fraction 7/4 can be resolved into a proper one, 1 3/4.
-     * This method returns the 3 from the proper fraction.</p>
-     *
-     * <p>If the fraction is negative such as -7/4, it can be resolved into
-     * -1 3/4, so this method returns the positive proper numerator, 3.</p>
-     *
-     * @return the numerator fraction part of a proper fraction, always positive
-     */
-    public int getProperNumerator() {
-        return Math.abs(numerator % denominator);
-    }
-
-    /**
-     * <p>Gets the proper whole part of the fraction.</p>
-     *
-     * <p>An improper fraction 7/4 can be resolved into a proper one, 1 3/4.
-     * This method returns the 1 from the proper fraction.</p>
-     *
-     * <p>If the fraction is negative such as -7/4, it can be resolved into
-     * -1 3/4, so this method returns the positive whole part -1.</p>
-     *
-     * @return the whole fraction part of a proper fraction, that includes the sign
-     */
-    public int getProperWhole() {
-        return numerator / denominator;
-    }
-
-    // Number methods
-    //-------------------------------------------------------------------
-
-    /**
-     * <p>Gets the fraction as an <code>int</code>. This returns the whole number
-     * part of the fraction.</p>
-     *
-     * @return the whole number fraction part
-     */
-    @Override
-    public int intValue() {
-        return numerator / denominator;
-    }
-
-    /**
-     * <p>Gets the fraction as a <code>long</code>. This returns the whole number
-     * part of the fraction.</p>
-     *
-     * @return the whole number fraction part
-     */
-    @Override
-    public long longValue() {
-        return (long) numerator / denominator;
-    }
-
-    /**
-     * <p>Gets the fraction as a <code>float</code>. This calculates the fraction
-     * as the numerator divided by denominator.</p>
-     *
-     * @return the fraction as a <code>float</code>
-     */
-    @Override
-    public float floatValue() {
-        return (float) numerator / (float) denominator;
-    }
-
-    /**
-     * <p>Gets the fraction as a <code>double</code>. This calculates the fraction
-     * as the numerator divided by denominator.</p>
-     *
-     * @return the fraction as a <code>double</code>
-     */
-    @Override
-    public double doubleValue() {
-        return (double) numerator / (double) denominator;
-    }
-
-    // Calculations
-    //-------------------------------------------------------------------
-
-    /**
-     * <p>Reduce the fraction to the smallest values for the numerator and
-     * denominator, returning the result.</p>
-     * 
-     * <p>For example, if this fraction represents 2/4, then the result
-     * will be 1/2.</p>
-     *
-     * @return a new reduced fraction instance, or this if no simplification possible
-     */
-    public Fraction reduce() {
-        if (numerator == 0) {
-            return equals(ZERO) ? this : ZERO;
-        }
-        final int gcd = greatestCommonDivisor(Math.abs(numerator), denominator);
-        if (gcd == 1) {
-            return this;
-        }
-        return Fraction.getFraction(numerator / gcd, denominator / gcd);
-    }
-
-    /**
-     * <p>Gets a fraction that is the inverse (1/fraction) of this one.</p>
-     * 
-     * <p>The returned fraction is not reduced.</p>
-     *
-     * @return a new fraction instance with the numerator and denominator
-     *         inverted.
-     * @throws ArithmeticException if the fraction represents zero.
-     */
-    public Fraction invert() {
-        if (numerator == 0) {
-            throw new ArithmeticException("Unable to invert zero.");
-        }
-        if (numerator==Integer.MIN_VALUE) {
-            throw new ArithmeticException("overflow: can't negate numerator");
-        }
-        if (numerator<0) {
-            return new Fraction(-denominator, -numerator);
-        }
-        return new Fraction(denominator, numerator);
-    }
-
-    /**
-     * <p>Gets a fraction that is the negative (-fraction) of this one.</p>
-     *
-     * <p>The returned fraction is not reduced.</p>
-     *
-     * @return a new fraction instance with the opposite signed numerator
-     */
-    public Fraction negate() {
-        // the positive range is one smaller than the negative range of an int.
-        if (numerator==Integer.MIN_VALUE) {
-            throw new ArithmeticException("overflow: too large to negate");
-        }
-        return new Fraction(-numerator, denominator);
-    }
-
-    /**
-     * <p>Gets a fraction that is the positive equivalent of this one.</p>
-     * <p>More precisely: <code>(fraction &gt;= 0 ? this : -fraction)</code></p>
-     *
-     * <p>The returned fraction is not reduced.</p>
-     *
-     * @return <code>this</code> if it is positive, or a new positive fraction
-     *  instance with the opposite signed numerator
-     */
-    public Fraction abs() {
-        if (numerator >= 0) {
-            return this;
-        }
-        return negate();
-    }
-
-    /**
-     * <p>Gets a fraction that is raised to the passed in power.</p>
-     *
-     * <p>The returned fraction is in reduced form.</p>
-     *
-     * @param power  the power to raise the fraction to
-     * @return <code>this</code> if the power is one, <code>ONE</code> if the power
-     * is zero (even if the fraction equals ZERO) or a new fraction instance 
-     * raised to the appropriate power
-     * @throws ArithmeticException if the resulting numerator or denominator exceeds
-     *  <code>Integer.MAX_VALUE</code>
-     */
-    public Fraction pow(final int power) {
-        if (power == 1) {
-            return this;
-        } else if (power == 0) {
-            return ONE;
-        } else if (power < 0) {
-            if (power == Integer.MIN_VALUE) { // MIN_VALUE can't be negated.
-                return this.invert().pow(2).pow(-(power / 2));
-            }
-            return this.invert().pow(-power);
-        } else {
-            final Fraction f = this.multiplyBy(this);
-            if (power % 2 == 0) { // if even...
-                return f.pow(power / 2);
-            }
-            return f.pow(power / 2).multiplyBy(this);
-        }
-    }
-
-    /**
-     * <p>Gets the greatest common divisor of the absolute value of
-     * two numbers, using the "binary gcd" method which avoids
-     * division and modulo operations.  See Knuth 4.5.2 algorithm B.
-     * This algorithm is due to Josef Stein (1961).</p>
-     *
-     * @param u  a non-zero number
-     * @param v  a non-zero number
-     * @return the greatest common divisor, never zero
-     */
-    private static int greatestCommonDivisor(int u, int v) {
-        // From Commons Math:
-        if (u == 0 || v == 0) {
-            if (u == Integer.MIN_VALUE || v == Integer.MIN_VALUE) {
-                throw new ArithmeticException("overflow: gcd is 2^31");
-            }
-            return Math.abs(u) + Math.abs(v);
-        }
-        // if either operand is abs 1, return 1:
-        if (Math.abs(u) == 1 || Math.abs(v) == 1) {
-            return 1;
-        }
-        // keep u and v negative, as negative integers range down to
-        // -2^31, while positive numbers can only be as large as 2^31-1
-        // (i.e. we can't necessarily negate a negative number without
-        // overflow)
-        if (u > 0) {
-            u = -u;
-        } // make u negative
-        if (v > 0) {
-            v = -v;
-        } // make v negative
-        // B1. [Find power of 2]
-        int k = 0;
-        while ((u & 1) == 0 && (v & 1) == 0 && k < 31) { // while u and v are both even...
-            u /= 2;
-            v /= 2;
-            k++; // cast out twos.
-        }
-        if (k == 31) {
-            throw new ArithmeticException("overflow: gcd is 2^31");
-        }
-        // B2. Initialize: u and v have been divided by 2^k and at least
-        // one is odd.
-        int t = (u & 1) == 1 ? v : -(u / 2)/* B3 */;
-        // t negative: u was odd, v may be even (t replaces v)
-        // t positive: u was even, v is odd (t replaces u)
-        do {
-            /* assert u<0 && v<0; */
-            // B4/B3: cast out twos from t.
-            while ((t & 1) == 0) { // while t is even..
-                t /= 2; // cast out twos
-            }
-            // B5 [reset max(u,v)]
-            if (t > 0) {
-                u = -t;
-            } else {
-                v = t;
-            }
-            // B6/B3. at this point both u and v should be odd.
-            t = (v - u) / 2;
-            // |u| larger: t positive (replace u)
-            // |v| larger: t negative (replace v)
-        } while (t != 0);
-        return -u * (1 << k); // gcd is u*2^k
-    }
-
-    // Arithmetic
-    //-------------------------------------------------------------------
-
-    /** 
-     * Multiply two integers, checking for overflow.
-     * 
-     * @param x a factor
-     * @param y a factor
-     * @return the product <code>x*y</code>
-     * @throws ArithmeticException if the result can not be represented as
-     *                             an int
-     */
-    private static int mulAndCheck(final int x, final int y) {
-        final long m = (long) x * (long) y;
-        if (m < Integer.MIN_VALUE || m > Integer.MAX_VALUE) {
-            throw new ArithmeticException("overflow: mul");
-        }
-        return (int) m;
-    }
-    
-    /**
-     *  Multiply two non-negative integers, checking for overflow.
-     * 
-     * @param x a non-negative factor
-     * @param y a non-negative factor
-     * @return the product <code>x*y</code>
-     * @throws ArithmeticException if the result can not be represented as
-     * an int
-     */
-    private static int mulPosAndCheck(final int x, final int y) {
-        /* assert x>=0 && y>=0; */
-        final long m = (long) x * (long) y;
-        if (m > Integer.MAX_VALUE) {
-            throw new ArithmeticException("overflow: mulPos");
-        }
-        return (int) m;
-    }
-    
-    /** 
-     * Add two integers, checking for overflow.
-     * 
-     * @param x an addend
-     * @param y an addend
-     * @return the sum <code>x+y</code>
-     * @throws ArithmeticException if the result can not be represented as
-     * an int
-     */
-    private static int addAndCheck(final int x, final int y) {
-        final long s = (long) x + (long) y;
-        if (s < Integer.MIN_VALUE || s > Integer.MAX_VALUE) {
-            throw new ArithmeticException("overflow: add");
-        }
-        return (int) s;
-    }
-    
-    /** 
-     * Subtract two integers, checking for overflow.
-     * 
-     * @param x the minuend
-     * @param y the subtrahend
-     * @return the difference <code>x-y</code>
-     * @throws ArithmeticException if the result can not be represented as
-     * an int
-     */
-    private static int subAndCheck(final int x, final int y) {
-        final long s = (long) x - (long) y;
-        if (s < Integer.MIN_VALUE || s > Integer.MAX_VALUE) {
-            throw new ArithmeticException("overflow: add");
-        }
-        return (int) s;
-    }
-    
-    /**
-     * <p>Adds the value of this fraction to another, returning the result in reduced form.
-     * The algorithm follows Knuth, 4.5.1.</p>
-     *
-     * @param fraction  the fraction to add, must not be <code>null</code>
-     * @return a <code>Fraction</code> instance with the resulting values
-     * @throws IllegalArgumentException if the fraction is <code>null</code>
-     * @throws ArithmeticException if the resulting numerator or denominator exceeds
-     *  <code>Integer.MAX_VALUE</code>
-     */
-    public Fraction add(final Fraction fraction) {
-        return addSub(fraction, true /* add */);
-    }
-
-    /**
-     * <p>Subtracts the value of another fraction from the value of this one, 
-     * returning the result in reduced form.</p>
-     *
-     * @param fraction  the fraction to subtract, must not be <code>null</code>
-     * @return a <code>Fraction</code> instance with the resulting values
-     * @throws IllegalArgumentException if the fraction is <code>null</code>
-     * @throws ArithmeticException if the resulting numerator or denominator
-     *   cannot be represented in an <code>int</code>.
-     */
-    public Fraction subtract(final Fraction fraction) {
-        return addSub(fraction, false /* subtract */);
-    }
-
-    /** 
-     * Implement add and subtract using algorithm described in Knuth 4.5.1.
-     * 
-     * @param fraction the fraction to subtract, must not be <code>null</code>
-     * @param isAdd true to add, false to subtract
-     * @return a <code>Fraction</code> instance with the resulting values
-     * @throws IllegalArgumentException if the fraction is <code>null</code>
-     * @throws ArithmeticException if the resulting numerator or denominator
-     *   cannot be represented in an <code>int</code>.
-     */
-    private Fraction addSub(final Fraction fraction, final boolean isAdd) {
-        if (fraction == null) {
-            throw new IllegalArgumentException("The fraction must not be null");
-        }
-        // zero is identity for addition.
-        if (numerator == 0) {
-            return isAdd ? fraction : fraction.negate();
-        }
-        if (fraction.numerator == 0) {
-            return this;
-        }
-        // if denominators are randomly distributed, d1 will be 1 about 61%
-        // of the time.
-        final int d1 = greatestCommonDivisor(denominator, fraction.denominator);
-        if (d1 == 1) {
-            // result is ( (u*v' +/- u'v) / u'v')
-            final int uvp = mulAndCheck(numerator, fraction.denominator);
-            final int upv = mulAndCheck(fraction.numerator, denominator);
-            return new Fraction(isAdd ? addAndCheck(uvp, upv) : subAndCheck(uvp, upv), mulPosAndCheck(denominator,
-                    fraction.denominator));
-        }
-        // the quantity 't' requires 65 bits of precision; see knuth 4.5.1
-        // exercise 7. we're going to use a BigInteger.
-        // t = u(v'/d1) +/- v(u'/d1)
-        final BigInteger uvp = BigInteger.valueOf(numerator).multiply(BigInteger.valueOf(fraction.denominator / d1));
-        final BigInteger upv = BigInteger.valueOf(fraction.numerator).multiply(BigInteger.valueOf(denominator / d1));
-        final BigInteger t = isAdd ? uvp.add(upv) : uvp.subtract(upv);
-        // but d2 doesn't need extra precision because
-        // d2 = gcd(t,d1) = gcd(t mod d1, d1)
-        final int tmodd1 = t.mod(BigInteger.valueOf(d1)).intValue();
-        final int d2 = tmodd1 == 0 ? d1 : greatestCommonDivisor(tmodd1, d1);
-
-        // result is (t/d2) / (u'/d1)(v'/d2)
-        final BigInteger w = t.divide(BigInteger.valueOf(d2));
-        if (w.bitLength() > 31) {
-            throw new ArithmeticException("overflow: numerator too large after multiply");
-        }
-        return new Fraction(w.intValue(), mulPosAndCheck(denominator / d1, fraction.denominator / d2));
-    }
-
-    /**
-     * <p>Multiplies the value of this fraction by another, returning the 
-     * result in reduced form.</p>
-     *
-     * @param fraction  the fraction to multiply by, must not be <code>null</code>
-     * @return a <code>Fraction</code> instance with the resulting values
-     * @throws IllegalArgumentException if the fraction is <code>null</code>
-     * @throws ArithmeticException if the resulting numerator or denominator exceeds
-     *  <code>Integer.MAX_VALUE</code>
-     */
-    public Fraction multiplyBy(final Fraction fraction) {
-        if (fraction == null) {
-            throw new IllegalArgumentException("The fraction must not be null");
-        }
-        if (numerator == 0 || fraction.numerator == 0) {
-            return ZERO;
-        }
-        // knuth 4.5.1
-        // make sure we don't overflow unless the result *must* overflow.
-        final int d1 = greatestCommonDivisor(numerator, fraction.denominator);
-        final int d2 = greatestCommonDivisor(fraction.numerator, denominator);
-        return getReducedFraction(mulAndCheck(numerator / d1, fraction.numerator / d2),
-                mulPosAndCheck(denominator / d2, fraction.denominator / d1));
-    }
-
-    /**
-     * <p>Divide the value of this fraction by another.</p>
-     *
-     * @param fraction  the fraction to divide by, must not be <code>null</code>
-     * @return a <code>Fraction</code> instance with the resulting values
-     * @throws IllegalArgumentException if the fraction is <code>null</code>
-     * @throws ArithmeticException if the fraction to divide by is zero
-     * @throws ArithmeticException if the resulting numerator or denominator exceeds
-     *  <code>Integer.MAX_VALUE</code>
-     */
-    public Fraction divideBy(final Fraction fraction) {
-        if (fraction == null) {
-            throw new IllegalArgumentException("The fraction must not be null");
-        }
-        if (fraction.numerator == 0) {
-            throw new ArithmeticException("The fraction to divide by must not be zero");
-        }
-        return multiplyBy(fraction.invert());
-    }
-
-    // Basics
-    //-------------------------------------------------------------------
-
-    /**
-     * <p>Compares this fraction to another object to test if they are equal.</p>.
-     *
-     * <p>To be equal, both values must be equal. Thus 2/4 is not equal to 1/2.</p>
-     *
-     * @param obj the reference object with which to compare
-     * @return <code>true</code> if this object is equal
-     */
-    @Override
-    public boolean equals(final Object obj) {
-        if (obj == this) {
-            return true;
-        }
-        if (obj instanceof Fraction == false) {
-            return false;
-        }
-        final Fraction other = (Fraction) obj;
-        return getNumerator() == other.getNumerator() && getDenominator() == other.getDenominator();
-    }
-
-    /**
-     * <p>Gets a hashCode for the fraction.</p>
-     *
-     * @return a hash code value for this object
-     */
-    @Override
-    public int hashCode() {
-        if (hashCode == 0) {
-            // hashcode update should be atomic.
-            hashCode = 37 * (37 * 17 + getNumerator()) + getDenominator();
-        }
-        return hashCode;
-    }
-
-    /**
-     * <p>Compares this object to another based on size.</p>
-     *
-     * <p>Note: this class has a natural ordering that is inconsistent
-     * with equals, because, for example, equals treats 1/2 and 2/4 as
-     * different, whereas compareTo treats them as equal.
-     *
-     * @param other  the object to compare to
-     * @return -1 if this is less, 0 if equal, +1 if greater
-     * @throws ClassCastException if the object is not a <code>Fraction</code>
-     * @throws NullPointerException if the object is <code>null</code>
-     */
-    @Override
-    public int compareTo(final Fraction other) {
-        if (this == other) {
-            return 0;
-        }
-        if (numerator == other.numerator && denominator == other.denominator) {
-            return 0;
-        }
-
-        // otherwise see which is less
-        final long first = (long) numerator * (long) other.denominator;
-        final long second = (long) other.numerator * (long) denominator;
-        if (first == second) {
-            return 0;
-        } else if (first < second) {
-            return -1;
-        } else {
-            return 1;
-        }
-    }
-
-    /**
-     * <p>Gets the fraction as a <code>String</code>.</p>
-     *
-     * <p>The format used is '<i>numerator</i>/<i>denominator</i>' always.
-     *
-     * @return a <code>String</code> form of the fraction
-     */
-    @Override
-    public String toString() {
-        if (toString == null) {
-            toString = new StringBuilder(32).append(getNumerator()).append('/').append(getDenominator()).toString();
-        }
-        return toString;
-    }
-
-    /**
-     * <p>Gets the fraction as a proper <code>String</code> in the format X Y/Z.</p>
-     *
-     * <p>The format used in '<i>wholeNumber</i> <i>numerator</i>/<i>denominator</i>'.
-     * If the whole number is zero it will be omitted. If the numerator is zero,
-     * only the whole number is returned.</p>
-     *
-     * @return a <code>String</code> form of the fraction
-     */
-    public String toProperString() {
-        if (toProperString == null) {
-            if (numerator == 0) {
-                toProperString = "0";
-            } else if (numerator == denominator) {
-                toProperString = "1";
-            } else if (numerator == -1 * denominator) {
-                toProperString = "-1";
-            } else if ((numerator > 0 ? -numerator : numerator) < -denominator) {
-                // note that we do the magnitude comparison test above with
-                // NEGATIVE (not positive) numbers, since negative numbers
-                // have a larger range. otherwise numerator==Integer.MIN_VALUE
-                // is handled incorrectly.
-                final int properNumerator = getProperNumerator();
-                if (properNumerator == 0) {
-                    toProperString = Integer.toString(getProperWhole());
-                } else {
-                    toProperString = new StringBuilder(32).append(getProperWhole()).append(' ').append(properNumerator)
-                            .append('/').append(getDenominator()).toString();
-                }
-            } else {
-                toProperString = new StringBuilder(32).append(getNumerator()).append('/').append(getDenominator())
-                        .toString();
-            }
-        }
-        return toProperString;
-    }
-}
diff --git a/lang/src/main/java/org/apache/commons/lang3/math/IEEE754rUtils.java b/lang/src/main/java/org/apache/commons/lang3/math/IEEE754rUtils.java
deleted file mode 100644
index a32ce47..0000000
--- a/lang/src/main/java/org/apache/commons/lang3/math/IEEE754rUtils.java
+++ /dev/null
@@ -1,268 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- * 
- *      http://www.apache.org/licenses/LICENSE-2.0
- * 
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.commons.lang3.math;
-
-import org.apache.commons.lang3.Validate;
-
-/**
- * <p>Provides IEEE-754r variants of NumberUtils methods. </p>
- *
- * <p>See: <a href="http://en.wikipedia.org/wiki/IEEE_754r">http://en.wikipedia.org/wiki/IEEE_754r</a></p>
- *
- * @since 2.4
- * @version $Id$
- */
-public class IEEE754rUtils {
-    
-     /**
-     * <p>Returns the minimum value in an array.</p>
-     * 
-     * @param array  an array, must not be null or empty
-     * @return the minimum value in the array
-     * @throws IllegalArgumentException if <code>array</code> is <code>null</code>
-     * @throws IllegalArgumentException if <code>array</code> is empty
-      * @since 3.4 Changed signature from min(double[]) to min(double...)
-     */
-    public static double min(final double... array) {
-        // Validates input
-        if (array == null) {
-            throw new IllegalArgumentException("The Array must not be null");
-        } 
-        Validate.isTrue(array.length != 0, "Array cannot be empty.");
-        
-    
-        // Finds and returns min
-        double min = array[0];
-        for (int i = 1; i < array.length; i++) {
-            min = min(array[i], min);
-        }
-    
-        return min;
-    }
-
-    /**
-     * <p>Returns the minimum value in an array.</p>
-     * 
-     * @param array  an array, must not be null or empty
-     * @return the minimum value in the array
-     * @throws IllegalArgumentException if <code>array</code> is <code>null</code>
-     * @throws IllegalArgumentException if <code>array</code> is empty
-     * @since 3.4 Changed signature from min(float[]) to min(float...)
-     */
-    public static float min(final float... array) {
-        // Validates input
-        if (array == null) {
-            throw new IllegalArgumentException("The Array must not be null");
-        } 
-        Validate.isTrue(array.length != 0, "Array cannot be empty.");
-        
-        // Finds and returns min
-        float min = array[0];
-        for (int i = 1; i < array.length; i++) {
-            min = min(array[i], min);
-        }
-    
-        return min;
-    }
-
-    /**
-     * <p>Gets the minimum of three <code>double</code> values.</p>
-     * 
-     * <p>NaN is only returned if all numbers are NaN as per IEEE-754r. </p>
-     * 
-     * @param a  value 1
-     * @param b  value 2
-     * @param c  value 3
-     * @return  the smallest of the values
-     */
-    public static double min(final double a, final double b, final double c) {
-        return min(min(a, b), c);
-    }
-
-    /**
-     * <p>Gets the minimum of two <code>double</code> values.</p>
-     * 
-     * <p>NaN is only returned if all numbers are NaN as per IEEE-754r. </p>
-     * 
-     * @param a  value 1
-     * @param b  value 2
-     * @return  the smallest of the values
-     */
-    public static double min(final double a, final double b) {
-        if(Double.isNaN(a)) {
-            return b;
-        } else
-        if(Double.isNaN(b)) {
-            return a;
-        } else {
-            return Math.min(a, b);
-        }
-    }
-
-    /**
-     * <p>Gets the minimum of three <code>float</code> values.</p>
-     * 
-     * <p>NaN is only returned if all numbers are NaN as per IEEE-754r. </p>
-     *
-     * @param a  value 1
-     * @param b  value 2
-     * @param c  value 3
-     * @return  the smallest of the values
-     */
-    public static float min(final float a, final float b, final float c) {
-        return min(min(a, b), c);
-    }
-
-    /**
-     * <p>Gets the minimum of two <code>float</code> values.</p>
-     * 
-     * <p>NaN is only returned if all numbers are NaN as per IEEE-754r. </p>
-     *
-     * @param a  value 1
-     * @param b  value 2
-     * @return  the smallest of the values
-     */
-    public static float min(final float a, final float b) {
-        if(Float.isNaN(a)) {
-            return b;
-        } else
-        if(Float.isNaN(b)) {
-            return a;
-        } else {
-            return Math.min(a, b);
-        }
-    }
-
-    /**
-     * <p>Returns the maximum value in an array.</p>
-     * 
-     * @param array  an array, must not be null or empty
-     * @return the minimum value in the array
-     * @throws IllegalArgumentException if <code>array</code> is <code>null</code>
-     * @throws IllegalArgumentException if <code>array</code> is empty
-     * @since 3.4 Changed signature from max(double[]) to max(double...)
-     */
-    public static double max(final double... array) {
-        // Validates input
-        if (array== null) {
-            throw new IllegalArgumentException("The Array must not be null");
-        }         
-        Validate.isTrue(array.length != 0, "Array cannot be empty.");
-        
-        // Finds and returns max
-        double max = array[0];
-        for (int j = 1; j < array.length; j++) {
-            max = max(array[j], max);
-        }
-    
-        return max;
-    }
-
-    /**
-     * <p>Returns the maximum value in an array.</p>
-     * 
-     * @param array  an array, must not be null or empty
-     * @return the minimum value in the array
-     * @throws IllegalArgumentException if <code>array</code> is <code>null</code>
-     * @throws IllegalArgumentException if <code>array</code> is empty
-     * @since 3.4 Changed signature from max(float[]) to max(float...)
-     */
-    public static float max(final float... array) {
-        // Validates input
-        if (array == null) {
-            throw new IllegalArgumentException("The Array must not be null");
-        } 
-        Validate.isTrue(array.length != 0, "Array cannot be empty.");
-        
-        // Finds and returns max
-        float max = array[0];
-        for (int j = 1; j < array.length; j++) {
-            max = max(array[j], max);
-        }
-
-        return max;
-    }
-     
-    /**
-     * <p>Gets the maximum of three <code>double</code> values.</p>
-     * 
-     * <p>NaN is only returned if all numbers are NaN as per IEEE-754r. </p>
-     *
-     * @param a  value 1
-     * @param b  value 2
-     * @param c  value 3
-     * @return  the largest of the values
-     */
-    public static double max(final double a, final double b, final double c) {
-        return max(max(a, b), c);
-    }
-
-    /**
-     * <p>Gets the maximum of two <code>double</code> values.</p>
-     * 
-     * <p>NaN is only returned if all numbers are NaN as per IEEE-754r. </p>
-     *
-     * @param a  value 1
-     * @param b  value 2
-     * @return  the largest of the values
-     */
-    public static double max(final double a, final double b) {
-        if(Double.isNaN(a)) {
-            return b;
-        } else
-        if(Double.isNaN(b)) {
-            return a;
-        } else {
-            return Math.max(a, b);
-        }
-    }
-
-    /**
-     * <p>Gets the maximum of three <code>float</code> values.</p>
-     * 
-     * <p>NaN is only returned if all numbers are NaN as per IEEE-754r. </p>
-     *
-     * @param a  value 1
-     * @param b  value 2
-     * @param c  value 3
-     * @return  the largest of the values
-     */
-    public static float max(final float a, final float b, final float c) {
-        return max(max(a, b), c);
-    }
-
-    /**
-     * <p>Gets the maximum of two <code>float</code> values.</p>
-     * 
-     * <p>NaN is only returned if all numbers are NaN as per IEEE-754r. </p>
-     *
-     * @param a  value 1
-     * @param b  value 2
-     * @return  the largest of the values
-     */
-    public static float max(final float a, final float b) {
-        if(Float.isNaN(a)) {
-            return b;
-        } else
-        if(Float.isNaN(b)) {
-            return a;
-        } else {
-            return Math.max(a, b);
-        }
-    }
-
-}
diff --git a/lang/src/main/java/org/apache/commons/lang3/math/NumberUtils.java b/lang/src/main/java/org/apache/commons/lang3/math/NumberUtils.java
deleted file mode 100644
index 7b3f739..0000000
--- a/lang/src/main/java/org/apache/commons/lang3/math/NumberUtils.java
+++ /dev/null
@@ -1,1602 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- * 
- *      http://www.apache.org/licenses/LICENSE-2.0
- * 
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.commons.lang3.math;
-
-import java.lang.reflect.Array;
-import java.math.BigDecimal;
-import java.math.BigInteger;
-
-import org.apache.commons.lang3.StringUtils;
-import org.apache.commons.lang3.Validate;
-
-/**
- * <p>Provides extra functionality for Java Number classes.</p>
- *
- * @since 2.0
- * @version $Id$
- */
-public class NumberUtils {
-    
-    /** Reusable Long constant for zero. */
-    public static final Long LONG_ZERO = Long.valueOf(0L);
-    /** Reusable Long constant for one. */
-    public static final Long LONG_ONE = Long.valueOf(1L);
-    /** Reusable Long constant for minus one. */
-    public static final Long LONG_MINUS_ONE = Long.valueOf(-1L);
-    /** Reusable Integer constant for zero. */
-    public static final Integer INTEGER_ZERO = Integer.valueOf(0);
-    /** Reusable Integer constant for one. */
-    public static final Integer INTEGER_ONE = Integer.valueOf(1);
-    /** Reusable Integer constant for minus one. */
-    public static final Integer INTEGER_MINUS_ONE = Integer.valueOf(-1);
-    /** Reusable Short constant for zero. */
-    public static final Short SHORT_ZERO = Short.valueOf((short) 0);
-    /** Reusable Short constant for one. */
-    public static final Short SHORT_ONE = Short.valueOf((short) 1);
-    /** Reusable Short constant for minus one. */
-    public static final Short SHORT_MINUS_ONE = Short.valueOf((short) -1);
-    /** Reusable Byte constant for zero. */
-    public static final Byte BYTE_ZERO = Byte.valueOf((byte) 0);
-    /** Reusable Byte constant for one. */
-    public static final Byte BYTE_ONE = Byte.valueOf((byte) 1);
-    /** Reusable Byte constant for minus one. */
-    public static final Byte BYTE_MINUS_ONE = Byte.valueOf((byte) -1);
-    /** Reusable Double constant for zero. */
-    public static final Double DOUBLE_ZERO = Double.valueOf(0.0d);
-    /** Reusable Double constant for one. */
-    public static final Double DOUBLE_ONE = Double.valueOf(1.0d);
-    /** Reusable Double constant for minus one. */
-    public static final Double DOUBLE_MINUS_ONE = Double.valueOf(-1.0d);
-    /** Reusable Float constant for zero. */
-    public static final Float FLOAT_ZERO = Float.valueOf(0.0f);
-    /** Reusable Float constant for one. */
-    public static final Float FLOAT_ONE = Float.valueOf(1.0f);
-    /** Reusable Float constant for minus one. */
-    public static final Float FLOAT_MINUS_ONE = Float.valueOf(-1.0f);
-
-    /**
-     * <p><code>NumberUtils</code> instances should NOT be constructed in standard programming.
-     * Instead, the class should be used as <code>NumberUtils.toInt("6");</code>.</p>
-     *
-     * <p>This constructor is public to permit tools that require a JavaBean instance
-     * to operate.</p>
-     */
-    public NumberUtils() {
-        super();
-    }
-
-    //-----------------------------------------------------------------------
-    /**
-     * <p>Convert a <code>String</code> to an <code>int</code>, returning
-     * <code>zero</code> if the conversion fails.</p>
-     *
-     * <p>If the string is <code>null</code>, <code>zero</code> is returned.</p>
-     *
-     * <pre>
-     *   NumberUtils.toInt(null) = 0
-     *   NumberUtils.toInt("")   = 0
-     *   NumberUtils.toInt("1")  = 1
-     * </pre>
-     *
-     * @param str  the string to convert, may be null
-     * @return the int represented by the string, or <code>zero</code> if
-     *  conversion fails
-     * @since 2.1
-     */
-    public static int toInt(final String str) {
-        return toInt(str, 0);
-    }
-
-    /**
-     * <p>Convert a <code>String</code> to an <code>int</code>, returning a
-     * default value if the conversion fails.</p>
-     *
-     * <p>If the string is <code>null</code>, the default value is returned.</p>
-     *
-     * <pre>
-     *   NumberUtils.toInt(null, 1) = 1
-     *   NumberUtils.toInt("", 1)   = 1
-     *   NumberUtils.toInt("1", 0)  = 1
-     * </pre>
-     *
-     * @param str  the string to convert, may be null
-     * @param defaultValue  the default value
-     * @return the int represented by the string, or the default if conversion fails
-     * @since 2.1
-     */
-    public static int toInt(final String str, final int defaultValue) {
-        if(str == null) {
-            return defaultValue;
-        }
-        try {
-            return Integer.parseInt(str);
-        } catch (final NumberFormatException nfe) {
-            return defaultValue;
-        }
-    }
-
-    /**
-     * <p>Convert a <code>String</code> to a <code>long</code>, returning
-     * <code>zero</code> if the conversion fails.</p>
-     *
-     * <p>If the string is <code>null</code>, <code>zero</code> is returned.</p>
-     *
-     * <pre>
-     *   NumberUtils.toLong(null) = 0L
-     *   NumberUtils.toLong("")   = 0L
-     *   NumberUtils.toLong("1")  = 1L
-     * </pre>
-     *
-     * @param str  the string to convert, may be null
-     * @return the long represented by the string, or <code>0</code> if
-     *  conversion fails
-     * @since 2.1
-     */
-    public static long toLong(final String str) {
-        return toLong(str, 0L);
-    }
-
-    /**
-     * <p>Convert a <code>String</code> to a <code>long</code>, returning a
-     * default value if the conversion fails.</p>
-     *
-     * <p>If the string is <code>null</code>, the default value is returned.</p>
-     *
-     * <pre>
-     *   NumberUtils.toLong(null, 1L) = 1L
-     *   NumberUtils.toLong("", 1L)   = 1L
-     *   NumberUtils.toLong("1", 0L)  = 1L
-     * </pre>
-     *
-     * @param str  the string to convert, may be null
-     * @param defaultValue  the default value
-     * @return the long represented by the string, or the default if conversion fails
-     * @since 2.1
-     */
-    public static long toLong(final String str, final long defaultValue) {
-        if (str == null) {
-            return defaultValue;
-        }
-        try {
-            return Long.parseLong(str);
-        } catch (final NumberFormatException nfe) {
-            return defaultValue;
-        }
-    }
-
-    /**
-     * <p>Convert a <code>String</code> to a <code>float</code>, returning
-     * <code>0.0f</code> if the conversion fails.</p>
-     *
-     * <p>If the string <code>str</code> is <code>null</code>,
-     * <code>0.0f</code> is returned.</p>
-     *
-     * <pre>
-     *   NumberUtils.toFloat(null)   = 0.0f
-     *   NumberUtils.toFloat("")     = 0.0f
-     *   NumberUtils.toFloat("1.5")  = 1.5f
-     * </pre>
-     *
-     * @param str the string to convert, may be <code>null</code>
-     * @return the float represented by the string, or <code>0.0f</code>
-     *  if conversion fails
-     * @since 2.1
-     */
-    public static float toFloat(final String str) {
-        return toFloat(str, 0.0f);
-    }
-
-    /**
-     * <p>Convert a <code>String</code> to a <code>float</code>, returning a
-     * default value if the conversion fails.</p>
-     *
-     * <p>If the string <code>str</code> is <code>null</code>, the default
-     * value is returned.</p>
-     *
-     * <pre>
-     *   NumberUtils.toFloat(null, 1.1f)   = 1.0f
-     *   NumberUtils.toFloat("", 1.1f)     = 1.1f
-     *   NumberUtils.toFloat("1.5", 0.0f)  = 1.5f
-     * </pre>
-     *
-     * @param str the string to convert, may be <code>null</code>
-     * @param defaultValue the default value
-     * @return the float represented by the string, or defaultValue
-     *  if conversion fails
-     * @since 2.1
-     */
-    public static float toFloat(final String str, final float defaultValue) {
-      if (str == null) {
-          return defaultValue;
-      }     
-      try {
-          return Float.parseFloat(str);
-      } catch (final NumberFormatException nfe) {
-          return defaultValue;
-      }
-    }
-
-    /**
-     * <p>Convert a <code>String</code> to a <code>double</code>, returning
-     * <code>0.0d</code> if the conversion fails.</p>
-     *
-     * <p>If the string <code>str</code> is <code>null</code>,
-     * <code>0.0d</code> is returned.</p>
-     *
-     * <pre>
-     *   NumberUtils.toDouble(null)   = 0.0d
-     *   NumberUtils.toDouble("")     = 0.0d
-     *   NumberUtils.toDouble("1.5")  = 1.5d
-     * </pre>
-     *
-     * @param str the string to convert, may be <code>null</code>
-     * @return the double represented by the string, or <code>0.0d</code>
-     *  if conversion fails
-     * @since 2.1
-     */
-    public static double toDouble(final String str) {
-        return toDouble(str, 0.0d);
-    }
-
-    /**
-     * <p>Convert a <code>String</code> to a <code>double</code>, returning a
-     * default value if the conversion fails.</p>
-     *
-     * <p>If the string <code>str</code> is <code>null</code>, the default
-     * value is returned.</p>
-     *
-     * <pre>
-     *   NumberUtils.toDouble(null, 1.1d)   = 1.1d
-     *   NumberUtils.toDouble("", 1.1d)     = 1.1d
-     *   NumberUtils.toDouble("1.5", 0.0d)  = 1.5d
-     * </pre>
-     *
-     * @param str the string to convert, may be <code>null</code>
-     * @param defaultValue the default value
-     * @return the double represented by the string, or defaultValue
-     *  if conversion fails
-     * @since 2.1
-     */
-    public static double toDouble(final String str, final double defaultValue) {
-      if (str == null) {
-          return defaultValue;
-      }
-      try {
-          return Double.parseDouble(str);
-      } catch (final NumberFormatException nfe) {
-          return defaultValue;
-      }
-    }
-
-     //-----------------------------------------------------------------------
-     /**
-     * <p>Convert a <code>String</code> to a <code>byte</code>, returning
-     * <code>zero</code> if the conversion fails.</p>
-     *
-     * <p>If the string is <code>null</code>, <code>zero</code> is returned.</p>
-     *
-     * <pre>
-     *   NumberUtils.toByte(null) = 0
-     *   NumberUtils.toByte("")   = 0
-     *   NumberUtils.toByte("1")  = 1
-     * </pre>
-     *
-     * @param str  the string to convert, may be null
-     * @return the byte represented by the string, or <code>zero</code> if
-     *  conversion fails
-     * @since 2.5
-     */
-    public static byte toByte(final String str) {
-        return toByte(str, (byte) 0);
-    }
-
-    /**
-     * <p>Convert a <code>String</code> to a <code>byte</code>, returning a
-     * default value if the conversion fails.</p>
-     *
-     * <p>If the string is <code>null</code>, the default value is returned.</p>
-     *
-     * <pre>
-     *   NumberUtils.toByte(null, 1) = 1
-     *   NumberUtils.toByte("", 1)   = 1
-     *   NumberUtils.toByte("1", 0)  = 1
-     * </pre>
-     *
-     * @param str  the string to convert, may be null
-     * @param defaultValue  the default value
-     * @return the byte represented by the string, or the default if conversion fails
-     * @since 2.5
-     */
-    public static byte toByte(final String str, final byte defaultValue) {
-        if(str == null) {
-            return defaultValue;
-        }
-        try {
-            return Byte.parseByte(str);
-        } catch (final NumberFormatException nfe) {
-            return defaultValue;
-        }
-    }
-
-    /**
-     * <p>Convert a <code>String</code> to a <code>short</code>, returning
-     * <code>zero</code> if the conversion fails.</p>
-     *
-     * <p>If the string is <code>null</code>, <code>zero</code> is returned.</p>
-     *
-     * <pre>
-     *   NumberUtils.toShort(null) = 0
-     *   NumberUtils.toShort("")   = 0
-     *   NumberUtils.toShort("1")  = 1
-     * </pre>
-     *
-     * @param str  the string to convert, may be null
-     * @return the short represented by the string, or <code>zero</code> if
-     *  conversion fails
-     * @since 2.5
-     */
-    public static short toShort(final String str) {
-        return toShort(str, (short) 0);
-    }
-
-    /**
-     * <p>Convert a <code>String</code> to an <code>short</code>, returning a
-     * default value if the conversion fails.</p>
-     *
-     * <p>If the string is <code>null</code>, the default value is returned.</p>
-     *
-     * <pre>
-     *   NumberUtils.toShort(null, 1) = 1
-     *   NumberUtils.toShort("", 1)   = 1
-     *   NumberUtils.toShort("1", 0)  = 1
-     * </pre>
-     *
-     * @param str  the string to convert, may be null
-     * @param defaultValue  the default value
-     * @return the short represented by the string, or the default if conversion fails
-     * @since 2.5
-     */
-    public static short toShort(final String str, final short defaultValue) {
-        if(str == null) {
-            return defaultValue;
-        }
-        try {
-            return Short.parseShort(str);
-        } catch (final NumberFormatException nfe) {
-            return defaultValue;
-        }
-    }
-
-    //-----------------------------------------------------------------------
-    // must handle Long, Float, Integer, Float, Short,
-    //                  BigDecimal, BigInteger and Byte
-    // useful methods:
-    // Byte.decode(String)
-    // Byte.valueOf(String,int radix)
-    // Byte.valueOf(String)
-    // Double.valueOf(String)
-    // Float.valueOf(String)
-    // Float.valueOf(String)
-    // Integer.valueOf(String,int radix)
-    // Integer.valueOf(String)
-    // Integer.decode(String)
-    // Integer.getInteger(String)
-    // Integer.getInteger(String,int val)
-    // Integer.getInteger(String,Integer val)
-    // Integer.valueOf(String)
-    // Double.valueOf(String)
-    // new Byte(String)
-    // Long.valueOf(String)
-    // Long.getLong(String)
-    // Long.getLong(String,int)
-    // Long.getLong(String,Integer)
-    // Long.valueOf(String,int)
-    // Long.valueOf(String)
-    // Short.valueOf(String)
-    // Short.decode(String)
-    // Short.valueOf(String,int)
-    // Short.valueOf(String)
-    // new BigDecimal(String)
-    // new BigInteger(String)
-    // new BigInteger(String,int radix)
-    // Possible inputs:
-    // 45 45.5 45E7 4.5E7 Hex Oct Binary xxxF xxxD xxxf xxxd
-    // plus minus everything. Prolly more. A lot are not separable.
-
-    /**
-     * <p>Turns a string value into a java.lang.Number.</p>
-     *
-     * <p>If the string starts with {@code 0x} or {@code -0x} (lower or upper case) or {@code #} or {@code -#}, it
-     * will be interpreted as a hexadecimal Integer - or Long, if the number of digits after the
-     * prefix is more than 8 - or BigInteger if there are more than 16 digits.
-     * </p>
-     * <p>Then, the value is examined for a type qualifier on the end, i.e. one of
-     * <code>'f','F','d','D','l','L'</code>.  If it is found, it starts 
-     * trying to create successively larger types from the type specified
-     * until one is found that can represent the value.</p>
-     *
-     * <p>If a type specifier is not found, it will check for a decimal point
-     * and then try successively larger types from <code>Integer</code> to
-     * <code>BigInteger</code> and from <code>Float</code> to
-    * <code>BigDecimal</code>.</p>
-    * 
-     * <p>
-     * Integral values with a leading {@code 0} will be interpreted as octal; the returned number will
-     * be Integer, Long or BigDecimal as appropriate.
-     * </p>
-     *
-     * <p>Returns <code>null</code> if the string is <code>null</code>.</p>
-     *
-     * <p>This method does not trim the input string, i.e., strings with leading
-     * or trailing spaces will generate NumberFormatExceptions.</p>
-     *
-     * @param str  String containing a number, may be null
-     * @return Number created from the string (or null if the input is null)
-     * @throws NumberFormatException if the value cannot be converted
-     */
-    public static Number createNumber(final String str) throws NumberFormatException {
-        if (str == null) {
-            return null;
-        }
-        if (StringUtils.isBlank(str)) {
-            throw new NumberFormatException("A blank string is not a valid number");
-        }
-        // Need to deal with all possible hex prefixes here
-        final String[] hex_prefixes = {"0x", "0X", "-0x", "-0X", "#", "-#"};
-        int pfxLen = 0;
-        for(final String pfx : hex_prefixes) {
-            if (str.startsWith(pfx)) {
-                pfxLen += pfx.length();
-                break;
-            }
-        }
-        if (pfxLen > 0) { // we have a hex number
-            char firstSigDigit = 0; // strip leading zeroes
-            for(int i = pfxLen; i < str.length(); i++) {
-                firstSigDigit = str.charAt(i);
-                if (firstSigDigit == '0') { // count leading zeroes
-                    pfxLen++;
-                } else {
-                    break;
-                }
-            }
-            final int hexDigits = str.length() - pfxLen;
-            if (hexDigits > 16 || (hexDigits == 16 && firstSigDigit > '7')) { // too many for Long
-                return createBigInteger(str);
-            }
-            if (hexDigits > 8 || (hexDigits == 8 && firstSigDigit > '7')) { // too many for an int
-                return createLong(str);
-            }
-            return createInteger(str);
-        }
-        final char lastChar = str.charAt(str.length() - 1);
-        String mant;
-        String dec;
-        String exp;
-        final int decPos = str.indexOf('.');
-        final int expPos = str.indexOf('e') + str.indexOf('E') + 1; // assumes both not present
-        // if both e and E are present, this is caught by the checks on expPos (which prevent IOOBE)
-        // and the parsing which will detect if e or E appear in a number due to using the wrong offset
-
-        int numDecimals = 0; // Check required precision (LANG-693)
-        if (decPos > -1) { // there is a decimal point
-
-            if (expPos > -1) { // there is an exponent
-                if (expPos < decPos || expPos > str.length()) { // prevents double exponent causing IOOBE
-                    throw new NumberFormatException(str + " is not a valid number.");
-                }
-                dec = str.substring(decPos + 1, expPos);
-            } else {
-                dec = str.substring(decPos + 1);
-            }
-            mant = getMantissa(str, decPos);
-            numDecimals = dec.length(); // gets number of digits past the decimal to ensure no loss of precision for floating point numbers.
-        } else {
-            if (expPos > -1) {
-                if (expPos > str.length()) { // prevents double exponent causing IOOBE
-                    throw new NumberFormatException(str + " is not a valid number.");
-                }
-                mant = getMantissa(str, expPos);
-            } else {
-                mant = getMantissa(str);
-            }
-            dec = null;
-        }
-        if (!Character.isDigit(lastChar) && lastChar != '.') {
-            if (expPos > -1 && expPos < str.length() - 1) {
-                exp = str.substring(expPos + 1, str.length() - 1);
-            } else {
-                exp = null;
-            }
-            //Requesting a specific type..
-            final String numeric = str.substring(0, str.length() - 1);
-            final boolean allZeros = isAllZeros(mant) && isAllZeros(exp);
-            switch (lastChar) {
-                case 'l' :
-                case 'L' :
-                    if (dec == null
-                        && exp == null
-                        && (numeric.charAt(0) == '-' && isDigits(numeric.substring(1)) || isDigits(numeric))) {
-                        try {
-                            return createLong(numeric);
-                        } catch (final NumberFormatException nfe) { // NOPMD
-                            // Too big for a long
-                        }
-                        return createBigInteger(numeric);
-
-                    }
-                    throw new NumberFormatException(str + " is not a valid number.");
-                case 'f' :
-                case 'F' :
-                    try {
-                        final Float f = NumberUtils.createFloat(numeric);
-                        if (!(f.isInfinite() || (f.floatValue() == 0.0F && !allZeros))) {
-                            //If it's too big for a float or the float value = 0 and the string
-                            //has non-zeros in it, then float does not have the precision we want
-                            return f;
-                        }
-
-                    } catch (final NumberFormatException nfe) { // NOPMD
-                        // ignore the bad number
-                    }
-                    //$FALL-THROUGH$
-                case 'd' :
-                case 'D' :
-                    try {
-                        final Double d = NumberUtils.createDouble(numeric);
-                        if (!(d.isInfinite() || (d.floatValue() == 0.0D && !allZeros))) {
-                            return d;
-                        }
-                    } catch (final NumberFormatException nfe) { // NOPMD
-                        // ignore the bad number
-                    }
-                    try {
-                        return createBigDecimal(numeric);
-                    } catch (final NumberFormatException e) { // NOPMD
-                        // ignore the bad number
-                    }
-                    //$FALL-THROUGH$
-                default :
-                    throw new NumberFormatException(str + " is not a valid number.");
-
-            }
-        }
-        //User doesn't have a preference on the return type, so let's start
-        //small and go from there...
-        if (expPos > -1 && expPos < str.length() - 1) {
-            exp = str.substring(expPos + 1, str.length());
-        } else {
-            exp = null;
-        }
-        if (dec == null && exp == null) { // no decimal point and no exponent
-            //Must be an Integer, Long, Biginteger
-            try {
-                return createInteger(str);
-            } catch (final NumberFormatException nfe) { // NOPMD
-                // ignore the bad number
-            }
-            try {
-                return createLong(str);
-            } catch (final NumberFormatException nfe) { // NOPMD
-                // ignore the bad number
-            }
-            return createBigInteger(str);
-        }
-
-        //Must be a Float, Double, BigDecimal
-        final boolean allZeros = isAllZeros(mant) && isAllZeros(exp);
-        try {
-            if(numDecimals <= 7){// If number has 7 or fewer digits past the decimal point then make it a float
-                final Float f = createFloat(str);
-                if (!(f.isInfinite() || (f.floatValue() == 0.0F && !allZeros))) {
-                    return f;
-                }
-            }
-        } catch (final NumberFormatException nfe) { // NOPMD
-            // ignore the bad number
-        }
-        try {
-            if(numDecimals <= 16){// If number has between 8 and 16 digits past the decimal point then make it a double
-                final Double d = createDouble(str);
-                if (!(d.isInfinite() || (d.doubleValue() == 0.0D && !allZeros))) {
-                    return d;
-                }
-            }
-        } catch (final NumberFormatException nfe) { // NOPMD
-            // ignore the bad number
-        }
-
-        return createBigDecimal(str);
-    }
-
-    /**
-     * <p>Utility method for {@link #createNumber(java.lang.String)}.</p>
-     *
-     * <p>Returns mantissa of the given number.</p>
-     * 
-     * @param str the string representation of the number
-     * @return mantissa of the given number
-     */
-    private static String getMantissa(final String str) {
-        return getMantissa(str, str.length());
-    }
-
-    /**
-     * <p>Utility method for {@link #createNumber(java.lang.String)}.</p>
-     *
-     * <p>Returns mantissa of the given number.</p>
-     * 
-     * @param str the string representation of the number
-     * @param stopPos the position of the exponent or decimal point
-     * @return mantissa of the given number
-     */
-    private static String getMantissa(final String str, final int stopPos) {
-        final char firstChar = str.charAt(0);
-        final boolean hasSign = (firstChar == '-' || firstChar == '+');
-
-        return hasSign ? str.substring(1, stopPos) : str.substring(0, stopPos);
-    }
-
-    /**
-     * <p>Utility method for {@link #createNumber(java.lang.String)}.</p>
-     *
-     * <p>Returns <code>true</code> if s is <code>null</code>.</p>
-     * 
-     * @param str  the String to check
-     * @return if it is all zeros or <code>null</code>
-     */
-    private static boolean isAllZeros(final String str) {
-        if (str == null) {
-            return true;
-        }
-        for (int i = str.length() - 1; i >= 0; i--) {
-            if (str.charAt(i) != '0') {
-                return false;
-            }
-        }
-        return str.length() > 0;
-    }
-
-    //-----------------------------------------------------------------------
-    /**
-     * <p>Convert a <code>String</code> to a <code>Float</code>.</p>
-     *
-     * <p>Returns <code>null</code> if the string is <code>null</code>.</p>
-     * 
-     * @param str  a <code>String</code> to convert, may be null
-     * @return converted <code>Float</code> (or null if the input is null)
-     * @throws NumberFormatException if the value cannot be converted
-     */
-    public static Float createFloat(final String str) {
-        if (str == null) {
-            return null;
-        }
-        return Float.valueOf(str);
-    }
-
-    /**
-     * <p>Convert a <code>String</code> to a <code>Double</code>.</p>
-     * 
-     * <p>Returns <code>null</code> if the string is <code>null</code>.</p>
-     *
-     * @param str  a <code>String</code> to convert, may be null
-     * @return converted <code>Double</code> (or null if the input is null)
-     * @throws NumberFormatException if the value cannot be converted
-     */
-    public static Double createDouble(final String str) {
-        if (str == null) {
-            return null;
-        }
-        return Double.valueOf(str);
-    }
-
-    /**
-     * <p>Convert a <code>String</code> to a <code>Integer</code>, handling
-     * hex (0xhhhh) and octal (0dddd) notations.
-     * N.B. a leading zero means octal; spaces are not trimmed.</p>
-     *
-     * <p>Returns <code>null</code> if the string is <code>null</code>.</p>
-     * 
-     * @param str  a <code>String</code> to convert, may be null
-     * @return converted <code>Integer</code> (or null if the input is null)
-     * @throws NumberFormatException if the value cannot be converted
-     */
-    public static Integer createInteger(final String str) {
-        if (str == null) {
-            return null;
-        }
-        // decode() handles 0xAABD and 0777 (hex and octal) as well.
-        return Integer.decode(str);
-    }
-
-    /**
-     * <p>Convert a <code>String</code> to a <code>Long</code>; 
-     * since 3.1 it handles hex (0Xhhhh) and octal (0ddd) notations.
-     * N.B. a leading zero means octal; spaces are not trimmed.</p>
-     * 
-     * <p>Returns <code>null</code> if the string is <code>null</code>.</p>
-     *
-     * @param str  a <code>String</code> to convert, may be null
-     * @return converted <code>Long</code> (or null if the input is null)
-     * @throws NumberFormatException if the value cannot be converted
-     */
-    public static Long createLong(final String str) {
-        if (str == null) {
-            return null;
-        }
-        return Long.decode(str);
-    }
-
-    /**
-     * <p>Convert a <code>String</code> to a <code>BigInteger</code>;
-     * since 3.2 it handles hex (0x or #) and octal (0) notations.</p>
-     *
-     * <p>Returns <code>null</code> if the string is <code>null</code>.</p>
-     * 
-     * @param str  a <code>String</code> to convert, may be null
-     * @return converted <code>BigInteger</code> (or null if the input is null)
-     * @throws NumberFormatException if the value cannot be converted
-     */
-    public static BigInteger createBigInteger(final String str) {
-        if (str == null) {
-            return null;
-        }
-        int pos = 0; // offset within string
-        int radix = 10;
-        boolean negate = false; // need to negate later?
-        if (str.startsWith("-")) {
-            negate = true;
-            pos = 1;
-        }
-        if (str.startsWith("0x", pos) || str.startsWith("0X", pos)) { // hex
-            radix = 16;
-            pos += 2;
-        } else if (str.startsWith("#", pos)) { // alternative hex (allowed by Long/Integer)
-            radix = 16;
-            pos ++;
-        } else if (str.startsWith("0", pos) && str.length() > pos + 1) { // octal; so long as there are additional digits
-            radix = 8;
-            pos ++;
-        } // default is to treat as decimal
-
-        final BigInteger value = new BigInteger(str.substring(pos), radix);
-        return negate ? value.negate() : value;
-    }
-
-    /**
-     * <p>Convert a <code>String</code> to a <code>BigDecimal</code>.</p>
-     * 
-     * <p>Returns <code>null</code> if the string is <code>null</code>.</p>
-     *
-     * @param str  a <code>String</code> to convert, may be null
-     * @return converted <code>BigDecimal</code> (or null if the input is null)
-     * @throws NumberFormatException if the value cannot be converted
-     */
-    public static BigDecimal createBigDecimal(final String str) {
-        if (str == null) {
-            return null;
-        }
-        // handle JDK1.3.1 bug where "" throws IndexOutOfBoundsException
-        if (StringUtils.isBlank(str)) {
-            throw new NumberFormatException("A blank string is not a valid number");
-        }
-        if (str.trim().startsWith("--")) {
-            // this is protection for poorness in java.lang.BigDecimal.
-            // it accepts this as a legal value, but it does not appear 
-            // to be in specification of class. OS X Java parses it to 
-            // a wrong value.
-            throw new NumberFormatException(str + " is not a valid number.");
-        }
-        return new BigDecimal(str);
-    }
-
-    // Min in array
-    //--------------------------------------------------------------------
-    /**
-     * <p>Returns the minimum value in an array.</p>
-     * 
-     * @param array  an array, must not be null or empty
-     * @return the minimum value in the array
-     * @throws IllegalArgumentException if <code>array</code> is <code>null</code>
-     * @throws IllegalArgumentException if <code>array</code> is empty
-     * @since 3.4 Changed signature from min(long[]) to min(long...)
-     */
-    public static long min(final long... array) {
-        // Validates input
-        validateArray(array);
-    
-        // Finds and returns min
-        long min = array[0];
-        for (int i = 1; i < array.length; i++) {
-            if (array[i] < min) {
-                min = array[i];
-            }
-        }
-    
-        return min;
-    }
-
-    /**
-     * <p>Returns the minimum value in an array.</p>
-     * 
-     * @param array  an array, must not be null or empty
-     * @return the minimum value in the array
-     * @throws IllegalArgumentException if <code>array</code> is <code>null</code>
-     * @throws IllegalArgumentException if <code>array</code> is empty
-     * @since 3.4 Changed signature from min(int[]) to min(int...)
-     */
-    public static int min(final int... array) {
-        // Validates input
-        validateArray(array);
-    
-        // Finds and returns min
-        int min = array[0];
-        for (int j = 1; j < array.length; j++) {
-            if (array[j] < min) {
-                min = array[j];
-            }
-        }
-    
-        return min;
-    }
-
-    /**
-     * <p>Returns the minimum value in an array.</p>
-     * 
-     * @param array  an array, must not be null or empty
-     * @return the minimum value in the array
-     * @throws IllegalArgumentException if <code>array</code> is <code>null</code>
-     * @throws IllegalArgumentException if <code>array</code> is empty
-     * @since 3.4 Changed signature from min(short[]) to min(short...)
-     */
-    public static short min(final short... array) {
-        // Validates input
-        validateArray(array);
-    
-        // Finds and returns min
-        short min = array[0];
-        for (int i = 1; i < array.length; i++) {
-            if (array[i] < min) {
-                min = array[i];
-            }
-        }
-    
-        return min;
-    }
-
-    /**
-     * <p>Returns the minimum value in an array.</p>
-     * 
-     * @param array  an array, must not be null or empty
-     * @return the minimum value in the array
-     * @throws IllegalArgumentException if <code>array</code> is <code>null</code>
-     * @throws IllegalArgumentException if <code>array</code> is empty
-     * @since 3.4 Changed signature from min(byte[]) to min(byte...)
-     */
-    public static byte min(final byte... array) {
-        // Validates input
-        validateArray(array);
-    
-        // Finds and returns min
-        byte min = array[0];
-        for (int i = 1; i < array.length; i++) {
-            if (array[i] < min) {
-                min = array[i];
-            }
-        }
-    
-        return min;
-    }
-
-     /**
-     * <p>Returns the minimum value in an array.</p>
-     * 
-     * @param array  an array, must not be null or empty
-     * @return the minimum value in the array
-     * @throws IllegalArgumentException if <code>array</code> is <code>null</code>
-     * @throws IllegalArgumentException if <code>array</code> is empty
-     * @see IEEE754rUtils#min(double[]) IEEE754rUtils for a version of this method that handles NaN differently
-     * @since 3.4 Changed signature from min(double[]) to min(double...)
-     */
-    public static double min(final double... array) {
-        // Validates input
-        validateArray(array);
-    
-        // Finds and returns min
-        double min = array[0];
-        for (int i = 1; i < array.length; i++) {
-            if (Double.isNaN(array[i])) {
-                return Double.NaN;
-            }
-            if (array[i] < min) {
-                min = array[i];
-            }
-        }
-    
-        return min;
-    }
-
-    /**
-     * <p>Returns the minimum value in an array.</p>
-     * 
-     * @param array  an array, must not be null or empty
-     * @return the minimum value in the array
-     * @throws IllegalArgumentException if <code>array</code> is <code>null</code>
-     * @throws IllegalArgumentException if <code>array</code> is empty
-     * @see IEEE754rUtils#min(float[]) IEEE754rUtils for a version of this method that handles NaN differently
-     * @since 3.4 Changed signature from min(float[]) to min(float...)
-     */
-    public static float min(final float... array) {
-        // Validates input
-        validateArray(array);
-    
-        // Finds and returns min
-        float min = array[0];
-        for (int i = 1; i < array.length; i++) {
-            if (Float.isNaN(array[i])) {
-                return Float.NaN;
-            }
-            if (array[i] < min) {
-                min = array[i];
-            }
-        }
-    
-        return min;
-    }
-
-    // Max in array
-    //--------------------------------------------------------------------
-    /**
-     * <p>Returns the maximum value in an array.</p>
-     * 
-     * @param array  an array, must not be null or empty
-     * @return the maximum value in the array
-     * @throws IllegalArgumentException if <code>array</code> is <code>null</code>
-     * @throws IllegalArgumentException if <code>array</code> is empty
-     * @since 3.4 Changed signature from max(long[]) to max(long...)
-     */
-    public static long max(final long... array) {
-        // Validates input
-        validateArray(array);
-
-        // Finds and returns max
-        long max = array[0];
-        for (int j = 1; j < array.length; j++) {
-            if (array[j] > max) {
-                max = array[j];
-            }
-        }
-
-        return max;
-    }
-
-    /**
-     * <p>Returns the maximum value in an array.</p>
-     * 
-     * @param array  an array, must not be null or empty
-     * @return the maximum value in the array
-     * @throws IllegalArgumentException if <code>array</code> is <code>null</code>
-     * @throws IllegalArgumentException if <code>array</code> is empty
-     * @since 3.4 Changed signature from max(int[]) to max(int...)
-     */
-    public static int max(final int... array) {
-        // Validates input
-        validateArray(array);
-    
-        // Finds and returns max
-        int max = array[0];
-        for (int j = 1; j < array.length; j++) {
-            if (array[j] > max) {
-                max = array[j];
-            }
-        }
-    
-        return max;
-    }
-
-    /**
-     * <p>Returns the maximum value in an array.</p>
-     * 
-     * @param array  an array, must not be null or empty
-     * @return the maximum value in the array
-     * @throws IllegalArgumentException if <code>array</code> is <code>null</code>
-     * @throws IllegalArgumentException if <code>array</code> is empty
-     * @since 3.4 Changed signature from max(short[]) to max(short...)
-     */
-    public static short max(final short... array) {
-        // Validates input
-        validateArray(array);
-    
-        // Finds and returns max
-        short max = array[0];
-        for (int i = 1; i < array.length; i++) {
-            if (array[i] > max) {
-                max = array[i];
-            }
-        }
-    
-        return max;
-    }
-
-    /**
-     * <p>Returns the maximum value in an array.</p>
-     * 
-     * @param array  an array, must not be null or empty
-     * @return the maximum value in the array
-     * @throws IllegalArgumentException if <code>array</code> is <code>null</code>
-     * @throws IllegalArgumentException if <code>array</code> is empty
-     * @since 3.4 Changed signature from max(byte[]) to max(byte...)
-     */
-    public static byte max(final byte... array) {
-        // Validates input
-        validateArray(array);
-    
-        // Finds and returns max
-        byte max = array[0];
-        for (int i = 1; i < array.length; i++) {
-            if (array[i] > max) {
-                max = array[i];
-            }
-        }
-    
-        return max;
-    }
-
-    /**
-     * <p>Returns the maximum value in an array.</p>
-     * 
-     * @param array  an array, must not be null or empty
-     * @return the maximum value in the array
-     * @throws IllegalArgumentException if <code>array</code> is <code>null</code>
-     * @throws IllegalArgumentException if <code>array</code> is empty
-     * @see IEEE754rUtils#max(double[]) IEEE754rUtils for a version of this method that handles NaN differently
-     * @since 3.4 Changed signature from max(double[]) to max(double...)
-     */
-    public static double max(final double... array) {
-        // Validates input
-        validateArray(array);
-
-        // Finds and returns max
-        double max = array[0];
-        for (int j = 1; j < array.length; j++) {
-            if (Double.isNaN(array[j])) {
-                return Double.NaN;
-            }
-            if (array[j] > max) {
-                max = array[j];
-            }
-        }
-    
-        return max;
-    }
-
-    /**
-     * <p>Returns the maximum value in an array.</p>
-     * 
-     * @param array  an array, must not be null or empty
-     * @return the maximum value in the array
-     * @throws IllegalArgumentException if <code>array</code> is <code>null</code>
-     * @throws IllegalArgumentException if <code>array</code> is empty
-     * @see IEEE754rUtils#max(float[]) IEEE754rUtils for a version of this method that handles NaN differently
-     * @since 3.4 Changed signature from max(float[]) to max(float...)
-     */
-    public static float max(final float... array) {
-        // Validates input
-        validateArray(array);
-
-        // Finds and returns max
-        float max = array[0];
-        for (int j = 1; j < array.length; j++) {
-            if (Float.isNaN(array[j])) {
-                return Float.NaN;
-            }
-            if (array[j] > max) {
-                max = array[j];
-            }
-        }
-
-        return max;
-    }
-
-    /**
-     * Checks if the specified array is neither null nor empty.
-     *
-     * @param array  the array to check
-     * @throws IllegalArgumentException if {@code array} is either {@code null} or empty
-     */
-    private static void validateArray(final Object array) {
-        if (array == null) {
-            throw new IllegalArgumentException("The Array must not be null");
-        }        
-        Validate.isTrue(Array.getLength(array) != 0, "Array cannot be empty.");        
-    }
-     
-    // 3 param min
-    //-----------------------------------------------------------------------
-    /**
-     * <p>Gets the minimum of three <code>long</code> values.</p>
-     * 
-     * @param a  value 1
-     * @param b  value 2
-     * @param c  value 3
-     * @return  the smallest of the values
-     */
-    public static long min(long a, final long b, final long c) {
-        if (b < a) {
-            a = b;
-        }
-        if (c < a) {
-            a = c;
-        }
-        return a;
-    }
-
-    /**
-     * <p>Gets the minimum of three <code>int</code> values.</p>
-     * 
-     * @param a  value 1
-     * @param b  value 2
-     * @param c  value 3
-     * @return  the smallest of the values
-     */
-    public static int min(int a, final int b, final int c) {
-        if (b < a) {
-            a = b;
-        }
-        if (c < a) {
-            a = c;
-        }
-        return a;
-    }
-
-    /**
-     * <p>Gets the minimum of three <code>short</code> values.</p>
-     * 
-     * @param a  value 1
-     * @param b  value 2
-     * @param c  value 3
-     * @return  the smallest of the values
-     */
-    public static short min(short a, final short b, final short c) {
-        if (b < a) {
-            a = b;
-        }
-        if (c < a) {
-            a = c;
-        }
-        return a;
-    }
-
-    /**
-     * <p>Gets the minimum of three <code>byte</code> values.</p>
-     * 
-     * @param a  value 1
-     * @param b  value 2
-     * @param c  value 3
-     * @return  the smallest of the values
-     */
-    public static byte min(byte a, final byte b, final byte c) {
-        if (b < a) {
-            a = b;
-        }
-        if (c < a) {
-            a = c;
-        }
-        return a;
-    }
-
-    /**
-     * <p>Gets the minimum of three <code>double</code> values.</p>
-     * 
-     * <p>If any value is <code>NaN</code>, <code>NaN</code> is
-     * returned. Infinity is handled.</p>
-     * 
-     * @param a  value 1
-     * @param b  value 2
-     * @param c  value 3
-     * @return  the smallest of the values
-     * @see IEEE754rUtils#min(double, double, double) for a version of this method that handles NaN differently
-     */
-    public static double min(final double a, final double b, final double c) {
-        return Math.min(Math.min(a, b), c);
-    }
-
-    /**
-     * <p>Gets the minimum of three <code>float</code> values.</p>
-     * 
-     * <p>If any value is <code>NaN</code>, <code>NaN</code> is
-     * returned. Infinity is handled.</p>
-     *
-     * @param a  value 1
-     * @param b  value 2
-     * @param c  value 3
-     * @return  the smallest of the values
-     * @see IEEE754rUtils#min(float, float, float) for a version of this method that handles NaN differently
-     */
-    public static float min(final float a, final float b, final float c) {
-        return Math.min(Math.min(a, b), c);
-    }
-
-    // 3 param max
-    //-----------------------------------------------------------------------
-    /**
-     * <p>Gets the maximum of three <code>long</code> values.</p>
-     * 
-     * @param a  value 1
-     * @param b  value 2
-     * @param c  value 3
-     * @return  the largest of the values
-     */
-    public static long max(long a, final long b, final long c) {
-        if (b > a) {
-            a = b;
-        }
-        if (c > a) {
-            a = c;
-        }
-        return a;
-    }
-
-    /**
-     * <p>Gets the maximum of three <code>int</code> values.</p>
-     * 
-     * @param a  value 1
-     * @param b  value 2
-     * @param c  value 3
-     * @return  the largest of the values
-     */
-    public static int max(int a, final int b, final int c) {
-        if (b > a) {
-            a = b;
-        }
-        if (c > a) {
-            a = c;
-        }
-        return a;
-    }
-
-    /**
-     * <p>Gets the maximum of three <code>short</code> values.</p>
-     * 
-     * @param a  value 1
-     * @param b  value 2
-     * @param c  value 3
-     * @return  the largest of the values
-     */
-    public static short max(short a, final short b, final short c) {
-        if (b > a) {
-            a = b;
-        }
-        if (c > a) {
-            a = c;
-        }
-        return a;
-    }
-
-    /**
-     * <p>Gets the maximum of three <code>byte</code> values.</p>
-     * 
-     * @param a  value 1
-     * @param b  value 2
-     * @param c  value 3
-     * @return  the largest of the values
-     */
-    public static byte max(byte a, final byte b, final byte c) {
-        if (b > a) {
-            a = b;
-        }
-        if (c > a) {
-            a = c;
-        }
-        return a;
-    }
-
-    /**
-     * <p>Gets the maximum of three <code>double</code> values.</p>
-     * 
-     * <p>If any value is <code>NaN</code>, <code>NaN</code> is
-     * returned. Infinity is handled.</p>
-     *
-     * @param a  value 1
-     * @param b  value 2
-     * @param c  value 3
-     * @return  the largest of the values
-     * @see IEEE754rUtils#max(double, double, double) for a version of this method that handles NaN differently
-     */
-    public static double max(final double a, final double b, final double c) {
-        return Math.max(Math.max(a, b), c);
-    }
-
-    /**
-     * <p>Gets the maximum of three <code>float</code> values.</p>
-     * 
-     * <p>If any value is <code>NaN</code>, <code>NaN</code> is
-     * returned. Infinity is handled.</p>
-     *
-     * @param a  value 1
-     * @param b  value 2
-     * @param c  value 3
-     * @return  the largest of the values
-     * @see IEEE754rUtils#max(float, float, float) for a version of this method that handles NaN differently
-     */
-    public static float max(final float a, final float b, final float c) {
-        return Math.max(Math.max(a, b), c);
-    }
-
-    //-----------------------------------------------------------------------
-    /**
-     * <p>Checks whether the <code>String</code> contains only
-     * digit characters.</p>
-     *
-     * <p><code>Null</code> and empty String will return
-     * <code>false</code>.</p>
-     *
-     * @param str  the <code>String</code> to check
-     * @return <code>true</code> if str contains only Unicode numeric
-     */
-    public static boolean isDigits(final String str) {
-        if (StringUtils.isEmpty(str)) {
-            return false;
-        }
-        for (int i = 0; i < str.length(); i++) {
-            if (!Character.isDigit(str.charAt(i))) {
-                return false;
-            }
-        }
-        return true;
-    }
-
-    /**
-     * <p>Checks whether the String a valid Java number.</p>
-     *
-     * <p>Valid numbers include hexadecimal marked with the <code>0x</code> or
-     * <code>0X</code> qualifier, octal numbers, scientific notation and numbers 
-     * marked with a type qualifier (e.g. 123L).</p>
-     * 
-     * <p>Non-hexadecimal strings beginning with a leading zero are
-     * treated as octal values. Thus the string <code>09</code> will return
-     * <code>false</code>, since <code>9</code> is not a valid octal value.
-     * However, numbers beginning with {@code 0.} are treated as decimal.</p>
-     *
-     * <p><code>null</code> and empty/blank {@code String} will return
-     * <code>false</code>.</p>
-     *
-     * @param str  the <code>String</code> to check
-     * @return <code>true</code> if the string is a correctly formatted number
-     * @since 3.3 the code supports hex {@code 0Xhhh} and octal {@code 0ddd} validation
-     */
-    public static boolean isNumber(final String str) {
-        if (StringUtils.isEmpty(str)) {
-            return false;
-        }
-        final char[] chars = str.toCharArray();
-        int sz = chars.length;
-        boolean hasExp = false;
-        boolean hasDecPoint = false;
-        boolean allowSigns = false;
-        boolean foundDigit = false;
-        // deal with any possible sign up front
-        final int start = (chars[0] == '-') ? 1 : 0;
-        if (sz > start + 1 && chars[start] == '0') { // leading 0
-            if (
-                 (chars[start + 1] == 'x') || 
-                 (chars[start + 1] == 'X') 
-            ) { // leading 0x/0X
-                int i = start + 2;
-                if (i == sz) {
-                    return false; // str == "0x"
-                }
-                // checking hex (it can't be anything else)
-                for (; i < chars.length; i++) {
-                    if ((chars[i] < '0' || chars[i] > '9')
-                        && (chars[i] < 'a' || chars[i] > 'f')
-                        && (chars[i] < 'A' || chars[i] > 'F')) {
-                        return false;
-                    }
-                }
-                return true;
-           } else if (Character.isDigit(chars[start + 1])) {
-               // leading 0, but not hex, must be octal
-               int i = start + 1;
-               for (; i < chars.length; i++) {
-                   if (chars[i] < '0' || chars[i] > '7') {
-                       return false;
-                   }
-               }
-               return true;               
-           }
-        }
-        sz--; // don't want to loop to the last char, check it afterwords
-              // for type qualifiers
-        int i = start;
-        // loop to the next to last char or to the last char if we need another digit to
-        // make a valid number (e.g. chars[0..5] = "1234E")
-        while (i < sz || (i < sz + 1 && allowSigns && !foundDigit)) {
-            if (chars[i] >= '0' && chars[i] <= '9') {
-                foundDigit = true;
-                allowSigns = false;
-
-            } else if (chars[i] == '.') {
-                if (hasDecPoint || hasExp) {
-                    // two decimal points or dec in exponent   
-                    return false;
-                }
-                hasDecPoint = true;
-            } else if (chars[i] == 'e' || chars[i] == 'E') {
-                // we've already taken care of hex.
-                if (hasExp) {
-                    // two E's
-                    return false;
-                }
-                if (!foundDigit) {
-                    return false;
-                }
-                hasExp = true;
-                allowSigns = true;
-            } else if (chars[i] == '+' || chars[i] == '-') {
-                if (!allowSigns) {
-                    return false;
-                }
-                allowSigns = false;
-                foundDigit = false; // we need a digit after the E
-            } else {
-                return false;
-            }
-            i++;
-        }
-        if (i < chars.length) {
-            if (chars[i] >= '0' && chars[i] <= '9') {
-                // no type qualifier, OK
-                return true;
-            }
-            if (chars[i] == 'e' || chars[i] == 'E') {
-                // can't have an E at the last byte
-                return false;
-            }
-            if (chars[i] == '.') {
-                if (hasDecPoint || hasExp) {
-                    // two decimal points or dec in exponent
-                    return false;
-                }
-                // single trailing decimal point after non-exponent is ok
-                return foundDigit;
-            }
-            if (!allowSigns
-                && (chars[i] == 'd'
-                    || chars[i] == 'D'
-                    || chars[i] == 'f'
-                    || chars[i] == 'F')) {
-                return foundDigit;
-            }
-            if (chars[i] == 'l'
-                || chars[i] == 'L') {
-                // not allowing L with an exponent or decimal point
-                return foundDigit && !hasExp && !hasDecPoint;
-            }
-            // last character is illegal
-            return false;
-        }
-        // allowSigns is true iff the val ends in 'E'
-        // found digit it to make sure weird stuff like '.' and '1E-' doesn't pass
-        return !allowSigns && foundDigit;
-    }
-    
-    /**
-     * <p>Checks whether the given String is a parsable number.</p>
-     *
-     * <p>Parsable numbers include those Strings understood by {@link Integer#parseInt(String)},
-     * {@link Long#parseLong(String)}, {@link Float#parseFloat(String)} or
-     * {@link Double#parseDouble(String)}. This method can be used instead of catching {@link java.text.ParseException}
-     * when calling one of those methods.</p>
-     *
-     * <p>Hexadecimal and scientific notations are <strong>not</strong> considered parsable.
-     * See {@link #isNumber(String)} on those cases.</p>
-     *
-     * <p>{@code Null} and empty String will return <code>false</code>.</p>
-     *
-     * @param str the String to check.
-     * @return {@code true} if the string is a parsable number.
-     * @since 3.4
-     */
-    public static boolean isParsable(final String str) {
-        if( StringUtils.endsWith( str, "." ) ) {
-            return false;
-        }
-        if( StringUtils.startsWith( str, "-" ) ) {
-            return isDigits( StringUtils.replaceOnce( str.substring(1), ".", StringUtils.EMPTY ) );
-        } else {
-            return isDigits( StringUtils.replaceOnce( str, ".", StringUtils.EMPTY ) );
-        }
-    }
-
-    /**
-     * <p>Compares two {@code int} values numerically. This is the same functionality as provided in Java 7.</p>
-     *
-     * @param x the first {@code int} to compare
-     * @param y the second {@code int} to compare
-     * @return the value {@code 0} if {@code x == y};
-     *         a value less than {@code 0} if {@code x < y}; and
-     *         a value greater than {@code 0} if {@code x > y}
-     * @since 3.4
-     */
-    public static int compare(int x, int y) {
-        if (x == y) {
-            return 0;
-        }
-        if (x < y) {
-            return -1;
-        } else {
-            return 1;
-        }
-    }
-
-    /**
-     * <p>Compares to {@code long} values numerically. This is the same functionality as provided in Java 7.</p>
-     *
-     * @param x the first {@code long} to compare
-     * @param y the second {@code long} to compare
-     * @return the value {@code 0} if {@code x == y};
-     *         a value less than {@code 0} if {@code x < y}; and
-     *         a value greater than {@code 0} if {@code x > y}
-     * @since 3.4
-     */
-    public static int compare(long x, long y) {
-        if (x == y) {
-            return 0;
-        }
-        if (x < y) {
-            return -1;
-        } else {
-            return 1;
-        }
-    }
-
-    /**
-     * <p>Compares to {@code short} values numerically. This is the same functionality as provided in Java 7.</p>
-     *
-     * @param x the first {@code short} to compare
-     * @param y the second {@code short} to compare
-     * @return the value {@code 0} if {@code x == y};
-     *         a value less than {@code 0} if {@code x < y}; and
-     *         a value greater than {@code 0} if {@code x > y}
-     * @since 3.4
-     */
-    public static int compare(short x, short y) {
-        if (x == y) {
-            return 0;
-        }
-        if (x < y) {
-            return -1;
-        } else {
-            return 1;
-        }
-    }
-
-    /**
-     * <p>Compares two {@code byte} values numerically. This is the same functionality as provided in Java 7.</p>
-     *
-     * @param x the first {@code byte} to compare
-     * @param y the second {@code byte} to compare
-     * @return the value {@code 0} if {@code x == y};
-     *         a value less than {@code 0} if {@code x < y}; and
-     *         a value greater than {@code 0} if {@code x > y}
-     * @since 3.4
-     */
-    public static int compare(byte x, byte y) {
-        return x-y;
-    }
-}
diff --git a/lang/src/main/java/org/apache/commons/lang3/math/package-info.java b/lang/src/main/java/org/apache/commons/lang3/math/package-info.java
deleted file mode 100644
index a3329e0..0000000
--- a/lang/src/main/java/org/apache/commons/lang3/math/package-info.java
+++ /dev/null
@@ -1,34 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-/**
- * <p>Extends {@link java.math} for business mathematical classes.
- * This package is intended for business mathematical use, not scientific use.
- * See <a href="http://commons.apache.org/math/">Commons Math</a> for a more complete set of mathematical classes.
- * These classes are immutable, and therefore thread-safe.</p>
- *
- * <p>Although Commons Math also exists, some basic mathematical functions are contained within Lang.
- * These include classes to a {@link org.apache.commons.lang3.math.Fraction} class, various utilities for random numbers, and the flagship class, {@link org.apache.commons.lang3.math.NumberUtils} which contains a handful of classic number functions.</p>
- *
- * <p>There are two aspects of this package that should be highlighted.
- * The first is {@link org.apache.commons.lang3.math.NumberUtils#createNumber(String)}, a method which does its best to convert a String into a {@link java.lang.Number} object.
- * You have no idea what type of Number it will return, so you should call the relevant <code>xxxValue</code> method when you reach the point of needing a number.
- * NumberUtils also has a related {@link org.apache.commons.lang3.math.NumberUtils#isNumber(String) isNumber(String)} method.</p>
- *
- * @since 2.0
- * @version $Id$
- */
-package org.apache.commons.lang3.math;
diff --git a/lang/src/main/java/org/apache/commons/lang3/mutable/Mutable.java b/lang/src/main/java/org/apache/commons/lang3/mutable/Mutable.java
deleted file mode 100644
index b36dc39..0000000
--- a/lang/src/main/java/org/apache/commons/lang3/mutable/Mutable.java
+++ /dev/null
@@ -1,54 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- * 
- *      http://www.apache.org/licenses/LICENSE-2.0
- * 
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package org.apache.commons.lang3.mutable;
-
-/**
- * Provides mutable access to a value.
- * <p>
- * <code>Mutable</code> is used as a generic interface to the implementations in this package.
- * <p>
- * A typical use case would be to enable a primitive or string to be passed to a method and allow that method to
- * effectively change the value of the primitive/string. Another use case is to store a frequently changing primitive in
- * a collection (for example a total in a map) without needing to create new Integer/Long wrapper objects.
- * 
- * @param <T> the type to set and get 
- * @since 2.1
- * @version $Id$
- */
-public interface Mutable<T> {
-
-    /**
-     * Gets the value of this mutable.
-     * 
-     * @return the stored value
-     */
-    T getValue();
-
-    /**
-     * Sets the value of this mutable.
-     * 
-     * @param value
-     *            the value to store
-     * @throws NullPointerException
-     *             if the object is null and null is invalid
-     * @throws ClassCastException
-     *             if the type is invalid
-     */
-    void setValue(T value);
-
-}
diff --git a/lang/src/main/java/org/apache/commons/lang3/mutable/MutableBoolean.java b/lang/src/main/java/org/apache/commons/lang3/mutable/MutableBoolean.java
deleted file mode 100644
index 31755ca..0000000
--- a/lang/src/main/java/org/apache/commons/lang3/mutable/MutableBoolean.java
+++ /dev/null
@@ -1,215 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- * 
- *      http://www.apache.org/licenses/LICENSE-2.0
- * 
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package org.apache.commons.lang3.mutable;
-
-import java.io.Serializable;
-
-import org.apache.commons.lang3.BooleanUtils;
-
-/**
- * A mutable <code>boolean</code> wrapper.
- * <p>
- * Note that as MutableBoolean does not extend Boolean, it is not treated by String.format as a Boolean parameter. 
- * 
- * @see Boolean
- * @since 2.2
- * @version $Id$
- */
-public class MutableBoolean implements Mutable<Boolean>, Serializable, Comparable<MutableBoolean> {
-
-    /**
-     * Required for serialization support.
-     * 
-     * @see java.io.Serializable
-     */
-    private static final long serialVersionUID = -4830728138360036487L;
-
-    /** The mutable value. */
-    private boolean value;
-
-    /**
-     * Constructs a new MutableBoolean with the default value of false.
-     */
-    public MutableBoolean() {
-        super();
-    }
-
-    /**
-     * Constructs a new MutableBoolean with the specified value.
-     * 
-     * @param value  the initial value to store
-     */
-    public MutableBoolean(final boolean value) {
-        super();
-        this.value = value;
-    }
-
-    /**
-     * Constructs a new MutableBoolean with the specified value.
-     * 
-     * @param value  the initial value to store, not null
-     * @throws NullPointerException if the object is null
-     */
-    public MutableBoolean(final Boolean value) {
-        super();
-        this.value = value.booleanValue();
-    }
-
-    //-----------------------------------------------------------------------
-    /**
-     * Gets the value as a Boolean instance.
-     * 
-     * @return the value as a Boolean, never null
-     */
-    @Override
-    public Boolean getValue() {
-        return Boolean.valueOf(this.value);
-    }
-
-    /**
-     * Sets the value.
-     * 
-     * @param value  the value to set
-     */
-    public void setValue(final boolean value) {
-        this.value = value;
-    }
-
-    /**
-     * Sets the value to true.
-     * 
-     * @since 3.3
-     */
-    public void setFalse() {
-        this.value = false;
-    }
-
-    /**
-     * Sets the value to false.
-     * 
-     * @since 3.3
-     */
-    public void setTrue() {
-        this.value = true;
-    }
-
-    /**
-     * Sets the value from any Boolean instance.
-     * 
-     * @param value  the value to set, not null
-     * @throws NullPointerException if the object is null
-     */
-    @Override
-    public void setValue(final Boolean value) {
-        this.value = value.booleanValue();
-    }
-
-    //-----------------------------------------------------------------------
-    /**
-     * Checks if the current value is <code>true</code>.
-     * 
-     * @return <code>true</code> if the current value is <code>true</code>
-     * @since 2.5
-     */
-    public boolean isTrue() {
-        return value == true;
-    }
-
-    /**
-     * Checks if the current value is <code>false</code>.
-     * 
-     * @return <code>true</code> if the current value is <code>false</code>
-     * @since 2.5
-     */
-    public boolean isFalse() {
-        return value == false;
-    }
-
-    //-----------------------------------------------------------------------
-    /**
-     * Returns the value of this MutableBoolean as a boolean.
-     * 
-     * @return the boolean value represented by this object.
-     */
-    public boolean booleanValue() {
-        return value;
-    }
-
-    //-----------------------------------------------------------------------
-    /**
-     * Gets this mutable as an instance of Boolean.
-     *
-     * @return a Boolean instance containing the value from this mutable, never null
-     * @since 2.5
-     */
-    public Boolean toBoolean() {
-        return Boolean.valueOf(booleanValue());
-    }
-
-    //-----------------------------------------------------------------------
-    /**
-     * Compares this object to the specified object. The result is <code>true</code> if and only if the argument is
-     * not <code>null</code> and is an <code>MutableBoolean</code> object that contains the same
-     * <code>boolean</code> value as this object.
-     * 
-     * @param obj  the object to compare with, null returns false
-     * @return <code>true</code> if the objects are the same; <code>false</code> otherwise.
-     */
-    @Override
-    public boolean equals(final Object obj) {
-        if (obj instanceof MutableBoolean) {
-            return value == ((MutableBoolean) obj).booleanValue();
-        }
-        return false;
-    }
-
-    /**
-     * Returns a suitable hash code for this mutable.
-     * 
-     * @return the hash code returned by <code>Boolean.TRUE</code> or <code>Boolean.FALSE</code>
-     */
-    @Override
-    public int hashCode() {
-        return value ? Boolean.TRUE.hashCode() : Boolean.FALSE.hashCode();
-    }
-
-    //-----------------------------------------------------------------------
-    /**
-     * Compares this mutable to another in ascending order.
-     * 
-     * @param other  the other mutable to compare to, not null
-     * @return negative if this is less, zero if equal, positive if greater
-     *  where false is less than true
-     */
-    @Override
-    public int compareTo(final MutableBoolean other) {
-        return BooleanUtils.compare(this.value, other.value);
-    }
-
-    //-----------------------------------------------------------------------
-    /**
-     * Returns the String value of this mutable.
-     * 
-     * @return the mutable value as a string
-     */
-    @Override
-    public String toString() {
-        return String.valueOf(value);
-    }
-
-}
diff --git a/lang/src/main/java/org/apache/commons/lang3/mutable/MutableByte.java b/lang/src/main/java/org/apache/commons/lang3/mutable/MutableByte.java
deleted file mode 100644
index abe43fa..0000000
--- a/lang/src/main/java/org/apache/commons/lang3/mutable/MutableByte.java
+++ /dev/null
@@ -1,287 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- * 
- *      http://www.apache.org/licenses/LICENSE-2.0
- * 
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.commons.lang3.mutable;
-
-import org.apache.commons.lang3.math.NumberUtils;
-
-/**
- * A mutable <code>byte</code> wrapper.
- * <p>
- * Note that as MutableByte does not extend Byte, it is not treated by String.format as a Byte parameter. 
- * 
- * @see Byte
- * @since 2.1
- * @version $Id$
- */
-public class MutableByte extends Number implements Comparable<MutableByte>, Mutable<Number> {
-
-    /**
-     * Required for serialization support.
-     * 
-     * @see java.io.Serializable
-     */
-    private static final long serialVersionUID = -1585823265L;
-
-    /** The mutable value. */
-    private byte value;
-
-    /**
-     * Constructs a new MutableByte with the default value of zero.
-     */
-    public MutableByte() {
-        super();
-    }
-
-    /**
-     * Constructs a new MutableByte with the specified value.
-     * 
-     * @param value  the initial value to store
-     */
-    public MutableByte(final byte value) {
-        super();
-        this.value = value;
-    }
-
-    /**
-     * Constructs a new MutableByte with the specified value.
-     * 
-     * @param value  the initial value to store, not null
-     * @throws NullPointerException if the object is null
-     */
-    public MutableByte(final Number value) {
-        super();
-        this.value = value.byteValue();
-    }
-
-    /**
-     * Constructs a new MutableByte parsing the given string.
-     * 
-     * @param value  the string to parse, not null
-     * @throws NumberFormatException if the string cannot be parsed into a byte
-     * @since 2.5
-     */
-    public MutableByte(final String value) throws NumberFormatException {
-        super();
-        this.value = Byte.parseByte(value);
-    }
-
-    //-----------------------------------------------------------------------
-    /**
-     * Gets the value as a Byte instance.
-     * 
-     * @return the value as a Byte, never null
-     */
-    @Override
-    public Byte getValue() {
-        return Byte.valueOf(this.value);
-    }
-
-    /**
-     * Sets the value.
-     * 
-     * @param value  the value to set
-     */
-    public void setValue(final byte value) {
-        this.value = value;
-    }
-
-    /**
-     * Sets the value from any Number instance.
-     * 
-     * @param value  the value to set, not null
-     * @throws NullPointerException if the object is null
-     */
-    @Override
-    public void setValue(final Number value) {
-        this.value = value.byteValue();
-    }
-
-    //-----------------------------------------------------------------------
-    /**
-     * Increments the value.
-     *
-     * @since Commons Lang 2.2
-     */
-    public void increment() {
-        value++;
-    }
-
-    /**
-     * Decrements the value.
-     *
-     * @since Commons Lang 2.2
-     */
-    public void decrement() {
-        value--;
-    }
-
-    //-----------------------------------------------------------------------
-    /**
-     * Adds a value to the value of this instance.
-     * 
-     * @param operand  the value to add, not null
-     * @since Commons Lang 2.2
-     */
-    public void add(final byte operand) {
-        this.value += operand;
-    }
-
-    /**
-     * Adds a value to the value of this instance.
-     * 
-     * @param operand  the value to add, not null
-     * @throws NullPointerException if the object is null
-     * @since Commons Lang 2.2
-     */
-    public void add(final Number operand) {
-        this.value += operand.byteValue();
-    }
-
-    /**
-     * Subtracts a value from the value of this instance.
-     * 
-     * @param operand  the value to subtract, not null
-     * @since Commons Lang 2.2
-     */
-    public void subtract(final byte operand) {
-        this.value -= operand;
-    }
-
-    /**
-     * Subtracts a value from the value of this instance.
-     * 
-     * @param operand  the value to subtract, not null
-     * @throws NullPointerException if the object is null
-     * @since Commons Lang 2.2
-     */
-    public void subtract(final Number operand) {
-        this.value -= operand.byteValue();
-    }
-
-    //-----------------------------------------------------------------------
-    // shortValue relies on Number implementation
-    /**
-     * Returns the value of this MutableByte as a byte.
-     *
-     * @return the numeric value represented by this object after conversion to type byte.
-     */
-    @Override
-    public byte byteValue() {
-        return value;
-    }
-
-    /**
-     * Returns the value of this MutableByte as an int.
-     *
-     * @return the numeric value represented by this object after conversion to type int.
-     */
-    @Override
-    public int intValue() {
-        return value;
-    }
-
-    /**
-     * Returns the value of this MutableByte as a long.
-     *
-     * @return the numeric value represented by this object after conversion to type long.
-     */
-    @Override
-    public long longValue() {
-        return value;
-    }
-
-    /**
-     * Returns the value of this MutableByte as a float.
-     *
-     * @return the numeric value represented by this object after conversion to type float.
-     */
-    @Override
-    public float floatValue() {
-        return value;
-    }
-
-    /**
-     * Returns the value of this MutableByte as a double.
-     *
-     * @return the numeric value represented by this object after conversion to type double.
-     */
-    @Override
-    public double doubleValue() {
-        return value;
-    }
-
-    //-----------------------------------------------------------------------
-    /**
-     * Gets this mutable as an instance of Byte.
-     *
-     * @return a Byte instance containing the value from this mutable
-     */
-    public Byte toByte() {
-        return Byte.valueOf(byteValue());
-    }
-
-    //-----------------------------------------------------------------------
-    /**
-     * Compares this object to the specified object. The result is <code>true</code> if and only if the argument is
-     * not <code>null</code> and is a <code>MutableByte</code> object that contains the same <code>byte</code> value
-     * as this object.
-     * 
-     * @param obj  the object to compare with, null returns false
-     * @return <code>true</code> if the objects are the same; <code>false</code> otherwise.
-     */
-    @Override
-    public boolean equals(final Object obj) {
-        if (obj instanceof MutableByte) {
-            return value == ((MutableByte) obj).byteValue();
-        }
-        return false;
-    }
-
-    /**
-     * Returns a suitable hash code for this mutable.
-     * 
-     * @return a suitable hash code
-     */
-    @Override
-    public int hashCode() {
-        return value;
-    }
-
-    //-----------------------------------------------------------------------
-    /**
-     * Compares this mutable to another in ascending order.
-     * 
-     * @param other  the other mutable to compare to, not null
-     * @return negative if this is less, zero if equal, positive if greater
-     */
-    @Override
-    public int compareTo(final MutableByte other) {
-        return NumberUtils.compare(this.value, other.value);
-    }
-
-    //-----------------------------------------------------------------------
-    /**
-     * Returns the String value of this mutable.
-     * 
-     * @return the mutable value as a string
-     */
-    @Override
-    public String toString() {
-        return String.valueOf(value);
-    }
-
-}
diff --git a/lang/src/main/java/org/apache/commons/lang3/mutable/MutableDouble.java b/lang/src/main/java/org/apache/commons/lang3/mutable/MutableDouble.java
deleted file mode 100644
index 907c198..0000000
--- a/lang/src/main/java/org/apache/commons/lang3/mutable/MutableDouble.java
+++ /dev/null
@@ -1,314 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- * 
- *      http://www.apache.org/licenses/LICENSE-2.0
- * 
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.commons.lang3.mutable;
-
-/**
- * A mutable <code>double</code> wrapper.
- * <p>
- * Note that as MutableDouble does not extend Double, it is not treated by String.format as a Double parameter. 
- * 
- * @see Double
- * @since 2.1
- * @version $Id$
- */
-public class MutableDouble extends Number implements Comparable<MutableDouble>, Mutable<Number> {
-
-    /**
-     * Required for serialization support.
-     * 
-     * @see java.io.Serializable
-     */
-    private static final long serialVersionUID = 1587163916L;
-
-    /** The mutable value. */
-    private double value;
-
-    /**
-     * Constructs a new MutableDouble with the default value of zero.
-     */
-    public MutableDouble() {
-        super();
-    }
-
-    /**
-     * Constructs a new MutableDouble with the specified value.
-     * 
-     * @param value  the initial value to store
-     */
-    public MutableDouble(final double value) {
-        super();
-        this.value = value;
-    }
-
-    /**
-     * Constructs a new MutableDouble with the specified value.
-     * 
-     * @param value  the initial value to store, not null
-     * @throws NullPointerException if the object is null
-     */
-    public MutableDouble(final Number value) {
-        super();
-        this.value = value.doubleValue();
-    }
-
-    /**
-     * Constructs a new MutableDouble parsing the given string.
-     * 
-     * @param value  the string to parse, not null
-     * @throws NumberFormatException if the string cannot be parsed into a double
-     * @since 2.5
-     */
-    public MutableDouble(final String value) throws NumberFormatException {
-        super();
-        this.value = Double.parseDouble(value);
-    }
-
-    //-----------------------------------------------------------------------
-    /**
-     * Gets the value as a Double instance.
-     * 
-     * @return the value as a Double, never null
-     */
-    @Override
-    public Double getValue() {
-        return Double.valueOf(this.value);
-    }
-
-    /**
-     * Sets the value.
-     * 
-     * @param value  the value to set
-     */
-    public void setValue(final double value) {
-        this.value = value;
-    }
-
-    /**
-     * Sets the value from any Number instance.
-     * 
-     * @param value  the value to set, not null
-     * @throws NullPointerException if the object is null
-     */
-    @Override
-    public void setValue(final Number value) {
-        this.value = value.doubleValue();
-    }
-
-    //-----------------------------------------------------------------------
-    /**
-     * Checks whether the double value is the special NaN value.
-     * 
-     * @return true if NaN
-     */
-    public boolean isNaN() {
-        return Double.isNaN(value);
-    }
-
-    /**
-     * Checks whether the double value is infinite.
-     * 
-     * @return true if infinite
-     */
-    public boolean isInfinite() {
-        return Double.isInfinite(value);
-    }
-
-    //-----------------------------------------------------------------------
-    /**
-     * Increments the value.
-     *
-     * @since Commons Lang 2.2
-     */
-    public void increment() {
-        value++;
-    }
-
-    /**
-     * Decrements the value.
-     *
-     * @since Commons Lang 2.2
-     */
-    public void decrement() {
-        value--;
-    }
-
-    //-----------------------------------------------------------------------
-    /**
-     * Adds a value to the value of this instance.
-     * 
-     * @param operand  the value to add
-     * @since Commons Lang 2.2
-     */
-    public void add(final double operand) {
-        this.value += operand;
-    }
-
-    /**
-     * Adds a value to the value of this instance.
-     * 
-     * @param operand  the value to add, not null
-     * @throws NullPointerException if the object is null
-     * @since Commons Lang 2.2
-     */
-    public void add(final Number operand) {
-        this.value += operand.doubleValue();
-    }
-
-    /**
-     * Subtracts a value from the value of this instance.
-     * 
-     * @param operand  the value to subtract, not null
-     * @since Commons Lang 2.2
-     */
-    public void subtract(final double operand) {
-        this.value -= operand;
-    }
-
-    /**
-     * Subtracts a value from the value of this instance.
-     * 
-     * @param operand  the value to subtract, not null
-     * @throws NullPointerException if the object is null
-     * @since Commons Lang 2.2
-     */
-    public void subtract(final Number operand) {
-        this.value -= operand.doubleValue();
-    }
-
-    //-----------------------------------------------------------------------
-    // shortValue and byteValue rely on Number implementation
-    /**
-     * Returns the value of this MutableDouble as an int.
-     *
-     * @return the numeric value represented by this object after conversion to type int.
-     */
-    @Override
-    public int intValue() {
-        return (int) value;
-    }
-
-    /**
-     * Returns the value of this MutableDouble as a long.
-     *
-     * @return the numeric value represented by this object after conversion to type long.
-     */
-    @Override
-    public long longValue() {
-        return (long) value;
-    }
-
-    /**
-     * Returns the value of this MutableDouble as a float.
-     *
-     * @return the numeric value represented by this object after conversion to type float.
-     */
-    @Override
-    public float floatValue() {
-        return (float) value;
-    }
-
-    /**
-     * Returns the value of this MutableDouble as a double.
-     *
-     * @return the numeric value represented by this object after conversion to type double.
-     */
-    @Override
-    public double doubleValue() {
-        return value;
-    }
-
-    //-----------------------------------------------------------------------
-    /**
-     * Gets this mutable as an instance of Double.
-     *
-     * @return a Double instance containing the value from this mutable, never null
-     */
-    public Double toDouble() {
-        return Double.valueOf(doubleValue());
-    }
-
-    //-----------------------------------------------------------------------
-    /**
-     * Compares this object against the specified object. The result is <code>true</code> if and only if the argument
-     * is not <code>null</code> and is a <code>Double</code> object that represents a double that has the identical
-     * bit pattern to the bit pattern of the double represented by this object. For this purpose, two
-     * <code>double</code> values are considered to be the same if and only if the method
-     * {@link Double#doubleToLongBits(double)}returns the same long value when applied to each.
-     * <p>
-     * Note that in most cases, for two instances of class <code>Double</code>,<code>d1</code> and <code>d2</code>,
-     * the value of <code>d1.equals(d2)</code> is <code>true</code> if and only if <blockquote>
-     * 
-     * <pre>
-     *   d1.doubleValue()&nbsp;== d2.doubleValue()
-     * </pre>
-     * 
-     * </blockquote>
-     * <p>
-     * also has the value <code>true</code>. However, there are two exceptions:
-     * <ul>
-     * <li>If <code>d1</code> and <code>d2</code> both represent <code>Double.NaN</code>, then the
-     * <code>equals</code> method returns <code>true</code>, even though <code>Double.NaN==Double.NaN</code> has
-     * the value <code>false</code>.
-     * <li>If <code>d1</code> represents <code>+0.0</code> while <code>d2</code> represents <code>-0.0</code>,
-     * or vice versa, the <code>equal</code> test has the value <code>false</code>, even though
-     * <code>+0.0==-0.0</code> has the value <code>true</code>. This allows hashtables to operate properly.
-     * </ul>
-     * 
-     * @param obj  the object to compare with, null returns false
-     * @return <code>true</code> if the objects are the same; <code>false</code> otherwise.
-     */
-    @Override
-    public boolean equals(final Object obj) {
-        return obj instanceof MutableDouble
-            && Double.doubleToLongBits(((MutableDouble) obj).value) == Double.doubleToLongBits(value);
-    }
-
-    /**
-     * Returns a suitable hash code for this mutable.
-     * 
-     * @return a suitable hash code
-     */
-    @Override
-    public int hashCode() {
-        final long bits = Double.doubleToLongBits(value);
-        return (int) (bits ^ bits >>> 32);
-    }
-
-    //-----------------------------------------------------------------------
-    /**
-     * Compares this mutable to another in ascending order.
-     * 
-     * @param other  the other mutable to compare to, not null
-     * @return negative if this is less, zero if equal, positive if greater
-     */
-    @Override
-    public int compareTo(final MutableDouble other) {
-        return Double.compare(this.value, other.value);
-    }
-
-    //-----------------------------------------------------------------------
-    /**
-     * Returns the String value of this mutable.
-     * 
-     * @return the mutable value as a string
-     */
-    @Override
-    public String toString() {
-        return String.valueOf(value);
-    }
-
-}
diff --git a/lang/src/main/java/org/apache/commons/lang3/mutable/MutableFloat.java b/lang/src/main/java/org/apache/commons/lang3/mutable/MutableFloat.java
deleted file mode 100644
index 3a4ae68..0000000
--- a/lang/src/main/java/org/apache/commons/lang3/mutable/MutableFloat.java
+++ /dev/null
@@ -1,315 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- * 
- *      http://www.apache.org/licenses/LICENSE-2.0
- * 
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.commons.lang3.mutable;
-
-/**
- * A mutable <code>float</code> wrapper.
- * <p>
- * Note that as MutableFloat does not extend Float, it is not treated by String.format as a Float parameter. 
- * 
- * @see Float
- * @since 2.1
- * @version $Id$
- */
-public class MutableFloat extends Number implements Comparable<MutableFloat>, Mutable<Number> {
-
-    /**
-     * Required for serialization support.
-     * 
-     * @see java.io.Serializable
-     */
-    private static final long serialVersionUID = 5787169186L;
-
-    /** The mutable value. */
-    private float value;
-
-    /**
-     * Constructs a new MutableFloat with the default value of zero.
-     */
-    public MutableFloat() {
-        super();
-    }
-
-    /**
-     * Constructs a new MutableFloat with the specified value.
-     * 
-     * @param value  the initial value to store
-     */
-    public MutableFloat(final float value) {
-        super();
-        this.value = value;
-    }
-
-    /**
-     * Constructs a new MutableFloat with the specified value.
-     * 
-     * @param value  the initial value to store, not null
-     * @throws NullPointerException if the object is null
-     */
-    public MutableFloat(final Number value) {
-        super();
-        this.value = value.floatValue();
-    }
-
-    /**
-     * Constructs a new MutableFloat parsing the given string.
-     * 
-     * @param value  the string to parse, not null
-     * @throws NumberFormatException if the string cannot be parsed into a float
-     * @since 2.5
-     */
-    public MutableFloat(final String value) throws NumberFormatException {
-        super();
-        this.value = Float.parseFloat(value);
-    }
-
-    //-----------------------------------------------------------------------
-    /**
-     * Gets the value as a Float instance.
-     * 
-     * @return the value as a Float, never null
-     */
-    @Override
-    public Float getValue() {
-        return Float.valueOf(this.value);
-    }
-
-    /**
-     * Sets the value.
-     * 
-     * @param value  the value to set
-     */
-    public void setValue(final float value) {
-        this.value = value;
-    }
-
-    /**
-     * Sets the value from any Number instance.
-     * 
-     * @param value  the value to set, not null
-     * @throws NullPointerException if the object is null
-     */
-    @Override
-    public void setValue(final Number value) {
-        this.value = value.floatValue();
-    }
-
-    //-----------------------------------------------------------------------
-    /**
-     * Checks whether the float value is the special NaN value.
-     * 
-     * @return true if NaN
-     */
-    public boolean isNaN() {
-        return Float.isNaN(value);
-    }
-
-    /**
-     * Checks whether the float value is infinite.
-     * 
-     * @return true if infinite
-     */
-    public boolean isInfinite() {
-        return Float.isInfinite(value);
-    }
-
-    //-----------------------------------------------------------------------
-    /**
-     * Increments the value.
-     *
-     * @since Commons Lang 2.2
-     */
-    public void increment() {
-        value++;
-    }
-
-    /**
-     * Decrements the value.
-     *
-     * @since Commons Lang 2.2
-     */
-    public void decrement() {
-        value--;
-    }
-
-    //-----------------------------------------------------------------------
-    /**
-     * Adds a value to the value of this instance.
-     * 
-     * @param operand  the value to add, not null
-     * @since Commons Lang 2.2
-     */
-    public void add(final float operand) {
-        this.value += operand;
-    }
-
-    /**
-     * Adds a value to the value of this instance.
-     * 
-     * @param operand  the value to add, not null
-     * @throws NullPointerException if the object is null
-     * @since Commons Lang 2.2
-     */
-    public void add(final Number operand) {
-        this.value += operand.floatValue();
-    }
-
-    /**
-     * Subtracts a value from the value of this instance.
-     * 
-     * @param operand  the value to subtract
-     * @since Commons Lang 2.2
-     */
-    public void subtract(final float operand) {
-        this.value -= operand;
-    }
-
-    /**
-     * Subtracts a value from the value of this instance.
-     * 
-     * @param operand  the value to subtract, not null
-     * @throws NullPointerException if the object is null
-     * @since Commons Lang 2.2
-     */
-    public void subtract(final Number operand) {
-        this.value -= operand.floatValue();
-    }
-
-    //-----------------------------------------------------------------------
-    // shortValue and byteValue rely on Number implementation
-    /**
-     * Returns the value of this MutableFloat as an int.
-     *
-     * @return the numeric value represented by this object after conversion to type int.
-     */
-    @Override
-    public int intValue() {
-        return (int) value;
-    }
-
-    /**
-     * Returns the value of this MutableFloat as a long.
-     *
-     * @return the numeric value represented by this object after conversion to type long.
-     */
-    @Override
-    public long longValue() {
-        return (long) value;
-    }
-
-    /**
-     * Returns the value of this MutableFloat as a float.
-     *
-     * @return the numeric value represented by this object after conversion to type float.
-     */
-    @Override
-    public float floatValue() {
-        return value;
-    }
-
-    /**
-     * Returns the value of this MutableFloat as a double.
-     *
-     * @return the numeric value represented by this object after conversion to type double.
-     */
-    @Override
-    public double doubleValue() {
-        return value;
-    }
-
-    //-----------------------------------------------------------------------
-    /**
-     * Gets this mutable as an instance of Float.
-     *
-     * @return a Float instance containing the value from this mutable, never null
-     */
-    public Float toFloat() {
-        return Float.valueOf(floatValue());
-    }
-
-    //-----------------------------------------------------------------------
-    /**
-     * Compares this object against some other object. The result is <code>true</code> if and only if the argument is
-     * not <code>null</code> and is a <code>Float</code> object that represents a <code>float</code> that has the
-     * identical bit pattern to the bit pattern of the <code>float</code> represented by this object. For this
-     * purpose, two float values are considered to be the same if and only if the method
-     * {@link Float#floatToIntBits(float)}returns the same int value when applied to each.
-     * <p>
-     * Note that in most cases, for two instances of class <code>Float</code>,<code>f1</code> and <code>f2</code>,
-     * the value of <code>f1.equals(f2)</code> is <code>true</code> if and only if <blockquote>
-     * 
-     * <pre>
-     *   f1.floatValue() == f2.floatValue()
-     * </pre>
-     * 
-     * </blockquote>
-     * <p>
-     * also has the value <code>true</code>. However, there are two exceptions:
-     * <ul>
-     * <li>If <code>f1</code> and <code>f2</code> both represent <code>Float.NaN</code>, then the
-     * <code>equals</code> method returns <code>true</code>, even though <code>Float.NaN==Float.NaN</code> has
-     * the value <code>false</code>.
-     * <li>If <code>f1</code> represents <code>+0.0f</code> while <code>f2</code> represents <code>-0.0f</code>,
-     * or vice versa, the <code>equal</code> test has the value <code>false</code>, even though
-     * <code>0.0f==-0.0f</code> has the value <code>true</code>.
-     * </ul>
-     * This definition allows hashtables to operate properly.
-     * 
-     * @param obj  the object to compare with, null returns false
-     * @return <code>true</code> if the objects are the same; <code>false</code> otherwise.
-     * @see java.lang.Float#floatToIntBits(float)
-     */
-    @Override
-    public boolean equals(final Object obj) {
-        return obj instanceof MutableFloat
-            && Float.floatToIntBits(((MutableFloat) obj).value) == Float.floatToIntBits(value);
-    }
-
-    /**
-     * Returns a suitable hash code for this mutable.
-     * 
-     * @return a suitable hash code
-     */
-    @Override
-    public int hashCode() {
-        return Float.floatToIntBits(value);
-    }
-
-    //-----------------------------------------------------------------------
-    /**
-     * Compares this mutable to another in ascending order.
-     * 
-     * @param other  the other mutable to compare to, not null
-     * @return negative if this is less, zero if equal, positive if greater
-     */
-    @Override
-    public int compareTo(final MutableFloat other) {
-        return Float.compare(this.value, other.value);
-    }
-
-    //-----------------------------------------------------------------------
-    /**
-     * Returns the String value of this mutable.
-     * 
-     * @return the mutable value as a string
-     */
-    @Override
-    public String toString() {
-        return String.valueOf(value);
-    }
-
-}
diff --git a/lang/src/main/java/org/apache/commons/lang3/mutable/MutableInt.java b/lang/src/main/java/org/apache/commons/lang3/mutable/MutableInt.java
deleted file mode 100644
index 87e4dbd..0000000
--- a/lang/src/main/java/org/apache/commons/lang3/mutable/MutableInt.java
+++ /dev/null
@@ -1,277 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- * 
- *      http://www.apache.org/licenses/LICENSE-2.0
- * 
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.commons.lang3.mutable;
-
-import org.apache.commons.lang3.math.NumberUtils;
-
-/**
- * A mutable <code>int</code> wrapper.
- * <p>
- * Note that as MutableInt does not extend Integer, it is not treated by String.format as an Integer parameter. 
- * 
- * @see Integer
- * @since 2.1
- * @version $Id$
- */
-public class MutableInt extends Number implements Comparable<MutableInt>, Mutable<Number> {
-
-    /**
-     * Required for serialization support.
-     * 
-     * @see java.io.Serializable
-     */
-    private static final long serialVersionUID = 512176391864L;
-
-    /** The mutable value. */
-    private int value;
-
-    /**
-     * Constructs a new MutableInt with the default value of zero.
-     */
-    public MutableInt() {
-        super();
-    }
-
-    /**
-     * Constructs a new MutableInt with the specified value.
-     * 
-     * @param value  the initial value to store
-     */
-    public MutableInt(final int value) {
-        super();
-        this.value = value;
-    }
-
-    /**
-     * Constructs a new MutableInt with the specified value.
-     * 
-     * @param value  the initial value to store, not null
-     * @throws NullPointerException if the object is null
-     */
-    public MutableInt(final Number value) {
-        super();
-        this.value = value.intValue();
-    }
-
-    /**
-     * Constructs a new MutableInt parsing the given string.
-     * 
-     * @param value  the string to parse, not null
-     * @throws NumberFormatException if the string cannot be parsed into an int
-     * @since 2.5
-     */
-    public MutableInt(final String value) throws NumberFormatException {
-        super();
-        this.value = Integer.parseInt(value);
-    }
-
-    //-----------------------------------------------------------------------
-    /**
-     * Gets the value as a Integer instance.
-     * 
-     * @return the value as a Integer, never null
-     */
-    @Override
-    public Integer getValue() {
-        return Integer.valueOf(this.value);
-    }
-
-    /**
-     * Sets the value.
-     * 
-     * @param value  the value to set
-     */
-    public void setValue(final int value) {
-        this.value = value;
-    }
-
-    /**
-     * Sets the value from any Number instance.
-     * 
-     * @param value  the value to set, not null
-     * @throws NullPointerException if the object is null
-     */
-    @Override
-    public void setValue(final Number value) {
-        this.value = value.intValue();
-    }
-
-    //-----------------------------------------------------------------------
-    /**
-     * Increments the value.
-     *
-     * @since Commons Lang 2.2
-     */
-    public void increment() {
-        value++;
-    }
-
-    /**
-     * Decrements the value.
-     *
-     * @since Commons Lang 2.2
-     */
-    public void decrement() {
-        value--;
-    }
-
-    //-----------------------------------------------------------------------
-    /**
-     * Adds a value to the value of this instance.
-     * 
-     * @param operand  the value to add, not null
-     * @since Commons Lang 2.2
-     */
-    public void add(final int operand) {
-        this.value += operand;
-    }
-
-    /**
-     * Adds a value to the value of this instance.
-     * 
-     * @param operand  the value to add, not null
-     * @throws NullPointerException if the object is null
-     * @since Commons Lang 2.2
-     */
-    public void add(final Number operand) {
-        this.value += operand.intValue();
-    }
-
-    /**
-     * Subtracts a value from the value of this instance.
-     * 
-     * @param operand  the value to subtract, not null
-     * @since Commons Lang 2.2
-     */
-    public void subtract(final int operand) {
-        this.value -= operand;
-    }
-
-    /**
-     * Subtracts a value from the value of this instance.
-     * 
-     * @param operand  the value to subtract, not null
-     * @throws NullPointerException if the object is null
-     * @since Commons Lang 2.2
-     */
-    public void subtract(final Number operand) {
-        this.value -= operand.intValue();
-    }
-
-    //-----------------------------------------------------------------------
-    // shortValue and byteValue rely on Number implementation
-    /**
-     * Returns the value of this MutableInt as an int.
-     *
-     * @return the numeric value represented by this object after conversion to type int.
-     */
-    @Override
-    public int intValue() {
-        return value;
-    }
-
-    /**
-     * Returns the value of this MutableInt as a long.
-     *
-     * @return the numeric value represented by this object after conversion to type long.
-     */
-    @Override
-    public long longValue() {
-        return value;
-    }
-
-    /**
-     * Returns the value of this MutableInt as a float.
-     *
-     * @return the numeric value represented by this object after conversion to type float.
-     */
-    @Override
-    public float floatValue() {
-        return value;
-    }
-
-    /**
-     * Returns the value of this MutableInt as a double.
-     *
-     * @return the numeric value represented by this object after conversion to type double.
-     */
-    @Override
-    public double doubleValue() {
-        return value;
-    }
-
-    //-----------------------------------------------------------------------
-    /**
-     * Gets this mutable as an instance of Integer.
-     *
-     * @return a Integer instance containing the value from this mutable, never null
-     */
-    public Integer toInteger() {
-        return Integer.valueOf(intValue());
-    }
-
-    //-----------------------------------------------------------------------
-    /**
-     * Compares this object to the specified object. The result is <code>true</code> if and only if the argument is
-     * not <code>null</code> and is a <code>MutableInt</code> object that contains the same <code>int</code> value
-     * as this object.
-     * 
-     * @param obj  the object to compare with, null returns false
-     * @return <code>true</code> if the objects are the same; <code>false</code> otherwise.
-     */
-    @Override
-    public boolean equals(final Object obj) {
-        if (obj instanceof MutableInt) {
-            return value == ((MutableInt) obj).intValue();
-        }
-        return false;
-    }
-
-    /**
-     * Returns a suitable hash code for this mutable.
-     * 
-     * @return a suitable hash code
-     */
-    @Override
-    public int hashCode() {
-        return value;
-    }
-
-    //-----------------------------------------------------------------------
-    /**
-     * Compares this mutable to another in ascending order.
-     * 
-     * @param other  the other mutable to compare to, not null
-     * @return negative if this is less, zero if equal, positive if greater
-     */
-    @Override
-    public int compareTo(final MutableInt other) {
-        return NumberUtils.compare(this.value, other.value);
-    }
-
-    //-----------------------------------------------------------------------
-    /**
-     * Returns the String value of this mutable.
-     * 
-     * @return the mutable value as a string
-     */
-    @Override
-    public String toString() {
-        return String.valueOf(value);
-    }
-
-}
diff --git a/lang/src/main/java/org/apache/commons/lang3/mutable/MutableLong.java b/lang/src/main/java/org/apache/commons/lang3/mutable/MutableLong.java
deleted file mode 100644
index 569d69b..0000000
--- a/lang/src/main/java/org/apache/commons/lang3/mutable/MutableLong.java
+++ /dev/null
@@ -1,277 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- * 
- *      http://www.apache.org/licenses/LICENSE-2.0
- * 
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.commons.lang3.mutable;
-
-import org.apache.commons.lang3.math.NumberUtils;
-
-/**
- * A mutable <code>long</code> wrapper.
- * <p>
- * Note that as MutableLong does not extend Long, it is not treated by String.format as a Long parameter. 
- * 
- * @see Long
- * @since 2.1
- * @version $Id$
- */
-public class MutableLong extends Number implements Comparable<MutableLong>, Mutable<Number> {
-
-    /**
-     * Required for serialization support.
-     * 
-     * @see java.io.Serializable
-     */
-    private static final long serialVersionUID = 62986528375L;
-
-    /** The mutable value. */
-    private long value;
-
-    /**
-     * Constructs a new MutableLong with the default value of zero.
-     */
-    public MutableLong() {
-        super();
-    }
-
-    /**
-     * Constructs a new MutableLong with the specified value.
-     * 
-     * @param value  the initial value to store
-     */
-    public MutableLong(final long value) {
-        super();
-        this.value = value;
-    }
-
-    /**
-     * Constructs a new MutableLong with the specified value.
-     * 
-     * @param value  the initial value to store, not null
-     * @throws NullPointerException if the object is null
-     */
-    public MutableLong(final Number value) {
-        super();
-        this.value = value.longValue();
-    }
-
-    /**
-     * Constructs a new MutableLong parsing the given string.
-     * 
-     * @param value  the string to parse, not null
-     * @throws NumberFormatException if the string cannot be parsed into a long
-     * @since 2.5
-     */
-    public MutableLong(final String value) throws NumberFormatException {
-        super();
-        this.value = Long.parseLong(value);
-    }
-
-    //-----------------------------------------------------------------------
-    /**
-     * Gets the value as a Long instance.
-     * 
-     * @return the value as a Long, never null
-     */
-    @Override
-    public Long getValue() {
-        return Long.valueOf(this.value);
-    }
-
-    /**
-     * Sets the value.
-     * 
-     * @param value  the value to set
-     */
-    public void setValue(final long value) {
-        this.value = value;
-    }
-
-    /**
-     * Sets the value from any Number instance.
-     * 
-     * @param value  the value to set, not null
-     * @throws NullPointerException if the object is null
-     */
-    @Override
-    public void setValue(final Number value) {
-        this.value = value.longValue();
-    }
-
-    //-----------------------------------------------------------------------
-    /**
-     * Increments the value.
-     *
-     * @since Commons Lang 2.2
-     */
-    public void increment() {
-        value++;
-    }
-
-    /**
-     * Decrements the value.
-     *
-     * @since Commons Lang 2.2
-     */
-    public void decrement() {
-        value--;
-    }
-
-    //-----------------------------------------------------------------------
-    /**
-     * Adds a value to the value of this instance.
-     * 
-     * @param operand  the value to add, not null
-     * @since Commons Lang 2.2
-     */
-    public void add(final long operand) {
-        this.value += operand;
-    }
-
-    /**
-     * Adds a value to the value of this instance.
-     * 
-     * @param operand  the value to add, not null
-     * @throws NullPointerException if the object is null
-     * @since Commons Lang 2.2
-     */
-    public void add(final Number operand) {
-        this.value += operand.longValue();
-    }
-
-    /**
-     * Subtracts a value from the value of this instance.
-     * 
-     * @param operand  the value to subtract, not null
-     * @since Commons Lang 2.2
-     */
-    public void subtract(final long operand) {
-        this.value -= operand;
-    }
-
-    /**
-     * Subtracts a value from the value of this instance.
-     * 
-     * @param operand  the value to subtract, not null
-     * @throws NullPointerException if the object is null
-     * @since Commons Lang 2.2
-     */
-    public void subtract(final Number operand) {
-        this.value -= operand.longValue();
-    }
-
-    //-----------------------------------------------------------------------
-    // shortValue and byteValue rely on Number implementation
-    /**
-     * Returns the value of this MutableLong as an int.
-     *
-     * @return the numeric value represented by this object after conversion to type int.
-     */
-    @Override
-    public int intValue() {
-        return (int) value;
-    }
-
-    /**
-     * Returns the value of this MutableLong as a long.
-     *
-     * @return the numeric value represented by this object after conversion to type long.
-     */
-    @Override
-    public long longValue() {
-        return value;
-    }
-
-    /**
-     * Returns the value of this MutableLong as a float.
-     *
-     * @return the numeric value represented by this object after conversion to type float.
-     */
-    @Override
-    public float floatValue() {
-        return value;
-    }
-
-    /**
-     * Returns the value of this MutableLong as a double.
-     *
-     * @return the numeric value represented by this object after conversion to type double.
-     */
-    @Override
-    public double doubleValue() {
-        return value;
-    }
-
-    //-----------------------------------------------------------------------
-    /**
-     * Gets this mutable as an instance of Long.
-     *
-     * @return a Long instance containing the value from this mutable, never null
-     */
-    public Long toLong() {
-        return Long.valueOf(longValue());
-    }
-
-    //-----------------------------------------------------------------------
-    /**
-     * Compares this object to the specified object. The result is <code>true</code> if and only if the argument
-     * is not <code>null</code> and is a <code>MutableLong</code> object that contains the same <code>long</code>
-     * value as this object.
-     * 
-     * @param obj  the object to compare with, null returns false
-     * @return <code>true</code> if the objects are the same; <code>false</code> otherwise.
-     */
-    @Override
-    public boolean equals(final Object obj) {
-        if (obj instanceof MutableLong) {
-            return value == ((MutableLong) obj).longValue();
-        }
-        return false;
-    }
-
-    /**
-     * Returns a suitable hash code for this mutable.
-     * 
-     * @return a suitable hash code
-     */
-    @Override
-    public int hashCode() {
-        return (int) (value ^ (value >>> 32));
-    }
-
-    //-----------------------------------------------------------------------
-    /**
-     * Compares this mutable to another in ascending order.
-     * 
-     * @param other  the other mutable to compare to, not null
-     * @return negative if this is less, zero if equal, positive if greater
-     */
-    @Override
-    public int compareTo(final MutableLong other) {
-        return NumberUtils.compare(this.value, other.value);
-    }
-
-    //-----------------------------------------------------------------------
-    /**
-     * Returns the String value of this mutable.
-     * 
-     * @return the mutable value as a string
-     */
-    @Override
-    public String toString() {
-        return String.valueOf(value);
-    }
-
-}
diff --git a/lang/src/main/java/org/apache/commons/lang3/mutable/MutableObject.java b/lang/src/main/java/org/apache/commons/lang3/mutable/MutableObject.java
deleted file mode 100644
index a92a53d..0000000
--- a/lang/src/main/java/org/apache/commons/lang3/mutable/MutableObject.java
+++ /dev/null
@@ -1,128 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- * 
- *      http://www.apache.org/licenses/LICENSE-2.0
- * 
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package org.apache.commons.lang3.mutable;
-
-import java.io.Serializable;
-
-/**
- * A mutable <code>Object</code> wrapper.
- * 
- * @param <T> the type to set and get 
- * @since 2.1
- * @version $Id$
- */
-public class MutableObject<T> implements Mutable<T>, Serializable {
-
-    /**
-     * Required for serialization support.
-     * 
-     * @see java.io.Serializable
-     */
-    private static final long serialVersionUID = 86241875189L;
-
-    /** The mutable value. */
-    private T value;
-
-    /**
-     * Constructs a new MutableObject with the default value of <code>null</code>.
-     */
-    public MutableObject() {
-        super();
-    }
-
-    /**
-     * Constructs a new MutableObject with the specified value.
-     * 
-     * @param value  the initial value to store
-     */
-    public MutableObject(final T value) {
-        super();
-        this.value = value;
-    }
-
-    //-----------------------------------------------------------------------
-    /**
-     * Gets the value.
-     * 
-     * @return the value, may be null
-     */
-    @Override
-    public T getValue() {
-        return this.value;
-    }
-
-    /**
-     * Sets the value.
-     * 
-     * @param value  the value to set
-     */
-    @Override
-    public void setValue(final T value) {
-        this.value = value;
-    }
-
-    //-----------------------------------------------------------------------
-    /**
-     * <p>
-     * Compares this object against the specified object. The result is <code>true</code> if and only if the argument
-     * is not <code>null</code> and is a <code>MutableObject</code> object that contains the same <code>T</code>
-     * value as this object.
-     * </p>
-     * 
-     * @param obj  the object to compare with, <code>null</code> returns <code>false</code>
-     * @return  <code>true</code> if the objects are the same;
-     *          <code>true</code> if the objects have equivalent <code>value</code> fields;
-     *          <code>false</code> otherwise.
-     */
-    @Override
-    public boolean equals(final Object obj) {
-        if (obj == null) {
-            return false;
-        }
-        if (this == obj) {
-            return true;
-        }
-        if (this.getClass() == obj.getClass()) {
-            final MutableObject<?> that = (MutableObject<?>) obj;
-            return this.value.equals(that.value);
-        }
-        return false;
-    }
-
-    /**
-     * Returns the value's hash code or <code>0</code> if the value is <code>null</code>.
-     * 
-     * @return the value's hash code or <code>0</code> if the value is <code>null</code>.
-     */
-    @Override
-    public int hashCode() {
-        return value == null ? 0 : value.hashCode();
-    }
-
-    //-----------------------------------------------------------------------
-    /**
-     * Returns the String value of this mutable.
-     * 
-     * @return the mutable value as a string
-     */
-    @Override
-    public String toString() {
-        return value == null ? "null" : value.toString();
-    }
-
-}
diff --git a/lang/src/main/java/org/apache/commons/lang3/mutable/MutableShort.java b/lang/src/main/java/org/apache/commons/lang3/mutable/MutableShort.java
deleted file mode 100644
index 7245b3c..0000000
--- a/lang/src/main/java/org/apache/commons/lang3/mutable/MutableShort.java
+++ /dev/null
@@ -1,287 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- * 
- *      http://www.apache.org/licenses/LICENSE-2.0
- * 
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.commons.lang3.mutable;
-
-import org.apache.commons.lang3.math.NumberUtils;
-
-/**
- * A mutable <code>short</code> wrapper.
- * <p>
- * Note that as MutableShort does not extend Short, it is not treated by String.format as a Short parameter. 
- * 
- * @see Short
- * @since 2.1
- * @version $Id$
- */
-public class MutableShort extends Number implements Comparable<MutableShort>, Mutable<Number> {
-
-    /**
-     * Required for serialization support.
-     * 
-     * @see java.io.Serializable
-     */
-    private static final long serialVersionUID = -2135791679L;
-
-    /** The mutable value. */
-    private short value;
-
-    /**
-     * Constructs a new MutableShort with the default value of zero.
-     */
-    public MutableShort() {
-        super();
-    }
-
-    /**
-     * Constructs a new MutableShort with the specified value.
-     * 
-     * @param value  the initial value to store
-     */
-    public MutableShort(final short value) {
-        super();
-        this.value = value;
-    }
-
-    /**
-     * Constructs a new MutableShort with the specified value.
-     * 
-     * @param value  the initial value to store, not null
-     * @throws NullPointerException if the object is null
-     */
-    public MutableShort(final Number value) {
-        super();
-        this.value = value.shortValue();
-    }
-
-    /**
-     * Constructs a new MutableShort parsing the given string.
-     * 
-     * @param value  the string to parse, not null
-     * @throws NumberFormatException if the string cannot be parsed into a short
-     * @since 2.5
-     */
-    public MutableShort(final String value) throws NumberFormatException {
-        super();
-        this.value = Short.parseShort(value);
-    }
-
-    //-----------------------------------------------------------------------
-    /**
-     * Gets the value as a Short instance.
-     * 
-     * @return the value as a Short, never null
-     */
-    @Override
-    public Short getValue() {
-        return Short.valueOf(this.value);
-    }
-
-    /**
-     * Sets the value.
-     * 
-     * @param value  the value to set
-     */
-    public void setValue(final short value) {
-        this.value = value;
-    }
-
-    /**
-     * Sets the value from any Number instance.
-     * 
-     * @param value  the value to set, not null
-     * @throws NullPointerException if the object is null
-     */
-    @Override
-    public void setValue(final Number value) {
-        this.value = value.shortValue();
-    }
-
-    //-----------------------------------------------------------------------
-    /**
-     * Increments the value.
-     *
-     * @since Commons Lang 2.2
-     */
-    public void increment() {
-        value++;
-    }
-
-    /**
-     * Decrements the value.
-     *
-     * @since Commons Lang 2.2
-     */
-    public void decrement() {
-        value--;
-    }
-
-    //-----------------------------------------------------------------------
-    /**
-     * Adds a value to the value of this instance.
-     * 
-     * @param operand  the value to add, not null
-     * @since Commons Lang 2.2
-     */
-    public void add(final short operand) {
-        this.value += operand;
-    }
-
-    /**
-     * Adds a value to the value of this instance.
-     * 
-     * @param operand  the value to add, not null
-     * @throws NullPointerException if the object is null
-     * @since Commons Lang 2.2
-     */
-    public void add(final Number operand) {
-        this.value += operand.shortValue();
-    }
-
-    /**
-     * Subtracts a value from the value of this instance.
-     * 
-     * @param operand  the value to subtract, not null
-     * @since Commons Lang 2.2
-     */
-    public void subtract(final short operand) {
-        this.value -= operand;
-    }
-
-    /**
-     * Subtracts a value from the value of this instance.
-     * 
-     * @param operand  the value to subtract, not null
-     * @throws NullPointerException if the object is null
-     * @since Commons Lang 2.2
-     */
-    public void subtract(final Number operand) {
-        this.value -= operand.shortValue();
-    }
-
-    //-----------------------------------------------------------------------
-    // byteValue relies on Number implementation
-    /**
-     * Returns the value of this MutableShort as a short.
-     *
-     * @return the numeric value represented by this object after conversion to type short.
-     */
-    @Override
-    public short shortValue() {
-        return value;
-    }
-
-    /**
-     * Returns the value of this MutableShort as an int.
-     *
-     * @return the numeric value represented by this object after conversion to type int.
-     */
-    @Override
-    public int intValue() {
-        return value;
-    }
-
-    /**
-     * Returns the value of this MutableShort as a long.
-     *
-     * @return the numeric value represented by this object after conversion to type long.
-     */
-    @Override
-    public long longValue() {
-        return value;
-    }
-
-    /**
-     * Returns the value of this MutableShort as a float.
-     *
-     * @return the numeric value represented by this object after conversion to type float.
-     */
-    @Override
-    public float floatValue() {
-        return value;
-    }
-
-    /**
-     * Returns the value of this MutableShort as a double.
-     *
-     * @return the numeric value represented by this object after conversion to type double.
-     */
-    @Override
-    public double doubleValue() {
-        return value;
-    }
-
-    //-----------------------------------------------------------------------
-    /**
-     * Gets this mutable as an instance of Short.
-     *
-     * @return a Short instance containing the value from this mutable, never null
-     */
-    public Short toShort() {
-        return Short.valueOf(shortValue());
-    }
-
-    //-----------------------------------------------------------------------
-    /**
-     * Compares this object to the specified object. The result is <code>true</code> if and only if the argument
-     * is not <code>null</code> and is a <code>MutableShort</code> object that contains the same <code>short</code>
-     * value as this object.
-     * 
-     * @param obj  the object to compare with, null returns false
-     * @return <code>true</code> if the objects are the same; <code>false</code> otherwise.
-     */
-    @Override
-    public boolean equals(final Object obj) {
-        if (obj instanceof MutableShort) {
-            return value == ((MutableShort) obj).shortValue();
-        }
-        return false;
-    }
-
-    /**
-     * Returns a suitable hash code for this mutable.
-     * 
-     * @return a suitable hash code
-     */
-    @Override
-    public int hashCode() {
-        return value;
-    }
-
-    //-----------------------------------------------------------------------
-    /**
-     * Compares this mutable to another in ascending order.
-     * 
-     * @param other  the other mutable to compare to, not null
-     * @return negative if this is less, zero if equal, positive if greater
-     */
-    @Override
-    public int compareTo(final MutableShort other) {
-        return NumberUtils.compare(this.value, other.value);
-    }
-
-    //-----------------------------------------------------------------------
-    /**
-     * Returns the String value of this mutable.
-     * 
-     * @return the mutable value as a string
-     */
-    @Override
-    public String toString() {
-        return String.valueOf(value);
-    }
-
-}
diff --git a/lang/src/main/java/org/apache/commons/lang3/mutable/package-info.java b/lang/src/main/java/org/apache/commons/lang3/mutable/package-info.java
deleted file mode 100644
index 911f19f..0000000
--- a/lang/src/main/java/org/apache/commons/lang3/mutable/package-info.java
+++ /dev/null
@@ -1,25 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-/**
- * <p>Provides typed mutable wrappers to primitive values and Object.
- * These wrappers are similar to the wrappers provided by the Java API, but allow the wrapped value to be changed without needing to create a separate wrapper object.
- * These classes are not thread-safe.</p>
- *
- * @since 2.1
- * @version $Id$
- */
-package org.apache.commons.lang3.mutable;
diff --git a/lang/src/main/java/org/apache/commons/lang3/package-info.java b/lang/src/main/java/org/apache/commons/lang3/package-info.java
deleted file mode 100644
index 7868e2a..0000000
--- a/lang/src/main/java/org/apache/commons/lang3/package-info.java
+++ /dev/null
@@ -1,125 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-/**
- * <p>Provides highly reusable static utility methods, chiefly concerned with adding value to the {@link java.lang} classes.
- * Most of these classes are immutable and thus thread-safe.
- * However {@link org.apache.commons.lang3.CharSet} is not currently guaranteed thread-safe under all circumstances.</p>
- *
- * <p>The top level package contains various Utils classes, whilst there are various subpackages including {@link org.apache.commons.lang3.math}, {@link org.apache.commons.lang3.concurrent} and {@link org.apache.commons.lang3.builder}.
- * Using the Utils classes is generally simplicity itself.
- * They are the equivalent of global functions in another language, a collection of stand-alone, thread-safe, static methods.
- * In contrast, subpackages may contain interfaces which may have to be implemented or classes which may need to be extended to get the full functionality from the code.
- * They may, however, contain more global-like functions.</p>
- *
- * <p>Lang 3.0 requires JDK 1.5+, since Lang 3.2 it requires JDK 6+; The legacy release 2.6 requires JDK 1.2+.
- * In both cases you can find features of later JDKs being maintained by us and likely to be removed or modified in favour of the JDK in the next major version.
- * Note that Lang 3.0 uses a different package than its predecessors, allowing it to be used at the same time as an earlier version.</p>
- *
- * <p>You will find deprecated methods as you stroll through the Lang documentation. These are removed in the next major version. </p>
- *
- * <p>All util classes contain empty public constructors with warnings not to use.
- * This may seem an odd thing to do, but it allows tools like Velocity to access the class as if it were a bean.
- * In other words, yes we know about private constructors and have chosen not to use them.</p>
- *
- * <h3>String manipulation - StringUtils, StringEscapeUtils, RandomStringUtils</h3>
- *
- * <p>Lang has a series of String utilities.
- * The first is {@link org.apache.commons.lang3.StringUtils}, oodles and oodles of functions which tweak, transform, squeeze and cuddle {@link java.lang.String java.lang.Strings}.
- * In addition to StringUtils, there are a series of other String manipulating classes; {@link org.apache.commons.lang3.RandomStringUtils} and {@link org.apache.commons.lang3.StringEscapeUtils StringEscapeUtils}.
- * RandomStringUtils speaks for itself.
- * It's provides ways in which to generate pieces of text, such as might be used for default passwords.
- * StringEscapeUtils contains methods to escape and unescape Java, JavaScript, HTML, XML and SQL.</p>
- *
- * <p>These are ideal classes to start using if you're looking to get into Lang.
- * StringUtils' {@link org.apache.commons.lang3.StringUtils#capitalize(String)}, {@link org.apache.commons.lang3.StringUtils#substringBetween(String, String)}/{@link org.apache.commons.lang3.StringUtils#substringBefore(String, String) Before}/{@link org.apache.commons.lang3.StringUtils#substringAfter(String, String) After}, {@link org.apache.commons.lang3.StringUtils#split(String)} and {@link org.apache.commons.lang3.StringUtils#join(Object[])} are good methods to begin with.
- * If you use java.sql.Statements a lot, StringEscapeUtils.escapeSql might be of interest.</p>
- *
- * <h3>Character handling - CharSetUtils, CharSet, CharRange, CharUtils</h3>
- *
- * <p>In addition to dealing with Strings, it's also important to deal with chars and Characters.
- * {@link org.apache.commons.lang3.CharUtils} exists for this purpose, while {@link org.apache.commons.lang3.CharSetUtils} exists for set-manipulation of Strings.
- * Be careful, although CharSetUtils takes an argument of type String, it is only as a set of characters.
- * For example, <code>CharSetUtils.delete("testtest", "tr")</code> will remove all t's and all r's from the String, not just the String "tr". </p>
- *
- * <p>{@link org.apache.commons.lang3.CharRange} and {@link org.apache.commons.lang3.CharSet} are both used internally by CharSetUtils, and will probably rarely be used.</p>
- *
- * <h3>JVM interaction - SystemUtils, CharEncoding</h3>
- *
- * <p>SystemUtils is a simple little class which makes it easy to find out information about which platform you are on.
- * For some, this is a necessary evil. It was never something I expected to use myself until I was trying to ensure that Commons Lang itself compiled under JDK 1.2.
- * Having pushed out a few JDK 1.3 bits that had slipped in (<code>Collections.EMPTY_MAP</code> is a classic offender), I then found that one of the Unit Tests was dying mysteriously under JDK 1.2, but ran fine under JDK 1.3.
- * There was no obvious solution and I needed to move onwards, so the simple solution was to wrap that particular test in a <code>if(SystemUtils.isJavaVersionAtLeast(1.3f)) {</code>, make a note and move on.</p>
- *
- * <p>The {@link org.apache.commons.lang3.CharEncoding} class is also used to interact with the Java environment and may be used to see which character encodings are supported in a particular environment. </p>
- *
- * <h3>Serialization - SerializationUtils, SerializationException</h3>
- *
- * <p>Serialization doesn't have to be that hard!
- * A simple util class can take away the pain, plus it provides a method to clone an object by unserializing and reserializing, an old Java trick.</p>
- *
- * <h3>Assorted functions - ObjectUtils, ClassUtils, ArrayUtils, BooleanUtils</h3>
- *
- * <p>Would you believe it, {@link org.apache.commons.lang3.ObjectUtils} contains handy functions for Objects, mainly null-safe implementations of the methods on {@link java.lang.Object}.</p>
- *
- * <p>{@link org.apache.commons.lang3.ClassUtils} is largely a set of helper methods for reflection.
- * Of special note are the comparators hidden away in ClassUtils, useful for sorting Class and Package objects by name; however they merely sort alphabetically and don't understand the common habit of sorting <code>java</code> and <code>javax</code> first.</p>
- *
- * <p>Next up, {@link org.apache.commons.lang3.ArrayUtils}.
- * This is a big one with many methods and many overloads of these methods so it is probably worth an in depth look here.
- * Before we begin, assume that every method mentioned is overloaded for all the primitives and for Object.
- * Also, the short-hand 'xxx' implies a generic primitive type, but usually also includes Object. </p>
- *
- * <ul>
- *  <li>ArrayUtils provides singleton empty arrays for all the basic types. These will largely be of use in the Collections API with its toArray methods, but also will be of use with methods which want to return an empty array on error.</li>
- *  <li><code>add(xxx[], xxx)</code> will add a primitive type to an array, resizing the array as you'd expect. Object is also supported. </li>
- *  <li><code>clone(xxx[])</code> clones a primitive or Object array. </li>
- *  <li><code>contains(xxx[], xxx)</code> searches for a primitive or Object in a primitive or Object array. </li>
- *  <li><code>getLength(Object)</code> returns the length of any array or an IllegalArgumentException if the parameter is not an array. <code>hashCode(Object)</code>, <code>equals(Object, Object)</code>, <code>toString(Object)</code> </li>
- *  <li><code>indexOf(xxx[], xxx)</code> and <code>indexOf(xxx[], xxx, int)</code> are copies of the classic String methods, but this time for primitive/Object arrays. In addition, a lastIndexOf set of methods exists. </li>
- *  <li><code>isEmpty(xxx[])</code> lets you know if an array is zero-sized or null. </li>
- *  <li><code>isSameLength(xxx[], xxx[])</code> returns true if the arrays are the same length. </li>
- *  <li>Along side the add methods, there are also remove methods of two types. The first type remove the value at an index, <code>remove(xxx[], int)</code>, while the second type remove the first value from the array, <code>remove(xxx[], xxx)</code>. </li>
- *  <li>Nearing the end now. The <code>reverse(xxx[])</code> method turns an array around. </li>
- *  <li>The <code>subarray(xxx[], int, int)</code> method splices an array out of a larger array. </li>
- *  <li>Primitive to primitive wrapper conversion is handled by the <code>toObject(xxx[])</code> and <code>toPrimitive(Xxx[])</code> methods. </li>
- * </ul>
- *
- * <p>Lastly, {@link org.apache.commons.lang3.ArrayUtils#toMap(Object[])} is worthy of special note.
- * It is not a heavily overloaded method for working with arrays, but a simple way to create Maps from literals. </p>
- *
- * <h4>Using toMap</h4>
- * <pre>
- * <code>
- * Map colorMap = ArrayUtils.toMap(new String[][] {{
- *   {"RED", "#FF0000"},
- *   {"GREEN", "#00FF00"},
- *   {"BLUE", "#0000FF"}
- * });
- * </code>
- * </pre>
- *
- * <p>Our final util class is {@link org.apache.commons.lang3.BooleanUtils}.
- * It contains various Boolean acting methods, probably of most interest is the {@link org.apache.commons.lang3.BooleanUtils#toBoolean(String)} method which turns various positive/negative Strings into a Boolean object, and not just true/false as with Boolean.valueOf.</p>
- *
- * <h3>Flotsam - BitField, Validate</h3>
- * <p>On reaching the end of our package, we are left with a couple of classes that haven't fit any of the topics so far. </p>
- * <p>The {@link org.apache.commons.lang3.BitField} class provides a wrapper class around the classic bitmask integer, whilst the {@link org.apache.commons.lang3.Validate} class may be used for assertions (remember, we support Java 1.2). </p>
- *
- * @since 1.0
- * @version $Id$
- */
-package org.apache.commons.lang3;
diff --git a/lang/src/main/java/org/apache/commons/lang3/reflect/ConstructorUtils.java b/lang/src/main/java/org/apache/commons/lang3/reflect/ConstructorUtils.java
deleted file mode 100644
index 5eca294..0000000
--- a/lang/src/main/java/org/apache/commons/lang3/reflect/ConstructorUtils.java
+++ /dev/null
@@ -1,300 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.commons.lang3.reflect;
-
-import java.lang.reflect.Constructor;
-import java.lang.reflect.InvocationTargetException;
-import java.lang.reflect.Modifier;
-
-import org.apache.commons.lang3.ArrayUtils;
-import org.apache.commons.lang3.ClassUtils;
-import org.apache.commons.lang3.Validate;
-
-/**
- * <p> Utility reflection methods focused on constructors, modeled after
- * {@link MethodUtils}. </p>
- *
- * <h3>Known Limitations</h3> <h4>Accessing Public Constructors In A Default
- * Access Superclass</h4> <p>There is an issue when invoking {@code public} constructors
- * contained in a default access superclass. Reflection correctly locates these
- * constructors and assigns them as {@code public}. However, an
- * {@link IllegalAccessException} is thrown if the constructor is
- * invoked.</p>
- *
- * <p>{@link ConstructorUtils} contains a workaround for this situation: it
- * will attempt to call {@link java.lang.reflect.AccessibleObject#setAccessible(boolean)} on this constructor. If this
- * call succeeds, then the method can be invoked as normal. This call will only
- * succeed when the application has sufficient security privileges. If this call
- * fails then a warning will be logged and the method may fail.</p>
- *
- * @since 2.5
- * @version $Id$
- */
-public class ConstructorUtils {
-
-    /**
-     * <p>ConstructorUtils instances should NOT be constructed in standard
-     * programming. Instead, the class should be used as
-     * {@code ConstructorUtils.invokeConstructor(cls, args)}.</p>
-     *
-     * <p>This constructor is {@code public} to permit tools that require a JavaBean
-     * instance to operate.</p>
-     */
-    public ConstructorUtils() {
-        super();
-    }
-
-    /**
-     * <p>Returns a new instance of the specified class inferring the right constructor
-     * from the types of the arguments.</p>
-     * 
-     * <p>This locates and calls a constructor.
-     * The constructor signature must match the argument types by assignment compatibility.</p>
-     *
-     * @param <T> the type to be constructed
-     * @param cls  the class to be constructed, not {@code null}
-     * @param args  the array of arguments, {@code null} treated as empty
-     * @return new instance of {@code cls}, not {@code null}
-     *
-     * @throws NullPointerException if {@code cls} is {@code null}
-     * @throws NoSuchMethodException if a matching constructor cannot be found
-     * @throws IllegalAccessException if invocation is not permitted by security
-     * @throws InvocationTargetException if an error occurs on invocation
-     * @throws InstantiationException if an error occurs on instantiation
-     * @see #invokeConstructor(java.lang.Class, java.lang.Object[], java.lang.Class[])
-     */
-    public static <T> T invokeConstructor(final Class<T> cls, Object... args)
-            throws NoSuchMethodException, IllegalAccessException, InvocationTargetException,
-            InstantiationException {
-        args = ArrayUtils.nullToEmpty(args);
-        final Class<?> parameterTypes[] = ClassUtils.toClass(args);
-        return invokeConstructor(cls, args, parameterTypes);
-    }
-
-    /**
-     * <p>Returns a new instance of the specified class choosing the right constructor
-     * from the list of parameter types.</p>
-     * 
-     * <p>This locates and calls a constructor.
-     * The constructor signature must match the parameter types by assignment compatibility.</p>
-     *
-     * @param <T> the type to be constructed
-     * @param cls  the class to be constructed, not {@code null}
-     * @param args  the array of arguments, {@code null} treated as empty
-     * @param parameterTypes  the array of parameter types, {@code null} treated as empty
-     * @return new instance of {@code cls}, not {@code null}
-     *
-     * @throws NullPointerException if {@code cls} is {@code null}
-     * @throws NoSuchMethodException if a matching constructor cannot be found
-     * @throws IllegalAccessException if invocation is not permitted by security
-     * @throws InvocationTargetException if an error occurs on invocation
-     * @throws InstantiationException if an error occurs on instantiation
-     * @see Constructor#newInstance
-     */
-    public static <T> T invokeConstructor(final Class<T> cls, Object[] args, Class<?>[] parameterTypes)
-            throws NoSuchMethodException, IllegalAccessException, InvocationTargetException,
-            InstantiationException {
-        args = ArrayUtils.nullToEmpty(args);
-        parameterTypes = ArrayUtils.nullToEmpty(parameterTypes);
-        final Constructor<T> ctor = getMatchingAccessibleConstructor(cls, parameterTypes);
-        if (ctor == null) {
-            throw new NoSuchMethodException(
-                "No such accessible constructor on object: " + cls.getName());
-        }
-        return ctor.newInstance(args);
-    }
-
-    /**
-     * <p>Returns a new instance of the specified class inferring the right constructor
-     * from the types of the arguments.</p>
-     *
-     * <p>This locates and calls a constructor.
-     * The constructor signature must match the argument types exactly.</p>
-     *
-     * @param <T> the type to be constructed
-     * @param cls the class to be constructed, not {@code null}
-     * @param args the array of arguments, {@code null} treated as empty
-     * @return new instance of {@code cls}, not {@code null}
-     *
-     * @throws NullPointerException if {@code cls} is {@code null}
-     * @throws NoSuchMethodException if a matching constructor cannot be found
-     * @throws IllegalAccessException if invocation is not permitted by security
-     * @throws InvocationTargetException if an error occurs on invocation
-     * @throws InstantiationException if an error occurs on instantiation
-     * @see #invokeExactConstructor(java.lang.Class, java.lang.Object[], java.lang.Class[])
-     */
-    public static <T> T invokeExactConstructor(final Class<T> cls, Object... args)
-            throws NoSuchMethodException, IllegalAccessException, InvocationTargetException,
-            InstantiationException {
-        args = ArrayUtils.nullToEmpty(args);
-        final Class<?> parameterTypes[] = ClassUtils.toClass(args);
-        return invokeExactConstructor(cls, args, parameterTypes);
-    }
-
-    /**
-     * <p>Returns a new instance of the specified class choosing the right constructor
-     * from the list of parameter types.</p>
-     *
-     * <p>This locates and calls a constructor.
-     * The constructor signature must match the parameter types exactly.</p>
-     *
-     * @param <T> the type to be constructed
-     * @param cls the class to be constructed, not {@code null}
-     * @param args the array of arguments, {@code null} treated as empty
-     * @param parameterTypes  the array of parameter types, {@code null} treated as empty
-     * @return new instance of <code>cls</code>, not {@code null}
-     *
-     * @throws NullPointerException if {@code cls} is {@code null}
-     * @throws NoSuchMethodException if a matching constructor cannot be found
-     * @throws IllegalAccessException if invocation is not permitted by security
-     * @throws InvocationTargetException if an error occurs on invocation
-     * @throws InstantiationException if an error occurs on instantiation
-     * @see Constructor#newInstance
-     */
-    public static <T> T invokeExactConstructor(final Class<T> cls, Object[] args,
-            Class<?>[] parameterTypes) throws NoSuchMethodException, IllegalAccessException,
-            InvocationTargetException, InstantiationException {
-        args = ArrayUtils.nullToEmpty(args);
-        parameterTypes = ArrayUtils.nullToEmpty(parameterTypes);
-        final Constructor<T> ctor = getAccessibleConstructor(cls, parameterTypes);
-        if (ctor == null) {
-            throw new NoSuchMethodException(
-                "No such accessible constructor on object: "+ cls.getName());
-        }
-        return ctor.newInstance(args);
-    }
-
-    //-----------------------------------------------------------------------
-    /**
-     * <p>Finds a constructor given a class and signature, checking accessibility.</p>
-     * 
-     * <p>This finds the constructor and ensures that it is accessible.
-     * The constructor signature must match the parameter types exactly.</p>
-     *
-     * @param <T> the constructor type
-     * @param cls the class to find a constructor for, not {@code null}
-     * @param parameterTypes the array of parameter types, {@code null} treated as empty
-     * @return the constructor, {@code null} if no matching accessible constructor found
-     * @see Class#getConstructor
-     * @see #getAccessibleConstructor(java.lang.reflect.Constructor)
-     * @throws NullPointerException if {@code cls} is {@code null}
-     */
-    public static <T> Constructor<T> getAccessibleConstructor(final Class<T> cls,
-            final Class<?>... parameterTypes) {
-        Validate.notNull(cls, "class cannot be null");
-        try {
-            return getAccessibleConstructor(cls.getConstructor(parameterTypes));
-        } catch (final NoSuchMethodException e) {
-            return null;
-        }
-    }
-
-    /**
-     * <p>Checks if the specified constructor is accessible.</p>
-     * 
-     * <p>This simply ensures that the constructor is accessible.</p>
-     *
-     * @param <T> the constructor type
-     * @param ctor  the prototype constructor object, not {@code null}
-     * @return the constructor, {@code null} if no matching accessible constructor found
-     * @see java.lang.SecurityManager
-     * @throws NullPointerException if {@code ctor} is {@code null}
-     */
-    public static <T> Constructor<T> getAccessibleConstructor(final Constructor<T> ctor) {
-        Validate.notNull(ctor, "constructor cannot be null");
-        return MemberUtils.isAccessible(ctor)
-                && isAccessible(ctor.getDeclaringClass()) ? ctor : null;
-    }
-
-    /**
-     * <p>Finds an accessible constructor with compatible parameters.</p>
-     * 
-     * <p>This checks all the constructor and finds one with compatible parameters
-     * This requires that every parameter is assignable from the given parameter types.
-     * This is a more flexible search than the normal exact matching algorithm.</p>
-     *
-     * <p>First it checks if there is a constructor matching the exact signature.
-     * If not then all the constructors of the class are checked to see if their
-     * signatures are assignment-compatible with the parameter types.
-     * The first assignment-compatible matching constructor is returned.</p>
-     *
-     * @param <T> the constructor type
-     * @param cls  the class to find a constructor for, not {@code null}
-     * @param parameterTypes find method with compatible parameters
-     * @return the constructor, null if no matching accessible constructor found
-     * @throws NullPointerException if {@code cls} is {@code null}
-     */
-    public static <T> Constructor<T> getMatchingAccessibleConstructor(final Class<T> cls,
-            final Class<?>... parameterTypes) {
-        Validate.notNull(cls, "class cannot be null");
-        // see if we can find the constructor directly
-        // most of the time this works and it's much faster
-        try {
-            final Constructor<T> ctor = cls.getConstructor(parameterTypes);
-            MemberUtils.setAccessibleWorkaround(ctor);
-            return ctor;
-        } catch (final NoSuchMethodException e) { // NOPMD - Swallow
-        }
-        Constructor<T> result = null;
-        /*
-         * (1) Class.getConstructors() is documented to return Constructor<T> so as
-         * long as the array is not subsequently modified, everything's fine.
-         */
-        final Constructor<?>[] ctors = cls.getConstructors();
-
-        // return best match:
-        for (Constructor<?> ctor : ctors) {
-            // compare parameters
-            if (ClassUtils.isAssignable(parameterTypes, ctor.getParameterTypes(), true)) {
-                // get accessible version of constructor
-                ctor = getAccessibleConstructor(ctor);
-                if (ctor != null) {
-                    MemberUtils.setAccessibleWorkaround(ctor);
-                    if (result == null
-                            || MemberUtils.compareParameterTypes(ctor.getParameterTypes(), result
-                                    .getParameterTypes(), parameterTypes) < 0) {
-                        // temporary variable for annotation, see comment above (1)
-                        @SuppressWarnings("unchecked")
-                        final
-                        Constructor<T> constructor = (Constructor<T>)ctor;
-                        result = constructor;
-                    }
-                }
-            }
-        }
-        return result;
-    }
-
-    /**
-     * Learn whether the specified class is generally accessible, i.e. is
-     * declared in an entirely {@code public} manner.
-     * @param type to check
-     * @return {@code true} if {@code type} and any enclosing classes are
-     *         {@code public}.
-     */
-    private static boolean isAccessible(final Class<?> type) {
-        Class<?> cls = type;
-        while (cls != null) {
-            if (!Modifier.isPublic(cls.getModifiers())) {
-                return false;
-            }
-            cls = cls.getEnclosingClass();
-        }
-        return true;
-    }
-
-}
diff --git a/lang/src/main/java/org/apache/commons/lang3/reflect/FieldUtils.java b/lang/src/main/java/org/apache/commons/lang3/reflect/FieldUtils.java
deleted file mode 100644
index 90b2668..0000000
--- a/lang/src/main/java/org/apache/commons/lang3/reflect/FieldUtils.java
+++ /dev/null
@@ -1,840 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.commons.lang3.reflect;
-
-import org.apache.commons.lang3.ClassUtils;
-import org.apache.commons.lang3.StringUtils;
-import org.apache.commons.lang3.Validate;
-
-import java.lang.annotation.Annotation;
-import java.lang.reflect.Field;
-import java.lang.reflect.Modifier;
-import java.util.ArrayList;
-import java.util.List;
-
-/**
- * Utilities for working with {@link Field}s by reflection. Adapted and refactored from the dormant [reflect] Commons
- * sandbox component.
- * <p>
- * The ability is provided to break the scoping restrictions coded by the programmer. This can allow fields to be
- * changed that shouldn't be. This facility should be used with care.
- * 
- * @since 2.5
- * @version $Id$
- */
-public class FieldUtils {
-
-    /**
-     * {@link FieldUtils} instances should NOT be constructed in standard programming.
-     * <p>
-     * This constructor is {@code public} to permit tools that require a JavaBean instance to operate.
-     * </p>
-     */
-    public FieldUtils() {
-        super();
-    }
-
-    /**
-     * Gets an accessible {@link Field} by name respecting scope. Superclasses/interfaces will be considered.
-     * 
-     * @param cls
-     *            the {@link Class} to reflect, must not be {@code null}
-     * @param fieldName
-     *            the field name to obtain
-     * @return the Field object
-     * @throws IllegalArgumentException
-     *             if the class is {@code null}, or the field name is blank or empty
-     */
-    public static Field getField(final Class<?> cls, final String fieldName) {
-        final Field field = getField(cls, fieldName, false);
-        MemberUtils.setAccessibleWorkaround(field);
-        return field;
-    }
-
-    /**
-     * Gets an accessible {@link Field} by name, breaking scope if requested. Superclasses/interfaces will be
-     * considered.
-     * 
-     * @param cls
-     *            the {@link Class} to reflect, must not be {@code null}
-     * @param fieldName
-     *            the field name to obtain
-     * @param forceAccess
-     *            whether to break scope restrictions using the
-     *            {@link java.lang.reflect.AccessibleObject#setAccessible(boolean)} method. {@code false} will only
-     *            match {@code public} fields.
-     * @return the Field object
-     * @throws IllegalArgumentException
-     *             if the class is {@code null}, or the field name is blank or empty or is matched at multiple places
-     *             in the inheritance hierarchy
-     */
-    public static Field getField(final Class<?> cls, final String fieldName, final boolean forceAccess) {
-        Validate.isTrue(cls != null, "The class must not be null");
-        Validate.isTrue(StringUtils.isNotBlank(fieldName), "The field name must not be blank/empty");
-        // FIXME is this workaround still needed? lang requires Java 6
-        // Sun Java 1.3 has a bugged implementation of getField hence we write the
-        // code ourselves
-
-        // getField() will return the Field object with the declaring class
-        // set correctly to the class that declares the field. Thus requesting the
-        // field on a subclass will return the field from the superclass.
-        //
-        // priority order for lookup:
-        // searchclass private/protected/package/public
-        // superclass protected/package/public
-        // private/different package blocks access to further superclasses
-        // implementedinterface public
-
-        // check up the superclass hierarchy
-        for (Class<?> acls = cls; acls != null; acls = acls.getSuperclass()) {
-            try {
-                final Field field = acls.getDeclaredField(fieldName);
-                // getDeclaredField checks for non-public scopes as well
-                // and it returns accurate results
-                if (!Modifier.isPublic(field.getModifiers())) {
-                    if (forceAccess) {
-                        field.setAccessible(true);
-                    } else {
-                        continue;
-                    }
-                }
-                return field;
-            } catch (final NoSuchFieldException ex) { // NOPMD
-                // ignore
-            }
-        }
-        // check the public interface case. This must be manually searched for
-        // incase there is a public supersuperclass field hidden by a private/package
-        // superclass field.
-        Field match = null;
-        for (final Class<?> class1 : ClassUtils.getAllInterfaces(cls)) {
-            try {
-                final Field test = class1.getField(fieldName);
-                Validate.isTrue(match == null, "Reference to field %s is ambiguous relative to %s"
-                        + "; a matching field exists on two or more implemented interfaces.", fieldName, cls);
-                match = test;
-            } catch (final NoSuchFieldException ex) { // NOPMD
-                // ignore
-            }
-        }
-        return match;
-    }
-
-    /**
-     * Gets an accessible {@link Field} by name respecting scope. Only the specified class will be considered.
-     * 
-     * @param cls
-     *            the {@link Class} to reflect, must not be {@code null}
-     * @param fieldName
-     *            the field name to obtain
-     * @return the Field object
-     * @throws IllegalArgumentException
-     *             if the class is {@code null}, or the field name is blank or empty
-     */
-    public static Field getDeclaredField(final Class<?> cls, final String fieldName) {
-        return getDeclaredField(cls, fieldName, false);
-    }
-
-    /**
-     * Gets an accessible {@link Field} by name, breaking scope if requested. Only the specified class will be
-     * considered.
-     * 
-     * @param cls
-     *            the {@link Class} to reflect, must not be {@code null}
-     * @param fieldName
-     *            the field name to obtain
-     * @param forceAccess
-     *            whether to break scope restrictions using the
-     *            {@link java.lang.reflect.AccessibleObject#setAccessible(boolean)} method. {@code false} will only
-     *            match {@code public} fields.
-     * @return the Field object
-     * @throws IllegalArgumentException
-     *             if the class is {@code null}, or the field name is blank or empty
-     */
-    public static Field getDeclaredField(final Class<?> cls, final String fieldName, final boolean forceAccess) {
-        Validate.isTrue(cls != null, "The class must not be null");
-        Validate.isTrue(StringUtils.isNotBlank(fieldName), "The field name must not be blank/empty");
-        try {
-            // only consider the specified class by using getDeclaredField()
-            final Field field = cls.getDeclaredField(fieldName);
-            if (!MemberUtils.isAccessible(field)) {
-                if (forceAccess) {
-                    field.setAccessible(true);
-                } else {
-                    return null;
-                }
-            }
-            return field;
-        } catch (final NoSuchFieldException e) { // NOPMD
-            // ignore
-        }
-        return null;
-    }
-
-    /**
-     * Gets all fields of the given class and its parents (if any).
-     * 
-     * @param cls
-     *            the {@link Class} to query
-     * @return an array of Fields (possibly empty).
-     * @throws IllegalArgumentException
-     *             if the class is {@code null}
-     * @since 3.2
-     */
-    public static Field[] getAllFields(final Class<?> cls) {
-        final List<Field> allFieldsList = getAllFieldsList(cls);
-        return allFieldsList.toArray(new Field[allFieldsList.size()]);
-    }
-
-    /**
-     * Gets all fields of the given class and its parents (if any).
-     * 
-     * @param cls
-     *            the {@link Class} to query
-     * @return an array of Fields (possibly empty).
-     * @throws IllegalArgumentException
-     *             if the class is {@code null}
-     * @since 3.2
-     */
-    public static List<Field> getAllFieldsList(final Class<?> cls) {
-        Validate.isTrue(cls != null, "The class must not be null");
-        final List<Field> allFields = new ArrayList<Field>();
-        Class<?> currentClass = cls;
-        while (currentClass != null) {
-            final Field[] declaredFields = currentClass.getDeclaredFields();
-            for (final Field field : declaredFields) {
-                allFields.add(field);
-            }
-            currentClass = currentClass.getSuperclass();
-        }
-        return allFields;
-    }
-
-    /**
-     * Gets all fields of the given class and its parents (if any) that are annotated with the given annotation.
-     * @param cls
-     *            the {@link Class} to query
-     * @param annotationCls
-     *            the {@link Annotation} that must be present on a field to be matched
-     * @return an array of Fields (possibly empty).
-     * @throws IllegalArgumentException
-     *            if the class or annotation are {@code null}
-     * @since 3.4
-     */
-    public static Field[] getFieldsWithAnnotation(final Class<?> cls, final Class<? extends Annotation> annotationCls) {
-        final List<Field> annotatedFieldsList = getFieldsListWithAnnotation(cls, annotationCls);
-        return annotatedFieldsList.toArray(new Field[annotatedFieldsList.size()]);
-    }
-
-    /**
-     * Gets all fields of the given class and its parents (if any) that are annotated with the given annotation.
-     * @param cls
-     *            the {@link Class} to query
-     * @param annotationCls
-     *            the {@link Annotation} that must be present on a field to be matched
-     * @return a list of Fields (possibly empty).
-     * @throws IllegalArgumentException
-     *            if the class or annotation are {@code null}
-     * @since 3.4
-     */
-    public static List<Field> getFieldsListWithAnnotation(final Class<?> cls, final Class<? extends Annotation> annotationCls) {
-        Validate.isTrue(annotationCls != null, "The annotation class must not be null");
-        final List<Field> allFields = getAllFieldsList(cls);
-        final List<Field> annotatedFields = new ArrayList<Field>();
-        for (final Field field : allFields) {
-            if (field.getAnnotation(annotationCls) != null) {
-                annotatedFields.add(field);
-            }
-        }
-        return annotatedFields;
-    }
-
-    /**
-     * Reads an accessible {@code static} {@link Field}.
-     * 
-     * @param field
-     *            to read
-     * @return the field value
-     * @throws IllegalArgumentException
-     *             if the field is {@code null}, or not {@code static}
-     * @throws IllegalAccessException
-     *             if the field is not accessible
-     */
-    public static Object readStaticField(final Field field) throws IllegalAccessException {
-        return readStaticField(field, false);
-    }
-
-    /**
-     * Reads a static {@link Field}.
-     * 
-     * @param field
-     *            to read
-     * @param forceAccess
-     *            whether to break scope restrictions using the
-     *            {@link java.lang.reflect.AccessibleObject#setAccessible(boolean)} method.
-     * @return the field value
-     * @throws IllegalArgumentException
-     *             if the field is {@code null} or not {@code static}
-     * @throws IllegalAccessException
-     *             if the field is not made accessible
-     */
-    public static Object readStaticField(final Field field, final boolean forceAccess) throws IllegalAccessException {
-        Validate.isTrue(field != null, "The field must not be null");
-        Validate.isTrue(Modifier.isStatic(field.getModifiers()), "The field '%s' is not static", field.getName());
-        return readField(field, (Object) null, forceAccess);
-    }
-
-    /**
-     * Reads the named {@code public static} {@link Field}. Superclasses will be considered.
-     * 
-     * @param cls
-     *            the {@link Class} to reflect, must not be {@code null}
-     * @param fieldName
-     *            the field name to obtain
-     * @return the value of the field
-     * @throws IllegalArgumentException
-     *             if the class is {@code null}, or the field name is blank or empty, is not {@code static}, or could
-     *             not be found
-     * @throws IllegalAccessException
-     *             if the field is not accessible
-     */
-    public static Object readStaticField(final Class<?> cls, final String fieldName) throws IllegalAccessException {
-        return readStaticField(cls, fieldName, false);
-    }
-
-    /**
-     * Reads the named {@code static} {@link Field}. Superclasses will be considered.
-     * 
-     * @param cls
-     *            the {@link Class} to reflect, must not be {@code null}
-     * @param fieldName
-     *            the field name to obtain
-     * @param forceAccess
-     *            whether to break scope restrictions using the
-     *            {@link java.lang.reflect.AccessibleObject#setAccessible(boolean)} method. {@code false} will only
-     *            match {@code public} fields.
-     * @return the Field object
-     * @throws IllegalArgumentException
-     *             if the class is {@code null}, or the field name is blank or empty, is not {@code static}, or could
-     *             not be found
-     * @throws IllegalAccessException
-     *             if the field is not made accessible
-     */
-    public static Object readStaticField(final Class<?> cls, final String fieldName, final boolean forceAccess) throws IllegalAccessException {
-        final Field field = getField(cls, fieldName, forceAccess);
-        Validate.isTrue(field != null, "Cannot locate field '%s' on %s", fieldName, cls);
-        // already forced access above, don't repeat it here:
-        return readStaticField(field, false);
-    }
-
-    /**
-     * Gets the value of a {@code static} {@link Field} by name. The field must be {@code public}. Only the specified
-     * class will be considered.
-     * 
-     * @param cls
-     *            the {@link Class} to reflect, must not be {@code null}
-     * @param fieldName
-     *            the field name to obtain
-     * @return the value of the field
-     * @throws IllegalArgumentException
-     *             if the class is {@code null}, or the field name is blank or empty, is not {@code static}, or could
-     *             not be found
-     * @throws IllegalAccessException
-     *             if the field is not accessible
-     */
-    public static Object readDeclaredStaticField(final Class<?> cls, final String fieldName) throws IllegalAccessException {
-        return readDeclaredStaticField(cls, fieldName, false);
-    }
-
-    /**
-     * Gets the value of a {@code static} {@link Field} by name. Only the specified class will be considered.
-     * 
-     * @param cls
-     *            the {@link Class} to reflect, must not be {@code null}
-     * @param fieldName
-     *            the field name to obtain
-     * @param forceAccess
-     *            whether to break scope restrictions using the
-     *            {@link java.lang.reflect.AccessibleObject#setAccessible(boolean)} method. {@code false} will only
-     *            match {@code public} fields.
-     * @return the Field object
-     * @throws IllegalArgumentException
-     *             if the class is {@code null}, or the field name is blank or empty, is not {@code static}, or could
-     *             not be found
-     * @throws IllegalAccessException
-     *             if the field is not made accessible
-     */
-    public static Object readDeclaredStaticField(final Class<?> cls, final String fieldName, final boolean forceAccess) throws IllegalAccessException {
-        final Field field = getDeclaredField(cls, fieldName, forceAccess);
-        Validate.isTrue(field != null, "Cannot locate declared field %s.%s", cls.getName(), fieldName);
-        // already forced access above, don't repeat it here:
-        return readStaticField(field, false);
-    }
-
-    /**
-     * Reads an accessible {@link Field}.
-     * 
-     * @param field
-     *            the field to use
-     * @param target
-     *            the object to call on, may be {@code null} for {@code static} fields
-     * @return the field value
-     * @throws IllegalArgumentException
-     *             if the field is {@code null}
-     * @throws IllegalAccessException
-     *             if the field is not accessible
-     */
-    public static Object readField(final Field field, final Object target) throws IllegalAccessException {
-        return readField(field, target, false);
-    }
-
-    /**
-     * Reads a {@link Field}.
-     * 
-     * @param field
-     *            the field to use
-     * @param target
-     *            the object to call on, may be {@code null} for {@code static} fields
-     * @param forceAccess
-     *            whether to break scope restrictions using the
-     *            {@link java.lang.reflect.AccessibleObject#setAccessible(boolean)} method.
-     * @return the field value
-     * @throws IllegalArgumentException
-     *             if the field is {@code null}
-     * @throws IllegalAccessException
-     *             if the field is not made accessible
-     */
-    public static Object readField(final Field field, final Object target, final boolean forceAccess) throws IllegalAccessException {
-        Validate.isTrue(field != null, "The field must not be null");
-        if (forceAccess && !field.isAccessible()) {
-            field.setAccessible(true);
-        } else {
-            MemberUtils.setAccessibleWorkaround(field);
-        }
-        return field.get(target);
-    }
-
-    /**
-     * Reads the named {@code public} {@link Field}. Superclasses will be considered.
-     * 
-     * @param target
-     *            the object to reflect, must not be {@code null}
-     * @param fieldName
-     *            the field name to obtain
-     * @return the value of the field
-     * @throws IllegalArgumentException
-     *             if the class is {@code null}, or the field name is blank or empty or could not be found
-     * @throws IllegalAccessException
-     *             if the named field is not {@code public}
-     */
-    public static Object readField(final Object target, final String fieldName) throws IllegalAccessException {
-        return readField(target, fieldName, false);
-    }
-
-    /**
-     * Reads the named {@link Field}. Superclasses will be considered.
-     * 
-     * @param target
-     *            the object to reflect, must not be {@code null}
-     * @param fieldName
-     *            the field name to obtain
-     * @param forceAccess
-     *            whether to break scope restrictions using the
-     *            {@link java.lang.reflect.AccessibleObject#setAccessible(boolean)} method. {@code false} will only
-     *            match {@code public} fields.
-     * @return the field value
-     * @throws IllegalArgumentException
-     *             if {@code target} is {@code null}, or the field name is blank or empty or could not be found
-     * @throws IllegalAccessException
-     *             if the named field is not made accessible
-     */
-    public static Object readField(final Object target, final String fieldName, final boolean forceAccess) throws IllegalAccessException {
-        Validate.isTrue(target != null, "target object must not be null");
-        final Class<?> cls = target.getClass();
-        final Field field = getField(cls, fieldName, forceAccess);
-        Validate.isTrue(field != null, "Cannot locate field %s on %s", fieldName, cls);
-        // already forced access above, don't repeat it here:
-        return readField(field, target, false);
-    }
-
-    /**
-     * Reads the named {@code public} {@link Field}. Only the class of the specified object will be considered.
-     * 
-     * @param target
-     *            the object to reflect, must not be {@code null}
-     * @param fieldName
-     *            the field name to obtain
-     * @return the value of the field
-     * @throws IllegalArgumentException
-     *             if {@code target} is {@code null}, or the field name is blank or empty or could not be found
-     * @throws IllegalAccessException
-     *             if the named field is not {@code public}
-     */
-    public static Object readDeclaredField(final Object target, final String fieldName) throws IllegalAccessException {
-        return readDeclaredField(target, fieldName, false);
-    }
-
-    /**
-     * Gets a {@link Field} value by name. Only the class of the specified object will be considered.
-     * 
-     * @param target
-     *            the object to reflect, must not be {@code null}
-     * @param fieldName
-     *            the field name to obtain
-     * @param forceAccess
-     *            whether to break scope restrictions using the
-     *            {@link java.lang.reflect.AccessibleObject#setAccessible(boolean)} method. {@code false} will only
-     *            match public fields.
-     * @return the Field object
-     * @throws IllegalArgumentException
-     *             if {@code target} is {@code null}, or the field name is blank or empty or could not be found
-     * @throws IllegalAccessException
-     *             if the field is not made accessible
-     */
-    public static Object readDeclaredField(final Object target, final String fieldName, final boolean forceAccess) throws IllegalAccessException {
-        Validate.isTrue(target != null, "target object must not be null");
-        final Class<?> cls = target.getClass();
-        final Field field = getDeclaredField(cls, fieldName, forceAccess);
-        Validate.isTrue(field != null, "Cannot locate declared field %s.%s", cls, fieldName);
-        // already forced access above, don't repeat it here:
-        return readField(field, target, false);
-    }
-
-    /**
-     * Writes a {@code public static} {@link Field}.
-     * 
-     * @param field
-     *            to write
-     * @param value
-     *            to set
-     * @throws IllegalArgumentException
-     *             if the field is {@code null} or not {@code static}, or {@code value} is not assignable
-     * @throws IllegalAccessException
-     *             if the field is not {@code public} or is {@code final}
-     */
-    public static void writeStaticField(final Field field, final Object value) throws IllegalAccessException {
-        writeStaticField(field, value, false);
-    }
-
-    /**
-     * Writes a static {@link Field}.
-     * 
-     * @param field
-     *            to write
-     * @param value
-     *            to set
-     * @param forceAccess
-     *            whether to break scope restrictions using the
-     *            {@link java.lang.reflect.AccessibleObject#setAccessible(boolean)} method. {@code false} will only
-     *            match {@code public} fields.
-     * @throws IllegalArgumentException
-     *             if the field is {@code null} or not {@code static}, or {@code value} is not assignable
-     * @throws IllegalAccessException
-     *             if the field is not made accessible or is {@code final}
-     */
-    public static void writeStaticField(final Field field, final Object value, final boolean forceAccess) throws IllegalAccessException {
-        Validate.isTrue(field != null, "The field must not be null");
-        Validate.isTrue(Modifier.isStatic(field.getModifiers()), "The field %s.%s is not static", field.getDeclaringClass().getName(),
-                field.getName());
-        writeField(field, (Object) null, value, forceAccess);
-    }
-
-    /**
-     * Writes a named {@code public static} {@link Field}. Superclasses will be considered.
-     * 
-     * @param cls
-     *            {@link Class} on which the field is to be found
-     * @param fieldName
-     *            to write
-     * @param value
-     *            to set
-     * @throws IllegalArgumentException
-     *             if {@code cls} is {@code null}, the field name is blank or empty, the field cannot be located or is
-     *             not {@code static}, or {@code value} is not assignable
-     * @throws IllegalAccessException
-     *             if the field is not {@code public} or is {@code final}
-     */
-    public static void writeStaticField(final Class<?> cls, final String fieldName, final Object value) throws IllegalAccessException {
-        writeStaticField(cls, fieldName, value, false);
-    }
-
-    /**
-     * Writes a named {@code static} {@link Field}. Superclasses will be considered.
-     * 
-     * @param cls
-     *            {@link Class} on which the field is to be found
-     * @param fieldName
-     *            to write
-     * @param value
-     *            to set
-     * @param forceAccess
-     *            whether to break scope restrictions using the
-     *            {@link java.lang.reflect.AccessibleObject#setAccessible(boolean)} method. {@code false} will only
-     *            match {@code public} fields.
-     * @throws IllegalArgumentException
-     *             if {@code cls} is {@code null}, the field name is blank or empty, the field cannot be located or is
-     *             not {@code static}, or {@code value} is not assignable
-     * @throws IllegalAccessException
-     *             if the field is not made accessible or is {@code final}
-     */
-    public static void writeStaticField(final Class<?> cls, final String fieldName, final Object value, final boolean forceAccess)
-            throws IllegalAccessException {
-        final Field field = getField(cls, fieldName, forceAccess);
-        Validate.isTrue(field != null, "Cannot locate field %s on %s", fieldName, cls);
-        // already forced access above, don't repeat it here:
-        writeStaticField(field, value, false);
-    }
-
-    /**
-     * Writes a named {@code public static} {@link Field}. Only the specified class will be considered.
-     * 
-     * @param cls
-     *            {@link Class} on which the field is to be found
-     * @param fieldName
-     *            to write
-     * @param value
-     *            to set
-     * @throws IllegalArgumentException
-     *             if {@code cls} is {@code null}, the field name is blank or empty, the field cannot be located or is
-     *             not {@code static}, or {@code value} is not assignable
-     * @throws IllegalAccessException
-     *             if the field is not {@code public} or is {@code final}
-     */
-    public static void writeDeclaredStaticField(final Class<?> cls, final String fieldName, final Object value) throws IllegalAccessException {
-        writeDeclaredStaticField(cls, fieldName, value, false);
-    }
-
-    /**
-     * Writes a named {@code static} {@link Field}. Only the specified class will be considered.
-     * 
-     * @param cls
-     *            {@link Class} on which the field is to be found
-     * @param fieldName
-     *            to write
-     * @param value
-     *            to set
-     * @param forceAccess
-     *            whether to break scope restrictions using the {@code AccessibleObject#setAccessible(boolean)} method.
-     *            {@code false} will only match {@code public} fields.
-     * @throws IllegalArgumentException
-     *             if {@code cls} is {@code null}, the field name is blank or empty, the field cannot be located or is
-     *             not {@code static}, or {@code value} is not assignable
-     * @throws IllegalAccessException
-     *             if the field is not made accessible or is {@code final}
-     */
-    public static void writeDeclaredStaticField(final Class<?> cls, final String fieldName, final Object value, final boolean forceAccess)
-            throws IllegalAccessException {
-        final Field field = getDeclaredField(cls, fieldName, forceAccess);
-        Validate.isTrue(field != null, "Cannot locate declared field %s.%s", cls.getName(), fieldName);
-        // already forced access above, don't repeat it here:
-        writeField(field, (Object) null, value, false);
-    }
-
-    /**
-     * Writes an accessible {@link Field}.
-     * 
-     * @param field
-     *            to write
-     * @param target
-     *            the object to call on, may be {@code null} for {@code static} fields
-     * @param value
-     *            to set
-     * @throws IllegalAccessException
-     *             if the field or target is {@code null}, the field is not accessible or is {@code final}, or
-     *             {@code value} is not assignable
-     */
-    public static void writeField(final Field field, final Object target, final Object value) throws IllegalAccessException {
-        writeField(field, target, value, false);
-    }
-
-    /**
-     * Writes a {@link Field}.
-     * 
-     * @param field
-     *            to write
-     * @param target
-     *            the object to call on, may be {@code null} for {@code static} fields
-     * @param value
-     *            to set
-     * @param forceAccess
-     *            whether to break scope restrictions using the
-     *            {@link java.lang.reflect.AccessibleObject#setAccessible(boolean)} method. {@code false} will only
-     *            match {@code public} fields.
-     * @throws IllegalArgumentException
-     *             if the field is {@code null} or {@code value} is not assignable
-     * @throws IllegalAccessException
-     *             if the field is not made accessible or is {@code final}
-     */
-    public static void writeField(final Field field, final Object target, final Object value, final boolean forceAccess)
-            throws IllegalAccessException {
-        Validate.isTrue(field != null, "The field must not be null");
-        if (forceAccess && !field.isAccessible()) {
-            field.setAccessible(true);
-        } else {
-            MemberUtils.setAccessibleWorkaround(field);
-        }
-        field.set(target, value);
-    }
-
-    /**
-     * Removes the final modifier from a {@link Field}.
-     * 
-     * @param field
-     *            to remove the final modifier
-     * @throws IllegalArgumentException
-     *             if the field is {@code null}
-     * @since 3.2
-     */
-    public static void removeFinalModifier(final Field field) {
-        removeFinalModifier(field, true);
-    }
-
-    /**
-     * Removes the final modifier from a {@link Field}.
-     * 
-     * @param field
-     *            to remove the final modifier
-     * @param forceAccess
-     *            whether to break scope restrictions using the
-     *            {@link java.lang.reflect.AccessibleObject#setAccessible(boolean)} method. {@code false} will only
-     *            match {@code public} fields.
-     * @throws IllegalArgumentException
-     *             if the field is {@code null}
-     * @since 3.3
-     */
-    public static void removeFinalModifier(final Field field, final boolean forceAccess) {
-        Validate.isTrue(field != null, "The field must not be null");
-
-        try {
-            if (Modifier.isFinal(field.getModifiers())) {
-                // Do all JREs implement Field with a private ivar called "modifiers"?
-                final Field modifiersField = Field.class.getDeclaredField("modifiers");
-                final boolean doForceAccess = forceAccess && !modifiersField.isAccessible();
-                if (doForceAccess) {
-                    modifiersField.setAccessible(true);
-                }
-                try {
-                    modifiersField.setInt(field, field.getModifiers() & ~Modifier.FINAL);
-                } finally {
-                    if (doForceAccess) {
-                        modifiersField.setAccessible(false);
-                    }
-                }
-            }
-        } catch (final NoSuchFieldException ignored) {
-            // The field class contains always a modifiers field
-        } catch (final IllegalAccessException ignored) {
-            // The modifiers field is made accessible
-        }
-    }
-
-    /**
-     * Writes a {@code public} {@link Field}. Superclasses will be considered.
-     * 
-     * @param target
-     *            the object to reflect, must not be {@code null}
-     * @param fieldName
-     *            the field name to obtain
-     * @param value
-     *            to set
-     * @throws IllegalArgumentException
-     *             if {@code target} is {@code null}, {@code fieldName} is blank or empty or could not be found, or
-     *             {@code value} is not assignable
-     * @throws IllegalAccessException
-     *             if the field is not accessible
-     */
-    public static void writeField(final Object target, final String fieldName, final Object value) throws IllegalAccessException {
-        writeField(target, fieldName, value, false);
-    }
-
-    /**
-     * Writes a {@link Field}. Superclasses will be considered.
-     * 
-     * @param target
-     *            the object to reflect, must not be {@code null}
-     * @param fieldName
-     *            the field name to obtain
-     * @param value
-     *            to set
-     * @param forceAccess
-     *            whether to break scope restrictions using the
-     *            {@link java.lang.reflect.AccessibleObject#setAccessible(boolean)} method. {@code false} will only
-     *            match {@code public} fields.
-     * @throws IllegalArgumentException
-     *             if {@code target} is {@code null}, {@code fieldName} is blank or empty or could not be found, or
-     *             {@code value} is not assignable
-     * @throws IllegalAccessException
-     *             if the field is not made accessible
-     */
-    public static void writeField(final Object target, final String fieldName, final Object value, final boolean forceAccess)
-            throws IllegalAccessException {
-        Validate.isTrue(target != null, "target object must not be null");
-        final Class<?> cls = target.getClass();
-        final Field field = getField(cls, fieldName, forceAccess);
-        Validate.isTrue(field != null, "Cannot locate declared field %s.%s", cls.getName(), fieldName);
-        // already forced access above, don't repeat it here:
-        writeField(field, target, value, false);
-    }
-
-    /**
-     * Writes a {@code public} {@link Field}. Only the specified class will be considered.
-     * 
-     * @param target
-     *            the object to reflect, must not be {@code null}
-     * @param fieldName
-     *            the field name to obtain
-     * @param value
-     *            to set
-     * @throws IllegalArgumentException
-     *             if {@code target} is {@code null}, {@code fieldName} is blank or empty or could not be found, or
-     *             {@code value} is not assignable
-     * @throws IllegalAccessException
-     *             if the field is not made accessible
-     */
-    public static void writeDeclaredField(final Object target, final String fieldName, final Object value) throws IllegalAccessException {
-        writeDeclaredField(target, fieldName, value, false);
-    }
-
-    /**
-     * Writes a {@code public} {@link Field}. Only the specified class will be considered.
-     * 
-     * @param target
-     *            the object to reflect, must not be {@code null}
-     * @param fieldName
-     *            the field name to obtain
-     * @param value
-     *            to set
-     * @param forceAccess
-     *            whether to break scope restrictions using the
-     *            {@link java.lang.reflect.AccessibleObject#setAccessible(boolean)} method. {@code false} will only
-     *            match {@code public} fields.
-     * @throws IllegalArgumentException
-     *             if {@code target} is {@code null}, {@code fieldName} is blank or empty or could not be found, or
-     *             {@code value} is not assignable
-     * @throws IllegalAccessException
-     *             if the field is not made accessible
-     */
-    public static void writeDeclaredField(final Object target, final String fieldName, final Object value, final boolean forceAccess)
-            throws IllegalAccessException {
-        Validate.isTrue(target != null, "target object must not be null");
-        final Class<?> cls = target.getClass();
-        final Field field = getDeclaredField(cls, fieldName, forceAccess);
-        Validate.isTrue(field != null, "Cannot locate declared field %s.%s", cls.getName(), fieldName);
-        // already forced access above, don't repeat it here:
-        writeField(field, target, value, false);
-    }
-}
diff --git a/lang/src/main/java/org/apache/commons/lang3/reflect/InheritanceUtils.java b/lang/src/main/java/org/apache/commons/lang3/reflect/InheritanceUtils.java
deleted file mode 100644
index 4f97f98..0000000
--- a/lang/src/main/java/org/apache/commons/lang3/reflect/InheritanceUtils.java
+++ /dev/null
@@ -1,67 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.commons.lang3.reflect;
-
-import org.apache.commons.lang3.BooleanUtils;
-
-/**
- * <p>Utility methods focusing on inheritance.</p>
- *
- * @since 3.2
- */
-public class InheritanceUtils {
-
-    /**
-     * <p>{@link InheritanceUtils} instances should NOT be constructed in standard programming.
-     * Instead, the class should be used as
-     * {@code MethodUtils.getAccessibleMethod(method)}.</p>
-     *
-     * <p>This constructor is {@code public} to permit tools that require a JavaBean
-     * instance to operate.</p>
-     */
-    public InheritanceUtils() {
-        super();
-    }
-
-    /**
-     * <p>Returns the number of inheritance hops between two classes.</p>
-     *
-     * @param child the child class, may be {@code null}
-     * @param parent the parent class, may be {@code null}
-     * @return the number of generations between the child and parent; 0 if the same class;
-     * -1 if the classes are not related as child and parent (includes where either class is null)
-     * @since 3.2
-     */
-    public static int distance(final Class<?> child, final Class<?> parent) {
-        if (child == null || parent == null) {
-            return -1;
-        }
-
-        if (child.equals(parent)) {
-            return 0;
-        }
-
-        final Class<?> cParent = child.getSuperclass();
-        int d = BooleanUtils.toInteger(parent.equals(cParent));
-
-        if (d == 1) {
-            return d;
-        }
-        d += distance(cParent, parent);
-        return d > 0 ? d + 1 : -1;
-    }
-}
diff --git a/lang/src/main/java/org/apache/commons/lang3/reflect/MemberUtils.java b/lang/src/main/java/org/apache/commons/lang3/reflect/MemberUtils.java
deleted file mode 100644
index f379db6..0000000
--- a/lang/src/main/java/org/apache/commons/lang3/reflect/MemberUtils.java
+++ /dev/null
@@ -1,186 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.commons.lang3.reflect;
-
-import java.lang.reflect.AccessibleObject;
-import java.lang.reflect.Member;
-import java.lang.reflect.Modifier;
-
-import org.apache.commons.lang3.ClassUtils;
-
-/**
- * Contains common code for working with {@link java.lang.reflect.Method Methods}/{@link java.lang.reflect.Constructor Constructors},
- * extracted and refactored from {@link MethodUtils} when it was imported from Commons BeanUtils.
- *
- * @since 2.5
- * @version $Id$
- */
-abstract class MemberUtils {
-    // TODO extract an interface to implement compareParameterSets(...)?
-
-    private static final int ACCESS_TEST = Modifier.PUBLIC | Modifier.PROTECTED | Modifier.PRIVATE;
-
-    /** Array of primitive number types ordered by "promotability" */
-    private static final Class<?>[] ORDERED_PRIMITIVE_TYPES = { Byte.TYPE, Short.TYPE,
-            Character.TYPE, Integer.TYPE, Long.TYPE, Float.TYPE, Double.TYPE };
-
-    /**
-     * XXX Default access superclass workaround.
-     *
-     * When a {@code public} class has a default access superclass with {@code public} members,
-     * these members are accessible. Calling them from compiled code works fine.
-     * Unfortunately, on some JVMs, using reflection to invoke these members
-     * seems to (wrongly) prevent access even when the modifier is {@code public}.
-     * Calling {@code setAccessible(true)} solves the problem but will only work from
-     * sufficiently privileged code. Better workarounds would be gratefully
-     * accepted.
-     * @param o the AccessibleObject to set as accessible
-     * @return a boolean indicating whether the accessibility of the object was set to true.
-     */
-    static boolean setAccessibleWorkaround(final AccessibleObject o) {
-        if (o == null || o.isAccessible()) {
-            return false;
-        }
-        final Member m = (Member) o;
-        if (!o.isAccessible() && Modifier.isPublic(m.getModifiers()) && isPackageAccess(m.getDeclaringClass().getModifiers())) {
-            try {
-                o.setAccessible(true);
-                return true;
-            } catch (final SecurityException e) { // NOPMD
-                // ignore in favor of subsequent IllegalAccessException
-            }
-        }
-        return false;
-    }
-
-    /**
-     * Returns whether a given set of modifiers implies package access.
-     * @param modifiers to test
-     * @return {@code true} unless {@code package}/{@code protected}/{@code private} modifier detected
-     */
-    static boolean isPackageAccess(final int modifiers) {
-        return (modifiers & ACCESS_TEST) == 0;
-    }
-
-    /**
-     * Returns whether a {@link Member} is accessible.
-     * @param m Member to check
-     * @return {@code true} if <code>m</code> is accessible
-     */
-    static boolean isAccessible(final Member m) {
-        return m != null && Modifier.isPublic(m.getModifiers()) && !m.isSynthetic();
-    }
-
-    /**
-     * Compares the relative fitness of two sets of parameter types in terms of
-     * matching a third set of runtime parameter types, such that a list ordered
-     * by the results of the comparison would return the best match first
-     * (least).
-     *
-     * @param left the "left" parameter set
-     * @param right the "right" parameter set
-     * @param actual the runtime parameter types to match against
-     * {@code left}/{@code right}
-     * @return int consistent with {@code compare} semantics
-     */
-    static int compareParameterTypes(final Class<?>[] left, final Class<?>[] right, final Class<?>[] actual) {
-        final float leftCost = getTotalTransformationCost(actual, left);
-        final float rightCost = getTotalTransformationCost(actual, right);
-        return leftCost < rightCost ? -1 : rightCost < leftCost ? 1 : 0;
-    }
-
-    /**
-     * Returns the sum of the object transformation cost for each class in the
-     * source argument list.
-     * @param srcArgs The source arguments
-     * @param destArgs The destination arguments
-     * @return The total transformation cost
-     */
-    private static float getTotalTransformationCost(final Class<?>[] srcArgs, final Class<?>[] destArgs) {
-        float totalCost = 0.0f;
-        for (int i = 0; i < srcArgs.length; i++) {
-            Class<?> srcClass, destClass;
-            srcClass = srcArgs[i];
-            destClass = destArgs[i];
-            totalCost += getObjectTransformationCost(srcClass, destClass);
-        }
-        return totalCost;
-    }
-
-    /**
-     * Gets the number of steps required needed to turn the source class into
-     * the destination class. This represents the number of steps in the object
-     * hierarchy graph.
-     * @param srcClass The source class
-     * @param destClass The destination class
-     * @return The cost of transforming an object
-     */
-    private static float getObjectTransformationCost(Class<?> srcClass, final Class<?> destClass) {
-        if (destClass.isPrimitive()) {
-            return getPrimitivePromotionCost(srcClass, destClass);
-        }
-        float cost = 0.0f;
-        while (srcClass != null && !destClass.equals(srcClass)) {
-            if (destClass.isInterface() && ClassUtils.isAssignable(srcClass, destClass)) {
-                // slight penalty for interface match.
-                // we still want an exact match to override an interface match,
-                // but
-                // an interface match should override anything where we have to
-                // get a superclass.
-                cost += 0.25f;
-                break;
-            }
-            cost++;
-            srcClass = srcClass.getSuperclass();
-        }
-        /*
-         * If the destination class is null, we've travelled all the way up to
-         * an Object match. We'll penalize this by adding 1.5 to the cost.
-         */
-        if (srcClass == null) {
-            cost += 1.5f;
-        }
-        return cost;
-    }
-
-    /**
-     * Gets the number of steps required to promote a primitive number to another
-     * type.
-     * @param srcClass the (primitive) source class
-     * @param destClass the (primitive) destination class
-     * @return The cost of promoting the primitive
-     */
-    private static float getPrimitivePromotionCost(final Class<?> srcClass, final Class<?> destClass) {
-        float cost = 0.0f;
-        Class<?> cls = srcClass;
-        if (!cls.isPrimitive()) {
-            // slight unwrapping penalty
-            cost += 0.1f;
-            cls = ClassUtils.wrapperToPrimitive(cls);
-        }
-        for (int i = 0; cls != destClass && i < ORDERED_PRIMITIVE_TYPES.length; i++) {
-            if (cls == ORDERED_PRIMITIVE_TYPES[i]) {
-                cost += 0.1f;
-                if (i < ORDERED_PRIMITIVE_TYPES.length - 1) {
-                    cls = ORDERED_PRIMITIVE_TYPES[i + 1];
-                }
-            }
-        }
-        return cost;
-    }
-
-}
diff --git a/lang/src/main/java/org/apache/commons/lang3/reflect/MethodUtils.java b/lang/src/main/java/org/apache/commons/lang3/reflect/MethodUtils.java
deleted file mode 100644
index 6c2d507..0000000
--- a/lang/src/main/java/org/apache/commons/lang3/reflect/MethodUtils.java
+++ /dev/null
@@ -1,639 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.commons.lang3.reflect;
-
-import java.lang.annotation.Annotation;
-import java.lang.reflect.InvocationTargetException;
-import java.lang.reflect.Method;
-import java.lang.reflect.Modifier;
-import java.lang.reflect.Type;
-import java.lang.reflect.TypeVariable;
-import java.util.Arrays;
-import java.util.ArrayList;
-import java.util.Iterator;
-import java.util.LinkedHashSet;
-import java.util.List;
-import java.util.Map;
-import java.util.Set;
-
-import org.apache.commons.lang3.ArrayUtils;
-import org.apache.commons.lang3.ClassUtils;
-import org.apache.commons.lang3.ClassUtils.Interfaces;
-import org.apache.commons.lang3.Validate;
-
-/**
- * <p>Utility reflection methods focused on {@link Method}s, originally from Commons BeanUtils.
- * Differences from the BeanUtils version may be noted, especially where similar functionality
- * already existed within Lang.
- * </p>
- *
- * <h3>Known Limitations</h3>
- * <h4>Accessing Public Methods In A Default Access Superclass</h4>
- * <p>There is an issue when invoking {@code public} methods contained in a default access superclass on JREs prior to 1.4.
- * Reflection locates these methods fine and correctly assigns them as {@code public}.
- * However, an {@link IllegalAccessException} is thrown if the method is invoked.</p>
- *
- * <p>{@link MethodUtils} contains a workaround for this situation. 
- * It will attempt to call {@link java.lang.reflect.AccessibleObject#setAccessible(boolean)} on this method.
- * If this call succeeds, then the method can be invoked as normal.
- * This call will only succeed when the application has sufficient security privileges. 
- * If this call fails then the method may fail.</p>
- *
- * @since 2.5
- * @version $Id$
- */
-public class MethodUtils {
-
-    /**
-     * <p>{@link MethodUtils} instances should NOT be constructed in standard programming.
-     * Instead, the class should be used as
-     * {@code MethodUtils.getAccessibleMethod(method)}.</p>
-     *
-     * <p>This constructor is {@code public} to permit tools that require a JavaBean
-     * instance to operate.</p>
-     */
-    public MethodUtils() {
-        super();
-    }
-
-    /**
-     * <p>Invokes a named method without parameters.</p>
-     *
-     * <p>This method delegates the method search to {@link #getMatchingAccessibleMethod(Class, String, Class[])}.</p>
-     *
-     * <p>This is a convenient wrapper for
-     * {@link #invokeMethod(Object object,String methodName, Object[] args, Class[] parameterTypes)}.
-     * </p>
-     *
-     * @param object invoke method on this object
-     * @param methodName get method with this name
-     * @return The value returned by the invoked method
-     *
-     * @throws NoSuchMethodException if there is no such accessible method
-     * @throws InvocationTargetException wraps an exception thrown by the method invoked
-     * @throws IllegalAccessException if the requested method is not accessible via reflection
-     *  
-     *  @since 3.4
-     */
-    public static Object invokeMethod(final Object object, final String methodName) throws NoSuchMethodException,
-            IllegalAccessException, InvocationTargetException {
-        return invokeMethod(object, methodName, ArrayUtils.EMPTY_OBJECT_ARRAY, null);
-    }
-
-    /**
-     * <p>Invokes a named method whose parameter type matches the object type.</p>
-     *
-     * <p>This method delegates the method search to {@link #getMatchingAccessibleMethod(Class, String, Class[])}.</p>
-     *
-     * <p>This method supports calls to methods taking primitive parameters 
-     * via passing in wrapping classes. So, for example, a {@code Boolean} object
-     * would match a {@code boolean} primitive.</p>
-     *
-     * <p>This is a convenient wrapper for
-     * {@link #invokeMethod(Object object,String methodName, Object[] args, Class[] parameterTypes)}.
-     * </p>
-     *
-     * @param object invoke method on this object
-     * @param methodName get method with this name
-     * @param args use these arguments - treat null as empty array
-     * @return The value returned by the invoked method
-     *
-     * @throws NoSuchMethodException if there is no such accessible method
-     * @throws InvocationTargetException wraps an exception thrown by the method invoked
-     * @throws IllegalAccessException if the requested method is not accessible via reflection
-     */
-    public static Object invokeMethod(final Object object, final String methodName,
-            Object... args) throws NoSuchMethodException,
-            IllegalAccessException, InvocationTargetException {
-        args = ArrayUtils.nullToEmpty(args);
-        final Class<?>[] parameterTypes = ClassUtils.toClass(args);
-        return invokeMethod(object, methodName, args, parameterTypes);
-    }
-
-    /**
-     * <p>Invokes a named method whose parameter type matches the object type.</p>
-     *
-     * <p>This method delegates the method search to {@link #getMatchingAccessibleMethod(Class, String, Class[])}.</p>
-     *
-     * <p>This method supports calls to methods taking primitive parameters 
-     * via passing in wrapping classes. So, for example, a {@code Boolean} object
-     * would match a {@code boolean} primitive.</p>
-     *
-     * @param object invoke method on this object
-     * @param methodName get method with this name
-     * @param args use these arguments - treat null as empty array
-     * @param parameterTypes match these parameters - treat null as empty array
-     * @return The value returned by the invoked method
-     *
-     * @throws NoSuchMethodException if there is no such accessible method
-     * @throws InvocationTargetException wraps an exception thrown by the method invoked
-     * @throws IllegalAccessException if the requested method is not accessible via reflection
-     */
-    public static Object invokeMethod(final Object object, final String methodName,
-            Object[] args, Class<?>[] parameterTypes)
-            throws NoSuchMethodException, IllegalAccessException,
-            InvocationTargetException {
-        parameterTypes = ArrayUtils.nullToEmpty(parameterTypes);
-        args = ArrayUtils.nullToEmpty(args);
-        final Method method = getMatchingAccessibleMethod(object.getClass(),
-                methodName, parameterTypes);
-        if (method == null) {
-            throw new NoSuchMethodException("No such accessible method: "
-                    + methodName + "() on object: "
-                    + object.getClass().getName());
-        }
-        return method.invoke(object, args);
-    }
-
-    /**
-     * <p>Invokes a method whose parameter types match exactly the object
-     * types.</p>
-     *
-     * <p>This uses reflection to invoke the method obtained from a call to
-     * {@link #getAccessibleMethod}(Class,String,Class[])}.</p>
-     *
-     * @param object invoke method on this object
-     * @param methodName get method with this name
-     * @return The value returned by the invoked method
-     *
-     * @throws NoSuchMethodException if there is no such accessible method
-     * @throws InvocationTargetException wraps an exception thrown by the
-     *  method invoked
-     * @throws IllegalAccessException if the requested method is not accessible
-     *  via reflection
-     *  
-     *  @since 3.4
-     */
-    public static Object invokeExactMethod(final Object object, final String methodName) throws NoSuchMethodException,
-            IllegalAccessException, InvocationTargetException {
-        return invokeExactMethod(object, methodName, ArrayUtils.EMPTY_OBJECT_ARRAY, null);
-    }
-
-    /**
-     * <p>Invokes a method with no parameters.</p>
-     *
-     * <p>This uses reflection to invoke the method obtained from a call to
-     * {@link #getAccessibleMethod}(Class,String,Class[])}.</p>
-     *
-     * @param object invoke method on this object
-     * @param methodName get method with this name
-     * @param args use these arguments - treat null as empty array
-     * @return The value returned by the invoked method
-     *
-     * @throws NoSuchMethodException if there is no such accessible method
-     * @throws InvocationTargetException wraps an exception thrown by the
-     *  method invoked
-     * @throws IllegalAccessException if the requested method is not accessible
-     *  via reflection
-     */
-    public static Object invokeExactMethod(final Object object, final String methodName,
-            Object... args) throws NoSuchMethodException,
-            IllegalAccessException, InvocationTargetException {
-        args = ArrayUtils.nullToEmpty(args);
-        final Class<?>[] parameterTypes = ClassUtils.toClass(args);
-        return invokeExactMethod(object, methodName, args, parameterTypes);
-    }
-
-    /**
-     * <p>Invokes a method whose parameter types match exactly the parameter
-     * types given.</p>
-     *
-     * <p>This uses reflection to invoke the method obtained from a call to
-     * {@link #getAccessibleMethod(Class,String,Class[])}.</p>
-     *
-     * @param object invoke method on this object
-     * @param methodName get method with this name
-     * @param args use these arguments - treat null as empty array
-     * @param parameterTypes match these parameters - treat {@code null} as empty array
-     * @return The value returned by the invoked method
-     *
-     * @throws NoSuchMethodException if there is no such accessible method
-     * @throws InvocationTargetException wraps an exception thrown by the
-     *  method invoked
-     * @throws IllegalAccessException if the requested method is not accessible
-     *  via reflection
-     */
-    public static Object invokeExactMethod(final Object object, final String methodName,
-            Object[] args, Class<?>[] parameterTypes)
-            throws NoSuchMethodException, IllegalAccessException,
-            InvocationTargetException {
-        args = ArrayUtils.nullToEmpty(args);
-        parameterTypes = ArrayUtils.nullToEmpty(parameterTypes);
-        final Method method = getAccessibleMethod(object.getClass(), methodName,
-                parameterTypes);
-        if (method == null) {
-            throw new NoSuchMethodException("No such accessible method: "
-                    + methodName + "() on object: "
-                    + object.getClass().getName());
-        }
-        return method.invoke(object, args);
-    }
-
-    /**
-     * <p>Invokes a {@code static} method whose parameter types match exactly the parameter
-     * types given.</p>
-     *
-     * <p>This uses reflection to invoke the method obtained from a call to
-     * {@link #getAccessibleMethod(Class, String, Class[])}.</p>
-     *
-     * @param cls invoke static method on this class
-     * @param methodName get method with this name
-     * @param args use these arguments - treat {@code null} as empty array
-     * @param parameterTypes match these parameters - treat {@code null} as empty array
-     * @return The value returned by the invoked method
-     *
-     * @throws NoSuchMethodException if there is no such accessible method
-     * @throws InvocationTargetException wraps an exception thrown by the
-     *  method invoked
-     * @throws IllegalAccessException if the requested method is not accessible
-     *  via reflection
-     */
-    public static Object invokeExactStaticMethod(final Class<?> cls, final String methodName,
-            Object[] args, Class<?>[] parameterTypes)
-            throws NoSuchMethodException, IllegalAccessException,
-            InvocationTargetException {
-        args = ArrayUtils.nullToEmpty(args);
-        parameterTypes = ArrayUtils.nullToEmpty(parameterTypes);
-        final Method method = getAccessibleMethod(cls, methodName, parameterTypes);
-        if (method == null) {
-            throw new NoSuchMethodException("No such accessible method: "
-                    + methodName + "() on class: " + cls.getName());
-        }
-        return method.invoke(null, args);
-    }
-
-    /**
-     * <p>Invokes a named {@code static} method whose parameter type matches the object type.</p>
-     *
-     * <p>This method delegates the method search to {@link #getMatchingAccessibleMethod(Class, String, Class[])}.</p>
-     *
-     * <p>This method supports calls to methods taking primitive parameters 
-     * via passing in wrapping classes. So, for example, a {@code Boolean} class
-     * would match a {@code boolean} primitive.</p>
-     *
-     * <p>This is a convenient wrapper for
-     * {@link #invokeStaticMethod(Class, String, Object[], Class[])}.
-     * </p>
-     *
-     * @param cls invoke static method on this class
-     * @param methodName get method with this name
-     * @param args use these arguments - treat {@code null} as empty array
-     * @return The value returned by the invoked method
-     *
-     * @throws NoSuchMethodException if there is no such accessible method
-     * @throws InvocationTargetException wraps an exception thrown by the
-     *  method invoked
-     * @throws IllegalAccessException if the requested method is not accessible
-     *  via reflection
-     */
-    public static Object invokeStaticMethod(final Class<?> cls, final String methodName,
-            Object... args) throws NoSuchMethodException,
-            IllegalAccessException, InvocationTargetException {
-        args = ArrayUtils.nullToEmpty(args);
-        final Class<?>[] parameterTypes = ClassUtils.toClass(args);
-        return invokeStaticMethod(cls, methodName, args, parameterTypes);
-    }
-
-    /**
-     * <p>Invokes a named {@code static} method whose parameter type matches the object type.</p>
-     *
-     * <p>This method delegates the method search to {@link #getMatchingAccessibleMethod(Class, String, Class[])}.</p>
-     *
-     * <p>This method supports calls to methods taking primitive parameters 
-     * via passing in wrapping classes. So, for example, a {@code Boolean} class
-     * would match a {@code boolean} primitive.</p>
-     *
-     *
-     * @param cls invoke static method on this class
-     * @param methodName get method with this name
-     * @param args use these arguments - treat {@code null} as empty array
-     * @param parameterTypes match these parameters - treat {@code null} as empty array
-     * @return The value returned by the invoked method
-     *
-     * @throws NoSuchMethodException if there is no such accessible method
-     * @throws InvocationTargetException wraps an exception thrown by the
-     *  method invoked
-     * @throws IllegalAccessException if the requested method is not accessible
-     *  via reflection
-     */
-    public static Object invokeStaticMethod(final Class<?> cls, final String methodName,
-            Object[] args, Class<?>[] parameterTypes)
-            throws NoSuchMethodException, IllegalAccessException,
-            InvocationTargetException {
-        args = ArrayUtils.nullToEmpty(args);
-        parameterTypes = ArrayUtils.nullToEmpty(parameterTypes);
-        final Method method = getMatchingAccessibleMethod(cls, methodName,
-                parameterTypes);
-        if (method == null) {
-            throw new NoSuchMethodException("No such accessible method: "
-                    + methodName + "() on class: " + cls.getName());
-        }
-        return method.invoke(null, args);
-    }
-
-    /**
-     * <p>Invokes a {@code static} method whose parameter types match exactly the object
-     * types.</p>
-     *
-     * <p>This uses reflection to invoke the method obtained from a call to
-     * {@link #getAccessibleMethod(Class, String, Class[])}.</p>
-     *
-     * @param cls invoke static method on this class
-     * @param methodName get method with this name
-     * @param args use these arguments - treat {@code null} as empty array
-     * @return The value returned by the invoked method
-     *
-     * @throws NoSuchMethodException if there is no such accessible method
-     * @throws InvocationTargetException wraps an exception thrown by the
-     *  method invoked
-     * @throws IllegalAccessException if the requested method is not accessible
-     *  via reflection
-     */
-    public static Object invokeExactStaticMethod(final Class<?> cls, final String methodName,
-            Object... args) throws NoSuchMethodException,
-            IllegalAccessException, InvocationTargetException {
-        args = ArrayUtils.nullToEmpty(args);
-        final Class<?>[] parameterTypes = ClassUtils.toClass(args);
-        return invokeExactStaticMethod(cls, methodName, args, parameterTypes);
-    }
-
-    /**
-     * <p>Returns an accessible method (that is, one that can be invoked via
-     * reflection) with given name and parameters. If no such method
-     * can be found, return {@code null}.
-     * This is just a convenience wrapper for
-     * {@link #getAccessibleMethod(Method)}.</p>
-     *
-     * @param cls get method from this class
-     * @param methodName get method with this name
-     * @param parameterTypes with these parameters types
-     * @return The accessible method
-     */
-    public static Method getAccessibleMethod(final Class<?> cls, final String methodName,
-            final Class<?>... parameterTypes) {
-        try {
-            return getAccessibleMethod(cls.getMethod(methodName,
-                    parameterTypes));
-        } catch (final NoSuchMethodException e) {
-            return null;
-        }
-    }
-
-    /**
-     * <p>Returns an accessible method (that is, one that can be invoked via
-     * reflection) that implements the specified Method. If no such method
-     * can be found, return {@code null}.</p>
-     *
-     * @param method The method that we wish to call
-     * @return The accessible method
-     */
-    public static Method getAccessibleMethod(Method method) {
-        if (!MemberUtils.isAccessible(method)) {
-            return null;
-        }
-        // If the declaring class is public, we are done
-        final Class<?> cls = method.getDeclaringClass();
-        if (Modifier.isPublic(cls.getModifiers())) {
-            return method;
-        }
-        final String methodName = method.getName();
-        final Class<?>[] parameterTypes = method.getParameterTypes();
-
-        // Check the implemented interfaces and subinterfaces
-        method = getAccessibleMethodFromInterfaceNest(cls, methodName,
-                parameterTypes);
-
-        // Check the superclass chain
-        if (method == null) {
-            method = getAccessibleMethodFromSuperclass(cls, methodName,
-                    parameterTypes);
-        }
-        return method;
-    }
-
-    /**
-     * <p>Returns an accessible method (that is, one that can be invoked via
-     * reflection) by scanning through the superclasses. If no such method
-     * can be found, return {@code null}.</p>
-     *
-     * @param cls Class to be checked
-     * @param methodName Method name of the method we wish to call
-     * @param parameterTypes The parameter type signatures
-     * @return the accessible method or {@code null} if not found
-     */
-    private static Method getAccessibleMethodFromSuperclass(final Class<?> cls,
-            final String methodName, final Class<?>... parameterTypes) {
-        Class<?> parentClass = cls.getSuperclass();
-        while (parentClass != null) {
-            if (Modifier.isPublic(parentClass.getModifiers())) {
-                try {
-                    return parentClass.getMethod(methodName, parameterTypes);
-                } catch (final NoSuchMethodException e) {
-                    return null;
-                }
-            }
-            parentClass = parentClass.getSuperclass();
-        }
-        return null;
-    }
-
-    /**
-     * <p>Returns an accessible method (that is, one that can be invoked via
-     * reflection) that implements the specified method, by scanning through
-     * all implemented interfaces and subinterfaces. If no such method
-     * can be found, return {@code null}.</p>
-     *
-     * <p>There isn't any good reason why this method must be {@code private}.
-     * It is because there doesn't seem any reason why other classes should
-     * call this rather than the higher level methods.</p>
-     *
-     * @param cls Parent class for the interfaces to be checked
-     * @param methodName Method name of the method we wish to call
-     * @param parameterTypes The parameter type signatures
-     * @return the accessible method or {@code null} if not found
-     */
-    private static Method getAccessibleMethodFromInterfaceNest(Class<?> cls,
-            final String methodName, final Class<?>... parameterTypes) {
-        // Search up the superclass chain
-        for (; cls != null; cls = cls.getSuperclass()) {
-
-            // Check the implemented interfaces of the parent class
-            final Class<?>[] interfaces = cls.getInterfaces();
-            for (int i = 0; i < interfaces.length; i++) {
-                // Is this interface public?
-                if (!Modifier.isPublic(interfaces[i].getModifiers())) {
-                    continue;
-                }
-                // Does the method exist on this interface?
-                try {
-                    return interfaces[i].getDeclaredMethod(methodName,
-                            parameterTypes);
-                } catch (final NoSuchMethodException e) { // NOPMD
-                    /*
-                     * Swallow, if no method is found after the loop then this
-                     * method returns null.
-                     */
-                }
-                // Recursively check our parent interfaces
-                final Method method = getAccessibleMethodFromInterfaceNest(interfaces[i],
-                        methodName, parameterTypes);
-                if (method != null) {
-                    return method;
-                }
-            }
-        }
-        return null;
-    }
-
-    /**
-     * <p>Finds an accessible method that matches the given name and has compatible parameters.
-     * Compatible parameters mean that every method parameter is assignable from 
-     * the given parameters.
-     * In other words, it finds a method with the given name 
-     * that will take the parameters given.</p>
-     *
-     * <p>This method is used by 
-     * {@link 
-     * #invokeMethod(Object object, String methodName, Object[] args, Class[] parameterTypes)}.
-     * </p>
-     *
-     * <p>This method can match primitive parameter by passing in wrapper classes.
-     * For example, a {@code Boolean} will match a primitive {@code boolean}
-     * parameter.
-     * </p>
-     *
-     * @param cls find method in this class
-     * @param methodName find method with this name
-     * @param parameterTypes find method with most compatible parameters 
-     * @return The accessible method
-     */
-    public static Method getMatchingAccessibleMethod(final Class<?> cls,
-            final String methodName, final Class<?>... parameterTypes) {
-        try {
-            final Method method = cls.getMethod(methodName, parameterTypes);
-            MemberUtils.setAccessibleWorkaround(method);
-            return method;
-        } catch (final NoSuchMethodException e) { // NOPMD - Swallow the exception
-        }
-        // search through all methods
-        Method bestMatch = null;
-        final Method[] methods = cls.getMethods();
-        for (final Method method : methods) {
-            // compare name and parameters
-            if (method.getName().equals(methodName) && ClassUtils.isAssignable(parameterTypes, method.getParameterTypes(), true)) {
-                // get accessible version of method
-                final Method accessibleMethod = getAccessibleMethod(method);
-                if (accessibleMethod != null && (bestMatch == null || MemberUtils.compareParameterTypes(
-                            accessibleMethod.getParameterTypes(),
-                            bestMatch.getParameterTypes(),
-                            parameterTypes) < 0)) {
-                        bestMatch = accessibleMethod;
-                 }
-            }
-        }
-        if (bestMatch != null) {
-            MemberUtils.setAccessibleWorkaround(bestMatch);
-        }
-        return bestMatch;
-    }
-
-    /**
-     * Get the hierarchy of overridden methods down to {@code result} respecting generics.
-     * @param method lowest to consider
-     * @param interfacesBehavior whether to search interfaces, {@code null} {@code implies} false
-     * @return Set&lt;Method&gt; in ascending order from sub- to superclass
-     * @throws NullPointerException if the specified method is {@code null}
-     * @since 3.2
-     */
-    public static Set<Method> getOverrideHierarchy(final Method method, final Interfaces interfacesBehavior) {
-        Validate.notNull(method);
-        final Set<Method> result = new LinkedHashSet<Method>();
-        result.add(method);
-
-        final Class<?>[] parameterTypes = method.getParameterTypes();
-
-        final Class<?> declaringClass = method.getDeclaringClass();
-
-        final Iterator<Class<?>> hierarchy = ClassUtils.hierarchy(declaringClass, interfacesBehavior).iterator();
-        //skip the declaring class :P
-        hierarchy.next();
-        hierarchyTraversal: while (hierarchy.hasNext()) {
-            final Class<?> c = hierarchy.next();
-            final Method m = getMatchingAccessibleMethod(c, method.getName(), parameterTypes);
-            if (m == null) {
-                continue;
-            }
-            if (Arrays.equals(m.getParameterTypes(), parameterTypes)) {
-                // matches without generics
-                result.add(m);
-                continue;
-            }
-            // necessary to get arguments every time in the case that we are including interfaces
-            final Map<TypeVariable<?>, Type> typeArguments = TypeUtils.getTypeArguments(declaringClass, m.getDeclaringClass());
-            for (int i = 0; i < parameterTypes.length; i++) {
-                final Type childType = TypeUtils.unrollVariables(typeArguments, method.getGenericParameterTypes()[i]);
-                final Type parentType = TypeUtils.unrollVariables(typeArguments, m.getGenericParameterTypes()[i]);
-                if (!TypeUtils.equals(childType, parentType)) {
-                    continue hierarchyTraversal;
-                }
-            }
-            result.add(m);
-        }
-        return result;
-    }
-
-    /**
-     * Gets all methods of the given class that are annotated with the given annotation.
-     * @param cls
-     *            the {@link Class} to query
-     * @param annotationCls
-     *            the {@link java.lang.annotation.Annotation} that must be present on a method to be matched
-     * @return an array of Methods (possibly empty).
-     * @throws IllegalArgumentException
-     *            if the class or annotation are {@code null}
-     * @since 3.4
-     */
-    public static Method[] getMethodsWithAnnotation(final Class<?> cls, final Class<? extends Annotation> annotationCls) {
-        final List<Method> annotatedMethodsList = getMethodsListWithAnnotation(cls, annotationCls);
-        return annotatedMethodsList.toArray(new Method[annotatedMethodsList.size()]);
-    }
-
-    /**
-     * Gets all methods of the given class that are annotated with the given annotation.
-     * @param cls
-     *            the {@link Class} to query
-     * @param annotationCls
-     *            the {@link Annotation} that must be present on a method to be matched
-     * @return a list of Methods (possibly empty).
-     * @throws IllegalArgumentException
-     *            if the class or annotation are {@code null}
-     * @since 3.4
-     */
-    public static List<Method> getMethodsListWithAnnotation(final Class<?> cls, final Class<? extends Annotation> annotationCls) {
-        Validate.isTrue(cls != null, "The class must not be null");
-        Validate.isTrue(annotationCls != null, "The annotation class must not be null");
-        final Method[] allMethods = cls.getMethods();
-        final List<Method> annotatedMethods = new ArrayList<Method>();
-        for (final Method method : allMethods) {
-            if (method.getAnnotation(annotationCls) != null) {
-                annotatedMethods.add(method);
-            }
-        }
-        return annotatedMethods;
-    }
-
-}
diff --git a/lang/src/main/java/org/apache/commons/lang3/reflect/TypeLiteral.java b/lang/src/main/java/org/apache/commons/lang3/reflect/TypeLiteral.java
deleted file mode 100644
index 138d9b0..0000000
--- a/lang/src/main/java/org/apache/commons/lang3/reflect/TypeLiteral.java
+++ /dev/null
@@ -1,124 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.commons.lang3.reflect;
-
-import java.lang.reflect.Type;
-import java.lang.reflect.TypeVariable;
-
-import org.apache.commons.lang3.Validate;
-
-/**
- * <p>Type literal comparable to {@code javax.enterprise.util.TypeLiteral},
- * made generally available outside the JEE context. Allows the passing around of
- * a "token" that represents a type in a typesafe manner, as opposed to
- * passing the (non-parameterized) {@link Type} object itself. Consider:</p>
- * <p>
- * You might see such a typesafe API as:
- * <pre>
- * class Typesafe {
- *   &lt;T&gt; T obtain(Class&lt;T&gt; type, ...);
- * }
- * </pre>
- * Consumed in the manner of:
- * <pre>
- * Foo foo = typesafe.obtain(Foo.class, ...);
- * </pre>
- * Yet, you run into problems when you want to do this with a parameterized type:
- * <pre>
- * List&lt;String&gt; listOfString = typesafe.obtain(List.class, ...); // could only give us a raw List
- * </pre>
- * {@code java.lang.reflect.Type} might provide some value:
- * <pre>
- * Type listOfStringType = ...; // firstly, how to obtain this? Doable, but not straightforward.
- * List&lt;String&gt; listOfString = (List&lt;String&gt;) typesafe.obtain(listOfStringType, ...); // nongeneric Type would necessitate a cast
- * </pre>
- * The "type literal" concept was introduced to provide an alternative, i.e.:
- * <pre>
- * class Typesafe {
- *   &lt;T&gt; T obtain(TypeLiteral&lt;T&gt; type, ...);
- * }
- * </pre>
- * Consuming code looks like:
- * <pre>
- * List&lt;String&gt; listOfString = typesafe.obtain(new TypeLiteral&lt;List&lt;String&gt;&gt;() {}, ...);
- * </pre>
- * <p>
- * This has the effect of "jumping up" a level to tie a {@code java.lang.reflect.Type}
- * to a type variable while simultaneously making it short work to obtain a
- * {@code Type} instance for any given type, inline.
- * </p>
- * <p>Additionally {@link TypeLiteral} implements the {@link Typed} interface which
- * is a generalization of this concept, and which may be implemented in custom classes.
- * It is suggested that APIs be defined in terms of the interface, in the following manner:
- * </p>
- * <pre>
- *   &lt;T&gt; T obtain(Typed&lt;T&gt; typed, ...);
- * </pre>
- *
- * @version $Id$
- * @since 3.2
- */
-public abstract class TypeLiteral<T> implements Typed<T> {
-
-    @SuppressWarnings("rawtypes")
-    private static final TypeVariable<Class<TypeLiteral>> T = TypeLiteral.class.getTypeParameters()[0];
-
-    /**
-     * Represented type.
-     */
-    public final Type value;
-
-    private final String toString;
-
-    /**
-     * The default constructor.
-     */
-    protected TypeLiteral() {
-        this.value =
-            Validate.notNull(TypeUtils.getTypeArguments(getClass(), TypeLiteral.class).get(T),
-                "%s does not assign type parameter %s", getClass(), TypeUtils.toLongString(T));
-
-        this.toString = String.format("%s<%s>", TypeLiteral.class.getSimpleName(), TypeUtils.toString(value));
-    }
-
-    @Override
-    public final boolean equals(final Object obj) {
-        if (obj == this) {
-            return true;
-        }
-        if (obj instanceof TypeLiteral == false) {
-            return false;
-        }
-        final TypeLiteral<?> other = (TypeLiteral<?>) obj;
-        return TypeUtils.equals(value, other.value);
-    }
-
-    @Override 
-    public int hashCode() {
-        return 37 << 4 | value.hashCode();
-    }
-
-    @Override
-    public String toString() {
-        return toString;
-    }
-
-    @Override
-    public Type getType() {
-        return value;
-    }
-}
diff --git a/lang/src/main/java/org/apache/commons/lang3/reflect/TypeUtils.java b/lang/src/main/java/org/apache/commons/lang3/reflect/TypeUtils.java
deleted file mode 100644
index 99a1625..0000000
--- a/lang/src/main/java/org/apache/commons/lang3/reflect/TypeUtils.java
+++ /dev/null
@@ -1,1848 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.commons.lang3.reflect;
-
-import java.lang.reflect.Array;
-import java.lang.reflect.GenericArrayType;
-import java.lang.reflect.GenericDeclaration;
-import java.lang.reflect.ParameterizedType;
-import java.lang.reflect.Type;
-import java.lang.reflect.TypeVariable;
-import java.lang.reflect.WildcardType;
-import java.util.Arrays;
-import java.util.Collections;
-import java.util.HashMap;
-import java.util.HashSet;
-import java.util.List;
-import java.util.Map;
-import java.util.Set;
-
-import org.apache.commons.lang3.ArrayUtils;
-import org.apache.commons.lang3.ClassUtils;
-import org.apache.commons.lang3.ObjectUtils;
-import org.apache.commons.lang3.Validate;
-import org.apache.commons.lang3.builder.Builder;
-
-/**
- * <p> Utility methods focusing on type inspection, particularly with regard to
- * generics. </p>
- *
- * @since 3.0
- * @version $Id$
- */
-public class TypeUtils {
-
-    /**
-     * {@link WildcardType} builder.
-     * @since 3.2
-     */
-    public static class WildcardTypeBuilder implements Builder<WildcardType> {
-        /**
-         * Constructor
-         */
-        private WildcardTypeBuilder() {
-        }
-        
-        private Type[] upperBounds;
-        private Type[] lowerBounds;
-
-        /**
-         * Specify upper bounds of the wildcard type to build.
-         * @param bounds to set
-         * @return {@code this}
-         */
-        public WildcardTypeBuilder withUpperBounds(final Type... bounds) {
-            this.upperBounds = bounds;
-            return this;
-        }
-
-        /**
-         * Specify lower bounds of the wildcard type to build.
-         * @param bounds to set
-         * @return {@code this}
-         */
-        public WildcardTypeBuilder withLowerBounds(final Type... bounds) {
-            this.lowerBounds = bounds;
-            return this;
-        }
-
-        /**
-         * {@inheritDoc}
-         */
-        @Override
-        public WildcardType build() {
-            return new WildcardTypeImpl(upperBounds, lowerBounds);
-        }
-    }
-
-    /**
-     * GenericArrayType implementation class.
-     * @since 3.2 
-     */
-    private static final class GenericArrayTypeImpl implements GenericArrayType {
-        private final Type componentType;
-
-        /**
-         * Constructor
-         * @param componentType of this array type
-         */
-        private GenericArrayTypeImpl(final Type componentType) {
-            this.componentType = componentType;
-        }
-
-        /**
-         * {@inheritDoc}
-         */
-        @Override
-        public Type getGenericComponentType() {
-            return componentType;
-        }
-
-        /**
-         * {@inheritDoc}
-         */
-        @Override
-        public String toString() {
-            return TypeUtils.toString(this);
-        }
-
-        /**
-         * {@inheritDoc}
-         */
-        @Override
-        public boolean equals(final Object obj) {
-            return obj == this || obj instanceof GenericArrayType && TypeUtils.equals(this, (GenericArrayType) obj);
-        }
-
-        /**
-         * {@inheritDoc}
-         */
-        @Override
-        public int hashCode() {
-            int result = 67 << 4;
-            result |= componentType.hashCode();
-            return result;
-        }
-    }
-
-    /**
-     * ParameterizedType implementation class.
-     * @since 3.2 
-     */
-    private static final class ParameterizedTypeImpl implements ParameterizedType {
-        private final Class<?> raw;
-        private final Type useOwner;
-        private final Type[] typeArguments;
-
-        /**
-         * Constructor
-         * @param raw type
-         * @param useOwner owner type to use, if any
-         * @param typeArguments formal type arguments
-         */
-        private ParameterizedTypeImpl(final Class<?> raw, final Type useOwner, final Type[] typeArguments) {
-            this.raw = raw;
-            this.useOwner = useOwner;
-            this.typeArguments = typeArguments;
-        }
-
-        /**
-         * {@inheritDoc}
-         */
-        @Override
-        public Type getRawType() {
-            return raw;
-        }
-
-        /**
-         * {@inheritDoc}
-         */
-        @Override
-        public Type getOwnerType() {
-            return useOwner;
-        }
-
-        /**
-         * {@inheritDoc}
-         */
-        @Override
-        public Type[] getActualTypeArguments() {
-            return typeArguments.clone();
-        }
-
-        /**
-         * {@inheritDoc}
-         */
-        @Override
-        public String toString() {
-            return TypeUtils.toString(this);
-        }
-
-        /**
-         * {@inheritDoc}
-         */
-        @Override
-        public boolean equals(final Object obj) {
-            return obj == this || obj instanceof ParameterizedType && TypeUtils.equals(this, ((ParameterizedType) obj));
-        }
-
-        /**
-         * {@inheritDoc}
-         */
-        @SuppressWarnings( "deprecation" )  // ObjectUtils.hashCode(Object) has been deprecated in 3.2
-        @Override
-        public int hashCode() {
-            int result = 71 << 4;
-            result |= raw.hashCode();
-            result <<= 4;
-            result |= ObjectUtils.hashCode(useOwner);
-            result <<= 8;
-            result |= Arrays.hashCode(typeArguments);
-            return result;
-        }
-    }
-
-    /**
-     * WildcardType implementation class.
-     * @since 3.2 
-     */
-    private static final class WildcardTypeImpl implements WildcardType {
-        private static final Type[] EMPTY_BOUNDS = new Type[0];
-
-        private final Type[] upperBounds;
-        private final Type[] lowerBounds;
-
-        /**
-         * Constructor
-         * @param upperBounds of this type
-         * @param lowerBounds of this type
-         */
-        private WildcardTypeImpl(final Type[] upperBounds, final Type[] lowerBounds) {
-            this.upperBounds = ObjectUtils.defaultIfNull(upperBounds, EMPTY_BOUNDS);
-            this.lowerBounds = ObjectUtils.defaultIfNull(lowerBounds, EMPTY_BOUNDS);
-        }
-
-        /**
-         * {@inheritDoc}
-         */
-        @Override
-        public Type[] getUpperBounds() {
-            return upperBounds.clone();
-        }
-
-        /**
-         * {@inheritDoc}
-         */
-        @Override
-        public Type[] getLowerBounds() {
-            return lowerBounds.clone();
-        }
-
-        /**
-         * {@inheritDoc}
-         */
-        @Override
-        public String toString() {
-            return TypeUtils.toString(this);
-        }
-
-        /**
-         * {@inheritDoc}
-         */
-        @Override
-        public boolean equals(final Object obj) {
-            return obj == this || obj instanceof WildcardType && TypeUtils.equals(this, (WildcardType) obj);
-        }
-
-        /**
-         * {@inheritDoc}
-         */
-        @Override
-        public int hashCode() {
-            int result = 73 << 8;
-            result |= Arrays.hashCode(upperBounds);
-            result <<= 8;
-            result |= Arrays.hashCode(lowerBounds);
-            return result;
-        }
-    }
-
-    /**
-     * A wildcard instance matching {@code ?}.
-     * @since 3.2
-     */
-    public static final WildcardType WILDCARD_ALL = wildcardType().withUpperBounds(Object.class).build();
-
-    /**
-     * <p>{@code TypeUtils} instances should NOT be constructed in standard
-     * programming. Instead, the class should be used as
-     * {@code TypeUtils.isAssignable(cls, toClass)}.</p> <p>This
-     * constructor is public to permit tools that require a JavaBean instance to
-     * operate.</p>
-     */
-    public TypeUtils() {
-        super();
-    }
-
-    /**
-     * <p>Checks if the subject type may be implicitly cast to the target type
-     * following the Java generics rules. If both types are {@link Class}
-     * objects, the method returns the result of
-     * {@link ClassUtils#isAssignable(Class, Class)}.</p>
-     *
-     * @param type the subject type to be assigned to the target type
-     * @param toType the target type
-     * @return {@code true} if {@code type} is assignable to {@code toType}.
-     */
-    public static boolean isAssignable(final Type type, final Type toType) {
-        return isAssignable(type, toType, null);
-    }
-
-    /**
-     * <p>Checks if the subject type may be implicitly cast to the target type
-     * following the Java generics rules.</p>
-     *
-     * @param type the subject type to be assigned to the target type
-     * @param toType the target type
-     * @param typeVarAssigns optional map of type variable assignments
-     * @return {@code true} if {@code type} is assignable to {@code toType}.
-     */
-    private static boolean isAssignable(final Type type, final Type toType,
-            final Map<TypeVariable<?>, Type> typeVarAssigns) {
-        if (toType == null || toType instanceof Class<?>) {
-            return isAssignable(type, (Class<?>) toType);
-        }
-
-        if (toType instanceof ParameterizedType) {
-            return isAssignable(type, (ParameterizedType) toType, typeVarAssigns);
-        }
-
-        if (toType instanceof GenericArrayType) {
-            return isAssignable(type, (GenericArrayType) toType, typeVarAssigns);
-        }
-
-        if (toType instanceof WildcardType) {
-            return isAssignable(type, (WildcardType) toType, typeVarAssigns);
-        }
-
-        if (toType instanceof TypeVariable<?>) {
-            return isAssignable(type, (TypeVariable<?>) toType, typeVarAssigns);
-        }
-
-        throw new IllegalStateException("found an unhandled type: " + toType);
-    }
-
-    /**
-     * <p>Checks if the subject type may be implicitly cast to the target class
-     * following the Java generics rules.</p>
-     *
-     * @param type the subject type to be assigned to the target type
-     * @param toClass the target class
-     * @return {@code true} if {@code type} is assignable to {@code toClass}.
-     */
-    private static boolean isAssignable(final Type type, final Class<?> toClass) {
-        if (type == null) {
-            // consistency with ClassUtils.isAssignable() behavior
-            return toClass == null || !toClass.isPrimitive();
-        }
-
-        // only a null type can be assigned to null type which
-        // would have cause the previous to return true
-        if (toClass == null) {
-            return false;
-        }
-
-        // all types are assignable to themselves
-        if (toClass.equals(type)) {
-            return true;
-        }
-
-        if (type instanceof Class<?>) {
-            // just comparing two classes
-            return ClassUtils.isAssignable((Class<?>) type, toClass);
-        }
-
-        if (type instanceof ParameterizedType) {
-            // only have to compare the raw type to the class
-            return isAssignable(getRawType((ParameterizedType) type), toClass);
-        }
-
-        // *
-        if (type instanceof TypeVariable<?>) {
-            // if any of the bounds are assignable to the class, then the
-            // type is assignable to the class.
-            for (final Type bound : ((TypeVariable<?>) type).getBounds()) {
-                if (isAssignable(bound, toClass)) {
-                    return true;
-                }
-            }
-
-            return false;
-        }
-
-        // the only classes to which a generic array type can be assigned
-        // are class Object and array classes
-        if (type instanceof GenericArrayType) {
-            return toClass.equals(Object.class)
-                    || toClass.isArray()
-                    && isAssignable(((GenericArrayType) type).getGenericComponentType(), toClass
-                            .getComponentType());
-        }
-
-        // wildcard types are not assignable to a class (though one would think
-        // "? super Object" would be assignable to Object)
-        if (type instanceof WildcardType) {
-            return false;
-        }
-
-        throw new IllegalStateException("found an unhandled type: " + type);
-    }
-
-    /**
-     * <p>Checks if the subject type may be implicitly cast to the target
-     * parameterized type following the Java generics rules.</p>
-     *
-     * @param type the subject type to be assigned to the target type
-     * @param toParameterizedType the target parameterized type
-     * @param typeVarAssigns a map with type variables
-     * @return {@code true} if {@code type} is assignable to {@code toType}.
-     */
-    private static boolean isAssignable(final Type type, final ParameterizedType toParameterizedType,
-            final Map<TypeVariable<?>, Type> typeVarAssigns) {
-        if (type == null) {
-            return true;
-        }
-
-        // only a null type can be assigned to null type which
-        // would have cause the previous to return true
-        if (toParameterizedType == null) {
-            return false;
-        }
-
-        // all types are assignable to themselves
-        if (toParameterizedType.equals(type)) {
-            return true;
-        }
-
-        // get the target type's raw type
-        final Class<?> toClass = getRawType(toParameterizedType);
-        // get the subject type's type arguments including owner type arguments
-        // and supertype arguments up to and including the target class.
-        final Map<TypeVariable<?>, Type> fromTypeVarAssigns = getTypeArguments(type, toClass, null);
-
-        // null means the two types are not compatible
-        if (fromTypeVarAssigns == null) {
-            return false;
-        }
-
-        // compatible types, but there's no type arguments. this is equivalent
-        // to comparing Map< ?, ? > to Map, and raw types are always assignable
-        // to parameterized types.
-        if (fromTypeVarAssigns.isEmpty()) {
-            return true;
-        }
-
-        // get the target type's type arguments including owner type arguments
-        final Map<TypeVariable<?>, Type> toTypeVarAssigns = getTypeArguments(toParameterizedType,
-                toClass, typeVarAssigns);
-
-        // now to check each type argument
-        for (final TypeVariable<?> var : toTypeVarAssigns.keySet()) {
-            final Type toTypeArg = unrollVariableAssignments(var, toTypeVarAssigns);
-            final Type fromTypeArg = unrollVariableAssignments(var, fromTypeVarAssigns);
-
-            // parameters must either be absent from the subject type, within
-            // the bounds of the wildcard type, or be an exact match to the
-            // parameters of the target type.
-            if (fromTypeArg != null
-                    && !toTypeArg.equals(fromTypeArg)
-                    && !(toTypeArg instanceof WildcardType && isAssignable(fromTypeArg, toTypeArg,
-                            typeVarAssigns))) {
-                return false;
-            }
-        }
-        return true;
-    }
-
-    /**
-     * Look up {@code var} in {@code typeVarAssigns} <em>transitively</em>,
-     * i.e. keep looking until the value found is <em>not</em> a type variable.
-     * @param var the type variable to look up
-     * @param typeVarAssigns the map used for the look up
-     * @return Type or {@code null} if some variable was not in the map
-     * @since 3.2
-     */
-    private static Type unrollVariableAssignments(TypeVariable<?> var, final Map<TypeVariable<?>, Type> typeVarAssigns) {
-        Type result;
-        do {
-            result = typeVarAssigns.get(var);
-            if (result instanceof TypeVariable<?> && !result.equals(var)) {
-                var = (TypeVariable<?>) result;
-                continue;
-            }
-            break;
-        } while (true);
-        return result;
-    }
-
-    /**
-     * <p>Checks if the subject type may be implicitly cast to the target
-     * generic array type following the Java generics rules.</p>
-     *
-     * @param type the subject type to be assigned to the target type
-     * @param toGenericArrayType the target generic array type
-     * @param typeVarAssigns a map with type variables
-     * @return {@code true} if {@code type} is assignable to
-     * {@code toGenericArrayType}.
-     */
-    private static boolean isAssignable(final Type type, final GenericArrayType toGenericArrayType,
-            final Map<TypeVariable<?>, Type> typeVarAssigns) {
-        if (type == null) {
-            return true;
-        }
-
-        // only a null type can be assigned to null type which
-        // would have cause the previous to return true
-        if (toGenericArrayType == null) {
-            return false;
-        }
-
-        // all types are assignable to themselves
-        if (toGenericArrayType.equals(type)) {
-            return true;
-        }
-
-        final Type toComponentType = toGenericArrayType.getGenericComponentType();
-
-        if (type instanceof Class<?>) {
-            final Class<?> cls = (Class<?>) type;
-
-            // compare the component types
-            return cls.isArray()
-                    && isAssignable(cls.getComponentType(), toComponentType, typeVarAssigns);
-        }
-
-        if (type instanceof GenericArrayType) {
-            // compare the component types
-            return isAssignable(((GenericArrayType) type).getGenericComponentType(),
-                    toComponentType, typeVarAssigns);
-        }
-
-        if (type instanceof WildcardType) {
-            // so long as one of the upper bounds is assignable, it's good
-            for (final Type bound : getImplicitUpperBounds((WildcardType) type)) {
-                if (isAssignable(bound, toGenericArrayType)) {
-                    return true;
-                }
-            }
-
-            return false;
-        }
-
-        if (type instanceof TypeVariable<?>) {
-            // probably should remove the following logic and just return false.
-            // type variables cannot specify arrays as bounds.
-            for (final Type bound : getImplicitBounds((TypeVariable<?>) type)) {
-                if (isAssignable(bound, toGenericArrayType)) {
-                    return true;
-                }
-            }
-
-            return false;
-        }
-
-        if (type instanceof ParameterizedType) {
-            // the raw type of a parameterized type is never an array or
-            // generic array, otherwise the declaration would look like this:
-            // Collection[]< ? extends String > collection;
-            return false;
-        }
-
-        throw new IllegalStateException("found an unhandled type: " + type);
-    }
-
-    /**
-     * <p>Checks if the subject type may be implicitly cast to the target
-     * wildcard type following the Java generics rules.</p>
-     *
-     * @param type the subject type to be assigned to the target type
-     * @param toWildcardType the target wildcard type
-     * @param typeVarAssigns a map with type variables
-     * @return {@code true} if {@code type} is assignable to
-     * {@code toWildcardType}.
-     */
-    private static boolean isAssignable(final Type type, final WildcardType toWildcardType,
-            final Map<TypeVariable<?>, Type> typeVarAssigns) {
-        if (type == null) {
-            return true;
-        }
-
-        // only a null type can be assigned to null type which
-        // would have cause the previous to return true
-        if (toWildcardType == null) {
-            return false;
-        }
-
-        // all types are assignable to themselves
-        if (toWildcardType.equals(type)) {
-            return true;
-        }
-
-        final Type[] toUpperBounds = getImplicitUpperBounds(toWildcardType);
-        final Type[] toLowerBounds = getImplicitLowerBounds(toWildcardType);
-
-        if (type instanceof WildcardType) {
-            final WildcardType wildcardType = (WildcardType) type;
-            final Type[] upperBounds = getImplicitUpperBounds(wildcardType);
-            final Type[] lowerBounds = getImplicitLowerBounds(wildcardType);
-
-            for (Type toBound : toUpperBounds) {
-                // if there are assignments for unresolved type variables,
-                // now's the time to substitute them.
-                toBound = substituteTypeVariables(toBound, typeVarAssigns);
-
-                // each upper bound of the subject type has to be assignable to
-                // each
-                // upper bound of the target type
-                for (final Type bound : upperBounds) {
-                    if (!isAssignable(bound, toBound, typeVarAssigns)) {
-                        return false;
-                    }
-                }
-            }
-
-            for (Type toBound : toLowerBounds) {
-                // if there are assignments for unresolved type variables,
-                // now's the time to substitute them.
-                toBound = substituteTypeVariables(toBound, typeVarAssigns);
-
-                // each lower bound of the target type has to be assignable to
-                // each
-                // lower bound of the subject type
-                for (final Type bound : lowerBounds) {
-                    if (!isAssignable(toBound, bound, typeVarAssigns)) {
-                        return false;
-                    }
-                }
-            }
-            return true;
-        }
-
-        for (final Type toBound : toUpperBounds) {
-            // if there are assignments for unresolved type variables,
-            // now's the time to substitute them.
-            if (!isAssignable(type, substituteTypeVariables(toBound, typeVarAssigns),
-                    typeVarAssigns)) {
-                return false;
-            }
-        }
-
-        for (final Type toBound : toLowerBounds) {
-            // if there are assignments for unresolved type variables,
-            // now's the time to substitute them.
-            if (!isAssignable(substituteTypeVariables(toBound, typeVarAssigns), type,
-                    typeVarAssigns)) {
-                return false;
-            }
-        }
-        return true;
-    }
-
-    /**
-     * <p>Checks if the subject type may be implicitly cast to the target type
-     * variable following the Java generics rules.</p>
-     *
-     * @param type the subject type to be assigned to the target type
-     * @param toTypeVariable the target type variable
-     * @param typeVarAssigns a map with type variables
-     * @return {@code true} if {@code type} is assignable to
-     * {@code toTypeVariable}.
-     */
-    private static boolean isAssignable(final Type type, final TypeVariable<?> toTypeVariable,
-            final Map<TypeVariable<?>, Type> typeVarAssigns) {
-        if (type == null) {
-            return true;
-        }
-
-        // only a null type can be assigned to null type which
-        // would have cause the previous to return true
-        if (toTypeVariable == null) {
-            return false;
-        }
-
-        // all types are assignable to themselves
-        if (toTypeVariable.equals(type)) {
-            return true;
-        }
-
-        if (type instanceof TypeVariable<?>) {
-            // a type variable is assignable to another type variable, if
-            // and only if the former is the latter, extends the latter, or
-            // is otherwise a descendant of the latter.
-            final Type[] bounds = getImplicitBounds((TypeVariable<?>) type);
-
-            for (final Type bound : bounds) {
-                if (isAssignable(bound, toTypeVariable, typeVarAssigns)) {
-                    return true;
-                }
-            }
-        }
-
-        if (type instanceof Class<?> || type instanceof ParameterizedType
-                || type instanceof GenericArrayType || type instanceof WildcardType) {
-            return false;
-        }
-
-        throw new IllegalStateException("found an unhandled type: " + type);
-    }
-
-    /**
-     * <p>Find the mapping for {@code type} in {@code typeVarAssigns}.</p>
-     *
-     * @param type the type to be replaced
-     * @param typeVarAssigns the map with type variables
-     * @return the replaced type
-     * @throws IllegalArgumentException if the type cannot be substituted
-     */
-    private static Type substituteTypeVariables(final Type type, final Map<TypeVariable<?>, Type> typeVarAssigns) {
-        if (type instanceof TypeVariable<?> && typeVarAssigns != null) {
-            final Type replacementType = typeVarAssigns.get(type);
-
-            if (replacementType == null) {
-                throw new IllegalArgumentException("missing assignment type for type variable "
-                        + type);
-            }
-            return replacementType;
-        }
-        return type;
-    }
-
-    /**
-     * <p>Retrieves all the type arguments for this parameterized type
-     * including owner hierarchy arguments such as
-     * {@code Outer<K,V>.Inner<T>.DeepInner<E>} .
-     * The arguments are returned in a
-     * {@link Map} specifying the argument type for each {@link TypeVariable}.
-     * </p>
-     *
-     * @param type specifies the subject parameterized type from which to
-     *             harvest the parameters.
-     * @return a {@code Map} of the type arguments to their respective type
-     * variables.
-     */
-    public static Map<TypeVariable<?>, Type> getTypeArguments(final ParameterizedType type) {
-        return getTypeArguments(type, getRawType(type), null);
-    }
-
-    /**
-     * <p>Gets the type arguments of a class/interface based on a subtype. For
-     * instance, this method will determine that both of the parameters for the
-     * interface {@link Map} are {@link Object} for the subtype
-     * {@link java.util.Properties Properties} even though the subtype does not
-     * directly implement the {@code Map} interface.</p>
-     * <p>This method returns {@code null} if {@code type} is not assignable to
-     * {@code toClass}. It returns an empty map if none of the classes or
-     * interfaces in its inheritance hierarchy specify any type arguments.</p>
-     * <p>A side effect of this method is that it also retrieves the type
-     * arguments for the classes and interfaces that are part of the hierarchy
-     * between {@code type} and {@code toClass}. So with the above
-     * example, this method will also determine that the type arguments for
-     * {@link java.util.Hashtable Hashtable} are also both {@code Object}.
-     * In cases where the interface specified by {@code toClass} is
-     * (indirectly) implemented more than once (e.g. where {@code toClass}
-     * specifies the interface {@link java.lang.Iterable Iterable} and
-     * {@code type} specifies a parameterized type that implements both
-     * {@link java.util.Set Set} and {@link java.util.Collection Collection}),
-     * this method will look at the inheritance hierarchy of only one of the
-     * implementations/subclasses; the first interface encountered that isn't a
-     * subinterface to one of the others in the {@code type} to
-     * {@code toClass} hierarchy.</p>
-     *
-     * @param type the type from which to determine the type parameters of
-     * {@code toClass}
-     * @param toClass the class whose type parameters are to be determined based
-     * on the subtype {@code type}
-     * @return a {@code Map} of the type assignments for the type variables in
-     * each type in the inheritance hierarchy from {@code type} to
-     * {@code toClass} inclusive.
-     */
-    public static Map<TypeVariable<?>, Type> getTypeArguments(final Type type, final Class<?> toClass) {
-        return getTypeArguments(type, toClass, null);
-    }
-
-    /**
-     * <p>Return a map of the type arguments of @{code type} in the context of {@code toClass}.</p>
-     *
-     * @param type the type in question
-     * @param toClass the class
-     * @param subtypeVarAssigns a map with type variables
-     * @return the {@code Map} with type arguments
-     */
-    private static Map<TypeVariable<?>, Type> getTypeArguments(final Type type, final Class<?> toClass,
-            final Map<TypeVariable<?>, Type> subtypeVarAssigns) {
-        if (type instanceof Class<?>) {
-            return getTypeArguments((Class<?>) type, toClass, subtypeVarAssigns);
-        }
-
-        if (type instanceof ParameterizedType) {
-            return getTypeArguments((ParameterizedType) type, toClass, subtypeVarAssigns);
-        }
-
-        if (type instanceof GenericArrayType) {
-            return getTypeArguments(((GenericArrayType) type).getGenericComponentType(), toClass
-                    .isArray() ? toClass.getComponentType() : toClass, subtypeVarAssigns);
-        }
-
-        // since wildcard types are not assignable to classes, should this just
-        // return null?
-        if (type instanceof WildcardType) {
-            for (final Type bound : getImplicitUpperBounds((WildcardType) type)) {
-                // find the first bound that is assignable to the target class
-                if (isAssignable(bound, toClass)) {
-                    return getTypeArguments(bound, toClass, subtypeVarAssigns);
-                }
-            }
-
-            return null;
-        }
-
-        if (type instanceof TypeVariable<?>) {
-            for (final Type bound : getImplicitBounds((TypeVariable<?>) type)) {
-                // find the first bound that is assignable to the target class
-                if (isAssignable(bound, toClass)) {
-                    return getTypeArguments(bound, toClass, subtypeVarAssigns);
-                }
-            }
-
-            return null;
-        }
-        throw new IllegalStateException("found an unhandled type: " + type);
-    }
-
-    /**
-     * <p>Return a map of the type arguments of a parameterized type in the context of {@code toClass}.</p>
-     *
-     * @param parameterizedType the parameterized type
-     * @param toClass the class
-     * @param subtypeVarAssigns a map with type variables
-     * @return the {@code Map} with type arguments
-     */
-    private static Map<TypeVariable<?>, Type> getTypeArguments(
-            final ParameterizedType parameterizedType, final Class<?> toClass,
-            final Map<TypeVariable<?>, Type> subtypeVarAssigns) {
-        final Class<?> cls = getRawType(parameterizedType);
-
-        // make sure they're assignable
-        if (!isAssignable(cls, toClass)) {
-            return null;
-        }
-
-        final Type ownerType = parameterizedType.getOwnerType();
-        Map<TypeVariable<?>, Type> typeVarAssigns;
-
-        if (ownerType instanceof ParameterizedType) {
-            // get the owner type arguments first
-            final ParameterizedType parameterizedOwnerType = (ParameterizedType) ownerType;
-            typeVarAssigns = getTypeArguments(parameterizedOwnerType,
-                    getRawType(parameterizedOwnerType), subtypeVarAssigns);
-        } else {
-            // no owner, prep the type variable assignments map
-            typeVarAssigns = subtypeVarAssigns == null ? new HashMap<TypeVariable<?>, Type>()
-                    : new HashMap<TypeVariable<?>, Type>(subtypeVarAssigns);
-        }
-
-        // get the subject parameterized type's arguments
-        final Type[] typeArgs = parameterizedType.getActualTypeArguments();
-        // and get the corresponding type variables from the raw class
-        final TypeVariable<?>[] typeParams = cls.getTypeParameters();
-
-        // map the arguments to their respective type variables
-        for (int i = 0; i < typeParams.length; i++) {
-            final Type typeArg = typeArgs[i];
-            typeVarAssigns.put(typeParams[i], typeVarAssigns.containsKey(typeArg) ? typeVarAssigns
-                    .get(typeArg) : typeArg);
-        }
-
-        if (toClass.equals(cls)) {
-            // target class has been reached. Done.
-            return typeVarAssigns;
-        }
-
-        // walk the inheritance hierarchy until the target class is reached
-        return getTypeArguments(getClosestParentType(cls, toClass), toClass, typeVarAssigns);
-    }
-
-    /**
-     * <p>Return a map of the type arguments of a class in the context of @{code toClass}.</p>
-     *
-     * @param cls the class in question
-     * @param toClass the context class
-     * @param subtypeVarAssigns a map with type variables
-     * @return the {@code Map} with type arguments
-     */
-    private static Map<TypeVariable<?>, Type> getTypeArguments(Class<?> cls, final Class<?> toClass,
-            final Map<TypeVariable<?>, Type> subtypeVarAssigns) {
-        // make sure they're assignable
-        if (!isAssignable(cls, toClass)) {
-            return null;
-        }
-
-        // can't work with primitives
-        if (cls.isPrimitive()) {
-            // both classes are primitives?
-            if (toClass.isPrimitive()) {
-                // dealing with widening here. No type arguments to be
-                // harvested with these two types.
-                return new HashMap<TypeVariable<?>, Type>();
-            }
-
-            // work with wrapper the wrapper class instead of the primitive
-            cls = ClassUtils.primitiveToWrapper(cls);
-        }
-
-        // create a copy of the incoming map, or an empty one if it's null
-        final HashMap<TypeVariable<?>, Type> typeVarAssigns = subtypeVarAssigns == null ? new HashMap<TypeVariable<?>, Type>()
-                : new HashMap<TypeVariable<?>, Type>(subtypeVarAssigns);
-
-        // has target class been reached?
-        if (toClass.equals(cls)) {
-            return typeVarAssigns;
-        }
-
-        // walk the inheritance hierarchy until the target class is reached
-        return getTypeArguments(getClosestParentType(cls, toClass), toClass, typeVarAssigns);
-    }
-
-    /**
-     * <p>Tries to determine the type arguments of a class/interface based on a
-     * super parameterized type's type arguments. This method is the inverse of
-     * {@link #getTypeArguments(Type, Class)} which gets a class/interface's
-     * type arguments based on a subtype. It is far more limited in determining
-     * the type arguments for the subject class's type variables in that it can
-     * only determine those parameters that map from the subject {@link Class}
-     * object to the supertype.</p> <p>Example: {@link java.util.TreeSet
-     * TreeSet} sets its parameter as the parameter for
-     * {@link java.util.NavigableSet NavigableSet}, which in turn sets the
-     * parameter of {@link java.util.SortedSet}, which in turn sets the
-     * parameter of {@link Set}, which in turn sets the parameter of
-     * {@link java.util.Collection}, which in turn sets the parameter of
-     * {@link java.lang.Iterable}. Since {@code TreeSet}'s parameter maps
-     * (indirectly) to {@code Iterable}'s parameter, it will be able to
-     * determine that based on the super type {@code Iterable<? extends
-     * Map<Integer, ? extends Collection<?>>>}, the parameter of
-     * {@code TreeSet} is {@code ? extends Map<Integer, ? extends
-     * Collection<?>>}.</p>
-     *
-     * @param cls the class whose type parameters are to be determined, not {@code null}
-     * @param superType the super type from which {@code cls}'s type
-     * arguments are to be determined, not {@code null}
-     * @return a {@code Map} of the type assignments that could be determined
-     * for the type variables in each type in the inheritance hierarchy from
-     * {@code type} to {@code toClass} inclusive.
-     */
-    public static Map<TypeVariable<?>, Type> determineTypeArguments(final Class<?> cls,
-            final ParameterizedType superType) {
-        Validate.notNull(cls, "cls is null");
-        Validate.notNull(superType, "superType is null");
-
-        final Class<?> superClass = getRawType(superType);
-
-        // compatibility check
-        if (!isAssignable(cls, superClass)) {
-            return null;
-        }
-
-        if (cls.equals(superClass)) {
-            return getTypeArguments(superType, superClass, null);
-        }
-
-        // get the next class in the inheritance hierarchy
-        final Type midType = getClosestParentType(cls, superClass);
-
-        // can only be a class or a parameterized type
-        if (midType instanceof Class<?>) {
-            return determineTypeArguments((Class<?>) midType, superType);
-        }
-
-        final ParameterizedType midParameterizedType = (ParameterizedType) midType;
-        final Class<?> midClass = getRawType(midParameterizedType);
-        // get the type variables of the mid class that map to the type
-        // arguments of the super class
-        final Map<TypeVariable<?>, Type> typeVarAssigns = determineTypeArguments(midClass, superType);
-        // map the arguments of the mid type to the class type variables
-        mapTypeVariablesToArguments(cls, midParameterizedType, typeVarAssigns);
-
-        return typeVarAssigns;
-    }
-
-    /**
-     * <p>Performs a mapping of type variables.</p>
-     *
-     * @param <T> the generic type of the class in question
-     * @param cls the class in question
-     * @param parameterizedType the parameterized type
-     * @param typeVarAssigns the map to be filled
-     */
-    private static <T> void mapTypeVariablesToArguments(final Class<T> cls,
-            final ParameterizedType parameterizedType, final Map<TypeVariable<?>, Type> typeVarAssigns) {
-        // capture the type variables from the owner type that have assignments
-        final Type ownerType = parameterizedType.getOwnerType();
-
-        if (ownerType instanceof ParameterizedType) {
-            // recursion to make sure the owner's owner type gets processed
-            mapTypeVariablesToArguments(cls, (ParameterizedType) ownerType, typeVarAssigns);
-        }
-
-        // parameterizedType is a generic interface/class (or it's in the owner
-        // hierarchy of said interface/class) implemented/extended by the class
-        // cls. Find out which type variables of cls are type arguments of
-        // parameterizedType:
-        final Type[] typeArgs = parameterizedType.getActualTypeArguments();
-
-        // of the cls's type variables that are arguments of parameterizedType,
-        // find out which ones can be determined from the super type's arguments
-        final TypeVariable<?>[] typeVars = getRawType(parameterizedType).getTypeParameters();
-
-        // use List view of type parameters of cls so the contains() method can be used:
-        final List<TypeVariable<Class<T>>> typeVarList = Arrays.asList(cls
-                .getTypeParameters());
-
-        for (int i = 0; i < typeArgs.length; i++) {
-            final TypeVariable<?> typeVar = typeVars[i];
-            final Type typeArg = typeArgs[i];
-
-            // argument of parameterizedType is a type variable of cls
-            if (typeVarList.contains(typeArg)
-            // type variable of parameterizedType has an assignment in
-                    // the super type.
-                    && typeVarAssigns.containsKey(typeVar)) {
-                // map the assignment to the cls's type variable
-                typeVarAssigns.put((TypeVariable<?>) typeArg, typeVarAssigns.get(typeVar));
-            }
-        }
-    }
-
-    /**
-     * <p>Get the closest parent type to the
-     * super class specified by {@code superClass}.</p>
-     *
-     * @param cls the class in question
-     * @param superClass the super class
-     * @return the closes parent type
-     */
-    private static Type getClosestParentType(final Class<?> cls, final Class<?> superClass) {
-        // only look at the interfaces if the super class is also an interface
-        if (superClass.isInterface()) {
-            // get the generic interfaces of the subject class
-            final Type[] interfaceTypes = cls.getGenericInterfaces();
-            // will hold the best generic interface match found
-            Type genericInterface = null;
-
-            // find the interface closest to the super class
-            for (final Type midType : interfaceTypes) {
-                Class<?> midClass = null;
-
-                if (midType instanceof ParameterizedType) {
-                    midClass = getRawType((ParameterizedType) midType);
-                } else if (midType instanceof Class<?>) {
-                    midClass = (Class<?>) midType;
-                } else {
-                    throw new IllegalStateException("Unexpected generic"
-                            + " interface type found: " + midType);
-                }
-
-                // check if this interface is further up the inheritance chain
-                // than the previously found match
-                if (isAssignable(midClass, superClass)
-                        && isAssignable(genericInterface, (Type) midClass)) {
-                    genericInterface = midType;
-                }
-            }
-
-            // found a match?
-            if (genericInterface != null) {
-                return genericInterface;
-            }
-        }
-
-        // none of the interfaces were descendants of the target class, so the
-        // super class has to be one, instead
-        return cls.getGenericSuperclass();
-    }
-
-    /**
-     * <p>Checks if the given value can be assigned to the target type
-     * following the Java generics rules.</p>
-     *
-     * @param value the value to be checked
-     * @param type the target type
-     * @return {@code true} if {@code value} is an instance of {@code type}.
-     */
-    public static boolean isInstance(final Object value, final Type type) {
-        if (type == null) {
-            return false;
-        }
-
-        return value == null ? !(type instanceof Class<?>) || !((Class<?>) type).isPrimitive()
-                : isAssignable(value.getClass(), type, null);
-    }
-
-    /**
-     * <p>This method strips out the redundant upper bound types in type
-     * variable types and wildcard types (or it would with wildcard types if
-     * multiple upper bounds were allowed).</p> <p>Example, with the variable
-     * type declaration:
-     *
-     * <pre>&lt;K extends java.util.Collection&lt;String&gt; &amp;
-     * java.util.List&lt;String&gt;&gt;</pre>
-     *
-     * <p>
-     * since {@code List} is a subinterface of {@code Collection},
-     * this method will return the bounds as if the declaration had been:
-     * </p>
-     *
-     * <pre>&lt;K extends java.util.List&lt;String&gt;&gt;</pre>
-     *
-     * @param bounds an array of types representing the upper bounds of either
-     * {@link WildcardType} or {@link TypeVariable}, not {@code null}.
-     * @return an array containing the values from {@code bounds} minus the
-     * redundant types.
-     */
-    public static Type[] normalizeUpperBounds(final Type[] bounds) {
-        Validate.notNull(bounds, "null value specified for bounds array");
-        // don't bother if there's only one (or none) type
-        if (bounds.length < 2) {
-            return bounds;
-        }
-
-        final Set<Type> types = new HashSet<Type>(bounds.length);
-
-        for (final Type type1 : bounds) {
-            boolean subtypeFound = false;
-
-            for (final Type type2 : bounds) {
-                if (type1 != type2 && isAssignable(type2, type1, null)) {
-                    subtypeFound = true;
-                    break;
-                }
-            }
-
-            if (!subtypeFound) {
-                types.add(type1);
-            }
-        }
-
-        return types.toArray(new Type[types.size()]);
-    }
-
-    /**
-     * <p>Returns an array containing the sole type of {@link Object} if
-     * {@link TypeVariable#getBounds()} returns an empty array. Otherwise, it
-     * returns the result of {@link TypeVariable#getBounds()} passed into
-     * {@link #normalizeUpperBounds}.</p>
-     *
-     * @param typeVariable the subject type variable, not {@code null}
-     * @return a non-empty array containing the bounds of the type variable.
-     */
-    public static Type[] getImplicitBounds(final TypeVariable<?> typeVariable) {
-        Validate.notNull(typeVariable, "typeVariable is null");
-        final Type[] bounds = typeVariable.getBounds();
-
-        return bounds.length == 0 ? new Type[] { Object.class } : normalizeUpperBounds(bounds);
-    }
-
-    /**
-     * <p>Returns an array containing the sole value of {@link Object} if
-     * {@link WildcardType#getUpperBounds()} returns an empty array. Otherwise,
-     * it returns the result of {@link WildcardType#getUpperBounds()}
-     * passed into {@link #normalizeUpperBounds}.</p>
-     *
-     * @param wildcardType the subject wildcard type, not {@code null}
-     * @return a non-empty array containing the upper bounds of the wildcard
-     * type.
-     */
-    public static Type[] getImplicitUpperBounds(final WildcardType wildcardType) {
-        Validate.notNull(wildcardType, "wildcardType is null");
-        final Type[] bounds = wildcardType.getUpperBounds();
-
-        return bounds.length == 0 ? new Type[] { Object.class } : normalizeUpperBounds(bounds);
-    }
-
-    /**
-     * <p>Returns an array containing a single value of {@code null} if
-     * {@link WildcardType#getLowerBounds()} returns an empty array. Otherwise,
-     * it returns the result of {@link WildcardType#getLowerBounds()}.</p>
-     *
-     * @param wildcardType the subject wildcard type, not {@code null}
-     * @return a non-empty array containing the lower bounds of the wildcard
-     * type.
-     */
-    public static Type[] getImplicitLowerBounds(final WildcardType wildcardType) {
-        Validate.notNull(wildcardType, "wildcardType is null");
-        final Type[] bounds = wildcardType.getLowerBounds();
-
-        return bounds.length == 0 ? new Type[] { null } : bounds;
-    }
-
-    /**
-     * <p>Determines whether or not specified types satisfy the bounds of their
-     * mapped type variables. When a type parameter extends another (such as
-     * {@code <T, S extends T>}), uses another as a type parameter (such as
-     * {@code <T, S extends Comparable>>}), or otherwise depends on
-     * another type variable to be specified, the dependencies must be included
-     * in {@code typeVarAssigns}.</p>
-     *
-     * @param typeVarAssigns specifies the potential types to be assigned to the
-     * type variables, not {@code null}.
-     * @return whether or not the types can be assigned to their respective type
-     * variables.
-     */
-    public static boolean typesSatisfyVariables(final Map<TypeVariable<?>, Type> typeVarAssigns) {
-        Validate.notNull(typeVarAssigns, "typeVarAssigns is null");
-        // all types must be assignable to all the bounds of the their mapped
-        // type variable.
-        for (final Map.Entry<TypeVariable<?>, Type> entry : typeVarAssigns.entrySet()) {
-            final TypeVariable<?> typeVar = entry.getKey();
-            final Type type = entry.getValue();
-
-            for (final Type bound : getImplicitBounds(typeVar)) {
-                if (!isAssignable(type, substituteTypeVariables(bound, typeVarAssigns),
-                        typeVarAssigns)) {
-                    return false;
-                }
-            }
-        }
-        return true;
-    }
-
-    /**
-     * <p>Transforms the passed in type to a {@link Class} object. Type-checking method of convenience.</p>
-     *
-     * @param parameterizedType the type to be converted
-     * @return the corresponding {@code Class} object
-     * @throws IllegalStateException if the conversion fails
-     */
-    private static Class<?> getRawType(final ParameterizedType parameterizedType) {
-        final Type rawType = parameterizedType.getRawType();
-
-        // check if raw type is a Class object
-        // not currently necessary, but since the return type is Type instead of
-        // Class, there's enough reason to believe that future versions of Java
-        // may return other Type implementations. And type-safety checking is
-        // rarely a bad idea.
-        if (!(rawType instanceof Class<?>)) {
-            throw new IllegalStateException("Wait... What!? Type of rawType: " + rawType);
-        }
-
-        return (Class<?>) rawType;
-    }
-
-    /**
-     * <p>Get the raw type of a Java type, given its context. Primarily for use
-     * with {@link TypeVariable}s and {@link GenericArrayType}s, or when you do
-     * not know the runtime type of {@code type}: if you know you have a
-     * {@link Class} instance, it is already raw; if you know you have a
-     * {@link ParameterizedType}, its raw type is only a method call away.</p>
-     *
-     * @param type to resolve
-     * @param assigningType type to be resolved against
-     * @return the resolved {@link Class} object or {@code null} if
-     * the type could not be resolved
-     */
-    public static Class<?> getRawType(final Type type, final Type assigningType) {
-        if (type instanceof Class<?>) {
-            // it is raw, no problem
-            return (Class<?>) type;
-        }
-
-        if (type instanceof ParameterizedType) {
-            // simple enough to get the raw type of a ParameterizedType
-            return getRawType((ParameterizedType) type);
-        }
-
-        if (type instanceof TypeVariable<?>) {
-            if (assigningType == null) {
-                return null;
-            }
-
-            // get the entity declaring this type variable
-            final Object genericDeclaration = ((TypeVariable<?>) type).getGenericDeclaration();
-
-            // can't get the raw type of a method- or constructor-declared type
-            // variable
-            if (!(genericDeclaration instanceof Class<?>)) {
-                return null;
-            }
-
-            // get the type arguments for the declaring class/interface based
-            // on the enclosing type
-            final Map<TypeVariable<?>, Type> typeVarAssigns = getTypeArguments(assigningType,
-                    (Class<?>) genericDeclaration);
-
-            // enclosingType has to be a subclass (or subinterface) of the
-            // declaring type
-            if (typeVarAssigns == null) {
-                return null;
-            }
-
-            // get the argument assigned to this type variable
-            final Type typeArgument = typeVarAssigns.get(type);
-
-            if (typeArgument == null) {
-                return null;
-            }
-
-            // get the argument for this type variable
-            return getRawType(typeArgument, assigningType);
-        }
-
-        if (type instanceof GenericArrayType) {
-            // get raw component type
-            final Class<?> rawComponentType = getRawType(((GenericArrayType) type)
-                    .getGenericComponentType(), assigningType);
-
-            // create array type from raw component type and return its class
-            return Array.newInstance(rawComponentType, 0).getClass();
-        }
-
-        // (hand-waving) this is not the method you're looking for
-        if (type instanceof WildcardType) {
-            return null;
-        }
-
-        throw new IllegalArgumentException("unknown type: " + type);
-    }
-
-    /**
-     * Learn whether the specified type denotes an array type.
-     * @param type the type to be checked
-     * @return {@code true} if {@code type} is an array class or a {@link GenericArrayType}.
-     */
-    public static boolean isArrayType(final Type type) {
-        return type instanceof GenericArrayType || type instanceof Class<?> && ((Class<?>) type).isArray();
-    }
-
-    /**
-     * Get the array component type of {@code type}.
-     * @param type the type to be checked
-     * @return component type or null if type is not an array type
-     */
-    public static Type getArrayComponentType(final Type type) {
-        if (type instanceof Class<?>) {
-            final Class<?> clazz = (Class<?>) type;
-            return clazz.isArray() ? clazz.getComponentType() : null;
-        }
-        if (type instanceof GenericArrayType) {
-            return ((GenericArrayType) type).getGenericComponentType();
-        }
-        return null;
-    }
-
-    /**
-     * Get a type representing {@code type} with variable assignments "unrolled."
-     *
-     * @param typeArguments as from {@link TypeUtils#getTypeArguments(Type, Class)}
-     * @param type the type to unroll variable assignments for
-     * @return Type
-     * @since 3.2
-     */
-    public static Type unrollVariables(Map<TypeVariable<?>, Type> typeArguments, final Type type) {
-        if (typeArguments == null) {
-            typeArguments = Collections.<TypeVariable<?>, Type> emptyMap();
-        }
-        if (containsTypeVariables(type)) {
-            if (type instanceof TypeVariable<?>) {
-                return unrollVariables(typeArguments, typeArguments.get(type));
-            }
-            if (type instanceof ParameterizedType) {
-                final ParameterizedType p = (ParameterizedType) type;
-                final Map<TypeVariable<?>, Type> parameterizedTypeArguments;
-                if (p.getOwnerType() == null) {
-                    parameterizedTypeArguments = typeArguments;
-                } else {
-                    parameterizedTypeArguments = new HashMap<TypeVariable<?>, Type>(typeArguments);
-                    parameterizedTypeArguments.putAll(TypeUtils.getTypeArguments(p));
-                }
-                final Type[] args = p.getActualTypeArguments();
-                for (int i = 0; i < args.length; i++) {
-                    final Type unrolled = unrollVariables(parameterizedTypeArguments, args[i]);
-                    if (unrolled != null) {
-                        args[i] = unrolled;
-                    }
-                }
-                return parameterizeWithOwner(p.getOwnerType(), (Class<?>) p.getRawType(), args);
-            }
-            if (type instanceof WildcardType) {
-                final WildcardType wild = (WildcardType) type;
-                return wildcardType().withUpperBounds(unrollBounds(typeArguments, wild.getUpperBounds()))
-                    .withLowerBounds(unrollBounds(typeArguments, wild.getLowerBounds())).build();
-            }
-        }
-        return type;
-    }
-
-    /**
-     * Local helper method to unroll variables in a type bounds array.
-     * 
-     * @param typeArguments assignments {@link Map}
-     * @param bounds in which to expand variables
-     * @return {@code bounds} with any variables reassigned
-     * @since 3.2
-     */
-    private static Type[] unrollBounds(final Map<TypeVariable<?>, Type> typeArguments, final Type[] bounds) {
-        Type[] result = bounds;
-        int i = 0;
-        for (; i < result.length; i++) {
-            final Type unrolled = unrollVariables(typeArguments, result[i]);
-            if (unrolled == null) {
-                result = ArrayUtils.remove(result, i--);
-            } else {
-                result[i] = unrolled;
-            }
-        }
-        return result;
-    }
-
-    /**
-     * Learn, recursively, whether any of the type parameters associated with {@code type} are bound to variables.
-     *
-     * @param type the type to check for type variables
-     * @return boolean
-     * @since 3.2
-     */
-    public static boolean containsTypeVariables(final Type type) {
-        if (type instanceof TypeVariable<?>) {
-            return true;
-        }
-        if (type instanceof Class<?>) {
-            return ((Class<?>) type).getTypeParameters().length > 0;
-        }
-        if (type instanceof ParameterizedType) {
-            for (final Type arg : ((ParameterizedType) type).getActualTypeArguments()) {
-                if (containsTypeVariables(arg)) {
-                    return true;
-                }
-            }
-            return false;
-        }
-        if (type instanceof WildcardType) {
-            final WildcardType wild = (WildcardType) type;
-            return containsTypeVariables(TypeUtils.getImplicitLowerBounds(wild)[0])
-                || containsTypeVariables(TypeUtils.getImplicitUpperBounds(wild)[0]);
-        }
-        return false;
-    }
-
-    /**
-     * Create a parameterized type instance.
-     *
-     * @param raw the raw class to create a parameterized type instance for
-     * @param typeArguments the types used for parameterization
-     * @return {@link ParameterizedType}
-     * @since 3.2
-     */
-    public static final ParameterizedType parameterize(final Class<?> raw, final Type... typeArguments) {
-        return parameterizeWithOwner(null, raw, typeArguments);
-    }
-
-    /**
-     * Create a parameterized type instance.
-     *
-     * @param raw the raw class to create a parameterized type instance for
-     * @param typeArgMappings the mapping used for parameterization
-     * @return {@link ParameterizedType}
-     * @since 3.2
-     */
-    public static final ParameterizedType parameterize(final Class<?> raw,
-        final Map<TypeVariable<?>, Type> typeArgMappings) {
-        Validate.notNull(raw, "raw class is null");
-        Validate.notNull(typeArgMappings, "typeArgMappings is null");
-        return parameterizeWithOwner(null, raw, extractTypeArgumentsFrom(typeArgMappings, raw.getTypeParameters()));
-    }
-
-    /**
-     * Create a parameterized type instance.
-     *
-     * @param owner the owning type
-     * @param raw the raw class to create a parameterized type instance for
-     * @param typeArguments the types used for parameterization
-     *
-     * @return {@link ParameterizedType}
-     * @since 3.2
-     */
-    public static final ParameterizedType parameterizeWithOwner(final Type owner, final Class<?> raw,
-        final Type... typeArguments) {
-        Validate.notNull(raw, "raw class is null");
-        final Type useOwner;
-        if (raw.getEnclosingClass() == null) {
-            Validate.isTrue(owner == null, "no owner allowed for top-level %s", raw);
-            useOwner = null;
-        } else if (owner == null) {
-            useOwner = raw.getEnclosingClass();
-        } else {
-            Validate.isTrue(TypeUtils.isAssignable(owner, raw.getEnclosingClass()),
-                "%s is invalid owner type for parameterized %s", owner, raw);
-            useOwner = owner;
-        }
-        Validate.noNullElements(typeArguments, "null type argument at index %s");
-        Validate.isTrue(raw.getTypeParameters().length == typeArguments.length,
-            "invalid number of type parameters specified: expected %s, got %s", raw.getTypeParameters().length,
-            typeArguments.length);
-
-        return new ParameterizedTypeImpl(raw, useOwner, typeArguments);
-    }
-
-    /**
-     * Create a parameterized type instance.
-     *
-     * @param owner the owning type
-     * @param raw the raw class to create a parameterized type instance for
-     * @param typeArgMappings the mapping used for parameterization
-     * @return {@link ParameterizedType}
-     * @since 3.2
-     */
-    public static final ParameterizedType parameterizeWithOwner(final Type owner, final Class<?> raw,
-        final Map<TypeVariable<?>, Type> typeArgMappings) {
-        Validate.notNull(raw, "raw class is null");
-        Validate.notNull(typeArgMappings, "typeArgMappings is null");
-        return parameterizeWithOwner(owner, raw, extractTypeArgumentsFrom(typeArgMappings, raw.getTypeParameters()));
-    }
-
-    /**
-     * Helper method to establish the formal parameters for a parameterized type.
-     * @param mappings map containing the assignements
-     * @param variables expected map keys
-     * @return array of map values corresponding to specified keys
-     */
-    private static Type[] extractTypeArgumentsFrom(final Map<TypeVariable<?>, Type> mappings, final TypeVariable<?>[] variables) {
-        final Type[] result = new Type[variables.length];
-        int index = 0;
-        for (final TypeVariable<?> var : variables) {
-            Validate.isTrue(mappings.containsKey(var), "missing argument mapping for %s", toString(var));
-            result[index++] = mappings.get(var);
-        }
-        return result;
-    }
-
-    /**
-     * Get a {@link WildcardTypeBuilder}.
-     * @return {@link WildcardTypeBuilder}
-     * @since 3.2
-     */
-    public static WildcardTypeBuilder wildcardType() {
-        return new WildcardTypeBuilder();
-    }
-
-    /**
-     * Create a generic array type instance.
-     *
-     * @param componentType the type of the elements of the array. For example the component type of {@code boolean[]}
-     *                      is {@code boolean}
-     * @return {@link GenericArrayType}
-     * @since 3.2
-     */
-    public static GenericArrayType genericArrayType(final Type componentType) {
-        return new GenericArrayTypeImpl(Validate.notNull(componentType, "componentType is null"));
-    }
-
-    /**
-     * Check equality of types.
-     *
-     * @param t1 the first type
-     * @param t2 the second type
-     * @return boolean
-     * @since 3.2
-     */
-    @SuppressWarnings( "deprecation" )  // ObjectUtils.equals(Object, Object) has been deprecated in 3.2
-    public static boolean equals(final Type t1, final Type t2) {
-        if (ObjectUtils.equals(t1, t2)) {
-            return true;
-        }
-        if (t1 instanceof ParameterizedType) {
-            return equals((ParameterizedType) t1, t2);
-        }
-        if (t1 instanceof GenericArrayType) {
-            return equals((GenericArrayType) t1, t2);
-        }
-        if (t1 instanceof WildcardType) {
-            return equals((WildcardType) t1, t2);
-        }
-        return false;
-    }
-
-    /**
-     * Learn whether {@code t} equals {@code p}.
-     * @param p LHS
-     * @param t RHS
-     * @return boolean
-     * @since 3.2
-     */
-    private static boolean equals(final ParameterizedType p, final Type t) {
-        if (t instanceof ParameterizedType) {
-            final ParameterizedType other = (ParameterizedType) t;
-            if (equals(p.getRawType(), other.getRawType()) && equals(p.getOwnerType(), other.getOwnerType())) {
-                return equals(p.getActualTypeArguments(), other.getActualTypeArguments());
-            }
-        }
-        return false;
-    }
-
-    /**
-     * Learn whether {@code t} equals {@code a}.
-     * @param a LHS
-     * @param t RHS
-     * @return boolean
-     * @since 3.2
-     */
-    private static boolean equals(final GenericArrayType a, final Type t) {
-        return t instanceof GenericArrayType
-            && equals(a.getGenericComponentType(), ((GenericArrayType) t).getGenericComponentType());
-    }
-
-    /**
-     * Learn whether {@code t} equals {@code w}.
-     * @param w LHS
-     * @param t RHS
-     * @return boolean
-     * @since 3.2
-     */
-    private static boolean equals(final WildcardType w, final Type t) {
-        if (t instanceof WildcardType) {
-            final WildcardType other = (WildcardType) t;
-            return equals(getImplicitLowerBounds(w), getImplicitLowerBounds(other))
-                && equals(getImplicitUpperBounds(w), getImplicitUpperBounds(other));
-        }
-        return true;
-    }
-
-    /**
-     * Learn whether {@code t1} equals {@code t2}.
-     * @param t1 LHS
-     * @param t2 RHS
-     * @return boolean
-     * @since 3.2
-     */
-    private static boolean equals(final Type[] t1, final Type[] t2) {
-        if (t1.length == t2.length) {
-            for (int i = 0; i < t1.length; i++) {
-                if (!equals(t1[i], t2[i])) {
-                    return false;
-                }
-            }
-            return true;
-        }
-        return false;
-    }
-
-    /**
-     * Present a given type as a Java-esque String.
-     *
-     * @param type the type to create a String representation for, not {@code null}
-     * @return String
-     * @since 3.2
-     */
-    public static String toString(final Type type) {
-        Validate.notNull(type);
-        if (type instanceof Class<?>) {
-            return classToString((Class<?>) type);
-        }
-        if (type instanceof ParameterizedType) {
-            return parameterizedTypeToString((ParameterizedType) type);
-        }
-        if (type instanceof WildcardType) {
-            return wildcardTypeToString((WildcardType) type);
-        }
-        if (type instanceof TypeVariable<?>) {
-            return typeVariableToString((TypeVariable<?>) type);
-        }
-        if (type instanceof GenericArrayType) {
-            return genericArrayTypeToString((GenericArrayType) type);
-        }
-        throw new IllegalArgumentException(ObjectUtils.identityToString(type));
-    }
-
-    /**
-     * Format a {@link TypeVariable} including its {@link GenericDeclaration}.
-     *
-     * @param var the type variable to create a String representation for, not {@code null}
-     * @return String
-     * @since 3.2
-     */
-    public static String toLongString(final TypeVariable<?> var) {
-        Validate.notNull(var, "var is null");
-        final StringBuilder buf = new StringBuilder();
-        final GenericDeclaration d = ((TypeVariable<?>) var).getGenericDeclaration();
-        if (d instanceof Class<?>) {
-            Class<?> c = (Class<?>) d;
-            while (true) {
-                if (c.getEnclosingClass() == null) {
-                    buf.insert(0, c.getName());
-                    break;
-                }
-                buf.insert(0, c.getSimpleName()).insert(0, '.');
-                c = c.getEnclosingClass();
-            }
-        } else if (d instanceof Type) {// not possible as of now
-            buf.append(toString((Type) d));
-        } else {
-            buf.append(d);
-        }
-        return buf.append(':').append(typeVariableToString(var)).toString();
-    }
-
-    /**
-     * Wrap the specified {@link Type} in a {@link Typed} wrapper.
-     *
-     * @param <T> inferred generic type
-     * @param type to wrap
-     * @return Typed&lt;T&gt;
-     * @since 3.2
-     */
-    public static <T> Typed<T> wrap(final Type type) {
-        return new Typed<T>() {
-            @Override
-            public Type getType() {
-                return type;
-            }
-        };
-    }
-
-    /**
-     * Wrap the specified {@link Class} in a {@link Typed} wrapper.
-     *
-     * @param <T> generic type
-     * @param type to wrap
-     * @return Typed&lt;T&gt;
-     * @since 3.2
-     */
-    public static <T> Typed<T> wrap(final Class<T> type) {
-        return TypeUtils.<T> wrap((Type) type);
-    }
-
-    /**
-     * Format a {@link Class} as a {@link String}.
-     * @param c {@code Class} to format
-     * @return String
-     * @since 3.2
-     */
-    private static String classToString(final Class<?> c) {
-        final StringBuilder buf = new StringBuilder();
-
-        if (c.getEnclosingClass() != null) {
-            buf.append(classToString(c.getEnclosingClass())).append('.').append(c.getSimpleName());
-        } else {
-            buf.append(c.getName());
-        }
-        if (c.getTypeParameters().length > 0) {
-            buf.append('<');
-            appendAllTo(buf, ", ", c.getTypeParameters());
-            buf.append('>');
-        }
-        return buf.toString();
-    }
-
-    /**
-     * Format a {@link TypeVariable} as a {@link String}.
-     * @param v {@code TypeVariable} to format
-     * @return String
-     * @since 3.2
-     */
-    private static String typeVariableToString(final TypeVariable<?> v) {
-        final StringBuilder buf = new StringBuilder(v.getName());
-        final Type[] bounds = v.getBounds();
-        if (bounds.length > 0 && !(bounds.length == 1 && Object.class.equals(bounds[0]))) {
-            buf.append(" extends ");
-            appendAllTo(buf, " & ", v.getBounds());
-        }
-        return buf.toString();
-    }
-
-    /**
-     * Format a {@link ParameterizedType} as a {@link String}.
-     * @param p {@code ParameterizedType} to format
-     * @return String
-     * @since 3.2
-     */
-    private static String parameterizedTypeToString(final ParameterizedType p) {
-        final StringBuilder buf = new StringBuilder();
-
-        final Type useOwner = p.getOwnerType();
-        final Class<?> raw = (Class<?>) p.getRawType();
-        final Type[] typeArguments = p.getActualTypeArguments();
-        if (useOwner == null) {
-            buf.append(raw.getName());
-        } else {
-            if (useOwner instanceof Class<?>) {
-                buf.append(((Class<?>) useOwner).getName());
-            } else {
-                buf.append(useOwner.toString());
-            }
-            buf.append('.').append(raw.getSimpleName());
-        }
-
-        appendAllTo(buf.append('<'), ", ", typeArguments).append('>');
-        return buf.toString();
-    }
-
-    /**
-     * Format a {@link WildcardType} as a {@link String}.
-     * @param w {@code WildcardType} to format
-     * @return String
-     * @since 3.2
-     */
-    private static String wildcardTypeToString(final WildcardType w) {
-        final StringBuilder buf = new StringBuilder().append('?');
-        final Type[] lowerBounds = w.getLowerBounds();
-        final Type[] upperBounds = w.getUpperBounds();
-        if (lowerBounds.length > 1 || lowerBounds.length == 1 && lowerBounds[0] != null) {
-            appendAllTo(buf.append(" super "), " & ", lowerBounds);
-        } else if (upperBounds.length > 1 || upperBounds.length == 1 && !Object.class.equals(upperBounds[0])) {
-            appendAllTo(buf.append(" extends "), " & ", upperBounds);
-        }
-        return buf.toString();
-    }
-
-    /**
-     * Format a {@link GenericArrayType} as a {@link String}.
-     * @param g {@code GenericArrayType} to format
-     * @return String
-     * @since 3.2
-     */
-    private static String genericArrayTypeToString(final GenericArrayType g) {
-        return String.format("%s[]", toString(g.getGenericComponentType()));
-    }
-
-    /**
-     * Append {@code types} to @{code buf} with separator {@code sep}.
-     * @param buf destination
-     * @param sep separator
-     * @param types to append
-     * @return {@code buf}
-     * @since 3.2
-     */
-    private static StringBuilder appendAllTo(final StringBuilder buf, final String sep, final Type... types) {
-        Validate.notEmpty(Validate.noNullElements(types));
-        if (types.length > 0) {
-            buf.append(toString(types[0]));
-            for (int i = 1; i < types.length; i++) {
-                buf.append(sep).append(toString(types[i]));
-            }
-        }
-        return buf;
-    }
-
-}
diff --git a/lang/src/main/java/org/apache/commons/lang3/reflect/Typed.java b/lang/src/main/java/org/apache/commons/lang3/reflect/Typed.java
deleted file mode 100644
index 167bf48..0000000
--- a/lang/src/main/java/org/apache/commons/lang3/reflect/Typed.java
+++ /dev/null
@@ -1,35 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.commons.lang3.reflect;
-
-import java.lang.reflect.Type;
-
-/**
- * Generalization of "has a type."
- * @see TypeLiteral
- * @since 3.2
- * @version $Id$
- */
-public interface Typed<T> {
-
-    /**
-     * Get the {@link Type} represented by this entity.
-     * 
-     * @return Type
-     */
-    Type getType();
-}
diff --git a/lang/src/main/java/org/apache/commons/lang3/reflect/package-info.java b/lang/src/main/java/org/apache/commons/lang3/reflect/package-info.java
deleted file mode 100644
index 79672ac..0000000
--- a/lang/src/main/java/org/apache/commons/lang3/reflect/package-info.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-/**
- * <p>Accumulates common high-level uses of the {@code java.lang.reflect} APIs.</p>
- * <p>These classes are immutable, and therefore thread-safe.</p>
- *
- * @since 3.0
- * @version $Id$
- */
-package org.apache.commons.lang3.reflect;
diff --git a/lang/src/main/java/org/apache/commons/lang3/text/CompositeFormat.java b/lang/src/main/java/org/apache/commons/lang3/text/CompositeFormat.java
deleted file mode 100644
index 1544a4f..0000000
--- a/lang/src/main/java/org/apache/commons/lang3/text/CompositeFormat.java
+++ /dev/null
@@ -1,116 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- * 
- *      http://www.apache.org/licenses/LICENSE-2.0
- * 
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.commons.lang3.text;
-
-import java.text.FieldPosition;
-import java.text.Format;
-import java.text.ParseException;
-import java.text.ParsePosition;
-
-/**
- * Formats using one formatter and parses using a different formatter. An
- * example of use for this would be a webapp where data is taken in one way and
- * stored in a database another way.
- * 
- * @version $Id$
- */
-public class CompositeFormat extends Format {
-
-    /**
-     * Required for serialization support.
-     * 
-     * @see java.io.Serializable
-     */
-    private static final long serialVersionUID = -4329119827877627683L;
-
-    /** The parser to use. */
-    private final Format parser;
-    /** The formatter to use. */
-    private final Format formatter;
-
-    /**
-     * Create a format that points its parseObject method to one implementation
-     * and its format method to another.
-     * 
-     * @param parser implementation
-     * @param formatter implementation
-     */
-    public CompositeFormat(final Format parser, final Format formatter) {
-        this.parser = parser;
-        this.formatter = formatter;
-    }
-
-    /**
-     * Uses the formatter Format instance.
-     * 
-     * @param obj the object to format
-     * @param toAppendTo the {@link StringBuffer} to append to
-     * @param pos the FieldPosition to use (or ignore).
-     * @return <code>toAppendTo</code>
-     * @see Format#format(Object, StringBuffer, FieldPosition)
-     */
-    @Override // Therefore has to use StringBuffer
-    public StringBuffer format(final Object obj, final StringBuffer toAppendTo,
-            final FieldPosition pos) {
-        return formatter.format(obj, toAppendTo, pos);
-    }
-
-    /**
-     * Uses the parser Format instance.
-     * 
-     * @param source the String source
-     * @param pos the ParsePosition containing the position to parse from, will
-     *            be updated according to parsing success (index) or failure
-     *            (error index)
-     * @return the parsed Object
-     * @see Format#parseObject(String, ParsePosition)
-     */
-    @Override
-    public Object parseObject(final String source, final ParsePosition pos) {
-        return parser.parseObject(source, pos);
-    }
-
-    /**
-     * Provides access to the parser Format implementation.
-     * 
-     * @return parser Format implementation
-     */
-    public Format getParser() {
-        return this.parser;
-    }
-
-    /**
-     * Provides access to the parser Format implementation.
-     * 
-     * @return formatter Format implementation
-     */
-    public Format getFormatter() {
-        return this.formatter;
-    }
-
-    /**
-     * Utility method to parse and then reformat a String.
-     * 
-     * @param input String to reformat
-     * @return A reformatted String
-     * @throws ParseException thrown by parseObject(String) call
-     */
-    public String reformat(final String input) throws ParseException {
-        return format(parseObject(input));
-    }
-
-}
diff --git a/lang/src/main/java/org/apache/commons/lang3/text/ExtendedMessageFormat.java b/lang/src/main/java/org/apache/commons/lang3/text/ExtendedMessageFormat.java
deleted file mode 100644
index bfe34b4..0000000
--- a/lang/src/main/java/org/apache/commons/lang3/text/ExtendedMessageFormat.java
+++ /dev/null
@@ -1,529 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.commons.lang3.text;
-
-import java.text.Format;
-import java.text.MessageFormat;
-import java.text.ParsePosition;
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.Iterator;
-import java.util.Locale;
-import java.util.Map;
-
-import org.apache.commons.lang3.ObjectUtils;
-import org.apache.commons.lang3.Validate;
-
-/**
- * Extends <code>java.text.MessageFormat</code> to allow pluggable/additional formatting
- * options for embedded format elements.  Client code should specify a registry
- * of <code>FormatFactory</code> instances associated with <code>String</code>
- * format names.  This registry will be consulted when the format elements are
- * parsed from the message pattern.  In this way custom patterns can be specified,
- * and the formats supported by <code>java.text.MessageFormat</code> can be overridden
- * at the format and/or format style level (see MessageFormat).  A "format element"
- * embedded in the message pattern is specified (<b>()?</b> signifies optionality):<br>
- * <code>{</code><i>argument-number</i><b>(</b><code>,</code><i>format-name</i><b>
- * (</b><code>,</code><i>format-style</i><b>)?)?</b><code>}</code>
- *
- * <p>
- * <i>format-name</i> and <i>format-style</i> values are trimmed of surrounding whitespace
- * in the manner of <code>java.text.MessageFormat</code>.  If <i>format-name</i> denotes
- * <code>FormatFactory formatFactoryInstance</code> in <code>registry</code>, a <code>Format</code>
- * matching <i>format-name</i> and <i>format-style</i> is requested from
- * <code>formatFactoryInstance</code>.  If this is successful, the <code>Format</code>
- * found is used for this format element.
- * </p>
- *
- * <p><b>NOTICE:</b> The various subformat mutator methods are considered unnecessary; they exist on the parent
- * class to allow the type of customization which it is the job of this class to provide in
- * a configurable fashion.  These methods have thus been disabled and will throw
- * <code>UnsupportedOperationException</code> if called.
- * </p>
- *
- * <p>Limitations inherited from <code>java.text.MessageFormat</code>:</p>
- * <ul>
- * <li>When using "choice" subformats, support for nested formatting instructions is limited
- *     to that provided by the base class.</li>
- * <li>Thread-safety of <code>Format</code>s, including <code>MessageFormat</code> and thus
- *     <code>ExtendedMessageFormat</code>, is not guaranteed.</li>
- * </ul>
- *
- * @since 2.4
- * @version $Id$
- */
-public class ExtendedMessageFormat extends MessageFormat {
-    private static final long serialVersionUID = -2362048321261811743L;
-    private static final int HASH_SEED = 31;
-
-    private static final String DUMMY_PATTERN = "";
-    private static final char START_FMT = ',';
-    private static final char END_FE = '}';
-    private static final char START_FE = '{';
-    private static final char QUOTE = '\'';
-
-    private String toPattern;
-    private final Map<String, ? extends FormatFactory> registry;
-
-    /**
-     * Create a new ExtendedMessageFormat for the default locale.
-     *
-     * @param pattern  the pattern to use, not null
-     * @throws IllegalArgumentException in case of a bad pattern.
-     */
-    public ExtendedMessageFormat(final String pattern) {
-        this(pattern, Locale.getDefault());
-    }
-
-    /**
-     * Create a new ExtendedMessageFormat.
-     *
-     * @param pattern  the pattern to use, not null
-     * @param locale  the locale to use, not null
-     * @throws IllegalArgumentException in case of a bad pattern.
-     */
-    public ExtendedMessageFormat(final String pattern, final Locale locale) {
-        this(pattern, locale, null);
-    }
-
-    /**
-     * Create a new ExtendedMessageFormat for the default locale.
-     *
-     * @param pattern  the pattern to use, not null
-     * @param registry  the registry of format factories, may be null
-     * @throws IllegalArgumentException in case of a bad pattern.
-     */
-    public ExtendedMessageFormat(final String pattern, final Map<String, ? extends FormatFactory> registry) {
-        this(pattern, Locale.getDefault(), registry);
-    }
-
-    /**
-     * Create a new ExtendedMessageFormat.
-     *
-     * @param pattern  the pattern to use, not null
-     * @param locale  the locale to use, not null
-     * @param registry  the registry of format factories, may be null
-     * @throws IllegalArgumentException in case of a bad pattern.
-     */
-    public ExtendedMessageFormat(final String pattern, final Locale locale, final Map<String, ? extends FormatFactory> registry) {
-        super(DUMMY_PATTERN);
-        setLocale(locale);
-        this.registry = registry;
-        applyPattern(pattern);
-    }
-
-    /**
-     * {@inheritDoc}
-     */
-    @Override
-    public String toPattern() {
-        return toPattern;
-    }
-
-    /**
-     * Apply the specified pattern.
-     *
-     * @param pattern String
-     */
-    @Override
-    public final void applyPattern(final String pattern) {
-        if (registry == null) {
-            super.applyPattern(pattern);
-            toPattern = super.toPattern();
-            return;
-        }
-        final ArrayList<Format> foundFormats = new ArrayList<Format>();
-        final ArrayList<String> foundDescriptions = new ArrayList<String>();
-        final StringBuilder stripCustom = new StringBuilder(pattern.length());
-
-        final ParsePosition pos = new ParsePosition(0);
-        final char[] c = pattern.toCharArray();
-        int fmtCount = 0;
-        while (pos.getIndex() < pattern.length()) {
-            switch (c[pos.getIndex()]) {
-            case QUOTE:
-                appendQuotedString(pattern, pos, stripCustom);
-                break;
-            case START_FE:
-                fmtCount++;
-                seekNonWs(pattern, pos);
-                final int start = pos.getIndex();
-                final int index = readArgumentIndex(pattern, next(pos));
-                stripCustom.append(START_FE).append(index);
-                seekNonWs(pattern, pos);
-                Format format = null;
-                String formatDescription = null;
-                if (c[pos.getIndex()] == START_FMT) {
-                    formatDescription = parseFormatDescription(pattern,
-                            next(pos));
-                    format = getFormat(formatDescription);
-                    if (format == null) {
-                        stripCustom.append(START_FMT).append(formatDescription);
-                    }
-                }
-                foundFormats.add(format);
-                foundDescriptions.add(format == null ? null : formatDescription);
-                Validate.isTrue(foundFormats.size() == fmtCount);
-                Validate.isTrue(foundDescriptions.size() == fmtCount);
-                if (c[pos.getIndex()] != END_FE) {
-                    throw new IllegalArgumentException(
-                            "Unreadable format element at position " + start);
-                }
-                //$FALL-THROUGH$
-            default:
-                stripCustom.append(c[pos.getIndex()]);
-                next(pos);
-            }
-        }
-        super.applyPattern(stripCustom.toString());
-        toPattern = insertFormats(super.toPattern(), foundDescriptions);
-        if (containsElements(foundFormats)) {
-            final Format[] origFormats = getFormats();
-            // only loop over what we know we have, as MessageFormat on Java 1.3
-            // seems to provide an extra format element:
-            int i = 0;
-            for (final Iterator<Format> it = foundFormats.iterator(); it.hasNext(); i++) {
-                final Format f = it.next();
-                if (f != null) {
-                    origFormats[i] = f;
-                }
-            }
-            super.setFormats(origFormats);
-        }
-    }
-
-    /**
-     * Throws UnsupportedOperationException - see class Javadoc for details.
-     *
-     * @param formatElementIndex format element index
-     * @param newFormat the new format
-     * @throws UnsupportedOperationException always thrown since this isn't supported by ExtendMessageFormat
-     */
-    @Override
-    public void setFormat(final int formatElementIndex, final Format newFormat) {
-        throw new UnsupportedOperationException();
-    }
-
-    /**
-     * Throws UnsupportedOperationException - see class Javadoc for details.
-     *
-     * @param argumentIndex argument index
-     * @param newFormat the new format
-     * @throws UnsupportedOperationException always thrown since this isn't supported by ExtendMessageFormat
-     */
-    @Override
-    public void setFormatByArgumentIndex(final int argumentIndex, final Format newFormat) {
-        throw new UnsupportedOperationException();
-    }
-
-    /**
-     * Throws UnsupportedOperationException - see class Javadoc for details.
-     *
-     * @param newFormats new formats
-     * @throws UnsupportedOperationException always thrown since this isn't supported by ExtendMessageFormat
-     */
-    @Override
-    public void setFormats(final Format[] newFormats) {
-        throw new UnsupportedOperationException();
-    }
-
-    /**
-     * Throws UnsupportedOperationException - see class Javadoc for details.
-     *
-     * @param newFormats new formats
-     * @throws UnsupportedOperationException always thrown since this isn't supported by ExtendMessageFormat
-     */
-    @Override
-    public void setFormatsByArgumentIndex(final Format[] newFormats) {
-        throw new UnsupportedOperationException();
-    }
-
-    /**
-     * Check if this extended message format is equal to another object.
-     *
-     * @param obj the object to compare to
-     * @return true if this object equals the other, otherwise false
-     */
-    @Override
-    public boolean equals(final Object obj) {
-        if (obj == this) {
-            return true;
-        }
-        if (obj == null) {
-            return false;
-        }
-        if (!super.equals(obj)) {
-            return false;
-        }
-        if (ObjectUtils.notEqual(getClass(), obj.getClass())) {
-          return false;
-        }
-        final ExtendedMessageFormat rhs = (ExtendedMessageFormat)obj;
-        if (ObjectUtils.notEqual(toPattern, rhs.toPattern)) {
-            return false;
-        }
-        if (ObjectUtils.notEqual(registry, rhs.registry)) {
-            return false;
-        }
-        return true;
-    }
-
-    /**
-     * {@inheritDoc}
-     */
-    @SuppressWarnings( "deprecation" ) // ObjectUtils.hashCode(Object) has been deprecated in 3.2
-    @Override
-    public int hashCode() {
-        int result = super.hashCode();
-        result = HASH_SEED * result + ObjectUtils.hashCode(registry);
-        result = HASH_SEED * result + ObjectUtils.hashCode(toPattern);
-        return result;
-    }
-
-    /**
-     * Get a custom format from a format description.
-     *
-     * @param desc String
-     * @return Format
-     */
-    private Format getFormat(final String desc) {
-        if (registry != null) {
-            String name = desc;
-            String args = null;
-            final int i = desc.indexOf(START_FMT);
-            if (i > 0) {
-                name = desc.substring(0, i).trim();
-                args = desc.substring(i + 1).trim();
-            }
-            final FormatFactory factory = registry.get(name);
-            if (factory != null) {
-                return factory.getFormat(name, args, getLocale());
-            }
-        }
-        return null;
-    }
-
-    /**
-     * Read the argument index from the current format element
-     *
-     * @param pattern pattern to parse
-     * @param pos current parse position
-     * @return argument index
-     */
-    private int readArgumentIndex(final String pattern, final ParsePosition pos) {
-        final int start = pos.getIndex();
-        seekNonWs(pattern, pos);
-        final StringBuilder result = new StringBuilder();
-        boolean error = false;
-        for (; !error && pos.getIndex() < pattern.length(); next(pos)) {
-            char c = pattern.charAt(pos.getIndex());
-            if (Character.isWhitespace(c)) {
-                seekNonWs(pattern, pos);
-                c = pattern.charAt(pos.getIndex());
-                if (c != START_FMT && c != END_FE) {
-                    error = true;
-                    continue;
-                }
-            }
-            if ((c == START_FMT || c == END_FE) && result.length() > 0) {
-                try {
-                    return Integer.parseInt(result.toString());
-                } catch (final NumberFormatException e) { // NOPMD
-                    // we've already ensured only digits, so unless something
-                    // outlandishly large was specified we should be okay.
-                }
-            }
-            error = !Character.isDigit(c);
-            result.append(c);
-        }
-        if (error) {
-            throw new IllegalArgumentException(
-                    "Invalid format argument index at position " + start + ": "
-                            + pattern.substring(start, pos.getIndex()));
-        }
-        throw new IllegalArgumentException(
-                "Unterminated format element at position " + start);
-    }
-
-    /**
-     * Parse the format component of a format element.
-     *
-     * @param pattern string to parse
-     * @param pos current parse position
-     * @return Format description String
-     */
-    private String parseFormatDescription(final String pattern, final ParsePosition pos) {
-        final int start = pos.getIndex();
-        seekNonWs(pattern, pos);
-        final int text = pos.getIndex();
-        int depth = 1;
-        for (; pos.getIndex() < pattern.length(); next(pos)) {
-            switch (pattern.charAt(pos.getIndex())) {
-            case START_FE:
-                depth++;
-                break;
-            case END_FE:
-                depth--;
-                if (depth == 0) {
-                    return pattern.substring(text, pos.getIndex());
-                }
-                break;
-            case QUOTE:
-                getQuotedString(pattern, pos);
-                break;
-            default:
-                break;
-            }
-        }
-        throw new IllegalArgumentException(
-                "Unterminated format element at position " + start);
-    }
-
-    /**
-     * Insert formats back into the pattern for toPattern() support.
-     *
-     * @param pattern source
-     * @param customPatterns The custom patterns to re-insert, if any
-     * @return full pattern
-     */
-    private String insertFormats(final String pattern, final ArrayList<String> customPatterns) {
-        if (!containsElements(customPatterns)) {
-            return pattern;
-        }
-        final StringBuilder sb = new StringBuilder(pattern.length() * 2);
-        final ParsePosition pos = new ParsePosition(0);
-        int fe = -1;
-        int depth = 0;
-        while (pos.getIndex() < pattern.length()) {
-            final char c = pattern.charAt(pos.getIndex());
-            switch (c) {
-            case QUOTE:
-                appendQuotedString(pattern, pos, sb);
-                break;
-            case START_FE:
-                depth++;
-                sb.append(START_FE).append(readArgumentIndex(pattern, next(pos)));
-                // do not look for custom patterns when they are embedded, e.g. in a choice
-                if (depth == 1) {
-                    fe++;
-                    final String customPattern = customPatterns.get(fe);
-                    if (customPattern != null) {
-                        sb.append(START_FMT).append(customPattern);
-                    }
-                }
-                break;
-            case END_FE:
-                depth--;
-                //$FALL-THROUGH$
-            default:
-                sb.append(c);
-                next(pos);
-            }
-        }
-        return sb.toString();
-    }
-
-    /**
-     * Consume whitespace from the current parse position.
-     *
-     * @param pattern String to read
-     * @param pos current position
-     */
-    private void seekNonWs(final String pattern, final ParsePosition pos) {
-        int len = 0;
-        final char[] buffer = pattern.toCharArray();
-        do {
-            len = StrMatcher.splitMatcher().isMatch(buffer, pos.getIndex());
-            pos.setIndex(pos.getIndex() + len);
-        } while (len > 0 && pos.getIndex() < pattern.length());
-    }
-
-    /**
-     * Convenience method to advance parse position by 1
-     *
-     * @param pos ParsePosition
-     * @return <code>pos</code>
-     */
-    private ParsePosition next(final ParsePosition pos) {
-        pos.setIndex(pos.getIndex() + 1);
-        return pos;
-    }
-
-    /**
-     * Consume a quoted string, adding it to <code>appendTo</code> if
-     * specified.
-     *
-     * @param pattern pattern to parse
-     * @param pos current parse position
-     * @param appendTo optional StringBuilder to append
-     * @return <code>appendTo</code>
-     */
-    private StringBuilder appendQuotedString(final String pattern, final ParsePosition pos,
-            final StringBuilder appendTo) {
-        assert pattern.toCharArray()[pos.getIndex()] == QUOTE : 
-            "Quoted string must start with quote character";
-
-        // handle quote character at the beginning of the string
-        if(appendTo != null) {
-            appendTo.append(QUOTE);
-        }
-        next(pos);
-
-        final int start = pos.getIndex();
-        final char[] c = pattern.toCharArray();
-        int lastHold = start;
-        for (int i = pos.getIndex(); i < pattern.length(); i++) {
-            switch (c[pos.getIndex()]) {
-            case QUOTE:
-                next(pos);
-                return appendTo == null ? null : appendTo.append(c, lastHold,
-                        pos.getIndex() - lastHold);
-            default:
-                next(pos);
-            }
-        }
-        throw new IllegalArgumentException(
-                "Unterminated quoted string at position " + start);
-    }
-
-    /**
-     * Consume quoted string only
-     *
-     * @param pattern pattern to parse
-     * @param pos current parse position
-     */
-    private void getQuotedString(final String pattern, final ParsePosition pos) {
-        appendQuotedString(pattern, pos, null);
-    }
-
-    /**
-     * Learn whether the specified Collection contains non-null elements.
-     * @param coll to check
-     * @return <code>true</code> if some Object was found, <code>false</code> otherwise.
-     */
-    private boolean containsElements(final Collection<?> coll) {
-        if (coll == null || coll.isEmpty()) {
-            return false;
-        }
-        for (final Object name : coll) {
-            if (name != null) {
-                return true;
-            }
-        }
-        return false;
-    }
-}
diff --git a/lang/src/main/java/org/apache/commons/lang3/text/FormatFactory.java b/lang/src/main/java/org/apache/commons/lang3/text/FormatFactory.java
deleted file mode 100644
index 3460b4d..0000000
--- a/lang/src/main/java/org/apache/commons/lang3/text/FormatFactory.java
+++ /dev/null
@@ -1,42 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- * 
- *      http://www.apache.org/licenses/LICENSE-2.0
- * 
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.commons.lang3.text;
-
-import java.text.Format;
-import java.util.Locale;
-
-/**
- * Format factory.
- * 
- * @since 2.4
- * @version $Id$
- */
-public interface FormatFactory {
-
-    /**
-     * Create or retrieve a format instance.
-     *
-     * @param name The format type name
-     * @param arguments Arguments used to create the format instance. This allows the
-     *                  <code>FormatFactory</code> to implement the "format style"
-     *                  concept from <code>java.text.MessageFormat</code>.
-     * @param locale The locale, may be null
-     * @return The format instance
-     */
-    Format getFormat(String name, String arguments, Locale locale);
-
-}
diff --git a/lang/src/main/java/org/apache/commons/lang3/text/FormattableUtils.java b/lang/src/main/java/org/apache/commons/lang3/text/FormattableUtils.java
deleted file mode 100644
index abdd114..0000000
--- a/lang/src/main/java/org/apache/commons/lang3/text/FormattableUtils.java
+++ /dev/null
@@ -1,151 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.commons.lang3.text;
-
-import static java.util.FormattableFlags.LEFT_JUSTIFY;
-
-import java.util.Formattable;
-import java.util.Formatter;
-
-import org.apache.commons.lang3.ObjectUtils;
-import org.apache.commons.lang3.StringUtils;
-import org.apache.commons.lang3.Validate;
-
-/**
- * <p>Provides utilities for working with the {@code Formattable} interface.</p>
- * 
- * <p>The {@link Formattable} interface provides basic control over formatting
- * when using a {@code Formatter}. It is primarily concerned with numeric precision
- * and padding, and is not designed to allow generalised alternate formats.</p>
- * 
- * @since Lang 3.0
- * @version $Id$
- */
-public class FormattableUtils {
-
-    /**
-     * A format that simply outputs the value as a string.
-     */
-    private static final String SIMPLEST_FORMAT = "%s";
-
-    /**
-     * <p>{@code FormattableUtils} instances should NOT be constructed in
-     * standard programming. Instead, the methods of the class should be invoked
-     * statically.</p>
-     * 
-     * <p>This constructor is public to permit tools that require a JavaBean
-     * instance to operate.</p>
-     */
-    public FormattableUtils() {
-        super();
-    }
-
-    //-----------------------------------------------------------------------
-    /**
-     * Get the default formatted representation of the specified
-     * {@code Formattable}.
-     * 
-     * @param formattable  the instance to convert to a string, not null
-     * @return the resulting string, not null
-     */
-    public static String toString(final Formattable formattable) {
-        return String.format(SIMPLEST_FORMAT, formattable);
-    }
-
-    /**
-     * Handles the common {@code Formattable} operations of truncate-pad-append,
-     * with no ellipsis on precision overflow, and padding width underflow with
-     * spaces.
-     * 
-     * @param seq  the string to handle, not null
-     * @param formatter  the destination formatter, not null
-     * @param flags  the flags for formatting, see {@code Formattable}
-     * @param width  the width of the output, see {@code Formattable}
-     * @param precision  the precision of the output, see {@code Formattable}
-     * @return the {@code formatter} instance, not null
-     */
-    public static Formatter append(final CharSequence seq, final Formatter formatter, final int flags, final int width,
-            final int precision) {
-        return append(seq, formatter, flags, width, precision, ' ', null);
-    }
-
-    /**
-     * Handles the common {@link Formattable} operations of truncate-pad-append,
-     * with no ellipsis on precision overflow.
-     * 
-     * @param seq  the string to handle, not null
-     * @param formatter  the destination formatter, not null
-     * @param flags  the flags for formatting, see {@code Formattable}
-     * @param width  the width of the output, see {@code Formattable}
-     * @param precision  the precision of the output, see {@code Formattable}
-     * @param padChar  the pad character to use
-     * @return the {@code formatter} instance, not null
-     */
-    public static Formatter append(final CharSequence seq, final Formatter formatter, final int flags, final int width,
-            final int precision, final char padChar) {
-        return append(seq, formatter, flags, width, precision, padChar, null);
-    }
-
-    /**
-     * Handles the common {@link Formattable} operations of truncate-pad-append,
-     * padding width underflow with spaces.
-     * 
-     * @param seq  the string to handle, not null
-     * @param formatter  the destination formatter, not null
-     * @param flags  the flags for formatting, see {@code Formattable}
-     * @param width  the width of the output, see {@code Formattable}
-     * @param precision  the precision of the output, see {@code Formattable}
-     * @param ellipsis  the ellipsis to use when precision dictates truncation, null or
-     *  empty causes a hard truncation
-     * @return the {@code formatter} instance, not null
-     */
-    public static Formatter append(final CharSequence seq, final Formatter formatter, final int flags, final int width,
-            final int precision, final CharSequence ellipsis) {
-        return append(seq, formatter, flags, width, precision, ' ', ellipsis);
-    }
-
-    /**
-     * Handles the common {@link Formattable} operations of truncate-pad-append.
-     * 
-     * @param seq  the string to handle, not null
-     * @param formatter  the destination formatter, not null
-     * @param flags  the flags for formatting, see {@code Formattable}
-     * @param width  the width of the output, see {@code Formattable}
-     * @param precision  the precision of the output, see {@code Formattable}
-     * @param padChar  the pad character to use
-     * @param ellipsis  the ellipsis to use when precision dictates truncation, null or
-     *  empty causes a hard truncation
-     * @return the {@code formatter} instance, not null
-     */
-    public static Formatter append(final CharSequence seq, final Formatter formatter, final int flags, final int width,
-            final int precision, final char padChar, final CharSequence ellipsis) {
-        Validate.isTrue(ellipsis == null || precision < 0 || ellipsis.length() <= precision,
-                "Specified ellipsis '%1$s' exceeds precision of %2$s", ellipsis, Integer.valueOf(precision));
-        final StringBuilder buf = new StringBuilder(seq);
-        if (precision >= 0 && precision < seq.length()) {
-            final CharSequence _ellipsis = ObjectUtils.defaultIfNull(ellipsis, StringUtils.EMPTY);
-            buf.replace(precision - _ellipsis.length(), seq.length(), _ellipsis.toString());
-        }
-        final boolean leftJustify = (flags & LEFT_JUSTIFY) == LEFT_JUSTIFY;
-        for (int i = buf.length(); i < width; i++) {
-            buf.insert(leftJustify ? i : 0, padChar);
-        }
-        formatter.format(buf.toString());
-        return formatter;
-    }
-
-}
diff --git a/lang/src/main/java/org/apache/commons/lang3/text/StrBuilder.java b/lang/src/main/java/org/apache/commons/lang3/text/StrBuilder.java
deleted file mode 100644
index 103b040..0000000
--- a/lang/src/main/java/org/apache/commons/lang3/text/StrBuilder.java
+++ /dev/null
@@ -1,3127 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- * 
- *      http://www.apache.org/licenses/LICENSE-2.0
- * 
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.commons.lang3.text;
-
-import java.io.IOException;
-import java.io.Reader;
-import java.io.Serializable;
-import java.io.Writer;
-import java.nio.CharBuffer;
-import java.util.Iterator;
-import java.util.List;
-
-import org.apache.commons.lang3.ArrayUtils;
-import org.apache.commons.lang3.ObjectUtils;
-import org.apache.commons.lang3.SystemUtils;
-import org.apache.commons.lang3.builder.Builder;
-
-/**
- * Builds a string from constituent parts providing a more flexible and powerful API
- * than StringBuffer.
- * <p>
- * The main differences from StringBuffer/StringBuilder are:
- * </p>
- * <ul>
- * <li>Not synchronized</li>
- * <li>Not final</li>
- * <li>Subclasses have direct access to character array</li>
- * <li>Additional methods
- *  <ul>
- *   <li>appendWithSeparators - adds an array of values, with a separator</li>
- *   <li>appendPadding - adds a length padding characters</li>
- *   <li>appendFixedLength - adds a fixed width field to the builder</li>
- *   <li>toCharArray/getChars - simpler ways to get a range of the character array</li>
- *   <li>delete - delete char or string</li>
- *   <li>replace - search and replace for a char or string</li>
- *   <li>leftString/rightString/midString - substring without exceptions</li>
- *   <li>contains - whether the builder contains a char or string</li>
- *   <li>size/clear/isEmpty - collections style API methods</li>
- *  </ul>
- * </li>
- * <li>Views
- *  <ul>
- *   <li>asTokenizer - uses the internal buffer as the source of a StrTokenizer</li>
- *   <li>asReader - uses the internal buffer as the source of a Reader</li>
- *   <li>asWriter - allows a Writer to write directly to the internal buffer</li>
- *  </ul>
- * </li>
- * </ul>
- * <p>
- * The aim has been to provide an API that mimics very closely what StringBuffer
- * provides, but with additional methods. It should be noted that some edge cases,
- * with invalid indices or null input, have been altered - see individual methods.
- * The biggest of these changes is that by default, null will not output the text
- * 'null'. This can be controlled by a property, {@link #setNullText(String)}.
- * <p>
- * Prior to 3.0, this class implemented Cloneable but did not implement the 
- * clone method so could not be used. From 3.0 onwards it no longer implements 
- * the interface. 
- *
- * @since 2.2
- * @version $Id$
- */
-public class StrBuilder implements CharSequence, Appendable, Serializable, Builder<String> {
-
-    /**
-     * The extra capacity for new builders.
-     */
-    static final int CAPACITY = 32;
-
-    /**
-     * Required for serialization support.
-     * 
-     * @see java.io.Serializable
-     */
-    private static final long serialVersionUID = 7628716375283629643L;
-
-    /** Internal data storage. */
-    protected char[] buffer; // TODO make private?
-    /** Current size of the buffer. */
-    protected int size; // TODO make private?
-    /** The new line. */
-    private String newLine;
-    /** The null text. */
-    private String nullText;
-
-    //-----------------------------------------------------------------------
-    /**
-     * Constructor that creates an empty builder initial capacity 32 characters.
-     */
-    public StrBuilder() {
-        this(CAPACITY);
-    }
-
-    /**
-     * Constructor that creates an empty builder the specified initial capacity.
-     *
-     * @param initialCapacity  the initial capacity, zero or less will be converted to 32
-     */
-    public StrBuilder(int initialCapacity) {
-        super();
-        if (initialCapacity <= 0) {
-            initialCapacity = CAPACITY;
-        }
-        buffer = new char[initialCapacity];
-    }
-
-    /**
-     * Constructor that creates a builder from the string, allocating
-     * 32 extra characters for growth.
-     *
-     * @param str  the string to copy, null treated as blank string
-     */
-    public StrBuilder(final String str) {
-        super();
-        if (str == null) {
-            buffer = new char[CAPACITY];
-        } else {
-            buffer = new char[str.length() + CAPACITY];
-            append(str);
-        }
-    }
-
-    //-----------------------------------------------------------------------
-    /**
-     * Gets the text to be appended when a new line is added.
-     *
-     * @return the new line text, null means use system default
-     */
-    public String getNewLineText() {
-        return newLine;
-    }
-
-    /**
-     * Sets the text to be appended when a new line is added.
-     *
-     * @param newLine  the new line text, null means use system default
-     * @return this, to enable chaining
-     */
-    public StrBuilder setNewLineText(final String newLine) {
-        this.newLine = newLine;
-        return this;
-    }
-
-    //-----------------------------------------------------------------------
-    /**
-     * Gets the text to be appended when null is added.
-     *
-     * @return the null text, null means no append
-     */
-    public String getNullText() {
-        return nullText;
-    }
-
-    /**
-     * Sets the text to be appended when null is added.
-     *
-     * @param nullText  the null text, null means no append
-     * @return this, to enable chaining
-     */
-    public StrBuilder setNullText(String nullText) {
-        if (nullText != null && nullText.isEmpty()) {
-            nullText = null;
-        }
-        this.nullText = nullText;
-        return this;
-    }
-
-    //-----------------------------------------------------------------------
-    /**
-     * Gets the length of the string builder.
-     *
-     * @return the length
-     */
-    @Override
-    public int length() {
-        return size;
-    }
-
-    /**
-     * Updates the length of the builder by either dropping the last characters
-     * or adding filler of Unicode zero.
-     *
-     * @param length  the length to set to, must be zero or positive
-     * @return this, to enable chaining
-     * @throws IndexOutOfBoundsException if the length is negative
-     */
-    public StrBuilder setLength(final int length) {
-        if (length < 0) {
-            throw new StringIndexOutOfBoundsException(length);
-        }
-        if (length < size) {
-            size = length;
-        } else if (length > size) {
-            ensureCapacity(length);
-            final int oldEnd = size;
-            final int newEnd = length;
-            size = length;
-            for (int i = oldEnd; i < newEnd; i++) {
-                buffer[i] = '\0';
-            }
-        }
-        return this;
-    }
-
-    //-----------------------------------------------------------------------
-    /**
-     * Gets the current size of the internal character array buffer.
-     *
-     * @return the capacity
-     */
-    public int capacity() {
-        return buffer.length;
-    }
-
-    /**
-     * Checks the capacity and ensures that it is at least the size specified.
-     *
-     * @param capacity  the capacity to ensure
-     * @return this, to enable chaining
-     */
-    public StrBuilder ensureCapacity(final int capacity) {
-        if (capacity > buffer.length) {
-            final char[] old = buffer;
-            buffer = new char[capacity * 2];
-            System.arraycopy(old, 0, buffer, 0, size);
-        }
-        return this;
-    }
-
-    /**
-     * Minimizes the capacity to the actual length of the string.
-     *
-     * @return this, to enable chaining
-     */
-    public StrBuilder minimizeCapacity() {
-        if (buffer.length > length()) {
-            final char[] old = buffer;
-            buffer = new char[length()];
-            System.arraycopy(old, 0, buffer, 0, size);
-        }
-        return this;
-    }
-
-    //-----------------------------------------------------------------------
-    /**
-     * Gets the length of the string builder.
-     * <p>
-     * This method is the same as {@link #length()} and is provided to match the
-     * API of Collections.
-     *
-     * @return the length
-     */
-    public int size() {
-        return size;
-    }
-
-    /**
-     * Checks is the string builder is empty (convenience Collections API style method).
-     * <p>
-     * This method is the same as checking {@link #length()} and is provided to match the
-     * API of Collections.
-     *
-     * @return <code>true</code> if the size is <code>0</code>.
-     */
-    public boolean isEmpty() {
-        return size == 0;
-    }
-
-    /**
-     * Clears the string builder (convenience Collections API style method).
-     * <p>
-     * This method does not reduce the size of the internal character buffer.
-     * To do that, call <code>clear()</code> followed by {@link #minimizeCapacity()}.
-     * <p>
-     * This method is the same as {@link #setLength(int)} called with zero
-     * and is provided to match the API of Collections.
-     *
-     * @return this, to enable chaining
-     */
-    public StrBuilder clear() {
-        size = 0;
-        return this;
-    }
-
-    //-----------------------------------------------------------------------
-    /**
-     * Gets the character at the specified index.
-     *
-     * @see #setCharAt(int, char)
-     * @see #deleteCharAt(int)
-     * @param index  the index to retrieve, must be valid
-     * @return the character at the index
-     * @throws IndexOutOfBoundsException if the index is invalid
-     */
-    @Override
-    public char charAt(final int index) {
-        if (index < 0 || index >= length()) {
-            throw new StringIndexOutOfBoundsException(index);
-        }
-        return buffer[index];
-    }
-
-    /**
-     * Sets the character at the specified index.
-     *
-     * @see #charAt(int)
-     * @see #deleteCharAt(int)
-     * @param index  the index to set
-     * @param ch  the new character
-     * @return this, to enable chaining
-     * @throws IndexOutOfBoundsException if the index is invalid
-     */
-    public StrBuilder setCharAt(final int index, final char ch) {
-        if (index < 0 || index >= length()) {
-            throw new StringIndexOutOfBoundsException(index);
-        }
-        buffer[index] = ch;
-        return this;
-    }
-
-    /**
-     * Deletes the character at the specified index.
-     *
-     * @see #charAt(int)
-     * @see #setCharAt(int, char)
-     * @param index  the index to delete
-     * @return this, to enable chaining
-     * @throws IndexOutOfBoundsException if the index is invalid
-     */
-    public StrBuilder deleteCharAt(final int index) {
-        if (index < 0 || index >= size) {
-            throw new StringIndexOutOfBoundsException(index);
-        }
-        deleteImpl(index, index + 1, 1);
-        return this;
-    }
-
-    //-----------------------------------------------------------------------
-    /**
-     * Copies the builder's character array into a new character array.
-     * 
-     * @return a new array that represents the contents of the builder
-     */
-    public char[] toCharArray() {
-        if (size == 0) {
-            return ArrayUtils.EMPTY_CHAR_ARRAY;
-        }
-        final char chars[] = new char[size];
-        System.arraycopy(buffer, 0, chars, 0, size);
-        return chars;
-    }
-
-    /**
-     * Copies part of the builder's character array into a new character array.
-     * 
-     * @param startIndex  the start index, inclusive, must be valid
-     * @param endIndex  the end index, exclusive, must be valid except that
-     *  if too large it is treated as end of string
-     * @return a new array that holds part of the contents of the builder
-     * @throws IndexOutOfBoundsException if startIndex is invalid,
-     *  or if endIndex is invalid (but endIndex greater than size is valid)
-     */
-    public char[] toCharArray(final int startIndex, int endIndex) {
-        endIndex = validateRange(startIndex, endIndex);
-        final int len = endIndex - startIndex;
-        if (len == 0) {
-            return ArrayUtils.EMPTY_CHAR_ARRAY;
-        }
-        final char chars[] = new char[len];
-        System.arraycopy(buffer, startIndex, chars, 0, len);
-        return chars;
-    }
-
-    /**
-     * Copies the character array into the specified array.
-     * 
-     * @param destination  the destination array, null will cause an array to be created
-     * @return the input array, unless that was null or too small
-     */
-    public char[] getChars(char[] destination) {
-        final int len = length();
-        if (destination == null || destination.length < len) {
-            destination = new char[len];
-        }
-        System.arraycopy(buffer, 0, destination, 0, len);
-        return destination;
-    }
-
-    /**
-     * Copies the character array into the specified array.
-     *
-     * @param startIndex  first index to copy, inclusive, must be valid
-     * @param endIndex  last index, exclusive, must be valid
-     * @param destination  the destination array, must not be null or too small
-     * @param destinationIndex  the index to start copying in destination
-     * @throws NullPointerException if the array is null
-     * @throws IndexOutOfBoundsException if any index is invalid
-     */
-    public void getChars(final int startIndex, final int endIndex, final char destination[], final int destinationIndex) {
-        if (startIndex < 0) {
-            throw new StringIndexOutOfBoundsException(startIndex);
-        }
-        if (endIndex < 0 || endIndex > length()) {
-            throw new StringIndexOutOfBoundsException(endIndex);
-        }
-        if (startIndex > endIndex) {
-            throw new StringIndexOutOfBoundsException("end < start");
-        }
-        System.arraycopy(buffer, startIndex, destination, destinationIndex, endIndex - startIndex);
-    }
-
-    //-----------------------------------------------------------------------
-    /**
-     * If possible, reads chars from the provided {@link Readable} directly into underlying
-     * character buffer without making extra copies.
-     *
-     * @param readable  object to read from
-     * @return the number of characters read
-     * @throws IOException if an I/O error occurs
-     *
-     * @since 3.4
-     * @see #appendTo(Appendable)
-     */
-    public int readFrom(final Readable readable) throws IOException {
-        final int oldSize = size;
-        if (readable instanceof Reader) {
-            final Reader r = (Reader) readable;
-            ensureCapacity(size + 1);
-            int read;
-            while ((read = r.read(buffer, size, buffer.length - size)) != -1) {
-                size += read;
-                ensureCapacity(size + 1);
-            }
-        } else if (readable instanceof CharBuffer) {
-            final CharBuffer cb = (CharBuffer) readable;
-            final int remaining = cb.remaining();
-            ensureCapacity(size + remaining);
-            cb.get(buffer, size, remaining);
-            size += remaining;
-        } else {
-            while (true) {
-                ensureCapacity(size + 1);
-                final CharBuffer buf = CharBuffer.wrap(buffer, size, buffer.length - size);
-                final int read = readable.read(buf);
-                if (read == -1) {
-                    break;
-                }
-                size += read;
-            }
-        }
-        return size - oldSize;
-    }
-
-    //-----------------------------------------------------------------------
-    /**
-     * Appends the new line string to this string builder.
-     * <p>
-     * The new line string can be altered using {@link #setNewLineText(String)}.
-     * This might be used to force the output to always use Unix line endings
-     * even when on Windows.
-     *
-     * @return this, to enable chaining
-     */
-    public StrBuilder appendNewLine() {
-        if (newLine == null)  {
-            append(SystemUtils.LINE_SEPARATOR);
-            return this;
-        }
-        return append(newLine);
-    }
-
-    /**
-     * Appends the text representing <code>null</code> to this string builder.
-     *
-     * @return this, to enable chaining
-     */
-    public StrBuilder appendNull() {
-        if (nullText == null)  {
-            return this;
-        }
-        return append(nullText);
-    }
-
-    /**
-     * Appends an object to this string builder.
-     * Appending null will call {@link #appendNull()}.
-     *
-     * @param obj  the object to append
-     * @return this, to enable chaining
-     */
-    public StrBuilder append(final Object obj) {
-        if (obj == null) {
-            return appendNull();
-        }
-        if (obj instanceof CharSequence) {
-            return append((CharSequence) obj);
-        }
-        return append(obj.toString());        
-    }
-
-    /**
-     * Appends a CharSequence to this string builder.
-     * Appending null will call {@link #appendNull()}.
-     *
-     * @param seq  the CharSequence to append
-     * @return this, to enable chaining
-     * @since 3.0
-     */
-    @Override
-    public StrBuilder append(final CharSequence seq) {
-        if (seq == null) {
-            return appendNull();
-        }
-        if (seq instanceof StrBuilder) {
-            return append((StrBuilder) seq);
-        }
-        if (seq instanceof StringBuilder) {
-            return append((StringBuilder) seq);
-        }
-        if (seq instanceof StringBuffer) {
-            return append((StringBuffer) seq);
-        }
-        if (seq instanceof CharBuffer) {
-            return append((CharBuffer) seq);
-        }
-        return append(seq.toString());        
-    }
-
-    /**
-     * Appends part of a CharSequence to this string builder.
-     * Appending null will call {@link #appendNull()}.
-     *
-     * @param seq  the CharSequence to append
-     * @param startIndex  the start index, inclusive, must be valid
-     * @param length  the length to append, must be valid
-     * @return this, to enable chaining
-     * @since 3.0
-     */
-    @Override
-    public StrBuilder append(final CharSequence seq, final int startIndex, final int length) {
-        if (seq == null) {
-            return appendNull();
-        } 
-        return append(seq.toString(), startIndex, length);
-    }
-    
-    /**
-     * Appends a string to this string builder.
-     * Appending null will call {@link #appendNull()}.
-     *
-     * @param str  the string to append
-     * @return this, to enable chaining
-     */
-    public StrBuilder append(final String str) {
-        if (str == null) {
-            return appendNull();
-        }
-        final int strLen = str.length();
-        if (strLen > 0) {
-            final int len = length();
-            ensureCapacity(len + strLen);
-            str.getChars(0, strLen, buffer, len);
-            size += strLen;
-        }
-        return this;
-    }
-   
-
-    /**
-     * Appends part of a string to this string builder.
-     * Appending null will call {@link #appendNull()}.
-     *
-     * @param str  the string to append
-     * @param startIndex  the start index, inclusive, must be valid
-     * @param length  the length to append, must be valid
-     * @return this, to enable chaining
-     */
-    public StrBuilder append(final String str, final int startIndex, final int length) {
-        if (str == null) {
-            return appendNull();
-        }
-        if (startIndex < 0 || startIndex > str.length()) {
-            throw new StringIndexOutOfBoundsException("startIndex must be valid");
-        }
-        if (length < 0 || (startIndex + length) > str.length()) {
-            throw new StringIndexOutOfBoundsException("length must be valid");
-        }
-        if (length > 0) {
-            final int len = length();
-            ensureCapacity(len + length);
-            str.getChars(startIndex, startIndex + length, buffer, len);
-            size += length;
-        }
-        return this;
-    }
-
-    /**
-     * Calls {@link String#format(String, Object...)} and appends the result.
-     *
-     * @param format the format string
-     * @param objs the objects to use in the format string
-     * @return {@code this} to enable chaining
-     * @see String#format(String, Object...)
-     * @since 3.2
-     */
-    public StrBuilder append(final String format, final Object... objs) {
-        return append(String.format(format, objs));
-    }
-
-    /**
-     * Appends the contents of a char buffer to this string builder.
-     * Appending null will call {@link #appendNull()}.
-     *
-     * @param buf  the char buffer to append
-     * @return this, to enable chaining
-     * @since 3.4
-     */
-    public StrBuilder append(final CharBuffer buf) {
-        if (buf == null) {
-            return appendNull();
-        }
-        if (buf.hasArray()) {
-            final int length = buf.remaining();
-            final int len = length();
-            ensureCapacity(len + length);
-            System.arraycopy(buf.array(), buf.arrayOffset() + buf.position(), buffer, len, length);
-            size += length;
-        } else {
-            append(buf.toString());
-        }
-        return this;
-    }
-
-    /**
-     * Appends the contents of a char buffer to this string builder.
-     * Appending null will call {@link #appendNull()}.
-     *
-     * @param buf  the char buffer to append
-     * @param startIndex  the start index, inclusive, must be valid
-     * @param length  the length to append, must be valid
-     * @return this, to enable chaining
-     * @since 3.4
-     */
-    public StrBuilder append(final CharBuffer buf, final int startIndex, final int length) {
-        if (buf == null) {
-            return appendNull();
-        }
-        if (buf.hasArray()) {
-            final int totalLength = buf.remaining();
-            if (startIndex < 0 || startIndex > totalLength) {
-                throw new StringIndexOutOfBoundsException("startIndex must be valid");
-            }
-            if (length < 0 || (startIndex + length) > totalLength) {
-                throw new StringIndexOutOfBoundsException("length must be valid");
-            }
-            final int len = length();
-            ensureCapacity(len + length);
-            System.arraycopy(buf.array(), buf.arrayOffset() + buf.position() + startIndex, buffer, len, length);
-            size += length;
-        } else {
-            append(buf.toString(), startIndex, length);
-        }
-        return this;
-    }
-
-    /**
-     * Appends a string buffer to this string builder.
-     * Appending null will call {@link #appendNull()}.
-     *
-     * @param str  the string buffer to append
-     * @return this, to enable chaining
-     */
-    public StrBuilder append(final StringBuffer str) {
-        if (str == null) {
-            return appendNull();
-        }
-        final int strLen = str.length();
-        if (strLen > 0) {
-            final int len = length();
-            ensureCapacity(len + strLen);
-            str.getChars(0, strLen, buffer, len);
-            size += strLen;
-        }
-        return this;
-    }
-
-    /**
-     * Appends part of a string buffer to this string builder.
-     * Appending null will call {@link #appendNull()}.
-     *
-     * @param str  the string to append
-     * @param startIndex  the start index, inclusive, must be valid
-     * @param length  the length to append, must be valid
-     * @return this, to enable chaining
-     */
-    public StrBuilder append(final StringBuffer str, final int startIndex, final int length) {
-        if (str == null) {
-            return appendNull();
-        }
-        if (startIndex < 0 || startIndex > str.length()) {
-            throw new StringIndexOutOfBoundsException("startIndex must be valid");
-        }
-        if (length < 0 || (startIndex + length) > str.length()) {
-            throw new StringIndexOutOfBoundsException("length must be valid");
-        }
-        if (length > 0) {
-            final int len = length();
-            ensureCapacity(len + length);
-            str.getChars(startIndex, startIndex + length, buffer, len);
-            size += length;
-        }
-        return this;
-    }
-
-    /**
-     * Appends a StringBuilder to this string builder.
-     * Appending null will call {@link #appendNull()}.
-     *
-     * @param str the StringBuilder to append
-     * @return this, to enable chaining
-     * @since 3.2
-     */
-    public StrBuilder append(final StringBuilder str) {
-        if (str == null) {
-            return appendNull();
-        }
-        final int strLen = str.length();
-        if (strLen > 0) {
-            final int len = length();
-            ensureCapacity(len + strLen);
-            str.getChars(0, strLen, buffer, len);
-            size += strLen;
-        }
-        return this;
-    }
-    
-    /**
-     * Appends part of a StringBuilder to this string builder.
-     * Appending null will call {@link #appendNull()}.
-     *
-     * @param str the StringBuilder to append
-     * @param startIndex the start index, inclusive, must be valid
-     * @param length the length to append, must be valid
-     * @return this, to enable chaining
-     * @since 3.2
-     */
-    public StrBuilder append(final StringBuilder str, final int startIndex, final int length) {
-        if (str == null) {
-            return appendNull();
-        }
-        if (startIndex < 0 || startIndex > str.length()) {
-            throw new StringIndexOutOfBoundsException("startIndex must be valid");
-        }
-        if (length < 0 || (startIndex + length) > str.length()) {
-            throw new StringIndexOutOfBoundsException("length must be valid");
-        }
-        if (length > 0) {
-            final int len = length();
-            ensureCapacity(len + length);
-            str.getChars(startIndex, startIndex + length, buffer, len);
-            size += length;
-        }
-        return this;
-    }
-
-    /**
-     * Appends another string builder to this string builder.
-     * Appending null will call {@link #appendNull()}.
-     *
-     * @param str  the string builder to append
-     * @return this, to enable chaining
-     */
-    public StrBuilder append(final StrBuilder str) {
-        if (str == null) {
-            return appendNull();
-        }
-        final int strLen = str.length();
-        if (strLen > 0) {
-            final int len = length();
-            ensureCapacity(len + strLen);
-            System.arraycopy(str.buffer, 0, buffer, len, strLen);
-            size += strLen;
-        }
-        return this;
-    }
-
-    /**
-     * Appends part of a string builder to this string builder.
-     * Appending null will call {@link #appendNull()}.
-     *
-     * @param str  the string to append
-     * @param startIndex  the start index, inclusive, must be valid
-     * @param length  the length to append, must be valid
-     * @return this, to enable chaining
-     */
-    public StrBuilder append(final StrBuilder str, final int startIndex, final int length) {
-        if (str == null) {
-            return appendNull();
-        }
-        if (startIndex < 0 || startIndex > str.length()) {
-            throw new StringIndexOutOfBoundsException("startIndex must be valid");
-        }
-        if (length < 0 || (startIndex + length) > str.length()) {
-            throw new StringIndexOutOfBoundsException("length must be valid");
-        }
-        if (length > 0) {
-            final int len = length();
-            ensureCapacity(len + length);
-            str.getChars(startIndex, startIndex + length, buffer, len);
-            size += length;
-        }
-        return this;
-    }
-
-    /**
-     * Appends a char array to the string builder.
-     * Appending null will call {@link #appendNull()}.
-     *
-     * @param chars  the char array to append
-     * @return this, to enable chaining
-     */
-    public StrBuilder append(final char[] chars) {
-        if (chars == null) {
-            return appendNull();
-        }
-        final int strLen = chars.length;
-        if (strLen > 0) {
-            final int len = length();
-            ensureCapacity(len + strLen);
-            System.arraycopy(chars, 0, buffer, len, strLen);
-            size += strLen;
-        }
-        return this;
-    }
-
-    /**
-     * Appends a char array to the string builder.
-     * Appending null will call {@link #appendNull()}.
-     *
-     * @param chars  the char array to append
-     * @param startIndex  the start index, inclusive, must be valid
-     * @param length  the length to append, must be valid
-     * @return this, to enable chaining
-     */
-    public StrBuilder append(final char[] chars, final int startIndex, final int length) {
-        if (chars == null) {
-            return appendNull();
-        }
-        if (startIndex < 0 || startIndex > chars.length) {
-            throw new StringIndexOutOfBoundsException("Invalid startIndex: " + length);
-        }
-        if (length < 0 || (startIndex + length) > chars.length) {
-            throw new StringIndexOutOfBoundsException("Invalid length: " + length);
-        }
-        if (length > 0) {
-            final int len = length();
-            ensureCapacity(len + length);
-            System.arraycopy(chars, startIndex, buffer, len, length);
-            size += length;
-        }
-        return this;
-    }
-
-    /**
-     * Appends a boolean value to the string builder.
-     *
-     * @param value  the value to append
-     * @return this, to enable chaining
-     */
-    public StrBuilder append(final boolean value) {
-        if (value) {
-            ensureCapacity(size + 4);
-            buffer[size++] = 't';
-            buffer[size++] = 'r';
-            buffer[size++] = 'u';
-            buffer[size++] = 'e';
-        } else {
-            ensureCapacity(size + 5);
-            buffer[size++] = 'f';
-            buffer[size++] = 'a';
-            buffer[size++] = 'l';
-            buffer[size++] = 's';
-            buffer[size++] = 'e';
-        }
-        return this;
-    }
-
-    /**
-     * Appends a char value to the string builder.
-     *
-     * @param ch  the value to append
-     * @return this, to enable chaining
-     * @since 3.0
-     */
-    @Override
-    public StrBuilder append(final char ch) {
-        final int len = length();
-        ensureCapacity(len + 1);
-        buffer[size++] = ch;
-        return this;
-    }
-
-    /**
-     * Appends an int value to the string builder using <code>String.valueOf</code>.
-     *
-     * @param value  the value to append
-     * @return this, to enable chaining
-     */
-    public StrBuilder append(final int value) {
-        return append(String.valueOf(value));
-    }
-
-    /**
-     * Appends a long value to the string builder using <code>String.valueOf</code>.
-     *
-     * @param value  the value to append
-     * @return this, to enable chaining
-     */
-    public StrBuilder append(final long value) {
-        return append(String.valueOf(value));
-    }
-
-    /**
-     * Appends a float value to the string builder using <code>String.valueOf</code>.
-     *
-     * @param value  the value to append
-     * @return this, to enable chaining
-     */
-    public StrBuilder append(final float value) {
-        return append(String.valueOf(value));
-    }
-
-    /**
-     * Appends a double value to the string builder using <code>String.valueOf</code>.
-     *
-     * @param value  the value to append
-     * @return this, to enable chaining
-     */
-    public StrBuilder append(final double value) {
-        return append(String.valueOf(value));
-    }
-
-    //-----------------------------------------------------------------------
-    /**
-     * Appends an object followed by a new line to this string builder.
-     * Appending null will call {@link #appendNull()}.
-     *
-     * @param obj  the object to append
-     * @return this, to enable chaining
-     * @since 2.3
-     */
-    public StrBuilder appendln(final Object obj) {
-        return append(obj).appendNewLine();
-    }
-
-    /**
-     * Appends a string followed by a new line to this string builder.
-     * Appending null will call {@link #appendNull()}.
-     *
-     * @param str  the string to append
-     * @return this, to enable chaining
-     * @since 2.3
-     */
-    public StrBuilder appendln(final String str) {
-        return append(str).appendNewLine();
-    }
-
-    /**
-     * Appends part of a string followed by a new line to this string builder.
-     * Appending null will call {@link #appendNull()}.
-     *
-     * @param str  the string to append
-     * @param startIndex  the start index, inclusive, must be valid
-     * @param length  the length to append, must be valid
-     * @return this, to enable chaining
-     * @since 2.3
-     */
-    public StrBuilder appendln(final String str, final int startIndex, final int length) {
-        return append(str, startIndex, length).appendNewLine();
-    }
-
-    /**
-     * Calls {@link String#format(String, Object...)} and appends the result.
-     *
-     * @param format the format string
-     * @param objs the objects to use in the format string
-     * @return {@code this} to enable chaining
-     * @see String#format(String, Object...)
-     * @since 3.2
-     */
-    public StrBuilder appendln(final String format, final Object... objs) {
-        return append(format, objs).appendNewLine();
-    }
-
-    /**
-     * Appends a string buffer followed by a new line to this string builder.
-     * Appending null will call {@link #appendNull()}.
-     *
-     * @param str  the string buffer to append
-     * @return this, to enable chaining
-     * @since 2.3
-     */
-    public StrBuilder appendln(final StringBuffer str) {
-        return append(str).appendNewLine();
-    }
-
-    /**
-     * Appends a string builder followed by a new line to this string builder.
-     * Appending null will call {@link #appendNull()}.
-     *
-     * @param str  the string builder to append
-     * @return this, to enable chaining
-     * @since 3.2
-     */
-    public StrBuilder appendln(final StringBuilder str) {
-        return append(str).appendNewLine();
-    }
-
-    /**
-     * Appends part of a string builder followed by a new line to this string builder.
-     * Appending null will call {@link #appendNull()}.
-     *
-     * @param str  the string builder to append
-     * @param startIndex  the start index, inclusive, must be valid
-     * @param length  the length to append, must be valid
-     * @return this, to enable chaining
-     * @since 3.2
-     */
-    public StrBuilder appendln(final StringBuilder str, final int startIndex, final int length) {
-        return append(str, startIndex, length).appendNewLine();
-    }
-
-    /**
-     * Appends part of a string buffer followed by a new line to this string builder.
-     * Appending null will call {@link #appendNull()}.
-     *
-     * @param str  the string to append
-     * @param startIndex  the start index, inclusive, must be valid
-     * @param length  the length to append, must be valid
-     * @return this, to enable chaining
-     * @since 2.3
-     */
-    public StrBuilder appendln(final StringBuffer str, final int startIndex, final int length) {
-        return append(str, startIndex, length).appendNewLine();
-    }
-
-    /**
-     * Appends another string builder followed by a new line to this string builder.
-     * Appending null will call {@link #appendNull()}.
-     *
-     * @param str  the string builder to append
-     * @return this, to enable chaining
-     * @since 2.3
-     */
-    public StrBuilder appendln(final StrBuilder str) {
-        return append(str).appendNewLine();
-    }
-
-    /**
-     * Appends part of a string builder followed by a new line to this string builder.
-     * Appending null will call {@link #appendNull()}.
-     *
-     * @param str  the string to append
-     * @param startIndex  the start index, inclusive, must be valid
-     * @param length  the length to append, must be valid
-     * @return this, to enable chaining
-     * @since 2.3
-     */
-    public StrBuilder appendln(final StrBuilder str, final int startIndex, final int length) {
-        return append(str, startIndex, length).appendNewLine();
-    }
-
-    /**
-     * Appends a char array followed by a new line to the string builder.
-     * Appending null will call {@link #appendNull()}.
-     *
-     * @param chars  the char array to append
-     * @return this, to enable chaining
-     * @since 2.3
-     */
-    public StrBuilder appendln(final char[] chars) {
-        return append(chars).appendNewLine();
-    }
-
-    /**
-     * Appends a char array followed by a new line to the string builder.
-     * Appending null will call {@link #appendNull()}.
-     *
-     * @param chars  the char array to append
-     * @param startIndex  the start index, inclusive, must be valid
-     * @param length  the length to append, must be valid
-     * @return this, to enable chaining
-     * @since 2.3
-     */
-    public StrBuilder appendln(final char[] chars, final int startIndex, final int length) {
-        return append(chars, startIndex, length).appendNewLine();
-    }
-
-    /**
-     * Appends a boolean value followed by a new line to the string builder.
-     *
-     * @param value  the value to append
-     * @return this, to enable chaining
-     * @since 2.3
-     */
-    public StrBuilder appendln(final boolean value) {
-        return append(value).appendNewLine();
-    }
-
-    /**
-     * Appends a char value followed by a new line to the string builder.
-     *
-     * @param ch  the value to append
-     * @return this, to enable chaining
-     * @since 2.3
-     */
-    public StrBuilder appendln(final char ch) {
-        return append(ch).appendNewLine();
-    }
-
-    /**
-     * Appends an int value followed by a new line to the string builder using <code>String.valueOf</code>.
-     *
-     * @param value  the value to append
-     * @return this, to enable chaining
-     * @since 2.3
-     */
-    public StrBuilder appendln(final int value) {
-        return append(value).appendNewLine();
-    }
-
-    /**
-     * Appends a long value followed by a new line to the string builder using <code>String.valueOf</code>.
-     *
-     * @param value  the value to append
-     * @return this, to enable chaining
-     * @since 2.3
-     */
-    public StrBuilder appendln(final long value) {
-        return append(value).appendNewLine();
-    }
-
-    /**
-     * Appends a float value followed by a new line to the string builder using <code>String.valueOf</code>.
-     *
-     * @param value  the value to append
-     * @return this, to enable chaining
-     * @since 2.3
-     */
-    public StrBuilder appendln(final float value) {
-        return append(value).appendNewLine();
-    }
-
-    /**
-     * Appends a double value followed by a new line to the string builder using <code>String.valueOf</code>.
-     *
-     * @param value  the value to append
-     * @return this, to enable chaining
-     * @since 2.3
-     */
-    public StrBuilder appendln(final double value) {
-        return append(value).appendNewLine();
-    }
-
-    //-----------------------------------------------------------------------
-    /**
-     * Appends each item in an array to the builder without any separators.
-     * Appending a null array will have no effect.
-     * Each object is appended using {@link #append(Object)}.
-     *
-     * @param <T>  the element type
-     * @param array  the array to append
-     * @return this, to enable chaining
-     * @since 2.3
-     */
-    public <T> StrBuilder appendAll(final T... array) {
-        if (array != null && array.length > 0) {
-            for (final Object element : array) {
-                append(element);
-            }
-        }
-        return this;
-    }
-
-    /**
-     * Appends each item in a iterable to the builder without any separators.
-     * Appending a null iterable will have no effect.
-     * Each object is appended using {@link #append(Object)}.
-     *
-     * @param iterable  the iterable to append
-     * @return this, to enable chaining
-     * @since 2.3
-     */
-    public StrBuilder appendAll(final Iterable<?> iterable) {
-        if (iterable != null) {
-            for (final Object o : iterable) {
-                append(o);
-            }
-        }
-        return this;
-    }
-
-    /**
-     * Appends each item in an iterator to the builder without any separators.
-     * Appending a null iterator will have no effect.
-     * Each object is appended using {@link #append(Object)}.
-     *
-     * @param it  the iterator to append
-     * @return this, to enable chaining
-     * @since 2.3
-     */
-    public StrBuilder appendAll(final Iterator<?> it) {
-        if (it != null) {
-            while (it.hasNext()) {
-                append(it.next());
-            }
-        }
-        return this;
-    }
-
-    //-----------------------------------------------------------------------
-    /**
-     * Appends an array placing separators between each value, but
-     * not before the first or after the last.
-     * Appending a null array will have no effect.
-     * Each object is appended using {@link #append(Object)}.
-     *
-     * @param array  the array to append
-     * @param separator  the separator to use, null means no separator
-     * @return this, to enable chaining
-     */
-    public StrBuilder appendWithSeparators(final Object[] array, final String separator) {
-        if (array != null && array.length > 0) {
-            @SuppressWarnings( "deprecation" ) // ObjectUtils.toString(Object) has been deprecated in 3.2
-            final String sep = ObjectUtils.toString(separator);
-            append(array[0]);
-            for (int i = 1; i < array.length; i++) {
-                append(sep);
-                append(array[i]);
-            }
-        }
-        return this;
-    }
-
-    /**
-     * Appends a iterable placing separators between each value, but
-     * not before the first or after the last.
-     * Appending a null iterable will have no effect.
-     * Each object is appended using {@link #append(Object)}.
-     *
-     * @param iterable  the iterable to append
-     * @param separator  the separator to use, null means no separator
-     * @return this, to enable chaining
-     */
-    public StrBuilder appendWithSeparators(final Iterable<?> iterable, final String separator) {
-        if (iterable != null) {
-            @SuppressWarnings( "deprecation" ) // ObjectUtils.toString(Object) has been deprecated in 3.2
-            final String sep = ObjectUtils.toString(separator);
-            final Iterator<?> it = iterable.iterator();
-            while (it.hasNext()) {
-                append(it.next());
-                if (it.hasNext()) {
-                    append(sep);
-                }
-            }
-        }
-        return this;
-    }
-
-    /**
-     * Appends an iterator placing separators between each value, but
-     * not before the first or after the last.
-     * Appending a null iterator will have no effect.
-     * Each object is appended using {@link #append(Object)}.
-     *
-     * @param it  the iterator to append
-     * @param separator  the separator to use, null means no separator
-     * @return this, to enable chaining
-     */
-    public StrBuilder appendWithSeparators(final Iterator<?> it, final String separator) {
-        if (it != null) {
-            @SuppressWarnings( "deprecation" ) // ObjectUtils.toString(Object) has been deprecated in 3.2
-            final String sep = ObjectUtils.toString(separator);
-            while (it.hasNext()) {
-                append(it.next());
-                if (it.hasNext()) {
-                    append(sep);
-                }
-            }
-        }
-        return this;
-    }
-
-    //-----------------------------------------------------------------------
-    /**
-     * Appends a separator if the builder is currently non-empty.
-     * Appending a null separator will have no effect.
-     * The separator is appended using {@link #append(String)}.
-     * <p>
-     * This method is useful for adding a separator each time around the
-     * loop except the first.
-     * <pre>
-     * for (Iterator it = list.iterator(); it.hasNext(); ) {
-     *   appendSeparator(",");
-     *   append(it.next());
-     * }
-     * </pre>
-     * Note that for this simple example, you should use
-     * {@link #appendWithSeparators(Iterable, String)}.
-     * 
-     * @param separator  the separator to use, null means no separator
-     * @return this, to enable chaining
-     * @since 2.3
-     */
-    public StrBuilder appendSeparator(final String separator) {
-        return appendSeparator(separator, null);
-    }
-
-    /**
-     * Appends one of both separators to the StrBuilder.
-     * If the builder is currently empty it will append the defaultIfEmpty-separator
-     * Otherwise it will append the standard-separator
-     * 
-     * Appending a null separator will have no effect.
-     * The separator is appended using {@link #append(String)}.
-     * <p>
-     * This method is for example useful for constructing queries
-     * <pre>
-     * StrBuilder whereClause = new StrBuilder();
-     * if(searchCommand.getPriority() != null) {
-     *  whereClause.appendSeparator(" and", " where");
-     *  whereClause.append(" priority = ?")
-     * }
-     * if(searchCommand.getComponent() != null) {
-     *  whereClause.appendSeparator(" and", " where");
-     *  whereClause.append(" component = ?")
-     * }
-     * selectClause.append(whereClause)
-     * </pre>
-     * 
-     * @param standard the separator if builder is not empty, null means no separator
-     * @param defaultIfEmpty the separator if builder is empty, null means no separator
-     * @return this, to enable chaining
-     * @since 2.5
-     */
-    public StrBuilder appendSeparator(final String standard, final String defaultIfEmpty) {
-        final String str = isEmpty() ? defaultIfEmpty : standard;
-        if (str != null) {
-            append(str);
-        }
-        return this;
-    }
-
-    /**
-     * Appends a separator if the builder is currently non-empty.
-     * The separator is appended using {@link #append(char)}.
-     * <p>
-     * This method is useful for adding a separator each time around the
-     * loop except the first.
-     * <pre>
-     * for (Iterator it = list.iterator(); it.hasNext(); ) {
-     *   appendSeparator(',');
-     *   append(it.next());
-     * }
-     * </pre>
-     * Note that for this simple example, you should use
-     * {@link #appendWithSeparators(Iterable, String)}.
-     * 
-     * @param separator  the separator to use
-     * @return this, to enable chaining
-     * @since 2.3
-     */
-    public StrBuilder appendSeparator(final char separator) {
-        if (size() > 0) {
-            append(separator);
-        }
-        return this;
-    }
-
-    /**
-     * Append one of both separators to the builder
-     * If the builder is currently empty it will append the defaultIfEmpty-separator
-     * Otherwise it will append the standard-separator
-     *
-     * The separator is appended using {@link #append(char)}.
-     * @param standard the separator if builder is not empty
-     * @param defaultIfEmpty the separator if builder is empty
-     * @return this, to enable chaining
-     * @since 2.5
-     */
-    public StrBuilder appendSeparator(final char standard, final char defaultIfEmpty) {
-        if (size() > 0) {
-            append(standard);
-        } else {
-            append(defaultIfEmpty);
-        }
-        return this;
-    }
-    /**
-     * Appends a separator to the builder if the loop index is greater than zero.
-     * Appending a null separator will have no effect.
-     * The separator is appended using {@link #append(String)}.
-     * <p>
-     * This method is useful for adding a separator each time around the
-     * loop except the first.
-     * </p>
-     * <pre>
-     * for (int i = 0; i &lt; list.size(); i++) {
-     *   appendSeparator(",", i);
-     *   append(list.get(i));
-     * }
-     * </pre>
-     * Note that for this simple example, you should use
-     * {@link #appendWithSeparators(Iterable, String)}.
-     * 
-     * @param separator  the separator to use, null means no separator
-     * @param loopIndex  the loop index
-     * @return this, to enable chaining
-     * @since 2.3
-     */
-    public StrBuilder appendSeparator(final String separator, final int loopIndex) {
-        if (separator != null && loopIndex > 0) {
-            append(separator);
-        }
-        return this;
-    }
-
-    /**
-     * Appends a separator to the builder if the loop index is greater than zero.
-     * The separator is appended using {@link #append(char)}.
-     * <p>
-     * This method is useful for adding a separator each time around the
-     * loop except the first.
-     * </p>
-     * <pre>
-     * for (int i = 0; i &lt; list.size(); i++) {
-     *   appendSeparator(",", i);
-     *   append(list.get(i));
-     * }
-     * </pre>
-     * Note that for this simple example, you should use
-     * {@link #appendWithSeparators(Iterable, String)}.
-     * 
-     * @param separator  the separator to use
-     * @param loopIndex  the loop index
-     * @return this, to enable chaining
-     * @since 2.3
-     */
-    public StrBuilder appendSeparator(final char separator, final int loopIndex) {
-        if (loopIndex > 0) {
-            append(separator);
-        }
-        return this;
-    }
-
-    //-----------------------------------------------------------------------
-    /**
-     * Appends the pad character to the builder the specified number of times.
-     * 
-     * @param length  the length to append, negative means no append
-     * @param padChar  the character to append
-     * @return this, to enable chaining
-     */
-    public StrBuilder appendPadding(final int length, final char padChar) {
-        if (length >= 0) {
-            ensureCapacity(size + length);
-            for (int i = 0; i < length; i++) {
-                buffer[size++] = padChar;
-            }
-        }
-        return this;
-    }
-
-    //-----------------------------------------------------------------------
-    /**
-     * Appends an object to the builder padding on the left to a fixed width.
-     * The <code>toString</code> of the object is used.
-     * If the object is larger than the length, the left hand side is lost.
-     * If the object is null, the null text value is used.
-     * 
-     * @param obj  the object to append, null uses null text
-     * @param width  the fixed field width, zero or negative has no effect
-     * @param padChar  the pad character to use
-     * @return this, to enable chaining
-     */
-    public StrBuilder appendFixedWidthPadLeft(final Object obj, final int width, final char padChar) {
-        if (width > 0) {
-            ensureCapacity(size + width);
-            String str = (obj == null ? getNullText() : obj.toString());
-            if (str == null) {
-                str = "";
-            }
-            final int strLen = str.length();
-            if (strLen >= width) {
-                str.getChars(strLen - width, strLen, buffer, size);
-            } else {
-                final int padLen = width - strLen;
-                for (int i = 0; i < padLen; i++) {
-                    buffer[size + i] = padChar;
-                }
-                str.getChars(0, strLen, buffer, size + padLen);
-            }
-            size += width;
-        }
-        return this;
-    }
-
-    /**
-     * Appends an object to the builder padding on the left to a fixed width.
-     * The <code>String.valueOf</code> of the <code>int</code> value is used.
-     * If the formatted value is larger than the length, the left hand side is lost.
-     * 
-     * @param value  the value to append
-     * @param width  the fixed field width, zero or negative has no effect
-     * @param padChar  the pad character to use
-     * @return this, to enable chaining
-     */
-    public StrBuilder appendFixedWidthPadLeft(final int value, final int width, final char padChar) {
-        return appendFixedWidthPadLeft(String.valueOf(value), width, padChar);
-    }
-
-    /**
-     * Appends an object to the builder padding on the right to a fixed length.
-     * The <code>toString</code> of the object is used.
-     * If the object is larger than the length, the right hand side is lost.
-     * If the object is null, null text value is used.
-     * 
-     * @param obj  the object to append, null uses null text
-     * @param width  the fixed field width, zero or negative has no effect
-     * @param padChar  the pad character to use
-     * @return this, to enable chaining
-     */
-    public StrBuilder appendFixedWidthPadRight(final Object obj, final int width, final char padChar) {
-        if (width > 0) {
-            ensureCapacity(size + width);
-            String str = (obj == null ? getNullText() : obj.toString());
-            if (str == null) {
-                str = "";
-            }
-            final int strLen = str.length();
-            if (strLen >= width) {
-                str.getChars(0, width, buffer, size);
-            } else {
-                final int padLen = width - strLen;
-                str.getChars(0, strLen, buffer, size);
-                for (int i = 0; i < padLen; i++) {
-                    buffer[size + strLen + i] = padChar;
-                }
-            }
-            size += width;
-        }
-        return this;
-    }
-
-    /**
-     * Appends an object to the builder padding on the right to a fixed length.
-     * The <code>String.valueOf</code> of the <code>int</code> value is used.
-     * If the object is larger than the length, the right hand side is lost.
-     * 
-     * @param value  the value to append
-     * @param width  the fixed field width, zero or negative has no effect
-     * @param padChar  the pad character to use
-     * @return this, to enable chaining
-     */
-    public StrBuilder appendFixedWidthPadRight(final int value, final int width, final char padChar) {
-        return appendFixedWidthPadRight(String.valueOf(value), width, padChar);
-    }
-
-    //-----------------------------------------------------------------------
-    /**
-     * Inserts the string representation of an object into this builder.
-     * Inserting null will use the stored null text value.
-     *
-     * @param index  the index to add at, must be valid
-     * @param obj  the object to insert
-     * @return this, to enable chaining
-     * @throws IndexOutOfBoundsException if the index is invalid
-     */
-    public StrBuilder insert(final int index, final Object obj) {
-        if (obj == null) {
-            return insert(index, nullText);
-        }
-        return insert(index, obj.toString());
-    }
-
-    /**
-     * Inserts the string into this builder.
-     * Inserting null will use the stored null text value.
-     *
-     * @param index  the index to add at, must be valid
-     * @param str  the string to insert
-     * @return this, to enable chaining
-     * @throws IndexOutOfBoundsException if the index is invalid
-     */
-    public StrBuilder insert(final int index, String str) {
-        validateIndex(index);
-        if (str == null) {
-            str = nullText;
-        }
-        if (str != null) {
-            final int strLen = str.length();
-            if (strLen > 0) {
-                final int newSize = size + strLen;
-                ensureCapacity(newSize);
-                System.arraycopy(buffer, index, buffer, index + strLen, size - index);
-                size = newSize;
-                str.getChars(0, strLen, buffer, index);
-            }
-        }
-        return this;
-    }
-
-    /**
-     * Inserts the character array into this builder.
-     * Inserting null will use the stored null text value.
-     *
-     * @param index  the index to add at, must be valid
-     * @param chars  the char array to insert
-     * @return this, to enable chaining
-     * @throws IndexOutOfBoundsException if the index is invalid
-     */
-    public StrBuilder insert(final int index, final char chars[]) {
-        validateIndex(index);
-        if (chars == null) {
-            return insert(index, nullText);
-        }
-        final int len = chars.length;
-        if (len > 0) {
-            ensureCapacity(size + len);
-            System.arraycopy(buffer, index, buffer, index + len, size - index);
-            System.arraycopy(chars, 0, buffer, index, len);
-            size += len;
-        }
-        return this;
-    }
-
-    /**
-     * Inserts part of the character array into this builder.
-     * Inserting null will use the stored null text value.
-     *
-     * @param index  the index to add at, must be valid
-     * @param chars  the char array to insert
-     * @param offset  the offset into the character array to start at, must be valid
-     * @param length  the length of the character array part to copy, must be positive
-     * @return this, to enable chaining
-     * @throws IndexOutOfBoundsException if any index is invalid
-     */
-    public StrBuilder insert(final int index, final char chars[], final int offset, final int length) {
-        validateIndex(index);
-        if (chars == null) {
-            return insert(index, nullText);
-        }
-        if (offset < 0 || offset > chars.length) {
-            throw new StringIndexOutOfBoundsException("Invalid offset: " + offset);
-        }
-        if (length < 0 || offset + length > chars.length) {
-            throw new StringIndexOutOfBoundsException("Invalid length: " + length);
-        }
-        if (length > 0) {
-            ensureCapacity(size + length);
-            System.arraycopy(buffer, index, buffer, index + length, size - index);
-            System.arraycopy(chars, offset, buffer, index, length);
-            size += length;
-        }
-        return this;
-    }
-
-    /**
-     * Inserts the value into this builder.
-     *
-     * @param index  the index to add at, must be valid
-     * @param value  the value to insert
-     * @return this, to enable chaining
-     * @throws IndexOutOfBoundsException if the index is invalid
-     */
-    public StrBuilder insert(int index, final boolean value) {
-        validateIndex(index);
-        if (value) {
-            ensureCapacity(size + 4);
-            System.arraycopy(buffer, index, buffer, index + 4, size - index);
-            buffer[index++] = 't';
-            buffer[index++] = 'r';
-            buffer[index++] = 'u';
-            buffer[index] = 'e';
-            size += 4;
-        } else {
-            ensureCapacity(size + 5);
-            System.arraycopy(buffer, index, buffer, index + 5, size - index);
-            buffer[index++] = 'f';
-            buffer[index++] = 'a';
-            buffer[index++] = 'l';
-            buffer[index++] = 's';
-            buffer[index] = 'e';
-            size += 5;
-        }
-        return this;
-    }
-
-    /**
-     * Inserts the value into this builder.
-     *
-     * @param index  the index to add at, must be valid
-     * @param value  the value to insert
-     * @return this, to enable chaining
-     * @throws IndexOutOfBoundsException if the index is invalid
-     */
-    public StrBuilder insert(final int index, final char value) {
-        validateIndex(index);
-        ensureCapacity(size + 1);
-        System.arraycopy(buffer, index, buffer, index + 1, size - index);
-        buffer[index] = value;
-        size++;
-        return this;
-    }
-
-    /**
-     * Inserts the value into this builder.
-     *
-     * @param index  the index to add at, must be valid
-     * @param value  the value to insert
-     * @return this, to enable chaining
-     * @throws IndexOutOfBoundsException if the index is invalid
-     */
-    public StrBuilder insert(final int index, final int value) {
-        return insert(index, String.valueOf(value));
-    }
-
-    /**
-     * Inserts the value into this builder.
-     *
-     * @param index  the index to add at, must be valid
-     * @param value  the value to insert
-     * @return this, to enable chaining
-     * @throws IndexOutOfBoundsException if the index is invalid
-     */
-    public StrBuilder insert(final int index, final long value) {
-        return insert(index, String.valueOf(value));
-    }
-
-    /**
-     * Inserts the value into this builder.
-     *
-     * @param index  the index to add at, must be valid
-     * @param value  the value to insert
-     * @return this, to enable chaining
-     * @throws IndexOutOfBoundsException if the index is invalid
-     */
-    public StrBuilder insert(final int index, final float value) {
-        return insert(index, String.valueOf(value));
-    }
-
-    /**
-     * Inserts the value into this builder.
-     *
-     * @param index  the index to add at, must be valid
-     * @param value  the value to insert
-     * @return this, to enable chaining
-     * @throws IndexOutOfBoundsException if the index is invalid
-     */
-    public StrBuilder insert(final int index, final double value) {
-        return insert(index, String.valueOf(value));
-    }
-
-    //-----------------------------------------------------------------------
-    /**
-     * Internal method to delete a range without validation.
-     *
-     * @param startIndex  the start index, must be valid
-     * @param endIndex  the end index (exclusive), must be valid
-     * @param len  the length, must be valid
-     * @throws IndexOutOfBoundsException if any index is invalid
-     */
-    private void deleteImpl(final int startIndex, final int endIndex, final int len) {
-        System.arraycopy(buffer, endIndex, buffer, startIndex, size - endIndex);
-        size -= len;
-    }
-
-    /**
-     * Deletes the characters between the two specified indices.
-     *
-     * @param startIndex  the start index, inclusive, must be valid
-     * @param endIndex  the end index, exclusive, must be valid except
-     *  that if too large it is treated as end of string
-     * @return this, to enable chaining
-     * @throws IndexOutOfBoundsException if the index is invalid
-     */
-    public StrBuilder delete(final int startIndex, int endIndex) {
-        endIndex = validateRange(startIndex, endIndex);
-        final int len = endIndex - startIndex;
-        if (len > 0) {
-            deleteImpl(startIndex, endIndex, len);
-        }
-        return this;
-    }
-
-    //-----------------------------------------------------------------------
-    /**
-     * Deletes the character wherever it occurs in the builder.
-     *
-     * @param ch  the character to delete
-     * @return this, to enable chaining
-     */
-    public StrBuilder deleteAll(final char ch) {
-        for (int i = 0; i < size; i++) {
-            if (buffer[i] == ch) {
-                final int start = i;
-                while (++i < size) {
-                    if (buffer[i] != ch) {
-                        break;
-                    }
-                }
-                final int len = i - start;
-                deleteImpl(start, i, len);
-                i -= len;
-            }
-        }
-        return this;
-    }
-
-    /**
-     * Deletes the character wherever it occurs in the builder.
-     *
-     * @param ch  the character to delete
-     * @return this, to enable chaining
-     */
-    public StrBuilder deleteFirst(final char ch) {
-        for (int i = 0; i < size; i++) {
-            if (buffer[i] == ch) {
-                deleteImpl(i, i + 1, 1);
-                break;
-            }
-        }
-        return this;
-    }
-
-    //-----------------------------------------------------------------------
-    /**
-     * Deletes the string wherever it occurs in the builder.
-     *
-     * @param str  the string to delete, null causes no action
-     * @return this, to enable chaining
-     */
-    public StrBuilder deleteAll(final String str) {
-        final int len = (str == null ? 0 : str.length());
-        if (len > 0) {
-            int index = indexOf(str, 0);
-            while (index >= 0) {
-                deleteImpl(index, index + len, len);
-                index = indexOf(str, index);
-            }
-        }
-        return this;
-    }
-
-    /**
-     * Deletes the string wherever it occurs in the builder.
-     *
-     * @param str  the string to delete, null causes no action
-     * @return this, to enable chaining
-     */
-    public StrBuilder deleteFirst(final String str) {
-        final int len = (str == null ? 0 : str.length());
-        if (len > 0) {
-            final int index = indexOf(str, 0);
-            if (index >= 0) {
-                deleteImpl(index, index + len, len);
-            }
-        }
-        return this;
-    }
-
-    //-----------------------------------------------------------------------
-    /**
-     * Deletes all parts of the builder that the matcher matches.
-     * <p>
-     * Matchers can be used to perform advanced deletion behaviour.
-     * For example you could write a matcher to delete all occurrences
-     * where the character 'a' is followed by a number.
-     *
-     * @param matcher  the matcher to use to find the deletion, null causes no action
-     * @return this, to enable chaining
-     */
-    public StrBuilder deleteAll(final StrMatcher matcher) {
-        return replace(matcher, null, 0, size, -1);
-    }
-
-    /**
-     * Deletes the first match within the builder using the specified matcher.
-     * <p>
-     * Matchers can be used to perform advanced deletion behaviour.
-     * For example you could write a matcher to delete
-     * where the character 'a' is followed by a number.
-     *
-     * @param matcher  the matcher to use to find the deletion, null causes no action
-     * @return this, to enable chaining
-     */
-    public StrBuilder deleteFirst(final StrMatcher matcher) {
-        return replace(matcher, null, 0, size, 1);
-    }
-
-    //-----------------------------------------------------------------------
-    /**
-     * Internal method to delete a range without validation.
-     *
-     * @param startIndex  the start index, must be valid
-     * @param endIndex  the end index (exclusive), must be valid
-     * @param removeLen  the length to remove (endIndex - startIndex), must be valid
-     * @param insertStr  the string to replace with, null means delete range
-     * @param insertLen  the length of the insert string, must be valid
-     * @throws IndexOutOfBoundsException if any index is invalid
-     */
-    private void replaceImpl(final int startIndex, final int endIndex, final int removeLen, final String insertStr, final int insertLen) {
-        final int newSize = size - removeLen + insertLen;
-        if (insertLen != removeLen) {
-            ensureCapacity(newSize);
-            System.arraycopy(buffer, endIndex, buffer, startIndex + insertLen, size - endIndex);
-            size = newSize;
-        }
-        if (insertLen > 0) {
-            insertStr.getChars(0, insertLen, buffer, startIndex);
-        }
-    }
-
-    /**
-     * Replaces a portion of the string builder with another string.
-     * The length of the inserted string does not have to match the removed length.
-     *
-     * @param startIndex  the start index, inclusive, must be valid
-     * @param endIndex  the end index, exclusive, must be valid except
-     *  that if too large it is treated as end of string
-     * @param replaceStr  the string to replace with, null means delete range
-     * @return this, to enable chaining
-     * @throws IndexOutOfBoundsException if the index is invalid
-     */
-    public StrBuilder replace(final int startIndex, int endIndex, final String replaceStr) {
-        endIndex = validateRange(startIndex, endIndex);
-        final int insertLen = (replaceStr == null ? 0 : replaceStr.length());
-        replaceImpl(startIndex, endIndex, endIndex - startIndex, replaceStr, insertLen);
-        return this;
-    }
-
-    //-----------------------------------------------------------------------
-    /**
-     * Replaces the search character with the replace character
-     * throughout the builder.
-     *
-     * @param search  the search character
-     * @param replace  the replace character
-     * @return this, to enable chaining
-     */
-    public StrBuilder replaceAll(final char search, final char replace) {
-        if (search != replace) {
-            for (int i = 0; i < size; i++) {
-                if (buffer[i] == search) {
-                    buffer[i] = replace;
-                }
-            }
-        }
-        return this;
-    }
-
-    /**
-     * Replaces the first instance of the search character with the
-     * replace character in the builder.
-     *
-     * @param search  the search character
-     * @param replace  the replace character
-     * @return this, to enable chaining
-     */
-    public StrBuilder replaceFirst(final char search, final char replace) {
-        if (search != replace) {
-            for (int i = 0; i < size; i++) {
-                if (buffer[i] == search) {
-                    buffer[i] = replace;
-                    break;
-                }
-            }
-        }
-        return this;
-    }
-
-    //-----------------------------------------------------------------------
-    /**
-     * Replaces the search string with the replace string throughout the builder.
-     *
-     * @param searchStr  the search string, null causes no action to occur
-     * @param replaceStr  the replace string, null is equivalent to an empty string
-     * @return this, to enable chaining
-     */
-    public StrBuilder replaceAll(final String searchStr, final String replaceStr) {
-        final int searchLen = (searchStr == null ? 0 : searchStr.length());
-        if (searchLen > 0) {
-            final int replaceLen = (replaceStr == null ? 0 : replaceStr.length());
-            int index = indexOf(searchStr, 0);
-            while (index >= 0) {
-                replaceImpl(index, index + searchLen, searchLen, replaceStr, replaceLen);
-                index = indexOf(searchStr, index + replaceLen);
-            }
-        }
-        return this;
-    }
-
-    /**
-     * Replaces the first instance of the search string with the replace string.
-     *
-     * @param searchStr  the search string, null causes no action to occur
-     * @param replaceStr  the replace string, null is equivalent to an empty string
-     * @return this, to enable chaining
-     */
-    public StrBuilder replaceFirst(final String searchStr, final String replaceStr) {
-        final int searchLen = (searchStr == null ? 0 : searchStr.length());
-        if (searchLen > 0) {
-            final int index = indexOf(searchStr, 0);
-            if (index >= 0) {
-                final int replaceLen = (replaceStr == null ? 0 : replaceStr.length());
-                replaceImpl(index, index + searchLen, searchLen, replaceStr, replaceLen);
-            }
-        }
-        return this;
-    }
-
-    //-----------------------------------------------------------------------
-    /**
-     * Replaces all matches within the builder with the replace string.
-     * <p>
-     * Matchers can be used to perform advanced replace behaviour.
-     * For example you could write a matcher to replace all occurrences
-     * where the character 'a' is followed by a number.
-     *
-     * @param matcher  the matcher to use to find the deletion, null causes no action
-     * @param replaceStr  the replace string, null is equivalent to an empty string
-     * @return this, to enable chaining
-     */
-    public StrBuilder replaceAll(final StrMatcher matcher, final String replaceStr) {
-        return replace(matcher, replaceStr, 0, size, -1);
-    }
-
-    /**
-     * Replaces the first match within the builder with the replace string.
-     * <p>
-     * Matchers can be used to perform advanced replace behaviour.
-     * For example you could write a matcher to replace
-     * where the character 'a' is followed by a number.
-     *
-     * @param matcher  the matcher to use to find the deletion, null causes no action
-     * @param replaceStr  the replace string, null is equivalent to an empty string
-     * @return this, to enable chaining
-     */
-    public StrBuilder replaceFirst(final StrMatcher matcher, final String replaceStr) {
-        return replace(matcher, replaceStr, 0, size, 1);
-    }
-
-    // -----------------------------------------------------------------------
-    /**
-     * Advanced search and replaces within the builder using a matcher.
-     * <p>
-     * Matchers can be used to perform advanced behaviour.
-     * For example you could write a matcher to delete all occurrences
-     * where the character 'a' is followed by a number.
-     *
-     * @param matcher  the matcher to use to find the deletion, null causes no action
-     * @param replaceStr  the string to replace the match with, null is a delete
-     * @param startIndex  the start index, inclusive, must be valid
-     * @param endIndex  the end index, exclusive, must be valid except
-     *  that if too large it is treated as end of string
-     * @param replaceCount  the number of times to replace, -1 for replace all
-     * @return this, to enable chaining
-     * @throws IndexOutOfBoundsException if start index is invalid
-     */
-    public StrBuilder replace(
-            final StrMatcher matcher, final String replaceStr,
-            final int startIndex, int endIndex, final int replaceCount) {
-        endIndex = validateRange(startIndex, endIndex);
-        return replaceImpl(matcher, replaceStr, startIndex, endIndex, replaceCount);
-    }
-
-    /**
-     * Replaces within the builder using a matcher.
-     * <p>
-     * Matchers can be used to perform advanced behaviour.
-     * For example you could write a matcher to delete all occurrences
-     * where the character 'a' is followed by a number.
-     *
-     * @param matcher  the matcher to use to find the deletion, null causes no action
-     * @param replaceStr  the string to replace the match with, null is a delete
-     * @param from  the start index, must be valid
-     * @param to  the end index (exclusive), must be valid
-     * @param replaceCount  the number of times to replace, -1 for replace all
-     * @return this, to enable chaining
-     * @throws IndexOutOfBoundsException if any index is invalid
-     */
-    private StrBuilder replaceImpl(
-            final StrMatcher matcher, final String replaceStr,
-            final int from, int to, int replaceCount) {
-        if (matcher == null || size == 0) {
-            return this;
-        }
-        final int replaceLen = (replaceStr == null ? 0 : replaceStr.length());
-        final char[] buf = buffer;
-        for (int i = from; i < to && replaceCount != 0; i++) {
-            final int removeLen = matcher.isMatch(buf, i, from, to);
-            if (removeLen > 0) {
-                replaceImpl(i, i + removeLen, removeLen, replaceStr, replaceLen);
-                to = to - removeLen + replaceLen;
-                i = i + replaceLen - 1;
-                if (replaceCount > 0) {
-                    replaceCount--;
-                }
-            }
-        }
-        return this;
-    }
-
-    //-----------------------------------------------------------------------
-    /**
-     * Reverses the string builder placing each character in the opposite index.
-     * 
-     * @return this, to enable chaining
-     */
-    public StrBuilder reverse() {
-        if (size == 0) {
-            return this;
-        }
-        
-        final int half = size / 2;
-        final char[] buf = buffer;
-        for (int leftIdx = 0, rightIdx = size - 1; leftIdx < half; leftIdx++,rightIdx--) {
-            final char swap = buf[leftIdx];
-            buf[leftIdx] = buf[rightIdx];
-            buf[rightIdx] = swap;
-        }
-        return this;
-    }
-
-    //-----------------------------------------------------------------------
-    /**
-     * Trims the builder by removing characters less than or equal to a space
-     * from the beginning and end.
-     *
-     * @return this, to enable chaining
-     */
-    public StrBuilder trim() {
-        if (size == 0) {
-            return this;
-        }
-        int len = size;
-        final char[] buf = buffer;
-        int pos = 0;
-        while (pos < len && buf[pos] <= ' ') {
-            pos++;
-        }
-        while (pos < len && buf[len - 1] <= ' ') {
-            len--;
-        }
-        if (len < size) {
-            delete(len, size);
-        }
-        if (pos > 0) {
-            delete(0, pos);
-        }
-        return this;
-    }
-
-    //-----------------------------------------------------------------------
-    /**
-     * Checks whether this builder starts with the specified string.
-     * <p>
-     * Note that this method handles null input quietly, unlike String.
-     * 
-     * @param str  the string to search for, null returns false
-     * @return true if the builder starts with the string
-     */
-    public boolean startsWith(final String str) {
-        if (str == null) {
-            return false;
-        }
-        final int len = str.length();
-        if (len == 0) {
-            return true;
-        }
-        if (len > size) {
-            return false;
-        }
-        for (int i = 0; i < len; i++) {
-            if (buffer[i] != str.charAt(i)) {
-                return false;
-            }
-        }
-        return true;
-    }
-
-    /**
-     * Checks whether this builder ends with the specified string.
-     * <p>
-     * Note that this method handles null input quietly, unlike String.
-     * 
-     * @param str  the string to search for, null returns false
-     * @return true if the builder ends with the string
-     */
-    public boolean endsWith(final String str) {
-        if (str == null) {
-            return false;
-        }
-        final int len = str.length();
-        if (len == 0) {
-            return true;
-        }
-        if (len > size) {
-            return false;
-        }
-        int pos = size - len;
-        for (int i = 0; i < len; i++,pos++) {
-            if (buffer[pos] != str.charAt(i)) {
-                return false;
-            }
-        }
-        return true;
-    }
-
-    //-----------------------------------------------------------------------
-    /**
-     * {@inheritDoc}
-     * @since 3.0
-     */
-    @Override
-    public CharSequence subSequence(final int startIndex, final int endIndex) {
-      if (startIndex < 0) {
-          throw new StringIndexOutOfBoundsException(startIndex);
-      }
-      if (endIndex > size) {
-          throw new StringIndexOutOfBoundsException(endIndex);
-      }
-      if (startIndex > endIndex) {
-          throw new StringIndexOutOfBoundsException(endIndex - startIndex);
-      }
-      return substring(startIndex, endIndex);
-    }
-
-    /**
-     * Extracts a portion of this string builder as a string.
-     * 
-     * @param start  the start index, inclusive, must be valid
-     * @return the new string
-     * @throws IndexOutOfBoundsException if the index is invalid
-     */
-    public String substring(final int start) {
-        return substring(start, size);
-    }
-
-    /**
-     * Extracts a portion of this string builder as a string.
-     * <p>
-     * Note: This method treats an endIndex greater than the length of the
-     * builder as equal to the length of the builder, and continues
-     * without error, unlike StringBuffer or String.
-     * 
-     * @param startIndex  the start index, inclusive, must be valid
-     * @param endIndex  the end index, exclusive, must be valid except
-     *  that if too large it is treated as end of string
-     * @return the new string
-     * @throws IndexOutOfBoundsException if the index is invalid
-     */
-    public String substring(final int startIndex, int endIndex) {
-        endIndex = validateRange(startIndex, endIndex);
-        return new String(buffer, startIndex, endIndex - startIndex);
-    }
-
-    /**
-     * Extracts the leftmost characters from the string builder without
-     * throwing an exception.
-     * <p>
-     * This method extracts the left <code>length</code> characters from
-     * the builder. If this many characters are not available, the whole
-     * builder is returned. Thus the returned string may be shorter than the
-     * length requested.
-     * 
-     * @param length  the number of characters to extract, negative returns empty string
-     * @return the new string
-     */
-    public String leftString(final int length) {
-        if (length <= 0) {
-            return "";
-        } else if (length >= size) {
-            return new String(buffer, 0, size);
-        } else {
-            return new String(buffer, 0, length);
-        }
-    }
-
-    /**
-     * Extracts the rightmost characters from the string builder without
-     * throwing an exception.
-     * <p>
-     * This method extracts the right <code>length</code> characters from
-     * the builder. If this many characters are not available, the whole
-     * builder is returned. Thus the returned string may be shorter than the
-     * length requested.
-     * 
-     * @param length  the number of characters to extract, negative returns empty string
-     * @return the new string
-     */
-    public String rightString(final int length) {
-        if (length <= 0) {
-            return "";
-        } else if (length >= size) {
-            return new String(buffer, 0, size);
-        } else {
-            return new String(buffer, size - length, length);
-        }
-    }
-
-    /**
-     * Extracts some characters from the middle of the string builder without
-     * throwing an exception.
-     * <p>
-     * This method extracts <code>length</code> characters from the builder
-     * at the specified index.
-     * If the index is negative it is treated as zero.
-     * If the index is greater than the builder size, it is treated as the builder size.
-     * If the length is negative, the empty string is returned.
-     * If insufficient characters are available in the builder, as much as possible is returned.
-     * Thus the returned string may be shorter than the length requested.
-     * 
-     * @param index  the index to start at, negative means zero
-     * @param length  the number of characters to extract, negative returns empty string
-     * @return the new string
-     */
-    public String midString(int index, final int length) {
-        if (index < 0) {
-            index = 0;
-        }
-        if (length <= 0 || index >= size) {
-            return "";
-        }
-        if (size <= index + length) {
-            return new String(buffer, index, size - index);
-        }
-        return new String(buffer, index, length);
-    }
-
-    //-----------------------------------------------------------------------
-    /**
-     * Checks if the string builder contains the specified char.
-     *
-     * @param ch  the character to find
-     * @return true if the builder contains the character
-     */
-    public boolean contains(final char ch) {
-        final char[] thisBuf = buffer;
-        for (int i = 0; i < this.size; i++) {
-            if (thisBuf[i] == ch) {
-                return true;
-            }
-        }
-        return false;
-    }
-
-    /**
-     * Checks if the string builder contains the specified string.
-     *
-     * @param str  the string to find
-     * @return true if the builder contains the string
-     */
-    public boolean contains(final String str) {
-        return indexOf(str, 0) >= 0;
-    }
-
-    /**
-     * Checks if the string builder contains a string matched using the
-     * specified matcher.
-     * <p>
-     * Matchers can be used to perform advanced searching behaviour.
-     * For example you could write a matcher to search for the character
-     * 'a' followed by a number.
-     *
-     * @param matcher  the matcher to use, null returns -1
-     * @return true if the matcher finds a match in the builder
-     */
-    public boolean contains(final StrMatcher matcher) {
-        return indexOf(matcher, 0) >= 0;
-    }
-
-    //-----------------------------------------------------------------------
-    /**
-     * Searches the string builder to find the first reference to the specified char.
-     * 
-     * @param ch  the character to find
-     * @return the first index of the character, or -1 if not found
-     */
-    public int indexOf(final char ch) {
-        return indexOf(ch, 0);
-    }
-
-    /**
-     * Searches the string builder to find the first reference to the specified char.
-     * 
-     * @param ch  the character to find
-     * @param startIndex  the index to start at, invalid index rounded to edge
-     * @return the first index of the character, or -1 if not found
-     */
-    public int indexOf(final char ch, int startIndex) {
-        startIndex = (startIndex < 0 ? 0 : startIndex);
-        if (startIndex >= size) {
-            return -1;
-        }
-        final char[] thisBuf = buffer;
-        for (int i = startIndex; i < size; i++) {
-            if (thisBuf[i] == ch) {
-                return i;
-            }
-        }
-        return -1;
-    }
-
-    /**
-     * Searches the string builder to find the first reference to the specified string.
-     * <p>
-     * Note that a null input string will return -1, whereas the JDK throws an exception.
-     * 
-     * @param str  the string to find, null returns -1
-     * @return the first index of the string, or -1 if not found
-     */
-    public int indexOf(final String str) {
-        return indexOf(str, 0);
-    }
-
-    /**
-     * Searches the string builder to find the first reference to the specified
-     * string starting searching from the given index.
-     * <p>
-     * Note that a null input string will return -1, whereas the JDK throws an exception.
-     * 
-     * @param str  the string to find, null returns -1
-     * @param startIndex  the index to start at, invalid index rounded to edge
-     * @return the first index of the string, or -1 if not found
-     */
-    public int indexOf(final String str, int startIndex) {
-        startIndex = (startIndex < 0 ? 0 : startIndex);
-        if (str == null || startIndex >= size) {
-            return -1;
-        }
-        final int strLen = str.length();
-        if (strLen == 1) {
-            return indexOf(str.charAt(0), startIndex);
-        }
-        if (strLen == 0) {
-            return startIndex;
-        }
-        if (strLen > size) {
-            return -1;
-        }
-        final char[] thisBuf = buffer;
-        final int len = size - strLen + 1;
-        outer:
-        for (int i = startIndex; i < len; i++) {
-            for (int j = 0; j < strLen; j++) {
-                if (str.charAt(j) != thisBuf[i + j]) {
-                    continue outer;
-                }
-            }
-            return i;
-        }
-        return -1;
-    }
-
-    /**
-     * Searches the string builder using the matcher to find the first match.
-     * <p>
-     * Matchers can be used to perform advanced searching behaviour.
-     * For example you could write a matcher to find the character 'a'
-     * followed by a number.
-     *
-     * @param matcher  the matcher to use, null returns -1
-     * @return the first index matched, or -1 if not found
-     */
-    public int indexOf(final StrMatcher matcher) {
-        return indexOf(matcher, 0);
-    }
-
-    /**
-     * Searches the string builder using the matcher to find the first
-     * match searching from the given index.
-     * <p>
-     * Matchers can be used to perform advanced searching behaviour.
-     * For example you could write a matcher to find the character 'a'
-     * followed by a number.
-     *
-     * @param matcher  the matcher to use, null returns -1
-     * @param startIndex  the index to start at, invalid index rounded to edge
-     * @return the first index matched, or -1 if not found
-     */
-    public int indexOf(final StrMatcher matcher, int startIndex) {
-        startIndex = (startIndex < 0 ? 0 : startIndex);
-        if (matcher == null || startIndex >= size) {
-            return -1;
-        }
-        final int len = size;
-        final char[] buf = buffer;
-        for (int i = startIndex; i < len; i++) {
-            if (matcher.isMatch(buf, i, startIndex, len) > 0) {
-                return i;
-            }
-        }
-        return -1;
-    }
-
-    //-----------------------------------------------------------------------
-    /**
-     * Searches the string builder to find the last reference to the specified char.
-     * 
-     * @param ch  the character to find
-     * @return the last index of the character, or -1 if not found
-     */
-    public int lastIndexOf(final char ch) {
-        return lastIndexOf(ch, size - 1);
-    }
-
-    /**
-     * Searches the string builder to find the last reference to the specified char.
-     * 
-     * @param ch  the character to find
-     * @param startIndex  the index to start at, invalid index rounded to edge
-     * @return the last index of the character, or -1 if not found
-     */
-    public int lastIndexOf(final char ch, int startIndex) {
-        startIndex = (startIndex >= size ? size - 1 : startIndex);
-        if (startIndex < 0) {
-            return -1;
-        }
-        for (int i = startIndex; i >= 0; i--) {
-            if (buffer[i] == ch) {
-                return i;
-            }
-        }
-        return -1;
-    }
-
-    /**
-     * Searches the string builder to find the last reference to the specified string.
-     * <p>
-     * Note that a null input string will return -1, whereas the JDK throws an exception.
-     * 
-     * @param str  the string to find, null returns -1
-     * @return the last index of the string, or -1 if not found
-     */
-    public int lastIndexOf(final String str) {
-        return lastIndexOf(str, size - 1);
-    }
-
-    /**
-     * Searches the string builder to find the last reference to the specified
-     * string starting searching from the given index.
-     * <p>
-     * Note that a null input string will return -1, whereas the JDK throws an exception.
-     * 
-     * @param str  the string to find, null returns -1
-     * @param startIndex  the index to start at, invalid index rounded to edge
-     * @return the last index of the string, or -1 if not found
-     */
-    public int lastIndexOf(final String str, int startIndex) {
-        startIndex = (startIndex >= size ? size - 1 : startIndex);
-        if (str == null || startIndex < 0) {
-            return -1;
-        }
-        final int strLen = str.length();
-        if (strLen > 0 && strLen <= size) {
-            if (strLen == 1) {
-                return lastIndexOf(str.charAt(0), startIndex);
-            }
-
-            outer:
-            for (int i = startIndex - strLen + 1; i >= 0; i--) {
-                for (int j = 0; j < strLen; j++) {
-                    if (str.charAt(j) != buffer[i + j]) {
-                        continue outer;
-                    }
-                }
-                return i;
-            }
-            
-        } else if (strLen == 0) {
-            return startIndex;
-        }
-        return -1;
-    }
-
-    /**
-     * Searches the string builder using the matcher to find the last match.
-     * <p>
-     * Matchers can be used to perform advanced searching behaviour.
-     * For example you could write a matcher to find the character 'a'
-     * followed by a number.
-     *
-     * @param matcher  the matcher to use, null returns -1
-     * @return the last index matched, or -1 if not found
-     */
-    public int lastIndexOf(final StrMatcher matcher) {
-        return lastIndexOf(matcher, size);
-    }
-
-    /**
-     * Searches the string builder using the matcher to find the last
-     * match searching from the given index.
-     * <p>
-     * Matchers can be used to perform advanced searching behaviour.
-     * For example you could write a matcher to find the character 'a'
-     * followed by a number.
-     *
-     * @param matcher  the matcher to use, null returns -1
-     * @param startIndex  the index to start at, invalid index rounded to edge
-     * @return the last index matched, or -1 if not found
-     */
-    public int lastIndexOf(final StrMatcher matcher, int startIndex) {
-        startIndex = (startIndex >= size ? size - 1 : startIndex);
-        if (matcher == null || startIndex < 0) {
-            return -1;
-        }
-        final char[] buf = buffer;
-        final int endIndex = startIndex + 1;
-        for (int i = startIndex; i >= 0; i--) {
-            if (matcher.isMatch(buf, i, 0, endIndex) > 0) {
-                return i;
-            }
-        }
-        return -1;
-    }
-
-    //-----------------------------------------------------------------------
-    /**
-     * Creates a tokenizer that can tokenize the contents of this builder.
-     * <p>
-     * This method allows the contents of this builder to be tokenized.
-     * The tokenizer will be setup by default to tokenize on space, tab,
-     * newline and formfeed (as per StringTokenizer). These values can be
-     * changed on the tokenizer class, before retrieving the tokens.
-     * <p>
-     * The returned tokenizer is linked to this builder. You may intermix
-     * calls to the buider and tokenizer within certain limits, however
-     * there is no synchronization. Once the tokenizer has been used once,
-     * it must be {@link StrTokenizer#reset() reset} to pickup the latest
-     * changes in the builder. For example:
-     * <pre>
-     * StrBuilder b = new StrBuilder();
-     * b.append("a b ");
-     * StrTokenizer t = b.asTokenizer();
-     * String[] tokens1 = t.getTokenArray();  // returns a,b
-     * b.append("c d ");
-     * String[] tokens2 = t.getTokenArray();  // returns a,b (c and d ignored)
-     * t.reset();              // reset causes builder changes to be picked up
-     * String[] tokens3 = t.getTokenArray();  // returns a,b,c,d
-     * </pre>
-     * In addition to simply intermixing appends and tokenization, you can also
-     * call the set methods on the tokenizer to alter how it tokenizes. Just
-     * remember to call reset when you want to pickup builder changes.
-     * <p>
-     * Calling {@link StrTokenizer#reset(String)} or {@link StrTokenizer#reset(char[])}
-     * with a non-null value will break the link with the builder.
-     *
-     * @return a tokenizer that is linked to this builder
-     */
-    public StrTokenizer asTokenizer() {
-        return new StrBuilderTokenizer();
-    }
-
-    //-----------------------------------------------------------------------
-    /**
-     * Gets the contents of this builder as a Reader.
-     * <p>
-     * This method allows the contents of the builder to be read
-     * using any standard method that expects a Reader.
-     * <p>
-     * To use, simply create a <code>StrBuilder</code>, populate it with
-     * data, call <code>asReader</code>, and then read away.
-     * <p>
-     * The internal character array is shared between the builder and the reader.
-     * This allows you to append to the builder after creating the reader,
-     * and the changes will be picked up.
-     * Note however, that no synchronization occurs, so you must perform
-     * all operations with the builder and the reader in one thread.
-     * <p>
-     * The returned reader supports marking, and ignores the flush method.
-     *
-     * @return a reader that reads from this builder
-     */
-    public Reader asReader() {
-        return new StrBuilderReader();
-    }
-
-    //-----------------------------------------------------------------------
-    /**
-     * Gets this builder as a Writer that can be written to.
-     * <p>
-     * This method allows you to populate the contents of the builder
-     * using any standard method that takes a Writer.
-     * <p>
-     * To use, simply create a <code>StrBuilder</code>,
-     * call <code>asWriter</code>, and populate away. The data is available
-     * at any time using the methods of the <code>StrBuilder</code>.
-     * <p>
-     * The internal character array is shared between the builder and the writer.
-     * This allows you to intermix calls that append to the builder and
-     * write using the writer and the changes will be occur correctly.
-     * Note however, that no synchronization occurs, so you must perform
-     * all operations with the builder and the writer in one thread.
-     * <p>
-     * The returned writer ignores the close and flush methods.
-     *
-     * @return a writer that populates this builder
-     */
-    public Writer asWriter() {
-        return new StrBuilderWriter();
-    }
-
-    /**
-     * Appends current contents of this <code>StrBuilder</code> to the
-     * provided {@link Appendable}.
-     * <p>
-     * This method tries to avoid doing any extra copies of contents.
-     *
-     * @param appendable  the appendable to append data to
-     * @throws IOException  if an I/O error occurs
-     *
-     * @since 3.4
-     * @see #readFrom(Readable)
-     */
-    public void appendTo(final Appendable appendable) throws IOException {
-        if (appendable instanceof Writer) {
-            ((Writer) appendable).write(buffer, 0, size);
-        } else if (appendable instanceof StringBuilder) {
-            ((StringBuilder) appendable).append(buffer, 0, size);
-        } else if (appendable instanceof StringBuffer) {
-            ((StringBuffer) appendable).append(buffer, 0, size);
-        } else if (appendable instanceof CharBuffer) {
-            ((CharBuffer) appendable).put(buffer, 0, size);
-        } else {
-            appendable.append(this);
-        }
-    }
-
-    //-----------------------------------------------------------------------
-//    /**
-//     * Gets a String version of the string builder by calling the internal
-//     * constructor of String by reflection.
-//     * <p>
-//     * WARNING: You must not use the StrBuilder after calling this method
-//     * as the buffer is now shared with the String object. To ensure this,
-//     * the internal character array is set to null, so you will get
-//     * NullPointerExceptions on all method calls.
-//     *
-//     * @return the builder as a String
-//     */
-//    public String toSharedString() {
-//        try {
-//            Constructor con = String.class.getDeclaredConstructor(
-//                new Class[] {int.class, int.class, char[].class});
-//            con.setAccessible(true);
-//            char[] buffer = buf;
-//            buf = null;
-//            size = -1;
-//            nullText = null;
-//            return (String) con.newInstance(
-//                new Object[] {Integer.valueOf(0), Integer.valueOf(size), buffer});
-//            
-//        } catch (Exception ex) {
-//            ex.printStackTrace();
-//            throw new UnsupportedOperationException("StrBuilder.toSharedString is unsupported: " + ex.getMessage());
-//        }
-//    }
-
-    //-----------------------------------------------------------------------
-    /**
-     * Checks the contents of this builder against another to see if they
-     * contain the same character content ignoring case.
-     *
-     * @param other  the object to check, null returns false
-     * @return true if the builders contain the same characters in the same order
-     */
-    public boolean equalsIgnoreCase(final StrBuilder other) {
-        if (this == other) {
-            return true;
-        }
-        if (this.size != other.size) {
-            return false;
-        }
-        final char thisBuf[] = this.buffer;
-        final char otherBuf[] = other.buffer;
-        for (int i = size - 1; i >= 0; i--) {
-            final char c1 = thisBuf[i];
-            final char c2 = otherBuf[i];
-            if (c1 != c2 && Character.toUpperCase(c1) != Character.toUpperCase(c2)) {
-                return false;
-            }
-        }
-        return true;
-    }
-
-    /**
-     * Checks the contents of this builder against another to see if they
-     * contain the same character content.
-     *
-     * @param other  the object to check, null returns false
-     * @return true if the builders contain the same characters in the same order
-     */
-    public boolean equals(final StrBuilder other) {
-        if (this == other) {
-            return true;
-        }
-        if (this.size != other.size) {
-            return false;
-        }
-        final char thisBuf[] = this.buffer;
-        final char otherBuf[] = other.buffer;
-        for (int i = size - 1; i >= 0; i--) {
-            if (thisBuf[i] != otherBuf[i]) {
-                return false;
-            }
-        }
-        return true;
-    }
-
-    /**
-     * Checks the contents of this builder against another to see if they
-     * contain the same character content.
-     *
-     * @param obj  the object to check, null returns false
-     * @return true if the builders contain the same characters in the same order
-     */
-    @Override
-    public boolean equals(final Object obj) {
-        if (obj instanceof StrBuilder) {
-            return equals((StrBuilder) obj);
-        }
-        return false;
-    }
-
-    /**
-     * Gets a suitable hash code for this builder.
-     *
-     * @return a hash code
-     */
-    @Override
-    public int hashCode() {
-        final char buf[] = buffer;
-        int hash = 0;
-        for (int i = size - 1; i >= 0; i--) {
-            hash = 31 * hash + buf[i];
-        }
-        return hash;
-    }
-
-    //-----------------------------------------------------------------------
-    /**
-     * Gets a String version of the string builder, creating a new instance
-     * each time the method is called.
-     * <p>
-     * Note that unlike StringBuffer, the string version returned is
-     * independent of the string builder.
-     *
-     * @return the builder as a String
-     */
-    @Override
-    public String toString() {
-        return new String(buffer, 0, size);
-    }
-
-    /**
-     * Gets a StringBuffer version of the string builder, creating a
-     * new instance each time the method is called.
-     *
-     * @return the builder as a StringBuffer
-     */
-    public StringBuffer toStringBuffer() {
-        return new StringBuffer(size).append(buffer, 0, size);
-    }
-
-    /**
-     * Gets a StringBuilder version of the string builder, creating a
-     * new instance each time the method is called.
-     *
-     * @return the builder as a StringBuilder
-     * @since 3.2
-     */
-    public StringBuilder toStringBuilder() {
-        return new StringBuilder(size).append(buffer, 0, size);
-    }
-
-    /**
-     * Implement the {@link Builder} interface.
-     * @return the builder as a String
-     * @since 3.2
-     * @see #toString()
-     */
-    @Override
-    public String build() {
-        return toString();
-    }
-
-    //-----------------------------------------------------------------------
-    /**
-     * Validates parameters defining a range of the builder.
-     * 
-     * @param startIndex  the start index, inclusive, must be valid
-     * @param endIndex  the end index, exclusive, must be valid except
-     *  that if too large it is treated as end of string
-     * @return the new string
-     * @throws IndexOutOfBoundsException if the index is invalid
-     */
-    protected int validateRange(final int startIndex, int endIndex) {
-        if (startIndex < 0) {
-            throw new StringIndexOutOfBoundsException(startIndex);
-        }
-        if (endIndex > size) {
-            endIndex = size;
-        }
-        if (startIndex > endIndex) {
-            throw new StringIndexOutOfBoundsException("end < start");
-        }
-        return endIndex;
-    }
-
-    /**
-     * Validates parameters defining a single index in the builder.
-     * 
-     * @param index  the index, must be valid
-     * @throws IndexOutOfBoundsException if the index is invalid
-     */
-    protected void validateIndex(final int index) {
-        if (index < 0 || index > size) {
-            throw new StringIndexOutOfBoundsException(index);
-        }
-    }
-
-    //-----------------------------------------------------------------------
-    /**
-     * Inner class to allow StrBuilder to operate as a tokenizer.
-     */
-    class StrBuilderTokenizer extends StrTokenizer {
-
-        /**
-         * Default constructor.
-         */
-        StrBuilderTokenizer() {
-            super();
-        }
-
-        /** {@inheritDoc} */
-        @Override
-        protected List<String> tokenize(final char[] chars, final int offset, final int count) {
-            if (chars == null) {
-                return super.tokenize(StrBuilder.this.buffer, 0, StrBuilder.this.size());
-            }
-            return super.tokenize(chars, offset, count);
-        }
-
-        /** {@inheritDoc} */
-        @Override
-        public String getContent() {
-            final String str = super.getContent();
-            if (str == null) {
-                return StrBuilder.this.toString();
-            }
-            return str;
-        }
-    }
-
-    //-----------------------------------------------------------------------
-    /**
-     * Inner class to allow StrBuilder to operate as a reader.
-     */
-    class StrBuilderReader extends Reader {
-        /** The current stream position. */
-        private int pos;
-        /** The last mark position. */
-        private int mark;
-
-        /**
-         * Default constructor.
-         */
-        StrBuilderReader() {
-            super();
-        }
-
-        /** {@inheritDoc} */
-        @Override
-        public void close() {
-            // do nothing
-        }
-
-        /** {@inheritDoc} */
-        @Override
-        public int read() {
-            if (ready() == false) {
-                return -1;
-            }
-            return StrBuilder.this.charAt(pos++);
-        }
-
-        /** {@inheritDoc} */
-        @Override
-        public int read(final char b[], final int off, int len) {
-            if (off < 0 || len < 0 || off > b.length ||
-                    (off + len) > b.length || (off + len) < 0) {
-                throw new IndexOutOfBoundsException();
-            }
-            if (len == 0) {
-                return 0;
-            }
-            if (pos >= StrBuilder.this.size()) {
-                return -1;
-            }
-            if (pos + len > size()) {
-                len = StrBuilder.this.size() - pos;
-            }
-            StrBuilder.this.getChars(pos, pos + len, b, off);
-            pos += len;
-            return len;
-        }
-
-        /** {@inheritDoc} */
-        @Override
-        public long skip(long n) {
-            if (pos + n > StrBuilder.this.size()) {
-                n = StrBuilder.this.size() - pos;
-            }
-            if (n < 0) {
-                return 0;
-            }
-            pos += n;
-            return n;
-        }
-
-        /** {@inheritDoc} */
-        @Override
-        public boolean ready() {
-            return pos < StrBuilder.this.size();
-        }
-
-        /** {@inheritDoc} */
-        @Override
-        public boolean markSupported() {
-            return true;
-        }
-
-        /** {@inheritDoc} */
-        @Override
-        public void mark(final int readAheadLimit) {
-            mark = pos;
-        }
-
-        /** {@inheritDoc} */
-        @Override
-        public void reset() {
-            pos = mark;
-        }
-    }
-
-    //-----------------------------------------------------------------------
-    /**
-     * Inner class to allow StrBuilder to operate as a writer.
-     */
-    class StrBuilderWriter extends Writer {
-
-        /**
-         * Default constructor.
-         */
-        StrBuilderWriter() {
-            super();
-        }
-
-        /** {@inheritDoc} */
-        @Override
-        public void close() {
-            // do nothing
-        }
-
-        /** {@inheritDoc} */
-        @Override
-        public void flush() {
-            // do nothing
-        }
-
-        /** {@inheritDoc} */
-        @Override
-        public void write(final int c) {
-            StrBuilder.this.append((char) c);
-        }
-
-        /** {@inheritDoc} */
-        @Override
-        public void write(final char[] cbuf) {
-            StrBuilder.this.append(cbuf);
-        }
-
-        /** {@inheritDoc} */
-        @Override
-        public void write(final char[] cbuf, final int off, final int len) {
-            StrBuilder.this.append(cbuf, off, len);
-        }
-
-        /** {@inheritDoc} */
-        @Override
-        public void write(final String str) {
-            StrBuilder.this.append(str);
-        }
-
-        /** {@inheritDoc} */
-        @Override
-        public void write(final String str, final int off, final int len) {
-            StrBuilder.this.append(str, off, len);
-        }
-    }
-
-}
diff --git a/lang/src/main/java/org/apache/commons/lang3/text/StrLookup.java b/lang/src/main/java/org/apache/commons/lang3/text/StrLookup.java
deleted file mode 100644
index b77a583..0000000
--- a/lang/src/main/java/org/apache/commons/lang3/text/StrLookup.java
+++ /dev/null
@@ -1,192 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.commons.lang3.text;
-
-import java.util.Enumeration;
-import java.util.Map;
-import java.util.Properties;
-
-/**
- * Lookup a String key to a String value.
- * <p>
- * This class represents the simplest form of a string to string map.
- * It has a benefit over a map in that it can create the result on
- * demand based on the key.
- * <p>
- * This class comes complete with various factory methods.
- * If these do not suffice, you can subclass and implement your own matcher.
- * <p>
- * For example, it would be possible to implement a lookup that used the
- * key as a primary key, and looked up the value on demand from the database
- *
- * @since 2.2
- * @version $Id$
- */
-public abstract class StrLookup<V> {
-
-    /**
-     * Lookup that always returns null.
-     */
-    private static final StrLookup<String> NONE_LOOKUP = new MapStrLookup<String>(null);
-
-    //-----------------------------------------------------------------------
-    /**
-     * Returns a lookup which always returns null.
-     *
-     * @return a lookup that always returns null, not null
-     */
-    public static StrLookup<?> noneLookup() {
-        return NONE_LOOKUP;
-    }
-
-    /**
-     * Creates a copy of the given properties instance.
-     * 
-     * @param input the Properties instance to copy.
-     * @return a copy of {@code input}.
-     */
-    private static Properties copyProperties(Properties input) {
-        if (input == null) {
-            return null;
-        }
-
-        Properties output = new Properties();
-        @SuppressWarnings("unchecked") // Property names are Strings.
-        Enumeration<String> propertyNames = (Enumeration<String>) input.propertyNames();
-
-        while (propertyNames.hasMoreElements()) {
-            String propertyName = propertyNames.nextElement();
-            output.setProperty(propertyName, input.getProperty(propertyName));
-        }
-
-        return output;
-    }
-
-    /**
-     * Returns a new lookup which uses a copy of the current
-     * {@link System#getProperties() System properties}.
-     * <p>
-     * If a security manager blocked access to system properties, then null will
-     * be returned from every lookup.
-     * <p>
-     * If a null key is used, this lookup will throw a NullPointerException.
-     *
-     * @return a lookup using system properties, not null
-     */
-    public static StrLookup<String> systemPropertiesLookup() {
-        Properties systemProperties = null;
-
-        try {
-            systemProperties = System.getProperties();
-        } catch (final SecurityException ex) {
-            // Squelched.  All lookup(String) will return null.
-        }
-
-        Properties properties = copyProperties(systemProperties);
-        @SuppressWarnings("unchecked") // System property keys and values are always Strings
-        final Map<String, String> propertiesMap = (Map) properties;
-
-        return new MapStrLookup<String>(propertiesMap);
-    }
-
-    /**
-     * Returns a lookup which looks up values using a map.
-     * <p>
-     * If the map is null, then null will be returned from every lookup.
-     * The map result object is converted to a string using toString().
-     *
-     * @param <V> the type of the values supported by the lookup
-     * @param map  the map of keys to values, may be null
-     * @return a lookup using the map, not null
-     */
-    public static <V> StrLookup<V> mapLookup(final Map<String, V> map) {
-        return new MapStrLookup<V>(map);
-    }
-
-    //-----------------------------------------------------------------------
-    /**
-     * Constructor.
-     */
-    protected StrLookup() {
-        super();
-    }
-
-    /**
-     * Looks up a String key to a String value.
-     * <p>
-     * The internal implementation may use any mechanism to return the value.
-     * The simplest implementation is to use a Map. However, virtually any
-     * implementation is possible.
-     * <p>
-     * For example, it would be possible to implement a lookup that used the
-     * key as a primary key, and looked up the value on demand from the database
-     * Or, a numeric based implementation could be created that treats the key
-     * as an integer, increments the value and return the result as a string -
-     * converting 1 to 2, 15 to 16 etc.
-     * <p>
-     * The {@link #lookup(String)} method always returns a String, regardless of
-     * the underlying data, by converting it as necessary. For example:
-     * <pre>
-     * Map&lt;String, Object&gt; map = new HashMap&lt;String, Object&gt;();
-     * map.put("number", Integer.valueOf(2));
-     * assertEquals("2", StrLookup.mapLookup(map).lookup("number"));
-     * </pre>
-     * @param key  the key to be looked up, may be null
-     * @return the matching value, null if no match
-     */
-    public abstract String lookup(String key);
-
-    //-----------------------------------------------------------------------
-    /**
-     * Lookup implementation that uses a Map.
-     */
-    static class MapStrLookup<V> extends StrLookup<V> {
-
-        /** Map keys are variable names and value. */
-        private final Map<String, V> map;
-
-        /**
-         * Creates a new instance backed by a Map.
-         *
-         * @param map  the map of keys to values, may be null
-         */
-        MapStrLookup(final Map<String, V> map) {
-            this.map = map;
-        }
-
-        /**
-         * Looks up a String key to a String value using the map.
-         * <p>
-         * If the map is null, then null is returned.
-         * The map result object is converted to a string using toString().
-         *
-         * @param key  the key to be looked up, may be null
-         * @return the matching value, null if no match
-         */
-        @Override
-        public String lookup(final String key) {
-            if (map == null) {
-                return null;
-            }
-            final Object obj = map.get(key);
-            if (obj == null) {
-                return null;
-            }
-            return obj.toString();
-        }
-    }
-}
diff --git a/lang/src/main/java/org/apache/commons/lang3/text/StrMatcher.java b/lang/src/main/java/org/apache/commons/lang3/text/StrMatcher.java
deleted file mode 100644
index 1514818..0000000
--- a/lang/src/main/java/org/apache/commons/lang3/text/StrMatcher.java
+++ /dev/null
@@ -1,436 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- * 
- *      http://www.apache.org/licenses/LICENSE-2.0
- * 
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.commons.lang3.text;
-
-import java.util.Arrays;
-
-import org.apache.commons.lang3.StringUtils;
-
-/**
- * A matcher class that can be queried to determine if a character array
- * portion matches.
- * <p>
- * This class comes complete with various factory methods.
- * If these do not suffice, you can subclass and implement your own matcher.
- *
- * @since 2.2
- * @version $Id$
- */
-public abstract class StrMatcher {
-
-    /**
-     * Matches the comma character.
-     */
-    private static final StrMatcher COMMA_MATCHER = new CharMatcher(',');
-    /**
-     * Matches the tab character.
-     */
-    private static final StrMatcher TAB_MATCHER = new CharMatcher('\t');
-    /**
-     * Matches the space character.
-     */
-    private static final StrMatcher SPACE_MATCHER = new CharMatcher(' ');
-    /**
-     * Matches the same characters as StringTokenizer,
-     * namely space, tab, newline, formfeed.
-     */
-    private static final StrMatcher SPLIT_MATCHER = new CharSetMatcher(" \t\n\r\f".toCharArray());
-    /**
-     * Matches the String trim() whitespace characters.
-     */
-    private static final StrMatcher TRIM_MATCHER = new TrimMatcher();
-    /**
-     * Matches the double quote character.
-     */
-    private static final StrMatcher SINGLE_QUOTE_MATCHER = new CharMatcher('\'');
-    /**
-     * Matches the double quote character.
-     */
-    private static final StrMatcher DOUBLE_QUOTE_MATCHER = new CharMatcher('"');
-    /**
-     * Matches the single or double quote character.
-     */
-    private static final StrMatcher QUOTE_MATCHER = new CharSetMatcher("'\"".toCharArray());
-    /**
-     * Matches no characters.
-     */
-    private static final StrMatcher NONE_MATCHER = new NoMatcher();
-
-    // -----------------------------------------------------------------------
-
-    /**
-     * Returns a matcher which matches the comma character.
-     *
-     * @return a matcher for a comma
-     */
-    public static StrMatcher commaMatcher() {
-        return COMMA_MATCHER;
-    }
-
-    /**
-     * Returns a matcher which matches the tab character.
-     *
-     * @return a matcher for a tab
-     */
-    public static StrMatcher tabMatcher() {
-        return TAB_MATCHER;
-    }
-
-    /**
-     * Returns a matcher which matches the space character.
-     *
-     * @return a matcher for a space
-     */
-    public static StrMatcher spaceMatcher() {
-        return SPACE_MATCHER;
-    }
-
-    /**
-     * Matches the same characters as StringTokenizer,
-     * namely space, tab, newline and formfeed.
-     *
-     * @return the split matcher
-     */
-    public static StrMatcher splitMatcher() {
-        return SPLIT_MATCHER;
-    }
-
-    /**
-     * Matches the String trim() whitespace characters.
-     *
-     * @return the trim matcher
-     */
-    public static StrMatcher trimMatcher() {
-        return TRIM_MATCHER;
-    }
-
-    /**
-     * Returns a matcher which matches the single quote character.
-     *
-     * @return a matcher for a single quote
-     */
-    public static StrMatcher singleQuoteMatcher() {
-        return SINGLE_QUOTE_MATCHER;
-    }
-
-    /**
-     * Returns a matcher which matches the double quote character.
-     *
-     * @return a matcher for a double quote
-     */
-    public static StrMatcher doubleQuoteMatcher() {
-        return DOUBLE_QUOTE_MATCHER;
-    }
-
-    /**
-     * Returns a matcher which matches the single or double quote character.
-     *
-     * @return a matcher for a single or double quote
-     */
-    public static StrMatcher quoteMatcher() {
-        return QUOTE_MATCHER;
-    }
-
-    /**
-     * Matches no characters.
-     *
-     * @return a matcher that matches nothing
-     */
-    public static StrMatcher noneMatcher() {
-        return NONE_MATCHER;
-    }
-
-    /**
-     * Constructor that creates a matcher from a character.
-     *
-     * @param ch  the character to match, must not be null
-     * @return a new Matcher for the given char
-     */
-    public static StrMatcher charMatcher(final char ch) {
-        return new CharMatcher(ch);
-    }
-
-    /**
-     * Constructor that creates a matcher from a set of characters.
-     *
-     * @param chars  the characters to match, null or empty matches nothing
-     * @return a new matcher for the given char[]
-     */
-    public static StrMatcher charSetMatcher(final char... chars) {
-        if (chars == null || chars.length == 0) {
-            return NONE_MATCHER;
-        }
-        if (chars.length == 1) {
-            return new CharMatcher(chars[0]);
-        }
-        return new CharSetMatcher(chars);
-    }
-
-    /**
-     * Constructor that creates a matcher from a string representing a set of characters.
-     *
-     * @param chars  the characters to match, null or empty matches nothing
-     * @return a new Matcher for the given characters
-     */
-    public static StrMatcher charSetMatcher(final String chars) {
-        if (StringUtils.isEmpty(chars)) {
-            return NONE_MATCHER;
-        }
-        if (chars.length() == 1) {
-            return new CharMatcher(chars.charAt(0));
-        }
-        return new CharSetMatcher(chars.toCharArray());
-    }
-
-    /**
-     * Constructor that creates a matcher from a string.
-     *
-     * @param str  the string to match, null or empty matches nothing
-     * @return a new Matcher for the given String
-     */
-    public static StrMatcher stringMatcher(final String str) {
-        if (StringUtils.isEmpty(str)) {
-            return NONE_MATCHER;
-        }
-        return new StringMatcher(str);
-    }
-
-    //-----------------------------------------------------------------------
-    /**
-     * Constructor.
-     */
-    protected StrMatcher() {
-        super();
-    }
-
-    /**
-     * Returns the number of matching characters, zero for no match.
-     * <p>
-     * This method is called to check for a match.
-     * The parameter <code>pos</code> represents the current position to be
-     * checked in the string <code>buffer</code> (a character array which must
-     * not be changed).
-     * The API guarantees that <code>pos</code> is a valid index for <code>buffer</code>.
-     * <p>
-     * The character array may be larger than the active area to be matched.
-     * Only values in the buffer between the specifed indices may be accessed.
-     * <p>
-     * The matching code may check one character or many.
-     * It may check characters preceding <code>pos</code> as well as those
-     * after, so long as no checks exceed the bounds specified.
-     * <p>
-     * It must return zero for no match, or a positive number if a match was found.
-     * The number indicates the number of characters that matched.
-     *
-     * @param buffer  the text content to match against, do not change
-     * @param pos  the starting position for the match, valid for buffer
-     * @param bufferStart  the first active index in the buffer, valid for buffer
-     * @param bufferEnd  the end index (exclusive) of the active buffer, valid for buffer
-     * @return the number of matching characters, zero for no match
-     */
-    public abstract int isMatch(char[] buffer, int pos, int bufferStart, int bufferEnd);
-
-    /**
-     * Returns the number of matching characters, zero for no match.
-     * <p>
-     * This method is called to check for a match.
-     * The parameter <code>pos</code> represents the current position to be
-     * checked in the string <code>buffer</code> (a character array which must
-     * not be changed).
-     * The API guarantees that <code>pos</code> is a valid index for <code>buffer</code>.
-     * <p>
-     * The matching code may check one character or many.
-     * It may check characters preceding <code>pos</code> as well as those after.
-     * <p>
-     * It must return zero for no match, or a positive number if a match was found.
-     * The number indicates the number of characters that matched.
-     *
-     * @param buffer  the text content to match against, do not change
-     * @param pos  the starting position for the match, valid for buffer
-     * @return the number of matching characters, zero for no match
-     * @since 2.4
-     */
-    public int isMatch(final char[] buffer, final int pos) {
-        return isMatch(buffer, pos, 0, buffer.length);
-    }
-
-    //-----------------------------------------------------------------------
-    /**
-     * Class used to define a set of characters for matching purposes.
-     */
-    static final class CharSetMatcher extends StrMatcher {
-        /** The set of characters to match. */
-        private final char[] chars;
-
-        /**
-         * Constructor that creates a matcher from a character array.
-         *
-         * @param chars  the characters to match, must not be null
-         */
-        CharSetMatcher(final char chars[]) {
-            super();
-            this.chars = chars.clone();
-            Arrays.sort(this.chars);
-        }
-
-        /**
-         * Returns whether or not the given character matches.
-         *
-         * @param buffer  the text content to match against, do not change
-         * @param pos  the starting position for the match, valid for buffer
-         * @param bufferStart  the first active index in the buffer, valid for buffer
-         * @param bufferEnd  the end index of the active buffer, valid for buffer
-         * @return the number of matching characters, zero for no match
-         */
-        @Override
-        public int isMatch(final char[] buffer, final int pos, final int bufferStart, final int bufferEnd) {
-            return Arrays.binarySearch(chars, buffer[pos]) >= 0 ? 1 : 0;
-        }
-    }
-
-    //-----------------------------------------------------------------------
-    /**
-     * Class used to define a character for matching purposes.
-     */
-    static final class CharMatcher extends StrMatcher {
-        /** The character to match. */
-        private final char ch;
-
-        /**
-         * Constructor that creates a matcher that matches a single character.
-         *
-         * @param ch  the character to match
-         */
-        CharMatcher(final char ch) {
-            super();
-            this.ch = ch;
-        }
-
-        /**
-         * Returns whether or not the given character matches.
-         *
-         * @param buffer  the text content to match against, do not change
-         * @param pos  the starting position for the match, valid for buffer
-         * @param bufferStart  the first active index in the buffer, valid for buffer
-         * @param bufferEnd  the end index of the active buffer, valid for buffer
-         * @return the number of matching characters, zero for no match
-         */
-        @Override
-        public int isMatch(final char[] buffer, final int pos, final int bufferStart, final int bufferEnd) {
-            return ch == buffer[pos] ? 1 : 0;
-        }
-    }
-
-    //-----------------------------------------------------------------------
-    /**
-     * Class used to define a set of characters for matching purposes.
-     */
-    static final class StringMatcher extends StrMatcher {
-        /** The string to match, as a character array. */
-        private final char[] chars;
-
-        /**
-         * Constructor that creates a matcher from a String.
-         *
-         * @param str  the string to match, must not be null
-         */
-        StringMatcher(final String str) {
-            super();
-            chars = str.toCharArray();
-        }
-
-        /**
-         * Returns whether or not the given text matches the stored string.
-         *
-         * @param buffer  the text content to match against, do not change
-         * @param pos  the starting position for the match, valid for buffer
-         * @param bufferStart  the first active index in the buffer, valid for buffer
-         * @param bufferEnd  the end index of the active buffer, valid for buffer
-         * @return the number of matching characters, zero for no match
-         */
-        @Override
-        public int isMatch(final char[] buffer, int pos, final int bufferStart, final int bufferEnd) {
-            final int len = chars.length;
-            if (pos + len > bufferEnd) {
-                return 0;
-            }
-            for (int i = 0; i < chars.length; i++, pos++) {
-                if (chars[i] != buffer[pos]) {
-                    return 0;
-                }
-            }
-            return len;
-        }
-    }
-
-    //-----------------------------------------------------------------------
-    /**
-     * Class used to match no characters.
-     */
-    static final class NoMatcher extends StrMatcher {
-
-        /**
-         * Constructs a new instance of <code>NoMatcher</code>.
-         */
-        NoMatcher() {
-            super();
-        }
-
-        /**
-         * Always returns <code>false</code>.
-         *
-         * @param buffer  the text content to match against, do not change
-         * @param pos  the starting position for the match, valid for buffer
-         * @param bufferStart  the first active index in the buffer, valid for buffer
-         * @param bufferEnd  the end index of the active buffer, valid for buffer
-         * @return the number of matching characters, zero for no match
-         */
-        @Override
-        public int isMatch(final char[] buffer, final int pos, final int bufferStart, final int bufferEnd) {
-            return 0;
-        }
-    }
-
-    //-----------------------------------------------------------------------
-    /**
-     * Class used to match whitespace as per trim().
-     */
-    static final class TrimMatcher extends StrMatcher {
-
-        /**
-         * Constructs a new instance of <code>TrimMatcher</code>.
-         */
-        TrimMatcher() {
-            super();
-        }
-
-        /**
-         * Returns whether or not the given character matches.
-         *
-         * @param buffer  the text content to match against, do not change
-         * @param pos  the starting position for the match, valid for buffer
-         * @param bufferStart  the first active index in the buffer, valid for buffer
-         * @param bufferEnd  the end index of the active buffer, valid for buffer
-         * @return the number of matching characters, zero for no match
-         */
-        @Override
-        public int isMatch(final char[] buffer, final int pos, final int bufferStart, final int bufferEnd) {
-            return buffer[pos] <= 32 ? 1 : 0;
-        }
-    }
-
-}
diff --git a/lang/src/main/java/org/apache/commons/lang3/text/StrSubstitutor.java b/lang/src/main/java/org/apache/commons/lang3/text/StrSubstitutor.java
deleted file mode 100644
index aa1e3d2..0000000
--- a/lang/src/main/java/org/apache/commons/lang3/text/StrSubstitutor.java
+++ /dev/null
@@ -1,1196 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.commons.lang3.text;
-
-import java.util.ArrayList;
-import java.util.Enumeration;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-import java.util.Properties;
-
-import org.apache.commons.lang3.StringUtils;
-
-/**
- * Substitutes variables within a string by values.
- * <p>
- * This class takes a piece of text and substitutes all the variables within it.
- * The default definition of a variable is <code>${variableName}</code>.
- * The prefix and suffix can be changed via constructors and set methods.
- * <p>
- * Variable values are typically resolved from a map, but could also be resolved
- * from system properties, or by supplying a custom variable resolver.
- * <p>
- * The simplest example is to use this class to replace Java System properties. For example:
- * <pre>
- * StrSubstitutor.replaceSystemProperties(
- *      "You are running with java.version = ${java.version} and os.name = ${os.name}.");
- * </pre>
- * <p>
- * Typical usage of this class follows the following pattern: First an instance is created
- * and initialized with the map that contains the values for the available variables.
- * If a prefix and/or suffix for variables should be used other than the default ones,
- * the appropriate settings can be performed. After that the <code>replace()</code>
- * method can be called passing in the source text for interpolation. In the returned
- * text all variable references (as long as their values are known) will be resolved.
- * The following example demonstrates this:
- * <pre>
- * Map valuesMap = HashMap();
- * valuesMap.put(&quot;animal&quot;, &quot;quick brown fox&quot;);
- * valuesMap.put(&quot;target&quot;, &quot;lazy dog&quot;);
- * String templateString = &quot;The ${animal} jumped over the ${target}.&quot;;
- * StrSubstitutor sub = new StrSubstitutor(valuesMap);
- * String resolvedString = sub.replace(templateString);
- * </pre>
- * yielding:
- * <pre>
- *      The quick brown fox jumped over the lazy dog.
- * </pre>
- * <p>
- * Also, this class allows to set a default value for unresolved variables.
- * The default value for a variable can be appended to the variable name after the variable
- * default value delimiter. The default value of the variable default value delimiter is ':-',
- * as in bash and other *nix shells, as those are arguably where the default ${} delimiter set originated.
- * The variable default value delimiter can be manually set by calling {@link #setValueDelimiterMatcher(StrMatcher)},
- * {@link #setValueDelimiter(char)} or {@link #setValueDelimiter(String)}.
- * The following shows an example with varialbe default value settings:
- * <pre>
- * Map valuesMap = HashMap();
- * valuesMap.put(&quot;animal&quot;, &quot;quick brown fox&quot;);
- * valuesMap.put(&quot;target&quot;, &quot;lazy dog&quot;);
- * String templateString = &quot;The ${animal} jumped over the ${target}. ${undefined.number:-1234567890}.&quot;;
- * StrSubstitutor sub = new StrSubstitutor(valuesMap);
- * String resolvedString = sub.replace(templateString);
- * </pre>
- * yielding:
- * <pre>
- *      The quick brown fox jumped over the lazy dog. 1234567890.
- * </pre>
- * <p>
- * In addition to this usage pattern there are some static convenience methods that
- * cover the most common use cases. These methods can be used without the need of
- * manually creating an instance. However if multiple replace operations are to be
- * performed, creating and reusing an instance of this class will be more efficient.
- * <p>
- * Variable replacement works in a recursive way. Thus, if a variable value contains
- * a variable then that variable will also be replaced. Cyclic replacements are
- * detected and will cause an exception to be thrown.
- * <p>
- * Sometimes the interpolation's result must contain a variable prefix. As an example
- * take the following source text:
- * <pre>
- *   The variable ${${name}} must be used.
- * </pre>
- * Here only the variable's name referred to in the text should be replaced resulting
- * in the text (assuming that the value of the <code>name</code> variable is <code>x</code>):
- * <pre>
- *   The variable ${x} must be used.
- * </pre>
- * To achieve this effect there are two possibilities: Either set a different prefix
- * and suffix for variables which do not conflict with the result text you want to
- * produce. The other possibility is to use the escape character, by default '$'.
- * If this character is placed before a variable reference, this reference is ignored
- * and won't be replaced. For example:
- * <pre>
- *   The variable $${${name}} must be used.
- * </pre>
- * <p>
- * In some complex scenarios you might even want to perform substitution in the
- * names of variables, for instance
- * <pre>
- * ${jre-${java.specification.version}}
- * </pre>
- * <code>StrSubstitutor</code> supports this recursive substitution in variable
- * names, but it has to be enabled explicitly by setting the
- * {@link #setEnableSubstitutionInVariables(boolean) enableSubstitutionInVariables}
- * property to <b>true</b>.
- *
- * @version $Id$
- * @since 2.2
- */
-public class StrSubstitutor {
-
-    /**
-     * Constant for the default escape character.
-     */
-    public static final char DEFAULT_ESCAPE = '$';
-    /**
-     * Constant for the default variable prefix.
-     */
-    public static final StrMatcher DEFAULT_PREFIX = StrMatcher.stringMatcher("${");
-    /**
-     * Constant for the default variable suffix.
-     */
-    public static final StrMatcher DEFAULT_SUFFIX = StrMatcher.stringMatcher("}");
-    /**
-     * Constant for the default value delimiter of a variable.
-     * @since 3.2
-     */
-    public static final StrMatcher DEFAULT_VALUE_DELIMITER = StrMatcher.stringMatcher(":-");
-
-    /**
-     * Stores the escape character.
-     */
-    private char escapeChar;
-    /**
-     * Stores the variable prefix.
-     */
-    private StrMatcher prefixMatcher;
-    /**
-     * Stores the variable suffix.
-     */
-    private StrMatcher suffixMatcher;
-    /**
-     * Stores the default variable value delimiter
-     */
-    private StrMatcher valueDelimiterMatcher;
-    /**
-     * Variable resolution is delegated to an implementor of VariableResolver.
-     */
-    private StrLookup<?> variableResolver;
-    /**
-     * The flag whether substitution in variable names is enabled.
-     */
-    private boolean enableSubstitutionInVariables;
-
-    //-----------------------------------------------------------------------
-    /**
-     * Replaces all the occurrences of variables in the given source object with
-     * their matching values from the map.
-     *
-     * @param <V> the type of the values in the map
-     * @param source  the source text containing the variables to substitute, null returns null
-     * @param valueMap  the map with the values, may be null
-     * @return the result of the replace operation
-     */
-    public static <V> String replace(final Object source, final Map<String, V> valueMap) {
-        return new StrSubstitutor(valueMap).replace(source);
-    }
-
-    /**
-     * Replaces all the occurrences of variables in the given source object with
-     * their matching values from the map. This method allows to specifiy a
-     * custom variable prefix and suffix
-     *
-     * @param <V> the type of the values in the map
-     * @param source  the source text containing the variables to substitute, null returns null
-     * @param valueMap  the map with the values, may be null
-     * @param prefix  the prefix of variables, not null
-     * @param suffix  the suffix of variables, not null
-     * @return the result of the replace operation
-     * @throws IllegalArgumentException if the prefix or suffix is null
-     */
-    public static <V> String replace(final Object source, final Map<String, V> valueMap, final String prefix, final String suffix) {
-        return new StrSubstitutor(valueMap, prefix, suffix).replace(source);
-    }
-
-    /**
-     * Replaces all the occurrences of variables in the given source object with their matching
-     * values from the properties.
-     *
-     * @param source the source text containing the variables to substitute, null returns null
-     * @param valueProperties the properties with values, may be null
-     * @return the result of the replace operation
-     */
-    public static String replace(final Object source, final Properties valueProperties) {
-        if (valueProperties == null) {
-            return source.toString();
-        }
-        final Map<String,String> valueMap = new HashMap<String,String>();
-        final Enumeration<?> propNames = valueProperties.propertyNames();
-        while (propNames.hasMoreElements()) {
-            final String propName = (String)propNames.nextElement();
-            final String propValue = valueProperties.getProperty(propName);
-            valueMap.put(propName, propValue);
-        }
-        return StrSubstitutor.replace(source, valueMap);
-    }
-
-    /**
-     * Replaces all the occurrences of variables in the given source object with
-     * their matching values from the system properties.
-     *
-     * @param source  the source text containing the variables to substitute, null returns null
-     * @return the result of the replace operation
-     */
-    public static String replaceSystemProperties(final Object source) {
-        return new StrSubstitutor(StrLookup.systemPropertiesLookup()).replace(source);
-    }
-
-    //-----------------------------------------------------------------------
-    /**
-     * Creates a new instance with defaults for variable prefix and suffix
-     * and the escaping character.
-     */
-    public StrSubstitutor() {
-        this((StrLookup<?>) null, DEFAULT_PREFIX, DEFAULT_SUFFIX, DEFAULT_ESCAPE);
-    }
-
-    /**
-     * Creates a new instance and initializes it. Uses defaults for variable
-     * prefix and suffix and the escaping character.
-     *
-     * @param <V> the type of the values in the map
-     * @param valueMap  the map with the variables' values, may be null
-     */
-    public <V> StrSubstitutor(final Map<String, V> valueMap) {
-        this(StrLookup.mapLookup(valueMap), DEFAULT_PREFIX, DEFAULT_SUFFIX, DEFAULT_ESCAPE);
-    }
-
-    /**
-     * Creates a new instance and initializes it. Uses a default escaping character.
-     *
-     * @param <V> the type of the values in the map
-     * @param valueMap  the map with the variables' values, may be null
-     * @param prefix  the prefix for variables, not null
-     * @param suffix  the suffix for variables, not null
-     * @throws IllegalArgumentException if the prefix or suffix is null
-     */
-    public <V> StrSubstitutor(final Map<String, V> valueMap, final String prefix, final String suffix) {
-        this(StrLookup.mapLookup(valueMap), prefix, suffix, DEFAULT_ESCAPE);
-    }
-
-    /**
-     * Creates a new instance and initializes it.
-     *
-     * @param <V> the type of the values in the map
-     * @param valueMap  the map with the variables' values, may be null
-     * @param prefix  the prefix for variables, not null
-     * @param suffix  the suffix for variables, not null
-     * @param escape  the escape character
-     * @throws IllegalArgumentException if the prefix or suffix is null
-     */
-    public <V> StrSubstitutor(final Map<String, V> valueMap, final String prefix, final String suffix,
-                              final char escape) {
-        this(StrLookup.mapLookup(valueMap), prefix, suffix, escape);
-    }
-
-    /**
-     * Creates a new instance and initializes it.
-     *
-     * @param <V> the type of the values in the map
-     * @param valueMap  the map with the variables' values, may be null
-     * @param prefix  the prefix for variables, not null
-     * @param suffix  the suffix for variables, not null
-     * @param escape  the escape character
-     * @param valueDelimiter  the variable default value delimiter, may be null
-     * @throws IllegalArgumentException if the prefix or suffix is null
-     * @since 3.2
-     */
-    public <V> StrSubstitutor(final Map<String, V> valueMap, final String prefix, final String suffix,
-                              final char escape, final String valueDelimiter) {
-        this(StrLookup.mapLookup(valueMap), prefix, suffix, escape, valueDelimiter);
-    }
-
-    /**
-     * Creates a new instance and initializes it.
-     *
-     * @param variableResolver  the variable resolver, may be null
-     */
-    public StrSubstitutor(final StrLookup<?> variableResolver) {
-        this(variableResolver, DEFAULT_PREFIX, DEFAULT_SUFFIX, DEFAULT_ESCAPE);
-    }
-
-    /**
-     * Creates a new instance and initializes it.
-     *
-     * @param variableResolver  the variable resolver, may be null
-     * @param prefix  the prefix for variables, not null
-     * @param suffix  the suffix for variables, not null
-     * @param escape  the escape character
-     * @throws IllegalArgumentException if the prefix or suffix is null
-     */
-    public StrSubstitutor(final StrLookup<?> variableResolver, final String prefix, final String suffix,
-                          final char escape) {
-        this.setVariableResolver(variableResolver);
-        this.setVariablePrefix(prefix);
-        this.setVariableSuffix(suffix);
-        this.setEscapeChar(escape);
-        this.setValueDelimiterMatcher(DEFAULT_VALUE_DELIMITER);
-    }
-
-    /**
-     * Creates a new instance and initializes it.
-     *
-     * @param variableResolver  the variable resolver, may be null
-     * @param prefix  the prefix for variables, not null
-     * @param suffix  the suffix for variables, not null
-     * @param escape  the escape character
-     * @param valueDelimiter  the variable default value delimiter string, may be null
-     * @throws IllegalArgumentException if the prefix or suffix is null
-     * @since 3.2
-     */
-    public StrSubstitutor(final StrLookup<?> variableResolver, final String prefix, final String suffix,
-                          final char escape, final String valueDelimiter) {
-        this.setVariableResolver(variableResolver);
-        this.setVariablePrefix(prefix);
-        this.setVariableSuffix(suffix);
-        this.setEscapeChar(escape);
-        this.setValueDelimiter(valueDelimiter);
-    }
-
-    /**
-     * Creates a new instance and initializes it.
-     *
-     * @param variableResolver  the variable resolver, may be null
-     * @param prefixMatcher  the prefix for variables, not null
-     * @param suffixMatcher  the suffix for variables, not null
-     * @param escape  the escape character
-     * @throws IllegalArgumentException if the prefix or suffix is null
-     */
-    public StrSubstitutor(
-            final StrLookup<?> variableResolver, final StrMatcher prefixMatcher, final StrMatcher suffixMatcher,
-            final char escape) {
-        this(variableResolver, prefixMatcher, suffixMatcher, escape, DEFAULT_VALUE_DELIMITER);
-    }
-
-    /**
-     * Creates a new instance and initializes it.
-     *
-     * @param variableResolver  the variable resolver, may be null
-     * @param prefixMatcher  the prefix for variables, not null
-     * @param suffixMatcher  the suffix for variables, not null
-     * @param escape  the escape character
-     * @param valueDelimiterMatcher  the variable default value delimiter matcher, may be null
-     * @throws IllegalArgumentException if the prefix or suffix is null
-     * @since 3.2
-     */
-    public StrSubstitutor(
-            final StrLookup<?> variableResolver, final StrMatcher prefixMatcher, final StrMatcher suffixMatcher,
-            final char escape, final StrMatcher valueDelimiterMatcher) {
-        this.setVariableResolver(variableResolver);
-        this.setVariablePrefixMatcher(prefixMatcher);
-        this.setVariableSuffixMatcher(suffixMatcher);
-        this.setEscapeChar(escape);
-        this.setValueDelimiterMatcher(valueDelimiterMatcher);
-    }
-
-    //-----------------------------------------------------------------------
-    /**
-     * Replaces all the occurrences of variables with their matching values
-     * from the resolver using the given source string as a template.
-     *
-     * @param source  the string to replace in, null returns null
-     * @return the result of the replace operation
-     */
-    public String replace(final String source) {
-        if (source == null) {
-            return null;
-        }
-        final StrBuilder buf = new StrBuilder(source);
-        if (substitute(buf, 0, source.length()) == false) {
-            return source;
-        }
-        return buf.toString();
-    }
-
-    /**
-     * Replaces all the occurrences of variables with their matching values
-     * from the resolver using the given source string as a template.
-     * <p>
-     * Only the specified portion of the string will be processed.
-     * The rest of the string is not processed, and is not returned.
-     *
-     * @param source  the string to replace in, null returns null
-     * @param offset  the start offset within the array, must be valid
-     * @param length  the length within the array to be processed, must be valid
-     * @return the result of the replace operation
-     */
-    public String replace(final String source, final int offset, final int length) {
-        if (source == null) {
-            return null;
-        }
-        final StrBuilder buf = new StrBuilder(length).append(source, offset, length);
-        if (substitute(buf, 0, length) == false) {
-            return source.substring(offset, offset + length);
-        }
-        return buf.toString();
-    }
-
-    //-----------------------------------------------------------------------
-    /**
-     * Replaces all the occurrences of variables with their matching values
-     * from the resolver using the given source array as a template.
-     * The array is not altered by this method.
-     *
-     * @param source  the character array to replace in, not altered, null returns null
-     * @return the result of the replace operation
-     */
-    public String replace(final char[] source) {
-        if (source == null) {
-            return null;
-        }
-        final StrBuilder buf = new StrBuilder(source.length).append(source);
-        substitute(buf, 0, source.length);
-        return buf.toString();
-    }
-
-    /**
-     * Replaces all the occurrences of variables with their matching values
-     * from the resolver using the given source array as a template.
-     * The array is not altered by this method.
-     * <p>
-     * Only the specified portion of the array will be processed.
-     * The rest of the array is not processed, and is not returned.
-     *
-     * @param source  the character array to replace in, not altered, null returns null
-     * @param offset  the start offset within the array, must be valid
-     * @param length  the length within the array to be processed, must be valid
-     * @return the result of the replace operation
-     */
-    public String replace(final char[] source, final int offset, final int length) {
-        if (source == null) {
-            return null;
-        }
-        final StrBuilder buf = new StrBuilder(length).append(source, offset, length);
-        substitute(buf, 0, length);
-        return buf.toString();
-    }
-
-    //-----------------------------------------------------------------------
-    /**
-     * Replaces all the occurrences of variables with their matching values
-     * from the resolver using the given source buffer as a template.
-     * The buffer is not altered by this method.
-     *
-     * @param source  the buffer to use as a template, not changed, null returns null
-     * @return the result of the replace operation
-     */
-    public String replace(final StringBuffer source) {
-        if (source == null) {
-            return null;
-        }
-        final StrBuilder buf = new StrBuilder(source.length()).append(source);
-        substitute(buf, 0, buf.length());
-        return buf.toString();
-    }
-
-    /**
-     * Replaces all the occurrences of variables with their matching values
-     * from the resolver using the given source buffer as a template.
-     * The buffer is not altered by this method.
-     * <p>
-     * Only the specified portion of the buffer will be processed.
-     * The rest of the buffer is not processed, and is not returned.
-     *
-     * @param source  the buffer to use as a template, not changed, null returns null
-     * @param offset  the start offset within the array, must be valid
-     * @param length  the length within the array to be processed, must be valid
-     * @return the result of the replace operation
-     */
-    public String replace(final StringBuffer source, final int offset, final int length) {
-        if (source == null) {
-            return null;
-        }
-        final StrBuilder buf = new StrBuilder(length).append(source, offset, length);
-        substitute(buf, 0, length);
-        return buf.toString();
-    }
-
-    /**
-     * Replaces all the occurrences of variables with their matching values
-     * from the resolver using the given source as a template.
-     * The source is not altered by this method.
-     *
-     * @param source  the buffer to use as a template, not changed, null returns null
-     * @return the result of the replace operation
-     * @since 3.2
-     */
-    public String replace(final CharSequence source) {
-        if (source == null) {
-            return null;
-        }
-        return replace(source, 0, source.length());
-    }
-
-    /**
-     * Replaces all the occurrences of variables with their matching values
-     * from the resolver using the given source as a template.
-     * The source is not altered by this method.
-     * <p>
-     * Only the specified portion of the buffer will be processed.
-     * The rest of the buffer is not processed, and is not returned.
-     *
-     * @param source  the buffer to use as a template, not changed, null returns null
-     * @param offset  the start offset within the array, must be valid
-     * @param length  the length within the array to be processed, must be valid
-     * @return the result of the replace operation
-     * @since 3.2
-     */
-    public String replace(final CharSequence source, final int offset, final int length) {
-        if (source == null) {
-            return null;
-        }
-        final StrBuilder buf = new StrBuilder(length).append(source, offset, length);
-        substitute(buf, 0, length);
-        return buf.toString();
-    }
-
-    //-----------------------------------------------------------------------
-    /**
-     * Replaces all the occurrences of variables with their matching values
-     * from the resolver using the given source builder as a template.
-     * The builder is not altered by this method.
-     *
-     * @param source  the builder to use as a template, not changed, null returns null
-     * @return the result of the replace operation
-     */
-    public String replace(final StrBuilder source) {
-        if (source == null) {
-            return null;
-        }
-        final StrBuilder buf = new StrBuilder(source.length()).append(source);
-        substitute(buf, 0, buf.length());
-        return buf.toString();
-    }
-
-    /**
-     * Replaces all the occurrences of variables with their matching values
-     * from the resolver using the given source builder as a template.
-     * The builder is not altered by this method.
-     * <p>
-     * Only the specified portion of the builder will be processed.
-     * The rest of the builder is not processed, and is not returned.
-     *
-     * @param source  the builder to use as a template, not changed, null returns null
-     * @param offset  the start offset within the array, must be valid
-     * @param length  the length within the array to be processed, must be valid
-     * @return the result of the replace operation
-     */
-    public String replace(final StrBuilder source, final int offset, final int length) {
-        if (source == null) {
-            return null;
-        }
-        final StrBuilder buf = new StrBuilder(length).append(source, offset, length);
-        substitute(buf, 0, length);
-        return buf.toString();
-    }
-
-    //-----------------------------------------------------------------------
-    /**
-     * Replaces all the occurrences of variables in the given source object with
-     * their matching values from the resolver. The input source object is
-     * converted to a string using <code>toString</code> and is not altered.
-     *
-     * @param source  the source to replace in, null returns null
-     * @return the result of the replace operation
-     */
-    public String replace(final Object source) {
-        if (source == null) {
-            return null;
-        }
-        final StrBuilder buf = new StrBuilder().append(source);
-        substitute(buf, 0, buf.length());
-        return buf.toString();
-    }
-
-    //-----------------------------------------------------------------------
-    /**
-     * Replaces all the occurrences of variables within the given source buffer
-     * with their matching values from the resolver.
-     * The buffer is updated with the result.
-     *
-     * @param source  the buffer to replace in, updated, null returns zero
-     * @return true if altered
-     */
-    public boolean replaceIn(final StringBuffer source) {
-        if (source == null) {
-            return false;
-        }
-        return replaceIn(source, 0, source.length());
-    }
-
-    /**
-     * Replaces all the occurrences of variables within the given source buffer
-     * with their matching values from the resolver.
-     * The buffer is updated with the result.
-     * <p>
-     * Only the specified portion of the buffer will be processed.
-     * The rest of the buffer is not processed, but it is not deleted.
-     *
-     * @param source  the buffer to replace in, updated, null returns zero
-     * @param offset  the start offset within the array, must be valid
-     * @param length  the length within the buffer to be processed, must be valid
-     * @return true if altered
-     */
-    public boolean replaceIn(final StringBuffer source, final int offset, final int length) {
-        if (source == null) {
-            return false;
-        }
-        final StrBuilder buf = new StrBuilder(length).append(source, offset, length);
-        if (substitute(buf, 0, length) == false) {
-            return false;
-        }
-        source.replace(offset, offset + length, buf.toString());
-        return true;
-    }
-
-  //-----------------------------------------------------------------------
-    /**
-     * Replaces all the occurrences of variables within the given source buffer
-     * with their matching values from the resolver.
-     * The buffer is updated with the result.
-     *
-     * @param source  the buffer to replace in, updated, null returns zero
-     * @return true if altered
-     * @since 3.2
-     */
-    public boolean replaceIn(final StringBuilder source) {
-        if (source == null) {
-            return false;
-        }
-        return replaceIn(source, 0, source.length());
-    }
-
-    /**
-     * Replaces all the occurrences of variables within the given source builder
-     * with their matching values from the resolver.
-     * The builder is updated with the result.
-     * <p>
-     * Only the specified portion of the buffer will be processed.
-     * The rest of the buffer is not processed, but it is not deleted.
-     *
-     * @param source  the buffer to replace in, updated, null returns zero
-     * @param offset  the start offset within the array, must be valid
-     * @param length  the length within the buffer to be processed, must be valid
-     * @return true if altered
-     * @since 3.2
-     */
-    public boolean replaceIn(final StringBuilder source, final int offset, final int length) {
-        if (source == null) {
-            return false;
-        }
-        final StrBuilder buf = new StrBuilder(length).append(source, offset, length);
-        if (substitute(buf, 0, length) == false) {
-            return false;
-        }
-        source.replace(offset, offset + length, buf.toString());
-        return true;
-    }
-
-    //-----------------------------------------------------------------------
-    /**
-     * Replaces all the occurrences of variables within the given source
-     * builder with their matching values from the resolver.
-     *
-     * @param source  the builder to replace in, updated, null returns zero
-     * @return true if altered
-     */
-    public boolean replaceIn(final StrBuilder source) {
-        if (source == null) {
-            return false;
-        }
-        return substitute(source, 0, source.length());
-    }
-
-    /**
-     * Replaces all the occurrences of variables within the given source
-     * builder with their matching values from the resolver.
-     * <p>
-     * Only the specified portion of the builder will be processed.
-     * The rest of the builder is not processed, but it is not deleted.
-     *
-     * @param source  the builder to replace in, null returns zero
-     * @param offset  the start offset within the array, must be valid
-     * @param length  the length within the builder to be processed, must be valid
-     * @return true if altered
-     */
-    public boolean replaceIn(final StrBuilder source, final int offset, final int length) {
-        if (source == null) {
-            return false;
-        }
-        return substitute(source, offset, length);
-    }
-
-    //-----------------------------------------------------------------------
-    /**
-     * Internal method that substitutes the variables.
-     * <p>
-     * Most users of this class do not need to call this method. This method will
-     * be called automatically by another (public) method.
-     * <p>
-     * Writers of subclasses can override this method if they need access to
-     * the substitution process at the start or end.
-     *
-     * @param buf  the string builder to substitute into, not null
-     * @param offset  the start offset within the builder, must be valid
-     * @param length  the length within the builder to be processed, must be valid
-     * @return true if altered
-     */
-    protected boolean substitute(final StrBuilder buf, final int offset, final int length) {
-        return substitute(buf, offset, length, null) > 0;
-    }
-
-    /**
-     * Recursive handler for multiple levels of interpolation. This is the main
-     * interpolation method, which resolves the values of all variable references
-     * contained in the passed in text.
-     *
-     * @param buf  the string builder to substitute into, not null
-     * @param offset  the start offset within the builder, must be valid
-     * @param length  the length within the builder to be processed, must be valid
-     * @param priorVariables  the stack keeping track of the replaced variables, may be null
-     * @return the length change that occurs, unless priorVariables is null when the int
-     *  represents a boolean flag as to whether any change occurred.
-     */
-    private int substitute(final StrBuilder buf, final int offset, final int length, List<String> priorVariables) {
-        final StrMatcher pfxMatcher = getVariablePrefixMatcher();
-        final StrMatcher suffMatcher = getVariableSuffixMatcher();
-        final char escape = getEscapeChar();
-        final StrMatcher valueDelimMatcher = getValueDelimiterMatcher();
-        final boolean substitutionInVariablesEnabled = isEnableSubstitutionInVariables();
-
-        final boolean top = priorVariables == null;
-        boolean altered = false;
-        int lengthChange = 0;
-        char[] chars = buf.buffer;
-        int bufEnd = offset + length;
-        int pos = offset;
-        while (pos < bufEnd) {
-            final int startMatchLen = pfxMatcher.isMatch(chars, pos, offset,
-                    bufEnd);
-            if (startMatchLen == 0) {
-                pos++;
-            } else {
-                // found variable start marker
-                if (pos > offset && chars[pos - 1] == escape) {
-                    // escaped
-                    buf.deleteCharAt(pos - 1);
-                    chars = buf.buffer; // in case buffer was altered
-                    lengthChange--;
-                    altered = true;
-                    bufEnd--;
-                } else {
-                    // find suffix
-                    final int startPos = pos;
-                    pos += startMatchLen;
-                    int endMatchLen = 0;
-                    int nestedVarCount = 0;
-                    while (pos < bufEnd) {
-                        if (substitutionInVariablesEnabled
-                                && (endMatchLen = pfxMatcher.isMatch(chars,
-                                        pos, offset, bufEnd)) != 0) {
-                            // found a nested variable start
-                            nestedVarCount++;
-                            pos += endMatchLen;
-                            continue;
-                        }
-
-                        endMatchLen = suffMatcher.isMatch(chars, pos, offset,
-                                bufEnd);
-                        if (endMatchLen == 0) {
-                            pos++;
-                        } else {
-                            // found variable end marker
-                            if (nestedVarCount == 0) {
-                                String varNameExpr = new String(chars, startPos
-                                        + startMatchLen, pos - startPos
-                                        - startMatchLen);
-                                if (substitutionInVariablesEnabled) {
-                                    final StrBuilder bufName = new StrBuilder(varNameExpr);
-                                    substitute(bufName, 0, bufName.length());
-                                    varNameExpr = bufName.toString();
-                                }
-                                pos += endMatchLen;
-                                final int endPos = pos;
-
-                                String varName = varNameExpr;
-                                String varDefaultValue = null;
-
-                                if (valueDelimMatcher != null) {
-                                    final char [] varNameExprChars = varNameExpr.toCharArray();
-                                    int valueDelimiterMatchLen = 0;
-                                    for (int i = 0; i < varNameExprChars.length; i++) {
-                                        // if there's any nested variable when nested variable substitution disabled, then stop resolving name and default value.
-                                        if (!substitutionInVariablesEnabled
-                                                && pfxMatcher.isMatch(varNameExprChars, i, i, varNameExprChars.length) != 0) {
-                                            break;
-                                        }
-                                        if ((valueDelimiterMatchLen = valueDelimMatcher.isMatch(varNameExprChars, i)) != 0) {
-                                            varName = varNameExpr.substring(0, i);
-                                            varDefaultValue = varNameExpr.substring(i + valueDelimiterMatchLen);
-                                            break;
-                                        }
-                                    }
-                                }
-
-                                // on the first call initialize priorVariables
-                                if (priorVariables == null) {
-                                    priorVariables = new ArrayList<String>();
-                                    priorVariables.add(new String(chars,
-                                            offset, length));
-                                }
-
-                                // handle cyclic substitution
-                                checkCyclicSubstitution(varName, priorVariables);
-                                priorVariables.add(varName);
-
-                                // resolve the variable
-                                String varValue = resolveVariable(varName, buf,
-                                        startPos, endPos);
-                                if (varValue == null) {
-                                    varValue = varDefaultValue;
-                                }
-                                if (varValue != null) {
-                                    // recursive replace
-                                    final int varLen = varValue.length();
-                                    buf.replace(startPos, endPos, varValue);
-                                    altered = true;
-                                    int change = substitute(buf, startPos,
-                                            varLen, priorVariables);
-                                    change = change
-                                            + varLen - (endPos - startPos);
-                                    pos += change;
-                                    bufEnd += change;
-                                    lengthChange += change;
-                                    chars = buf.buffer; // in case buffer was
-                                                        // altered
-                                }
-
-                                // remove variable from the cyclic stack
-                                priorVariables
-                                        .remove(priorVariables.size() - 1);
-                                break;
-                            }
-                            nestedVarCount--;
-                            pos += endMatchLen;
-                        }
-                    }
-                }
-            }
-        }
-        if (top) {
-            return altered ? 1 : 0;
-        }
-        return lengthChange;
-    }
-
-    /**
-     * Checks if the specified variable is already in the stack (list) of variables.
-     *
-     * @param varName  the variable name to check
-     * @param priorVariables  the list of prior variables
-     */
-    private void checkCyclicSubstitution(final String varName, final List<String> priorVariables) {
-        if (priorVariables.contains(varName) == false) {
-            return;
-        }
-        final StrBuilder buf = new StrBuilder(256);
-        buf.append("Infinite loop in property interpolation of ");
-        buf.append(priorVariables.remove(0));
-        buf.append(": ");
-        buf.appendWithSeparators(priorVariables, "->");
-        throw new IllegalStateException(buf.toString());
-    }
-
-    /**
-     * Internal method that resolves the value of a variable.
-     * <p>
-     * Most users of this class do not need to call this method. This method is
-     * called automatically by the substitution process.
-     * <p>
-     * Writers of subclasses can override this method if they need to alter
-     * how each substitution occurs. The method is passed the variable's name
-     * and must return the corresponding value. This implementation uses the
-     * {@link #getVariableResolver()} with the variable's name as the key.
-     *
-     * @param variableName  the name of the variable, not null
-     * @param buf  the buffer where the substitution is occurring, not null
-     * @param startPos  the start position of the variable including the prefix, valid
-     * @param endPos  the end position of the variable including the suffix, valid
-     * @return the variable's value or <b>null</b> if the variable is unknown
-     */
-    protected String resolveVariable(final String variableName, final StrBuilder buf, final int startPos, final int endPos) {
-        final StrLookup<?> resolver = getVariableResolver();
-        if (resolver == null) {
-            return null;
-        }
-        return resolver.lookup(variableName);
-    }
-
-    // Escape
-    //-----------------------------------------------------------------------
-    /**
-     * Returns the escape character.
-     *
-     * @return the character used for escaping variable references
-     */
-    public char getEscapeChar() {
-        return this.escapeChar;
-    }
-
-    /**
-     * Sets the escape character.
-     * If this character is placed before a variable reference in the source
-     * text, this variable will be ignored.
-     *
-     * @param escapeCharacter  the escape character (0 for disabling escaping)
-     */
-    public void setEscapeChar(final char escapeCharacter) {
-        this.escapeChar = escapeCharacter;
-    }
-
-    // Prefix
-    //-----------------------------------------------------------------------
-    /**
-     * Gets the variable prefix matcher currently in use.
-     * <p>
-     * The variable prefix is the characer or characters that identify the
-     * start of a variable. This prefix is expressed in terms of a matcher
-     * allowing advanced prefix matches.
-     *
-     * @return the prefix matcher in use
-     */
-    public StrMatcher getVariablePrefixMatcher() {
-        return prefixMatcher;
-    }
-
-    /**
-     * Sets the variable prefix matcher currently in use.
-     * <p>
-     * The variable prefix is the characer or characters that identify the
-     * start of a variable. This prefix is expressed in terms of a matcher
-     * allowing advanced prefix matches.
-     *
-     * @param prefixMatcher  the prefix matcher to use, null ignored
-     * @return this, to enable chaining
-     * @throws IllegalArgumentException if the prefix matcher is null
-     */
-    public StrSubstitutor setVariablePrefixMatcher(final StrMatcher prefixMatcher) {
-        if (prefixMatcher == null) {
-            throw new IllegalArgumentException("Variable prefix matcher must not be null!");
-        }
-        this.prefixMatcher = prefixMatcher;
-        return this;
-    }
-
-    /**
-     * Sets the variable prefix to use.
-     * <p>
-     * The variable prefix is the character or characters that identify the
-     * start of a variable. This method allows a single character prefix to
-     * be easily set.
-     *
-     * @param prefix  the prefix character to use
-     * @return this, to enable chaining
-     */
-    public StrSubstitutor setVariablePrefix(final char prefix) {
-        return setVariablePrefixMatcher(StrMatcher.charMatcher(prefix));
-    }
-
-    /**
-     * Sets the variable prefix to use.
-     * <p>
-     * The variable prefix is the characer or characters that identify the
-     * start of a variable. This method allows a string prefix to be easily set.
-     *
-     * @param prefix  the prefix for variables, not null
-     * @return this, to enable chaining
-     * @throws IllegalArgumentException if the prefix is null
-     */
-    public StrSubstitutor setVariablePrefix(final String prefix) {
-       if (prefix == null) {
-            throw new IllegalArgumentException("Variable prefix must not be null!");
-        }
-        return setVariablePrefixMatcher(StrMatcher.stringMatcher(prefix));
-    }
-
-    // Suffix
-    //-----------------------------------------------------------------------
-    /**
-     * Gets the variable suffix matcher currently in use.
-     * <p>
-     * The variable suffix is the characer or characters that identify the
-     * end of a variable. This suffix is expressed in terms of a matcher
-     * allowing advanced suffix matches.
-     *
-     * @return the suffix matcher in use
-     */
-    public StrMatcher getVariableSuffixMatcher() {
-        return suffixMatcher;
-    }
-
-    /**
-     * Sets the variable suffix matcher currently in use.
-     * <p>
-     * The variable suffix is the characer or characters that identify the
-     * end of a variable. This suffix is expressed in terms of a matcher
-     * allowing advanced suffix matches.
-     *
-     * @param suffixMatcher  the suffix matcher to use, null ignored
-     * @return this, to enable chaining
-     * @throws IllegalArgumentException if the suffix matcher is null
-     */
-    public StrSubstitutor setVariableSuffixMatcher(final StrMatcher suffixMatcher) {
-        if (suffixMatcher == null) {
-            throw new IllegalArgumentException("Variable suffix matcher must not be null!");
-        }
-        this.suffixMatcher = suffixMatcher;
-        return this;
-    }
-
-    /**
-     * Sets the variable suffix to use.
-     * <p>
-     * The variable suffix is the characer or characters that identify the
-     * end of a variable. This method allows a single character suffix to
-     * be easily set.
-     *
-     * @param suffix  the suffix character to use
-     * @return this, to enable chaining
-     */
-    public StrSubstitutor setVariableSuffix(final char suffix) {
-        return setVariableSuffixMatcher(StrMatcher.charMatcher(suffix));
-    }
-
-    /**
-     * Sets the variable suffix to use.
-     * <p>
-     * The variable suffix is the character or characters that identify the
-     * end of a variable. This method allows a string suffix to be easily set.
-     *
-     * @param suffix  the suffix for variables, not null
-     * @return this, to enable chaining
-     * @throws IllegalArgumentException if the suffix is null
-     */
-    public StrSubstitutor setVariableSuffix(final String suffix) {
-       if (suffix == null) {
-            throw new IllegalArgumentException("Variable suffix must not be null!");
-        }
-        return setVariableSuffixMatcher(StrMatcher.stringMatcher(suffix));
-    }
-
-    // Variable Default Value Delimiter
-    //-----------------------------------------------------------------------
-    /**
-     * Gets the variable default value delimiter matcher currently in use.
-     * <p>
-     * The variable default value delimiter is the characer or characters that delimite the
-     * variable name and the variable default value. This delimiter is expressed in terms of a matcher
-     * allowing advanced variable default value delimiter matches.
-     * <p>
-     * If it returns null, then the variable default value resolution is disabled.
-     *
-     * @return the variable default value delimiter matcher in use, may be null
-     * @since 3.2
-     */
-    public StrMatcher getValueDelimiterMatcher() {
-        return valueDelimiterMatcher;
-    }
-
-    /**
-     * Sets the variable default value delimiter matcher to use.
-     * <p>
-     * The variable default value delimiter is the characer or characters that delimite the
-     * variable name and the variable default value. This delimiter is expressed in terms of a matcher
-     * allowing advanced variable default value delimiter matches.
-     * <p>
-     * If the <code>valueDelimiterMatcher</code> is null, then the variable default value resolution
-     * becomes disabled.
-     *
-     * @param valueDelimiterMatcher  variable default value delimiter matcher to use, may be null
-     * @return this, to enable chaining
-     * @since 3.2
-     */
-    public StrSubstitutor setValueDelimiterMatcher(final StrMatcher valueDelimiterMatcher) {
-        this.valueDelimiterMatcher = valueDelimiterMatcher;
-        return this;
-    }
-
-    /**
-     * Sets the variable default value delimiter to use.
-     * <p>
-     * The variable default value delimiter is the characer or characters that delimite the
-     * variable name and the variable default value. This method allows a single character
-     * variable default value delimiter to be easily set.
-     *
-     * @param valueDelimiter  the variable default value delimiter character to use
-     * @return this, to enable chaining
-     * @since 3.2
-     */
-    public StrSubstitutor setValueDelimiter(final char valueDelimiter) {
-        return setValueDelimiterMatcher(StrMatcher.charMatcher(valueDelimiter));
-    }
-
-    /**
-     * Sets the variable default value delimiter to use.
-     * <p>
-     * The variable default value delimiter is the characer or characters that delimite the
-     * variable name and the variable default value. This method allows a string
-     * variable default value delimiter to be easily set.
-     * <p>
-     * If the <code>valueDelimiter</code> is null or empty string, then the variable default
-     * value resolution becomes disabled.
-     *
-     * @param valueDelimiter  the variable default value delimiter string to use, may be null or empty
-     * @return this, to enable chaining
-     * @since 3.2
-     */
-    public StrSubstitutor setValueDelimiter(final String valueDelimiter) {
-        if (StringUtils.isEmpty(valueDelimiter)) {
-            setValueDelimiterMatcher(null);
-            return this;
-        }
-        return setValueDelimiterMatcher(StrMatcher.stringMatcher(valueDelimiter));
-    }
-
-    // Resolver
-    //-----------------------------------------------------------------------
-    /**
-     * Gets the VariableResolver that is used to lookup variables.
-     *
-     * @return the VariableResolver
-     */
-    public StrLookup<?> getVariableResolver() {
-        return this.variableResolver;
-    }
-
-    /**
-     * Sets the VariableResolver that is used to lookup variables.
-     *
-     * @param variableResolver  the VariableResolver
-     */
-    public void setVariableResolver(final StrLookup<?> variableResolver) {
-        this.variableResolver = variableResolver;
-    }
-
-    // Substitution support in variable names
-    //-----------------------------------------------------------------------
-    /**
-     * Returns a flag whether substitution is done in variable names.
-     *
-     * @return the substitution in variable names flag
-     * @since 3.0
-     */
-    public boolean isEnableSubstitutionInVariables() {
-        return enableSubstitutionInVariables;
-    }
-
-    /**
-     * Sets a flag whether substitution is done in variable names. If set to
-     * <b>true</b>, the names of variables can contain other variables which are
-     * processed first before the original variable is evaluated, e.g.
-     * <code>${jre-${java.version}}</code>. The default value is <b>false</b>.
-     *
-     * @param enableSubstitutionInVariables the new value of the flag
-     * @since 3.0
-     */
-    public void setEnableSubstitutionInVariables(
-            final boolean enableSubstitutionInVariables) {
-        this.enableSubstitutionInVariables = enableSubstitutionInVariables;
-    }
-}
diff --git a/lang/src/main/java/org/apache/commons/lang3/text/StrTokenizer.java b/lang/src/main/java/org/apache/commons/lang3/text/StrTokenizer.java
deleted file mode 100644
index f620b39..0000000
--- a/lang/src/main/java/org/apache/commons/lang3/text/StrTokenizer.java
+++ /dev/null
@@ -1,1114 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.commons.lang3.text;
-
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.List;
-import java.util.ListIterator;
-import java.util.NoSuchElementException;
-
-import org.apache.commons.lang3.ArrayUtils;
-import org.apache.commons.lang3.StringUtils;
-
-/**
- * Tokenizes a string based based on delimiters (separators)
- * and supporting quoting and ignored character concepts.
- * <p>
- * This class can split a String into many smaller strings. It aims
- * to do a similar job to {@link java.util.StringTokenizer StringTokenizer},
- * however it offers much more control and flexibility including implementing
- * the <code>ListIterator</code> interface. By default, it is set up
- * like <code>StringTokenizer</code>.
- * <p>
- * The input String is split into a number of <i>tokens</i>.
- * Each token is separated from the next String by a <i>delimiter</i>.
- * One or more delimiter characters must be specified.
- * <p>
- * Each token may be surrounded by quotes.
- * The <i>quote</i> matcher specifies the quote character(s).
- * A quote may be escaped within a quoted section by duplicating itself.
- * <p>
- * Between each token and the delimiter are potentially characters that need trimming.
- * The <i>trimmer</i> matcher specifies these characters.
- * One usage might be to trim whitespace characters.
- * <p>
- * At any point outside the quotes there might potentially be invalid characters.
- * The <i>ignored</i> matcher specifies these characters to be removed.
- * One usage might be to remove new line characters.
- * <p>
- * Empty tokens may be removed or returned as null.
- * <pre>
- * "a,b,c"         - Three tokens "a","b","c"   (comma delimiter)
- * " a, b , c "    - Three tokens "a","b","c"   (default CSV processing trims whitespace)
- * "a, ", b ,", c" - Three tokens "a, " , " b ", ", c" (quoted text untouched)
- * </pre>
- * <p>
- *
- * This tokenizer has the following properties and options:
- *
- * <table summary="Tokenizer Properties">
- *  <tr>
- *   <th>Property</th><th>Type</th><th>Default</th>
- *  </tr>
- *  <tr>
- *   <td>delim</td><td>CharSetMatcher</td><td>{ \t\n\r\f}</td>
- *  </tr>
- *  <tr>
- *   <td>quote</td><td>NoneMatcher</td><td>{}</td>
- *  </tr>
- *  <tr>
- *   <td>ignore</td><td>NoneMatcher</td><td>{}</td>
- *  </tr>
- *  <tr>
- *   <td>emptyTokenAsNull</td><td>boolean</td><td>false</td>
- *  </tr>
- *  <tr>
- *   <td>ignoreEmptyTokens</td><td>boolean</td><td>true</td>
- *  </tr>
- * </table>
- *
- * @since 2.2
- * @version $Id$
- */
-public class StrTokenizer implements ListIterator<String>, Cloneable {
-
-    private static final StrTokenizer CSV_TOKENIZER_PROTOTYPE;
-    private static final StrTokenizer TSV_TOKENIZER_PROTOTYPE;
-    static {
-        CSV_TOKENIZER_PROTOTYPE = new StrTokenizer();
-        CSV_TOKENIZER_PROTOTYPE.setDelimiterMatcher(StrMatcher.commaMatcher());
-        CSV_TOKENIZER_PROTOTYPE.setQuoteMatcher(StrMatcher.doubleQuoteMatcher());
-        CSV_TOKENIZER_PROTOTYPE.setIgnoredMatcher(StrMatcher.noneMatcher());
-        CSV_TOKENIZER_PROTOTYPE.setTrimmerMatcher(StrMatcher.trimMatcher());
-        CSV_TOKENIZER_PROTOTYPE.setEmptyTokenAsNull(false);
-        CSV_TOKENIZER_PROTOTYPE.setIgnoreEmptyTokens(false);
-
-        TSV_TOKENIZER_PROTOTYPE = new StrTokenizer();
-        TSV_TOKENIZER_PROTOTYPE.setDelimiterMatcher(StrMatcher.tabMatcher());
-        TSV_TOKENIZER_PROTOTYPE.setQuoteMatcher(StrMatcher.doubleQuoteMatcher());
-        TSV_TOKENIZER_PROTOTYPE.setIgnoredMatcher(StrMatcher.noneMatcher());
-        TSV_TOKENIZER_PROTOTYPE.setTrimmerMatcher(StrMatcher.trimMatcher());
-        TSV_TOKENIZER_PROTOTYPE.setEmptyTokenAsNull(false);
-        TSV_TOKENIZER_PROTOTYPE.setIgnoreEmptyTokens(false);
-    }
-
-    /** The text to work on. */
-    private char chars[];
-    /** The parsed tokens */
-    private String tokens[];
-    /** The current iteration position */
-    private int tokenPos;
-
-    /** The delimiter matcher */
-    private StrMatcher delimMatcher = StrMatcher.splitMatcher();
-    /** The quote matcher */
-    private StrMatcher quoteMatcher = StrMatcher.noneMatcher();
-    /** The ignored matcher */
-    private StrMatcher ignoredMatcher = StrMatcher.noneMatcher();
-    /** The trimmer matcher */
-    private StrMatcher trimmerMatcher = StrMatcher.noneMatcher();
-
-    /** Whether to return empty tokens as null */
-    private boolean emptyAsNull = false;
-    /** Whether to ignore empty tokens */
-    private boolean ignoreEmptyTokens = true;
-
-    //-----------------------------------------------------------------------
-
-    /**
-     * Returns a clone of <code>CSV_TOKENIZER_PROTOTYPE</code>.
-     * 
-     * @return a clone of <code>CSV_TOKENIZER_PROTOTYPE</code>.
-     */
-    private static StrTokenizer getCSVClone() {
-        return (StrTokenizer) CSV_TOKENIZER_PROTOTYPE.clone();
-    }
-
-    /**
-     * Gets a new tokenizer instance which parses Comma Separated Value strings
-     * initializing it with the given input.  The default for CSV processing
-     * will be trim whitespace from both ends (which can be overridden with
-     * the setTrimmer method).
-     * <p>
-     * You must call a "reset" method to set the string which you want to parse.
-     * @return a new tokenizer instance which parses Comma Separated Value strings
-     */
-    public static StrTokenizer getCSVInstance() {
-        return getCSVClone();
-    }
-
-    /**
-     * Gets a new tokenizer instance which parses Comma Separated Value strings
-     * initializing it with the given input.  The default for CSV processing
-     * will be trim whitespace from both ends (which can be overridden with
-     * the setTrimmer method).
-     *
-     * @param input  the text to parse
-     * @return a new tokenizer instance which parses Comma Separated Value strings
-     */
-    public static StrTokenizer getCSVInstance(final String input) {
-        final StrTokenizer tok = getCSVClone();
-        tok.reset(input);
-        return tok;
-    }
-
-    /**
-     * Gets a new tokenizer instance which parses Comma Separated Value strings
-     * initializing it with the given input.  The default for CSV processing
-     * will be trim whitespace from both ends (which can be overridden with
-     * the setTrimmer method).
-     *
-     * @param input  the text to parse
-     * @return a new tokenizer instance which parses Comma Separated Value strings
-     */
-    public static StrTokenizer getCSVInstance(final char[] input) {
-        final StrTokenizer tok = getCSVClone();
-        tok.reset(input);
-        return tok;
-    }
-
-    /**
-     * Returns a clone of <code>TSV_TOKENIZER_PROTOTYPE</code>.
-     * 
-     * @return a clone of <code>TSV_TOKENIZER_PROTOTYPE</code>.
-     */
-    private static StrTokenizer getTSVClone() {
-        return (StrTokenizer) TSV_TOKENIZER_PROTOTYPE.clone();
-    }
-
-
-    /**
-     * Gets a new tokenizer instance which parses Tab Separated Value strings.
-     * The default for CSV processing will be trim whitespace from both ends
-     * (which can be overridden with the setTrimmer method).
-     * <p>
-     * You must call a "reset" method to set the string which you want to parse.
-     * @return a new tokenizer instance which parses Tab Separated Value strings.
-     */
-    public static StrTokenizer getTSVInstance() {
-        return getTSVClone();
-    }
-
-    /**
-     * Gets a new tokenizer instance which parses Tab Separated Value strings.
-     * The default for CSV processing will be trim whitespace from both ends
-     * (which can be overridden with the setTrimmer method).
-     * @param input  the string to parse
-     * @return a new tokenizer instance which parses Tab Separated Value strings.
-     */
-    public static StrTokenizer getTSVInstance(final String input) {
-        final StrTokenizer tok = getTSVClone();
-        tok.reset(input);
-        return tok;
-    }
-
-    /**
-     * Gets a new tokenizer instance which parses Tab Separated Value strings.
-     * The default for CSV processing will be trim whitespace from both ends
-     * (which can be overridden with the setTrimmer method).
-     * @param input  the string to parse
-     * @return a new tokenizer instance which parses Tab Separated Value strings.
-     */
-    public static StrTokenizer getTSVInstance(final char[] input) {
-        final StrTokenizer tok = getTSVClone();
-        tok.reset(input);
-        return tok;
-    }
-
-    //-----------------------------------------------------------------------
-    /**
-     * Constructs a tokenizer splitting on space, tab, newline and formfeed
-     * as per StringTokenizer, but with no text to tokenize.
-     * <p>
-     * This constructor is normally used with {@link #reset(String)}.
-     */
-    public StrTokenizer() {
-        super();
-        this.chars = null;
-    }
-
-    /**
-     * Constructs a tokenizer splitting on space, tab, newline and formfeed
-     * as per StringTokenizer.
-     *
-     * @param input  the string which is to be parsed
-     */
-    public StrTokenizer(final String input) {
-        super();
-        if (input != null) {
-            chars = input.toCharArray();
-        } else {
-            chars = null;
-        }
-    }
-
-    /**
-     * Constructs a tokenizer splitting on the specified delimiter character.
-     *
-     * @param input  the string which is to be parsed
-     * @param delim  the field delimiter character
-     */
-    public StrTokenizer(final String input, final char delim) {
-        this(input);
-        setDelimiterChar(delim);
-    }
-
-    /**
-     * Constructs a tokenizer splitting on the specified delimiter string.
-     *
-     * @param input  the string which is to be parsed
-     * @param delim  the field delimiter string
-     */
-    public StrTokenizer(final String input, final String delim) {
-        this(input);
-        setDelimiterString(delim);
-    }
-
-    /**
-     * Constructs a tokenizer splitting using the specified delimiter matcher.
-     *
-     * @param input  the string which is to be parsed
-     * @param delim  the field delimiter matcher
-     */
-    public StrTokenizer(final String input, final StrMatcher delim) {
-        this(input);
-        setDelimiterMatcher(delim);
-    }
-
-    /**
-     * Constructs a tokenizer splitting on the specified delimiter character
-     * and handling quotes using the specified quote character.
-     *
-     * @param input  the string which is to be parsed
-     * @param delim  the field delimiter character
-     * @param quote  the field quoted string character
-     */
-    public StrTokenizer(final String input, final char delim, final char quote) {
-        this(input, delim);
-        setQuoteChar(quote);
-    }
-
-    /**
-     * Constructs a tokenizer splitting using the specified delimiter matcher
-     * and handling quotes using the specified quote matcher.
-     *
-     * @param input  the string which is to be parsed
-     * @param delim  the field delimiter matcher
-     * @param quote  the field quoted string matcher
-     */
-    public StrTokenizer(final String input, final StrMatcher delim, final StrMatcher quote) {
-        this(input, delim);
-        setQuoteMatcher(quote);
-    }
-
-    /**
-     * Constructs a tokenizer splitting on space, tab, newline and formfeed
-     * as per StringTokenizer.
-     *
-     * @param input  the string which is to be parsed, not cloned
-     */
-    public StrTokenizer(final char[] input) {
-        super();
-        this.chars = ArrayUtils.clone(input);
-    }
-
-    /**
-     * Constructs a tokenizer splitting on the specified character.
-     *
-     * @param input  the string which is to be parsed, not cloned
-     * @param delim the field delimiter character
-     */
-    public StrTokenizer(final char[] input, final char delim) {
-        this(input);
-        setDelimiterChar(delim);
-    }
-
-    /**
-     * Constructs a tokenizer splitting on the specified string.
-     *
-     * @param input  the string which is to be parsed, not cloned
-     * @param delim the field delimiter string
-     */
-    public StrTokenizer(final char[] input, final String delim) {
-        this(input);
-        setDelimiterString(delim);
-    }
-
-    /**
-     * Constructs a tokenizer splitting using the specified delimiter matcher.
-     *
-     * @param input  the string which is to be parsed, not cloned
-     * @param delim  the field delimiter matcher
-     */
-    public StrTokenizer(final char[] input, final StrMatcher delim) {
-        this(input);
-        setDelimiterMatcher(delim);
-    }
-
-    /**
-     * Constructs a tokenizer splitting on the specified delimiter character
-     * and handling quotes using the specified quote character.
-     *
-     * @param input  the string which is to be parsed, not cloned
-     * @param delim  the field delimiter character
-     * @param quote  the field quoted string character
-     */
-    public StrTokenizer(final char[] input, final char delim, final char quote) {
-        this(input, delim);
-        setQuoteChar(quote);
-    }
-
-    /**
-     * Constructs a tokenizer splitting using the specified delimiter matcher
-     * and handling quotes using the specified quote matcher.
-     *
-     * @param input  the string which is to be parsed, not cloned
-     * @param delim  the field delimiter character
-     * @param quote  the field quoted string character
-     */
-    public StrTokenizer(final char[] input, final StrMatcher delim, final StrMatcher quote) {
-        this(input, delim);
-        setQuoteMatcher(quote);
-    }
-
-    // API
-    //-----------------------------------------------------------------------
-    /**
-     * Gets the number of tokens found in the String.
-     *
-     * @return the number of matched tokens
-     */
-    public int size() {
-        checkTokenized();
-        return tokens.length;
-    }
-
-    /**
-     * Gets the next token from the String.
-     * Equivalent to {@link #next()} except it returns null rather than
-     * throwing {@link NoSuchElementException} when no tokens remain.
-     *
-     * @return the next sequential token, or null when no more tokens are found
-     */
-    public String nextToken() {
-        if (hasNext()) {
-            return tokens[tokenPos++];
-        }
-        return null;
-    }
-
-    /**
-     * Gets the previous token from the String.
-     *
-     * @return the previous sequential token, or null when no more tokens are found
-     */
-    public String previousToken() {
-        if (hasPrevious()) {
-            return tokens[--tokenPos];
-        }
-        return null;
-    }
-
-    /**
-     * Gets a copy of the full token list as an independent modifiable array.
-     *
-     * @return the tokens as a String array
-     */
-    public String[] getTokenArray() {
-        checkTokenized();
-        return tokens.clone();
-    }
-
-    /**
-     * Gets a copy of the full token list as an independent modifiable list.
-     *
-     * @return the tokens as a String array
-     */
-    public List<String> getTokenList() {
-        checkTokenized();
-        final List<String> list = new ArrayList<String>(tokens.length);
-        for (final String element : tokens) {
-            list.add(element);
-        }
-        return list;
-    }
-
-    /**
-     * Resets this tokenizer, forgetting all parsing and iteration already completed.
-     * <p>
-     * This method allows the same tokenizer to be reused for the same String.
-     *
-     * @return this, to enable chaining
-     */
-    public StrTokenizer reset() {
-        tokenPos = 0;
-        tokens = null;
-        return this;
-    }
-
-    /**
-     * Reset this tokenizer, giving it a new input string to parse.
-     * In this manner you can re-use a tokenizer with the same settings
-     * on multiple input lines.
-     *
-     * @param input  the new string to tokenize, null sets no text to parse
-     * @return this, to enable chaining
-     */
-    public StrTokenizer reset(final String input) {
-        reset();
-        if (input != null) {
-            this.chars = input.toCharArray();
-        } else {
-            this.chars = null;
-        }
-        return this;
-    }
-
-    /**
-     * Reset this tokenizer, giving it a new input string to parse.
-     * In this manner you can re-use a tokenizer with the same settings
-     * on multiple input lines.
-     *
-     * @param input  the new character array to tokenize, not cloned, null sets no text to parse
-     * @return this, to enable chaining
-     */
-    public StrTokenizer reset(final char[] input) {
-        reset();
-        this.chars = ArrayUtils.clone(input);
-        return this;
-    }
-
-    // ListIterator
-    //-----------------------------------------------------------------------
-    /**
-     * Checks whether there are any more tokens.
-     *
-     * @return true if there are more tokens
-     */
-    @Override
-    public boolean hasNext() {
-        checkTokenized();
-        return tokenPos < tokens.length;
-    }
-
-    /**
-     * Gets the next token.
-     *
-     * @return the next String token
-     * @throws NoSuchElementException if there are no more elements
-     */
-    @Override
-    public String next() {
-        if (hasNext()) {
-            return tokens[tokenPos++];
-        }
-        throw new NoSuchElementException();
-    }
-
-    /**
-     * Gets the index of the next token to return.
-     *
-     * @return the next token index
-     */
-    @Override
-    public int nextIndex() {
-        return tokenPos;
-    }
-
-    /**
-     * Checks whether there are any previous tokens that can be iterated to.
-     *
-     * @return true if there are previous tokens
-     */
-    @Override
-    public boolean hasPrevious() {
-        checkTokenized();
-        return tokenPos > 0;
-    }
-
-    /**
-     * Gets the token previous to the last returned token.
-     *
-     * @return the previous token
-     */
-    @Override
-    public String previous() {
-        if (hasPrevious()) {
-            return tokens[--tokenPos];
-        }
-        throw new NoSuchElementException();
-    }
-
-    /**
-     * Gets the index of the previous token.
-     *
-     * @return the previous token index
-     */
-    @Override
-    public int previousIndex() {
-        return tokenPos - 1;
-    }
-
-    /**
-     * Unsupported ListIterator operation.
-     *
-     * @throws UnsupportedOperationException always
-     */
-    @Override
-    public void remove() {
-        throw new UnsupportedOperationException("remove() is unsupported");
-    }
-
-    /**
-     * Unsupported ListIterator operation.
-     * @param obj this parameter ignored.
-     * @throws UnsupportedOperationException always
-     */
-    @Override
-    public void set(final String obj) {
-        throw new UnsupportedOperationException("set() is unsupported");
-    }
-
-    /**
-     * Unsupported ListIterator operation.
-     * @param obj this parameter ignored.
-     * @throws UnsupportedOperationException always
-     */
-    @Override
-    public void add(final String obj) {
-        throw new UnsupportedOperationException("add() is unsupported");
-    }
-
-    // Implementation
-    //-----------------------------------------------------------------------
-    /**
-     * Checks if tokenization has been done, and if not then do it.
-     */
-    private void checkTokenized() {
-        if (tokens == null) {
-            if (chars == null) {
-                // still call tokenize as subclass may do some work
-                final List<String> split = tokenize(null, 0, 0);
-                tokens = split.toArray(new String[split.size()]);
-            } else {
-                final List<String> split = tokenize(chars, 0, chars.length);
-                tokens = split.toArray(new String[split.size()]);
-            }
-        }
-    }
-
-    /**
-     * Internal method to performs the tokenization.
-     * <p>
-     * Most users of this class do not need to call this method. This method
-     * will be called automatically by other (public) methods when required.
-     * <p>
-     * This method exists to allow subclasses to add code before or after the
-     * tokenization. For example, a subclass could alter the character array,
-     * offset or count to be parsed, or call the tokenizer multiple times on
-     * multiple strings. It is also be possible to filter the results.
-     * <p>
-     * <code>StrTokenizer</code> will always pass a zero offset and a count
-     * equal to the length of the array to this method, however a subclass
-     * may pass other values, or even an entirely different array.
-     * 
-     * @param srcChars  the character array being tokenized, may be null
-     * @param offset  the start position within the character array, must be valid
-     * @param count  the number of characters to tokenize, must be valid
-     * @return the modifiable list of String tokens, unmodifiable if null array or zero count
-     */
-    protected List<String> tokenize(final char[] srcChars, final int offset, final int count) {
-        if (srcChars == null || count == 0) {
-            return Collections.emptyList();
-        }
-        final StrBuilder buf = new StrBuilder();
-        final List<String> tokenList = new ArrayList<String>();
-        int pos = offset;
-        
-        // loop around the entire buffer
-        while (pos >= 0 && pos < count) {
-            // find next token
-            pos = readNextToken(srcChars, pos, count, buf, tokenList);
-            
-            // handle case where end of string is a delimiter
-            if (pos >= count) {
-                addToken(tokenList, "");
-            }
-        }
-        return tokenList;
-    }
-
-    /**
-     * Adds a token to a list, paying attention to the parameters we've set.
-     *
-     * @param list  the list to add to
-     * @param tok  the token to add
-     */
-    private void addToken(final List<String> list, String tok) {
-        if (StringUtils.isEmpty(tok)) {
-            if (isIgnoreEmptyTokens()) {
-                return;
-            }
-            if (isEmptyTokenAsNull()) {
-                tok = null;
-            }
-        }
-        list.add(tok);
-    }
-
-    /**
-     * Reads character by character through the String to get the next token.
-     *
-     * @param srcChars  the character array being tokenized
-     * @param start  the first character of field
-     * @param len  the length of the character array being tokenized
-     * @param workArea  a temporary work area
-     * @param tokenList  the list of parsed tokens
-     * @return the starting position of the next field (the character
-     *  immediately after the delimiter), or -1 if end of string found
-     */
-    private int readNextToken(final char[] srcChars, int start, final int len, final StrBuilder workArea, final List<String> tokenList) {
-        // skip all leading whitespace, unless it is the
-        // field delimiter or the quote character
-        while (start < len) {
-            final int removeLen = Math.max(
-                    getIgnoredMatcher().isMatch(srcChars, start, start, len),
-                    getTrimmerMatcher().isMatch(srcChars, start, start, len));
-            if (removeLen == 0 ||
-                getDelimiterMatcher().isMatch(srcChars, start, start, len) > 0 ||
-                getQuoteMatcher().isMatch(srcChars, start, start, len) > 0) {
-                break;
-            }
-            start += removeLen;
-        }
-        
-        // handle reaching end
-        if (start >= len) {
-            addToken(tokenList, "");
-            return -1;
-        }
-        
-        // handle empty token
-        final int delimLen = getDelimiterMatcher().isMatch(srcChars, start, start, len);
-        if (delimLen > 0) {
-            addToken(tokenList, "");
-            return start + delimLen;
-        }
-        
-        // handle found token
-        final int quoteLen = getQuoteMatcher().isMatch(srcChars, start, start, len);
-        if (quoteLen > 0) {
-            return readWithQuotes(srcChars, start + quoteLen, len, workArea, tokenList, start, quoteLen);
-        }
-        return readWithQuotes(srcChars, start, len, workArea, tokenList, 0, 0);
-    }
-
-    /**
-     * Reads a possibly quoted string token.
-     *
-     * @param srcChars  the character array being tokenized
-     * @param start  the first character of field
-     * @param len  the length of the character array being tokenized
-     * @param workArea  a temporary work area
-     * @param tokenList  the list of parsed tokens
-     * @param quoteStart  the start position of the matched quote, 0 if no quoting
-     * @param quoteLen  the length of the matched quote, 0 if no quoting
-     * @return the starting position of the next field (the character
-     *  immediately after the delimiter, or if end of string found,
-     *  then the length of string
-     */
-    private int readWithQuotes(final char[] srcChars, final int start, final int len, final StrBuilder workArea, 
-                               final List<String> tokenList, final int quoteStart, final int quoteLen) {
-        // Loop until we've found the end of the quoted
-        // string or the end of the input
-        workArea.clear();
-        int pos = start;
-        boolean quoting = quoteLen > 0;
-        int trimStart = 0;
-        
-        while (pos < len) {
-            // quoting mode can occur several times throughout a string
-            // we must switch between quoting and non-quoting until we
-            // encounter a non-quoted delimiter, or end of string
-            if (quoting) {
-                // In quoting mode
-                
-                // If we've found a quote character, see if it's
-                // followed by a second quote.  If so, then we need
-                // to actually put the quote character into the token
-                // rather than end the token.
-                if (isQuote(srcChars, pos, len, quoteStart, quoteLen)) {
-                    if (isQuote(srcChars, pos + quoteLen, len, quoteStart, quoteLen)) {
-                        // matched pair of quotes, thus an escaped quote
-                        workArea.append(srcChars, pos, quoteLen);
-                        pos += quoteLen * 2;
-                        trimStart = workArea.size();
-                        continue;
-                    }
-                    
-                    // end of quoting
-                    quoting = false;
-                    pos += quoteLen;
-                    continue;
-                }
-                
-                // copy regular character from inside quotes
-                workArea.append(srcChars[pos++]);
-                trimStart = workArea.size();
-                
-            } else {
-                // Not in quoting mode
-                
-                // check for delimiter, and thus end of token
-                final int delimLen = getDelimiterMatcher().isMatch(srcChars, pos, start, len);
-                if (delimLen > 0) {
-                    // return condition when end of token found
-                    addToken(tokenList, workArea.substring(0, trimStart));
-                    return pos + delimLen;
-                }
-                
-                // check for quote, and thus back into quoting mode
-                if (quoteLen > 0 && isQuote(srcChars, pos, len, quoteStart, quoteLen)) {
-                    quoting = true;
-                    pos += quoteLen;
-                    continue;
-                }
-                
-                // check for ignored (outside quotes), and ignore
-                final int ignoredLen = getIgnoredMatcher().isMatch(srcChars, pos, start, len);
-                if (ignoredLen > 0) {
-                    pos += ignoredLen;
-                    continue;
-                }
-                
-                // check for trimmed character
-                // don't yet know if its at the end, so copy to workArea
-                // use trimStart to keep track of trim at the end
-                final int trimmedLen = getTrimmerMatcher().isMatch(srcChars, pos, start, len);
-                if (trimmedLen > 0) {
-                    workArea.append(srcChars, pos, trimmedLen);
-                    pos += trimmedLen;
-                    continue;
-                }
-                
-                // copy regular character from outside quotes
-                workArea.append(srcChars[pos++]);
-                trimStart = workArea.size();
-            }
-        }
-        
-        // return condition when end of string found
-        addToken(tokenList, workArea.substring(0, trimStart));
-        return -1;
-    }
-
-    /**
-     * Checks if the characters at the index specified match the quote
-     * already matched in readNextToken().
-     *
-     * @param srcChars  the character array being tokenized
-     * @param pos  the position to check for a quote
-     * @param len  the length of the character array being tokenized
-     * @param quoteStart  the start position of the matched quote, 0 if no quoting
-     * @param quoteLen  the length of the matched quote, 0 if no quoting
-     * @return true if a quote is matched
-     */
-    private boolean isQuote(final char[] srcChars, final int pos, final int len, final int quoteStart, final int quoteLen) {
-        for (int i = 0; i < quoteLen; i++) {
-            if (pos + i >= len || srcChars[pos + i] != srcChars[quoteStart + i]) {
-                return false;
-            }
-        }
-        return true;
-    }
-
-    // Delimiter
-    //-----------------------------------------------------------------------
-    /**
-     * Gets the field delimiter matcher.
-     *
-     * @return the delimiter matcher in use
-     */
-    public StrMatcher getDelimiterMatcher() {
-        return this.delimMatcher;
-    }
-
-    /**
-     * Sets the field delimiter matcher.
-     * <p>
-     * The delimitier is used to separate one token from another.
-     *
-     * @param delim  the delimiter matcher to use
-     * @return this, to enable chaining
-     */
-    public StrTokenizer setDelimiterMatcher(final StrMatcher delim) {
-        if (delim == null) {
-            this.delimMatcher = StrMatcher.noneMatcher();
-        } else {
-            this.delimMatcher = delim;
-        }
-        return this;
-    }
-
-    /**
-     * Sets the field delimiter character.
-     *
-     * @param delim  the delimiter character to use
-     * @return this, to enable chaining
-     */
-    public StrTokenizer setDelimiterChar(final char delim) {
-        return setDelimiterMatcher(StrMatcher.charMatcher(delim));
-    }
-
-    /**
-     * Sets the field delimiter string.
-     *
-     * @param delim  the delimiter string to use
-     * @return this, to enable chaining
-     */
-    public StrTokenizer setDelimiterString(final String delim) {
-        return setDelimiterMatcher(StrMatcher.stringMatcher(delim));
-    }
-
-    // Quote
-    //-----------------------------------------------------------------------
-    /**
-     * Gets the quote matcher currently in use.
-     * <p>
-     * The quote character is used to wrap data between the tokens.
-     * This enables delimiters to be entered as data.
-     * The default value is '"' (double quote).
-     *
-     * @return the quote matcher in use
-     */
-    public StrMatcher getQuoteMatcher() {
-        return quoteMatcher;
-    }
-
-    /**
-     * Set the quote matcher to use.
-     * <p>
-     * The quote character is used to wrap data between the tokens.
-     * This enables delimiters to be entered as data.
-     *
-     * @param quote  the quote matcher to use, null ignored
-     * @return this, to enable chaining
-     */
-    public StrTokenizer setQuoteMatcher(final StrMatcher quote) {
-        if (quote != null) {
-            this.quoteMatcher = quote;
-        }
-        return this;
-    }
-
-    /**
-     * Sets the quote character to use.
-     * <p>
-     * The quote character is used to wrap data between the tokens.
-     * This enables delimiters to be entered as data.
-     *
-     * @param quote  the quote character to use
-     * @return this, to enable chaining
-     */
-    public StrTokenizer setQuoteChar(final char quote) {
-        return setQuoteMatcher(StrMatcher.charMatcher(quote));
-    }
-
-    // Ignored
-    //-----------------------------------------------------------------------
-    /**
-     * Gets the ignored character matcher.
-     * <p>
-     * These characters are ignored when parsing the String, unless they are
-     * within a quoted region.
-     * The default value is not to ignore anything.
-     *
-     * @return the ignored matcher in use
-     */
-    public StrMatcher getIgnoredMatcher() {
-        return ignoredMatcher;
-    }
-
-    /**
-     * Set the matcher for characters to ignore.
-     * <p>
-     * These characters are ignored when parsing the String, unless they are
-     * within a quoted region.
-     *
-     * @param ignored  the ignored matcher to use, null ignored
-     * @return this, to enable chaining
-     */
-    public StrTokenizer setIgnoredMatcher(final StrMatcher ignored) {
-        if (ignored != null) {
-            this.ignoredMatcher = ignored;
-        }
-        return this;
-    }
-
-    /**
-     * Set the character to ignore.
-     * <p>
-     * This character is ignored when parsing the String, unless it is
-     * within a quoted region.
-     *
-     * @param ignored  the ignored character to use
-     * @return this, to enable chaining
-     */
-    public StrTokenizer setIgnoredChar(final char ignored) {
-        return setIgnoredMatcher(StrMatcher.charMatcher(ignored));
-    }
-
-    // Trimmer
-    //-----------------------------------------------------------------------
-    /**
-     * Gets the trimmer character matcher.
-     * <p>
-     * These characters are trimmed off on each side of the delimiter
-     * until the token or quote is found.
-     * The default value is not to trim anything.
-     *
-     * @return the trimmer matcher in use
-     */
-    public StrMatcher getTrimmerMatcher() {
-        return trimmerMatcher;
-    }
-
-    /**
-     * Sets the matcher for characters to trim.
-     * <p>
-     * These characters are trimmed off on each side of the delimiter
-     * until the token or quote is found.
-     *
-     * @param trimmer  the trimmer matcher to use, null ignored
-     * @return this, to enable chaining
-     */
-    public StrTokenizer setTrimmerMatcher(final StrMatcher trimmer) {
-        if (trimmer != null) {
-            this.trimmerMatcher = trimmer;
-        }
-        return this;
-    }
-
-    //-----------------------------------------------------------------------
-    /**
-     * Gets whether the tokenizer currently returns empty tokens as null.
-     * The default for this property is false.
-     *
-     * @return true if empty tokens are returned as null
-     */
-    public boolean isEmptyTokenAsNull() {
-        return this.emptyAsNull;
-    }
-
-    /**
-     * Sets whether the tokenizer should return empty tokens as null.
-     * The default for this property is false.
-     *
-     * @param emptyAsNull  whether empty tokens are returned as null
-     * @return this, to enable chaining
-     */
-    public StrTokenizer setEmptyTokenAsNull(final boolean emptyAsNull) {
-        this.emptyAsNull = emptyAsNull;
-        return this;
-    }
-
-    //-----------------------------------------------------------------------
-    /**
-     * Gets whether the tokenizer currently ignores empty tokens.
-     * The default for this property is true.
-     *
-     * @return true if empty tokens are not returned
-     */
-    public boolean isIgnoreEmptyTokens() {
-        return ignoreEmptyTokens;
-    }
-
-    /**
-     * Sets whether the tokenizer should ignore and not return empty tokens.
-     * The default for this property is true.
-     *
-     * @param ignoreEmptyTokens  whether empty tokens are not returned
-     * @return this, to enable chaining
-     */
-    public StrTokenizer setIgnoreEmptyTokens(final boolean ignoreEmptyTokens) {
-        this.ignoreEmptyTokens = ignoreEmptyTokens;
-        return this;
-    }
-
-    //-----------------------------------------------------------------------
-    /**
-     * Gets the String content that the tokenizer is parsing.
-     *
-     * @return the string content being parsed
-     */
-    public String getContent() {
-        if (chars == null) {
-            return null;
-        }
-        return new String(chars);
-    }
-
-    //-----------------------------------------------------------------------
-    /**
-     * Creates a new instance of this Tokenizer. The new instance is reset so
-     * that it will be at the start of the token list.
-     * If a {@link CloneNotSupportedException} is caught, return <code>null</code>.
-     * 
-     * @return a new instance of this Tokenizer which has been reset.
-     */
-    @Override
-    public Object clone() {
-        try {
-            return cloneReset();
-        } catch (final CloneNotSupportedException ex) {
-            return null;
-        }
-    }
-
-    /**
-     * Creates a new instance of this Tokenizer. The new instance is reset so that
-     * it will be at the start of the token list.
-     * 
-     * @return a new instance of this Tokenizer which has been reset.
-     * @throws CloneNotSupportedException if there is a problem cloning
-     */
-    Object cloneReset() throws CloneNotSupportedException {
-        // this method exists to enable 100% test coverage
-        final StrTokenizer cloned = (StrTokenizer) super.clone();
-        if (cloned.chars != null) {
-            cloned.chars = cloned.chars.clone();
-        }
-        cloned.reset();
-        return cloned;
-    }
-
-    //-----------------------------------------------------------------------
-    /**
-     * Gets the String content that the tokenizer is parsing.
-     *
-     * @return the string content being parsed
-     */
-    @Override
-    public String toString() {
-        if (tokens == null) {
-            return "StrTokenizer[not tokenized yet]";
-        }
-        return "StrTokenizer" + getTokenList();
-    }
-
-}
diff --git a/lang/src/main/java/org/apache/commons/lang3/text/WordUtils.java b/lang/src/main/java/org/apache/commons/lang3/text/WordUtils.java
deleted file mode 100644
index ce21d92..0000000
--- a/lang/src/main/java/org/apache/commons/lang3/text/WordUtils.java
+++ /dev/null
@@ -1,585 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- * 
- *      http://www.apache.org/licenses/LICENSE-2.0
- * 
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.commons.lang3.text;
-
-import org.apache.commons.lang3.StringUtils;
-import org.apache.commons.lang3.SystemUtils;
-
-/**
- * <p>Operations on Strings that contain words.</p>
- * 
- * <p>This class tries to handle <code>null</code> input gracefully.
- * An exception will not be thrown for a <code>null</code> input.
- * Each method documents its behaviour in more detail.</p>
- * 
- * @since 2.0
- * @version $Id$
- */
-public class WordUtils {
-
-    /**
-     * <p><code>WordUtils</code> instances should NOT be constructed in
-     * standard programming. Instead, the class should be used as
-     * <code>WordUtils.wrap("foo bar", 20);</code>.</p>
-     *
-     * <p>This constructor is public to permit tools that require a JavaBean
-     * instance to operate.</p>
-     */
-    public WordUtils() {
-      super();
-    }
-
-    // Wrapping
-    //--------------------------------------------------------------------------
-    /**
-     * <p>Wraps a single line of text, identifying words by <code>' '</code>.</p>
-     * 
-     * <p>New lines will be separated by the system property line separator.
-     * Very long words, such as URLs will <i>not</i> be wrapped.</p>
-     * 
-     * <p>Leading spaces on a new line are stripped.
-     * Trailing spaces are not stripped.</p>
-     *
-     * <table border="1" summary="Wrap Results">
-     *  <tr>
-     *   <th>input</th>
-     *   <th>wrapLength</th>
-     *   <th>result</th>
-     *  </tr>
-     *  <tr>
-     *   <td>null</td>
-     *   <td>*</td>
-     *   <td>null</td>
-     *  </tr>
-     *  <tr>
-     *   <td>""</td>
-     *   <td>*</td>
-     *   <td>""</td>
-     *  </tr>
-     *  <tr>
-     *   <td>"Here is one line of text that is going to be wrapped after 20 columns."</td>
-     *   <td>20</td>
-     *   <td>"Here is one line of\ntext that is going\nto be wrapped after\n20 columns."</td>
-     *  </tr>
-     *  <tr>
-     *   <td>"Click here to jump to the commons website - http://commons.apache.org"</td>
-     *   <td>20</td>
-     *   <td>"Click here to jump\nto the commons\nwebsite -\nhttp://commons.apache.org"</td>
-     *  </tr>
-     *  <tr>
-     *   <td>"Click here, http://commons.apache.org, to jump to the commons website"</td>
-     *   <td>20</td>
-     *   <td>"Click here,\nhttp://commons.apache.org,\nto jump to the\ncommons website"</td>
-     *  </tr>
-     * </table>
-     *
-     * (assuming that '\n' is the systems line separator)
-     *
-     * @param str  the String to be word wrapped, may be null
-     * @param wrapLength  the column to wrap the words at, less than 1 is treated as 1
-     * @return a line with newlines inserted, <code>null</code> if null input
-     */
-    public static String wrap(final String str, final int wrapLength) {
-        return wrap(str, wrapLength, null, false);
-    }
-    
-    /**
-     * <p>Wraps a single line of text, identifying words by <code>' '</code>.</p>
-     * 
-     * <p>Leading spaces on a new line are stripped.
-     * Trailing spaces are not stripped.</p>
-     *
-     * <table border="1" summary="Wrap Results">
-     *  <tr>
-     *   <th>input</th>
-     *   <th>wrapLenght</th>
-     *   <th>newLineString</th>
-     *   <th>wrapLongWords</th>
-     *   <th>result</th>
-     *  </tr>
-     *  <tr>
-     *   <td>null</td>
-     *   <td>*</td>
-     *   <td>*</td>
-     *   <td>true/false</td>
-     *   <td>null</td>
-     *  </tr>
-     *  <tr>
-     *   <td>""</td>
-     *   <td>*</td>
-     *   <td>*</td>
-     *   <td>true/false</td>
-     *   <td>""</td>
-     *  </tr>
-     *  <tr>
-     *   <td>"Here is one line of text that is going to be wrapped after 20 columns."</td>
-     *   <td>20</td>
-     *   <td>"\n"</td>
-     *   <td>true/false</td>
-     *   <td>"Here is one line of\ntext that is going\nto be wrapped after\n20 columns."</td>
-     *  </tr>
-     *  <tr>
-     *   <td>"Here is one line of text that is going to be wrapped after 20 columns."</td>
-     *   <td>20</td>
-     *   <td>"&lt;br /&gt;"</td>
-     *   <td>true/false</td>
-     *   <td>"Here is one line of&lt;br /&gt;text that is going&lt;br /&gt;to be wrapped after&lt;br /&gt;20 columns."</td>
-     *  </tr>
-     *  <tr>
-     *   <td>"Here is one line of text that is going to be wrapped after 20 columns."</td>
-     *   <td>20</td>
-     *   <td>null</td>
-     *   <td>true/false</td>
-     *   <td>"Here is one line of" + systemNewLine + "text that is going" + systemNewLine + "to be wrapped after" + systemNewLine + "20 columns."</td>
-     *  </tr>
-     *  <tr>
-     *   <td>"Click here to jump to the commons website - http://commons.apache.org"</td>
-     *   <td>20</td>
-     *   <td>"\n"</td>
-     *   <td>false</td>
-     *   <td>"Click here to jump\nto the commons\nwebsite -\nhttp://commons.apache.org"</td>
-     *  </tr>
-     *  <tr>
-     *   <td>"Click here to jump to the commons website - http://commons.apache.org"</td>
-     *   <td>20</td>
-     *   <td>"\n"</td>
-     *   <td>true</td>
-     *   <td>"Click here to jump\nto the commons\nwebsite -\nhttp://commons.apach\ne.org"</td>
-     *  </tr>
-     * </table>
-     *
-     * @param str  the String to be word wrapped, may be null
-     * @param wrapLength  the column to wrap the words at, less than 1 is treated as 1
-     * @param newLineStr  the string to insert for a new line, 
-     *  <code>null</code> uses the system property line separator
-     * @param wrapLongWords  true if long words (such as URLs) should be wrapped
-     * @return a line with newlines inserted, <code>null</code> if null input
-     */
-    public static String wrap(final String str, int wrapLength, String newLineStr, final boolean wrapLongWords) {
-        if (str == null) {
-            return null;
-        }
-        if (newLineStr == null) {
-            newLineStr = SystemUtils.LINE_SEPARATOR;
-        }
-        if (wrapLength < 1) {
-            wrapLength = 1;
-        }
-        final int inputLineLength = str.length();
-        int offset = 0;
-        final StringBuilder wrappedLine = new StringBuilder(inputLineLength + 32);
-        
-        while (offset < inputLineLength) {
-            if (str.charAt(offset) == ' ') {
-                offset++;
-                continue;
-            }
-            // only last line without leading spaces is left
-            if(inputLineLength - offset <= wrapLength) {
-                break;
-            }
-            int spaceToWrapAt = str.lastIndexOf(' ', wrapLength + offset);
-
-            if (spaceToWrapAt >= offset) {
-                // normal case
-                wrappedLine.append(str.substring(offset, spaceToWrapAt));
-                wrappedLine.append(newLineStr);
-                offset = spaceToWrapAt + 1;
-                
-            } else {
-                // really long word or URL
-                if (wrapLongWords) {
-                    // wrap really long word one line at a time
-                    wrappedLine.append(str.substring(offset, wrapLength + offset));
-                    wrappedLine.append(newLineStr);
-                    offset += wrapLength;
-                } else {
-                    // do not wrap really long word, just extend beyond limit
-                    spaceToWrapAt = str.indexOf(' ', wrapLength + offset);
-                    if (spaceToWrapAt >= 0) {
-                        wrappedLine.append(str.substring(offset, spaceToWrapAt));
-                        wrappedLine.append(newLineStr);
-                        offset = spaceToWrapAt + 1;
-                    } else {
-                        wrappedLine.append(str.substring(offset));
-                        offset = inputLineLength;
-                    }
-                }
-            }
-        }
-
-        // Whatever is left in line is short enough to just pass through
-        wrappedLine.append(str.substring(offset));
-
-        return wrappedLine.toString();
-    }
-
-    // Capitalizing
-    //-----------------------------------------------------------------------
-    /**
-     * <p>Capitalizes all the whitespace separated words in a String.
-     * Only the first letter of each word is changed. To convert the 
-     * rest of each word to lowercase at the same time, 
-     * use {@link #capitalizeFully(String)}.</p>
-     *
-     * <p>Whitespace is defined by {@link Character#isWhitespace(char)}.
-     * A <code>null</code> input String returns <code>null</code>.
-     * Capitalization uses the Unicode title case, normally equivalent to
-     * upper case.</p>
-     *
-     * <pre>
-     * WordUtils.capitalize(null)        = null
-     * WordUtils.capitalize("")          = ""
-     * WordUtils.capitalize("i am FINE") = "I Am FINE"
-     * </pre>
-     * 
-     * @param str  the String to capitalize, may be null
-     * @return capitalized String, <code>null</code> if null String input
-     * @see #uncapitalize(String)
-     * @see #capitalizeFully(String)
-     */
-    public static String capitalize(final String str) {
-        return capitalize(str, null);
-    }
-
-    /**
-     * <p>Capitalizes all the delimiter separated words in a String.
-     * Only the first letter of each word is changed. To convert the 
-     * rest of each word to lowercase at the same time, 
-     * use {@link #capitalizeFully(String, char[])}.</p>
-     *
-     * <p>The delimiters represent a set of characters understood to separate words.
-     * The first string character and the first non-delimiter character after a
-     * delimiter will be capitalized. </p>
-     *
-     * <p>A <code>null</code> input String returns <code>null</code>.
-     * Capitalization uses the Unicode title case, normally equivalent to
-     * upper case.</p>
-     *
-     * <pre>
-     * WordUtils.capitalize(null, *)            = null
-     * WordUtils.capitalize("", *)              = ""
-     * WordUtils.capitalize(*, new char[0])     = *
-     * WordUtils.capitalize("i am fine", null)  = "I Am Fine"
-     * WordUtils.capitalize("i aM.fine", {'.'}) = "I aM.Fine"
-     * </pre>
-     * 
-     * @param str  the String to capitalize, may be null
-     * @param delimiters  set of characters to determine capitalization, null means whitespace
-     * @return capitalized String, <code>null</code> if null String input
-     * @see #uncapitalize(String)
-     * @see #capitalizeFully(String)
-     * @since 2.1
-     */
-    public static String capitalize(final String str, final char... delimiters) {
-        final int delimLen = delimiters == null ? -1 : delimiters.length;
-        if (StringUtils.isEmpty(str) || delimLen == 0) {
-            return str;
-        }
-        final char[] buffer = str.toCharArray();
-        boolean capitalizeNext = true;
-        for (int i = 0; i < buffer.length; i++) {
-            final char ch = buffer[i];
-            if (isDelimiter(ch, delimiters)) {
-                capitalizeNext = true;
-            } else if (capitalizeNext) {
-                buffer[i] = Character.toTitleCase(ch);
-                capitalizeNext = false;
-            }
-        }
-        return new String(buffer);
-    }
-
-    //-----------------------------------------------------------------------
-    /**
-     * <p>Converts all the whitespace separated words in a String into capitalized words, 
-     * that is each word is made up of a titlecase character and then a series of 
-     * lowercase characters.  </p>
-     *
-     * <p>Whitespace is defined by {@link Character#isWhitespace(char)}.
-     * A <code>null</code> input String returns <code>null</code>.
-     * Capitalization uses the Unicode title case, normally equivalent to
-     * upper case.</p>
-     *
-     * <pre>
-     * WordUtils.capitalizeFully(null)        = null
-     * WordUtils.capitalizeFully("")          = ""
-     * WordUtils.capitalizeFully("i am FINE") = "I Am Fine"
-     * </pre>
-     * 
-     * @param str  the String to capitalize, may be null
-     * @return capitalized String, <code>null</code> if null String input
-     */
-    public static String capitalizeFully(final String str) {
-        return capitalizeFully(str, null);
-    }
-
-    /**
-     * <p>Converts all the delimiter separated words in a String into capitalized words, 
-     * that is each word is made up of a titlecase character and then a series of 
-     * lowercase characters. </p>
-     *
-     * <p>The delimiters represent a set of characters understood to separate words.
-     * The first string character and the first non-delimiter character after a
-     * delimiter will be capitalized. </p>
-     *
-     * <p>A <code>null</code> input String returns <code>null</code>.
-     * Capitalization uses the Unicode title case, normally equivalent to
-     * upper case.</p>
-     *
-     * <pre>
-     * WordUtils.capitalizeFully(null, *)            = null
-     * WordUtils.capitalizeFully("", *)              = ""
-     * WordUtils.capitalizeFully(*, null)            = *
-     * WordUtils.capitalizeFully(*, new char[0])     = *
-     * WordUtils.capitalizeFully("i aM.fine", {'.'}) = "I am.Fine"
-     * </pre>
-     * 
-     * @param str  the String to capitalize, may be null
-     * @param delimiters  set of characters to determine capitalization, null means whitespace
-     * @return capitalized String, <code>null</code> if null String input
-     * @since 2.1
-     */
-    public static String capitalizeFully(String str, final char... delimiters) {
-        final int delimLen = delimiters == null ? -1 : delimiters.length;
-        if (StringUtils.isEmpty(str) || delimLen == 0) {
-            return str;
-        }
-        str = str.toLowerCase();
-        return capitalize(str, delimiters);
-    }
-
-    //-----------------------------------------------------------------------
-    /**
-     * <p>Uncapitalizes all the whitespace separated words in a String.
-     * Only the first letter of each word is changed.</p>
-     *
-     * <p>Whitespace is defined by {@link Character#isWhitespace(char)}.
-     * A <code>null</code> input String returns <code>null</code>.</p>
-     *
-     * <pre>
-     * WordUtils.uncapitalize(null)        = null
-     * WordUtils.uncapitalize("")          = ""
-     * WordUtils.uncapitalize("I Am FINE") = "i am fINE"
-     * </pre>
-     * 
-     * @param str  the String to uncapitalize, may be null
-     * @return uncapitalized String, <code>null</code> if null String input
-     * @see #capitalize(String)
-     */
-    public static String uncapitalize(final String str) {
-        return uncapitalize(str, null);
-    }
-
-    /**
-     * <p>Uncapitalizes all the whitespace separated words in a String.
-     * Only the first letter of each word is changed.</p>
-     *
-     * <p>The delimiters represent a set of characters understood to separate words.
-     * The first string character and the first non-delimiter character after a
-     * delimiter will be uncapitalized. </p>
-     *
-     * <p>Whitespace is defined by {@link Character#isWhitespace(char)}.
-     * A <code>null</code> input String returns <code>null</code>.</p>
-     *
-     * <pre>
-     * WordUtils.uncapitalize(null, *)            = null
-     * WordUtils.uncapitalize("", *)              = ""
-     * WordUtils.uncapitalize(*, null)            = *
-     * WordUtils.uncapitalize(*, new char[0])     = *
-     * WordUtils.uncapitalize("I AM.FINE", {'.'}) = "i AM.fINE"
-     * </pre>
-     * 
-     * @param str  the String to uncapitalize, may be null
-     * @param delimiters  set of characters to determine uncapitalization, null means whitespace
-     * @return uncapitalized String, <code>null</code> if null String input
-     * @see #capitalize(String)
-     * @since 2.1
-     */
-    public static String uncapitalize(final String str, final char... delimiters) {
-        final int delimLen = delimiters == null ? -1 : delimiters.length;
-        if (StringUtils.isEmpty(str) || delimLen == 0) {
-            return str;
-        }
-        final char[] buffer = str.toCharArray();
-        boolean uncapitalizeNext = true;
-        for (int i = 0; i < buffer.length; i++) {
-            final char ch = buffer[i];
-            if (isDelimiter(ch, delimiters)) {
-                uncapitalizeNext = true;
-            } else if (uncapitalizeNext) {
-                buffer[i] = Character.toLowerCase(ch);
-                uncapitalizeNext = false;
-            }
-        }
-        return new String(buffer);
-    }
-
-    //-----------------------------------------------------------------------
-    /**
-     * <p>Swaps the case of a String using a word based algorithm.</p>
-     * 
-     * <ul>
-     *  <li>Upper case character converts to Lower case</li>
-     *  <li>Title case character converts to Lower case</li>
-     *  <li>Lower case character after Whitespace or at start converts to Title case</li>
-     *  <li>Other Lower case character converts to Upper case</li>
-     * </ul>
-     * 
-     * <p>Whitespace is defined by {@link Character#isWhitespace(char)}.
-     * A <code>null</code> input String returns <code>null</code>.</p>
-     * 
-     * <pre>
-     * StringUtils.swapCase(null)                 = null
-     * StringUtils.swapCase("")                   = ""
-     * StringUtils.swapCase("The dog has a BONE") = "tHE DOG HAS A bone"
-     * </pre>
-     * 
-     * @param str  the String to swap case, may be null
-     * @return the changed String, <code>null</code> if null String input
-     */
-    public static String swapCase(final String str) {
-        if (StringUtils.isEmpty(str)) {
-            return str;
-        }
-        final char[] buffer = str.toCharArray();
-
-        boolean whitespace = true;
-
-        for (int i = 0; i < buffer.length; i++) {
-            final char ch = buffer[i];
-            if (Character.isUpperCase(ch)) {
-                buffer[i] = Character.toLowerCase(ch);
-                whitespace = false;
-            } else if (Character.isTitleCase(ch)) {
-                buffer[i] = Character.toLowerCase(ch);
-                whitespace = false;
-            } else if (Character.isLowerCase(ch)) {
-                if (whitespace) {
-                    buffer[i] = Character.toTitleCase(ch);
-                    whitespace = false;
-                } else {
-                    buffer[i] = Character.toUpperCase(ch);
-                }
-            } else {
-                whitespace = Character.isWhitespace(ch);
-            }
-        }
-        return new String(buffer);
-    }
-
-    //-----------------------------------------------------------------------
-    /**
-     * <p>Extracts the initial letters from each word in the String.</p>
-     * 
-     * <p>The first letter of the string and all first letters after
-     * whitespace are returned as a new string.
-     * Their case is not changed.</p>
-     *
-     * <p>Whitespace is defined by {@link Character#isWhitespace(char)}.
-     * A <code>null</code> input String returns <code>null</code>.</p>
-     *
-     * <pre>
-     * WordUtils.initials(null)             = null
-     * WordUtils.initials("")               = ""
-     * WordUtils.initials("Ben John Lee")   = "BJL"
-     * WordUtils.initials("Ben J.Lee")      = "BJ"
-     * </pre>
-     *
-     * @param str  the String to get initials from, may be null
-     * @return String of initial letters, <code>null</code> if null String input
-     * @see #initials(String,char[])
-     * @since 2.2
-     */
-    public static String initials(final String str) {
-        return initials(str, null);
-    }
-
-    /**
-     * <p>Extracts the initial letters from each word in the String.</p>
-     * 
-     * <p>The first letter of the string and all first letters after the
-     * defined delimiters are returned as a new string.
-     * Their case is not changed.</p>
-     *
-     * <p>If the delimiters array is null, then Whitespace is used.
-     * Whitespace is defined by {@link Character#isWhitespace(char)}.
-     * A <code>null</code> input String returns <code>null</code>.
-     * An empty delimiter array returns an empty String.</p>
-     *
-     * <pre>
-     * WordUtils.initials(null, *)                = null
-     * WordUtils.initials("", *)                  = ""
-     * WordUtils.initials("Ben John Lee", null)   = "BJL"
-     * WordUtils.initials("Ben J.Lee", null)      = "BJ"
-     * WordUtils.initials("Ben J.Lee", [' ','.']) = "BJL"
-     * WordUtils.initials(*, new char[0])         = ""
-     * </pre>
-     * 
-     * @param str  the String to get initials from, may be null
-     * @param delimiters  set of characters to determine words, null means whitespace
-     * @return String of initial letters, <code>null</code> if null String input
-     * @see #initials(String)
-     * @since 2.2
-     */
-    public static String initials(final String str, final char... delimiters) {
-        if (StringUtils.isEmpty(str)) {
-            return str;
-        }
-        if (delimiters != null && delimiters.length == 0) {
-            return "";
-        }
-        final int strLen = str.length();
-        final char[] buf = new char[strLen / 2 + 1];
-        int count = 0;
-        boolean lastWasGap = true;
-        for (int i = 0; i < strLen; i++) {
-            final char ch = str.charAt(i);
-
-            if (isDelimiter(ch, delimiters)) {
-                lastWasGap = true;
-            } else if (lastWasGap) {
-                buf[count++] = ch;
-                lastWasGap = false;
-            } else {
-                continue; // ignore ch
-            }
-        }
-        return new String(buf, 0, count);
-    }
-
-    //-----------------------------------------------------------------------
-    /**
-     * Is the character a delimiter.
-     *
-     * @param ch  the character to check
-     * @param delimiters  the delimiters
-     * @return true if it is a delimiter
-     */
-    private static boolean isDelimiter(final char ch, final char[] delimiters) {
-        if (delimiters == null) {
-            return Character.isWhitespace(ch);
-        }
-        for (final char delimiter : delimiters) {
-            if (ch == delimiter) {
-                return true;
-            }
-        }
-        return false;
-    }
-
-}
diff --git a/lang/src/main/java/org/apache/commons/lang3/text/package-info.java b/lang/src/main/java/org/apache/commons/lang3/text/package-info.java
deleted file mode 100644
index 051d727..0000000
--- a/lang/src/main/java/org/apache/commons/lang3/text/package-info.java
+++ /dev/null
@@ -1,28 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-/**
- * <p> Provides classes for handling and manipulating text, partly as an extension to {@link java.text}.
- * The classes in this package are, for the most part, intended to be instantiated (i.e. they are not utility classes
- * with lots of static methods). </p>
- *
- * <p>Amongst other classes, the text package provides a replacement for {@link java.lang.StringBuffer} named {@link org.apache.commons.lang3.text.StrBuilder}, a class for substituting variables within a String named {@link org.apache.commons.lang3.text.StrSubstitutor} and a replacement for {@link java.util.StringTokenizer} named {@link org.apache.commons.lang3.text.StrTokenizer}.
- * While somewhat ungainly, the <code>Str</code> prefix has been used to ensure we don't clash with any current or future standard Java classes. </p>
- *
- * @since 2.1
- * @version $Id$
- */
-package org.apache.commons.lang3.text;
diff --git a/lang/src/main/java/org/apache/commons/lang3/text/translate/AggregateTranslator.java b/lang/src/main/java/org/apache/commons/lang3/text/translate/AggregateTranslator.java
deleted file mode 100644
index 51e4e1d..0000000
--- a/lang/src/main/java/org/apache/commons/lang3/text/translate/AggregateTranslator.java
+++ /dev/null
@@ -1,60 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- * 
- *      http://www.apache.org/licenses/LICENSE-2.0
- * 
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.commons.lang3.text.translate;
-
-import java.io.IOException;
-import java.io.Writer;
-
-import org.apache.commons.lang3.ArrayUtils;
-
-/**
- * Executes a sequence of translators one after the other. Execution ends whenever 
- * the first translator consumes codepoints from the input.
- * 
- * @since 3.0
- * @version $Id$
- */
-public class AggregateTranslator extends CharSequenceTranslator {
-
-    private final CharSequenceTranslator[] translators;
-
-    /**
-     * Specify the translators to be used at creation time. 
-     *
-     * @param translators CharSequenceTranslator array to aggregate
-     */
-    public AggregateTranslator(final CharSequenceTranslator... translators) {
-        this.translators = ArrayUtils.clone(translators);
-    }
-
-    /**
-     * The first translator to consume codepoints from the input is the 'winner'. 
-     * Execution stops with the number of consumed codepoints being returned. 
-     * {@inheritDoc}
-     */
-    @Override
-    public int translate(final CharSequence input, final int index, final Writer out) throws IOException {
-        for (final CharSequenceTranslator translator : translators) {
-            final int consumed = translator.translate(input, index, out);
-            if(consumed != 0) {
-                return consumed;
-            }
-        }
-        return 0;
-    }
-
-}
diff --git a/lang/src/main/java/org/apache/commons/lang3/text/translate/CharSequenceTranslator.java b/lang/src/main/java/org/apache/commons/lang3/text/translate/CharSequenceTranslator.java
deleted file mode 100644
index 17e73b6..0000000
--- a/lang/src/main/java/org/apache/commons/lang3/text/translate/CharSequenceTranslator.java
+++ /dev/null
@@ -1,136 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- * 
- *      http://www.apache.org/licenses/LICENSE-2.0
- * 
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.commons.lang3.text.translate;
-
-import java.io.IOException;
-import java.io.StringWriter;
-import java.io.Writer;
-import java.util.Locale;
-
-/**
- * An API for translating text. 
- * Its core use is to escape and unescape text. Because escaping and unescaping 
- * is completely contextual, the API does not present two separate signatures.
- * 
- * @since 3.0
- * @version $Id$
- */
-public abstract class CharSequenceTranslator {
-
-    static final char[] HEX_DIGITS = new char[] {'0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F'};
-
-    /**
-     * Translate a set of codepoints, represented by an int index into a CharSequence, 
-     * into another set of codepoints. The number of codepoints consumed must be returned, 
-     * and the only IOExceptions thrown must be from interacting with the Writer so that 
-     * the top level API may reliably ignore StringWriter IOExceptions. 
-     *
-     * @param input CharSequence that is being translated
-     * @param index int representing the current point of translation
-     * @param out Writer to translate the text to
-     * @return int count of codepoints consumed
-     * @throws IOException if and only if the Writer produces an IOException
-     */
-    public abstract int translate(CharSequence input, int index, Writer out) throws IOException;
-
-    /**
-     * Helper for non-Writer usage. 
-     * @param input CharSequence to be translated
-     * @return String output of translation
-     */
-    public final String translate(final CharSequence input) {
-        if (input == null) {
-            return null;
-        }
-        try {
-            final StringWriter writer = new StringWriter(input.length() * 2);
-            translate(input, writer);
-            return writer.toString();
-        } catch (final IOException ioe) {
-            // this should never ever happen while writing to a StringWriter
-            throw new RuntimeException(ioe);
-        }
-    }
-
-    /**
-     * Translate an input onto a Writer. This is intentionally final as its algorithm is 
-     * tightly coupled with the abstract method of this class. 
-     *
-     * @param input CharSequence that is being translated
-     * @param out Writer to translate the text to
-     * @throws IOException if and only if the Writer produces an IOException
-     */
-    public final void translate(final CharSequence input, final Writer out) throws IOException {
-        if (out == null) {
-            throw new IllegalArgumentException("The Writer must not be null");
-        }
-        if (input == null) {
-            return;
-        }
-        int pos = 0;
-        final int len = input.length();
-        while (pos < len) {
-            final int consumed = translate(input, pos, out);
-            if (consumed == 0) {
-                // inlined implementation of Character.toChars(Character.codePointAt(input, pos))
-                // avoids allocating temp char arrays and duplicate checks
-                char c1 = input.charAt(pos);
-                out.write(c1);
-                pos++;
-                if (Character.isHighSurrogate(c1) && pos < len) {
-                    char c2 = input.charAt(pos);
-                    if (Character.isLowSurrogate(c2)) {
-                      out.write(c2);
-                      pos++;
-                    }
-                }
-                continue;
-            }
-            // contract with translators is that they have to understand codepoints
-            // and they just took care of a surrogate pair
-            for (int pt = 0; pt < consumed; pt++) {
-                pos += Character.charCount(Character.codePointAt(input, pos));
-            }
-        }
-    }
-
-    /**
-     * Helper method to create a merger of this translator with another set of 
-     * translators. Useful in customizing the standard functionality.
-     *
-     * @param translators CharSequenceTranslator array of translators to merge with this one
-     * @return CharSequenceTranslator merging this translator with the others
-     */
-    public final CharSequenceTranslator with(final CharSequenceTranslator... translators) {
-        final CharSequenceTranslator[] newArray = new CharSequenceTranslator[translators.length + 1];
-        newArray[0] = this;
-        System.arraycopy(translators, 0, newArray, 1, translators.length);
-        return new AggregateTranslator(newArray);
-    }
-
-    /**
-     * <p>Returns an upper case hexadecimal <code>String</code> for the given
-     * character.</p>
-     *
-     * @param codepoint The codepoint to convert.
-     * @return An upper case hexadecimal <code>String</code>
-     */
-    public static String hex(final int codepoint) {
-        return Integer.toHexString(codepoint).toUpperCase(Locale.ENGLISH);
-    }
-
-}
diff --git a/lang/src/main/java/org/apache/commons/lang3/text/translate/CodePointTranslator.java b/lang/src/main/java/org/apache/commons/lang3/text/translate/CodePointTranslator.java
deleted file mode 100644
index 5a87806..0000000
--- a/lang/src/main/java/org/apache/commons/lang3/text/translate/CodePointTranslator.java
+++ /dev/null
@@ -1,52 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- * 
- *      http://www.apache.org/licenses/LICENSE-2.0
- * 
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.commons.lang3.text.translate;
-
-import java.io.IOException;
-import java.io.Writer;
-
-/**
- * Helper subclass to CharSequenceTranslator to allow for translations that 
- * will replace up to one character at a time.
- * 
- * @since 3.0
- * @version $Id$
- */
-public abstract class CodePointTranslator extends CharSequenceTranslator {
-
-    /**
-     * Implementation of translate that maps onto the abstract translate(int, Writer) method. 
-     * {@inheritDoc}
-     */
-    @Override
-    public final int translate(final CharSequence input, final int index, final Writer out) throws IOException {
-        final int codepoint = Character.codePointAt(input, index);
-        final boolean consumed = translate(codepoint, out);
-        return consumed ? 1 : 0; 
-    }
-
-    /**
-     * Translate the specified codepoint into another. 
-     * 
-     * @param codepoint int character input to translate
-     * @param out Writer to optionally push the translated output to
-     * @return boolean as to whether translation occurred or not
-     * @throws IOException if and only if the Writer produces an IOException
-     */
-    public abstract boolean translate(int codepoint, Writer out) throws IOException;
-
-}
diff --git a/lang/src/main/java/org/apache/commons/lang3/text/translate/EntityArrays.java b/lang/src/main/java/org/apache/commons/lang3/text/translate/EntityArrays.java
deleted file mode 100644
index 2369575..0000000
--- a/lang/src/main/java/org/apache/commons/lang3/text/translate/EntityArrays.java
+++ /dev/null
@@ -1,425 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.commons.lang3.text.translate;
-
-/**
- * Class holding various entity data for HTML and XML - generally for use with
- * the LookupTranslator.
- * All arrays are of length [*][2].
- *
- * @since 3.0
- * @version $Id$
- */
-public class EntityArrays {
-
-    /**
-     * Mapping to escape <a href="https://secure.wikimedia.org/wikipedia/en/wiki/ISO/IEC_8859-1">ISO-8859-1</a>
-     * characters to their named HTML 3.x equivalents.
-     * @return the mapping table
-     */
-    public static String[][] ISO8859_1_ESCAPE() { return ISO8859_1_ESCAPE.clone(); }
-    private static final String[][] ISO8859_1_ESCAPE = {
-        {"\u00A0", "&nbsp;"}, // non-breaking space
-        {"\u00A1", "&iexcl;"}, // inverted exclamation mark
-        {"\u00A2", "&cent;"}, // cent sign
-        {"\u00A3", "&pound;"}, // pound sign
-        {"\u00A4", "&curren;"}, // currency sign
-        {"\u00A5", "&yen;"}, // yen sign = yuan sign
-        {"\u00A6", "&brvbar;"}, // broken bar = broken vertical bar
-        {"\u00A7", "&sect;"}, // section sign
-        {"\u00A8", "&uml;"}, // diaeresis = spacing diaeresis
-        {"\u00A9", "&copy;"}, // © - copyright sign
-        {"\u00AA", "&ordf;"}, // feminine ordinal indicator
-        {"\u00AB", "&laquo;"}, // left-pointing double angle quotation mark = left pointing guillemet
-        {"\u00AC", "&not;"}, // not sign
-        {"\u00AD", "&shy;"}, // soft hyphen = discretionary hyphen
-        {"\u00AE", "&reg;"}, // ® - registered trademark sign
-        {"\u00AF", "&macr;"}, // macron = spacing macron = overline = APL overbar
-        {"\u00B0", "&deg;"}, // degree sign
-        {"\u00B1", "&plusmn;"}, // plus-minus sign = plus-or-minus sign
-        {"\u00B2", "&sup2;"}, // superscript two = superscript digit two = squared
-        {"\u00B3", "&sup3;"}, // superscript three = superscript digit three = cubed
-        {"\u00B4", "&acute;"}, // acute accent = spacing acute
-        {"\u00B5", "&micro;"}, // micro sign
-        {"\u00B6", "&para;"}, // pilcrow sign = paragraph sign
-        {"\u00B7", "&middot;"}, // middle dot = Georgian comma = Greek middle dot
-        {"\u00B8", "&cedil;"}, // cedilla = spacing cedilla
-        {"\u00B9", "&sup1;"}, // superscript one = superscript digit one
-        {"\u00BA", "&ordm;"}, // masculine ordinal indicator
-        {"\u00BB", "&raquo;"}, // right-pointing double angle quotation mark = right pointing guillemet
-        {"\u00BC", "&frac14;"}, // vulgar fraction one quarter = fraction one quarter
-        {"\u00BD", "&frac12;"}, // vulgar fraction one half = fraction one half
-        {"\u00BE", "&frac34;"}, // vulgar fraction three quarters = fraction three quarters
-        {"\u00BF", "&iquest;"}, // inverted question mark = turned question mark
-        {"\u00C0", "&Agrave;"}, // À - uppercase A, grave accent
-        {"\u00C1", "&Aacute;"}, // Á - uppercase A, acute accent
-        {"\u00C2", "&Acirc;"}, // Â - uppercase A, circumflex accent
-        {"\u00C3", "&Atilde;"}, // Ã - uppercase A, tilde
-        {"\u00C4", "&Auml;"}, // Ä - uppercase A, umlaut
-        {"\u00C5", "&Aring;"}, // Å - uppercase A, ring
-        {"\u00C6", "&AElig;"}, // Æ - uppercase AE
-        {"\u00C7", "&Ccedil;"}, // Ç - uppercase C, cedilla
-        {"\u00C8", "&Egrave;"}, // È - uppercase E, grave accent
-        {"\u00C9", "&Eacute;"}, // É - uppercase E, acute accent
-        {"\u00CA", "&Ecirc;"}, // Ê - uppercase E, circumflex accent
-        {"\u00CB", "&Euml;"}, // Ë - uppercase E, umlaut
-        {"\u00CC", "&Igrave;"}, // Ì - uppercase I, grave accent
-        {"\u00CD", "&Iacute;"}, // Í - uppercase I, acute accent
-        {"\u00CE", "&Icirc;"}, // Î - uppercase I, circumflex accent
-        {"\u00CF", "&Iuml;"}, // Ï - uppercase I, umlaut
-        {"\u00D0", "&ETH;"}, // Ð - uppercase Eth, Icelandic
-        {"\u00D1", "&Ntilde;"}, // Ñ - uppercase N, tilde
-        {"\u00D2", "&Ograve;"}, // Ò - uppercase O, grave accent
-        {"\u00D3", "&Oacute;"}, // Ó - uppercase O, acute accent
-        {"\u00D4", "&Ocirc;"}, // Ô - uppercase O, circumflex accent
-        {"\u00D5", "&Otilde;"}, // Õ - uppercase O, tilde
-        {"\u00D6", "&Ouml;"}, // Ö - uppercase O, umlaut
-        {"\u00D7", "&times;"}, // multiplication sign
-        {"\u00D8", "&Oslash;"}, // Ø - uppercase O, slash
-        {"\u00D9", "&Ugrave;"}, // Ù - uppercase U, grave accent
-        {"\u00DA", "&Uacute;"}, // Ú - uppercase U, acute accent
-        {"\u00DB", "&Ucirc;"}, // Û - uppercase U, circumflex accent
-        {"\u00DC", "&Uuml;"}, // Ü - uppercase U, umlaut
-        {"\u00DD", "&Yacute;"}, // Ý - uppercase Y, acute accent
-        {"\u00DE", "&THORN;"}, // Þ - uppercase THORN, Icelandic
-        {"\u00DF", "&szlig;"}, // ß - lowercase sharps, German
-        {"\u00E0", "&agrave;"}, // à - lowercase a, grave accent
-        {"\u00E1", "&aacute;"}, // á - lowercase a, acute accent
-        {"\u00E2", "&acirc;"}, // â - lowercase a, circumflex accent
-        {"\u00E3", "&atilde;"}, // ã - lowercase a, tilde
-        {"\u00E4", "&auml;"}, // ä - lowercase a, umlaut
-        {"\u00E5", "&aring;"}, // å - lowercase a, ring
-        {"\u00E6", "&aelig;"}, // æ - lowercase ae
-        {"\u00E7", "&ccedil;"}, // ç - lowercase c, cedilla
-        {"\u00E8", "&egrave;"}, // è - lowercase e, grave accent
-        {"\u00E9", "&eacute;"}, // é - lowercase e, acute accent
-        {"\u00EA", "&ecirc;"}, // ê - lowercase e, circumflex accent
-        {"\u00EB", "&euml;"}, // ë - lowercase e, umlaut
-        {"\u00EC", "&igrave;"}, // ì - lowercase i, grave accent
-        {"\u00ED", "&iacute;"}, // í - lowercase i, acute accent
-        {"\u00EE", "&icirc;"}, // î - lowercase i, circumflex accent
-        {"\u00EF", "&iuml;"}, // ï - lowercase i, umlaut
-        {"\u00F0", "&eth;"}, // ð - lowercase eth, Icelandic
-        {"\u00F1", "&ntilde;"}, // ñ - lowercase n, tilde
-        {"\u00F2", "&ograve;"}, // ò - lowercase o, grave accent
-        {"\u00F3", "&oacute;"}, // ó - lowercase o, acute accent
-        {"\u00F4", "&ocirc;"}, // ô - lowercase o, circumflex accent
-        {"\u00F5", "&otilde;"}, // õ - lowercase o, tilde
-        {"\u00F6", "&ouml;"}, // ö - lowercase o, umlaut
-        {"\u00F7", "&divide;"}, // division sign
-        {"\u00F8", "&oslash;"}, // ø - lowercase o, slash
-        {"\u00F9", "&ugrave;"}, // ù - lowercase u, grave accent
-        {"\u00FA", "&uacute;"}, // ú - lowercase u, acute accent
-        {"\u00FB", "&ucirc;"}, // û - lowercase u, circumflex accent
-        {"\u00FC", "&uuml;"}, // ü - lowercase u, umlaut
-        {"\u00FD", "&yacute;"}, // ý - lowercase y, acute accent
-        {"\u00FE", "&thorn;"}, // þ - lowercase thorn, Icelandic
-        {"\u00FF", "&yuml;"}, // ÿ - lowercase y, umlaut
-    };
-
-    /**
-     * Reverse of {@link #ISO8859_1_ESCAPE()} for unescaping purposes.
-     * @return the mapping table
-     */
-    public static String[][] ISO8859_1_UNESCAPE() { return ISO8859_1_UNESCAPE.clone(); }
-    private static final String[][] ISO8859_1_UNESCAPE = invert(ISO8859_1_ESCAPE);
-
-    /**
-     * Mapping to escape additional <a href="http://www.w3.org/TR/REC-html40/sgml/entities.html">character entity
-     * references</a>. Note that this must be used with {@link #ISO8859_1_ESCAPE()} to get the full list of
-     * HTML 4.0 character entities.
-     * @return the mapping table
-     */
-    public static String[][] HTML40_EXTENDED_ESCAPE() { return HTML40_EXTENDED_ESCAPE.clone(); }
-    private static final String[][] HTML40_EXTENDED_ESCAPE = {
-        // <!-- Latin Extended-B -->
-        {"\u0192", "&fnof;"}, // latin small f with hook = function= florin, U+0192 ISOtech -->
-        // <!-- Greek -->
-        {"\u0391", "&Alpha;"}, // greek capital letter alpha, U+0391 -->
-        {"\u0392", "&Beta;"}, // greek capital letter beta, U+0392 -->
-        {"\u0393", "&Gamma;"}, // greek capital letter gamma,U+0393 ISOgrk3 -->
-        {"\u0394", "&Delta;"}, // greek capital letter delta,U+0394 ISOgrk3 -->
-        {"\u0395", "&Epsilon;"}, // greek capital letter epsilon, U+0395 -->
-        {"\u0396", "&Zeta;"}, // greek capital letter zeta, U+0396 -->
-        {"\u0397", "&Eta;"}, // greek capital letter eta, U+0397 -->
-        {"\u0398", "&Theta;"}, // greek capital letter theta,U+0398 ISOgrk3 -->
-        {"\u0399", "&Iota;"}, // greek capital letter iota, U+0399 -->
-        {"\u039A", "&Kappa;"}, // greek capital letter kappa, U+039A -->
-        {"\u039B", "&Lambda;"}, // greek capital letter lambda,U+039B ISOgrk3 -->
-        {"\u039C", "&Mu;"}, // greek capital letter mu, U+039C -->
-        {"\u039D", "&Nu;"}, // greek capital letter nu, U+039D -->
-        {"\u039E", "&Xi;"}, // greek capital letter xi, U+039E ISOgrk3 -->
-        {"\u039F", "&Omicron;"}, // greek capital letter omicron, U+039F -->
-        {"\u03A0", "&Pi;"}, // greek capital letter pi, U+03A0 ISOgrk3 -->
-        {"\u03A1", "&Rho;"}, // greek capital letter rho, U+03A1 -->
-        // <!-- there is no Sigmaf, and no U+03A2 character either -->
-        {"\u03A3", "&Sigma;"}, // greek capital letter sigma,U+03A3 ISOgrk3 -->
-        {"\u03A4", "&Tau;"}, // greek capital letter tau, U+03A4 -->
-        {"\u03A5", "&Upsilon;"}, // greek capital letter upsilon,U+03A5 ISOgrk3 -->
-        {"\u03A6", "&Phi;"}, // greek capital letter phi,U+03A6 ISOgrk3 -->
-        {"\u03A7", "&Chi;"}, // greek capital letter chi, U+03A7 -->
-        {"\u03A8", "&Psi;"}, // greek capital letter psi,U+03A8 ISOgrk3 -->
-        {"\u03A9", "&Omega;"}, // greek capital letter omega,U+03A9 ISOgrk3 -->
-        {"\u03B1", "&alpha;"}, // greek small letter alpha,U+03B1 ISOgrk3 -->
-        {"\u03B2", "&beta;"}, // greek small letter beta, U+03B2 ISOgrk3 -->
-        {"\u03B3", "&gamma;"}, // greek small letter gamma,U+03B3 ISOgrk3 -->
-        {"\u03B4", "&delta;"}, // greek small letter delta,U+03B4 ISOgrk3 -->
-        {"\u03B5", "&epsilon;"}, // greek small letter epsilon,U+03B5 ISOgrk3 -->
-        {"\u03B6", "&zeta;"}, // greek small letter zeta, U+03B6 ISOgrk3 -->
-        {"\u03B7", "&eta;"}, // greek small letter eta, U+03B7 ISOgrk3 -->
-        {"\u03B8", "&theta;"}, // greek small letter theta,U+03B8 ISOgrk3 -->
-        {"\u03B9", "&iota;"}, // greek small letter iota, U+03B9 ISOgrk3 -->
-        {"\u03BA", "&kappa;"}, // greek small letter kappa,U+03BA ISOgrk3 -->
-        {"\u03BB", "&lambda;"}, // greek small letter lambda,U+03BB ISOgrk3 -->
-        {"\u03BC", "&mu;"}, // greek small letter mu, U+03BC ISOgrk3 -->
-        {"\u03BD", "&nu;"}, // greek small letter nu, U+03BD ISOgrk3 -->
-        {"\u03BE", "&xi;"}, // greek small letter xi, U+03BE ISOgrk3 -->
-        {"\u03BF", "&omicron;"}, // greek small letter omicron, U+03BF NEW -->
-        {"\u03C0", "&pi;"}, // greek small letter pi, U+03C0 ISOgrk3 -->
-        {"\u03C1", "&rho;"}, // greek small letter rho, U+03C1 ISOgrk3 -->
-        {"\u03C2", "&sigmaf;"}, // greek small letter final sigma,U+03C2 ISOgrk3 -->
-        {"\u03C3", "&sigma;"}, // greek small letter sigma,U+03C3 ISOgrk3 -->
-        {"\u03C4", "&tau;"}, // greek small letter tau, U+03C4 ISOgrk3 -->
-        {"\u03C5", "&upsilon;"}, // greek small letter upsilon,U+03C5 ISOgrk3 -->
-        {"\u03C6", "&phi;"}, // greek small letter phi, U+03C6 ISOgrk3 -->
-        {"\u03C7", "&chi;"}, // greek small letter chi, U+03C7 ISOgrk3 -->
-        {"\u03C8", "&psi;"}, // greek small letter psi, U+03C8 ISOgrk3 -->
-        {"\u03C9", "&omega;"}, // greek small letter omega,U+03C9 ISOgrk3 -->
-        {"\u03D1", "&thetasym;"}, // greek small letter theta symbol,U+03D1 NEW -->
-        {"\u03D2", "&upsih;"}, // greek upsilon with hook symbol,U+03D2 NEW -->
-        {"\u03D6", "&piv;"}, // greek pi symbol, U+03D6 ISOgrk3 -->
-        // <!-- General Punctuation -->
-        {"\u2022", "&bull;"}, // bullet = black small circle,U+2022 ISOpub -->
-        // <!-- bullet is NOT the same as bullet operator, U+2219 -->
-        {"\u2026", "&hellip;"}, // horizontal ellipsis = three dot leader,U+2026 ISOpub -->
-        {"\u2032", "&prime;"}, // prime = minutes = feet, U+2032 ISOtech -->
-        {"\u2033", "&Prime;"}, // double prime = seconds = inches,U+2033 ISOtech -->
-        {"\u203E", "&oline;"}, // overline = spacing overscore,U+203E NEW -->
-        {"\u2044", "&frasl;"}, // fraction slash, U+2044 NEW -->
-        // <!-- Letterlike Symbols -->
-        {"\u2118", "&weierp;"}, // script capital P = power set= Weierstrass p, U+2118 ISOamso -->
-        {"\u2111", "&image;"}, // blackletter capital I = imaginary part,U+2111 ISOamso -->
-        {"\u211C", "&real;"}, // blackletter capital R = real part symbol,U+211C ISOamso -->
-        {"\u2122", "&trade;"}, // trade mark sign, U+2122 ISOnum -->
-        {"\u2135", "&alefsym;"}, // alef symbol = first transfinite cardinal,U+2135 NEW -->
-        // <!-- alef symbol is NOT the same as hebrew letter alef,U+05D0 although the
-        // same glyph could be used to depict both characters -->
-        // <!-- Arrows -->
-        {"\u2190", "&larr;"}, // leftwards arrow, U+2190 ISOnum -->
-        {"\u2191", "&uarr;"}, // upwards arrow, U+2191 ISOnum-->
-        {"\u2192", "&rarr;"}, // rightwards arrow, U+2192 ISOnum -->
-        {"\u2193", "&darr;"}, // downwards arrow, U+2193 ISOnum -->
-        {"\u2194", "&harr;"}, // left right arrow, U+2194 ISOamsa -->
-        {"\u21B5", "&crarr;"}, // downwards arrow with corner leftwards= carriage return, U+21B5 NEW -->
-        {"\u21D0", "&lArr;"}, // leftwards double arrow, U+21D0 ISOtech -->
-        // <!-- ISO 10646 does not say that lArr is the same as the 'is implied by'
-        // arrow but also does not have any other character for that function.
-        // So ? lArr canbe used for 'is implied by' as ISOtech suggests -->
-        {"\u21D1", "&uArr;"}, // upwards double arrow, U+21D1 ISOamsa -->
-        {"\u21D2", "&rArr;"}, // rightwards double arrow,U+21D2 ISOtech -->
-        // <!-- ISO 10646 does not say this is the 'implies' character but does not
-        // have another character with this function so ?rArr can be used for
-        // 'implies' as ISOtech suggests -->
-        {"\u21D3", "&dArr;"}, // downwards double arrow, U+21D3 ISOamsa -->
-        {"\u21D4", "&hArr;"}, // left right double arrow,U+21D4 ISOamsa -->
-        // <!-- Mathematical Operators -->
-        {"\u2200", "&forall;"}, // for all, U+2200 ISOtech -->
-        {"\u2202", "&part;"}, // partial differential, U+2202 ISOtech -->
-        {"\u2203", "&exist;"}, // there exists, U+2203 ISOtech -->
-        {"\u2205", "&empty;"}, // empty set = null set = diameter,U+2205 ISOamso -->
-        {"\u2207", "&nabla;"}, // nabla = backward difference,U+2207 ISOtech -->
-        {"\u2208", "&isin;"}, // element of, U+2208 ISOtech -->
-        {"\u2209", "&notin;"}, // not an element of, U+2209 ISOtech -->
-        {"\u220B", "&ni;"}, // contains as member, U+220B ISOtech -->
-        // <!-- should there be a more memorable name than 'ni'? -->
-        {"\u220F", "&prod;"}, // n-ary product = product sign,U+220F ISOamsb -->
-        // <!-- prod is NOT the same character as U+03A0 'greek capital letter pi'
-        // though the same glyph might be used for both -->
-        {"\u2211", "&sum;"}, // n-ary summation, U+2211 ISOamsb -->
-        // <!-- sum is NOT the same character as U+03A3 'greek capital letter sigma'
-        // though the same glyph might be used for both -->
-        {"\u2212", "&minus;"}, // minus sign, U+2212 ISOtech -->
-        {"\u2217", "&lowast;"}, // asterisk operator, U+2217 ISOtech -->
-        {"\u221A", "&radic;"}, // square root = radical sign,U+221A ISOtech -->
-        {"\u221D", "&prop;"}, // proportional to, U+221D ISOtech -->
-        {"\u221E", "&infin;"}, // infinity, U+221E ISOtech -->
-        {"\u2220", "&ang;"}, // angle, U+2220 ISOamso -->
-        {"\u2227", "&and;"}, // logical and = wedge, U+2227 ISOtech -->
-        {"\u2228", "&or;"}, // logical or = vee, U+2228 ISOtech -->
-        {"\u2229", "&cap;"}, // intersection = cap, U+2229 ISOtech -->
-        {"\u222A", "&cup;"}, // union = cup, U+222A ISOtech -->
-        {"\u222B", "&int;"}, // integral, U+222B ISOtech -->
-        {"\u2234", "&there4;"}, // therefore, U+2234 ISOtech -->
-        {"\u223C", "&sim;"}, // tilde operator = varies with = similar to,U+223C ISOtech -->
-        // <!-- tilde operator is NOT the same character as the tilde, U+007E,although
-        // the same glyph might be used to represent both -->
-        {"\u2245", "&cong;"}, // approximately equal to, U+2245 ISOtech -->
-        {"\u2248", "&asymp;"}, // almost equal to = asymptotic to,U+2248 ISOamsr -->
-        {"\u2260", "&ne;"}, // not equal to, U+2260 ISOtech -->
-        {"\u2261", "&equiv;"}, // identical to, U+2261 ISOtech -->
-        {"\u2264", "&le;"}, // less-than or equal to, U+2264 ISOtech -->
-        {"\u2265", "&ge;"}, // greater-than or equal to,U+2265 ISOtech -->
-        {"\u2282", "&sub;"}, // subset of, U+2282 ISOtech -->
-        {"\u2283", "&sup;"}, // superset of, U+2283 ISOtech -->
-        // <!-- note that nsup, 'not a superset of, U+2283' is not covered by the
-        // Symbol font encoding and is not included. Should it be, for symmetry?
-        // It is in ISOamsn --> <!ENTITY nsub", "8836"},
-        // not a subset of, U+2284 ISOamsn -->
-        {"\u2286", "&sube;"}, // subset of or equal to, U+2286 ISOtech -->
-        {"\u2287", "&supe;"}, // superset of or equal to,U+2287 ISOtech -->
-        {"\u2295", "&oplus;"}, // circled plus = direct sum,U+2295 ISOamsb -->
-        {"\u2297", "&otimes;"}, // circled times = vector product,U+2297 ISOamsb -->
-        {"\u22A5", "&perp;"}, // up tack = orthogonal to = perpendicular,U+22A5 ISOtech -->
-        {"\u22C5", "&sdot;"}, // dot operator, U+22C5 ISOamsb -->
-        // <!-- dot operator is NOT the same character as U+00B7 middle dot -->
-        // <!-- Miscellaneous Technical -->
-        {"\u2308", "&lceil;"}, // left ceiling = apl upstile,U+2308 ISOamsc -->
-        {"\u2309", "&rceil;"}, // right ceiling, U+2309 ISOamsc -->
-        {"\u230A", "&lfloor;"}, // left floor = apl downstile,U+230A ISOamsc -->
-        {"\u230B", "&rfloor;"}, // right floor, U+230B ISOamsc -->
-        {"\u2329", "&lang;"}, // left-pointing angle bracket = bra,U+2329 ISOtech -->
-        // <!-- lang is NOT the same character as U+003C 'less than' or U+2039 'single left-pointing angle quotation
-        // mark' -->
-        {"\u232A", "&rang;"}, // right-pointing angle bracket = ket,U+232A ISOtech -->
-        // <!-- rang is NOT the same character as U+003E 'greater than' or U+203A
-        // 'single right-pointing angle quotation mark' -->
-        // <!-- Geometric Shapes -->
-        {"\u25CA", "&loz;"}, // lozenge, U+25CA ISOpub -->
-        // <!-- Miscellaneous Symbols -->
-        {"\u2660", "&spades;"}, // black spade suit, U+2660 ISOpub -->
-        // <!-- black here seems to mean filled as opposed to hollow -->
-        {"\u2663", "&clubs;"}, // black club suit = shamrock,U+2663 ISOpub -->
-        {"\u2665", "&hearts;"}, // black heart suit = valentine,U+2665 ISOpub -->
-        {"\u2666", "&diams;"}, // black diamond suit, U+2666 ISOpub -->
-
-        // <!-- Latin Extended-A -->
-        {"\u0152", "&OElig;"}, // -- latin capital ligature OE,U+0152 ISOlat2 -->
-        {"\u0153", "&oelig;"}, // -- latin small ligature oe, U+0153 ISOlat2 -->
-        // <!-- ligature is a misnomer, this is a separate character in some languages -->
-        {"\u0160", "&Scaron;"}, // -- latin capital letter S with caron,U+0160 ISOlat2 -->
-        {"\u0161", "&scaron;"}, // -- latin small letter s with caron,U+0161 ISOlat2 -->
-        {"\u0178", "&Yuml;"}, // -- latin capital letter Y with diaeresis,U+0178 ISOlat2 -->
-        // <!-- Spacing Modifier Letters -->
-        {"\u02C6", "&circ;"}, // -- modifier letter circumflex accent,U+02C6 ISOpub -->
-        {"\u02DC", "&tilde;"}, // small tilde, U+02DC ISOdia -->
-        // <!-- General Punctuation -->
-        {"\u2002", "&ensp;"}, // en space, U+2002 ISOpub -->
-        {"\u2003", "&emsp;"}, // em space, U+2003 ISOpub -->
-        {"\u2009", "&thinsp;"}, // thin space, U+2009 ISOpub -->
-        {"\u200C", "&zwnj;"}, // zero width non-joiner,U+200C NEW RFC 2070 -->
-        {"\u200D", "&zwj;"}, // zero width joiner, U+200D NEW RFC 2070 -->
-        {"\u200E", "&lrm;"}, // left-to-right mark, U+200E NEW RFC 2070 -->
-        {"\u200F", "&rlm;"}, // right-to-left mark, U+200F NEW RFC 2070 -->
-        {"\u2013", "&ndash;"}, // en dash, U+2013 ISOpub -->
-        {"\u2014", "&mdash;"}, // em dash, U+2014 ISOpub -->
-        {"\u2018", "&lsquo;"}, // left single quotation mark,U+2018 ISOnum -->
-        {"\u2019", "&rsquo;"}, // right single quotation mark,U+2019 ISOnum -->
-        {"\u201A", "&sbquo;"}, // single low-9 quotation mark, U+201A NEW -->
-        {"\u201C", "&ldquo;"}, // left double quotation mark,U+201C ISOnum -->
-        {"\u201D", "&rdquo;"}, // right double quotation mark,U+201D ISOnum -->
-        {"\u201E", "&bdquo;"}, // double low-9 quotation mark, U+201E NEW -->
-        {"\u2020", "&dagger;"}, // dagger, U+2020 ISOpub -->
-        {"\u2021", "&Dagger;"}, // double dagger, U+2021 ISOpub -->
-        {"\u2030", "&permil;"}, // per mille sign, U+2030 ISOtech -->
-        {"\u2039", "&lsaquo;"}, // single left-pointing angle quotation mark,U+2039 ISO proposed -->
-        // <!-- lsaquo is proposed but not yet ISO standardized -->
-        {"\u203A", "&rsaquo;"}, // single right-pointing angle quotation mark,U+203A ISO proposed -->
-        // <!-- rsaquo is proposed but not yet ISO standardized -->
-        {"\u20AC", "&euro;"}, // -- euro sign, U+20AC NEW -->
-    };
-
-    /**
-     * Reverse of {@link #HTML40_EXTENDED_ESCAPE()} for unescaping purposes.
-     * @return the mapping table
-     */
-    public static String[][] HTML40_EXTENDED_UNESCAPE() { return HTML40_EXTENDED_UNESCAPE.clone(); }
-    private static final String[][] HTML40_EXTENDED_UNESCAPE = invert(HTML40_EXTENDED_ESCAPE);
-
-    /**
-     * Mapping to escape the basic XML and HTML character entities.
-     *
-     * Namely: {@code " & < >}
-     * @return the mapping table
-     */
-    public static String[][] BASIC_ESCAPE() { return BASIC_ESCAPE.clone(); }
-    private static final String[][] BASIC_ESCAPE = {
-        {"\"", "&quot;"}, // " - double-quote
-        {"&", "&amp;"},   // & - ampersand
-        {"<", "&lt;"},    // < - less-than
-        {">", "&gt;"},    // > - greater-than
-    };
-
-    /**
-     * Reverse of {@link #BASIC_ESCAPE()} for unescaping purposes.
-     * @return the mapping table
-     */
-    public static String[][] BASIC_UNESCAPE() { return BASIC_UNESCAPE.clone(); }
-    private static final String[][] BASIC_UNESCAPE = invert(BASIC_ESCAPE);
-
-    /**
-     * Mapping to escape the apostrophe character to its XML character entity.
-     * @return the mapping table
-     */
-    public static String[][] APOS_ESCAPE() { return APOS_ESCAPE.clone(); }
-    private static final String[][] APOS_ESCAPE = {
-        {"'", "&apos;"}, // XML apostrophe
-    };
-
-    /**
-     * Reverse of {@link #APOS_ESCAPE()} for unescaping purposes.
-     * @return the mapping table
-     */
-    public static String[][] APOS_UNESCAPE() { return APOS_UNESCAPE.clone(); }
-    private static final String[][] APOS_UNESCAPE = invert(APOS_ESCAPE);
-
-    /**
-     * Mapping to escape the Java control characters.
-     *
-     * Namely: {@code \b \n \t \f \r}
-     * @return the mapping table
-     */
-    public static String[][] JAVA_CTRL_CHARS_ESCAPE() { return JAVA_CTRL_CHARS_ESCAPE.clone(); }
-    private static final String[][] JAVA_CTRL_CHARS_ESCAPE = {
-        {"\b", "\\b"},
-        {"\n", "\\n"},
-        {"\t", "\\t"},
-        {"\f", "\\f"},
-        {"\r", "\\r"}
-    };
-
-    /**
-     * Reverse of {@link #JAVA_CTRL_CHARS_ESCAPE()} for unescaping purposes.
-     * @return the mapping table
-     */
-    public static String[][] JAVA_CTRL_CHARS_UNESCAPE() { return JAVA_CTRL_CHARS_UNESCAPE.clone(); }
-    private static final String[][] JAVA_CTRL_CHARS_UNESCAPE = invert(JAVA_CTRL_CHARS_ESCAPE);
-
-    /**
-     * Used to invert an escape array into an unescape array
-     * @param array String[][] to be inverted
-     * @return String[][] inverted array
-     */
-    public static String[][] invert(final String[][] array) {
-        final String[][] newarray = new String[array.length][2];
-        for(int i = 0; i<array.length; i++) {
-            newarray[i][0] = array[i][1];
-            newarray[i][1] = array[i][0];
-        }
-        return newarray;
-    }
-
-}
diff --git a/lang/src/main/java/org/apache/commons/lang3/text/translate/JavaUnicodeEscaper.java b/lang/src/main/java/org/apache/commons/lang3/text/translate/JavaUnicodeEscaper.java
deleted file mode 100644
index 65722f2..0000000
--- a/lang/src/main/java/org/apache/commons/lang3/text/translate/JavaUnicodeEscaper.java
+++ /dev/null
@@ -1,114 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.commons.lang3.text.translate;
-
-/**
- * Translates codepoints to their Unicode escaped value suitable for Java source.
- * 
- * @since 3.2
- * @version $Id$
- */
-public class JavaUnicodeEscaper extends UnicodeEscaper {
-
-    /**
-     * <p>
-     * Constructs a <code>JavaUnicodeEscaper</code> above the specified value (exclusive).
-     * </p>
-     * 
-     * @param codepoint
-     *            above which to escape
-     * @return the newly created {@code UnicodeEscaper} instance
-     */
-    public static JavaUnicodeEscaper above(final int codepoint) {
-        return outsideOf(0, codepoint);
-    }
-
-    /**
-     * <p>
-     * Constructs a <code>JavaUnicodeEscaper</code> below the specified value (exclusive).
-     * </p>
-     * 
-     * @param codepoint
-     *            below which to escape
-     * @return the newly created {@code UnicodeEscaper} instance
-     */
-    public static JavaUnicodeEscaper below(final int codepoint) {
-        return outsideOf(codepoint, Integer.MAX_VALUE);
-    }
-
-    /**
-     * <p>
-     * Constructs a <code>JavaUnicodeEscaper</code> between the specified values (inclusive).
-     * </p>
-     * 
-     * @param codepointLow
-     *            above which to escape
-     * @param codepointHigh
-     *            below which to escape
-     * @return the newly created {@code UnicodeEscaper} instance
-     */
-    public static JavaUnicodeEscaper between(final int codepointLow, final int codepointHigh) {
-        return new JavaUnicodeEscaper(codepointLow, codepointHigh, true);
-    }
-
-    /**
-     * <p>
-     * Constructs a <code>JavaUnicodeEscaper</code> outside of the specified values (exclusive).
-     * </p>
-     * 
-     * @param codepointLow
-     *            below which to escape
-     * @param codepointHigh
-     *            above which to escape
-     * @return the newly created {@code UnicodeEscaper} instance
-     */
-    public static JavaUnicodeEscaper outsideOf(final int codepointLow, final int codepointHigh) {
-        return new JavaUnicodeEscaper(codepointLow, codepointHigh, false);
-    }
-
-    /**
-     * <p>
-     * Constructs a <code>JavaUnicodeEscaper</code> for the specified range. This is the underlying method for the
-     * other constructors/builders. The <code>below</code> and <code>above</code> boundaries are inclusive when
-     * <code>between</code> is <code>true</code> and exclusive when it is <code>false</code>.
-     * </p>
-     * 
-     * @param below
-     *            int value representing the lowest codepoint boundary
-     * @param above
-     *            int value representing the highest codepoint boundary
-     * @param between
-     *            whether to escape between the boundaries or outside them
-     */
-    public JavaUnicodeEscaper(final int below, final int above, final boolean between) {
-        super(below, above, between);
-    }
-
-    /**
-     * Converts the given codepoint to a hex string of the form {@code "\\uXXXX\\uXXXX"}
-     * 
-     * @param codepoint
-     *            a Unicode code point
-     * @return the hex string for the given codepoint
-     */
-    @Override
-    protected String toUtf16Escape(final int codepoint) {
-        final char[] surrogatePair = Character.toChars(codepoint);
-        return "\\u" + hex(surrogatePair[0]) + "\\u" + hex(surrogatePair[1]);
-    }
-
-}
diff --git a/lang/src/main/java/org/apache/commons/lang3/text/translate/LookupTranslator.java b/lang/src/main/java/org/apache/commons/lang3/text/translate/LookupTranslator.java
deleted file mode 100644
index bb2bbd6..0000000
--- a/lang/src/main/java/org/apache/commons/lang3/text/translate/LookupTranslator.java
+++ /dev/null
@@ -1,92 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- * 
- *      http://www.apache.org/licenses/LICENSE-2.0
- * 
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.commons.lang3.text.translate;
-
-import java.io.IOException;
-import java.io.Writer;
-import java.util.HashMap;
-import java.util.HashSet;
-
-/**
- * Translates a value using a lookup table.
- *
- * @since 3.0
- * @version $Id$
- */
-public class LookupTranslator extends CharSequenceTranslator {
-
-    private final HashMap<String, String> lookupMap;
-    private final HashSet<Character> prefixSet;
-    private final int shortest;
-    private final int longest;
-
-    /**
-     * Define the lookup table to be used in translation
-     *
-     * Note that, as of Lang 3.1, the key to the lookup table is converted to a
-     * java.lang.String. This is because we need the key to support hashCode and
-     * equals(Object), allowing it to be the key for a HashMap. See LANG-882.
-     *
-     * @param lookup CharSequence[][] table of size [*][2]
-     */
-    public LookupTranslator(final CharSequence[]... lookup) {
-        lookupMap = new HashMap<String, String>();
-        prefixSet = new HashSet<Character>();
-        int _shortest = Integer.MAX_VALUE;
-        int _longest = 0;
-        if (lookup != null) {
-            for (final CharSequence[] seq : lookup) {
-                this.lookupMap.put(seq[0].toString(), seq[1].toString());
-                this.prefixSet.add(seq[0].charAt(0));
-                final int sz = seq[0].length();
-                if (sz < _shortest) {
-                    _shortest = sz;
-                }
-                if (sz > _longest) {
-                    _longest = sz;
-                }
-            }
-        }
-        shortest = _shortest;
-        longest = _longest;
-    }
-
-    /**
-     * {@inheritDoc}
-     */
-    @Override
-    public int translate(final CharSequence input, final int index, final Writer out) throws IOException {
-        // check if translation exists for the input at position index
-        if (prefixSet.contains(input.charAt(index))) {
-            int max = longest;
-            if (index + longest > input.length()) {
-                max = input.length() - index;
-            }
-            // implement greedy algorithm by trying maximum match first
-            for (int i = max; i >= shortest; i--) {
-                final CharSequence subSeq = input.subSequence(index, index + i);
-                final String result = lookupMap.get(subSeq.toString());
-
-                if (result != null) {
-                    out.write(result);
-                    return i;
-                }
-            }
-        }
-        return 0;
-    }
-}
diff --git a/lang/src/main/java/org/apache/commons/lang3/text/translate/NumericEntityEscaper.java b/lang/src/main/java/org/apache/commons/lang3/text/translate/NumericEntityEscaper.java
deleted file mode 100644
index 0e2e033..0000000
--- a/lang/src/main/java/org/apache/commons/lang3/text/translate/NumericEntityEscaper.java
+++ /dev/null
@@ -1,119 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.commons.lang3.text.translate;
-
-import java.io.IOException;
-import java.io.Writer;
-
-/**
- * Translates codepoints to their XML numeric entity escaped value.
- *
- * @since 3.0
- * @version $Id$
- */
-public class NumericEntityEscaper extends CodePointTranslator {
-
-    private final int below;
-    private final int above;
-    private final boolean between;
-
-    /**
-     * <p>Constructs a <code>NumericEntityEscaper</code> for the specified range. This is
-     * the underlying method for the other constructors/builders. The <code>below</code>
-     * and <code>above</code> boundaries are inclusive when <code>between</code> is
-     * <code>true</code> and exclusive when it is <code>false</code>. </p>
-     *
-     * @param below int value representing the lowest codepoint boundary
-     * @param above int value representing the highest codepoint boundary
-     * @param between whether to escape between the boundaries or outside them
-     */
-    private NumericEntityEscaper(final int below, final int above, final boolean between) {
-        this.below = below;
-        this.above = above;
-        this.between = between;
-    }
-
-    /**
-     * <p>Constructs a <code>NumericEntityEscaper</code> for all characters. </p>
-     */
-    public NumericEntityEscaper() {
-        this(0, Integer.MAX_VALUE, true);
-    }
-
-    /**
-     * <p>Constructs a <code>NumericEntityEscaper</code> below the specified value (exclusive). </p>
-     *
-     * @param codepoint below which to escape
-     * @return the newly created {@code NumericEntityEscaper} instance
-     */
-    public static NumericEntityEscaper below(final int codepoint) {
-        return outsideOf(codepoint, Integer.MAX_VALUE);
-    }
-
-    /**
-     * <p>Constructs a <code>NumericEntityEscaper</code> above the specified value (exclusive). </p>
-     *
-     * @param codepoint above which to escape
-     * @return the newly created {@code NumericEntityEscaper} instance
-     */
-    public static NumericEntityEscaper above(final int codepoint) {
-        return outsideOf(0, codepoint);
-    }
-
-    /**
-     * <p>Constructs a <code>NumericEntityEscaper</code> between the specified values (inclusive). </p>
-     *
-     * @param codepointLow above which to escape
-     * @param codepointHigh below which to escape
-     * @return the newly created {@code NumericEntityEscaper} instance
-     */
-    public static NumericEntityEscaper between(final int codepointLow, final int codepointHigh) {
-        return new NumericEntityEscaper(codepointLow, codepointHigh, true);
-    }
-
-    /**
-     * <p>Constructs a <code>NumericEntityEscaper</code> outside of the specified values (exclusive). </p>
-     *
-     * @param codepointLow below which to escape
-     * @param codepointHigh above which to escape
-     * @return the newly created {@code NumericEntityEscaper} instance
-     */
-    public static NumericEntityEscaper outsideOf(final int codepointLow, final int codepointHigh) {
-        return new NumericEntityEscaper(codepointLow, codepointHigh, false);
-    }
-
-    /**
-     * {@inheritDoc}
-     */
-    @Override
-    public boolean translate(final int codepoint, final Writer out) throws IOException {
-        if(between) {
-            if (codepoint < below || codepoint > above) {
-                return false;
-            }
-        } else {
-            if (codepoint >= below && codepoint <= above) {
-                return false;
-            }
-        }
-
-        out.write("&#");
-        out.write(Integer.toString(codepoint, 10));
-        out.write(';');
-        return true;
-    }
-}
diff --git a/lang/src/main/java/org/apache/commons/lang3/text/translate/NumericEntityUnescaper.java b/lang/src/main/java/org/apache/commons/lang3/text/translate/NumericEntityUnescaper.java
deleted file mode 100644
index ede2cf3..0000000
--- a/lang/src/main/java/org/apache/commons/lang3/text/translate/NumericEntityUnescaper.java
+++ /dev/null
@@ -1,139 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- * 
- *      http://www.apache.org/licenses/LICENSE-2.0
- * 
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.commons.lang3.text.translate;
-
-import java.io.IOException;
-import java.io.Writer;
-import java.util.Arrays;
-import java.util.EnumSet;
-
-/**
- * Translate XML numeric entities of the form &amp;#[xX]?\d+;? to 
- * the specific codepoint.
- *
- * Note that the semi-colon is optional.
- * 
- * @since 3.0
- * @version $Id$
- */
-public class NumericEntityUnescaper extends CharSequenceTranslator {
-
-    public static enum OPTION { semiColonRequired, semiColonOptional, errorIfNoSemiColon }
-
-    // TODO?: Create an OptionsSet class to hide some of the conditional logic below
-    private final EnumSet<OPTION> options;
-
-    /**
-     * Create a UnicodeUnescaper.
-     *
-     * The constructor takes a list of options, only one type of which is currently 
-     * available (whether to allow, error or ignore the semi-colon on the end of a 
-     * numeric entity to being missing).
-     *
-     * For example, to support numeric entities without a ';':
-     *    new NumericEntityUnescaper(NumericEntityUnescaper.OPTION.semiColonOptional)
-     * and to throw an IllegalArgumentException when they're missing:
-     *    new NumericEntityUnescaper(NumericEntityUnescaper.OPTION.errorIfNoSemiColon)
-     *
-     * Note that the default behaviour is to ignore them. 
-     *
-     * @param options to apply to this unescaper
-     */
-    public NumericEntityUnescaper(final OPTION... options) {
-        if(options.length > 0) {
-            this.options = EnumSet.copyOf(Arrays.asList(options));
-        } else {
-            this.options = EnumSet.copyOf(Arrays.asList(new OPTION[] { OPTION.semiColonRequired }));
-        }
-    }
-
-    /**
-     * Whether the passed in option is currently set.
-     *
-     * @param option to check state of
-     * @return whether the option is set
-     */
-    public boolean isSet(final OPTION option) { 
-        return options == null ? false : options.contains(option);
-    }
-
-    /**
-     * {@inheritDoc}
-     */
-    @Override
-    public int translate(final CharSequence input, final int index, final Writer out) throws IOException {
-        final int seqEnd = input.length();
-        // Uses -2 to ensure there is something after the &#
-        if(input.charAt(index) == '&' && index < seqEnd - 2 && input.charAt(index + 1) == '#') {
-            int start = index + 2;
-            boolean isHex = false;
-
-            final char firstChar = input.charAt(start);
-            if(firstChar == 'x' || firstChar == 'X') {
-                start++;
-                isHex = true;
-
-                // Check there's more than just an x after the &#
-                if(start == seqEnd) {
-                    return 0;
-                }
-            }
-
-            int end = start;
-            // Note that this supports character codes without a ; on the end
-            while(end < seqEnd && ( input.charAt(end) >= '0' && input.charAt(end) <= '9' ||
-                                    input.charAt(end) >= 'a' && input.charAt(end) <= 'f' ||
-                                    input.charAt(end) >= 'A' && input.charAt(end) <= 'F' ) )
-            {
-                end++;
-            }
-
-            final boolean semiNext = end != seqEnd && input.charAt(end) == ';';
-
-            if(!semiNext) {
-                if(isSet(OPTION.semiColonRequired)) {
-                    return 0;
-                } else
-                if(isSet(OPTION.errorIfNoSemiColon)) {
-                    throw new IllegalArgumentException("Semi-colon required at end of numeric entity");
-                }
-            }
-
-            int entityValue;
-            try {
-                if(isHex) {
-                    entityValue = Integer.parseInt(input.subSequence(start, end).toString(), 16);
-                } else {
-                    entityValue = Integer.parseInt(input.subSequence(start, end).toString(), 10);
-                }
-            } catch(final NumberFormatException nfe) {
-                return 0;
-            }
-
-            if(entityValue > 0xFFFF) {
-                final char[] chrs = Character.toChars(entityValue);
-                out.write(chrs[0]);
-                out.write(chrs[1]);
-            } else {
-                out.write(entityValue);
-            }
-
-            return 2 + end - start + (isHex ? 1 : 0) + (semiNext ? 1 : 0);
-        }
-        return 0;
-    }
-}
diff --git a/lang/src/main/java/org/apache/commons/lang3/text/translate/OctalUnescaper.java b/lang/src/main/java/org/apache/commons/lang3/text/translate/OctalUnescaper.java
deleted file mode 100644
index 5506504..0000000
--- a/lang/src/main/java/org/apache/commons/lang3/text/translate/OctalUnescaper.java
+++ /dev/null
@@ -1,80 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- * 
- *      http://www.apache.org/licenses/LICENSE-2.0
- * 
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.commons.lang3.text.translate;
-
-import java.io.IOException;
-import java.io.Writer;
-
-/**
- * Translate escaped octal Strings back to their octal values.
- *
- * For example, "\45" should go back to being the specific value (a %).
- *
- * Note that this currently only supports the viable range of octal for Java; namely 
- * 1 to 377. This is because parsing Java is the main use case.
- * 
- * @since 3.0
- * @version $Id: OctalUnescaper.java 967237 2010-07-23 20:08:57Z mbenson $
- */
-public class OctalUnescaper extends CharSequenceTranslator {
-
-    /**
-     * {@inheritDoc}
-     */
-    @Override
-    public int translate(final CharSequence input, final int index, final Writer out) throws IOException {
-        final int remaining = input.length() - index - 1; // how many characters left, ignoring the first \
-        final StringBuilder builder = new StringBuilder();
-        if(input.charAt(index) == '\\' && remaining > 0 && isOctalDigit(input.charAt(index + 1)) ) {
-            final int next = index + 1;
-            final int next2 = index + 2;
-            final int next3 = index + 3;
-
-            // we know this is good as we checked it in the if block above
-            builder.append(input.charAt(next));
-
-            if(remaining > 1 && isOctalDigit(input.charAt(next2))) {
-                builder.append(input.charAt(next2));
-                if(remaining > 2 && isZeroToThree(input.charAt(next)) && isOctalDigit(input.charAt(next3))) {
-                    builder.append(input.charAt(next3));
-                }
-            }
-
-            out.write( Integer.parseInt(builder.toString(), 8) );
-            return 1 + builder.length();
-        }
-        return 0;
-    }
-
-    /**
-     * Checks if the given char is an octal digit. Octal digits are the character representations of the digits 0 to 7.
-     * @param ch the char to check
-     * @return true if the given char is the character representation of one of the digits from 0 to 7
-     */
-    private boolean isOctalDigit(final char ch) {
-        return ch >= '0' && ch <= '7';
-    }
-
-    /**
-     * Checks if the given char is the character representation of one of the digit from 0 to 3.
-     * @param ch the char to check
-     * @return true if the given char is the character representation of one of the digits from 0 to 3
-     */
-    private boolean isZeroToThree(final char ch) {
-        return ch >= '0' && ch <= '3';
-    }
-}
diff --git a/lang/src/main/java/org/apache/commons/lang3/text/translate/UnicodeEscaper.java b/lang/src/main/java/org/apache/commons/lang3/text/translate/UnicodeEscaper.java
deleted file mode 100644
index 3a63b72..0000000
--- a/lang/src/main/java/org/apache/commons/lang3/text/translate/UnicodeEscaper.java
+++ /dev/null
@@ -1,139 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.commons.lang3.text.translate;
-
-import java.io.IOException;
-import java.io.Writer;
-
-/**
- * Translates codepoints to their Unicode escaped value.
- *
- * @since 3.0
- * @version $Id$
- */
-public class UnicodeEscaper extends CodePointTranslator {
-
-    private final int below;
-    private final int above;
-    private final boolean between;
-
-    /**
-     * <p>Constructs a <code>UnicodeEscaper</code> for all characters. </p>
-     */
-    public UnicodeEscaper(){
-        this(0, Integer.MAX_VALUE, true);
-    }
-
-    /**
-     * <p>Constructs a <code>UnicodeEscaper</code> for the specified range. This is
-     * the underlying method for the other constructors/builders. The <code>below</code>
-     * and <code>above</code> boundaries are inclusive when <code>between</code> is
-     * <code>true</code> and exclusive when it is <code>false</code>. </p>
-     *
-     * @param below int value representing the lowest codepoint boundary
-     * @param above int value representing the highest codepoint boundary
-     * @param between whether to escape between the boundaries or outside them
-     */
-    protected UnicodeEscaper(final int below, final int above, final boolean between) {
-        this.below = below;
-        this.above = above;
-        this.between = between;
-    }
-
-    /**
-     * <p>Constructs a <code>UnicodeEscaper</code> below the specified value (exclusive). </p>
-     *
-     * @param codepoint below which to escape
-     * @return the newly created {@code UnicodeEscaper} instance
-     */
-    public static UnicodeEscaper below(final int codepoint) {
-        return outsideOf(codepoint, Integer.MAX_VALUE);
-    }
-
-    /**
-     * <p>Constructs a <code>UnicodeEscaper</code> above the specified value (exclusive). </p>
-     *
-     * @param codepoint above which to escape
-     * @return the newly created {@code UnicodeEscaper} instance
-     */
-    public static UnicodeEscaper above(final int codepoint) {
-        return outsideOf(0, codepoint);
-    }
-
-    /**
-     * <p>Constructs a <code>UnicodeEscaper</code> outside of the specified values (exclusive). </p>
-     *
-     * @param codepointLow below which to escape
-     * @param codepointHigh above which to escape
-     * @return the newly created {@code UnicodeEscaper} instance
-     */
-    public static UnicodeEscaper outsideOf(final int codepointLow, final int codepointHigh) {
-        return new UnicodeEscaper(codepointLow, codepointHigh, false);
-    }
-
-    /**
-     * <p>Constructs a <code>UnicodeEscaper</code> between the specified values (inclusive). </p>
-     *
-     * @param codepointLow above which to escape
-     * @param codepointHigh below which to escape
-     * @return the newly created {@code UnicodeEscaper} instance
-     */
-    public static UnicodeEscaper between(final int codepointLow, final int codepointHigh) {
-        return new UnicodeEscaper(codepointLow, codepointHigh, true);
-    }
-
-    /**
-     * {@inheritDoc}
-     */
-    @Override
-    public boolean translate(final int codepoint, final Writer out) throws IOException {
-        if (between) {
-            if (codepoint < below || codepoint > above) {
-                return false;
-            }
-        } else {
-            if (codepoint >= below && codepoint <= above) {
-                return false;
-            }
-        }
-
-        // TODO: Handle potential + sign per various Unicode escape implementations
-        if (codepoint > 0xffff) {
-            out.write(toUtf16Escape(codepoint));
-        } else {
-          out.write("\\u");
-          out.write(HEX_DIGITS[(codepoint >> 12) & 15]);
-          out.write(HEX_DIGITS[(codepoint >> 8) & 15]);
-          out.write(HEX_DIGITS[(codepoint >> 4) & 15]);
-          out.write(HEX_DIGITS[(codepoint) & 15]);
-        }
-        return true;
-    }
-
-    /**
-     * Converts the given codepoint to a hex string of the form {@code "\\uXXXX"}
-     * 
-     * @param codepoint
-     *            a Unicode code point
-     * @return the hex string for the given codepoint
-     *
-     * @since 3.2
-     */
-    protected String toUtf16Escape(final int codepoint) {
-        return "\\u" + hex(codepoint);
-    }
-}
diff --git a/lang/src/main/java/org/apache/commons/lang3/text/translate/UnicodeUnescaper.java b/lang/src/main/java/org/apache/commons/lang3/text/translate/UnicodeUnescaper.java
deleted file mode 100644
index 3b1e9d0..0000000
--- a/lang/src/main/java/org/apache/commons/lang3/text/translate/UnicodeUnescaper.java
+++ /dev/null
@@ -1,65 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- * 
- *      http://www.apache.org/licenses/LICENSE-2.0
- * 
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.commons.lang3.text.translate;
-
-import java.io.IOException;
-import java.io.Writer;
-
-/**
- * Translates escaped Unicode values of the form \\u+\d\d\d\d back to 
- * Unicode. It supports multiple 'u' characters and will work with or 
- * without the +.
- * 
- * @since 3.0
- * @version $Id$
- */
-public class UnicodeUnescaper extends CharSequenceTranslator {
-
-    /**
-     * {@inheritDoc}
-     */
-    @Override
-    public int translate(final CharSequence input, final int index, final Writer out) throws IOException {
-        if (input.charAt(index) == '\\' && index + 1 < input.length() && input.charAt(index + 1) == 'u') {
-            // consume optional additional 'u' chars
-            int i = 2;
-            while (index + i < input.length() && input.charAt(index + i) == 'u') {
-                i++;
-            }
-
-            if (index + i < input.length() && input.charAt(index + i) == '+') {
-                i++;
-            }
-
-            if (index + i + 4 <= input.length()) {
-                // Get 4 hex digits
-                final CharSequence unicode = input.subSequence(index + i, index + i + 4);
-
-                try {
-                    final int value = Integer.parseInt(unicode.toString(), 16);
-                    out.write((char) value);
-                } catch (final NumberFormatException nfe) {
-                    throw new IllegalArgumentException("Unable to parse unicode value: " + unicode, nfe);
-                }
-                return i + 4;
-            }
-            throw new IllegalArgumentException("Less than 4 hex digits in unicode value: '" + input.subSequence(index, input.length())
-                    + "' due to end of CharSequence");
-        }
-        return 0;
-    }
-}
diff --git a/lang/src/main/java/org/apache/commons/lang3/text/translate/UnicodeUnpairedSurrogateRemover.java b/lang/src/main/java/org/apache/commons/lang3/text/translate/UnicodeUnpairedSurrogateRemover.java
deleted file mode 100644
index ce86d5e..0000000
--- a/lang/src/main/java/org/apache/commons/lang3/text/translate/UnicodeUnpairedSurrogateRemover.java
+++ /dev/null
@@ -1,42 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.commons.lang3.text.translate;
-
-import java.io.IOException;
-import java.io.Writer;
-
-/**
- * Helper subclass to CharSequenceTranslator to remove unpaired surrogates.
- * 
- * @version $Id$
- */
-public class UnicodeUnpairedSurrogateRemover extends CodePointTranslator {
-    /**
-     * Implementation of translate that throws out unpaired surrogates. 
-     * {@inheritDoc}
-     */
-    @Override
-    public boolean translate(final int codepoint, final Writer out) throws IOException {
-        if (codepoint >= Character.MIN_SURROGATE && codepoint <= Character.MAX_SURROGATE) {
-            // It's a surrogate. Write nothing and say we've translated.
-            return true;
-        }
-        // It's not a surrogate. Don't translate it.
-        return false;
-    }
-}
-
diff --git a/lang/src/main/java/org/apache/commons/lang3/text/translate/package-info.java b/lang/src/main/java/org/apache/commons/lang3/text/translate/package-info.java
deleted file mode 100644
index fd47b62..0000000
--- a/lang/src/main/java/org/apache/commons/lang3/text/translate/package-info.java
+++ /dev/null
@@ -1,25 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-/**
- * <p> An API for creating text translation routines from a set of smaller building blocks. Initially created to make it
- * possible for the user to customize the rules in the StringEscapeUtils class.</p>
- * <p>These classes are immutable, and therefore thread-safe.</p>
- *
- * @since 3.0
- * @version $Id$
- */
-package org.apache.commons.lang3.text.translate;
diff --git a/lang/src/main/java/org/apache/commons/lang3/time/DateFormatUtils.java b/lang/src/main/java/org/apache/commons/lang3/time/DateFormatUtils.java
deleted file mode 100644
index 4315e47..0000000
--- a/lang/src/main/java/org/apache/commons/lang3/time/DateFormatUtils.java
+++ /dev/null
@@ -1,323 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- * 
- *      http://www.apache.org/licenses/LICENSE-2.0
- * 
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.commons.lang3.time;
-
-import java.util.Calendar;
-import java.util.Date;
-import java.util.Locale;
-import java.util.TimeZone;
-
-/**
- * <p>Date and time formatting utilities and constants.</p>
- *
- * <p>Formatting is performed using the thread-safe
- * {@link org.apache.commons.lang3.time.FastDateFormat} class.</p>
- *
- * <p>Note that the JDK has a bug wherein calling Calendar.get(int) will 
- * override any previously called Calendar.clear() calls. See LANG-755.</p>
- *
- * @since 2.0
- * @version $Id$
- */
-public class DateFormatUtils {
-
-    /**
-     * The UTC time zone (often referred to as GMT).
-     * This is private as it is mutable.
-     */
-    private static final TimeZone UTC_TIME_ZONE = TimeZone.getTimeZone("GMT");
-    /**
-     * ISO 8601 formatter for date-time without time zone.
-     * The format used is {@code yyyy-MM-dd'T'HH:mm:ss}.
-     */
-    public static final FastDateFormat ISO_DATETIME_FORMAT
-            = FastDateFormat.getInstance("yyyy-MM-dd'T'HH:mm:ss");
-
-    /**
-     * ISO 8601 formatter for date-time with time zone.
-     * The format used is {@code yyyy-MM-dd'T'HH:mm:ssZZ}.
-     */
-    public static final FastDateFormat ISO_DATETIME_TIME_ZONE_FORMAT
-            = FastDateFormat.getInstance("yyyy-MM-dd'T'HH:mm:ssZZ");
-
-    /**
-     * ISO 8601 formatter for date without time zone.
-     * The format used is {@code yyyy-MM-dd}.
-     */
-    public static final FastDateFormat ISO_DATE_FORMAT
-            = FastDateFormat.getInstance("yyyy-MM-dd");
-
-    /**
-     * ISO 8601-like formatter for date with time zone.
-     * The format used is {@code yyyy-MM-ddZZ}.
-     * This pattern does not comply with the formal ISO 8601 specification
-     * as the standard does not allow a time zone  without a time.
-     */
-    public static final FastDateFormat ISO_DATE_TIME_ZONE_FORMAT
-            = FastDateFormat.getInstance("yyyy-MM-ddZZ");
-
-    /**
-     * ISO 8601 formatter for time without time zone.
-     * The format used is {@code 'T'HH:mm:ss}.
-     */
-    public static final FastDateFormat ISO_TIME_FORMAT
-            = FastDateFormat.getInstance("'T'HH:mm:ss");
-
-    /**
-     * ISO 8601 formatter for time with time zone.
-     * The format used is {@code 'T'HH:mm:ssZZ}.
-     */
-    public static final FastDateFormat ISO_TIME_TIME_ZONE_FORMAT
-            = FastDateFormat.getInstance("'T'HH:mm:ssZZ");
-
-    /**
-     * ISO 8601-like formatter for time without time zone.
-     * The format used is {@code HH:mm:ss}.
-     * This pattern does not comply with the formal ISO 8601 specification
-     * as the standard requires the 'T' prefix for times.
-     */
-    public static final FastDateFormat ISO_TIME_NO_T_FORMAT
-            = FastDateFormat.getInstance("HH:mm:ss");
-
-    /**
-     * ISO 8601-like formatter for time with time zone.
-     * The format used is {@code HH:mm:ssZZ}.
-     * This pattern does not comply with the formal ISO 8601 specification
-     * as the standard requires the 'T' prefix for times.
-     */
-    public static final FastDateFormat ISO_TIME_NO_T_TIME_ZONE_FORMAT
-            = FastDateFormat.getInstance("HH:mm:ssZZ");
-
-    /**
-     * SMTP (and probably other) date headers.
-     * The format used is {@code EEE, dd MMM yyyy HH:mm:ss Z} in US locale.
-     */
-    public static final FastDateFormat SMTP_DATETIME_FORMAT
-            = FastDateFormat.getInstance("EEE, dd MMM yyyy HH:mm:ss Z", Locale.US);
-
-    //-----------------------------------------------------------------------
-    /**
-     * <p>DateFormatUtils instances should NOT be constructed in standard programming.</p>
-     *
-     * <p>This constructor is public to permit tools that require a JavaBean instance
-     * to operate.</p>
-     */
-    public DateFormatUtils() {
-        super();
-    }
-
-    /**
-     * <p>Formats a date/time into a specific pattern using the UTC time zone.</p>
-     * 
-     * @param millis  the date to format expressed in milliseconds
-     * @param pattern  the pattern to use to format the date, not null
-     * @return the formatted date
-     */
-    public static String formatUTC(final long millis, final String pattern) {
-        return format(new Date(millis), pattern, UTC_TIME_ZONE, null);
-    }
-
-    /**
-     * <p>Formats a date/time into a specific pattern using the UTC time zone.</p>
-     * 
-     * @param date  the date to format, not null
-     * @param pattern  the pattern to use to format the date, not null
-     * @return the formatted date
-     */
-    public static String formatUTC(final Date date, final String pattern) {
-        return format(date, pattern, UTC_TIME_ZONE, null);
-    }
-    
-    /**
-     * <p>Formats a date/time into a specific pattern using the UTC time zone.</p>
-     * 
-     * @param millis  the date to format expressed in milliseconds
-     * @param pattern  the pattern to use to format the date, not null
-     * @param locale  the locale to use, may be <code>null</code>
-     * @return the formatted date
-     */
-    public static String formatUTC(final long millis, final String pattern, final Locale locale) {
-        return format(new Date(millis), pattern, UTC_TIME_ZONE, locale);
-    }
-
-    /**
-     * <p>Formats a date/time into a specific pattern using the UTC time zone.</p>
-     * 
-     * @param date  the date to format, not null
-     * @param pattern  the pattern to use to format the date, not null
-     * @param locale  the locale to use, may be <code>null</code>
-     * @return the formatted date
-     */
-    public static String formatUTC(final Date date, final String pattern, final Locale locale) {
-        return format(date, pattern, UTC_TIME_ZONE, locale);
-    }
-    
-    /**
-     * <p>Formats a date/time into a specific pattern.</p>
-     * 
-     * @param millis  the date to format expressed in milliseconds
-     * @param pattern  the pattern to use to format the date, not null
-     * @return the formatted date
-     */
-    public static String format(final long millis, final String pattern) {
-        return format(new Date(millis), pattern, null, null);
-    }
-
-    /**
-     * <p>Formats a date/time into a specific pattern.</p>
-     * 
-     * @param date  the date to format, not null
-     * @param pattern  the pattern to use to format the date, not null
-     * @return the formatted date
-     */
-    public static String format(final Date date, final String pattern) {
-        return format(date, pattern, null, null);
-    }
-
-    /**
-     * <p>Formats a calendar into a specific pattern.</p>
-     * 
-     * @param calendar  the calendar to format, not null
-     * @param pattern  the pattern to use to format the calendar, not null
-     * @return the formatted calendar
-     * @see FastDateFormat#format(Calendar)
-     * @since 2.4
-     */
-    public static String format(final Calendar calendar, final String pattern) {
-        return format(calendar, pattern, null, null);
-    }
-    
-    /**
-     * <p>Formats a date/time into a specific pattern in a time zone.</p>
-     * 
-     * @param millis  the time expressed in milliseconds
-     * @param pattern  the pattern to use to format the date, not null
-     * @param timeZone  the time zone  to use, may be <code>null</code>
-     * @return the formatted date
-     */
-    public static String format(final long millis, final String pattern, final TimeZone timeZone) {
-        return format(new Date(millis), pattern, timeZone, null);
-    }
-
-    /**
-     * <p>Formats a date/time into a specific pattern in a time zone.</p>
-     * 
-     * @param date  the date to format, not null
-     * @param pattern  the pattern to use to format the date, not null
-     * @param timeZone  the time zone  to use, may be <code>null</code>
-     * @return the formatted date
-     */
-    public static String format(final Date date, final String pattern, final TimeZone timeZone) {
-        return format(date, pattern, timeZone, null);
-    }
-
-    /**
-     * <p>Formats a calendar into a specific pattern in a time zone.</p>
-     * 
-     * @param calendar  the calendar to format, not null
-     * @param pattern  the pattern to use to format the calendar, not null
-     * @param timeZone  the time zone  to use, may be <code>null</code>
-     * @return the formatted calendar
-     * @see FastDateFormat#format(Calendar)
-     * @since 2.4
-     */
-    public static String format(final Calendar calendar, final String pattern, final TimeZone timeZone) {
-        return format(calendar, pattern, timeZone, null);
-    }
-
-    /**
-     * <p>Formats a date/time into a specific pattern in a locale.</p>
-     * 
-     * @param millis  the date to format expressed in milliseconds
-     * @param pattern  the pattern to use to format the date, not null
-     * @param locale  the locale to use, may be <code>null</code>
-     * @return the formatted date
-     */
-    public static String format(final long millis, final String pattern, final Locale locale) {
-        return format(new Date(millis), pattern, null, locale);
-    }
-
-    /**
-     * <p>Formats a date/time into a specific pattern in a locale.</p>
-     * 
-     * @param date  the date to format, not null
-     * @param pattern  the pattern to use to format the date, not null
-     * @param locale  the locale to use, may be <code>null</code>
-     * @return the formatted date
-     */
-    public static String format(final Date date, final String pattern, final Locale locale) {
-        return format(date, pattern, null, locale);
-    }
-
-    /**
-     * <p>Formats a calendar into a specific pattern in a locale.</p>
-     * 
-     * @param calendar  the calendar to format, not null
-     * @param pattern  the pattern to use to format the calendar, not null
-     * @param locale  the locale to use, may be <code>null</code>
-     * @return the formatted calendar
-     * @see FastDateFormat#format(Calendar)
-     * @since 2.4
-     */
-    public static String format(final Calendar calendar, final String pattern, final Locale locale) {
-        return format(calendar, pattern, null, locale);
-    }
-
-    /**
-     * <p>Formats a date/time into a specific pattern in a time zone  and locale.</p>
-     * 
-     * @param millis  the date to format expressed in milliseconds
-     * @param pattern  the pattern to use to format the date, not null
-     * @param timeZone  the time zone  to use, may be <code>null</code>
-     * @param locale  the locale to use, may be <code>null</code>
-     * @return the formatted date
-     */
-    public static String format(final long millis, final String pattern, final TimeZone timeZone, final Locale locale) {
-        return format(new Date(millis), pattern, timeZone, locale);
-    }
-
-    /**
-     * <p>Formats a date/time into a specific pattern in a time zone  and locale.</p>
-     * 
-     * @param date  the date to format, not null
-     * @param pattern  the pattern to use to format the date, not null, not null
-     * @param timeZone  the time zone  to use, may be <code>null</code>
-     * @param locale  the locale to use, may be <code>null</code>
-     * @return the formatted date
-     */
-    public static String format(final Date date, final String pattern, final TimeZone timeZone, final Locale locale) {
-        final FastDateFormat df = FastDateFormat.getInstance(pattern, timeZone, locale);
-        return df.format(date);
-    }
-
-    /**
-     * <p>Formats a calendar into a specific pattern in a time zone  and locale.</p>
-     * 
-     * @param calendar  the calendar to format, not null
-     * @param pattern  the pattern to use to format the calendar, not null
-     * @param timeZone  the time zone  to use, may be <code>null</code>
-     * @param locale  the locale to use, may be <code>null</code>
-     * @return the formatted calendar
-     * @see FastDateFormat#format(Calendar)
-     * @since 2.4
-     */
-    public static String format(final Calendar calendar, final String pattern, final TimeZone timeZone, final Locale locale) {
-        final FastDateFormat df = FastDateFormat.getInstance(pattern, timeZone, locale);
-        return df.format(calendar);
-    }
-
-}
diff --git a/lang/src/main/java/org/apache/commons/lang3/time/DateParser.java b/lang/src/main/java/org/apache/commons/lang3/time/DateParser.java
deleted file mode 100644
index 120c4ab..0000000
--- a/lang/src/main/java/org/apache/commons/lang3/time/DateParser.java
+++ /dev/null
@@ -1,105 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.commons.lang3.time;
-
-import java.text.ParseException;
-import java.text.ParsePosition;
-import java.util.Date;
-import java.util.Locale;
-import java.util.TimeZone;
-
-/**
- * <p>DateParser is the "missing" interface for the parsing methods of 
- * {@link java.text.DateFormat}.</p>
- * 
- * @since 3.2
- */
-public interface DateParser {
-
-    /**
-     * Equivalent to DateFormat.parse(String). 
-     * 
-     * See {@link java.text.DateFormat#parse(String)} for more information. 
-     * @param source A <code>String</code> whose beginning should be parsed. 
-     * @return A <code>Date</code> parsed from the string
-     * @throws ParseException if the beginning of the specified string cannot be parsed.
-     */
-    Date parse(String source) throws ParseException;
-
-    /**
-     * Equivalent to DateFormat.parse(String, ParsePosition). 
-     * 
-     * See {@link java.text.DateFormat#parse(String, ParsePosition)} for more information. 
-     * 
-     * @param source A <code>String</code>, part of which should be parsed.
-     * @param pos A <code>ParsePosition</code> object with index and error index information 
-     * as described above. 
-     * @return A <code>Date</code> parsed from the string. In case of error, returns null. 
-     * @throws NullPointerException if text or pos is null.
-     */
-    Date parse(String source, ParsePosition pos);
-
-    // Accessors
-    //-----------------------------------------------------------------------
-    /**
-     * <p>Get the pattern used by this parser.</p>
-     * 
-     * @return the pattern, {@link java.text.SimpleDateFormat} compatible
-     */
-    String getPattern();
-
-    /**
-     * <p>
-     * Get the time zone used by this parser.
-     * </p>
-     * 
-     * <p>
-     * The default {@link TimeZone} used to create a {@link Date} when the {@link TimeZone} is not specified by
-     * the format pattern.
-     * </p>
-     * 
-     * @return the time zone
-     */
-    TimeZone getTimeZone();
-
-    /**
-     * <p>Get the locale used by this parser.</p>
-     * 
-     * @return the locale
-     */
-    Locale getLocale();
-
-    /**
-     * Parses text from a string to produce a Date.
-     * 
-     * @param source A <code>String</code> whose beginning should be parsed.
-     * @return a <code>java.util.Date</code> object
-     * @throws ParseException if the beginning of the specified string cannot be parsed.
-     * @see java.text.DateFormat#parseObject(String) 
-     */
-    Object parseObject(String source) throws ParseException;
-
-    /**
-     * Parse a date/time string according to the given parse position.
-     * 
-     * @param source A <code>String</code> whose beginning should be parsed.
-     * @param pos the parse position
-     * @return a <code>java.util.Date</code> object
-     * @see java.text.DateFormat#parseObject(String, ParsePosition) 
-     */
-    Object parseObject(String source, ParsePosition pos);
-}
diff --git a/lang/src/main/java/org/apache/commons/lang3/time/DatePrinter.java b/lang/src/main/java/org/apache/commons/lang3/time/DatePrinter.java
deleted file mode 100644
index d1bfb91..0000000
--- a/lang/src/main/java/org/apache/commons/lang3/time/DatePrinter.java
+++ /dev/null
@@ -1,125 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.commons.lang3.time;
-
-import java.text.FieldPosition;
-import java.util.Calendar;
-import java.util.Date;
-import java.util.Locale;
-import java.util.TimeZone;
-
-/**
- * <p>DatePrinter is the "missing" interface for the format methods of 
- * {@link java.text.DateFormat}.</p>
- * 
- * @since 3.2
- */
-public interface DatePrinter {
-
-    /**
-     * <p>Formats a millisecond {@code long} value.</p>
-     *
-     * @param millis  the millisecond value to format
-     * @return the formatted string
-     * @since 2.1
-     */
-    String format(long millis);
-
-    /**
-     * <p>Formats a {@code Date} object using a {@code GregorianCalendar}.</p>
-     *
-     * @param date  the date to format
-     * @return the formatted string
-     */
-    String format(Date date);
-
-    /**
-     * <p>Formats a {@code Calendar} object.</p>
-     *
-     * @param calendar  the calendar to format
-     * @return the formatted string
-     */
-    String format(Calendar calendar);
-
-    /**
-     * <p>Formats a milliseond {@code long} value into the
-     * supplied {@code StringBuffer}.</p>
-     *
-     * @param millis  the millisecond value to format
-     * @param buf  the buffer to format into
-     * @return the specified string buffer
-     */
-    StringBuffer format(long millis, StringBuffer buf);
-
-    /**
-     * <p>Formats a {@code Date} object into the
-     * supplied {@code StringBuffer} using a {@code GregorianCalendar}.</p>
-     *
-     * @param date  the date to format
-     * @param buf  the buffer to format into
-     * @return the specified string buffer
-     */
-    StringBuffer format(Date date, StringBuffer buf);
-
-    /**
-     * <p>Formats a {@code Calendar} object into the
-     * supplied {@code StringBuffer}.</p>
-     *
-     * @param calendar  the calendar to format
-     * @param buf  the buffer to format into
-     * @return the specified string buffer
-     */
-    StringBuffer format(Calendar calendar, StringBuffer buf);
-
-    // Accessors
-    //-----------------------------------------------------------------------
-    /**
-     * <p>Gets the pattern used by this printer.</p>
-     *
-     * @return the pattern, {@link java.text.SimpleDateFormat} compatible
-     */
-    String getPattern();
-
-    /**
-     * <p>Gets the time zone used by this printer.</p>
-     *
-     * <p>This zone is always used for {@code Date} printing. </p>
-     *
-     * @return the time zone
-     */
-    TimeZone getTimeZone();
-
-    /**
-     * <p>Gets the locale used by this printer.</p>
-     *
-     * @return the locale
-     */
-    Locale getLocale();
-
-    /**
-     * <p>Formats a {@code Date}, {@code Calendar} or
-     * {@code Long} (milliseconds) object.</p>
-     * 
-     * See {@link java.text.DateFormat#format(Object, StringBuffer, FieldPosition)}
-     * 
-     * @param obj  the object to format
-     * @param toAppendTo  the buffer to append to
-     * @param pos  the position - ignored
-     * @return the buffer passed in
-     */
-    StringBuffer format(Object obj, StringBuffer toAppendTo, FieldPosition pos);
-}
diff --git a/lang/src/main/java/org/apache/commons/lang3/time/DateUtils.java b/lang/src/main/java/org/apache/commons/lang3/time/DateUtils.java
deleted file mode 100644
index 19b6aeb..0000000
--- a/lang/src/main/java/org/apache/commons/lang3/time/DateUtils.java
+++ /dev/null
@@ -1,1855 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- * 
- *      http://www.apache.org/licenses/LICENSE-2.0
- * 
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.commons.lang3.time;
-
-import java.text.ParseException;
-import java.text.ParsePosition;
-import java.text.SimpleDateFormat;
-import java.util.Calendar;
-import java.util.Date;
-import java.util.Iterator;
-import java.util.Locale;
-import java.util.NoSuchElementException;
-import java.util.concurrent.TimeUnit;
-
-/**
- * <p>A suite of utilities surrounding the use of the
- * {@link java.util.Calendar} and {@link java.util.Date} object.</p>
- * 
- * <p>DateUtils contains a lot of common methods considering manipulations
- * of Dates or Calendars. Some methods require some extra explanation.
- * The truncate, ceiling and round methods could be considered the Math.floor(),
- * Math.ceil() or Math.round versions for dates
- * This way date-fields will be ignored in bottom-up order.
- * As a complement to these methods we've introduced some fragment-methods.
- * With these methods the Date-fields will be ignored in top-down order.
- * Since a date without a year is not a valid date, you have to decide in what
- * kind of date-field you want your result, for instance milliseconds or days.
- * </p>
- * <p>
- * Several methods are provided for adding to {@code Date} objects, of the form 
- * {@code addXXX(Date date, int amount)}. It is important to note these methods 
- * use a {@code Calendar} internally (with default timezone and locale) and may
- * be affected by changes to daylight saving time (DST).
- * </p>
- *
- * @since 2.0
- * @version $Id$
- */
-public class DateUtils {
-
-    /**
-     * Number of milliseconds in a standard second.
-     * @since 2.1
-     */
-    public static final long MILLIS_PER_SECOND = 1000;
-    /**
-     * Number of milliseconds in a standard minute.
-     * @since 2.1
-     */
-    public static final long MILLIS_PER_MINUTE = 60 * MILLIS_PER_SECOND;
-    /**
-     * Number of milliseconds in a standard hour.
-     * @since 2.1
-     */
-    public static final long MILLIS_PER_HOUR = 60 * MILLIS_PER_MINUTE;
-    /**
-     * Number of milliseconds in a standard day.
-     * @since 2.1
-     */
-    public static final long MILLIS_PER_DAY = 24 * MILLIS_PER_HOUR;
-
-    /**
-     * This is half a month, so this represents whether a date is in the top
-     * or bottom half of the month.
-     */
-    public static final int SEMI_MONTH = 1001;
-
-    private static final int[][] fields = {
-            {Calendar.MILLISECOND},
-            {Calendar.SECOND},
-            {Calendar.MINUTE},
-            {Calendar.HOUR_OF_DAY, Calendar.HOUR},
-            {Calendar.DATE, Calendar.DAY_OF_MONTH, Calendar.AM_PM 
-                /* Calendar.DAY_OF_YEAR, Calendar.DAY_OF_WEEK, Calendar.DAY_OF_WEEK_IN_MONTH */
-            },
-            {Calendar.MONTH, DateUtils.SEMI_MONTH},
-            {Calendar.YEAR},
-            {Calendar.ERA}};
-
-    /**
-     * A week range, starting on Sunday.
-     */
-    public static final int RANGE_WEEK_SUNDAY = 1;
-    /**
-     * A week range, starting on Monday.
-     */
-    public static final int RANGE_WEEK_MONDAY = 2;
-    /**
-     * A week range, starting on the day focused.
-     */
-    public static final int RANGE_WEEK_RELATIVE = 3;
-    /**
-     * A week range, centered around the day focused.
-     */
-    public static final int RANGE_WEEK_CENTER = 4;
-    /**
-     * A month range, the week starting on Sunday.
-     */
-    public static final int RANGE_MONTH_SUNDAY = 5;
-    /**
-     * A month range, the week starting on Monday.
-     */
-    public static final int RANGE_MONTH_MONDAY = 6;
-
-    /**
-     * Calendar modification types.
-     */
-    private enum ModifyType {
-        /**
-         * Truncation.
-         */
-        TRUNCATE,
-        
-        /**
-         * Rounding. 
-         */
-        ROUND,
-        
-        /**
-         * Ceiling. 
-         */
-        CEILING
-    }
-
-    /**
-     * <p>{@code DateUtils} instances should NOT be constructed in
-     * standard programming. Instead, the static methods on the class should
-     * be used, such as {@code DateUtils.parseDate(str);}.</p>
-     *
-     * <p>This constructor is public to permit tools that require a JavaBean
-     * instance to operate.</p>
-     */
-    public DateUtils() {
-        super();
-    }
-
-    //-----------------------------------------------------------------------
-    /**
-     * <p>Checks if two date objects are on the same day ignoring time.</p>
-     *
-     * <p>28 Mar 2002 13:45 and 28 Mar 2002 06:01 would return true.
-     * 28 Mar 2002 13:45 and 12 Mar 2002 13:45 would return false.
-     * </p>
-     * 
-     * @param date1  the first date, not altered, not null
-     * @param date2  the second date, not altered, not null
-     * @return true if they represent the same day
-     * @throws IllegalArgumentException if either date is <code>null</code>
-     * @since 2.1
-     */
-    public static boolean isSameDay(final Date date1, final Date date2) {
-        if (date1 == null || date2 == null) {
-            throw new IllegalArgumentException("The date must not be null");
-        }
-        final Calendar cal1 = Calendar.getInstance();
-        cal1.setTime(date1);
-        final Calendar cal2 = Calendar.getInstance();
-        cal2.setTime(date2);
-        return isSameDay(cal1, cal2);
-    }
-
-    /**
-     * <p>Checks if two calendar objects are on the same day ignoring time.</p>
-     *
-     * <p>28 Mar 2002 13:45 and 28 Mar 2002 06:01 would return true.
-     * 28 Mar 2002 13:45 and 12 Mar 2002 13:45 would return false.
-     * </p>
-     * 
-     * @param cal1  the first calendar, not altered, not null
-     * @param cal2  the second calendar, not altered, not null
-     * @return true if they represent the same day
-     * @throws IllegalArgumentException if either calendar is <code>null</code>
-     * @since 2.1
-     */
-    public static boolean isSameDay(final Calendar cal1, final Calendar cal2) {
-        if (cal1 == null || cal2 == null) {
-            throw new IllegalArgumentException("The date must not be null");
-        }
-        return (cal1.get(Calendar.ERA) == cal2.get(Calendar.ERA) &&
-                cal1.get(Calendar.YEAR) == cal2.get(Calendar.YEAR) &&
-                cal1.get(Calendar.DAY_OF_YEAR) == cal2.get(Calendar.DAY_OF_YEAR));
-    }
-
-    //-----------------------------------------------------------------------
-    /**
-     * <p>Checks if two date objects represent the same instant in time.</p>
-     *
-     * <p>This method compares the long millisecond time of the two objects.</p>
-     * 
-     * @param date1  the first date, not altered, not null
-     * @param date2  the second date, not altered, not null
-     * @return true if they represent the same millisecond instant
-     * @throws IllegalArgumentException if either date is <code>null</code>
-     * @since 2.1
-     */
-    public static boolean isSameInstant(final Date date1, final Date date2) {
-        if (date1 == null || date2 == null) {
-            throw new IllegalArgumentException("The date must not be null");
-        }
-        return date1.getTime() == date2.getTime();
-    }
-
-    /**
-     * <p>Checks if two calendar objects represent the same instant in time.</p>
-     *
-     * <p>This method compares the long millisecond time of the two objects.</p>
-     * 
-     * @param cal1  the first calendar, not altered, not null
-     * @param cal2  the second calendar, not altered, not null
-     * @return true if they represent the same millisecond instant
-     * @throws IllegalArgumentException if either date is <code>null</code>
-     * @since 2.1
-     */
-    public static boolean isSameInstant(final Calendar cal1, final Calendar cal2) {
-        if (cal1 == null || cal2 == null) {
-            throw new IllegalArgumentException("The date must not be null");
-        }
-        return cal1.getTime().getTime() == cal2.getTime().getTime();
-    }
-
-    //-----------------------------------------------------------------------
-    /**
-     * <p>Checks if two calendar objects represent the same local time.</p>
-     *
-     * <p>This method compares the values of the fields of the two objects.
-     * In addition, both calendars must be the same of the same type.</p>
-     * 
-     * @param cal1  the first calendar, not altered, not null
-     * @param cal2  the second calendar, not altered, not null
-     * @return true if they represent the same millisecond instant
-     * @throws IllegalArgumentException if either date is <code>null</code>
-     * @since 2.1
-     */
-    public static boolean isSameLocalTime(final Calendar cal1, final Calendar cal2) {
-        if (cal1 == null || cal2 == null) {
-            throw new IllegalArgumentException("The date must not be null");
-        }
-        return (cal1.get(Calendar.MILLISECOND) == cal2.get(Calendar.MILLISECOND) &&
-                cal1.get(Calendar.SECOND) == cal2.get(Calendar.SECOND) &&
-                cal1.get(Calendar.MINUTE) == cal2.get(Calendar.MINUTE) &&
-                cal1.get(Calendar.HOUR_OF_DAY) == cal2.get(Calendar.HOUR_OF_DAY) &&
-                cal1.get(Calendar.DAY_OF_YEAR) == cal2.get(Calendar.DAY_OF_YEAR) &&
-                cal1.get(Calendar.YEAR) == cal2.get(Calendar.YEAR) &&
-                cal1.get(Calendar.ERA) == cal2.get(Calendar.ERA) &&
-                cal1.getClass() == cal2.getClass());
-    }
-
-    //-----------------------------------------------------------------------
-    /**
-     * <p>Parses a string representing a date by trying a variety of different parsers.</p>
-     * 
-     * <p>The parse will try each parse pattern in turn.
-     * A parse is only deemed successful if it parses the whole of the input string.
-     * If no parse patterns match, a ParseException is thrown.</p>
-     * The parser will be lenient toward the parsed date.
-     * 
-     * @param str  the date to parse, not null
-     * @param parsePatterns  the date format patterns to use, see SimpleDateFormat, not null
-     * @return the parsed date
-     * @throws IllegalArgumentException if the date string or pattern array is null
-     * @throws ParseException if none of the date patterns were suitable (or there were none)
-     */
-    public static Date parseDate(final String str, final String... parsePatterns) throws ParseException {
-        return parseDate(str, null, parsePatterns);
-    }
-    
-    //-----------------------------------------------------------------------
-    /**
-     * <p>Parses a string representing a date by trying a variety of different parsers,
-     * using the default date format symbols for the given locale.</p>
-     * 
-     * <p>The parse will try each parse pattern in turn.
-     * A parse is only deemed successful if it parses the whole of the input string.
-     * If no parse patterns match, a ParseException is thrown.</p>
-     * The parser will be lenient toward the parsed date.
-     * 
-     * @param str  the date to parse, not null
-     * @param locale the locale whose date format symbols should be used. If <code>null</code>,
-     * the system locale is used (as per {@link #parseDate(String, String...)}).
-     * @param parsePatterns  the date format patterns to use, see SimpleDateFormat, not null
-     * @return the parsed date
-     * @throws IllegalArgumentException if the date string or pattern array is null
-     * @throws ParseException if none of the date patterns were suitable (or there were none)
-     * @since 3.2
-     */
-    public static Date parseDate(final String str, final Locale locale, final String... parsePatterns) throws ParseException {
-        return parseDateWithLeniency(str, locale, parsePatterns, true);
-    }    
-
-  //-----------------------------------------------------------------------
-    /**
-     * <p>Parses a string representing a date by trying a variety of different parsers.</p>
-     * 
-     * <p>The parse will try each parse pattern in turn.
-     * A parse is only deemed successful if it parses the whole of the input string.
-     * If no parse patterns match, a ParseException is thrown.</p>
-     * The parser parses strictly - it does not allow for dates such as "February 942, 1996". 
-     * 
-     * @param str  the date to parse, not null
-     * @param parsePatterns  the date format patterns to use, see SimpleDateFormat, not null
-     * @return the parsed date
-     * @throws IllegalArgumentException if the date string or pattern array is null
-     * @throws ParseException if none of the date patterns were suitable
-     * @since 2.5
-     */
-    public static Date parseDateStrictly(final String str, final String... parsePatterns) throws ParseException {
-        return parseDateStrictly(str, null, parsePatterns);
-    }
-
-    /**
-     * <p>Parses a string representing a date by trying a variety of different parsers,
-     * using the default date format symbols for the given locale..</p>
-     * 
-     * <p>The parse will try each parse pattern in turn.
-     * A parse is only deemed successful if it parses the whole of the input string.
-     * If no parse patterns match, a ParseException is thrown.</p>
-     * The parser parses strictly - it does not allow for dates such as "February 942, 1996". 
-     * 
-     * @param str  the date to parse, not null
-     * @param locale the locale whose date format symbols should be used. If <code>null</code>,
-     * the system locale is used (as per {@link #parseDateStrictly(String, String...)}).
-     * @param parsePatterns  the date format patterns to use, see SimpleDateFormat, not null
-     * @return the parsed date
-     * @throws IllegalArgumentException if the date string or pattern array is null
-     * @throws ParseException if none of the date patterns were suitable
-     * @since 3.2
-     */
-    public static Date parseDateStrictly(final String str, final Locale locale, final String... parsePatterns) throws ParseException {
-        return parseDateWithLeniency(str, null, parsePatterns, false);
-    }    
-
-    /**
-     * <p>Parses a string representing a date by trying a variety of different parsers.</p>
-     * 
-     * <p>The parse will try each parse pattern in turn.
-     * A parse is only deemed successful if it parses the whole of the input string.
-     * If no parse patterns match, a ParseException is thrown.</p>
-     * 
-     * @param str  the date to parse, not null
-     * @param locale the locale to use when interpretting the pattern, can be null in which
-     * case the default system locale is used
-     * @param parsePatterns  the date format patterns to use, see SimpleDateFormat, not null
-     * @param lenient Specify whether or not date/time parsing is to be lenient.
-     * @return the parsed date
-     * @throws IllegalArgumentException if the date string or pattern array is null
-     * @throws ParseException if none of the date patterns were suitable
-     * @see java.util.Calendar#isLenient()
-     */
-    private static Date parseDateWithLeniency(
-            final String str, final Locale locale, final String[] parsePatterns, final boolean lenient) throws ParseException {
-        if (str == null || parsePatterns == null) {
-            throw new IllegalArgumentException("Date and Patterns must not be null");
-        }
-        
-        SimpleDateFormat parser;
-        if (locale == null) {
-            parser = new SimpleDateFormat();
-        } else {
-            parser = new SimpleDateFormat("", locale);
-        }
-        
-        parser.setLenient(lenient);
-        final ParsePosition pos = new ParsePosition(0);
-        for (final String parsePattern : parsePatterns) {
-
-            String pattern = parsePattern;
-
-            // LANG-530 - need to make sure 'ZZ' output doesn't get passed to SimpleDateFormat
-            if (parsePattern.endsWith("ZZ")) {
-                pattern = pattern.substring(0, pattern.length() - 1);
-            }
-            
-            parser.applyPattern(pattern);
-            pos.setIndex(0);
-
-            String str2 = str;
-            // LANG-530 - need to make sure 'ZZ' output doesn't hit SimpleDateFormat as it will ParseException
-            if (parsePattern.endsWith("ZZ")) {
-                str2 = str.replaceAll("([-+][0-9][0-9]):([0-9][0-9])$", "$1$2"); 
-            }
-
-            final Date date = parser.parse(str2, pos);
-            if (date != null && pos.getIndex() == str2.length()) {
-                return date;
-            }
-        }
-        throw new ParseException("Unable to parse the date: " + str, -1);
-    }
-
-    //-----------------------------------------------------------------------
-    /**
-     * Adds a number of years to a date returning a new object.
-     * The original {@code Date} is unchanged.
-     *
-     * @param date  the date, not null
-     * @param amount  the amount to add, may be negative
-     * @return the new {@code Date} with the amount added
-     * @throws IllegalArgumentException if the date is null
-     */
-    public static Date addYears(final Date date, final int amount) {
-        return add(date, Calendar.YEAR, amount);
-    }
-
-    //-----------------------------------------------------------------------
-    /**
-     * Adds a number of months to a date returning a new object.
-     * The original {@code Date} is unchanged.
-     *
-     * @param date  the date, not null
-     * @param amount  the amount to add, may be negative
-     * @return the new {@code Date} with the amount added
-     * @throws IllegalArgumentException if the date is null
-     */
-    public static Date addMonths(final Date date, final int amount) {
-        return add(date, Calendar.MONTH, amount);
-    }
-
-    //-----------------------------------------------------------------------
-    /**
-     * Adds a number of weeks to a date returning a new object.
-     * The original {@code Date} is unchanged.
-     *
-     * @param date  the date, not null
-     * @param amount  the amount to add, may be negative
-     * @return the new {@code Date} with the amount added
-     * @throws IllegalArgumentException if the date is null
-     */
-    public static Date addWeeks(final Date date, final int amount) {
-        return add(date, Calendar.WEEK_OF_YEAR, amount);
-    }
-
-    //-----------------------------------------------------------------------
-    /**
-     * Adds a number of days to a date returning a new object.
-     * The original {@code Date} is unchanged.
-     *
-     * @param date  the date, not null
-     * @param amount  the amount to add, may be negative
-     * @return the new {@code Date} with the amount added
-     * @throws IllegalArgumentException if the date is null
-     */
-    public static Date addDays(final Date date, final int amount) {
-        return add(date, Calendar.DAY_OF_MONTH, amount);
-    }
-
-    //-----------------------------------------------------------------------
-    /**
-     * Adds a number of hours to a date returning a new object.
-     * The original {@code Date} is unchanged.
-     *
-     * @param date  the date, not null
-     * @param amount  the amount to add, may be negative
-     * @return the new {@code Date} with the amount added
-     * @throws IllegalArgumentException if the date is null
-     */
-    public static Date addHours(final Date date, final int amount) {
-        return add(date, Calendar.HOUR_OF_DAY, amount);
-    }
-
-    //-----------------------------------------------------------------------
-    /**
-     * Adds a number of minutes to a date returning a new object.
-     * The original {@code Date} is unchanged.
-     *
-     * @param date  the date, not null
-     * @param amount  the amount to add, may be negative
-     * @return the new {@code Date} with the amount added
-     * @throws IllegalArgumentException if the date is null
-     */
-    public static Date addMinutes(final Date date, final int amount) {
-        return add(date, Calendar.MINUTE, amount);
-    }
-
-    //-----------------------------------------------------------------------
-    /**
-     * Adds a number of seconds to a date returning a new object.
-     * The original {@code Date} is unchanged.
-     *
-     * @param date  the date, not null
-     * @param amount  the amount to add, may be negative
-     * @return the new {@code Date} with the amount added
-     * @throws IllegalArgumentException if the date is null
-     */
-    public static Date addSeconds(final Date date, final int amount) {
-        return add(date, Calendar.SECOND, amount);
-    }
-
-    //-----------------------------------------------------------------------
-    /**
-     * Adds a number of milliseconds to a date returning a new object.
-     * The original {@code Date} is unchanged.
-     *
-     * @param date  the date, not null
-     * @param amount  the amount to add, may be negative
-     * @return the new {@code Date} with the amount added
-     * @throws IllegalArgumentException if the date is null
-     */
-    public static Date addMilliseconds(final Date date, final int amount) {
-        return add(date, Calendar.MILLISECOND, amount);
-    }
-
-    //-----------------------------------------------------------------------
-    /**
-     * Adds to a date returning a new object.
-     * The original {@code Date} is unchanged.
-     *
-     * @param date  the date, not null
-     * @param calendarField  the calendar field to add to
-     * @param amount  the amount to add, may be negative
-     * @return the new {@code Date} with the amount added
-     * @throws IllegalArgumentException if the date is null
-     */
-    private static Date add(final Date date, final int calendarField, final int amount) {
-        if (date == null) {
-            throw new IllegalArgumentException("The date must not be null");
-        }
-        final Calendar c = Calendar.getInstance();
-        c.setTime(date);
-        c.add(calendarField, amount);
-        return c.getTime();
-    }
-    
-    //-----------------------------------------------------------------------
-    /**
-     * Sets the years field to a date returning a new object.
-     * The original {@code Date} is unchanged.
-     *
-     * @param date  the date, not null
-     * @param amount the amount to set
-     * @return a new {@code Date} set with the specified value
-     * @throws IllegalArgumentException if the date is null
-     * @since 2.4
-     */
-    public static Date setYears(final Date date, final int amount) {
-        return set(date, Calendar.YEAR, amount);
-    }
-
-    //-----------------------------------------------------------------------
-    /**
-     * Sets the months field to a date returning a new object.
-     * The original {@code Date} is unchanged.
-     *
-     * @param date  the date, not null
-     * @param amount the amount to set
-     * @return a new {@code Date} set with the specified value
-     * @throws IllegalArgumentException if the date is null
-     * @since 2.4
-     */
-    public static Date setMonths(final Date date, final int amount) {
-        return set(date, Calendar.MONTH, amount);
-    }
-
-    //-----------------------------------------------------------------------
-    /**
-     * Sets the day of month field to a date returning a new object.
-     * The original {@code Date} is unchanged.
-     *
-     * @param date  the date, not null
-     * @param amount the amount to set
-     * @return a new {@code Date} set with the specified value
-     * @throws IllegalArgumentException if the date is null
-     * @since 2.4
-     */
-    public static Date setDays(final Date date, final int amount) {
-        return set(date, Calendar.DAY_OF_MONTH, amount);
-    }
-
-    //-----------------------------------------------------------------------
-    /**
-     * Sets the hours field to a date returning a new object.  Hours range 
-     * from  0-23.
-     * The original {@code Date} is unchanged.
-     *
-     * @param date  the date, not null
-     * @param amount the amount to set
-     * @return a new {@code Date} set with the specified value
-     * @throws IllegalArgumentException if the date is null
-     * @since 2.4
-     */
-    public static Date setHours(final Date date, final int amount) {
-        return set(date, Calendar.HOUR_OF_DAY, amount);
-    }
-
-    //-----------------------------------------------------------------------
-    /**
-     * Sets the minute field to a date returning a new object.
-     * The original {@code Date} is unchanged.
-     *
-     * @param date  the date, not null
-     * @param amount the amount to set
-     * @return a new {@code Date} set with the specified value
-     * @throws IllegalArgumentException if the date is null
-     * @since 2.4
-     */
-    public static Date setMinutes(final Date date, final int amount) {
-        return set(date, Calendar.MINUTE, amount);
-    }
-    
-    //-----------------------------------------------------------------------
-    /**
-     * Sets the seconds field to a date returning a new object.
-     * The original {@code Date} is unchanged.
-     *
-     * @param date  the date, not null
-     * @param amount the amount to set
-     * @return a new {@code Date} set with the specified value
-     * @throws IllegalArgumentException if the date is null
-     * @since 2.4
-     */
-    public static Date setSeconds(final Date date, final int amount) {
-        return set(date, Calendar.SECOND, amount);
-    }
-
-    //-----------------------------------------------------------------------
-    /**
-     * Sets the miliseconds field to a date returning a new object.
-     * The original {@code Date} is unchanged.
-     *
-     * @param date  the date, not null
-     * @param amount the amount to set
-     * @return a new {@code Date} set with the specified value
-     * @throws IllegalArgumentException if the date is null
-     * @since 2.4
-     */
-    public static Date setMilliseconds(final Date date, final int amount) {
-        return set(date, Calendar.MILLISECOND, amount);
-    } 
-    
-    //-----------------------------------------------------------------------
-    /**
-     * Sets the specified field to a date returning a new object.  
-     * This does not use a lenient calendar.
-     * The original {@code Date} is unchanged.
-     *
-     * @param date  the date, not null
-     * @param calendarField  the {@code Calendar} field to set the amount to
-     * @param amount the amount to set
-     * @return a new {@code Date} set with the specified value
-     * @throws IllegalArgumentException if the date is null
-     * @since 2.4
-     */
-    private static Date set(final Date date, final int calendarField, final int amount) {
-        if (date == null) {
-            throw new IllegalArgumentException("The date must not be null");
-        }
-        // getInstance() returns a new object, so this method is thread safe.
-        final Calendar c = Calendar.getInstance();
-        c.setLenient(false);
-        c.setTime(date);
-        c.set(calendarField, amount);
-        return c.getTime();
-    }   
-
-    //-----------------------------------------------------------------------
-    /**
-     * Converts a {@code Date} into a {@code Calendar}. 
-     * 
-     * @param date the date to convert to a Calendar
-     * @return the created Calendar
-     * @throws NullPointerException if null is passed in
-     * @since 3.0
-     */
-    public static Calendar toCalendar(final Date date) {
-        final Calendar c = Calendar.getInstance();
-        c.setTime(date);
-        return c;
-    }
-    
-    //-----------------------------------------------------------------------
-    /**
-     * <p>Rounds a date, leaving the field specified as the most
-     * significant field.</p>
-     *
-     * <p>For example, if you had the date-time of 28 Mar 2002
-     * 13:45:01.231, if this was passed with HOUR, it would return
-     * 28 Mar 2002 14:00:00.000. If this was passed with MONTH, it
-     * would return 1 April 2002 0:00:00.000.</p>
-     * 
-     * <p>For a date in a timezone that handles the change to daylight
-     * saving time, rounding to Calendar.HOUR_OF_DAY will behave as follows.
-     * Suppose daylight saving time begins at 02:00 on March 30. Rounding a 
-     * date that crosses this time would produce the following values:
-     * </p>
-     * <ul>
-     * <li>March 30, 2003 01:10 rounds to March 30, 2003 01:00</li>
-     * <li>March 30, 2003 01:40 rounds to March 30, 2003 03:00</li>
-     * <li>March 30, 2003 02:10 rounds to March 30, 2003 03:00</li>
-     * <li>March 30, 2003 02:40 rounds to March 30, 2003 04:00</li>
-     * </ul>
-     * 
-     * @param date  the date to work with, not null
-     * @param field  the field from {@code Calendar} or {@code SEMI_MONTH}
-     * @return the different rounded date, not null
-     * @throws ArithmeticException if the year is over 280 million
-     */
-    public static Date round(final Date date, final int field) {
-        if (date == null) {
-            throw new IllegalArgumentException("The date must not be null");
-        }
-        final Calendar gval = Calendar.getInstance();
-        gval.setTime(date);
-        modify(gval, field, ModifyType.ROUND);
-        return gval.getTime();
-    }
-
-    /**
-     * <p>Rounds a date, leaving the field specified as the most
-     * significant field.</p>
-     *
-     * <p>For example, if you had the date-time of 28 Mar 2002
-     * 13:45:01.231, if this was passed with HOUR, it would return
-     * 28 Mar 2002 14:00:00.000. If this was passed with MONTH, it
-     * would return 1 April 2002 0:00:00.000.</p>
-     * 
-     * <p>For a date in a timezone that handles the change to daylight
-     * saving time, rounding to Calendar.HOUR_OF_DAY will behave as follows.
-     * Suppose daylight saving time begins at 02:00 on March 30. Rounding a 
-     * date that crosses this time would produce the following values:
-     * </p>
-     * <ul>
-     * <li>March 30, 2003 01:10 rounds to March 30, 2003 01:00</li>
-     * <li>March 30, 2003 01:40 rounds to March 30, 2003 03:00</li>
-     * <li>March 30, 2003 02:10 rounds to March 30, 2003 03:00</li>
-     * <li>March 30, 2003 02:40 rounds to March 30, 2003 04:00</li>
-     * </ul>
-     * 
-     * @param date  the date to work with, not null
-     * @param field  the field from {@code Calendar} or <code>SEMI_MONTH</code>
-     * @return the different rounded date, not null
-     * @throws IllegalArgumentException if the date is <code>null</code>
-     * @throws ArithmeticException if the year is over 280 million
-     */
-    public static Calendar round(final Calendar date, final int field) {
-        if (date == null) {
-            throw new IllegalArgumentException("The date must not be null");
-        }
-        final Calendar rounded = (Calendar) date.clone();
-        modify(rounded, field, ModifyType.ROUND);
-        return rounded;
-    }
-
-    /**
-     * <p>Rounds a date, leaving the field specified as the most
-     * significant field.</p>
-     *
-     * <p>For example, if you had the date-time of 28 Mar 2002
-     * 13:45:01.231, if this was passed with HOUR, it would return
-     * 28 Mar 2002 14:00:00.000. If this was passed with MONTH, it
-     * would return 1 April 2002 0:00:00.000.</p>
-     * 
-     * <p>For a date in a timezone that handles the change to daylight
-     * saving time, rounding to Calendar.HOUR_OF_DAY will behave as follows.
-     * Suppose daylight saving time begins at 02:00 on March 30. Rounding a 
-     * date that crosses this time would produce the following values:
-     * </p>
-     * <ul>
-     * <li>March 30, 2003 01:10 rounds to March 30, 2003 01:00</li>
-     * <li>March 30, 2003 01:40 rounds to March 30, 2003 03:00</li>
-     * <li>March 30, 2003 02:10 rounds to March 30, 2003 03:00</li>
-     * <li>March 30, 2003 02:40 rounds to March 30, 2003 04:00</li>
-     * </ul>
-     * 
-     * @param date  the date to work with, either {@code Date} or {@code Calendar}, not null
-     * @param field  the field from {@code Calendar} or <code>SEMI_MONTH</code>
-     * @return the different rounded date, not null
-     * @throws IllegalArgumentException if the date is <code>null</code>
-     * @throws ClassCastException if the object type is not a {@code Date} or {@code Calendar}
-     * @throws ArithmeticException if the year is over 280 million
-     */
-    public static Date round(final Object date, final int field) {
-        if (date == null) {
-            throw new IllegalArgumentException("The date must not be null");
-        }
-        if (date instanceof Date) {
-            return round((Date) date, field);
-        } else if (date instanceof Calendar) {
-            return round((Calendar) date, field).getTime();
-        } else {
-            throw new ClassCastException("Could not round " + date);
-        }
-    }
-
-    //-----------------------------------------------------------------------
-    /**
-     * <p>Truncates a date, leaving the field specified as the most
-     * significant field.</p>
-     *
-     * <p>For example, if you had the date-time of 28 Mar 2002
-     * 13:45:01.231, if you passed with HOUR, it would return 28 Mar
-     * 2002 13:00:00.000.  If this was passed with MONTH, it would
-     * return 1 Mar 2002 0:00:00.000.</p>
-     * 
-     * @param date  the date to work with, not null
-     * @param field  the field from {@code Calendar} or <code>SEMI_MONTH</code>
-     * @return the different truncated date, not null
-     * @throws IllegalArgumentException if the date is <code>null</code>
-     * @throws ArithmeticException if the year is over 280 million
-     */
-    public static Date truncate(final Date date, final int field) {
-        if (date == null) {
-            throw new IllegalArgumentException("The date must not be null");
-        }
-        final Calendar gval = Calendar.getInstance();
-        gval.setTime(date);
-        modify(gval, field, ModifyType.TRUNCATE);
-        return gval.getTime();
-    }
-
-    /**
-     * <p>Truncates a date, leaving the field specified as the most
-     * significant field.</p>
-     *
-     * <p>For example, if you had the date-time of 28 Mar 2002
-     * 13:45:01.231, if you passed with HOUR, it would return 28 Mar
-     * 2002 13:00:00.000.  If this was passed with MONTH, it would
-     * return 1 Mar 2002 0:00:00.000.</p>
-     * 
-     * @param date  the date to work with, not null
-     * @param field  the field from {@code Calendar} or <code>SEMI_MONTH</code>
-     * @return the different truncated date, not null
-     * @throws IllegalArgumentException if the date is <code>null</code>
-     * @throws ArithmeticException if the year is over 280 million
-     */
-    public static Calendar truncate(final Calendar date, final int field) {
-        if (date == null) {
-            throw new IllegalArgumentException("The date must not be null");
-        }
-        final Calendar truncated = (Calendar) date.clone();
-        modify(truncated, field, ModifyType.TRUNCATE);
-        return truncated;
-    }
-
-    /**
-     * <p>Truncates a date, leaving the field specified as the most
-     * significant field.</p>
-     *
-     * <p>For example, if you had the date-time of 28 Mar 2002
-     * 13:45:01.231, if you passed with HOUR, it would return 28 Mar
-     * 2002 13:00:00.000.  If this was passed with MONTH, it would
-     * return 1 Mar 2002 0:00:00.000.</p>
-     * 
-     * @param date  the date to work with, either {@code Date} or {@code Calendar}, not null
-     * @param field  the field from {@code Calendar} or <code>SEMI_MONTH</code>
-     * @return the different truncated date, not null
-     * @throws IllegalArgumentException if the date is <code>null</code>
-     * @throws ClassCastException if the object type is not a {@code Date} or {@code Calendar}
-     * @throws ArithmeticException if the year is over 280 million
-     */
-    public static Date truncate(final Object date, final int field) {
-        if (date == null) {
-            throw new IllegalArgumentException("The date must not be null");
-        }
-        if (date instanceof Date) {
-            return truncate((Date) date, field);
-        } else if (date instanceof Calendar) {
-            return truncate((Calendar) date, field).getTime();
-        } else {
-            throw new ClassCastException("Could not truncate " + date);
-        }
-    }
-    
-  //-----------------------------------------------------------------------
-    /**
-     * <p>Gets a date ceiling, leaving the field specified as the most
-     * significant field.</p>
-     *
-     * <p>For example, if you had the date-time of 28 Mar 2002
-     * 13:45:01.231, if you passed with HOUR, it would return 28 Mar
-     * 2002 14:00:00.000.  If this was passed with MONTH, it would
-     * return 1 Apr 2002 0:00:00.000.</p>
-     * 
-     * @param date  the date to work with, not null
-     * @param field  the field from {@code Calendar} or <code>SEMI_MONTH</code>
-     * @return the different ceil date, not null
-     * @throws IllegalArgumentException if the date is <code>null</code>
-     * @throws ArithmeticException if the year is over 280 million
-     * @since 2.5
-     */
-    public static Date ceiling(final Date date, final int field) {
-        if (date == null) {
-            throw new IllegalArgumentException("The date must not be null");
-        }
-        final Calendar gval = Calendar.getInstance();
-        gval.setTime(date);
-        modify(gval, field, ModifyType.CEILING);
-        return gval.getTime();
-    }
-
-    /**
-     * <p>Gets a date ceiling, leaving the field specified as the most
-     * significant field.</p>
-     *
-     * <p>For example, if you had the date-time of 28 Mar 2002
-     * 13:45:01.231, if you passed with HOUR, it would return 28 Mar
-     * 2002 14:00:00.000.  If this was passed with MONTH, it would
-     * return 1 Apr 2002 0:00:00.000.</p>
-     * 
-     * @param date  the date to work with, not null
-     * @param field  the field from {@code Calendar} or <code>SEMI_MONTH</code>
-     * @return the different ceil date, not null
-     * @throws IllegalArgumentException if the date is <code>null</code>
-     * @throws ArithmeticException if the year is over 280 million
-     * @since 2.5
-     */
-    public static Calendar ceiling(final Calendar date, final int field) {
-        if (date == null) {
-            throw new IllegalArgumentException("The date must not be null");
-        }
-        final Calendar ceiled = (Calendar) date.clone();
-        modify(ceiled, field, ModifyType.CEILING);
-        return ceiled;
-    }
-
-    /**
-     * <p>Gets a date ceiling, leaving the field specified as the most
-     * significant field.</p>
-     *
-     * <p>For example, if you had the date-time of 28 Mar 2002
-     * 13:45:01.231, if you passed with HOUR, it would return 28 Mar
-     * 2002 14:00:00.000.  If this was passed with MONTH, it would
-     * return 1 Apr 2002 0:00:00.000.</p>
-     * 
-     * @param date  the date to work with, either {@code Date} or {@code Calendar}, not null
-     * @param field  the field from {@code Calendar} or <code>SEMI_MONTH</code>
-     * @return the different ceil date, not null
-     * @throws IllegalArgumentException if the date is <code>null</code>
-     * @throws ClassCastException if the object type is not a {@code Date} or {@code Calendar}
-     * @throws ArithmeticException if the year is over 280 million
-     * @since 2.5
-     */
-    public static Date ceiling(final Object date, final int field) {
-        if (date == null) {
-            throw new IllegalArgumentException("The date must not be null");
-        }
-        if (date instanceof Date) {
-            return ceiling((Date) date, field);
-        } else if (date instanceof Calendar) {
-            return ceiling((Calendar) date, field).getTime();
-        } else {
-            throw new ClassCastException("Could not find ceiling of for type: " + date.getClass());
-        }
-    }
-
-    //-----------------------------------------------------------------------
-    /**
-     * <p>Internal calculation method.</p>
-     * 
-     * @param val  the calendar, not null
-     * @param field  the field constant
-     * @param modType  type to truncate, round or ceiling
-     * @throws ArithmeticException if the year is over 280 million
-     */
-    private static void modify(final Calendar val, final int field, final ModifyType modType) {
-        if (val.get(Calendar.YEAR) > 280000000) {
-            throw new ArithmeticException("Calendar value too large for accurate calculations");
-        }
-        
-        if (field == Calendar.MILLISECOND) {
-            return;
-        }
-
-        // ----------------- Fix for LANG-59 ---------------------- START ---------------
-        // see http://issues.apache.org/jira/browse/LANG-59
-        //
-        // Manually truncate milliseconds, seconds and minutes, rather than using
-        // Calendar methods.
-
-        final Date date = val.getTime();
-        long time = date.getTime();
-        boolean done = false;
-
-        // truncate milliseconds
-        final int millisecs = val.get(Calendar.MILLISECOND);
-        if (ModifyType.TRUNCATE == modType || millisecs < 500) {
-            time = time - millisecs;
-        }
-        if (field == Calendar.SECOND) {
-            done = true;
-        }
-
-        // truncate seconds
-        final int seconds = val.get(Calendar.SECOND);
-        if (!done && (ModifyType.TRUNCATE == modType || seconds < 30)) {
-            time = time - (seconds * 1000L);
-        }
-        if (field == Calendar.MINUTE) {
-            done = true;
-        }
-
-        // truncate minutes
-        final int minutes = val.get(Calendar.MINUTE);
-        if (!done && (ModifyType.TRUNCATE == modType || minutes < 30)) {
-            time = time - (minutes * 60000L);
-        }
-
-        // reset time
-        if (date.getTime() != time) {
-            date.setTime(time);
-            val.setTime(date);
-        }
-        // ----------------- Fix for LANG-59 ----------------------- END ----------------
-
-        boolean roundUp = false;
-        for (final int[] aField : fields) {
-            for (final int element : aField) {
-                if (element == field) {
-                    //This is our field... we stop looping
-                    if (modType == ModifyType.CEILING || (modType == ModifyType.ROUND && roundUp)) {
-                        if (field == DateUtils.SEMI_MONTH) {
-                            //This is a special case that's hard to generalize
-                            //If the date is 1, we round up to 16, otherwise
-                            //  we subtract 15 days and add 1 month
-                            if (val.get(Calendar.DATE) == 1) {
-                                val.add(Calendar.DATE, 15);
-                            } else {
-                                val.add(Calendar.DATE, -15);
-                                val.add(Calendar.MONTH, 1);
-                            }
-// ----------------- Fix for LANG-440 ---------------------- START ---------------
-                        } else if (field == Calendar.AM_PM) {
-                            // This is a special case
-                            // If the time is 0, we round up to 12, otherwise
-                            //  we subtract 12 hours and add 1 day
-                            if (val.get(Calendar.HOUR_OF_DAY) == 0) {
-                                val.add(Calendar.HOUR_OF_DAY, 12);
-                            } else {
-                                val.add(Calendar.HOUR_OF_DAY, -12);
-                                val.add(Calendar.DATE, 1);
-                            }
-// ----------------- Fix for LANG-440 ---------------------- END ---------------
-                        } else {
-                            //We need at add one to this field since the
-                            //  last number causes us to round up
-                            val.add(aField[0], 1);
-                        }
-                    }
-                    return;
-                }
-            }
-            //We have various fields that are not easy roundings
-            int offset = 0;
-            boolean offsetSet = false;
-            //These are special types of fields that require different rounding rules
-            switch (field) {
-                case DateUtils.SEMI_MONTH:
-                    if (aField[0] == Calendar.DATE) {
-                        //If we're going to drop the DATE field's value,
-                        //  we want to do this our own way.
-                        //We need to subtrace 1 since the date has a minimum of 1
-                        offset = val.get(Calendar.DATE) - 1;
-                        //If we're above 15 days adjustment, that means we're in the
-                        //  bottom half of the month and should stay accordingly.
-                        if (offset >= 15) {
-                            offset -= 15;
-                        }
-                        //Record whether we're in the top or bottom half of that range
-                        roundUp = offset > 7;
-                        offsetSet = true;
-                    }
-                    break;
-                case Calendar.AM_PM:
-                    if (aField[0] == Calendar.HOUR_OF_DAY) {
-                        //If we're going to drop the HOUR field's value,
-                        //  we want to do this our own way.
-                        offset = val.get(Calendar.HOUR_OF_DAY);
-                        if (offset >= 12) {
-                            offset -= 12;
-                        }
-                        roundUp = offset >= 6;
-                        offsetSet = true;
-                    }
-                    break;
-                default:
-                    break;
-            }
-            if (!offsetSet) {
-                final int min = val.getActualMinimum(aField[0]);
-                final int max = val.getActualMaximum(aField[0]);
-                //Calculate the offset from the minimum allowed value
-                offset = val.get(aField[0]) - min;
-                //Set roundUp if this is more than half way between the minimum and maximum
-                roundUp = offset > ((max - min) / 2);
-            }
-            //We need to remove this field
-            if (offset != 0) {
-                val.set(aField[0], val.get(aField[0]) - offset);
-            }
-        }
-        throw new IllegalArgumentException("The field " + field + " is not supported");
-
-    }
-
-    //-----------------------------------------------------------------------
-    /**
-     * <p>Constructs an <code>Iterator</code> over each day in a date
-     * range defined by a focus date and range style.</p>
-     *
-     * <p>For instance, passing Thursday, July 4, 2002 and a
-     * <code>RANGE_MONTH_SUNDAY</code> will return an <code>Iterator</code>
-     * that starts with Sunday, June 30, 2002 and ends with Saturday, August 3,
-     * 2002, returning a Calendar instance for each intermediate day.</p>
-     *
-     * <p>This method provides an iterator that returns Calendar objects.
-     * The days are progressed using {@link Calendar#add(int, int)}.</p>
-     *
-     * @param focus  the date to work with, not null
-     * @param rangeStyle  the style constant to use. Must be one of
-     * {@link DateUtils#RANGE_MONTH_SUNDAY}, 
-     * {@link DateUtils#RANGE_MONTH_MONDAY},
-     * {@link DateUtils#RANGE_WEEK_SUNDAY},
-     * {@link DateUtils#RANGE_WEEK_MONDAY},
-     * {@link DateUtils#RANGE_WEEK_RELATIVE},
-     * {@link DateUtils#RANGE_WEEK_CENTER}
-     * @return the date iterator, not null, not null
-     * @throws IllegalArgumentException if the date is <code>null</code>
-     * @throws IllegalArgumentException if the rangeStyle is invalid
-     */
-    public static Iterator<Calendar> iterator(final Date focus, final int rangeStyle) {
-        if (focus == null) {
-            throw new IllegalArgumentException("The date must not be null");
-        }
-        final Calendar gval = Calendar.getInstance();
-        gval.setTime(focus);
-        return iterator(gval, rangeStyle);
-    }
-
-    /**
-     * <p>Constructs an <code>Iterator</code> over each day in a date
-     * range defined by a focus date and range style.</p>
-     *
-     * <p>For instance, passing Thursday, July 4, 2002 and a
-     * <code>RANGE_MONTH_SUNDAY</code> will return an <code>Iterator</code>
-     * that starts with Sunday, June 30, 2002 and ends with Saturday, August 3,
-     * 2002, returning a Calendar instance for each intermediate day.</p>
-     *
-     * <p>This method provides an iterator that returns Calendar objects.
-     * The days are progressed using {@link Calendar#add(int, int)}.</p>
-     *
-     * @param focus  the date to work with, not null
-     * @param rangeStyle  the style constant to use. Must be one of
-     * {@link DateUtils#RANGE_MONTH_SUNDAY}, 
-     * {@link DateUtils#RANGE_MONTH_MONDAY},
-     * {@link DateUtils#RANGE_WEEK_SUNDAY},
-     * {@link DateUtils#RANGE_WEEK_MONDAY},
-     * {@link DateUtils#RANGE_WEEK_RELATIVE},
-     * {@link DateUtils#RANGE_WEEK_CENTER}
-     * @return the date iterator, not null
-     * @throws IllegalArgumentException if the date is <code>null</code>
-     * @throws IllegalArgumentException if the rangeStyle is invalid
-     */
-    public static Iterator<Calendar> iterator(final Calendar focus, final int rangeStyle) {
-        if (focus == null) {
-            throw new IllegalArgumentException("The date must not be null");
-        }
-        Calendar start = null;
-        Calendar end = null;
-        int startCutoff = Calendar.SUNDAY;
-        int endCutoff = Calendar.SATURDAY;
-        switch (rangeStyle) {
-            case RANGE_MONTH_SUNDAY:
-            case RANGE_MONTH_MONDAY:
-                //Set start to the first of the month
-                start = truncate(focus, Calendar.MONTH);
-                //Set end to the last of the month
-                end = (Calendar) start.clone();
-                end.add(Calendar.MONTH, 1);
-                end.add(Calendar.DATE, -1);
-                //Loop start back to the previous sunday or monday
-                if (rangeStyle == RANGE_MONTH_MONDAY) {
-                    startCutoff = Calendar.MONDAY;
-                    endCutoff = Calendar.SUNDAY;
-                }
-                break;
-            case RANGE_WEEK_SUNDAY:
-            case RANGE_WEEK_MONDAY:
-            case RANGE_WEEK_RELATIVE:
-            case RANGE_WEEK_CENTER:
-                //Set start and end to the current date
-                start = truncate(focus, Calendar.DATE);
-                end = truncate(focus, Calendar.DATE);
-                switch (rangeStyle) {
-                    case RANGE_WEEK_SUNDAY:
-                        //already set by default
-                        break;
-                    case RANGE_WEEK_MONDAY:
-                        startCutoff = Calendar.MONDAY;
-                        endCutoff = Calendar.SUNDAY;
-                        break;
-                    case RANGE_WEEK_RELATIVE:
-                        startCutoff = focus.get(Calendar.DAY_OF_WEEK);
-                        endCutoff = startCutoff - 1;
-                        break;
-                    case RANGE_WEEK_CENTER:
-                        startCutoff = focus.get(Calendar.DAY_OF_WEEK) - 3;
-                        endCutoff = focus.get(Calendar.DAY_OF_WEEK) + 3;
-                        break;
-                    default:
-                        break;
-                }
-                break;
-            default:
-                throw new IllegalArgumentException("The range style " + rangeStyle + " is not valid.");
-        }
-        if (startCutoff < Calendar.SUNDAY) {
-            startCutoff += 7;
-        }
-        if (startCutoff > Calendar.SATURDAY) {
-            startCutoff -= 7;
-        }
-        if (endCutoff < Calendar.SUNDAY) {
-            endCutoff += 7;
-        }
-        if (endCutoff > Calendar.SATURDAY) {
-            endCutoff -= 7;
-        }
-        while (start.get(Calendar.DAY_OF_WEEK) != startCutoff) {
-            start.add(Calendar.DATE, -1);
-        }
-        while (end.get(Calendar.DAY_OF_WEEK) != endCutoff) {
-            end.add(Calendar.DATE, 1);
-        }
-        return new DateIterator(start, end);
-    }
-
-    /**
-     * <p>Constructs an <code>Iterator</code> over each day in a date
-     * range defined by a focus date and range style.</p>
-     *
-     * <p>For instance, passing Thursday, July 4, 2002 and a
-     * <code>RANGE_MONTH_SUNDAY</code> will return an <code>Iterator</code>
-     * that starts with Sunday, June 30, 2002 and ends with Saturday, August 3,
-     * 2002, returning a Calendar instance for each intermediate day.</p>
-     *
-     * @param focus  the date to work with, either {@code Date} or {@code Calendar}, not null
-     * @param rangeStyle  the style constant to use. Must be one of the range
-     * styles listed for the {@link #iterator(Calendar, int)} method.
-     * @return the date iterator, not null
-     * @throws IllegalArgumentException if the date is <code>null</code>
-     * @throws ClassCastException if the object type is not a {@code Date} or {@code Calendar}
-     */
-    public static Iterator<?> iterator(final Object focus, final int rangeStyle) {
-        if (focus == null) {
-            throw new IllegalArgumentException("The date must not be null");
-        }
-        if (focus instanceof Date) {
-            return iterator((Date) focus, rangeStyle);
-        } else if (focus instanceof Calendar) {
-            return iterator((Calendar) focus, rangeStyle);
-        } else {
-            throw new ClassCastException("Could not iterate based on " + focus);
-        }
-    }
-    
-    /**
-     * <p>Returns the number of milliseconds within the 
-     * fragment. All datefields greater than the fragment will be ignored.</p>
-     * 
-     * <p>Asking the milliseconds of any date will only return the number of milliseconds
-     * of the current second (resulting in a number between 0 and 999). This 
-     * method will retrieve the number of milliseconds for any fragment. 
-     * For example, if you want to calculate the number of milliseconds past today, 
-     * your fragment is Calendar.DATE or Calendar.DAY_OF_YEAR. The result will
-     * be all milliseconds of the past hour(s), minutes(s) and second(s).</p>
-     * 
-     * <p>Valid fragments are: Calendar.YEAR, Calendar.MONTH, both 
-     * Calendar.DAY_OF_YEAR and Calendar.DATE, Calendar.HOUR_OF_DAY, 
-     * Calendar.MINUTE, Calendar.SECOND and Calendar.MILLISECOND
-     * A fragment less than or equal to a SECOND field will return 0.</p> 
-     * 
-     * <ul>
-     *  <li>January 1, 2008 7:15:10.538 with Calendar.SECOND as fragment will return 538</li>
-     *  <li>January 6, 2008 7:15:10.538 with Calendar.SECOND as fragment will return 538</li>
-     *  <li>January 6, 2008 7:15:10.538 with Calendar.MINUTE as fragment will return 10538 (10*1000 + 538)</li>
-     *  <li>January 16, 2008 7:15:10.538 with Calendar.MILLISECOND as fragment will return 0
-     *   (a millisecond cannot be split in milliseconds)</li>
-     * </ul>
-     * 
-     * @param date the date to work with, not null
-     * @param fragment the {@code Calendar} field part of date to calculate 
-     * @return number of milliseconds within the fragment of date
-     * @throws IllegalArgumentException if the date is <code>null</code> or
-     * fragment is not supported
-     * @since 2.4
-     */
-    public static long getFragmentInMilliseconds(final Date date, final int fragment) {
-        return getFragment(date, fragment, TimeUnit.MILLISECONDS);    
-    }
-    
-    /**
-     * <p>Returns the number of seconds within the 
-     * fragment. All datefields greater than the fragment will be ignored.</p> 
-     * 
-     * <p>Asking the seconds of any date will only return the number of seconds
-     * of the current minute (resulting in a number between 0 and 59). This 
-     * method will retrieve the number of seconds for any fragment. 
-     * For example, if you want to calculate the number of seconds past today, 
-     * your fragment is Calendar.DATE or Calendar.DAY_OF_YEAR. The result will
-     * be all seconds of the past hour(s) and minutes(s).</p> 
-     * 
-     * <p>Valid fragments are: Calendar.YEAR, Calendar.MONTH, both 
-     * Calendar.DAY_OF_YEAR and Calendar.DATE, Calendar.HOUR_OF_DAY, 
-     * Calendar.MINUTE, Calendar.SECOND and Calendar.MILLISECOND
-     * A fragment less than or equal to a SECOND field will return 0.</p> 
-     * 
-     * <ul>
-     *  <li>January 1, 2008 7:15:10.538 with Calendar.MINUTE as fragment will return 10
-     *   (equivalent to deprecated date.getSeconds())</li>
-     *  <li>January 6, 2008 7:15:10.538 with Calendar.MINUTE as fragment will return 10
-     *   (equivalent to deprecated date.getSeconds())</li>
-     *  <li>January 6, 2008 7:15:10.538 with Calendar.DAY_OF_YEAR as fragment will return 26110
-     *   (7*3600 + 15*60 + 10)</li>
-     *  <li>January 16, 2008 7:15:10.538 with Calendar.MILLISECOND as fragment will return 0
-     *   (a millisecond cannot be split in seconds)</li>
-     * </ul>
-     * 
-     * @param date the date to work with, not null
-     * @param fragment the {@code Calendar} field part of date to calculate 
-     * @return number of seconds within the fragment of date
-     * @throws IllegalArgumentException if the date is <code>null</code> or
-     * fragment is not supported
-     * @since 2.4
-     */
-    public static long getFragmentInSeconds(final Date date, final int fragment) {
-        return getFragment(date, fragment, TimeUnit.SECONDS);
-    }
-    
-    /**
-     * <p>Returns the number of minutes within the 
-     * fragment. All datefields greater than the fragment will be ignored.</p> 
-     * 
-     * <p>Asking the minutes of any date will only return the number of minutes
-     * of the current hour (resulting in a number between 0 and 59). This 
-     * method will retrieve the number of minutes for any fragment. 
-     * For example, if you want to calculate the number of minutes past this month, 
-     * your fragment is Calendar.MONTH. The result will be all minutes of the 
-     * past day(s) and hour(s).</p> 
-     * 
-     * <p>Valid fragments are: Calendar.YEAR, Calendar.MONTH, both 
-     * Calendar.DAY_OF_YEAR and Calendar.DATE, Calendar.HOUR_OF_DAY, 
-     * Calendar.MINUTE, Calendar.SECOND and Calendar.MILLISECOND
-     * A fragment less than or equal to a MINUTE field will return 0.</p> 
-     * 
-     * <ul>
-     *  <li>January 1, 2008 7:15:10.538 with Calendar.HOUR_OF_DAY as fragment will return 15
-     *   (equivalent to deprecated date.getMinutes())</li>
-     *  <li>January 6, 2008 7:15:10.538 with Calendar.HOUR_OF_DAY as fragment will return 15
-     *   (equivalent to deprecated date.getMinutes())</li>
-     *  <li>January 1, 2008 7:15:10.538 with Calendar.MONTH as fragment will return 15</li>
-     *  <li>January 6, 2008 7:15:10.538 with Calendar.MONTH as fragment will return 435 (7*60 + 15)</li>
-     *  <li>January 16, 2008 7:15:10.538 with Calendar.MILLISECOND as fragment will return 0
-     *   (a millisecond cannot be split in minutes)</li>
-     * </ul>
-     * 
-     * @param date the date to work with, not null
-     * @param fragment the {@code Calendar} field part of date to calculate 
-     * @return number of minutes within the fragment of date
-     * @throws IllegalArgumentException if the date is <code>null</code> or 
-     * fragment is not supported
-     * @since 2.4
-     */
-    public static long getFragmentInMinutes(final Date date, final int fragment) {
-        return getFragment(date, fragment, TimeUnit.MINUTES);
-    }
-    
-    /**
-     * <p>Returns the number of hours within the 
-     * fragment. All datefields greater than the fragment will be ignored.</p> 
-     * 
-     * <p>Asking the hours of any date will only return the number of hours
-     * of the current day (resulting in a number between 0 and 23). This 
-     * method will retrieve the number of hours for any fragment. 
-     * For example, if you want to calculate the number of hours past this month, 
-     * your fragment is Calendar.MONTH. The result will be all hours of the 
-     * past day(s).</p> 
-     * 
-     * <p>Valid fragments are: Calendar.YEAR, Calendar.MONTH, both 
-     * Calendar.DAY_OF_YEAR and Calendar.DATE, Calendar.HOUR_OF_DAY, 
-     * Calendar.MINUTE, Calendar.SECOND and Calendar.MILLISECOND
-     * A fragment less than or equal to a HOUR field will return 0.</p> 
-     * 
-     * <ul>
-     *  <li>January 1, 2008 7:15:10.538 with Calendar.DAY_OF_YEAR as fragment will return 7
-     *   (equivalent to deprecated date.getHours())</li>
-     *  <li>January 6, 2008 7:15:10.538 with Calendar.DAY_OF_YEAR as fragment will return 7
-     *   (equivalent to deprecated date.getHours())</li>
-     *  <li>January 1, 2008 7:15:10.538 with Calendar.MONTH as fragment will return 7</li>
-     *  <li>January 6, 2008 7:15:10.538 with Calendar.MONTH as fragment will return 127 (5*24 + 7)</li>
-     *  <li>January 16, 2008 7:15:10.538 with Calendar.MILLISECOND as fragment will return 0
-     *   (a millisecond cannot be split in hours)</li>
-     * </ul>
-     * 
-     * @param date the date to work with, not null
-     * @param fragment the {@code Calendar} field part of date to calculate 
-     * @return number of hours within the fragment of date
-     * @throws IllegalArgumentException if the date is <code>null</code> or 
-     * fragment is not supported
-     * @since 2.4
-     */
-    public static long getFragmentInHours(final Date date, final int fragment) {
-        return getFragment(date, fragment, TimeUnit.HOURS);
-    }
-    
-    /**
-     * <p>Returns the number of days within the 
-     * fragment. All datefields greater than the fragment will be ignored.</p> 
-     * 
-     * <p>Asking the days of any date will only return the number of days
-     * of the current month (resulting in a number between 1 and 31). This 
-     * method will retrieve the number of days for any fragment. 
-     * For example, if you want to calculate the number of days past this year, 
-     * your fragment is Calendar.YEAR. The result will be all days of the 
-     * past month(s).</p> 
-     * 
-     * <p>Valid fragments are: Calendar.YEAR, Calendar.MONTH, both 
-     * Calendar.DAY_OF_YEAR and Calendar.DATE, Calendar.HOUR_OF_DAY, 
-     * Calendar.MINUTE, Calendar.SECOND and Calendar.MILLISECOND
-     * A fragment less than or equal to a DAY field will return 0.</p> 
-     *  
-     * <ul>
-     *  <li>January 28, 2008 with Calendar.MONTH as fragment will return 28
-     *   (equivalent to deprecated date.getDay())</li>
-     *  <li>February 28, 2008 with Calendar.MONTH as fragment will return 28
-     *   (equivalent to deprecated date.getDay())</li>
-     *  <li>January 28, 2008 with Calendar.YEAR as fragment will return 28</li>
-     *  <li>February 28, 2008 with Calendar.YEAR as fragment will return 59</li>
-     *  <li>January 28, 2008 with Calendar.MILLISECOND as fragment will return 0
-     *   (a millisecond cannot be split in days)</li>
-     * </ul>
-     * 
-     * @param date the date to work with, not null
-     * @param fragment the {@code Calendar} field part of date to calculate 
-     * @return number of days  within the fragment of date
-     * @throws IllegalArgumentException if the date is <code>null</code> or 
-     * fragment is not supported
-     * @since 2.4
-     */
-    public static long getFragmentInDays(final Date date, final int fragment) {
-        return getFragment(date, fragment, TimeUnit.DAYS);
-    }
-
-    /**
-     * <p>Returns the number of milliseconds within the 
-     * fragment. All datefields greater than the fragment will be ignored.</p> 
-     * 
-     * <p>Asking the milliseconds of any date will only return the number of milliseconds
-     * of the current second (resulting in a number between 0 and 999). This 
-     * method will retrieve the number of milliseconds for any fragment. 
-     * For example, if you want to calculate the number of seconds past today, 
-     * your fragment is Calendar.DATE or Calendar.DAY_OF_YEAR. The result will
-     * be all seconds of the past hour(s), minutes(s) and second(s).</p> 
-     * 
-     * <p>Valid fragments are: Calendar.YEAR, Calendar.MONTH, both 
-     * Calendar.DAY_OF_YEAR and Calendar.DATE, Calendar.HOUR_OF_DAY, 
-     * Calendar.MINUTE, Calendar.SECOND and Calendar.MILLISECOND
-     * A fragment less than or equal to a MILLISECOND field will return 0.</p> 
-     * 
-     * <ul>
-     *  <li>January 1, 2008 7:15:10.538 with Calendar.SECOND as fragment will return 538
-     *   (equivalent to calendar.get(Calendar.MILLISECOND))</li>
-     *  <li>January 6, 2008 7:15:10.538 with Calendar.SECOND as fragment will return 538
-     *   (equivalent to calendar.get(Calendar.MILLISECOND))</li>
-     *  <li>January 6, 2008 7:15:10.538 with Calendar.MINUTE as fragment will return 10538
-     *   (10*1000 + 538)</li>
-     *  <li>January 16, 2008 7:15:10.538 with Calendar.MILLISECOND as fragment will return 0
-     *   (a millisecond cannot be split in milliseconds)</li>
-     * </ul>
-     * 
-     * @param calendar the calendar to work with, not null
-     * @param fragment the {@code Calendar} field part of calendar to calculate 
-     * @return number of milliseconds within the fragment of date
-     * @throws IllegalArgumentException if the date is <code>null</code> or 
-     * fragment is not supported
-     * @since 2.4
-     */
-  public static long getFragmentInMilliseconds(final Calendar calendar, final int fragment) {
-    return getFragment(calendar, fragment, TimeUnit.MILLISECONDS);
-  }
-    /**
-     * <p>Returns the number of seconds within the 
-     * fragment. All datefields greater than the fragment will be ignored.</p> 
-     * 
-     * <p>Asking the seconds of any date will only return the number of seconds
-     * of the current minute (resulting in a number between 0 and 59). This 
-     * method will retrieve the number of seconds for any fragment. 
-     * For example, if you want to calculate the number of seconds past today, 
-     * your fragment is Calendar.DATE or Calendar.DAY_OF_YEAR. The result will
-     * be all seconds of the past hour(s) and minutes(s).</p> 
-     * 
-     * <p>Valid fragments are: Calendar.YEAR, Calendar.MONTH, both 
-     * Calendar.DAY_OF_YEAR and Calendar.DATE, Calendar.HOUR_OF_DAY, 
-     * Calendar.MINUTE, Calendar.SECOND and Calendar.MILLISECOND
-     * A fragment less than or equal to a SECOND field will return 0.</p> 
-     * 
-     * <ul>
-     *  <li>January 1, 2008 7:15:10.538 with Calendar.MINUTE as fragment will return 10
-     *   (equivalent to calendar.get(Calendar.SECOND))</li>
-     *  <li>January 6, 2008 7:15:10.538 with Calendar.MINUTE as fragment will return 10
-     *   (equivalent to calendar.get(Calendar.SECOND))</li>
-     *  <li>January 6, 2008 7:15:10.538 with Calendar.DAY_OF_YEAR as fragment will return 26110
-     *   (7*3600 + 15*60 + 10)</li>
-     *  <li>January 16, 2008 7:15:10.538 with Calendar.MILLISECOND as fragment will return 0
-     *   (a millisecond cannot be split in seconds)</li>
-     * </ul>
-     * 
-     * @param calendar the calendar to work with, not null
-     * @param fragment the {@code Calendar} field part of calendar to calculate 
-     * @return number of seconds within the fragment of date
-     * @throws IllegalArgumentException if the date is <code>null</code> or 
-     * fragment is not supported
-     * @since 2.4
-     */
-    public static long getFragmentInSeconds(final Calendar calendar, final int fragment) {
-        return getFragment(calendar, fragment, TimeUnit.SECONDS);
-    }
-    
-    /**
-     * <p>Returns the number of minutes within the 
-     * fragment. All datefields greater than the fragment will be ignored.</p> 
-     * 
-     * <p>Asking the minutes of any date will only return the number of minutes
-     * of the current hour (resulting in a number between 0 and 59). This 
-     * method will retrieve the number of minutes for any fragment. 
-     * For example, if you want to calculate the number of minutes past this month, 
-     * your fragment is Calendar.MONTH. The result will be all minutes of the 
-     * past day(s) and hour(s).</p> 
-     * 
-     * <p>Valid fragments are: Calendar.YEAR, Calendar.MONTH, both 
-     * Calendar.DAY_OF_YEAR and Calendar.DATE, Calendar.HOUR_OF_DAY, 
-     * Calendar.MINUTE, Calendar.SECOND and Calendar.MILLISECOND
-     * A fragment less than or equal to a MINUTE field will return 0.</p> 
-     * 
-     * <ul>
-     *  <li>January 1, 2008 7:15:10.538 with Calendar.HOUR_OF_DAY as fragment will return 15
-     *   (equivalent to calendar.get(Calendar.MINUTES))</li>
-     *  <li>January 6, 2008 7:15:10.538 with Calendar.HOUR_OF_DAY as fragment will return 15
-     *   (equivalent to calendar.get(Calendar.MINUTES))</li>
-     *  <li>January 1, 2008 7:15:10.538 with Calendar.MONTH as fragment will return 15</li>
-     *  <li>January 6, 2008 7:15:10.538 with Calendar.MONTH as fragment will return 435 (7*60 + 15)</li>
-     *  <li>January 16, 2008 7:15:10.538 with Calendar.MILLISECOND as fragment will return 0
-     *   (a millisecond cannot be split in minutes)</li>
-     * </ul>
-     * 
-     * @param calendar the calendar to work with, not null
-     * @param fragment the {@code Calendar} field part of calendar to calculate 
-     * @return number of minutes within the fragment of date
-     * @throws IllegalArgumentException if the date is <code>null</code> or 
-     * fragment is not supported
-     * @since 2.4
-     */
-    public static long getFragmentInMinutes(final Calendar calendar, final int fragment) {
-        return getFragment(calendar, fragment, TimeUnit.MINUTES);
-    }
-    
-    /**
-     * <p>Returns the number of hours within the 
-     * fragment. All datefields greater than the fragment will be ignored.</p> 
-     * 
-     * <p>Asking the hours of any date will only return the number of hours
-     * of the current day (resulting in a number between 0 and 23). This 
-     * method will retrieve the number of hours for any fragment. 
-     * For example, if you want to calculate the number of hours past this month, 
-     * your fragment is Calendar.MONTH. The result will be all hours of the 
-     * past day(s).</p> 
-     * 
-     * <p>Valid fragments are: Calendar.YEAR, Calendar.MONTH, both 
-     * Calendar.DAY_OF_YEAR and Calendar.DATE, Calendar.HOUR_OF_DAY, 
-     * Calendar.MINUTE, Calendar.SECOND and Calendar.MILLISECOND
-     * A fragment less than or equal to a HOUR field will return 0.</p> 
-     *  
-     * <ul>
-     *  <li>January 1, 2008 7:15:10.538 with Calendar.DAY_OF_YEAR as fragment will return 7
-     *   (equivalent to calendar.get(Calendar.HOUR_OF_DAY))</li>
-     *  <li>January 6, 2008 7:15:10.538 with Calendar.DAY_OF_YEAR as fragment will return 7
-     *   (equivalent to calendar.get(Calendar.HOUR_OF_DAY))</li>
-     *  <li>January 1, 2008 7:15:10.538 with Calendar.MONTH as fragment will return 7</li>
-     *  <li>January 6, 2008 7:15:10.538 with Calendar.MONTH as fragment will return 127 (5*24 + 7)</li>
-     *  <li>January 16, 2008 7:15:10.538 with Calendar.MILLISECOND as fragment will return 0
-     *   (a millisecond cannot be split in hours)</li>
-     * </ul>
-     *  
-     * @param calendar the calendar to work with, not null
-     * @param fragment the {@code Calendar} field part of calendar to calculate 
-     * @return number of hours within the fragment of date
-     * @throws IllegalArgumentException if the date is <code>null</code> or 
-     * fragment is not supported
-     * @since 2.4
-     */
-    public static long getFragmentInHours(final Calendar calendar, final int fragment) {
-        return getFragment(calendar, fragment, TimeUnit.HOURS);
-    }
-    
-    /**
-     * <p>Returns the number of days within the 
-     * fragment. All datefields greater than the fragment will be ignored.</p> 
-     * 
-     * <p>Asking the days of any date will only return the number of days
-     * of the current month (resulting in a number between 1 and 31). This 
-     * method will retrieve the number of days for any fragment. 
-     * For example, if you want to calculate the number of days past this year, 
-     * your fragment is Calendar.YEAR. The result will be all days of the 
-     * past month(s).</p> 
-     * 
-     * <p>Valid fragments are: Calendar.YEAR, Calendar.MONTH, both 
-     * Calendar.DAY_OF_YEAR and Calendar.DATE, Calendar.HOUR_OF_DAY, 
-     * Calendar.MINUTE, Calendar.SECOND and Calendar.MILLISECOND
-     * A fragment less than or equal to a DAY field will return 0.</p> 
-     * 
-     * <ul>
-     *  <li>January 28, 2008 with Calendar.MONTH as fragment will return 28
-     *   (equivalent to calendar.get(Calendar.DAY_OF_MONTH))</li>
-     *  <li>February 28, 2008 with Calendar.MONTH as fragment will return 28
-     *   (equivalent to calendar.get(Calendar.DAY_OF_MONTH))</li>
-     *  <li>January 28, 2008 with Calendar.YEAR as fragment will return 28
-     *   (equivalent to calendar.get(Calendar.DAY_OF_YEAR))</li>
-     *  <li>February 28, 2008 with Calendar.YEAR as fragment will return 59
-     *   (equivalent to calendar.get(Calendar.DAY_OF_YEAR))</li>
-     *  <li>January 28, 2008 with Calendar.MILLISECOND as fragment will return 0
-     *   (a millisecond cannot be split in days)</li>
-     * </ul>
-     * 
-     * @param calendar the calendar to work with, not null
-     * @param fragment the {@code Calendar} field part of calendar to calculate 
-     * @return number of days within the fragment of date
-     * @throws IllegalArgumentException if the date is <code>null</code> or 
-     * fragment is not supported
-     * @since 2.4
-     */
-    public static long getFragmentInDays(final Calendar calendar, final int fragment) {
-        return getFragment(calendar, fragment, TimeUnit.DAYS);
-    }
-    
-    /**
-     * Gets a Date fragment for any unit.
-     * 
-     * @param date the date to work with, not null
-     * @param fragment the Calendar field part of date to calculate 
-     * @param unit the time unit
-     * @return number of units within the fragment of the date
-     * @throws IllegalArgumentException if the date is <code>null</code> or 
-     * fragment is not supported
-     * @since 2.4
-     */
-    private static long getFragment(final Date date, final int fragment, final TimeUnit unit) {
-        if(date == null) {
-            throw  new IllegalArgumentException("The date must not be null");
-        }
-        final Calendar calendar = Calendar.getInstance();
-        calendar.setTime(date);
-        return getFragment(calendar, fragment, unit);
-    }
-
-    /**
-     * Gets a Calendar fragment for any unit.
-     * 
-     * @param calendar the calendar to work with, not null
-     * @param fragment the Calendar field part of calendar to calculate 
-     * @param unit the time unit
-     * @return number of units within the fragment of the calendar
-     * @throws IllegalArgumentException if the date is <code>null</code> or 
-     * fragment is not supported
-     * @since 2.4
-     */
-    private static long getFragment(final Calendar calendar, final int fragment, final TimeUnit unit) {
-        if(calendar == null) {
-            throw  new IllegalArgumentException("The date must not be null"); 
-        }
-
-        long result = 0;
-        
-        final int offset = (unit == TimeUnit.DAYS) ? 0 : 1;
-        
-        // Fragments bigger than a day require a breakdown to days
-        switch (fragment) {
-            case Calendar.YEAR:
-                result += unit.convert(calendar.get(Calendar.DAY_OF_YEAR) - offset, TimeUnit.DAYS);
-                break;
-            case Calendar.MONTH:
-                result += unit.convert(calendar.get(Calendar.DAY_OF_MONTH) - offset, TimeUnit.DAYS);
-                break;
-            default:
-                break;
-        }
-
-        switch (fragment) {
-            // Number of days already calculated for these cases
-            case Calendar.YEAR:
-            case Calendar.MONTH:
-            
-            // The rest of the valid cases
-            case Calendar.DAY_OF_YEAR:
-            case Calendar.DATE:
-                result += unit.convert(calendar.get(Calendar.HOUR_OF_DAY), TimeUnit.HOURS);
-                //$FALL-THROUGH$
-            case Calendar.HOUR_OF_DAY:
-                result += unit.convert(calendar.get(Calendar.MINUTE), TimeUnit.MINUTES);
-                //$FALL-THROUGH$
-            case Calendar.MINUTE:
-                result += unit.convert(calendar.get(Calendar.SECOND), TimeUnit.SECONDS);
-                //$FALL-THROUGH$
-            case Calendar.SECOND:
-                result += unit.convert(calendar.get(Calendar.MILLISECOND), TimeUnit.MILLISECONDS);
-                break;
-            case Calendar.MILLISECOND: break;//never useful
-                default: throw new IllegalArgumentException("The fragment " + fragment + " is not supported");
-        }
-        return result;
-    }
-    
-    /**
-     * Determines if two calendars are equal up to no more than the specified 
-     * most significant field.
-     * 
-     * @param cal1 the first calendar, not <code>null</code>
-     * @param cal2 the second calendar, not <code>null</code>
-     * @param field the field from {@code Calendar}
-     * @return <code>true</code> if equal; otherwise <code>false</code>
-     * @throws IllegalArgumentException if any argument is <code>null</code>
-     * @see #truncate(Calendar, int)
-     * @see #truncatedEquals(Date, Date, int)
-     * @since 3.0
-     */
-    public static boolean truncatedEquals(final Calendar cal1, final Calendar cal2, final int field) {
-        return truncatedCompareTo(cal1, cal2, field) == 0;
-    }
-
-    /**
-     * Determines if two dates are equal up to no more than the specified 
-     * most significant field.
-     * 
-     * @param date1 the first date, not <code>null</code>
-     * @param date2 the second date, not <code>null</code>
-     * @param field the field from {@code Calendar}
-     * @return <code>true</code> if equal; otherwise <code>false</code>
-     * @throws IllegalArgumentException if any argument is <code>null</code>
-     * @see #truncate(Date, int)
-     * @see #truncatedEquals(Calendar, Calendar, int)
-     * @since 3.0
-     */
-    public static boolean truncatedEquals(final Date date1, final Date date2, final int field) {
-        return truncatedCompareTo(date1, date2, field) == 0;
-    }
-
-    /**
-     * Determines how two calendars compare up to no more than the specified 
-     * most significant field.
-     * 
-     * @param cal1 the first calendar, not <code>null</code>
-     * @param cal2 the second calendar, not <code>null</code>
-     * @param field the field from {@code Calendar}
-     * @return a negative integer, zero, or a positive integer as the first 
-     * calendar is less than, equal to, or greater than the second.
-     * @throws IllegalArgumentException if any argument is <code>null</code>
-     * @see #truncate(Calendar, int)
-     * @see #truncatedCompareTo(Date, Date, int)
-     * @since 3.0
-     */
-    public static int truncatedCompareTo(final Calendar cal1, final Calendar cal2, final int field) {
-        final Calendar truncatedCal1 = truncate(cal1, field);
-        final Calendar truncatedCal2 = truncate(cal2, field);
-        return truncatedCal1.compareTo(truncatedCal2);
-    }
-
-    /**
-     * Determines how two dates compare up to no more than the specified 
-     * most significant field.
-     * 
-     * @param date1 the first date, not <code>null</code>
-     * @param date2 the second date, not <code>null</code>
-     * @param field the field from <code>Calendar</code>
-     * @return a negative integer, zero, or a positive integer as the first 
-     * date is less than, equal to, or greater than the second.
-     * @throws IllegalArgumentException if any argument is <code>null</code>
-     * @see #truncate(Calendar, int)
-     * @see #truncatedCompareTo(Date, Date, int)
-     * @since 3.0
-     */
-    public static int truncatedCompareTo(final Date date1, final Date date2, final int field) {
-        final Date truncatedDate1 = truncate(date1, field);
-        final Date truncatedDate2 = truncate(date2, field);
-        return truncatedDate1.compareTo(truncatedDate2);
-    }
-
-
-    //-----------------------------------------------------------------------
-    /**
-     * <p>Date iterator.</p>
-     */
-    static class DateIterator implements Iterator<Calendar> {
-        private final Calendar endFinal;
-        private final Calendar spot;
-        
-        /**
-         * Constructs a DateIterator that ranges from one date to another. 
-         *
-         * @param startFinal start date (inclusive)
-         * @param endFinal end date (inclusive)
-         */
-        DateIterator(final Calendar startFinal, final Calendar endFinal) {
-            super();
-            this.endFinal = endFinal;
-            spot = startFinal;
-            spot.add(Calendar.DATE, -1);
-        }
-
-        /**
-         * Has the iterator not reached the end date yet?
-         *
-         * @return <code>true</code> if the iterator has yet to reach the end date
-         */
-        @Override
-        public boolean hasNext() {
-            return spot.before(endFinal);
-        }
-
-        /**
-         * Return the next calendar in the iteration
-         *
-         * @return Object calendar for the next date
-         */
-        @Override
-        public Calendar next() {
-            if (spot.equals(endFinal)) {
-                throw new NoSuchElementException();
-            }
-            spot.add(Calendar.DATE, 1);
-            return (Calendar) spot.clone();
-        }
-
-        /**
-         * Always throws UnsupportedOperationException.
-         * 
-         * @throws UnsupportedOperationException
-         * @see java.util.Iterator#remove()
-         */
-        @Override
-        public void remove() {
-            throw new UnsupportedOperationException();
-        }
-    }
-
-}
diff --git a/lang/src/main/java/org/apache/commons/lang3/time/DurationFormatUtils.java b/lang/src/main/java/org/apache/commons/lang3/time/DurationFormatUtils.java
deleted file mode 100644
index fd4c119..0000000
--- a/lang/src/main/java/org/apache/commons/lang3/time/DurationFormatUtils.java
+++ /dev/null
@@ -1,692 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- * 
- *      http://www.apache.org/licenses/LICENSE-2.0
- * 
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.commons.lang3.time;
-
-import java.util.ArrayList;
-import java.util.Calendar;
-import java.util.Date;
-import java.util.GregorianCalendar;
-import java.util.TimeZone;
-
-import org.apache.commons.lang3.StringUtils;
-import org.apache.commons.lang3.Validate;
-
-/**
- * <p>Duration formatting utilities and constants. The following table describes the tokens 
- * used in the pattern language for formatting. </p>
- * <table border="1" summary="Pattern Tokens">
- *  <tr><th>character</th><th>duration element</th></tr>
- *  <tr><td>y</td><td>years</td></tr>
- *  <tr><td>M</td><td>months</td></tr>
- *  <tr><td>d</td><td>days</td></tr>
- *  <tr><td>H</td><td>hours</td></tr>
- *  <tr><td>m</td><td>minutes</td></tr>
- *  <tr><td>s</td><td>seconds</td></tr>
- *  <tr><td>S</td><td>milliseconds</td></tr>
- *  <tr><td>'text'</td><td>arbitrary text content</td></tr>
- * </table>
- *
- * <b>Note: It's not currently possible to include a single-quote in a format.</b>
- * <br>
- * Token values are printed using decimal digits.
- * A token character can be repeated to ensure that the field occupies a certain minimum
- * size. Values will be left-padded with 0 unless padding is disabled in the method invocation.
- * @since 2.1
- * @version $Id$
- */
-public class DurationFormatUtils {
-
-    /**
-     * <p>DurationFormatUtils instances should NOT be constructed in standard programming.</p>
-     *
-     * <p>This constructor is public to permit tools that require a JavaBean instance
-     * to operate.</p>
-     */
-    public DurationFormatUtils() {
-        super();
-    }
-
-    /**
-     * <p>Pattern used with <code>FastDateFormat</code> and <code>SimpleDateFormat</code>
-     * for the ISO 8601 period format used in durations.</p>
-     * 
-     * @see org.apache.commons.lang3.time.FastDateFormat
-     * @see java.text.SimpleDateFormat
-     */
-    public static final String ISO_EXTENDED_FORMAT_PATTERN = "'P'yyyy'Y'M'M'd'DT'H'H'm'M's.SSS'S'";
-
-    //-----------------------------------------------------------------------
-    /**
-     * <p>Formats the time gap as a string.</p>
-     * 
-     * <p>The format used is ISO 8601-like: {@code HH:mm:ss.SSS}.</p>
-     *
-     * @param durationMillis  the duration to format
-     * @return the formatted duration, not null
-     * @throws java.lang.IllegalArgumentException if durationMillis is negative
-     */
-    public static String formatDurationHMS(final long durationMillis) {
-        return formatDuration(durationMillis, "HH:mm:ss.SSS");
-    }
-
-    /**
-     * <p>Formats the time gap as a string.</p>
-     * 
-     * <p>The format used is the ISO 8601 period format.</p>
-     * 
-     * <p>This method formats durations using the days and lower fields of the
-     * ISO format pattern, such as P7D6TH5M4.321S.</p>
-     * 
-     * @param durationMillis  the duration to format
-     * @return the formatted duration, not null
-     * @throws java.lang.IllegalArgumentException if durationMillis is negative
-     */
-    public static String formatDurationISO(final long durationMillis) {
-        return formatDuration(durationMillis, ISO_EXTENDED_FORMAT_PATTERN, false);
-    }
-
-    /**
-     * <p>Formats the time gap as a string, using the specified format, and padding with zeros.</p>
-     * 
-     * <p>This method formats durations using the days and lower fields of the
-     * format pattern. Months and larger are not used.</p>
-     * 
-     * @param durationMillis  the duration to format
-     * @param format  the way in which to format the duration, not null
-     * @return the formatted duration, not null
-     * @throws java.lang.IllegalArgumentException if durationMillis is negative
-     */
-    public static String formatDuration(final long durationMillis, final String format) {
-        return formatDuration(durationMillis, format, true);
-    }
-
-    /**
-     * <p>Formats the time gap as a string, using the specified format.
-     * Padding the left hand side of numbers with zeroes is optional.</p>
-     * 
-     * <p>This method formats durations using the days and lower fields of the
-     * format pattern. Months and larger are not used.</p>
-     * 
-     * @param durationMillis  the duration to format
-     * @param format  the way in which to format the duration, not null
-     * @param padWithZeros  whether to pad the left hand side of numbers with 0's
-     * @return the formatted duration, not null
-     * @throws java.lang.IllegalArgumentException if durationMillis is negative
-     */
-    public static String formatDuration(final long durationMillis, final String format, final boolean padWithZeros) {
-        Validate.inclusiveBetween(0, Long.MAX_VALUE, durationMillis, "durationMillis must not be negative");        
-
-        final Token[] tokens = lexx(format);
-
-        long days         = 0;
-        long hours        = 0;
-        long minutes      = 0;
-        long seconds      = 0;
-        long milliseconds = durationMillis;
-        
-        if (Token.containsTokenWithValue(tokens, d) ) {
-            days = milliseconds / DateUtils.MILLIS_PER_DAY;
-            milliseconds = milliseconds - (days * DateUtils.MILLIS_PER_DAY);
-        }
-        if (Token.containsTokenWithValue(tokens, H) ) {
-            hours = milliseconds / DateUtils.MILLIS_PER_HOUR;
-            milliseconds = milliseconds - (hours * DateUtils.MILLIS_PER_HOUR);
-        }
-        if (Token.containsTokenWithValue(tokens, m) ) {
-            minutes = milliseconds / DateUtils.MILLIS_PER_MINUTE;
-            milliseconds = milliseconds - (minutes * DateUtils.MILLIS_PER_MINUTE);
-        }
-        if (Token.containsTokenWithValue(tokens, s) ) {
-            seconds = milliseconds / DateUtils.MILLIS_PER_SECOND;
-            milliseconds = milliseconds - (seconds * DateUtils.MILLIS_PER_SECOND);
-        }
-
-        return format(tokens, 0, 0, days, hours, minutes, seconds, milliseconds, padWithZeros);
-    }
-
-    /**
-     * <p>Formats an elapsed time into a plurialization correct string.</p>
-     * 
-     * <p>This method formats durations using the days and lower fields of the
-     * format pattern. Months and larger are not used.</p>
-     * 
-     * @param durationMillis  the elapsed time to report in milliseconds
-     * @param suppressLeadingZeroElements  suppresses leading 0 elements
-     * @param suppressTrailingZeroElements  suppresses trailing 0 elements
-     * @return the formatted text in days/hours/minutes/seconds, not null
-     * @throws java.lang.IllegalArgumentException if durationMillis is negative
-     */
-    public static String formatDurationWords(
-        final long durationMillis,
-        final boolean suppressLeadingZeroElements,
-        final boolean suppressTrailingZeroElements) {
-
-        // This method is generally replacable by the format method, but 
-        // there are a series of tweaks and special cases that require 
-        // trickery to replicate.
-        String duration = formatDuration(durationMillis, "d' days 'H' hours 'm' minutes 's' seconds'");
-        if (suppressLeadingZeroElements) {
-            // this is a temporary marker on the front. Like ^ in regexp.
-            duration = " " + duration;
-            String tmp = StringUtils.replaceOnce(duration, " 0 days", "");
-            if (tmp.length() != duration.length()) {
-                duration = tmp;
-                tmp = StringUtils.replaceOnce(duration, " 0 hours", "");
-                if (tmp.length() != duration.length()) {
-                    duration = tmp;
-                    tmp = StringUtils.replaceOnce(duration, " 0 minutes", "");
-                    duration = tmp;
-                    if (tmp.length() != duration.length()) {
-                        duration = StringUtils.replaceOnce(tmp, " 0 seconds", "");
-                    }
-                }
-            }
-            if (duration.length() != 0) {
-                // strip the space off again
-                duration = duration.substring(1);
-            }
-        }
-        if (suppressTrailingZeroElements) {
-            String tmp = StringUtils.replaceOnce(duration, " 0 seconds", "");
-            if (tmp.length() != duration.length()) {
-                duration = tmp;
-                tmp = StringUtils.replaceOnce(duration, " 0 minutes", "");
-                if (tmp.length() != duration.length()) {
-                    duration = tmp;
-                    tmp = StringUtils.replaceOnce(duration, " 0 hours", "");
-                    if (tmp.length() != duration.length()) {
-                        duration = StringUtils.replaceOnce(tmp, " 0 days", "");
-                    }
-                }
-            }
-        }
-        // handle plurals
-        duration = " " + duration;
-        duration = StringUtils.replaceOnce(duration, " 1 seconds", " 1 second");
-        duration = StringUtils.replaceOnce(duration, " 1 minutes", " 1 minute");
-        duration = StringUtils.replaceOnce(duration, " 1 hours", " 1 hour");
-        duration = StringUtils.replaceOnce(duration, " 1 days", " 1 day");
-        return duration.trim();
-    }
-
-    //-----------------------------------------------------------------------
-    /**
-     * <p>Formats the time gap as a string.</p>
-     * 
-     * <p>The format used is the ISO 8601 period format.</p>
-     * 
-     * @param startMillis  the start of the duration to format
-     * @param endMillis  the end of the duration to format
-     * @return the formatted duration, not null
-     * @throws java.lang.IllegalArgumentException if startMillis is greater than endMillis
-     */
-    public static String formatPeriodISO(final long startMillis, final long endMillis) {
-        return formatPeriod(startMillis, endMillis, ISO_EXTENDED_FORMAT_PATTERN, false, TimeZone.getDefault());
-    }
-
-    /**
-     * <p>Formats the time gap as a string, using the specified format.
-     * Padding the left hand side of numbers with zeroes is optional.
-     * 
-     * @param startMillis  the start of the duration
-     * @param endMillis  the end of the duration
-     * @param format  the way in which to format the duration, not null
-     * @return the formatted duration, not null
-     * @throws java.lang.IllegalArgumentException if startMillis is greater than endMillis
-     */
-    public static String formatPeriod(final long startMillis, final long endMillis, final String format) {
-        return formatPeriod(startMillis, endMillis, format, true, TimeZone.getDefault());
-    }
-
-    /**
-     * <p>Formats the time gap as a string, using the specified format.
-     * Padding the left hand side of numbers with zeroes is optional and 
-     * the timezone may be specified. </p>
-     *
-     * <p>When calculating the difference between months/days, it chooses to 
-     * calculate months first. So when working out the number of months and 
-     * days between January 15th and March 10th, it choose 1 month and 
-     * 23 days gained by choosing January-&gt;February = 1 month and then 
-     * calculating days forwards, and not the 1 month and 26 days gained by 
-     * choosing March -&gt; February = 1 month and then calculating days 
-     * backwards. </p>
-     *
-     * <p>For more control, the <a href="http://joda-time.sf.net/">Joda-Time</a>
-     * library is recommended.</p>
-     * 
-     * @param startMillis  the start of the duration
-     * @param endMillis  the end of the duration
-     * @param format  the way in which to format the duration, not null
-     * @param padWithZeros  whether to pad the left hand side of numbers with 0's
-     * @param timezone  the millis are defined in
-     * @return the formatted duration, not null
-     * @throws java.lang.IllegalArgumentException if startMillis is greater than endMillis
-     */
-    public static String formatPeriod(final long startMillis, final long endMillis, final String format, final boolean padWithZeros, 
-            final TimeZone timezone) {
-        Validate.isTrue(startMillis <= endMillis, "startMillis must not be greater than endMillis");
-        
-
-        // Used to optimise for differences under 28 days and 
-        // called formatDuration(millis, format); however this did not work 
-        // over leap years. 
-        // TODO: Compare performance to see if anything was lost by 
-        // losing this optimisation. 
-        
-        final Token[] tokens = lexx(format);
-
-        // timezones get funky around 0, so normalizing everything to GMT 
-        // stops the hours being off
-        final Calendar start = Calendar.getInstance(timezone);
-        start.setTime(new Date(startMillis));
-        final Calendar end = Calendar.getInstance(timezone);
-        end.setTime(new Date(endMillis));
-
-        // initial estimates
-        int milliseconds = end.get(Calendar.MILLISECOND) - start.get(Calendar.MILLISECOND);
-        int seconds = end.get(Calendar.SECOND) - start.get(Calendar.SECOND);
-        int minutes = end.get(Calendar.MINUTE) - start.get(Calendar.MINUTE);
-        int hours = end.get(Calendar.HOUR_OF_DAY) - start.get(Calendar.HOUR_OF_DAY);
-        int days = end.get(Calendar.DAY_OF_MONTH) - start.get(Calendar.DAY_OF_MONTH);
-        int months = end.get(Calendar.MONTH) - start.get(Calendar.MONTH);
-        int years = end.get(Calendar.YEAR) - start.get(Calendar.YEAR);
-
-        // each initial estimate is adjusted in case it is under 0
-        while (milliseconds < 0) {
-            milliseconds += 1000;
-            seconds -= 1;
-        }
-        while (seconds < 0) {
-            seconds += 60;
-            minutes -= 1;
-        }
-        while (minutes < 0) {
-            minutes += 60;
-            hours -= 1;
-        }
-        while (hours < 0) {
-            hours += 24;
-            days -= 1;
-        }
-       
-        if (Token.containsTokenWithValue(tokens, M)) {
-            while (days < 0) {
-                days += start.getActualMaximum(Calendar.DAY_OF_MONTH);
-                months -= 1;
-                start.add(Calendar.MONTH, 1);
-            }
-
-            while (months < 0) {
-                months += 12;
-                years -= 1;
-            }
-
-            if (!Token.containsTokenWithValue(tokens, y) && years != 0) {
-                while (years != 0) {
-                    months += 12 * years;
-                    years = 0;
-                }
-            }
-        } else {
-            // there are no M's in the format string
-
-            if( !Token.containsTokenWithValue(tokens, y) ) {
-                int target = end.get(Calendar.YEAR);
-                if (months < 0) {
-                    // target is end-year -1
-                    target -= 1;
-                }
-                
-                while (start.get(Calendar.YEAR) != target) {
-                    days += start.getActualMaximum(Calendar.DAY_OF_YEAR) - start.get(Calendar.DAY_OF_YEAR);
-                    
-                    // Not sure I grok why this is needed, but the brutal tests show it is
-                    if (start instanceof GregorianCalendar &&
-                            start.get(Calendar.MONTH) == Calendar.FEBRUARY &&
-                            start.get(Calendar.DAY_OF_MONTH) == 29) {
-                        days += 1;
-                    }
-                    
-                    start.add(Calendar.YEAR, 1);
-                    
-                    days += start.get(Calendar.DAY_OF_YEAR);
-                }
-                
-                years = 0;
-            }
-            
-            while( start.get(Calendar.MONTH) != end.get(Calendar.MONTH) ) {
-                days += start.getActualMaximum(Calendar.DAY_OF_MONTH);
-                start.add(Calendar.MONTH, 1);
-            }
-            
-            months = 0;            
-
-            while (days < 0) {
-                days += start.getActualMaximum(Calendar.DAY_OF_MONTH);
-                months -= 1;
-                start.add(Calendar.MONTH, 1);
-            }
-            
-        }
-
-        // The rest of this code adds in values that 
-        // aren't requested. This allows the user to ask for the 
-        // number of months and get the real count and not just 0->11.
-
-        if (!Token.containsTokenWithValue(tokens, d)) {
-            hours += 24 * days;
-            days = 0;
-        }
-        if (!Token.containsTokenWithValue(tokens, H)) {
-            minutes += 60 * hours;
-            hours = 0;
-        }
-        if (!Token.containsTokenWithValue(tokens, m)) {
-            seconds += 60 * minutes;
-            minutes = 0;
-        }
-        if (!Token.containsTokenWithValue(tokens, s)) {
-            milliseconds += 1000 * seconds;
-            seconds = 0;
-        }
-
-        return format(tokens, years, months, days, hours, minutes, seconds, milliseconds, padWithZeros);
-    }
-
-    //-----------------------------------------------------------------------
-    /**
-     * <p>The internal method to do the formatting.</p>
-     * 
-     * @param tokens  the tokens
-     * @param years  the number of years
-     * @param months  the number of months
-     * @param days  the number of days
-     * @param hours  the number of hours
-     * @param minutes  the number of minutes
-     * @param seconds  the number of seconds
-     * @param milliseconds  the number of millis
-     * @param padWithZeros  whether to pad
-     * @return the formatted string
-     */
-    static String format(final Token[] tokens, final long years, final long months, final long days, final long hours, final long minutes, final long seconds,
-            final long milliseconds, final boolean padWithZeros) {
-        final StringBuilder buffer = new StringBuilder();
-        boolean lastOutputSeconds = false;
-        for (final Token token : tokens) {
-            final Object value = token.getValue();
-            final int count = token.getCount();
-            if (value instanceof StringBuilder) {
-                buffer.append(value.toString());
-            } else {
-                if (value == y) {
-                    buffer.append(paddedValue(years, padWithZeros, count));
-                    lastOutputSeconds = false;
-                } else if (value == M) {
-                    buffer.append(paddedValue(months, padWithZeros, count));
-                    lastOutputSeconds = false;
-                } else if (value == d) {
-                    buffer.append(paddedValue(days, padWithZeros, count));
-                    lastOutputSeconds = false;
-                } else if (value == H) {
-                    buffer.append(paddedValue(hours, padWithZeros, count));
-                    lastOutputSeconds = false;
-                } else if (value == m) {
-                    buffer.append(paddedValue(minutes, padWithZeros, count));
-                    lastOutputSeconds = false;
-                } else if (value == s) {
-                    buffer.append(paddedValue(seconds, padWithZeros, count));
-                    lastOutputSeconds = true;
-                } else if (value == S) {
-                    if (lastOutputSeconds) {
-                        // ensure at least 3 digits are displayed even if padding is not selected
-                        final int width = padWithZeros ? Math.max(3, count) : 3;
-                        buffer.append(paddedValue(milliseconds, true, width));
-                    } else {
-                        buffer.append(paddedValue(milliseconds, padWithZeros, count));
-                    }
-                    lastOutputSeconds = false;
-                }
-            }
-        }
-        return buffer.toString();
-    }
-
-    /**
-     * <p>Converts a {@code long} to a {@code String} with optional
-     * zero padding.</p>
-     *
-     * @param value the value to convert
-     * @param padWithZeros whether to pad with zeroes
-     * @param count the size to pad to (ignored if {@code padWithZeros} is false)
-     * @return the string result
-     */
-    private static String paddedValue(final long value, final boolean padWithZeros, final int count) {
-        final String longString = Long.toString(value);
-        return padWithZeros ? StringUtils.leftPad(longString, count, '0') : longString;
-    }
-
-    static final Object y = "y";
-    static final Object M = "M";
-    static final Object d = "d";
-    static final Object H = "H";
-    static final Object m = "m";
-    static final Object s = "s";
-    static final Object S = "S";
-    
-    /**
-     * Parses a classic date format string into Tokens
-     *
-     * @param format  the format to parse, not null
-     * @return array of Token[]
-     */
-    static Token[] lexx(final String format) {
-        final ArrayList<Token> list = new ArrayList<Token>(format.length());
-
-        boolean inLiteral = false;
-        // Although the buffer is stored in a Token, the Tokens are only
-        // used internally, so cannot be accessed by other threads
-        StringBuilder buffer = null;
-        Token previous = null;
-        for (int i = 0; i < format.length(); i++) {
-            final char ch = format.charAt(i);
-            if (inLiteral && ch != '\'') {
-                buffer.append(ch); // buffer can't be null if inLiteral is true
-                continue;
-            }
-            Object value = null;
-            switch (ch) {
-            // TODO: Need to handle escaping of '
-            case '\'':
-                if (inLiteral) {
-                    buffer = null;
-                    inLiteral = false;
-                } else {
-                    buffer = new StringBuilder();
-                    list.add(new Token(buffer));
-                    inLiteral = true;
-                }
-                break;
-            case 'y':
-                value = y;
-                break;
-            case 'M':
-                value = M;
-                break;
-            case 'd':
-                value = d;
-                break;
-            case 'H':
-                value = H;
-                break;
-            case 'm':
-                value = m;
-                break;
-            case 's':
-                value = s;
-                break;
-            case 'S':
-                value = S;
-                break;
-            default:
-                if (buffer == null) {
-                    buffer = new StringBuilder();
-                    list.add(new Token(buffer));
-                }
-                buffer.append(ch);
-            }
-
-            if (value != null) {
-                if (previous != null && previous.getValue() == value) {
-                    previous.increment();
-                } else {
-                    final Token token = new Token(value);
-                    list.add(token);
-                    previous = token;
-                }
-                buffer = null;
-            }
-        }
-        if (inLiteral) { // i.e. we have not found the end of the literal
-            throw new IllegalArgumentException("Unmatched quote in format: " + format);
-        }
-        return list.toArray(new Token[list.size()]);
-    }
-
-    //-----------------------------------------------------------------------
-    /**
-     * Element that is parsed from the format pattern.
-     */
-    static class Token {
-
-        /**
-         * Helper method to determine if a set of tokens contain a value
-         *
-         * @param tokens set to look in
-         * @param value to look for
-         * @return boolean <code>true</code> if contained
-         */
-        static boolean containsTokenWithValue(final Token[] tokens, final Object value) {
-            for (final Token token : tokens) {
-                if (token.getValue() == value) {
-                    return true;
-                }
-            }
-            return false;
-        }
-
-        private final Object value;
-        private int count;
-
-        /**
-         * Wraps a token around a value. A value would be something like a 'Y'.
-         *
-         * @param value to wrap
-         */
-        Token(final Object value) {
-            this.value = value;
-            this.count = 1;
-        }
-
-        /**
-         * Wraps a token around a repeated number of a value, for example it would 
-         * store 'yyyy' as a value for y and a count of 4.
-         *
-         * @param value to wrap
-         * @param count to wrap
-         */
-        Token(final Object value, final int count) {
-            this.value = value;
-            this.count = count;
-        }
-
-        /**
-         * Adds another one of the value
-         */
-        void increment() { 
-            count++;
-        }
-
-        /**
-         * Gets the current number of values represented
-         *
-         * @return int number of values represented
-         */
-        int getCount() {
-            return count;
-        }
-
-        /**
-         * Gets the particular value this token represents.
-         * 
-         * @return Object value
-         */
-        Object getValue() {
-            return value;
-        }
-
-        /**
-         * Supports equality of this Token to another Token.
-         *
-         * @param obj2 Object to consider equality of
-         * @return boolean <code>true</code> if equal
-         */
-        @Override
-        public boolean equals(final Object obj2) {
-            if (obj2 instanceof Token) {
-                final Token tok2 = (Token) obj2;
-                if (this.value.getClass() != tok2.value.getClass()) {
-                    return false;
-                }
-                if (this.count != tok2.count) {
-                    return false;
-                }
-                if (this.value instanceof StringBuilder) {
-                    return this.value.toString().equals(tok2.value.toString());
-                } else if (this.value instanceof Number) {
-                    return this.value.equals(tok2.value);
-                } else {
-                    return this.value == tok2.value;
-                }
-            }
-            return false;
-        }
-
-        /**
-         * Returns a hash code for the token equal to the 
-         * hash code for the token's value. Thus 'TT' and 'TTTT' 
-         * will have the same hash code. 
-         *
-         * @return The hash code for the token
-         */
-        @Override
-        public int hashCode() {
-            return this.value.hashCode();
-        }
-
-        /**
-         * Represents this token as a String.
-         *
-         * @return String representation of the token
-         */
-        @Override
-        public String toString() {
-            return StringUtils.repeat(this.value.toString(), this.count);
-        }
-    }
-
-}
diff --git a/lang/src/main/java/org/apache/commons/lang3/time/FastDateFormat.java b/lang/src/main/java/org/apache/commons/lang3/time/FastDateFormat.java
deleted file mode 100644
index 7f17220..0000000
--- a/lang/src/main/java/org/apache/commons/lang3/time/FastDateFormat.java
+++ /dev/null
@@ -1,615 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.commons.lang3.time;
-
-import java.text.DateFormat;
-import java.text.FieldPosition;
-import java.text.Format;
-import java.text.ParseException;
-import java.text.ParsePosition;
-import java.util.Calendar;
-import java.util.Date;
-import java.util.Locale;
-import java.util.TimeZone;
-
-/**
- * <p>FastDateFormat is a fast and thread-safe version of
- * {@link java.text.SimpleDateFormat}.</p>
- *
- * <p>To obtain an instance of FastDateFormat, use one of the static factory methods: 
- * {@link #getInstance(String, TimeZone, Locale)}, {@link #getDateInstance(int, TimeZone, Locale)}, 
- * {@link #getTimeInstance(int, TimeZone, Locale)}, or {@link #getDateTimeInstance(int, int, TimeZone, Locale)} 
- * </p>
- * 
- * <p>Since FastDateFormat is thread safe, you can use a static member instance:</p>
- * <code>
- *   private static final FastDateFormat DATE_FORMATTER = FastDateFormat.getDateTimeInstance(FastDateFormat.LONG, FastDateFormat.SHORT);
- * </code>
- * 
- * <p>This class can be used as a direct replacement to
- * {@code SimpleDateFormat} in most formatting and parsing situations.
- * This class is especially useful in multi-threaded server environments.
- * {@code SimpleDateFormat} is not thread-safe in any JDK version,
- * nor will it be as Sun have closed the bug/RFE.
- * </p>
- *
- * <p>All patterns are compatible with
- * SimpleDateFormat (except time zones and some year patterns - see below).</p>
- *
- * <p>Since 3.2, FastDateFormat supports parsing as well as printing.</p>
- *
- * <p>Java 1.4 introduced a new pattern letter, {@code 'Z'}, to represent
- * time zones in RFC822 format (eg. {@code +0800} or {@code -1100}).
- * This pattern letter can be used here (on all JDK versions).</p>
- *
- * <p>In addition, the pattern {@code 'ZZ'} has been made to represent
- * ISO 8601 full format time zones (eg. {@code +08:00} or {@code -11:00}).
- * This introduces a minor incompatibility with Java 1.4, but at a gain of
- * useful functionality.</p>
- *
- * <p>Javadoc cites for the year pattern: <i>For formatting, if the number of
- * pattern letters is 2, the year is truncated to 2 digits; otherwise it is
- * interpreted as a number.</i> Starting with Java 1.7 a pattern of 'Y' or
- * 'YYY' will be formatted as '2003', while it was '03' in former Java
- * versions. FastDateFormat implements the behavior of Java 7.</p>
- *
- * @since 2.0
- * @version $Id$
- */
-public class FastDateFormat extends Format implements DateParser, DatePrinter {
-    /**
-     * Required for serialization support.
-     *
-     * @see java.io.Serializable
-     */
-    private static final long serialVersionUID = 2L;
-
-    /**
-     * FULL locale dependent date or time style.
-     */
-    public static final int FULL = DateFormat.FULL;
-    /**
-     * LONG locale dependent date or time style.
-     */
-    public static final int LONG = DateFormat.LONG;
-    /**
-     * MEDIUM locale dependent date or time style.
-     */
-    public static final int MEDIUM = DateFormat.MEDIUM;
-    /**
-     * SHORT locale dependent date or time style.
-     */
-    public static final int SHORT = DateFormat.SHORT;
-
-    private static final FormatCache<FastDateFormat> cache= new FormatCache<FastDateFormat>() {
-        @Override
-        protected FastDateFormat createInstance(final String pattern, final TimeZone timeZone, final Locale locale) {
-            return new FastDateFormat(pattern, timeZone, locale);
-        }
-    };
-
-    private final FastDatePrinter printer;
-    private final FastDateParser parser;
-
-    //-----------------------------------------------------------------------
-    /**
-     * <p>Gets a formatter instance using the default pattern in the
-     * default locale.</p>
-     *
-     * @return a date/time formatter
-     */
-    public static FastDateFormat getInstance() {
-        return cache.getInstance();
-    }
-
-    /**
-     * <p>Gets a formatter instance using the specified pattern in the
-     * default locale.</p>
-     *
-     * @param pattern  {@link java.text.SimpleDateFormat} compatible
-     *  pattern
-     * @return a pattern based date/time formatter
-     * @throws IllegalArgumentException if pattern is invalid
-     */
-    public static FastDateFormat getInstance(final String pattern) {
-        return cache.getInstance(pattern, null, null);
-    }
-
-    /**
-     * <p>Gets a formatter instance using the specified pattern and
-     * time zone.</p>
-     *
-     * @param pattern  {@link java.text.SimpleDateFormat} compatible
-     *  pattern
-     * @param timeZone  optional time zone, overrides time zone of
-     *  formatted date
-     * @return a pattern based date/time formatter
-     * @throws IllegalArgumentException if pattern is invalid
-     */
-    public static FastDateFormat getInstance(final String pattern, final TimeZone timeZone) {
-        return cache.getInstance(pattern, timeZone, null);
-    }
-
-    /**
-     * <p>Gets a formatter instance using the specified pattern and
-     * locale.</p>
-     *
-     * @param pattern  {@link java.text.SimpleDateFormat} compatible
-     *  pattern
-     * @param locale  optional locale, overrides system locale
-     * @return a pattern based date/time formatter
-     * @throws IllegalArgumentException if pattern is invalid
-     */
-    public static FastDateFormat getInstance(final String pattern, final Locale locale) {
-        return cache.getInstance(pattern, null, locale);
-    }
-
-    /**
-     * <p>Gets a formatter instance using the specified pattern, time zone
-     * and locale.</p>
-     *
-     * @param pattern  {@link java.text.SimpleDateFormat} compatible
-     *  pattern
-     * @param timeZone  optional time zone, overrides time zone of
-     *  formatted date
-     * @param locale  optional locale, overrides system locale
-     * @return a pattern based date/time formatter
-     * @throws IllegalArgumentException if pattern is invalid
-     *  or {@code null}
-     */
-    public static FastDateFormat getInstance(final String pattern, final TimeZone timeZone, final Locale locale) {
-        return cache.getInstance(pattern, timeZone, locale);
-    }
-
-    //-----------------------------------------------------------------------
-    /**
-     * <p>Gets a date formatter instance using the specified style in the
-     * default time zone and locale.</p>
-     *
-     * @param style  date style: FULL, LONG, MEDIUM, or SHORT
-     * @return a localized standard date formatter
-     * @throws IllegalArgumentException if the Locale has no date
-     *  pattern defined
-     * @since 2.1
-     */
-    public static FastDateFormat getDateInstance(final int style) {
-        return cache.getDateInstance(style, null, null);
-    }
-
-    /**
-     * <p>Gets a date formatter instance using the specified style and
-     * locale in the default time zone.</p>
-     *
-     * @param style  date style: FULL, LONG, MEDIUM, or SHORT
-     * @param locale  optional locale, overrides system locale
-     * @return a localized standard date formatter
-     * @throws IllegalArgumentException if the Locale has no date
-     *  pattern defined
-     * @since 2.1
-     */
-    public static FastDateFormat getDateInstance(final int style, final Locale locale) {
-        return cache.getDateInstance(style, null, locale);
-    }
-
-    /**
-     * <p>Gets a date formatter instance using the specified style and
-     * time zone in the default locale.</p>
-     *
-     * @param style  date style: FULL, LONG, MEDIUM, or SHORT
-     * @param timeZone  optional time zone, overrides time zone of
-     *  formatted date
-     * @return a localized standard date formatter
-     * @throws IllegalArgumentException if the Locale has no date
-     *  pattern defined
-     * @since 2.1
-     */
-    public static FastDateFormat getDateInstance(final int style, final TimeZone timeZone) {
-        return cache.getDateInstance(style, timeZone, null);
-    }
-
-    /**
-     * <p>Gets a date formatter instance using the specified style, time
-     * zone and locale.</p>
-     *
-     * @param style  date style: FULL, LONG, MEDIUM, or SHORT
-     * @param timeZone  optional time zone, overrides time zone of
-     *  formatted date
-     * @param locale  optional locale, overrides system locale
-     * @return a localized standard date formatter
-     * @throws IllegalArgumentException if the Locale has no date
-     *  pattern defined
-     */
-    public static FastDateFormat getDateInstance(final int style, final TimeZone timeZone, final Locale locale) {
-        return cache.getDateInstance(style, timeZone, locale);
-    }
-
-    //-----------------------------------------------------------------------
-    /**
-     * <p>Gets a time formatter instance using the specified style in the
-     * default time zone and locale.</p>
-     *
-     * @param style  time style: FULL, LONG, MEDIUM, or SHORT
-     * @return a localized standard time formatter
-     * @throws IllegalArgumentException if the Locale has no time
-     *  pattern defined
-     * @since 2.1
-     */
-    public static FastDateFormat getTimeInstance(final int style) {
-        return cache.getTimeInstance(style, null, null);
-    }
-
-    /**
-     * <p>Gets a time formatter instance using the specified style and
-     * locale in the default time zone.</p>
-     *
-     * @param style  time style: FULL, LONG, MEDIUM, or SHORT
-     * @param locale  optional locale, overrides system locale
-     * @return a localized standard time formatter
-     * @throws IllegalArgumentException if the Locale has no time
-     *  pattern defined
-     * @since 2.1
-     */
-    public static FastDateFormat getTimeInstance(final int style, final Locale locale) {
-        return cache.getTimeInstance(style, null, locale);
-    }
-
-    /**
-     * <p>Gets a time formatter instance using the specified style and
-     * time zone in the default locale.</p>
-     *
-     * @param style  time style: FULL, LONG, MEDIUM, or SHORT
-     * @param timeZone  optional time zone, overrides time zone of
-     *  formatted time
-     * @return a localized standard time formatter
-     * @throws IllegalArgumentException if the Locale has no time
-     *  pattern defined
-     * @since 2.1
-     */
-    public static FastDateFormat getTimeInstance(final int style, final TimeZone timeZone) {
-        return cache.getTimeInstance(style, timeZone, null);
-    }
-
-    /**
-     * <p>Gets a time formatter instance using the specified style, time
-     * zone and locale.</p>
-     *
-     * @param style  time style: FULL, LONG, MEDIUM, or SHORT
-     * @param timeZone  optional time zone, overrides time zone of
-     *  formatted time
-     * @param locale  optional locale, overrides system locale
-     * @return a localized standard time formatter
-     * @throws IllegalArgumentException if the Locale has no time
-     *  pattern defined
-     */
-    public static FastDateFormat getTimeInstance(final int style, final TimeZone timeZone, final Locale locale) {
-        return cache.getTimeInstance(style, timeZone, locale);
-    }
-
-    //-----------------------------------------------------------------------
-    /**
-     * <p>Gets a date/time formatter instance using the specified style
-     * in the default time zone and locale.</p>
-     *
-     * @param dateStyle  date style: FULL, LONG, MEDIUM, or SHORT
-     * @param timeStyle  time style: FULL, LONG, MEDIUM, or SHORT
-     * @return a localized standard date/time formatter
-     * @throws IllegalArgumentException if the Locale has no date/time
-     *  pattern defined
-     * @since 2.1
-     */
-    public static FastDateFormat getDateTimeInstance(final int dateStyle, final int timeStyle) {
-        return cache.getDateTimeInstance(dateStyle, timeStyle, null, null);
-    }
-
-    /**
-     * <p>Gets a date/time formatter instance using the specified style and
-     * locale in the default time zone.</p>
-     *
-     * @param dateStyle  date style: FULL, LONG, MEDIUM, or SHORT
-     * @param timeStyle  time style: FULL, LONG, MEDIUM, or SHORT
-     * @param locale  optional locale, overrides system locale
-     * @return a localized standard date/time formatter
-     * @throws IllegalArgumentException if the Locale has no date/time
-     *  pattern defined
-     * @since 2.1
-     */
-    public static FastDateFormat getDateTimeInstance(final int dateStyle, final int timeStyle, final Locale locale) {
-        return cache.getDateTimeInstance(dateStyle, timeStyle, null, locale);
-    }
-
-    /**
-     * <p>Gets a date/time formatter instance using the specified style and
-     * time zone in the default locale.</p>
-     *
-     * @param dateStyle  date style: FULL, LONG, MEDIUM, or SHORT
-     * @param timeStyle  time style: FULL, LONG, MEDIUM, or SHORT
-     * @param timeZone  optional time zone, overrides time zone of
-     *  formatted date
-     * @return a localized standard date/time formatter
-     * @throws IllegalArgumentException if the Locale has no date/time
-     *  pattern defined
-     * @since 2.1
-     */
-    public static FastDateFormat getDateTimeInstance(final int dateStyle, final int timeStyle, final TimeZone timeZone) {
-        return getDateTimeInstance(dateStyle, timeStyle, timeZone, null);
-    }
-    /**
-     * <p>Gets a date/time formatter instance using the specified style,
-     * time zone and locale.</p>
-     *
-     * @param dateStyle  date style: FULL, LONG, MEDIUM, or SHORT
-     * @param timeStyle  time style: FULL, LONG, MEDIUM, or SHORT
-     * @param timeZone  optional time zone, overrides time zone of
-     *  formatted date
-     * @param locale  optional locale, overrides system locale
-     * @return a localized standard date/time formatter
-     * @throws IllegalArgumentException if the Locale has no date/time
-     *  pattern defined
-     */
-    public static FastDateFormat getDateTimeInstance(
-            final int dateStyle, final int timeStyle, final TimeZone timeZone, final Locale locale) {
-        return cache.getDateTimeInstance(dateStyle, timeStyle, timeZone, locale);
-    }
-
-    // Constructor
-    //-----------------------------------------------------------------------
-    /**
-     * <p>Constructs a new FastDateFormat.</p>
-     *
-     * @param pattern  {@link java.text.SimpleDateFormat} compatible pattern
-     * @param timeZone  non-null time zone to use
-     * @param locale  non-null locale to use
-     * @throws NullPointerException if pattern, timeZone, or locale is null.
-     */
-    protected FastDateFormat(final String pattern, final TimeZone timeZone, final Locale locale) {
-        this(pattern, timeZone, locale, null);
-    }
-
-    // Constructor
-    //-----------------------------------------------------------------------
-    /**
-     * <p>Constructs a new FastDateFormat.</p>
-     *
-     * @param pattern  {@link java.text.SimpleDateFormat} compatible pattern
-     * @param timeZone  non-null time zone to use
-     * @param locale  non-null locale to use
-     * @param centuryStart The start of the 100 year period to use as the "default century" for 2 digit year parsing.  If centuryStart is null, defaults to now - 80 years
-     * @throws NullPointerException if pattern, timeZone, or locale is null.
-     */
-    protected FastDateFormat(final String pattern, final TimeZone timeZone, final Locale locale, final Date centuryStart) {
-        printer= new FastDatePrinter(pattern, timeZone, locale);
-        parser= new FastDateParser(pattern, timeZone, locale, centuryStart);
-    }
-
-    // Format methods
-    //-----------------------------------------------------------------------
-    /**
-     * <p>Formats a {@code Date}, {@code Calendar} or
-     * {@code Long} (milliseconds) object.</p>
-     *
-     * @param obj  the object to format
-     * @param toAppendTo  the buffer to append to
-     * @param pos  the position - ignored
-     * @return the buffer passed in
-     */
-    @Override
-    public StringBuffer format(final Object obj, final StringBuffer toAppendTo, final FieldPosition pos) {
-        return printer.format(obj, toAppendTo, pos);
-    }
-
-    /**
-     * <p>Formats a millisecond {@code long} value.</p>
-     *
-     * @param millis  the millisecond value to format
-     * @return the formatted string
-     * @since 2.1
-     */
-    @Override
-    public String format(final long millis) {
-        return printer.format(millis);
-    }
-
-    /**
-     * <p>Formats a {@code Date} object using a {@code GregorianCalendar}.</p>
-     *
-     * @param date  the date to format
-     * @return the formatted string
-     */
-    @Override
-    public String format(final Date date) {
-        return printer.format(date);
-    }
-
-    /**
-     * <p>Formats a {@code Calendar} object.</p>
-     *
-     * @param calendar  the calendar to format
-     * @return the formatted string
-     */
-    @Override
-    public String format(final Calendar calendar) {
-        return printer.format(calendar);
-    }
-
-    /**
-     * <p>Formats a millisecond {@code long} value into the
-     * supplied {@code StringBuffer}.</p>
-     *
-     * @param millis  the millisecond value to format
-     * @param buf  the buffer to format into
-     * @return the specified string buffer
-     * @since 2.1
-     */
-    @Override
-    public StringBuffer format(final long millis, final StringBuffer buf) {
-        return printer.format(millis, buf);
-    }
-
-    /**
-     * <p>Formats a {@code Date} object into the
-     * supplied {@code StringBuffer} using a {@code GregorianCalendar}.</p>
-     *
-     * @param date  the date to format
-     * @param buf  the buffer to format into
-     * @return the specified string buffer
-     */
-    @Override
-    public StringBuffer format(final Date date, final StringBuffer buf) {
-        return printer.format(date, buf);
-    }
-
-    /**
-     * <p>Formats a {@code Calendar} object into the
-     * supplied {@code StringBuffer}.</p>
-     *
-     * @param calendar  the calendar to format
-     * @param buf  the buffer to format into
-     * @return the specified string buffer
-     */
-    @Override
-    public StringBuffer format(final Calendar calendar, final StringBuffer buf) {
-        return printer.format(calendar, buf);
-    }
-
-    // Parsing
-    //-----------------------------------------------------------------------
-
-
-    /* (non-Javadoc)
-     * @see DateParser#parse(java.lang.String)
-     */
-    @Override
-    public Date parse(final String source) throws ParseException {
-        return parser.parse(source);
-    }
-
-    /* (non-Javadoc)
-     * @see DateParser#parse(java.lang.String, java.text.ParsePosition)
-     */
-    @Override
-    public Date parse(final String source, final ParsePosition pos) {
-            return parser.parse(source, pos);
-    }
-
-    /* (non-Javadoc)
-     * @see java.text.Format#parseObject(java.lang.String, java.text.ParsePosition)
-     */
-    @Override
-    public Object parseObject(final String source, final ParsePosition pos) {
-        return parser.parseObject(source, pos);
-    }
-
-    // Accessors
-    //-----------------------------------------------------------------------
-    /**
-     * <p>Gets the pattern used by this formatter.</p>
-     *
-     * @return the pattern, {@link java.text.SimpleDateFormat} compatible
-     */
-    @Override
-    public String getPattern() {
-        return printer.getPattern();
-    }
-
-    /**
-     * <p>Gets the time zone used by this formatter.</p>
-     *
-     * <p>This zone is always used for {@code Date} formatting. </p>
-     *
-     * @return the time zone
-     */
-    @Override
-    public TimeZone getTimeZone() {
-        return printer.getTimeZone();
-    }
-
-    /**
-     * <p>Gets the locale used by this formatter.</p>
-     *
-     * @return the locale
-     */
-    @Override
-    public Locale getLocale() {
-        return printer.getLocale();
-    }
-
-    /**
-     * <p>Gets an estimate for the maximum string length that the
-     * formatter will produce.</p>
-     *
-     * <p>The actual formatted length will almost always be less than or
-     * equal to this amount.</p>
-     *
-     * @return the maximum formatted length
-     */
-    public int getMaxLengthEstimate() {
-        return printer.getMaxLengthEstimate();
-    }
-
-    // Basics
-    //-----------------------------------------------------------------------
-    /**
-     * <p>Compares two objects for equality.</p>
-     *
-     * @param obj  the object to compare to
-     * @return {@code true} if equal
-     */
-    @Override
-    public boolean equals(final Object obj) {
-        if (obj instanceof FastDateFormat == false) {
-            return false;
-        }
-        final FastDateFormat other = (FastDateFormat) obj;
-        // no need to check parser, as it has same invariants as printer
-        return printer.equals(other.printer);
-    }
-
-    /**
-     * <p>Returns a hashcode compatible with equals.</p>
-     *
-     * @return a hashcode compatible with equals
-     */
-    @Override
-    public int hashCode() {
-        return printer.hashCode();
-    }
-
-    /**
-     * <p>Gets a debugging string version of this formatter.</p>
-     *
-     * @return a debugging string
-     */
-    @Override
-    public String toString() {
-        return "FastDateFormat[" + printer.getPattern() + "," + printer.getLocale() + "," + printer.getTimeZone().getID() + "]";
-    }
-
-
-    /**
-     * <p>Performs the formatting by applying the rules to the
-     * specified calendar.</p>
-     *
-     * @param calendar  the calendar to format
-     * @param buf  the buffer to format into
-     * @return the specified string buffer
-     */
-    protected StringBuffer applyRules(final Calendar calendar, final StringBuffer buf) {
-        return printer.applyRules(calendar, buf);
-    }
-
-
-}
diff --git a/lang/src/main/java/org/apache/commons/lang3/time/FastDateParser.java b/lang/src/main/java/org/apache/commons/lang3/time/FastDateParser.java
deleted file mode 100644
index d704f69..0000000
--- a/lang/src/main/java/org/apache/commons/lang3/time/FastDateParser.java
+++ /dev/null
@@ -1,931 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.commons.lang3.time;
-
-import java.io.IOException;
-import java.io.ObjectInputStream;
-import java.io.Serializable;
-import java.text.DateFormatSymbols;
-import java.text.ParseException;
-import java.text.ParsePosition;
-import java.util.ArrayList;
-import java.util.Calendar;
-import java.util.Date;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Locale;
-import java.util.Map;
-import java.util.SortedMap;
-import java.util.TimeZone;
-import java.util.TreeMap;
-import java.util.concurrent.ConcurrentHashMap;
-import java.util.concurrent.ConcurrentMap;
-import java.util.regex.Matcher;
-import java.util.regex.Pattern;
-
-/**
- * <p>FastDateParser is a fast and thread-safe version of
- * {@link java.text.SimpleDateFormat}.</p>
- *
- * <p>To obtain a proxy to a FastDateParser, use {@link FastDateFormat#getInstance(String, TimeZone, Locale)} 
- * or another variation of the factory methods of {@link FastDateFormat}.</p>
- * 
- * <p>Since FastDateParser is thread safe, you can use a static member instance:</p>
- * <code>
- *     private static final DateParser DATE_PARSER = FastDateFormat.getInstance("yyyy-MM-dd");
- * </code>
- * 
- * <p>This class can be used as a direct replacement for
- * <code>SimpleDateFormat</code> in most parsing situations.
- * This class is especially useful in multi-threaded server environments.
- * <code>SimpleDateFormat</code> is not thread-safe in any JDK version,
- * nor will it be as Sun has closed the
- * <a href="http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=4228335">bug</a>/RFE.
- * </p>
- *
- * <p>Only parsing is supported by this class, but all patterns are compatible with
- * SimpleDateFormat.</p>
- *
- * <p>The class operates in lenient mode, so for example a time of 90 minutes is treated as 1 hour 30 minutes.</p>
- *
- * <p>Timing tests indicate this class is as about as fast as SimpleDateFormat
- * in single thread applications and about 25% faster in multi-thread applications.</p>
- *
- * @version $Id$
- * @since 3.2
- * @see FastDatePrinter
- */
-public class FastDateParser implements DateParser, Serializable {
-    /**
-     * Required for serialization support.
-     *
-     * @see java.io.Serializable
-     */
-    private static final long serialVersionUID = 2L;
-
-    static final Locale JAPANESE_IMPERIAL = new Locale("ja","JP","JP");
-
-    // defining fields
-    private final String pattern;
-    private final TimeZone timeZone;
-    private final Locale locale;
-    private final int century;
-    private final int startYear;
-
-    // derived fields
-    private transient Pattern parsePattern;
-    private transient Strategy[] strategies;
-
-    // dynamic fields to communicate with Strategy
-    private transient String currentFormatField;
-    private transient Strategy nextStrategy;
-
-    /**
-     * <p>Constructs a new FastDateParser.</p>
-     * 
-     * Use {@link FastDateFormat#getInstance(String, TimeZone, Locale)} or another variation of the 
-     * factory methods of {@link FastDateFormat} to get a cached FastDateParser instance.
-     *
-     * @param pattern non-null {@link java.text.SimpleDateFormat} compatible
-     *  pattern
-     * @param timeZone non-null time zone to use
-     * @param locale non-null locale
-     */
-    protected FastDateParser(final String pattern, final TimeZone timeZone, final Locale locale) {
-        this(pattern, timeZone, locale, null);
-    }
-
-    /**
-     * <p>Constructs a new FastDateParser.</p>
-     *
-     * @param pattern non-null {@link java.text.SimpleDateFormat} compatible
-     *  pattern
-     * @param timeZone non-null time zone to use
-     * @param locale non-null locale
-     * @param centuryStart The start of the century for 2 digit year parsing
-     *
-     * @since 3.3
-     */
-    protected FastDateParser(final String pattern, final TimeZone timeZone, final Locale locale, final Date centuryStart) {
-        this.pattern = pattern;
-        this.timeZone = timeZone;
-        this.locale = locale;
-
-        final Calendar definingCalendar = Calendar.getInstance(timeZone, locale);
-        int centuryStartYear;
-        if(centuryStart!=null) {
-            definingCalendar.setTime(centuryStart);
-            centuryStartYear= definingCalendar.get(Calendar.YEAR);
-        }
-        else if(locale.equals(JAPANESE_IMPERIAL)) {
-            centuryStartYear= 0;
-        }
-        else {
-            // from 80 years ago to 20 years from now
-            definingCalendar.setTime(new Date());
-            centuryStartYear= definingCalendar.get(Calendar.YEAR)-80;
-        }
-        century= centuryStartYear / 100 * 100;
-        startYear= centuryStartYear - century;
-
-        init(definingCalendar);
-    }
-
-    /**
-     * Initialize derived fields from defining fields.
-     * This is called from constructor and from readObject (de-serialization)
-     *
-     * @param definingCalendar the {@link java.util.Calendar} instance used to initialize this FastDateParser
-     */
-    private void init(final Calendar definingCalendar) {
-
-        final StringBuilder regex= new StringBuilder();
-        final List<Strategy> collector = new ArrayList<Strategy>();
-
-        final Matcher patternMatcher= formatPattern.matcher(pattern);
-        if(!patternMatcher.lookingAt()) {
-            throw new IllegalArgumentException(
-                    "Illegal pattern character '" + pattern.charAt(patternMatcher.regionStart()) + "'");
-        }
-
-        currentFormatField= patternMatcher.group();
-        Strategy currentStrategy= getStrategy(currentFormatField, definingCalendar);
-        for(;;) {
-            patternMatcher.region(patternMatcher.end(), patternMatcher.regionEnd());
-            if(!patternMatcher.lookingAt()) {
-                nextStrategy = null;
-                break;
-            }
-            final String nextFormatField= patternMatcher.group();
-            nextStrategy = getStrategy(nextFormatField, definingCalendar);
-            if(currentStrategy.addRegex(this, regex)) {
-                collector.add(currentStrategy);
-            }
-            currentFormatField= nextFormatField;
-            currentStrategy= nextStrategy;
-        }
-        if (patternMatcher.regionStart() != patternMatcher.regionEnd()) {
-            throw new IllegalArgumentException("Failed to parse \""+pattern+"\" ; gave up at index "+patternMatcher.regionStart());
-        }
-        if(currentStrategy.addRegex(this, regex)) {
-            collector.add(currentStrategy);
-        }
-        currentFormatField= null;
-        strategies= collector.toArray(new Strategy[collector.size()]);
-        parsePattern= Pattern.compile(regex.toString());
-    }
-
-    // Accessors
-    //-----------------------------------------------------------------------
-    /* (non-Javadoc)
-     * @see org.apache.commons.lang3.time.DateParser#getPattern()
-     */
-    @Override
-    public String getPattern() {
-        return pattern;
-    }
-
-    /* (non-Javadoc)
-     * @see org.apache.commons.lang3.time.DateParser#getTimeZone()
-     */
-    @Override
-    public TimeZone getTimeZone() {
-        return timeZone;
-    }
-
-    /* (non-Javadoc)
-     * @see org.apache.commons.lang3.time.DateParser#getLocale()
-     */
-    @Override
-    public Locale getLocale() {
-        return locale;
-    }
-
-    /**
-     * Returns the generated pattern (for testing purposes).
-     *
-     * @return the generated pattern
-     */
-    Pattern getParsePattern() {
-        return parsePattern;
-    }
-
-    // Basics
-    //-----------------------------------------------------------------------
-    /**
-     * <p>Compare another object for equality with this object.</p>
-     *
-     * @param obj  the object to compare to
-     * @return <code>true</code>if equal to this instance
-     */
-    @Override
-    public boolean equals(final Object obj) {
-        if (! (obj instanceof FastDateParser) ) {
-            return false;
-        }
-        final FastDateParser other = (FastDateParser) obj;
-        return pattern.equals(other.pattern)
-            && timeZone.equals(other.timeZone)
-            && locale.equals(other.locale);
-    }
-
-    /**
-     * <p>Return a hashcode compatible with equals.</p>
-     *
-     * @return a hashcode compatible with equals
-     */
-    @Override
-    public int hashCode() {
-        return pattern.hashCode() + 13 * (timeZone.hashCode() + 13 * locale.hashCode());
-    }
-
-    /**
-     * <p>Get a string version of this formatter.</p>
-     *
-     * @return a debugging string
-     */
-    @Override
-    public String toString() {
-        return "FastDateParser[" + pattern + "," + locale + "," + timeZone.getID() + "]";
-    }
-
-    // Serializing
-    //-----------------------------------------------------------------------
-    /**
-     * Create the object after serialization. This implementation reinitializes the
-     * transient properties.
-     *
-     * @param in ObjectInputStream from which the object is being deserialized.
-     * @throws IOException if there is an IO issue.
-     * @throws ClassNotFoundException if a class cannot be found.
-     */
-    private void readObject(final ObjectInputStream in) throws IOException, ClassNotFoundException {
-        in.defaultReadObject();
-
-        final Calendar definingCalendar = Calendar.getInstance(timeZone, locale);
-        init(definingCalendar);
-    }
-
-    /* (non-Javadoc)
-     * @see org.apache.commons.lang3.time.DateParser#parseObject(java.lang.String)
-     */
-    @Override
-    public Object parseObject(final String source) throws ParseException {
-        return parse(source);
-    }
-
-    /* (non-Javadoc)
-     * @see org.apache.commons.lang3.time.DateParser#parse(java.lang.String)
-     */
-    @Override
-    public Date parse(final String source) throws ParseException {
-        final Date date= parse(source, new ParsePosition(0));
-        if(date==null) {
-            // Add a note re supported date range
-            if (locale.equals(JAPANESE_IMPERIAL)) {
-                throw new ParseException(
-                        "(The " +locale + " locale does not support dates before 1868 AD)\n" +
-                                "Unparseable date: \""+source+"\" does not match "+parsePattern.pattern(), 0);
-            }
-            throw new ParseException("Unparseable date: \""+source+"\" does not match "+parsePattern.pattern(), 0);
-        }
-        return date;
-    }
-
-    /* (non-Javadoc)
-     * @see org.apache.commons.lang3.time.DateParser#parseObject(java.lang.String, java.text.ParsePosition)
-     */
-    @Override
-    public Object parseObject(final String source, final ParsePosition pos) {
-        return parse(source, pos);
-    }
-
-    /**
-     * This implementation updates the ParsePosition if the parse succeeeds.
-     * However, unlike the method {@link java.text.SimpleDateFormat#parse(String, ParsePosition)}
-     * it is not able to set the error Index - i.e. {@link ParsePosition#getErrorIndex()} -  if the parse fails.
-     * <p>
-     * To determine if the parse has succeeded, the caller must check if the current parse position
-     * given by {@link ParsePosition#getIndex()} has been updated. If the input buffer has been fully
-     * parsed, then the index will point to just after the end of the input buffer.
-     *
-     * @see org.apache.commons.lang3.time.DateParser#parse(java.lang.String, java.text.ParsePosition)
-     * {@inheritDoc}
-     */
-    @Override
-    public Date parse(final String source, final ParsePosition pos) {
-        final int offset= pos.getIndex();
-        final Matcher matcher= parsePattern.matcher(source.substring(offset));
-        if(!matcher.lookingAt()) {
-            return null;
-        }
-        // timing tests indicate getting new instance is 19% faster than cloning
-        final Calendar cal= Calendar.getInstance(timeZone, locale);
-        cal.clear();
-
-        for(int i=0; i<strategies.length;) {
-            final Strategy strategy= strategies[i++];
-            strategy.setCalendar(this, cal, matcher.group(i));
-        }
-        pos.setIndex(offset+matcher.end());
-        return cal.getTime();
-    }
-
-    // Support for strategies
-    //-----------------------------------------------------------------------
-
-    /**
-     * Escape constant fields into regular expression
-     * @param regex The destination regex
-     * @param value The source field
-     * @param unquote If true, replace two success quotes ('') with single quote (')
-     * @return The <code>StringBuilder</code>
-     */
-    private static StringBuilder escapeRegex(final StringBuilder regex, final String value, final boolean unquote) {
-        regex.append("\\Q");
-        for(int i= 0; i<value.length(); ++i) {
-            char c= value.charAt(i);
-            switch(c) {
-            case '\'':
-                if(unquote) {
-                    if(++i==value.length()) {
-                        return regex;
-                    }
-                    c= value.charAt(i);
-                }
-                break;
-            case '\\':
-                if(++i==value.length()) {
-                    break;
-                }
-                /*
-                 * If we have found \E, we replace it with \E\\E\Q, i.e. we stop the quoting,
-                 * quote the \ in \E, then restart the quoting.
-                 *
-                 * Otherwise we just output the two characters.
-                 * In each case the initial \ needs to be output and the final char is done at the end
-                 */
-                regex.append(c); // we always want the original \
-                c = value.charAt(i); // Is it followed by E ?
-                if (c == 'E') { // \E detected
-                  regex.append("E\\\\E\\"); // see comment above
-                  c = 'Q'; // appended below
-                }
-                break;
-            default:
-                break;
-            }
-            regex.append(c);
-        }
-        regex.append("\\E");
-        return regex;
-    }
-
-
-    /**
-     * Get the short and long values displayed for a field
-     * @param field The field of interest
-     * @param definingCalendar The calendar to obtain the short and long values
-     * @param locale The locale of display names
-     * @return A Map of the field key / value pairs
-     */
-    private static Map<String, Integer> getDisplayNames(final int field, final Calendar definingCalendar, final Locale locale) {
-        return definingCalendar.getDisplayNames(field, Calendar.ALL_STYLES, locale);
-    }
-
-    /**
-     * Adjust dates to be within appropriate century
-     * @param twoDigitYear The year to adjust
-     * @return A value between centuryStart(inclusive) to centuryStart+100(exclusive)
-     */
-    private int adjustYear(final int twoDigitYear) {
-        final int trial= century + twoDigitYear;
-        return twoDigitYear>=startYear ?trial :trial+100;
-    }
-
-    /**
-     * Is the next field a number?
-     * @return true, if next field will be a number
-     */
-    boolean isNextNumber() {
-        return nextStrategy!=null && nextStrategy.isNumber();
-    }
-
-    /**
-     * What is the width of the current field?
-     * @return The number of characters in the current format field
-     */
-    int getFieldWidth() {
-        return currentFormatField.length();
-    }
-
-    /**
-     * A strategy to parse a single field from the parsing pattern
-     */
-    private static abstract class Strategy {
-        
-        /**
-         * Is this field a number?
-         * The default implementation returns false.
-         *
-         * @return true, if field is a number
-         */
-        boolean isNumber() {
-            return false;
-        }
-        
-        /**
-         * Set the Calendar with the parsed field.
-         *
-         * The default implementation does nothing.
-         *
-         * @param parser The parser calling this strategy
-         * @param cal The <code>Calendar</code> to set
-         * @param value The parsed field to translate and set in cal
-         */
-        void setCalendar(final FastDateParser parser, final Calendar cal, final String value) {
-
-        }
-        
-        /**
-         * Generate a <code>Pattern</code> regular expression to the <code>StringBuilder</code>
-         * which will accept this field
-         * @param parser The parser calling this strategy
-         * @param regex The <code>StringBuilder</code> to append to
-         * @return true, if this field will set the calendar;
-         * false, if this field is a constant value
-         */
-        abstract boolean addRegex(FastDateParser parser, StringBuilder regex);
-
-    }
-
-    /**
-     * A <code>Pattern</code> to parse the user supplied SimpleDateFormat pattern
-     */
-    private static final Pattern formatPattern= Pattern.compile(
-            "D+|E+|F+|G+|H+|K+|M+|S+|W+|X+|Z+|a+|d+|h+|k+|m+|s+|w+|y+|z+|''|'[^']++(''[^']*+)*+'|[^'A-Za-z]++");
-
-    /**
-     * Obtain a Strategy given a field from a SimpleDateFormat pattern
-     * @param formatField A sub-sequence of the SimpleDateFormat pattern
-     * @param definingCalendar The calendar to obtain the short and long values
-     * @return The Strategy that will handle parsing for the field
-     */
-    private Strategy getStrategy(final String formatField, final Calendar definingCalendar) {
-        switch(formatField.charAt(0)) {
-        case '\'':
-            if(formatField.length()>2) {
-                return new CopyQuotedStrategy(formatField.substring(1, formatField.length()-1));
-            }
-            //$FALL-THROUGH$
-        default:
-            return new CopyQuotedStrategy(formatField);
-        case 'D':
-            return DAY_OF_YEAR_STRATEGY;
-        case 'E':
-            return getLocaleSpecificStrategy(Calendar.DAY_OF_WEEK, definingCalendar);
-        case 'F':
-            return DAY_OF_WEEK_IN_MONTH_STRATEGY;
-        case 'G':
-            return getLocaleSpecificStrategy(Calendar.ERA, definingCalendar);
-        case 'H':  // Hour in day (0-23)
-            return HOUR_OF_DAY_STRATEGY;
-        case 'K':  // Hour in am/pm (0-11) 
-            return HOUR_STRATEGY;
-        case 'M':
-            return formatField.length()>=3 ?getLocaleSpecificStrategy(Calendar.MONTH, definingCalendar) :NUMBER_MONTH_STRATEGY;
-        case 'S':
-            return MILLISECOND_STRATEGY;
-        case 'W':
-            return WEEK_OF_MONTH_STRATEGY;
-        case 'a':
-            return getLocaleSpecificStrategy(Calendar.AM_PM, definingCalendar);
-        case 'd':
-            return DAY_OF_MONTH_STRATEGY;
-        case 'h':  // Hour in am/pm (1-12), i.e. midday/midnight is 12, not 0
-            return HOUR12_STRATEGY;
-        case 'k':  // Hour in day (1-24), i.e. midnight is 24, not 0
-            return HOUR24_OF_DAY_STRATEGY;
-        case 'm':
-            return MINUTE_STRATEGY;
-        case 's':
-            return SECOND_STRATEGY;
-        case 'w':
-            return WEEK_OF_YEAR_STRATEGY;
-        case 'y':
-            return formatField.length()>2 ?LITERAL_YEAR_STRATEGY :ABBREVIATED_YEAR_STRATEGY;
-        case 'X':
-            return ISO8601TimeZoneStrategy.getStrategy(formatField.length());
-        case 'Z':
-            if (formatField.equals("ZZ")) {
-                return ISO_8601_STRATEGY;
-            }
-            //$FALL-THROUGH$
-        case 'z':
-            return getLocaleSpecificStrategy(Calendar.ZONE_OFFSET, definingCalendar);
-        }
-    }
-
-    @SuppressWarnings("unchecked") // OK because we are creating an array with no entries
-    private static final ConcurrentMap<Locale, Strategy>[] caches = new ConcurrentMap[Calendar.FIELD_COUNT];
-
-    /**
-     * Get a cache of Strategies for a particular field
-     * @param field The Calendar field
-     * @return a cache of Locale to Strategy
-     */
-    private static ConcurrentMap<Locale, Strategy> getCache(final int field) {
-        synchronized(caches) {
-            if(caches[field]==null) {
-                caches[field]= new ConcurrentHashMap<Locale,Strategy>(3);
-            }
-            return caches[field];
-        }
-    }
-
-    /**
-     * Construct a Strategy that parses a Text field
-     * @param field The Calendar field
-     * @param definingCalendar The calendar to obtain the short and long values
-     * @return a TextStrategy for the field and Locale
-     */
-    private Strategy getLocaleSpecificStrategy(final int field, final Calendar definingCalendar) {
-        final ConcurrentMap<Locale,Strategy> cache = getCache(field);
-        Strategy strategy= cache.get(locale);
-        if(strategy==null) {
-            strategy= field==Calendar.ZONE_OFFSET
-                    ? new TimeZoneStrategy(locale)
-                    : new CaseInsensitiveTextStrategy(field, definingCalendar, locale);
-            final Strategy inCache= cache.putIfAbsent(locale, strategy);
-            if(inCache!=null) {
-                return inCache;
-            }
-        }
-        return strategy;
-    }
-
-    /**
-     * A strategy that copies the static or quoted field in the parsing pattern
-     */
-    private static class CopyQuotedStrategy extends Strategy {
-        private final String formatField;
-
-        /**
-         * Construct a Strategy that ensures the formatField has literal text
-         * @param formatField The literal text to match
-         */
-        CopyQuotedStrategy(final String formatField) {
-            this.formatField= formatField;
-        }
-
-        /**
-         * {@inheritDoc}
-         */
-        @Override
-        boolean isNumber() {
-            char c= formatField.charAt(0);
-            if(c=='\'') {
-                c= formatField.charAt(1);
-            }
-            return Character.isDigit(c);
-        }
-
-        /**
-         * {@inheritDoc}
-         */
-        @Override
-        boolean addRegex(final FastDateParser parser, final StringBuilder regex) {
-            escapeRegex(regex, formatField, true);
-            return false;
-        }
-    }
-
-    /**
-     * A strategy that handles a text field in the parsing pattern
-     */
-     private static class CaseInsensitiveTextStrategy extends Strategy {
-        private final int field;
-        private final Locale locale;
-        private final Map<String, Integer> lKeyValues;
-
-        /**
-         * Construct a Strategy that parses a Text field
-         * @param field  The Calendar field
-         * @param definingCalendar  The Calendar to use
-         * @param locale  The Locale to use
-         */
-        CaseInsensitiveTextStrategy(final int field, final Calendar definingCalendar, final Locale locale) {
-            this.field= field;
-            this.locale= locale;
-            final Map<String, Integer> keyValues = getDisplayNames(field, definingCalendar, locale);
-            this.lKeyValues= new HashMap<String,Integer>();
-
-            for(final Map.Entry<String, Integer> entry : keyValues.entrySet()) {
-                lKeyValues.put(entry.getKey().toLowerCase(locale), entry.getValue());
-            }
-        }
-
-        /**
-         * {@inheritDoc}
-         */
-        @Override
-        boolean addRegex(final FastDateParser parser, final StringBuilder regex) {
-            regex.append("((?iu)");
-            for(final String textKeyValue : lKeyValues.keySet()) {
-                escapeRegex(regex, textKeyValue, false).append('|');
-            }
-            regex.setCharAt(regex.length()-1, ')');
-            return true;
-        }
-
-        /**
-         * {@inheritDoc}
-         */
-        @Override
-        void setCalendar(final FastDateParser parser, final Calendar cal, final String value) {
-            final Integer iVal = lKeyValues.get(value.toLowerCase(locale));
-            if(iVal == null) {
-                final StringBuilder sb= new StringBuilder(value);
-                sb.append(" not in (");
-                for(final String textKeyValue : lKeyValues.keySet()) {
-                    sb.append(textKeyValue).append(' ');
-                }
-                sb.setCharAt(sb.length()-1, ')');
-                throw new IllegalArgumentException(sb.toString());
-            }
-            cal.set(field, iVal.intValue());
-        }
-    }
-
-
-    /**
-     * A strategy that handles a number field in the parsing pattern
-     */
-    private static class NumberStrategy extends Strategy {
-        private final int field;
-
-        /**
-         * Construct a Strategy that parses a Number field
-         * @param field The Calendar field
-         */
-        NumberStrategy(final int field) {
-             this.field= field;
-        }
-
-        /**
-         * {@inheritDoc}
-         */
-        @Override
-        boolean isNumber() {
-            return true;
-        }
-
-        /**
-         * {@inheritDoc}
-         */
-        @Override
-        boolean addRegex(final FastDateParser parser, final StringBuilder regex) {
-            // See LANG-954: We use {Nd} rather than {IsNd} because Android does not support the Is prefix
-            if(parser.isNextNumber()) {
-                regex.append("(\\p{Nd}{").append(parser.getFieldWidth()).append("}+)");
-            }
-            else {
-                regex.append("(\\p{Nd}++)");
-            }
-            return true;
-        }
-
-        /**
-         * {@inheritDoc}
-         */
-        @Override
-        void setCalendar(final FastDateParser parser, final Calendar cal, final String value) {
-            cal.set(field, modify(Integer.parseInt(value)));
-        }
-
-        /**
-         * Make any modifications to parsed integer
-         * @param iValue The parsed integer
-         * @return The modified value
-         */
-        int modify(final int iValue) {
-            return iValue;
-        }
-    }
-
-    private static final Strategy ABBREVIATED_YEAR_STRATEGY = new NumberStrategy(Calendar.YEAR) {
-        /**
-         * {@inheritDoc}
-         */
-        @Override
-        void setCalendar(final FastDateParser parser, final Calendar cal, final String value) {
-            int iValue= Integer.parseInt(value);
-            if(iValue<100) {
-                iValue= parser.adjustYear(iValue);
-            }
-            cal.set(Calendar.YEAR, iValue);
-        }
-    };
-
-    /**
-     * A strategy that handles a timezone field in the parsing pattern
-     */
-    private static class TimeZoneStrategy extends Strategy {
-
-        private final String validTimeZoneChars;
-        private final SortedMap<String, TimeZone> tzNames= new TreeMap<String, TimeZone>(String.CASE_INSENSITIVE_ORDER);
-
-        /**
-         * Index of zone id
-         */
-        private static final int ID = 0;
-        /**
-         * Index of the long name of zone in standard time
-         */
-        private static final int LONG_STD = 1;
-        /**
-         * Index of the short name of zone in standard time
-         */
-        private static final int SHORT_STD = 2;
-        /**
-         * Index of the long name of zone in daylight saving time
-         */
-        private static final int LONG_DST = 3;
-        /**
-         * Index of the short name of zone in daylight saving time
-         */
-        private static final int SHORT_DST = 4;
-
-        /**
-         * Construct a Strategy that parses a TimeZone
-         * @param locale The Locale
-         */
-        TimeZoneStrategy(final Locale locale) {
-            final String[][] zones = DateFormatSymbols.getInstance(locale).getZoneStrings();
-            for (final String[] zone : zones) {
-                if (zone[ID].startsWith("GMT")) {
-                    continue;
-                }
-                final TimeZone tz = TimeZone.getTimeZone(zone[ID]);
-                if (!tzNames.containsKey(zone[LONG_STD])){
-                    tzNames.put(zone[LONG_STD], tz);
-                }
-                if (!tzNames.containsKey(zone[SHORT_STD])){
-                    tzNames.put(zone[SHORT_STD], tz);
-                }
-                if (tz.useDaylightTime()) {
-                    if (!tzNames.containsKey(zone[LONG_DST])){
-                        tzNames.put(zone[LONG_DST], tz);
-                    }
-                    if (!tzNames.containsKey(zone[SHORT_DST])){
-                        tzNames.put(zone[SHORT_DST], tz);
-                    }
-                }
-            }
-
-            final StringBuilder sb= new StringBuilder();
-            sb.append("(GMT[+-]\\d{1,2}:\\d{2}").append('|');
-            sb.append("[+-]\\d{4}").append('|');
-            for(final String id : tzNames.keySet()) {
-                escapeRegex(sb, id, false).append('|');
-            }
-            sb.setCharAt(sb.length()-1, ')');
-            validTimeZoneChars= sb.toString();
-        }
-
-        /**
-         * {@inheritDoc}
-         */
-        @Override
-        boolean addRegex(final FastDateParser parser, final StringBuilder regex) {
-            regex.append(validTimeZoneChars);
-            return true;
-        }
-
-        /**
-         * {@inheritDoc}
-         */
-        @Override
-        void setCalendar(final FastDateParser parser, final Calendar cal, final String value) {
-            TimeZone tz;
-            if(value.charAt(0)=='+' || value.charAt(0)=='-') {
-                tz= TimeZone.getTimeZone("GMT"+value);
-            }
-            else if(value.startsWith("GMT")) {
-                tz= TimeZone.getTimeZone(value);
-            }
-            else {
-                tz= tzNames.get(value);
-                if(tz==null) {
-                    throw new IllegalArgumentException(value + " is not a supported timezone name");
-                }
-            }
-            cal.setTimeZone(tz);
-        }
-    }
-    
-    private static class ISO8601TimeZoneStrategy extends Strategy {
-        // Z, +hh, -hh, +hhmm, -hhmm, +hh:mm or -hh:mm 
-        private final String pattern;
-
-        /**
-         * Construct a Strategy that parses a TimeZone
-         * @param pattern The Pattern
-         */
-        ISO8601TimeZoneStrategy(String pattern) {
-            this.pattern = pattern;
-        }
-        
-        /**
-         * {@inheritDoc}
-         */
-        @Override
-        boolean addRegex(FastDateParser parser, StringBuilder regex) {
-            regex.append(pattern);
-            return true;
-        }
-        
-        /**
-         * {@inheritDoc}
-         */
-        @Override
-        void setCalendar(FastDateParser parser, Calendar cal, String value) {
-            if (value.equals("Z")) {
-                cal.setTimeZone(TimeZone.getTimeZone("UTC"));
-            } else {
-                cal.setTimeZone(TimeZone.getTimeZone("GMT" + value));
-            }
-        }
-        
-        private static final Strategy ISO_8601_1_STRATEGY = new ISO8601TimeZoneStrategy("(Z|(?:[+-]\\d{2}))");
-        private static final Strategy ISO_8601_2_STRATEGY = new ISO8601TimeZoneStrategy("(Z|(?:[+-]\\d{2}\\d{2}))");
-        private static final Strategy ISO_8601_3_STRATEGY = new ISO8601TimeZoneStrategy("(Z|(?:[+-]\\d{2}(?::)\\d{2}))");
-
-        /**
-         * Factory method for ISO8601TimeZoneStrategies.
-         * 
-         * @param tokenLen a token indicating the length of the TimeZone String to be formatted.
-         * @return a ISO8601TimeZoneStrategy that can format TimeZone String of length {@code tokenLen}. If no such
-         *          strategy exists, an IllegalArgumentException will be thrown.
-         */
-        static Strategy getStrategy(int tokenLen) {
-            switch(tokenLen) {
-            case 1:
-                return ISO_8601_1_STRATEGY;
-            case 2:
-                return ISO_8601_2_STRATEGY;
-            case 3:
-                return ISO_8601_3_STRATEGY;
-            default:
-                throw new IllegalArgumentException("invalid number of X");
-            }
-        }
-    }
-
-    private static final Strategy NUMBER_MONTH_STRATEGY = new NumberStrategy(Calendar.MONTH) {
-        @Override
-        int modify(final int iValue) {
-            return iValue-1;
-        }
-    };
-    private static final Strategy LITERAL_YEAR_STRATEGY = new NumberStrategy(Calendar.YEAR);
-    private static final Strategy WEEK_OF_YEAR_STRATEGY = new NumberStrategy(Calendar.WEEK_OF_YEAR);
-    private static final Strategy WEEK_OF_MONTH_STRATEGY = new NumberStrategy(Calendar.WEEK_OF_MONTH);
-    private static final Strategy DAY_OF_YEAR_STRATEGY = new NumberStrategy(Calendar.DAY_OF_YEAR);
-    private static final Strategy DAY_OF_MONTH_STRATEGY = new NumberStrategy(Calendar.DAY_OF_MONTH);
-    private static final Strategy DAY_OF_WEEK_IN_MONTH_STRATEGY = new NumberStrategy(Calendar.DAY_OF_WEEK_IN_MONTH);
-    private static final Strategy HOUR_OF_DAY_STRATEGY = new NumberStrategy(Calendar.HOUR_OF_DAY);
-    private static final Strategy HOUR24_OF_DAY_STRATEGY = new NumberStrategy(Calendar.HOUR_OF_DAY) {
-        @Override
-        int modify(final int iValue) {
-            return iValue == 24 ? 0 : iValue;
-        }
-    };
-    private static final Strategy HOUR12_STRATEGY = new NumberStrategy(Calendar.HOUR) {
-        @Override
-        int modify(final int iValue) {
-            return iValue == 12 ? 0 : iValue;
-        }
-    };
-    private static final Strategy HOUR_STRATEGY = new NumberStrategy(Calendar.HOUR);
-    private static final Strategy MINUTE_STRATEGY = new NumberStrategy(Calendar.MINUTE);
-    private static final Strategy SECOND_STRATEGY = new NumberStrategy(Calendar.SECOND);
-    private static final Strategy MILLISECOND_STRATEGY = new NumberStrategy(Calendar.MILLISECOND);
-    private static final Strategy ISO_8601_STRATEGY = new ISO8601TimeZoneStrategy("(Z|(?:[+-]\\d{2}(?::?\\d{2})?))");
-
-
-}
diff --git a/lang/src/main/java/org/apache/commons/lang3/time/FastDatePrinter.java b/lang/src/main/java/org/apache/commons/lang3/time/FastDatePrinter.java
deleted file mode 100644
index ac73646..0000000
--- a/lang/src/main/java/org/apache/commons/lang3/time/FastDatePrinter.java
+++ /dev/null
@@ -1,1380 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.commons.lang3.time;
-
-import java.io.IOException;
-import java.io.ObjectInputStream;
-import java.io.Serializable;
-import java.text.DateFormat;
-import java.text.DateFormatSymbols;
-import java.text.FieldPosition;
-import java.util.ArrayList;
-import java.util.Calendar;
-import java.util.Date;
-import java.util.GregorianCalendar;
-import java.util.List;
-import java.util.Locale;
-import java.util.TimeZone;
-import java.util.concurrent.ConcurrentHashMap;
-import java.util.concurrent.ConcurrentMap;
-
-/**
- * <p>FastDatePrinter is a fast and thread-safe version of
- * {@link java.text.SimpleDateFormat}.</p>
- *
- * <p>To obtain a FastDatePrinter, use {@link FastDateFormat#getInstance(String, TimeZone, Locale)} 
- * or another variation of the factory methods of {@link FastDateFormat}.</p>
- * 
- * <p>Since FastDatePrinter is thread safe, you can use a static member instance:</p>
- * <code>
- *     private static final DatePrinter DATE_PRINTER = FastDateFormat.getInstance("yyyy-MM-dd");
- * </code>
- * 
- * <p>This class can be used as a direct replacement to
- * {@code SimpleDateFormat} in most formatting situations.
- * This class is especially useful in multi-threaded server environments.
- * {@code SimpleDateFormat} is not thread-safe in any JDK version,
- * nor will it be as Sun have closed the bug/RFE.
- * </p>
- *
- * <p>Only formatting is supported by this class, but all patterns are compatible with
- * SimpleDateFormat (except time zones and some year patterns - see below).</p>
- *
- * <p>Java 1.4 introduced a new pattern letter, {@code 'Z'}, to represent
- * time zones in RFC822 format (eg. {@code +0800} or {@code -1100}).
- * This pattern letter can be used here (on all JDK versions).</p>
- *
- * <p>In addition, the pattern {@code 'ZZ'} has been made to represent
- * ISO 8601 full format time zones (eg. {@code +08:00} or {@code -11:00}).
- * This introduces a minor incompatibility with Java 1.4, but at a gain of
- * useful functionality.</p>
- * 
- * <p>Starting with JDK7, ISO 8601 support was added using the pattern {@code 'X'}.
- * To maintain compatibility, {@code 'ZZ'} will continue to be supported, but using
- * one of the {@code 'X'} formats is recommended.
- *
- * <p>Javadoc cites for the year pattern: <i>For formatting, if the number of
- * pattern letters is 2, the year is truncated to 2 digits; otherwise it is
- * interpreted as a number.</i> Starting with Java 1.7 a pattern of 'Y' or
- * 'YYY' will be formatted as '2003', while it was '03' in former Java
- * versions. FastDatePrinter implements the behavior of Java 7.</p>
- *
- * @version $Id$
- * @since 3.2
- * @see FastDateParser
- */
-public class FastDatePrinter implements DatePrinter, Serializable {
-    // A lot of the speed in this class comes from caching, but some comes
-    // from the special int to StringBuffer conversion.
-    //
-    // The following produces a padded 2 digit number:
-    //   buffer.append((char)(value / 10 + '0'));
-    //   buffer.append((char)(value % 10 + '0'));
-    //
-    // Note that the fastest append to StringBuffer is a single char (used here).
-    // Note that Integer.toString() is not called, the conversion is simply
-    // taking the value and adding (mathematically) the ASCII value for '0'.
-    // So, don't change this code! It works and is very fast.
-
-    /**
-     * Required for serialization support.
-     *
-     * @see java.io.Serializable
-     */
-    private static final long serialVersionUID = 1L;
-
-    /**
-     * FULL locale dependent date or time style.
-     */
-    public static final int FULL = DateFormat.FULL;
-    /**
-     * LONG locale dependent date or time style.
-     */
-    public static final int LONG = DateFormat.LONG;
-    /**
-     * MEDIUM locale dependent date or time style.
-     */
-    public static final int MEDIUM = DateFormat.MEDIUM;
-    /**
-     * SHORT locale dependent date or time style.
-     */
-    public static final int SHORT = DateFormat.SHORT;
-
-    /**
-     * The pattern.
-     */
-    private final String mPattern;
-    /**
-     * The time zone.
-     */
-    private final TimeZone mTimeZone;
-    /**
-     * The locale.
-     */
-    private final Locale mLocale;
-    /**
-     * The parsed rules.
-     */
-    private transient Rule[] mRules;
-    /**
-     * The estimated maximum length.
-     */
-    private transient int mMaxLengthEstimate;
-
-    // Constructor
-    //-----------------------------------------------------------------------
-    /**
-     * <p>Constructs a new FastDatePrinter.</p>
-     * Use {@link FastDateFormat#getInstance(String, TimeZone, Locale)}  or another variation of the 
-     * factory methods of {@link FastDateFormat} to get a cached FastDatePrinter instance.
-     *
-     * @param pattern  {@link java.text.SimpleDateFormat} compatible pattern
-     * @param timeZone  non-null time zone to use
-     * @param locale  non-null locale to use
-     * @throws NullPointerException if pattern, timeZone, or locale is null.
-     */
-    protected FastDatePrinter(final String pattern, final TimeZone timeZone, final Locale locale) {
-        mPattern = pattern;
-        mTimeZone = timeZone;
-        mLocale = locale;
-
-        init();
-    }
-
-    /**
-     * <p>Initializes the instance for first use.</p>
-     */
-    private void init() {
-        final List<Rule> rulesList = parsePattern();
-        mRules = rulesList.toArray(new Rule[rulesList.size()]);
-
-        int len = 0;
-        for (int i=mRules.length; --i >= 0; ) {
-            len += mRules[i].estimateLength();
-        }
-
-        mMaxLengthEstimate = len;
-    }
-
-    // Parse the pattern
-    //-----------------------------------------------------------------------
-    /**
-     * <p>Returns a list of Rules given a pattern.</p>
-     *
-     * @return a {@code List} of Rule objects
-     * @throws IllegalArgumentException if pattern is invalid
-     */
-    protected List<Rule> parsePattern() {
-        final DateFormatSymbols symbols = new DateFormatSymbols(mLocale);
-        final List<Rule> rules = new ArrayList<Rule>();
-
-        final String[] ERAs = symbols.getEras();
-        final String[] months = symbols.getMonths();
-        final String[] shortMonths = symbols.getShortMonths();
-        final String[] weekdays = symbols.getWeekdays();
-        final String[] shortWeekdays = symbols.getShortWeekdays();
-        final String[] AmPmStrings = symbols.getAmPmStrings();
-
-        final int length = mPattern.length();
-        final int[] indexRef = new int[1];
-
-        for (int i = 0; i < length; i++) {
-            indexRef[0] = i;
-            final String token = parseToken(mPattern, indexRef);
-            i = indexRef[0];
-
-            final int tokenLen = token.length();
-            if (tokenLen == 0) {
-                break;
-            }
-
-            Rule rule;
-            final char c = token.charAt(0);
-
-            switch (c) {
-            case 'G': // era designator (text)
-                rule = new TextField(Calendar.ERA, ERAs);
-                break;
-            case 'y': // year (number)
-                if (tokenLen == 2) {
-                    rule = TwoDigitYearField.INSTANCE;
-                } else {
-                    rule = selectNumberRule(Calendar.YEAR, tokenLen < 4 ? 4 : tokenLen);
-                }
-                break;
-            case 'M': // month in year (text and number)
-                if (tokenLen >= 4) {
-                    rule = new TextField(Calendar.MONTH, months);
-                } else if (tokenLen == 3) {
-                    rule = new TextField(Calendar.MONTH, shortMonths);
-                } else if (tokenLen == 2) {
-                    rule = TwoDigitMonthField.INSTANCE;
-                } else {
-                    rule = UnpaddedMonthField.INSTANCE;
-                }
-                break;
-            case 'd': // day in month (number)
-                rule = selectNumberRule(Calendar.DAY_OF_MONTH, tokenLen);
-                break;
-            case 'h': // hour in am/pm (number, 1..12)
-                rule = new TwelveHourField(selectNumberRule(Calendar.HOUR, tokenLen));
-                break;
-            case 'H': // hour in day (number, 0..23)
-                rule = selectNumberRule(Calendar.HOUR_OF_DAY, tokenLen);
-                break;
-            case 'm': // minute in hour (number)
-                rule = selectNumberRule(Calendar.MINUTE, tokenLen);
-                break;
-            case 's': // second in minute (number)
-                rule = selectNumberRule(Calendar.SECOND, tokenLen);
-                break;
-            case 'S': // millisecond (number)
-                rule = selectNumberRule(Calendar.MILLISECOND, tokenLen);
-                break;
-            case 'E': // day in week (text)
-                rule = new TextField(Calendar.DAY_OF_WEEK, tokenLen < 4 ? shortWeekdays : weekdays);
-                break;
-            case 'D': // day in year (number)
-                rule = selectNumberRule(Calendar.DAY_OF_YEAR, tokenLen);
-                break;
-            case 'F': // day of week in month (number)
-                rule = selectNumberRule(Calendar.DAY_OF_WEEK_IN_MONTH, tokenLen);
-                break;
-            case 'w': // week in year (number)
-                rule = selectNumberRule(Calendar.WEEK_OF_YEAR, tokenLen);
-                break;
-            case 'W': // week in month (number)
-                rule = selectNumberRule(Calendar.WEEK_OF_MONTH, tokenLen);
-                break;
-            case 'a': // am/pm marker (text)
-                rule = new TextField(Calendar.AM_PM, AmPmStrings);
-                break;
-            case 'k': // hour in day (1..24)
-                rule = new TwentyFourHourField(selectNumberRule(Calendar.HOUR_OF_DAY, tokenLen));
-                break;
-            case 'K': // hour in am/pm (0..11)
-                rule = selectNumberRule(Calendar.HOUR, tokenLen);
-                break;
-            case 'X': // ISO 8601 
-                rule = Iso8601_Rule.getRule(tokenLen);
-                break;    
-            case 'z': // time zone (text)
-                if (tokenLen >= 4) {
-                    rule = new TimeZoneNameRule(mTimeZone, mLocale, TimeZone.LONG);
-                } else {
-                    rule = new TimeZoneNameRule(mTimeZone, mLocale, TimeZone.SHORT);
-                }
-                break;
-            case 'Z': // time zone (value)
-                if (tokenLen == 1) {
-                    rule = TimeZoneNumberRule.INSTANCE_NO_COLON;
-                } else if (tokenLen == 2) {
-                    rule = TimeZoneNumberRule.INSTANCE_ISO_8601;
-                } else {
-                    rule = TimeZoneNumberRule.INSTANCE_COLON;
-                }
-                break;
-            case '\'': // literal text
-                final String sub = token.substring(1);
-                if (sub.length() == 1) {
-                    rule = new CharacterLiteral(sub.charAt(0));
-                } else {
-                    rule = new StringLiteral(sub);
-                }
-                break;
-            default:
-                throw new IllegalArgumentException("Illegal pattern component: " + token);
-            }
-
-            rules.add(rule);
-        }
-
-        return rules;
-    }
-
-    /**
-     * <p>Performs the parsing of tokens.</p>
-     *
-     * @param pattern  the pattern
-     * @param indexRef  index references
-     * @return parsed token
-     */
-    protected String parseToken(final String pattern, final int[] indexRef) {
-        final StringBuilder buf = new StringBuilder();
-
-        int i = indexRef[0];
-        final int length = pattern.length();
-
-        char c = pattern.charAt(i);
-        if (c >= 'A' && c <= 'Z' || c >= 'a' && c <= 'z') {
-            // Scan a run of the same character, which indicates a time
-            // pattern.
-            buf.append(c);
-
-            while (i + 1 < length) {
-                final char peek = pattern.charAt(i + 1);
-                if (peek == c) {
-                    buf.append(c);
-                    i++;
-                } else {
-                    break;
-                }
-            }
-        } else {
-            // This will identify token as text.
-            buf.append('\'');
-
-            boolean inLiteral = false;
-
-            for (; i < length; i++) {
-                c = pattern.charAt(i);
-
-                if (c == '\'') {
-                    if (i + 1 < length && pattern.charAt(i + 1) == '\'') {
-                        // '' is treated as escaped '
-                        i++;
-                        buf.append(c);
-                    } else {
-                        inLiteral = !inLiteral;
-                    }
-                } else if (!inLiteral &&
-                         (c >= 'A' && c <= 'Z' || c >= 'a' && c <= 'z')) {
-                    i--;
-                    break;
-                } else {
-                    buf.append(c);
-                }
-            }
-        }
-
-        indexRef[0] = i;
-        return buf.toString();
-    }
-
-    /**
-     * <p>Gets an appropriate rule for the padding required.</p>
-     *
-     * @param field  the field to get a rule for
-     * @param padding  the padding required
-     * @return a new rule with the correct padding
-     */
-    protected NumberRule selectNumberRule(final int field, final int padding) {
-        switch (padding) {
-        case 1:
-            return new UnpaddedNumberField(field);
-        case 2:
-            return new TwoDigitNumberField(field);
-        default:
-            return new PaddedNumberField(field, padding);
-        }
-    }
-
-    // Format methods
-    //-----------------------------------------------------------------------
-    /**
-     * <p>Formats a {@code Date}, {@code Calendar} or
-     * {@code Long} (milliseconds) object.</p>
-     *
-     * @param obj  the object to format
-     * @param toAppendTo  the buffer to append to
-     * @param pos  the position - ignored
-     * @return the buffer passed in
-     */
-    @Override
-    public StringBuffer format(final Object obj, final StringBuffer toAppendTo, final FieldPosition pos) {
-        if (obj instanceof Date) {
-            return format((Date) obj, toAppendTo);
-        } else if (obj instanceof Calendar) {
-            return format((Calendar) obj, toAppendTo);
-        } else if (obj instanceof Long) {
-            return format(((Long) obj).longValue(), toAppendTo);
-        } else {
-            throw new IllegalArgumentException("Unknown class: " +
-                (obj == null ? "<null>" : obj.getClass().getName()));
-        }
-    }
-
-    /* (non-Javadoc)
-     * @see org.apache.commons.lang3.time.DatePrinter#format(long)
-     */
-    @Override
-    public String format(final long millis) {
-        final Calendar c = newCalendar();  // hard code GregorianCalendar
-        c.setTimeInMillis(millis);
-        return applyRulesToString(c);
-    }
-
-    /**
-     * Creates a String representation of the given Calendar by applying the rules of this printer to it.
-     * @param c the Calender to apply the rules to.
-     * @return a String representation of the given Calendar.
-     */
-    private String applyRulesToString(final Calendar c) {
-        return applyRules(c, new StringBuffer(mMaxLengthEstimate)).toString();
-    }
-
-    /**
-     * Creation method for ne calender instances.
-     * @return a new Calendar instance.
-     */
-    private GregorianCalendar newCalendar() {
-        // hard code GregorianCalendar
-        return new GregorianCalendar(mTimeZone, mLocale);
-    }
-
-    /* (non-Javadoc)
-     * @see org.apache.commons.lang3.time.DatePrinter#format(java.util.Date)
-     */
-    @Override
-    public String format(final Date date) {
-        final Calendar c = newCalendar();  // hard code GregorianCalendar
-        c.setTime(date);
-        return applyRulesToString(c);
-    }
-
-    /* (non-Javadoc)
-     * @see org.apache.commons.lang3.time.DatePrinter#format(java.util.Calendar)
-     */
-    @Override
-    public String format(final Calendar calendar) {
-        return format(calendar, new StringBuffer(mMaxLengthEstimate)).toString();
-    }
-
-    /* (non-Javadoc)
-     * @see org.apache.commons.lang3.time.DatePrinter#format(long, java.lang.StringBuffer)
-     */
-    @Override
-    public StringBuffer format(final long millis, final StringBuffer buf) {
-        return format(new Date(millis), buf);
-    }
-
-    /* (non-Javadoc)
-     * @see org.apache.commons.lang3.time.DatePrinter#format(java.util.Date, java.lang.StringBuffer)
-     */
-    @Override
-    public StringBuffer format(final Date date, final StringBuffer buf) {
-        final Calendar c = newCalendar();  // hard code GregorianCalendar
-        c.setTime(date);
-        return applyRules(c, buf);
-    }
-
-    /* (non-Javadoc)
-     * @see org.apache.commons.lang3.time.DatePrinter#format(java.util.Calendar, java.lang.StringBuffer)
-     */
-    @Override
-    public StringBuffer format(final Calendar calendar, final StringBuffer buf) {
-        return applyRules(calendar, buf);
-    }
-
-    /**
-     * <p>Performs the formatting by applying the rules to the
-     * specified calendar.</p>
-     *
-     * @param calendar  the calendar to format
-     * @param buf  the buffer to format into
-     * @return the specified string buffer
-     */
-    protected StringBuffer applyRules(final Calendar calendar, final StringBuffer buf) {
-        for (final Rule rule : mRules) {
-            rule.appendTo(buf, calendar);
-        }
-        return buf;
-    }
-
-    // Accessors
-    //-----------------------------------------------------------------------
-    /* (non-Javadoc)
-     * @see org.apache.commons.lang3.time.DatePrinter#getPattern()
-     */
-    @Override
-    public String getPattern() {
-        return mPattern;
-    }
-
-    /* (non-Javadoc)
-     * @see org.apache.commons.lang3.time.DatePrinter#getTimeZone()
-     */
-    @Override
-    public TimeZone getTimeZone() {
-        return mTimeZone;
-    }
-
-    /* (non-Javadoc)
-     * @see org.apache.commons.lang3.time.DatePrinter#getLocale()
-     */
-    @Override
-    public Locale getLocale() {
-        return mLocale;
-    }
-
-    /**
-     * <p>Gets an estimate for the maximum string length that the
-     * formatter will produce.</p>
-     *
-     * <p>The actual formatted length will almost always be less than or
-     * equal to this amount.</p>
-     *
-     * @return the maximum formatted length
-     */
-    public int getMaxLengthEstimate() {
-        return mMaxLengthEstimate;
-    }
-
-    // Basics
-    //-----------------------------------------------------------------------
-    /**
-     * <p>Compares two objects for equality.</p>
-     *
-     * @param obj  the object to compare to
-     * @return {@code true} if equal
-     */
-    @Override
-    public boolean equals(final Object obj) {
-        if (obj instanceof FastDatePrinter == false) {
-            return false;
-        }
-        final FastDatePrinter other = (FastDatePrinter) obj;
-        return mPattern.equals(other.mPattern)
-            && mTimeZone.equals(other.mTimeZone) 
-            && mLocale.equals(other.mLocale);
-    }
-
-    /**
-     * <p>Returns a hashcode compatible with equals.</p>
-     *
-     * @return a hashcode compatible with equals
-     */
-    @Override
-    public int hashCode() {
-        return mPattern.hashCode() + 13 * (mTimeZone.hashCode() + 13 * mLocale.hashCode());
-    }
-
-    /**
-     * <p>Gets a debugging string version of this formatter.</p>
-     *
-     * @return a debugging string
-     */
-    @Override
-    public String toString() {
-        return "FastDatePrinter[" + mPattern + "," + mLocale + "," + mTimeZone.getID() + "]";
-    }
-
-    // Serializing
-    //-----------------------------------------------------------------------
-    /**
-     * Create the object after serialization. This implementation reinitializes the
-     * transient properties.
-     *
-     * @param in ObjectInputStream from which the object is being deserialized.
-     * @throws IOException if there is an IO issue.
-     * @throws ClassNotFoundException if a class cannot be found.
-     */
-    private void readObject(final ObjectInputStream in) throws IOException, ClassNotFoundException {
-        in.defaultReadObject();
-        init();
-    }
-
-    /**
-     * Appends digits to the given buffer.
-     * 
-     * @param buffer the buffer to append to.
-     * @param value the value to append digits from.
-     */
-    private static void appendDigits(final StringBuffer buffer, final int value) {
-        buffer.append((char)(value / 10 + '0'));
-        buffer.append((char)(value % 10 + '0'));
-    }
-
-    // Rules
-    //-----------------------------------------------------------------------
-    /**
-     * <p>Inner class defining a rule.</p>
-     */
-    private interface Rule {
-        /**
-         * Returns the estimated length of the result.
-         *
-         * @return the estimated length
-         */
-        int estimateLength();
-
-        /**
-         * Appends the value of the specified calendar to the output buffer based on the rule implementation.
-         *
-         * @param buffer the output buffer
-         * @param calendar calendar to be appended
-         */
-        void appendTo(StringBuffer buffer, Calendar calendar);
-    }
-
-    /**
-     * <p>Inner class defining a numeric rule.</p>
-     */
-    private interface NumberRule extends Rule {
-        /**
-         * Appends the specified value to the output buffer based on the rule implementation.
-         *
-         * @param buffer the output buffer
-         * @param value the value to be appended
-         */
-        void appendTo(StringBuffer buffer, int value);
-    }
-
-    /**
-     * <p>Inner class to output a constant single character.</p>
-     */
-    private static class CharacterLiteral implements Rule {
-        private final char mValue;
-
-        /**
-         * Constructs a new instance of {@code CharacterLiteral}
-         * to hold the specified value.
-         *
-         * @param value the character literal
-         */
-        CharacterLiteral(final char value) {
-            mValue = value;
-        }
-
-        /**
-         * {@inheritDoc}
-         */
-        @Override
-        public int estimateLength() {
-            return 1;
-        }
-
-        /**
-         * {@inheritDoc}
-         */
-        @Override
-        public void appendTo(final StringBuffer buffer, final Calendar calendar) {
-            buffer.append(mValue);
-        }
-    }
-
-    /**
-     * <p>Inner class to output a constant string.</p>
-     */
-    private static class StringLiteral implements Rule {
-        private final String mValue;
-
-        /**
-         * Constructs a new instance of {@code StringLiteral}
-         * to hold the specified value.
-         *
-         * @param value the string literal
-         */
-        StringLiteral(final String value) {
-            mValue = value;
-        }
-
-        /**
-         * {@inheritDoc}
-         */
-        @Override
-        public int estimateLength() {
-            return mValue.length();
-        }
-
-        /**
-         * {@inheritDoc}
-         */
-        @Override
-        public void appendTo(final StringBuffer buffer, final Calendar calendar) {
-            buffer.append(mValue);
-        }
-    }
-
-    /**
-     * <p>Inner class to output one of a set of values.</p>
-     */
-    private static class TextField implements Rule {
-        private final int mField;
-        private final String[] mValues;
-
-        /**
-         * Constructs an instance of {@code TextField}
-         * with the specified field and values.
-         *
-         * @param field the field
-         * @param values the field values
-         */
-        TextField(final int field, final String[] values) {
-            mField = field;
-            mValues = values;
-        }
-
-        /**
-         * {@inheritDoc}
-         */
-        @Override
-        public int estimateLength() {
-            int max = 0;
-            for (int i=mValues.length; --i >= 0; ) {
-                final int len = mValues[i].length();
-                if (len > max) {
-                    max = len;
-                }
-            }
-            return max;
-        }
-
-        /**
-         * {@inheritDoc}
-         */
-        @Override
-        public void appendTo(final StringBuffer buffer, final Calendar calendar) {
-            buffer.append(mValues[calendar.get(mField)]);
-        }
-    }
-
-    /**
-     * <p>Inner class to output an unpadded number.</p>
-     */
-    private static class UnpaddedNumberField implements NumberRule {
-        private final int mField;
-
-        /**
-         * Constructs an instance of {@code UnpadedNumberField} with the specified field.
-         *
-         * @param field the field
-         */
-        UnpaddedNumberField(final int field) {
-            mField = field;
-        }
-
-        /**
-         * {@inheritDoc}
-         */
-        @Override
-        public int estimateLength() {
-            return 4;
-        }
-
-        /**
-         * {@inheritDoc}
-         */
-        @Override
-        public void appendTo(final StringBuffer buffer, final Calendar calendar) {
-            appendTo(buffer, calendar.get(mField));
-        }
-
-        /**
-         * {@inheritDoc}
-         */
-        @Override
-        public final void appendTo(final StringBuffer buffer, final int value) {
-            if (value < 10) {
-                buffer.append((char)(value + '0'));
-            } else if (value < 100) {
-                appendDigits(buffer, value);
-            } else {
-                buffer.append(value);
-            }
-        }
-    }
-
-    /**
-     * <p>Inner class to output an unpadded month.</p>
-     */
-    private static class UnpaddedMonthField implements NumberRule {
-        static final UnpaddedMonthField INSTANCE = new UnpaddedMonthField();
-
-        /**
-         * Constructs an instance of {@code UnpaddedMonthField}.
-         *
-         */
-        UnpaddedMonthField() {
-            super();
-        }
-
-        /**
-         * {@inheritDoc}
-         */
-        @Override
-        public int estimateLength() {
-            return 2;
-        }
-
-        /**
-         * {@inheritDoc}
-         */
-        @Override
-        public void appendTo(final StringBuffer buffer, final Calendar calendar) {
-            appendTo(buffer, calendar.get(Calendar.MONTH) + 1);
-        }
-
-        /**
-         * {@inheritDoc}
-         */
-        @Override
-        public final void appendTo(final StringBuffer buffer, final int value) {
-            if (value < 10) {
-                buffer.append((char)(value + '0'));
-            } else {
-                appendDigits(buffer, value);
-            }
-        }
-    }
-
-    /**
-     * <p>Inner class to output a padded number.</p>
-     */
-    private static class PaddedNumberField implements NumberRule {
-        private final int mField;
-        private final int mSize;
-
-        /**
-         * Constructs an instance of {@code PaddedNumberField}.
-         *
-         * @param field the field
-         * @param size size of the output field
-         */
-        PaddedNumberField(final int field, final int size) {
-            if (size < 3) {
-                // Should use UnpaddedNumberField or TwoDigitNumberField.
-                throw new IllegalArgumentException();
-            }
-            mField = field;
-            mSize = size;
-        }
-
-        /**
-         * {@inheritDoc}
-         */
-        @Override
-        public int estimateLength() {
-            return mSize;
-        }
-
-        /**
-         * {@inheritDoc}
-         */
-        @Override
-        public void appendTo(final StringBuffer buffer, final Calendar calendar) {
-            appendTo(buffer, calendar.get(mField));
-        }
-
-        /**
-         * {@inheritDoc}
-         */
-        @Override
-        public final void appendTo(final StringBuffer buffer, int value) {
-            // pad the buffer with adequate zeros
-            for(int digit = 0; digit<mSize; ++digit) {
-                buffer.append('0');                
-            }
-            // backfill the buffer with non-zero digits
-            int index = buffer.length();
-            for( ; value>0; value /= 10) {
-                buffer.setCharAt(--index, (char)('0' + value % 10));
-            }
-        }
-    }
-
-    /**
-     * <p>Inner class to output a two digit number.</p>
-     */
-    private static class TwoDigitNumberField implements NumberRule {
-        private final int mField;
-
-        /**
-         * Constructs an instance of {@code TwoDigitNumberField} with the specified field.
-         *
-         * @param field the field
-         */
-        TwoDigitNumberField(final int field) {
-            mField = field;
-        }
-
-        /**
-         * {@inheritDoc}
-         */
-        @Override
-        public int estimateLength() {
-            return 2;
-        }
-
-        /**
-         * {@inheritDoc}
-         */
-        @Override
-        public void appendTo(final StringBuffer buffer, final Calendar calendar) {
-            appendTo(buffer, calendar.get(mField));
-        }
-
-        /**
-         * {@inheritDoc}
-         */
-        @Override
-        public final void appendTo(final StringBuffer buffer, final int value) {
-            if (value < 100) {
-                appendDigits(buffer, value);
-            } else {
-                buffer.append(value);
-            }
-        }
-    }
-
-    /**
-     * <p>Inner class to output a two digit year.</p>
-     */
-    private static class TwoDigitYearField implements NumberRule {
-        static final TwoDigitYearField INSTANCE = new TwoDigitYearField();
-
-        /**
-         * Constructs an instance of {@code TwoDigitYearField}.
-         */
-        TwoDigitYearField() {
-            super();
-        }
-
-        /**
-         * {@inheritDoc}
-         */
-        @Override
-        public int estimateLength() {
-            return 2;
-        }
-
-        /**
-         * {@inheritDoc}
-         */
-        @Override
-        public void appendTo(final StringBuffer buffer, final Calendar calendar) {
-            appendTo(buffer, calendar.get(Calendar.YEAR) % 100);
-        }
-
-        /**
-         * {@inheritDoc}
-         */
-        @Override
-        public final void appendTo(final StringBuffer buffer, final int value) {
-            appendDigits(buffer, value);
-        }
-    }
-
-    /**
-     * <p>Inner class to output a two digit month.</p>
-     */
-    private static class TwoDigitMonthField implements NumberRule {
-        static final TwoDigitMonthField INSTANCE = new TwoDigitMonthField();
-
-        /**
-         * Constructs an instance of {@code TwoDigitMonthField}.
-         */
-        TwoDigitMonthField() {
-            super();
-        }
-
-        /**
-         * {@inheritDoc}
-         */
-        @Override
-        public int estimateLength() {
-            return 2;
-        }
-
-        /**
-         * {@inheritDoc}
-         */
-        @Override
-        public void appendTo(final StringBuffer buffer, final Calendar calendar) {
-            appendTo(buffer, calendar.get(Calendar.MONTH) + 1);
-        }
-
-        /**
-         * {@inheritDoc}
-         */
-        @Override
-        public final void appendTo(final StringBuffer buffer, final int value) {
-            appendDigits(buffer, value);
-        }
-    }
-
-    /**
-     * <p>Inner class to output the twelve hour field.</p>
-     */
-    private static class TwelveHourField implements NumberRule {
-        private final NumberRule mRule;
-
-        /**
-         * Constructs an instance of {@code TwelveHourField} with the specified
-         * {@code NumberRule}.
-         *
-         * @param rule the rule
-         */
-        TwelveHourField(final NumberRule rule) {
-            mRule = rule;
-        }
-
-        /**
-         * {@inheritDoc}
-         */
-        @Override
-        public int estimateLength() {
-            return mRule.estimateLength();
-        }
-
-        /**
-         * {@inheritDoc}
-         */
-        @Override
-        public void appendTo(final StringBuffer buffer, final Calendar calendar) {
-            int value = calendar.get(Calendar.HOUR);
-            if (value == 0) {
-                value = calendar.getLeastMaximum(Calendar.HOUR) + 1;
-            }
-            mRule.appendTo(buffer, value);
-        }
-
-        /**
-         * {@inheritDoc}
-         */
-        @Override
-        public void appendTo(final StringBuffer buffer, final int value) {
-            mRule.appendTo(buffer, value);
-        }
-    }
-
-    /**
-     * <p>Inner class to output the twenty four hour field.</p>
-     */
-    private static class TwentyFourHourField implements NumberRule {
-        private final NumberRule mRule;
-
-        /**
-         * Constructs an instance of {@code TwentyFourHourField} with the specified
-         * {@code NumberRule}.
-         *
-         * @param rule the rule
-         */
-        TwentyFourHourField(final NumberRule rule) {
-            mRule = rule;
-        }
-
-        /**
-         * {@inheritDoc}
-         */
-        @Override
-        public int estimateLength() {
-            return mRule.estimateLength();
-        }
-
-        /**
-         * {@inheritDoc}
-         */
-        @Override
-        public void appendTo(final StringBuffer buffer, final Calendar calendar) {
-            int value = calendar.get(Calendar.HOUR_OF_DAY);
-            if (value == 0) {
-                value = calendar.getMaximum(Calendar.HOUR_OF_DAY) + 1;
-            }
-            mRule.appendTo(buffer, value);
-        }
-
-        /**
-         * {@inheritDoc}
-         */
-        @Override
-        public void appendTo(final StringBuffer buffer, final int value) {
-            mRule.appendTo(buffer, value);
-        }
-    }
-
-    //-----------------------------------------------------------------------
-
-    private static final ConcurrentMap<TimeZoneDisplayKey, String> cTimeZoneDisplayCache =
-        new ConcurrentHashMap<TimeZoneDisplayKey, String>(7);
-    /**
-     * <p>Gets the time zone display name, using a cache for performance.</p>
-     *
-     * @param tz  the zone to query
-     * @param daylight  true if daylight savings
-     * @param style  the style to use {@code TimeZone.LONG} or {@code TimeZone.SHORT}
-     * @param locale  the locale to use
-     * @return the textual name of the time zone
-     */
-    static String getTimeZoneDisplay(final TimeZone tz, final boolean daylight, final int style, final Locale locale) {
-        final TimeZoneDisplayKey key = new TimeZoneDisplayKey(tz, daylight, style, locale);
-        String value = cTimeZoneDisplayCache.get(key);
-        if (value == null) {
-            // This is a very slow call, so cache the results.
-            value = tz.getDisplayName(daylight, style, locale);
-            final String prior = cTimeZoneDisplayCache.putIfAbsent(key, value);
-            if (prior != null) {
-                value= prior;
-            }
-        }
-        return value;
-    }
-
-    /**
-     * <p>Inner class to output a time zone name.</p>
-     */
-    private static class TimeZoneNameRule implements Rule {
-        private final Locale mLocale;
-        private final int mStyle;
-        private final String mStandard;
-        private final String mDaylight;
-
-        /**
-         * Constructs an instance of {@code TimeZoneNameRule} with the specified properties.
-         *
-         * @param timeZone the time zone
-         * @param locale the locale
-         * @param style the style
-         */
-        TimeZoneNameRule(final TimeZone timeZone, final Locale locale, final int style) {
-            mLocale = locale;
-            mStyle = style;
-            
-            mStandard = getTimeZoneDisplay(timeZone, false, style, locale);
-            mDaylight = getTimeZoneDisplay(timeZone, true, style, locale);
-        }
-
-        /**
-         * {@inheritDoc}
-         */
-        @Override
-        public int estimateLength() {
-            // We have no access to the Calendar object that will be passed to
-            // appendTo so base estimate on the TimeZone passed to the
-            // constructor
-            return Math.max(mStandard.length(), mDaylight.length());
-        }
-
-        /**
-         * {@inheritDoc}
-         */
-        @Override
-        public void appendTo(final StringBuffer buffer, final Calendar calendar) {
-            final TimeZone zone = calendar.getTimeZone();
-            if (calendar.get(Calendar.DST_OFFSET) != 0) {
-                buffer.append(getTimeZoneDisplay(zone, true, mStyle, mLocale));
-            } else {
-                buffer.append(getTimeZoneDisplay(zone, false, mStyle, mLocale));
-            }
-        }
-    }
-
-    /**
-     * <p>Inner class to output a time zone as a number {@code +/-HHMM}
-     * or {@code +/-HH:MM}.</p>
-     */
-    private static class TimeZoneNumberRule implements Rule {
-        static final TimeZoneNumberRule INSTANCE_COLON = new TimeZoneNumberRule(true, false);
-        static final TimeZoneNumberRule INSTANCE_NO_COLON = new TimeZoneNumberRule(false, false);
-        static final TimeZoneNumberRule INSTANCE_ISO_8601 = new TimeZoneNumberRule(true, true);
-        
-        final boolean mColon;
-        final boolean mISO8601;
-
-        /**
-         * Constructs an instance of {@code TimeZoneNumberRule} with the specified properties.
-         *
-         * @param colon add colon between HH and MM in the output if {@code true}
-         * @param iso8601 create an ISO 8601 format output
-         */
-        TimeZoneNumberRule(final boolean colon, final boolean iso8601) {
-            mColon = colon;
-            mISO8601 = iso8601;
-        }
-
-        /**
-         * {@inheritDoc}
-         */
-        @Override
-        public int estimateLength() {
-            return 5;
-        }
-
-        /**
-         * {@inheritDoc}
-         */
-        @Override
-        public void appendTo(final StringBuffer buffer, final Calendar calendar) {
-            if (mISO8601 && calendar.getTimeZone().getID().equals("UTC")) {
-                buffer.append("Z");
-                return;
-            }
-            
-            int offset = calendar.get(Calendar.ZONE_OFFSET) + calendar.get(Calendar.DST_OFFSET);
-
-            if (offset < 0) {
-                buffer.append('-');
-                offset = -offset;
-            } else {
-                buffer.append('+');
-            }
-
-            final int hours = offset / (60 * 60 * 1000);
-            appendDigits(buffer, hours);
-
-            if (mColon) {
-                buffer.append(':');
-            }
-
-            final int minutes = offset / (60 * 1000) - 60 * hours;
-            appendDigits(buffer, minutes);
-        }
-    }
-
-    /**
-     * <p>Inner class to output a time zone as a number {@code +/-HHMM}
-     * or {@code +/-HH:MM}.</p>
-     */
-    private static class Iso8601_Rule implements Rule {
-        
-        // Sign TwoDigitHours or Z
-        static final Iso8601_Rule ISO8601_HOURS = new Iso8601_Rule(3);       
-        // Sign TwoDigitHours Minutes or Z
-        static final Iso8601_Rule ISO8601_HOURS_MINUTES = new Iso8601_Rule(5);
-        // Sign TwoDigitHours : Minutes or Z
-        static final Iso8601_Rule ISO8601_HOURS_COLON_MINUTES = new Iso8601_Rule(6);
-
-        /**
-         * Factory method for Iso8601_Rules.
-         *
-         * @param tokenLen a token indicating the length of the TimeZone String to be formatted.
-         * @return a Iso8601_Rule that can format TimeZone String of length {@code tokenLen}. If no such
-         *          rule exists, an IllegalArgumentException will be thrown.
-         */
-        static Iso8601_Rule getRule(int tokenLen) {
-            switch(tokenLen) {
-            case 1:
-                return Iso8601_Rule.ISO8601_HOURS;
-            case 2:
-                return Iso8601_Rule.ISO8601_HOURS_MINUTES;
-            case 3:
-                return Iso8601_Rule.ISO8601_HOURS_COLON_MINUTES;
-            default:
-                throw new IllegalArgumentException("invalid number of X");                    
-            }
-        }        
-        
-        final int length;
-
-        /**
-         * Constructs an instance of {@code Iso8601_Rule} with the specified properties.
-         *
-         * @param length The number of characters in output (unless Z is output)
-         */
-        Iso8601_Rule(final int length) {
-            this.length = length;
-        }
-
-        /**
-         * {@inheritDoc}
-         */
-        @Override
-        public int estimateLength() {
-            return length;
-        }
-
-        /**
-         * {@inheritDoc}
-         */
-        @Override
-        public void appendTo(final StringBuffer buffer, final Calendar calendar) {
-            int zoneOffset = calendar.get(Calendar.ZONE_OFFSET);
-            if (zoneOffset == 0) {
-                buffer.append("Z");
-                return;
-            }
-            
-            int offset = zoneOffset + calendar.get(Calendar.DST_OFFSET);
-
-            if (offset < 0) {
-                buffer.append('-');
-                offset = -offset;
-            } else {
-                buffer.append('+');
-            }
-
-            final int hours = offset / (60 * 60 * 1000);
-            appendDigits(buffer, hours);
-
-            if (length<5) {
-                return;
-            }
-            
-            if (length==6) {
-                buffer.append(':');
-            }
-
-            final int minutes = offset / (60 * 1000) - 60 * hours;
-            appendDigits(buffer, minutes);
-        }
-    }
-
-    // ----------------------------------------------------------------------
-    /**
-     * <p>Inner class that acts as a compound key for time zone names.</p>
-     */
-    private static class TimeZoneDisplayKey {
-        private final TimeZone mTimeZone;
-        private final int mStyle;
-        private final Locale mLocale;
-
-        /**
-         * Constructs an instance of {@code TimeZoneDisplayKey} with the specified properties.
-         *
-         * @param timeZone the time zone
-         * @param daylight adjust the style for daylight saving time if {@code true}
-         * @param style the timezone style
-         * @param locale the timezone locale
-         */
-        TimeZoneDisplayKey(final TimeZone timeZone,
-                           final boolean daylight, final int style, final Locale locale) {
-            mTimeZone = timeZone;
-            if (daylight) {
-                mStyle = style | 0x80000000;
-            } else {
-                mStyle = style;
-            }
-            mLocale = locale;
-        }
-
-        /**
-         * {@inheritDoc}
-         */
-        @Override
-        public int hashCode() {
-            return (mStyle * 31 + mLocale.hashCode() ) * 31 + mTimeZone.hashCode();
-        }
-
-        /**
-         * {@inheritDoc}
-         */
-        @Override
-        public boolean equals(final Object obj) {
-            if (this == obj) {
-                return true;
-            }
-            if (obj instanceof TimeZoneDisplayKey) {
-                final TimeZoneDisplayKey other = (TimeZoneDisplayKey)obj;
-                return
-                    mTimeZone.equals(other.mTimeZone) &&
-                    mStyle == other.mStyle &&
-                    mLocale.equals(other.mLocale);
-            }
-            return false;
-        }
-    }
-}
diff --git a/lang/src/main/java/org/apache/commons/lang3/time/FormatCache.java b/lang/src/main/java/org/apache/commons/lang3/time/FormatCache.java
deleted file mode 100644
index 73a7689..0000000
--- a/lang/src/main/java/org/apache/commons/lang3/time/FormatCache.java
+++ /dev/null
@@ -1,266 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- * 
- *      http://www.apache.org/licenses/LICENSE-2.0
- * 
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.commons.lang3.time;
-
-import java.text.DateFormat;
-import java.text.Format;
-import java.text.SimpleDateFormat;
-import java.util.Arrays;
-import java.util.Locale;
-import java.util.TimeZone;
-import java.util.concurrent.ConcurrentHashMap;
-import java.util.concurrent.ConcurrentMap;
-
-/**
- * <p>FormatCache is a cache and factory for {@link Format}s.</p>
- * 
- * @since 3.0
- * @version $Id: FormatCache 892161 2009-12-18 07:21:10Z  $
- */
-// TODO: Before making public move from getDateTimeInstance(Integer,...) to int; or some other approach.
-abstract class FormatCache<F extends Format> {
-    /**
-     * No date or no time.  Used in same parameters as DateFormat.SHORT or DateFormat.LONG
-     */
-    static final int NONE= -1;
-    
-    private final ConcurrentMap<MultipartKey, F> cInstanceCache 
-        = new ConcurrentHashMap<MultipartKey, F>(7);
-    
-    private static final ConcurrentMap<MultipartKey, String> cDateTimeInstanceCache 
-        = new ConcurrentHashMap<MultipartKey, String>(7);
-
-    /**
-     * <p>Gets a formatter instance using the default pattern in the
-     * default timezone and locale.</p>
-     * 
-     * @return a date/time formatter
-     */
-    public F getInstance() {
-        return getDateTimeInstance(DateFormat.SHORT, DateFormat.SHORT, TimeZone.getDefault(), Locale.getDefault());
-    }
-
-    /**
-     * <p>Gets a formatter instance using the specified pattern, time zone
-     * and locale.</p>
-     * 
-     * @param pattern  {@link java.text.SimpleDateFormat} compatible
-     *  pattern, non-null
-     * @param timeZone  the time zone, null means use the default TimeZone
-     * @param locale  the locale, null means use the default Locale
-     * @return a pattern based date/time formatter
-     * @throws IllegalArgumentException if pattern is invalid
-     *  or <code>null</code>
-     */
-    public F getInstance(final String pattern, TimeZone timeZone, Locale locale) {
-        if (pattern == null) {
-            throw new NullPointerException("pattern must not be null");
-        }
-        if (timeZone == null) {
-            timeZone = TimeZone.getDefault();
-        }
-        if (locale == null) {
-            locale = Locale.getDefault();
-        }
-        final MultipartKey key = new MultipartKey(pattern, timeZone, locale);
-        F format = cInstanceCache.get(key);
-        if (format == null) {           
-            format = createInstance(pattern, timeZone, locale);
-            final F previousValue= cInstanceCache.putIfAbsent(key, format);
-            if (previousValue != null) {
-                // another thread snuck in and did the same work
-                // we should return the instance that is in ConcurrentMap
-                format= previousValue;              
-            }
-        }
-        return format;
-    }
-    
-    /**
-     * <p>Create a format instance using the specified pattern, time zone
-     * and locale.</p>
-     * 
-     * @param pattern  {@link java.text.SimpleDateFormat} compatible pattern, this will not be null.
-     * @param timeZone  time zone, this will not be null.
-     * @param locale  locale, this will not be null.
-     * @return a pattern based date/time formatter
-     * @throws IllegalArgumentException if pattern is invalid
-     *  or <code>null</code>
-     */
-    abstract protected F createInstance(String pattern, TimeZone timeZone, Locale locale);
-        
-    /**
-     * <p>Gets a date/time formatter instance using the specified style,
-     * time zone and locale.</p>
-     * 
-     * @param dateStyle  date style: FULL, LONG, MEDIUM, or SHORT, null indicates no date in format
-     * @param timeStyle  time style: FULL, LONG, MEDIUM, or SHORT, null indicates no time in format
-     * @param timeZone  optional time zone, overrides time zone of
-     *  formatted date, null means use default Locale
-     * @param locale  optional locale, overrides system locale
-     * @return a localized standard date/time formatter
-     * @throws IllegalArgumentException if the Locale has no date/time
-     *  pattern defined
-     */
-    // This must remain private, see LANG-884 
-    private F getDateTimeInstance(final Integer dateStyle, final Integer timeStyle, final TimeZone timeZone, Locale locale) {
-        if (locale == null) {
-            locale = Locale.getDefault();
-        }
-        final String pattern = getPatternForStyle(dateStyle, timeStyle, locale);
-        return getInstance(pattern, timeZone, locale);
-    }
-
-    /**
-     * <p>Gets a date/time formatter instance using the specified style,
-     * time zone and locale.</p>
-     * 
-     * @param dateStyle  date style: FULL, LONG, MEDIUM, or SHORT
-     * @param timeStyle  time style: FULL, LONG, MEDIUM, or SHORT
-     * @param timeZone  optional time zone, overrides time zone of
-     *  formatted date, null means use default Locale
-     * @param locale  optional locale, overrides system locale
-     * @return a localized standard date/time formatter
-     * @throws IllegalArgumentException if the Locale has no date/time
-     *  pattern defined
-     */
-    // package protected, for access from FastDateFormat; do not make public or protected
-    F getDateTimeInstance(final int dateStyle, final int timeStyle, final TimeZone timeZone, final Locale locale) {
-        return getDateTimeInstance(Integer.valueOf(dateStyle), Integer.valueOf(timeStyle), timeZone, locale);
-    }
-
-    /**
-     * <p>Gets a date formatter instance using the specified style,
-     * time zone and locale.</p>
-     * 
-     * @param dateStyle  date style: FULL, LONG, MEDIUM, or SHORT
-     * @param timeZone  optional time zone, overrides time zone of
-     *  formatted date, null means use default Locale
-     * @param locale  optional locale, overrides system locale
-     * @return a localized standard date/time formatter
-     * @throws IllegalArgumentException if the Locale has no date/time
-     *  pattern defined
-     */
-    // package protected, for access from FastDateFormat; do not make public or protected
-    F getDateInstance(final int dateStyle, final TimeZone timeZone, final Locale locale) {
-        return getDateTimeInstance(Integer.valueOf(dateStyle), null, timeZone, locale);
-    }
-
-    /**
-     * <p>Gets a time formatter instance using the specified style,
-     * time zone and locale.</p>
-     * 
-     * @param timeStyle  time style: FULL, LONG, MEDIUM, or SHORT
-     * @param timeZone  optional time zone, overrides time zone of
-     *  formatted date, null means use default Locale
-     * @param locale  optional locale, overrides system locale
-     * @return a localized standard date/time formatter
-     * @throws IllegalArgumentException if the Locale has no date/time
-     *  pattern defined
-     */
-    // package protected, for access from FastDateFormat; do not make public or protected
-    F getTimeInstance(final int timeStyle, final TimeZone timeZone, final Locale locale) {
-        return getDateTimeInstance(null, Integer.valueOf(timeStyle), timeZone, locale);
-    }
-
-    /**
-     * <p>Gets a date/time format for the specified styles and locale.</p>
-     * 
-     * @param dateStyle  date style: FULL, LONG, MEDIUM, or SHORT, null indicates no date in format
-     * @param timeStyle  time style: FULL, LONG, MEDIUM, or SHORT, null indicates no time in format
-     * @param locale  The non-null locale of the desired format
-     * @return a localized standard date/time format
-     * @throws IllegalArgumentException if the Locale has no date/time pattern defined
-     */
-    // package protected, for access from test code; do not make public or protected
-    static String getPatternForStyle(final Integer dateStyle, final Integer timeStyle, final Locale locale) {
-        final MultipartKey key = new MultipartKey(dateStyle, timeStyle, locale);
-
-        String pattern = cDateTimeInstanceCache.get(key);
-        if (pattern == null) {
-            try {
-                DateFormat formatter;
-                if (dateStyle == null) {
-                    formatter = DateFormat.getTimeInstance(timeStyle.intValue(), locale);                    
-                }
-                else if (timeStyle == null) {
-                    formatter = DateFormat.getDateInstance(dateStyle.intValue(), locale);                    
-                }
-                else {
-                    formatter = DateFormat.getDateTimeInstance(dateStyle.intValue(), timeStyle.intValue(), locale);
-                }
-                pattern = ((SimpleDateFormat)formatter).toPattern();
-                final String previous = cDateTimeInstanceCache.putIfAbsent(key, pattern);
-                if (previous != null) {
-                    // even though it doesn't matter if another thread put the pattern
-                    // it's still good practice to return the String instance that is
-                    // actually in the ConcurrentMap
-                    pattern= previous;
-                }
-            } catch (final ClassCastException ex) {
-                throw new IllegalArgumentException("No date time pattern for locale: " + locale);
-            }
-        }
-        return pattern;
-    }
-
-    // ----------------------------------------------------------------------
-    /**
-     * <p>Helper class to hold multi-part Map keys</p>
-     */
-    private static class MultipartKey {
-        private final Object[] keys;
-        private int hashCode;
-
-        /**
-         * Constructs an instance of <code>MultipartKey</code> to hold the specified objects.
-         * @param keys the set of objects that make up the key.  Each key may be null.
-         */
-        public MultipartKey(final Object... keys) {
-            this.keys = keys;
-        }
-
-        /**
-         * {@inheritDoc}
-         */
-        @Override
-        public boolean equals(final Object obj) {
-            // Eliminate the usual boilerplate because
-            // this inner static class is only used in a generic ConcurrentHashMap
-            // which will not compare against other Object types
-            return Arrays.equals(keys, ((MultipartKey)obj).keys);
-        }
-
-        /**
-         * {@inheritDoc}
-         */
-        @Override
-        public int hashCode() {
-            if(hashCode==0) {
-                int rc= 0;
-                for(final Object key : keys) {
-                    if(key!=null) {
-                        rc= rc*7 + key.hashCode();
-                    }
-                }
-                hashCode= rc;
-            }
-            return hashCode;
-        }
-    }
-
-}
diff --git a/lang/src/main/java/org/apache/commons/lang3/time/StopWatch.java b/lang/src/main/java/org/apache/commons/lang3/time/StopWatch.java
deleted file mode 100644
index 9534793..0000000
--- a/lang/src/main/java/org/apache/commons/lang3/time/StopWatch.java
+++ /dev/null
@@ -1,478 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- * 
- *      http://www.apache.org/licenses/LICENSE-2.0
- * 
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package org.apache.commons.lang3.time;
-
-/**
- * <p>
- * <code>StopWatch</code> provides a convenient API for timings.
- * </p>
- * 
- * <p>
- * To start the watch, call {@link #start()}. At this point you can:
- * </p>
- * <ul>
- * <li>{@link #split()} the watch to get the time whilst the watch continues in the background. {@link #unsplit()} will
- * remove the effect of the split. At this point, these three options are available again.</li>
- * <li>{@link #suspend()} the watch to pause it. {@link #resume()} allows the watch to continue. Any time between the
- * suspend and resume will not be counted in the total. At this point, these three options are available again.</li>
- * <li>{@link #stop()} the watch to complete the timing session.</li>
- * </ul>
- * 
- * <p>
- * It is intended that the output methods {@link #toString()} and {@link #getTime()} should only be called after stop,
- * split or suspend, however a suitable result will be returned at other points.
- * </p>
- * 
- * <p>
- * NOTE: As from v2.1, the methods protect against inappropriate calls. Thus you cannot now call stop before start,
- * resume before suspend or unsplit before split.
- * </p>
- * 
- * <p>
- * 1. split(), suspend(), or stop() cannot be invoked twice<br>
- * 2. unsplit() may only be called if the watch has been split()<br>
- * 3. resume() may only be called if the watch has been suspend()<br>
- * 4. start() cannot be called twice without calling reset()
- * </p>
- * 
- * <p>This class is not thread-safe</p>
- * 
- * @since 2.0
- * @version $Id$
- */
-public class StopWatch {
-
-    private static final long NANO_2_MILLIS = 1000000L;
-    
-    /**
-     * Enumeration type which indicates the status of stopwatch.
-     */
-    private enum State {
-
-        UNSTARTED {
-            @Override boolean isStarted() { return false; }
-            @Override boolean isStopped() { return true;  }
-            @Override boolean isSuspended() { return false; }
-        },
-        RUNNING {
-            @Override boolean isStarted() { return true; }
-            @Override boolean isStopped() { return false; }
-            @Override boolean isSuspended() { return false; }
-        },
-        STOPPED {
-            @Override boolean isStarted() { return false; }
-            @Override boolean isStopped() { return true; }
-            @Override boolean isSuspended() { return false; }
-        },
-        SUSPENDED {
-            @Override boolean isStarted() { return true; }
-            @Override boolean isStopped() { return false; }
-            @Override  boolean isSuspended() { return true; }
-        };
-
-        /**
-         * <p>
-         * The method is used to find out if the StopWatch is started. A suspended
-         * StopWatch is also started watch.
-         * </p>
-
-         * @return boolean
-         *             If the StopWatch is started.
-         */
-        abstract boolean isStarted();
-
-        /**
-         * <p>
-         * This method is used to find out whether the StopWatch is stopped. The
-         * stopwatch which's not yet started and explicitly stopped stopwatch is
-         * considered as stopped.
-         * </p>
-         *
-         * @return boolean
-         *             If the StopWatch is stopped.
-         */
-        abstract boolean isStopped();
-
-        /**
-         * <p>
-         * This method is used to find out whether the StopWatch is suspended.
-         * </p>
-         *
-         * @return boolean
-         *             If the StopWatch is suspended.
-         */
-        abstract boolean isSuspended();
-    }
-
-    /**
-     * Enumeration type which indicates the split status of stopwatch.
-     */    
-    private enum SplitState {
-        SPLIT,
-        UNSPLIT
-    }
-    /**
-     * The current running state of the StopWatch.
-     */
-    private State runningState = State.UNSTARTED;
-
-    /**
-     * Whether the stopwatch has a split time recorded.
-     */
-    private SplitState splitState = SplitState.UNSPLIT;
-
-    /**
-     * The start time.
-     */
-    private long startTime;
-
-    /**
-     * The start time in Millis - nanoTime is only for elapsed time so we 
-     * need to also store the currentTimeMillis to maintain the old 
-     * getStartTime API.
-     */
-    private long startTimeMillis;
-
-    /**
-     * The stop time.
-     */
-    private long stopTime;
-
-    /**
-     * <p>
-     * Constructor.
-     * </p>
-     */
-    public StopWatch() {
-        super();
-    }
-
-    /**
-     * <p>
-     * Start the stopwatch.
-     * </p>
-     * 
-     * <p>
-     * This method starts a new timing session, clearing any previous values.
-     * </p>
-     * 
-     * @throws IllegalStateException
-     *             if the StopWatch is already running.
-     */
-    public void start() {
-        if (this.runningState == State.STOPPED) {
-            throw new IllegalStateException("Stopwatch must be reset before being restarted. ");
-        }
-        if (this.runningState != State.UNSTARTED) {
-            throw new IllegalStateException("Stopwatch already started. ");
-        }
-        this.startTime = System.nanoTime();
-        this.startTimeMillis = System.currentTimeMillis();
-        this.runningState = State.RUNNING;
-    }
-
-
-    /**
-     * <p>
-     * Stop the stopwatch.
-     * </p>
-     * 
-     * <p>
-     * This method ends a new timing session, allowing the time to be retrieved.
-     * </p>
-     * 
-     * @throws IllegalStateException
-     *             if the StopWatch is not running.
-     */
-    public void stop() {
-        if (this.runningState != State.RUNNING && this.runningState != State.SUSPENDED) {
-            throw new IllegalStateException("Stopwatch is not running. ");
-        }
-        if (this.runningState == State.RUNNING) {
-            this.stopTime = System.nanoTime();
-        }
-        this.runningState = State.STOPPED;
-    }
-
-    /**
-     * <p>
-     * Resets the stopwatch. Stops it if need be.
-     * </p>
-     * 
-     * <p>
-     * This method clears the internal values to allow the object to be reused.
-     * </p>
-     */
-    public void reset() {
-        this.runningState = State.UNSTARTED;
-        this.splitState = SplitState.UNSPLIT;
-    }
-
-    /**
-     * <p>
-     * Split the time.
-     * </p>
-     * 
-     * <p>
-     * This method sets the stop time of the watch to allow a time to be extracted. The start time is unaffected,
-     * enabling {@link #unsplit()} to continue the timing from the original start point.
-     * </p>
-     * 
-     * @throws IllegalStateException
-     *             if the StopWatch is not running.
-     */
-    public void split() {
-        if (this.runningState != State.RUNNING) {
-            throw new IllegalStateException("Stopwatch is not running. ");
-        }
-        this.stopTime = System.nanoTime();
-        this.splitState = SplitState.SPLIT;
-    }
-
-    /**
-     * <p>
-     * Remove a split.
-     * </p>
-     * 
-     * <p>
-     * This method clears the stop time. The start time is unaffected, enabling timing from the original start point to
-     * continue.
-     * </p>
-     * 
-     * @throws IllegalStateException
-     *             if the StopWatch has not been split.
-     */
-    public void unsplit() {
-        if (this.splitState != SplitState.SPLIT) {
-            throw new IllegalStateException("Stopwatch has not been split. ");
-        }
-        this.splitState = SplitState.UNSPLIT;
-    }
-
-    /**
-     * <p>
-     * Suspend the stopwatch for later resumption.
-     * </p>
-     * 
-     * <p>
-     * This method suspends the watch until it is resumed. The watch will not include time between the suspend and
-     * resume calls in the total time.
-     * </p>
-     * 
-     * @throws IllegalStateException
-     *             if the StopWatch is not currently running.
-     */
-    public void suspend() {
-        if (this.runningState != State.RUNNING) {
-            throw new IllegalStateException("Stopwatch must be running to suspend. ");
-        }
-        this.stopTime = System.nanoTime();
-        this.runningState = State.SUSPENDED;
-    }
-
-    /**
-     * <p>
-     * Resume the stopwatch after a suspend.
-     * </p>
-     * 
-     * <p>
-     * This method resumes the watch after it was suspended. The watch will not include time between the suspend and
-     * resume calls in the total time.
-     * </p>
-     * 
-     * @throws IllegalStateException
-     *             if the StopWatch has not been suspended.
-     */
-    public void resume() {
-        if (this.runningState != State.SUSPENDED) {
-            throw new IllegalStateException("Stopwatch must be suspended to resume. ");
-        }
-        this.startTime += System.nanoTime() - this.stopTime;
-        this.runningState = State.RUNNING;
-    }
-
-    /**
-     * <p>
-     * Get the time on the stopwatch.
-     * </p>
-     * 
-     * <p>
-     * This is either the time between the start and the moment this method is called, or the amount of time between
-     * start and stop.
-     * </p>
-     * 
-     * @return the time in milliseconds
-     */
-    public long getTime() {
-        return getNanoTime() / NANO_2_MILLIS;
-    }
-    /**
-     * <p>
-     * Get the time on the stopwatch in nanoseconds.
-     * </p>
-     * 
-     * <p>
-     * This is either the time between the start and the moment this method is called, or the amount of time between
-     * start and stop.
-     * </p>
-     * 
-     * @return the time in nanoseconds
-     * @since 3.0
-     */
-    public long getNanoTime() {
-        if (this.runningState == State.STOPPED || this.runningState == State.SUSPENDED) {
-            return this.stopTime - this.startTime;
-        } else if (this.runningState == State.UNSTARTED) {
-            return 0;
-        } else if (this.runningState == State.RUNNING) {
-            return System.nanoTime() - this.startTime;
-        }
-        throw new RuntimeException("Illegal running state has occurred.");
-    }
-
-    /**
-     * <p>
-     * Get the split time on the stopwatch.
-     * </p>
-     * 
-     * <p>
-     * This is the time between start and latest split.
-     * </p>
-     * 
-     * @return the split time in milliseconds
-     * 
-     * @throws IllegalStateException
-     *             if the StopWatch has not yet been split.
-     * @since 2.1
-     */
-    public long getSplitTime() {
-        return getSplitNanoTime() / NANO_2_MILLIS;
-    }
-    /**
-     * <p>
-     * Get the split time on the stopwatch in nanoseconds.
-     * </p>
-     * 
-     * <p>
-     * This is the time between start and latest split.
-     * </p>
-     * 
-     * @return the split time in nanoseconds
-     * 
-     * @throws IllegalStateException
-     *             if the StopWatch has not yet been split.
-     * @since 3.0
-     */
-    public long getSplitNanoTime() {
-        if (this.splitState != SplitState.SPLIT) {
-            throw new IllegalStateException("Stopwatch must be split to get the split time. ");
-        }
-        return this.stopTime - this.startTime;
-    }
-
-    /**
-     * Returns the time this stopwatch was started.
-     * 
-     * @return the time this stopwatch was started
-     * @throws IllegalStateException
-     *             if this StopWatch has not been started
-     * @since 2.4
-     */
-    public long getStartTime() {
-        if (this.runningState == State.UNSTARTED) {
-            throw new IllegalStateException("Stopwatch has not been started");
-        }
-        // System.nanoTime is for elapsed time
-        return this.startTimeMillis;
-    }
-
-    /**
-     * <p>
-     * Gets a summary of the time that the stopwatch recorded as a string.
-     * </p>
-     * 
-     * <p>
-     * The format used is ISO 8601-like, <i>hours</i>:<i>minutes</i>:<i>seconds</i>.<i>milliseconds</i>.
-     * </p>
-     * 
-     * @return the time as a String
-     */
-    @Override
-    public String toString() {
-        return DurationFormatUtils.formatDurationHMS(getTime());
-    }
-
-    /**
-     * <p>
-     * Gets a summary of the split time that the stopwatch recorded as a string.
-     * </p>
-     * 
-     * <p>
-     * The format used is ISO 8601-like, <i>hours</i>:<i>minutes</i>:<i>seconds</i>.<i>milliseconds</i>.
-     * </p>
-     * 
-     * @return the split time as a String
-     * @since 2.1
-     */
-    public String toSplitString() {
-        return DurationFormatUtils.formatDurationHMS(getSplitTime());
-    }
-
-    /**
-     * <p>
-     * The method is used to find out if the StopWatch is started. A suspended
-     * StopWatch is also started watch.
-     * </p>
-     *
-     * @return boolean
-     *             If the StopWatch is started.
-     * @since 3.2
-     */
-    public boolean isStarted() {
-        return runningState.isStarted();
-    }
-
-    /**
-     * <p>
-     * This method is used to find out whether the StopWatch is suspended.
-     * </p>
-     *
-     * @return boolean
-     *             If the StopWatch is suspended.
-     * @since 3.2
-     */
-    public boolean isSuspended() {
-        return runningState.isSuspended();
-    }
-
-    /**
-     * <p>
-     * This method is used to find out whether the StopWatch is stopped. The
-     * stopwatch which's not yet started and explicitly stopped stopwatch is
-     * considered as stopped.
-     * </p>
-     *
-     * @return boolean
-     *             If the StopWatch is stopped.
-     * @since 3.2
-     */
-    public boolean isStopped() {
-        return runningState.isStopped();
-    }    
-
-}
diff --git a/lang/src/main/java/org/apache/commons/lang3/time/package-info.java b/lang/src/main/java/org/apache/commons/lang3/time/package-info.java
deleted file mode 100644
index 7ea3a50..0000000
--- a/lang/src/main/java/org/apache/commons/lang3/time/package-info.java
+++ /dev/null
@@ -1,29 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-/**
- * <p>Provides classes and methods to work with dates and durations.
- * These classes are immutable (and therefore thread-safe) apart from {@link org.apache.commons.lang3.time.StopWatch}.</p>
- *
- * <p>The time package contains some basic utilities for manipulating time (a delorean, police box and grandfather clock?).
- * These include a {@link org.apache.commons.lang3.time.StopWatch} for simple performance measurements and an optimised {@link org.apache.commons.lang3.time.FastDateFormat} class.</p>
- *
- * <p>New in Lang 2.1 is the {@link org.apache.commons.lang3.time.DurationFormatUtils} class, which provides various methods for formatting durations.</p>
- *
- * @since 2.0
- * @version $Id$
- */
-package org.apache.commons.lang3.time;
diff --git a/lang/src/main/java/org/apache/commons/lang3/tuple/ImmutablePair.java b/lang/src/main/java/org/apache/commons/lang3/tuple/ImmutablePair.java
deleted file mode 100644
index 3e0a740..0000000
--- a/lang/src/main/java/org/apache/commons/lang3/tuple/ImmutablePair.java
+++ /dev/null
@@ -1,104 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.commons.lang3.tuple;
-
-/**
- * <p>An immutable pair consisting of two {@code Object} elements.</p>
- * 
- * <p>Although the implementation is immutable, there is no restriction on the objects
- * that may be stored. If mutable objects are stored in the pair, then the pair
- * itself effectively becomes mutable. The class is also {@code final}, so a subclass
- * can not add undesirable behaviour.</p>
- * 
- * <p>#ThreadSafe# if both paired objects are thread-safe</p>
- *
- * @param <L> the left element type
- * @param <R> the right element type
- *
- * @since Lang 3.0
- * @version $Id$
- */
-public final class ImmutablePair<L, R> extends Pair<L, R> {
-
-    /** Serialization version */
-    private static final long serialVersionUID = 4954918890077093841L;
-
-    /** Left object */
-    public final L left;
-    /** Right object */
-    public final R right;
-
-    /**
-     * <p>Obtains an immutable pair of from two objects inferring the generic types.</p>
-     * 
-     * <p>This factory allows the pair to be created using inference to
-     * obtain the generic types.</p>
-     * 
-     * @param <L> the left element type
-     * @param <R> the right element type
-     * @param left  the left element, may be null
-     * @param right  the right element, may be null
-     * @return a pair formed from the two parameters, not null
-     */
-    public static <L, R> ImmutablePair<L, R> of(final L left, final R right) {
-        return new ImmutablePair<L, R>(left, right);
-    }
-
-    /**
-     * Create a new pair instance.
-     *
-     * @param left  the left value, may be null
-     * @param right  the right value, may be null
-     */
-    public ImmutablePair(final L left, final R right) {
-        super();
-        this.left = left;
-        this.right = right;
-    }
-
-    //-----------------------------------------------------------------------
-    /**
-     * {@inheritDoc}
-     */
-    @Override
-    public L getLeft() {
-        return left;
-    }
-
-    /**
-     * {@inheritDoc}
-     */
-    @Override
-    public R getRight() {
-        return right;
-    }
-
-    /**
-     * <p>Throws {@code UnsupportedOperationException}.</p>
-     * 
-     * <p>This pair is immutable, so this operation is not supported.</p>
-     *
-     * @param value  the value to set
-     * @return never
-     * @throws UnsupportedOperationException as this operation is not supported
-     */
-    @Override
-    public R setValue(final R value) {
-        throw new UnsupportedOperationException();
-    }
-
-}
diff --git a/lang/src/main/java/org/apache/commons/lang3/tuple/ImmutableTriple.java b/lang/src/main/java/org/apache/commons/lang3/tuple/ImmutableTriple.java
deleted file mode 100644
index 7e4660c..0000000
--- a/lang/src/main/java/org/apache/commons/lang3/tuple/ImmutableTriple.java
+++ /dev/null
@@ -1,105 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.commons.lang3.tuple;
-
-/**
- * <p>An immutable triple consisting of three {@code Object} elements.</p>
- * 
- * <p>Although the implementation is immutable, there is no restriction on the objects
- * that may be stored. If mutable objects are stored in the triple, then the triple
- * itself effectively becomes mutable. The class is also {@code final}, so a subclass
- * can not add undesirable behaviour.</p>
- * 
- * <p>#ThreadSafe# if all three objects are thread-safe</p>
- *
- * @param <L> the left element type
- * @param <M> the middle element type
- * @param <R> the right element type
- *
- * @version $Id$
- * @since 3.2
- */
-public final class ImmutableTriple<L, M, R> extends Triple<L, M, R> {
-
-    /** Serialization version */
-    private static final long serialVersionUID = 1L;
-
-    /** Left object */
-    public final L left;
-    /** Middle object */
-    public final M middle;
-    /** Right object */
-    public final R right;
-
-    /**
-     * <p>Obtains an immutable triple of from three objects inferring the generic types.</p>
-     * 
-     * <p>This factory allows the triple to be created using inference to
-     * obtain the generic types.</p>
-     * 
-     * @param <L> the left element type
-     * @param <M> the middle element type
-     * @param <R> the right element type
-     * @param left  the left element, may be null
-     * @param middle  the middle element, may be null
-     * @param right  the right element, may be null
-     * @return a triple formed from the three parameters, not null
-     */
-    public static <L, M, R> ImmutableTriple<L, M, R> of(final L left, final M middle, final R right) {
-        return new ImmutableTriple<L, M, R>(left, middle, right);
-    }
-
-    /**
-     * Create a new triple instance.
-     *
-     * @param left  the left value, may be null
-     * @param middle the middle value, may be null
-     * @param right  the right value, may be null
-     */
-    public ImmutableTriple(final L left, final M middle, final R right) {
-        super();
-        this.left = left;
-        this.middle = middle;
-        this.right = right;
-    }
-
-    //-----------------------------------------------------------------------
-    /**
-     * {@inheritDoc}
-     */
-    @Override
-    public L getLeft() {
-        return left;
-    }
-
-    /**
-     * {@inheritDoc}
-     */
-    @Override
-    public M getMiddle() {
-        return middle;
-    }
-
-    /**
-     * {@inheritDoc}
-     */
-    @Override
-    public R getRight() {
-        return right;
-    }
-}
-
diff --git a/lang/src/main/java/org/apache/commons/lang3/tuple/MutablePair.java b/lang/src/main/java/org/apache/commons/lang3/tuple/MutablePair.java
deleted file mode 100644
index 2e37b9f..0000000
--- a/lang/src/main/java/org/apache/commons/lang3/tuple/MutablePair.java
+++ /dev/null
@@ -1,124 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.commons.lang3.tuple;
-
-/**
- * <p>A mutable pair consisting of two {@code Object} elements.</p>
- * 
- * <p>Not #ThreadSafe#</p>
- *
- * @param <L> the left element type
- * @param <R> the right element type
- *
- * @since Lang 3.0
- * @version $Id$
- */
-public class MutablePair<L, R> extends Pair<L, R> {
-
-    /** Serialization version */
-    private static final long serialVersionUID = 4954918890077093841L;
-
-    /** Left object */
-    public L left;
-    /** Right object */
-    public R right;
-
-    /**
-     * <p>Obtains an immutable pair of from two objects inferring the generic types.</p>
-     * 
-     * <p>This factory allows the pair to be created using inference to
-     * obtain the generic types.</p>
-     * 
-     * @param <L> the left element type
-     * @param <R> the right element type
-     * @param left  the left element, may be null
-     * @param right  the right element, may be null
-     * @return a pair formed from the two parameters, not null
-     */
-    public static <L, R> MutablePair<L, R> of(final L left, final R right) {
-        return new MutablePair<L, R>(left, right);
-    }
-
-    /**
-     * Create a new pair instance of two nulls.
-     */
-    public MutablePair() {
-        super();
-    }
-
-    /**
-     * Create a new pair instance.
-     *
-     * @param left  the left value, may be null
-     * @param right  the right value, may be null
-     */
-    public MutablePair(final L left, final R right) {
-        super();
-        this.left = left;
-        this.right = right;
-    }
-
-    //-----------------------------------------------------------------------
-    /**
-     * {@inheritDoc}
-     */
-    @Override
-    public L getLeft() {
-        return left;
-    }
-
-    /**
-     * Sets the left element of the pair.
-     * 
-     * @param left  the new value of the left element, may be null
-     */
-    public void setLeft(final L left) {
-        this.left = left;
-    }
-
-    /**
-     * {@inheritDoc}
-     */
-    @Override
-    public R getRight() {
-        return right;
-    }
-
-    /**
-     * Sets the right element of the pair.
-     * 
-     * @param right  the new value of the right element, may be null
-     */
-    public void setRight(final R right) {
-        this.right = right;
-    }
-
-    /**
-     * Sets the {@code Map.Entry} value.
-     * This sets the right element of the pair.
-     * 
-     * @param value  the right value to set, not null
-     * @return the old value for the right element
-     */
-    @Override
-    public R setValue(final R value) {
-        final R result = getRight();
-        setRight(value);
-        return result;
-    }
-
-}
diff --git a/lang/src/main/java/org/apache/commons/lang3/tuple/MutableTriple.java b/lang/src/main/java/org/apache/commons/lang3/tuple/MutableTriple.java
deleted file mode 100644
index bd2d97b..0000000
--- a/lang/src/main/java/org/apache/commons/lang3/tuple/MutableTriple.java
+++ /dev/null
@@ -1,134 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.commons.lang3.tuple;
-
-/**
- * <p>A mutable triple consisting of three {@code Object} elements.</p>
- *
- * <p>Not #ThreadSafe#</p>
- *
- * @param <L> the left element type
- * @param <M> the middle element type
- * @param <R> the right element type
- *
- * @version $Id$
- * @since 3.2
- */
-public class MutableTriple<L, M, R> extends Triple<L, M, R> {
-
-    /** Serialization version */
-    private static final long serialVersionUID = 1L;
-
-    /** Left object */
-    public L left;
-    /** Middle object */
-    public M middle;
-    /** Right object */
-    public R right;
-
-    /**
-     * <p>Obtains an mutable triple of three objects inferring the generic types.</p>
-     *
-     * <p>This factory allows the triple to be created using inference to
-     * obtain the generic types.</p>
-     *
-     * @param <L> the left element type
-     * @param <M> the middle element type
-     * @param <R> the right element type
-     * @param left  the left element, may be null
-     * @param middle  the middle element, may be null
-     * @param right  the right element, may be null
-     * @return a triple formed from the three parameters, not null
-     */
-    public static <L, M, R> MutableTriple<L, M, R> of(final L left, final M middle, final R right) {
-        return new MutableTriple<L, M, R>(left, middle, right);
-    }
-
-    /**
-     * Create a new triple instance of three nulls.
-     */
-    public MutableTriple() {
-        super();
-    }
-
-    /**
-     * Create a new triple instance.
-     *
-     * @param left  the left value, may be null
-     * @param middle  the middle value, may be null
-     * @param right  the right value, may be null
-     */
-    public MutableTriple(final L left, final M middle, final R right) {
-        super();
-        this.left = left;
-        this.middle = middle;
-        this.right = right;
-    }
-
-    //-----------------------------------------------------------------------
-    /**
-     * {@inheritDoc}
-     */
-    @Override
-    public L getLeft() {
-        return left;
-    }
-
-    /**
-     * Sets the left element of the triple.
-     *
-     * @param left  the new value of the left element, may be null
-     */
-    public void setLeft(final L left) {
-        this.left = left;
-    }
-
-    /**
-     * {@inheritDoc}
-     */
-    @Override
-    public M getMiddle() {
-        return middle;
-    }
-
-    /**
-     * Sets the middle element of the triple.
-     *
-     * @param middle  the new value of the middle element, may be null
-     */
-    public void setMiddle(final M middle) {
-        this.middle = middle;
-    }
-
-    /**
-     * {@inheritDoc}
-     */
-    @Override
-    public R getRight() {
-        return right;
-    }
-
-    /**
-     * Sets the right element of the triple.
-     *
-     * @param right  the new value of the right element, may be null
-     */
-    public void setRight(final R right) {
-        this.right = right;
-    }
-}
-
diff --git a/lang/src/main/java/org/apache/commons/lang3/tuple/Pair.java b/lang/src/main/java/org/apache/commons/lang3/tuple/Pair.java
deleted file mode 100644
index b3f4e59..0000000
--- a/lang/src/main/java/org/apache/commons/lang3/tuple/Pair.java
+++ /dev/null
@@ -1,180 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.commons.lang3.tuple;
-
-import java.io.Serializable;
-import java.util.Map;
-
-import org.apache.commons.lang3.ObjectUtils;
-import org.apache.commons.lang3.builder.CompareToBuilder;
-
-/**
- * <p>A pair consisting of two elements.</p>
- * 
- * <p>This class is an abstract implementation defining the basic API.
- * It refers to the elements as 'left' and 'right'. It also implements the
- * {@code Map.Entry} interface where the key is 'left' and the value is 'right'.</p>
- * 
- * <p>Subclass implementations may be mutable or immutable.
- * However, there is no restriction on the type of the stored objects that may be stored.
- * If mutable objects are stored in the pair, then the pair itself effectively becomes mutable.</p>
- *
- * @param <L> the left element type
- * @param <R> the right element type
- *
- * @since Lang 3.0
- * @version $Id$
- */
-public abstract class Pair<L, R> implements Map.Entry<L, R>, Comparable<Pair<L, R>>, Serializable {
-
-    /** Serialization version */
-    private static final long serialVersionUID = 4954918890077093841L;
-
-    /**
-     * <p>Obtains an immutable pair of from two objects inferring the generic types.</p>
-     * 
-     * <p>This factory allows the pair to be created using inference to
-     * obtain the generic types.</p>
-     * 
-     * @param <L> the left element type
-     * @param <R> the right element type
-     * @param left  the left element, may be null
-     * @param right  the right element, may be null
-     * @return a pair formed from the two parameters, not null
-     */
-    public static <L, R> Pair<L, R> of(final L left, final R right) {
-        return new ImmutablePair<L, R>(left, right);
-    }
-
-    //-----------------------------------------------------------------------
-    /**
-     * <p>Gets the left element from this pair.</p>
-     * 
-     * <p>When treated as a key-value pair, this is the key.</p>
-     * 
-     * @return the left element, may be null
-     */
-    public abstract L getLeft();
-
-    /**
-     * <p>Gets the right element from this pair.</p>
-     * 
-     * <p>When treated as a key-value pair, this is the value.</p>
-     * 
-     * @return the right element, may be null
-     */
-    public abstract R getRight();
-
-    /**
-     * <p>Gets the key from this pair.</p>
-     * 
-     * <p>This method implements the {@code Map.Entry} interface returning the
-     * left element as the key.</p>
-     * 
-     * @return the left element as the key, may be null
-     */
-    @Override
-    public final L getKey() {
-        return getLeft();
-    }
-
-    /**
-     * <p>Gets the value from this pair.</p>
-     * 
-     * <p>This method implements the {@code Map.Entry} interface returning the
-     * right element as the value.</p>
-     * 
-     * @return the right element as the value, may be null
-     */
-    @Override
-    public R getValue() {
-        return getRight();
-    }
-
-    //-----------------------------------------------------------------------
-    /**
-     * <p>Compares the pair based on the left element followed by the right element.
-     * The types must be {@code Comparable}.</p>
-     * 
-     * @param other  the other pair, not null
-     * @return negative if this is less, zero if equal, positive if greater
-     */
-    @Override
-    public int compareTo(final Pair<L, R> other) {
-      return new CompareToBuilder().append(getLeft(), other.getLeft())
-              .append(getRight(), other.getRight()).toComparison();
-    }
-
-    /**
-     * <p>Compares this pair to another based on the two elements.</p>
-     * 
-     * @param obj  the object to compare to, null returns false
-     * @return true if the elements of the pair are equal
-     */
-    @SuppressWarnings( "deprecation" ) // ObjectUtils.equals(Object, Object) has been deprecated in 3.2
-    @Override
-    public boolean equals(final Object obj) {
-        if (obj == this) {
-            return true;
-        }
-        if (obj instanceof Map.Entry<?, ?>) {
-            final Map.Entry<?, ?> other = (Map.Entry<?, ?>) obj;
-            return ObjectUtils.equals(getKey(), other.getKey())
-                    && ObjectUtils.equals(getValue(), other.getValue());
-        }
-        return false;
-    }
-
-    /**
-     * <p>Returns a suitable hash code.
-     * The hash code follows the definition in {@code Map.Entry}.</p>
-     * 
-     * @return the hash code
-     */
-    @Override
-    public int hashCode() {
-        // see Map.Entry API specification
-        return (getKey() == null ? 0 : getKey().hashCode()) ^
-                (getValue() == null ? 0 : getValue().hashCode());
-    }
-
-    /**
-     * <p>Returns a String representation of this pair using the format {@code ($left,$right)}.</p>
-     * 
-     * @return a string describing this object, not null
-     */
-    @Override
-    public String toString() {
-        return new StringBuilder().append('(').append(getLeft()).append(',').append(getRight()).append(')').toString();
-    }
-
-    /**
-     * <p>Formats the receiver using the given format.</p>
-     * 
-     * <p>This uses {@link java.util.Formattable} to perform the formatting. Two variables may
-     * be used to embed the left and right elements. Use {@code %1$s} for the left
-     * element (key) and {@code %2$s} for the right element (value).
-     * The default format used by {@code toString()} is {@code (%1$s,%2$s)}.</p>
-     * 
-     * @param format  the format string, optionally containing {@code %1$s} and {@code %2$s}, not null
-     * @return the formatted string, not null
-     */
-    public String toString(final String format) {
-        return String.format(format, getLeft(), getRight());
-    }
-
-}
diff --git a/lang/src/main/java/org/apache/commons/lang3/tuple/Triple.java b/lang/src/main/java/org/apache/commons/lang3/tuple/Triple.java
deleted file mode 100644
index 515646e..0000000
--- a/lang/src/main/java/org/apache/commons/lang3/tuple/Triple.java
+++ /dev/null
@@ -1,162 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.commons.lang3.tuple;
-
-import java.io.Serializable;
-
-import org.apache.commons.lang3.ObjectUtils;
-import org.apache.commons.lang3.builder.CompareToBuilder;
-
-/**
- * <p>A triple consisting of three elements.</p>
- *
- * <p>This class is an abstract implementation defining the basic API.
- * It refers to the elements as 'left', 'middle' and 'right'.</p>
- *
- * <p>Subclass implementations may be mutable or immutable.
- * However, there is no restriction on the type of the stored objects that may be stored.
- * If mutable objects are stored in the triple, then the triple itself effectively becomes mutable.</p>
- *
- * @param <L> the left element type
- * @param <M> the middle element type
- * @param <R> the right element type
- *
- * @version $Id$
- * @since 3.2
- */
-public abstract class Triple<L, M, R> implements Comparable<Triple<L, M, R>>, Serializable {
-
-    /** Serialization version */
-    private static final long serialVersionUID = 1L;
-
-    /**
-     * <p>Obtains an immutable triple of from three objects inferring the generic types.</p>
-     *
-     * <p>This factory allows the triple to be created using inference to
-     * obtain the generic types.</p>
-     *
-     * @param <L> the left element type
-     * @param <M> the middle element type
-     * @param <R> the right element type
-     * @param left  the left element, may be null
-     * @param middle the middle element, may be null
-     * @param right  the right element, may be null
-     * @return a triple formed from the three parameters, not null
-     */
-    public static <L, M, R> Triple<L, M, R> of(final L left, final M middle, final R right) {
-        return new ImmutableTriple<L, M, R>(left, middle, right);
-    }
-
-    //-----------------------------------------------------------------------
-    /**
-     * <p>Gets the left element from this triple.</p>
-     *
-     * @return the left element, may be null
-     */
-    public abstract L getLeft();
-
-    /**
-     * <p>Gets the middle element from this triple.</p>
-     *
-     * @return the middle element, may be null
-     */
-    public abstract M getMiddle();
-
-    /**
-     * <p>Gets the right element from this triple.</p>
-     *
-     * @return the right element, may be null
-     */
-    public abstract R getRight();
-
-    //-----------------------------------------------------------------------
-    /**
-     * <p>Compares the triple based on the left element, followed by the middle element,
-     * finally the right element.
-     * The types must be {@code Comparable}.</p>
-     *
-     * @param other  the other triple, not null
-     * @return negative if this is less, zero if equal, positive if greater
-     */
-    @Override
-    public int compareTo(final Triple<L, M, R> other) {
-      return new CompareToBuilder().append(getLeft(), other.getLeft())
-          .append(getMiddle(), other.getMiddle())
-          .append(getRight(), other.getRight()).toComparison();
-    }
-
-    /**
-     * <p>Compares this triple to another based on the three elements.</p>
-     *
-     * @param obj  the object to compare to, null returns false
-     * @return true if the elements of the triple are equal
-     */
-    @SuppressWarnings( "deprecation" ) // ObjectUtils.equals(Object, Object) has been deprecated in 3.2
-    @Override
-    public boolean equals(final Object obj) {
-        if (obj == this) {
-            return true;
-        }
-        if (obj instanceof Triple<?, ?, ?>) {
-            final Triple<?, ?, ?> other = (Triple<?, ?, ?>) obj;
-            return ObjectUtils.equals(getLeft(), other.getLeft())
-                && ObjectUtils.equals(getMiddle(), other.getMiddle())
-                && ObjectUtils.equals(getRight(), other.getRight());
-        }
-        return false;
-    }
-
-    /**
-     * <p>Returns a suitable hash code.</p>
-     *
-     * @return the hash code
-     */
-    @Override
-    public int hashCode() {
-        return (getLeft() == null ? 0 : getLeft().hashCode()) ^
-            (getMiddle() == null ? 0 : getMiddle().hashCode()) ^
-            (getRight() == null ? 0 : getRight().hashCode());
-    }
-
-    /**
-     * <p>Returns a String representation of this triple using the format {@code ($left,$middle,$right)}.</p>
-     *
-     * @return a string describing this object, not null
-     */
-    @Override
-    public String toString() {
-        return new StringBuilder().append('(').append(getLeft()).append(',').append(getMiddle()).append(',')
-            .append(getRight()).append(')').toString();
-    }
-
-    /**
-     * <p>Formats the receiver using the given format.</p>
-     *
-     * <p>This uses {@link java.util.Formattable} to perform the formatting. Three variables may
-     * be used to embed the left and right elements. Use {@code %1$s} for the left
-     * element, {@code %2$s} for the middle and {@code %3$s} for the right element.
-     * The default format used by {@code toString()} is {@code (%1$s,%2$s,%3$s)}.</p>
-     *
-     * @param format  the format string, optionally containing {@code %1$s}, {@code %2$s} and {@code %3$s}, not null
-     * @return the formatted string, not null
-     */
-    public String toString(final String format) {
-        return String.format(format, getLeft(), getMiddle(), getRight());
-    }
-
-}
-
diff --git a/lang/src/main/java/org/apache/commons/lang3/tuple/package-info.java b/lang/src/main/java/org/apache/commons/lang3/tuple/package-info.java
deleted file mode 100644
index 7d309d6..0000000
--- a/lang/src/main/java/org/apache/commons/lang3/tuple/package-info.java
+++ /dev/null
@@ -1,23 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-/**
- * Tuple classes, starting with a Pair class in version 3.0.
- *
- * @since 3.0
- * @version $Id$
- */
-package org.apache.commons.lang3.tuple;
diff --git a/lang/src/media/logo.xcf b/lang/src/media/logo.xcf
deleted file mode 100644
index e73d371..0000000
--- a/lang/src/media/logo.xcf
+++ /dev/null
Binary files differ
diff --git a/lang/src/release-tools/build.properties.sample b/lang/src/release-tools/build.properties.sample
deleted file mode 100644
index eff0e94..0000000
--- a/lang/src/release-tools/build.properties.sample
+++ /dev/null
@@ -1,25 +0,0 @@
-#   Licensed to the Apache Software Foundation (ASF) under one or more
-#   contributor license agreements.  See the NOTICE file distributed with
-#   this work for additional information regarding copyright ownership.
-#   The ASF licenses this file to You under the Apache License, Version 2.0
-#   (the "License"); you may not use this file except in compliance with
-#   the License.  You may obtain a copy of the License at
-#
-#       http://www.apache.org/licenses/LICENSE-2.0
-#
-#   Unless required by applicable law or agreed to in writing, software
-#   distributed under the License is distributed on an "AS IS" BASIS,
-#   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-#   See the License for the specific language governing permissions and
-#   limitations under the License.
-##########################################################################
-# Sample Ant build.properties file for creating RCs and releasing
-##########################################################################
-
-# Your apache ID - it is used for the Build-By MANIFEST header, when
-# creating the RC jars and when uploading the website
-apache.id=luckyRM
-# checkout directory for the release distribution repo
-release.path=${user.home}/lang-rc
-# SSH keyfile holding the private key
-ssh.keyfile=${user.home}/.ssh/id_rsa
diff --git a/lang/src/release-tools/build.xml b/lang/src/release-tools/build.xml
deleted file mode 100644
index c45541c..0000000
--- a/lang/src/release-tools/build.xml
+++ /dev/null
@@ -1,161 +0,0 @@
-<!--
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
- -->
-<!--
-   Build file for creating release candidates and releasing lang.
-   $Id$
--->
-<project name="release-lang" basedir="../../">
-
-    <target name="-init">
-        <property file="src/release-tools/build.properties" />
-        <property file="default.properties" />
-        <!-- provide some defaults -->
-        <property name="release.path" value="${user.home}/lang-rc" />
-        <property name="apache.id" value="dev@commons.apache.org" />
-        <property name="ssh.keyfile" value="${user.home}/.ssh/id_rsa"/>
-        <property name="release.url" value="https://dist.apache.org/repos/dist/dev/commons/lang" />
-
-        <macrodef name="mvn">
-            <attribute name="goal"/>
-            <element name="more-args" implicit="true" optional="true"/>
-            <sequential>
-                <exec executable="mvn">
-                    <arg value="@{goal}" />
-                    <more-args/>
-                </exec>
-            </sequential>
-        </macrodef>
-
-        <available property="dist-dir-exists?"
-                   file="${release.path}"
-                   type="dir"/>
-    </target>
-
-    <target name="pre-rc" depends="-init"
-            description="Prepares the download page and the release notes for rolling out a RC">
-        <mvn goal="changes:announcement-generate">
-            <arg value="-Prelease-notes"/>
-        </mvn>
-        <mvn goal="commons:download-page">
-            <arg value="-Dcommons.componentid=lang"/>
-        </mvn>
-    </target>
-
-    <target name="-clear-local-repo" depends="-init">
-        <property name="repo.path" value="${user.home}/.m2/repository/org/apache/commons/${component.name}/${component.version}" />
-        <delete dir="${repo.path}" />
-    </target>
-
-    <target name="-build-maven-artifacts" depends="-clear-local-repo">
-        <input message="Please enter gpg passphrase..." addproperty="gpg.pass">
-            <handler type="secure" />
-        </input>
-
-        <mvn goal="deploy">
-            <arg value="-Prelease" />
-            <arg value="-Ptest-deploy" />
-            <arg value="-Duser.name=${apache.id}" />
-            <arg value="-Dgpg.passphrase=${gpg.pass}" />
-        </mvn>
-    </target>
-
-    <target name="-populate-dist-repo"
-            depends="-build-maven-artifacts, -prepare-dist-area">
-        <copy todir="${release.path}/binaries">
-            <fileset dir="${repo.path}">
-                <include name="*bin.zip*" />
-                <include name="*bin.tar.gz*"/>
-            </fileset>
-        </copy>
-
-        <copy todir="${release.path}/source">
-            <fileset dir="${repo.path}">
-                <include name="*src.zip*" />
-                <include name="*src.tar.gz*"/>
-            </fileset>
-        </copy>
-
-        <copy file="RELEASE-NOTES.txt" todir="${release.path}" />
-    </target>
-
-    <target name="rc" description="Create the RC"
-            depends="-populate-dist-repo, -create-site"/>
-
-    <target name="-create-site" depends="-init">
-        <echo message="Creating site" />
-        <mvn goal="site"/>
-    </target>
-
-    <target name="upload-site" depends="-init"
-            description="Uploads and publishes the site to the RM's apache webspace">
-        <zip destfile="target/site.zip">
-            <zipfileset dir="target/site" prefix="${final.name}"/>
-        </zip>
-
-        <input message="Please enter ssh passphrase..." addproperty="ssh.pass">
-            <handler type="secure" />
-        </input>
-
-        <scp localFile="target/site.zip"
-             remoteToDir="${apache.id}@people.apache.org:."
-             keyfile="${ssh.keyfile}"
-             passphrase="${ssh.pass}"/>
-        <sshexec username="${apache.id}" host="people.apache.org"
-                 command="unzip -d public_html site.zip"
-                 keyfile="${ssh.keyfile}"
-                 passphrase="${ssh.pass}"/>
-        <sshexec username="${apache.id}" host="people.apache.org"
-                 command="rm site.zip"
-                 keyfile="${ssh.keyfile}"
-                 passphrase="${ssh.pass}"/>
-    </target>
-
-    <target name="nexus-bundle" depends="-build-maven-artifacts"
-            description="Creates an upload bundle suitable for Nexus Snapshot Upload">
-        <jar destfile="target/upload-bundle.jar">
-            <fileset dir="${repo.path}">
-                <include name="*.jar"/>
-                <include name="*.jar.asc"/>
-                <include name="*.pom"/>
-                <include name="*.pom.asc"/>
-            </fileset>
-        </jar>
-    </target>
-
-    <target name="-prepare-dist-area" depends="-checkout-dist, -update-dist"/>
-
-    <target name="-checkout-dist" depends="-init" unless="dist-dir-exists?">
-        <echo message="Checking out ${release.url} -> ${release.path}"/>
-        <exec executable="svn">
-            <arg value="co" />
-            <arg value="${release.url}" />
-            <arg value="${release.path}" />
-        </exec>
-    </target>
-
-    <target name="-update-dist" depends="-init" if="dist-dir-exists?">
-        <echo message="Updating ${release.path}"/>
-        <exec executable="svn" dir="${release.path}">
-            <arg value="up" />
-        </exec>
-    </target>
-
-</project>
diff --git a/lang/src/site/resources/download_lang.cgi b/lang/src/site/resources/download_lang.cgi
deleted file mode 100755
index 495cde1..0000000
--- a/lang/src/site/resources/download_lang.cgi
+++ /dev/null
@@ -1,4 +0,0 @@
-#!/bin/sh
-# Just call the standard mirrors.cgi script. It will use download.html
-# as the input template.
-exec /www/www.apache.org/dyn/mirrors/mirrors.cgi $*
\ No newline at end of file
diff --git a/lang/src/site/resources/images/logo.png b/lang/src/site/resources/images/logo.png
deleted file mode 100644
index 847238b..0000000
--- a/lang/src/site/resources/images/logo.png
+++ /dev/null
Binary files differ
diff --git a/lang/src/site/resources/lang2-lang3-clirr-report.html b/lang/src/site/resources/lang2-lang3-clirr-report.html
deleted file mode 100644
index 950e7d7..0000000
--- a/lang/src/site/resources/lang2-lang3-clirr-report.html
+++ /dev/null
@@ -1,265 +0,0 @@
-<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
-<!--
-Licensed to the Apache Software Foundation (ASF) under one or more
-contributor license agreements.  See the NOTICE file distributed with
-this work for additional information regarding copyright ownership.
-The ASF licenses this file to You under the Apache License, Version 2.0
-(the "License"); you may not use this file except in compliance with
-the License.  You may obtain a copy of the License at
-
-     http://www.apache.org/licenses/LICENSE-2.0
-
-Unless required by applicable law or agreed to in writing, software
-distributed under the License is distributed on an "AS IS" BASIS,
-WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-See the License for the specific language governing permissions and
-limitations under the License.
--->
-<!-- Generated by Apache Maven Doxia at Jul 13, 2011 ( $Revision: 1080083 $ ) -->
-<!-- $HeadURL: https://svn.apache.org/repos/asf/commons/proper/commons-skin/trunk/src/main/resources/META-INF/maven/site.vm $ -->
-<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
-  <head>
-    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
-    <title>Lang - Clirr Results</title>
-    <style type="text/css" media="all">
-      @import url("./css/maven-base.css");
-      @import url("./css/maven-theme.css");
-      @import url("./css/site.css");
-    </style>
-    <link rel="stylesheet" href="./css/print.css" type="text/css" media="print" />
-    <meta name="Date-Revision-yyyymmdd" content="20110713" />
-    <meta http-equiv="Content-Language" content="en" />
-                                                    
-<link rel="stylesheet" type="text/css" href="./css/prettify.css" media="all"/>                                                        
-<script src="./js/prettify.js" type="text/javascript"></script>                                                        
-<script type="text/javascript">window.onload=function() {
-            prettyPrint();
-        }</script>                      
-        </head>
-  <body class="composite">
-    <div id="banner">
-            <div id="bannerLeft">
-                                            <a href="http://commons.apache.org/" title="Apache Commons logo">
-                                        <img src="./images/commons-logo.png" alt="Apache Commons logo"/>
-                </a>
-            </div><!-- id="bannerLeft" -->
-              <div id="bannerRight">
-                                                          <a href="index.html">
-                                                <img src="images/logo.png" alt="Commons Lang"/>
-                </a>
-            </div><!-- id="bannerRight" -->
-        <div class="clear">
-        <hr/>
-      </div>
-    </div>
-    <div id="breadcrumbs">
-            
-                
-                <div class="xleft">
-        <span id="publishDate">Last Published: 13 July 2011</span>
-                  &nbsp;| <span id="projectVersion">Version: 3.0</span>
-                      </div>
-            <div class="xright">                    <a href="http://www.apachecon.com/" class="externalLink" title="ApacheCon">ApacheCon</a>
-            |
-                        <a href="http://www.apache.org" class="externalLink" title="Apache">Apache</a>
-            |
-                        <a href="../" title="Commons">Commons</a>
-              
-                
-      </div>
-      <div class="clear">
-        <hr/>
-      </div>
-    </div>
-    <div id="leftColumn">
-      <div id="navcolumn">
-             
-                
-                                <h5>Lang</h5>
-                  <ul>
-                  <li class="none">
-                          <a href="index.html" title="Overview">Overview</a>
-            </li>
-                  <li class="none">
-                          <a href="download_lang.cgi" title="Download">Download</a>
-            </li>
-                  <li class="none">
-                          <a href="userguide.html" title="Users guide">Users guide</a>
-            </li>
-                  <li class="none">
-                          <a href="release-history.html" title="Release History">Release History</a>
-            </li>
-                  <li class="none">
-                          <a href="api-release/index.html" title="Javadoc (3.0 release)">Javadoc (3.0 release)</a>
-            </li>
-          </ul>
-                       <h5>Development</h5>
-                  <ul>
-                  <li class="none">
-                          <a href="building.html" title="Building">Building</a>
-            </li>
-                  <li class="none">
-                          <a href="mail-lists.html" title="Mailing Lists">Mailing Lists</a>
-            </li>
-                  <li class="none">
-                          <a href="issue-tracking.html" title="Issue Tracking">Issue Tracking</a>
-            </li>
-                  <li class="none">
-                          <a href="proposal.html" title="Proposal">Proposal</a>
-            </li>
-                  <li class="none">
-                          <a href="developerguide.html" title="Developer guide">Developer guide</a>
-            </li>
-                  <li class="none">
-                          <a href="source-repository.html" title="Source Repository">Source Repository</a>
-            </li>
-                  <li class="none">
-                          <a href="apidocs/index.html" title="Javadoc (SVN latest)">Javadoc (SVN latest)</a>
-            </li>
-          </ul>
-                       <h5>Project Documentation</h5>
-                  <ul>
-                                                                                                                                                                                                                                                                          <li class="collapsed">
-                          <a href="project-info.html" title="Project Information">Project Information</a>
-                  </li>
-                                                                                                                                                                                                                                                                                                                                                            <li class="expanded">
-                          <a href="project-reports.html" title="Project Reports">Project Reports</a>
-                    <ul>
-                      <li class="none">
-                          <a href="changes-report.html" title="Changes Report">Changes Report</a>
-            </li>
-                      <li class="none">
-                          <a href="checkstyle.html" title="Checkstyle">Checkstyle</a>
-            </li>
-                      <li class="none">
-            <strong>Clirr</strong>
-          </li>
-                      <li class="none">
-                          <a href="cobertura/index.html" title="Cobertura Test Coverage">Cobertura Test Coverage</a>
-            </li>
-                      <li class="none">
-                          <a href="cpd.html" title="CPD Report">CPD Report</a>
-            </li>
-                      <li class="none">
-                          <a href="findbugs.html" title="FindBugs Report">FindBugs Report</a>
-            </li>
-                      <li class="none">
-                          <a href="apidocs/index.html" title="JavaDocs">JavaDocs</a>
-            </li>
-                      <li class="none">
-                          <a href="javancss.html" title="JavaNCSS Report">JavaNCSS Report</a>
-            </li>
-                      <li class="none">
-                          <a href="jdepend-report.html" title="JDepend">JDepend</a>
-            </li>
-                      <li class="none">
-                          <a href="pmd.html" title="PMD Report">PMD Report</a>
-            </li>
-                      <li class="none">
-                          <a href="rat-report.html" title="RAT Report">RAT Report</a>
-            </li>
-                      <li class="none">
-                          <a href="xref/index.html" title="Source Xref">Source Xref</a>
-            </li>
-                      <li class="none">
-                          <a href="surefire-report.html" title="Surefire Report">Surefire Report</a>
-            </li>
-                      <li class="none">
-                          <a href="taglist.html" title="Tag List">Tag List</a>
-            </li>
-                      <li class="none">
-                          <a href="testapidocs/index.html" title="Test JavaDocs">Test JavaDocs</a>
-            </li>
-                      <li class="none">
-                          <a href="xref-test/index.html" title="Test Source Xref">Test Source Xref</a>
-            </li>
-              </ul>
-        </li>
-          </ul>
-                       <h5>Commons</h5>
-                  <ul>
-                  <li class="none">
-                          <a href="../" title="Home">Home</a>
-            </li>
-                  <li class="none">
-                          <a href="http://www.apache.org/licenses/" class="externalLink" title="License">License</a>
-            </li>
-                                                                    <li class="collapsed">
-                          <a href="../components.html" title="Components">Components</a>
-                  </li>
-                                                                    <li class="collapsed">
-                          <a href="../sandbox/index.html" title="Sandbox">Sandbox</a>
-                  </li>
-                                                                    <li class="collapsed">
-                          <a href="../dormant/index.html" title="Dormant">Dormant</a>
-                  </li>
-          </ul>
-                       <h5>General Information</h5>
-                  <ul>
-                  <li class="none">
-                          <a href="../volunteering.html" title="Volunteering">Volunteering</a>
-            </li>
-                  <li class="none">
-                          <a href="../patches.html" title="Contributing Patches">Contributing Patches</a>
-            </li>
-                  <li class="none">
-                          <a href="../building.html" title="Building Components">Building Components</a>
-            </li>
-                  <li class="none">
-                          <a href="../releases/index.html" title="Releasing Components">Releasing Components</a>
-            </li>
-                  <li class="none">
-                          <a href="http://wiki.apache.org/commons/FrontPage" class="externalLink" title="Wiki">Wiki</a>
-            </li>
-          </ul>
-                       <h5>ASF</h5>
-                  <ul>
-                  <li class="none">
-                          <a href="http://www.apache.org/foundation/how-it-works.html" class="externalLink" title="How the ASF works">How the ASF works</a>
-            </li>
-                  <li class="none">
-                          <a href="http://www.apache.org/foundation/getinvolved.html" class="externalLink" title="Get Involved">Get Involved</a>
-            </li>
-                  <li class="none">
-                          <a href="http://www.apache.org/dev/" class="externalLink" title="Developer Resources">Developer Resources</a>
-            </li>
-                  <li class="none">
-                          <a href="http://www.apache.org/foundation/sponsorship.html" class="externalLink" title="Sponsorship">Sponsorship</a>
-            </li>
-                  <li class="none">
-                          <a href="http://www.apache.org/foundation/thanks.html" class="externalLink" title="Thanks">Thanks</a>
-            </li>
-          </ul>
-                                                                                                                   <a href="http://www.apache.org/events/current-event.html" title="ApacheCon" class="poweredBy">
-        <img class="poweredBy"  alt="ApacheCon" src="http://www.apache.org/events/current-event-125x125.png"    />
-      </a>
-                                                                                                    <a href="http://maven.apache.org/" title="Maven" class="poweredBy">
-        <img class="poweredBy"  alt="Maven" src="http://maven.apache.org/images/logos/maven-feather.png"    />
-      </a>
-                       
-                
-            </div>
-    </div>
-    <div id="bodyColumn">
-      <div id="contentBox">
-        <div class="section"><h2>Clirr Results<a name="Clirr_Results"></a></h2><p>The following document contains the results of <a class="externalLink" href="http://clirr.sourceforge.net/">Clirr</a>.</p><ul><li>Current Version: 3.0</li><li>Comparison Version: (2.6,3.0)</li></ul><div class="section"><h2>Summary<a name="Summary"></a></h2><table border="0" class="bodyTable"><tr class="a"><th>Severity</th><th>Number</th></tr><tr class="b"><td><img alt="Error" src="images/icon_error_sml.gif" />&#160;Error</td><td>268</td></tr><tr class="a"><td><img alt="Warning" src="images/icon_warning_sml.gif" />&#160;Warning</td><td>0</td></tr><tr class="b"><td><img alt="Info" src="images/icon_info_sml.gif" />&#160;Info</td><td>146</td></tr></table></div><div class="section"><h2>Details<a name="Details"></a></h2><table border="0" class="bodyTable"><tr class="a"><th>Severity</th><th>Message</th><th>Class</th><th>Method / Field</th></tr><tr class="b"><td><img alt="Error" src="images/icon_error_sml.gif" /></td><td>Method 'public java.lang.Boolean toBooleanObject(boolean)' has been removed</td><td><a href="./xref/org/apache/commons/lang/BooleanUtils.html">org.apache.commons.lang.BooleanUtils</a></td><td>public java.lang.Boolean toBooleanObject(boolean)</td></tr><tr class="a"><td><img alt="Error" src="images/icon_error_sml.gif" /></td><td>Decreased visibility of class from public to package</td><td><a href="./xref/org/apache/commons/lang/CharRange.html">org.apache.commons.lang.CharRange</a></td><td></td></tr><tr class="b"><td><img alt="Error" src="images/icon_error_sml.gif" /></td><td>Method 'protected CharSet(java.lang.String)' has been removed</td><td><a href="./xref/org/apache/commons/lang/CharSet.html">org.apache.commons.lang.CharSet</a></td><td>protected CharSet(java.lang.String)</td></tr><tr class="a"><td><img alt="Error" src="images/icon_error_sml.gif" /></td><td>Accessibility of method 'public org.apache.commons.lang.CharRange[] getCharRanges()' has been decreased from public to package</td><td><a href="./xref/org/apache/commons/lang/CharSet.html">org.apache.commons.lang.CharSet</a></td><td>public org.apache.commons.lang.CharRange[] getCharRanges()</td></tr><tr class="b"><td><img alt="Error" src="images/icon_error_sml.gif" /></td><td>Method 'public org.apache.commons.lang.CharSet getInstance(java.lang.String)' has been removed</td><td><a href="./xref/org/apache/commons/lang/CharSet.html">org.apache.commons.lang.CharSet</a></td><td>public org.apache.commons.lang.CharSet getInstance(java.lang.String)</td></tr><tr class="a"><td><img alt="Error" src="images/icon_error_sml.gif" /></td><td>Method 'public int count(java.lang.String, java.lang.String)' has been removed</td><td><a href="./xref/org/apache/commons/lang/CharSetUtils.html">org.apache.commons.lang.CharSetUtils</a></td><td>public int count(java.lang.String, java.lang.String)</td></tr><tr class="b"><td><img alt="Error" src="images/icon_error_sml.gif" /></td><td>Method 'public java.lang.String delete(java.lang.String, java.lang.String)' has been removed</td><td><a href="./xref/org/apache/commons/lang/CharSetUtils.html">org.apache.commons.lang.CharSetUtils</a></td><td>public java.lang.String delete(java.lang.String, java.lang.String)</td></tr><tr class="a"><td><img alt="Error" src="images/icon_error_sml.gif" /></td><td>Method 'public org.apache.commons.lang.CharSet evaluateSet(java.lang.String[])' has been removed</td><td><a href="./xref/org/apache/commons/lang/CharSetUtils.html">org.apache.commons.lang.CharSetUtils</a></td><td>public org.apache.commons.lang.CharSet evaluateSet(java.lang.String[])</td></tr><tr class="b"><td><img alt="Error" src="images/icon_error_sml.gif" /></td><td>Method 'public java.lang.String keep(java.lang.String, java.lang.String)' has been removed</td><td><a href="./xref/org/apache/commons/lang/CharSetUtils.html">org.apache.commons.lang.CharSetUtils</a></td><td>public java.lang.String keep(java.lang.String, java.lang.String)</td></tr><tr class="a"><td><img alt="Error" src="images/icon_error_sml.gif" /></td><td>Method 'public java.lang.String squeeze(java.lang.String, java.lang.String)' has been removed</td><td><a href="./xref/org/apache/commons/lang/CharSetUtils.html">org.apache.commons.lang.CharSetUtils</a></td><td>public java.lang.String squeeze(java.lang.String, java.lang.String)</td></tr><tr class="b"><td><img alt="Error" src="images/icon_error_sml.gif" /></td><td>Method 'public java.lang.String translate(java.lang.String, java.lang.String, java.lang.String)' has been removed</td><td><a href="./xref/org/apache/commons/lang/CharSetUtils.html">org.apache.commons.lang.CharSetUtils</a></td><td>public java.lang.String translate(java.lang.String, java.lang.String, java.lang.String)</td></tr><tr class="a"><td><img alt="Error" src="images/icon_error_sml.gif" /></td><td>Class org.apache.commons.lang.IllegalClassException removed</td><td><a href="./xref/org/apache/commons/lang/IllegalClassException.html">org.apache.commons.lang.IllegalClassException</a></td><td></td></tr><tr class="b"><td><img alt="Error" src="images/icon_error_sml.gif" /></td><td>Class org.apache.commons.lang.IncompleteArgumentException removed</td><td><a href="./xref/org/apache/commons/lang/IncompleteArgumentException.html">org.apache.commons.lang.IncompleteArgumentException</a></td><td></td></tr><tr class="a"><td><img alt="Error" src="images/icon_error_sml.gif" /></td><td>Class org.apache.commons.lang.NotImplementedException removed</td><td><a href="./xref/org/apache/commons/lang/NotImplementedException.html">org.apache.commons.lang.NotImplementedException</a></td><td></td></tr><tr class="b"><td><img alt="Error" src="images/icon_error_sml.gif" /></td><td>Class org.apache.commons.lang.NullArgumentException removed</td><td><a href="./xref/org/apache/commons/lang/NullArgumentException.html">org.apache.commons.lang.NullArgumentException</a></td><td></td></tr><tr class="a"><td><img alt="Error" src="images/icon_error_sml.gif" /></td><td>Class org.apache.commons.lang.NumberRange removed</td><td><a href="./xref/org/apache/commons/lang/NumberRange.html">org.apache.commons.lang.NumberRange</a></td><td></td></tr><tr class="b"><td><img alt="Error" src="images/icon_error_sml.gif" /></td><td>Class org.apache.commons.lang.NumberUtils removed</td><td><a href="./xref/org/apache/commons/lang/NumberUtils.html">org.apache.commons.lang.NumberUtils</a></td><td></td></tr><tr class="a"><td><img alt="Error" src="images/icon_error_sml.gif" /></td><td>Method 'public java.lang.StringBuffer appendIdentityToString(java.lang.StringBuffer, java.lang.Object)' has been removed</td><td><a href="./xref/org/apache/commons/lang/ObjectUtils.html">org.apache.commons.lang.ObjectUtils</a></td><td>public java.lang.StringBuffer appendIdentityToString(java.lang.StringBuffer, java.lang.Object)</td></tr><tr class="b"><td><img alt="Error" src="images/icon_error_sml.gif" /></td><td>In method 'public java.lang.Object max(java.lang.Comparable, java.lang.Comparable)' the number of arguments has changed</td><td><a href="./xref/org/apache/commons/lang/ObjectUtils.html">org.apache.commons.lang.ObjectUtils</a></td><td>public java.lang.Object max(java.lang.Comparable, java.lang.Comparable)</td></tr><tr class="a"><td><img alt="Error" src="images/icon_error_sml.gif" /></td><td>Return type of method 'public java.lang.Object max(java.lang.Comparable, java.lang.Comparable)' has been changed to java.lang.Comparable</td><td><a href="./xref/org/apache/commons/lang/ObjectUtils.html">org.apache.commons.lang.ObjectUtils</a></td><td>public java.lang.Object max(java.lang.Comparable, java.lang.Comparable)</td></tr><tr class="b"><td><img alt="Error" src="images/icon_error_sml.gif" /></td><td>In method 'public java.lang.Object min(java.lang.Comparable, java.lang.Comparable)' the number of arguments has changed</td><td><a href="./xref/org/apache/commons/lang/ObjectUtils.html">org.apache.commons.lang.ObjectUtils</a></td><td>public java.lang.Object min(java.lang.Comparable, java.lang.Comparable)</td></tr><tr class="a"><td><img alt="Error" src="images/icon_error_sml.gif" /></td><td>Return type of method 'public java.lang.Object min(java.lang.Comparable, java.lang.Comparable)' has been changed to java.lang.Comparable</td><td><a href="./xref/org/apache/commons/lang/ObjectUtils.html">org.apache.commons.lang.ObjectUtils</a></td><td>public java.lang.Object min(java.lang.Comparable, java.lang.Comparable)</td></tr><tr class="b"><td><img alt="Error" src="images/icon_error_sml.gif" /></td><td>Removed org.apache.commons.lang.exception.Nestable from the set of implemented interfaces</td><td><a href="./xref/org/apache/commons/lang/SerializationException.html">org.apache.commons.lang.SerializationException</a></td><td></td></tr><tr class="a"><td><img alt="Error" src="images/icon_error_sml.gif" /></td><td>Removed org.apache.commons.lang.exception.NestableRuntimeException from the list of superclasses</td><td><a href="./xref/org/apache/commons/lang/SerializationException.html">org.apache.commons.lang.SerializationException</a></td><td></td></tr><tr class="b"><td><img alt="Error" src="images/icon_error_sml.gif" /></td><td>Return type of method 'public java.lang.Object clone(java.io.Serializable)' has been changed to java.io.Serializable</td><td><a href="./xref/org/apache/commons/lang/SerializationUtils.html">org.apache.commons.lang.SerializationUtils</a></td><td>public java.lang.Object clone(java.io.Serializable)</td></tr><tr class="a"><td><img alt="Error" src="images/icon_error_sml.gif" /></td><td>Method 'public java.lang.String escapeCsv(java.lang.String)' is now final</td><td><a href="./xref/org/apache/commons/lang/StringEscapeUtils.html">org.apache.commons.lang.StringEscapeUtils</a></td><td>public java.lang.String escapeCsv(java.lang.String)</td></tr><tr class="b"><td><img alt="Error" src="images/icon_error_sml.gif" /></td><td>Method 'public void escapeCsv(java.io.Writer, java.lang.String)' has been removed</td><td><a href="./xref/org/apache/commons/lang/StringEscapeUtils.html">org.apache.commons.lang.StringEscapeUtils</a></td><td>public void escapeCsv(java.io.Writer, java.lang.String)</td></tr><tr class="a"><td><img alt="Error" src="images/icon_error_sml.gif" /></td><td>Method 'public java.lang.String escapeHtml(java.lang.String)' has been removed</td><td><a href="./xref/org/apache/commons/lang/StringEscapeUtils.html">org.apache.commons.lang.StringEscapeUtils</a></td><td>public java.lang.String escapeHtml(java.lang.String)</td></tr><tr class="b"><td><img alt="Error" src="images/icon_error_sml.gif" /></td><td>Method 'public void escapeHtml(java.io.Writer, java.lang.String)' has been removed</td><td><a href="./xref/org/apache/commons/lang/StringEscapeUtils.html">org.apache.commons.lang.StringEscapeUtils</a></td><td>public void escapeHtml(java.io.Writer, java.lang.String)</td></tr><tr class="a"><td><img alt="Error" src="images/icon_error_sml.gif" /></td><td>Method 'public java.lang.String escapeJava(java.lang.String)' is now final</td><td><a href="./xref/org/apache/commons/lang/StringEscapeUtils.html">org.apache.commons.lang.StringEscapeUtils</a></td><td>public java.lang.String escapeJava(java.lang.String)</td></tr><tr class="b"><td><img alt="Error" src="images/icon_error_sml.gif" /></td><td>Method 'public void escapeJava(java.io.Writer, java.lang.String)' has been removed</td><td><a href="./xref/org/apache/commons/lang/StringEscapeUtils.html">org.apache.commons.lang.StringEscapeUtils</a></td><td>public void escapeJava(java.io.Writer, java.lang.String)</td></tr><tr class="a"><td><img alt="Error" src="images/icon_error_sml.gif" /></td><td>Method 'public java.lang.String escapeJavaScript(java.lang.String)' has been removed</td><td><a href="./xref/org/apache/commons/lang/StringEscapeUtils.html">org.apache.commons.lang.StringEscapeUtils</a></td><td>public java.lang.String escapeJavaScript(java.lang.String)</td></tr><tr class="b"><td><img alt="Error" src="images/icon_error_sml.gif" /></td><td>Method 'public void escapeJavaScript(java.io.Writer, java.lang.String)' has been removed</td><td><a href="./xref/org/apache/commons/lang/StringEscapeUtils.html">org.apache.commons.lang.StringEscapeUtils</a></td><td>public void escapeJavaScript(java.io.Writer, java.lang.String)</td></tr><tr class="a"><td><img alt="Error" src="images/icon_error_sml.gif" /></td><td>Method 'public java.lang.String escapeSql(java.lang.String)' has been removed</td><td><a href="./xref/org/apache/commons/lang/StringEscapeUtils.html">org.apache.commons.lang.StringEscapeUtils</a></td><td>public java.lang.String escapeSql(java.lang.String)</td></tr><tr class="b"><td><img alt="Error" src="images/icon_error_sml.gif" /></td><td>Method 'public java.lang.String escapeXml(java.lang.String)' is now final</td><td><a href="./xref/org/apache/commons/lang/StringEscapeUtils.html">org.apache.commons.lang.StringEscapeUtils</a></td><td>public java.lang.String escapeXml(java.lang.String)</td></tr><tr class="a"><td><img alt="Error" src="images/icon_error_sml.gif" /></td><td>Method 'public void escapeXml(java.io.Writer, java.lang.String)' has been removed</td><td><a href="./xref/org/apache/commons/lang/StringEscapeUtils.html">org.apache.commons.lang.StringEscapeUtils</a></td><td>public void escapeXml(java.io.Writer, java.lang.String)</td></tr><tr class="b"><td><img alt="Error" src="images/icon_error_sml.gif" /></td><td>Method 'public java.lang.String unescapeCsv(java.lang.String)' is now final</td><td><a href="./xref/org/apache/commons/lang/StringEscapeUtils.html">org.apache.commons.lang.StringEscapeUtils</a></td><td>public java.lang.String unescapeCsv(java.lang.String)</td></tr><tr class="a"><td><img alt="Error" src="images/icon_error_sml.gif" /></td><td>Method 'public void unescapeCsv(java.io.Writer, java.lang.String)' has been removed</td><td><a href="./xref/org/apache/commons/lang/StringEscapeUtils.html">org.apache.commons.lang.StringEscapeUtils</a></td><td>public void unescapeCsv(java.io.Writer, java.lang.String)</td></tr><tr class="b"><td><img alt="Error" src="images/icon_error_sml.gif" /></td><td>Method 'public java.lang.String unescapeHtml(java.lang.String)' has been removed</td><td><a href="./xref/org/apache/commons/lang/StringEscapeUtils.html">org.apache.commons.lang.StringEscapeUtils</a></td><td>public java.lang.String unescapeHtml(java.lang.String)</td></tr><tr class="a"><td><img alt="Error" src="images/icon_error_sml.gif" /></td><td>Method 'public void unescapeHtml(java.io.Writer, java.lang.String)' has been removed</td><td><a href="./xref/org/apache/commons/lang/StringEscapeUtils.html">org.apache.commons.lang.StringEscapeUtils</a></td><td>public void unescapeHtml(java.io.Writer, java.lang.String)</td></tr><tr class="b"><td><img alt="Error" src="images/icon_error_sml.gif" /></td><td>Method 'public java.lang.String unescapeJava(java.lang.String)' is now final</td><td><a href="./xref/org/apache/commons/lang/StringEscapeUtils.html">org.apache.commons.lang.StringEscapeUtils</a></td><td>public java.lang.String unescapeJava(java.lang.String)</td></tr><tr class="a"><td><img alt="Error" src="images/icon_error_sml.gif" /></td><td>Method 'public void unescapeJava(java.io.Writer, java.lang.String)' has been removed</td><td><a href="./xref/org/apache/commons/lang/StringEscapeUtils.html">org.apache.commons.lang.StringEscapeUtils</a></td><td>public void unescapeJava(java.io.Writer, java.lang.String)</td></tr><tr class="b"><td><img alt="Error" src="images/icon_error_sml.gif" /></td><td>Method 'public java.lang.String unescapeJavaScript(java.lang.String)' has been removed</td><td><a href="./xref/org/apache/commons/lang/StringEscapeUtils.html">org.apache.commons.lang.StringEscapeUtils</a></td><td>public java.lang.String unescapeJavaScript(java.lang.String)</td></tr><tr class="a"><td><img alt="Error" src="images/icon_error_sml.gif" /></td><td>Method 'public void unescapeJavaScript(java.io.Writer, java.lang.String)' has been removed</td><td><a href="./xref/org/apache/commons/lang/StringEscapeUtils.html">org.apache.commons.lang.StringEscapeUtils</a></td><td>public void unescapeJavaScript(java.io.Writer, java.lang.String)</td></tr><tr class="b"><td><img alt="Error" src="images/icon_error_sml.gif" /></td><td>Method 'public java.lang.String unescapeXml(java.lang.String)' is now final</td><td><a href="./xref/org/apache/commons/lang/StringEscapeUtils.html">org.apache.commons.lang.StringEscapeUtils</a></td><td>public java.lang.String unescapeXml(java.lang.String)</td></tr><tr class="a"><td><img alt="Error" src="images/icon_error_sml.gif" /></td><td>Method 'public void unescapeXml(java.io.Writer, java.lang.String)' has been removed</td><td><a href="./xref/org/apache/commons/lang/StringEscapeUtils.html">org.apache.commons.lang.StringEscapeUtils</a></td><td>public void unescapeXml(java.io.Writer, java.lang.String)</td></tr><tr class="b"><td><img alt="Error" src="images/icon_error_sml.gif" /></td><td>Method 'public java.lang.String capitalise(java.lang.String)' has been removed</td><td><a href="./xref/org/apache/commons/lang/StringUtils.html">org.apache.commons.lang.StringUtils</a></td><td>public java.lang.String capitalise(java.lang.String)</td></tr><tr class="a"><td><img alt="Error" src="images/icon_error_sml.gif" /></td><td>Method 'public java.lang.String capitaliseAllWords(java.lang.String)' has been removed</td><td><a href="./xref/org/apache/commons/lang/StringUtils.html">org.apache.commons.lang.StringUtils</a></td><td>public java.lang.String capitaliseAllWords(java.lang.String)</td></tr><tr class="b"><td><img alt="Error" src="images/icon_error_sml.gif" /></td><td>Method 'public java.lang.String chompLast(java.lang.String)' has been removed</td><td><a href="./xref/org/apache/commons/lang/StringUtils.html">org.apache.commons.lang.StringUtils</a></td><td>public java.lang.String chompLast(java.lang.String)</td></tr><tr class="a"><td><img alt="Error" src="images/icon_error_sml.gif" /></td><td>Method 'public java.lang.String chompLast(java.lang.String, java.lang.String)' has been removed</td><td><a href="./xref/org/apache/commons/lang/StringUtils.html">org.apache.commons.lang.StringUtils</a></td><td>public java.lang.String chompLast(java.lang.String, java.lang.String)</td></tr><tr class="b"><td><img alt="Error" src="images/icon_error_sml.gif" /></td><td>Method 'public java.lang.String chopNewline(java.lang.String)' has been removed</td><td><a href="./xref/org/apache/commons/lang/StringUtils.html">org.apache.commons.lang.StringUtils</a></td><td>public java.lang.String chopNewline(java.lang.String)</td></tr><tr class="a"><td><img alt="Error" src="images/icon_error_sml.gif" /></td><td>Method 'public java.lang.String clean(java.lang.String)' has been removed</td><td><a href="./xref/org/apache/commons/lang/StringUtils.html">org.apache.commons.lang.StringUtils</a></td><td>public java.lang.String clean(java.lang.String)</td></tr><tr class="b"><td><img alt="Error" src="images/icon_error_sml.gif" /></td><td>Method 'public java.lang.String concatenate(java.lang.Object[])' has been removed</td><td><a href="./xref/org/apache/commons/lang/StringUtils.html">org.apache.commons.lang.StringUtils</a></td><td>public java.lang.String concatenate(java.lang.Object[])</td></tr><tr class="a"><td><img alt="Error" src="images/icon_error_sml.gif" /></td><td>Parameter 1 of 'public boolean contains(java.lang.String, char)' has changed its type to java.lang.CharSequence</td><td><a href="./xref/org/apache/commons/lang/StringUtils.html">org.apache.commons.lang.StringUtils</a></td><td>public boolean contains(java.lang.String, char)</td></tr><tr class="b"><td><img alt="Error" src="images/icon_error_sml.gif" /></td><td>Parameter 2 of 'public boolean contains(java.lang.String, char)' has changed its type to int</td><td><a href="./xref/org/apache/commons/lang/StringUtils.html">org.apache.commons.lang.StringUtils</a></td><td>public boolean contains(java.lang.String, char)</td></tr><tr class="a"><td><img alt="Error" src="images/icon_error_sml.gif" /></td><td>Parameter 1 of 'public boolean contains(java.lang.String, java.lang.String)' has changed its type to java.lang.CharSequence</td><td><a href="./xref/org/apache/commons/lang/StringUtils.html">org.apache.commons.lang.StringUtils</a></td><td>public boolean contains(java.lang.String, java.lang.String)</td></tr><tr class="b"><td><img alt="Error" src="images/icon_error_sml.gif" /></td><td>Parameter 2 of 'public boolean contains(java.lang.String, java.lang.String)' has changed its type to java.lang.CharSequence</td><td><a href="./xref/org/apache/commons/lang/StringUtils.html">org.apache.commons.lang.StringUtils</a></td><td>public boolean contains(java.lang.String, java.lang.String)</td></tr><tr class="a"><td><img alt="Error" src="images/icon_error_sml.gif" /></td><td>Parameter 1 of 'public boolean containsAny(java.lang.String, char[])' has changed its type to java.lang.CharSequence</td><td><a href="./xref/org/apache/commons/lang/StringUtils.html">org.apache.commons.lang.StringUtils</a></td><td>public boolean containsAny(java.lang.String, char[])</td></tr><tr class="b"><td><img alt="Error" src="images/icon_error_sml.gif" /></td><td>Parameter 1 of 'public boolean containsAny(java.lang.String, java.lang.String)' has changed its type to java.lang.CharSequence</td><td><a href="./xref/org/apache/commons/lang/StringUtils.html">org.apache.commons.lang.StringUtils</a></td><td>public boolean containsAny(java.lang.String, java.lang.String)</td></tr><tr class="a"><td><img alt="Error" src="images/icon_error_sml.gif" /></td><td>Parameter 2 of 'public boolean containsAny(java.lang.String, java.lang.String)' has changed its type to java.lang.CharSequence</td><td><a href="./xref/org/apache/commons/lang/StringUtils.html">org.apache.commons.lang.StringUtils</a></td><td>public boolean containsAny(java.lang.String, java.lang.String)</td></tr><tr class="b"><td><img alt="Error" src="images/icon_error_sml.gif" /></td><td>Parameter 1 of 'public boolean containsIgnoreCase(java.lang.String, java.lang.String)' has changed its type to java.lang.CharSequence</td><td><a href="./xref/org/apache/commons/lang/StringUtils.html">org.apache.commons.lang.StringUtils</a></td><td>public boolean containsIgnoreCase(java.lang.String, java.lang.String)</td></tr><tr class="a"><td><img alt="Error" src="images/icon_error_sml.gif" /></td><td>Parameter 2 of 'public boolean containsIgnoreCase(java.lang.String, java.lang.String)' has changed its type to java.lang.CharSequence</td><td><a href="./xref/org/apache/commons/lang/StringUtils.html">org.apache.commons.lang.StringUtils</a></td><td>public boolean containsIgnoreCase(java.lang.String, java.lang.String)</td></tr><tr class="b"><td><img alt="Error" src="images/icon_error_sml.gif" /></td><td>Parameter 1 of 'public boolean containsNone(java.lang.String, char[])' has changed its type to java.lang.CharSequence</td><td><a href="./xref/org/apache/commons/lang/StringUtils.html">org.apache.commons.lang.StringUtils</a></td><td>public boolean containsNone(java.lang.String, char[])</td></tr><tr class="a"><td><img alt="Error" src="images/icon_error_sml.gif" /></td><td>Parameter 1 of 'public boolean containsNone(java.lang.String, java.lang.String)' has changed its type to java.lang.CharSequence</td><td><a href="./xref/org/apache/commons/lang/StringUtils.html">org.apache.commons.lang.StringUtils</a></td><td>public boolean containsNone(java.lang.String, java.lang.String)</td></tr><tr class="b"><td><img alt="Error" src="images/icon_error_sml.gif" /></td><td>Parameter 1 of 'public boolean containsOnly(java.lang.String, char[])' has changed its type to java.lang.CharSequence</td><td><a href="./xref/org/apache/commons/lang/StringUtils.html">org.apache.commons.lang.StringUtils</a></td><td>public boolean containsOnly(java.lang.String, char[])</td></tr><tr class="a"><td><img alt="Error" src="images/icon_error_sml.gif" /></td><td>Parameter 1 of 'public boolean containsOnly(java.lang.String, java.lang.String)' has changed its type to java.lang.CharSequence</td><td><a href="./xref/org/apache/commons/lang/StringUtils.html">org.apache.commons.lang.StringUtils</a></td><td>public boolean containsOnly(java.lang.String, java.lang.String)</td></tr><tr class="b"><td><img alt="Error" src="images/icon_error_sml.gif" /></td><td>Parameter 1 of 'public int countMatches(java.lang.String, java.lang.String)' has changed its type to java.lang.CharSequence</td><td><a href="./xref/org/apache/commons/lang/StringUtils.html">org.apache.commons.lang.StringUtils</a></td><td>public int countMatches(java.lang.String, java.lang.String)</td></tr><tr class="a"><td><img alt="Error" src="images/icon_error_sml.gif" /></td><td>Parameter 2 of 'public int countMatches(java.lang.String, java.lang.String)' has changed its type to java.lang.CharSequence</td><td><a href="./xref/org/apache/commons/lang/StringUtils.html">org.apache.commons.lang.StringUtils</a></td><td>public int countMatches(java.lang.String, java.lang.String)</td></tr><tr class="b"><td><img alt="Error" src="images/icon_error_sml.gif" /></td><td>Parameter 1 of 'public java.lang.String defaultIfBlank(java.lang.String, java.lang.String)' has changed its type to java.lang.CharSequence</td><td><a href="./xref/org/apache/commons/lang/StringUtils.html">org.apache.commons.lang.StringUtils</a></td><td>public java.lang.String defaultIfBlank(java.lang.String, java.lang.String)</td></tr><tr class="a"><td><img alt="Error" src="images/icon_error_sml.gif" /></td><td>Parameter 2 of 'public java.lang.String defaultIfBlank(java.lang.String, java.lang.String)' has changed its type to java.lang.CharSequence</td><td><a href="./xref/org/apache/commons/lang/StringUtils.html">org.apache.commons.lang.StringUtils</a></td><td>public java.lang.String defaultIfBlank(java.lang.String, java.lang.String)</td></tr><tr class="b"><td><img alt="Error" src="images/icon_error_sml.gif" /></td><td>Return type of method 'public java.lang.String defaultIfBlank(java.lang.String, java.lang.String)' has been changed to java.lang.CharSequence</td><td><a href="./xref/org/apache/commons/lang/StringUtils.html">org.apache.commons.lang.StringUtils</a></td><td>public java.lang.String defaultIfBlank(java.lang.String, java.lang.String)</td></tr><tr class="a"><td><img alt="Error" src="images/icon_error_sml.gif" /></td><td>Parameter 1 of 'public java.lang.String defaultIfEmpty(java.lang.String, java.lang.String)' has changed its type to java.lang.CharSequence</td><td><a href="./xref/org/apache/commons/lang/StringUtils.html">org.apache.commons.lang.StringUtils</a></td><td>public java.lang.String defaultIfEmpty(java.lang.String, java.lang.String)</td></tr><tr class="b"><td><img alt="Error" src="images/icon_error_sml.gif" /></td><td>Parameter 2 of 'public java.lang.String defaultIfEmpty(java.lang.String, java.lang.String)' has changed its type to java.lang.CharSequence</td><td><a href="./xref/org/apache/commons/lang/StringUtils.html">org.apache.commons.lang.StringUtils</a></td><td>public java.lang.String defaultIfEmpty(java.lang.String, java.lang.String)</td></tr><tr class="a"><td><img alt="Error" src="images/icon_error_sml.gif" /></td><td>Return type of method 'public java.lang.String defaultIfEmpty(java.lang.String, java.lang.String)' has been changed to java.lang.CharSequence</td><td><a href="./xref/org/apache/commons/lang/StringUtils.html">org.apache.commons.lang.StringUtils</a></td><td>public java.lang.String defaultIfEmpty(java.lang.String, java.lang.String)</td></tr><tr class="b"><td><img alt="Error" src="images/icon_error_sml.gif" /></td><td>Method 'public java.lang.String deleteSpaces(java.lang.String)' has been removed</td><td><a href="./xref/org/apache/commons/lang/StringUtils.html">org.apache.commons.lang.StringUtils</a></td><td>public java.lang.String deleteSpaces(java.lang.String)</td></tr><tr class="a"><td><img alt="Error" src="images/icon_error_sml.gif" /></td><td>Parameter 1 of 'public boolean endsWith(java.lang.String, java.lang.String)' has changed its type to java.lang.CharSequence</td><td><a href="./xref/org/apache/commons/lang/StringUtils.html">org.apache.commons.lang.StringUtils</a></td><td>public boolean endsWith(java.lang.String, java.lang.String)</td></tr><tr class="b"><td><img alt="Error" src="images/icon_error_sml.gif" /></td><td>Parameter 2 of 'public boolean endsWith(java.lang.String, java.lang.String)' has changed its type to java.lang.CharSequence</td><td><a href="./xref/org/apache/commons/lang/StringUtils.html">org.apache.commons.lang.StringUtils</a></td><td>public boolean endsWith(java.lang.String, java.lang.String)</td></tr><tr class="a"><td><img alt="Error" src="images/icon_error_sml.gif" /></td><td>Parameter 1 of 'public boolean endsWithAny(java.lang.String, java.lang.String[])' has changed its type to java.lang.CharSequence</td><td><a href="./xref/org/apache/commons/lang/StringUtils.html">org.apache.commons.lang.StringUtils</a></td><td>public boolean endsWithAny(java.lang.String, java.lang.String[])</td></tr><tr class="b"><td><img alt="Error" src="images/icon_error_sml.gif" /></td><td>Parameter 2 of 'public boolean endsWithAny(java.lang.String, java.lang.String[])' has changed its type to java.lang.CharSequence[]</td><td><a href="./xref/org/apache/commons/lang/StringUtils.html">org.apache.commons.lang.StringUtils</a></td><td>public boolean endsWithAny(java.lang.String, java.lang.String[])</td></tr><tr class="a"><td><img alt="Error" src="images/icon_error_sml.gif" /></td><td>Parameter 1 of 'public boolean endsWithIgnoreCase(java.lang.String, java.lang.String)' has changed its type to java.lang.CharSequence</td><td><a href="./xref/org/apache/commons/lang/StringUtils.html">org.apache.commons.lang.StringUtils</a></td><td>public boolean endsWithIgnoreCase(java.lang.String, java.lang.String)</td></tr><tr class="b"><td><img alt="Error" src="images/icon_error_sml.gif" /></td><td>Parameter 2 of 'public boolean endsWithIgnoreCase(java.lang.String, java.lang.String)' has changed its type to java.lang.CharSequence</td><td><a href="./xref/org/apache/commons/lang/StringUtils.html">org.apache.commons.lang.StringUtils</a></td><td>public boolean endsWithIgnoreCase(java.lang.String, java.lang.String)</td></tr><tr class="a"><td><img alt="Error" src="images/icon_error_sml.gif" /></td><td>Parameter 1 of 'public boolean equals(java.lang.String, java.lang.String)' has changed its type to java.lang.CharSequence</td><td><a href="./xref/org/apache/commons/lang/StringUtils.html">org.apache.commons.lang.StringUtils</a></td><td>public boolean equals(java.lang.String, java.lang.String)</td></tr><tr class="b"><td><img alt="Error" src="images/icon_error_sml.gif" /></td><td>Parameter 2 of 'public boolean equals(java.lang.String, java.lang.String)' has changed its type to java.lang.CharSequence</td><td><a href="./xref/org/apache/commons/lang/StringUtils.html">org.apache.commons.lang.StringUtils</a></td><td>public boolean equals(java.lang.String, java.lang.String)</td></tr><tr class="a"><td><img alt="Error" src="images/icon_error_sml.gif" /></td><td>Parameter 1 of 'public boolean equalsIgnoreCase(java.lang.String, java.lang.String)' has changed its type to java.lang.CharSequence</td><td><a href="./xref/org/apache/commons/lang/StringUtils.html">org.apache.commons.lang.StringUtils</a></td><td>public boolean equalsIgnoreCase(java.lang.String, java.lang.String)</td></tr><tr class="b"><td><img alt="Error" src="images/icon_error_sml.gif" /></td><td>Parameter 2 of 'public boolean equalsIgnoreCase(java.lang.String, java.lang.String)' has changed its type to java.lang.CharSequence</td><td><a href="./xref/org/apache/commons/lang/StringUtils.html">org.apache.commons.lang.StringUtils</a></td><td>public boolean equalsIgnoreCase(java.lang.String, java.lang.String)</td></tr><tr class="a"><td><img alt="Error" src="images/icon_error_sml.gif" /></td><td>Method 'public java.lang.String escape(java.lang.String)' has been removed</td><td><a href="./xref/org/apache/commons/lang/StringUtils.html">org.apache.commons.lang.StringUtils</a></td><td>public java.lang.String escape(java.lang.String)</td></tr><tr class="b"><td><img alt="Error" src="images/icon_error_sml.gif" /></td><td>Method 'public java.lang.String getChomp(java.lang.String, java.lang.String)' has been removed</td><td><a href="./xref/org/apache/commons/lang/StringUtils.html">org.apache.commons.lang.StringUtils</a></td><td>public java.lang.String getChomp(java.lang.String, java.lang.String)</td></tr><tr class="a"><td><img alt="Error" src="images/icon_error_sml.gif" /></td><td>Parameter 1 of 'public int getLevenshteinDistance(java.lang.String, java.lang.String)' has changed its type to java.lang.CharSequence</td><td><a href="./xref/org/apache/commons/lang/StringUtils.html">org.apache.commons.lang.StringUtils</a></td><td>public int getLevenshteinDistance(java.lang.String, java.lang.String)</td></tr><tr class="b"><td><img alt="Error" src="images/icon_error_sml.gif" /></td><td>Parameter 2 of 'public int getLevenshteinDistance(java.lang.String, java.lang.String)' has changed its type to java.lang.CharSequence</td><td><a href="./xref/org/apache/commons/lang/StringUtils.html">org.apache.commons.lang.StringUtils</a></td><td>public int getLevenshteinDistance(java.lang.String, java.lang.String)</td></tr><tr class="a"><td><img alt="Error" src="images/icon_error_sml.gif" /></td><td>Method 'public java.lang.String getNestedString(java.lang.String, java.lang.String)' has been removed</td><td><a href="./xref/org/apache/commons/lang/StringUtils.html">org.apache.commons.lang.StringUtils</a></td><td>public java.lang.String getNestedString(java.lang.String, java.lang.String)</td></tr><tr class="b"><td><img alt="Error" src="images/icon_error_sml.gif" /></td><td>Method 'public java.lang.String getNestedString(java.lang.String, java.lang.String, java.lang.String)' has been removed</td><td><a href="./xref/org/apache/commons/lang/StringUtils.html">org.apache.commons.lang.StringUtils</a></td><td>public java.lang.String getNestedString(java.lang.String, java.lang.String, java.lang.String)</td></tr><tr class="a"><td><img alt="Error" src="images/icon_error_sml.gif" /></td><td>Method 'public java.lang.String getPrechomp(java.lang.String, java.lang.String)' has been removed</td><td><a href="./xref/org/apache/commons/lang/StringUtils.html">org.apache.commons.lang.StringUtils</a></td><td>public java.lang.String getPrechomp(java.lang.String, java.lang.String)</td></tr><tr class="b"><td><img alt="Error" src="images/icon_error_sml.gif" /></td><td>Parameter 1 of 'public int indexOf(java.lang.String, char)' has changed its type to java.lang.CharSequence</td><td><a href="./xref/org/apache/commons/lang/StringUtils.html">org.apache.commons.lang.StringUtils</a></td><td>public int indexOf(java.lang.String, char)</td></tr><tr class="a"><td><img alt="Error" src="images/icon_error_sml.gif" /></td><td>Parameter 2 of 'public int indexOf(java.lang.String, char)' has changed its type to int</td><td><a href="./xref/org/apache/commons/lang/StringUtils.html">org.apache.commons.lang.StringUtils</a></td><td>public int indexOf(java.lang.String, char)</td></tr><tr class="b"><td><img alt="Error" src="images/icon_error_sml.gif" /></td><td>Parameter 1 of 'public int indexOf(java.lang.String, char, int)' has changed its type to java.lang.CharSequence</td><td><a href="./xref/org/apache/commons/lang/StringUtils.html">org.apache.commons.lang.StringUtils</a></td><td>public int indexOf(java.lang.String, char, int)</td></tr><tr class="a"><td><img alt="Error" src="images/icon_error_sml.gif" /></td><td>Parameter 2 of 'public int indexOf(java.lang.String, char, int)' has changed its type to int</td><td><a href="./xref/org/apache/commons/lang/StringUtils.html">org.apache.commons.lang.StringUtils</a></td><td>public int indexOf(java.lang.String, char, int)</td></tr><tr class="b"><td><img alt="Error" src="images/icon_error_sml.gif" /></td><td>Parameter 1 of 'public int indexOf(java.lang.String, java.lang.String)' has changed its type to java.lang.CharSequence</td><td><a href="./xref/org/apache/commons/lang/StringUtils.html">org.apache.commons.lang.StringUtils</a></td><td>public int indexOf(java.lang.String, java.lang.String)</td></tr><tr class="a"><td><img alt="Error" src="images/icon_error_sml.gif" /></td><td>Parameter 2 of 'public int indexOf(java.lang.String, java.lang.String)' has changed its type to java.lang.CharSequence</td><td><a href="./xref/org/apache/commons/lang/StringUtils.html">org.apache.commons.lang.StringUtils</a></td><td>public int indexOf(java.lang.String, java.lang.String)</td></tr><tr class="b"><td><img alt="Error" src="images/icon_error_sml.gif" /></td><td>Parameter 1 of 'public int indexOf(java.lang.String, java.lang.String, int)' has changed its type to java.lang.CharSequence</td><td><a href="./xref/org/apache/commons/lang/StringUtils.html">org.apache.commons.lang.StringUtils</a></td><td>public int indexOf(java.lang.String, java.lang.String, int)</td></tr><tr class="a"><td><img alt="Error" src="images/icon_error_sml.gif" /></td><td>Parameter 2 of 'public int indexOf(java.lang.String, java.lang.String, int)' has changed its type to java.lang.CharSequence</td><td><a href="./xref/org/apache/commons/lang/StringUtils.html">org.apache.commons.lang.StringUtils</a></td><td>public int indexOf(java.lang.String, java.lang.String, int)</td></tr><tr class="b"><td><img alt="Error" src="images/icon_error_sml.gif" /></td><td>Parameter 1 of 'public int indexOfAny(java.lang.String, char[])' has changed its type to java.lang.CharSequence</td><td><a href="./xref/org/apache/commons/lang/StringUtils.html">org.apache.commons.lang.StringUtils</a></td><td>public int indexOfAny(java.lang.String, char[])</td></tr><tr class="a"><td><img alt="Error" src="images/icon_error_sml.gif" /></td><td>Parameter 1 of 'public int indexOfAny(java.lang.String, java.lang.String)' has changed its type to java.lang.CharSequence</td><td><a href="./xref/org/apache/commons/lang/StringUtils.html">org.apache.commons.lang.StringUtils</a></td><td>public int indexOfAny(java.lang.String, java.lang.String)</td></tr><tr class="b"><td><img alt="Error" src="images/icon_error_sml.gif" /></td><td>Parameter 1 of 'public int indexOfAny(java.lang.String, java.lang.String[])' has changed its type to java.lang.CharSequence</td><td><a href="./xref/org/apache/commons/lang/StringUtils.html">org.apache.commons.lang.StringUtils</a></td><td>public int indexOfAny(java.lang.String, java.lang.String[])</td></tr><tr class="a"><td><img alt="Error" src="images/icon_error_sml.gif" /></td><td>Parameter 2 of 'public int indexOfAny(java.lang.String, java.lang.String[])' has changed its type to java.lang.CharSequence[]</td><td><a href="./xref/org/apache/commons/lang/StringUtils.html">org.apache.commons.lang.StringUtils</a></td><td>public int indexOfAny(java.lang.String, java.lang.String[])</td></tr><tr class="b"><td><img alt="Error" src="images/icon_error_sml.gif" /></td><td>Parameter 1 of 'public int indexOfAnyBut(java.lang.String, char[])' has changed its type to java.lang.CharSequence</td><td><a href="./xref/org/apache/commons/lang/StringUtils.html">org.apache.commons.lang.StringUtils</a></td><td>public int indexOfAnyBut(java.lang.String, char[])</td></tr><tr class="a"><td><img alt="Error" src="images/icon_error_sml.gif" /></td><td>Parameter 1 of 'public int indexOfAnyBut(java.lang.String, java.lang.String)' has changed its type to java.lang.CharSequence</td><td><a href="./xref/org/apache/commons/lang/StringUtils.html">org.apache.commons.lang.StringUtils</a></td><td>public int indexOfAnyBut(java.lang.String, java.lang.String)</td></tr><tr class="b"><td><img alt="Error" src="images/icon_error_sml.gif" /></td><td>Parameter 2 of 'public int indexOfAnyBut(java.lang.String, java.lang.String)' has changed its type to java.lang.CharSequence</td><td><a href="./xref/org/apache/commons/lang/StringUtils.html">org.apache.commons.lang.StringUtils</a></td><td>public int indexOfAnyBut(java.lang.String, java.lang.String)</td></tr><tr class="a"><td><img alt="Error" src="images/icon_error_sml.gif" /></td><td>Parameter 1 of 'public int indexOfDifference(java.lang.String[])' has changed its type to java.lang.CharSequence[]</td><td><a href="./xref/org/apache/commons/lang/StringUtils.html">org.apache.commons.lang.StringUtils</a></td><td>public int indexOfDifference(java.lang.String[])</td></tr><tr class="b"><td><img alt="Error" src="images/icon_error_sml.gif" /></td><td>Parameter 1 of 'public int indexOfDifference(java.lang.String, java.lang.String)' has changed its type to java.lang.CharSequence</td><td><a href="./xref/org/apache/commons/lang/StringUtils.html">org.apache.commons.lang.StringUtils</a></td><td>public int indexOfDifference(java.lang.String, java.lang.String)</td></tr><tr class="a"><td><img alt="Error" src="images/icon_error_sml.gif" /></td><td>Parameter 2 of 'public int indexOfDifference(java.lang.String, java.lang.String)' has changed its type to java.lang.CharSequence</td><td><a href="./xref/org/apache/commons/lang/StringUtils.html">org.apache.commons.lang.StringUtils</a></td><td>public int indexOfDifference(java.lang.String, java.lang.String)</td></tr><tr class="b"><td><img alt="Error" src="images/icon_error_sml.gif" /></td><td>Parameter 1 of 'public int indexOfIgnoreCase(java.lang.String, java.lang.String)' has changed its type to java.lang.CharSequence</td><td><a href="./xref/org/apache/commons/lang/StringUtils.html">org.apache.commons.lang.StringUtils</a></td><td>public int indexOfIgnoreCase(java.lang.String, java.lang.String)</td></tr><tr class="a"><td><img alt="Error" src="images/icon_error_sml.gif" /></td><td>Parameter 2 of 'public int indexOfIgnoreCase(java.lang.String, java.lang.String)' has changed its type to java.lang.CharSequence</td><td><a href="./xref/org/apache/commons/lang/StringUtils.html">org.apache.commons.lang.StringUtils</a></td><td>public int indexOfIgnoreCase(java.lang.String, java.lang.String)</td></tr><tr class="b"><td><img alt="Error" src="images/icon_error_sml.gif" /></td><td>Parameter 1 of 'public int indexOfIgnoreCase(java.lang.String, java.lang.String, int)' has changed its type to java.lang.CharSequence</td><td><a href="./xref/org/apache/commons/lang/StringUtils.html">org.apache.commons.lang.StringUtils</a></td><td>public int indexOfIgnoreCase(java.lang.String, java.lang.String, int)</td></tr><tr class="a"><td><img alt="Error" src="images/icon_error_sml.gif" /></td><td>Parameter 2 of 'public int indexOfIgnoreCase(java.lang.String, java.lang.String, int)' has changed its type to java.lang.CharSequence</td><td><a href="./xref/org/apache/commons/lang/StringUtils.html">org.apache.commons.lang.StringUtils</a></td><td>public int indexOfIgnoreCase(java.lang.String, java.lang.String, int)</td></tr><tr class="b"><td><img alt="Error" src="images/icon_error_sml.gif" /></td><td>Parameter 1 of 'public boolean isAllLowerCase(java.lang.String)' has changed its type to java.lang.CharSequence</td><td><a href="./xref/org/apache/commons/lang/StringUtils.html">org.apache.commons.lang.StringUtils</a></td><td>public boolean isAllLowerCase(java.lang.String)</td></tr><tr class="a"><td><img alt="Error" src="images/icon_error_sml.gif" /></td><td>Parameter 1 of 'public boolean isAllUpperCase(java.lang.String)' has changed its type to java.lang.CharSequence</td><td><a href="./xref/org/apache/commons/lang/StringUtils.html">org.apache.commons.lang.StringUtils</a></td><td>public boolean isAllUpperCase(java.lang.String)</td></tr><tr class="b"><td><img alt="Error" src="images/icon_error_sml.gif" /></td><td>Parameter 1 of 'public boolean isAlpha(java.lang.String)' has changed its type to java.lang.CharSequence</td><td><a href="./xref/org/apache/commons/lang/StringUtils.html">org.apache.commons.lang.StringUtils</a></td><td>public boolean isAlpha(java.lang.String)</td></tr><tr class="a"><td><img alt="Error" src="images/icon_error_sml.gif" /></td><td>Parameter 1 of 'public boolean isAlphaSpace(java.lang.String)' has changed its type to java.lang.CharSequence</td><td><a href="./xref/org/apache/commons/lang/StringUtils.html">org.apache.commons.lang.StringUtils</a></td><td>public boolean isAlphaSpace(java.lang.String)</td></tr><tr class="b"><td><img alt="Error" src="images/icon_error_sml.gif" /></td><td>Parameter 1 of 'public boolean isAlphanumeric(java.lang.String)' has changed its type to java.lang.CharSequence</td><td><a href="./xref/org/apache/commons/lang/StringUtils.html">org.apache.commons.lang.StringUtils</a></td><td>public boolean isAlphanumeric(java.lang.String)</td></tr><tr class="a"><td><img alt="Error" src="images/icon_error_sml.gif" /></td><td>Parameter 1 of 'public boolean isAlphanumericSpace(java.lang.String)' has changed its type to java.lang.CharSequence</td><td><a href="./xref/org/apache/commons/lang/StringUtils.html">org.apache.commons.lang.StringUtils</a></td><td>public boolean isAlphanumericSpace(java.lang.String)</td></tr><tr class="b"><td><img alt="Error" src="images/icon_error_sml.gif" /></td><td>Parameter 1 of 'public boolean isAsciiPrintable(java.lang.String)' has changed its type to java.lang.CharSequence</td><td><a href="./xref/org/apache/commons/lang/StringUtils.html">org.apache.commons.lang.StringUtils</a></td><td>public boolean isAsciiPrintable(java.lang.String)</td></tr><tr class="a"><td><img alt="Error" src="images/icon_error_sml.gif" /></td><td>Parameter 1 of 'public boolean isBlank(java.lang.String)' has changed its type to java.lang.CharSequence</td><td><a href="./xref/org/apache/commons/lang/StringUtils.html">org.apache.commons.lang.StringUtils</a></td><td>public boolean isBlank(java.lang.String)</td></tr><tr class="b"><td><img alt="Error" src="images/icon_error_sml.gif" /></td><td>Parameter 1 of 'public boolean isEmpty(java.lang.String)' has changed its type to java.lang.CharSequence</td><td><a href="./xref/org/apache/commons/lang/StringUtils.html">org.apache.commons.lang.StringUtils</a></td><td>public boolean isEmpty(java.lang.String)</td></tr><tr class="a"><td><img alt="Error" src="images/icon_error_sml.gif" /></td><td>Parameter 1 of 'public boolean isNotBlank(java.lang.String)' has changed its type to java.lang.CharSequence</td><td><a href="./xref/org/apache/commons/lang/StringUtils.html">org.apache.commons.lang.StringUtils</a></td><td>public boolean isNotBlank(java.lang.String)</td></tr><tr class="b"><td><img alt="Error" src="images/icon_error_sml.gif" /></td><td>Parameter 1 of 'public boolean isNotEmpty(java.lang.String)' has changed its type to java.lang.CharSequence</td><td><a href="./xref/org/apache/commons/lang/StringUtils.html">org.apache.commons.lang.StringUtils</a></td><td>public boolean isNotEmpty(java.lang.String)</td></tr><tr class="a"><td><img alt="Error" src="images/icon_error_sml.gif" /></td><td>Parameter 1 of 'public boolean isNumeric(java.lang.String)' has changed its type to java.lang.CharSequence</td><td><a href="./xref/org/apache/commons/lang/StringUtils.html">org.apache.commons.lang.StringUtils</a></td><td>public boolean isNumeric(java.lang.String)</td></tr><tr class="b"><td><img alt="Error" src="images/icon_error_sml.gif" /></td><td>Parameter 1 of 'public boolean isNumericSpace(java.lang.String)' has changed its type to java.lang.CharSequence</td><td><a href="./xref/org/apache/commons/lang/StringUtils.html">org.apache.commons.lang.StringUtils</a></td><td>public boolean isNumericSpace(java.lang.String)</td></tr><tr class="a"><td><img alt="Error" src="images/icon_error_sml.gif" /></td><td>Parameter 1 of 'public boolean isWhitespace(java.lang.String)' has changed its type to java.lang.CharSequence</td><td><a href="./xref/org/apache/commons/lang/StringUtils.html">org.apache.commons.lang.StringUtils</a></td><td>public boolean isWhitespace(java.lang.String)</td></tr><tr class="b"><td><img alt="Error" src="images/icon_error_sml.gif" /></td><td>Parameter 1 of 'public java.lang.String join(java.util.Collection, char)' has changed its type to java.lang.Iterable</td><td><a href="./xref/org/apache/commons/lang/StringUtils.html">org.apache.commons.lang.StringUtils</a></td><td>public java.lang.String join(java.util.Collection, char)</td></tr><tr class="a"><td><img alt="Error" src="images/icon_error_sml.gif" /></td><td>Parameter 1 of 'public java.lang.String join(java.util.Collection, java.lang.String)' has changed its type to java.lang.Iterable</td><td><a href="./xref/org/apache/commons/lang/StringUtils.html">org.apache.commons.lang.StringUtils</a></td><td>public java.lang.String join(java.util.Collection, java.lang.String)</td></tr><tr class="b"><td><img alt="Error" src="images/icon_error_sml.gif" /></td><td>Parameter 1 of 'public int lastIndexOf(java.lang.String, char)' has changed its type to java.lang.CharSequence</td><td><a href="./xref/org/apache/commons/lang/StringUtils.html">org.apache.commons.lang.StringUtils</a></td><td>public int lastIndexOf(java.lang.String, char)</td></tr><tr class="a"><td><img alt="Error" src="images/icon_error_sml.gif" /></td><td>Parameter 2 of 'public int lastIndexOf(java.lang.String, char)' has changed its type to int</td><td><a href="./xref/org/apache/commons/lang/StringUtils.html">org.apache.commons.lang.StringUtils</a></td><td>public int lastIndexOf(java.lang.String, char)</td></tr><tr class="b"><td><img alt="Error" src="images/icon_error_sml.gif" /></td><td>Parameter 1 of 'public int lastIndexOf(java.lang.String, char, int)' has changed its type to java.lang.CharSequence</td><td><a href="./xref/org/apache/commons/lang/StringUtils.html">org.apache.commons.lang.StringUtils</a></td><td>public int lastIndexOf(java.lang.String, char, int)</td></tr><tr class="a"><td><img alt="Error" src="images/icon_error_sml.gif" /></td><td>Parameter 2 of 'public int lastIndexOf(java.lang.String, char, int)' has changed its type to int</td><td><a href="./xref/org/apache/commons/lang/StringUtils.html">org.apache.commons.lang.StringUtils</a></td><td>public int lastIndexOf(java.lang.String, char, int)</td></tr><tr class="b"><td><img alt="Error" src="images/icon_error_sml.gif" /></td><td>Parameter 1 of 'public int lastIndexOf(java.lang.String, java.lang.String)' has changed its type to java.lang.CharSequence</td><td><a href="./xref/org/apache/commons/lang/StringUtils.html">org.apache.commons.lang.StringUtils</a></td><td>public int lastIndexOf(java.lang.String, java.lang.String)</td></tr><tr class="a"><td><img alt="Error" src="images/icon_error_sml.gif" /></td><td>Parameter 2 of 'public int lastIndexOf(java.lang.String, java.lang.String)' has changed its type to java.lang.CharSequence</td><td><a href="./xref/org/apache/commons/lang/StringUtils.html">org.apache.commons.lang.StringUtils</a></td><td>public int lastIndexOf(java.lang.String, java.lang.String)</td></tr><tr class="b"><td><img alt="Error" src="images/icon_error_sml.gif" /></td><td>Parameter 1 of 'public int lastIndexOf(java.lang.String, java.lang.String, int)' has changed its type to java.lang.CharSequence</td><td><a href="./xref/org/apache/commons/lang/StringUtils.html">org.apache.commons.lang.StringUtils</a></td><td>public int lastIndexOf(java.lang.String, java.lang.String, int)</td></tr><tr class="a"><td><img alt="Error" src="images/icon_error_sml.gif" /></td><td>Parameter 2 of 'public int lastIndexOf(java.lang.String, java.lang.String, int)' has changed its type to java.lang.CharSequence</td><td><a href="./xref/org/apache/commons/lang/StringUtils.html">org.apache.commons.lang.StringUtils</a></td><td>public int lastIndexOf(java.lang.String, java.lang.String, int)</td></tr><tr class="b"><td><img alt="Error" src="images/icon_error_sml.gif" /></td><td>Parameter 1 of 'public int lastIndexOfAny(java.lang.String, java.lang.String[])' has changed its type to java.lang.CharSequence</td><td><a href="./xref/org/apache/commons/lang/StringUtils.html">org.apache.commons.lang.StringUtils</a></td><td>public int lastIndexOfAny(java.lang.String, java.lang.String[])</td></tr><tr class="a"><td><img alt="Error" src="images/icon_error_sml.gif" /></td><td>Parameter 2 of 'public int lastIndexOfAny(java.lang.String, java.lang.String[])' has changed its type to java.lang.CharSequence[]</td><td><a href="./xref/org/apache/commons/lang/StringUtils.html">org.apache.commons.lang.StringUtils</a></td><td>public int lastIndexOfAny(java.lang.String, java.lang.String[])</td></tr><tr class="b"><td><img alt="Error" src="images/icon_error_sml.gif" /></td><td>Parameter 1 of 'public int lastIndexOfIgnoreCase(java.lang.String, java.lang.String)' has changed its type to java.lang.CharSequence</td><td><a href="./xref/org/apache/commons/lang/StringUtils.html">org.apache.commons.lang.StringUtils</a></td><td>public int lastIndexOfIgnoreCase(java.lang.String, java.lang.String)</td></tr><tr class="a"><td><img alt="Error" src="images/icon_error_sml.gif" /></td><td>Parameter 2 of 'public int lastIndexOfIgnoreCase(java.lang.String, java.lang.String)' has changed its type to java.lang.CharSequence</td><td><a href="./xref/org/apache/commons/lang/StringUtils.html">org.apache.commons.lang.StringUtils</a></td><td>public int lastIndexOfIgnoreCase(java.lang.String, java.lang.String)</td></tr><tr class="b"><td><img alt="Error" src="images/icon_error_sml.gif" /></td><td>Parameter 1 of 'public int lastIndexOfIgnoreCase(java.lang.String, java.lang.String, int)' has changed its type to java.lang.CharSequence</td><td><a href="./xref/org/apache/commons/lang/StringUtils.html">org.apache.commons.lang.StringUtils</a></td><td>public int lastIndexOfIgnoreCase(java.lang.String, java.lang.String, int)</td></tr><tr class="a"><td><img alt="Error" src="images/icon_error_sml.gif" /></td><td>Parameter 2 of 'public int lastIndexOfIgnoreCase(java.lang.String, java.lang.String, int)' has changed its type to java.lang.CharSequence</td><td><a href="./xref/org/apache/commons/lang/StringUtils.html">org.apache.commons.lang.StringUtils</a></td><td>public int lastIndexOfIgnoreCase(java.lang.String, java.lang.String, int)</td></tr><tr class="b"><td><img alt="Error" src="images/icon_error_sml.gif" /></td><td>Parameter 1 of 'public int lastOrdinalIndexOf(java.lang.String, java.lang.String, int)' has changed its type to java.lang.CharSequence</td><td><a href="./xref/org/apache/commons/lang/StringUtils.html">org.apache.commons.lang.StringUtils</a></td><td>public int lastOrdinalIndexOf(java.lang.String, java.lang.String, int)</td></tr><tr class="a"><td><img alt="Error" src="images/icon_error_sml.gif" /></td><td>Parameter 2 of 'public int lastOrdinalIndexOf(java.lang.String, java.lang.String, int)' has changed its type to java.lang.CharSequence</td><td><a href="./xref/org/apache/commons/lang/StringUtils.html">org.apache.commons.lang.StringUtils</a></td><td>public int lastOrdinalIndexOf(java.lang.String, java.lang.String, int)</td></tr><tr class="b"><td><img alt="Error" src="images/icon_error_sml.gif" /></td><td>Parameter 1 of 'public int length(java.lang.String)' has changed its type to java.lang.CharSequence</td><td><a href="./xref/org/apache/commons/lang/StringUtils.html">org.apache.commons.lang.StringUtils</a></td><td>public int length(java.lang.String)</td></tr><tr class="a"><td><img alt="Error" src="images/icon_error_sml.gif" /></td><td>Parameter 1 of 'public int ordinalIndexOf(java.lang.String, java.lang.String, int)' has changed its type to java.lang.CharSequence</td><td><a href="./xref/org/apache/commons/lang/StringUtils.html">org.apache.commons.lang.StringUtils</a></td><td>public int ordinalIndexOf(java.lang.String, java.lang.String, int)</td></tr><tr class="b"><td><img alt="Error" src="images/icon_error_sml.gif" /></td><td>Parameter 2 of 'public int ordinalIndexOf(java.lang.String, java.lang.String, int)' has changed its type to java.lang.CharSequence</td><td><a href="./xref/org/apache/commons/lang/StringUtils.html">org.apache.commons.lang.StringUtils</a></td><td>public int ordinalIndexOf(java.lang.String, java.lang.String, int)</td></tr><tr class="a"><td><img alt="Error" src="images/icon_error_sml.gif" /></td><td>Method 'public java.lang.String overlayString(java.lang.String, java.lang.String, int, int)' has been removed</td><td><a href="./xref/org/apache/commons/lang/StringUtils.html">org.apache.commons.lang.StringUtils</a></td><td>public java.lang.String overlayString(java.lang.String, java.lang.String, int, int)</td></tr><tr class="b"><td><img alt="Error" src="images/icon_error_sml.gif" /></td><td>Method 'public java.lang.String prechomp(java.lang.String, java.lang.String)' has been removed</td><td><a href="./xref/org/apache/commons/lang/StringUtils.html">org.apache.commons.lang.StringUtils</a></td><td>public java.lang.String prechomp(java.lang.String, java.lang.String)</td></tr><tr class="a"><td><img alt="Error" src="images/icon_error_sml.gif" /></td><td>Method 'public java.lang.String reverseDelimitedString(java.lang.String, java.lang.String)' has been removed</td><td><a href="./xref/org/apache/commons/lang/StringUtils.html">org.apache.commons.lang.StringUtils</a></td><td>public java.lang.String reverseDelimitedString(java.lang.String, java.lang.String)</td></tr><tr class="b"><td><img alt="Error" src="images/icon_error_sml.gif" /></td><td>Parameter 1 of 'public boolean startsWith(java.lang.String, java.lang.String)' has changed its type to java.lang.CharSequence</td><td><a href="./xref/org/apache/commons/lang/StringUtils.html">org.apache.commons.lang.StringUtils</a></td><td>public boolean startsWith(java.lang.String, java.lang.String)</td></tr><tr class="a"><td><img alt="Error" src="images/icon_error_sml.gif" /></td><td>Parameter 2 of 'public boolean startsWith(java.lang.String, java.lang.String)' has changed its type to java.lang.CharSequence</td><td><a href="./xref/org/apache/commons/lang/StringUtils.html">org.apache.commons.lang.StringUtils</a></td><td>public boolean startsWith(java.lang.String, java.lang.String)</td></tr><tr class="b"><td><img alt="Error" src="images/icon_error_sml.gif" /></td><td>Parameter 1 of 'public boolean startsWithAny(java.lang.String, java.lang.String[])' has changed its type to java.lang.CharSequence</td><td><a href="./xref/org/apache/commons/lang/StringUtils.html">org.apache.commons.lang.StringUtils</a></td><td>public boolean startsWithAny(java.lang.String, java.lang.String[])</td></tr><tr class="a"><td><img alt="Error" src="images/icon_error_sml.gif" /></td><td>Parameter 2 of 'public boolean startsWithAny(java.lang.String, java.lang.String[])' has changed its type to java.lang.CharSequence[]</td><td><a href="./xref/org/apache/commons/lang/StringUtils.html">org.apache.commons.lang.StringUtils</a></td><td>public boolean startsWithAny(java.lang.String, java.lang.String[])</td></tr><tr class="b"><td><img alt="Error" src="images/icon_error_sml.gif" /></td><td>Parameter 1 of 'public boolean startsWithIgnoreCase(java.lang.String, java.lang.String)' has changed its type to java.lang.CharSequence</td><td><a href="./xref/org/apache/commons/lang/StringUtils.html">org.apache.commons.lang.StringUtils</a></td><td>public boolean startsWithIgnoreCase(java.lang.String, java.lang.String)</td></tr><tr class="a"><td><img alt="Error" src="images/icon_error_sml.gif" /></td><td>Parameter 2 of 'public boolean startsWithIgnoreCase(java.lang.String, java.lang.String)' has changed its type to java.lang.CharSequence</td><td><a href="./xref/org/apache/commons/lang/StringUtils.html">org.apache.commons.lang.StringUtils</a></td><td>public boolean startsWithIgnoreCase(java.lang.String, java.lang.String)</td></tr><tr class="b"><td><img alt="Error" src="images/icon_error_sml.gif" /></td><td>Method 'public java.lang.String uncapitalise(java.lang.String)' has been removed</td><td><a href="./xref/org/apache/commons/lang/StringUtils.html">org.apache.commons.lang.StringUtils</a></td><td>public java.lang.String uncapitalise(java.lang.String)</td></tr><tr class="a"><td><img alt="Error" src="images/icon_error_sml.gif" /></td><td>Removed field JAVA_VERSION_FLOAT</td><td><a href="./xref/org/apache/commons/lang/SystemUtils.html">org.apache.commons.lang.SystemUtils</a></td><td>JAVA_VERSION_FLOAT</td></tr><tr class="b"><td><img alt="Error" src="images/icon_error_sml.gif" /></td><td>Removed field JAVA_VERSION_INT</td><td><a href="./xref/org/apache/commons/lang/SystemUtils.html">org.apache.commons.lang.SystemUtils</a></td><td>JAVA_VERSION_INT</td></tr><tr class="a"><td><img alt="Error" src="images/icon_error_sml.gif" /></td><td>Removed field JAVA_VERSION_TRIMMED</td><td><a href="./xref/org/apache/commons/lang/SystemUtils.html">org.apache.commons.lang.SystemUtils</a></td><td>JAVA_VERSION_TRIMMED</td></tr><tr class="b"><td><img alt="Error" src="images/icon_error_sml.gif" /></td><td>Method 'public float getJavaVersion()' has been removed</td><td><a href="./xref/org/apache/commons/lang/SystemUtils.html">org.apache.commons.lang.SystemUtils</a></td><td>public float getJavaVersion()</td></tr><tr class="a"><td><img alt="Error" src="images/icon_error_sml.gif" /></td><td>Parameter 1 of 'public boolean isJavaVersionAtLeast(float)' has changed its type to org.apache.commons.lang.JavaVersion</td><td><a href="./xref/org/apache/commons/lang/SystemUtils.html">org.apache.commons.lang.SystemUtils</a></td><td>public boolean isJavaVersionAtLeast(float)</td></tr><tr class="b"><td><img alt="Error" src="images/icon_error_sml.gif" /></td><td>Method 'public boolean isJavaVersionAtLeast(int)' has been removed</td><td><a href="./xref/org/apache/commons/lang/SystemUtils.html">org.apache.commons.lang.SystemUtils</a></td><td>public boolean isJavaVersionAtLeast(int)</td></tr><tr class="a"><td><img alt="Error" src="images/icon_error_sml.gif" /></td><td>Class org.apache.commons.lang.UnhandledException removed</td><td><a href="./xref/org/apache/commons/lang/UnhandledException.html">org.apache.commons.lang.UnhandledException</a></td><td></td></tr><tr class="b"><td><img alt="Error" src="images/icon_error_sml.gif" /></td><td>Method 'public void allElementsOfType(java.util.Collection, java.lang.Class, java.lang.String)' has been removed</td><td><a href="./xref/org/apache/commons/lang/Validate.html">org.apache.commons.lang.Validate</a></td><td>public void allElementsOfType(java.util.Collection, java.lang.Class, java.lang.String)</td></tr><tr class="a"><td><img alt="Error" src="images/icon_error_sml.gif" /></td><td>Method 'public void allElementsOfType(java.util.Collection, java.lang.Class)' has been removed</td><td><a href="./xref/org/apache/commons/lang/Validate.html">org.apache.commons.lang.Validate</a></td><td>public void allElementsOfType(java.util.Collection, java.lang.Class)</td></tr><tr class="b"><td><img alt="Error" src="images/icon_error_sml.gif" /></td><td>Parameter 3 of 'public void isTrue(boolean, java.lang.String, java.lang.Object)' has changed its type to java.lang.Object[]</td><td><a href="./xref/org/apache/commons/lang/Validate.html">org.apache.commons.lang.Validate</a></td><td>public void isTrue(boolean, java.lang.String, java.lang.Object)</td></tr><tr class="a"><td><img alt="Error" src="images/icon_error_sml.gif" /></td><td>Method 'public void isTrue(boolean, java.lang.String)' has been removed</td><td><a href="./xref/org/apache/commons/lang/Validate.html">org.apache.commons.lang.Validate</a></td><td>public void isTrue(boolean, java.lang.String)</td></tr><tr class="b"><td><img alt="Error" src="images/icon_error_sml.gif" /></td><td>Return type of method 'public void noNullElements(java.lang.Object[])' has been changed to java.lang.Object[]</td><td><a href="./xref/org/apache/commons/lang/Validate.html">org.apache.commons.lang.Validate</a></td><td>public void noNullElements(java.lang.Object[])</td></tr><tr class="a"><td><img alt="Error" src="images/icon_error_sml.gif" /></td><td>Parameter 1 of 'public void noNullElements(java.util.Collection)' has changed its type to java.lang.Iterable</td><td><a href="./xref/org/apache/commons/lang/Validate.html">org.apache.commons.lang.Validate</a></td><td>public void noNullElements(java.util.Collection)</td></tr><tr class="b"><td><img alt="Error" src="images/icon_error_sml.gif" /></td><td>Return type of method 'public void noNullElements(java.util.Collection)' has been changed to java.lang.Iterable</td><td><a href="./xref/org/apache/commons/lang/Validate.html">org.apache.commons.lang.Validate</a></td><td>public void noNullElements(java.util.Collection)</td></tr><tr class="a"><td><img alt="Error" src="images/icon_error_sml.gif" /></td><td>In method 'public void noNullElements(java.lang.Object[], java.lang.String)' the number of arguments has changed</td><td><a href="./xref/org/apache/commons/lang/Validate.html">org.apache.commons.lang.Validate</a></td><td>public void noNullElements(java.lang.Object[], java.lang.String)</td></tr><tr class="b"><td><img alt="Error" src="images/icon_error_sml.gif" /></td><td>Return type of method 'public void noNullElements(java.lang.Object[], java.lang.String)' has been changed to java.lang.Object[]</td><td><a href="./xref/org/apache/commons/lang/Validate.html">org.apache.commons.lang.Validate</a></td><td>public void noNullElements(java.lang.Object[], java.lang.String)</td></tr><tr class="a"><td><img alt="Error" src="images/icon_error_sml.gif" /></td><td>In method 'public void noNullElements(java.util.Collection, java.lang.String)' the number of arguments has changed</td><td><a href="./xref/org/apache/commons/lang/Validate.html">org.apache.commons.lang.Validate</a></td><td>public void noNullElements(java.util.Collection, java.lang.String)</td></tr><tr class="b"><td><img alt="Error" src="images/icon_error_sml.gif" /></td><td>Return type of method 'public void noNullElements(java.util.Collection, java.lang.String)' has been changed to java.lang.Iterable</td><td><a href="./xref/org/apache/commons/lang/Validate.html">org.apache.commons.lang.Validate</a></td><td>public void noNullElements(java.util.Collection, java.lang.String)</td></tr><tr class="a"><td><img alt="Error" src="images/icon_error_sml.gif" /></td><td>Return type of method 'public void notEmpty(java.lang.Object[])' has been changed to java.lang.Object[]</td><td><a href="./xref/org/apache/commons/lang/Validate.html">org.apache.commons.lang.Validate</a></td><td>public void notEmpty(java.lang.Object[])</td></tr><tr class="b"><td><img alt="Error" src="images/icon_error_sml.gif" /></td><td>Return type of method 'public void notEmpty(java.util.Collection)' has been changed to java.util.Collection</td><td><a href="./xref/org/apache/commons/lang/Validate.html">org.apache.commons.lang.Validate</a></td><td>public void notEmpty(java.util.Collection)</td></tr><tr class="a"><td><img alt="Error" src="images/icon_error_sml.gif" /></td><td>Return type of method 'public void notEmpty(java.util.Map)' has been changed to java.util.Map</td><td><a href="./xref/org/apache/commons/lang/Validate.html">org.apache.commons.lang.Validate</a></td><td>public void notEmpty(java.util.Map)</td></tr><tr class="b"><td><img alt="Error" src="images/icon_error_sml.gif" /></td><td>Parameter 1 of 'public void notEmpty(java.lang.String)' has changed its type to java.lang.CharSequence</td><td><a href="./xref/org/apache/commons/lang/Validate.html">org.apache.commons.lang.Validate</a></td><td>public void notEmpty(java.lang.String)</td></tr><tr class="a"><td><img alt="Error" src="images/icon_error_sml.gif" /></td><td>Return type of method 'public void notEmpty(java.lang.String)' has been changed to java.lang.CharSequence</td><td><a href="./xref/org/apache/commons/lang/Validate.html">org.apache.commons.lang.Validate</a></td><td>public void notEmpty(java.lang.String)</td></tr><tr class="b"><td><img alt="Error" src="images/icon_error_sml.gif" /></td><td>In method 'public void notEmpty(java.lang.Object[], java.lang.String)' the number of arguments has changed</td><td><a href="./xref/org/apache/commons/lang/Validate.html">org.apache.commons.lang.Validate</a></td><td>public void notEmpty(java.lang.Object[], java.lang.String)</td></tr><tr class="a"><td><img alt="Error" src="images/icon_error_sml.gif" /></td><td>Return type of method 'public void notEmpty(java.lang.Object[], java.lang.String)' has been changed to java.lang.Object[]</td><td><a href="./xref/org/apache/commons/lang/Validate.html">org.apache.commons.lang.Validate</a></td><td>public void notEmpty(java.lang.Object[], java.lang.String)</td></tr><tr class="b"><td><img alt="Error" src="images/icon_error_sml.gif" /></td><td>In method 'public void notEmpty(java.util.Collection, java.lang.String)' the number of arguments has changed</td><td><a href="./xref/org/apache/commons/lang/Validate.html">org.apache.commons.lang.Validate</a></td><td>public void notEmpty(java.util.Collection, java.lang.String)</td></tr><tr class="a"><td><img alt="Error" src="images/icon_error_sml.gif" /></td><td>Return type of method 'public void notEmpty(java.util.Collection, java.lang.String)' has been changed to java.util.Collection</td><td><a href="./xref/org/apache/commons/lang/Validate.html">org.apache.commons.lang.Validate</a></td><td>public void notEmpty(java.util.Collection, java.lang.String)</td></tr><tr class="b"><td><img alt="Error" src="images/icon_error_sml.gif" /></td><td>In method 'public void notEmpty(java.util.Map, java.lang.String)' the number of arguments has changed</td><td><a href="./xref/org/apache/commons/lang/Validate.html">org.apache.commons.lang.Validate</a></td><td>public void notEmpty(java.util.Map, java.lang.String)</td></tr><tr class="a"><td><img alt="Error" src="images/icon_error_sml.gif" /></td><td>Return type of method 'public void notEmpty(java.util.Map, java.lang.String)' has been changed to java.util.Map</td><td><a href="./xref/org/apache/commons/lang/Validate.html">org.apache.commons.lang.Validate</a></td><td>public void notEmpty(java.util.Map, java.lang.String)</td></tr><tr class="b"><td><img alt="Error" src="images/icon_error_sml.gif" /></td><td>In method 'public void notEmpty(java.lang.String, java.lang.String)' the number of arguments has changed</td><td><a href="./xref/org/apache/commons/lang/Validate.html">org.apache.commons.lang.Validate</a></td><td>public void notEmpty(java.lang.String, java.lang.String)</td></tr><tr class="a"><td><img alt="Error" src="images/icon_error_sml.gif" /></td><td>Return type of method 'public void notEmpty(java.lang.String, java.lang.String)' has been changed to java.lang.CharSequence</td><td><a href="./xref/org/apache/commons/lang/Validate.html">org.apache.commons.lang.Validate</a></td><td>public void notEmpty(java.lang.String, java.lang.String)</td></tr><tr class="b"><td><img alt="Error" src="images/icon_error_sml.gif" /></td><td>Return type of method 'public void notNull(java.lang.Object)' has been changed to java.lang.Object</td><td><a href="./xref/org/apache/commons/lang/Validate.html">org.apache.commons.lang.Validate</a></td><td>public void notNull(java.lang.Object)</td></tr><tr class="a"><td><img alt="Error" src="images/icon_error_sml.gif" /></td><td>In method 'public void notNull(java.lang.Object, java.lang.String)' the number of arguments has changed</td><td><a href="./xref/org/apache/commons/lang/Validate.html">org.apache.commons.lang.Validate</a></td><td>public void notNull(java.lang.Object, java.lang.String)</td></tr><tr class="b"><td><img alt="Error" src="images/icon_error_sml.gif" /></td><td>Return type of method 'public void notNull(java.lang.Object, java.lang.String)' has been changed to java.lang.Object</td><td><a href="./xref/org/apache/commons/lang/Validate.html">org.apache.commons.lang.Validate</a></td><td>public void notNull(java.lang.Object, java.lang.String)</td></tr><tr class="a"><td><img alt="Error" src="images/icon_error_sml.gif" /></td><td>Class org.apache.commons.lang.WordUtils removed</td><td><a href="./xref/org/apache/commons/lang/WordUtils.html">org.apache.commons.lang.WordUtils</a></td><td></td></tr><tr class="b"><td><img alt="Error" src="images/icon_error_sml.gif" /></td><td>Method 'public int reflectionCompare(java.lang.Object, java.lang.Object, boolean, java.lang.Class)' has been removed</td><td><a href="./xref/org/apache/commons/lang/builder/CompareToBuilder.html">org.apache.commons.lang.builder.CompareToBuilder</a></td><td>public int reflectionCompare(java.lang.Object, java.lang.Object, boolean, java.lang.Class)</td></tr><tr class="a"><td><img alt="Error" src="images/icon_error_sml.gif" /></td><td>Method 'public boolean reflectionEquals(java.lang.Object, java.lang.Object)' has been removed</td><td><a href="./xref/org/apache/commons/lang/builder/EqualsBuilder.html">org.apache.commons.lang.builder.EqualsBuilder</a></td><td>public boolean reflectionEquals(java.lang.Object, java.lang.Object)</td></tr><tr class="b"><td><img alt="Error" src="images/icon_error_sml.gif" /></td><td>Method 'public boolean reflectionEquals(java.lang.Object, java.lang.Object, boolean, java.lang.Class)' has been removed</td><td><a href="./xref/org/apache/commons/lang/builder/EqualsBuilder.html">org.apache.commons.lang.builder.EqualsBuilder</a></td><td>public boolean reflectionEquals(java.lang.Object, java.lang.Object, boolean, java.lang.Class)</td></tr><tr class="a"><td><img alt="Error" src="images/icon_error_sml.gif" /></td><td>Method 'public int reflectionHashCode(int, int, java.lang.Object, boolean, java.lang.Class)' has been removed</td><td><a href="./xref/org/apache/commons/lang/builder/HashCodeBuilder.html">org.apache.commons.lang.builder.HashCodeBuilder</a></td><td>public int reflectionHashCode(int, int, java.lang.Object, boolean, java.lang.Class)</td></tr><tr class="b"><td><img alt="Error" src="images/icon_error_sml.gif" /></td><td>Method 'public int reflectionHashCode(java.lang.Object)' has been removed</td><td><a href="./xref/org/apache/commons/lang/builder/HashCodeBuilder.html">org.apache.commons.lang.builder.HashCodeBuilder</a></td><td>public int reflectionHashCode(java.lang.Object)</td></tr><tr class="a"><td><img alt="Error" src="images/icon_error_sml.gif" /></td><td>Method 'public ReflectionToStringBuilder(java.lang.Object, org.apache.commons.lang.builder.ToStringStyle, java.lang.StringBuffer, java.lang.Class, boolean)' has been removed</td><td><a href="./xref/org/apache/commons/lang/builder/ReflectionToStringBuilder.html">org.apache.commons.lang.builder.ReflectionToStringBuilder</a></td><td>public ReflectionToStringBuilder(java.lang.Object, org.apache.commons.lang.builder.ToStringStyle, java.lang.StringBuffer, java.lang.Class, boolean)</td></tr><tr class="b"><td><img alt="Error" src="images/icon_error_sml.gif" /></td><td>Return type of method 'public org.apache.commons.lang.builder.ToStringBuilder reflectionAppendArray(java.lang.Object)' has been changed to org.apache.commons.lang.builder.ReflectionToStringBuilder</td><td><a href="./xref/org/apache/commons/lang/builder/ReflectionToStringBuilder.html">org.apache.commons.lang.builder.ReflectionToStringBuilder</a></td><td>public org.apache.commons.lang.builder.ToStringBuilder reflectionAppendArray(java.lang.Object)</td></tr><tr class="a"><td><img alt="Error" src="images/icon_error_sml.gif" /></td><td>Method 'public java.lang.String toString(java.lang.Object, org.apache.commons.lang.builder.ToStringStyle, boolean, java.lang.Class)' has been removed</td><td><a href="./xref/org/apache/commons/lang/builder/ReflectionToStringBuilder.html">org.apache.commons.lang.builder.ReflectionToStringBuilder</a></td><td>public java.lang.String toString(java.lang.Object, org.apache.commons.lang.builder.ToStringStyle, boolean, java.lang.Class)</td></tr><tr class="b"><td><img alt="Error" src="images/icon_error_sml.gif" /></td><td>Method 'public java.lang.String toStringExclude(java.lang.Object, java.lang.String)' has been removed</td><td><a href="./xref/org/apache/commons/lang/builder/ReflectionToStringBuilder.html">org.apache.commons.lang.builder.ReflectionToStringBuilder</a></td><td>public java.lang.String toStringExclude(java.lang.Object, java.lang.String)</td></tr><tr class="a"><td><img alt="Error" src="images/icon_error_sml.gif" /></td><td>Method 'public boolean isShortClassName()' has been removed</td><td><a href="./xref/org/apache/commons/lang/builder/StandardToStringStyle.html">org.apache.commons.lang.builder.StandardToStringStyle</a></td><td>public boolean isShortClassName()</td></tr><tr class="b"><td><img alt="Error" src="images/icon_error_sml.gif" /></td><td>Method 'public void setShortClassName(boolean)' has been removed</td><td><a href="./xref/org/apache/commons/lang/builder/StandardToStringStyle.html">org.apache.commons.lang.builder.StandardToStringStyle</a></td><td>public void setShortClassName(boolean)</td></tr><tr class="a"><td><img alt="Error" src="images/icon_error_sml.gif" /></td><td>Method 'protected boolean isShortClassName()' has been removed</td><td><a href="./xref/org/apache/commons/lang/builder/ToStringStyle.html">org.apache.commons.lang.builder.ToStringStyle</a></td><td>protected boolean isShortClassName()</td></tr><tr class="b"><td><img alt="Error" src="images/icon_error_sml.gif" /></td><td>Method 'protected void setShortClassName(boolean)' has been removed</td><td><a href="./xref/org/apache/commons/lang/builder/ToStringStyle.html">org.apache.commons.lang.builder.ToStringStyle</a></td><td>protected void setShortClassName(boolean)</td></tr><tr class="a"><td><img alt="Error" src="images/icon_error_sml.gif" /></td><td>Class org.apache.commons.lang.enum.Enum removed</td><td><a href="./xref/org/apache/commons/lang/enum/Enum.html">org.apache.commons.lang.enum.Enum</a></td><td></td></tr><tr class="b"><td><img alt="Error" src="images/icon_error_sml.gif" /></td><td>Class org.apache.commons.lang.enum.EnumUtils removed</td><td><a href="./xref/org/apache/commons/lang/enum/EnumUtils.html">org.apache.commons.lang.enum.EnumUtils</a></td><td></td></tr><tr class="a"><td><img alt="Error" src="images/icon_error_sml.gif" /></td><td>Class org.apache.commons.lang.enum.ValuedEnum removed</td><td><a href="./xref/org/apache/commons/lang/enum/ValuedEnum.html">org.apache.commons.lang.enum.ValuedEnum</a></td><td></td></tr><tr class="b"><td><img alt="Error" src="images/icon_error_sml.gif" /></td><td>Class org.apache.commons.lang.enums.Enum removed</td><td><a href="./xref/org/apache/commons/lang/enums/Enum.html">org.apache.commons.lang.enums.Enum</a></td><td></td></tr><tr class="a"><td><img alt="Error" src="images/icon_error_sml.gif" /></td><td>Class org.apache.commons.lang.enums.EnumUtils removed</td><td><a href="./xref/org/apache/commons/lang/enums/EnumUtils.html">org.apache.commons.lang.enums.EnumUtils</a></td><td></td></tr><tr class="b"><td><img alt="Error" src="images/icon_error_sml.gif" /></td><td>Class org.apache.commons.lang.enums.ValuedEnum removed</td><td><a href="./xref/org/apache/commons/lang/enums/ValuedEnum.html">org.apache.commons.lang.enums.ValuedEnum</a></td><td></td></tr><tr class="a"><td><img alt="Error" src="images/icon_error_sml.gif" /></td><td>Removed org.apache.commons.lang.exception.Nestable from the set of implemented interfaces</td><td><a href="./xref/org/apache/commons/lang/exception/CloneFailedException.html">org.apache.commons.lang.exception.CloneFailedException</a></td><td></td></tr><tr class="b"><td><img alt="Error" src="images/icon_error_sml.gif" /></td><td>Removed org.apache.commons.lang.exception.NestableRuntimeException from the list of superclasses</td><td><a href="./xref/org/apache/commons/lang/exception/CloneFailedException.html">org.apache.commons.lang.exception.CloneFailedException</a></td><td></td></tr><tr class="a"><td><img alt="Error" src="images/icon_error_sml.gif" /></td><td>Method 'public void addCauseMethodName(java.lang.String)' has been removed</td><td><a href="./xref/org/apache/commons/lang/exception/ExceptionUtils.html">org.apache.commons.lang.exception.ExceptionUtils</a></td><td>public void addCauseMethodName(java.lang.String)</td></tr><tr class="b"><td><img alt="Error" src="images/icon_error_sml.gif" /></td><td>Method 'public java.lang.String getFullStackTrace(java.lang.Throwable)' has been removed</td><td><a href="./xref/org/apache/commons/lang/exception/ExceptionUtils.html">org.apache.commons.lang.exception.ExceptionUtils</a></td><td>public java.lang.String getFullStackTrace(java.lang.Throwable)</td></tr><tr class="a"><td><img alt="Error" src="images/icon_error_sml.gif" /></td><td>Method 'public boolean isCauseMethodName(java.lang.String)' has been removed</td><td><a href="./xref/org/apache/commons/lang/exception/ExceptionUtils.html">org.apache.commons.lang.exception.ExceptionUtils</a></td><td>public boolean isCauseMethodName(java.lang.String)</td></tr><tr class="b"><td><img alt="Error" src="images/icon_error_sml.gif" /></td><td>Method 'public boolean isNestedThrowable(java.lang.Throwable)' has been removed</td><td><a href="./xref/org/apache/commons/lang/exception/ExceptionUtils.html">org.apache.commons.lang.exception.ExceptionUtils</a></td><td>public boolean isNestedThrowable(java.lang.Throwable)</td></tr><tr class="a"><td><img alt="Error" src="images/icon_error_sml.gif" /></td><td>Method 'public boolean isThrowableNested()' has been removed</td><td><a href="./xref/org/apache/commons/lang/exception/ExceptionUtils.html">org.apache.commons.lang.exception.ExceptionUtils</a></td><td>public boolean isThrowableNested()</td></tr><tr class="b"><td><img alt="Error" src="images/icon_error_sml.gif" /></td><td>Method 'public void removeCauseMethodName(java.lang.String)' has been removed</td><td><a href="./xref/org/apache/commons/lang/exception/ExceptionUtils.html">org.apache.commons.lang.exception.ExceptionUtils</a></td><td>public void removeCauseMethodName(java.lang.String)</td></tr><tr class="a"><td><img alt="Error" src="images/icon_error_sml.gif" /></td><td>Method 'public boolean setCause(java.lang.Throwable, java.lang.Throwable)' has been removed</td><td><a href="./xref/org/apache/commons/lang/exception/ExceptionUtils.html">org.apache.commons.lang.exception.ExceptionUtils</a></td><td>public boolean setCause(java.lang.Throwable, java.lang.Throwable)</td></tr><tr class="b"><td><img alt="Error" src="images/icon_error_sml.gif" /></td><td>Class org.apache.commons.lang.exception.Nestable removed</td><td><a href="./xref/org/apache/commons/lang/exception/Nestable.html">org.apache.commons.lang.exception.Nestable</a></td><td></td></tr><tr class="a"><td><img alt="Error" src="images/icon_error_sml.gif" /></td><td>Class org.apache.commons.lang.exception.NestableDelegate removed</td><td><a href="./xref/org/apache/commons/lang/exception/NestableDelegate.html">org.apache.commons.lang.exception.NestableDelegate</a></td><td></td></tr><tr class="b"><td><img alt="Error" src="images/icon_error_sml.gif" /></td><td>Class org.apache.commons.lang.exception.NestableError removed</td><td><a href="./xref/org/apache/commons/lang/exception/NestableError.html">org.apache.commons.lang.exception.NestableError</a></td><td></td></tr><tr class="a"><td><img alt="Error" src="images/icon_error_sml.gif" /></td><td>Class org.apache.commons.lang.exception.NestableException removed</td><td><a href="./xref/org/apache/commons/lang/exception/NestableException.html">org.apache.commons.lang.exception.NestableException</a></td><td></td></tr><tr class="b"><td><img alt="Error" src="images/icon_error_sml.gif" /></td><td>Class org.apache.commons.lang.exception.NestableRuntimeException removed</td><td><a href="./xref/org/apache/commons/lang/exception/NestableRuntimeException.html">org.apache.commons.lang.exception.NestableRuntimeException</a></td><td></td></tr><tr class="a"><td><img alt="Error" src="images/icon_error_sml.gif" /></td><td>Class org.apache.commons.lang.math.DoubleRange removed</td><td><a href="./xref/org/apache/commons/lang/math/DoubleRange.html">org.apache.commons.lang.math.DoubleRange</a></td><td></td></tr><tr class="b"><td><img alt="Error" src="images/icon_error_sml.gif" /></td><td>Class org.apache.commons.lang.math.FloatRange removed</td><td><a href="./xref/org/apache/commons/lang/math/FloatRange.html">org.apache.commons.lang.math.FloatRange</a></td><td></td></tr><tr class="a"><td><img alt="Error" src="images/icon_error_sml.gif" /></td><td>Class org.apache.commons.lang.math.IntRange removed</td><td><a href="./xref/org/apache/commons/lang/math/IntRange.html">org.apache.commons.lang.math.IntRange</a></td><td></td></tr><tr class="b"><td><img alt="Error" src="images/icon_error_sml.gif" /></td><td>Class org.apache.commons.lang.math.JVMRandom removed</td><td><a href="./xref/org/apache/commons/lang/math/JVMRandom.html">org.apache.commons.lang.math.JVMRandom</a></td><td></td></tr><tr class="a"><td><img alt="Error" src="images/icon_error_sml.gif" /></td><td>Class org.apache.commons.lang.math.LongRange removed</td><td><a href="./xref/org/apache/commons/lang/math/LongRange.html">org.apache.commons.lang.math.LongRange</a></td><td></td></tr><tr class="b"><td><img alt="Error" src="images/icon_error_sml.gif" /></td><td>Class org.apache.commons.lang.math.NumberRange removed</td><td><a href="./xref/org/apache/commons/lang/math/NumberRange.html">org.apache.commons.lang.math.NumberRange</a></td><td></td></tr><tr class="a"><td><img alt="Error" src="images/icon_error_sml.gif" /></td><td>Method 'public int compare(double, double)' has been removed</td><td><a href="./xref/org/apache/commons/lang/math/NumberUtils.html">org.apache.commons.lang.math.NumberUtils</a></td><td>public int compare(double, double)</td></tr><tr class="b"><td><img alt="Error" src="images/icon_error_sml.gif" /></td><td>Method 'public int compare(float, float)' has been removed</td><td><a href="./xref/org/apache/commons/lang/math/NumberUtils.html">org.apache.commons.lang.math.NumberUtils</a></td><td>public int compare(float, float)</td></tr><tr class="a"><td><img alt="Error" src="images/icon_error_sml.gif" /></td><td>Method 'public int stringToInt(java.lang.String)' has been removed</td><td><a href="./xref/org/apache/commons/lang/math/NumberUtils.html">org.apache.commons.lang.math.NumberUtils</a></td><td>public int stringToInt(java.lang.String)</td></tr><tr class="b"><td><img alt="Error" src="images/icon_error_sml.gif" /></td><td>Method 'public int stringToInt(java.lang.String, int)' has been removed</td><td><a href="./xref/org/apache/commons/lang/math/NumberUtils.html">org.apache.commons.lang.math.NumberUtils</a></td><td>public int stringToInt(java.lang.String, int)</td></tr><tr class="a"><td><img alt="Error" src="images/icon_error_sml.gif" /></td><td>Class org.apache.commons.lang.math.RandomUtils removed</td><td><a href="./xref/org/apache/commons/lang/math/RandomUtils.html">org.apache.commons.lang.math.RandomUtils</a></td><td></td></tr><tr class="b"><td><img alt="Error" src="images/icon_error_sml.gif" /></td><td>Class org.apache.commons.lang.math.Range removed</td><td><a href="./xref/org/apache/commons/lang/math/Range.html">org.apache.commons.lang.math.Range</a></td><td></td></tr><tr class="a"><td><img alt="Error" src="images/icon_error_sml.gif" /></td><td>Return type of method 'public java.lang.Object getValue()' has been changed to java.lang.Boolean</td><td><a href="./xref/org/apache/commons/lang/mutable/MutableBoolean.html">org.apache.commons.lang.mutable.MutableBoolean</a></td><td>public java.lang.Object getValue()</td></tr><tr class="b"><td><img alt="Error" src="images/icon_error_sml.gif" /></td><td>Return type of method 'public java.lang.Object getValue()' has been changed to java.lang.Byte</td><td><a href="./xref/org/apache/commons/lang/mutable/MutableByte.html">org.apache.commons.lang.mutable.MutableByte</a></td><td>public java.lang.Object getValue()</td></tr><tr class="a"><td><img alt="Error" src="images/icon_error_sml.gif" /></td><td>Return type of method 'public java.lang.Object getValue()' has been changed to java.lang.Double</td><td><a href="./xref/org/apache/commons/lang/mutable/MutableDouble.html">org.apache.commons.lang.mutable.MutableDouble</a></td><td>public java.lang.Object getValue()</td></tr><tr class="b"><td><img alt="Error" src="images/icon_error_sml.gif" /></td><td>Return type of method 'public java.lang.Object getValue()' has been changed to java.lang.Float</td><td><a href="./xref/org/apache/commons/lang/mutable/MutableFloat.html">org.apache.commons.lang.mutable.MutableFloat</a></td><td>public java.lang.Object getValue()</td></tr><tr class="a"><td><img alt="Error" src="images/icon_error_sml.gif" /></td><td>Return type of method 'public java.lang.Object getValue()' has been changed to java.lang.Integer</td><td><a href="./xref/org/apache/commons/lang/mutable/MutableInt.html">org.apache.commons.lang.mutable.MutableInt</a></td><td>public java.lang.Object getValue()</td></tr><tr class="b"><td><img alt="Error" src="images/icon_error_sml.gif" /></td><td>Return type of method 'public java.lang.Object getValue()' has been changed to java.lang.Long</td><td><a href="./xref/org/apache/commons/lang/mutable/MutableLong.html">org.apache.commons.lang.mutable.MutableLong</a></td><td>public java.lang.Object getValue()</td></tr><tr class="a"><td><img alt="Error" src="images/icon_error_sml.gif" /></td><td>Return type of method 'public java.lang.Object getValue()' has been changed to java.lang.Short</td><td><a href="./xref/org/apache/commons/lang/mutable/MutableShort.html">org.apache.commons.lang.mutable.MutableShort</a></td><td>public java.lang.Object getValue()</td></tr><tr class="b"><td><img alt="Error" src="images/icon_error_sml.gif" /></td><td>Method 'public java.lang.reflect.Constructor getAccessibleConstructor(java.lang.Class, java.lang.Class)' has been removed</td><td><a href="./xref/org/apache/commons/lang/reflect/ConstructorUtils.html">org.apache.commons.lang.reflect.ConstructorUtils</a></td><td>public java.lang.reflect.Constructor getAccessibleConstructor(java.lang.Class, java.lang.Class)</td></tr><tr class="a"><td><img alt="Error" src="images/icon_error_sml.gif" /></td><td>Method 'public java.lang.Object invokeConstructor(java.lang.Class, java.lang.Object)' has been removed</td><td><a href="./xref/org/apache/commons/lang/reflect/ConstructorUtils.html">org.apache.commons.lang.reflect.ConstructorUtils</a></td><td>public java.lang.Object invokeConstructor(java.lang.Class, java.lang.Object)</td></tr><tr class="b"><td><img alt="Error" src="images/icon_error_sml.gif" /></td><td>Method 'public java.lang.Object invokeExactConstructor(java.lang.Class, java.lang.Object)' has been removed</td><td><a href="./xref/org/apache/commons/lang/reflect/ConstructorUtils.html">org.apache.commons.lang.reflect.ConstructorUtils</a></td><td>public java.lang.Object invokeExactConstructor(java.lang.Class, java.lang.Object)</td></tr><tr class="a"><td><img alt="Error" src="images/icon_error_sml.gif" /></td><td>Method 'public java.lang.reflect.Method getAccessibleMethod(java.lang.Class, java.lang.String, java.lang.Class)' has been removed</td><td><a href="./xref/org/apache/commons/lang/reflect/MethodUtils.html">org.apache.commons.lang.reflect.MethodUtils</a></td><td>public java.lang.reflect.Method getAccessibleMethod(java.lang.Class, java.lang.String, java.lang.Class)</td></tr><tr class="b"><td><img alt="Error" src="images/icon_error_sml.gif" /></td><td>Method 'public java.lang.Object invokeExactMethod(java.lang.Object, java.lang.String, java.lang.Object)' has been removed</td><td><a href="./xref/org/apache/commons/lang/reflect/MethodUtils.html">org.apache.commons.lang.reflect.MethodUtils</a></td><td>public java.lang.Object invokeExactMethod(java.lang.Object, java.lang.String, java.lang.Object)</td></tr><tr class="a"><td><img alt="Error" src="images/icon_error_sml.gif" /></td><td>Method 'public java.lang.Object invokeExactStaticMethod(java.lang.Class, java.lang.String, java.lang.Object)' has been removed</td><td><a href="./xref/org/apache/commons/lang/reflect/MethodUtils.html">org.apache.commons.lang.reflect.MethodUtils</a></td><td>public java.lang.Object invokeExactStaticMethod(java.lang.Class, java.lang.String, java.lang.Object)</td></tr><tr class="b"><td><img alt="Error" src="images/icon_error_sml.gif" /></td><td>Method 'public java.lang.Object invokeMethod(java.lang.Object, java.lang.String, java.lang.Object)' has been removed</td><td><a href="./xref/org/apache/commons/lang/reflect/MethodUtils.html">org.apache.commons.lang.reflect.MethodUtils</a></td><td>public java.lang.Object invokeMethod(java.lang.Object, java.lang.String, java.lang.Object)</td></tr><tr class="a"><td><img alt="Error" src="images/icon_error_sml.gif" /></td><td>Method 'public java.lang.Object invokeStaticMethod(java.lang.Class, java.lang.String, java.lang.Object)' has been removed</td><td><a href="./xref/org/apache/commons/lang/reflect/MethodUtils.html">org.apache.commons.lang.reflect.MethodUtils</a></td><td>public java.lang.Object invokeStaticMethod(java.lang.Class, java.lang.String, java.lang.Object)</td></tr><tr class="b"><td><img alt="Error" src="images/icon_error_sml.gif" /></td><td>Removed java.lang.Cloneable from the set of implemented interfaces</td><td><a href="./xref/org/apache/commons/lang/text/StrBuilder.html">org.apache.commons.lang.text.StrBuilder</a></td><td></td></tr><tr class="a"><td><img alt="Error" src="images/icon_error_sml.gif" /></td><td>Parameter 1 of 'public org.apache.commons.lang.text.StrBuilder appendAll(java.util.Collection)' has changed its type to java.lang.Iterable</td><td><a href="./xref/org/apache/commons/lang/text/StrBuilder.html">org.apache.commons.lang.text.StrBuilder</a></td><td>public org.apache.commons.lang.text.StrBuilder appendAll(java.util.Collection)</td></tr><tr class="b"><td><img alt="Error" src="images/icon_error_sml.gif" /></td><td>Parameter 1 of 'public org.apache.commons.lang.text.StrBuilder appendWithSeparators(java.util.Collection, java.lang.String)' has changed its type to java.lang.Iterable</td><td><a href="./xref/org/apache/commons/lang/text/StrBuilder.html">org.apache.commons.lang.text.StrBuilder</a></td><td>public org.apache.commons.lang.text.StrBuilder appendWithSeparators(java.util.Collection, java.lang.String)</td></tr><tr class="a"><td><img alt="Error" src="images/icon_error_sml.gif" /></td><td>Method 'public java.lang.Object clone()' has been removed</td><td><a href="./xref/org/apache/commons/lang/text/StrBuilder.html">org.apache.commons.lang.text.StrBuilder</a></td><td>public java.lang.Object clone()</td></tr><tr class="b"><td><img alt="Error" src="images/icon_error_sml.gif" /></td><td>Return type of method 'public java.lang.Object next()' has been changed to java.lang.String</td><td><a href="./xref/org/apache/commons/lang/text/StrTokenizer.html">org.apache.commons.lang.text.StrTokenizer</a></td><td>public java.lang.Object next()</td></tr><tr class="a"><td><img alt="Error" src="images/icon_error_sml.gif" /></td><td>Return type of method 'public java.lang.Object previous()' has been changed to java.lang.String</td><td><a href="./xref/org/apache/commons/lang/text/StrTokenizer.html">org.apache.commons.lang.text.StrTokenizer</a></td><td>public java.lang.Object previous()</td></tr><tr class="b"><td><img alt="Error" src="images/icon_error_sml.gif" /></td><td>Field MILLIS_IN_DAY has been removed, but it was previously a constant</td><td><a href="./xref/org/apache/commons/lang/time/DateUtils.html">org.apache.commons.lang.time.DateUtils</a></td><td>MILLIS_IN_DAY</td></tr><tr class="a"><td><img alt="Error" src="images/icon_error_sml.gif" /></td><td>Field MILLIS_IN_HOUR has been removed, but it was previously a constant</td><td><a href="./xref/org/apache/commons/lang/time/DateUtils.html">org.apache.commons.lang.time.DateUtils</a></td><td>MILLIS_IN_HOUR</td></tr><tr class="b"><td><img alt="Error" src="images/icon_error_sml.gif" /></td><td>Field MILLIS_IN_MINUTE has been removed, but it was previously a constant</td><td><a href="./xref/org/apache/commons/lang/time/DateUtils.html">org.apache.commons.lang.time.DateUtils</a></td><td>MILLIS_IN_MINUTE</td></tr><tr class="a"><td><img alt="Error" src="images/icon_error_sml.gif" /></td><td>Field MILLIS_IN_SECOND has been removed, but it was previously a constant</td><td><a href="./xref/org/apache/commons/lang/time/DateUtils.html">org.apache.commons.lang.time.DateUtils</a></td><td>MILLIS_IN_SECOND</td></tr><tr class="b"><td><img alt="Error" src="images/icon_error_sml.gif" /></td><td>Removed field UTC_TIME_ZONE</td><td><a href="./xref/org/apache/commons/lang/time/DateUtils.html">org.apache.commons.lang.time.DateUtils</a></td><td>UTC_TIME_ZONE</td></tr><tr class="a"><td><img alt="Error" src="images/icon_error_sml.gif" /></td><td>Accessibility of method 'public java.util.Date add(java.util.Date, int, int)' has been decreased from public to private</td><td><a href="./xref/org/apache/commons/lang/time/DateUtils.html">org.apache.commons.lang.time.DateUtils</a></td><td>public java.util.Date add(java.util.Date, int, int)</td></tr><tr class="b"><td><img alt="Error" src="images/icon_error_sml.gif" /></td><td>Method 'public boolean getTimeZoneOverridesCalendar()' has been removed</td><td><a href="./xref/org/apache/commons/lang/time/FastDateFormat.html">org.apache.commons.lang.time.FastDateFormat</a></td><td>public boolean getTimeZoneOverridesCalendar()</td></tr><tr class="a"><td><img alt="Error" src="images/icon_error_sml.gif" /></td><td>Accessibility of method 'protected void init()' has been decreased from protected to private</td><td><a href="./xref/org/apache/commons/lang/time/FastDateFormat.html">org.apache.commons.lang.time.FastDateFormat</a></td><td>protected void init()</td></tr><tr class="b"><td><img alt="Info" src="images/icon_info_sml.gif" /></td><td>Class org.apache.commons.lang.AnnotationUtils added</td><td><a href="./xref/org/apache/commons/lang/AnnotationUtils.html">org.apache.commons.lang.AnnotationUtils</a></td><td></td></tr><tr class="a"><td><img alt="Info" src="images/icon_info_sml.gif" /></td><td>Method 'public java.lang.Object[] toArray(java.lang.Object[])' has been added</td><td><a href="./xref/org/apache/commons/lang/ArrayUtils.html">org.apache.commons.lang.ArrayUtils</a></td><td>public java.lang.Object[] toArray(java.lang.Object[])</td></tr><tr class="b"><td><img alt="Info" src="images/icon_info_sml.gif" /></td><td>Class org.apache.commons.lang.CharSequenceUtils added</td><td><a href="./xref/org/apache/commons/lang/CharSequenceUtils.html">org.apache.commons.lang.CharSequenceUtils</a></td><td></td></tr><tr class="a"><td><img alt="Info" src="images/icon_info_sml.gif" /></td><td>Method 'public java.lang.String getSimpleName(java.lang.Class)' has been added</td><td><a href="./xref/org/apache/commons/lang/ClassUtils.html">org.apache.commons.lang.ClassUtils</a></td><td>public java.lang.String getSimpleName(java.lang.Class)</td></tr><tr class="b"><td><img alt="Info" src="images/icon_info_sml.gif" /></td><td>Method 'public java.lang.String getSimpleName(java.lang.Object, java.lang.String)' has been added</td><td><a href="./xref/org/apache/commons/lang/ClassUtils.html">org.apache.commons.lang.ClassUtils</a></td><td>public java.lang.String getSimpleName(java.lang.Object, java.lang.String)</td></tr><tr class="a"><td><img alt="Info" src="images/icon_info_sml.gif" /></td><td>Class org.apache.commons.lang.EnumUtils added</td><td><a href="./xref/org/apache/commons/lang/EnumUtils.html">org.apache.commons.lang.EnumUtils</a></td><td></td></tr><tr class="b"><td><img alt="Info" src="images/icon_info_sml.gif" /></td><td>Class org.apache.commons.lang.JavaVersion added</td><td><a href="./xref/org/apache/commons/lang/JavaVersion.html">org.apache.commons.lang.JavaVersion</a></td><td></td></tr><tr class="a"><td><img alt="Info" src="images/icon_info_sml.gif" /></td><td>Method 'public java.lang.Object firstNonNull(java.lang.Object[])' has been added</td><td><a href="./xref/org/apache/commons/lang/ObjectUtils.html">org.apache.commons.lang.ObjectUtils</a></td><td>public java.lang.Object firstNonNull(java.lang.Object[])</td></tr><tr class="b"><td><img alt="Info" src="images/icon_info_sml.gif" /></td><td>Method 'public int hashCodeMulti(java.lang.Object[])' has been added</td><td><a href="./xref/org/apache/commons/lang/ObjectUtils.html">org.apache.commons.lang.ObjectUtils</a></td><td>public int hashCodeMulti(java.lang.Object[])</td></tr><tr class="a"><td><img alt="Info" src="images/icon_info_sml.gif" /></td><td>Class org.apache.commons.lang.Range added</td><td><a href="./xref/org/apache/commons/lang/Range.html">org.apache.commons.lang.Range</a></td><td></td></tr><tr class="b"><td><img alt="Info" src="images/icon_info_sml.gif" /></td><td>Added public field ESCAPE_CSV</td><td><a href="./xref/org/apache/commons/lang/StringEscapeUtils.html">org.apache.commons.lang.StringEscapeUtils</a></td><td>ESCAPE_CSV</td></tr><tr class="a"><td><img alt="Info" src="images/icon_info_sml.gif" /></td><td>Added public field ESCAPE_ECMASCRIPT</td><td><a href="./xref/org/apache/commons/lang/StringEscapeUtils.html">org.apache.commons.lang.StringEscapeUtils</a></td><td>ESCAPE_ECMASCRIPT</td></tr><tr class="b"><td><img alt="Info" src="images/icon_info_sml.gif" /></td><td>Added public field ESCAPE_HTML3</td><td><a href="./xref/org/apache/commons/lang/StringEscapeUtils.html">org.apache.commons.lang.StringEscapeUtils</a></td><td>ESCAPE_HTML3</td></tr><tr class="a"><td><img alt="Info" src="images/icon_info_sml.gif" /></td><td>Added public field ESCAPE_HTML4</td><td><a href="./xref/org/apache/commons/lang/StringEscapeUtils.html">org.apache.commons.lang.StringEscapeUtils</a></td><td>ESCAPE_HTML4</td></tr><tr class="b"><td><img alt="Info" src="images/icon_info_sml.gif" /></td><td>Added public field ESCAPE_JAVA</td><td><a href="./xref/org/apache/commons/lang/StringEscapeUtils.html">org.apache.commons.lang.StringEscapeUtils</a></td><td>ESCAPE_JAVA</td></tr><tr class="a"><td><img alt="Info" src="images/icon_info_sml.gif" /></td><td>Added public field ESCAPE_XML</td><td><a href="./xref/org/apache/commons/lang/StringEscapeUtils.html">org.apache.commons.lang.StringEscapeUtils</a></td><td>ESCAPE_XML</td></tr><tr class="b"><td><img alt="Info" src="images/icon_info_sml.gif" /></td><td>Added public field UNESCAPE_CSV</td><td><a href="./xref/org/apache/commons/lang/StringEscapeUtils.html">org.apache.commons.lang.StringEscapeUtils</a></td><td>UNESCAPE_CSV</td></tr><tr class="a"><td><img alt="Info" src="images/icon_info_sml.gif" /></td><td>Added public field UNESCAPE_ECMASCRIPT</td><td><a href="./xref/org/apache/commons/lang/StringEscapeUtils.html">org.apache.commons.lang.StringEscapeUtils</a></td><td>UNESCAPE_ECMASCRIPT</td></tr><tr class="b"><td><img alt="Info" src="images/icon_info_sml.gif" /></td><td>Added public field UNESCAPE_HTML3</td><td><a href="./xref/org/apache/commons/lang/StringEscapeUtils.html">org.apache.commons.lang.StringEscapeUtils</a></td><td>UNESCAPE_HTML3</td></tr><tr class="a"><td><img alt="Info" src="images/icon_info_sml.gif" /></td><td>Added public field UNESCAPE_HTML4</td><td><a href="./xref/org/apache/commons/lang/StringEscapeUtils.html">org.apache.commons.lang.StringEscapeUtils</a></td><td>UNESCAPE_HTML4</td></tr><tr class="b"><td><img alt="Info" src="images/icon_info_sml.gif" /></td><td>Added public field UNESCAPE_JAVA</td><td><a href="./xref/org/apache/commons/lang/StringEscapeUtils.html">org.apache.commons.lang.StringEscapeUtils</a></td><td>UNESCAPE_JAVA</td></tr><tr class="a"><td><img alt="Info" src="images/icon_info_sml.gif" /></td><td>Added public field UNESCAPE_XML</td><td><a href="./xref/org/apache/commons/lang/StringEscapeUtils.html">org.apache.commons.lang.StringEscapeUtils</a></td><td>UNESCAPE_XML</td></tr><tr class="b"><td><img alt="Info" src="images/icon_info_sml.gif" /></td><td>Method 'public java.lang.String escapeEcmaScript(java.lang.String)' has been added</td><td><a href="./xref/org/apache/commons/lang/StringEscapeUtils.html">org.apache.commons.lang.StringEscapeUtils</a></td><td>public java.lang.String escapeEcmaScript(java.lang.String)</td></tr><tr class="a"><td><img alt="Info" src="images/icon_info_sml.gif" /></td><td>Method 'public java.lang.String escapeHtml3(java.lang.String)' has been added</td><td><a href="./xref/org/apache/commons/lang/StringEscapeUtils.html">org.apache.commons.lang.StringEscapeUtils</a></td><td>public java.lang.String escapeHtml3(java.lang.String)</td></tr><tr class="b"><td><img alt="Info" src="images/icon_info_sml.gif" /></td><td>Method 'public java.lang.String escapeHtml4(java.lang.String)' has been added</td><td><a href="./xref/org/apache/commons/lang/StringEscapeUtils.html">org.apache.commons.lang.StringEscapeUtils</a></td><td>public java.lang.String escapeHtml4(java.lang.String)</td></tr><tr class="a"><td><img alt="Info" src="images/icon_info_sml.gif" /></td><td>Method 'public java.lang.String unescapeEcmaScript(java.lang.String)' has been added</td><td><a href="./xref/org/apache/commons/lang/StringEscapeUtils.html">org.apache.commons.lang.StringEscapeUtils</a></td><td>public java.lang.String unescapeEcmaScript(java.lang.String)</td></tr><tr class="b"><td><img alt="Info" src="images/icon_info_sml.gif" /></td><td>Method 'public java.lang.String unescapeHtml3(java.lang.String)' has been added</td><td><a href="./xref/org/apache/commons/lang/StringEscapeUtils.html">org.apache.commons.lang.StringEscapeUtils</a></td><td>public java.lang.String unescapeHtml3(java.lang.String)</td></tr><tr class="a"><td><img alt="Info" src="images/icon_info_sml.gif" /></td><td>Method 'public java.lang.String unescapeHtml4(java.lang.String)' has been added</td><td><a href="./xref/org/apache/commons/lang/StringEscapeUtils.html">org.apache.commons.lang.StringEscapeUtils</a></td><td>public java.lang.String unescapeHtml4(java.lang.String)</td></tr><tr class="b"><td><img alt="Info" src="images/icon_info_sml.gif" /></td><td>Method 'public boolean containsWhitespace(java.lang.CharSequence)' has been added</td><td><a href="./xref/org/apache/commons/lang/StringUtils.html">org.apache.commons.lang.StringUtils</a></td><td>public boolean containsWhitespace(java.lang.CharSequence)</td></tr><tr class="a"><td><img alt="Info" src="images/icon_info_sml.gif" /></td><td>Method 'public int getLevenshteinDistance(java.lang.CharSequence, java.lang.CharSequence, int)' has been added</td><td><a href="./xref/org/apache/commons/lang/StringUtils.html">org.apache.commons.lang.StringUtils</a></td><td>public int getLevenshteinDistance(java.lang.CharSequence, java.lang.CharSequence, int)</td></tr><tr class="b"><td><img alt="Info" src="images/icon_info_sml.gif" /></td><td>Method 'public java.lang.String repeat(char, int)' has been added</td><td><a href="./xref/org/apache/commons/lang/StringUtils.html">org.apache.commons.lang.StringUtils</a></td><td>public java.lang.String repeat(char, int)</td></tr><tr class="a"><td><img alt="Info" src="images/icon_info_sml.gif" /></td><td>Method 'public java.lang.String stripAccents(java.lang.String)' has been added</td><td><a href="./xref/org/apache/commons/lang/StringUtils.html">org.apache.commons.lang.StringUtils</a></td><td>public java.lang.String stripAccents(java.lang.String)</td></tr><tr class="b"><td><img alt="Info" src="images/icon_info_sml.gif" /></td><td>Method 'public void exclusiveBetween(java.lang.Object, java.lang.Object, java.lang.Comparable)' has been added</td><td><a href="./xref/org/apache/commons/lang/Validate.html">org.apache.commons.lang.Validate</a></td><td>public void exclusiveBetween(java.lang.Object, java.lang.Object, java.lang.Comparable)</td></tr><tr class="a"><td><img alt="Info" src="images/icon_info_sml.gif" /></td><td>Method 'public void exclusiveBetween(java.lang.Object, java.lang.Object, java.lang.Comparable, java.lang.String, java.lang.Object[])' has been added</td><td><a href="./xref/org/apache/commons/lang/Validate.html">org.apache.commons.lang.Validate</a></td><td>public void exclusiveBetween(java.lang.Object, java.lang.Object, java.lang.Comparable, java.lang.String, java.lang.Object[])</td></tr><tr class="b"><td><img alt="Info" src="images/icon_info_sml.gif" /></td><td>Method 'public void inclusiveBetween(java.lang.Object, java.lang.Object, java.lang.Comparable)' has been added</td><td><a href="./xref/org/apache/commons/lang/Validate.html">org.apache.commons.lang.Validate</a></td><td>public void inclusiveBetween(java.lang.Object, java.lang.Object, java.lang.Comparable)</td></tr><tr class="a"><td><img alt="Info" src="images/icon_info_sml.gif" /></td><td>Method 'public void inclusiveBetween(java.lang.Object, java.lang.Object, java.lang.Comparable, java.lang.String, java.lang.Object[])' has been added</td><td><a href="./xref/org/apache/commons/lang/Validate.html">org.apache.commons.lang.Validate</a></td><td>public void inclusiveBetween(java.lang.Object, java.lang.Object, java.lang.Comparable, java.lang.String, java.lang.Object[])</td></tr><tr class="b"><td><img alt="Info" src="images/icon_info_sml.gif" /></td><td>Method 'public void isAssignableFrom(java.lang.Class, java.lang.Class)' has been added</td><td><a href="./xref/org/apache/commons/lang/Validate.html">org.apache.commons.lang.Validate</a></td><td>public void isAssignableFrom(java.lang.Class, java.lang.Class)</td></tr><tr class="a"><td><img alt="Info" src="images/icon_info_sml.gif" /></td><td>Method 'public void isAssignableFrom(java.lang.Class, java.lang.Class, java.lang.String, java.lang.Object[])' has been added</td><td><a href="./xref/org/apache/commons/lang/Validate.html">org.apache.commons.lang.Validate</a></td><td>public void isAssignableFrom(java.lang.Class, java.lang.Class, java.lang.String, java.lang.Object[])</td></tr><tr class="b"><td><img alt="Info" src="images/icon_info_sml.gif" /></td><td>Method 'public void isInstanceOf(java.lang.Class, java.lang.Object)' has been added</td><td><a href="./xref/org/apache/commons/lang/Validate.html">org.apache.commons.lang.Validate</a></td><td>public void isInstanceOf(java.lang.Class, java.lang.Object)</td></tr><tr class="a"><td><img alt="Info" src="images/icon_info_sml.gif" /></td><td>Method 'public void isInstanceOf(java.lang.Class, java.lang.Object, java.lang.String, java.lang.Object[])' has been added</td><td><a href="./xref/org/apache/commons/lang/Validate.html">org.apache.commons.lang.Validate</a></td><td>public void isInstanceOf(java.lang.Class, java.lang.Object, java.lang.String, java.lang.Object[])</td></tr><tr class="b"><td><img alt="Info" src="images/icon_info_sml.gif" /></td><td>Method 'public void matchesPattern(java.lang.CharSequence, java.lang.String)' has been added</td><td><a href="./xref/org/apache/commons/lang/Validate.html">org.apache.commons.lang.Validate</a></td><td>public void matchesPattern(java.lang.CharSequence, java.lang.String)</td></tr><tr class="a"><td><img alt="Info" src="images/icon_info_sml.gif" /></td><td>Method 'public void matchesPattern(java.lang.CharSequence, java.lang.String, java.lang.String, java.lang.Object[])' has been added</td><td><a href="./xref/org/apache/commons/lang/Validate.html">org.apache.commons.lang.Validate</a></td><td>public void matchesPattern(java.lang.CharSequence, java.lang.String, java.lang.String, java.lang.Object[])</td></tr><tr class="b"><td><img alt="Info" src="images/icon_info_sml.gif" /></td><td>Method 'public java.lang.CharSequence notBlank(java.lang.CharSequence, java.lang.String, java.lang.Object[])' has been added</td><td><a href="./xref/org/apache/commons/lang/Validate.html">org.apache.commons.lang.Validate</a></td><td>public java.lang.CharSequence notBlank(java.lang.CharSequence, java.lang.String, java.lang.Object[])</td></tr><tr class="a"><td><img alt="Info" src="images/icon_info_sml.gif" /></td><td>Method 'public java.lang.CharSequence notBlank(java.lang.CharSequence)' has been added</td><td><a href="./xref/org/apache/commons/lang/Validate.html">org.apache.commons.lang.Validate</a></td><td>public java.lang.CharSequence notBlank(java.lang.CharSequence)</td></tr><tr class="b"><td><img alt="Info" src="images/icon_info_sml.gif" /></td><td>Method 'public java.lang.Object[] validIndex(java.lang.Object[], int, java.lang.String, java.lang.Object[])' has been added</td><td><a href="./xref/org/apache/commons/lang/Validate.html">org.apache.commons.lang.Validate</a></td><td>public java.lang.Object[] validIndex(java.lang.Object[], int, java.lang.String, java.lang.Object[])</td></tr><tr class="a"><td><img alt="Info" src="images/icon_info_sml.gif" /></td><td>Method 'public java.lang.Object[] validIndex(java.lang.Object[], int)' has been added</td><td><a href="./xref/org/apache/commons/lang/Validate.html">org.apache.commons.lang.Validate</a></td><td>public java.lang.Object[] validIndex(java.lang.Object[], int)</td></tr><tr class="b"><td><img alt="Info" src="images/icon_info_sml.gif" /></td><td>Method 'public java.util.Collection validIndex(java.util.Collection, int, java.lang.String, java.lang.Object[])' has been added</td><td><a href="./xref/org/apache/commons/lang/Validate.html">org.apache.commons.lang.Validate</a></td><td>public java.util.Collection validIndex(java.util.Collection, int, java.lang.String, java.lang.Object[])</td></tr><tr class="a"><td><img alt="Info" src="images/icon_info_sml.gif" /></td><td>Method 'public java.util.Collection validIndex(java.util.Collection, int)' has been added</td><td><a href="./xref/org/apache/commons/lang/Validate.html">org.apache.commons.lang.Validate</a></td><td>public java.util.Collection validIndex(java.util.Collection, int)</td></tr><tr class="b"><td><img alt="Info" src="images/icon_info_sml.gif" /></td><td>Method 'public java.lang.CharSequence validIndex(java.lang.CharSequence, int, java.lang.String, java.lang.Object[])' has been added</td><td><a href="./xref/org/apache/commons/lang/Validate.html">org.apache.commons.lang.Validate</a></td><td>public java.lang.CharSequence validIndex(java.lang.CharSequence, int, java.lang.String, java.lang.Object[])</td></tr><tr class="a"><td><img alt="Info" src="images/icon_info_sml.gif" /></td><td>Method 'public java.lang.CharSequence validIndex(java.lang.CharSequence, int)' has been added</td><td><a href="./xref/org/apache/commons/lang/Validate.html">org.apache.commons.lang.Validate</a></td><td>public java.lang.CharSequence validIndex(java.lang.CharSequence, int)</td></tr><tr class="b"><td><img alt="Info" src="images/icon_info_sml.gif" /></td><td>Method 'public void validState(boolean)' has been added</td><td><a href="./xref/org/apache/commons/lang/Validate.html">org.apache.commons.lang.Validate</a></td><td>public void validState(boolean)</td></tr><tr class="a"><td><img alt="Info" src="images/icon_info_sml.gif" /></td><td>Method 'public void validState(boolean, java.lang.String, java.lang.Object[])' has been added</td><td><a href="./xref/org/apache/commons/lang/Validate.html">org.apache.commons.lang.Validate</a></td><td>public void validState(boolean, java.lang.String, java.lang.Object[])</td></tr><tr class="b"><td><img alt="Info" src="images/icon_info_sml.gif" /></td><td>Class org.apache.commons.lang.builder.Builder added</td><td><a href="./xref/org/apache/commons/lang/builder/Builder.html">org.apache.commons.lang.builder.Builder</a></td><td></td></tr><tr class="a"><td><img alt="Info" src="images/icon_info_sml.gif" /></td><td>Added org.apache.commons.lang.builder.Builder to the set of implemented interfaces</td><td><a href="./xref/org/apache/commons/lang/builder/CompareToBuilder.html">org.apache.commons.lang.builder.CompareToBuilder</a></td><td></td></tr><tr class="b"><td><img alt="Info" src="images/icon_info_sml.gif" /></td><td>Method 'public java.lang.Integer build()' has been added</td><td><a href="./xref/org/apache/commons/lang/builder/CompareToBuilder.html">org.apache.commons.lang.builder.CompareToBuilder</a></td><td>public java.lang.Integer build()</td></tr><tr class="a"><td><img alt="Info" src="images/icon_info_sml.gif" /></td><td>Method 'public java.lang.Object build()' has been added</td><td><a href="./xref/org/apache/commons/lang/builder/CompareToBuilder.html">org.apache.commons.lang.builder.CompareToBuilder</a></td><td>public java.lang.Object build()</td></tr><tr class="b"><td><img alt="Info" src="images/icon_info_sml.gif" /></td><td>Added org.apache.commons.lang.builder.Builder to the set of implemented interfaces</td><td><a href="./xref/org/apache/commons/lang/builder/EqualsBuilder.html">org.apache.commons.lang.builder.EqualsBuilder</a></td><td></td></tr><tr class="a"><td><img alt="Info" src="images/icon_info_sml.gif" /></td><td>Method 'public java.lang.Boolean build()' has been added</td><td><a href="./xref/org/apache/commons/lang/builder/EqualsBuilder.html">org.apache.commons.lang.builder.EqualsBuilder</a></td><td>public java.lang.Boolean build()</td></tr><tr class="b"><td><img alt="Info" src="images/icon_info_sml.gif" /></td><td>Method 'public java.lang.Object build()' has been added</td><td><a href="./xref/org/apache/commons/lang/builder/EqualsBuilder.html">org.apache.commons.lang.builder.EqualsBuilder</a></td><td>public java.lang.Object build()</td></tr><tr class="a"><td><img alt="Info" src="images/icon_info_sml.gif" /></td><td>Added org.apache.commons.lang.builder.Builder to the set of implemented interfaces</td><td><a href="./xref/org/apache/commons/lang/builder/HashCodeBuilder.html">org.apache.commons.lang.builder.HashCodeBuilder</a></td><td></td></tr><tr class="b"><td><img alt="Info" src="images/icon_info_sml.gif" /></td><td>Method 'public java.lang.Integer build()' has been added</td><td><a href="./xref/org/apache/commons/lang/builder/HashCodeBuilder.html">org.apache.commons.lang.builder.HashCodeBuilder</a></td><td>public java.lang.Integer build()</td></tr><tr class="a"><td><img alt="Info" src="images/icon_info_sml.gif" /></td><td>Method 'public java.lang.Object build()' has been added</td><td><a href="./xref/org/apache/commons/lang/builder/HashCodeBuilder.html">org.apache.commons.lang.builder.HashCodeBuilder</a></td><td>public java.lang.Object build()</td></tr><tr class="b"><td><img alt="Info" src="images/icon_info_sml.gif" /></td><td>Added org.apache.commons.lang.builder.Builder to the set of implemented interfaces</td><td><a href="./xref/org/apache/commons/lang/builder/ReflectionToStringBuilder.html">org.apache.commons.lang.builder.ReflectionToStringBuilder</a></td><td></td></tr><tr class="a"><td><img alt="Info" src="images/icon_info_sml.gif" /></td><td>Accessibility of field excludeFieldNames has been increased from private to protected</td><td><a href="./xref/org/apache/commons/lang/builder/ReflectionToStringBuilder.html">org.apache.commons.lang.builder.ReflectionToStringBuilder</a></td><td>excludeFieldNames</td></tr><tr class="b"><td><img alt="Info" src="images/icon_info_sml.gif" /></td><td>Added org.apache.commons.lang.builder.Builder to the set of implemented interfaces</td><td><a href="./xref/org/apache/commons/lang/builder/ToStringBuilder.html">org.apache.commons.lang.builder.ToStringBuilder</a></td><td></td></tr><tr class="a"><td><img alt="Info" src="images/icon_info_sml.gif" /></td><td>Method 'public java.lang.String build()' has been added</td><td><a href="./xref/org/apache/commons/lang/builder/ToStringBuilder.html">org.apache.commons.lang.builder.ToStringBuilder</a></td><td>public java.lang.String build()</td></tr><tr class="b"><td><img alt="Info" src="images/icon_info_sml.gif" /></td><td>Method 'public java.lang.Object build()' has been added</td><td><a href="./xref/org/apache/commons/lang/builder/ToStringBuilder.html">org.apache.commons.lang.builder.ToStringBuilder</a></td><td>public java.lang.Object build()</td></tr><tr class="a"><td><img alt="Info" src="images/icon_info_sml.gif" /></td><td>Class org.apache.commons.lang.concurrent.AtomicInitializer added</td><td><a href="./xref/org/apache/commons/lang/concurrent/AtomicInitializer.html">org.apache.commons.lang.concurrent.AtomicInitializer</a></td><td></td></tr><tr class="b"><td><img alt="Info" src="images/icon_info_sml.gif" /></td><td>Class org.apache.commons.lang.concurrent.AtomicSafeInitializer added</td><td><a href="./xref/org/apache/commons/lang/concurrent/AtomicSafeInitializer.html">org.apache.commons.lang.concurrent.AtomicSafeInitializer</a></td><td></td></tr><tr class="a"><td><img alt="Info" src="images/icon_info_sml.gif" /></td><td>Class org.apache.commons.lang.concurrent.BackgroundInitializer added</td><td><a href="./xref/org/apache/commons/lang/concurrent/BackgroundInitializer.html">org.apache.commons.lang.concurrent.BackgroundInitializer</a></td><td></td></tr><tr class="b"><td><img alt="Info" src="images/icon_info_sml.gif" /></td><td>Class org.apache.commons.lang.concurrent.BasicThreadFactory added</td><td><a href="./xref/org/apache/commons/lang/concurrent/BasicThreadFactory.html">org.apache.commons.lang.concurrent.BasicThreadFactory</a></td><td></td></tr><tr class="a"><td><img alt="Info" src="images/icon_info_sml.gif" /></td><td>Class org.apache.commons.lang.concurrent.BasicThreadFactory$Builder added</td><td><a href="./xref/org/apache/commons/lang/concurrent/BasicThreadFactory$Builder.html">org.apache.commons.lang.concurrent.BasicThreadFactory$Builder</a></td><td></td></tr><tr class="b"><td><img alt="Info" src="images/icon_info_sml.gif" /></td><td>Class org.apache.commons.lang.concurrent.CallableBackgroundInitializer added</td><td><a href="./xref/org/apache/commons/lang/concurrent/CallableBackgroundInitializer.html">org.apache.commons.lang.concurrent.CallableBackgroundInitializer</a></td><td></td></tr><tr class="a"><td><img alt="Info" src="images/icon_info_sml.gif" /></td><td>Class org.apache.commons.lang.concurrent.ConcurrentException added</td><td><a href="./xref/org/apache/commons/lang/concurrent/ConcurrentException.html">org.apache.commons.lang.concurrent.ConcurrentException</a></td><td></td></tr><tr class="b"><td><img alt="Info" src="images/icon_info_sml.gif" /></td><td>Class org.apache.commons.lang.concurrent.ConcurrentInitializer added</td><td><a href="./xref/org/apache/commons/lang/concurrent/ConcurrentInitializer.html">org.apache.commons.lang.concurrent.ConcurrentInitializer</a></td><td></td></tr><tr class="a"><td><img alt="Info" src="images/icon_info_sml.gif" /></td><td>Class org.apache.commons.lang.concurrent.ConcurrentRuntimeException added</td><td><a href="./xref/org/apache/commons/lang/concurrent/ConcurrentRuntimeException.html">org.apache.commons.lang.concurrent.ConcurrentRuntimeException</a></td><td></td></tr><tr class="b"><td><img alt="Info" src="images/icon_info_sml.gif" /></td><td>Class org.apache.commons.lang.concurrent.ConcurrentUtils added</td><td><a href="./xref/org/apache/commons/lang/concurrent/ConcurrentUtils.html">org.apache.commons.lang.concurrent.ConcurrentUtils</a></td><td></td></tr><tr class="a"><td><img alt="Info" src="images/icon_info_sml.gif" /></td><td>Class org.apache.commons.lang.concurrent.ConstantInitializer added</td><td><a href="./xref/org/apache/commons/lang/concurrent/ConstantInitializer.html">org.apache.commons.lang.concurrent.ConstantInitializer</a></td><td></td></tr><tr class="b"><td><img alt="Info" src="images/icon_info_sml.gif" /></td><td>Class org.apache.commons.lang.concurrent.LazyInitializer added</td><td><a href="./xref/org/apache/commons/lang/concurrent/LazyInitializer.html">org.apache.commons.lang.concurrent.LazyInitializer</a></td><td></td></tr><tr class="a"><td><img alt="Info" src="images/icon_info_sml.gif" /></td><td>Class org.apache.commons.lang.concurrent.MultiBackgroundInitializer added</td><td><a href="./xref/org/apache/commons/lang/concurrent/MultiBackgroundInitializer.html">org.apache.commons.lang.concurrent.MultiBackgroundInitializer</a></td><td></td></tr><tr class="b"><td><img alt="Info" src="images/icon_info_sml.gif" /></td><td>Class org.apache.commons.lang.concurrent.MultiBackgroundInitializer$MultiBackgroundInitializerResults added</td><td><a href="./xref/org/apache/commons/lang/concurrent/MultiBackgroundInitializer$MultiBackgroundInitializerResults.html">org.apache.commons.lang.concurrent.MultiBackgroundInitializer$MultiBackgroundInitializerResults</a></td><td></td></tr><tr class="a"><td><img alt="Info" src="images/icon_info_sml.gif" /></td><td>Class org.apache.commons.lang.concurrent.TimedSemaphore added</td><td><a href="./xref/org/apache/commons/lang/concurrent/TimedSemaphore.html">org.apache.commons.lang.concurrent.TimedSemaphore</a></td><td></td></tr><tr class="b"><td><img alt="Info" src="images/icon_info_sml.gif" /></td><td>Class org.apache.commons.lang.event.EventListenerSupport added</td><td><a href="./xref/org/apache/commons/lang/event/EventListenerSupport.html">org.apache.commons.lang.event.EventListenerSupport</a></td><td></td></tr><tr class="a"><td><img alt="Info" src="images/icon_info_sml.gif" /></td><td>Class org.apache.commons.lang.event.EventListenerSupport$ProxyInvocationHandler added</td><td><a href="./xref/org/apache/commons/lang/event/EventListenerSupport$ProxyInvocationHandler.html">org.apache.commons.lang.event.EventListenerSupport$ProxyInvocationHandler</a></td><td></td></tr><tr class="b"><td><img alt="Info" src="images/icon_info_sml.gif" /></td><td>Class org.apache.commons.lang.event.EventUtils added</td><td><a href="./xref/org/apache/commons/lang/event/EventUtils.html">org.apache.commons.lang.event.EventUtils</a></td><td></td></tr><tr class="a"><td><img alt="Info" src="images/icon_info_sml.gif" /></td><td>Class org.apache.commons.lang.exception.ContextedException added</td><td><a href="./xref/org/apache/commons/lang/exception/ContextedException.html">org.apache.commons.lang.exception.ContextedException</a></td><td></td></tr><tr class="b"><td><img alt="Info" src="images/icon_info_sml.gif" /></td><td>Class org.apache.commons.lang.exception.ContextedRuntimeException added</td><td><a href="./xref/org/apache/commons/lang/exception/ContextedRuntimeException.html">org.apache.commons.lang.exception.ContextedRuntimeException</a></td><td></td></tr><tr class="a"><td><img alt="Info" src="images/icon_info_sml.gif" /></td><td>Class org.apache.commons.lang.exception.DefaultExceptionContext added</td><td><a href="./xref/org/apache/commons/lang/exception/DefaultExceptionContext.html">org.apache.commons.lang.exception.DefaultExceptionContext</a></td><td></td></tr><tr class="b"><td><img alt="Info" src="images/icon_info_sml.gif" /></td><td>Class org.apache.commons.lang.exception.ExceptionContext added</td><td><a href="./xref/org/apache/commons/lang/exception/ExceptionContext.html">org.apache.commons.lang.exception.ExceptionContext</a></td><td></td></tr><tr class="a"><td><img alt="Info" src="images/icon_info_sml.gif" /></td><td>Method 'public java.lang.Throwable getCause(java.lang.Throwable)' has been deprecated</td><td><a href="./xref/org/apache/commons/lang/exception/ExceptionUtils.html">org.apache.commons.lang.exception.ExceptionUtils</a></td><td>public java.lang.Throwable getCause(java.lang.Throwable)</td></tr><tr class="b"><td><img alt="Info" src="images/icon_info_sml.gif" /></td><td>Method 'public java.lang.Throwable getCause(java.lang.Throwable, java.lang.String[])' has been deprecated</td><td><a href="./xref/org/apache/commons/lang/exception/ExceptionUtils.html">org.apache.commons.lang.exception.ExceptionUtils</a></td><td>public java.lang.Throwable getCause(java.lang.Throwable, java.lang.String[])</td></tr><tr class="a"><td><img alt="Info" src="images/icon_info_sml.gif" /></td><td>Method 'public java.lang.String[] getDefaultCauseMethodNames()' has been added</td><td><a href="./xref/org/apache/commons/lang/exception/ExceptionUtils.html">org.apache.commons.lang.exception.ExceptionUtils</a></td><td>public java.lang.String[] getDefaultCauseMethodNames()</td></tr><tr class="b"><td><img alt="Info" src="images/icon_info_sml.gif" /></td><td>Method 'public int compareTo(org.apache.commons.lang.math.Fraction)' has been added</td><td><a href="./xref/org/apache/commons/lang/math/Fraction.html">org.apache.commons.lang.math.Fraction</a></td><td>public int compareTo(org.apache.commons.lang.math.Fraction)</td></tr><tr class="a"><td><img alt="Info" src="images/icon_info_sml.gif" /></td><td>Method 'public int compareTo(org.apache.commons.lang.mutable.MutableBoolean)' has been added</td><td><a href="./xref/org/apache/commons/lang/mutable/MutableBoolean.html">org.apache.commons.lang.mutable.MutableBoolean</a></td><td>public int compareTo(org.apache.commons.lang.mutable.MutableBoolean)</td></tr><tr class="b"><td><img alt="Info" src="images/icon_info_sml.gif" /></td><td>Method 'public java.lang.Object getValue()' has been added</td><td><a href="./xref/org/apache/commons/lang/mutable/MutableBoolean.html">org.apache.commons.lang.mutable.MutableBoolean</a></td><td>public java.lang.Object getValue()</td></tr><tr class="a"><td><img alt="Info" src="images/icon_info_sml.gif" /></td><td>Method 'public void setValue(java.lang.Boolean)' has been added</td><td><a href="./xref/org/apache/commons/lang/mutable/MutableBoolean.html">org.apache.commons.lang.mutable.MutableBoolean</a></td><td>public void setValue(java.lang.Boolean)</td></tr><tr class="b"><td><img alt="Info" src="images/icon_info_sml.gif" /></td><td>Method 'public int compareTo(org.apache.commons.lang.mutable.MutableByte)' has been added</td><td><a href="./xref/org/apache/commons/lang/mutable/MutableByte.html">org.apache.commons.lang.mutable.MutableByte</a></td><td>public int compareTo(org.apache.commons.lang.mutable.MutableByte)</td></tr><tr class="a"><td><img alt="Info" src="images/icon_info_sml.gif" /></td><td>Method 'public java.lang.Object getValue()' has been added</td><td><a href="./xref/org/apache/commons/lang/mutable/MutableByte.html">org.apache.commons.lang.mutable.MutableByte</a></td><td>public java.lang.Object getValue()</td></tr><tr class="b"><td><img alt="Info" src="images/icon_info_sml.gif" /></td><td>Method 'public void setValue(java.lang.Number)' has been added</td><td><a href="./xref/org/apache/commons/lang/mutable/MutableByte.html">org.apache.commons.lang.mutable.MutableByte</a></td><td>public void setValue(java.lang.Number)</td></tr><tr class="a"><td><img alt="Info" src="images/icon_info_sml.gif" /></td><td>Method 'public int compareTo(org.apache.commons.lang.mutable.MutableDouble)' has been added</td><td><a href="./xref/org/apache/commons/lang/mutable/MutableDouble.html">org.apache.commons.lang.mutable.MutableDouble</a></td><td>public int compareTo(org.apache.commons.lang.mutable.MutableDouble)</td></tr><tr class="b"><td><img alt="Info" src="images/icon_info_sml.gif" /></td><td>Method 'public java.lang.Object getValue()' has been added</td><td><a href="./xref/org/apache/commons/lang/mutable/MutableDouble.html">org.apache.commons.lang.mutable.MutableDouble</a></td><td>public java.lang.Object getValue()</td></tr><tr class="a"><td><img alt="Info" src="images/icon_info_sml.gif" /></td><td>Method 'public void setValue(java.lang.Number)' has been added</td><td><a href="./xref/org/apache/commons/lang/mutable/MutableDouble.html">org.apache.commons.lang.mutable.MutableDouble</a></td><td>public void setValue(java.lang.Number)</td></tr><tr class="b"><td><img alt="Info" src="images/icon_info_sml.gif" /></td><td>Method 'public int compareTo(org.apache.commons.lang.mutable.MutableFloat)' has been added</td><td><a href="./xref/org/apache/commons/lang/mutable/MutableFloat.html">org.apache.commons.lang.mutable.MutableFloat</a></td><td>public int compareTo(org.apache.commons.lang.mutable.MutableFloat)</td></tr><tr class="a"><td><img alt="Info" src="images/icon_info_sml.gif" /></td><td>Method 'public java.lang.Object getValue()' has been added</td><td><a href="./xref/org/apache/commons/lang/mutable/MutableFloat.html">org.apache.commons.lang.mutable.MutableFloat</a></td><td>public java.lang.Object getValue()</td></tr><tr class="b"><td><img alt="Info" src="images/icon_info_sml.gif" /></td><td>Method 'public void setValue(java.lang.Number)' has been added</td><td><a href="./xref/org/apache/commons/lang/mutable/MutableFloat.html">org.apache.commons.lang.mutable.MutableFloat</a></td><td>public void setValue(java.lang.Number)</td></tr><tr class="a"><td><img alt="Info" src="images/icon_info_sml.gif" /></td><td>Method 'public int compareTo(org.apache.commons.lang.mutable.MutableInt)' has been added</td><td><a href="./xref/org/apache/commons/lang/mutable/MutableInt.html">org.apache.commons.lang.mutable.MutableInt</a></td><td>public int compareTo(org.apache.commons.lang.mutable.MutableInt)</td></tr><tr class="b"><td><img alt="Info" src="images/icon_info_sml.gif" /></td><td>Method 'public java.lang.Object getValue()' has been added</td><td><a href="./xref/org/apache/commons/lang/mutable/MutableInt.html">org.apache.commons.lang.mutable.MutableInt</a></td><td>public java.lang.Object getValue()</td></tr><tr class="a"><td><img alt="Info" src="images/icon_info_sml.gif" /></td><td>Method 'public void setValue(java.lang.Number)' has been added</td><td><a href="./xref/org/apache/commons/lang/mutable/MutableInt.html">org.apache.commons.lang.mutable.MutableInt</a></td><td>public void setValue(java.lang.Number)</td></tr><tr class="b"><td><img alt="Info" src="images/icon_info_sml.gif" /></td><td>Method 'public int compareTo(org.apache.commons.lang.mutable.MutableLong)' has been added</td><td><a href="./xref/org/apache/commons/lang/mutable/MutableLong.html">org.apache.commons.lang.mutable.MutableLong</a></td><td>public int compareTo(org.apache.commons.lang.mutable.MutableLong)</td></tr><tr class="a"><td><img alt="Info" src="images/icon_info_sml.gif" /></td><td>Method 'public java.lang.Object getValue()' has been added</td><td><a href="./xref/org/apache/commons/lang/mutable/MutableLong.html">org.apache.commons.lang.mutable.MutableLong</a></td><td>public java.lang.Object getValue()</td></tr><tr class="b"><td><img alt="Info" src="images/icon_info_sml.gif" /></td><td>Method 'public void setValue(java.lang.Number)' has been added</td><td><a href="./xref/org/apache/commons/lang/mutable/MutableLong.html">org.apache.commons.lang.mutable.MutableLong</a></td><td>public void setValue(java.lang.Number)</td></tr><tr class="a"><td><img alt="Info" src="images/icon_info_sml.gif" /></td><td>Method 'public int compareTo(org.apache.commons.lang.mutable.MutableShort)' has been added</td><td><a href="./xref/org/apache/commons/lang/mutable/MutableShort.html">org.apache.commons.lang.mutable.MutableShort</a></td><td>public int compareTo(org.apache.commons.lang.mutable.MutableShort)</td></tr><tr class="b"><td><img alt="Info" src="images/icon_info_sml.gif" /></td><td>Method 'public java.lang.Object getValue()' has been added</td><td><a href="./xref/org/apache/commons/lang/mutable/MutableShort.html">org.apache.commons.lang.mutable.MutableShort</a></td><td>public java.lang.Object getValue()</td></tr><tr class="a"><td><img alt="Info" src="images/icon_info_sml.gif" /></td><td>Method 'public void setValue(java.lang.Number)' has been added</td><td><a href="./xref/org/apache/commons/lang/mutable/MutableShort.html">org.apache.commons.lang.mutable.MutableShort</a></td><td>public void setValue(java.lang.Number)</td></tr><tr class="b"><td><img alt="Info" src="images/icon_info_sml.gif" /></td><td>Class org.apache.commons.lang.reflect.TypeUtils added</td><td><a href="./xref/org/apache/commons/lang/reflect/TypeUtils.html">org.apache.commons.lang.reflect.TypeUtils</a></td><td></td></tr><tr class="a"><td><img alt="Info" src="images/icon_info_sml.gif" /></td><td>Class org.apache.commons.lang.text.FormattableUtils added</td><td><a href="./xref/org/apache/commons/lang/text/FormattableUtils.html">org.apache.commons.lang.text.FormattableUtils</a></td><td></td></tr><tr class="b"><td><img alt="Info" src="images/icon_info_sml.gif" /></td><td>Added java.lang.Appendable to the set of implemented interfaces</td><td><a href="./xref/org/apache/commons/lang/text/StrBuilder.html">org.apache.commons.lang.text.StrBuilder</a></td><td></td></tr><tr class="a"><td><img alt="Info" src="images/icon_info_sml.gif" /></td><td>Added java.lang.CharSequence to the set of implemented interfaces</td><td><a href="./xref/org/apache/commons/lang/text/StrBuilder.html">org.apache.commons.lang.text.StrBuilder</a></td><td></td></tr><tr class="b"><td><img alt="Info" src="images/icon_info_sml.gif" /></td><td>Method 'public org.apache.commons.lang.text.StrBuilder append(java.lang.CharSequence)' has been added</td><td><a href="./xref/org/apache/commons/lang/text/StrBuilder.html">org.apache.commons.lang.text.StrBuilder</a></td><td>public org.apache.commons.lang.text.StrBuilder append(java.lang.CharSequence)</td></tr><tr class="a"><td><img alt="Info" src="images/icon_info_sml.gif" /></td><td>Method 'public org.apache.commons.lang.text.StrBuilder append(java.lang.CharSequence, int, int)' has been added</td><td><a href="./xref/org/apache/commons/lang/text/StrBuilder.html">org.apache.commons.lang.text.StrBuilder</a></td><td>public org.apache.commons.lang.text.StrBuilder append(java.lang.CharSequence, int, int)</td></tr><tr class="b"><td><img alt="Info" src="images/icon_info_sml.gif" /></td><td>Method 'public java.lang.Appendable append(char)' has been added</td><td><a href="./xref/org/apache/commons/lang/text/StrBuilder.html">org.apache.commons.lang.text.StrBuilder</a></td><td>public java.lang.Appendable append(char)</td></tr><tr class="a"><td><img alt="Info" src="images/icon_info_sml.gif" /></td><td>Method 'public java.lang.Appendable append(java.lang.CharSequence, int, int)' has been added</td><td><a href="./xref/org/apache/commons/lang/text/StrBuilder.html">org.apache.commons.lang.text.StrBuilder</a></td><td>public java.lang.Appendable append(java.lang.CharSequence, int, int)</td></tr><tr class="b"><td><img alt="Info" src="images/icon_info_sml.gif" /></td><td>Method 'public java.lang.Appendable append(java.lang.CharSequence)' has been added</td><td><a href="./xref/org/apache/commons/lang/text/StrBuilder.html">org.apache.commons.lang.text.StrBuilder</a></td><td>public java.lang.Appendable append(java.lang.CharSequence)</td></tr><tr class="a"><td><img alt="Info" src="images/icon_info_sml.gif" /></td><td>Method 'public java.lang.CharSequence subSequence(int, int)' has been added</td><td><a href="./xref/org/apache/commons/lang/text/StrBuilder.html">org.apache.commons.lang.text.StrBuilder</a></td><td>public java.lang.CharSequence subSequence(int, int)</td></tr><tr class="b"><td><img alt="Info" src="images/icon_info_sml.gif" /></td><td>Method 'public void add(java.lang.String)' has been added</td><td><a href="./xref/org/apache/commons/lang/text/StrTokenizer.html">org.apache.commons.lang.text.StrTokenizer</a></td><td>public void add(java.lang.String)</td></tr><tr class="a"><td><img alt="Info" src="images/icon_info_sml.gif" /></td><td>Method 'public java.lang.Object next()' has been added</td><td><a href="./xref/org/apache/commons/lang/text/StrTokenizer.html">org.apache.commons.lang.text.StrTokenizer</a></td><td>public java.lang.Object next()</td></tr><tr class="b"><td><img alt="Info" src="images/icon_info_sml.gif" /></td><td>Method 'public java.lang.Object previous()' has been added</td><td><a href="./xref/org/apache/commons/lang/text/StrTokenizer.html">org.apache.commons.lang.text.StrTokenizer</a></td><td>public java.lang.Object previous()</td></tr><tr class="a"><td><img alt="Info" src="images/icon_info_sml.gif" /></td><td>Method 'public void set(java.lang.String)' has been added</td><td><a href="./xref/org/apache/commons/lang/text/StrTokenizer.html">org.apache.commons.lang.text.StrTokenizer</a></td><td>public void set(java.lang.String)</td></tr><tr class="b"><td><img alt="Info" src="images/icon_info_sml.gif" /></td><td>Class org.apache.commons.lang.text.WordUtils added</td><td><a href="./xref/org/apache/commons/lang/text/WordUtils.html">org.apache.commons.lang.text.WordUtils</a></td><td></td></tr><tr class="a"><td><img alt="Info" src="images/icon_info_sml.gif" /></td><td>Class org.apache.commons.lang.text.translate.AggregateTranslator added</td><td><a href="./xref/org/apache/commons/lang/text/translate/AggregateTranslator.html">org.apache.commons.lang.text.translate.AggregateTranslator</a></td><td></td></tr><tr class="b"><td><img alt="Info" src="images/icon_info_sml.gif" /></td><td>Class org.apache.commons.lang.text.translate.CharSequenceTranslator added</td><td><a href="./xref/org/apache/commons/lang/text/translate/CharSequenceTranslator.html">org.apache.commons.lang.text.translate.CharSequenceTranslator</a></td><td></td></tr><tr class="a"><td><img alt="Info" src="images/icon_info_sml.gif" /></td><td>Class org.apache.commons.lang.text.translate.CodePointTranslator added</td><td><a href="./xref/org/apache/commons/lang/text/translate/CodePointTranslator.html">org.apache.commons.lang.text.translate.CodePointTranslator</a></td><td></td></tr><tr class="b"><td><img alt="Info" src="images/icon_info_sml.gif" /></td><td>Class org.apache.commons.lang.text.translate.EntityArrays added</td><td><a href="./xref/org/apache/commons/lang/text/translate/EntityArrays.html">org.apache.commons.lang.text.translate.EntityArrays</a></td><td></td></tr><tr class="a"><td><img alt="Info" src="images/icon_info_sml.gif" /></td><td>Class org.apache.commons.lang.text.translate.LookupTranslator added</td><td><a href="./xref/org/apache/commons/lang/text/translate/LookupTranslator.html">org.apache.commons.lang.text.translate.LookupTranslator</a></td><td></td></tr><tr class="b"><td><img alt="Info" src="images/icon_info_sml.gif" /></td><td>Class org.apache.commons.lang.text.translate.NumericEntityEscaper added</td><td><a href="./xref/org/apache/commons/lang/text/translate/NumericEntityEscaper.html">org.apache.commons.lang.text.translate.NumericEntityEscaper</a></td><td></td></tr><tr class="a"><td><img alt="Info" src="images/icon_info_sml.gif" /></td><td>Class org.apache.commons.lang.text.translate.NumericEntityUnescaper added</td><td><a href="./xref/org/apache/commons/lang/text/translate/NumericEntityUnescaper.html">org.apache.commons.lang.text.translate.NumericEntityUnescaper</a></td><td></td></tr><tr class="b"><td><img alt="Info" src="images/icon_info_sml.gif" /></td><td>Class org.apache.commons.lang.text.translate.NumericEntityUnescaper$OPTION added</td><td><a href="./xref/org/apache/commons/lang/text/translate/NumericEntityUnescaper$OPTION.html">org.apache.commons.lang.text.translate.NumericEntityUnescaper$OPTION</a></td><td></td></tr><tr class="a"><td><img alt="Info" src="images/icon_info_sml.gif" /></td><td>Class org.apache.commons.lang.text.translate.OctalUnescaper added</td><td><a href="./xref/org/apache/commons/lang/text/translate/OctalUnescaper.html">org.apache.commons.lang.text.translate.OctalUnescaper</a></td><td></td></tr><tr class="b"><td><img alt="Info" src="images/icon_info_sml.gif" /></td><td>Class org.apache.commons.lang.text.translate.UnicodeEscaper added</td><td><a href="./xref/org/apache/commons/lang/text/translate/UnicodeEscaper.html">org.apache.commons.lang.text.translate.UnicodeEscaper</a></td><td></td></tr><tr class="a"><td><img alt="Info" src="images/icon_info_sml.gif" /></td><td>Class org.apache.commons.lang.text.translate.UnicodeUnescaper added</td><td><a href="./xref/org/apache/commons/lang/text/translate/UnicodeUnescaper.html">org.apache.commons.lang.text.translate.UnicodeUnescaper</a></td><td></td></tr><tr class="b"><td><img alt="Info" src="images/icon_info_sml.gif" /></td><td>Method 'public java.util.Date add(java.util.Date, int, int)' is no longer deprecated</td><td><a href="./xref/org/apache/commons/lang/time/DateUtils.html">org.apache.commons.lang.time.DateUtils</a></td><td>public java.util.Date add(java.util.Date, int, int)</td></tr><tr class="a"><td><img alt="Info" src="images/icon_info_sml.gif" /></td><td>Method 'public long getNanoTime()' has been added</td><td><a href="./xref/org/apache/commons/lang/time/StopWatch.html">org.apache.commons.lang.time.StopWatch</a></td><td>public long getNanoTime()</td></tr><tr class="b"><td><img alt="Info" src="images/icon_info_sml.gif" /></td><td>Method 'public long getSplitNanoTime()' has been added</td><td><a href="./xref/org/apache/commons/lang/time/StopWatch.html">org.apache.commons.lang.time.StopWatch</a></td><td>public long getSplitNanoTime()</td></tr><tr class="a"><td><img alt="Info" src="images/icon_info_sml.gif" /></td><td>Class org.apache.commons.lang.tuple.ImmutablePair added</td><td><a href="./xref/org/apache/commons/lang/tuple/ImmutablePair.html">org.apache.commons.lang.tuple.ImmutablePair</a></td><td></td></tr><tr class="b"><td><img alt="Info" src="images/icon_info_sml.gif" /></td><td>Class org.apache.commons.lang.tuple.MutablePair added</td><td><a href="./xref/org/apache/commons/lang/tuple/MutablePair.html">org.apache.commons.lang.tuple.MutablePair</a></td><td></td></tr><tr class="a"><td><img alt="Info" src="images/icon_info_sml.gif" /></td><td>Class org.apache.commons.lang.tuple.Pair added</td><td><a href="./xref/org/apache/commons/lang/tuple/Pair.html">org.apache.commons.lang.tuple.Pair</a></td><td></td></tr></table></div>
-      </div>
-    </div>
-    <div class="clear">
-      <hr/>
-    </div>
-    <div id="footer">
-      <div class="center">Copyright &#169;                    2001-2011
-                        <a href="http://www.apache.org/">The Apache Software Foundation</a>.
-            All Rights Reserved.      
-                
-      </div>
-                          
-<div class="center">Apache Commons, Apache Commons Lang, Apache, the Apache feather logo, and the Apache Commons project logos are trademarks of The Apache Software Foundation.
-      All other marks mentioned may be trademarks or registered trademarks of their respective owners.</div>
-                <div class="clear">
-        <hr/>
-      </div>
-    </div>
-  </body>
-</html>
diff --git a/lang/src/site/resources/profile.cobertura b/lang/src/site/resources/profile.cobertura
deleted file mode 100644
index e69de29..0000000
--- a/lang/src/site/resources/profile.cobertura
+++ /dev/null
diff --git a/lang/src/site/resources/release-notes/RELEASE-NOTES-1.0.1.txt b/lang/src/site/resources/release-notes/RELEASE-NOTES-1.0.1.txt
deleted file mode 100644
index ac2f776..0000000
--- a/lang/src/site/resources/release-notes/RELEASE-NOTES-1.0.1.txt
+++ /dev/null
@@ -1,48 +0,0 @@
-$Id: RELEASE-NOTES.txt,v 1.4.2.1 2002/11/23 02:52:02 bayard Exp $
-
-			Commons Lang Package
-			   Version 1.0.1
-			    Release Notes
-
-
-INTRODUCTION:
-
-This document contains the release notes for this version of the Commons
-Lang package. Commons Lang is a set of utility functions and reusable 
-components that should be a help in any Java environment.
-
-NEW FEATURES:
-
-This release is a bugfix release for the Lang 1.0 release. There are no new features.
-
-BUG FIXES:
-
-#14062:     StringUtils.split fails to handle (String, null, int) correctly.
-            This results in the String "null" appearing in the split text, when 
-            the text is not entirely consumed in the split, ie) int is less 
-            than the number of whitespace tokens in the String.
-            Fix is courtesy of Mark McDowell.
-
-#-    :     SystemUtils.isJavaVersionAtLeast made static.
-
-#-    :     NumberUtils test fails in JDK 1.2 due to lack of 1.2 support for 
-            "1.1E-700F". Fix is to use SystemUtils to protect it for the moment.
-
-#-    :     ToStringStyle did not compile under JDK 1.2 due to inner class 
-            issues. Added explicit 'this.' prefixes to make this so.
-
-#14566:     NumberRange.getMaximum was returning the minimum.
-            Bug reported by Kasper Ronning.
-
-#13527:     ExceptionUtils now handles getCausedByException and getRootCause 
-            from EJBException and ServletException, as reported by Lars Beuster.
-
-#14334:     NestableDelegate now implements Serializable, as reported by 
-            Max Rydahl Andersen.
-
-#13568:     Enums cannot now be created with the same name as an already 
-            existing Enum. Enum now compiles under JDK 1.2.
-
-DEPRECATIONS:
-
-Solely a bugfix version.
diff --git a/lang/src/site/resources/release-notes/RELEASE-NOTES-1.0.txt b/lang/src/site/resources/release-notes/RELEASE-NOTES-1.0.txt
deleted file mode 100644
index 3164f74..0000000
--- a/lang/src/site/resources/release-notes/RELEASE-NOTES-1.0.txt
+++ /dev/null
@@ -1,146 +0,0 @@
-$Id: RELEASE-NOTES.txt,v 1.4 2002/09/25 10:29:56 scolebourne Exp $
-
-			Commons Lang Package
-			   Version 1.0
-			    Release Notes
-
-
-INTRODUCTION:
-
-This document contains the release notes for this version of the Commons
-Lang package. Commons Lang is a set of utility functions and reusable 
-components that should be a help in any Java environment.
-
-NEW FEATURES:
-
-Since the release of the b1 package the following have been added:
-
-lang.
-    SystemUtils: 
-      Brings together many system specific variables under one easy component.
-
-exception.
-    ExceptionUtils: 
-      Provides helpful static functions for dealing with Exceptions.
-    NestableError : 
-      Adds nesting ability to Errors.
-
-enum sub-package: 
-    A solid version of the typical Java translation of a C enum.
-
-builder sub-package: 
-    A series of helpers for handling standard Object methods such as equals,
-    toString, compareTo and hashCode in a professional manner.
-
-
-BUG FIXES:
-
-StringUtils.stripStart and stripEnd were improved to match their Javadoc. 
-StringUtils.convertUnicodeToNative and convertNativeToUnicode both removed. 
-    Both methods did not work properly.
-
-
-DEPRECATIONS:
-
-Much of the exception subpackage was reworked between 1.0-b1 and 1.0. Apart 
-from this the API should have a high level of backward compatibility.
-
-
-CHANGES:   [In 'diff' format]
-
-Jar changes
-===========
-> org.apache.commons.lang.exception.ExceptionUtils
-> org.apache.commons.lang.exception.NestableError
-> org.apache.commons.lang.ObjectUtils$Null
-> org.apache.commons.lang.ObjectUtils$1
-> org.apache.commons.lang.enum.Enum$Entry
-> org.apache.commons.lang.enum.Enum$1
-> org.apache.commons.lang.enum.Enum
-> org.apache.commons.lang.enum.EnumUtils
-> org.apache.commons.lang.enum.ValuedEnum
-> org.apache.commons.lang.builder.CompareToBuilder
-> org.apache.commons.lang.builder.EqualsBuilder
-> org.apache.commons.lang.builder.HashCodeBuilder
-> org.apache.commons.lang.builder.StandardToStringStyle
-> org.apache.commons.lang.builder.ToStringStyle$DefaultToStringStyle
-> org.apache.commons.lang.builder.ToStringStyle$NoFieldNameToStringStyle
-> org.apache.commons.lang.builder.ToStringStyle$SimpleToStringStyle
-> org.apache.commons.lang.builder.ToStringStyle$MultiLineToStringStyle
-> org.apache.commons.lang.builder.ToStringStyle$1
-> org.apache.commons.lang.builder.ToStringStyle
-> org.apache.commons.lang.builder.ToStringBuilder
-> org.apache.commons.lang.SystemUtils
-
-
-Class changes
-=============
-org.apache.commons.lang.exception.Nestable
---------------------
-<     public abstract int getLength();
->     public abstract int getThrowableCount();
-<     public abstract int indexOfThrowable(int, java.lang.Class);
----
->     public abstract int indexOfThrowable(java.lang.Class, int);
->     public abstract void printStackTrace(java.io.PrintStream);
-
-org.apache.commons.lang.exception.NestableDelegate
---------------------
-<     int getLength();
-<     java.lang.String getMessage(java.lang.String);
->     java.lang.String getMessage(java.lang.String);
->     java.lang.String getMessages()[];
->     int getThrowableCount();
-<     java.lang.String getMessages()[];
-<     int indexOfThrowable(int, java.lang.Class);
----
->     int indexOfThrowable(java.lang.Class, int);
-
-org.apache.commons.lang.exception.NestableException
---------------------
-<     public int getLength();
->     public java.lang.String getMessage(int);
->     public int getThrowableCount();
-<     public java.lang.String getMessage(int);
-<     public int indexOfThrowable(int, java.lang.Class);
----
->     public int indexOfThrowable(java.lang.Class, int);
-
-org.apache.commons.lang.exception.NestableRuntimeException
---------------------
-<     public int getLength();
->     public java.lang.String getMessage(int);
->     public int getThrowableCount();
-<     public java.lang.String getMessage(int);
-<     public int indexOfThrowable(int, java.lang.Class);
----
->     public int indexOfThrowable(java.lang.Class, int);
-
-org.apache.commons.lang.NumberUtils
---------------------
->     public static long minimum(long, long, long);
->     public static long maximum(long, long, long);
->     public static int compare(double, double);
->     public static int compare(float, float);
-
-org.apache.commons.lang.ObjectUtils
---------------------
->     public static final org.apache.commons.lang.ObjectUtils.Null NULL;
->     public org.apache.commons.lang.ObjectUtils();
->     public static java.lang.String identityToString(java.lang.Object);
->     static {};
->     public static class org.apache.commons.lang.ObjectUtils. Null extends java.lang.Object implements java.io.Serializable 
-
-org.apache.commons.lang.RandomStringUtils
---------------------
->     public org.apache.commons.lang.RandomStringUtils();
-
-org.apache.commons.lang.StringUtils
---------------------
->     public org.apache.commons.lang.StringUtils();
-<     public static java.lang.String stackTrace(java.lang.Throwable);
-<     public static java.lang.String convertUnicodeToNative(java.lang.String, java.lang.String) throws java.io.IOException;
-<     public static java.lang.String convertNativeToUnicode(java.lang.String, java.lang.String) throws java.io.IOException;
----
->     public static boolean containsOnly(java.lang.String, char[]);
-
diff --git a/lang/src/site/resources/release-notes/RELEASE-NOTES-2.0.txt b/lang/src/site/resources/release-notes/RELEASE-NOTES-2.0.txt
deleted file mode 100644
index ce6d25e..0000000
--- a/lang/src/site/resources/release-notes/RELEASE-NOTES-2.0.txt
+++ /dev/null
@@ -1,661 +0,0 @@
-$Id: RELEASE-NOTES.txt 137634 2003-08-19 02:39:59Z bayard $
-
-                        Commons Lang Package
-                            Version 2.0
-                           Release Notes
-
-
-INTRODUCTION:
-
-This document contains the release notes for this version of the Commons
-Lang package. Commons Lang is a set of utility functions and reusable 
-components that should be a help in any Java environment.
-
-This release has involved a major clean and tidy exercise.
-Javadoc and Tests are now much more thorough.
-All methods should now be much clearer in what they do in unusual cases.
-
-
-INCOMPATIBLE CHANGES:
-Some StringUtils methods have changed functionality from 1.0:
-    isEmpty()
-    chomp(String)
-    chomp(String,String)
-    swapCase(String)
-Numerous other methods have changed null handling to accept nulls gracefully.
-As with all major version releases, check your code for incompatibilities.
-
-
-NEW FEATURES:
-
-Since the release of the 1.0 package the following classes have been added:
-
-lang package:
-    ArrayUtils
-    BitField
-    BooleanUtils
-    CharRange (previously package scoped)
-    ClassUtils
-    StringEscapeUtils
-    WordUtils
-    IllegalClassException
-    IncompleteArgumentException
-    NotImplementedException
-    NullArgumentException
-    SerializationException
-    UnhandledException
-    Validate
-
-
-math sub-package:
-    IntRange
-    LongRange
-    Range
-    DoubleRange
-    JVMRandom
-    NumberRange
-    FloatRange
-    NumberUtils
-    Fraction
-    RandomUtils
-
-time sub-package: 
-    DateFormatUtils
-    FastDateFormat
-    DateUtils
-    StopWatch
-
-Since the release of the 1.0 package the following classes have been changed:
-
-lang:
-    CharSet:
-        Added factory method, equals and hashCode().
-        Better defined and tested the set syntax.
-    CharSetUtils:
-        added keep method:  keep any characters specified in the CharSet string
-    RandomStringUtils:
-        random method:  overloaded to allow passing in of a Random class
-    SerializationUtils:
-        added empty constructor
-    StringUtils:
-        isEmpty() changed to not trim
-        chomp() changed to be more like Perl.
-        swapCase() no longer word based, but no difference if you pass in ASCII
-        Various methods changed in the handling of null (less exceptions).
-        Many new methods.
-        Various methods deprecated.
-    SystemUtils:
-        isJavaVersionAtLeast(int) added. getJavaVersion() deprecated.
-        host of new constants.
-
-enum:
-    Enum:
-        getEnumClass(Class) added
-    EnumUtils:
-        Removed irrelevant Comparable/Serializable interfaces.
-
-exception:
-    NestableDelegate:
-        Gained many new methods for dissecting an Exception.
-    ExceptionUtils:
-        Gained many new methods to improve handling of nested stack traces.
-        
-builder:
-    ReflectionToStringBuilder:
-        Handy class added for creating default toStrings.
-    All other builder classes received a set of new methods.
-
-
-BUG FIXES:
-
-ID Sev Pri Plt Owner State Result Summary 
-13367  [PATCH] StringUtil enhancement  
-13391  Javadoc nit  
-13771  Additional Lang Method Suggestions  
-14306  NullPointerException in CompareToBuilder  
-14357  static option for reversing the stacktrace  
-14447  ToStringBuilder doesn't work well in subclasses  
-14883  StringUtils.countMatches loops forever if substring empty  
-14884  NumberRange inaccurate for Long, etc.  
-14985  More flexibility for getRootCause in ExceptionUtils  
-15154  SystemUtils.IS_JAVA_1_5 Javadoc is wrong  
-15257  Hierarchy support in ToStringBuilder.reflectionToString()  
-15438  ArrayUtils.contains()  
-15439  Enum does not support inner sub-classes  
-15986  Infinite loop in ToStringBuilder.reflectionToString for inne  
-16076  Example in Javadoc for ToStringBuilder wrong for append.  
-16193  Hierarchy support in EqualsBuilder.reflectionEquals()  
-16202  typo in the javadoc example code  
-16204  Infinite loop in StringUtils.replace(text, repl, with) + FIX  
-16227  Added class hierarchy support to CompareToBuilder.reflectionC  
-16228  Added class hierarchy support to HashCodeBuilder.reflectionHa  
-16284  MethodUtils: Removed unused code/unused local vars.  
-16341  No Javadoc for NestableDelegate  
-16622  Removed compile warning in FastDateFormat  
-16669  JavaDoc Errata  
-16676  StackOverflow due to ToStringBuilder  
-16689  ExceptionUtils new methods.  
-16690  Specify initial size for Enum's HashMap.  
-16787  Removed compile warning in ObjectUtils  
-17250  [Lang] Should ToStringBuilder.reflectionToString handle arra  
-17654  EnumUtils nit: The import java.io.Serializable is never used  
-17882  Add join(..., char c) to StringUtils (and some performance f  
-18077  StringUtils.chomp does not match Perl  
-18723  RandomStringUtils infloops with length < 1  
-18836  test.lang fails if compiled with non iso-8859-1 locales  
-18948  Resurrect the WordWrapUtils from commons-sandbox/utils  
-19296  [Lang] What to do with FastDateFormat unused private constru  
-19364  [Lang] time unit tests fail on Sundays  
-19756  [lang] java.lang.ExceptionInInitializerError thrown by JVMRa  
-19880  [lang] patch and test case fixing problem with RandomStringU  
-20165  [LANG] SystemUtils does not play nice in an Applet  
-20538  [lang] NumberUtils.isNumber allows illegal trailing characte  
-20592  [lang] RandomStringUtils.randomAlpha methods omit 'z'  
-20603  [lang] Make NestableDelegate methods public instead of packa  
-20632  Refactored reflection feature of ToStringBuilder into new Re  
-20652  StringUtils.chopNewLine - StringIndexOutOfBoundsException  
-21021  [PATCH] reduce object creation in ToStringBuilder  
-21068  [lang] [PATCH] NumberUtils min/max, BooleanUtils.xor, and Ar  
-21099  [lang][PATCH] Unused field 'startFinal' in DateIterator  
-21715  The javadoc says "Mac" instead of "OS/2"
-21734  [PATCH] all NumberUtils.createXXX(String) methods handle null
-21750  [lang] StringUtils javadoc and test enhancements
-21758  [lang] lang.builder classes javadoc edits (mostly typo fixes)
-21797  [lang] Add javadoc examples and tests for StringUtils
-21809  [lang] maven-beta10 checkstyle problem
-21904  NumberUtils.createBigDecimal("") NPE in Sun 1.3.1_08
-21952  [lang] Improved tests, javadoc for CharSetUtils, StringEscapeUtils
-22091  Adding tolerance to double[] search methods in ArrayUtils
-22094  A small, but important javadoc fix for Fraction proper whole/numerator
-22095  [lang] Javadoc, tests improvements for CharSet, CharSetUtils
-22098  [lang] Improve util.Validate tests
-22245  [lang] test.time fails in Japanese (non-us) locale.
-22286  [lang] Missing @since tags
-22367  Typo in documentation
-22386  [lang] Improve javadoc and overflow behavior of Fraction
-
-
-DEPRECATIONS:
-
-lang:
-    NumberRange:
-        now deprecated, see math subpackage
-    NumberUtils:
-        now deprecated, see math subpackage
-
-
-CHANGES:   [In 'diff' format]
-
-Jar changes
-===========
-> org.apache.commons.lang.math.Range
-> org.apache.commons.lang.math.FloatRange
-> org.apache.commons.lang.math.NumberUtils
-> org.apache.commons.lang.math.JVMRandom
-> org.apache.commons.lang.math.IntRange
-> org.apache.commons.lang.math.LongRange
-> org.apache.commons.lang.math.DoubleRange
-> org.apache.commons.lang.math.NumberRange
-> org.apache.commons.lang.math.Fraction
-> org.apache.commons.lang.math.RandomUtils
-> org.apache.commons.lang.time.FastDateFormat
-> org.apache.commons.lang.time.DateUtils$DateIterator
-> org.apache.commons.lang.time.DateUtils
-> org.apache.commons.lang.time.FastDateFormat$UnpaddedMonthField
-> org.apache.commons.lang.time.FastDateFormat$StringLiteral
-> org.apache.commons.lang.time.FastDateFormat$TwelveHourField
-> org.apache.commons.lang.time.FastDateFormat$NumberRule
-> org.apache.commons.lang.time.FastDateFormat$CharacterLiteral
-> org.apache.commons.lang.time.FastDateFormat$TimeZoneNumberRule
-> org.apache.commons.lang.time.FastDateFormat$TimeZoneNameRule
-> org.apache.commons.lang.time.DateFormatUtils
-> org.apache.commons.lang.time.FastDateFormat$TwoDigitMonthField
-> org.apache.commons.lang.time.DurationFormatUtils
-> org.apache.commons.lang.time.FastDateFormat$TimeZoneDisplayKey
-> org.apache.commons.lang.time.FastDateFormat$UnpaddedNumberField
-> org.apache.commons.lang.time.FastDateFormat$PaddedNumberField
-> org.apache.commons.lang.time.StopWatch
-> org.apache.commons.lang.time.FastDateFormat$TwentyFourHourField
-> org.apache.commons.lang.time.FastDateFormat$Rule
-> org.apache.commons.lang.time.FastDateFormat$TwoDigitNumberField
-> org.apache.commons.lang.time.FastDateFormat$TextField
-> org.apache.commons.lang.time.FastDateFormat$Pair
-> org.apache.commons.lang.time.FastDateFormat$TwoDigitYearField
-> org.apache.commons.lang.util.IdentifierUtils$StringNumericIdentifierFactory
-> org.apache.commons.lang.util.IdentifierUtils$StringSessionIdentifierFactory
-> org.apache.commons.lang.util.IdentifierUtils$LongNumericIdentifierFactory
-> org.apache.commons.lang.util.IdentifierUtils$StringAlphanumericIdentifierFactory
-> org.apache.commons.lang.util.Validate
-> org.apache.commons.lang.util.LongIdentifierFactory
-> org.apache.commons.lang.util.IdentifierUtils$1
-> org.apache.commons.lang.util.StringIdentifierFactory
-> org.apache.commons.lang.util.IdentifierUtils
-> org.apache.commons.lang.util.IdentifierFactory
-> org.apache.commons.lang.util.BitField
-> org.apache.commons.lang.Entities
-> org.apache.commons.lang.Entities$LookupEntityMap
-> org.apache.commons.lang.NotImplementedException
-> org.apache.commons.lang.NullArgumentException
-< org.apache.commons.lang.ObjectUtils$1
----
-> org.apache.commons.lang.StringPrintWriter
-> org.apache.commons.lang.UnhandledException
-> org.apache.commons.lang.Entities$HashEntityMap
-> org.apache.commons.lang.Entities$ArrayEntityMap
-> org.apache.commons.lang.Entities$EntityMap
-> org.apache.commons.lang.IntHashMap
-> org.apache.commons.lang.BooleanUtils
-> org.apache.commons.lang.IncompleteArgumentException
-> org.apache.commons.lang.Entities$PrimitiveEntityMap
-> org.apache.commons.lang.Entities$TreeEntityMap
-> org.apache.commons.lang.WordUtils
-> org.apache.commons.lang.StringEscapeUtils
-> org.apache.commons.lang.ArrayUtils
-> org.apache.commons.lang.Entities$BinaryEntityMap
-> org.apache.commons.lang.ClassUtils
-> org.apache.commons.lang.IntHashMap$Entry
-> org.apache.commons.lang.IllegalClassException
-> org.apache.commons.lang.builder.ReflectionToStringBuilder$1
-> org.apache.commons.lang.builder.ReflectionToStringBuilder
-> org.apache.commons.lang.Entities$MapIntMap
-
-
-Class changes
-=============
-org.apache.commons.lang.enum.EnumUtils
---------------------
-< public abstract class org.apache.commons.lang.enum.EnumUtils extends java.lang.Object implements java.lang.Comparable, java.io.Serializable {
----
-> public class org.apache.commons.lang.enum.EnumUtils extends java.lang.Object {
->     public org.apache.commons.lang.enum.EnumUtils();
-
-org.apache.commons.lang.enum.Enum$Entry
---------------------
->     final java.util.Map unmodifiableMap;
->     final java.util.List unmodifiableList;
-
-org.apache.commons.lang.enum.Enum
---------------------
->     protected transient java.lang.String iToString;
->     static java.lang.Class class$org$apache$commons$lang$enum$ValuedEnum;
->     public java.lang.Class getEnumClass();
-
-org.apache.commons.lang.enum.ValuedEnum
---------------------
->     static {};
-
-org.apache.commons.lang.StringUtils
---------------------
->     public static final java.lang.String EMPTY;
->     public static boolean isEmpty(java.lang.String);
->     public static boolean isNotEmpty(java.lang.String);
->     public static boolean isBlank(java.lang.String);
->     public static boolean isNotBlank(java.lang.String);
-<     public static java.lang.String deleteSpaces(java.lang.String);
-<     public static java.lang.String deleteWhitespace(java.lang.String);
-<     public static boolean isNotEmpty(java.lang.String);
-<     public static boolean isEmpty(java.lang.String);
----
->     public static java.lang.String trimToNull(java.lang.String);
->     public static java.lang.String trimToEmpty(java.lang.String);
->     public static java.lang.String strip(java.lang.String);
->     public static java.lang.String stripToNull(java.lang.String);
->     public static java.lang.String stripToEmpty(java.lang.String);
->     public static java.lang.String strip(java.lang.String, java.lang.String);
->     public static java.lang.String stripStart(java.lang.String, java.lang.String);
->     public static java.lang.String stripEnd(java.lang.String, java.lang.String);
->     public static java.lang.String stripAll(java.lang.String[])[];
->     public static java.lang.String stripAll(java.lang.String[], java.lang.String)[];
->     public static int indexOf(java.lang.String, char);
->     public static int indexOf(java.lang.String, char, int);
->     public static int indexOf(java.lang.String, java.lang.String);
->     public static int indexOf(java.lang.String, java.lang.String, int);
->     public static int lastIndexOf(java.lang.String, char);
->     public static int lastIndexOf(java.lang.String, char, int);
->     public static int lastIndexOf(java.lang.String, java.lang.String);
->     public static int lastIndexOf(java.lang.String, java.lang.String, int);
->     public static boolean contains(java.lang.String, char);
->     public static boolean contains(java.lang.String, java.lang.String);
->     public static int indexOfAny(java.lang.String, char[]);
->     public static int indexOfAny(java.lang.String, java.lang.String);
->     public static int indexOfAnyBut(java.lang.String, char[]);
->     public static int indexOfAnyBut(java.lang.String, java.lang.String);
->     public static boolean containsOnly(java.lang.String, char[]);
->     public static boolean containsOnly(java.lang.String, java.lang.String);
->     public static boolean containsNone(java.lang.String, char[]);
->     public static boolean containsNone(java.lang.String, java.lang.String);
->     public static java.lang.String substringBefore(java.lang.String, java.lang.String);
->     public static java.lang.String substringAfter(java.lang.String, java.lang.String);
->     public static java.lang.String substringBeforeLast(java.lang.String, java.lang.String);
->     public static java.lang.String substringAfterLast(java.lang.String, java.lang.String);
->     public static java.lang.String substringBetween(java.lang.String, java.lang.String);
->     public static java.lang.String substringBetween(java.lang.String, java.lang.String, java.lang.String);
->     public static java.lang.String getNestedString(java.lang.String, java.lang.String);
->     public static java.lang.String getNestedString(java.lang.String, java.lang.String, java.lang.String);
->     public static java.lang.String split(java.lang.String, char)[];
->     public static java.lang.String join(java.lang.Object[]);
->     public static java.lang.String join(java.lang.Object[], char);
->     public static java.lang.String join(java.util.Iterator, char);
->     public static java.lang.String deleteSpaces(java.lang.String);
->     public static java.lang.String deleteWhitespace(java.lang.String);
->     public static java.lang.String replaceChars(java.lang.String, char, char);
->     public static java.lang.String replaceChars(java.lang.String, java.lang.String, java.lang.String);
-<     public static java.lang.String center(java.lang.String, int);
-<     public static java.lang.String center(java.lang.String, int, java.lang.String);
----
->     public static java.lang.String overlay(java.lang.String, java.lang.String, int, int);
->     public static java.lang.String rightPad(java.lang.String, int, char);
->     public static java.lang.String leftPad(java.lang.String, int, char);
-<     public static java.lang.String strip(java.lang.String);
-<     public static java.lang.String strip(java.lang.String, java.lang.String);
-<     public static java.lang.String stripAll(java.lang.String[])[];
-<     public static java.lang.String stripAll(java.lang.String[], java.lang.String)[];
-<     public static java.lang.String stripEnd(java.lang.String, java.lang.String);
-<     public static java.lang.String stripStart(java.lang.String, java.lang.String);
----
->     public static java.lang.String center(java.lang.String, int);
->     public static java.lang.String center(java.lang.String, int, char);
->     public static java.lang.String center(java.lang.String, int, java.lang.String);
-<     public static java.lang.String uncapitalise(java.lang.String);
----
->     public static java.lang.String capitalize(java.lang.String);
->     public static java.lang.String uncapitalize(java.lang.String);
->     public static java.lang.String uncapitalise(java.lang.String);
-<     public static java.lang.String getNestedString(java.lang.String, java.lang.String);
-<     public static java.lang.String getNestedString(java.lang.String, java.lang.String, java.lang.String);
->     public static boolean isWhitespace(java.lang.String);
->     public static java.lang.String reverseDelimited(java.lang.String, char);
->     public static java.lang.String abbreviate(java.lang.String, int);
->     public static java.lang.String abbreviate(java.lang.String, int, int);
->     public static java.lang.String difference(java.lang.String, java.lang.String);
->     public static int differenceAt(java.lang.String, java.lang.String);
-<     public static boolean containsOnly(java.lang.String, char[]);
----
->     static {};
-
-org.apache.commons.lang.ObjectUtils
---------------------
->     public static java.lang.StringBuffer appendIdentityToString(java.lang.StringBuffer, java.lang.Object);
->     public static java.lang.String toString(java.lang.Object);
->     public static java.lang.String toString(java.lang.Object, java.lang.String);
-<         org.apache.commons.lang.ObjectUtils.Null(org.apache.commons.lang.ObjectUtils$1);
----
->         org.apache.commons.lang.ObjectUtils.Null();
->         static {};
-
-org.apache.commons.lang.exception.NestableDelegate
---------------------
->     public static boolean topDown;
->     public static boolean trimStackFrames;
-<     org.apache.commons.lang.exception.NestableDelegate(org.apache.commons.lang.exception.Nestable);
-<     java.lang.String getMessage(int);
-<     java.lang.String getMessage(java.lang.String);
-<     java.lang.String getMessages()[];
-<     java.lang.Throwable getThrowable(int);
-<     int getThrowableCount();
-<     java.lang.Throwable getThrowables()[];
-<     int indexOfThrowable(java.lang.Class, int);
----
->     public org.apache.commons.lang.exception.NestableDelegate(org.apache.commons.lang.exception.Nestable);
->     public java.lang.String getMessage(int);
->     public java.lang.String getMessage(java.lang.String);
->     public java.lang.String getMessages()[];
->     public java.lang.Throwable getThrowable(int);
->     public int getThrowableCount();
->     public java.lang.Throwable getThrowables()[];
->     public int indexOfThrowable(java.lang.Class, int);
->     protected java.lang.String getStackFrames(java.lang.Throwable)[];
->     protected void trimStackFrames(java.util.List);
-
-org.apache.commons.lang.exception.ExceptionUtils
---------------------
-<     protected static final java.lang.String CAUSE_METHOD_NAMES[];
-<     protected static final java.lang.Object CAUSE_METHOD_PARAMS[];
----
->     static final java.lang.String WRAPPED_MARKER;
-<     protected org.apache.commons.lang.exception.ExceptionUtils();
----
->     public org.apache.commons.lang.exception.ExceptionUtils();
->     public static void addCauseMethodName(java.lang.String);
->     public static boolean isThrowableNested();
->     public static boolean isNestedThrowable(java.lang.Throwable);
->     public static void printRootCauseStackTrace(java.lang.Throwable);
->     public static void printRootCauseStackTrace(java.lang.Throwable, java.io.PrintStream);
->     public static void printRootCauseStackTrace(java.lang.Throwable, java.io.PrintWriter);
->     public static java.lang.String getRootCauseStackTrace(java.lang.Throwable)[];
->     public static void removeCommonFrames(java.util.List, java.util.List);
->     public static java.lang.String getFullStackTrace(java.lang.Throwable);
->     static java.util.List getStackFrameList(java.lang.Throwable);
-
-org.apache.commons.lang.CharRange
---------------------
-< class org.apache.commons.lang.CharRange extends java.lang.Object {
----
-> public final class org.apache.commons.lang.CharRange extends java.lang.Object implements java.io.Serializable {
->     public org.apache.commons.lang.CharRange(char,boolean);
-<     public org.apache.commons.lang.CharRange(java.lang.String,java.lang.String);
----
->     public org.apache.commons.lang.CharRange(char,char,boolean);
-<     public void setStart(char);
-<     public void setEnd(char);
-<     public boolean isRange();
-<     public boolean inRange(char);
-<     public void setNegated(boolean);
----
->     public boolean contains(char);
->     public boolean contains(org.apache.commons.lang.CharRange);
->     public boolean equals(java.lang.Object);
->     public int hashCode();
->     static {};
-
-org.apache.commons.lang.ObjectUtils$1
---------------------
-< Compiled from ObjectUtils.java
-< class org.apache.commons.lang.ObjectUtils$1 extends java.lang.Object {
-< }
----
-> Class 'org.apache.commons.lang.ObjectUtils$1' has been removed
-
-org.apache.commons.lang.ObjectUtils$Null
---------------------
-<     org.apache.commons.lang.ObjectUtils.Null(org.apache.commons.lang.ObjectUtils$1);
----
->     org.apache.commons.lang.ObjectUtils.Null();
->     static {};
-
-org.apache.commons.lang.SystemUtils
---------------------
->     public static final java.lang.String FILE_ENCODING;
->     public static final java.lang.String JAVA_RUNTIME_NAME;
->     public static final java.lang.String JAVA_RUNTIME_VERSION;
->     public static final java.lang.String JAVA_VM_INFO;
->     public static final java.lang.String USER_COUNTRY;
->     public static final java.lang.String USER_LANGUAGE;
->     public static final float JAVA_VERSION_FLOAT;
->     public static final int JAVA_VERSION_INT;
->     public static final boolean IS_OS_AIX;
->     public static final boolean IS_OS_HP_UX;
->     public static final boolean IS_OS_IRIX;
->     public static final boolean IS_OS_LINUX;
->     public static final boolean IS_OS_MAC;
->     public static final boolean IS_OS_MAC_OSX;
->     public static final boolean IS_OS_OS2;
->     public static final boolean IS_OS_SOLARIS;
->     public static final boolean IS_OS_SUN_OS;
->     public static final boolean IS_OS_WINDOWS;
->     public static final boolean IS_OS_WINDOWS_2000;
->     public static final boolean IS_OS_WINDOWS_95;
->     public static final boolean IS_OS_WINDOWS_98;
->     public static final boolean IS_OS_WINDOWS_ME;
->     public static final boolean IS_OS_WINDOWS_NT;
->     public static final boolean IS_OS_WINDOWS_XP;
->     public static boolean isJavaVersionAtLeast(int);
-
-org.apache.commons.lang.SerializationUtils
---------------------
->     public org.apache.commons.lang.SerializationUtils();
-
-org.apache.commons.lang.RandomStringUtils
---------------------
->     public static java.lang.String random(int, int, int, boolean, boolean, char[], java.util.Random);
-
-org.apache.commons.lang.CharSet
---------------------
-< public class org.apache.commons.lang.CharSet extends java.lang.Object {
----
-> public class org.apache.commons.lang.CharSet extends java.lang.Object implements java.io.Serializable {
->     public static final org.apache.commons.lang.CharSet EMPTY;
->     public static final org.apache.commons.lang.CharSet ASCII_ALPHA;
->     public static final org.apache.commons.lang.CharSet ASCII_ALPHA_LOWER;
->     public static final org.apache.commons.lang.CharSet ASCII_ALPHA_UPPER;
->     public static final org.apache.commons.lang.CharSet ASCII_NUMERIC;
->     protected static final java.util.Map COMMON;
->     public static org.apache.commons.lang.CharSet getInstance(java.lang.String);
->     protected org.apache.commons.lang.CharSet(java.lang.String);
-<     public boolean contains(char);
->     public org.apache.commons.lang.CharRange getCharRanges()[];
->     public boolean contains(char);
->     public boolean equals(java.lang.Object);
->     public int hashCode();
->     static {};
-
-org.apache.commons.lang.CharSetUtils
---------------------
->     public static java.lang.String keep(java.lang.String, java.lang.String);
->     public static java.lang.String keep(java.lang.String, java.lang.String[]);
-
-org.apache.commons.lang.builder.ToStringBuilder
---------------------
-<     public org.apache.commons.lang.builder.ToStringBuilder(java.lang.Object);
-<     public org.apache.commons.lang.builder.ToStringBuilder(java.lang.Object,org.apache.commons.lang.builder.ToStringStyle);
-<     public org.apache.commons.lang.builder.ToStringBuilder(java.lang.Object,org.apache.commons.lang.builder.ToStringStyle,java.lang.StringBuffer);
-<     public static void setDefaultStyle(org.apache.commons.lang.builder.ToStringStyle);
-<     public org.apache.commons.lang.builder.ToStringBuilder append(java.lang.Object);
-<     public org.apache.commons.lang.builder.ToStringBuilder append(java.lang.String, java.lang.Object);
-<     public org.apache.commons.lang.builder.ToStringBuilder append(java.lang.String, java.lang.Object, boolean);
-<     public org.apache.commons.lang.builder.ToStringBuilder append(long);
-<     public org.apache.commons.lang.builder.ToStringBuilder append(java.lang.String, long);
-<     public org.apache.commons.lang.builder.ToStringBuilder append(int);
-<     public org.apache.commons.lang.builder.ToStringBuilder append(java.lang.String, int);
-<     public org.apache.commons.lang.builder.ToStringBuilder append(short);
-<     public org.apache.commons.lang.builder.ToStringBuilder append(java.lang.String, short);
-<     public org.apache.commons.lang.builder.ToStringBuilder append(char);
-<     public org.apache.commons.lang.builder.ToStringBuilder append(java.lang.String, char);
----
->     public static java.lang.String reflectionToString(java.lang.Object, org.apache.commons.lang.builder.ToStringStyle, boolean, java.lang.Class);
->     public static void setDefaultStyle(org.apache.commons.lang.builder.ToStringStyle);
->     public org.apache.commons.lang.builder.ToStringBuilder(java.lang.Object);
->     public org.apache.commons.lang.builder.ToStringBuilder(java.lang.Object,org.apache.commons.lang.builder.ToStringStyle);
->     public org.apache.commons.lang.builder.ToStringBuilder(java.lang.Object,org.apache.commons.lang.builder.ToStringStyle,java.lang.StringBuffer);
->     public org.apache.commons.lang.builder.ToStringBuilder append(boolean);
->     public org.apache.commons.lang.builder.ToStringBuilder append(boolean[]);
-<     public org.apache.commons.lang.builder.ToStringBuilder append(java.lang.String, byte);
----
->     public org.apache.commons.lang.builder.ToStringBuilder append(byte[]);
->     public org.apache.commons.lang.builder.ToStringBuilder append(char);
->     public org.apache.commons.lang.builder.ToStringBuilder append(char[]);
-<     public org.apache.commons.lang.builder.ToStringBuilder append(java.lang.String, double);
----
->     public org.apache.commons.lang.builder.ToStringBuilder append(double[]);
-<     public org.apache.commons.lang.builder.ToStringBuilder append(java.lang.String, float);
-<     public org.apache.commons.lang.builder.ToStringBuilder append(boolean);
-<     public org.apache.commons.lang.builder.ToStringBuilder append(java.lang.String, boolean);
-<     public org.apache.commons.lang.builder.ToStringBuilder append(java.lang.Object[]);
-<     public org.apache.commons.lang.builder.ToStringBuilder append(java.lang.String, java.lang.Object[]);
-<     public org.apache.commons.lang.builder.ToStringBuilder append(java.lang.String, java.lang.Object[], boolean);
-<     public org.apache.commons.lang.builder.ToStringBuilder append(long[]);
-<     public org.apache.commons.lang.builder.ToStringBuilder append(java.lang.String, long[]);
-<     public org.apache.commons.lang.builder.ToStringBuilder append(java.lang.String, long[], boolean);
----
->     public org.apache.commons.lang.builder.ToStringBuilder append(float[]);
->     public org.apache.commons.lang.builder.ToStringBuilder append(int);
-<     public org.apache.commons.lang.builder.ToStringBuilder append(java.lang.String, int[]);
-<     public org.apache.commons.lang.builder.ToStringBuilder append(java.lang.String, int[], boolean);
----
->     public org.apache.commons.lang.builder.ToStringBuilder append(long);
->     public org.apache.commons.lang.builder.ToStringBuilder append(long[]);
->     public org.apache.commons.lang.builder.ToStringBuilder append(java.lang.Object);
->     public org.apache.commons.lang.builder.ToStringBuilder append(java.lang.Object[]);
->     public org.apache.commons.lang.builder.ToStringBuilder append(short);
-<     public org.apache.commons.lang.builder.ToStringBuilder append(java.lang.String, short[]);
-<     public org.apache.commons.lang.builder.ToStringBuilder append(java.lang.String, short[], boolean);
-<     public org.apache.commons.lang.builder.ToStringBuilder append(char[]);
-<     public org.apache.commons.lang.builder.ToStringBuilder append(java.lang.String, char[]);
-<     public org.apache.commons.lang.builder.ToStringBuilder append(java.lang.String, char[], boolean);
-<     public org.apache.commons.lang.builder.ToStringBuilder append(byte[]);
----
->     public org.apache.commons.lang.builder.ToStringBuilder append(java.lang.String, boolean);
->     public org.apache.commons.lang.builder.ToStringBuilder append(java.lang.String, boolean[]);
->     public org.apache.commons.lang.builder.ToStringBuilder append(java.lang.String, boolean[], boolean);
->     public org.apache.commons.lang.builder.ToStringBuilder append(java.lang.String, byte);
-<     public org.apache.commons.lang.builder.ToStringBuilder append(double[]);
----
->     public org.apache.commons.lang.builder.ToStringBuilder append(java.lang.String, char);
->     public org.apache.commons.lang.builder.ToStringBuilder append(java.lang.String, char[]);
->     public org.apache.commons.lang.builder.ToStringBuilder append(java.lang.String, char[], boolean);
->     public org.apache.commons.lang.builder.ToStringBuilder append(java.lang.String, double);
-<     public org.apache.commons.lang.builder.ToStringBuilder append(float[]);
----
->     public org.apache.commons.lang.builder.ToStringBuilder append(java.lang.String, float);
-<     public org.apache.commons.lang.builder.ToStringBuilder append(boolean[]);
-<     public org.apache.commons.lang.builder.ToStringBuilder append(java.lang.String, boolean[]);
-<     public org.apache.commons.lang.builder.ToStringBuilder append(java.lang.String, boolean[], boolean);
----
->     public org.apache.commons.lang.builder.ToStringBuilder append(java.lang.String, int);
->     public org.apache.commons.lang.builder.ToStringBuilder append(java.lang.String, int[]);
->     public org.apache.commons.lang.builder.ToStringBuilder append(java.lang.String, int[], boolean);
->     public org.apache.commons.lang.builder.ToStringBuilder append(java.lang.String, long);
->     public org.apache.commons.lang.builder.ToStringBuilder append(java.lang.String, long[]);
->     public org.apache.commons.lang.builder.ToStringBuilder append(java.lang.String, long[], boolean);
->     public org.apache.commons.lang.builder.ToStringBuilder append(java.lang.String, java.lang.Object);
->     public org.apache.commons.lang.builder.ToStringBuilder append(java.lang.String, java.lang.Object, boolean);
->     public org.apache.commons.lang.builder.ToStringBuilder append(java.lang.String, java.lang.Object[]);
->     public org.apache.commons.lang.builder.ToStringBuilder append(java.lang.String, java.lang.Object[], boolean);
->     public org.apache.commons.lang.builder.ToStringBuilder append(java.lang.String, short);
->     public org.apache.commons.lang.builder.ToStringBuilder append(java.lang.String, short[]);
->     public org.apache.commons.lang.builder.ToStringBuilder append(java.lang.String, short[], boolean);
->     public org.apache.commons.lang.builder.ToStringBuilder appendAsObjectToString(java.lang.Object);
->     public org.apache.commons.lang.builder.ToStringBuilder appendSuper(java.lang.String);
->     public org.apache.commons.lang.builder.ToStringBuilder appendToString(java.lang.String);
->     public org.apache.commons.lang.builder.ToStringStyle getStyle();
->     public java.lang.Object getObject();
-
-org.apache.commons.lang.builder.StandardToStringStyle
---------------------
->     public boolean isUseShortClassName();
->     public void setUseShortClassName(boolean);
->     public boolean isFieldSeparatorAtStart();
->     public void setFieldSeparatorAtStart(boolean);
->     public boolean isFieldSeparatorAtEnd();
->     public void setFieldSeparatorAtEnd(boolean);
-
-org.apache.commons.lang.builder.ToStringStyle
---------------------
->     public void appendSuper(java.lang.StringBuffer, java.lang.String);
->     public void appendToString(java.lang.StringBuffer, java.lang.String);
->     protected void removeLastFieldSeparator(java.lang.StringBuffer);
->     protected void reflectionAppendArrayDetail(java.lang.StringBuffer, java.lang.String, java.lang.Object);
->     protected boolean isUseShortClassName();
->     protected void setUseShortClassName(boolean);
->     protected boolean isFieldSeparatorAtStart();
->     protected void setFieldSeparatorAtStart(boolean);
->     protected boolean isFieldSeparatorAtEnd();
->     protected void setFieldSeparatorAtEnd(boolean);
-
-org.apache.commons.lang.builder.HashCodeBuilder
---------------------
->     public static int reflectionHashCode(int, int, java.lang.Object, boolean, java.lang.Class);
->     public org.apache.commons.lang.builder.HashCodeBuilder appendSuper(int);
-
-org.apache.commons.lang.builder.CompareToBuilder
---------------------
->     public static int reflectionCompare(java.lang.Object, java.lang.Object, boolean, java.lang.Class);
->     public org.apache.commons.lang.builder.CompareToBuilder appendSuper(int);
->     public org.apache.commons.lang.builder.CompareToBuilder append(java.lang.Object, java.lang.Object, java.util.Comparator);
->     public org.apache.commons.lang.builder.CompareToBuilder append(java.lang.Object[], java.lang.Object[], java.util.Comparator);
-
-org.apache.commons.lang.builder.EqualsBuilder
---------------------
->     public static boolean reflectionEquals(java.lang.Object, java.lang.Object, boolean, java.lang.Class);
->     public org.apache.commons.lang.builder.EqualsBuilder appendSuper(boolean);
-
diff --git a/lang/src/site/resources/release-notes/RELEASE-NOTES-2.1.txt b/lang/src/site/resources/release-notes/RELEASE-NOTES-2.1.txt
deleted file mode 100644
index fac5a90..0000000
--- a/lang/src/site/resources/release-notes/RELEASE-NOTES-2.1.txt
+++ /dev/null
@@ -1,135 +0,0 @@
-$Id: RELEASE-NOTES.txt 179435 2005-06-01 22:19:20Z stevencaswell $
-
-                        Commons Lang Package
-                            Version 2.1
-                           Release Notes
-
-
-INTRODUCTION:
-
-This document contains the release notes for the 2.1 version of Apache Jakarta Commons Lang.
-Commons Lang is a set of utility functions and reusable components that
-should be of use in any Java environment.
-
-
-INCOMPATIBLE CHANGES:
-
-- The Nestable interface defines the method indexOfThrowable(Class).
-Previously the implementations checked only for a specific Class.
-Now they check for subclasses of that Class as well.
-For most situations this will be the expected behaviour (ie. its a bug fix).
-If it causes problems, please use the ExceptionUtils.indexOfThrowable(Class) method instead.
-Note that the ExceptionUtils method is available in v1.0 and v2.0 of commons-lang and has not been changed.
-(An alternative to this is to change the public static matchSubclasses flag on NestableDelegate.
-However, we don't recommend that as a long-term solution.)
-
-- The StopWatch class has had much extra validation added.
-If your code previously relied on unusual aspects, it may no longer work.
-
-- Starting with version 2.1, Ant version 1.6.x is required to build. Copy 
-junit.jar to ANT_HOME/lib. You can get JUnit from http://www.junit.org. See the developer's guide
-for more details.
-
-
-DEPRECATIONS:
-
-- The enum package has been renamed to enums for JDK1.5 compilance.
-All functionality is identical, just the package has changed.
-This package will be removed in v3.0.
-
-- NumberUtils.stringToInt - renamed to toInt
-
-- DateUtils - four constants, MILLIS_IN_* have been deprecated as they were defined
-as int not long. The replacements are MILLIS_PER_*. 
-
-
-NEW FEATURES:
-
-New:
-- Mutable package - contains basic classes that hold an Object or primitive
-and provide both get and set methods.
-- DurationFormatUtils - provides various methods for formatting durations
-- CharEncoding - definitions of constants for character encoding work
-- CharUtils - utilities for working with characters
-
-Updated:
-- ArrayUtils - many more methods, especially List-like methods
-- BooleanUtils - isTrue and isFalse methods that handle null
-- ClassUtils - primitive to wrapper class conversion methods
-- ClassUtils - class name comparator
-- IllegalClassException - extra constructor for common instanceof case
-- NotImplementedException - supports nested exceptions
-- ObjectUtils - hashcode method handling null
-- StringUtils - isAsciiPrintable to check the contents of a string
-             -- ordinalIndexOf to find the nth index of a string
-             -- various remove methods to remove parts of a string
-             -- various split methods to provide more control over splitting a string
-             -- defaultIfEmpty to default a string if null or empty
-- SystemUtils - methods to get system properties as File objects
-             -- extra constants representing system properties
-- Validate - new methods to check whether all elements in a collection are of a specific type
-- WordUtils - new methods to capitalize based on a set of specified delimiters
-
-- EqualsBuilder - now provides setter to internal state
-- ToStringStyle - new style, short prefix style
-- ReflectionToStringBuilder - more flags to control the output with regards to statics
-
-- ExceptionUtils - added indexOfType methods that check subclasses, thus leaving the existing
-indexOfThrowable method untouched (see incompatible changes section)
-
-- NumberUtils - various string to number parsing methods added
-
-- DateUtils - methods added to compare dates in various ways
-           -- method to parse a date string using multiple patterns
-- FastDateFormat - extra formatting methods that take in a millisecond long value
-                -- additional static factory methods
-- StopWatch - new methods for split behaviour
-
-
-BUG FIXES:
-
-19331  General case: infinite loop: ToStringBuilder.reflectionToString
-23174  EqualsBuilder.append(Object[], Object[]) throws NPE
-23356  Make DurationFormatUtils public!
-23557  WordUtils.capitalizeFully(String str) should take a delimiters
-23683  New method for converting a primitive Class to its corresponding wrapper
-23430  Minor javadoc fixes for StringUtils.contains(String, String)
-23590  make optional parameters in FastDateFormat really optional
-24056  Documentation error in StringUtils.replace
-25227  StringEscapeUtils.unescapeHtml() doesn't handle hex entities
-25454  new StringUtils.replaceChars behaves differently from old Ch
-25560  DateUtils.truncate() is off by one hour when using a date in DST switch 'zone'
-25627  DateUtils constants should be long
-25683  Add method that validates Collection elements are a correct
-25849  Add SystemUtils methods for directory properties.
-26616  ClassCastException in Enum.equals(Object)
-26699  Tokenizer Enhancements: reset input string, static CSV
-26734  NullPointerException in EqualsBuilder.append(Object[], Object[])
-26877  Add SystemUtils.AWT_TOOLKIT and others.
-26922  public static boolean DateUtils.equals(Date dt1, Date dt2)
-27592  WordUtils capitalize improvement
-27876  ReflectionToStringBuilder.toString(null) throws exception by design
-27877  Make ClassUtils methods null-safe and not throw an IAE.
-28468  StringUtils.defaultString: Documentation error
-28554  Add hashCode-support to class ObjectUtils
-29082  Enhancement of ExceptionUtils.CAUSE_METHOD_NAMES
-29149  StringEscapeUtils.unescapeHtml() doesn't handle an empty entity
-29294  lang.math.Fraction class deficiencies
-29673  ExceptionUtils: new getCause() methodname (for tomcat)
-29794  Add convenience format(long) methods to FastDateForma
-30328  HashCodeBuilder does not use the same values as Boolean (fixed as documentation)
-30334  New class proposal: CharacterEncoding
-30674  parseDate class from HttpClient's DateParser class
-30815  ArrayUtils.isEquals() throws ClassCastException when array1
-30929  Nestable.indexOfThrowable(Class)  uses Class.equals() to match
-31395  DateUtils.truncate oddity at the far end of the Date spectrum
-31478  Compile error with JDK 5 "enum" is a keyword
-31572  o.a.c.lang.enum.ValuedEnum: 'enum'is a keyword in JDK1.5.0
-31933  ToStringStyle setArrayEnd handled null incorrectly
-32133  SystemUtils fails init on HP-UX
-32198  Error in JavaDoc for StringUtils.chomp(String, String)
-32625  Can't subclass EqualsBuilder because isEquals is private
-33067  EqualsBuilder.append(Object[], Object[]) crashes with a NullPointerException if an element of the first array is null
-33069  EqualsBuilder.append(Object[], Object[]) incorrectly checks that rhs[i] is instance of lhs[i]'s class
-33574  unbalanced ReflectionToStringBuilder
-33737  ExceptionUtils.addCauseMethodName(String) does not check for duplicates.
diff --git a/lang/src/site/resources/release-notes/RELEASE-NOTES-2.2.txt b/lang/src/site/resources/release-notes/RELEASE-NOTES-2.2.txt
deleted file mode 100644
index 82fd31a..0000000
--- a/lang/src/site/resources/release-notes/RELEASE-NOTES-2.2.txt
+++ /dev/null
@@ -1,112 +0,0 @@
-$Id: RELEASE-NOTES.txt 447139 2006-09-17 20:36:53Z bayard $
-
-                        Commons Lang Package
-                            Version 2.2
-                           Release Notes
-
-
-INTRODUCTION:
-
-This document contains the release notes for the 2.2 version of Apache Jakarta Commons Lang.
-Commons Lang is a set of utility functions and reusable components that
-should be of use in any Java environment.
-
-INCOMPATIBLE CHANGES WITH VERSION 2.1:
-
-- None
-
-ADDITIONAL INCOMPATIBLE CHANGES WITH VERSION 2.0:
-
-- The Nestable interface defines the method indexOfThrowable(Class).
-Previously the implementations checked only for a specific Class.
-Now they check for subclasses of that Class as well.
-For most situations this will be the expected behaviour (ie. its a bug fix).
-If it causes problems, please use the ExceptionUtils.indexOfThrowable(Class) method instead.
-Note that the ExceptionUtils method is available in v1.0 and v2.0 of commons-lang and has not been changed.
-(An alternative to this is to change the public static matchSubclasses flag on NestableDelegate.
-However, we don't recommend that as a long-term solution.)
-
-- The StopWatch class has had much extra validation added.
-If your code previously relied on unusual aspects, it may no longer work.
-
-- Starting with version 2.1, Ant version 1.6.x is required to build. Copy 
-junit.jar to ANT_HOME/lib. You can get JUnit from http://www.junit.org. See the developer's guide
-for more details.
-
-DEPRECATIONS FROM 2.1 to 2.2:
-
-- None
-
-DEPRECATIONS FROM 2.0 to 2.1:
-
-- The enum package has been renamed to enums for JDK1.5 compilance.
-All functionality is identical, just the package has changed.
-This package will be removed in v3.0.
-
-- NumberUtils.stringToInt - renamed to toInt
-
-- DateUtils - four constants, MILLIS_IN_* have been deprecated as they were defined
-as int not long. The replacements are MILLIS_PER_*. 
-
-
-BUG FIXES IN 2.2:
-
-LANG-2    javadoc example for StringUtils.splitByWholeSeparator incorrect
-LANG-3    PADDING array in StringUtils overflows on '\uffff'
-LANG-10   [patch] ClassUtils.primitiveToWrapper and Void
-LANG-21   escapeXML() -> Not escaping low characters
-LANG-25   DurationFormatUtils.formatDurationISO() javadoc is missing T in duration string between date and time part
-LANG-37   unit test for org.apache.commons.lang.text.StrBuilder
-LANG-42   EqualsBuilder.append(Object[], Object[]) crashes with a NullPointerException if an element of the first array is null
-LANG-45   StrBuilderTest#testReplaceStringString fails.
-LANG-50   Replace Clover with Cobertura
-LANG-59   DateUtils.truncate method is buggy when dealing with DST switching hours
-LANG-100  RandomStringUtils.random() family of methods create invalid unicode sequences
-LANG-105  ExceptionUtils goes into infinite loop in getThrowables is throwable.getCause() == throwable
-LANG-106  StringUtils#getLevenshteinDistance() performance is sub-optimal
-LANG-112  Wrong length check in StrTokenizer.StringMatcher
-LANG-117  FastDateFormat: wrong format for date "01.01.1000"
-LANG-122  EscapeUtil.escapeHtml() should clarify that it does not escape ' chars to &apos;
-LANG-123  Unclear javadoc for DateUtils.iterator()
-LANG-127  Minor tweak to fix of bug # 26616
-LANG-130  Memory "leak" in StringUtils
-LANG-140  DurationFormatUtils.formatPeriod() returns the wrong result
-LANG-141  Fraction.toProperString() returns -1/1 for -1
-LANG-148  Performance modifications on StringUtils.replace
-LANG-150  StringEscapeUtils.unescapeHtml skips first entity after standalone ampersand
-LANG-152  DurationFormatUtils.formatDurationWords "11 <unit>s" gets converted to "11 <unit>"
-LANG-259  ValuedEnum.compareTo(Object other) not typesafe - it easily could be...
-LANG-261  Error in an example in the javadoc of the StringUtils.splitPreserveAllTokens() method
-LANG-264  ToStringBuilder/HashCodeBuilder javadoc code examples
-LANG-271  LocaleUtils test fails under Mustang
-LANG-272  Minor build and checkstyle changes
-LANG-277  Javadoc errors on StringUtils.splitPreserveAllTokens(String, char)
-LANG-278  javadoc for StringUtils.removeEnd is incorrect
-
-IMPROVEMENTS IN 2.2:
-
-LANG-159  Add WordUtils.getInitials(String)
-LANG-161  Add methods and tests to StrBuilder
-LANG-162  replace() length calculation improvement
-LANG-165  parseDate with TimeZone
-LANG-166  New interpolation features
-LANG-169  Implementation of escape/unescapeHtml methods with Writer
-LANG-176  CompareToBuilder excludeFields for reflection method
-LANG-186  Request for MutableBoolean implementation
-LANG-194  add generic add method to DateUtils
-LANG-198  New method for EqualsBuilder
-LANG-212  New ExceptionUtils method setCause()
-LANG-216  Provides a Class.getPublicMethod which returns public invocable Method
-LANG-217  Add Mutable<Type> to<Type>() methods.
-LANG-220  Tokenizer Enhancements: reset input string, static CSV/TSV factories
-LANG-226  Using ReflectionToStringBuilder and excluding secure fields
-LANG-242  Trivial cleanup of javadoc in various files
-LANG-246  CompositeFormat
-LANG-250  Performance boost for RandomStringUtils
-LANG-254  Enhanced Class.forName version
-LANG-260  StringEscapeUtils should expose escape*() methods taking Writer argument
-LANG-263  Add StringUtils.containsIgnoreCase(...)
-LANG-267  Support char array converters on ArrayUtils
-LANG-270  minor javadoc improvements for StringUtils.stripXxx() methods
-          New ExceptionUtils methods getMessage/getRootCauseMessage
-
diff --git a/lang/src/site/resources/release-notes/RELEASE-NOTES-2.3.txt b/lang/src/site/resources/release-notes/RELEASE-NOTES-2.3.txt
deleted file mode 100644
index d2589cd..0000000
--- a/lang/src/site/resources/release-notes/RELEASE-NOTES-2.3.txt
+++ /dev/null
@@ -1,90 +0,0 @@
-$Id: RELEASE-NOTES.txt 504353 2007-02-06 22:52:29Z bayard $
-
-                        Commons Lang Package
-                            Version 2.3
-                           Release Notes
-
-
-INTRODUCTION:
-
-This document contains the release notes for the 2.3 version of Apache 
-Jakarta Commons Lang.
-Commons Lang is a set of utility functions and reusable components that
-should be of use in any Java environment.
-
-INCOMPATIBLE CHANGES WITH VERSION 2.2:
-
-- Calling stop on a suspended StopWatch will no longer change the underlying time. 
-  It's very unlikely anyone was relying on that bug as a feature.
-
-ADDITIONAL INCOMPATIBLE CHANGES WITH VERSION 2.0:
-
-- The Nestable interface defines the method indexOfThrowable(Class).
-Previously the implementations checked only for a specific Class.
-Now they check for subclasses of that Class as well.
-For most situations this will be the expected behaviour (ie. its a bug fix).
-If it causes problems, please use the ExceptionUtils.indexOfThrowable(Class) method instead.
-Note that the ExceptionUtils method is available in v1.0 and v2.0 of commons-lang and has not been changed.
-(An alternative to this is to change the public static matchSubclasses flag on NestableDelegate.
-However, we don't recommend that as a long-term solution.)
-
-- The StopWatch class has had much extra validation added.
-If your code previously relied on unusual aspects, it may no longer work.
-
-- Starting with version 2.1, Ant version 1.6.x is required to build. Copy 
-junit.jar to ANT_HOME/lib. You can get JUnit from http://www.junit.org. See the developer's guide
-for more details.
-
-DEPRECATIONS FROM 2.2 to 2.3:
-
-- None
-
-DEPRECATIONS FROM 2.1 to 2.2:
-
-- None
-
-DEPRECATIONS FROM 2.0 to 2.1:
-
-- The enum package has been renamed to enums for JDK1.5 compilance.
-All functionality is identical, just the package has changed.
-This package will be removed in v3.0.
-
-- NumberUtils.stringToInt - renamed to toInt
-
-- DateUtils - four constants, MILLIS_IN_* have been deprecated as they were defined
-as int not long. The replacements are MILLIS_PER_*. 
-
-
-BUG FIXES IN 2.3:
-
-    * [LANG-69 ] - ToStringBuilder throws StackOverflowError when an Object cycle exists
-    * [LANG-102] - Refactor Entities methods
-    * [LANG-153] - Can't XMLDecode an Enum
-    * [LANG-262] - Use of enum prevents a classloader from being garbage collected resuling in out of memory exceptions.
-    * [LANG-279] - HashCodeBuilder throws java.lang.StackOverflowError when an object contains a cycle.
-    * [LANG-281] - DurationFormatUtils returns wrong result
-    * [LANG-286] - Serialization - not backwards compatible
-    * [LANG-292] - unescapeXml("&12345678;") should be "&12345678;"
-    * [LANG-294] - StrBuilder.replaceAll and StrBuilder.deleteAll can throw ArrayIndexOutOfBoundsException.
-    * [LANG-295] - StrBuilder contains usages of thisBuf.length when they should use size
-    * [LANG-299] - Bug in method appendFixedWidthPadRight of class StrBuilder causes an ArrayIndexOutOfBoundsException
-    * [LANG-300] - NumberUtils.createNumber throws NumberFormatException for one digit long
-    * [LANG-303] - FastDateFormat.mRules is not transient or serializable
-    * [LANG-304] - NullPointerException in isAvailableLocale(Locale)
-    * [LANG-313] - Wrong behavior of Entities.unescape
-    * [LANG-315] - StopWatch: suspend() acts as split(), if followed by stop()
-
-IMPROVEMENTS IN 2.3:
-
-    * [LANG-258] - Enum JavaDoc
-    * [LANG-266] - Wish for StringUtils.join(Collection, *)
-    * [LANG-268] - StringUtils.join should allow you to pass a range for it (so it only joins a part of the array)
-    * [LANG-275] - StringUtils substringsBetween
-    * [LANG-282] - Create more tests to test out the +=31 replacement code in DurationFormatUtils.
-    * [LANG-287] - Optimize StringEscapeUtils.unescapeXml(String)
-    * [LANG-289] - NumberUtils.max(byte[]) and NumberUtils.min(byte[]) are missing
-    * [LANG-291] - Null-safe comparison methods for finding most recent / least recent dates.
-    * [LANG-306] - StrBuilder appendln/appendAll/appendSeparator
-    * [LANG-310] - BooleanUtils isNotTrue/isNotFalse
-    * [LANG-314] - Tests fail to pass when building with Maven 2
-
diff --git a/lang/src/site/resources/release-notes/RELEASE-NOTES-2.4.txt b/lang/src/site/resources/release-notes/RELEASE-NOTES-2.4.txt
deleted file mode 100644
index 0313d25..0000000
--- a/lang/src/site/resources/release-notes/RELEASE-NOTES-2.4.txt
+++ /dev/null
@@ -1,124 +0,0 @@
-$Id: RELEASE-NOTES.txt 637522 2008-03-16 03:41:46Z bayard $
-
-                        Commons Lang Package
-                            Version 2.4
-                           Release Notes
-
-
-INTRODUCTION:
-
-This document contains the release notes for the 2.4 version of Apache Commons Lang.
-Commons Lang is a set of utility functions and reusable components that should be of use in any Java environment.
-
-Lang 2.4 no longer attempts to target the Java 1.1 environment and now targets Java 1.2. While previous versions 
-were built for 1.1, some parts were using methods that were only available in 1.2, and the Enum class had 
-become dependent on Java 1.3. 
-
-INCOMPATIBLE CHANGES WITH VERSION 2.3:
-
-- None
-
-INCOMPATIBLE CHANGES WITH VERSION 2.2:
-
-- Calling stop on a suspended StopWatch will no longer change the underlying time. 
-  It's very unlikely anyone was relying on that bug as a feature.
-
-ADDITIONAL INCOMPATIBLE CHANGES WITH VERSION 2.0:
-
-- The Nestable interface defines the method indexOfThrowable(Class).
-Previously the implementations checked only for a specific Class.
-Now they check for subclasses of that Class as well.
-For most situations this will be the expected behaviour (ie. its a bug fix).
-If it causes problems, please use the ExceptionUtils.indexOfThrowable(Class) method instead.
-Note that the ExceptionUtils method is available in v1.0 and v2.0 of commons-lang and has not been changed.
-(An alternative to this is to change the public static matchSubclasses flag on NestableDelegate.
-However, we don't recommend that as a long-term solution.)
-
-- The StopWatch class has had much extra validation added.
-If your code previously relied on unusual aspects, it may no longer work.
-
-- Starting with version 2.1, Ant version 1.6.x is required to build. Copy 
-junit.jar to ANT_HOME/lib. You can get JUnit from http://www.junit.org. See the developer's guide
-for more details.
-
-DEPRECATIONS FROM 2.3 to 2.4:
-
-- ObjectUtils.appendIdentityToString(StringBuffer, Object) - has very odd semantics, use 
-  ObjectUtils.identityToString(StringBuffer, Object) instead.
-
-- public static java.util.Date add(java.util.Date, int, int) - it is not intended for this 
-  method to be public. Please let us know if you use this. 
-
-DEPRECATIONS FROM 2.2 to 2.3:
-
-- None
-
-DEPRECATIONS FROM 2.1 to 2.2:
-
-- None
-
-DEPRECATIONS FROM 2.0 to 2.1:
-
-- The enum package has been renamed to enums for JDK1.5 compilance.
-All functionality is identical, just the package has changed.
-This package will be removed in v3.0.
-
-- NumberUtils.stringToInt - renamed to toInt
-
-- DateUtils - four constants, MILLIS_IN_* have been deprecated as they were defined
-as int not long. The replacements are MILLIS_PER_*. 
-
-
-BUG FIXES IN 2.4:
-
-    * [LANG-76 ] - EnumUtils.getEnum() doesn't work well in 1.5
-    * [LANG-328] - LocaleUtils.toLocale() rejects strings with only language+variant
-    * [LANG-334] - Enum is not thread-safe
-    * [LANG-346] - Dates.round() behaves incorrectly for minutes and seconds
-    * [LANG-349] - Deadlock using ReflectionToStringBuilder
-    * [LANG-353] - Javadoc Example for EqualsBuilder is questionable
-    * [LANG-360] - Why does appendIdentityToString return null?
-    * [LANG-361] - BooleanUtils toBooleanObject javadoc does not match implementation
-    * [LANG-363] - StringEscapeUtils..escapeJavaScript() method did not escape '/' into '\/', it will make IE render page uncorrectly
-    * [LANG-364] - Documentation bug for ignoreEmptyTokens accessors in StrTokenizer
-    * [LANG-365] - BooleanUtils.toBoolean() - invalid drop-thru in case statement causes StringIndexOutOfBoundsException
-    * [LANG-367] - FastDateFormat thread safety
-    * [LANG-368] - FastDateFormat getDateInstance() and getDateTimeInstance() assume Locale.getDefault() won't change
-    * [LANG-369] - ExceptionUtils not thread-safe
-    * [LANG-372] - ToStringBuilder: MULTI_LINE_STYLE does not print anything from appendToString methods.
-    * [LANG-380] - infinite loop in Fraction.reduce when numerator == 0
-    * [LANG-381] - NumberUtils.min(floatArray) returns wrong value if floatArray[0] happens to be Float.NaN
-    * [LANG-385] - http://commons.apache.org/lang/developerguide.html "Building" section is incorrect and incomplete
-    * [LANG-393] - EqualsBuilder don't compare BigDecimals correctly
-    * [LANG-399] - Javadoc bugs - cannot find object
-    * [LANG-410] - Ambiguous / confusing names in StringUtils replace* methods
-    * [LANG-412] - StrBuilder appendFixedWidth does not handle nulls
-    * [LANG-414] - DateUtils.round() often fails
-
-IMPROVEMENTS IN 2.4:
-
-    * [LANG-180] - adding a StringUtils.replace method that takes an array or List of replacement strings
-    * [LANG-192] - Split camel case strings
-    * [LANG-257] - Add new splitByWholeSeparatorPreserveAllTokens() methods to StringUtils
-    * [LANG-269] - Shouldn't Commons Lang's StringUtils have a "common" string method?
-    * [LANG-298] - ClassUtils.getShortClassName and ClassUtils.getPackageName and class of array
-    * [LANG-321] - Add toArray() method to IntRange and LongRange classes
-    * [LANG-322] - ClassUtils.getShortClassName(String) inefficient
-    * [LANG-326] - StringUtils: startsWith / endsWith / startsWithIgnoreCase / endsWithIgnoreCase / removeStartIgnoreCase / removeEndIgnoreCase methods
-    * [LANG-329] - Pointless synchronized in ThreadLocal.initialValue should be removed
-    * [LANG-333] - ArrayUtils.toClass
-    * [LANG-337] - Utility class constructor javadocs should acknowledge that they may sometimes be used, e.g. with Velocity.
-    * [LANG-338] - truncateNicely method which avoids truncating in the middle of a word
-    * [LANG-345] - Optimize HashCodeBuilder.append(Object)
-    * [LANG-351] - Extension to ClassUtils: Obtain the primitive class from a wrapper
-    * [LANG-356] - Add getStartTime to StopWatch
-    * [LANG-362] - Add ExtendedMessageFormat to org.apache.commons.lang.text
-    * [LANG-371] - ToStringStyle javadoc should show examples of styles
-    * [LANG-374] - Add escaping for CSV columns to StringEscapeUtils
-    * [LANG-375] - add SystemUtils.IS_OS_WINDOWS_VISTA field
-    * [LANG-379] - Calculating A date fragment in any time-unit
-    * [LANG-383] - Adding functionality to DateUtils to allow direct setting of various fields.
-    * [LANG-402] - OSGi-ify Lang
-    * [LANG-404] - Add Calendar flavour format methods to DateFormatUtils
-    * [LANG-407] - StringUtils.length(String) returns null-safe length
-    * [LANG-413] - Memory usage improvement for StringUtils#getLevenshteinDistance()
diff --git a/lang/src/site/resources/release-notes/RELEASE-NOTES-2.5.txt b/lang/src/site/resources/release-notes/RELEASE-NOTES-2.5.txt
deleted file mode 100644
index 15eb318..0000000
--- a/lang/src/site/resources/release-notes/RELEASE-NOTES-2.5.txt
+++ /dev/null
@@ -1,83 +0,0 @@
-$Id: RELEASE-NOTES.txt 912439 2010-02-21 23:27:03Z niallp $
-
-                        Commons Lang Package
-                            Version 2.5
-                           Release Notes
-
-
-INTRODUCTION:
-
-This document contains the release notes for the 2.5 version of Apache Commons Lang.
-Commons Lang is a set of utility functions and reusable components that should be of use in any Java environment.
-
-
-COMPATIBILITY WITH 2.4
-======================
-Lang 2.5 is binary compatible release with Lang 2.4, containing bug fixes and small enhancements.
-
-Lang 2.5 requires a minimum of JDK 1.3.
-
-
-IMPROVEMENTS IN 2.5
-===================
-
-    * [LANG-583] - ArrayUtils - add isNotEmpty() methods
-    * [LANG-534] - ArrayUtils - add nullToEmpty() methods
-    * [LANG-454] - CharRange - provide an iterator that lets you walk the chars in the range
-    * [LANG-514] - CharRange - add more readable static builder methods
-    * [        ] - ClassUtils - new isAssignable() methods with autoboxing
-    * [LANG-535] - ClassUtils - add support to getShortClassName and getPackageName for arrays
-    * [LANG-434] - DateUtils - add ceiling() method
-    * [LANG-486] - DateUtils - add parseDateStrictly() method
-    * [LANG-466] - EqualsBuilder - add reset() method
-    * [LANG-461] - NumberUtils - add toByte() and toShort() methods
-    * [LANG-522] - Mutable numbers - add string constructors
-    * [        ] - MutableBoolean - add toBoolean(), isTrue() and isFalse() methods
-    * [LANG-422] - StrBuilder - add appendSeparator() methods with an alternative default separator if the StrBuilder is currently empty
-    * [LANG-555] - SystemUtils - add IS_OS_WINDOWS_7 constant
-    * [LANG-554] - SystemUtils - add IS_JAVA_1_7 constant for JDK 1.7
-    * [LANG-405] - StringUtils - add abbreviateMiddle() method
-    * [LANG-569] - StringUtils - add indexOfIgnoreCase() and lastIndexOfIgnoreCase() methods
-    * [LANG-471] - StringUtils - add isAllUpperCase() and isAllLowerCase() methods
-    * [LANG-469] - StringUtils - add lastOrdinalIndexOf() method to complement the existing ordinalIndexOf() method
-    * [LANG-438] - StringUtils - add repeat() method
-    * [LANG-445] - StringUtils - add startsWithAny() method
-    * [LANG-430] - StringUtils - add upperCase(String, Locale) and lowerCase(String, Locale) methods
-    * [LANG-416] - New Reflection package containing ConstructorUtils, FieldUtils, MemberUtils and MethodUtils
-
-BUG FIXES IN 2.5
-================
-
-    * [LANG-494] - CharSet - Synchronizing the COMMON Map so that getInstance doesn't miss a put from a subclass in another thread
-    * [LANG-500] - ClassUtils - improving performance of getAllInterfaces
-    * [LANG-587] - ClassUtils - toClass() throws NullPointerException on null array element
-    * [LANG-530] - DateUtils - Fix parseDate() cannot parse ISO8601 dates produced by FastDateFormat
-    * [LANG-440] - DateUtils - round() doesn't work correct for Calendar.AM_PM
-    * [LANG-443] - DateUtils - improve tests
-    * [LANG-204] - Entities - multithreaded initialization
-    * [LANG-506] - Entities - missing final modifiers; thread-safety issues
-    * [LANG-76]  - EnumUtils - getEnum() doesn't work well in 1.5+
-    * [LANG-584] - ExceptionUtils - use immutable lock target
-    * [LANG-477] - ExtendedMessageFormat - OutOfMemory with a pattern containing single quotes
-    * [LANG-538] - FastDateFormat - call getTime() on a calendar to ensure timezone is in the right state
-    * [LANG-547] - FastDateFormat - Remove unused field
-    * [LANG-511] - LocaleUtils - initialization of available locales can be deferred
-    * [LANG-457] - NumberUtils - createNumber() thows a StringIndexOutOfBoundsException for "l"
-    * [LANG-521] - NumberUtils - isNumber(String) and createNumber(String) both modified to support '2.'
-    * [LANG-432] - StringUtils - improve handling of case-insensitive Strings
-    * [LANG-552] - StringUtils - replaceEach() no longer NPEs when null appears in the last String[]
-    * [LANG-460] - StringUtils - correct JavaDocs for startsWith() and startsWithIgnoreCase()
-    * [LANG-421] - StringEscapeUtils - escapeJava() escapes '/' characters
-    * [LANG-450] - StringEscapeUtils - change escapeJavaStyleString() to throw UnhandledException instead swallowing IOException
-    * [LANG-419] - WordUtils - fix StringIndexOutOfBoundsException when lower is greater than the String length
-    * [LANG-523] - StrBuilder - Performance improvement by doubling the size of the String in ensureCapacity
-    * [LANG-575] - Compare, Equals and HashCode builders - use ArrayUtils to avoid creating a temporary List
-    * [LANG-467] - EqualsBuilder - removing the special handling of BigDecimal (LANG-393) to use compareTo 
-    * [LANG-574] - HashCodeBuilder - Performance improvement: check for isArray to short-circuit the 9 instanceof checks
-    * [LANG-520] - HashCodeBuilder - Changing the hashCode() method to return toHashCode()
-    * [LANG-459] - HashCodeBuilder - reflectionHashCode() can generate incorrect hashcodes
-    * [LANG-586] - HashCodeBuilder and ToStringStyle - use of ThreadLocal causes memory leaks in container environments
-    * [LANG-487] - ToStringBuilder - make default style thread-safe
-    * [LANG-472] - RandomUtils - nextLong() always produces even numbers
-    * [LANG-592] - RandomUtils - RandomUtils tests are failing frequently
-
diff --git a/lang/src/site/resources/release-notes/RELEASE-NOTES-2.6.txt b/lang/src/site/resources/release-notes/RELEASE-NOTES-2.6.txt
deleted file mode 100644
index aaba61c..0000000
--- a/lang/src/site/resources/release-notes/RELEASE-NOTES-2.6.txt
+++ /dev/null
@@ -1,59 +0,0 @@
-$Id: RELEASE-NOTES.txt 1058313 2011-01-12 20:59:27Z niallp $
-
-                        Commons Lang Package
-                            Version 2.6
-                           Release Notes
-
-
-INTRODUCTION:
-
-This document contains the release notes for the 2.6 version of Apache Commons Lang.
-Commons Lang is a set of utility functions and reusable components that should be of use in any Java environment.
-
-
-COMPATIBILITY WITH 2.5
-======================
-Lang 2.6 is binary compatible release with Lang 2.5, containing bug fixes and small enhancements.
-
-Lang 2.6 requires a minimum of JDK 1.3.
-
-
-IMPROVEMENTS IN 2.6
-===================
-
-    * [LANG-633] - BooleanUtils: use same optimization in toBooleanObject(String) as in toBoolean(String)
-    * [LANG-599] - ClassUtils: allow Dots as Inner Class Separators in getClass()
-    * [LANG-594] - DateUtils: equal and compare functions up to most significant field
-    * [LANG-632] - DateUtils: provide a Date to Calendar convenience method
-    * [LANG-576] - ObjectUtils: add clone methods to ObjectUtils
-    * [LANG-667] - ObjectUtils: add a Null-safe compare() method
-    * [LANG-670] - ObjectUtils: add notEqual() method
-    * [LANG-302] - StrBuilder: implement clone() method
-    * [LANG-640] - StringUtils: add a normalizeSpace() method
-    * [LANG-614] - StringUtils: add endsWithAny() method
-    * [LANG-655] - StringUtils: add defaultIfBlank() method
-    * [LANG-596] - StrSubstitutor: add a replace(String, Properties) variant
-    * [LANG-482] - StrSubstitutor: support substitution in variable names
-    * [LANG-669] - Use StrBuilder instead of StringBuffer to improve performance where sync. is not an issue
-    
-BUG FIXES IN 2.6
-================
-
-    * [LANG-629] - CharSet: make the underlying set synchronized
-    * [LANG-635] - CompareToBuilder: fix passing along compareTransients to the reflectionCompare method
-    * [LANG-636] - ExtendedMessageFormat doesn't override equals(Object)
-    * [LANG-645] - FastDateFormat: fix to properly include the locale when formatting a Date
-    * [LANG-638] - NumberUtils: createNumber() throws a StringIndexOutOfBoundsException when argument containing "e" and "E" is passed in
-    * [LANG-607] - StringUtils methods do not handle Unicode 2.0+ supplementary characters correctly
-    * [LANG-624] - SystemUtils: getJavaVersionAsFloat throws StringIndexOutOfBoundsException on Android runtime/Dalvik VM
-    * [BEANUTILS-381] - MemberUtils: getMatchingAccessibleMethod does not correctly handle inheritance and method overloading
-
-OTHER CHANGES IN 2.6
-====================
-
-    * [LANG-600] - Javadoc is incorrect for lastIndexOf() method
-    * [LANG-628] - Javadoc for HashCodeBuilder.append(boolean) does not match implementation
-    * [LANG-643] - Javadoc StringUtils.left() claims to throw an exception on negative lenth, but doesn't
-    * [LANG-370] - Javadoc - document thread safety
-    * [LANG-623] - Test for StringUtils replaceChars() icelandic characters
-
diff --git a/lang/src/site/resources/release-notes/RELEASE-NOTES-3.0.1.txt b/lang/src/site/resources/release-notes/RELEASE-NOTES-3.0.1.txt
deleted file mode 100644
index 241b2a3..0000000
--- a/lang/src/site/resources/release-notes/RELEASE-NOTES-3.0.1.txt
+++ /dev/null
@@ -1,42 +0,0 @@
-$Id$
-
-                        Commons Lang Package
-                            Version 3.0.1
-                           Release Notes
-
-
-INTRODUCTION:
-
-This document contains the release notes for the 3.0.1 version of Apache Commons Lang.
-Commons Lang is a set of utility functions and reusable components that should be of use in any 
-Java environment.
-
-Lang 3.0 and onwards now targets Java 5.0, making use of features that arrived with Java 5.0 such as generics, 
-variable arguments, autoboxing, concurrency and formatted output.
-
-For the advice on upgrading from 2.x to 3.x, see the following page: 
-
-    http://commons.apache.org/lang/article3_0.html
-
-CHANGES IN 3.0.1
-================
-
-    [LANG-686] Improve exception message when StringUtils.replaceEachRepeatedly detects recursion
-    [LANG-717] Specify source encoding for Ant build
-    [LANG-721] Complement ArrayUtils.addAll() variants with by-index and by-value removal methods
-    [LANG-726] Add Range<T> Range<T>.intersectionWith(Range<T>)
-    [LANG-723] Add mode and median Comparable... methods to ObjectUtils
-    [LANG-722] Add BooleanUtils.and + or varargs methods
-    [LANG-730] EnumSet -> bit vector
-    [LANG-735] Deprecate CharUtils.toCharacterObject(char) in favor of java.lang.Character.valueOf(char)
-    [LANG-737] Missing method getRawMessage for ContextedException and ContextedRuntimeException
-
-BUG FIXES IN 3.0.1
-==================
-
-    [LANG-626] SerializationUtils.clone: Fallback to context classloader if class not found in current classloader
-    [LANG-727] ToStringBuilderTest.testReflectionHierarchyArrayList fails with IBM JDK 6
-    [LANG-720] StringEscapeUtils.escapeXml(input) wrong when input contains characters in Supplementary Planes
-    [LANG-708] StringEscapeUtils.escapeEcmaScript from lang3 cuts off long unicode string
-    [LANG-734] The CHAR_ARRAY cache in CharUtils duplicates the cache in java.lang.Character
-    [LANG-738] Use internal Java's Number caches instead creating new objects
diff --git a/lang/src/site/resources/release-notes/RELEASE-NOTES-3.0.txt b/lang/src/site/resources/release-notes/RELEASE-NOTES-3.0.txt
deleted file mode 100644
index d753bfb..0000000
--- a/lang/src/site/resources/release-notes/RELEASE-NOTES-3.0.txt
+++ /dev/null
@@ -1,155 +0,0 @@
-$Id: RELEASE-NOTES.txt 1144999 2011-07-11 01:02:13Z ggregory $
-
-                        Commons Lang Package
-                            Version 3.0
-                           Release Notes
-
-
-INTRODUCTION:
-
-This document contains the release notes for the 3.0 version of Apache Commons Lang.
-Commons Lang is a set of utility functions and reusable components that should be of use in any 
-Java environment.
-
-Lang 3.0 now targets Java 5.0, making use of features that arrived with Java 5.0 such as generics, 
-variable arguments, autoboxing, concurrency and formatted output.
-
-For the latest advice on upgrading, see the following page: 
-
-    http://commons.apache.org/lang/article3_0.html
-
-ADDITIONS IN 3.0
-================
-
-    [LANG-276] MutableBigDecimal and MutableBigInteger.
-    [LANG-285] Wish : method unaccent.
-    [LANG-358] ObjectUtils.coalesce.
-    [LANG-386] LeftOf/RightOfNumber in Range convenience methods necessary.
-    [LANG-435] Add ClassUtils.isAssignable() variants with autoboxing.
-    [LANG-444] StringUtils.emptyToNull.
-    [LANG-482] Enhance StrSubstitutor to support nested ${var-${subvr}} expansion
-    [LANG-482] StrSubstitutor now supports substitution in variable names.
-    [LANG-496] A generic implementation of the Lazy initialization pattern.
-    [LANG-497] Addition of ContextedException and ContextedRuntimeException.
-    [LANG-498] Add StringEscapeUtils.escapeText() methods.
-    [LANG-499] Add support for the handling of ExecutionExceptions.
-    [LANG-501] Add support for background initialization.
-    [LANG-529] Add a concurrent package.
-    [LANG-533] Validate: support for validating blank strings.
-    [LANG-537] Add ArrayUtils.toArray to create generic arrays.
-    [LANG-545] Add ability to create a Future for a constant.
-    [LANG-546] Add methods to Validate to check whether the index is valid for the array/list/string.
-    [LANG-553] Add TypeUtils class to provide utility code for working with generic types.
-    [LANG-559] Added isAssignableFrom and isInstanceOf validation methods.
-    [LANG-559] Added validState validation method.
-    [LANG-560] New TimedSemaphore class.
-    [LANG-582] Provide an implementation of the ThreadFactory interface.
-    [LANG-588] Create a basic Pair<L, R> class.
-    [LANG-594] DateUtils equal & compare functions up to most significant field.
-    [LANG-601] Add Builder Interface / Update Builders to Implement It.
-    [LANG-609] Support lazy initialization using atomic variables
-    [LANG-610] Extend exception handling in ConcurrentUtils to runtime exceptions.
-    [LANG-614] StringUtils.endsWithAny method
-    [LANG-640] Add normalizeSpace to StringUtils
-    [LANG-644] Provide documentation about the new concurrent package
-    [LANG-649] BooleanUtils.toBooleanObject to support single character input
-    [LANG-651] Add AnnotationUtils
-    [LANG-653] Provide a very basic ConcurrentInitializer implementation
-    [LANG-655] Add StringUtils.defaultIfBlank()
-    [LANG-667] Add a Null-safe compare() method to ObjectUtils
-    [LANG-676] Documented potential NPE if auto-boxing occurs for some BooleanUtils methods
-    [LANG-678] Add support for ConcurrentMap.putIfAbsent()
-    [LANG-692] Add hashCodeMulti varargs method
-    [LANG-697] Add FormattableUtils class
-    [LANG-684] Levenshtein Distance Within a Given Threshold
-
-REMOVALS IN 3.0
-===============
-
-    [LANG-438] Remove @deprecateds.
-    [LANG-492] Remove code handled now by the JDK.
-    [LANG-493] Remove code that does not hold enough value to remain.
-    [LANG-590] Remove JDK 1.2/1.3 bug handling in StringUtils.indexOf(String, String, int).
-    [LANG-673] WordUtils.abbreviate() removed
-    [LANG-691] Removed DateUtils.UTC_TIME_ZONE
-
-IMPROVEMENTS IN 3.0
-===================
-
-    [LANG-290] EnumUtils for JDK 5.0.
-    [LANG-336] Finally start using generics.
-    [LANG-355] StrBuilder should implement CharSequence and Appendable.
-    [LANG-396] Investigate for vararg usages.
-    [LANG-424] Improve Javadoc for StringUtils class.
-    [LANG-458] Refactor Validate.java to eliminate code redundancy.
-    [LANG-479] Document where in SVN trunk is.
-    [LANG-504] bring ArrayUtils.isEmpty to the generics world.
-    [LANG-505] Rewrite StringEscapeUtils.
-    [LANG-507] StringEscapeUtils.unescapeJava should support \u+ notation.
-    [LANG-510] Convert StringUtils API to take CharSequence.
-    [LANG-513] Better EnumUtils.
-    [LANG-528] Mutable classes should implement an appropriately typed Mutable interface.
-    [LANG-539] Compile commons.lang for CDC 1.1/Foundation 1.1.
-    [LANG-540] Make NumericEntityEscaper immutable.
-    [LANG-541] Replace StringBuffer with StringBuilder.
-    [LANG-548] Use Iterable on API instead of Collection.
-    [LANG-551] Replace Range classes with generic version.
-    [LANG-562] Change Maven groupId.
-    [LANG-563] Change Java package name.
-    [LANG-570] Do the test cases really still require main() and suite() methods?.
-    [LANG-579] Add new Validate methods.
-    [LANG-599] ClassUtils.getClass(): Allow Dots as Inner Class Separators.
-    [LANG-605] DefaultExceptionContext overwrites values in recursive situations.
-    [LANG-668] Change ObjectUtils min() & max() functions to use varargs rather than just two parameters
-    [LANG-681] Push down WordUtils to "text" sub-package.
-    [LANG-711] Add includeantruntime=false to javac targets to quell warnings in ant 1.8.1 and better (and modest performance gain).
-    [LANG-713] Increase test coverage of FieldUtils read methods and tweak javadoc.
-    [LANG-718] build.xml Java 1.5+ updates.
-
-BUG FIXES IN 3.0
-================
-
-    [LANG-11]  Depend on JDK 1.5+.
-    [LANG-302] StrBuilder does not implement clone().
-    [LANG-339] StringEscapeUtils.escapeHtml() escapes multibyte characters like Chinese, Japanese, etc.
-    [LANG-369] ExceptionUtils not thread-safe.
-    [LANG-418] Javadoc incorrect for StringUtils.endsWithIgnoreCase.
-    [LANG-428] StringUtils.isAlpha, isAlphanumeric and isNumeric now return false for ""
-    [LANG-439] StringEscapeUtils.escapeHTML() does not escape chars (0x00-0x20).
-    [LANG-448] Lower Ascii Characters don't get encoded by Entities.java.
-    [LANG-468] JDK 1.5 build/runtime failure on LANG-393 (EqualsBuilder).
-    [LANG-474] Fixes for thread safety.
-    [LANG-478] StopWatch does not resist to system time changes.
-    [LANG-480] StringEscapeUtils.escapeHtml incorrectly converts unicode characters above U+00FFFF into 2 characters.
-    [LANG-481] Possible race-conditions in hashCode of the range classes.
-    [LANG-564] Improve StrLookup API documentation.
-    [LANG-568] @SuppressWarnings("unchecked") is used too generally.
-    [LANG-571] ArrayUtils.add(T[] array, T element) can create unexpected ClassCastException.
-    [LANG-585] exception.DefaultExceptionContext.getFormattedExceptionMessage catches Throwable.
-    [LANG-596] StrSubstitutor should also handle the default properties of a java.util.Properties class
-    [LANG-600] Javadoc is incorrect for public static int lastIndexOf(String str, String searchStr).
-    [LANG-602] ContextedRuntimeException no longer an 'unchecked' exception.
-    [LANG-606] EqualsBuilder causes StackOverflowException.
-    [LANG-608] Some StringUtils methods should take an int character instead of char to use String API features.
-    [LANG-617] StringEscapeUtils.escapeXML() can't process UTF-16 supplementary characters
-    [LANG-624] SystemUtils.getJavaVersionAsFloat throws StringIndexOutOfBoundsException on Android runtime/Dalvik VM
-    [LANG-629] Charset may not be threadsafe, because the HashSet is not synch.
-    [LANG-638] NumberUtils createNumber throws a StringIndexOutOfBoundsException when argument containing "e" and "E" is passed in
-    [LANG-643] Javadoc StringUtils.left() claims to throw on negative len, but doesn't
-    [LANG-645] FastDateFormat.format() outputs incorrect week of year because locale isn't respected
-    [LANG-646] StringEscapeUtils.unescapeJava doesn't handle octal escapes and Unicode with extra u
-    [LANG-656] Example StringUtils.indexOfAnyBut("zzabyycdxx", '') = 0 incorrect
-    [LANG-658] Some Entitys like &Ouml; are not matched properly against its ISO8859-1 representation
-    [LANG-659] EntityArrays typo: {"\u2122", "&minus;"}, // minus sign, U+2212 ISOtech
-    [LANG-66]  StringEscaper.escapeXml() escapes characters > 0x7f.
-    [LANG-662] org.apache.commons.lang3.math.Fraction does not reduce (Integer.MIN_VALUE, 2^k)
-    [LANG-663] org.apache.commons.lang3.math.Fraction does not always succeed in multiplyBy and divideBy
-    [LANG-664] NumberUtils.isNumber(String) is not right when the String is "1.1L"
-    [LANG-672] Doc bug in DateUtils#ceiling
-    [LANG-677] DateUtils.isSameLocalTime compares using 12 hour clock and not 24 hour
-    [LANG-685] EqualsBuilder synchronizes on HashCodeBuilder.
-    [LANG-703] StringUtils.join throws NPE when toString returns null for one of objects in collection
-    [LANG-710] StringIndexOutOfBoundsException when calling unescapeHtml4("&#03")
-    [LANG-714] StringUtils doc/comment spelling fixes.
-	[LANG-715] CharSetUtils.squeeze() speedup.
-    [LANG-716] swapCase and *capitalize speedups.
diff --git a/lang/src/site/resources/release-notes/RELEASE-NOTES-3.1.txt b/lang/src/site/resources/release-notes/RELEASE-NOTES-3.1.txt
deleted file mode 100644
index e0ec133..0000000
--- a/lang/src/site/resources/release-notes/RELEASE-NOTES-3.1.txt
+++ /dev/null
@@ -1,40 +0,0 @@
-$Id: RELEASE-NOTES.txt 1199820 2011-11-09 16:14:52Z bayard $
-
-                        Commons Lang Package
-                            Version 3.1
-                           Release Notes
-
-
-INTRODUCTION:
-
-This document contains the release notes for the 3.1 version of Apache Commons Lang.
-Commons Lang is a set of utility functions and reusable components that should be of use in any 
-Java environment.
-
-Lang 3.0 and onwards now targets Java 5.0, making use of features that arrived with Java 5.0 such as generics, 
-variable arguments, autoboxing, concurrency and formatted output.
-
-For the advice on upgrading from 2.x to 3.x, see the following page: 
-
-    http://commons.apache.org/lang/article3_0.html
-
-CHANGES IN 3.1
-================
-
-    [LANG-760] Add API StringUtils.toString(byte[] intput, String charsetName)
-    [LANG-756] Add APIs ClassUtils.isPrimitiveWrapper(Class<?>) and isPrimitiveOrWrapper(Class<?>)
-    [LANG-758] Add an example with whitespace in StringUtils.defaultIfEmpty
-    [LANG-752] Fix createLong() so it behaves like createInteger()
-    [LANG-751] Include the actual type in the Validate.isInstance and isAssignableFrom exception messages
-    [LANG-748] Deprecating chomp(String, String)
-    [LANG-736] CharUtils static final array CHAR_STRING is not needed to compute CHAR_STRING_ARRAY
-    [LANG-695] SystemUtils.IS_OS_UNIX doesn't recognize FreeBSD as a Unix system
-
-BUG FIXES IN 3.1
-==================
-
-    [LANG-749] Incorrect Bundle-SymbolicName in Manifest
-    [LANG-746] NumberUtils does not handle upper-case hex: 0X and -0X
-    [LANG-744] StringUtils throws java.security.AccessControlException on Google App Engine
-    [LANG-741] Ant build has wrong component.name
-    [LANG-698] Document that the Mutable numbers don't work as expected with String.format
diff --git a/lang/src/site/resources/release-notes/RELEASE-NOTES-3.2.1.txt b/lang/src/site/resources/release-notes/RELEASE-NOTES-3.2.1.txt
deleted file mode 100644
index 1f34024..0000000
--- a/lang/src/site/resources/release-notes/RELEASE-NOTES-3.2.1.txt
+++ /dev/null
@@ -1,418 +0,0 @@
-$Id: RELEASE-NOTES.txt 1555524 2014-01-05 15:24:49Z britter $
-
-   Licensed to the Apache Software Foundation (ASF) under one or more
-   contributor license agreements.  See the NOTICE file distributed with
-   this work for additional information regarding copyright ownership.
-   The ASF licenses this file to You under the Apache License, Version 2.0
-   (the "License"); you may not use this file except in compliance with
-   the License.  You may obtain a copy of the License at
-
-       http://www.apache.org/licenses/LICENSE-2.0
-
-   Unless required by applicable law or agreed to in writing, software
-   distributed under the License is distributed on an "AS IS" BASIS,
-   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-   See the License for the specific language governing permissions and
-   limitations under the License.
-
-
-                           Apache Commons Lang
-                               Version 3.2.1
-                              Release Notes
-
-
-INTRODUCTION:
-
-This document contains the release notes for the 3.2.1 version of 
-Apache Commons Lang. Commons Lang is a set of utility functions and reusable 
-components that should be of use in any Java environment. Commons Lang 3.2.1
-at least requires Java 6.0.
-
-For the advice on upgrading from 2.x to 3.x, see the following page: 
-
-    http://commons.apache.org/lang/article3_0.html
-
-BUG FIXES
-===========
-
-o LANG-937:  Fix missing Hamcrest dependency in Ant Build
-o LANG-941:  Test failure in LocaleUtilsTest when building with JDK 8
-o LANG-942:  Test failure in FastDateParserTest and FastDateFormat_ParserTest
-             when building with JDK8. Thanks to Bruno P. Kinoshita,
-             Henri Yandell.
-o LANG-938:  Build fails with test failures when building with JDK 8 
-
-                        Release Notes for version 3.2
-
-COMPATIBILITY WITH 3.1
-========================
-
-This release introduces backwards incompatible changes in 
-org.apache.commons.lang3.time.FastDateFormat:
-o Method 'protected java.util.List parsePattern()' has been removed
-o Method 'protected java.lang.String parseToken(java.lang.String, int[])' has
-  been removed
-o Method 'protected org.apache.commons.lang3.time.FastDateFormat$NumberRule
-  selectNumberRule(int, int)' has been removed
-
-These changes were the result of [LANG-462]. It is assumed that this change 
-will not break clients as Charles Honton pointed out on 25/Jan/12:
-"
- 1. Methods "FastDateFormat$NumberRule selectNumberRule(int, int)" and 
-    "List<Rule> parsePattern()" couldn't have been overridden because
-    NumberRule and Rule were private to FastDateFormat.
- 2. Due to the factory pattern used, it's unlikely other two methods would have 
-    been overridden.
- 3. The four methods are highly implementation specific. I consider it a 
-    mistake that the methods were exposed.
-"
-For more information see https://issues.apache.org/jira/browse/LANG-462.
-
-NEW FEATURES
-==============
-
-o LANG-934:  Add removeFinalModifier to FieldUtils
-o LANG-863:  Method returns number of inheritance hops between parent and
-             subclass. Thanks to Daneel S. Yaitskov.
-o LANG-774:  Added isStarted, isSuspended and isStopped to StopWatch.
-             Thanks to Erhan Bagdemir.
-o LANG-848:  Added StringUtils.isBlank/isEmpty CharSequence... methods.
-             Thanks to Alexander Muthmann.
-o LANG-926:  Added ArrayUtils.reverse(array, from, to) methods.
-o LANG-795:  StringUtils.toString(byte[], String) deprecated in favour of a new
-             StringUtils.toString(byte[], CharSet). Thanks to Aaron Digulla.
-o LANG-893:  StrSubstitutor now supports default values for variables.
-             Thanks to Woonsan Ko.
-o LANG-913:  Adding .gitignore to commons-lang. Thanks to Allon Mureinik.
-o LANG-837:  Add ObjectUtils.toIdentityString methods that support
-             StringBuilder, StrBuilder, and Appendable.
-o LANG-886:  Added CharSetUtils.containsAny(String, String).
-o LANG-797:  Added escape/unescapeJson to StringEscapeUtils.
-o LANG-875:  Added appendIfMissing and prependIfMissing methods to StringUtils.
-o LANG-870:  Add StringUtils.LF and StringUtils.CR values.
-o LANG-873:  Add FieldUtils getAllFields() to return all the fields defined in
-             the given class and super classes.
-o LANG-835:  StrBuilder should support StringBuilder as an input parameter.
-o LANG-857:  StringIndexOutOfBoundsException in CharSequenceTranslator.
-o LANG-856:  Code refactoring in NumberUtils.
-o LANG-855:  NumberUtils#createBigInteger does not allow for hex and octal
-             numbers.
-o LANG-854:  NumberUtils#createNumber - does not allow for hex numbers to be
-             larger than Long. 
-o LANG-853:  StringUtils join APIs for primitives. 
-o LANG-841:  Add StringUtils API to call String.replaceAll in DOTALL a.k.a.
-             single-line mode. 
-o LANG-825:  Create StrBuilder APIs similar to
-             String.format(String, Object...).
-o LANG-675:  Add Triple class (ternary version of Pair).
-o LANG-462:  FastDateFormat supports parse methods.
-
-BUG FIXES
-===========
-
-o LANG-932:  Spelling fixes. Thanks to Ville Skyttä.
-o LANG-929:  OctalUnescaper tried to parse all of \279.
-o LANG-928:  OctalUnescaper had bugs when parsing octals starting with a zero.
-o LANG-905:  EqualsBuilder returned true when comparing arrays, even when the
-             elements are different.
-o LANG-917:  Fixed exception when combining custom and choice format in
-             ExtendedMessageFormat. Thanks to Arne Burmeister.
-o LANG-902:  RandomStringUtils.random javadoc was incorrectly promising letters
-             and numbers would, as opposed to may, appear  Issue:. Thanks to
-             Andrzej Winnicki.
-o LANG-921:  BooleanUtils.xor(boolean...) produces wrong results.
-o LANG-896:  BooleanUtils.toBoolean(String str) javadoc is not updated. Thanks
-             to Mark Bryan Yu.
-o LANG-879:  LocaleUtils test fails with new Locale "ja_JP_JP_#u-ca-japanese"
-             of JDK7.
-o LANG-836:  StrSubstitutor does not support StringBuilder or CharSequence.
-             Thanks to Arnaud Brunet.
-o LANG-693:  Method createNumber from NumberUtils doesn't work for floating
-             point numbers other than Float  Issue: LANG-693. Thanks to
-             Calvin Echols.
-o LANG-887:  FastDateFormat does not use the locale specific cache correctly.
-o LANG-754:  ClassUtils.getShortName(String) will now only do a reverse lookup
-             for array types.
-o LANG-881:  NumberUtils.createNumber() Javadoc says it does not work for octal
-             numbers.
-o LANG-865:  LocaleUtils.toLocale does not parse strings starting with an
-             underscore.
-o LANG-858:  StringEscapeUtils.escapeJava() and escapeEcmaScript() do not
-             output the escaped surrogate pairs that are Java parsable.
-o LANG-849:  FastDateFormat and FastDatePrinter generates Date objects 
-             wastefully.
-o LANG-845:  Spelling fixes.
-o LANG-844:  Fix examples contained in javadoc of StringUtils.center methods.
-o LANG-832:  FastDateParser does not handle unterminated quotes correctly.
-o LANG-831:  FastDateParser does not handle white-space properly.
-o LANG-830:  FastDateParser could use \Q \E to quote regexes.
-o LANG-828:  FastDateParser does not handle non-Gregorian calendars properly.
-o LANG-826:  FastDateParser does not handle non-ASCII digits correctly.
-o LANG-822:  NumberUtils#createNumber - bad behaviour for leading "--".
-o LANG-818:  FastDateFormat's "z" pattern does not respect timezone of Calendar
-             instances passed to format().
-o LANG-817:  Add org.apache.commons.lang3.SystemUtils.IS_OS_WINDOWS_8.
-o LANG-813:  StringUtils.equalsIgnoreCase doesn't check string reference
-             equality.
-o LANG-810:  StringUtils.join() endIndex, bugged for loop.
-o LANG-807:  RandomStringUtils throws confusing IAE when end <= start.
-o LANG-805:  RandomStringUtils.random(count, 0, 0, false, false, universe,
-             random) always throws java.lang.ArrayIndexOutOfBoundsException.
-o LANG-802:  LocaleUtils - unnecessary recursive call in SyncAvoid class.
-o LANG-800:  Javadoc bug in DateUtils#ceiling for Calendar and Object versions.
-o LANG-788:  SerializationUtils throws ClassNotFoundException when cloning 
-             primitive classes.
-o LANG-786:  StringUtils equals() relies on undefined behavior.
-o LANG-783:  Documentation bug: StringUtils.split.
-o LANG-777:  jar contains velocity template of release notes.
-o LANG-776:  TypeUtilsTest contains incorrect type assignability assertion.
-o LANG-775:  TypeUtils.getTypeArguments() misses type arguments for
-             partially-assigned classes.
-o LANG-773:  ImmutablePair doc contains nonsense text.
-o LANG-772:  ClassUtils.PACKAGE_SEPARATOR Javadoc contains garbage text.
-o LANG-765:  EventListenerSupport.ProxyInvocationHandler no longer defines 
-             serialVersionUID.
-o LANG-764:  StrBuilder is now serializable.
-o LANG-761:  Fix Javadoc Ant warnings.
-o LANG-747:  NumberUtils does not handle Long Hex numbers.
-o LANG-743:  Javadoc bug in static inner class DateIterator.
-
-CHANGES
-=========
-
-o LANG-931:  Misleading Javadoc comment in StrBuilderReader class. Thanks
-             to Christoph Schneegans.
-o LANG-910:  StringUtils.normalizeSpace now handles non-breaking spaces
-             (Unicode 00A0). Thanks to Timur Yarosh.
-o LANG-804:  Redundant check for zero in HashCodeBuilder ctor. Thanks to 
-             Allon Mureinik.
-o LANG-884:  Simplify FastDateFormat; eliminate boxing.
-o LANG-882:  LookupTranslator now works with implementations of CharSequence
-             other than String.
-o LANG-846:  Provide CharSequenceUtils.regionMatches with a proper green
-             implementation instead of inefficiently converting to Strings.
-o LANG-839:  ArrayUtils removeElements methods use unnecessary HashSet.
-o LANG-838:  ArrayUtils removeElements methods clone temporary index arrays
-             unnecessarily.
-o LANG-799:  DateUtils#parseDate uses default locale; add Locale support.
-o LANG-798:  Use generics in SerializationUtils.
-
-CHANGES WITHOUT TICKET
-========================
-
-o Fixed URLs in javadoc to point to new oracle.com pages
-
-
-                        Release Notes for version 3.1
-
-NEW FEATURES
-==============
-
-o LANG-801:  Add Conversion utility to convert between data types on byte level
-o LANG-760:  Add API StringUtils.toString(byte[] intput, String charsetName)
-o LANG-756:  Add APIs ClassUtils.isPrimitiveWrapper(Class<?>) and 
-             isPrimitiveOrWrapper(Class<?>)
-o LANG-695:  SystemUtils.IS_OS_UNIX doesn't recognize FreeBSD as a Unix system
-
-BUG FIXES
-===========
-
-o LANG-749:  Incorrect Bundle-SymbolicName in Manifest
-o LANG-746:  NumberUtils does not handle upper-case hex: 0X and -0X
-o LANG-744:  StringUtils throws java.security.AccessControlException on Google
-             App Engine
-o LANG-741:  Ant build has wrong component.name
-o LANG-698:  Document that the Mutable numbers don't work as expected with
-             String.format
-
-CHANGES
-=========
-
-o LANG-758:  Add an example with whitespace in StringUtils.defaultIfEmpty
-o LANG-752:  Fix createLong() so it behaves like createInteger()
-o LANG-751:  Include the actual type in the Validate.isInstance and
-             isAssignableFrom exception messages
-o LANG-748:  Deprecating chomp(String, String)
-o LANG-736:  CharUtils static final array CHAR_STRING is not needed to compute
-             CHAR_STRING_ARRAY
-
-
-                        Release Notes for version 3.0
-
-ADDITIONS
-===========
-
-o LANG-276:  MutableBigDecimal and MutableBigInteger.
-o LANG-285:  Wish : method unaccent.
-o LANG-358:  ObjectUtils.coalesce.
-o LANG-386:  LeftOf/RightOfNumber in Range convenience methods necessary.
-o LANG-435:  Add ClassUtils.isAssignable() variants with autoboxing.
-o LANG-444:  StringUtils.emptyToNull.
-o LANG-482:  Enhance StrSubstitutor to support nested ${var-${subvr}} expansion
-o LANG-482:  StrSubstitutor now supports substitution in variable names.
-o LANG-496:  A generic implementation of the Lazy initialization pattern.
-o LANG-497:  Addition of ContextedException and ContextedRuntimeException.
-o LANG-498:  Add StringEscapeUtils.escapeText() methods.
-o LANG-499:  Add support for the handling of ExecutionExceptions.
-o LANG-501:  Add support for background initialization.
-o LANG-529:  Add a concurrent package.
-o LANG-533:  Validate: support for validating blank strings.
-o LANG-537:  Add ArrayUtils.toArray to create generic arrays.
-o LANG-545:  Add ability to create a Future for a constant.
-o LANG-546:  Add methods to Validate to check whether the index is valid for
-             the array/list/string.
-o LANG-553:  Add TypeUtils class to provide utility code for working with generic
-             types.
-o LANG-559:  Added isAssignableFrom and isInstanceOf validation methods.
-o LANG-559:  Added validState validation method.
-o LANG-560:  New TimedSemaphore class.
-o LANG-582:  Provide an implementation of the ThreadFactory interface.
-o LANG-588:  Create a basic Pair<L, R> class.
-o LANG-594:  DateUtils equal & compare functions up to most significant field.
-o LANG-601:  Add Builder Interface / Update Builders to Implement It.
-o LANG-609:  Support lazy initialization using atomic variables
-o LANG-610:  Extend exception handling in ConcurrentUtils to runtime exceptions.
-o LANG-614:  StringUtils.endsWithAny method
-o LANG-640:  Add normalizeSpace to StringUtils
-o LANG-644:  Provide documentation about the new concurrent package
-o LANG-649:  BooleanUtils.toBooleanObject to support single character input
-o LANG-651:  Add AnnotationUtils
-o LANG-653:  Provide a very basic ConcurrentInitializer implementation
-o LANG-655:  Add StringUtils.defaultIfBlank()
-o LANG-667:  Add a Null-safe compare() method to ObjectUtils
-o LANG-676:  Documented potential NPE if auto-boxing occurs for some BooleanUtils
-             methods
-o LANG-678:  Add support for ConcurrentMap.putIfAbsent()
-o LANG-692:  Add hashCodeMulti varargs method
-o LANG-697:  Add FormattableUtils class
-o LANG-684:  Levenshtein Distance Within a Given Threshold
-
-REMOVALS
-==========
-
-o LANG-438:  Remove @deprecateds.
-o LANG-492:  Remove code handled now by the JDK.
-o LANG-493:  Remove code that does not hold enough value to remain.
-o LANG-590:  Remove JDK 1.2/1.3 bug handling in 
-             StringUtils.indexOf(String, String, int).
-o LANG-673:  WordUtils.abbreviate() removed
-o LANG-691:  Removed DateUtils.UTC_TIME_ZONE
-
-IMPROVEMENTS
-==============
-
-o LANG-290:  EnumUtils for JDK 5.0.
-o LANG-336:  Finally start using generics.
-o LANG-355:  StrBuilder should implement CharSequence and Appendable.
-o LANG-396:  Investigate for vararg usages.
-o LANG-424:  Improve Javadoc for StringUtils class.
-o LANG-458:  Refactor Validate.java to eliminate code redundancy.
-o LANG-479:  Document where in SVN trunk is.
-o LANG-504:  bring ArrayUtils.isEmpty to the generics world.
-o LANG-505:  Rewrite StringEscapeUtils.
-o LANG-507:  StringEscapeUtils.unescapeJava should support \u+ notation.
-o LANG-510:  Convert StringUtils API to take CharSequence.
-o LANG-513:  Better EnumUtils.
-o LANG-528:  Mutable classes should implement an appropriately typed Mutable
-             interface.
-o LANG-539:  Compile commons.lang for CDC 1.1/Foundation 1.1.
-o LANG-540:  Make NumericEntityEscaper immutable.
-o LANG-541:  Replace StringBuffer with StringBuilder.
-o LANG-548:  Use Iterable on API instead of Collection.
-o LANG-551:  Replace Range classes with generic version.
-o LANG-562:  Change Maven groupId.
-o LANG-563:  Change Java package name.
-o LANG-570:  Do the test cases really still require main() and suite() methods?
-o LANG-579:  Add new Validate methods.
-o LANG-599:  ClassUtils.getClass(): Allow Dots as Inner Class Separators.
-o LANG-605:  DefaultExceptionContext overwrites values in recursive situations.
-o LANG-668:  Change ObjectUtils min() & max() functions to use varargs rather
-             than just two parameters
-o LANG-681:  Push down WordUtils to "text" sub-package.
-o LANG-711:  Add includeantruntime=false to javac targets to quell warnings in
-             ant 1.8.1 and better (and modest performance gain).
-o LANG-713:  Increase test coverage of FieldUtils read methods and tweak
-             javadoc.
-o LANG-718:  build.xml Java 1.5+ updates.
-
-BUG FIXES
-===========
-
-o LANG-11:   Depend on JDK 1.5+.
-o LANG-302:  StrBuilder does not implement clone().
-o LANG-339:  StringEscapeUtils.escapeHtml() escapes multibyte characters like
-             Chinese, Japanese, etc.
-o LANG-369:  ExceptionUtils not thread-safe.
-o LANG-418:  Javadoc incorrect for StringUtils.endsWithIgnoreCase.
-o LANG-428:  StringUtils.isAlpha, isAlphanumeric and isNumeric now return false
-             for ""
-o LANG-439:  StringEscapeUtils.escapeHTML() does not escape chars (0x00-0x20).
-o LANG-448:  Lower Ascii Characters don't get encoded by Entities.java.
-o LANG-468:  JDK 1.5 build/runtime failure on LANG-393 (EqualsBuilder).
-o LANG-474:  Fixes for thread safety.
-o LANG-478:  StopWatch does not resist to system time changes.
-o LANG-480:  StringEscapeUtils.escapeHtml incorrectly converts unicode
-             characters above U+00FFFF into 2 characters.
-o LANG-481:  Possible race-conditions in hashCode of the range classes.
-o LANG-564:  Improve StrLookup API documentation.
-o LANG-568:  @SuppressWarnings("unchecked") is used too generally.
-o LANG-571:  ArrayUtils.add(T[:  array, T element) can create unexpected
-             ClassCastException.
-o LANG-585:  exception.DefaultExceptionContext.getFormattedExceptionMessage
-             catches Throwable.
-o LANG-596:  StrSubstitutor should also handle the default properties of a
-             java.util.Properties class
-o LANG-600:  Javadoc is incorrect for public static int 
-             lastIndexOf(String str, String searchStr).
-o LANG-602:  ContextedRuntimeException no longer an 'unchecked' exception.
-o LANG-606:  EqualsBuilder causes StackOverflowException.
-o LANG-608:  Some StringUtils methods should take an int character instead of
-             char to use String API features.
-o LANG-617:  StringEscapeUtils.escapeXML() can't process UTF-16 supplementary
-             characters
-o LANG-624:  SystemUtils.getJavaVersionAsFloat throws 
-             StringIndexOutOfBoundsException on Android runtime/Dalvik VM
-o LANG-629:  Charset may not be threadsafe, because the HashSet is not synch.
-o LANG-638:  NumberUtils createNumber throws a StringIndexOutOfBoundsException
-             when argument containing "e" and "E" is passed in
-o LANG-643:  Javadoc StringUtils.left() claims to throw on negative len, but
-             doesn't
-o LANG-645:  FastDateFormat.format() outputs incorrect week of year because
-             locale isn't respected
-o LANG-646:  StringEscapeUtils.unescapeJava doesn't handle octal escapes and
-             Unicode with extra u
-o LANG-656:  Example StringUtils.indexOfAnyBut("zzabyycdxx", '') = 0 incorrect
-o LANG-658:  Some Entitys like &Ouml; are not matched properly against its
-             ISO8859-1 representation
-o LANG-659:  EntityArrays typo: {"\u2122", "&minus;"}, // minus sign, U+2212
-             ISOtech
-o LANG-66:   StringEscaper.escapeXml() escapes characters > 0x7f.
-o LANG-662:  org.apache.commons.lang3.math.Fraction does not reduce
-             (Integer.MIN_VALUE, 2^k)
-o LANG-663:  org.apache.commons.lang3.math.Fraction does not always succeed in
-             multiplyBy and divideBy
-o LANG-664:  NumberUtils.isNumber(String) is not right when the String is
-             "1.1L"
-o LANG-672:  Doc bug in DateUtils#ceiling
-o LANG-677:  DateUtils.isSameLocalTime compares using 12 hour clock and not
-             24 hour
-o LANG-685:  EqualsBuilder synchronizes on HashCodeBuilder.
-o LANG-703:  StringUtils.join throws NPE when toString returns null for one of
-             objects in collection
-o LANG-710:  StringIndexOutOfBoundsException when calling unescapeHtml4("&#03")
-o LANG-714:  StringUtils doc/comment spelling fixes.
-o LANG-715:  CharSetUtils.squeeze() speedup.
-o LANG-716:  swapCase and *capitalize speedups.
-
-
-Historical list of changes: http://commons.apache.org/lang/changes-report.html
-
-For complete information on Commons Lang, including instructions on how to
-submit bug reports, patches, or suggestions for improvement, see the 
-Apache Commons Lang website:
-
-http://commons.apache.org/lang/
-
-Have fun!
--Apache Commons Lang team
-
diff --git a/lang/src/site/resources/release-notes/RELEASE-NOTES-3.2.txt b/lang/src/site/resources/release-notes/RELEASE-NOTES-3.2.txt
deleted file mode 100644
index fdce240..0000000
--- a/lang/src/site/resources/release-notes/RELEASE-NOTES-3.2.txt
+++ /dev/null
@@ -1,406 +0,0 @@
-$Id$
-
-   Licensed to the Apache Software Foundation (ASF) under one or more
-   contributor license agreements.  See the NOTICE file distributed with
-   this work for additional information regarding copyright ownership.
-   The ASF licenses this file to You under the Apache License, Version 2.0
-   (the "License"); you may not use this file except in compliance with
-   the License.  You may obtain a copy of the License at
-
-       http://www.apache.org/licenses/LICENSE-2.0
-
-   Unless required by applicable law or agreed to in writing, software
-   distributed under the License is distributed on an "AS IS" BASIS,
-   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-   See the License for the specific language governing permissions and
-   limitations under the License.
-
-
-                           Apache Commons Lang
-                               Version 3.2
-                              Release Notes
-
-
-INTRODUCTION:
-
-This document contains the release notes for the 3.2 version of 
-Apache Commons Lang. Commons Lang is a set of utility functions and reusable 
-components that should be of use in any Java environment. Commons Lang 3.2
-at least requires Java 6.0.
-
-For the advice on upgrading from 2.x to 3.x, see the following page: 
-
-    http://commons.apache.org/lang/article3_0.html
-
-COMPATIBILITY WITH 3.1
-========================
-
-This release introduces backwards incompatible changes in 
-org.apache.commons.lang3.time.FastDateFormat:
-o Method 'protected java.util.List parsePattern()' has been removed
-o Method 'protected java.lang.String parseToken(java.lang.String, int[])' has
-  been removed
-o Method 'protected org.apache.commons.lang3.time.FastDateFormat$NumberRule
-  selectNumberRule(int, int)' has been removed
-
-These changes were the result of [LANG-462]. It is assumed that this change 
-will not break clients as Charles Honton pointed out on 25/Jan/12:
-"
- 1. Methods "FastDateFormat$NumberRule selectNumberRule(int, int)" and 
-    "List<Rule> parsePattern()" couldn't have been overridden because
-    NumberRule and Rule were private to FastDateFormat.
- 2. Due to the factory pattern used, it's unlikely other two methods would have 
-    been overridden.
- 3. The four methods are highly implementation specific. I consider it a 
-    mistake that the methods were exposed.
-"
-For more information see https://issues.apache.org/jira/browse/LANG-462.
-
-NEW FEATURES
-==============
-
-o LANG-934:  Add removeFinalModifier to FieldUtils
-o LANG-863:  Method returns number of inheritance hops between parent and
-             subclass. Thanks to Daneel S. Yaitskov.
-o LANG-774:  Added isStarted, isSuspended and isStopped to StopWatch.
-             Thanks to Erhan Bagdemir.
-o LANG-848:  Added StringUtils.isBlank/isEmpty CharSequence... methods.
-             Thanks to Alexander Muthmann.
-o LANG-926:  Added ArrayUtils.reverse(array, from, to) methods.
-o LANG-795:  StringUtils.toString(byte[], String) deprecated in favour of a new
-             StringUtils.toString(byte[], CharSet). Thanks to Aaron Digulla.
-o LANG-893:  StrSubstitutor now supports default values for variables.
-             Thanks to Woonsan Ko.
-o LANG-913:  Adding .gitignore to commons-lang. Thanks to Allon Mureinik.
-o LANG-837:  Add ObjectUtils.toIdentityString methods that support
-             StringBuilder, StrBuilder, and Appendable.
-o LANG-886:  Added CharSetUtils.containsAny(String, String).
-o LANG-797:  Added escape/unescapeJson to StringEscapeUtils.
-o LANG-875:  Added appendIfMissing and prependIfMissing methods to StringUtils.
-o LANG-870:  Add StringUtils.LF and StringUtils.CR values.
-o LANG-873:  Add FieldUtils getAllFields() to return all the fields defined in
-             the given class and super classes.
-o LANG-835:  StrBuilder should support StringBuilder as an input parameter.
-o LANG-857:  StringIndexOutOfBoundsException in CharSequenceTranslator.
-o LANG-856:  Code refactoring in NumberUtils.
-o LANG-855:  NumberUtils#createBigInteger does not allow for hex and octal
-             numbers.
-o LANG-854:  NumberUtils#createNumber - does not allow for hex numbers to be
-             larger than Long. 
-o LANG-853:  StringUtils join APIs for primitives. 
-o LANG-841:  Add StringUtils API to call String.replaceAll in DOTALL a.k.a.
-             single-line mode. 
-o LANG-825:  Create StrBuilder APIs similar to
-             String.format(String, Object...).
-o LANG-675:  Add Triple class (ternary version of Pair).
-o LANG-462:  FastDateFormat supports parse methods.
-
-BUG FIXES
-===========
-
-o LANG-932:  Spelling fixes. Thanks to Ville Skyttä.
-o LANG-929:  OctalUnescaper tried to parse all of \279.
-o LANG-928:  OctalUnescaper had bugs when parsing octals starting with a zero.
-o LANG-905:  EqualsBuilder returned true when comparing arrays, even when the
-             elements are different.
-o LANG-917:  Fixed exception when combining custom and choice format in
-             ExtendedMessageFormat. Thanks to Arne Burmeister.
-o LANG-902:  RandomStringUtils.random javadoc was incorrectly promising letters
-             and numbers would, as opposed to may, appear  Issue:. Thanks to
-             Andrzej Winnicki.
-o LANG-921:  BooleanUtils.xor(boolean...) produces wrong results.
-o LANG-896:  BooleanUtils.toBoolean(String str) javadoc is not updated. Thanks
-             to Mark Bryan Yu.
-o LANG-879:  LocaleUtils test fails with new Locale "ja_JP_JP_#u-ca-japanese"
-             of JDK7.
-o LANG-836:  StrSubstitutor does not support StringBuilder or CharSequence.
-             Thanks to Arnaud Brunet.
-o LANG-693:  Method createNumber from NumberUtils doesn't work for floating
-             point numbers other than Float  Issue: LANG-693. Thanks to
-             Calvin Echols.
-o LANG-887:  FastDateFormat does not use the locale specific cache correctly.
-o LANG-754:  ClassUtils.getShortName(String) will now only do a reverse lookup
-             for array types.
-o LANG-881:  NumberUtils.createNumber() Javadoc says it does not work for octal
-             numbers.
-o LANG-865:  LocaleUtils.toLocale does not parse strings starting with an
-             underscore.
-o LANG-858:  StringEscapeUtils.escapeJava() and escapeEcmaScript() do not
-             output the escaped surrogate pairs that are Java parsable.
-o LANG-849:  FastDateFormat and FastDatePrinter generates Date objects 
-             wastefully.
-o LANG-845:  Spelling fixes.
-o LANG-844:  Fix examples contained in javadoc of StringUtils.center methods.
-o LANG-832:  FastDateParser does not handle unterminated quotes correctly.
-o LANG-831:  FastDateParser does not handle white-space properly.
-o LANG-830:  FastDateParser could use \Q \E to quote regexes.
-o LANG-828:  FastDateParser does not handle non-Gregorian calendars properly.
-o LANG-826:  FastDateParser does not handle non-ASCII digits correctly.
-o LANG-822:  NumberUtils#createNumber - bad behaviour for leading "--".
-o LANG-818:  FastDateFormat's "z" pattern does not respect timezone of Calendar
-             instances passed to format().
-o LANG-817:  Add org.apache.commons.lang3.SystemUtils.IS_OS_WINDOWS_8.
-o LANG-813:  StringUtils.equalsIgnoreCase doesn't check string reference
-             equality.
-o LANG-810:  StringUtils.join() endIndex, bugged for loop.
-o LANG-807:  RandomStringUtils throws confusing IAE when end <= start.
-o LANG-805:  RandomStringUtils.random(count, 0, 0, false, false, universe,
-             random) always throws java.lang.ArrayIndexOutOfBoundsException.
-o LANG-802:  LocaleUtils - unnecessary recursive call in SyncAvoid class.
-o LANG-800:  Javadoc bug in DateUtils#ceiling for Calendar and Object versions.
-o LANG-788:  SerializationUtils throws ClassNotFoundException when cloning 
-             primitive classes.
-o LANG-786:  StringUtils equals() relies on undefined behavior.
-o LANG-783:  Documentation bug: StringUtils.split.
-o LANG-777:  jar contains velocity template of release notes.
-o LANG-776:  TypeUtilsTest contains incorrect type assignability assertion.
-o LANG-775:  TypeUtils.getTypeArguments() misses type arguments for
-             partially-assigned classes.
-o LANG-773:  ImmutablePair doc contains nonsense text.
-o LANG-772:  ClassUtils.PACKAGE_SEPARATOR Javadoc contains garbage text.
-o LANG-765:  EventListenerSupport.ProxyInvocationHandler no longer defines 
-             serialVersionUID.
-o LANG-764:  StrBuilder is now serializable.
-o LANG-761:  Fix Javadoc Ant warnings.
-o LANG-747:  NumberUtils does not handle Long Hex numbers.
-o LANG-743:  Javadoc bug in static inner class DateIterator.
-
-CHANGES
-=========
-
-o LANG-931:  Misleading Javadoc comment in StrBuilderReader class. Thanks
-             to Christoph Schneegans.
-o LANG-910:  StringUtils.normalizeSpace now handles non-breaking spaces
-             (Unicode 00A0). Thanks to Timur Yarosh.
-o LANG-804:  Redundant check for zero in HashCodeBuilder ctor. Thanks to 
-             Allon Mureinik.
-o LANG-884:  Simplify FastDateFormat; eliminate boxing.
-o LANG-882:  LookupTranslator now works with implementations of CharSequence
-             other than String.
-o LANG-846:  Provide CharSequenceUtils.regionMatches with a proper green
-             implementation instead of inefficiently converting to Strings.
-o LANG-839:  ArrayUtils removeElements methods use unnecessary HashSet.
-o LANG-838:  ArrayUtils removeElements methods clone temporary index arrays
-             unnecessarily.
-o LANG-799:  DateUtils#parseDate uses default locale; add Locale support.
-o LANG-798:  Use generics in SerializationUtils.
-
-CHANGES WITHOUT TICKET
-========================
-
-o Fixed URLs in javadoc to point to new oracle.com pages
-
-
-                        Release Notes for version 3.1
-
-NEW FEATURES
-==============
-
-o LANG-801:  Add Conversion utility to convert between data types on byte level
-o LANG-760:  Add API StringUtils.toString(byte[] intput, String charsetName)
-o LANG-756:  Add APIs ClassUtils.isPrimitiveWrapper(Class<?>) and 
-             isPrimitiveOrWrapper(Class<?>)
-o LANG-695:  SystemUtils.IS_OS_UNIX doesn't recognize FreeBSD as a Unix system
-
-BUG FIXES
-===========
-
-o LANG-749:  Incorrect Bundle-SymbolicName in Manifest
-o LANG-746:  NumberUtils does not handle upper-case hex: 0X and -0X
-o LANG-744:  StringUtils throws java.security.AccessControlException on Google
-             App Engine
-o LANG-741:  Ant build has wrong component.name
-o LANG-698:  Document that the Mutable numbers don't work as expected with
-             String.format
-
-CHANGES
-=========
-
-o LANG-758:  Add an example with whitespace in StringUtils.defaultIfEmpty
-o LANG-752:  Fix createLong() so it behaves like createInteger()
-o LANG-751:  Include the actual type in the Validate.isInstance and
-             isAssignableFrom exception messages
-o LANG-748:  Deprecating chomp(String, String)
-o LANG-736:  CharUtils static final array CHAR_STRING is not needed to compute
-             CHAR_STRING_ARRAY
-
-
-                        Release Notes for version 3.0
-
-ADDITIONS
-===========
-
-o LANG-276:  MutableBigDecimal and MutableBigInteger.
-o LANG-285:  Wish : method unaccent.
-o LANG-358:  ObjectUtils.coalesce.
-o LANG-386:  LeftOf/RightOfNumber in Range convenience methods necessary.
-o LANG-435:  Add ClassUtils.isAssignable() variants with autoboxing.
-o LANG-444:  StringUtils.emptyToNull.
-o LANG-482:  Enhance StrSubstitutor to support nested ${var-${subvr}} expansion
-o LANG-482:  StrSubstitutor now supports substitution in variable names.
-o LANG-496:  A generic implementation of the Lazy initialization pattern.
-o LANG-497:  Addition of ContextedException and ContextedRuntimeException.
-o LANG-498:  Add StringEscapeUtils.escapeText() methods.
-o LANG-499:  Add support for the handling of ExecutionExceptions.
-o LANG-501:  Add support for background initialization.
-o LANG-529:  Add a concurrent package.
-o LANG-533:  Validate: support for validating blank strings.
-o LANG-537:  Add ArrayUtils.toArray to create generic arrays.
-o LANG-545:  Add ability to create a Future for a constant.
-o LANG-546:  Add methods to Validate to check whether the index is valid for
-             the array/list/string.
-o LANG-553:  Add TypeUtils class to provide utility code for working with generic
-             types.
-o LANG-559:  Added isAssignableFrom and isInstanceOf validation methods.
-o LANG-559:  Added validState validation method.
-o LANG-560:  New TimedSemaphore class.
-o LANG-582:  Provide an implementation of the ThreadFactory interface.
-o LANG-588:  Create a basic Pair<L, R> class.
-o LANG-594:  DateUtils equal & compare functions up to most significant field.
-o LANG-601:  Add Builder Interface / Update Builders to Implement It.
-o LANG-609:  Support lazy initialization using atomic variables
-o LANG-610:  Extend exception handling in ConcurrentUtils to runtime exceptions.
-o LANG-614:  StringUtils.endsWithAny method
-o LANG-640:  Add normalizeSpace to StringUtils
-o LANG-644:  Provide documentation about the new concurrent package
-o LANG-649:  BooleanUtils.toBooleanObject to support single character input
-o LANG-651:  Add AnnotationUtils
-o LANG-653:  Provide a very basic ConcurrentInitializer implementation
-o LANG-655:  Add StringUtils.defaultIfBlank()
-o LANG-667:  Add a Null-safe compare() method to ObjectUtils
-o LANG-676:  Documented potential NPE if auto-boxing occurs for some BooleanUtils
-             methods
-o LANG-678:  Add support for ConcurrentMap.putIfAbsent()
-o LANG-692:  Add hashCodeMulti varargs method
-o LANG-697:  Add FormattableUtils class
-o LANG-684:  Levenshtein Distance Within a Given Threshold
-
-REMOVALS
-==========
-
-o LANG-438:  Remove @deprecateds.
-o LANG-492:  Remove code handled now by the JDK.
-o LANG-493:  Remove code that does not hold enough value to remain.
-o LANG-590:  Remove JDK 1.2/1.3 bug handling in 
-             StringUtils.indexOf(String, String, int).
-o LANG-673:  WordUtils.abbreviate() removed
-o LANG-691:  Removed DateUtils.UTC_TIME_ZONE
-
-IMPROVEMENTS
-==============
-
-o LANG-290:  EnumUtils for JDK 5.0.
-o LANG-336:  Finally start using generics.
-o LANG-355:  StrBuilder should implement CharSequence and Appendable.
-o LANG-396:  Investigate for vararg usages.
-o LANG-424:  Improve Javadoc for StringUtils class.
-o LANG-458:  Refactor Validate.java to eliminate code redundancy.
-o LANG-479:  Document where in SVN trunk is.
-o LANG-504:  bring ArrayUtils.isEmpty to the generics world.
-o LANG-505:  Rewrite StringEscapeUtils.
-o LANG-507:  StringEscapeUtils.unescapeJava should support \u+ notation.
-o LANG-510:  Convert StringUtils API to take CharSequence.
-o LANG-513:  Better EnumUtils.
-o LANG-528:  Mutable classes should implement an appropriately typed Mutable
-             interface.
-o LANG-539:  Compile commons.lang for CDC 1.1/Foundation 1.1.
-o LANG-540:  Make NumericEntityEscaper immutable.
-o LANG-541:  Replace StringBuffer with StringBuilder.
-o LANG-548:  Use Iterable on API instead of Collection.
-o LANG-551:  Replace Range classes with generic version.
-o LANG-562:  Change Maven groupId.
-o LANG-563:  Change Java package name.
-o LANG-570:  Do the test cases really still require main() and suite() methods?
-o LANG-579:  Add new Validate methods.
-o LANG-599:  ClassUtils.getClass(): Allow Dots as Inner Class Separators.
-o LANG-605:  DefaultExceptionContext overwrites values in recursive situations.
-o LANG-668:  Change ObjectUtils min() & max() functions to use varargs rather
-             than just two parameters
-o LANG-681:  Push down WordUtils to "text" sub-package.
-o LANG-711:  Add includeantruntime=false to javac targets to quell warnings in
-             ant 1.8.1 and better (and modest performance gain).
-o LANG-713:  Increase test coverage of FieldUtils read methods and tweak
-             javadoc.
-o LANG-718:  build.xml Java 1.5+ updates.
-
-BUG FIXES
-===========
-
-o LANG-11:   Depend on JDK 1.5+.
-o LANG-302:  StrBuilder does not implement clone().
-o LANG-339:  StringEscapeUtils.escapeHtml() escapes multibyte characters like
-             Chinese, Japanese, etc.
-o LANG-369:  ExceptionUtils not thread-safe.
-o LANG-418:  Javadoc incorrect for StringUtils.endsWithIgnoreCase.
-o LANG-428:  StringUtils.isAlpha, isAlphanumeric and isNumeric now return false
-             for ""
-o LANG-439:  StringEscapeUtils.escapeHTML() does not escape chars (0x00-0x20).
-o LANG-448:  Lower Ascii Characters don't get encoded by Entities.java.
-o LANG-468:  JDK 1.5 build/runtime failure on LANG-393 (EqualsBuilder).
-o LANG-474:  Fixes for thread safety.
-o LANG-478:  StopWatch does not resist to system time changes.
-o LANG-480:  StringEscapeUtils.escapeHtml incorrectly converts unicode
-             characters above U+00FFFF into 2 characters.
-o LANG-481:  Possible race-conditions in hashCode of the range classes.
-o LANG-564:  Improve StrLookup API documentation.
-o LANG-568:  @SuppressWarnings("unchecked") is used too generally.
-o LANG-571:  ArrayUtils.add(T[:  array, T element) can create unexpected
-             ClassCastException.
-o LANG-585:  exception.DefaultExceptionContext.getFormattedExceptionMessage
-             catches Throwable.
-o LANG-596:  StrSubstitutor should also handle the default properties of a
-             java.util.Properties class
-o LANG-600:  Javadoc is incorrect for public static int 
-             lastIndexOf(String str, String searchStr).
-o LANG-602:  ContextedRuntimeException no longer an 'unchecked' exception.
-o LANG-606:  EqualsBuilder causes StackOverflowException.
-o LANG-608:  Some StringUtils methods should take an int character instead of
-             char to use String API features.
-o LANG-617:  StringEscapeUtils.escapeXML() can't process UTF-16 supplementary
-             characters
-o LANG-624:  SystemUtils.getJavaVersionAsFloat throws 
-             StringIndexOutOfBoundsException on Android runtime/Dalvik VM
-o LANG-629:  Charset may not be threadsafe, because the HashSet is not synch.
-o LANG-638:  NumberUtils createNumber throws a StringIndexOutOfBoundsException
-             when argument containing "e" and "E" is passed in
-o LANG-643:  Javadoc StringUtils.left() claims to throw on negative len, but
-             doesn't
-o LANG-645:  FastDateFormat.format() outputs incorrect week of year because
-             locale isn't respected
-o LANG-646:  StringEscapeUtils.unescapeJava doesn't handle octal escapes and
-             Unicode with extra u
-o LANG-656:  Example StringUtils.indexOfAnyBut("zzabyycdxx", '') = 0 incorrect
-o LANG-658:  Some Entitys like &Ouml; are not matched properly against its
-             ISO8859-1 representation
-o LANG-659:  EntityArrays typo: {"\u2122", "&minus;"}, // minus sign, U+2212
-             ISOtech
-o LANG-66:   StringEscaper.escapeXml() escapes characters > 0x7f.
-o LANG-662:  org.apache.commons.lang3.math.Fraction does not reduce
-             (Integer.MIN_VALUE, 2^k)
-o LANG-663:  org.apache.commons.lang3.math.Fraction does not always succeed in
-             multiplyBy and divideBy
-o LANG-664:  NumberUtils.isNumber(String) is not right when the String is
-             "1.1L"
-o LANG-672:  Doc bug in DateUtils#ceiling
-o LANG-677:  DateUtils.isSameLocalTime compares using 12 hour clock and not
-             24 hour
-o LANG-685:  EqualsBuilder synchronizes on HashCodeBuilder.
-o LANG-703:  StringUtils.join throws NPE when toString returns null for one of
-             objects in collection
-o LANG-710:  StringIndexOutOfBoundsException when calling unescapeHtml4("&#03")
-o LANG-714:  StringUtils doc/comment spelling fixes.
-o LANG-715:  CharSetUtils.squeeze() speedup.
-o LANG-716:  swapCase and *capitalize speedups.
-
-
-Historical list of changes: http://commons.apache.org/lang/changes-report.html
-
-For complete information on Commons Lang, including instructions on how to
-submit bug reports, patches, or suggestions for improvement, see the 
-Apache Commons Lang website:
-
-http://commons.apache.org/lang/
-
-Have fun!
--Apache Commons Lang team
-
diff --git a/lang/src/site/resources/release-notes/RELEASE-NOTES-3.3.1.txt b/lang/src/site/resources/release-notes/RELEASE-NOTES-3.3.1.txt
deleted file mode 100644
index d14de3a..0000000
--- a/lang/src/site/resources/release-notes/RELEASE-NOTES-3.3.1.txt
+++ /dev/null
@@ -1,479 +0,0 @@
-                           Apache Commons Lang
-                               Version 3.3.1
-                              Release Notes
-
-
-INTRODUCTION:
-
-This document contains the release notes for the 3.3.1 version of 
-Apache Commons Lang. Commons Lang is a set of utility functions and reusable 
-components that should be of use in any Java environment. Commons Lang 3.3.1
-at least requires Java 6.0.
-
-For the advice on upgrading from 2.x to 3.x, see the following page: 
-
-    http://commons.apache.org/lang/article3_0.html
-
-FIXED BUGS
-============
-
-o LANG-987:  DateUtils.getFragmentInDays(Date, Calendar.MONTH) returns wrong
-             days
-o LANG-983:  DurationFormatUtils does not describe format string fully
-o LANG-981:  DurationFormatUtils#lexx does not detect unmatched quote char
-o LANG-984:  DurationFormatUtils does not handle large durations correctly
-o LANG-982:  DurationFormatUtils.formatDuration(61999, "s.SSSS") - ms field
-             size should be 4 digits
-o LANG-978:  Failing tests with Java 8 b128
-
-                        Release Notes for version 3.3
-
-NEW FEATURES
-==============
-
-o LANG-955:  Add methods for removing all invalid characters according to
-             XML 1.0 and XML 1.1 in an input string to StringEscapeUtils.
-             Thanks to Adam Hooper.
-o LANG-970:  Add APIs MutableBoolean setTrue() and setFalse()
-o LANG-962:  Add SerializationUtils.roundtrip(T extends Serializable) to
-             serialize then deserialize
-o LANG-637:  There should be a DifferenceBuilder with a
-             ReflectionDifferenceBuilder implementation
-o LANG-944:  Add the Jaro-Winkler string distance algorithm to StringUtils.
-             Thanks to Rekha Joshi.
-o LANG-417:  New class ClassPathUtils with methods for turning FQN into
-             resource path
-o LANG-834:  Validate: add inclusiveBetween and exclusiveBetween overloads
-             for primitive types
-o LANG-900:  New RandomUtils class. Thanks to Duncan Jones.
-o LANG-966:  Add IBM OS/400 detection
-
-FIXED BUGS
-============
-
-o LANG-621:  ReflectionToStringBuilder.toString does not debug 3rd party object
-             fields within 3rd party object. Thanks to Philip Hodges,
-             Thomas Neidhart.
-o LANG-977:  NumericEntityEscaper incorrectly encodes supplementary characters.
-             Thanks to Chris Karcher.
-o LANG-973:  Make some private fields final
-o LANG-971:  NumberUtils#isNumber(String) fails to reject invalid Octal numbers
-o LANG-972:  NumberUtils#isNumber does not allow for hex 0XABCD
-o LANG-969:  StringUtils.toEncodedString(byte[], Charset) needlessly throws
-             UnsupportedEncodingException. Thanks to Matt Bishop.
-o LANG-946:  ConstantInitializerTest fails when building with IBM JDK 7
-o LANG-954:  uncaught PatternSyntaxException in FastDateFormat on Android.
-             Thanks to Michael Keppler.
-o LANG-936:  StringUtils.getLevenshteinDistance with too big of a threshold
-             returns wrong result. Thanks to Yaniv Kunda, Eli Lindsey.
-o LANG-943:  Test DurationFormatUtilsTest.testEdgeDuration fails in
-             JDK 1.6, 1.7 and 1.8, BRST time zone
-o LANG-613:  ConstructorUtils.getAccessibleConstructor() Does Not Check the
-             Accessibility of Enclosing Classes
-o LANG-951:  Fragments are wrong by 1 day when using fragment YEAR or MONTH.
-             Thanks to Sebastian Götz.
-o LANG-950:  FastDateParser does not handle two digit year parsing like
-             SimpleDateFormat
-o LANG-949:  FastDateParserTest.testParses does not test FastDateParser
-o LANG-915:  Wrong locale handling in LocaleUtils.toLocale().
-             Thanks to Sergio Fernández.
-
-CHANGES
-=========
-
-o LANG-961:  org.apache.commons.lang3.reflect.FieldUtils.removeFinalModifier(Field)
-             does not clean up after itself
-o LANG-958:  FastDateParser javadoc incorrectly states that SimpleDateFormat
-             is used internally
-o LANG-956:  Improve JavaDoc of WordUtils.wrap methods
-o LANG-939:  Move Documentation from user guide to package-info files
-o LANG-953:  Convert package.html files to package-info.java files
-o LANG-940:  Fix deprecation warnings
-o LANG-819:  EnumUtils.generateBitVector needs a "? extends"
-
-                        Release Notes for version 3.2.1
-
-BUG FIXES
-===========
-
-o LANG-937:  Fix missing Hamcrest dependency in Ant Build
-o LANG-941:  Test failure in LocaleUtilsTest when building with JDK 8
-o LANG-942:  Test failure in FastDateParserTest and FastDateFormat_ParserTest
-             when building with JDK8. Thanks to Bruno P. Kinoshita,
-             Henri Yandell.
-o LANG-938:  Build fails with test failures when building with JDK 8 
-
-                        Release Notes for version 3.2
-
-COMPATIBILITY WITH 3.1
-========================
-
-This release introduces backwards incompatible changes in 
-org.apache.commons.lang3.time.FastDateFormat:
-o Method 'protected java.util.List parsePattern()' has been removed
-o Method 'protected java.lang.String parseToken(java.lang.String, int[])' has
-  been removed
-o Method 'protected org.apache.commons.lang3.time.FastDateFormat$NumberRule
-  selectNumberRule(int, int)' has been removed
-
-These changes were the result of [LANG-462]. It is assumed that this change 
-will not break clients as Charles Honton pointed out on 25/Jan/12:
-"
- 1. Methods "FastDateFormat$NumberRule selectNumberRule(int, int)" and 
-    "List<Rule> parsePattern()" couldn't have been overridden because
-    NumberRule and Rule were private to FastDateFormat.
- 2. Due to the factory pattern used, it's unlikely other two methods would have 
-    been overridden.
- 3. The four methods are highly implementation specific. I consider it a 
-    mistake that the methods were exposed.
-"
-For more information see https://issues.apache.org/jira/browse/LANG-462.
-
-NEW FEATURES
-==============
-
-o LANG-934:  Add removeFinalModifier to FieldUtils
-o LANG-863:  Method returns number of inheritance hops between parent and
-             subclass. Thanks to Daneel S. Yaitskov.
-o LANG-774:  Added isStarted, isSuspended and isStopped to StopWatch.
-             Thanks to Erhan Bagdemir.
-o LANG-848:  Added StringUtils.isBlank/isEmpty CharSequence... methods.
-             Thanks to Alexander Muthmann.
-o LANG-926:  Added ArrayUtils.reverse(array, from, to) methods.
-o LANG-795:  StringUtils.toString(byte[], String) deprecated in favour of a new
-             StringUtils.toString(byte[], CharSet). Thanks to Aaron Digulla.
-o LANG-893:  StrSubstitutor now supports default values for variables.
-             Thanks to Woonsan Ko.
-o LANG-913:  Adding .gitignore to commons-lang. Thanks to Allon Mureinik.
-o LANG-837:  Add ObjectUtils.toIdentityString methods that support
-             StringBuilder, StrBuilder, and Appendable.
-o LANG-886:  Added CharSetUtils.containsAny(String, String).
-o LANG-797:  Added escape/unescapeJson to StringEscapeUtils.
-o LANG-875:  Added appendIfMissing and prependIfMissing methods to StringUtils.
-o LANG-870:  Add StringUtils.LF and StringUtils.CR values.
-o LANG-873:  Add FieldUtils getAllFields() to return all the fields defined in
-             the given class and super classes.
-o LANG-835:  StrBuilder should support StringBuilder as an input parameter.
-o LANG-857:  StringIndexOutOfBoundsException in CharSequenceTranslator.
-o LANG-856:  Code refactoring in NumberUtils.
-o LANG-855:  NumberUtils#createBigInteger does not allow for hex and octal
-             numbers.
-o LANG-854:  NumberUtils#createNumber - does not allow for hex numbers to be
-             larger than Long. 
-o LANG-853:  StringUtils join APIs for primitives. 
-o LANG-841:  Add StringUtils API to call String.replaceAll in DOTALL a.k.a.
-             single-line mode. 
-o LANG-825:  Create StrBuilder APIs similar to
-             String.format(String, Object...).
-o LANG-675:  Add Triple class (ternary version of Pair).
-o LANG-462:  FastDateFormat supports parse methods.
-
-BUG FIXES
-===========
-
-o LANG-932:  Spelling fixes. Thanks to Ville Skyttä.
-o LANG-929:  OctalUnescaper tried to parse all of \279.
-o LANG-928:  OctalUnescaper had bugs when parsing octals starting with a zero.
-o LANG-905:  EqualsBuilder returned true when comparing arrays, even when the
-             elements are different.
-o LANG-917:  Fixed exception when combining custom and choice format in
-             ExtendedMessageFormat. Thanks to Arne Burmeister.
-o LANG-902:  RandomStringUtils.random javadoc was incorrectly promising letters
-             and numbers would, as opposed to may, appear  Issue:. Thanks to
-             Andrzej Winnicki.
-o LANG-921:  BooleanUtils.xor(boolean...) produces wrong results.
-o LANG-896:  BooleanUtils.toBoolean(String str) javadoc is not updated. Thanks
-             to Mark Bryan Yu.
-o LANG-879:  LocaleUtils test fails with new Locale "ja_JP_JP_#u-ca-japanese"
-             of JDK7.
-o LANG-836:  StrSubstitutor does not support StringBuilder or CharSequence.
-             Thanks to Arnaud Brunet.
-o LANG-693:  Method createNumber from NumberUtils doesn't work for floating
-             point numbers other than Float  Issue: LANG-693. Thanks to
-             Calvin Echols.
-o LANG-887:  FastDateFormat does not use the locale specific cache correctly.
-o LANG-754:  ClassUtils.getShortName(String) will now only do a reverse lookup
-             for array types.
-o LANG-881:  NumberUtils.createNumber() Javadoc says it does not work for octal
-             numbers.
-o LANG-865:  LocaleUtils.toLocale does not parse strings starting with an
-             underscore.
-o LANG-858:  StringEscapeUtils.escapeJava() and escapeEcmaScript() do not
-             output the escaped surrogate pairs that are Java parsable.
-o LANG-849:  FastDateFormat and FastDatePrinter generates Date objects 
-             wastefully.
-o LANG-845:  Spelling fixes.
-o LANG-844:  Fix examples contained in javadoc of StringUtils.center methods.
-o LANG-832:  FastDateParser does not handle unterminated quotes correctly.
-o LANG-831:  FastDateParser does not handle white-space properly.
-o LANG-830:  FastDateParser could use \Q \E to quote regexes.
-o LANG-828:  FastDateParser does not handle non-Gregorian calendars properly.
-o LANG-826:  FastDateParser does not handle non-ASCII digits correctly.
-o LANG-822:  NumberUtils#createNumber - bad behaviour for leading "--".
-o LANG-818:  FastDateFormat's "z" pattern does not respect timezone of Calendar
-             instances passed to format().
-o LANG-817:  Add org.apache.commons.lang3.SystemUtils.IS_OS_WINDOWS_8.
-o LANG-813:  StringUtils.equalsIgnoreCase doesn't check string reference
-             equality.
-o LANG-810:  StringUtils.join() endIndex, bugged for loop.
-o LANG-807:  RandomStringUtils throws confusing IAE when end <= start.
-o LANG-805:  RandomStringUtils.random(count, 0, 0, false, false, universe,
-             random) always throws java.lang.ArrayIndexOutOfBoundsException.
-o LANG-802:  LocaleUtils - unnecessary recursive call in SyncAvoid class.
-o LANG-800:  Javadoc bug in DateUtils#ceiling for Calendar and Object versions.
-o LANG-788:  SerializationUtils throws ClassNotFoundException when cloning 
-             primitive classes.
-o LANG-786:  StringUtils equals() relies on undefined behavior.
-o LANG-783:  Documentation bug: StringUtils.split.
-o LANG-777:  jar contains velocity template of release notes.
-o LANG-776:  TypeUtilsTest contains incorrect type assignability assertion.
-o LANG-775:  TypeUtils.getTypeArguments() misses type arguments for
-             partially-assigned classes.
-o LANG-773:  ImmutablePair doc contains nonsense text.
-o LANG-772:  ClassUtils.PACKAGE_SEPARATOR Javadoc contains garbage text.
-o LANG-765:  EventListenerSupport.ProxyInvocationHandler no longer defines 
-             serialVersionUID.
-o LANG-764:  StrBuilder is now serializable.
-o LANG-761:  Fix Javadoc Ant warnings.
-o LANG-747:  NumberUtils does not handle Long Hex numbers.
-o LANG-743:  Javadoc bug in static inner class DateIterator.
-
-CHANGES
-=========
-
-o LANG-931:  Misleading Javadoc comment in StrBuilderReader class. Thanks
-             to Christoph Schneegans.
-o LANG-910:  StringUtils.normalizeSpace now handles non-breaking spaces
-             (Unicode 00A0). Thanks to Timur Yarosh.
-o LANG-804:  Redundant check for zero in HashCodeBuilder ctor. Thanks to 
-             Allon Mureinik.
-o LANG-884:  Simplify FastDateFormat; eliminate boxing.
-o LANG-882:  LookupTranslator now works with implementations of CharSequence
-             other than String.
-o LANG-846:  Provide CharSequenceUtils.regionMatches with a proper green
-             implementation instead of inefficiently converting to Strings.
-o LANG-839:  ArrayUtils removeElements methods use unnecessary HashSet.
-o LANG-838:  ArrayUtils removeElements methods clone temporary index arrays
-             unnecessarily.
-o LANG-799:  DateUtils#parseDate uses default locale; add Locale support.
-o LANG-798:  Use generics in SerializationUtils.
-
-CHANGES WITHOUT TICKET
-========================
-
-o Fixed URLs in javadoc to point to new oracle.com pages
-
-
-                        Release Notes for version 3.1
-
-NEW FEATURES
-==============
-
-o LANG-801:  Add Conversion utility to convert between data types on byte level
-o LANG-760:  Add API StringUtils.toString(byte[] intput, String charsetName)
-o LANG-756:  Add APIs ClassUtils.isPrimitiveWrapper(Class<?>) and 
-             isPrimitiveOrWrapper(Class<?>)
-o LANG-695:  SystemUtils.IS_OS_UNIX doesn't recognize FreeBSD as a Unix system
-
-BUG FIXES
-===========
-
-o LANG-749:  Incorrect Bundle-SymbolicName in Manifest
-o LANG-746:  NumberUtils does not handle upper-case hex: 0X and -0X
-o LANG-744:  StringUtils throws java.security.AccessControlException on Google
-             App Engine
-o LANG-741:  Ant build has wrong component.name
-o LANG-698:  Document that the Mutable numbers don't work as expected with
-             String.format
-
-CHANGES
-=========
-
-o LANG-758:  Add an example with whitespace in StringUtils.defaultIfEmpty
-o LANG-752:  Fix createLong() so it behaves like createInteger()
-o LANG-751:  Include the actual type in the Validate.isInstance and
-             isAssignableFrom exception messages
-o LANG-748:  Deprecating chomp(String, String)
-o LANG-736:  CharUtils static final array CHAR_STRING is not needed to compute
-             CHAR_STRING_ARRAY
-
-
-                        Release Notes for version 3.0
-
-ADDITIONS
-===========
-
-o LANG-276:  MutableBigDecimal and MutableBigInteger.
-o LANG-285:  Wish : method unaccent.
-o LANG-358:  ObjectUtils.coalesce.
-o LANG-386:  LeftOf/RightOfNumber in Range convenience methods necessary.
-o LANG-435:  Add ClassUtils.isAssignable() variants with autoboxing.
-o LANG-444:  StringUtils.emptyToNull.
-o LANG-482:  Enhance StrSubstitutor to support nested ${var-${subvr}} expansion
-o LANG-482:  StrSubstitutor now supports substitution in variable names.
-o LANG-496:  A generic implementation of the Lazy initialization pattern.
-o LANG-497:  Addition of ContextedException and ContextedRuntimeException.
-o LANG-498:  Add StringEscapeUtils.escapeText() methods.
-o LANG-499:  Add support for the handling of ExecutionExceptions.
-o LANG-501:  Add support for background initialization.
-o LANG-529:  Add a concurrent package.
-o LANG-533:  Validate: support for validating blank strings.
-o LANG-537:  Add ArrayUtils.toArray to create generic arrays.
-o LANG-545:  Add ability to create a Future for a constant.
-o LANG-546:  Add methods to Validate to check whether the index is valid for
-             the array/list/string.
-o LANG-553:  Add TypeUtils class to provide utility code for working with generic
-             types.
-o LANG-559:  Added isAssignableFrom and isInstanceOf validation methods.
-o LANG-559:  Added validState validation method.
-o LANG-560:  New TimedSemaphore class.
-o LANG-582:  Provide an implementation of the ThreadFactory interface.
-o LANG-588:  Create a basic Pair<L, R> class.
-o LANG-594:  DateUtils equal & compare functions up to most significant field.
-o LANG-601:  Add Builder Interface / Update Builders to Implement It.
-o LANG-609:  Support lazy initialization using atomic variables
-o LANG-610:  Extend exception handling in ConcurrentUtils to runtime exceptions.
-o LANG-614:  StringUtils.endsWithAny method
-o LANG-640:  Add normalizeSpace to StringUtils
-o LANG-644:  Provide documentation about the new concurrent package
-o LANG-649:  BooleanUtils.toBooleanObject to support single character input
-o LANG-651:  Add AnnotationUtils
-o LANG-653:  Provide a very basic ConcurrentInitializer implementation
-o LANG-655:  Add StringUtils.defaultIfBlank()
-o LANG-667:  Add a Null-safe compare() method to ObjectUtils
-o LANG-676:  Documented potential NPE if auto-boxing occurs for some BooleanUtils
-             methods
-o LANG-678:  Add support for ConcurrentMap.putIfAbsent()
-o LANG-692:  Add hashCodeMulti varargs method
-o LANG-697:  Add FormattableUtils class
-o LANG-684:  Levenshtein Distance Within a Given Threshold
-
-REMOVALS
-==========
-
-o LANG-438:  Remove @deprecateds.
-o LANG-492:  Remove code handled now by the JDK.
-o LANG-493:  Remove code that does not hold enough value to remain.
-o LANG-590:  Remove JDK 1.2/1.3 bug handling in 
-             StringUtils.indexOf(String, String, int).
-o LANG-673:  WordUtils.abbreviate() removed
-o LANG-691:  Removed DateUtils.UTC_TIME_ZONE
-
-IMPROVEMENTS
-==============
-
-o LANG-290:  EnumUtils for JDK 5.0.
-o LANG-336:  Finally start using generics.
-o LANG-355:  StrBuilder should implement CharSequence and Appendable.
-o LANG-396:  Investigate for vararg usages.
-o LANG-424:  Improve Javadoc for StringUtils class.
-o LANG-458:  Refactor Validate.java to eliminate code redundancy.
-o LANG-479:  Document where in SVN trunk is.
-o LANG-504:  bring ArrayUtils.isEmpty to the generics world.
-o LANG-505:  Rewrite StringEscapeUtils.
-o LANG-507:  StringEscapeUtils.unescapeJava should support \u+ notation.
-o LANG-510:  Convert StringUtils API to take CharSequence.
-o LANG-513:  Better EnumUtils.
-o LANG-528:  Mutable classes should implement an appropriately typed Mutable
-             interface.
-o LANG-539:  Compile commons.lang for CDC 1.1/Foundation 1.1.
-o LANG-540:  Make NumericEntityEscaper immutable.
-o LANG-541:  Replace StringBuffer with StringBuilder.
-o LANG-548:  Use Iterable on API instead of Collection.
-o LANG-551:  Replace Range classes with generic version.
-o LANG-562:  Change Maven groupId.
-o LANG-563:  Change Java package name.
-o LANG-570:  Do the test cases really still require main() and suite() methods?
-o LANG-579:  Add new Validate methods.
-o LANG-599:  ClassUtils.getClass(): Allow Dots as Inner Class Separators.
-o LANG-605:  DefaultExceptionContext overwrites values in recursive situations.
-o LANG-668:  Change ObjectUtils min() & max() functions to use varargs rather
-             than just two parameters
-o LANG-681:  Push down WordUtils to "text" sub-package.
-o LANG-711:  Add includeantruntime=false to javac targets to quell warnings in
-             ant 1.8.1 and better (and modest performance gain).
-o LANG-713:  Increase test coverage of FieldUtils read methods and tweak
-             javadoc.
-o LANG-718:  build.xml Java 1.5+ updates.
-
-BUG FIXES
-===========
-
-o LANG-11:   Depend on JDK 1.5+.
-o LANG-302:  StrBuilder does not implement clone().
-o LANG-339:  StringEscapeUtils.escapeHtml() escapes multibyte characters like
-             Chinese, Japanese, etc.
-o LANG-369:  ExceptionUtils not thread-safe.
-o LANG-418:  Javadoc incorrect for StringUtils.endsWithIgnoreCase.
-o LANG-428:  StringUtils.isAlpha, isAlphanumeric and isNumeric now return false
-             for ""
-o LANG-439:  StringEscapeUtils.escapeHTML() does not escape chars (0x00-0x20).
-o LANG-448:  Lower Ascii Characters don't get encoded by Entities.java.
-o LANG-468:  JDK 1.5 build/runtime failure on LANG-393 (EqualsBuilder).
-o LANG-474:  Fixes for thread safety.
-o LANG-478:  StopWatch does not resist to system time changes.
-o LANG-480:  StringEscapeUtils.escapeHtml incorrectly converts unicode
-             characters above U+00FFFF into 2 characters.
-o LANG-481:  Possible race-conditions in hashCode of the range classes.
-o LANG-564:  Improve StrLookup API documentation.
-o LANG-568:  @SuppressWarnings("unchecked") is used too generally.
-o LANG-571:  ArrayUtils.add(T[:  array, T element) can create unexpected
-             ClassCastException.
-o LANG-585:  exception.DefaultExceptionContext.getFormattedExceptionMessage
-             catches Throwable.
-o LANG-596:  StrSubstitutor should also handle the default properties of a
-             java.util.Properties class
-o LANG-600:  Javadoc is incorrect for public static int 
-             lastIndexOf(String str, String searchStr).
-o LANG-602:  ContextedRuntimeException no longer an 'unchecked' exception.
-o LANG-606:  EqualsBuilder causes StackOverflowException.
-o LANG-608:  Some StringUtils methods should take an int character instead of
-             char to use String API features.
-o LANG-617:  StringEscapeUtils.escapeXML() can't process UTF-16 supplementary
-             characters
-o LANG-624:  SystemUtils.getJavaVersionAsFloat throws 
-             StringIndexOutOfBoundsException on Android runtime/Dalvik VM
-o LANG-629:  Charset may not be threadsafe, because the HashSet is not synch.
-o LANG-638:  NumberUtils createNumber throws a StringIndexOutOfBoundsException
-             when argument containing "e" and "E" is passed in
-o LANG-643:  Javadoc StringUtils.left() claims to throw on negative len, but
-             doesn't
-o LANG-645:  FastDateFormat.format() outputs incorrect week of year because
-             locale isn't respected
-o LANG-646:  StringEscapeUtils.unescapeJava doesn't handle octal escapes and
-             Unicode with extra u
-o LANG-656:  Example StringUtils.indexOfAnyBut("zzabyycdxx", '') = 0 incorrect
-o LANG-658:  Some Entitys like &Ouml; are not matched properly against its
-             ISO8859-1 representation
-o LANG-659:  EntityArrays typo: {"\u2122", "&minus;"}, // minus sign, U+2212
-             ISOtech
-o LANG-66:   StringEscaper.escapeXml() escapes characters > 0x7f.
-o LANG-662:  org.apache.commons.lang3.math.Fraction does not reduce
-             (Integer.MIN_VALUE, 2^k)
-o LANG-663:  org.apache.commons.lang3.math.Fraction does not always succeed in
-             multiplyBy and divideBy
-o LANG-664:  NumberUtils.isNumber(String) is not right when the String is
-             "1.1L"
-o LANG-672:  Doc bug in DateUtils#ceiling
-o LANG-677:  DateUtils.isSameLocalTime compares using 12 hour clock and not
-             24 hour
-o LANG-685:  EqualsBuilder synchronizes on HashCodeBuilder.
-o LANG-703:  StringUtils.join throws NPE when toString returns null for one of
-             objects in collection
-o LANG-710:  StringIndexOutOfBoundsException when calling unescapeHtml4("&#03")
-o LANG-714:  StringUtils doc/comment spelling fixes.
-o LANG-715:  CharSetUtils.squeeze() speedup.
-o LANG-716:  swapCase and *capitalize speedups.
-
-
-Historical list of changes: http://commons.apache.org/lang/changes-report.html
-
-For complete information on Commons Lang, including instructions on how to
-submit bug reports, patches, or suggestions for improvement, see the 
-Apache Commons Lang website:
-
-http://commons.apache.org/lang/
-
-Have fun!
--Apache Commons Lang team
-
diff --git a/lang/src/site/resources/release-notes/RELEASE-NOTES-3.3.2.txt b/lang/src/site/resources/release-notes/RELEASE-NOTES-3.3.2.txt
deleted file mode 100644
index a0923ed..0000000
--- a/lang/src/site/resources/release-notes/RELEASE-NOTES-3.3.2.txt
+++ /dev/null
@@ -1,492 +0,0 @@
-                           Apache Commons Lang
-                               Version 3.3.2
-                              Release Notes
-
-
-INTRODUCTION:
-
-This document contains the release notes for the 3.3.2 version of
-Apache Commons Lang. Commons Lang is a set of utility functions and reusable 
-components that should be of use in any Java environment. Commons Lang 3.3.2
-at least requires Java 6.0.
-
-For the advice on upgrading from 2.x to 3.x, see the following page: 
-
-    http://commons.apache.org/lang/article3_0.html
-
-
-NEW FEATURES
-==============
-
-o LANG-989:  Add org.apache.commons.lang3.SystemUtils.IS_JAVA_1_8
-
-FIXED BUGS
-============
-
-o LANG-992:  NumberUtils#isNumber() returns false for "0.0", "0.4790", et al
-
-                        Release Notes for version 3.3.1
-
-FIXED BUGS
-============
-
-o LANG-987:  DateUtils.getFragmentInDays(Date, Calendar.MONTH) returns wrong
-             days
-o LANG-983:  DurationFormatUtils does not describe format string fully
-o LANG-981:  DurationFormatUtils#lexx does not detect unmatched quote char
-o LANG-984:  DurationFormatUtils does not handle large durations correctly
-o LANG-982:  DurationFormatUtils.formatDuration(61999, "s.SSSS") - ms field
-             size should be 4 digits
-o LANG-978:  Failing tests with Java 8 b128
-
-                        Release Notes for version 3.3
-
-NEW FEATURES
-==============
-
-o LANG-955:  Add methods for removing all invalid characters according to
-             XML 1.0 and XML 1.1 in an input string to StringEscapeUtils.
-             Thanks to Adam Hooper.
-o LANG-970:  Add APIs MutableBoolean setTrue() and setFalse()
-o LANG-962:  Add SerializationUtils.roundtrip(T extends Serializable) to
-             serialize then deserialize
-o LANG-637:  There should be a DifferenceBuilder with a
-             ReflectionDifferenceBuilder implementation
-o LANG-944:  Add the Jaro-Winkler string distance algorithm to StringUtils.
-             Thanks to Rekha Joshi.
-o LANG-417:  New class ClassPathUtils with methods for turning FQN into
-             resource path
-o LANG-834:  Validate: add inclusiveBetween and exclusiveBetween overloads
-             for primitive types
-o LANG-900:  New RandomUtils class. Thanks to Duncan Jones.
-o LANG-966:  Add IBM OS/400 detection
-
-FIXED BUGS
-============
-
-o LANG-621:  ReflectionToStringBuilder.toString does not debug 3rd party object
-             fields within 3rd party object. Thanks to Philip Hodges,
-             Thomas Neidhart.
-o LANG-977:  NumericEntityEscaper incorrectly encodes supplementary characters.
-             Thanks to Chris Karcher.
-o LANG-973:  Make some private fields final
-o LANG-971:  NumberUtils#isNumber(String) fails to reject invalid Octal numbers
-o LANG-972:  NumberUtils#isNumber does not allow for hex 0XABCD
-o LANG-969:  StringUtils.toEncodedString(byte[], Charset) needlessly throws
-             UnsupportedEncodingException. Thanks to Matt Bishop.
-o LANG-946:  ConstantInitializerTest fails when building with IBM JDK 7
-o LANG-954:  uncaught PatternSyntaxException in FastDateFormat on Android.
-             Thanks to Michael Keppler.
-o LANG-936:  StringUtils.getLevenshteinDistance with too big of a threshold
-             returns wrong result. Thanks to Yaniv Kunda, Eli Lindsey.
-o LANG-943:  Test DurationFormatUtilsTest.testEdgeDuration fails in
-             JDK 1.6, 1.7 and 1.8, BRST time zone
-o LANG-613:  ConstructorUtils.getAccessibleConstructor() Does Not Check the
-             Accessibility of Enclosing Classes
-o LANG-951:  Fragments are wrong by 1 day when using fragment YEAR or MONTH.
-             Thanks to Sebastian Götz.
-o LANG-950:  FastDateParser does not handle two digit year parsing like
-             SimpleDateFormat
-o LANG-949:  FastDateParserTest.testParses does not test FastDateParser
-o LANG-915:  Wrong locale handling in LocaleUtils.toLocale().
-             Thanks to Sergio Fernández.
-
-CHANGES
-=========
-
-o LANG-961:  org.apache.commons.lang3.reflect.FieldUtils.removeFinalModifier(Field)
-             does not clean up after itself
-o LANG-958:  FastDateParser javadoc incorrectly states that SimpleDateFormat
-             is used internally
-o LANG-956:  Improve JavaDoc of WordUtils.wrap methods
-o LANG-939:  Move Documentation from user guide to package-info files
-o LANG-953:  Convert package.html files to package-info.java files
-o LANG-940:  Fix deprecation warnings
-o LANG-819:  EnumUtils.generateBitVector needs a "? extends"
-
-                        Release Notes for version 3.2.1
-
-BUG FIXES
-===========
-
-o LANG-937:  Fix missing Hamcrest dependency in Ant Build
-o LANG-941:  Test failure in LocaleUtilsTest when building with JDK 8
-o LANG-942:  Test failure in FastDateParserTest and FastDateFormat_ParserTest
-             when building with JDK8. Thanks to Bruno P. Kinoshita,
-             Henri Yandell.
-o LANG-938:  Build fails with test failures when building with JDK 8 
-
-                        Release Notes for version 3.2
-
-COMPATIBILITY WITH 3.1
-========================
-
-This release introduces backwards incompatible changes in 
-org.apache.commons.lang3.time.FastDateFormat:
-o Method 'protected java.util.List parsePattern()' has been removed
-o Method 'protected java.lang.String parseToken(java.lang.String, int[])' has
-  been removed
-o Method 'protected org.apache.commons.lang3.time.FastDateFormat$NumberRule
-  selectNumberRule(int, int)' has been removed
-
-These changes were the result of [LANG-462]. It is assumed that this change 
-will not break clients as Charles Honton pointed out on 25/Jan/12:
-"
- 1. Methods "FastDateFormat$NumberRule selectNumberRule(int, int)" and 
-    "List<Rule> parsePattern()" couldn't have been overridden because
-    NumberRule and Rule were private to FastDateFormat.
- 2. Due to the factory pattern used, it's unlikely other two methods would have 
-    been overridden.
- 3. The four methods are highly implementation specific. I consider it a 
-    mistake that the methods were exposed.
-"
-For more information see https://issues.apache.org/jira/browse/LANG-462.
-
-NEW FEATURES
-==============
-
-o LANG-934:  Add removeFinalModifier to FieldUtils
-o LANG-863:  Method returns number of inheritance hops between parent and
-             subclass. Thanks to Daneel S. Yaitskov.
-o LANG-774:  Added isStarted, isSuspended and isStopped to StopWatch.
-             Thanks to Erhan Bagdemir.
-o LANG-848:  Added StringUtils.isBlank/isEmpty CharSequence... methods.
-             Thanks to Alexander Muthmann.
-o LANG-926:  Added ArrayUtils.reverse(array, from, to) methods.
-o LANG-795:  StringUtils.toString(byte[], String) deprecated in favour of a new
-             StringUtils.toString(byte[], CharSet). Thanks to Aaron Digulla.
-o LANG-893:  StrSubstitutor now supports default values for variables.
-             Thanks to Woonsan Ko.
-o LANG-913:  Adding .gitignore to commons-lang. Thanks to Allon Mureinik.
-o LANG-837:  Add ObjectUtils.toIdentityString methods that support
-             StringBuilder, StrBuilder, and Appendable.
-o LANG-886:  Added CharSetUtils.containsAny(String, String).
-o LANG-797:  Added escape/unescapeJson to StringEscapeUtils.
-o LANG-875:  Added appendIfMissing and prependIfMissing methods to StringUtils.
-o LANG-870:  Add StringUtils.LF and StringUtils.CR values.
-o LANG-873:  Add FieldUtils getAllFields() to return all the fields defined in
-             the given class and super classes.
-o LANG-835:  StrBuilder should support StringBuilder as an input parameter.
-o LANG-857:  StringIndexOutOfBoundsException in CharSequenceTranslator.
-o LANG-856:  Code refactoring in NumberUtils.
-o LANG-855:  NumberUtils#createBigInteger does not allow for hex and octal
-             numbers.
-o LANG-854:  NumberUtils#createNumber - does not allow for hex numbers to be
-             larger than Long. 
-o LANG-853:  StringUtils join APIs for primitives. 
-o LANG-841:  Add StringUtils API to call String.replaceAll in DOTALL a.k.a.
-             single-line mode. 
-o LANG-825:  Create StrBuilder APIs similar to
-             String.format(String, Object...).
-o LANG-675:  Add Triple class (ternary version of Pair).
-o LANG-462:  FastDateFormat supports parse methods.
-
-BUG FIXES
-===========
-
-o LANG-932:  Spelling fixes. Thanks to Ville Skyttä.
-o LANG-929:  OctalUnescaper tried to parse all of \279.
-o LANG-928:  OctalUnescaper had bugs when parsing octals starting with a zero.
-o LANG-905:  EqualsBuilder returned true when comparing arrays, even when the
-             elements are different.
-o LANG-917:  Fixed exception when combining custom and choice format in
-             ExtendedMessageFormat. Thanks to Arne Burmeister.
-o LANG-902:  RandomStringUtils.random javadoc was incorrectly promising letters
-             and numbers would, as opposed to may, appear  Issue:. Thanks to
-             Andrzej Winnicki.
-o LANG-921:  BooleanUtils.xor(boolean...) produces wrong results.
-o LANG-896:  BooleanUtils.toBoolean(String str) javadoc is not updated. Thanks
-             to Mark Bryan Yu.
-o LANG-879:  LocaleUtils test fails with new Locale "ja_JP_JP_#u-ca-japanese"
-             of JDK7.
-o LANG-836:  StrSubstitutor does not support StringBuilder or CharSequence.
-             Thanks to Arnaud Brunet.
-o LANG-693:  Method createNumber from NumberUtils doesn't work for floating
-             point numbers other than Float  Issue: LANG-693. Thanks to
-             Calvin Echols.
-o LANG-887:  FastDateFormat does not use the locale specific cache correctly.
-o LANG-754:  ClassUtils.getShortName(String) will now only do a reverse lookup
-             for array types.
-o LANG-881:  NumberUtils.createNumber() Javadoc says it does not work for octal
-             numbers.
-o LANG-865:  LocaleUtils.toLocale does not parse strings starting with an
-             underscore.
-o LANG-858:  StringEscapeUtils.escapeJava() and escapeEcmaScript() do not
-             output the escaped surrogate pairs that are Java parsable.
-o LANG-849:  FastDateFormat and FastDatePrinter generates Date objects 
-             wastefully.
-o LANG-845:  Spelling fixes.
-o LANG-844:  Fix examples contained in javadoc of StringUtils.center methods.
-o LANG-832:  FastDateParser does not handle unterminated quotes correctly.
-o LANG-831:  FastDateParser does not handle white-space properly.
-o LANG-830:  FastDateParser could use \Q \E to quote regexes.
-o LANG-828:  FastDateParser does not handle non-Gregorian calendars properly.
-o LANG-826:  FastDateParser does not handle non-ASCII digits correctly.
-o LANG-822:  NumberUtils#createNumber - bad behaviour for leading "--".
-o LANG-818:  FastDateFormat's "z" pattern does not respect timezone of Calendar
-             instances passed to format().
-o LANG-817:  Add org.apache.commons.lang3.SystemUtils.IS_OS_WINDOWS_8.
-o LANG-813:  StringUtils.equalsIgnoreCase doesn't check string reference
-             equality.
-o LANG-810:  StringUtils.join() endIndex, bugged for loop.
-o LANG-807:  RandomStringUtils throws confusing IAE when end <= start.
-o LANG-805:  RandomStringUtils.random(count, 0, 0, false, false, universe,
-             random) always throws java.lang.ArrayIndexOutOfBoundsException.
-o LANG-802:  LocaleUtils - unnecessary recursive call in SyncAvoid class.
-o LANG-800:  Javadoc bug in DateUtils#ceiling for Calendar and Object versions.
-o LANG-788:  SerializationUtils throws ClassNotFoundException when cloning 
-             primitive classes.
-o LANG-786:  StringUtils equals() relies on undefined behavior.
-o LANG-783:  Documentation bug: StringUtils.split.
-o LANG-777:  jar contains velocity template of release notes.
-o LANG-776:  TypeUtilsTest contains incorrect type assignability assertion.
-o LANG-775:  TypeUtils.getTypeArguments() misses type arguments for
-             partially-assigned classes.
-o LANG-773:  ImmutablePair doc contains nonsense text.
-o LANG-772:  ClassUtils.PACKAGE_SEPARATOR Javadoc contains garbage text.
-o LANG-765:  EventListenerSupport.ProxyInvocationHandler no longer defines 
-             serialVersionUID.
-o LANG-764:  StrBuilder is now serializable.
-o LANG-761:  Fix Javadoc Ant warnings.
-o LANG-747:  NumberUtils does not handle Long Hex numbers.
-o LANG-743:  Javadoc bug in static inner class DateIterator.
-
-CHANGES
-=========
-
-o LANG-931:  Misleading Javadoc comment in StrBuilderReader class. Thanks
-             to Christoph Schneegans.
-o LANG-910:  StringUtils.normalizeSpace now handles non-breaking spaces
-             (Unicode 00A0). Thanks to Timur Yarosh.
-o LANG-804:  Redundant check for zero in HashCodeBuilder ctor. Thanks to 
-             Allon Mureinik.
-o LANG-884:  Simplify FastDateFormat; eliminate boxing.
-o LANG-882:  LookupTranslator now works with implementations of CharSequence
-             other than String.
-o LANG-846:  Provide CharSequenceUtils.regionMatches with a proper green
-             implementation instead of inefficiently converting to Strings.
-o LANG-839:  ArrayUtils removeElements methods use unnecessary HashSet.
-o LANG-838:  ArrayUtils removeElements methods clone temporary index arrays
-             unnecessarily.
-o LANG-799:  DateUtils#parseDate uses default locale; add Locale support.
-o LANG-798:  Use generics in SerializationUtils.
-
-CHANGES WITHOUT TICKET
-========================
-
-o Fixed URLs in javadoc to point to new oracle.com pages
-
-
-                        Release Notes for version 3.1
-
-NEW FEATURES
-==============
-
-o LANG-801:  Add Conversion utility to convert between data types on byte level
-o LANG-760:  Add API StringUtils.toString(byte[] intput, String charsetName)
-o LANG-756:  Add APIs ClassUtils.isPrimitiveWrapper(Class<?>) and 
-             isPrimitiveOrWrapper(Class<?>)
-o LANG-695:  SystemUtils.IS_OS_UNIX doesn't recognize FreeBSD as a Unix system
-
-BUG FIXES
-===========
-
-o LANG-749:  Incorrect Bundle-SymbolicName in Manifest
-o LANG-746:  NumberUtils does not handle upper-case hex: 0X and -0X
-o LANG-744:  StringUtils throws java.security.AccessControlException on Google
-             App Engine
-o LANG-741:  Ant build has wrong component.name
-o LANG-698:  Document that the Mutable numbers don't work as expected with
-             String.format
-
-CHANGES
-=========
-
-o LANG-758:  Add an example with whitespace in StringUtils.defaultIfEmpty
-o LANG-752:  Fix createLong() so it behaves like createInteger()
-o LANG-751:  Include the actual type in the Validate.isInstance and
-             isAssignableFrom exception messages
-o LANG-748:  Deprecating chomp(String, String)
-o LANG-736:  CharUtils static final array CHAR_STRING is not needed to compute
-             CHAR_STRING_ARRAY
-
-
-                        Release Notes for version 3.0
-
-ADDITIONS
-===========
-
-o LANG-276:  MutableBigDecimal and MutableBigInteger.
-o LANG-285:  Wish : method unaccent.
-o LANG-358:  ObjectUtils.coalesce.
-o LANG-386:  LeftOf/RightOfNumber in Range convenience methods necessary.
-o LANG-435:  Add ClassUtils.isAssignable() variants with autoboxing.
-o LANG-444:  StringUtils.emptyToNull.
-o LANG-482:  Enhance StrSubstitutor to support nested ${var-${subvr}} expansion
-o LANG-482:  StrSubstitutor now supports substitution in variable names.
-o LANG-496:  A generic implementation of the Lazy initialization pattern.
-o LANG-497:  Addition of ContextedException and ContextedRuntimeException.
-o LANG-498:  Add StringEscapeUtils.escapeText() methods.
-o LANG-499:  Add support for the handling of ExecutionExceptions.
-o LANG-501:  Add support for background initialization.
-o LANG-529:  Add a concurrent package.
-o LANG-533:  Validate: support for validating blank strings.
-o LANG-537:  Add ArrayUtils.toArray to create generic arrays.
-o LANG-545:  Add ability to create a Future for a constant.
-o LANG-546:  Add methods to Validate to check whether the index is valid for
-             the array/list/string.
-o LANG-553:  Add TypeUtils class to provide utility code for working with generic
-             types.
-o LANG-559:  Added isAssignableFrom and isInstanceOf validation methods.
-o LANG-559:  Added validState validation method.
-o LANG-560:  New TimedSemaphore class.
-o LANG-582:  Provide an implementation of the ThreadFactory interface.
-o LANG-588:  Create a basic Pair<L, R> class.
-o LANG-594:  DateUtils equal & compare functions up to most significant field.
-o LANG-601:  Add Builder Interface / Update Builders to Implement It.
-o LANG-609:  Support lazy initialization using atomic variables
-o LANG-610:  Extend exception handling in ConcurrentUtils to runtime exceptions.
-o LANG-614:  StringUtils.endsWithAny method
-o LANG-640:  Add normalizeSpace to StringUtils
-o LANG-644:  Provide documentation about the new concurrent package
-o LANG-649:  BooleanUtils.toBooleanObject to support single character input
-o LANG-651:  Add AnnotationUtils
-o LANG-653:  Provide a very basic ConcurrentInitializer implementation
-o LANG-655:  Add StringUtils.defaultIfBlank()
-o LANG-667:  Add a Null-safe compare() method to ObjectUtils
-o LANG-676:  Documented potential NPE if auto-boxing occurs for some BooleanUtils
-             methods
-o LANG-678:  Add support for ConcurrentMap.putIfAbsent()
-o LANG-692:  Add hashCodeMulti varargs method
-o LANG-697:  Add FormattableUtils class
-o LANG-684:  Levenshtein Distance Within a Given Threshold
-
-REMOVALS
-==========
-
-o LANG-438:  Remove @deprecateds.
-o LANG-492:  Remove code handled now by the JDK.
-o LANG-493:  Remove code that does not hold enough value to remain.
-o LANG-590:  Remove JDK 1.2/1.3 bug handling in 
-             StringUtils.indexOf(String, String, int).
-o LANG-673:  WordUtils.abbreviate() removed
-o LANG-691:  Removed DateUtils.UTC_TIME_ZONE
-
-IMPROVEMENTS
-==============
-
-o LANG-290:  EnumUtils for JDK 5.0.
-o LANG-336:  Finally start using generics.
-o LANG-355:  StrBuilder should implement CharSequence and Appendable.
-o LANG-396:  Investigate for vararg usages.
-o LANG-424:  Improve Javadoc for StringUtils class.
-o LANG-458:  Refactor Validate.java to eliminate code redundancy.
-o LANG-479:  Document where in SVN trunk is.
-o LANG-504:  bring ArrayUtils.isEmpty to the generics world.
-o LANG-505:  Rewrite StringEscapeUtils.
-o LANG-507:  StringEscapeUtils.unescapeJava should support \u+ notation.
-o LANG-510:  Convert StringUtils API to take CharSequence.
-o LANG-513:  Better EnumUtils.
-o LANG-528:  Mutable classes should implement an appropriately typed Mutable
-             interface.
-o LANG-539:  Compile commons.lang for CDC 1.1/Foundation 1.1.
-o LANG-540:  Make NumericEntityEscaper immutable.
-o LANG-541:  Replace StringBuffer with StringBuilder.
-o LANG-548:  Use Iterable on API instead of Collection.
-o LANG-551:  Replace Range classes with generic version.
-o LANG-562:  Change Maven groupId.
-o LANG-563:  Change Java package name.
-o LANG-570:  Do the test cases really still require main() and suite() methods?
-o LANG-579:  Add new Validate methods.
-o LANG-599:  ClassUtils.getClass(): Allow Dots as Inner Class Separators.
-o LANG-605:  DefaultExceptionContext overwrites values in recursive situations.
-o LANG-668:  Change ObjectUtils min() & max() functions to use varargs rather
-             than just two parameters
-o LANG-681:  Push down WordUtils to "text" sub-package.
-o LANG-711:  Add includeantruntime=false to javac targets to quell warnings in
-             ant 1.8.1 and better (and modest performance gain).
-o LANG-713:  Increase test coverage of FieldUtils read methods and tweak
-             javadoc.
-o LANG-718:  build.xml Java 1.5+ updates.
-
-BUG FIXES
-===========
-
-o LANG-11:   Depend on JDK 1.5+.
-o LANG-302:  StrBuilder does not implement clone().
-o LANG-339:  StringEscapeUtils.escapeHtml() escapes multibyte characters like
-             Chinese, Japanese, etc.
-o LANG-369:  ExceptionUtils not thread-safe.
-o LANG-418:  Javadoc incorrect for StringUtils.endsWithIgnoreCase.
-o LANG-428:  StringUtils.isAlpha, isAlphanumeric and isNumeric now return false
-             for ""
-o LANG-439:  StringEscapeUtils.escapeHTML() does not escape chars (0x00-0x20).
-o LANG-448:  Lower Ascii Characters don't get encoded by Entities.java.
-o LANG-468:  JDK 1.5 build/runtime failure on LANG-393 (EqualsBuilder).
-o LANG-474:  Fixes for thread safety.
-o LANG-478:  StopWatch does not resist to system time changes.
-o LANG-480:  StringEscapeUtils.escapeHtml incorrectly converts unicode
-             characters above U+00FFFF into 2 characters.
-o LANG-481:  Possible race-conditions in hashCode of the range classes.
-o LANG-564:  Improve StrLookup API documentation.
-o LANG-568:  @SuppressWarnings("unchecked") is used too generally.
-o LANG-571:  ArrayUtils.add(T[:  array, T element) can create unexpected
-             ClassCastException.
-o LANG-585:  exception.DefaultExceptionContext.getFormattedExceptionMessage
-             catches Throwable.
-o LANG-596:  StrSubstitutor should also handle the default properties of a
-             java.util.Properties class
-o LANG-600:  Javadoc is incorrect for public static int 
-             lastIndexOf(String str, String searchStr).
-o LANG-602:  ContextedRuntimeException no longer an 'unchecked' exception.
-o LANG-606:  EqualsBuilder causes StackOverflowException.
-o LANG-608:  Some StringUtils methods should take an int character instead of
-             char to use String API features.
-o LANG-617:  StringEscapeUtils.escapeXML() can't process UTF-16 supplementary
-             characters
-o LANG-624:  SystemUtils.getJavaVersionAsFloat throws 
-             StringIndexOutOfBoundsException on Android runtime/Dalvik VM
-o LANG-629:  Charset may not be threadsafe, because the HashSet is not synch.
-o LANG-638:  NumberUtils createNumber throws a StringIndexOutOfBoundsException
-             when argument containing "e" and "E" is passed in
-o LANG-643:  Javadoc StringUtils.left() claims to throw on negative len, but
-             doesn't
-o LANG-645:  FastDateFormat.format() outputs incorrect week of year because
-             locale isn't respected
-o LANG-646:  StringEscapeUtils.unescapeJava doesn't handle octal escapes and
-             Unicode with extra u
-o LANG-656:  Example StringUtils.indexOfAnyBut("zzabyycdxx", '') = 0 incorrect
-o LANG-658:  Some Entitys like &Ouml; are not matched properly against its
-             ISO8859-1 representation
-o LANG-659:  EntityArrays typo: {"\u2122", "&minus;"}, // minus sign, U+2212
-             ISOtech
-o LANG-66:   StringEscaper.escapeXml() escapes characters > 0x7f.
-o LANG-662:  org.apache.commons.lang3.math.Fraction does not reduce
-             (Integer.MIN_VALUE, 2^k)
-o LANG-663:  org.apache.commons.lang3.math.Fraction does not always succeed in
-             multiplyBy and divideBy
-o LANG-664:  NumberUtils.isNumber(String) is not right when the String is
-             "1.1L"
-o LANG-672:  Doc bug in DateUtils#ceiling
-o LANG-677:  DateUtils.isSameLocalTime compares using 12 hour clock and not
-             24 hour
-o LANG-685:  EqualsBuilder synchronizes on HashCodeBuilder.
-o LANG-703:  StringUtils.join throws NPE when toString returns null for one of
-             objects in collection
-o LANG-710:  StringIndexOutOfBoundsException when calling unescapeHtml4("&#03")
-o LANG-714:  StringUtils doc/comment spelling fixes.
-o LANG-715:  CharSetUtils.squeeze() speedup.
-o LANG-716:  swapCase and *capitalize speedups.
-
-
-Historical list of changes: http://commons.apache.org/lang/changes-report.html
-
-For complete information on Commons Lang, including instructions on how to
-submit bug reports, patches, or suggestions for improvement, see the 
-Apache Commons Lang website:
-
-http://commons.apache.org/lang/
-
-Have fun!
--Apache Commons Lang team
-
diff --git a/lang/src/site/resources/release-notes/RELEASE-NOTES-3.3.txt b/lang/src/site/resources/release-notes/RELEASE-NOTES-3.3.txt
deleted file mode 100644
index 1e069eb..0000000
--- a/lang/src/site/resources/release-notes/RELEASE-NOTES-3.3.txt
+++ /dev/null
@@ -1,483 +0,0 @@
-$Id$
-
-   Licensed to the Apache Software Foundation (ASF) under one or more
-   contributor license agreements.  See the NOTICE file distributed with
-   this work for additional information regarding copyright ownership.
-   The ASF licenses this file to You under the Apache License, Version 2.0
-   (the "License"); you may not use this file except in compliance with
-   the License.  You may obtain a copy of the License at
-
-       http://www.apache.org/licenses/LICENSE-2.0
-
-   Unless required by applicable law or agreed to in writing, software
-   distributed under the License is distributed on an "AS IS" BASIS,
-   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-   See the License for the specific language governing permissions and
-   limitations under the License.
-
-
-                           Apache Commons Lang
-                               Version 3.3
-                              Release Notes
-
-
-INTRODUCTION:
-
-This document contains the release notes for the 3.3 version of 
-Apache Commons Lang. Commons Lang is a set of utility functions and reusable 
-components that should be of use in any Java environment. Commons Lang 3.3
-at least requires Java 6.0.
-
-For the advice on upgrading from 2.x to 3.x, see the following page: 
-
-    http://commons.apache.org/lang/article3_0.html
-
-NEW FEATURES
-==============
-
-o LANG-955:  Add methods for removing all invalid characters according to
-             XML 1.0 and XML 1.1 in an input string to StringEscapeUtils.
-             Thanks to Adam Hooper.
-o LANG-970:  Add APIs MutableBoolean setTrue() and setFalse()
-o LANG-962:  Add SerializationUtils.roundtrip(T extends Serializable) to
-             serialize then deserialize
-o LANG-637:  There should be a DifferenceBuilder with a
-             ReflectionDifferenceBuilder implementation
-o LANG-944:  Add the Jaro-Winkler string distance algorithm to StringUtils.
-             Thanks to Rekha Joshi.
-o LANG-417:  New class ClassPathUtils with methods for turning FQN into
-             resource path
-o LANG-834:  Validate: add inclusiveBetween and exclusiveBetween overloads
-             for primitive types
-o LANG-900:  New RandomUtils class. Thanks to Duncan Jones.
-o LANG-966:  Add IBM OS/400 detection
-
-FIXED BUGS
-============
-
-o LANG-621:  ReflectionToStringBuilder.toString does not debug 3rd party object
-             fields within 3rd party object. Thanks to Philip Hodges,
-             Thomas Neidhart.
-o LANG-977:  NumericEntityEscaper incorrectly encodes supplementary characters.
-             Thanks to Chris Karcher.
-o LANG-973:  Make some private fields final
-o LANG-971:  NumberUtils#isNumber(String) fails to reject invalid Octal numbers
-o LANG-972:  NumberUtils#isNumber does not allow for hex 0XABCD
-o LANG-969:  StringUtils.toEncodedString(byte[], Charset) needlessly throws
-             UnsupportedEncodingException. Thanks to Matt Bishop.
-o LANG-946:  ConstantInitializerTest fails when building with IBM JDK 7
-o LANG-954:  uncaught PatternSyntaxException in FastDateFormat on Android.
-             Thanks to Michael Keppler.
-o LANG-936:  StringUtils.getLevenshteinDistance with too big of a threshold
-             returns wrong result. Thanks to Yaniv Kunda, Eli Lindsey.
-o LANG-943:  Test DurationFormatUtilsTest.testEdgeDuration fails in
-             JDK 1.6, 1.7 and 1.8, BRST time zone
-o LANG-613:  ConstructorUtils.getAccessibleConstructor() Does Not Check the
-             Accessibility of Enclosing Classes
-o LANG-951:  Fragments are wrong by 1 day when using fragment YEAR or MONTH.
-             Thanks to Sebastian Götz.
-o LANG-950:  FastDateParser does not handle two digit year parsing like
-             SimpleDateFormat
-o LANG-949:  FastDateParserTest.testParses does not test FastDateParser
-o LANG-915:  Wrong locale handling in LocaleUtils.toLocale().
-             Thanks to Sergio Fernández.
-
-CHANGES
-=========
-
-o LANG-961:  org.apache.commons.lang3.reflect.FieldUtils.removeFinalModifier(Field)
-             does not clean up after itself
-o LANG-958:  FastDateParser javadoc incorrectly states that SimpleDateFormat
-            is used internally
-o LANG-956:  Improve JavaDoc of WordUtils.wrap methods
-o LANG-939:  Move Documentation from user guide to package-info files
-o LANG-953:  Convert package.html files to package-info.java files
-o LANG-940:  Fix deprecation warnings
-o LANG-819:  EnumUtils.generateBitVector needs a "? extends"
-
-                        Release Notes for version 3.2.1
-
-BUG FIXES
-===========
-
-o LANG-937:  Fix missing Hamcrest dependency in Ant Build
-o LANG-941:  Test failure in LocaleUtilsTest when building with JDK 8
-o LANG-942:  Test failure in FastDateParserTest and FastDateFormat_ParserTest
-             when building with JDK8. Thanks to Bruno P. Kinoshita,
-             Henri Yandell.
-o LANG-938:  Build fails with test failures when building with JDK 8 
-
-                        Release Notes for version 3.2
-
-COMPATIBILITY WITH 3.1
-========================
-
-This release introduces backwards incompatible changes in 
-org.apache.commons.lang3.time.FastDateFormat:
-o Method 'protected java.util.List parsePattern()' has been removed
-o Method 'protected java.lang.String parseToken(java.lang.String, int[])' has
-  been removed
-o Method 'protected org.apache.commons.lang3.time.FastDateFormat$NumberRule
-  selectNumberRule(int, int)' has been removed
-
-These changes were the result of [LANG-462]. It is assumed that this change 
-will not break clients as Charles Honton pointed out on 25/Jan/12:
-"
- 1. Methods "FastDateFormat$NumberRule selectNumberRule(int, int)" and 
-    "List<Rule> parsePattern()" couldn't have been overridden because
-    NumberRule and Rule were private to FastDateFormat.
- 2. Due to the factory pattern used, it's unlikely other two methods would have 
-    been overridden.
- 3. The four methods are highly implementation specific. I consider it a 
-    mistake that the methods were exposed.
-"
-For more information see https://issues.apache.org/jira/browse/LANG-462.
-
-NEW FEATURES
-==============
-
-o LANG-934:  Add removeFinalModifier to FieldUtils
-o LANG-863:  Method returns number of inheritance hops between parent and
-             subclass. Thanks to Daneel S. Yaitskov.
-o LANG-774:  Added isStarted, isSuspended and isStopped to StopWatch.
-             Thanks to Erhan Bagdemir.
-o LANG-848:  Added StringUtils.isBlank/isEmpty CharSequence... methods.
-             Thanks to Alexander Muthmann.
-o LANG-926:  Added ArrayUtils.reverse(array, from, to) methods.
-o LANG-795:  StringUtils.toString(byte[], String) deprecated in favour of a new
-             StringUtils.toString(byte[], CharSet). Thanks to Aaron Digulla.
-o LANG-893:  StrSubstitutor now supports default values for variables.
-             Thanks to Woonsan Ko.
-o LANG-913:  Adding .gitignore to commons-lang. Thanks to Allon Mureinik.
-o LANG-837:  Add ObjectUtils.toIdentityString methods that support
-             StringBuilder, StrBuilder, and Appendable.
-o LANG-886:  Added CharSetUtils.containsAny(String, String).
-o LANG-797:  Added escape/unescapeJson to StringEscapeUtils.
-o LANG-875:  Added appendIfMissing and prependIfMissing methods to StringUtils.
-o LANG-870:  Add StringUtils.LF and StringUtils.CR values.
-o LANG-873:  Add FieldUtils getAllFields() to return all the fields defined in
-             the given class and super classes.
-o LANG-835:  StrBuilder should support StringBuilder as an input parameter.
-o LANG-857:  StringIndexOutOfBoundsException in CharSequenceTranslator.
-o LANG-856:  Code refactoring in NumberUtils.
-o LANG-855:  NumberUtils#createBigInteger does not allow for hex and octal
-             numbers.
-o LANG-854:  NumberUtils#createNumber - does not allow for hex numbers to be
-             larger than Long. 
-o LANG-853:  StringUtils join APIs for primitives. 
-o LANG-841:  Add StringUtils API to call String.replaceAll in DOTALL a.k.a.
-             single-line mode. 
-o LANG-825:  Create StrBuilder APIs similar to
-             String.format(String, Object...).
-o LANG-675:  Add Triple class (ternary version of Pair).
-o LANG-462:  FastDateFormat supports parse methods.
-
-BUG FIXES
-===========
-
-o LANG-932:  Spelling fixes. Thanks to Ville Skyttä.
-o LANG-929:  OctalUnescaper tried to parse all of \279.
-o LANG-928:  OctalUnescaper had bugs when parsing octals starting with a zero.
-o LANG-905:  EqualsBuilder returned true when comparing arrays, even when the
-             elements are different.
-o LANG-917:  Fixed exception when combining custom and choice format in
-             ExtendedMessageFormat. Thanks to Arne Burmeister.
-o LANG-902:  RandomStringUtils.random javadoc was incorrectly promising letters
-             and numbers would, as opposed to may, appear  Issue:. Thanks to
-             Andrzej Winnicki.
-o LANG-921:  BooleanUtils.xor(boolean...) produces wrong results.
-o LANG-896:  BooleanUtils.toBoolean(String str) javadoc is not updated. Thanks
-             to Mark Bryan Yu.
-o LANG-879:  LocaleUtils test fails with new Locale "ja_JP_JP_#u-ca-japanese"
-             of JDK7.
-o LANG-836:  StrSubstitutor does not support StringBuilder or CharSequence.
-             Thanks to Arnaud Brunet.
-o LANG-693:  Method createNumber from NumberUtils doesn't work for floating
-             point numbers other than Float  Issue: LANG-693. Thanks to
-             Calvin Echols.
-o LANG-887:  FastDateFormat does not use the locale specific cache correctly.
-o LANG-754:  ClassUtils.getShortName(String) will now only do a reverse lookup
-             for array types.
-o LANG-881:  NumberUtils.createNumber() Javadoc says it does not work for octal
-             numbers.
-o LANG-865:  LocaleUtils.toLocale does not parse strings starting with an
-             underscore.
-o LANG-858:  StringEscapeUtils.escapeJava() and escapeEcmaScript() do not
-             output the escaped surrogate pairs that are Java parsable.
-o LANG-849:  FastDateFormat and FastDatePrinter generates Date objects 
-             wastefully.
-o LANG-845:  Spelling fixes.
-o LANG-844:  Fix examples contained in javadoc of StringUtils.center methods.
-o LANG-832:  FastDateParser does not handle unterminated quotes correctly.
-o LANG-831:  FastDateParser does not handle white-space properly.
-o LANG-830:  FastDateParser could use \Q \E to quote regexes.
-o LANG-828:  FastDateParser does not handle non-Gregorian calendars properly.
-o LANG-826:  FastDateParser does not handle non-ASCII digits correctly.
-o LANG-822:  NumberUtils#createNumber - bad behaviour for leading "--".
-o LANG-818:  FastDateFormat's "z" pattern does not respect timezone of Calendar
-             instances passed to format().
-o LANG-817:  Add org.apache.commons.lang3.SystemUtils.IS_OS_WINDOWS_8.
-o LANG-813:  StringUtils.equalsIgnoreCase doesn't check string reference
-             equality.
-o LANG-810:  StringUtils.join() endIndex, bugged for loop.
-o LANG-807:  RandomStringUtils throws confusing IAE when end <= start.
-o LANG-805:  RandomStringUtils.random(count, 0, 0, false, false, universe,
-             random) always throws java.lang.ArrayIndexOutOfBoundsException.
-o LANG-802:  LocaleUtils - unnecessary recursive call in SyncAvoid class.
-o LANG-800:  Javadoc bug in DateUtils#ceiling for Calendar and Object versions.
-o LANG-788:  SerializationUtils throws ClassNotFoundException when cloning 
-             primitive classes.
-o LANG-786:  StringUtils equals() relies on undefined behavior.
-o LANG-783:  Documentation bug: StringUtils.split.
-o LANG-777:  jar contains velocity template of release notes.
-o LANG-776:  TypeUtilsTest contains incorrect type assignability assertion.
-o LANG-775:  TypeUtils.getTypeArguments() misses type arguments for
-             partially-assigned classes.
-o LANG-773:  ImmutablePair doc contains nonsense text.
-o LANG-772:  ClassUtils.PACKAGE_SEPARATOR Javadoc contains garbage text.
-o LANG-765:  EventListenerSupport.ProxyInvocationHandler no longer defines 
-             serialVersionUID.
-o LANG-764:  StrBuilder is now serializable.
-o LANG-761:  Fix Javadoc Ant warnings.
-o LANG-747:  NumberUtils does not handle Long Hex numbers.
-o LANG-743:  Javadoc bug in static inner class DateIterator.
-
-CHANGES
-=========
-
-o LANG-931:  Misleading Javadoc comment in StrBuilderReader class. Thanks
-             to Christoph Schneegans.
-o LANG-910:  StringUtils.normalizeSpace now handles non-breaking spaces
-             (Unicode 00A0). Thanks to Timur Yarosh.
-o LANG-804:  Redundant check for zero in HashCodeBuilder ctor. Thanks to 
-             Allon Mureinik.
-o LANG-884:  Simplify FastDateFormat; eliminate boxing.
-o LANG-882:  LookupTranslator now works with implementations of CharSequence
-             other than String.
-o LANG-846:  Provide CharSequenceUtils.regionMatches with a proper green
-             implementation instead of inefficiently converting to Strings.
-o LANG-839:  ArrayUtils removeElements methods use unnecessary HashSet.
-o LANG-838:  ArrayUtils removeElements methods clone temporary index arrays
-             unnecessarily.
-o LANG-799:  DateUtils#parseDate uses default locale; add Locale support.
-o LANG-798:  Use generics in SerializationUtils.
-
-CHANGES WITHOUT TICKET
-========================
-
-o Fixed URLs in javadoc to point to new oracle.com pages
-
-
-                        Release Notes for version 3.1
-
-NEW FEATURES
-==============
-
-o LANG-801:  Add Conversion utility to convert between data types on byte level
-o LANG-760:  Add API StringUtils.toString(byte[] intput, String charsetName)
-o LANG-756:  Add APIs ClassUtils.isPrimitiveWrapper(Class<?>) and 
-             isPrimitiveOrWrapper(Class<?>)
-o LANG-695:  SystemUtils.IS_OS_UNIX doesn't recognize FreeBSD as a Unix system
-
-BUG FIXES
-===========
-
-o LANG-749:  Incorrect Bundle-SymbolicName in Manifest
-o LANG-746:  NumberUtils does not handle upper-case hex: 0X and -0X
-o LANG-744:  StringUtils throws java.security.AccessControlException on Google
-             App Engine
-o LANG-741:  Ant build has wrong component.name
-o LANG-698:  Document that the Mutable numbers don't work as expected with
-             String.format
-
-CHANGES
-=========
-
-o LANG-758:  Add an example with whitespace in StringUtils.defaultIfEmpty
-o LANG-752:  Fix createLong() so it behaves like createInteger()
-o LANG-751:  Include the actual type in the Validate.isInstance and
-             isAssignableFrom exception messages
-o LANG-748:  Deprecating chomp(String, String)
-o LANG-736:  CharUtils static final array CHAR_STRING is not needed to compute
-             CHAR_STRING_ARRAY
-
-
-                        Release Notes for version 3.0
-
-ADDITIONS
-===========
-
-o LANG-276:  MutableBigDecimal and MutableBigInteger.
-o LANG-285:  Wish : method unaccent.
-o LANG-358:  ObjectUtils.coalesce.
-o LANG-386:  LeftOf/RightOfNumber in Range convenience methods necessary.
-o LANG-435:  Add ClassUtils.isAssignable() variants with autoboxing.
-o LANG-444:  StringUtils.emptyToNull.
-o LANG-482:  Enhance StrSubstitutor to support nested ${var-${subvr}} expansion
-o LANG-482:  StrSubstitutor now supports substitution in variable names.
-o LANG-496:  A generic implementation of the Lazy initialization pattern.
-o LANG-497:  Addition of ContextedException and ContextedRuntimeException.
-o LANG-498:  Add StringEscapeUtils.escapeText() methods.
-o LANG-499:  Add support for the handling of ExecutionExceptions.
-o LANG-501:  Add support for background initialization.
-o LANG-529:  Add a concurrent package.
-o LANG-533:  Validate: support for validating blank strings.
-o LANG-537:  Add ArrayUtils.toArray to create generic arrays.
-o LANG-545:  Add ability to create a Future for a constant.
-o LANG-546:  Add methods to Validate to check whether the index is valid for
-             the array/list/string.
-o LANG-553:  Add TypeUtils class to provide utility code for working with generic
-             types.
-o LANG-559:  Added isAssignableFrom and isInstanceOf validation methods.
-o LANG-559:  Added validState validation method.
-o LANG-560:  New TimedSemaphore class.
-o LANG-582:  Provide an implementation of the ThreadFactory interface.
-o LANG-588:  Create a basic Pair<L, R> class.
-o LANG-594:  DateUtils equal & compare functions up to most significant field.
-o LANG-601:  Add Builder Interface / Update Builders to Implement It.
-o LANG-609:  Support lazy initialization using atomic variables
-o LANG-610:  Extend exception handling in ConcurrentUtils to runtime exceptions.
-o LANG-614:  StringUtils.endsWithAny method
-o LANG-640:  Add normalizeSpace to StringUtils
-o LANG-644:  Provide documentation about the new concurrent package
-o LANG-649:  BooleanUtils.toBooleanObject to support single character input
-o LANG-651:  Add AnnotationUtils
-o LANG-653:  Provide a very basic ConcurrentInitializer implementation
-o LANG-655:  Add StringUtils.defaultIfBlank()
-o LANG-667:  Add a Null-safe compare() method to ObjectUtils
-o LANG-676:  Documented potential NPE if auto-boxing occurs for some BooleanUtils
-             methods
-o LANG-678:  Add support for ConcurrentMap.putIfAbsent()
-o LANG-692:  Add hashCodeMulti varargs method
-o LANG-697:  Add FormattableUtils class
-o LANG-684:  Levenshtein Distance Within a Given Threshold
-
-REMOVALS
-==========
-
-o LANG-438:  Remove @deprecateds.
-o LANG-492:  Remove code handled now by the JDK.
-o LANG-493:  Remove code that does not hold enough value to remain.
-o LANG-590:  Remove JDK 1.2/1.3 bug handling in 
-             StringUtils.indexOf(String, String, int).
-o LANG-673:  WordUtils.abbreviate() removed
-o LANG-691:  Removed DateUtils.UTC_TIME_ZONE
-
-IMPROVEMENTS
-==============
-
-o LANG-290:  EnumUtils for JDK 5.0.
-o LANG-336:  Finally start using generics.
-o LANG-355:  StrBuilder should implement CharSequence and Appendable.
-o LANG-396:  Investigate for vararg usages.
-o LANG-424:  Improve Javadoc for StringUtils class.
-o LANG-458:  Refactor Validate.java to eliminate code redundancy.
-o LANG-479:  Document where in SVN trunk is.
-o LANG-504:  bring ArrayUtils.isEmpty to the generics world.
-o LANG-505:  Rewrite StringEscapeUtils.
-o LANG-507:  StringEscapeUtils.unescapeJava should support \u+ notation.
-o LANG-510:  Convert StringUtils API to take CharSequence.
-o LANG-513:  Better EnumUtils.
-o LANG-528:  Mutable classes should implement an appropriately typed Mutable
-             interface.
-o LANG-539:  Compile commons.lang for CDC 1.1/Foundation 1.1.
-o LANG-540:  Make NumericEntityEscaper immutable.
-o LANG-541:  Replace StringBuffer with StringBuilder.
-o LANG-548:  Use Iterable on API instead of Collection.
-o LANG-551:  Replace Range classes with generic version.
-o LANG-562:  Change Maven groupId.
-o LANG-563:  Change Java package name.
-o LANG-570:  Do the test cases really still require main() and suite() methods?
-o LANG-579:  Add new Validate methods.
-o LANG-599:  ClassUtils.getClass(): Allow Dots as Inner Class Separators.
-o LANG-605:  DefaultExceptionContext overwrites values in recursive situations.
-o LANG-668:  Change ObjectUtils min() & max() functions to use varargs rather
-             than just two parameters
-o LANG-681:  Push down WordUtils to "text" sub-package.
-o LANG-711:  Add includeantruntime=false to javac targets to quell warnings in
-             ant 1.8.1 and better (and modest performance gain).
-o LANG-713:  Increase test coverage of FieldUtils read methods and tweak
-             javadoc.
-o LANG-718:  build.xml Java 1.5+ updates.
-
-BUG FIXES
-===========
-
-o LANG-11:   Depend on JDK 1.5+.
-o LANG-302:  StrBuilder does not implement clone().
-o LANG-339:  StringEscapeUtils.escapeHtml() escapes multibyte characters like
-             Chinese, Japanese, etc.
-o LANG-369:  ExceptionUtils not thread-safe.
-o LANG-418:  Javadoc incorrect for StringUtils.endsWithIgnoreCase.
-o LANG-428:  StringUtils.isAlpha, isAlphanumeric and isNumeric now return false
-             for ""
-o LANG-439:  StringEscapeUtils.escapeHTML() does not escape chars (0x00-0x20).
-o LANG-448:  Lower Ascii Characters don't get encoded by Entities.java.
-o LANG-468:  JDK 1.5 build/runtime failure on LANG-393 (EqualsBuilder).
-o LANG-474:  Fixes for thread safety.
-o LANG-478:  StopWatch does not resist to system time changes.
-o LANG-480:  StringEscapeUtils.escapeHtml incorrectly converts unicode
-             characters above U+00FFFF into 2 characters.
-o LANG-481:  Possible race-conditions in hashCode of the range classes.
-o LANG-564:  Improve StrLookup API documentation.
-o LANG-568:  @SuppressWarnings("unchecked") is used too generally.
-o LANG-571:  ArrayUtils.add(T[:  array, T element) can create unexpected
-             ClassCastException.
-o LANG-585:  exception.DefaultExceptionContext.getFormattedExceptionMessage
-             catches Throwable.
-o LANG-596:  StrSubstitutor should also handle the default properties of a
-             java.util.Properties class
-o LANG-600:  Javadoc is incorrect for public static int 
-             lastIndexOf(String str, String searchStr).
-o LANG-602:  ContextedRuntimeException no longer an 'unchecked' exception.
-o LANG-606:  EqualsBuilder causes StackOverflowException.
-o LANG-608:  Some StringUtils methods should take an int character instead of
-             char to use String API features.
-o LANG-617:  StringEscapeUtils.escapeXML() can't process UTF-16 supplementary
-             characters
-o LANG-624:  SystemUtils.getJavaVersionAsFloat throws 
-             StringIndexOutOfBoundsException on Android runtime/Dalvik VM
-o LANG-629:  Charset may not be threadsafe, because the HashSet is not synch.
-o LANG-638:  NumberUtils createNumber throws a StringIndexOutOfBoundsException
-             when argument containing "e" and "E" is passed in
-o LANG-643:  Javadoc StringUtils.left() claims to throw on negative len, but
-             doesn't
-o LANG-645:  FastDateFormat.format() outputs incorrect week of year because
-             locale isn't respected
-o LANG-646:  StringEscapeUtils.unescapeJava doesn't handle octal escapes and
-             Unicode with extra u
-o LANG-656:  Example StringUtils.indexOfAnyBut("zzabyycdxx", '') = 0 incorrect
-o LANG-658:  Some Entitys like &Ouml; are not matched properly against its
-             ISO8859-1 representation
-o LANG-659:  EntityArrays typo: {"\u2122", "&minus;"}, // minus sign, U+2212
-             ISOtech
-o LANG-66:   StringEscaper.escapeXml() escapes characters > 0x7f.
-o LANG-662:  org.apache.commons.lang3.math.Fraction does not reduce
-             (Integer.MIN_VALUE, 2^k)
-o LANG-663:  org.apache.commons.lang3.math.Fraction does not always succeed in
-             multiplyBy and divideBy
-o LANG-664:  NumberUtils.isNumber(String) is not right when the String is
-             "1.1L"
-o LANG-672:  Doc bug in DateUtils#ceiling
-o LANG-677:  DateUtils.isSameLocalTime compares using 12 hour clock and not
-             24 hour
-o LANG-685:  EqualsBuilder synchronizes on HashCodeBuilder.
-o LANG-703:  StringUtils.join throws NPE when toString returns null for one of
-             objects in collection
-o LANG-710:  StringIndexOutOfBoundsException when calling unescapeHtml4("&#03")
-o LANG-714:  StringUtils doc/comment spelling fixes.
-o LANG-715:  CharSetUtils.squeeze() speedup.
-o LANG-716:  swapCase and *capitalize speedups.
-
-
-Historical list of changes: http://commons.apache.org/lang/changes-report.html
-
-For complete information on Commons Lang, including instructions on how to
-submit bug reports, patches, or suggestions for improvement, see the 
-Apache Commons Lang website:
-
-http://commons.apache.org/lang/
-
-Have fun!
--Apache Commons Lang team
-
diff --git a/lang/src/site/site.xml b/lang/src/site/site.xml
deleted file mode 100644
index 0da9524..0000000
--- a/lang/src/site/site.xml
+++ /dev/null
@@ -1,46 +0,0 @@
-<?xml version="1.0" encoding="ISO-8859-1"?>
-<!--
- Licensed to the Apache Software Foundation (ASF) under one or more
- contributor license agreements.  See the NOTICE file distributed with
- this work for additional information regarding copyright ownership.
- The ASF licenses this file to You under the Apache License, Version 2.0
- (the "License"); you may not use this file except in compliance with
- the License.  You may obtain a copy of the License at
-
-      http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
--->
-<project name="Lang">
-    <bannerRight>
-        <name>Commons Lang</name>
-        <src>/images/logo.png</src>
-        <href>/index.html</href>
-    </bannerRight>
-
-    <body>
-        <menu name="Lang">
-            <item name="Overview"        href="/index.html"/>
-            <item name="Download"        href="/download_lang.cgi"/>
-            <item name="Users guide"     href="/userguide.html"/>
-            <item name="Release History" href="/release-history.html"/>
-            <item name="Javadoc (Latest release)" href="javadocs/api-release/index.html"/>
-        </menu>
-
-        <menu name="Development">
-            <item name="Building"             href="/building.html"/>
-            <item name="Mailing Lists"        href="/mail-lists.html"/>
-            <item name="Issue Tracking"       href="/issue-tracking.html"/>
-            <item name="Proposal"             href="/proposal.html"/>
-            <item name="Developer guide"      href="/developerguide.html"/>
-            <item name="Source Repository"    href="/source-repository.html"/>
-            <item name="Javadoc (SVN latest)" href="apidocs/index.html"/>
-        </menu>
-
-    </body>
-
-</project>
diff --git a/lang/src/site/xdoc/article2_4.xml b/lang/src/site/xdoc/article2_4.xml
deleted file mode 100644
index 3a92d0c..0000000
--- a/lang/src/site/xdoc/article2_4.xml
+++ /dev/null
@@ -1,195 +0,0 @@
-<?xml version="1.0"?>
-<!--
-Licensed to the Apache Software Foundation (ASF) under one or more
-contributor license agreements.  See the NOTICE file distributed with
-this work for additional information regarding copyright ownership.
-The ASF licenses this file to You under the Apache License, Version 2.0
-(the "License"); you may not use this file except in compliance with
-the License.  You may obtain a copy of the License at
-
-     http://www.apache.org/licenses/LICENSE-2.0
-
-Unless required by applicable law or agreed to in writing, software
-distributed under the License is distributed on an "AS IS" BASIS,
-WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-See the License for the specific language governing permissions and
-limitations under the License.
--->
-<document>
- <properties>
-  <title>What's new in Commons Lang 2.4?</title>
-  <author email="dev@commons.apache.org">Commons Documentation Team</author>
- </properties>
-<body>
-
-<section name="What's new in Commons Lang 2.4?">
-<p>Commons Lang 2.4 is out, and the obvious question is: <em>"So what? What's changed?"</em>.</p>
-<p>This article aims to briefly cover the changes and save you from having to dig through each JIRA
-issue to see what went on in the year of development between Lang 2.3 and 2.4.</p>
-<section name="Deprecations">
-<p>First, let us start with a couple of deprecations. As you can see in the release notes, we chose
-to deprecate the <a href="http://commons.apache.org/lang/api-release/org/apache/commons/lang/ObjectUtils.html#appendIdentityToString(java.lang.StringBuffer,%20java.lang.Object)"><code>ObjectUtils.appendIdentityToString(StringBuffer, Object)</code></a> method as its
-null handling did not match its design (see <a href="http://issues.apache.org/jira/browse/LANG-360">LANG-360</a>
-for more details. Instead users should use <code>ObjectUtils.identityToString(StringBuffer, Object)</code>.</p>
-
-<p>We also deprecated <a href="http://commons.apache.org/lang/api-release/org/apache/commons/lang/time/DateUtils.html#add(java.util.Date,%20int,%20int)"><code>DateUtils.add(java.util.Date, int, int)</code></a>. It should have been <code>private</code>
-from the beginning; please let us know if you actually use it.</p>
-</section>
-<section name="The build">
-<p>Before we move on, a quick note on the build: we built 2.4 using Maven 2 and Java 1.4. We also tested that the Ant build passed the tests
-successfully under Java 1.3, and that the classes compiled under Java 1.2. As it's been so long, we stopped building a Java 1.1-compatible jar. <strong>Most importantly</strong>, it <em>should</em> be a drop in replacement for Lang 2.3, but we recommend testing first, of course. Also, for those of you who work within an OSGi framework, the jar should be ready for OSGi. Now... time to move on.
-</p>
-</section>
-<section name="New classes">
-<p>Three new classes were added, so let's cover those next.</p>
-<p>Firstly, we added an <a href="http://commons.apache.org/lang/api-release/org/apache/commons/lang/math/IEEE754rUtils.html"><code>IEEE754rUtils</code></a>
-class to the <code>org.apache.commons.lang.math</code> package.
-This candidate for ugly name of the month was needed to add <a href="http://en.wikipedia.org/wiki/IEEE_754r#min_and_max">IEEE-754r</a>
-semantics for some of the <code>NumberUtils</code> methods. The relevant part of that
-IEEE specification in this case is the NaN handling for <code>min</code> and <code>max</code> methods, and
-you can read more about it in <a href="http://issues.apache.org/jira/browse/LANG-381">LANG-381</a>.
-</p>
-<p>Second and third on our newcomers list are the <a href="http://commons.apache.org/lang/api-release/org/apache/commons/lang/text/ExtendedMessageFormat.html"><code>ExtendedMessageFormat</code></a> class and its peer
-<a href="http://commons.apache.org/lang/api-release/org/apache/commons/lang/text/FormatFactory.html"><code>FormatFactory</code></a>
-interface, both found in the <code>org.apache.commons.lang.text</code> package.</p>
-<p>Together they allow you to take the <code>java.text.MessageFormat</code> class further and insert your own formatting elements.</p>
-<p>
-By way of an example, imagine that we have a need for custom formatting of a employee identification
-number or EIN. Perhaps, simplistically, our EIN is composed of a two-character department code
-followed by a four-digit number, and that it is customary within our organization to render the EIN
-with a hyphen following the department identifier. Here we'll represent the EIN as a simple
-String (of course in real life we would likely create a class composed of department and number).
-We can create a custom <code>Format</code> class:
-<pre><code>
-public class EINFormat extends Format {
-  private char[] idMask;
-
-  public EINFormat() {
-  }
-  public EINFormat(char maskChar) {
-    idMask = new char[4];
-    Arrays.fill(idMask, maskChar);
-  }
-  public StringBuffer format(Object obj, StringBuffer toAppendTo, FieldPosition pos) {
-    String ein = (String) obj; //assume or assert length &gt;= 2
-    if (idMask == null) {
-      return new StringBuffer(ein).insert(2, '-').toString();
-    }
-    return new StringBuffer(ein.substring(0, 2)).append('-').append(idMask).toString();
-  }
-  public Object parseObject(String source, ParsePosition pos) {
-    int idx = pos.getIndex();
-    int endIdx = idx + 7;
-    if (source == null || source.length() &lt; endIdx) {
-      pos.setErrorIndex(idx);
-      return null;
-    }
-    if (source.charAt(idx + 2) != '-') {
-      pos.setErrorIndex(idx);
-      return null;
-    }
-    pos.setIndex(endIdx);
-    return source.substring(idx, endIdx).deleteCharAt(2);
-  }
-}
-</code></pre>
-Our custom EIN format is made available for <code>MessageFormat</code>-style processing by a
-<code>FormatFactory</code> implementation:
-<pre><code>
-public class EINFormatFactory implements FormatFactory {
-  public static final String EIN_FORMAT = "ein";
-  public Format getFormat(String name, String arguments, Locale locale) {
-    if (EIN_FORMAT.equals(name)) {
-      if (arguments == null || "".equals(arguments)) {
-        return new EINFormat();
-      }
-      return new EINFormat(arguments.charAt(0));
-    }
-    return null;
-  }
-}
-</code></pre>
-
-Now you simply provide a <code>java.util.Map&lt;String, FormatFactory&gt;</code> registry (keyed
-by format type) to <code>ExtendedMessageFormat</code>:
-<pre><code>
-new ExtendedMessageFormat("EIN: {0,ein}", Collections.singletonMap(EINFormatFactory.EIN_FORMAT, new EINFormatFactory()));
-</code></pre>
-As expected, this will render a String EIN "AA9999" as: <code>"EIN: AA-9999"</code>.
-<br /> <br />
-If we wanted to trigger the EIN masking code, we could trigger that in the format pattern:
-<pre><code>
-new ExtendedMessageFormat("EIN: {0,ein,#}", Collections.singletonMap(EINFormatFactory.EIN_FORMAT, new EINFormatFactory()));
-</code></pre>
-This should render "AA9999" as: <code>"EIN: AA-####"</code>.
-<br /> <br />
-You can also use <code>ExtendedMessageFormat</code> to override any or all of the built-in
-formats supported by <code>java.text.MessageFormat</code>. Finally, note that because
-<code>ExtendedMessageFormat</code> extends <code>MessageFormat</code> it should work in most
-cases as a <em>true</em> drop-in replacement.
-</p>
-</section>
-<section name="New methods">
-<p>There were 58 new methods added to existing Commons Lang classes. Going through each one, one at a time would be dull,
-and fortunately there are some nice groupings that we can discuss instead:</p>
-<p>CharSet <a href="http://commons.apache.org/lang/api-release/org/apache/commons/lang/CharSet.html#getInstance(java.lang.String[])">getInstance(String[])</a> adds an additional builder method by which you can build a CharSet from multiple sets of characters at the same time. If you weren't aware of the CharSet class, it holds a set of characters created by a simple pattern language allowing constructs such as <code>"a-z"</code> and <code>"^a"</code> (everything but 'a'). It's most used by the CharSetUtils class, and came out of CharSetUtils.translate, a simple variant of the UNIX tr command.</p>
-<p>ClassUtils <a href="http://commons.apache.org/lang/api-release/org/apache/commons/lang/ClassUtils.html">canonical name</a> methods are akin to the non '<code>Canonical</code>' methods, except they work with the more human readable <code>int[]</code> type names rather than the JVM versions of <code>[I</code>. This makes them useful for parsing input from developer's configuration files. </p>
-<p>ClassUtils <a href="http://commons.apache.org/lang/api-release/org/apache/commons/lang/ClassUtils.html#toClass(java.lang.Object[])">toClass(String[])</a> is very easy to explain - it calls <code>toClass</code> on each <code>Object</code> in the array and returns an array of <code>Class</code> objects.</p>
-<p>ClassUtils <a href="http://commons.apache.org/lang/api-release/org/apache/commons/lang/ClassUtils.html#wrappersToPrimitives(java.lang.Class[])">wrapper-&gt;primitive</a> conversions are the reflection of the pre-existing <code>primitiveToWrapper</code> methods. Again easy to explain, they turn an array of <code>Integer</code> into an array of <code>int[]</code>.</p>
-<p>ObjectUtils <a href="http://commons.apache.org/lang/api-release/org/apache/commons/lang/ObjectUtils.html#identityToString(java.lang.StringBuffer,%20java.lang.Object)">identityToString(StringBuffer, Object)</a> is the StringBuffer variant of the pre-existing <code>identityToString</code> method. In case you've not met that before, it produces the toString that would have been produced by an Object if it hadn't been overridden.</p>
-<p>StringEscapeUtils <a href="http://commons.apache.org/lang/api-release/org/apache/commons/lang/StringEscapeUtils.html#escapeCsv(java.lang.String)">CSV methods</a> are a new addition to our range of simple parser/printers. These, quite as expected, parse and unparse CSV text as per <a href="http://tools.ietf.org/html/rfc4180">RFC-4180</a>.</p>
-<p>StringUtils has a host of new methods, as always, and we'll leave these for later.</p>
-<p>WordUtils <a href="http://commons.apache.org/lang/api-release/org/apache/commons/lang/WordUtils.html#abbreviate(java.lang.String,%20int,%20int,%20java.lang.String)">abbreviate</a> finds the first space after the lower limit and abbreviates the text.</p>
-<p>math.<a href="http://commons.apache.org/lang/api-release/org/apache/commons/lang/math/IntRange.html#toArray()">IntRange</a>/<a href="http://commons.apache.org/lang/api-release/org/apache/commons/lang/math/LongRange.html#toArray()">LongRange.toArray</a> turn the range into an array of primitive <code>int</code>/<code>long</code>s contained in the range.</p>
-<p>text.StrMatch.<a href="http://commons.apache.org/lang/api-release/org/apache/commons/lang/text/StrMatcher.html#isMatch(char[],%20int)">isMatch(char[], int)</a> is a helper method for checking whether there was a match with the StrMatcher objects.</p>
-<p>time.DateFormatUtils <a href="http://commons.apache.org/lang/api-release/org/apache/commons/lang/time/DateFormatUtils.html">format(Calendar, ...)</a> provide Calendar variants for the pre-existing format methods. If these are new to you, they are helper methods to formatting a date.</p>
-<p>time.DateUtils <a href="http://commons.apache.org/lang/api-release/org/apache/commons/lang/time/DateUtils.html">getFragment*</a> methods are used to splice the time element out of Date. If you have <code>2008/12/13 14:57</code>, then these could, for example, pull out the 13.</p>
-<p>time.DateUtils <a href="http://commons.apache.org/lang/api-release/org/apache/commons/lang/time/DateUtils.html">setXxx methods</a> round off our walk through the methods - the setXxx variant of the existing addXxx helper methods.</p>
-</section>
-
-<section name="StringUtils methods">
-<p>The <code>StringUtils</code> class is a little large, isn't it? Sorry, but it's gotten bigger.
-</p>
-<ul>
-  <li><a href="http://commons.apache.org/lang/api-release/org/apache/commons/lang/StringUtils.html#containsOnly(java.lang.String,%20char[])">boolean containsAny(String, char[])</a></li>
-  <li><a href="http://commons.apache.org/lang/api-release/org/apache/commons/lang/StringUtils.html#containsOnly(java.lang.String,%20java.lang.String)">boolean containsAny(String, String)</a></li>
-  <li><a href="http://commons.apache.org/lang/api-release/org/apache/commons/lang/StringUtils.html#endsWith(java.lang.String,%20java.lang.String)">boolean endsWith(String, String)</a></li>
-  <li><a href="http://commons.apache.org/lang/api-release/org/apache/commons/lang/StringUtils.html#endsWithIgnoreCase(java.lang.String,%20java.lang.String)">boolean endsWithIgnoreCase(String, String)</a></li>
-  <li><a href="http://commons.apache.org/lang/api-release/org/apache/commons/lang/StringUtils.html#getCommonPrefix(java.lang.String[])">String getCommonPrefix(String[])</a></li>
-  <li><a href="http://commons.apache.org/lang/api-release/org/apache/commons/lang/StringUtils.html#indexOfDifference(java.lang.String[])">int indexOfDifference(String[])</a></li>
-  <li><a href="http://commons.apache.org/lang/api-release/org/apache/commons/lang/StringUtils.html#length(java.lang.String)">int length(String)</a></li>
-  <li><a href="http://commons.apache.org/lang/api-release/org/apache/commons/lang/StringUtils.html#removeEndIgnoreCase(java.lang.String,%20java.lang.String)">String removeEndIgnoreCase(String, String)</a></li>
-  <li><a href="http://commons.apache.org/lang/api-release/org/apache/commons/lang/StringUtils.html#removeStartIgnoreCase(java.lang.String,%20java.lang.String)">String removeStartIgnoreCase(String, String)</a></li>
-  <li><a href="http://commons.apache.org/lang/api-release/org/apache/commons/lang/StringUtils.html#replaceEach(java.lang.String,%20java.lang.String[],%20java.lang.String[])">String replaceEach(String, String[], String[])</a></li>
-  <li><a href="http://commons.apache.org/lang/api-release/org/apache/commons/lang/StringUtils.html#replaceEachRepeatedly(java.lang.String,%20java.lang.String[],%20java.lang.String[])">String replaceEachRepeatedly(String, String[], String[])</a></li>
-  <li><a href="http://commons.apache.org/lang/api-release/org/apache/commons/lang/StringUtils.html#splitByCharacterType(java.lang.String)">String[] splitByCharacterType(String)</a></li>
-  <li><a href="http://commons.apache.org/lang/api-release/org/apache/commons/lang/StringUtils.html#splitByCharacterTypeCamelCase(java.lang.String)">String[] splitByCharacterTypeCamelCase(String)</a></li>
-  <li><a href="http://commons.apache.org/lang/api-release/org/apache/commons/lang/StringUtils.html#splitByWholeSeparatorPreserveAllTokens(java.lang.String,%20java.lang.String)">String[] splitByWholeSeparatorPreserveAllTokens(String, String)</a></li>
-  <li><a href="http://commons.apache.org/lang/api-release/org/apache/commons/lang/StringUtils.html#splitByWholeSeparatorPreserveAllTokens(java.lang.String,%20java.lang.String,%20int)">String[] splitByWholeSeparatorPreserveAllTokens(String, String, int)</a></li>
-  <li><a href="http://commons.apache.org/lang/api-release/org/apache/commons/lang/StringUtils.html#startsWith(java.lang.String,%20java.lang.String)">boolean startsWith(String, String)</a></li>
-  <li><a href="http://commons.apache.org/lang/api-release/org/apache/commons/lang/StringUtils.html#startsWithIgnoreCase(java.lang.String,%20java.lang.String)">boolean startsWithIgnoreCase(String, String)</a></li>
-</ul>
-
-<p>Hopefully they are in many cases self-describing. Rather than spend a lot of time describing them, we'll let you read the Javadoc of the ones that interest you.</p>
-
-</section>
-
-<section name="What's fixed in Lang 2.4?">
-<p>In addition to new things, there are the bugfixes. As you can tell from the release notes, there are a good few - 24 in fact according to JIRA. Here are some of the interesting ones: </p>
-<ul>
-<li><a href="http://issues.apache.org/jira/browse/LANG-393">LANG-393</a> - We fixed EqualsBuilder so that it understands that BigDecimals are equal even when they think they're not. It seems very likely that usually you will want "29.0" and "29.00" to be equal, even if BigDecimal disagrees. </li>
-<li><a href="http://issues.apache.org/jira/browse/LANG-380">LANG-380</a> - Chances are you'll know if you met this one. Fraction.reduce has an infinite loop if the numerator is 0. </li>
-<li><a href="http://issues.apache.org/jira/browse/LANG-369">LANG-369</a>, <a href="http://issues.apache.org/jira/browse/LANG-367">LANG-367</a>, <a href="http://issues.apache.org/jira/browse/LANG-334">LANG-334</a> - Threading bugs - we improved how things work in concurrency situations for ExceptionUtils, FastDateFormat and Enum. </li>
-<li><a href="http://issues.apache.org/jira/browse/LANG-346">LANG-346</a> - DateUtils.round was getting things wrong for minutes and seconds. </li>
-<li><a href="http://issues.apache.org/jira/browse/LANG-328">LANG-328</a> - LocaleUtils.toLocale was broken if there was no country code defined. </li>
-</ul>
-</section>
-
-<section name="So long, farewell...">
-<p>Hopefully that was all of interest. Don't forget to download <a href="http://commons.apache.org/lang/download_lang.cgi">Lang 2.4</a>, or, for the Maven repository users, upgrade your &lt;version&gt; tag to 2.4. Please feel free to raise any questions you might have on the <a href="mail-lists.html">mailing lists</a>, and report bugs or enhancements in the <a href="issue-tracking.html">issue tracker</a>.</p>
-</section>
-
-</section>
-
-</body>
-</document>
diff --git a/lang/src/site/xdoc/article2_5.xml b/lang/src/site/xdoc/article2_5.xml
deleted file mode 100644
index 8bf84ed..0000000
--- a/lang/src/site/xdoc/article2_5.xml
+++ /dev/null
@@ -1,135 +0,0 @@
-<?xml version="1.0"?>
-<!--
-Licensed to the Apache Software Foundation (ASF) under one or more
-contributor license agreements.  See the NOTICE file distributed with
-this work for additional information regarding copyright ownership.
-The ASF licenses this file to You under the Apache License, Version 2.0
-(the "License"); you may not use this file except in compliance with
-the License.  You may obtain a copy of the License at
-
-     http://www.apache.org/licenses/LICENSE-2.0
-
-Unless required by applicable law or agreed to in writing, software
-distributed under the License is distributed on an "AS IS" BASIS,
-WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-See the License for the specific language governing permissions and
-limitations under the License.
--->
-<document>
- <properties>
-  <title>What's new in Commons Lang 2.5?</title>
-  <author email="dev@commons.apache.org">Commons Documentation Team</author>
- </properties>
-<body>
-
-<section name="What's new in Commons Lang 2.5?">
-<p>Commons Lang 2.5 is out, and the obvious question is: <em>"So what? What's changed?"</em>.</p>
-<p>This article aims to briefly cover the changes and save you from having to dig through each JIRA
-issue to see what went on in the two years of development between Lang 2.4 and 2.5.</p>
-<p>Two years?!? Yes, it's true. The reason is that 2.5 represents the backwards compatible changes in the 
-nearly complete Java-5 focused Lang 3.0. </p>
-<section name="Deprecations">
-<p>There were no new deprecations in 2.5. </p>
-</section>
-<section name="The build">
-<p>2.5 was built using Sun's 1.6.0_17 JVM, but targets Java 1.3. </p>
-</section>
-<section name="New classes">
-<p>A new org.apache.commons.lang.reflect package was added, accumulating common high-level uses of the java.lang.reflect APIs. The 
-classes, hopefully self-evident in nature, were pulled together from the existing BeanUtils and the unreleased Reflect components. 
-The classes are: </p>
-<ul>
-<li>ConstructorUtils - primarily creating new instances of classes</li>
-<li>FieldUtils - primarily reading and writing to Object/Class fields</li>
-<li>MethodUtils - primarily methods to make invoking methods simpler</li>
-</ul>
-<p>You can read more about the classes in their 
-<a href="LANG_2_5/src/main/java/org/apache/commons/lang/reflect//MemberUtils.java">javadoc</a>. </p>
-</section>
-<section name="New fields">
-<p>With both Java 7 and Windows 7 becoming a reality, 
-<a href="http://commons.apache.org/lang/api-release/org/apache/commons/lang/SystemUtils.html">SystemUtils</a> was updated to 
-provide boolean fields for both versions. </p>
-</section>
-<section name="New methods">
-<p>There were 66 new methods added to existing Commons Lang classes. </p>
-<p>The <a href="http://commons.apache.org/lang/api-release/org/apache/commons/lang/ArrayUtils.html">ArrayUtils</a> class 
-received two new types of methods. Firstly, a boolean isNotEmpty(array) set of methods, identifying whether the particular 
-array is null or an empty sized array. This makes it the inverse of the existing isEmpty(array) methods. Secondly, an array 
-nullToEmpty(array) set of methods that converts null or empty arrays to a singleton empty array already available from the 
-ArrayUtils class. Non null/empty arrays are left untouched. </p>
-
-<p>The constructor for the 
-<a href="http://commons.apache.org/lang/api-release/org/apache/commons/lang/CharRange.html">CharRange</a> class is somewhat 
-confusing. It takes a boolean parameter that when set to true means the CharRange is negated. To make code easier to read, the 
-following static helper methods were added: </p>
-<ul>
-<li>public org.apache.commons.lang.CharRange is(char)</li>
-<li>public org.apache.commons.lang.CharRange isIn(char, char)</li>
-<li>public org.apache.commons.lang.CharRange isNot(char)</li>
-<li>public org.apache.commons.lang.CharRange isNotIn(char, char)</li>
-</ul>
-<p>An iterator() method was also added to provide another way of walking the range. </p>
-
-<p>The <a href="http://commons.apache.org/lang/api-release/org/apache/commons/lang/builder/EqualsBuilder.html">EqualsBuilder</a> 
-obtained a new reset() method to allow for reuse, while the 
-<a href="http://commons.apache.org/lang/api-release/org/apache/commons/lang/builder/HashCodeBuilder.html">HashCodeBuilder</a> 
-received a hashCode() method that returns the built hash code instead of the natural hash code of the builder object itself. It 
-doesn't really matter what the builder chooses to use as a hash code and this stops accidental use of the hashCode() instead of 
-toHashCode() method from causing lots of pain. </p>
-
-<p>Helper isFalse(), isTrue() and toBoolean() methods were added to 
-<a href="http://commons.apache.org/lang/api-release/org/apache/commons/lang/mutable/MutableBoolean.html">MutableBoolean</a>, 
-while the other mutable classes received String argument constructors. </p>
-
-<p>Lastly, the <a href="http://commons.apache.org/lang/api-release/org/apache/commons/lang/time/DateUtils.html">DateUtils</a> 
-class received a new ceiling set of methods to truncate upwards, and a parseDateStrictly method to parse a Date with the 
-supplied DateFormat classes leniency set to false. </p>
-
-</section>
-
-<section name="StringUtils methods">
-<p>As with 2.4, the 
-<a href="http://commons.apache.org/lang/api-release/org/apache/commons/lang/StringUtils.html">StringUtils</a> class has 
-grown and we cover its new methods in its own section. </p>
-<ul>
-<li>abbreviateMiddle(String, String, int);String - This method turns aRatherLongNameSuchAsAFileName into 'aRatherLo...AFileName'. 
-This is often desirable when you want to restrict the length of a name, but you can afford to have quite long names. </li>
-<li>indexOfIgnoreCase(String, String);int - An indexOf method that ignores the case of what it's matching. Matching lastIndexOfIgnoreCase and 'start at index' variants were also added. </li>
-<li>lastOrdinalIndexOf(String, String, int);int - A matching variant for the already exisitng ordinalIndexOf method - they 
-support finding the Nth indexOf instead of the first time the search term is found. </li>
-<li>isAllLowerCase(String);boolean - Is the String all lower case. </li>
-<li>isAllUpperCase(String);boolean - Is the String all upper case. </li>
-<li>lowerCase(String, Locale);String - Null protected toLowerCase methods for the platform independent inclined. </li>
-<li>upperCase(String, Locale);String - Null protected toUpperCase methods for the platform independent inclined. </li>
-<li>repeat(String, String, int);String - Repeat option that includes an optional separator. </li>
-<li>startsWithAny(String, String[]);boolean - Does the specified String start with any of the supplied values. </li>
-</ul>
-</section>
-
-<section name="What's fixed in Lang 2.5?">
-<p>Per the <a href="upgradeto2_5.html">release notes</a> there are 32 bugs fixed in Lang 2.5. Some highlights are: </p>
-<ul>
-<li><a href="http://issues.apache.org/jira/browse/LANG-477">LANG-477</a> - fixing an OutOfMemoryError in ExtendedMessageFormat. </li>
-<li><a href="http://issues.apache.org/jira/browse/LANG-76">LANG-76</a> - EnumUtils.getEnum() doesn't work well in 1.5. </li>
-<li><a href="http://issues.apache.org/jira/browse/LANG-204">LANG-204</a> and 
-<a href="http://issues.apache.org/jira/browse/LANG-506">LANG-506</a> - Multithread improvements to the package private Entities 
-class, used behind the scenes by StringEscapeUtils. </li>
-<li><a href="http://issues.apache.org/jira/browse/LANG-511">LANG-511</a> - Improve performance by deferring LocaleUtils initialization. </li>
-<li><a href="http://issues.apache.org/jira/browse/LANG-523">LANG-523</a> - Two orders of magnitude performance improvement in StrBuilder. </li>
-<li><a href="http://issues.apache.org/jira/browse/LANG-467">LANG-467</a> - Reverted the change to EqualsBuilder in Lang 2.4 to 
-specially handle BigDecimal. While useful, it put things out of sync with HashCodeBuilder. </li>
-<li><a href="http://issues.apache.org/jira/browse/LANG-586">LANG-586</a> - Use of a ThreadLocal in HashCodeBuilder and 
-ToStringStyle meant that containers could end up with memory leaks. This was rewritten to avoid this. </li>
-<li><a href="http://issues.apache.org/jira/browse/LANG-472">LANG-472</a> - RandomUtils.nextLong() was returning only even numbers. Fans of Java-based roulette wheels can breathe a sigh of relief. </li>
-</ul>
-</section>
-
-<section name="So long, farewell...">
-<p>Hopefully that was all of interest. Don't forget to download <a href="http://commons.apache.org/lang/download_lang.cgi">Lang 2.5</a>, or, for the Maven repository users, upgrade your &lt;version&gt; tag to 2.5. Please feel free to raise any questions you might have on the <a href="mail-lists.html">mailing lists</a>, and report bugs or enhancements in the <a href="issue-tracking.html">issue tracker</a>.</p>
-</section>
-
-</section>
-
-</body>
-</document>
diff --git a/lang/src/site/xdoc/article3_0.xml b/lang/src/site/xdoc/article3_0.xml
deleted file mode 100644
index 7dad930..0000000
--- a/lang/src/site/xdoc/article3_0.xml
+++ /dev/null
@@ -1,208 +0,0 @@
-<?xml version="1.0"?>
-<!--
-Licensed to the Apache Software Foundation (ASF) under one or more
-contributor license agreements.  See the NOTICE file distributed with
-this work for additional information regarding copyright ownership.
-The ASF licenses this file to You under the Apache License, Version 2.0
-(the "License"); you may not use this file except in compliance with
-the License.  You may obtain a copy of the License at
-
-     http://www.apache.org/licenses/LICENSE-2.0
-
-Unless required by applicable law or agreed to in writing, software
-distributed under the License is distributed on an "AS IS" BASIS,
-WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-See the License for the specific language governing permissions and
-limitations under the License.
--->
-<document>
- <properties>
-  <title>What's new in Commons Lang 3.0?</title>
-  <author email="dev@commons.apache.org">Commons Documentation Team</author>
- </properties>
-<body>
-
-<section name="What's new in Commons Lang 3.0?">
-<p>Commons Lang 3.0 is out, and the obvious question is: <em>"So what? What's changed?"</em>.</p>
-<section name="The big story">
-<p>Lang is now Java 5 based. We've generified the API, moved certain APIs to support <code>varargs</code> and thrown out any features 
-that are now supported by Java itself. We've removed the deprecated parts of the API and have also removed some features that 
-were deemed weak or unnecessary. All of this means that Lang 3.0 is not backwards compatible. </p>
-<p>To that end we have changed the package name, allowing Lang 3.0 to sit side-by-side with your previous version of Lang without any bad side effects. The new package name is the exciting and original <code>org.apache.commons.lang3</code>. This also forces you to recompile your code, making sure the compiler can let you know if a backwards incompatibility affects you. </p>
-<p>As you'd expect, there are also new features, enhancements and bugs fixed. </p>
-</section>
-<!--
-<section name="The build">
-<p>We built 3.0 using Maven 2.2.1 and Java 1.5. <strong>Needs confirmation before release of actual build details</strong></p>
-</section>
--->
-<section name="Migrating from 2.x">
-<h3>Java code</h3>
-<p>Despite the label of backwards incompatibility, in the vast majority of cases the simple addition of a <code>'3'</code> to an import statement will suffice for your migration. </p><br/>
-<p>Change: <code>import org.apache.commons.lang</code> -&gt; <code>import org.apache.commons.lang3</code></p>
-<h3>Maven</h3>
-<p><code>groupId</code>: <code>commons-lang</code> -&gt; <code>org.apache.commons</code></p>
-<p><code>artifactId</code>: <code>commons-lang</code> -&gt; <code>commons-lang3</code></p>
-</section>
-
-<section name="What's gone?">
-<h3>Enum package</h3>
-<p>Java 5 provided enums out of the box, therefore we dispensed with both the deprecated enum package, 
-and the enums package. Instead you should migrate over to the standard Java enum. An EnumUtils class has been born 
-from the ashes of the old code, focused on providing additional functionality to the standard Java enum API. </p>
-<h3>NestedExceptions</h3>
-<p>In Java 1.4, the notion that all Throwables could be linked to a cause was introduced. In Lang we 
-had provided a NestedException framework to support the same feature, and now that we're jumping from Java 1.3 to 
-Java 5 we are remove this feature. The deprecation section below covers one part of ExceptionUtils that remains until 
-we are on Java 6, where the last remaining parts of the JDK appear to have embraced the new cause API. </p>
-<h3>JVMRandom</h3>
-<p>This class was introduced in Lang 2.0 to support a Random object built around the system seed. This 
-proved to be both an uncommon use case and one with bugs and so was dropped. </p>
-<h3>StringEscapeUtils.escapeSql</h3>
-<p>This was a misleading method, only handling the simplest of possible SQL cases. As SQL is not Lang's focus, it didn't make sense to maintain this method. </p>
-<h3>*Exceptions removed</h3>
-<p>Various Exception classes were removed - the lesson in defining more semantically relevant exception classes is that you can keep on coming up with more and more new classes. Simpler to focus on using the main JDK classes. </p>
-<h3>math.*Range</h3>
-<p>The various Range classes in the <code>math</code> package were removed in favour of a new generic Range class. </p>
-<h3>Previous Deprecations</h3>
-<p>All deprecated fields/methods/classes - with a new major version, all of the previously deprecated parts of the API could finally go away. </p>
-<p>If you feel that something was unfairly taken away, please feel free to contact the list. In many cases the possibility exists to reintroduce code. </p>
-</section>
-<section name="Deprecations">
-<p>The lone deprecation in 3.0 is that of the notion of 'cause method names' in ExceptionUtils. In Java 5.0 it is still just about 
-needed to handle some JDK classes that have not been migrated to the getCause API. In Java 6.0 things appear to be resolved and 
-we will remove the related methods in Lang 4.0. </p>
-</section>
-<section name="New packages">
-<p>Two new packages have shown up. org.apache.commons.lang3.concurrent, which unsurprisingly provides support classes for 
-multi-threaded programming, and org.apache.commons.lang3.text.translate, which provides a pluggable API for text transformation. </p>
-
-<h3>concurrent.*</h3>
-<p>Java 1.5 adds a great bunch of functionality related to multi-threaded programming
-below the <code>java.util.concurrent</code> package. Commons Lang 3.0 provides
-some additional classes in this area which are intended to further simplify the
-development of concurrent applications.</p>
-<p>The classes located in the <code>concurrent</code> package can be roughly
-divided into the following categories:
-<ul>
-<li>Utility classes</li>
-<li>Initializer classes</li>
-</ul>
-</p>
-<p>Classes of the former category provide some basic functionality a developer
-typically has to implement manually again and again. Examples are a configurable
-<code>ThreadFactory</code> implementation or utility methods for the handling of
-<code>ExecutionException</code>s thrown by Java's executor service framework.</p>
-<p>Initializer classes deal with the creation of objects in a multi-threaded
-environment. There are several variants of initializer implementations serving
-different purposes. For instance, there are a couple of concrete initializers
-supporting lazy initialization of objects in a safe way. Another example is
-<code>BackgroundInitializer</code> which allows pushing the creation of an
-expensive object to a background thread while the application can continue with
-the execution of other tasks. Here is an example of the usage of <code>BackgroundInitializer</code>
-which creates an <code>EntityManagerFactory</code> object:</p>
-<pre>
-    public class DBInitializer extends BackgroundInitialize&lt;EntityManagerFactory&gt; {
-        protected EntityManagerFactory initialize() {
-            return Persistence.createEntityManagerFactory(&quot;mypersistenceunit&quot;);
-        }
-    }
-</pre>
-<p>An application creates an instance of the <code>DBInitializer</code> class
-and calls its <code>start()</code> method. When it later needs access to the
-<code>EntityManagerFactory</code> created by the initializer it calls the
-<code>get()</code> method; <code>get()</code> returns the object produced by the
-initializer if it is already available or blocks if necessary until initialization
-is complete. Alternatively a convenience method of the <code>ConcurrentUtils</code>
-class can be used to obtain the object from the initializer which hides the
-checked exception declared by <code>get()</code>:</p>
-<pre>
-    DBInitializer init = new DBInitializer();
-    init.start();
-
-    // now do some other stuff
-
-    EntityManagerFactory factory = ConcurrentUtils.initializeUnchecked(init);
-</pre>
-<p>Comprehensive documentation about the <code>concurrent</code> package is
-available in the <a href="userguide.html#lang.concurrent.">user guide</a>.</p>
-<h3>text.translate.*</h3>
-<p>A common complaint with StringEscapeUtils was that its escapeXml and escapeHtml methods should not be escaping non-ASCII characters. We agreed and made the change while creating a modular approach to let users define their own escaping constructs. </p>
-<p>The simplest way to show this is to look at the code that implements escapeXml:</p>
-<pre>
-    return ESCAPE_XML.translate(input);
-</pre>
-<p>Very simple. Maybe a bit too very simple, let's look a bit deeper. </p>
-<pre>
-    public static final CharSequenceTranslator ESCAPE_XML =
-        new AggregateTranslator(
-            new LookupTranslator(EntityArrays.BASIC_ESCAPE()),
-            new LookupTranslator(EntityArrays.APOS_ESCAPE())
-        );
-</pre>
-<p>Here we see that <code>ESCAPE_XML</code> is a '<code>CharSequenceTranslator</code>', which in turn is made up of two lookup translators based on the basic XML escapes and another to escape apostrophes. This shows one way to combine translators. Another can be shown by looking at the example to achieve the old XML escaping functionality (escaping non-ASCII): </p>
-<pre>
-          StringEscapeUtils.ESCAPE_XML.with( NumericEntityEscaper.between(0x7f, Integer.MAX_VALUE) );
-</pre>
-<p>That takes the standard Commons Lang provided escape functionality, and adds on another translation layer. Another JIRA requested option was to also escape non-printable ASCII, this is now achievable with a modification of the above: </p>
-<pre>
-          StringEscapeUtils.ESCAPE_XML.with(
-              new AggregateTranslator(
-                  NumericEntityEscaper.between(0, 31),
-                  NumericEntityEscaper.between(0x80, Integer.MAX_VALUE)
-              )
-          )
-</pre>
-<p>You can also implement your own translators (be they for escaping, unescaping or some aspect of your own). See the <code>CharSequenceTranslator</code> and its <code>CodePointTranslator</code> helper subclass for details - primarily a case of implementing the translate(CharSequence, int, Writer);int method. </p>
-</section>
-<section name="New classes + methods">
-<p>There are many new classes and methods in Lang 3.0 - the most complete way to see the changes is via this <a href="lang2-lang3-clirr-report.html">Lang2 to Lang3 Clirr report</a>. </p>
-<p>Here is a summary of the new classes: </p>
-<ul>
-<li><code>AnnotationUtils</code></li>
-<li><code>CharSequenceUtils</code></li>
-<li><code>EnumUtils</code></li>
-<li><code>JavaVersion</code> - used in SystemUtils</li>
-<li><code>Pair, ImmutablePair and MutablePair</code></li>
-<li><code>Range</code> - replaces the old math.*Range classes</li>
-<li><code>builder.Builder</code></li>
-<li><code>exception.ContextedException</code></li>
-<li><code>exception.CloneFailedException</code></li>
-<li><code>reflect.ConstructorUtils</code></li>
-<li><code>reflect.FieldUtils</code></li>
-<li><code>reflect.MethodUtils</code></li>
-<li><code>reflect.TypeUtils</code></li>
-<li><code>text.WordUtils</code></li>
-</ul>
-</section>
-
-<section name="Bugfixes?">
-<p>See the <a href="changes-report.html#3.0">3.0 changes report</a> for the list of fixed bugs and other enhancements. </p>
-</section>
-
-<section name="Other Notable Changes">
-<ul>
-<li>StringUtils.isAlpha, isNumeric and isAlphanumeric now all return false when passed an empty String. Previously they returned true. </li>
-<li>SystemUtils.isJavaVersionAtLeast now relies on the <code>java.specification.version</code> and not the <code>java.version</code> System property. </li>
-<li>StringEscapeUtils.escapeXml and escapeHtml no longer escape high value Unicode characters by default. The text.translate package is available to recreate the old behaviour. </li>
-<li>Validate utility methods have been changed and genericized to return the
-validated argument where possible, to allow for inline use. </li>
-<li>Validate utility methods handle validity violations arising from
-<code>null</code> values by throwing <code>NullPointerException</code>s.
-This better aligns with standard JDK behavior (lang <em>is</em> intended to
-complement <code>java.lang</code>, after all). Users upgrading from v2.x may
-need to adjust to this change. See <code>Validate#isTrue()</code> for a
-general-purpose mechanism to raise an <code>IllegalArgumentException</code>.</li>
-</ul>
-</section>
-
-<!--
-<section name="What next???"> TODO: Add Beta info.
-<p>Hopefully that was all of interest. Don't forget to download <a href="http://commons.apache.org/lang/download_lang.cgi">Lang 3.0</a>, or, for the Maven repository users, upgrade your &lt;version&gt; tag to 3.0 and your groupId to org.apache.commons. Please feel free to raise any questions you might have on the <a href="mail-lists.html">mailing lists</a>, and report bugs or enhancements in the <a href="issue-tracking.html">issue tracker</a>.</p>
-</section>
--->
-
-</section>
-
-</body>
-</document>
diff --git a/lang/src/site/xdoc/building.xml b/lang/src/site/xdoc/building.xml
deleted file mode 100644
index cf80c64..0000000
--- a/lang/src/site/xdoc/building.xml
+++ /dev/null
@@ -1,73 +0,0 @@
-<?xml version="1.0"?>
-<!--
-Licensed to the Apache Software Foundation (ASF) under one or more
-contributor license agreements.  See the NOTICE file distributed with
-this work for additional information regarding copyright ownership.
-The ASF licenses this file to You under the Apache License, Version 2.0
-(the "License"); you may not use this file except in compliance with
-the License.  You may obtain a copy of the License at
-
-     http://www.apache.org/licenses/LICENSE-2.0
-
-Unless required by applicable law or agreed to in writing, software
-distributed under the License is distributed on an "AS IS" BASIS,
-WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-See the License for the specific language governing permissions and
-limitations under the License.
--->
-<document>
- <properties>
-  <title>Building</title>
-  <author email="dev@commons.apache.org">Commons Documentation Team</author>
- </properties>
-<body>
-<!-- ================================================== -->
-<section name="Overview">
-<p>
-  Commons Lang uses <a href="http://maven.apache.org">Maven</a> or
-  <a href="http://ant.apache.org">Ant</a> as a build system.
-</p>
-<p>
-  You may also be interested in the upgrade notes:
-</p>
-<ul>
-  <li>Upgrade from 2.6 to 3.0 - <a href="upgradeto3_0.html">Lang 3.0 Release Notes</a></li>
-  <li>Upgrade from 2.5 to 2.6 - <a href="upgradeto2_6.html">Lang 2.6 Release Notes</a></li>
-  <li>Upgrade from 2.4 to 2.5 - <a href="upgradeto2_5.html">Lang 2.5 Release Notes</a></li>
-  <li>Upgrade from 2.3 to 2.4 - <a href="upgradeto2_4.html">Lang 2.4 Release Notes</a></li>
-  <li>Upgrade from 2.2 to 2.3 - <a href="upgradeto2_3.html">Lang 2.3 Release Notes</a></li>
-  <li>Upgrade from 2.1 to 2.2 - <a href="upgradeto2_2.html">Lang 2.2 Release Notes</a></li>
-  <li>Upgrade from 2.0 to 2.1 - <a href="upgradeto2_1.html">Lang 2.1 Release Notes</a></li>
-  <li>Upgrade from 1.0 to 2.0 - <a href="upgradeto2_0.html">Lang 2.0 Release Notes</a></li>
-</ul>
-</section>
-<!-- ================================================== -->
-<section name="Maven Goals">
-  <p>
-    To build a jar file, change into the root directory of Lang and run "mvn package".
-    The result will be in the "target" subdirectory.
-  </p>
-  <p>
-    To build the full website, run "mvn site".
-    The result will be in "target/site".
-    You must be online to successfully complete this target.
-  </p>
-  <p>
-    Further details can be found in the
-    <a href="http://commons.apache.org/building.html">commons build instructions</a>.
-  </p>
-</section>
-<!-- ================================================== -->
-<section name="Ant Goals">
-  <p>
-    To build a jar file, change into the root directory of Lang and run "ant jar".
-    The result will be in the "target" subdirectory.
-  </p>
-  <p>
-    To build the Javadocs, run "ant javadoc".
-    The result will be in "target/docs/api".
-  </p>
-</section>
-<!-- ================================================== -->
-</body>
-</document>
diff --git a/lang/src/site/xdoc/developerguide.xml b/lang/src/site/xdoc/developerguide.xml
deleted file mode 100644
index 645e65a..0000000
--- a/lang/src/site/xdoc/developerguide.xml
+++ /dev/null
@@ -1,151 +0,0 @@
-<!--
-Licensed to the Apache Software Foundation (ASF) under one or more
-contributor license agreements.  See the NOTICE file distributed with
-this work for additional information regarding copyright ownership.
-The ASF licenses this file to You under the Apache License, Version 2.0
-(the "License"); you may not use this file except in compliance with
-the License.  You may obtain a copy of the License at
-
-     http://www.apache.org/licenses/LICENSE-2.0
-
-Unless required by applicable law or agreed to in writing, software
-distributed under the License is distributed on an "AS IS" BASIS,
-WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-See the License for the specific language governing permissions and
-limitations under the License.
--->
-<document>
-<properties>
-<title>Developer guide for Commons "Lang"</title>
-</properties>
-<body>
-
-<!-- $Id$ -->
-
-<section name='Developer guide for Commons "Lang"'>
-
-<h1>The Commons <em>Lang</em> Package</h1>
-<h2>Developers Guide</h2>
-<br />
-<a href="#Introduction">[Introduction]</a>
-<a href="#PackageStructure">[Package Structure]</a>
-<a href="#UtilityClasses">[Utility Classes]</a>
-<a href="#Javadoc">[Javadoc]</a>
-<a href="#Building">[Building]</a>
-<br /><br />
-
-<a name="Introduction"></a>
-<h3>1.  INTRODUCTION</h3>
-
-<p>The <em>Lang</em> package contains a set of Java classes that extend
-the basic JDK classes. This developer guide seeks to set
-out rules for the naming of classes and methods within the package. The purpose
-of this, as with all naming standards, is to improve the coherency and
-consistency of the whole API.</p>
-
-<p>The philosophy of the naming standards is to follow those of the JDK
-if possible.</p>
-
-
-
-<a name="PackageStructure"></a>
-<h3>2.  PACKAGE STRUCTURE</h3>
-
-<p>The main package for Lang is <code>org.apache.commons.lang3</code>. Subpackages should
-be created for each group of related items. </p>
-
-<p>Each package should have a <code>package.html</code> file for javadoc. This should
-describe the use of the package and its scope.</p>
-
-
-
-<a name="UtilityClasses"></a>
-<h3>3.  UTILITY CLASSES</h3>
-
-<p>Utility classes provide additional functionality around a class or interface.
-Examples include StringUtils and SerializationUtils.</p>
-
-<p>Each class shall follow the naming pattern XxxUtils where Xxx relates to the
-class or interface that the utility services. Variations on a theme (<code>Integer</code>
-as opposed to <code>Number</code>) should be dealt with in one Utils class where possible.
-Each Utils class shall:</p>
-
-<ul>
-<li>be a single, static method based, class</li>
-<li>have a name consisting of the interface name plus 'Utils'</li>
-<li>deal with one class or interface and its variations (subclasses)</li>
-<li>provide methods that perform useful utility functions</li>
-<li>the class will not be final</li>
-<li>for null parameters, rather than throwing an Exception, consider performing a Null patterned concept, such as returning 0 or ""</li>
-</ul>
-
-<p>A utility class can act as a factory for specific implementations of a class or 
-interface. In such cases the implementations should be non-public, static, inner classes
-of the utility class. However, if warranted due to maintenance or other reasons, these
-decorator classes may be moved to top-level classes in a subpackage.  The
-naming of such a subpackage should be discussed and agreed upon on the
-developers mailing list.</p>
-
-<p>If different overloaded variants of a method are desired, with the same method signature, it should not be indicated via a boolean argument, but via a more focused method name. Rather than replace(boolean repeat), replace and replaceAll, or replaceOnce and replace. </p>
-
-
-<a name="Javadoc"></a>
-<h3>4.  JAVADOC</h3>
-
-<p>The Sun javadoc guidelines are the starting point for Lang. These points are 
-an extension to make it easier for users reading the generated 
-docs and developers with javadoc-popup capabilities from within their IDE.</p>
-
-<h4>General</h4>
-<p>References to other objects, interfaces or methods use the @link-tag the 
-first time it is referenced in a class or interface. On the following 
-references always enclose it inside &lt;code&gt;&lt;/code&gt;.</p>
-
-<p>References to <code>null</code>, <code>this</code>, <code>long</code>,
-<code>int</code>, <code>short</code>, <code>char</code>, <code>byte</code>,
-<code>double</code>, <code>float</code> and <code>boolean</code> should be enclosed
-in &lt;code&gt;&lt;/code&gt;.</p>
-
-<h4>Classes/Interfaces/Methods</h4>
-<p>Use a short description of what the class/interface/method is used for, 
-enclose with &lt;p&gt;&lt;/p&gt;.</p>
-
-<p>A longer description about what the class/interface/method is used for 
-and if it is needed how it is done. If it is necessary include 
-description of the parameters, what they are used for and how. Enclose 
-with &lt;p&gt;&lt;/p&gt; where it is needed, try to divide into smaller parts (not 
-to small!) to enhance readability of the generated Javadoc.</p>
-
-<p>If an example is needed enclose it with &lt;pre&gt;&lt;/pre&gt;.
-It should be supported with an explanation within a normal paragraph.</p>
-
-<h4>Exception throwing</h4>
-<p>When throwing an exception to indicate a bad argument, always try to throw 
-IllegalArgumentException, even if the argument was null. Do not throw 
-NullPointerException. (Obviously, you should document what the code actually does!)</p>
-
-<h4>Deprecations</h4>
-<p>When deprecating a method or class include a clear reference to when the method will be deleted.
-This should be of the form 'Method will be removed in Commons Lang 3.0.'. </p>
-
-<h4>Language used in code/comments</h4>
-<p>It has been decided to casually standardize on US-English.
-To avoid misplaced jeers of 'americanisation', the people making this decision largely write in non-US-English.
-However, it's not something to get worked up about.  Lots of spelling differences will creep in all over.</p>
-
-<a name="Building"></a>
-<h3>5.BUILDING</h3>
-<h4>Building a Release</h4>
-<p>
-The currently targeted version of Java is 1.6. 
-</p>
-<p>
-To build Lang:
-<table>
-<tr><th></th><th>Tested JAR</th><th>Distribution</th><th>Site</th></tr>
-<tr><td>Maven 2.x</td><td><code>mvn package</code></td><td>mvn assembly:assembly</td><td>mvn site</td></tr>
-</table>
-</p>
-</section>
-</body>
-</document>
diff --git a/lang/src/site/xdoc/download_lang.xml b/lang/src/site/xdoc/download_lang.xml
deleted file mode 100644
index d9d686e..0000000
--- a/lang/src/site/xdoc/download_lang.xml
+++ /dev/null
@@ -1,168 +0,0 @@
-<?xml version="1.0"?>
-<!--
-Licensed to the Apache Software Foundation (ASF) under one or more
-contributor license agreements.  See the NOTICE file distributed with
-this work for additional information regarding copyright ownership.
-The ASF licenses this file to You under the Apache License, Version 2.0
-(the "License"); you may not use this file except in compliance with
-the License.  You may obtain a copy of the License at
-
-     http://www.apache.org/licenses/LICENSE-2.0
-
-Unless required by applicable law or agreed to in writing, software
-distributed under the License is distributed on an "AS IS" BASIS,
-WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-See the License for the specific language governing permissions and
-limitations under the License.
--->
-<!--
- +======================================================================+
- |****                                                              ****|
- |****      THIS FILE IS GENERATED BY THE COMMONS BUILD PLUGIN      ****|
- |****                    DO NOT EDIT DIRECTLY                      ****|
- |****                                                              ****|
- +======================================================================+
- | TEMPLATE FILE: download-page-template.xml                            |
- | commons-build-plugin/trunk/src/main/resources/commons-xdoc-templates |
- +======================================================================+
- |                                                                      |
- | 1) Re-generate using: mvn commons:download-page                      |
- |                                                                      |
- | 2) Set the following properties in the component's pom:              |
- |    - commons.componentid (required, alphabetic, lower case)          |
- |    - commons.release.version (required)                              |
- |    - commons.binary.suffix (optional)                                |
- |      (defaults to "-bin", set to "" for pre-maven2 releases)         |
- |                                                                      |
- | 3) Example Properties                                                |
- |                                                                      |
- |  <properties>                                                        |
- |    <commons.componentid>math</commons.componentid>                   |
- |    <commons.release.version>1.2</commons.release.version>            |
- |  </properties>                                                       |
- |                                                                      |
- +======================================================================+
--->
-<document>
-  <properties>
-    <title>Download Apache Commons Lang</title>
-    <author email="dev@commons.apache.org">Commons Documentation Team</author>
-  </properties>
-  <body>
-    <section name="Download Apache Commons Lang">
-    <subsection name="Using a Mirror">
-      <p>
-        We recommend you use a mirror to download our release
-        builds, but you <strong>must</strong> verify the integrity of
-        the downloaded files using signatures downloaded from our main
-        distribution directories. Recent releases (48 hours) may not yet
-        be available from the mirrors.
-      </p>
-
-      <p>
-        You are currently using <b>[preferred]</b>.  If you
-        encounter a problem with this mirror, please select another
-        mirror.  If all mirrors are failing, there are <i>backup</i>
-        mirrors (at the end of the mirrors list) that should be
-        available.
-        <br></br>
-        [if-any logo]<a href="[link]"><img align="right" src="[logo]" border="0"></img></a>[end]
-      </p>
-
-      <form action="[location]" method="get" id="SelectMirror">
-        <p>
-          Other mirrors:
-          <select name="Preferred">
-          [if-any http]
-            [for http]<option value="[http]">[http]</option>[end]
-          [end]
-          [if-any ftp]
-            [for ftp]<option value="[ftp]">[ftp]</option>[end]
-          [end]
-          [if-any backup]
-            [for backup]<option value="[backup]">[backup] (backup)</option>[end]
-          [end]
-          </select>
-          <input type="submit" value="Change"></input>
-        </p>
-      </form>
-
-      <p>
-        The <a href="http://www.apache.org/dist/commons/KEYS">KEYS</a>
-        link links to the code signing keys used to sign the product.
-        The <code>PGP</code> link downloads the OpenPGP compatible signature from our main site.
-        The <code>MD5</code> link downloads the checksum from the main site.
-      </p>
-    </subsection>
-    </section>
-    <section name="Apache Commons Lang 3.4 (Java 6.0+)">
-      <subsection name="Binaries">
-        <table>
-          <tr>
-              <td><a href="[preferred]/commons/lang/binaries/commons-lang3-3.4-bin.tar.gz">commons-lang3-3.4-bin.tar.gz</a></td>
-              <td><a href="http://www.apache.org/dist/commons/lang/binaries/commons-lang3-3.4-bin.tar.gz.md5">md5</a></td>
-              <td><a href="http://www.apache.org/dist/commons/lang/binaries/commons-lang3-3.4-bin.tar.gz.asc">pgp</a></td>
-          </tr>
-          <tr>
-              <td><a href="[preferred]/commons/lang/binaries/commons-lang3-3.4-bin.zip">commons-lang3-3.4-bin.zip</a></td>
-              <td><a href="http://www.apache.org/dist/commons/lang/binaries/commons-lang3-3.4-bin.zip.md5">md5</a></td>
-              <td><a href="http://www.apache.org/dist/commons/lang/binaries/commons-lang3-3.4-bin.zip.asc">pgp</a></td>
-          </tr>
-        </table>
-      </subsection>
-      <subsection name="Source">
-        <table>
-          <tr>
-              <td><a href="[preferred]/commons/lang/source/commons-lang3-3.4-src.tar.gz">commons-lang3-3.4-src.tar.gz</a></td>
-              <td><a href="http://www.apache.org/dist/commons/lang/source/commons-lang3-3.4-src.tar.gz.md5">md5</a></td>
-              <td><a href="http://www.apache.org/dist/commons/lang/source/commons-lang3-3.4-src.tar.gz.asc">pgp</a></td>
-          </tr>
-          <tr>
-              <td><a href="[preferred]/commons/lang/source/commons-lang3-3.4-src.zip">commons-lang3-3.4-src.zip</a></td>
-              <td><a href="http://www.apache.org/dist/commons/lang/source/commons-lang3-3.4-src.zip.md5">md5</a></td>
-              <td><a href="http://www.apache.org/dist/commons/lang/source/commons-lang3-3.4-src.zip.asc">pgp</a></td>
-          </tr>
-        </table>
-      </subsection>
-    </section>
-    <section name="Apache Commons Lang 2.6 (Requires Java 1.2 or later)">
-      <subsection name="Binaries">
-        <table>
-          <tr>
-              <td><a href="[preferred]/commons/lang/binaries/commons-lang-2.6-bin.tar.gz">commons-lang-2.6-bin.tar.gz</a></td>
-              <td><a href="http://www.apache.org/dist/commons/lang/binaries/commons-lang-2.6-bin.tar.gz.md5">md5</a></td>
-              <td><a href="http://www.apache.org/dist/commons/lang/binaries/commons-lang-2.6-bin.tar.gz.asc">pgp</a></td>
-          </tr>
-          <tr>
-              <td><a href="[preferred]/commons/lang/binaries/commons-lang-2.6-bin.zip">commons-lang-2.6-bin.zip</a></td>
-              <td><a href="http://www.apache.org/dist/commons/lang/binaries/commons-lang-2.6-bin.zip.md5">md5</a></td>
-              <td><a href="http://www.apache.org/dist/commons/lang/binaries/commons-lang-2.6-bin.zip.asc">pgp</a></td>
-          </tr>
-        </table>
-      </subsection>
-      <subsection name="Source">
-        <table>
-          <tr>
-              <td><a href="[preferred]/commons/lang/source/commons-lang-2.6-src.tar.gz">commons-lang-2.6-src.tar.gz</a></td>
-              <td><a href="http://www.apache.org/dist/commons/lang/source/commons-lang-2.6-src.tar.gz.md5">md5</a></td>
-              <td><a href="http://www.apache.org/dist/commons/lang/source/commons-lang-2.6-src.tar.gz.asc">pgp</a></td>
-          </tr>
-          <tr>
-              <td><a href="[preferred]/commons/lang/source/commons-lang-2.6-src.zip">commons-lang-2.6-src.zip</a></td>
-              <td><a href="http://www.apache.org/dist/commons/lang/source/commons-lang-2.6-src.zip.md5">md5</a></td>
-              <td><a href="http://www.apache.org/dist/commons/lang/source/commons-lang-2.6-src.zip.asc">pgp</a></td>
-          </tr>
-        </table>
-      </subsection>
-    </section>
-    <section name="Archives">
-        <p>
-          Older releases can be obtained from the archives.
-        </p>
-        <ul>
-          <li class="download"><a href="[preferred]/commons/lang/">browse download area</a></li>
-          <li><a href="http://archive.apache.org/dist/commons/lang/">archives...</a></li>
-        </ul>
-    </section>
-  </body>
-</document>
diff --git a/lang/src/site/xdoc/index.xml b/lang/src/site/xdoc/index.xml
deleted file mode 100644
index 79cb8dd..0000000
--- a/lang/src/site/xdoc/index.xml
+++ /dev/null
@@ -1,115 +0,0 @@
-<?xml version="1.0"?>
-<!--
-Licensed to the Apache Software Foundation (ASF) under one or more
-contributor license agreements.  See the NOTICE file distributed with
-this work for additional information regarding copyright ownership.
-The ASF licenses this file to You under the Apache License, Version 2.0
-(the "License"); you may not use this file except in compliance with
-the License.  You may obtain a copy of the License at
-
-     http://www.apache.org/licenses/LICENSE-2.0
-
-Unless required by applicable law or agreed to in writing, software
-distributed under the License is distributed on an "AS IS" BASIS,
-WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-See the License for the specific language governing permissions and
-limitations under the License.
--->
-<document>
- <properties>
-  <title>Home</title>
-  <author email="dev@commons.apache.org">Commons Documentation Team</author>
- </properties>
-<body>
-<!-- ================================================== -->
-<section name="Commons Lang">
-
-<p>
-The standard Java libraries fail to provide enough methods for
-manipulation of its core classes. Apache Commons Lang provides
-these extra methods.
-</p>
-
-<p>
-Lang provides a host of helper utilities for the java.lang API, notably
-String manipulation methods, basic numerical methods, object reflection, concurrency, creation and serialization
-and System properties. Additionally it contains basic enhancements to java.util.Date and a series of utilities dedicated to help with
-building methods, such as hashCode, toString and equals.
-</p>
-<p>
-Note that Lang 3.0 (and subsequent versions) use a different package (<em>org.apache.commons.lang3</em>) than the previous versions (<em>org.apache.commons.lang</em>), allowing it to be used at the same time as an earlier version.
-</p>
-</section>
-<!-- ================================================== -->
-<section name="Documentation">
-<p>
-The package descriptions in the <a href="javadocs/api-release/index.html">JavaDoc</a> give an overview of the available features
-and various <a href="project-reports.html">project reports</a> are provided.
-</p>
-<p>
-The JavaDoc API documents are available online:
-</p>
-<ul>
-<li>The <a href="javadocs/api-3.4/index.html">current stable release 3.4</a> [Java 6.0+]</li>
-<li>The <a href="javadocs/api-2.6/index.html">legacy release 2.6</a> [Java 1.2+]</li>
-<li>Older releases - see the <a href="release-history.html">Release History</a> page</li>
-</ul>
-<p>
-The <a href="source-repository.html">subversion repository</a> can be
-<a href="http://svn.apache.org/viewvc/commons/proper/lang/trunk/">browsed</a>, or you can browse/contribute via <a href="https://github.com/apache/commons-lang">GitHub</a>.
-</p>
-<p>
-The code base is monitored by a Sonar instance running on <a href="https://analysis.apache.org/dashboard/index/72046">analysis.apache.org</a>.
-</p>
-</section>
-<!-- ================================================== -->
-<section name="Release Information">
-<p>The latest stable release of Lang is 3.4. You may: </p>
-<ul>
-<li>Download <a href="http://commons.apache.org/lang/download_lang.cgi">3.4</a></li>
-<li>Read the <a href="release-notes/RELEASE-NOTES-3.4.txt">3.4 release notes</a></li>
-<li>Examine the <a href="article3_0.html">2.x to 3.0 upgrade notes</a></li>
-<li>Compare major versions via the <a href="lang2-lang3-clirr-report.html">Lang2 to Lang3 Clirr report</a></li>
-</ul>
-<p>
-Alternatively you can pull it from the central Maven repositories:
-<pre>
-  &lt;groupId&gt;org.apache.commons&lt;/groupId&gt;
-  &lt;artifactId&gt;commons-lang3&lt;/artifactId&gt;
-  &lt;version&gt;3.4&lt;/version&gt;
-</pre>
-</p>
-
-<p>
-For information on previous releases see the <a href="release-history.html">Release History</a>, and to download previous releases see the <a href="http://archive.apache.org/dist/commons/lang/">Commons Lang Archive</a>.
-</p>
-</section>
-<!-- ================================================== -->
-<section name="Getting Involved">
-<p>
-The <a href="mail-lists.html">commons developer mailing list</a> is the main channel of communication for contributors. Please remember that the lists are shared between all commons components, so prefix your email by [lang]. </p>
-<p>You can also visit the #apache-commons IRC channel on irc.freenode.net or peruse <a href="issue-tracking.html">JIRA</a>. Specific links of interest for JIRA are:</p>
-<ul>
-<li>Ideas looking for code: <a href="https://issues.apache.org/jira/issues/?jql=project%20%3D%20LANG%20AND%20resolution%20%3D%20Unresolved%20AND%20fixVersion%20%3D%20%22Patch%20Needed%22%20ORDER%20BY%20priority%20DESC">Patch Needed</a></li>
-<li>Issues with patches, looking for reviews: <a href="https://issues.apache.org/jira/issues/?jql=fixVersion%20%3D%20%22Review%20Patch%22%20AND%20project%20%3D%20LANG%20AND%20resolution%20%3D%20Unresolved%20ORDER%20BY%20priority%20DESC">Review Patch</a></li>
-</ul>
-<p>Alternatively you can go through the <em>Needs Work</em> tags in the <a href="taglist.html">TagList report</a>.</p>
-<p>If you'd like to offer up pull requests via GitHub rather than applying patches to JIRA, we have a <a href="https://github.com/apache/commons-lang/">GitHub mirror</a>. </p>
-</section>
-<!-- ================================================== -->
-<section name="Support">
-<p>
-The <a href="mail-lists.html">commons mailing lists</a> act as the main support forum.
-The user list is suitable for most library usage queries.
-The dev list is intended for the development discussion.
-Please remember that the lists are shared between all commons components,
-so prefix your email by [lang].
-</p>
-<p>
-Bug reports and enhancements are also welcomed via the <a href="issue-tracking.html">JIRA</a> issue tracker.
-Please read the instructions carefully.
-</p>
-</section>
-<!-- ================================================== -->
-</body>
-</document>
diff --git a/lang/src/site/xdoc/issue-tracking.xml b/lang/src/site/xdoc/issue-tracking.xml
deleted file mode 100644
index 65c199f..0000000
--- a/lang/src/site/xdoc/issue-tracking.xml
+++ /dev/null
@@ -1,102 +0,0 @@
-<?xml version="1.0"?>
-<!--
-Licensed to the Apache Software Foundation (ASF) under one or more
-contributor license agreements.  See the NOTICE file distributed with
-this work for additional information regarding copyright ownership.
-The ASF licenses this file to You under the Apache License, Version 2.0
-(the "License"); you may not use this file except in compliance with
-the License.  You may obtain a copy of the License at
-
-     http://www.apache.org/licenses/LICENSE-2.0
-
-Unless required by applicable law or agreed to in writing, software
-distributed under the License is distributed on an "AS IS" BASIS,
-WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-See the License for the specific language governing permissions and
-limitations under the License.
--->
-<!--
- +======================================================================+
- |****                                                              ****|
- |****      THIS FILE IS GENERATED BY THE COMMONS BUILD PLUGIN      ****|
- |****                    DO NOT EDIT DIRECTLY                      ****|
- |****                                                              ****|
- +======================================================================+
- | TEMPLATE FILE: issue-tracking-template.xml                           |
- | commons-build-plugin/trunk/src/main/resources/commons-xdoc-templates |
- +======================================================================+
- |                                                                      |
- | 1) Re-generate using: mvn commons:jira-page                          |
- |                                                                      |
- | 2) Set the following properties in the component's pom:              |
- |    - commons.jira.id  (required, alphabetic, upper case)             |
- |    - commons.jira.pid (required, numeric)                            |
- |                                                                      |
- | 3) Example Properties                                                |
- |                                                                      |
- |  <properties>                                                        |
- |    <commons.jira.id>MATH</commons.jira.id>                           |
- |    <commons.jira.pid>12310485</commons.jira.pid>                     |
- |  </properties>                                                       |
- |                                                                      |
- +======================================================================+
--->
-<document>
-  <properties>
-    <title>Commons Lang Issue tracking</title>
-    <author email="dev@commons.apache.org">Commons Documentation Team</author>
-  </properties>
-  <body>
-
-    <section name="Commons Lang Issue tracking">
-      <p>
-      Commons Lang uses <a href="http://issues.apache.org/jira/">ASF JIRA</a> for tracking issues.
-      See the <a href="http://issues.apache.org/jira/browse/LANG">Commons Lang JIRA project page</a>.
-      </p>
-
-      <p>
-      To use JIRA you may need to <a href="http://issues.apache.org/jira/secure/Signup!default.jspa">create an account</a>
-      (if you have previously created/updated Commons issues using Bugzilla an account will have been automatically
-      created and you can use the <a href="http://issues.apache.org/jira/secure/ForgotPassword!default.jspa">Forgot Password</a>
-      page to get a new password).
-      </p>
-
-      <p>
-      If you would like to report a bug, or raise an enhancement request with
-      Commons Lang please do the following:
-      <ol>
-        <li><a href="http://issues.apache.org/jira/secure/IssueNavigator.jspa?reset=true&amp;pid=12310481&amp;sorter/field=issuekey&amp;sorter/order=DESC&amp;status=1&amp;status=3&amp;status=4">Search existing open bugs</a>.
-            If you find your issue listed then please add a comment with your details.</li>
-        <li><a href="mail-lists.html">Search the mailing list archive(s)</a>.
-            You may find your issue or idea has already been discussed.</li>
-        <li>Decide if your issue is a bug or an enhancement.</li>
-        <li>Submit either a <a href="http://issues.apache.org/jira/secure/CreateIssueDetails!init.jspa?pid=12310481&amp;issuetype=1&amp;priority=4&amp;assignee=-1">bug report</a>
-            or <a href="http://issues.apache.org/jira/secure/CreateIssueDetails!init.jspa?pid=12310481&amp;issuetype=4&amp;priority=4&amp;assignee=-1">enhancement request</a>.</li>
-      </ol>
-      </p>
-
-      <p>
-      Please also remember these points:
-      <ul>
-        <li>the more information you provide, the better we can help you</li>
-        <li>test cases are vital, particularly for any proposed enhancements</li>
-        <li>the developers of Commons Lang are all unpaid volunteers</li>
-      </ul>
-      </p>
-
-      <p>
-      For more information on subversion and creating patches see the
-      <a href="http://www.apache.org/dev/contributors.html">Apache Contributors Guide</a>.
-      </p>
-
-      <p>
-      You may also find these links useful:
-      <ul>
-        <li><a href="http://issues.apache.org/jira/secure/IssueNavigator.jspa?reset=true&amp;pid=12310481&amp;sorter/field=issuekey&amp;sorter/order=DESC&amp;status=1&amp;status=3&amp;status=4">All Open Commons Lang bugs</a></li>
-        <li><a href="http://issues.apache.org/jira/secure/IssueNavigator.jspa?reset=true&amp;pid=12310481&amp;sorter/field=issuekey&amp;sorter/order=DESC&amp;status=5&amp;status=6">All Resolved Commons Lang bugs</a></li>
-        <li><a href="http://issues.apache.org/jira/secure/IssueNavigator.jspa?reset=true&amp;pid=12310481&amp;sorter/field=issuekey&amp;sorter/order=DESC">All Commons Lang bugs</a></li>
-      </ul>
-      </p>
-    </section>
-  </body>
-</document>
diff --git a/lang/src/site/xdoc/mail-lists.xml b/lang/src/site/xdoc/mail-lists.xml
deleted file mode 100644
index bbd0168..0000000
--- a/lang/src/site/xdoc/mail-lists.xml
+++ /dev/null
@@ -1,202 +0,0 @@
-<?xml version="1.0"?>
-<!--
-Licensed to the Apache Software Foundation (ASF) under one or more
-contributor license agreements.  See the NOTICE file distributed with
-this work for additional information regarding copyright ownership.
-The ASF licenses this file to You under the Apache License, Version 2.0
-(the "License"); you may not use this file except in compliance with
-the License.  You may obtain a copy of the License at
-
-     http://www.apache.org/licenses/LICENSE-2.0
-
-Unless required by applicable law or agreed to in writing, software
-distributed under the License is distributed on an "AS IS" BASIS,
-WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-See the License for the specific language governing permissions and
-limitations under the License.
--->
-<!--
- +======================================================================+
- |****                                                              ****|
- |****      THIS FILE IS GENERATED BY THE COMMONS BUILD PLUGIN      ****|
- |****                    DO NOT EDIT DIRECTLY                      ****|
- |****                                                              ****|
- +======================================================================+
- | TEMPLATE FILE: mail-lists-template.xml                               |
- | commons-build-plugin/trunk/src/main/resources/commons-xdoc-templates |
- +======================================================================+
- |                                                                      |
- | 1) Re-generate using: mvn commons:mail-page                          |
- |                                                                      |
- | 2) Set the following properties in the component's pom:              |
- |    - commons.componentid (required, alphabetic, lower case)          |
- |                                                                      |
- | 3) Example Properties                                                |
- |                                                                      |
- |  <properties>                                                        |
- |    <commons.componentid>math</commons.componentid>                   |
- |  </properties>                                                       |
- |                                                                      |
- +======================================================================+
--->
-<document>
-  <properties>
-    <title>Commons Lang Mailing Lists</title>
-    <author email="dev@commons.apache.org">Commons Documentation Team</author>
-  </properties>
-  <body>
-
-    <section name="Overview">
-      <p>
-        <a href="index.html">Commons Lang</a> shares mailing lists with all the other 
-        <a href="http://commons.apache.org/components.html">Commons Components</a>.
-        To make it easier for people to only read messages related to components they are interested in,
-        the convention in Commons is to prefix the subject line of messages with the component's name,
-        for example:
-        <ul>
-          <li>[lang] Problem with the ...</li>
-        </ul>
-      </p>
-      <p>
-        Questions related to the usage of Commons Lang should be posted to the
-        <a href="http://mail-archives.apache.org/mod_mbox/commons-user/">User List</a>.
-        <br />
-        The <a href="http://mail-archives.apache.org/mod_mbox/commons-dev/">Developer List</a>
-        is for questions and discussion related to the development of Commons Lang.
-        <br />
-        Please do not cross-post; developers are also subscribed to the user list.
-      </p>
-      <p>
-        <strong>Note:</strong> please don't send patches or attachments to any of the mailing lists.
-        Patches are best handled via the <a href="issue-tracking.html">Issue Tracking</a> system. 
-        Otherwise, please upload the file to a public server and include the URL in the mail. 
-      </p>
-    </section>
-
-    <section name="Commons Lang Mailing Lists">
-      <p>
-        <strong>Please prefix the subject line of any messages for <a href="index.html">Commons Lang</a>
-        with <em>[lang]</em></strong> - <em>thanks!</em>
-        <br />
-        <br />
-      </p>
-
-      <table>
-        <tr>
-          <th>Name</th>
-          <th>Subscribe</th>
-          <th>Unsubscribe</th>
-          <th>Post</th>
-          <th>Archive</th>
-          <th>Other Archives</th>
-        </tr>
-
-
-        <tr>
-          <td>
-            <strong>Commons User List</strong>
-            <br /><br />
-            Questions on using Commons Lang.
-            <br /><br />
-          </td>
-          <td><a href="mailto:user-subscribe@commons.apache.org">Subscribe</a></td>
-          <td><a href="mailto:user-unsubscribe@commons.apache.org">Unsubscribe</a></td>
-          <td><a href="mailto:user@commons.apache.org?subject=[lang]">Post</a></td>
-          <td><a href="http://mail-archives.apache.org/mod_mbox/commons-user/">mail-archives.apache.org</a></td>
-          <td><a href="http://markmail.org/list/org.apache.commons.users/">markmail.org</a><br />
-              <a href="http://www.mail-archive.com/user@commons.apache.org/">www.mail-archive.com</a><br />
-              <a href="http://news.gmane.org/gmane.comp.jakarta.commons.devel">news.gmane.org</a>
-          </td>
-        </tr>
-
-
-        <tr>
-          <td>
-            <strong>Commons Developer List</strong>
-            <br /><br />
-            Discussion of development of Commons Lang.
-            <br /><br />
-          </td>
-          <td><a href="mailto:dev-subscribe@commons.apache.org">Subscribe</a></td>
-          <td><a href="mailto:dev-unsubscribe@commons.apache.org">Unsubscribe</a></td>
-          <td><a href="mailto:dev@commons.apache.org?subject=[lang]">Post</a></td>
-          <td><a href="http://mail-archives.apache.org/mod_mbox/commons-dev/">mail-archives.apache.org</a></td>
-          <td><a href="http://markmail.org/list/org.apache.commons.dev/">markmail.org</a><br />
-              <a href="http://www.mail-archive.com/dev@commons.apache.org/">www.mail-archive.com</a><br />
-              <a href="http://news.gmane.org/gmane.comp.jakarta.commons.devel">news.gmane.org</a>
-          </td>
-        </tr>
-
-
-        <tr>
-          <td>
-            <strong>Commons Issues List</strong>
-            <br /><br />
-            Only for e-mails automatically generated by the <a href="issue-tracking.html">issue tracking</a> system.
-            <br /><br />
-          </td>
-          <td><a href="mailto:issues-subscribe@commons.apache.org">Subscribe</a></td>
-          <td><a href="mailto:issues-unsubscribe@commons.apache.org">Unsubscribe</a></td>
-          <td><em>read only</em></td>
-          <td><a href="http://mail-archives.apache.org/mod_mbox/commons-issues/">mail-archives.apache.org</a></td>
-          <td><a href="http://markmail.org/list/org.apache.commons.issues/">markmail.org</a><br />
-              <a href="http://www.mail-archive.com/issues@commons.apache.org/">www.mail-archive.com</a>
-          </td>
-        </tr>
-
-
-        <tr>
-          <td>
-            <strong>Commons Commits List</strong>
-            <br /><br />
-            Only for e-mails automatically generated by the <a href="source-repository.html">source control</a> system.
-            <br /><br />
-          </td>
-          <td><a href="mailto:commits-subscribe@commons.apache.org">Subscribe</a></td>
-          <td><a href="mailto:commits-unsubscribe@commons.apache.org">Unsubscribe</a></td>
-          <td><em>read only</em></td>
-          <td><a href="http://mail-archives.apache.org/mod_mbox/commons-commits/">mail-archives.apache.org</a></td>
-          <td><a href="http://markmail.org/list/org.apache.commons.commits/">markmail.org</a><br />
-              <a href="http://www.mail-archive.com/commits@commons.apache.org/">www.mail-archive.com</a>
-          </td>
-        </tr>
-
-      </table>
-
-    </section>
-    <section name="Apache Mailing Lists">
-      <p>
-        Other mailing lists which you may find useful include:
-      </p>
-
-      <table>
-        <tr>
-          <th>Name</th>
-          <th>Subscribe</th>
-          <th>Unsubscribe</th>
-          <th>Post</th>
-          <th>Archive</th>
-          <th>Other Archives</th>
-        </tr>
-        <tr>
-          <td>
-            <strong>Apache Announce List</strong>
-            <br /><br />
-            General announcements of Apache project releases.
-            <br /><br />
-          </td>
-          <td><a class="externalLink" href="mailto:announce-subscribe@apache.org">Subscribe</a></td> 
-          <td><a class="externalLink" href="mailto:announce-unsubscribe@apache.org">Unsubscribe</a></td> 
-          <td><em>read only</em></td>
-          <td><a class="externalLink" href="http://mail-archives.apache.org/mod_mbox/www-announce/">mail-archives.apache.org</a></td> 
-          <td><a class="externalLink" href="http://markmail.org/list/org.apache.announce/">markmail.org</a><br />
-              <a class="externalLink" href="http://old.nabble.com/Apache-News-and-Announce-f109.html">old.nabble.com</a><br />
-              <a class="externalLink" href="http://www.mail-archive.com/announce@apache.org/">www.mail-archive.com</a><br />
-              <a class="externalLink" href="http://news.gmane.org/gmane.comp.apache.announce">news.gmane.org</a>
-          </td>
-        </tr>
-      </table>
-
-    </section>
-  </body>
-</document>
diff --git a/lang/src/site/xdoc/proposal.xml b/lang/src/site/xdoc/proposal.xml
deleted file mode 100644
index fc9477f..0000000
--- a/lang/src/site/xdoc/proposal.xml
+++ /dev/null
@@ -1,97 +0,0 @@
-<!--
-Licensed to the Apache Software Foundation (ASF) under one or more
-contributor license agreements.  See the NOTICE file distributed with
-this work for additional information regarding copyright ownership.
-The ASF licenses this file to You under the Apache License, Version 2.0
-(the "License"); you may not use this file except in compliance with
-the License.  You may obtain a copy of the License at
-
-     http://www.apache.org/licenses/LICENSE-2.0
-
-Unless required by applicable law or agreed to in writing, software
-distributed under the License is distributed on an "AS IS" BASIS,
-WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-See the License for the specific language governing permissions and
-limitations under the License.
--->
-<document>
-<properties>
-<title>Proposal for Lang Package</title>
-</properties>
-<body>
-
-
-<section name="Proposal for Lang Package">
-
-
-
-<subsection name="(0) Rationale">
-
-<p>The standard Java libraries fail to provide enough methods for 
-manipulation of its main components. The <em>Lang</em> Package provides 
-these extra methods. There are other classes which might justifiably 
-be included in java.lang someday, this package also provides for them.</p>
-
-
-</subsection>
-<subsection name="(1) Scope of the Package">
-
-<p>This proposal is to create a package of Java utility classes for the
-classes that are in java.lang's hierarchy, or are considered to be so 
-standard as to justify existence in java.lang. The <em>Lang</em> Package 
-also applies to primitives and arrays.</p>
-
-
-</subsection>
-<subsection name="(1.5) Interaction With Other Packages">
-
-<p><em>Lang</em> relies only on standard JDK 1.2 (or later) APIs for
-production deployment.  It utilizes the JUnit unit testing framework for
-developing and executing unit tests, but this is of interest only to
-developers of the component.  Lang will be a dependency for
-several existing components in the open source world.</p>
-
-<p>No external configuration files are utilized.</p>
-
-
-</subsection>
-<subsection name="(2) Initial Source of the Package">
-
-<p>The initial classes came from the Commons.Util subproject.</p>
-
-<p>The proposed package name for the new component is
-<code>org.apache.commons.lang</code>.</p>
-
-
-</subsection>
-<subsection name="(3)  Required Jakarta-Commons Resources">
-
-<ul>
-<li>CVS Repository - New directory <code>lang</code> in the
-    <code>jakarta-commons</code> CVS repository.</li>
-<li>Mailing List - Discussions will take place on the general
-    <em>dev@commons.apache.org</em> mailing list.  To help
-    list subscribers identify messages of interest, it is suggested that
-    the message subject of messages about this component be prefixed with
-    [lang].</li>
-<li>Bugzilla - New component "Lang" under the "Commons" product
-    category, with appropriate version identifiers as needed.</li>
-<li>Jyve FAQ - New category "commons-lang" (when available).</li>
-</ul>
-
-
-</subsection>
-<subsection name="(4) Initial Committers">
-
-<p>The initial committers on the Lang component shall be as follows:
-<ul>
-<li>Henri Yandell (bayard)</li>
-<li>Daniel Rall (dlr)</li>
-<li>Stephen Colebourne (scolebourne)</li>
-</ul>
-</p>
-
-</subsection>
-</section>
-</body>
-</document>
diff --git a/lang/src/site/xdoc/release-history.xml b/lang/src/site/xdoc/release-history.xml
deleted file mode 100644
index 3ec995e..0000000
--- a/lang/src/site/xdoc/release-history.xml
+++ /dev/null
@@ -1,53 +0,0 @@
-<?xml version="1.0"?>
-<!--
-Licensed to the Apache Software Foundation (ASF) under one or more
-contributor license agreements.  See the NOTICE file distributed with
-this work for additional information regarding copyright ownership.
-The ASF licenses this file to You under the Apache License, Version 2.0
-(the "License"); you may not use this file except in compliance with
-the License.  You may obtain a copy of the License at
-
-     http://www.apache.org/licenses/LICENSE-2.0
-
-Unless required by applicable law or agreed to in writing, software
-distributed under the License is distributed on an "AS IS" BASIS,
-WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-See the License for the specific language governing permissions and
-limitations under the License.
--->
-<document>
- <properties>
-  <title>Home</title>
-  <author email="dev@commons.apache.org">Commons Documentation Team</author>
- </properties>
-<body>
-<!-- ================================================== -->
-<section name="Commons Lang Release History">
-
-<!-- TODO: Add the Java version for each release -->
-
-<table>
-<tr><th>Version</th><th>Release date</th><th>Javadoc</th><th>Release notes</th></tr>
-<tr><td>3.3.2</td><td>09/Apr/14</td><td><a href="javadocs/api-3.3.2/">api-3.3.2</a></td><td><a href="release-notes/RELEASE-NOTES-3.3.2.txt">release notes for 3.3.2</a></td></tr>
-<tr><td>3.3.1</td><td>18/Mar/14</td><td><a href="javadocs/api-3.3.1/">api-3.3.1</a></td><td><a href="release-notes/RELEASE-NOTES-3.3.1.txt">release notes for 3.3.1</a></td></tr>
-<tr><td>3.3</td><td>04/Mar/14</td><td><a href="javadocs/api-3.3/">api-3.3</a></td><td><a href="release-notes/RELEASE-NOTES-3.3.txt">release notes for 3.3</a></td></tr>
-<tr><td>3.2.1</td><td>05/Jan/14</td><td><a href="javadocs/api-3.2.1/">api-3.2.1</a></td><td><a href="release-notes/RELEASE-NOTES-3.2.1.txt">release notes for 3.2.1</a></td></tr>
-<tr><td>3.2</td><td>01/Jan/14</td><td><a href="javadocs/api-3.2/">api-3.2</a></td><td><a href="release-notes/RELEASE-NOTES-3.2.txt">release notes for 3.2</a></td></tr>
-<tr><td>3.1</td><td>14/Nov/11</td><td><a href="javadocs/api-3.1/">api-3.1</a></td><td><a href="release-notes/RELEASE-NOTES-3.1.txt">release notes for 3.1</a></td></tr>
-<tr><td>3.0.1</td><td>9/Aug/11</td><td><a href="javadocs/api-3.0.1/">api-3.0.1</a></td><td><a href="release-notes/RELEASE-NOTES-3.0.1.txt">release notes for 3.0.1</a></td></tr>
-<tr><td>3.0</td><td>18/Jul/11</td><td><a href="javadocs/api-3.0/">api-3.0</a></td><td><a href="release-notes/RELEASE-NOTES-3.0.txt">release notes for 3.0</a></td></tr>
-<tr><td>2.6</td><td>16/Jan/11</td><td><a href="javadocs/api-2.6/">api-2.6</a></td><td><a href="release-notes/RELEASE-NOTES-2.6.txt">release notes for 2.6</a></td></tr>
-<tr><td>2.5</td><td>23/Feb/10</td><td><a href="javadocs/api-2.5/">api-2.5</a></td><td><a href="release-notes/RELEASE-NOTES-2.5.txt">release notes for 2.5</a></td></tr>
-<tr><td>2.4</td><td>18/Mar/08</td><td><a href="javadocs/api-2.4/">api-2.4</a></td><td><a href="release-notes/RELEASE-NOTES-2.4.txt">release notes for 2.4</a></td></tr>
-<tr><td>2.3</td><td>13/Feb/07</td><td><a href="javadocs/api-2.3/">api-2.3</a></td><td><a href="release-notes/RELEASE-NOTES-2.3.txt">release notes for 2.3</a></td></tr>
-<tr><td>2.2</td><td>04/Oct/06</td><td><a href="javadocs/api-2.2/">api-2.2</a></td><td><a href="release-notes/RELEASE-NOTES-2.2.txt">release notes for 2.2</a></td></tr>
-<tr><td>2.1</td><td>13/Jun/06</td><td><a href="javadocs/api-2.1/">api-2.1</a></td><td><a href="release-notes/RELEASE-NOTES-2.1.txt">release notes for 2.1</a></td></tr>
-<tr><td>2.0</td><td>02/Sep/03</td><td><a href="javadocs/api-2.0/">api-2.0</a></td><td><a href="release-notes/RELEASE-NOTES-2.0.txt">release notes for 2.0</a></td></tr>
-<tr><td>1.0.1</td><td>25/Nov/02</td><td><a href="javadocs/api-1.0.1/">api-1.0.1</a></td><td><a href="release-notes/RELEASE-NOTES-1.0.1.txt">release notes for 1.0.1</a></td></tr>
-<tr><td>1.0</td><td>04/Oct/02</td><td><a href="javadocs/api-1.0/">api-1.0</a></td><td><a href="release-notes/RELEASE-NOTES-1.0.txt">release notes for 1.0</a></td></tr>
-</table>
-
-</section>
-<!-- ================================================== -->
-</body>
-</document>
diff --git a/lang/src/site/xdoc/upgradeto2_0.xml b/lang/src/site/xdoc/upgradeto2_0.xml
deleted file mode 100644
index 10fee35..0000000
--- a/lang/src/site/xdoc/upgradeto2_0.xml
+++ /dev/null
@@ -1,688 +0,0 @@
-<?xml version="1.0"?>
-<!--
-Licensed to the Apache Software Foundation (ASF) under one or more
-contributor license agreements.  See the NOTICE file distributed with
-this work for additional information regarding copyright ownership.
-The ASF licenses this file to You under the Apache License, Version 2.0
-(the "License"); you may not use this file except in compliance with
-the License.  You may obtain a copy of the License at
-
-     http://www.apache.org/licenses/LICENSE-2.0
-
-Unless required by applicable law or agreed to in writing, software
-distributed under the License is distributed on an "AS IS" BASIS,
-WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-See the License for the specific language governing permissions and
-limitations under the License.
--->
-<document>
- <properties>
-  <title>2.0 Release Notes</title>
-  <author email="dev@commons.apache.org">Commons Documentation Team</author>
- </properties>
-<body>
-
-<section name="Lang 2.0 Release Notes">
-<p>
-These are the release notes and advice for upgrading Commons-Lang from
-version 1.0 to version 2.0.
-<source>
-INTRODUCTION:
-
-This document contains the release notes for this version of the Commons
-Lang package. Commons Lang is a set of utility functions and reusable 
-components that should be a help in any Java environment.
-
-This release has involved a major clean and tidy exercise.
-Javadoc and Tests are now much more thorough.
-All methods should now be much clearer in what they do in unusual cases.
-
-
-INCOMPATIBLE CHANGES:
-Some StringUtils methods have changed functionality from 1.0:
-    isEmpty()
-    chomp(String)
-    chomp(String,String)
-    swapCase(String)
-Numerous other methods have changed null handling to accept nulls gracefully.
-As with all major version releases, check your code for incompatibilities.
-
-
-NEW FEATURES:
-
-Since the release of the 1.0 package the following classes have been added:
-
-lang package:
-    ArrayUtils
-    BitField
-    BooleanUtils
-    CharRange (previously package scoped)
-    ClassUtils
-    StringEscapeUtils
-    WordUtils
-    IllegalClassException
-    IncompleteArgumentException
-    NotImplementedException
-    NullArgumentException
-    SerializationException
-    UnhandledException
-    Validate
-
-
-math sub-package:
-    IntRange
-    LongRange
-    Range
-    DoubleRange
-    JVMRandom
-    NumberRange
-    FloatRange
-    NumberUtils
-    Fraction
-    RandomUtils
-
-time sub-package: 
-    DateFormatUtils
-    FastDateFormat
-    DateUtils
-    StopWatch
-
-Since the release of the 1.0 package the following classes have been changed:
-
-lang:
-    CharSet:
-        Added factory method, equals and hashCode().
-        Better defined and tested the set syntax.
-    CharSetUtils:
-        added keep method:  keep any characters specified in the CharSet string
-    RandomStringUtils:
-        random method:  overloaded to allow passing in of a Random class
-    SerializationUtils:
-        added empty constructor
-    StringUtils:
-        isEmpty() changed to not trim
-        chomp() changed to be more like Perl.
-        swapCase() no longer word based, but no difference if you pass in ASCII
-        Various methods changed in the handling of null (less exceptions).
-        Many new methods.
-        Various methods deprecated.
-    SystemUtils:
-        isJavaVersionAtLeast(int) added. getJavaVersion() deprecated.
-        host of new constants.
-
-enum:
-    Enum:
-        getEnumClass(Class) added
-    EnumUtils:
-        Removed irrelevant Comparable/Serializable interfaces.
-
-exception:
-    NestableDelegate:
-        Gained many new methods for dissecting an Exception.
-    ExceptionUtils:
-        Gained many new methods to improve handling of nested stack traces.
-        
-builder:
-    ReflectionToStringBuilder:
-        Handy class added for creating default toStrings.
-    All other builder classes received a set of new methods.
-
-
-BUG FIXES:
-
-ID Sev Pri Plt Owner State Result Summary 
-13367  [PATCH] StringUtil enhancement  
-13391  Javadoc nit  
-13771  Additional Lang Method Suggestions  
-14306  NullPointerException in CompareToBuilder  
-14357  static option for reversing the stacktrace  
-14447  ToStringBuilder doesn't work well in subclasses  
-14883  StringUtils.countMatches loops forever if substring empty  
-14884  NumberRange inaccurate for Long, etc.  
-14985  More flexibility for getRootCause in ExceptionUtils  
-15154  SystemUtils.IS_JAVA_1_5 Javadoc is wrong  
-15257  Hierarchy support in ToStringBuilder.reflectionToString()  
-15438  ArrayUtils.contains()  
-15439  Enum does not support inner sub-classes  
-15986  Infinite loop in ToStringBuilder.reflectionToString for inne  
-16076  Example in Javadoc for ToStringBuilder wrong for append.  
-16193  Hierarchy support in EqualsBuilder.reflectionEquals()  
-16202  typo in the javadoc example code  
-16204  Infinite loop in StringUtils.replace(text, repl, with) + FIX  
-16227  Added class hierarchy support to CompareToBuilder.reflectionC  
-16228  Added class hierarchy support to HashCodeBuilder.reflectionHa  
-16284  MethodUtils: Removed unused code/unused local vars.  
-16341  No Javadoc for NestableDelegate  
-16622  Removed compile warning in FastDateFormat  
-16669  JavaDoc Errata  
-16676  StackOverflow due to ToStringBuilder  
-16689  ExceptionUtils new methods.  
-16690  Specify initial size for Enum's HashMap.  
-16787  Removed compile warning in ObjectUtils  
-17250  [Lang] Should ToStringBuilder.reflectionToString handle arra  
-17654  EnumUtils nit: The import java.io.Serializable is never used  
-17882  Add join(..., char c) to StringUtils (and some performance f  
-18077  StringUtils.chomp does not match Perl  
-18723  RandomStringUtils infloops with length &lt; 1  
-18836  test.lang fails if compiled with non iso-8859-1 locales  
-18948  Resurrect the WordWrapUtils from commons-sandbox/utils  
-19296  [Lang] What to do with FastDateFormat unused private constru  
-19364  [Lang] time unit tests fail on Sundays  
-19756  [lang] java.lang.ExceptionInInitializerError thrown by JVMRa  
-19880  [lang] patch and test case fixing problem with RandomStringU  
-20165  [LANG] SystemUtils does not play nice in an Applet  
-20538  [lang] NumberUtils.isNumber allows illegal trailing characte  
-20592  [lang] RandomStringUtils.randomAlpha methods omit 'z'  
-20603  [lang] Make NestableDelegate methods public instead of packa  
-20632  Refactored reflection feature of ToStringBuilder into new Re  
-20652  StringUtils.chopNewLine - StringIndexOutOfBoundsException  
-21021  [PATCH] reduce object creation in ToStringBuilder  
-21068  [lang] [PATCH] NumberUtils min/max, BooleanUtils.xor, and Ar  
-21099  [lang][PATCH] Unused field 'startFinal' in DateIterator  
-21715  The javadoc says "Mac" instead of "OS/2"
-21734  [PATCH] all NumberUtils.createXXX(String) methods handle null
-21750  [lang] StringUtils javadoc and test enhancements
-21758  [lang] lang.builder classes javadoc edits (mostly typo fixes)
-21797  [lang] Add javadoc examples and tests for StringUtils
-21809  [lang] maven-beta10 checkstyle problem
-21904  NumberUtils.createBigDecimal("") NPE in Sun 1.3.1_08
-21952  [lang] Improved tests, javadoc for CharSetUtils, StringEscapeUtils
-22091  Adding tolerance to double[] search methods in ArrayUtils
-22094  A small, but important javadoc fix for Fraction proper whole/numerator
-22095  [lang] Javadoc, tests improvements for CharSet, CharSetUtils
-22098  [lang] Improve util.Validate tests
-22245  [lang] test.time fails in Japanese (non-us) locale.
-22286  [lang] Missing @since tags
-22367  Typo in documentation
-22386  [lang] Improve javadoc and overflow behavior of Fraction
-
-
-DEPRECATIONS:
-
-lang:
-    NumberRange:
-        now deprecated, see math subpackage
-    NumberUtils:
-        now deprecated, see math subpackage
-
-
-CHANGES:   [In 'diff' format]
-
-Jar changes
-===========
-&gt; org.apache.commons.lang.math.Range
-&gt; org.apache.commons.lang.math.FloatRange
-&gt; org.apache.commons.lang.math.NumberUtils
-&gt; org.apache.commons.lang.math.JVMRandom
-&gt; org.apache.commons.lang.math.IntRange
-&gt; org.apache.commons.lang.math.LongRange
-&gt; org.apache.commons.lang.math.DoubleRange
-&gt; org.apache.commons.lang.math.NumberRange
-&gt; org.apache.commons.lang.math.Fraction
-&gt; org.apache.commons.lang.math.RandomUtils
-&gt; org.apache.commons.lang.time.FastDateFormat
-&gt; org.apache.commons.lang.time.DateUtils$DateIterator
-&gt; org.apache.commons.lang.time.DateUtils
-&gt; org.apache.commons.lang.time.FastDateFormat$UnpaddedMonthField
-&gt; org.apache.commons.lang.time.FastDateFormat$StringLiteral
-&gt; org.apache.commons.lang.time.FastDateFormat$TwelveHourField
-&gt; org.apache.commons.lang.time.FastDateFormat$NumberRule
-&gt; org.apache.commons.lang.time.FastDateFormat$CharacterLiteral
-&gt; org.apache.commons.lang.time.FastDateFormat$TimeZoneNumberRule
-&gt; org.apache.commons.lang.time.FastDateFormat$TimeZoneNameRule
-&gt; org.apache.commons.lang.time.DateFormatUtils
-&gt; org.apache.commons.lang.time.FastDateFormat$TwoDigitMonthField
-&gt; org.apache.commons.lang.time.DurationFormatUtils
-&gt; org.apache.commons.lang.time.FastDateFormat$TimeZoneDisplayKey
-&gt; org.apache.commons.lang.time.FastDateFormat$UnpaddedNumberField
-&gt; org.apache.commons.lang.time.FastDateFormat$PaddedNumberField
-&gt; org.apache.commons.lang.time.StopWatch
-&gt; org.apache.commons.lang.time.FastDateFormat$TwentyFourHourField
-&gt; org.apache.commons.lang.time.FastDateFormat$Rule
-&gt; org.apache.commons.lang.time.FastDateFormat$TwoDigitNumberField
-&gt; org.apache.commons.lang.time.FastDateFormat$TextField
-&gt; org.apache.commons.lang.time.FastDateFormat$Pair
-&gt; org.apache.commons.lang.time.FastDateFormat$TwoDigitYearField
-&gt; org.apache.commons.lang.util.IdentifierUtils$StringNumericIdentifierFactory
-&gt; org.apache.commons.lang.util.IdentifierUtils$StringSessionIdentifierFactory
-&gt; org.apache.commons.lang.util.IdentifierUtils$LongNumericIdentifierFactory
-&gt; org.apache.commons.lang.util.IdentifierUtils$StringAlphanumericIdentifierFactory
-&gt; org.apache.commons.lang.util.Validate
-&gt; org.apache.commons.lang.util.LongIdentifierFactory
-&gt; org.apache.commons.lang.util.IdentifierUtils$1
-&gt; org.apache.commons.lang.util.StringIdentifierFactory
-&gt; org.apache.commons.lang.util.IdentifierUtils
-&gt; org.apache.commons.lang.util.IdentifierFactory
-&gt; org.apache.commons.lang.util.BitField
-&gt; org.apache.commons.lang.Entities
-&gt; org.apache.commons.lang.Entities$LookupEntityMap
-&gt; org.apache.commons.lang.NotImplementedException
-&gt; org.apache.commons.lang.NullArgumentException
-&lt; org.apache.commons.lang.ObjectUtils$1
----
-&gt; org.apache.commons.lang.StringPrintWriter
-&gt; org.apache.commons.lang.UnhandledException
-&gt; org.apache.commons.lang.Entities$HashEntityMap
-&gt; org.apache.commons.lang.Entities$ArrayEntityMap
-&gt; org.apache.commons.lang.Entities$EntityMap
-&gt; org.apache.commons.lang.IntHashMap
-&gt; org.apache.commons.lang.BooleanUtils
-&gt; org.apache.commons.lang.IncompleteArgumentException
-&gt; org.apache.commons.lang.Entities$PrimitiveEntityMap
-&gt; org.apache.commons.lang.Entities$TreeEntityMap
-&gt; org.apache.commons.lang.WordUtils
-&gt; org.apache.commons.lang.StringEscapeUtils
-&gt; org.apache.commons.lang.ArrayUtils
-&gt; org.apache.commons.lang.Entities$BinaryEntityMap
-&gt; org.apache.commons.lang.ClassUtils
-&gt; org.apache.commons.lang.IntHashMap$Entry
-&gt; org.apache.commons.lang.IllegalClassException
-&gt; org.apache.commons.lang.builder.ReflectionToStringBuilder$1
-&gt; org.apache.commons.lang.builder.ReflectionToStringBuilder
-&gt; org.apache.commons.lang.Entities$MapIntMap
-
-
-Class changes
-=============
-org.apache.commons.lang.enum.EnumUtils
---------------------
-&lt; public abstract class org.apache.commons.lang.enum.EnumUtils extends java.lang.Object implements java.lang.Comparable, java.io.Serializable {
----
-&gt; public class org.apache.commons.lang.enum.EnumUtils extends java.lang.Object {
-&gt;     public org.apache.commons.lang.enum.EnumUtils();
-
-org.apache.commons.lang.enum.Enum$Entry
---------------------
-&gt;     final java.util.Map unmodifiableMap;
-&gt;     final java.util.List unmodifiableList;
-
-org.apache.commons.lang.enum.Enum
---------------------
-&gt;     protected transient java.lang.String iToString;
-&gt;     static java.lang.Class class$org$apache$commons$lang$enum$ValuedEnum;
-&gt;     public java.lang.Class getEnumClass();
-
-org.apache.commons.lang.enum.ValuedEnum
---------------------
-&gt;     static {};
-
-org.apache.commons.lang.StringUtils
---------------------
-&gt;     public static final java.lang.String EMPTY;
-&gt;     public static boolean isEmpty(java.lang.String);
-&gt;     public static boolean isNotEmpty(java.lang.String);
-&gt;     public static boolean isBlank(java.lang.String);
-&gt;     public static boolean isNotBlank(java.lang.String);
-&lt;     public static java.lang.String deleteSpaces(java.lang.String);
-&lt;     public static java.lang.String deleteWhitespace(java.lang.String);
-&lt;     public static boolean isNotEmpty(java.lang.String);
-&lt;     public static boolean isEmpty(java.lang.String);
----
-&gt;     public static java.lang.String trimToNull(java.lang.String);
-&gt;     public static java.lang.String trimToEmpty(java.lang.String);
-&gt;     public static java.lang.String strip(java.lang.String);
-&gt;     public static java.lang.String stripToNull(java.lang.String);
-&gt;     public static java.lang.String stripToEmpty(java.lang.String);
-&gt;     public static java.lang.String strip(java.lang.String, java.lang.String);
-&gt;     public static java.lang.String stripStart(java.lang.String, java.lang.String);
-&gt;     public static java.lang.String stripEnd(java.lang.String, java.lang.String);
-&gt;     public static java.lang.String stripAll(java.lang.String[])[];
-&gt;     public static java.lang.String stripAll(java.lang.String[], java.lang.String)[];
-&gt;     public static int indexOf(java.lang.String, char);
-&gt;     public static int indexOf(java.lang.String, char, int);
-&gt;     public static int indexOf(java.lang.String, java.lang.String);
-&gt;     public static int indexOf(java.lang.String, java.lang.String, int);
-&gt;     public static int lastIndexOf(java.lang.String, char);
-&gt;     public static int lastIndexOf(java.lang.String, char, int);
-&gt;     public static int lastIndexOf(java.lang.String, java.lang.String);
-&gt;     public static int lastIndexOf(java.lang.String, java.lang.String, int);
-&gt;     public static boolean contains(java.lang.String, char);
-&gt;     public static boolean contains(java.lang.String, java.lang.String);
-&gt;     public static int indexOfAny(java.lang.String, char[]);
-&gt;     public static int indexOfAny(java.lang.String, java.lang.String);
-&gt;     public static int indexOfAnyBut(java.lang.String, char[]);
-&gt;     public static int indexOfAnyBut(java.lang.String, java.lang.String);
-&gt;     public static boolean containsOnly(java.lang.String, char[]);
-&gt;     public static boolean containsOnly(java.lang.String, java.lang.String);
-&gt;     public static boolean containsNone(java.lang.String, char[]);
-&gt;     public static boolean containsNone(java.lang.String, java.lang.String);
-&gt;     public static java.lang.String substringBefore(java.lang.String, java.lang.String);
-&gt;     public static java.lang.String substringAfter(java.lang.String, java.lang.String);
-&gt;     public static java.lang.String substringBeforeLast(java.lang.String, java.lang.String);
-&gt;     public static java.lang.String substringAfterLast(java.lang.String, java.lang.String);
-&gt;     public static java.lang.String substringBetween(java.lang.String, java.lang.String);
-&gt;     public static java.lang.String substringBetween(java.lang.String, java.lang.String, java.lang.String);
-&gt;     public static java.lang.String getNestedString(java.lang.String, java.lang.String);
-&gt;     public static java.lang.String getNestedString(java.lang.String, java.lang.String, java.lang.String);
-&gt;     public static java.lang.String split(java.lang.String, char)[];
-&gt;     public static java.lang.String join(java.lang.Object[]);
-&gt;     public static java.lang.String join(java.lang.Object[], char);
-&gt;     public static java.lang.String join(java.util.Iterator, char);
-&gt;     public static java.lang.String deleteSpaces(java.lang.String);
-&gt;     public static java.lang.String deleteWhitespace(java.lang.String);
-&gt;     public static java.lang.String replaceChars(java.lang.String, char, char);
-&gt;     public static java.lang.String replaceChars(java.lang.String, java.lang.String, java.lang.String);
-&lt;     public static java.lang.String center(java.lang.String, int);
-&lt;     public static java.lang.String center(java.lang.String, int, java.lang.String);
----
-&gt;     public static java.lang.String overlay(java.lang.String, java.lang.String, int, int);
-&gt;     public static java.lang.String rightPad(java.lang.String, int, char);
-&gt;     public static java.lang.String leftPad(java.lang.String, int, char);
-&lt;     public static java.lang.String strip(java.lang.String);
-&lt;     public static java.lang.String strip(java.lang.String, java.lang.String);
-&lt;     public static java.lang.String stripAll(java.lang.String[])[];
-&lt;     public static java.lang.String stripAll(java.lang.String[], java.lang.String)[];
-&lt;     public static java.lang.String stripEnd(java.lang.String, java.lang.String);
-&lt;     public static java.lang.String stripStart(java.lang.String, java.lang.String);
----
-&gt;     public static java.lang.String center(java.lang.String, int);
-&gt;     public static java.lang.String center(java.lang.String, int, char);
-&gt;     public static java.lang.String center(java.lang.String, int, java.lang.String);
-&lt;     public static java.lang.String uncapitalise(java.lang.String);
----
-&gt;     public static java.lang.String capitalize(java.lang.String);
-&gt;     public static java.lang.String uncapitalize(java.lang.String);
-&gt;     public static java.lang.String uncapitalise(java.lang.String);
-&lt;     public static java.lang.String getNestedString(java.lang.String, java.lang.String);
-&lt;     public static java.lang.String getNestedString(java.lang.String, java.lang.String, java.lang.String);
-&gt;     public static boolean isWhitespace(java.lang.String);
-&gt;     public static java.lang.String reverseDelimited(java.lang.String, char);
-&gt;     public static java.lang.String abbreviate(java.lang.String, int);
-&gt;     public static java.lang.String abbreviate(java.lang.String, int, int);
-&gt;     public static java.lang.String difference(java.lang.String, java.lang.String);
-&gt;     public static int differenceAt(java.lang.String, java.lang.String);
-&lt;     public static boolean containsOnly(java.lang.String, char[]);
----
-&gt;     static {};
-
-org.apache.commons.lang.ObjectUtils
---------------------
-&gt;     public static java.lang.StringBuffer appendIdentityToString(java.lang.StringBuffer, java.lang.Object);
-&gt;     public static java.lang.String toString(java.lang.Object);
-&gt;     public static java.lang.String toString(java.lang.Object, java.lang.String);
-&lt;         org.apache.commons.lang.ObjectUtils.Null(org.apache.commons.lang.ObjectUtils$1);
----
-&gt;         org.apache.commons.lang.ObjectUtils.Null();
-&gt;         static {};
-
-org.apache.commons.lang.exception.NestableDelegate
---------------------
-&gt;     public static boolean topDown;
-&gt;     public static boolean trimStackFrames;
-&lt;     org.apache.commons.lang.exception.NestableDelegate(org.apache.commons.lang.exception.Nestable);
-&lt;     java.lang.String getMessage(int);
-&lt;     java.lang.String getMessage(java.lang.String);
-&lt;     java.lang.String getMessages()[];
-&lt;     java.lang.Throwable getThrowable(int);
-&lt;     int getThrowableCount();
-&lt;     java.lang.Throwable getThrowables()[];
-&lt;     int indexOfThrowable(java.lang.Class, int);
----
-&gt;     public org.apache.commons.lang.exception.NestableDelegate(org.apache.commons.lang.exception.Nestable);
-&gt;     public java.lang.String getMessage(int);
-&gt;     public java.lang.String getMessage(java.lang.String);
-&gt;     public java.lang.String getMessages()[];
-&gt;     public java.lang.Throwable getThrowable(int);
-&gt;     public int getThrowableCount();
-&gt;     public java.lang.Throwable getThrowables()[];
-&gt;     public int indexOfThrowable(java.lang.Class, int);
-&gt;     protected java.lang.String getStackFrames(java.lang.Throwable)[];
-&gt;     protected void trimStackFrames(java.util.List);
-
-org.apache.commons.lang.exception.ExceptionUtils
---------------------
-&lt;     protected static final java.lang.String CAUSE_METHOD_NAMES[];
-&lt;     protected static final java.lang.Object CAUSE_METHOD_PARAMS[];
----
-&gt;     static final java.lang.String WRAPPED_MARKER;
-&lt;     protected org.apache.commons.lang.exception.ExceptionUtils();
----
-&gt;     public org.apache.commons.lang.exception.ExceptionUtils();
-&gt;     public static void addCauseMethodName(java.lang.String);
-&gt;     public static boolean isThrowableNested();
-&gt;     public static boolean isNestedThrowable(java.lang.Throwable);
-&gt;     public static void printRootCauseStackTrace(java.lang.Throwable);
-&gt;     public static void printRootCauseStackTrace(java.lang.Throwable, java.io.PrintStream);
-&gt;     public static void printRootCauseStackTrace(java.lang.Throwable, java.io.PrintWriter);
-&gt;     public static java.lang.String getRootCauseStackTrace(java.lang.Throwable)[];
-&gt;     public static void removeCommonFrames(java.util.List, java.util.List);
-&gt;     public static java.lang.String getFullStackTrace(java.lang.Throwable);
-&gt;     static java.util.List getStackFrameList(java.lang.Throwable);
-
-org.apache.commons.lang.CharRange
---------------------
-&lt; class org.apache.commons.lang.CharRange extends java.lang.Object {
----
-&gt; public final class org.apache.commons.lang.CharRange extends java.lang.Object implements java.io.Serializable {
-&gt;     public org.apache.commons.lang.CharRange(char,boolean);
-&lt;     public org.apache.commons.lang.CharRange(java.lang.String,java.lang.String);
----
-&gt;     public org.apache.commons.lang.CharRange(char,char,boolean);
-&lt;     public void setStart(char);
-&lt;     public void setEnd(char);
-&lt;     public boolean isRange();
-&lt;     public boolean inRange(char);
-&lt;     public void setNegated(boolean);
----
-&gt;     public boolean contains(char);
-&gt;     public boolean contains(org.apache.commons.lang.CharRange);
-&gt;     public boolean equals(java.lang.Object);
-&gt;     public int hashCode();
-&gt;     static {};
-
-org.apache.commons.lang.ObjectUtils$1
---------------------
-&lt; Compiled from ObjectUtils.java
-&lt; class org.apache.commons.lang.ObjectUtils$1 extends java.lang.Object {
-&lt; }
----
-&gt; Class 'org.apache.commons.lang.ObjectUtils$1' has been removed
-
-org.apache.commons.lang.ObjectUtils$Null
---------------------
-&lt;     org.apache.commons.lang.ObjectUtils.Null(org.apache.commons.lang.ObjectUtils$1);
----
-&gt;     org.apache.commons.lang.ObjectUtils.Null();
-&gt;     static {};
-
-org.apache.commons.lang.SystemUtils
---------------------
-&gt;     public static final java.lang.String FILE_ENCODING;
-&gt;     public static final java.lang.String JAVA_RUNTIME_NAME;
-&gt;     public static final java.lang.String JAVA_RUNTIME_VERSION;
-&gt;     public static final java.lang.String JAVA_VM_INFO;
-&gt;     public static final java.lang.String USER_COUNTRY;
-&gt;     public static final java.lang.String USER_LANGUAGE;
-&gt;     public static final float JAVA_VERSION_FLOAT;
-&gt;     public static final int JAVA_VERSION_INT;
-&gt;     public static final boolean IS_OS_AIX;
-&gt;     public static final boolean IS_OS_HP_UX;
-&gt;     public static final boolean IS_OS_IRIX;
-&gt;     public static final boolean IS_OS_LINUX;
-&gt;     public static final boolean IS_OS_MAC;
-&gt;     public static final boolean IS_OS_MAC_OSX;
-&gt;     public static final boolean IS_OS_OS2;
-&gt;     public static final boolean IS_OS_SOLARIS;
-&gt;     public static final boolean IS_OS_SUN_OS;
-&gt;     public static final boolean IS_OS_WINDOWS;
-&gt;     public static final boolean IS_OS_WINDOWS_2000;
-&gt;     public static final boolean IS_OS_WINDOWS_95;
-&gt;     public static final boolean IS_OS_WINDOWS_98;
-&gt;     public static final boolean IS_OS_WINDOWS_ME;
-&gt;     public static final boolean IS_OS_WINDOWS_NT;
-&gt;     public static final boolean IS_OS_WINDOWS_XP;
-&gt;     public static boolean isJavaVersionAtLeast(int);
-
-org.apache.commons.lang.SerializationUtils
---------------------
-&gt;     public org.apache.commons.lang.SerializationUtils();
-
-org.apache.commons.lang.RandomStringUtils
---------------------
-&gt;     public static java.lang.String random(int, int, int, boolean, boolean, char[], java.util.Random);
-
-org.apache.commons.lang.CharSet
---------------------
-&lt; public class org.apache.commons.lang.CharSet extends java.lang.Object {
----
-&gt; public class org.apache.commons.lang.CharSet extends java.lang.Object implements java.io.Serializable {
-&gt;     public static final org.apache.commons.lang.CharSet EMPTY;
-&gt;     public static final org.apache.commons.lang.CharSet ASCII_ALPHA;
-&gt;     public static final org.apache.commons.lang.CharSet ASCII_ALPHA_LOWER;
-&gt;     public static final org.apache.commons.lang.CharSet ASCII_ALPHA_UPPER;
-&gt;     public static final org.apache.commons.lang.CharSet ASCII_NUMERIC;
-&gt;     protected static final java.util.Map COMMON;
-&gt;     public static org.apache.commons.lang.CharSet getInstance(java.lang.String);
-&gt;     protected org.apache.commons.lang.CharSet(java.lang.String);
-&lt;     public boolean contains(char);
-&gt;     public org.apache.commons.lang.CharRange getCharRanges()[];
-&gt;     public boolean contains(char);
-&gt;     public boolean equals(java.lang.Object);
-&gt;     public int hashCode();
-&gt;     static {};
-
-org.apache.commons.lang.CharSetUtils
---------------------
-&gt;     public static java.lang.String keep(java.lang.String, java.lang.String);
-&gt;     public static java.lang.String keep(java.lang.String, java.lang.String[]);
-
-org.apache.commons.lang.builder.ToStringBuilder
---------------------
-&lt;     public org.apache.commons.lang.builder.ToStringBuilder(java.lang.Object);
-&lt;     public org.apache.commons.lang.builder.ToStringBuilder(java.lang.Object,org.apache.commons.lang.builder.ToStringStyle);
-&lt;     public org.apache.commons.lang.builder.ToStringBuilder(java.lang.Object,org.apache.commons.lang.builder.ToStringStyle,java.lang.StringBuffer);
-&lt;     public static void setDefaultStyle(org.apache.commons.lang.builder.ToStringStyle);
-&lt;     public org.apache.commons.lang.builder.ToStringBuilder append(java.lang.Object);
-&lt;     public org.apache.commons.lang.builder.ToStringBuilder append(java.lang.String, java.lang.Object);
-&lt;     public org.apache.commons.lang.builder.ToStringBuilder append(java.lang.String, java.lang.Object, boolean);
-&lt;     public org.apache.commons.lang.builder.ToStringBuilder append(long);
-&lt;     public org.apache.commons.lang.builder.ToStringBuilder append(java.lang.String, long);
-&lt;     public org.apache.commons.lang.builder.ToStringBuilder append(int);
-&lt;     public org.apache.commons.lang.builder.ToStringBuilder append(java.lang.String, int);
-&lt;     public org.apache.commons.lang.builder.ToStringBuilder append(short);
-&lt;     public org.apache.commons.lang.builder.ToStringBuilder append(java.lang.String, short);
-&lt;     public org.apache.commons.lang.builder.ToStringBuilder append(char);
-&lt;     public org.apache.commons.lang.builder.ToStringBuilder append(java.lang.String, char);
----
-&gt;     public static java.lang.String reflectionToString(java.lang.Object, org.apache.commons.lang.builder.ToStringStyle, boolean, java.lang.Class);
-&gt;     public static void setDefaultStyle(org.apache.commons.lang.builder.ToStringStyle);
-&gt;     public org.apache.commons.lang.builder.ToStringBuilder(java.lang.Object);
-&gt;     public org.apache.commons.lang.builder.ToStringBuilder(java.lang.Object,org.apache.commons.lang.builder.ToStringStyle);
-&gt;     public org.apache.commons.lang.builder.ToStringBuilder(java.lang.Object,org.apache.commons.lang.builder.ToStringStyle,java.lang.StringBuffer);
-&gt;     public org.apache.commons.lang.builder.ToStringBuilder append(boolean);
-&gt;     public org.apache.commons.lang.builder.ToStringBuilder append(boolean[]);
-&lt;     public org.apache.commons.lang.builder.ToStringBuilder append(java.lang.String, byte);
----
-&gt;     public org.apache.commons.lang.builder.ToStringBuilder append(byte[]);
-&gt;     public org.apache.commons.lang.builder.ToStringBuilder append(char);
-&gt;     public org.apache.commons.lang.builder.ToStringBuilder append(char[]);
-&lt;     public org.apache.commons.lang.builder.ToStringBuilder append(java.lang.String, double);
----
-&gt;     public org.apache.commons.lang.builder.ToStringBuilder append(double[]);
-&lt;     public org.apache.commons.lang.builder.ToStringBuilder append(java.lang.String, float);
-&lt;     public org.apache.commons.lang.builder.ToStringBuilder append(boolean);
-&lt;     public org.apache.commons.lang.builder.ToStringBuilder append(java.lang.String, boolean);
-&lt;     public org.apache.commons.lang.builder.ToStringBuilder append(java.lang.Object[]);
-&lt;     public org.apache.commons.lang.builder.ToStringBuilder append(java.lang.String, java.lang.Object[]);
-&lt;     public org.apache.commons.lang.builder.ToStringBuilder append(java.lang.String, java.lang.Object[], boolean);
-&lt;     public org.apache.commons.lang.builder.ToStringBuilder append(long[]);
-&lt;     public org.apache.commons.lang.builder.ToStringBuilder append(java.lang.String, long[]);
-&lt;     public org.apache.commons.lang.builder.ToStringBuilder append(java.lang.String, long[], boolean);
----
-&gt;     public org.apache.commons.lang.builder.ToStringBuilder append(float[]);
-&gt;     public org.apache.commons.lang.builder.ToStringBuilder append(int);
-&lt;     public org.apache.commons.lang.builder.ToStringBuilder append(java.lang.String, int[]);
-&lt;     public org.apache.commons.lang.builder.ToStringBuilder append(java.lang.String, int[], boolean);
----
-&gt;     public org.apache.commons.lang.builder.ToStringBuilder append(long);
-&gt;     public org.apache.commons.lang.builder.ToStringBuilder append(long[]);
-&gt;     public org.apache.commons.lang.builder.ToStringBuilder append(java.lang.Object);
-&gt;     public org.apache.commons.lang.builder.ToStringBuilder append(java.lang.Object[]);
-&gt;     public org.apache.commons.lang.builder.ToStringBuilder append(short);
-&lt;     public org.apache.commons.lang.builder.ToStringBuilder append(java.lang.String, short[]);
-&lt;     public org.apache.commons.lang.builder.ToStringBuilder append(java.lang.String, short[], boolean);
-&lt;     public org.apache.commons.lang.builder.ToStringBuilder append(char[]);
-&lt;     public org.apache.commons.lang.builder.ToStringBuilder append(java.lang.String, char[]);
-&lt;     public org.apache.commons.lang.builder.ToStringBuilder append(java.lang.String, char[], boolean);
-&lt;     public org.apache.commons.lang.builder.ToStringBuilder append(byte[]);
----
-&gt;     public org.apache.commons.lang.builder.ToStringBuilder append(java.lang.String, boolean);
-&gt;     public org.apache.commons.lang.builder.ToStringBuilder append(java.lang.String, boolean[]);
-&gt;     public org.apache.commons.lang.builder.ToStringBuilder append(java.lang.String, boolean[], boolean);
-&gt;     public org.apache.commons.lang.builder.ToStringBuilder append(java.lang.String, byte);
-&lt;     public org.apache.commons.lang.builder.ToStringBuilder append(double[]);
----
-&gt;     public org.apache.commons.lang.builder.ToStringBuilder append(java.lang.String, char);
-&gt;     public org.apache.commons.lang.builder.ToStringBuilder append(java.lang.String, char[]);
-&gt;     public org.apache.commons.lang.builder.ToStringBuilder append(java.lang.String, char[], boolean);
-&gt;     public org.apache.commons.lang.builder.ToStringBuilder append(java.lang.String, double);
-&lt;     public org.apache.commons.lang.builder.ToStringBuilder append(float[]);
----
-&gt;     public org.apache.commons.lang.builder.ToStringBuilder append(java.lang.String, float);
-&lt;     public org.apache.commons.lang.builder.ToStringBuilder append(boolean[]);
-&lt;     public org.apache.commons.lang.builder.ToStringBuilder append(java.lang.String, boolean[]);
-&lt;     public org.apache.commons.lang.builder.ToStringBuilder append(java.lang.String, boolean[], boolean);
----
-&gt;     public org.apache.commons.lang.builder.ToStringBuilder append(java.lang.String, int);
-&gt;     public org.apache.commons.lang.builder.ToStringBuilder append(java.lang.String, int[]);
-&gt;     public org.apache.commons.lang.builder.ToStringBuilder append(java.lang.String, int[], boolean);
-&gt;     public org.apache.commons.lang.builder.ToStringBuilder append(java.lang.String, long);
-&gt;     public org.apache.commons.lang.builder.ToStringBuilder append(java.lang.String, long[]);
-&gt;     public org.apache.commons.lang.builder.ToStringBuilder append(java.lang.String, long[], boolean);
-&gt;     public org.apache.commons.lang.builder.ToStringBuilder append(java.lang.String, java.lang.Object);
-&gt;     public org.apache.commons.lang.builder.ToStringBuilder append(java.lang.String, java.lang.Object, boolean);
-&gt;     public org.apache.commons.lang.builder.ToStringBuilder append(java.lang.String, java.lang.Object[]);
-&gt;     public org.apache.commons.lang.builder.ToStringBuilder append(java.lang.String, java.lang.Object[], boolean);
-&gt;     public org.apache.commons.lang.builder.ToStringBuilder append(java.lang.String, short);
-&gt;     public org.apache.commons.lang.builder.ToStringBuilder append(java.lang.String, short[]);
-&gt;     public org.apache.commons.lang.builder.ToStringBuilder append(java.lang.String, short[], boolean);
-&gt;     public org.apache.commons.lang.builder.ToStringBuilder appendAsObjectToString(java.lang.Object);
-&gt;     public org.apache.commons.lang.builder.ToStringBuilder appendSuper(java.lang.String);
-&gt;     public org.apache.commons.lang.builder.ToStringBuilder appendToString(java.lang.String);
-&gt;     public org.apache.commons.lang.builder.ToStringStyle getStyle();
-&gt;     public java.lang.Object getObject();
-
-org.apache.commons.lang.builder.StandardToStringStyle
---------------------
-&gt;     public boolean isUseShortClassName();
-&gt;     public void setUseShortClassName(boolean);
-&gt;     public boolean isFieldSeparatorAtStart();
-&gt;     public void setFieldSeparatorAtStart(boolean);
-&gt;     public boolean isFieldSeparatorAtEnd();
-&gt;     public void setFieldSeparatorAtEnd(boolean);
-
-org.apache.commons.lang.builder.ToStringStyle
---------------------
-&gt;     public void appendSuper(java.lang.StringBuffer, java.lang.String);
-&gt;     public void appendToString(java.lang.StringBuffer, java.lang.String);
-&gt;     protected void removeLastFieldSeparator(java.lang.StringBuffer);
-&gt;     protected void reflectionAppendArrayDetail(java.lang.StringBuffer, java.lang.String, java.lang.Object);
-&gt;     protected boolean isUseShortClassName();
-&gt;     protected void setUseShortClassName(boolean);
-&gt;     protected boolean isFieldSeparatorAtStart();
-&gt;     protected void setFieldSeparatorAtStart(boolean);
-&gt;     protected boolean isFieldSeparatorAtEnd();
-&gt;     protected void setFieldSeparatorAtEnd(boolean);
-
-org.apache.commons.lang.builder.HashCodeBuilder
---------------------
-&gt;     public static int reflectionHashCode(int, int, java.lang.Object, boolean, java.lang.Class);
-&gt;     public org.apache.commons.lang.builder.HashCodeBuilder appendSuper(int);
-
-org.apache.commons.lang.builder.CompareToBuilder
---------------------
-&gt;     public static int reflectionCompare(java.lang.Object, java.lang.Object, boolean, java.lang.Class);
-&gt;     public org.apache.commons.lang.builder.CompareToBuilder appendSuper(int);
-&gt;     public org.apache.commons.lang.builder.CompareToBuilder append(java.lang.Object, java.lang.Object, java.util.Comparator);
-&gt;     public org.apache.commons.lang.builder.CompareToBuilder append(java.lang.Object[], java.lang.Object[], java.util.Comparator);
-
-org.apache.commons.lang.builder.EqualsBuilder
---------------------
-&gt;     public static boolean reflectionEquals(java.lang.Object, java.lang.Object, boolean, java.lang.Class);
-&gt;     public org.apache.commons.lang.builder.EqualsBuilder appendSuper(boolean);
-</source>
-</p>
-</section>
-
-</body>
-</document>
diff --git a/lang/src/site/xdoc/upgradeto2_1.xml b/lang/src/site/xdoc/upgradeto2_1.xml
deleted file mode 100644
index 02205b5..0000000
--- a/lang/src/site/xdoc/upgradeto2_1.xml
+++ /dev/null
@@ -1,163 +0,0 @@
-<?xml version="1.0"?>
-<!--
-Licensed to the Apache Software Foundation (ASF) under one or more
-contributor license agreements.  See the NOTICE file distributed with
-this work for additional information regarding copyright ownership.
-The ASF licenses this file to You under the Apache License, Version 2.0
-(the "License"); you may not use this file except in compliance with
-the License.  You may obtain a copy of the License at
-
-     http://www.apache.org/licenses/LICENSE-2.0
-
-Unless required by applicable law or agreed to in writing, software
-distributed under the License is distributed on an "AS IS" BASIS,
-WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-See the License for the specific language governing permissions and
-limitations under the License.
--->
-<document>
- <properties>
-  <title>2.1 Release Notes</title>
-  <author email="dev@commons.apache.org">Commons Documentation Team</author>
- </properties>
-<body>
-
-<section name="Lang 2.1 Release Notes">
-<p>
-These are the release notes and advice for upgrading Commons-Lang from
-version 2.0 to version 2.1.
-<source>
-INTRODUCTION:
-
-This document contains the release notes for the 2.1 version of Apache Jakarta Commons Lang.
-Commons Lang is a set of utility functions and reusable components that
-should be of use in any Java environment.
-
-
-INCOMPATIBLE CHANGES:
-
-- The Nestable interface defines the method indexOfThrowable(Class).
-Previously the implementations checked only for a specific Class.
-Now they check for subclasses of that Class as well.
-For most situations this will be the expected behaviour (ie. its a bug fix).
-If it causes problems, please use the ExceptionUtils.indexOfThrowable(Class) method instead.
-Note that the ExceptionUtils method is available in v1.0 and v2.0 of commons-lang and has not been changed.
-(An alternative to this is to change the public static matchSubclasses flag on NestableDelegate.
-However, we don't recommend that as a long-term solution.)
-
-- The StopWatch class has had much extra validation added.
-If your code previously relied on unusual aspects, it may no longer work.
-
-- Starting with version 2.1, Ant version 1.6.x is required to build. Copy 
-junit.jar to ANT_HOME/lib. You can get JUnit from http://www.junit.org. See the developer's guide
-for more details.
-
-
-DEPRECATIONS:
-
-- The enum package has been renamed to enums for JDK1.5 compilance.
-All functionality is identical, just the package has changed.
-This package will be removed in v3.0.
-
-- NumberUtils.stringToInt - renamed to toInt
-
-- DateUtils - four constants, MILLIS_IN_* have been deprecated as they were defined
-as int not long. The replacements are MILLIS_PER_*. 
-
-
-NEW FEATURES:
-
-New:
-- Mutable package - contains basic classes that hold an Object or primitive
-and provide both get and set methods.
-- DurationFormatUtils - provides various methods for formatting durations
-- CharEncoding - definitions of constants for character encoding work
-- CharUtils - utilities for working with characters
-
-Updated:
-- ArrayUtils - many more methods, especially List-like methods
-- BooleanUtils - isTrue and isFalse methods that handle null
-- ClassUtils - primitive to wrapper class conversion methods
-- ClassUtils - class name comparator
-- IllegalClassException - extra constructor for common instanceof case
-- NotImplementedException - supports nested exceptions
-- ObjectUtils - hashcode method handling null
-- StringUtils - isAsciiPrintable to check the contents of a string
-             -- ordinalIndexOf to find the nth index of a string
-             -- various remove methods to remove parts of a string
-             -- various split methods to provide more control over splitting a string
-             -- defaultIfEmpty to default a string if null or empty
-- SystemUtils - methods to get system properties as File objects
-             -- extra constants representing system properties
-- Validate - new methods to check whether all elements in a collection are of a specific type
-- WordUtils - new methods to capitalize based on a set of specified delimiters
-
-- EqualsBuilder - now provides setter to internal state
-- ToStringStyle - new style, short prefix style
-- ReflectionToStringBuilder - more flags to control the output with regards to statics
-
-- ExceptionUtils - added indexOfType methods that check subclasses, thus leaving the existing
-indexOfThrowable method untouched (see incompatible changes section)
-
-- NumberUtils - various string to number parsing methods added
-
-- DateUtils - methods added to compare dates in various ways
-           -- method to parse a date string using multiple patterns
-- FastDateFormat - extra formatting methods that take in a millisecond long value
-                -- additional static factory methods
-- StopWatch - new methods for split behaviour
-
-
-BUG FIXES:
-
-19331  General case: infinite loop: ToStringBuilder.reflectionToString
-23174  EqualsBuilder.append(Object[], Object[]) throws NPE
-23356  Make DurationFormatUtils public!
-23557  WordUtils.capitalizeFully(String str) should take a delimiters
-23683  New method for converting a primitive Class to its corresponding wrapper
-23430  Minor javadoc fixes for StringUtils.contains(String, String)
-23590  make optional parameters in FastDateFormat really optional
-24056  Documentation error in StringUtils.replace
-25227  StringEscapeUtils.unescapeHtml() doesn't handle hex entities
-25454  new StringUtils.replaceChars behaves differently from old Ch
-25560  DateUtils.truncate() is off by one hour when using a date in DST switch 'zone'
-25627  DateUtils constants should be long
-25683  Add method that validates Collection elements are a correct
-25849  Add SystemUtils methods for directory properties.
-26616  ClassCastException in Enum.equals(Object)
-26699  Tokenizer Enhancements: reset input string, static CSV
-26734  NullPointerException in EqualsBuilder.append(Object[], Object[])
-26877  Add SystemUtils.AWT_TOOLKIT and others.
-26922  public static boolean DateUtils.equals(Date dt1, Date dt2)
-27592  WordUtils capitalize improvement
-27876  ReflectionToStringBuilder.toString(null) throws exception by design
-27877  Make ClassUtils methods null-safe and not throw an IAE.
-28468  StringUtils.defaultString: Documentation error
-28554  Add hashCode-support to class ObjectUtils
-29082  Enhancement of ExceptionUtils.CAUSE_METHOD_NAMES
-29149  StringEscapeUtils.unescapeHtml() doesn't handle an empty entity
-29294  lang.math.Fraction class deficiencies
-29673  ExceptionUtils: new getCause() methodname (for tomcat)
-29794  Add convenience format(long) methods to FastDateForma
-30328  HashCodeBuilder does not use the same values as Boolean (fixed as documentation)
-30334  New class proposal: CharacterEncoding
-30674  parseDate class from HttpClient's DateParser class
-30815  ArrayUtils.isEquals() throws ClassCastException when array1
-30929  Nestable.indexOfThrowable(Class)  uses Class.equals() to match
-31395  DateUtils.truncate oddity at the far end of the Date spectrum
-31478  Compile error with JDK 5 "enum" is a keyword
-31572  o.a.c.lang.enum.ValuedEnum: 'enum'is a keyword in JDK1.5.0
-31933  ToStringStyle setArrayEnd handled null incorrectly
-32133  SystemUtils fails init on HP-UX
-32198  Error in JavaDoc for StringUtils.chomp(String, String)
-32625  Can't subclass EqualsBuilder because isEquals is private
-33067  EqualsBuilder.append(Object[], Object[]) crashes with a NullPointerException if an element of the first array is null
-33069  EqualsBuilder.append(Object[], Object[]) incorrectly checks that rhs[i] is instance of lhs[i]'s class
-33574  unbalanced ReflectionToStringBuilder
-33737  ExceptionUtils.addCauseMethodName(String) does not check for duplicates.
-</source>
-</p>
-</section>
-
-</body>
-</document>
diff --git a/lang/src/site/xdoc/upgradeto2_2.xml b/lang/src/site/xdoc/upgradeto2_2.xml
deleted file mode 100644
index 7d7e83b..0000000
--- a/lang/src/site/xdoc/upgradeto2_2.xml
+++ /dev/null
@@ -1,110 +0,0 @@
-<?xml version="1.0"?>
-<!--
-Licensed to the Apache Software Foundation (ASF) under one or more
-contributor license agreements.  See the NOTICE file distributed with
-this work for additional information regarding copyright ownership.
-The ASF licenses this file to You under the Apache License, Version 2.0
-(the "License"); you may not use this file except in compliance with
-the License.  You may obtain a copy of the License at
-
-     http://www.apache.org/licenses/LICENSE-2.0
-
-Unless required by applicable law or agreed to in writing, software
-distributed under the License is distributed on an "AS IS" BASIS,
-WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-See the License for the specific language governing permissions and
-limitations under the License.
--->
-<document>
- <properties>
-  <title>2.2 Release Notes</title>
-  <author email="dev@commons.apache.org">Commons Documentation Team</author>
- </properties>
-<body>
-
-<section name="Lang 2.2 Release Notes">
-<p>
-These are the release notes and advice for upgrading Commons-Lang from
-version 2.1 to version 2.2.
-<source>
-INTRODUCTION:
-
-This document contains the release notes for the 2.2 version of Apache Jakarta Commons Lang.
-Commons Lang is a set of utility functions and reusable components that
-should be of use in any Java environment.
-
-INCOMPATIBLE CHANGES WITH VERSION 2.1:
-
-- None
-
-DEPRECATIONS FROM 2.1 to 2.2:
-
-- None
-
-BUG FIXES IN 2.2:
-
-<a href="https://issues.apache.org/jira/browse/LANG-2">LANG-2</a>    javadoc example for StringUtils.splitByWholeSeparator incorrect
-<a href="https://issues.apache.org/jira/browse/LANG-3">LANG-3</a>    PADDING array in StringUtils overflows on '\uffff'
-<a href="https://issues.apache.org/jira/browse/LANG-10">LANG-10</a>   [patch] ClassUtils.primitiveToWrapper and Void
-<a href="https://issues.apache.org/jira/browse/LANG-21">LANG-21</a>   escapeXML() -&gt; Not escaping low characters
-<a href="https://issues.apache.org/jira/browse/LANG-25">LANG-25</a>   DurationFormatUtils.formatDurationISO() javadoc is missing T in duration string between date and time part
-<a href="https://issues.apache.org/jira/browse/LANG-37">LANG-37</a>   unit test for org.apache.commons.lang.text.StrBuilder
-<a href="https://issues.apache.org/jira/browse/LANG-42">LANG-42</a>   EqualsBuilder.append(Object[], Object[]) crashes with a NullPointerException if an element of the first array is null
-<a href="https://issues.apache.org/jira/browse/LANG-45">LANG-45</a>   StrBuilderTest#testReplaceStringString fails.
-<a href="https://issues.apache.org/jira/browse/LANG-50">LANG-50</a>   Replace Clover with Cobertura
-<a href="https://issues.apache.org/jira/browse/LANG-59">LANG-59</a>   DateUtils.truncate method is buggy when dealing with DST switching hours
-<a href="https://issues.apache.org/jira/browse/LANG-100">LANG-100</a>  RandomStringUtils.random() family of methods create invalid Unicode sequences
-<a href="https://issues.apache.org/jira/browse/LANG-105">LANG-105</a>  ExceptionUtils goes into infinite loop in getThrowables is throwable.getCause() == throwable
-<a href="https://issues.apache.org/jira/browse/LANG-106">LANG-106</a>  StringUtils#getLevenshteinDistance() performance is sub-optimal
-<a href="https://issues.apache.org/jira/browse/LANG-112">LANG-112</a>  Wrong length check in StrTokenizer.StringMatcher
-<a href="https://issues.apache.org/jira/browse/LANG-117">LANG-117</a>  FastDateFormat: wrong format for date "01.01.1000"
-<a href="https://issues.apache.org/jira/browse/LANG-122">LANG-122</a>  EscapeUtil.escapeHtml() should clarify that it does not escape ' chars to &apos;
-<a href="https://issues.apache.org/jira/browse/LANG-123">LANG-123</a>  Unclear javadoc for DateUtils.iterator()
-<a href="https://issues.apache.org/jira/browse/LANG-127">LANG-127</a>  Minor tweak to fix of bug # 26616
-<a href="https://issues.apache.org/jira/browse/LANG-130">LANG-130</a>  Memory "leak" in StringUtils
-<a href="https://issues.apache.org/jira/browse/LANG-140">LANG-140</a>  DurationFormatUtils.formatPeriod() returns the wrong result
-<a href="https://issues.apache.org/jira/browse/LANG-141">LANG-141</a>  Fraction.toProperString() returns -1/1 for -1
-<a href="https://issues.apache.org/jira/browse/LANG-148">LANG-148</a>  Performance modifications on StringUtils.replace
-<a href="https://issues.apache.org/jira/browse/LANG-150">LANG-150</a>  StringEscapeUtils.unescapeHtml skips first entity after standalone ampersand
-<a href="https://issues.apache.org/jira/browse/LANG-152">LANG-152</a>  DurationFormatUtils.formatDurationWords "11 &lt;units&gt;" gets converted to "11 &lt;unit&gt;"
-<a href="https://issues.apache.org/jira/browse/LANG-259">LANG-259</a>  ValuedEnum.compareTo(Object other) not typesafe - it easily could be...
-<a href="https://issues.apache.org/jira/browse/LANG-261">LANG-261</a>  Error in an example in the javadoc of the StringUtils.splitPreserveAllTokens() method
-<a href="https://issues.apache.org/jira/browse/LANG-264">LANG-264</a>  ToStringBuilder/HashCodeBuilder javadoc code examples
-<a href="https://issues.apache.org/jira/browse/LANG-271">LANG-271</a>  LocaleUtils test fails under Mustang
-<a href="https://issues.apache.org/jira/browse/LANG-272">LANG-272</a>  Minor build and checkstyle changes
-<a href="https://issues.apache.org/jira/browse/LANG-277">LANG-277</a>  Javadoc errors on StringUtils.splitPreserveAllTokens(String, char)
-<a href="https://issues.apache.org/jira/browse/LANG-278">LANG-278</a>  javadoc for StringUtils.removeEnd is incorrect
-
-IMPROVEMENTS IN 2.2:
-
-<a href="https://issues.apache.org/jira/browse/LANG-159">LANG-159</a>  Add WordUtils.getInitials(String)
-<a href="https://issues.apache.org/jira/browse/LANG-161">LANG-161</a>  Add methods and tests to StrBuilder
-<a href="https://issues.apache.org/jira/browse/LANG-162">LANG-162</a>  replace() length calculation improvement
-<a href="https://issues.apache.org/jira/browse/LANG-165">LANG-165</a>  parseDate with TimeZone
-<a href="https://issues.apache.org/jira/browse/LANG-166">LANG-166</a>  New interpolation features
-<a href="https://issues.apache.org/jira/browse/LANG-169">LANG-169</a>  Implementation of escape/unescapeHtml methods with Writer
-<a href="https://issues.apache.org/jira/browse/LANG-176">LANG-176</a>  CompareToBuilder excludeFields for reflection method
-<a href="https://issues.apache.org/jira/browse/LANG-186">LANG-186</a>  Request for MutableBoolean implementation
-<a href="https://issues.apache.org/jira/browse/LANG-194">LANG-194</a>  add generic add method to DateUtils
-<a href="https://issues.apache.org/jira/browse/LANG-198">LANG-198</a>  New method for EqualsBuilder
-<a href="https://issues.apache.org/jira/browse/LANG-212">LANG-212</a>  New ExceptionUtils method setCause()
-<a href="https://issues.apache.org/jira/browse/LANG-216">LANG-216</a>  Provides a Class.getPublicMethod which returns public invocable Method
-<a href="https://issues.apache.org/jira/browse/LANG-217">LANG-217</a>  Add Mutable&lt;Type&gt; to&lt;Type&gt;() methods.
-<a href="https://issues.apache.org/jira/browse/LANG-220">LANG-220</a>  Tokenizer Enhancements: reset input string, static CSV/TSV factories
-<a href="https://issues.apache.org/jira/browse/LANG-226">LANG-226</a>  Using ReflectionToStringBuilder and excluding secure fields
-<a href="https://issues.apache.org/jira/browse/LANG-242">LANG-242</a>  Trivial cleanup of javadoc in various files
-<a href="https://issues.apache.org/jira/browse/LANG-246">LANG-246</a>  CompositeFormat
-<a href="https://issues.apache.org/jira/browse/LANG-250">LANG-250</a>  Performance boost for RandomStringUtils
-<a href="https://issues.apache.org/jira/browse/LANG-254">LANG-254</a>  Enhanced Class.forName version
-<a href="https://issues.apache.org/jira/browse/LANG-260">LANG-260</a>  StringEscapeUtils should expose escape*() methods taking Writer argument
-<a href="https://issues.apache.org/jira/browse/LANG-263">LANG-263</a>  Add StringUtils.containsIgnoreCase(...)
-<a href="https://issues.apache.org/jira/browse/LANG-267">LANG-267</a>  Support char array converters on ArrayUtils
-<a href="https://issues.apache.org/jira/browse/LANG-270">LANG-270</a>  minor javadoc improvements for StringUtils.stripXxx() methods
-          New ExceptionUtils methods getMessage/getRootCauseMessage
-
-</source>
-</p>
-</section>
-
-</body>
-</document>
diff --git a/lang/src/site/xdoc/upgradeto2_3.xml b/lang/src/site/xdoc/upgradeto2_3.xml
deleted file mode 100644
index 2f43d55..0000000
--- a/lang/src/site/xdoc/upgradeto2_3.xml
+++ /dev/null
@@ -1,118 +0,0 @@
-<?xml version="1.0"?>
-<!--
-Licensed to the Apache Software Foundation (ASF) under one or more
-contributor license agreements.  See the NOTICE file distributed with
-this work for additional information regarding copyright ownership.
-The ASF licenses this file to You under the Apache License, Version 2.0
-(the "License"); you may not use this file except in compliance with
-the License.  You may obtain a copy of the License at
-
-     http://www.apache.org/licenses/LICENSE-2.0
-
-Unless required by applicable law or agreed to in writing, software
-distributed under the License is distributed on an "AS IS" BASIS,
-WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-See the License for the specific language governing permissions and
-limitations under the License.
--->
-<document>
- <properties>
-  <title>2.3 Release Notes</title>
-  <author email="dev@commons.apache.org">Commons Documentation Team</author>
- </properties>
-<body>
-
-<section name="Lang 2.3 Release Notes">
-<p>
-These are the release notes and advice for upgrading Commons-Lang from
-version 2.2 to version 2.3.
-<source>
-INTRODUCTION:
-
-This document contains the release notes for the 2.3 version of Apache 
-Jakarta Commons Lang.
-Commons Lang is a set of utility functions and reusable components that
-should be of use in any Java environment.
-
-INCOMPATIBLE CHANGES WITH VERSION 2.2:
-
-- Calling stop on a suspended StopWatch will no longer change the underlying time. 
-  It's very unlikely anyone was relying on that bug as a feature.
-
-ADDITIONAL INCOMPATIBLE CHANGES WITH VERSION 2.0:
-
-- The Nestable interface defines the method indexOfThrowable(Class).
-Previously the implementations checked only for a specific Class.
-Now they check for subclasses of that Class as well.
-For most situations this will be the expected behaviour (ie. its a bug fix).
-If it causes problems, please use the ExceptionUtils.indexOfThrowable(Class) method instead.
-Note that the ExceptionUtils method is available in v1.0 and v2.0 of commons-lang and has not been changed.
-(An alternative to this is to change the public static matchSubclasses flag on NestableDelegate.
-However, we don't recommend that as a long-term solution.)
-
-- The StopWatch class has had much extra validation added.
-If your code previously relied on unusual aspects, it may no longer work.
-
-- Starting with version 2.1, Ant version 1.6.x is required to build. Copy 
-junit.jar to ANT_HOME/lib. You can get JUnit from http://www.junit.org. See the developer's guide
-for more details.
-
-DEPRECATIONS FROM 2.2 to 2.3:
-
-- None
-
-DEPRECATIONS FROM 2.1 to 2.2:
-
-- None
-
-DEPRECATIONS FROM 2.0 to 2.1:
-
-- The enum package has been renamed to enums for JDK1.5 compilance.
-All functionality is identical, just the package has changed.
-This package will be removed in v3.0.
-
-- NumberUtils.stringToInt - renamed to toInt
-
-- DateUtils - four constants, MILLIS_IN_* have been deprecated as they were defined
-as int not long. The replacements are MILLIS_PER_*. 
-
-
-BUG FIXES IN 2.3:
-
-    * [LANG-69 ] - ToStringBuilder throws StackOverflowError when an Object cycle exists
-    * [LANG-102] - Refactor Entities methods
-    * [LANG-153] - Can't XMLDecode an Enum
-    * [LANG-262] - Use of enum prevents a classloader from being garbage collected resuling in out of memory exceptions.
-    * [LANG-279] - HashCodeBuilder throws java.lang.StackOverflowError when an object contains a cycle.
-    * [LANG-281] - DurationFormatUtils returns wrong result
-    * [LANG-286] - Serialization - not backwards compatible
-    * [LANG-292] - unescapeXml("&amp;12345678;") should be "&amp;12345678;"
-    * [LANG-294] - StrBuilder.replaceAll and StrBuilder.deleteAll can throw ArrayIndexOutOfBoundsException.
-    * [LANG-295] - StrBuilder contains usages of thisBuf.length when they should use size
-    * [LANG-299] - Bug in method appendFixedWidthPadRight of class StrBuilder causes an ArrayIndexOutOfBoundsException
-    * [LANG-300] - NumberUtils.createNumber throws NumberFormatException for one digit long
-    * [LANG-303] - FastDateFormat.mRules is not transient or serializable
-    * [LANG-304] - NullPointerException in isAvailableLocale(Locale)
-    * [LANG-313] - Wrong behavior of Entities.unescape
-    * [LANG-315] - StopWatch: suspend() acts as split(), if followed by stop()
-
-IMPROVEMENTS IN 2.3:
-
-    * [LANG-258] - Enum JavaDoc
-    * [LANG-266] - Wish for StringUtils.join(Collection, *)
-    * [LANG-268] - StringUtils.join should allow you to pass a range for it (so it only joins a part of the array)
-    * [LANG-275] - StringUtils substringsBetween
-    * [LANG-282] - Create more tests to test out the +=31 replacement code in DurationFormatUtils.
-    * [LANG-287] - Optimize StringEscapeUtils.unescapeXml(String)
-    * [LANG-289] - NumberUtils.max(byte[]) and NumberUtils.min(byte[]) are missing
-    * [LANG-291] - Null-safe comparison methods for finding most recent / least recent dates.
-    * [LANG-306] - StrBuilder appendln/appendAll/appendSeparator
-    * [LANG-310] - BooleanUtils isNotTrue/isNotFalse
-    * [LANG-314] - Tests fail to pass when building with Maven 2
-
-</source>
-</p>
-</section>
-
-</body>
-</document>
diff --git a/lang/src/site/xdoc/upgradeto2_4.xml b/lang/src/site/xdoc/upgradeto2_4.xml
deleted file mode 100644
index 0082d92..0000000
--- a/lang/src/site/xdoc/upgradeto2_4.xml
+++ /dev/null
@@ -1,153 +0,0 @@
-<?xml version="1.0"?>
-<!--
-Licensed to the Apache Software Foundation (ASF) under one or more
-contributor license agreements.  See the NOTICE file distributed with
-this work for additional information regarding copyright ownership.
-The ASF licenses this file to You under the Apache License, Version 2.0
-(the "License"); you may not use this file except in compliance with
-the License.  You may obtain a copy of the License at
-
-     http://www.apache.org/licenses/LICENSE-2.0
-
-Unless required by applicable law or agreed to in writing, software
-distributed under the License is distributed on an "AS IS" BASIS,
-WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-See the License for the specific language governing permissions and
-limitations under the License.
--->
-<document>
- <properties>
-  <title>2.4 Release Notes</title>
-  <author email="dev@commons.apache.org">Commons Documentation Team</author>
- </properties>
-<body>
-
-<section name="Lang 2.4 Release Notes">
-<p>
-These are the release notes and advice for upgrading Commons-Lang from
-version 2.3 to version 2.4. <br/><br/>See '<a href="article2_4.html">What's new in 2.4?</a>' for more information. 
-<source>
-INTRODUCTION:
-
-This document contains the release notes for the 2.4 version of Apache Commons Lang.
-Commons Lang is a set of utility functions and reusable components that should be of use in any Java environment.
-
-Lang 2.4 no longer attempts to target the Java 1.1 environment and now targets Java 1.2. While previous versions 
-were built for 1.1, some parts were using methods that were only available in 1.2, and the Enum class had 
-become dependent on Java 1.3. 
-
-INCOMPATIBLE CHANGES WITH VERSION 2.3:
-
-- None
-
-INCOMPATIBLE CHANGES WITH VERSION 2.2:
-
-- Calling stop on a suspended StopWatch will no longer change the underlying time. 
-  It's very unlikely anyone was relying on that bug as a feature.
-
-ADDITIONAL INCOMPATIBLE CHANGES WITH VERSION 2.0:
-
-- The Nestable interface defines the method indexOfThrowable(Class).
-Previously the implementations checked only for a specific Class.
-Now they check for subclasses of that Class as well.
-For most situations this will be the expected behaviour (ie. its a bug fix).
-If it causes problems, please use the ExceptionUtils.indexOfThrowable(Class) method instead.
-Note that the ExceptionUtils method is available in v1.0 and v2.0 of commons-lang and has not been changed.
-(An alternative to this is to change the public static matchSubclasses flag on NestableDelegate.
-However, we don't recommend that as a long-term solution.)
-
-- The StopWatch class has had much extra validation added.
-If your code previously relied on unusual aspects, it may no longer work.
-
-- Starting with version 2.1, Ant version 1.6.x is required to build. Copy 
-junit.jar to ANT_HOME/lib. You can get JUnit from http://www.junit.org. See the developer's guide
-for more details.
-
-DEPRECATIONS FROM 2.3 to 2.4:
-
-- ObjectUtils.appendIdentityToString(StringBuffer, Object) - has very odd semantics, use 
-  ObjectUtils.identityToString(StringBuffer, Object) instead.
-
-- public static java.util.Date add(java.util.Date, int, int) - it is not intended for this 
-  method to be public. Please let us know if you use this. 
-
-DEPRECATIONS FROM 2.2 to 2.3:
-
-- None
-
-DEPRECATIONS FROM 2.1 to 2.2:
-
-- None
-
-DEPRECATIONS FROM 2.0 to 2.1:
-
-- The enum package has been renamed to enums for JDK1.5 compilance.
-All functionality is identical, just the package has changed.
-This package will be removed in v3.0.
-
-- NumberUtils.stringToInt - renamed to toInt
-
-- DateUtils - four constants, MILLIS_IN_* have been deprecated as they were defined
-as int not long. The replacements are MILLIS_PER_*. 
-
-
-BUG FIXES IN 2.4:
-
-    * [LANG-76 ] - EnumUtils.getEnum() doesn't work well in 1.5
-    * [LANG-328] - LocaleUtils.toLocale() rejects strings with only language+variant
-    * [LANG-334] - Enum is not thread-safe
-    * [LANG-346] - Dates.round() behaves incorrectly for minutes and seconds
-    * [LANG-349] - Deadlock using ReflectionToStringBuilder
-    * [LANG-353] - Javadoc Example for EqualsBuilder is questionable
-    * [LANG-360] - Why does appendIdentityToString return null?
-    * [LANG-361] - BooleanUtils toBooleanObject javadoc does not match implementation
-    * [LANG-363] - StringEscapeUtils..escapeJavaScript() method did not escape '/' into '\/', it will make IE render page uncorrectly
-    * [LANG-364] - Documentation bug for ignoreEmptyTokens accessors in StrTokenizer
-    * [LANG-365] - BooleanUtils.toBoolean() - invalid drop-thru in case statement causes StringIndexOutOfBoundsException
-    * [LANG-367] - FastDateFormat thread safety
-    * [LANG-368] - FastDateFormat getDateInstance() and getDateTimeInstance() assume Locale.getDefault() won't change
-    * [LANG-369] - ExceptionUtils not thread-safe
-    * [LANG-372] - ToStringBuilder: MULTI_LINE_STYLE does not print anything from appendToString methods.
-    * [LANG-380] - infinite loop in Fraction.reduce when numerator == 0
-    * [LANG-381] - NumberUtils.min(floatArray) returns wrong value if floatArray[0] happens to be Float.NaN
-    * [LANG-385] - http://commons.apache.org/lang/developerguide.html "Building" section is incorrect and incomplete
-    * [LANG-393] - EqualsBuilder don't compare BigDecimals correctly
-    * [LANG-399] - Javadoc bugs - cannot find object
-    * [LANG-410] - Ambiguous / confusing names in StringUtils replace* methods
-    * [LANG-412] - StrBuilder appendFixedWidth does not handle nulls
-    * [LANG-414] - DateUtils.round() often fails
-
-IMPROVEMENTS IN 2.4:
-
-    * [LANG-180] - adding a StringUtils.replace method that takes an array or List of replacement strings
-    * [LANG-192] - Split camel case strings
-    * [LANG-257] - Add new splitByWholeSeparatorPreserveAllTokens() methods to StringUtils
-    * [LANG-269] - Shouldn't Commons Lang's StringUtils have a "common" string method?
-    * [LANG-298] - ClassUtils.getShortClassName and ClassUtils.getPackageName and class of array
-    * [LANG-321] - Add toArray() method to IntRange and LongRange classes
-    * [LANG-322] - ClassUtils.getShortClassName(String) inefficient
-    * [LANG-326] - StringUtils: startsWith / endsWith / startsWithIgnoreCase / endsWithIgnoreCase / removeStartIgnoreCase / removeEndIgnoreCase methods
-    * [LANG-329] - Pointless synchronized in ThreadLocal.initialValue should be removed
-    * [LANG-333] - ArrayUtils.toClass
-    * [LANG-337] - Utility class constructor javadocs should acknowledge that they may sometimes be used, e.g. with Velocity.
-    * [LANG-338] - truncateNicely method which avoids truncating in the middle of a word
-    * [LANG-345] - Optimize HashCodeBuilder.append(Object)
-    * [LANG-351] - Extension to ClassUtils: Obtain the primitive class from a wrapper
-    * [LANG-356] - Add getStartTime to StopWatch
-    * [LANG-362] - Add ExtendedMessageFormat to org.apache.commons.lang.text
-    * [LANG-371] - ToStringStyle javadoc should show examples of styles
-    * [LANG-374] - Add escaping for CSV columns to StringEscapeUtils
-    * [LANG-375] - add SystemUtils.IS_OS_WINDOWS_VISTA field
-    * [LANG-379] - Calculating A date fragment in any time-unit
-    * [LANG-383] - Adding functionality to DateUtils to allow direct setting of various fields.
-    * [LANG-402] - OSGi-ify Lang
-    * [LANG-404] - Add Calendar flavour format methods to DateFormatUtils
-    * [LANG-407] - StringUtils.length(String) returns null-safe length
-    * [LANG-413] - Memory usage improvement for StringUtils#getLevenshteinDistance()
-
-</source>
-</p>
-</section>
-
-</body>
-</document>
diff --git a/lang/src/site/xdoc/upgradeto2_5.xml b/lang/src/site/xdoc/upgradeto2_5.xml
deleted file mode 100644
index 2eb2c17..0000000
--- a/lang/src/site/xdoc/upgradeto2_5.xml
+++ /dev/null
@@ -1,105 +0,0 @@
-<?xml version="1.0"?>
-<!--
-Licensed to the Apache Software Foundation (ASF) under one or more
-contributor license agreements.  See the NOTICE file distributed with
-this work for additional information regarding copyright ownership.
-The ASF licenses this file to You under the Apache License, Version 2.0
-(the "License"); you may not use this file except in compliance with
-the License.  You may obtain a copy of the License at
-
-     http://www.apache.org/licenses/LICENSE-2.0
-
-Unless required by applicable law or agreed to in writing, software
-distributed under the License is distributed on an "AS IS" BASIS,
-WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-See the License for the specific language governing permissions and
-limitations under the License.
--->
-<document>
- <properties>
-  <title>2.5 Release Notes</title>
-  <author email="dev@commons.apache.org">Commons Documentation Team</author>
- </properties>
-<body>
-
-<section name="Lang 2.5 Release Notes">
-<p>
-These are the release notes and advice for upgrading Commons-Lang from
-version 2.4 to version 2.5. <br/><br/>See '<a href="article2_5.html">What's new in 2.5?</a>' for more information.
-<source>
-INTRODUCTION:
-
-This document contains the release notes for the 2.5 version of Apache Commons Lang.
-Commons Lang is a set of utility functions and reusable components that should be of use in any Java environment.
-
-Lang 2.5 no longer attempts to target the Java 1.2 environment and now targets Java 1.3.
-
-IMPROVEMENTS IN 2.5
-===================
-
-    * [LANG-583] - ArrayUtils - add isNotEmpty() methods
-    * [LANG-534] - ArrayUtils - add nullToEmpty() methods
-    * [LANG-454] - CharRange - provide an iterator that lets you walk the chars in the range
-    * [LANG-514] - CharRange - add more readable static builder methods
-    * [        ] - ClassUtils - new isAssignable() methods with autoboxing
-    * [LANG-535] - ClassUtils - add support to getShortClassName and getPackageName for arrays
-    * [LANG-434] - DateUtils - add ceiling() method
-    * [LANG-486] - DateUtils - add parseDateStrictly() method
-    * [LANG-466] - EqualsBuilder - add reset() method
-    * [LANG-461] - NumberUtils - add toByte() and toShort() methods
-    * [LANG-522] - Mutable numbers - add string constructors
-    * [        ] - MutableBoolean - add toBoolean(), isTrue() and isFalse() methods
-    * [LANG-422] - StrBuilder - add appendSeparator() methods with an alternative default separator if the StrBuilder is currently empty
-    * [LANG-555] - SystemUtils - add IS_OS_WINDOWS_7 constant
-    * [LANG-554] - SystemUtils - add IS_JAVA_1_7 constant for JDK 1.7
-    * [LANG-405] - StringUtils - add abbreviateMiddle() method
-    * [LANG-569] - StringUtils - add indexOfIgnoreCase() and lastIndexOfIgnoreCase() methods
-    * [LANG-471] - StringUtils - add isAllUpperCase() and isAllLowerCase() methods
-    * [LANG-469] - StringUtils - add lastOrdinalIndexOf() method to complement the existing ordinalIndexOf() method
-    * [LANG-348] - StringUtils - add repeat() method
-    * [LANG-445] - StringUtils - add startsWithAny() method
-    * [LANG-430] - StringUtils - add upperCase(String, Locale) and lowerCase(String, Locale) methods
-    * [LANG-416] - New Reflection package containing ConstructorUtils, FieldUtils, MemberUtils and MethodUtils
-
-BUG FIXES IN 2.5
-================
-
-    * [LANG-494] - CharSet - Synchronizing the COMMON Map so that getInstance doesn't miss a put from a subclass in another thread
-    * [LANG-500] - ClassUtils - improving performance of getAllInterfaces
-    * [LANG-587] - ClassUtils - toClass() throws NullPointerException on null array element
-    * [LANG-530] - DateUtils - Fix parseDate() cannot parse ISO8601 dates produced by FastDateFormat
-    * [LANG-440] - DateUtils - round() doesn't work correct for Calendar.AM_PM
-    * [LANG-443] - DateUtils - improve tests
-    * [LANG-204] - Entities - multithreaded initialization
-    * [LANG-506] - Entities - missing final modifiers; thread-safety issues
-    * [LANG-76]  - EnumUtils - getEnum() doesn't work well in 1.5+
-    * [LANG-584] - ExceptionUtils - use immutable lock target
-    * [LANG-477] - ExtendedMessageFormat - OutOfMemory with a pattern containing single quotes
-    * [LANG-538] - FastDateFormat - call getTime() on a calendar to ensure timezone is in the right state
-    * [LANG-547] - FastDateFormat - Remove unused field
-    * [LANG-511] - LocaleUtils - initialization of available locales can be deferred
-    * [LANG-457] - NumberUtils - createNumber() thows a StringIndexOutOfBoundsException for "l"
-    * [LANG-521] - NumberUtils - isNumber(String) and createNumber(String) both modified to support '2.'
-    * [LANG-432] - StringUtils - improve handling of case-insensitive Strings
-    * [LANG-552] - StringUtils - replaceEach() no longer NPEs when null appears in the last String[]
-    * [LANG-460] - StringUtils - correct JavaDocs for startsWith() and startsWithIgnoreCase()
-    * [LANG-421] - StringEscapeUtils - escapeJava() escapes '/' characters
-    * [LANG-450] - StringEscapeUtils - change escapeJavaStyleString() to throw UnhandledException instead swallowing IOException
-    * [LANG-419] - WordUtils - fix StringIndexOutOfBoundsException when lower is greater than the String length
-    * [LANG-523] - StrBuilder - Performance improvement by doubling the size of the String in ensureCapacity
-    * [LANG-575] - Compare, Equals and HashCode builders - use ArrayUtils to avoid creating a temporary List
-    * [LANG-467] - EqualsBuilder - removing the special handling of BigDecimal (LANG-393) to use compareTo 
-    * [LANG-574] - HashCodeBuilder - Performance improvement: check for isArray to short-circuit the 9 instanceof checks
-    * [LANG-520] - HashCodeBuilder - Changing the hashCode() method to return toHashCode()
-    * [LANG-459] - HashCodeBuilder - reflectionHashCode() can generate incorrect hashcodes
-    * [LANG-586] - HashCodeBuilder and ToStringStyle - use of ThreadLocal causes memory leaks in container environments
-    * [LANG-487] - ToStringBuilder - make default style thread-safe
-    * [LANG-472] - RandomUtils - nextLong() always produces even numbers
-    * [LANG-592] - RandomUtils - RandomUtils tests are failing frequently
-
-</source>
-</p>
-</section>
-
-</body>
-</document>
diff --git a/lang/src/site/xdoc/upgradeto2_6.xml b/lang/src/site/xdoc/upgradeto2_6.xml
deleted file mode 100644
index ef32be6..0000000
--- a/lang/src/site/xdoc/upgradeto2_6.xml
+++ /dev/null
@@ -1,87 +0,0 @@
-<?xml version="1.0"?>
-<!--
-Licensed to the Apache Software Foundation (ASF) under one or more
-contributor license agreements.  See the NOTICE file distributed with
-this work for additional information regarding copyright ownership.
-The ASF licenses this file to You under the Apache License, Version 2.0
-(the "License"); you may not use this file except in compliance with
-the License.  You may obtain a copy of the License at
-
-     http://www.apache.org/licenses/LICENSE-2.0
-
-Unless required by applicable law or agreed to in writing, software
-distributed under the License is distributed on an "AS IS" BASIS,
-WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-See the License for the specific language governing permissions and
-limitations under the License.
--->
-<document>
- <properties>
-  <title>2.6 Release Notes</title>
-  <author email="dev@commons.apache.org">Commons Documentation Team</author>
- </properties>
-<body>
-
-<section name="Lang 2.6 Release Notes">
-<p>
-These are the release notes and advice for upgrading Commons-Lang from
-version 2.5 to version 2.6. <br/><br/>.
-<source>
-INTRODUCTION:
-
-This document contains the release notes for the 2.6 version of Apache Commons Lang.
-Commons Lang is a set of utility functions and reusable components that should be of use in any Java environment.
-
-
-COMPATIBILITY WITH 2.5
-======================
-Lang 2.6 is binary compatible release with Lang 2.5, containing bug fixes and small enhancements.
-
-Lang 2.6 requires a minimum of JDK 1.3.
-
-
-IMPROVEMENTS IN 2.6
-===================
-
-    * [LANG-633] - BooleanUtils: use same optimization in toBooleanObject(String) as in toBoolean(String)
-    * [LANG-599] - ClassUtils: allow Dots as Inner Class Separators in getClass()
-    * [LANG-594] - DateUtils: equal and compare functions up to most significant field
-    * [LANG-632] - DateUtils: provide a Date to Calendar convenience method
-    * [LANG-576] - ObjectUtils: add clone methods to ObjectUtils
-    * [LANG-667] - ObjectUtils: add a Null-safe compare() method
-    * [LANG-670] - ObjectUtils: add notEqual() method
-    * [LANG-302] - StrBuilder: implement clone() method
-    * [LANG-640] - StringUtils: add a normalizeSpace() method
-    * [LANG-614] - StringUtils: add endsWithAny() method
-    * [LANG-655] - StringUtils: add defaultIfBlank() method
-    * [LANG-596] - StrSubstitutor: add a replace(String, Properties) variant
-    * [LANG-482] - StrSubstitutor: support substitution in variable names
-    * [LANG-669] - Use StrBuilder instead of StringBuffer to improve performance where sync. is not an issue
-    
-BUG FIXES IN 2.6
-================
-
-    * [LANG-629] - CharSet: make the underlying set synchronized
-    * [LANG-635] - CompareToBuilder: fix passing along compareTransients to the reflectionCompare method
-    * [LANG-636] - ExtendedMessageFormat doesn't override equals(Object)
-    * [LANG-645] - FastDateFormat: fix to properly include the locale when formatting a Date
-    * [LANG-638] - NumberUtils: createNumber() throws a StringIndexOutOfBoundsException when argument containing "e" and "E" is passed in
-    * [LANG-607] - StringUtils methods do not handle Unicode 2.0+ supplementary characters correctly
-    * [LANG-624] - SystemUtils: getJavaVersionAsFloat throws StringIndexOutOfBoundsException on Android runtime/Dalvik VM
-    * [BEANUTILS-381] - MemberUtils: getMatchingAccessibleMethod does not correctly handle inheritance and method overloading
-
-OTHER CHANGES IN 2.6
-====================
-
-    * [LANG-600] - Javadoc is incorrect for lastIndexOf() method
-    * [LANG-628] - Javadoc for HashCodeBuilder.append(boolean) does not match implementation
-    * [LANG-643] - Javadoc StringUtils.left() claims to throw an exception on negative lenth, but doesn't
-    * [LANG-370] - Javadoc - document thread safety
-    * [LANG-623] - Test for StringUtils replaceChars() icelandic characters
-
-</source>
-</p>
-</section>
-
-</body>
-</document>
diff --git a/lang/src/site/xdoc/upgradeto3_0.xml b/lang/src/site/xdoc/upgradeto3_0.xml
deleted file mode 100644
index 9bbda8d..0000000
--- a/lang/src/site/xdoc/upgradeto3_0.xml
+++ /dev/null
@@ -1,172 +0,0 @@
-<?xml version="1.0"?>
-<!--
-Licensed to the Apache Software Foundation (ASF) under one or more
-contributor license agreements.  See the NOTICE file distributed with
-this work for additional information regarding copyright ownership.
-The ASF licenses this file to You under the Apache License, Version 2.0
-(the "License"); you may not use this file except in compliance with
-the License.  You may obtain a copy of the License at
-
-     http://www.apache.org/licenses/LICENSE-2.0
-
-Unless required by applicable law or agreed to in writing, software
-distributed under the License is distributed on an "AS IS" BASIS,
-WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-See the License for the specific language governing permissions and
-limitations under the License.
--->
-<document>
- <properties>
-  <title>Upgrade from 2.5 to 3.0</title>
-  <author email="dev@commons.apache.org">Commons Documentation Team</author>
- </properties>
-<body>
-
-<section name="Upgrade to 3.0">
-<p>
-For advice on upgrading Commons-Lang from version 2.5 to version 3.0 see 
-'<a href="article3_0.html">What's new in 3.0?</a>'.
-<source>
-INTRODUCTION:
-
-This document contains the release notes for the 3.0 version of Apache Commons Lang.
-Commons Lang is a set of utility functions and reusable components that should be of use in any 
-Java environment.
-
-Lang 3.0 now targets Java 5.0, making use of features that arrived with Java 5.0 such as generics, 
-variable arguments, autoboxing, concurrency and formatted output.
-
-ADDITIONS IN 3.0
-================
-
-    [LANG-276] MutableBigDecimal and MutableBigInteger.
-    [LANG-285] Wish : method unaccent.
-    [LANG-358] ObjectUtils.coalesce.
-    [LANG-386] LeftOf/RightOfNumber in Range convenience methods necessary.
-    [LANG-435] Add ClassUtils.isAssignable() variants with autoboxing.
-    [LANG-444] StringUtils.emptyToNull.
-    [LANG-482] Enhance StrSubstitutor to support nested ${var-${subvr}} expansion
-    [LANG-482] StrSubstitutor now supports substitution in variable names.
-    [LANG-496] A generic implementation of the Lazy initialization pattern.
-    [LANG-497] Addition of ContextedException and ContextedRuntimeException.
-    [LANG-498] Add StringEscapeUtils.escapeText() methods.
-    [LANG-499] Add support for the handling of ExecutionExceptions.
-    [LANG-501] Add support for background initialization.
-    [LANG-529] Add a concurrent package.
-    [LANG-533] Validate: support for validating blank strings.
-    [LANG-537] Add ArrayUtils.toArray to create generic arrays.
-    [LANG-545] Add ability to create a Future for a constant.
-    [LANG-546] Add methods to Validate to check whether the index is valid for the array/list/string.
-    [LANG-553] Add TypeUtils class to provide utility code for working with generic types.
-    [LANG-559] Added isAssignableFrom and isInstanceOf validation methods.
-    [LANG-559] Added validState validation method.
-    [LANG-560] New TimedSemaphore class.
-    [LANG-582] Provide an implementation of the ThreadFactory interface.
-    [LANG-588] Create a basic Pair&lt;L, R&gt; class.
-    [LANG-594] DateUtils equal &amp; compare functions up to most significant field.
-    [LANG-601] Add Builder Interface / Update Builders to Implement It.
-    [LANG-609] Support lazy initialization using atomic variables
-    [LANG-610] Extend exception handling in ConcurrentUtils to runtime exceptions.
-    [LANG-614] StringUtils.endsWithAny method
-    [LANG-640] Add normalizeSpace to StringUtils
-    [LANG-644] Provide documentation about the new concurrent package
-    [LANG-649] BooleanUtils.toBooleanObject to support single character input
-    [LANG-651] Add AnnotationUtils
-    [LANG-653] Provide a very basic ConcurrentInitializer implementation
-    [LANG-655] Add StringUtils.defaultIfBlank()
-    [LANG-667] Add a Null-safe compare() method to ObjectUtils
-    [LANG-676] Documented potential NPE if auto-boxing occurs for some BooleanUtils methods
-    [LANG-678] Add support for ConcurrentMap.putIfAbsent()
-    [LANG-692] Add hashCodeMulti varargs method
-
-REMOVALS IN 3.0
-===============
-
-    [LANG-438] Remove @deprecateds.
-    [LANG-492] Remove code handled now by the JDK.
-    [LANG-493] Remove code that does not hold enough value to remain.
-    [LANG-590] Remove JDK 1.2/1.3 bug handling in StringUtils.indexOf(String, String, int).
-    [LANG-673] WordUtils.abbreviate() removed
-    [LANG-691] Removed DateUtils.UTC_TIME_ZONE
-
-IMPROVEMENTS IN 3.0
-===================
-
-    [LANG-290] EnumUtils for JDK 5.0.
-    [LANG-336] Finally start using generics.
-    [LANG-355] StrBuilder should implement CharSequence and Appendable.
-    [LANG-396] Investigate for vararg usages.
-    [LANG-424] Improve Javadoc for StringUtils class.
-    [LANG-458] Refactor Validate.java to eliminate code redundancy.
-    [LANG-479] Document where in SVN trunk is.
-    [LANG-504] bring ArrayUtils.isEmpty to the generics world.
-    [LANG-505] Rewrite StringEscapeUtils.
-    [LANG-507] StringEscapeUtils.unescapeJava should support \u+ notation.
-    [LANG-510] Convert StringUtils API to take CharSequence.
-    [LANG-513] Better EnumUtils.
-    [LANG-528] Mutable classes should implement an appropriately typed Mutable interface.
-    [LANG-539] Compile commons.lang for CDC 1.1/Foundation 1.1.
-    [LANG-540] Make NumericEntityEscaper immutable.
-    [LANG-541] Replace StringBuffer with StringBuilder.
-    [LANG-548] Use Iterable on API instead of Collection.
-    [LANG-551] Replace Range classes with generic version.
-    [LANG-562] Change Maven groupId.
-    [LANG-563] Change Java package name.
-    [LANG-570] Do the test cases really still require main() and suite() methods?.
-    [LANG-579] Add new Validate methods.
-    [LANG-599] ClassUtils.getClass(): Allow Dots as Inner Class Separators.
-    [LANG-605] DefaultExceptionContext overwrites values in recursive situations.
-    [LANG-668] Change ObjectUtils min() &amp; max() functions to use varargs rather than just two parameters
-    [LANG-681] Push down WordUtils to "text" sub-package.
-
-BUG FIXES IN 3.0
-================
-
-    [LANG-11]  Depend on JDK 1.5+.
-    [LANG-302] StrBuilder does not implement clone().
-    [LANG-339] StringEscapeUtils.escapeHtml() escapes multibyte characters like Chinese, Japanese, etc.
-    [LANG-369] ExceptionUtils not thread-safe.
-    [LANG-418] Javadoc incorrect for StringUtils.endsWithIgnoreCase.
-    [LANG-428] StringUtils.isAlpha, isAlphanumeric and isNumeric now return false for ""
-    [LANG-439] StringEscapeUtils.escapeHTML() does not escape chars (0x00-0x20).
-    [LANG-448] Lower Ascii Characters don't get encoded by Entities.java.
-    [LANG-468] JDK 1.5 build/runtime failure on LANG-393 (EqualsBuilder).
-    [LANG-474] Fixes for thread safety.
-    [LANG-478] StopWatch does not resist to system time changes.
-    [LANG-480] StringEscapeUtils.escapeHtml incorrectly converts Unicode characters above U+00FFFF into 2 characters.
-    [LANG-481] Possible race-conditions in hashCode of the range classes.
-    [LANG-564] Improve StrLookup API documentation.
-    [LANG-568] @SuppressWarnings("unchecked") is used too generally.
-    [LANG-571] ArrayUtils.add(T[] array, T element) can create unexpected ClassCastException.
-    [LANG-585] exception.DefaultExceptionContext.getFormattedExceptionMessage catches Throwable.
-    [LANG-596] StrSubstitutor should also handle the default properties of a java.util.Properties class
-    [LANG-600] Javadoc is incorrect for public static int lastIndexOf(String str, String searchStr).
-    [LANG-602] ContextedRuntimeException no longer an 'unchecked' exception.
-    [LANG-606] EqualsBuilder causes StackOverflowException.
-    [LANG-608] Some StringUtils methods should take an int character instead of char to use String API features.
-    [LANG-617] StringEscapeUtils.escapeXML() can't process UTF-16 supplementary characters
-    [LANG-624] SystemUtils.getJavaVersionAsFloat throws StringIndexOutOfBoundsException on Android runtime/Dalvik VM
-    [LANG-629] Charset may not be threadsafe, because the HashSet is not synch.
-    [LANG-638] NumberUtils createNumber throws a StringIndexOutOfBoundsException when argument containing "e" and "E" is passed in
-    [LANG-643] Javadoc StringUtils.left() claims to throw on negative len, but doesn't
-    [LANG-645] FastDateFormat.format() outputs incorrect week of year because locale isn't respected
-    [LANG-646] StringEscapeUtils.unescapeJava doesn't handle octal escapes and Unicode with extra u
-    [LANG-656] Example StringUtils.indexOfAnyBut("zzabyycdxx", '') = 0 incorrect
-    [LANG-658] Some Entitys like &amp;Ouml; are not matched properly against its ISO8859-1 representation
-    [LANG-659] EntityArrays typo: {"\u2122", "&amp;minus;"}, // minus sign, U+2212 ISOtech
-    [LANG-66]  StringEscaper.escapeXml() escapes characters &gt; 0x7f.
-    [LANG-662] org.apache.commons.lang3.math.Fraction does not reduce (Integer.MIN_VALUE, 2^k)
-    [LANG-663] org.apache.commons.lang3.math.Fraction does not always succeed in multiplyBy and divideBy
-    [LANG-664] NumberUtils.isNumber(String) is not right when the String is "1.1L"
-    [LANG-672] Doc bug in DateUtils#ceiling
-    [LANG-677] DateUtils.isSameLocalTime compares using 12 hour clock and not 24 hour
-    [LANG-685] EqualsBuilder synchronizes on HashCodeBuilder.
-    [LANG-703] StringUtils.join throws NPE when toString returns null for one of objects in collection
-    [LANG-710] StringIndexOutOfBoundsException when calling unescapeHtml4("&amp;#03")
-
-</source>
-</p>
-</section>
-
-</body>
-</document>
diff --git a/lang/src/site/xdoc/userguide.xml b/lang/src/site/xdoc/userguide.xml
deleted file mode 100644
index f5494d5..0000000
--- a/lang/src/site/xdoc/userguide.xml
+++ /dev/null
@@ -1,34 +0,0 @@
-<?xml version="1.0"?>
-<!--
-Licensed to the Apache Software Foundation (ASF) under one or more
-contributor license agreements.  See the NOTICE file distributed with
-this work for additional information regarding copyright ownership.
-The ASF licenses this file to You under the Apache License, Version 2.0
-(the "License"); you may not use this file except in compliance with
-the License.  You may obtain a copy of the License at
-
-     http://www.apache.org/licenses/LICENSE-2.0
-
-Unless required by applicable law or agreed to in writing, software
-distributed under the License is distributed on an "AS IS" BASIS,
-WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-See the License for the specific language governing permissions and
-limitations under the License.
--->
-
-<document>
-
- <properties>
-  <title>Commons Lang - User guide</title>
-  <author email="dev@commons.apache.org">Commons Documentation Team</author>
- </properties>
-
- <body>
-  <!-- $Id$ -->
-
-  <section name='User guide for Commons "Lang"'>
-    Looking for the User Guide? It has been moved to the package <a href="javadocs/api-release/index.html">JavaDoc</a>
-  </section>
-
-</body>
-</document>
diff --git a/lang/src/test/java/org/apache/commons/lang3/AnnotationUtilsTest.java b/lang/src/test/java/org/apache/commons/lang3/AnnotationUtilsTest.java
deleted file mode 100644
index 446e8d9..0000000
--- a/lang/src/test/java/org/apache/commons/lang3/AnnotationUtilsTest.java
+++ /dev/null
@@ -1,508 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.commons.lang3;
-
-import static java.lang.annotation.ElementType.FIELD;
-import static java.lang.annotation.RetentionPolicy.RUNTIME;
-import static org.apache.commons.lang3.AnnotationUtilsTest.Stooge.CURLY;
-import static org.apache.commons.lang3.AnnotationUtilsTest.Stooge.LARRY;
-import static org.apache.commons.lang3.AnnotationUtilsTest.Stooge.MOE;
-import static org.apache.commons.lang3.AnnotationUtilsTest.Stooge.SHEMP;
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertFalse;
-import static org.junit.Assert.assertTrue;
-
-import java.lang.annotation.ElementType;
-import java.lang.annotation.Retention;
-import java.lang.annotation.Target;
-import java.lang.reflect.Array;
-import java.lang.reflect.Field;
-import java.lang.reflect.InvocationHandler;
-import java.lang.reflect.Method;
-import java.lang.reflect.Proxy;
-import java.util.Collection;
-import java.util.Map;
-
-import org.junit.Before;
-import org.junit.Test;
-
-/**
- * @version $Id$
- */
-public class AnnotationUtilsTest {
-    @TestAnnotation(
-            booleanValue = false,
-            booleanValues = { false },
-            byteValue = 0,
-            byteValues = { 0 },
-            charValue = 0,
-            charValues = { 0 },
-            doubleValue = 0,
-            doubleValues = { 0 },
-            floatValue = 0,
-            floatValues = { 0 },
-            intValue = 0,
-            intValues = { 0 },
-            longValue = 0,
-            longValues = { 0 },
-            nest = @NestAnnotation(
-                    booleanValue = false,
-                    booleanValues = { false },
-                    byteValue = 0,
-                    byteValues = { 0 },
-                    charValue = 0,
-                    charValues = { 0 },
-                    doubleValue = 0,
-                    doubleValues = { 0 },
-                    floatValue = 0,
-                    floatValues = { 0 },
-                    intValue = 0,
-                    intValues = { 0 },
-                    longValue = 0,
-                    longValues = { 0 },
-                    shortValue = 0,
-                    shortValues = { 0 },
-                    stooge = CURLY,
-                    stooges = { MOE, LARRY, SHEMP },
-                    string = "",
-                    strings = { "" },
-                    type = Object.class,
-                    types = { Object.class }
-            ),
-            nests = {
-                @NestAnnotation(
-                        booleanValue = false,
-                        booleanValues = { false },
-                        byteValue = 0,
-                        byteValues = { 0 },
-                        charValue = 0,
-                        charValues = { 0 },
-                        doubleValue = 0,
-                        doubleValues = { 0 },
-                        floatValue = 0,
-                        floatValues = { 0 },
-                        intValue = 0,
-                        intValues = { 0 },
-                        longValue = 0,
-                        longValues = { 0 },
-                        shortValue = 0,
-                        shortValues = { 0 },
-                        stooge = CURLY,
-                        stooges = { MOE, LARRY, SHEMP },
-                        string = "",
-                        strings = { "" },
-                        type = Object[].class,
-                        types = { Object[].class }
-                )
-            },
-            shortValue = 0,
-            shortValues = { 0 },
-            stooge = SHEMP,
-            stooges = { MOE, LARRY, CURLY },
-            string = "",
-            strings = { "" },
-            type = Object.class,
-            types = { Object.class }
-    )
-    public Object dummy1;
-
-    @TestAnnotation(
-            booleanValue = false,
-            booleanValues = { false },
-            byteValue = 0,
-            byteValues = { 0 },
-            charValue = 0,
-            charValues = { 0 },
-            doubleValue = 0,
-            doubleValues = { 0 },
-            floatValue = 0,
-            floatValues = { 0 },
-            intValue = 0,
-            intValues = { 0 },
-            longValue = 0,
-            longValues = { 0 },
-            nest = @NestAnnotation(
-                    booleanValue = false,
-                    booleanValues = { false },
-                    byteValue = 0,
-                    byteValues = { 0 },
-                    charValue = 0,
-                    charValues = { 0 },
-                    doubleValue = 0,
-                    doubleValues = { 0 },
-                    floatValue = 0,
-                    floatValues = { 0 },
-                    intValue = 0,
-                    intValues = { 0 },
-                    longValue = 0,
-                    longValues = { 0 },
-                    shortValue = 0,
-                    shortValues = { 0 },
-                    stooge = CURLY,
-                    stooges = { MOE, LARRY, SHEMP },
-                    string = "",
-                    strings = { "" },
-                    type = Object.class,
-                    types = { Object.class }
-            ),
-            nests = {
-                @NestAnnotation(
-                        booleanValue = false,
-                        booleanValues = { false },
-                        byteValue = 0,
-                        byteValues = { 0 },
-                        charValue = 0,
-                        charValues = { 0 },
-                        doubleValue = 0,
-                        doubleValues = { 0 },
-                        floatValue = 0,
-                        floatValues = { 0 },
-                        intValue = 0,
-                        intValues = { 0 },
-                        longValue = 0,
-                        longValues = { 0 },
-                        shortValue = 0,
-                        shortValues = { 0 },
-                        stooge = CURLY,
-                        stooges = { MOE, LARRY, SHEMP },
-                        string = "",
-                        strings = { "" },
-                        type = Object[].class,
-                        types = { Object[].class }
-                )
-            },
-            shortValue = 0,
-            shortValues = { 0 },
-            stooge = SHEMP,
-            stooges = { MOE, LARRY, CURLY },
-            string = "",
-            strings = { "" },
-            type = Object.class,
-            types = { Object.class }
-    )
-    public Object dummy2;
-
-    @TestAnnotation(
-            booleanValue = false,
-            booleanValues = { false },
-            byteValue = 0,
-            byteValues = { 0 },
-            charValue = 0,
-            charValues = { 0 },
-            doubleValue = 0,
-            doubleValues = { 0 },
-            floatValue = 0,
-            floatValues = { 0 },
-            intValue = 0,
-            intValues = { 0 },
-            longValue = 0,
-            longValues = { 0 },
-            nest = @NestAnnotation(
-                    booleanValue = false,
-                    booleanValues = { false },
-                    byteValue = 0,
-                    byteValues = { 0 },
-                    charValue = 0,
-                    charValues = { 0 },
-                    doubleValue = 0,
-                    doubleValues = { 0 },
-                    floatValue = 0,
-                    floatValues = { 0 },
-                    intValue = 0,
-                    intValues = { 0 },
-                    longValue = 0,
-                    longValues = { 0 },
-                    shortValue = 0,
-                    shortValues = { 0 },
-                    stooge = CURLY,
-                    stooges = { MOE, LARRY, SHEMP },
-                    string = "",
-                    strings = { "" },
-                    type = Object.class,
-                    types = { Object.class }
-            ),
-            nests = {
-                @NestAnnotation(
-                        booleanValue = false,
-                        booleanValues = { false },
-                        byteValue = 0,
-                        byteValues = { 0 },
-                        charValue = 0,
-                        charValues = { 0 },
-                        doubleValue = 0,
-                        doubleValues = { 0 },
-                        floatValue = 0,
-                        floatValues = { 0 },
-                        intValue = 0,
-                        intValues = { 0 },
-                        longValue = 0,
-                        longValues = { 0 },
-                        shortValue = 0,
-                        shortValues = { 0 },
-                        stooge = CURLY,
-                        stooges = { MOE, LARRY, SHEMP },
-                        string = "",
-                        strings = { "" },
-                        type = Object[].class,
-                        types = { Object[].class }
-                ),
-                //add a second NestAnnotation to break equality:
-                @NestAnnotation(
-                        booleanValue = false,
-                        booleanValues = { false },
-                        byteValue = 0,
-                        byteValues = { 0 },
-                        charValue = 0,
-                        charValues = { 0 },
-                        doubleValue = 0,
-                        doubleValues = { 0 },
-                        floatValue = 0,
-                        floatValues = { 0 },
-                        intValue = 0,
-                        intValues = { 0 },
-                        longValue = 0,
-                        longValues = { 0 },
-                        shortValue = 0,
-                        shortValues = { 0 },
-                        stooge = CURLY,
-                        stooges = { MOE, LARRY, SHEMP },
-                        string = "",
-                        strings = { "" },
-                        type = Object[].class,
-                        types = { Object[].class }
-                )
-            },
-            shortValue = 0,
-            shortValues = { 0 },
-            stooge = SHEMP,
-            stooges = { MOE, LARRY, CURLY },
-            string = "",
-            strings = { "" },
-            type = Object.class,
-            types = { Object.class }
-    )
-    public Object dummy3;
-
-    @NestAnnotation(
-            booleanValue = false,
-            booleanValues = { false },
-            byteValue = 0,
-            byteValues = { 0 },
-            charValue = 0,
-            charValues = { 0 },
-            doubleValue = 0,
-            doubleValues = { 0 },
-            floatValue = 0,
-            floatValues = { 0 },
-            intValue = 0,
-            intValues = { 0 },
-            longValue = 0,
-            longValues = { 0 },
-            shortValue = 0,
-            shortValues = { 0 },
-            stooge = CURLY,
-            stooges = { MOE, LARRY, SHEMP },
-            string = "",
-            strings = { "" },
-            type = Object[].class,
-            types = { Object[].class }
-    )
-    public Object dummy4;
-
-    @Target(FIELD)
-    @Retention(RUNTIME)
-    public @interface TestAnnotation {
-        String string();
-        String[] strings();
-        Class<?> type();
-        Class<?>[] types();
-        byte byteValue();
-        byte[] byteValues();
-        short shortValue();
-        short[] shortValues();
-        int intValue();
-        int[] intValues();
-        char charValue();
-        char[] charValues();
-        long longValue();
-        long[] longValues();
-        float floatValue();
-        float[] floatValues();
-        double doubleValue();
-        double[] doubleValues();
-        boolean booleanValue();
-        boolean[] booleanValues();
-        Stooge stooge();
-        Stooge[] stooges();
-        NestAnnotation nest();
-        NestAnnotation[] nests();
-    }
-
-    public @interface NestAnnotation {
-        String string();
-        String[] strings();
-        Class<?> type();
-        Class<?>[] types();
-        byte byteValue();
-        byte[] byteValues();
-        short shortValue();
-        short[] shortValues();
-        int intValue();
-        int[] intValues();
-        char charValue();
-        char[] charValues();
-        long longValue();
-        long[] longValues();
-        float floatValue();
-        float[] floatValues();
-        double doubleValue();
-        double[] doubleValues();
-        boolean booleanValue();
-        boolean[] booleanValues();
-        Stooge stooge();
-        Stooge[] stooges();
-    }
-
-    public static enum Stooge {
-        MOE, LARRY, CURLY, JOE, SHEMP;
-    }
-
-    private Field field1;
-    private Field field2;
-    private Field field3;
-    private Field field4;
-
-    @Before
-    public void setup() throws Exception {
-        field1 = getClass().getDeclaredField("dummy1");
-        field2 = getClass().getDeclaredField("dummy2");
-        field3 = getClass().getDeclaredField("dummy3");
-        field4 = getClass().getDeclaredField("dummy4");
-    }
-
-    @Test
-    public void testEquivalence() {
-        assertTrue(AnnotationUtils.equals(field1.getAnnotation(TestAnnotation.class), field2.getAnnotation(TestAnnotation.class)));
-        assertTrue(AnnotationUtils.equals(field2.getAnnotation(TestAnnotation.class), field1.getAnnotation(TestAnnotation.class)));
-    }
-
-    @Test
-    public void testSameInstance() {
-        assertTrue(AnnotationUtils.equals(field1.getAnnotation(TestAnnotation.class), field1.getAnnotation(TestAnnotation.class)));
-    }
-
-    @Test
-    public void testNonEquivalentAnnotationsOfSameType() {
-        assertFalse(AnnotationUtils.equals(field1.getAnnotation(TestAnnotation.class), field3.getAnnotation(TestAnnotation.class)));
-        assertFalse(AnnotationUtils.equals(field3.getAnnotation(TestAnnotation.class), field1.getAnnotation(TestAnnotation.class)));
-    }
-
-    @Test
-    public void testAnnotationsOfDifferingTypes() {
-        assertFalse(AnnotationUtils.equals(field1.getAnnotation(TestAnnotation.class), field4.getAnnotation(NestAnnotation.class)));
-        assertFalse(AnnotationUtils.equals(field4.getAnnotation(NestAnnotation.class), field1.getAnnotation(TestAnnotation.class)));
-    }
-
-    @Test
-    public void testOneArgNull() {
-        assertFalse(AnnotationUtils.equals(field1.getAnnotation(TestAnnotation.class), null));
-        assertFalse(AnnotationUtils.equals(null, field1.getAnnotation(TestAnnotation.class)));
-    }
-
-    @Test
-    public void testBothArgsNull() {
-        assertTrue(AnnotationUtils.equals(null, null));
-    }
-
-    @Test
-    public void testIsValidAnnotationMemberType() {
-        for (final Class<?> type : new Class[] { byte.class, short.class, int.class, char.class,
-                long.class, float.class, double.class, boolean.class, String.class, Class.class,
-                NestAnnotation.class, TestAnnotation.class, Stooge.class, ElementType.class }) {
-            assertTrue(AnnotationUtils.isValidAnnotationMemberType(type));
-            assertTrue(AnnotationUtils.isValidAnnotationMemberType(Array.newInstance(type, 0)
-                    .getClass()));
-        }
-        for (final Class<?> type : new Class[] { Object.class, Map.class, Collection.class }) {
-            assertFalse(AnnotationUtils.isValidAnnotationMemberType(type));
-            assertFalse(AnnotationUtils.isValidAnnotationMemberType(Array.newInstance(type, 0)
-                    .getClass()));
-        }
-    }
-
-    @Test(timeout = 666000)
-    public void testGeneratedAnnotationEquivalentToRealAnnotation() throws Exception {
-        final Test real = getClass().getDeclaredMethod(
-                "testGeneratedAnnotationEquivalentToRealAnnotation").getAnnotation(Test.class);
-
-        final InvocationHandler generatedTestInvocationHandler = new InvocationHandler() {
-
-            @Override
-            public Object invoke(final Object proxy, final Method method, final Object[] args) throws Throwable {
-                if ("equals".equals(method.getName()) && method.getParameterTypes().length == 1) {
-                    return Boolean.valueOf(proxy == args[0]);
-                }
-                if ("hashCode".equals(method.getName()) && method.getParameterTypes().length == 0) {
-                    return Integer.valueOf(System.identityHashCode(proxy));
-                }
-                if ("toString".equals(method.getName()) && method.getParameterTypes().length == 0) {
-                    return "Test proxy";
-                }
-                return method.invoke(real, args);
-            }
-        };
-
-        final Test generated = (Test) Proxy.newProxyInstance(Thread.currentThread()
-                .getContextClassLoader(), new Class[] { Test.class },
-                generatedTestInvocationHandler);
-        assertTrue(real.equals(generated));
-        assertFalse(generated.equals(real));
-        assertTrue(AnnotationUtils.equals(generated, real));
-        assertTrue(AnnotationUtils.equals(real, generated));
-
-        final Test generated2 = (Test) Proxy.newProxyInstance(Thread.currentThread()
-                .getContextClassLoader(), new Class[] { Test.class },
-                generatedTestInvocationHandler);
-        assertFalse(generated.equals(generated2));
-        assertFalse(generated2.equals(generated));
-        assertTrue(AnnotationUtils.equals(generated, generated2));
-        assertTrue(AnnotationUtils.equals(generated2, generated));
-    }
-
-    @Test(timeout = 666000)
-    public void testHashCode() throws Exception {
-        final Test test = getClass().getDeclaredMethod("testHashCode").getAnnotation(Test.class);
-        assertEquals(test.hashCode(), AnnotationUtils.hashCode(test));
-        final TestAnnotation testAnnotation1 = field1.getAnnotation(TestAnnotation.class);
-        assertEquals(testAnnotation1.hashCode(), AnnotationUtils.hashCode(testAnnotation1));
-        final TestAnnotation testAnnotation3 = field3.getAnnotation(TestAnnotation.class);
-        assertEquals(testAnnotation3.hashCode(), AnnotationUtils.hashCode(testAnnotation3));
-    }
-
-    @Test(timeout = 666000)
-    public void testToString() throws Exception {
-        final Test testAnno = getClass().getDeclaredMethod("testToString")
-                .getAnnotation(Test.class);
-        final String toString = AnnotationUtils.toString(testAnno);
-        assertTrue(toString.startsWith("@org.junit.Test("));
-        assertTrue(toString.endsWith(")"));
-        assertTrue(toString.contains("expected=class org.junit.Test$None"));
-        assertTrue(toString.contains("timeout=666000"));
-        assertTrue(toString.contains(", "));
-    }
-
-}
diff --git a/lang/src/test/java/org/apache/commons/lang3/ArrayUtilsAddTest.java b/lang/src/test/java/org/apache/commons/lang3/ArrayUtilsAddTest.java
deleted file mode 100644
index 6c18f62..0000000
--- a/lang/src/test/java/org/apache/commons/lang3/ArrayUtilsAddTest.java
+++ /dev/null
@@ -1,612 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package org.apache.commons.lang3;
-
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertNotNull;
-import static org.junit.Assert.assertNotSame;
-import static org.junit.Assert.assertNull;
-import static org.junit.Assert.assertTrue;
-import static org.junit.Assert.fail;
-
-import java.util.Arrays;
-
-import org.junit.Test;
-
-/**
- * Tests ArrayUtils add methods.
- *
- * @version $Id$
- */
-public class ArrayUtilsAddTest {
-
-    @Test
-    public void testJira567(){
-        Number[] n;
-        // Valid array construction
-        n = ArrayUtils.addAll(new Number[]{Integer.valueOf(1)}, new Long[]{Long.valueOf(2)});
-        assertEquals(2,n.length);
-        assertEquals(Number.class,n.getClass().getComponentType());
-        try {
-            // Invalid - can't store Long in Integer array
-               n = ArrayUtils.addAll(new Integer[]{Integer.valueOf(1)}, new Long[]{Long.valueOf(2)});
-               fail("Should have generated IllegalArgumentException");
-        } catch (final IllegalArgumentException expected) {
-        }
-    }
-
-    @Test
-    public void testAddObjectArrayBoolean() {
-        boolean[] newArray;
-        newArray = ArrayUtils.add((boolean[])null, false);
-        assertTrue(Arrays.equals(new boolean[]{false}, newArray));
-        assertEquals(Boolean.TYPE, newArray.getClass().getComponentType());
-        newArray = ArrayUtils.add((boolean[])null, true);
-        assertTrue(Arrays.equals(new boolean[]{true}, newArray));
-        assertEquals(Boolean.TYPE, newArray.getClass().getComponentType());
-        final boolean[] array1 = new boolean[]{true, false, true};
-        newArray = ArrayUtils.add(array1, false);
-        assertTrue(Arrays.equals(new boolean[]{true, false, true, false}, newArray));
-        assertEquals(Boolean.TYPE, newArray.getClass().getComponentType());
-    }
-
-    @Test
-    public void testAddObjectArrayByte() {
-        byte[] newArray;
-        newArray = ArrayUtils.add((byte[])null, (byte)0);
-        assertTrue(Arrays.equals(new byte[]{0}, newArray));
-        assertEquals(Byte.TYPE, newArray.getClass().getComponentType());
-        newArray = ArrayUtils.add((byte[])null, (byte)1);
-        assertTrue(Arrays.equals(new byte[]{1}, newArray));
-        assertEquals(Byte.TYPE, newArray.getClass().getComponentType());
-        final byte[] array1 = new byte[]{1, 2, 3};
-        newArray = ArrayUtils.add(array1, (byte)0);
-        assertTrue(Arrays.equals(new byte[]{1, 2, 3, 0}, newArray));
-        assertEquals(Byte.TYPE, newArray.getClass().getComponentType());
-        newArray = ArrayUtils.add(array1, (byte)4);
-        assertTrue(Arrays.equals(new byte[]{1, 2, 3, 4}, newArray));
-        assertEquals(Byte.TYPE, newArray.getClass().getComponentType());
-    }
-
-    @Test
-    public void testAddObjectArrayChar() {
-        char[] newArray;
-        newArray = ArrayUtils.add((char[])null, (char)0);
-        assertTrue(Arrays.equals(new char[]{0}, newArray));
-        assertEquals(Character.TYPE, newArray.getClass().getComponentType());
-        newArray = ArrayUtils.add((char[])null, (char)1);
-        assertTrue(Arrays.equals(new char[]{1}, newArray));
-        assertEquals(Character.TYPE, newArray.getClass().getComponentType());
-        final char[] array1 = new char[]{1, 2, 3};
-        newArray = ArrayUtils.add(array1, (char)0);
-        assertTrue(Arrays.equals(new char[]{1, 2, 3, 0}, newArray));
-        assertEquals(Character.TYPE, newArray.getClass().getComponentType());
-        newArray = ArrayUtils.add(array1, (char)4);
-        assertTrue(Arrays.equals(new char[]{1, 2, 3, 4}, newArray));
-        assertEquals(Character.TYPE, newArray.getClass().getComponentType());
-    }
-
-    @Test
-    public void testAddObjectArrayDouble() {
-        double[] newArray;
-        newArray = ArrayUtils.add((double[])null, 0);
-        assertTrue(Arrays.equals(new double[]{0}, newArray));
-        assertEquals(Double.TYPE, newArray.getClass().getComponentType());
-        newArray = ArrayUtils.add((double[])null, 1);
-        assertTrue(Arrays.equals(new double[]{1}, newArray));
-        assertEquals(Double.TYPE, newArray.getClass().getComponentType());
-        final double[] array1 = new double[]{1, 2, 3};
-        newArray = ArrayUtils.add(array1, 0);
-        assertTrue(Arrays.equals(new double[]{1, 2, 3, 0}, newArray));
-        assertEquals(Double.TYPE, newArray.getClass().getComponentType());
-        newArray = ArrayUtils.add(array1, 4);
-        assertTrue(Arrays.equals(new double[]{1, 2, 3, 4}, newArray));
-        assertEquals(Double.TYPE, newArray.getClass().getComponentType());
-    }
-
-    @Test
-    public void testAddObjectArrayFloat() {
-        float[] newArray;
-        newArray = ArrayUtils.add((float[])null, 0);
-        assertTrue(Arrays.equals(new float[]{0}, newArray));
-        assertEquals(Float.TYPE, newArray.getClass().getComponentType());
-        newArray = ArrayUtils.add((float[])null, 1);
-        assertTrue(Arrays.equals(new float[]{1}, newArray));
-        assertEquals(Float.TYPE, newArray.getClass().getComponentType());
-        final float[] array1 = new float[]{1, 2, 3};
-        newArray = ArrayUtils.add(array1, 0);
-        assertTrue(Arrays.equals(new float[]{1, 2, 3, 0}, newArray));
-        assertEquals(Float.TYPE, newArray.getClass().getComponentType());
-        newArray = ArrayUtils.add(array1, 4);
-        assertTrue(Arrays.equals(new float[]{1, 2, 3, 4}, newArray));
-        assertEquals(Float.TYPE, newArray.getClass().getComponentType());
-    }
-
-    @Test
-    public void testAddObjectArrayInt() {
-        int[] newArray;
-        newArray = ArrayUtils.add((int[])null, 0);
-        assertTrue(Arrays.equals(new int[]{0}, newArray));
-        assertEquals(Integer.TYPE, newArray.getClass().getComponentType());
-        newArray = ArrayUtils.add((int[])null, 1);
-        assertTrue(Arrays.equals(new int[]{1}, newArray));
-        assertEquals(Integer.TYPE, newArray.getClass().getComponentType());
-        final int[] array1 = new int[]{1, 2, 3};
-        newArray = ArrayUtils.add(array1, 0);
-        assertTrue(Arrays.equals(new int[]{1, 2, 3, 0}, newArray));
-        assertEquals(Integer.TYPE, newArray.getClass().getComponentType());
-        newArray = ArrayUtils.add(array1, 4);
-        assertTrue(Arrays.equals(new int[]{1, 2, 3, 4}, newArray));
-        assertEquals(Integer.TYPE, newArray.getClass().getComponentType());
-    }
-
-    @Test
-    public void testAddObjectArrayLong() {
-        long[] newArray;
-        newArray = ArrayUtils.add((long[])null, 0);
-        assertTrue(Arrays.equals(new long[]{0}, newArray));
-        assertEquals(Long.TYPE, newArray.getClass().getComponentType());
-        newArray = ArrayUtils.add((long[])null, 1);
-        assertTrue(Arrays.equals(new long[]{1}, newArray));
-        assertEquals(Long.TYPE, newArray.getClass().getComponentType());
-        final long[] array1 = new long[]{1, 2, 3};
-        newArray = ArrayUtils.add(array1, 0);
-        assertTrue(Arrays.equals(new long[]{1, 2, 3, 0}, newArray));
-        assertEquals(Long.TYPE, newArray.getClass().getComponentType());
-        newArray = ArrayUtils.add(array1, 4);
-        assertTrue(Arrays.equals(new long[]{1, 2, 3, 4}, newArray));
-        assertEquals(Long.TYPE, newArray.getClass().getComponentType());
-    }
-
-    @Test
-    public void testAddObjectArrayShort() {
-        short[] newArray;
-        newArray = ArrayUtils.add((short[])null, (short)0);
-        assertTrue(Arrays.equals(new short[]{0}, newArray));
-        assertEquals(Short.TYPE, newArray.getClass().getComponentType());
-        newArray = ArrayUtils.add((short[])null, (short)1);
-        assertTrue(Arrays.equals(new short[]{1}, newArray));
-        assertEquals(Short.TYPE, newArray.getClass().getComponentType());
-        final short[] array1 = new short[]{1, 2, 3};
-        newArray = ArrayUtils.add(array1, (short)0);
-        assertTrue(Arrays.equals(new short[]{1, 2, 3, 0}, newArray));
-        assertEquals(Short.TYPE, newArray.getClass().getComponentType());
-        newArray = ArrayUtils.add(array1, (short)4);
-        assertTrue(Arrays.equals(new short[]{1, 2, 3, 4}, newArray));
-        assertEquals(Short.TYPE, newArray.getClass().getComponentType());
-    }
-
-    @Test
-    public void testAddObjectArrayObject() {
-        Object[] newArray;
-
-        //show that not casting is okay
-        newArray = ArrayUtils.add((Object[])null, "a");
-        assertTrue(Arrays.equals(new String[]{"a"}, newArray));
-        assertTrue(Arrays.equals(new Object[]{"a"}, newArray));
-        assertEquals(String.class, newArray.getClass().getComponentType());
-
-        //show that not casting to Object[] is okay and will assume String based on "a"
-        final String[] newStringArray = ArrayUtils.add(null, "a");
-        assertTrue(Arrays.equals(new String[]{"a"}, newStringArray));
-        assertTrue(Arrays.equals(new Object[]{"a"}, newStringArray));
-        assertEquals(String.class, newStringArray.getClass().getComponentType());
-
-        final String[] stringArray1 = new String[]{"a", "b", "c"};
-        newArray = ArrayUtils.add(stringArray1, null);
-        assertTrue(Arrays.equals(new String[]{"a", "b", "c", null}, newArray));
-        assertEquals(String.class, newArray.getClass().getComponentType());
-
-        newArray = ArrayUtils.add(stringArray1, "d");
-        assertTrue(Arrays.equals(new String[]{"a", "b", "c", "d"}, newArray));
-        assertEquals(String.class, newArray.getClass().getComponentType());
-
-        Number[] numberArray1 = new Number[]{Integer.valueOf(1), Double.valueOf(2)};
-        newArray = ArrayUtils.add(numberArray1, Float.valueOf(3));
-        assertTrue(Arrays.equals(new Number[]{Integer.valueOf(1), Double.valueOf(2), Float.valueOf(3)}, newArray));
-        assertEquals(Number.class, newArray.getClass().getComponentType());
-
-        numberArray1 = null;
-        newArray = ArrayUtils.add(numberArray1, Float.valueOf(3));
-        assertTrue(Arrays.equals(new Float[]{Float.valueOf(3)}, newArray));
-        assertEquals(Float.class, newArray.getClass().getComponentType());
-    }
-    
-    @Test
-    public void testLANG571(){
-        final String[] stringArray=null;
-        final String aString=null;
-        try {
-            @SuppressWarnings("unused")
-            final
-            String[] sa = ArrayUtils.add(stringArray, aString);
-            fail("Should have caused IllegalArgumentException");
-        } catch (final IllegalArgumentException iae){
-            //expected
-        }
-        try {
-            @SuppressWarnings("unused")
-            final
-            String[] sa = ArrayUtils.add(stringArray, 0, aString);
-            fail("Should have caused IllegalArgumentException");
-        } catch (final IllegalArgumentException iae){
-            //expected
-        }
-    }
-
-    @Test
-    public void testAddObjectArrayToObjectArray() {
-        assertNull(ArrayUtils.addAll((Object[]) null, (Object[]) null));
-        Object[] newArray;
-        final String[] stringArray1 = new String[]{"a", "b", "c"};
-        final String[] stringArray2 = new String[]{"1", "2", "3"};
-        newArray = ArrayUtils.addAll(stringArray1, (String[]) null);
-        assertNotSame(stringArray1, newArray);
-        assertTrue(Arrays.equals(stringArray1, newArray));
-        assertTrue(Arrays.equals(new String[]{"a", "b", "c"}, newArray));
-        assertEquals(String.class, newArray.getClass().getComponentType());
-        newArray = ArrayUtils.addAll(null, stringArray2);
-        assertNotSame(stringArray2, newArray);
-        assertTrue(Arrays.equals(stringArray2, newArray));
-        assertTrue(Arrays.equals(new String[]{"1", "2", "3"}, newArray));
-        assertEquals(String.class, newArray.getClass().getComponentType());
-        newArray = ArrayUtils.addAll(stringArray1, stringArray2);
-        assertTrue(Arrays.equals(new String[]{"a", "b", "c", "1", "2", "3"}, newArray));
-        assertEquals(String.class, newArray.getClass().getComponentType());
-        newArray = ArrayUtils.addAll(ArrayUtils.EMPTY_STRING_ARRAY, (String[]) null);
-        assertTrue(Arrays.equals(ArrayUtils.EMPTY_STRING_ARRAY, newArray));
-        assertTrue(Arrays.equals(new String[]{}, newArray));
-        assertEquals(String.class, newArray.getClass().getComponentType());
-        newArray = ArrayUtils.addAll(null, ArrayUtils.EMPTY_STRING_ARRAY);
-        assertTrue(Arrays.equals(ArrayUtils.EMPTY_STRING_ARRAY, newArray));
-        assertTrue(Arrays.equals(new String[]{}, newArray));
-        assertEquals(String.class, newArray.getClass().getComponentType());
-        newArray = ArrayUtils.addAll(ArrayUtils.EMPTY_STRING_ARRAY, ArrayUtils.EMPTY_STRING_ARRAY);
-        assertTrue(Arrays.equals(ArrayUtils.EMPTY_STRING_ARRAY, newArray));
-        assertTrue(Arrays.equals(new String[]{}, newArray));
-        assertEquals(String.class, newArray.getClass().getComponentType());
-        final String[] stringArrayNull = new String []{null};
-        newArray = ArrayUtils.addAll(stringArrayNull, stringArrayNull);
-        assertTrue(Arrays.equals(new String[]{null, null}, newArray));
-        assertEquals(String.class, newArray.getClass().getComponentType());
-
-        // boolean
-        assertTrue( Arrays.equals( new boolean[] { true, false, false, true },
-            ArrayUtils.addAll( new boolean[] { true, false }, new boolean[] { false, true } ) ) );
-
-        assertTrue( Arrays.equals( new boolean[] { false, true },
-            ArrayUtils.addAll( null, new boolean[] { false, true } ) ) );
-
-        assertTrue( Arrays.equals( new boolean[] { true, false },
-            ArrayUtils.addAll( new boolean[] { true, false }, null ) ) );
-
-        // char
-        assertTrue( Arrays.equals( new char[] { 'a', 'b', 'c', 'd' },
-            ArrayUtils.addAll( new char[] { 'a', 'b' }, new char[] { 'c', 'd' } ) ) );
-
-        assertTrue( Arrays.equals( new char[] { 'c', 'd' },
-            ArrayUtils.addAll( null, new char[] { 'c', 'd' } ) ) );
-
-        assertTrue( Arrays.equals( new char[] { 'a', 'b' },
-            ArrayUtils.addAll( new char[] { 'a', 'b' }, null ) ) );
-
-        // byte
-        assertTrue( Arrays.equals( new byte[] { (byte) 0, (byte) 1, (byte) 2, (byte) 3 },
-            ArrayUtils.addAll( new byte[] { (byte) 0, (byte) 1 }, new byte[] { (byte) 2, (byte) 3 } ) ) );
-
-        assertTrue( Arrays.equals( new byte[] { (byte) 2, (byte) 3 },
-            ArrayUtils.addAll( null, new byte[] { (byte) 2, (byte) 3 } ) ) );
-
-        assertTrue( Arrays.equals( new byte[] { (byte) 0, (byte) 1 },
-            ArrayUtils.addAll( new byte[] { (byte) 0, (byte) 1 }, null ) ) );
-
-        // short
-        assertTrue( Arrays.equals( new short[] { (short) 10, (short) 20, (short) 30, (short) 40 },
-            ArrayUtils.addAll( new short[] { (short) 10, (short) 20 }, new short[] { (short) 30, (short) 40 } ) ) );
-
-        assertTrue( Arrays.equals( new short[] { (short) 30, (short) 40 },
-            ArrayUtils.addAll( null, new short[] { (short) 30, (short) 40 } ) ) );
-
-        assertTrue( Arrays.equals( new short[] { (short) 10, (short) 20 },
-            ArrayUtils.addAll( new short[] { (short) 10, (short) 20 }, null ) ) );
-
-        // int
-        assertTrue( Arrays.equals( new int[] { 1, 1000, -1000, -1 },
-            ArrayUtils.addAll( new int[] { 1, 1000 }, new int[] { -1000, -1 } ) ) );
-
-        assertTrue( Arrays.equals( new int[] { -1000, -1 },
-            ArrayUtils.addAll( null, new int[] { -1000, -1 } ) ) );
-
-        assertTrue( Arrays.equals( new int[] { 1, 1000 },
-            ArrayUtils.addAll( new int[] { 1, 1000 }, null ) ) );
-
-        // long
-        assertTrue( Arrays.equals( new long[] { 1L, -1L, 1000L, -1000L },
-            ArrayUtils.addAll( new long[] { 1L, -1L }, new long[] { 1000L, -1000L } ) ) );
-
-        assertTrue( Arrays.equals( new long[] { 1000L, -1000L },
-            ArrayUtils.addAll( null, new long[] { 1000L, -1000L } ) ) );
-
-        assertTrue( Arrays.equals( new long[] { 1L, -1L },
-            ArrayUtils.addAll( new long[] { 1L, -1L }, null ) ) );
-
-        // float
-        assertTrue( Arrays.equals( new float[] { 10.5f, 10.1f, 1.6f, 0.01f },
-            ArrayUtils.addAll( new float[] { 10.5f, 10.1f }, new float[] { 1.6f, 0.01f } ) ) );
-
-        assertTrue( Arrays.equals( new float[] { 1.6f, 0.01f },
-            ArrayUtils.addAll( null, new float[] { 1.6f, 0.01f } ) ) );
-
-        assertTrue( Arrays.equals( new float[] { 10.5f, 10.1f },
-            ArrayUtils.addAll( new float[] { 10.5f, 10.1f }, null ) ) );
-
-        // double
-        assertTrue( Arrays.equals( new double[] { Math.PI, -Math.PI, 0, 9.99 },
-            ArrayUtils.addAll( new double[] { Math.PI, -Math.PI }, new double[] { 0, 9.99 } ) ) );
-
-        assertTrue( Arrays.equals( new double[] { 0, 9.99 },
-            ArrayUtils.addAll( null, new double[] { 0, 9.99 } ) ) );
-
-        assertTrue( Arrays.equals( new double[] { Math.PI, -Math.PI },
-            ArrayUtils.addAll( new double[] { Math.PI, -Math.PI }, null ) ) );
-
-    }
-
-    @Test
-    public void testAddObjectAtIndex() {
-        Object[] newArray;
-        newArray = ArrayUtils.add((Object[])null, 0, "a");
-        assertTrue(Arrays.equals(new String[]{"a"}, newArray));
-        assertTrue(Arrays.equals(new Object[]{"a"}, newArray));
-        assertEquals(String.class, newArray.getClass().getComponentType());
-        final String[] stringArray1 = new String[]{"a", "b", "c"};
-        newArray = ArrayUtils.add(stringArray1, 0, null);
-        assertTrue(Arrays.equals(new String[]{null, "a", "b", "c"}, newArray));
-        assertEquals(String.class, newArray.getClass().getComponentType());
-        newArray = ArrayUtils.add(stringArray1, 1, null);
-        assertTrue(Arrays.equals(new String[]{"a", null, "b", "c"}, newArray));
-        assertEquals(String.class, newArray.getClass().getComponentType());
-        newArray = ArrayUtils.add(stringArray1, 3, null);
-        assertTrue(Arrays.equals(new String[]{"a", "b", "c", null}, newArray));
-        assertEquals(String.class, newArray.getClass().getComponentType());
-        newArray = ArrayUtils.add(stringArray1, 3, "d");
-        assertTrue(Arrays.equals(new String[]{"a", "b", "c", "d"}, newArray));
-        assertEquals(String.class, newArray.getClass().getComponentType());
-        assertEquals(String.class, newArray.getClass().getComponentType());
-
-        final Object[] o = new Object[] {"1", "2", "4"};
-        final Object[] result = ArrayUtils.add(o, 2, "3");
-        final Object[] result2 = ArrayUtils.add(o, 3, "5");
-
-        assertNotNull(result);
-        assertEquals(4, result.length);
-        assertEquals("1", result[0]);
-        assertEquals("2", result[1]);
-        assertEquals("3", result[2]);
-        assertEquals("4", result[3]);
-        assertNotNull(result2);
-        assertEquals(4, result2.length);
-        assertEquals("1", result2[0]);
-        assertEquals("2", result2[1]);
-        assertEquals("4", result2[2]);
-        assertEquals("5", result2[3]);
-
-        // boolean tests
-        boolean[] booleanArray = ArrayUtils.add( null, 0, true );
-        assertTrue( Arrays.equals( new boolean[] { true }, booleanArray ) );
-        try {
-            booleanArray = ArrayUtils.add( null, -1, true );
-        } catch(final IndexOutOfBoundsException e) {
-            assertEquals("Index: -1, Length: 0", e.getMessage());
-        }
-        booleanArray = ArrayUtils.add( new boolean[] { true }, 0, false);
-        assertTrue( Arrays.equals( new boolean[] { false, true }, booleanArray ) );
-        booleanArray = ArrayUtils.add( new boolean[] { false }, 1, true);
-        assertTrue( Arrays.equals( new boolean[] { false, true }, booleanArray ) );
-        booleanArray = ArrayUtils.add( new boolean[] { true, false }, 1, true);
-        assertTrue( Arrays.equals( new boolean[] { true, true, false }, booleanArray ) );
-        try {
-            booleanArray = ArrayUtils.add( new boolean[] { true, false }, 4, true);
-        } catch(final IndexOutOfBoundsException e) {
-            assertEquals("Index: 4, Length: 2", e.getMessage());
-        }
-        try {
-            booleanArray = ArrayUtils.add( new boolean[] { true, false }, -1, true);
-        } catch(final IndexOutOfBoundsException e) {
-            assertEquals("Index: -1, Length: 2", e.getMessage());
-        }
-
-        // char tests
-        char[] charArray = ArrayUtils.add( (char[]) null, 0, 'a' );
-        assertTrue( Arrays.equals( new char[] { 'a' }, charArray ) );
-        try {
-            charArray = ArrayUtils.add( (char[]) null, -1, 'a' );
-        } catch(final IndexOutOfBoundsException e) {
-            assertEquals("Index: -1, Length: 0", e.getMessage());
-        }
-        charArray = ArrayUtils.add( new char[] { 'a' }, 0, 'b');
-        assertTrue( Arrays.equals( new char[] { 'b', 'a' }, charArray ) );
-        charArray = ArrayUtils.add( new char[] { 'a', 'b' }, 0, 'c');
-        assertTrue( Arrays.equals( new char[] { 'c', 'a', 'b' }, charArray ) );
-        charArray = ArrayUtils.add( new char[] { 'a', 'b' }, 1, 'k');
-        assertTrue( Arrays.equals( new char[] { 'a', 'k', 'b' }, charArray ) );
-        charArray = ArrayUtils.add( new char[] { 'a', 'b', 'c' }, 1, 't');
-        assertTrue( Arrays.equals( new char[] { 'a', 't', 'b', 'c' }, charArray ) );
-        try {
-            charArray = ArrayUtils.add( new char[] { 'a', 'b' }, 4, 'c');
-        } catch(final IndexOutOfBoundsException e) {
-            assertEquals("Index: 4, Length: 2", e.getMessage());
-        }
-        try {
-            charArray = ArrayUtils.add( new char[] { 'a', 'b' }, -1, 'c');
-        } catch(final IndexOutOfBoundsException e) {
-            assertEquals("Index: -1, Length: 2", e.getMessage());
-        }
-
-        // short tests
-        short[] shortArray = ArrayUtils.add( new short[] { 1 }, 0, (short) 2);
-        assertTrue( Arrays.equals( new short[] { 2, 1 }, shortArray ) );
-        try {
-            shortArray = ArrayUtils.add( (short[]) null, -1, (short) 2);
-        } catch(final IndexOutOfBoundsException e) {
-            assertEquals("Index: -1, Length: 0", e.getMessage());
-        }
-        shortArray = ArrayUtils.add( new short[] { 2, 6 }, 2, (short) 10);
-        assertTrue( Arrays.equals( new short[] { 2, 6, 10 }, shortArray ) );
-        shortArray = ArrayUtils.add( new short[] { 2, 6 }, 0, (short) -4);
-        assertTrue( Arrays.equals( new short[] { -4, 2, 6 }, shortArray ) );
-        shortArray = ArrayUtils.add( new short[] { 2, 6, 3 }, 2, (short) 1);
-        assertTrue( Arrays.equals( new short[] { 2, 6, 1, 3 }, shortArray ) );
-        try {
-            shortArray = ArrayUtils.add( new short[] { 2, 6 }, 4, (short) 10);
-        } catch(final IndexOutOfBoundsException e) {
-            assertEquals("Index: 4, Length: 2", e.getMessage());
-        }
-        try {
-            shortArray = ArrayUtils.add( new short[] { 2, 6 }, -1, (short) 10);
-        } catch(final IndexOutOfBoundsException e) {
-            assertEquals("Index: -1, Length: 2", e.getMessage());
-        }
-
-        // byte tests
-        byte[] byteArray = ArrayUtils.add( new byte[] { 1 }, 0, (byte) 2);
-        assertTrue( Arrays.equals( new byte[] { 2, 1 }, byteArray ) );
-        try {
-            byteArray = ArrayUtils.add( (byte[]) null, -1, (byte) 2);
-        } catch(final IndexOutOfBoundsException e) {
-            assertEquals("Index: -1, Length: 0", e.getMessage());
-        }
-        byteArray = ArrayUtils.add( new byte[] { 2, 6 }, 2, (byte) 3);
-        assertTrue( Arrays.equals( new byte[] { 2, 6, 3 }, byteArray ) );
-        byteArray = ArrayUtils.add( new byte[] { 2, 6 }, 0, (byte) 1);
-        assertTrue( Arrays.equals( new byte[] { 1, 2, 6 }, byteArray ) );
-        byteArray = ArrayUtils.add( new byte[] { 2, 6, 3 }, 2, (byte) 1);
-        assertTrue( Arrays.equals( new byte[] { 2, 6, 1, 3 }, byteArray ) );
-        try {
-            byteArray = ArrayUtils.add( new byte[] { 2, 6 }, 4, (byte) 3);
-        } catch(final IndexOutOfBoundsException e) {
-            assertEquals("Index: 4, Length: 2", e.getMessage());
-        }
-        try {
-            byteArray = ArrayUtils.add( new byte[] { 2, 6 }, -1, (byte) 3);
-        } catch(final IndexOutOfBoundsException e) {
-            assertEquals("Index: -1, Length: 2", e.getMessage());
-        }
-
-        // int tests
-        int[] intArray = ArrayUtils.add( new int[] { 1 }, 0, 2);
-        assertTrue( Arrays.equals( new int[] { 2, 1 }, intArray ) );
-        try {
-            intArray = ArrayUtils.add( (int[]) null, -1, 2);
-        } catch(final IndexOutOfBoundsException e) {
-            assertEquals("Index: -1, Length: 0", e.getMessage());
-        }
-        intArray = ArrayUtils.add( new int[] { 2, 6 }, 2, 10);
-        assertTrue( Arrays.equals( new int[] { 2, 6, 10 }, intArray ) );
-        intArray = ArrayUtils.add( new int[] { 2, 6 }, 0, -4);
-        assertTrue( Arrays.equals( new int[] { -4, 2, 6 }, intArray ) );
-        intArray = ArrayUtils.add( new int[] { 2, 6, 3 }, 2, 1);
-        assertTrue( Arrays.equals( new int[] { 2, 6, 1, 3 }, intArray ) );
-        try {
-            intArray = ArrayUtils.add( new int[] { 2, 6 }, 4, 10);
-        } catch(final IndexOutOfBoundsException e) {
-            assertEquals("Index: 4, Length: 2", e.getMessage());
-        }
-        try {
-            intArray = ArrayUtils.add( new int[] { 2, 6 }, -1, 10);
-        } catch(final IndexOutOfBoundsException e) {
-            assertEquals("Index: -1, Length: 2", e.getMessage());
-        }
-
-        // long tests
-        long[] longArray = ArrayUtils.add( new long[] { 1L }, 0, 2L);
-        assertTrue( Arrays.equals( new long[] { 2L, 1L }, longArray ) );
-        try {
-            longArray = ArrayUtils.add( (long[]) null, -1, 2L);
-        } catch(final IndexOutOfBoundsException e) {
-            assertEquals("Index: -1, Length: 0", e.getMessage());
-        }
-        longArray = ArrayUtils.add( new long[] { 2L, 6L }, 2, 10L);
-        assertTrue( Arrays.equals( new long[] { 2L, 6L, 10L }, longArray ) );
-        longArray = ArrayUtils.add( new long[] { 2L, 6L }, 0, -4L);
-        assertTrue( Arrays.equals( new long[] { -4L, 2L, 6L }, longArray ) );
-        longArray = ArrayUtils.add( new long[] { 2L, 6L, 3L }, 2, 1L);
-        assertTrue( Arrays.equals( new long[] { 2L, 6L, 1L, 3L }, longArray ) );
-        try {
-            longArray = ArrayUtils.add( new long[] { 2L, 6L }, 4, 10L);
-        } catch(final IndexOutOfBoundsException e) {
-            assertEquals("Index: 4, Length: 2", e.getMessage());
-        }
-        try {
-            longArray = ArrayUtils.add( new long[] { 2L, 6L }, -1, 10L);
-        } catch(final IndexOutOfBoundsException e) {
-            assertEquals("Index: -1, Length: 2", e.getMessage());
-        }
-
-        // float tests
-        float[] floatArray = ArrayUtils.add( new float[] { 1.1f }, 0, 2.2f);
-        assertTrue( Arrays.equals( new float[] { 2.2f, 1.1f }, floatArray ) );
-        try {
-            floatArray = ArrayUtils.add( (float[]) null, -1, 2.2f);
-        } catch(final IndexOutOfBoundsException e) {
-            assertEquals("Index: -1, Length: 0", e.getMessage());
-        }
-        floatArray = ArrayUtils.add( new float[] { 2.3f, 6.4f }, 2, 10.5f);
-        assertTrue( Arrays.equals( new float[] { 2.3f, 6.4f, 10.5f }, floatArray ) );
-        floatArray = ArrayUtils.add( new float[] { 2.6f, 6.7f }, 0, -4.8f);
-        assertTrue( Arrays.equals( new float[] { -4.8f, 2.6f, 6.7f }, floatArray ) );
-        floatArray = ArrayUtils.add( new float[] { 2.9f, 6.0f, 0.3f }, 2, 1.0f);
-        assertTrue( Arrays.equals( new float[] { 2.9f, 6.0f, 1.0f, 0.3f }, floatArray ) );
-        try {
-            floatArray = ArrayUtils.add( new float[] { 2.3f, 6.4f }, 4, 10.5f);
-        } catch(final IndexOutOfBoundsException e) {
-            assertEquals("Index: 4, Length: 2", e.getMessage());
-        }
-        try {
-            floatArray = ArrayUtils.add( new float[] { 2.3f, 6.4f }, -1, 10.5f);
-        } catch(final IndexOutOfBoundsException e) {
-            assertEquals("Index: -1, Length: 2", e.getMessage());
-        }
-
-        // double tests
-        double[] doubleArray = ArrayUtils.add( new double[] { 1.1 }, 0, 2.2);
-        assertTrue( Arrays.equals( new double[] { 2.2, 1.1 }, doubleArray ) );
-        try {
-          doubleArray = ArrayUtils.add( (double[]) null, -1, 2.2);
-        } catch(final IndexOutOfBoundsException e) {
-            assertEquals("Index: -1, Length: 0", e.getMessage());
-        }
-        doubleArray = ArrayUtils.add( new double[] { 2.3, 6.4 }, 2, 10.5);
-        assertTrue( Arrays.equals( new double[] { 2.3, 6.4, 10.5 }, doubleArray ) );
-        doubleArray = ArrayUtils.add( new double[] { 2.6, 6.7 }, 0, -4.8);
-        assertTrue( Arrays.equals( new double[] { -4.8, 2.6, 6.7 }, doubleArray ) );
-        doubleArray = ArrayUtils.add( new double[] { 2.9, 6.0, 0.3 }, 2, 1.0);
-        assertTrue( Arrays.equals( new double[] { 2.9, 6.0, 1.0, 0.3 }, doubleArray ) );
-        try {
-            doubleArray = ArrayUtils.add( new double[] { 2.3, 6.4 }, 4, 10.5);
-        } catch(final IndexOutOfBoundsException e) {
-            assertEquals("Index: 4, Length: 2", e.getMessage());
-        }
-        try {
-            doubleArray = ArrayUtils.add( new double[] { 2.3, 6.4 }, -1, 10.5);
-        } catch(final IndexOutOfBoundsException e) {
-            assertEquals("Index: -1, Length: 2", e.getMessage());
-        }
-    }
-
-}
diff --git a/lang/src/test/java/org/apache/commons/lang3/ArrayUtilsRemoveMultipleTest.java b/lang/src/test/java/org/apache/commons/lang3/ArrayUtilsRemoveMultipleTest.java
deleted file mode 100644
index ba01c80..0000000
--- a/lang/src/test/java/org/apache/commons/lang3/ArrayUtilsRemoveMultipleTest.java
+++ /dev/null
@@ -1,1053 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- * 
- *      http://www.apache.org/licenses/LICENSE-2.0
- * 
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package org.apache.commons.lang3;
-
-import static org.junit.Assert.assertArrayEquals;
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertNotSame;
-import static org.junit.Assert.assertNull;
-import static org.junit.Assert.assertTrue;
-
-import java.util.Arrays;
-
-import org.junit.Test;
-
-/**
- * Tests ArrayUtils remove and removeElement methods.
- * 
- * @version $Id$
- */
-public class ArrayUtilsRemoveMultipleTest {
-
-    @Test
-    public void testRemoveAllObjectArray() {
-        Object[] array;
-        array = ArrayUtils.removeAll(new Object[] { "a" }, 0);
-        assertArrayEquals(ArrayUtils.EMPTY_OBJECT_ARRAY, array);
-        assertEquals(Object.class, array.getClass().getComponentType());
-        array = ArrayUtils.removeAll(new Object[] { "a", "b" }, 0, 1);
-        assertArrayEquals(ArrayUtils.EMPTY_OBJECT_ARRAY, array);
-        assertEquals(Object.class, array.getClass().getComponentType());
-        array = ArrayUtils.removeAll(new Object[] { "a", "b", "c" }, 1, 2);
-        assertArrayEquals(new Object[] { "a" }, array);
-        assertEquals(Object.class, array.getClass().getComponentType());
-        array = ArrayUtils.removeAll(new Object[] { "a", "b", "c", "d" }, 1, 2);
-        assertArrayEquals(new Object[] { "a", "d" }, array);
-        assertEquals(Object.class, array.getClass().getComponentType());
-        array = ArrayUtils.removeAll(new Object[] { "a", "b", "c", "d" }, 0, 3);
-        assertArrayEquals(new Object[] { "b", "c" }, array);
-        assertEquals(Object.class, array.getClass().getComponentType());
-        array = ArrayUtils.removeAll(new Object[] { "a", "b", "c", "d" }, 0, 1, 3);
-        assertArrayEquals(new Object[] { "c" }, array);
-        assertEquals(Object.class, array.getClass().getComponentType());
-        array = ArrayUtils.removeAll(new Object[] { "a", "b", "c", "d", "e" }, 0, 1, 3);
-        assertArrayEquals(new Object[] { "c", "e" }, array);
-        assertEquals(Object.class, array.getClass().getComponentType());
-        array = ArrayUtils.removeAll(new Object[] { "a", "b", "c", "d", "e" }, 0, 2, 4);
-        assertArrayEquals(new Object[] { "b", "d" }, array);
-        assertEquals(Object.class, array.getClass().getComponentType());
-        array = ArrayUtils.removeAll(new Object[] { "a", "b", "c", "d" }, 0, 1, 3, 0, 1, 3);
-        assertArrayEquals(new Object[] { "c" }, array);
-        assertEquals(Object.class, array.getClass().getComponentType());
-        array = ArrayUtils.removeAll(new Object[] { "a", "b", "c", "d" }, 2, 1, 0, 3);
-        assertArrayEquals(ArrayUtils.EMPTY_OBJECT_ARRAY, array);
-        assertEquals(Object.class, array.getClass().getComponentType());
-        array = ArrayUtils.removeAll(new Object[] { "a", "b", "c", "d" }, 2, 0, 1, 3, 0, 2, 1, 3);
-        assertArrayEquals(ArrayUtils.EMPTY_OBJECT_ARRAY, array);
-        assertEquals(Object.class, array.getClass().getComponentType());
-    }
-
-    @Test
-    public void testRemoveAllObjectArrayRemoveNone() {
-        final Object[] array1 = new Object[] { "foo", "bar", "baz" };
-        final Object[] array2 = ArrayUtils.removeAll(array1);
-        assertNotSame(array1, array2);
-        assertArrayEquals(array1, array2);
-        assertEquals(Object.class, array2.getClass().getComponentType());
-    }
-
-    @Test(expected = IndexOutOfBoundsException.class)
-    public void testRemoveAllObjectArrayNegativeIndex() {
-        ArrayUtils.removeAll(new Object[] { "a", "b" }, -1);
-    }
-
-    @Test(expected = IndexOutOfBoundsException.class)
-    public void testRemoveAllObjectArrayOutOfBoundsIndex() {
-        ArrayUtils.removeAll(new Object[] { "a", "b" }, 2);
-    }
-
-    @Test(expected = IndexOutOfBoundsException.class)
-    public void testRemoveAllNullObjectArray() {
-        ArrayUtils.remove((Object[]) null, 0);
-    }
-
-    @Test
-    public void testRemoveAllNumberArray() {
-        final Number[] inarray = { Integer.valueOf(1), Long.valueOf(2L), Byte.valueOf((byte) 3) };
-        assertEquals(3, inarray.length);
-        Number[] outarray;
-        outarray = ArrayUtils.removeAll(inarray, 1);
-        assertArrayEquals(new Number[] { Integer.valueOf(1), Byte.valueOf((byte) 3) }, outarray);
-        assertEquals(Number.class, outarray.getClass().getComponentType());
-        outarray = ArrayUtils.removeAll(outarray, 1);
-        assertArrayEquals(new Number[] { Integer.valueOf(1) }, outarray);
-        assertEquals(Number.class, outarray.getClass().getComponentType());
-        outarray = ArrayUtils.removeAll(outarray, 0);
-        assertEquals(0, outarray.length);
-        assertEquals(Number.class, outarray.getClass().getComponentType());
-
-        outarray = ArrayUtils.removeAll(inarray, 0, 1);
-        assertArrayEquals(new Number[] { Byte.valueOf((byte) 3) }, outarray);
-        assertEquals(Number.class, outarray.getClass().getComponentType());
-        outarray = ArrayUtils.removeAll(inarray, 0, 2);
-        assertArrayEquals(new Number[] { Long.valueOf(2L) }, outarray);
-        assertEquals(Number.class, outarray.getClass().getComponentType());
-        outarray = ArrayUtils.removeAll(inarray, 1, 2);
-        assertArrayEquals(new Number[] { Integer.valueOf(1) }, outarray);
-        assertEquals(Number.class, outarray.getClass().getComponentType());
-    }
-
-    @Test
-    public void testRemoveAllBooleanArray() {
-        boolean[] array;
-        array = ArrayUtils.removeAll(new boolean[] { true }, 0);
-        assertTrue(Arrays.equals(ArrayUtils.EMPTY_BOOLEAN_ARRAY, array));
-        assertEquals(Boolean.TYPE, array.getClass().getComponentType());
-        array = ArrayUtils.removeAll(new boolean[] { true, false }, 0);
-        assertTrue(Arrays.equals(new boolean[] { false }, array));
-        assertEquals(Boolean.TYPE, array.getClass().getComponentType());
-        array = ArrayUtils.removeAll(new boolean[] { true, false }, 1);
-        assertTrue(Arrays.equals(new boolean[] { true }, array));
-        assertEquals(Boolean.TYPE, array.getClass().getComponentType());
-        array = ArrayUtils.removeAll(new boolean[] { true, false, true }, 1);
-        assertTrue(Arrays.equals(new boolean[] { true, true }, array));
-        assertEquals(Boolean.TYPE, array.getClass().getComponentType());
-
-        array = ArrayUtils.removeAll(new boolean[] { true, false }, 0, 1);
-        assertTrue(Arrays.equals(ArrayUtils.EMPTY_BOOLEAN_ARRAY, array));
-        assertEquals(Boolean.TYPE, array.getClass().getComponentType());
-        array = ArrayUtils.removeAll(new boolean[] { true, false, false }, 0, 1);
-        assertTrue(Arrays.equals(new boolean[] { false }, array));
-        assertEquals(Boolean.TYPE, array.getClass().getComponentType());
-        array = ArrayUtils.removeAll(new boolean[] { true, false, false }, 0, 2);
-        assertTrue(Arrays.equals(new boolean[] { false }, array));
-        assertEquals(Boolean.TYPE, array.getClass().getComponentType());
-        array = ArrayUtils.removeAll(new boolean[] { true, false, false }, 1, 2);
-        assertTrue(Arrays.equals(new boolean[] { true }, array));
-        assertEquals(Boolean.TYPE, array.getClass().getComponentType());
-        array = ArrayUtils.removeAll(new boolean[] { true, false, true, false, true }, 0, 2, 4);
-        assertTrue(Arrays.equals(new boolean[] { false, false }, array));
-        assertEquals(Boolean.TYPE, array.getClass().getComponentType());
-        array = ArrayUtils.removeAll(new boolean[] { true, false, true, false, true }, 1, 3);
-        assertTrue(Arrays.equals(new boolean[] { true, true, true }, array));
-        assertEquals(Boolean.TYPE, array.getClass().getComponentType());
-        array = ArrayUtils.removeAll(new boolean[] { true, false, true, false, true }, 1, 3, 4);
-        assertTrue(Arrays.equals(new boolean[] { true, true }, array));
-        assertEquals(Boolean.TYPE, array.getClass().getComponentType());
-        array = ArrayUtils.removeAll(new boolean[] { true, false, true, false, true, false, true }, 0, 2, 4, 6);
-        assertTrue(Arrays.equals(new boolean[] { false, false, false }, array));
-        assertEquals(Boolean.TYPE, array.getClass().getComponentType());
-        array = ArrayUtils.removeAll(new boolean[] { true, false, true, false, true, false, true }, 1, 3, 5);
-        assertTrue(Arrays.equals(new boolean[] { true, true, true, true }, array));
-        assertEquals(Boolean.TYPE, array.getClass().getComponentType());
-        array = ArrayUtils.removeAll(new boolean[] { true, false, true, false, true, false, true }, 0, 1, 2);
-        assertTrue(Arrays.equals(new boolean[] { false, true, false, true }, array));
-        assertEquals(Boolean.TYPE, array.getClass().getComponentType());
-    }
-
-    @Test
-    public void testRemoveAllBooleanArrayRemoveNone() {
-        final boolean[] array1 = new boolean[] { true, false };
-        final boolean[] array2 = ArrayUtils.removeAll(array1);
-        assertNotSame(array1, array2);
-        assertTrue(Arrays.equals(array1, array2));
-        assertEquals(boolean.class, array2.getClass().getComponentType());
-    }
-
-    @Test(expected = IndexOutOfBoundsException.class)
-    public void testRemoveAllBooleanArrayNegativeIndex() {
-        ArrayUtils.removeAll(new boolean[] { true, false }, -1);
-    }
-
-    @Test(expected = IndexOutOfBoundsException.class)
-    public void testRemoveAllBooleanArrayOutOfBoundsIndex() {
-        ArrayUtils.removeAll(new boolean[] { true, false }, 2);
-    }
-
-    @Test(expected = IndexOutOfBoundsException.class)
-    public void testRemoveAllNullBooleanArray() {
-        ArrayUtils.removeAll((boolean[]) null, 0);
-    }
-
-    @Test
-    public void testRemoveAllByteArray() {
-        byte[] array;
-        array = ArrayUtils.removeAll(new byte[] { 1 }, 0);
-        assertTrue(Arrays.equals(ArrayUtils.EMPTY_BYTE_ARRAY, array));
-        assertEquals(Byte.TYPE, array.getClass().getComponentType());
-        array = ArrayUtils.removeAll(new byte[] { 1, 2 }, 0);
-        assertTrue(Arrays.equals(new byte[] { 2 }, array));
-        assertEquals(Byte.TYPE, array.getClass().getComponentType());
-        array = ArrayUtils.removeAll(new byte[] { 1, 2 }, 1);
-        assertTrue(Arrays.equals(new byte[] { 1 }, array));
-        assertEquals(Byte.TYPE, array.getClass().getComponentType());
-        array = ArrayUtils.removeAll(new byte[] { 1, 2, 1 }, 1);
-        assertTrue(Arrays.equals(new byte[] { 1, 1 }, array));
-        assertEquals(Byte.TYPE, array.getClass().getComponentType());
-
-        array = ArrayUtils.removeAll(new byte[] { 1, 2 }, 0, 1);
-        assertTrue(Arrays.equals(ArrayUtils.EMPTY_BYTE_ARRAY, array));
-        assertEquals(Byte.TYPE, array.getClass().getComponentType());
-        array = ArrayUtils.removeAll(new byte[] { 1, 2, 3 }, 0, 1);
-        assertTrue(Arrays.equals(new byte[] { 3 }, array));
-        assertEquals(Byte.TYPE, array.getClass().getComponentType());
-        array = ArrayUtils.removeAll(new byte[] { 1, 2, 3 }, 1, 2);
-        assertTrue(Arrays.equals(new byte[] { 1 }, array));
-        assertEquals(Byte.TYPE, array.getClass().getComponentType());
-        array = ArrayUtils.removeAll(new byte[] { 1, 2, 3 }, 0, 2);
-        assertTrue(Arrays.equals(new byte[] { 2 }, array));
-        assertEquals(Byte.TYPE, array.getClass().getComponentType());
-        array = ArrayUtils.removeAll(new byte[] { 1, 2, 3, 4, 5 }, 1, 3);
-        assertTrue(Arrays.equals(new byte[] { 1, 3, 5 }, array));
-        assertEquals(Byte.TYPE, array.getClass().getComponentType());
-        array = ArrayUtils.removeAll(new byte[] { 1, 2, 3, 4, 5 }, 0, 2, 4);
-        assertTrue(Arrays.equals(new byte[] { 2, 4 }, array));
-        assertEquals(Byte.TYPE, array.getClass().getComponentType());
-        array = ArrayUtils.removeAll(new byte[] { 1, 2, 3, 4, 5, 6, 7 }, 1, 3, 5);
-        assertTrue(Arrays.equals(new byte[] { 1, 3, 5, 7 }, array));
-        assertEquals(Byte.TYPE, array.getClass().getComponentType());
-        array = ArrayUtils.removeAll(new byte[] { 1, 2, 3, 4, 5, 6, 7 }, 0, 2, 4, 6);
-        assertTrue(Arrays.equals(new byte[] { 2, 4, 6 }, array));
-        assertEquals(Byte.TYPE, array.getClass().getComponentType());
-    }
-
-    @Test
-    public void testRemoveAllByteArrayRemoveNone() {
-        final byte[] array1 = new byte[] { 1, 2 };
-        final byte[] array2 = ArrayUtils.removeAll(array1);
-        assertNotSame(array1, array2);
-        assertArrayEquals(array1, array2);
-        assertEquals(byte.class, array2.getClass().getComponentType());
-    }
-
-    @Test(expected = IndexOutOfBoundsException.class)
-    public void testRemoveAllByteArrayNegativeIndex() {
-        ArrayUtils.removeAll(new byte[] { 1, 2 }, -1);
-    }
-
-    @Test(expected = IndexOutOfBoundsException.class)
-    public void testRemoveAllByteArrayOutOfBoundsIndex() {
-        ArrayUtils.removeAll(new byte[] { 1, 2 }, 2);
-    }
-
-    @Test(expected = IndexOutOfBoundsException.class)
-    public void testRemoveAllNullByteArray() {
-        ArrayUtils.removeAll((byte[]) null, 0);
-    }
-
-    @Test
-    public void testRemoveAllCharArray() {
-        char[] array;
-        array = ArrayUtils.removeAll(new char[] { 'a' }, 0);
-        assertTrue(Arrays.equals(ArrayUtils.EMPTY_CHAR_ARRAY, array));
-        assertEquals(Character.TYPE, array.getClass().getComponentType());
-        array = ArrayUtils.removeAll(new char[] { 'a', 'b' }, 0);
-        assertTrue(Arrays.equals(new char[] { 'b' }, array));
-        assertEquals(Character.TYPE, array.getClass().getComponentType());
-        array = ArrayUtils.removeAll(new char[] { 'a', 'b' }, 1);
-        assertTrue(Arrays.equals(new char[] { 'a' }, array));
-        assertEquals(Character.TYPE, array.getClass().getComponentType());
-        array = ArrayUtils.removeAll(new char[] { 'a', 'b', 'c' }, 1);
-        assertTrue(Arrays.equals(new char[] { 'a', 'c' }, array));
-        assertEquals(Character.TYPE, array.getClass().getComponentType());
-
-        array = ArrayUtils.removeAll(new char[] { 'a', 'b' }, 0, 1);
-        assertTrue(Arrays.equals(ArrayUtils.EMPTY_CHAR_ARRAY, array));
-        assertEquals(Character.TYPE, array.getClass().getComponentType());
-        array = ArrayUtils.removeAll(new char[] { 'a', 'b', 'c' }, 0, 1);
-        assertTrue(Arrays.equals(new char[] { 'c' }, array));
-        assertEquals(Character.TYPE, array.getClass().getComponentType());
-        array = ArrayUtils.removeAll(new char[] { 'a', 'b', 'c' }, 1, 2);
-        assertTrue(Arrays.equals(new char[] { 'a' }, array));
-        assertEquals(Character.TYPE, array.getClass().getComponentType());
-        array = ArrayUtils.removeAll(new char[] { 'a', 'b', 'c' }, 0, 2);
-        assertTrue(Arrays.equals(new char[] { 'b' }, array));
-        assertEquals(Character.TYPE, array.getClass().getComponentType());
-        array = ArrayUtils.removeAll(new char[] { 'a', 'b', 'c', 'd', 'e' }, 1, 3);
-        assertTrue(Arrays.equals(new char[] { 'a', 'c', 'e' }, array));
-        assertEquals(Character.TYPE, array.getClass().getComponentType());
-        array = ArrayUtils.removeAll(new char[] { 'a', 'b', 'c', 'd', 'e' }, 0, 2, 4);
-        assertTrue(Arrays.equals(new char[] { 'b', 'd' }, array));
-        assertEquals(Character.TYPE, array.getClass().getComponentType());
-        array = ArrayUtils.removeAll(new char[] { 'a', 'b', 'c', 'd', 'e', 'f', 'g' }, 1, 3, 5);
-        assertTrue(Arrays.equals(new char[] { 'a', 'c', 'e', 'g' }, array));
-        assertEquals(Character.TYPE, array.getClass().getComponentType());
-        array = ArrayUtils.removeAll(new char[] { 'a', 'b', 'c', 'd', 'e', 'f', 'g' }, 0, 2, 4, 6);
-        assertTrue(Arrays.equals(new char[] { 'b', 'd', 'f' }, array));
-        assertEquals(Character.TYPE, array.getClass().getComponentType());
-    }
-
-    @Test
-    public void testRemoveAllCharArrayRemoveNone() {
-        final char[] array1 = new char[] { 'a', 'b' };
-        final char[] array2 = ArrayUtils.removeAll(array1);
-        assertNotSame(array1, array2);
-        assertArrayEquals(array1, array2);
-        assertEquals(char.class, array2.getClass().getComponentType());
-    }
-
-    @Test(expected = IndexOutOfBoundsException.class)
-    public void testRemoveAllCharArrayNegativeIndex() {
-        ArrayUtils.removeAll(new char[] { 'a', 'b' }, -1);
-    }
-
-    @Test(expected = IndexOutOfBoundsException.class)
-    public void testRemoveAllCharArrayOutOfBoundsIndex() {
-        ArrayUtils.removeAll(new char[] { 'a', 'b' }, 2);
-    }
-
-    @Test(expected = IndexOutOfBoundsException.class)
-    public void testRemoveAllNullCharArray() {
-        ArrayUtils.removeAll((char[]) null, 0);
-    }
-
-    @Test
-    public void testRemoveAllDoubleArray() {
-        double[] array;
-        array = ArrayUtils.removeAll(new double[] { 1 }, 0);
-        assertTrue(Arrays.equals(ArrayUtils.EMPTY_DOUBLE_ARRAY, array));
-        assertEquals(Double.TYPE, array.getClass().getComponentType());
-        array = ArrayUtils.removeAll(new double[] { 1, 2 }, 0);
-        assertTrue(Arrays.equals(new double[] { 2 }, array));
-        assertEquals(Double.TYPE, array.getClass().getComponentType());
-        array = ArrayUtils.removeAll(new double[] { 1, 2 }, 1);
-        assertTrue(Arrays.equals(new double[] { 1 }, array));
-        assertEquals(Double.TYPE, array.getClass().getComponentType());
-        array = ArrayUtils.removeAll(new double[] { 1, 2, 1 }, 1);
-        assertTrue(Arrays.equals(new double[] { 1, 1 }, array));
-        assertEquals(Double.TYPE, array.getClass().getComponentType());
-
-        array = ArrayUtils.removeAll(new double[] { 1, 2 }, 0, 1);
-        assertTrue(Arrays.equals(ArrayUtils.EMPTY_DOUBLE_ARRAY, array));
-        assertEquals(Double.TYPE, array.getClass().getComponentType());
-        array = ArrayUtils.removeAll(new double[] { 1, 2, 3 }, 0, 1);
-        assertTrue(Arrays.equals(new double[] { 3 }, array));
-        assertEquals(Double.TYPE, array.getClass().getComponentType());
-        array = ArrayUtils.removeAll(new double[] { 1, 2, 3 }, 1, 2);
-        assertTrue(Arrays.equals(new double[] { 1 }, array));
-        assertEquals(Double.TYPE, array.getClass().getComponentType());
-        array = ArrayUtils.removeAll(new double[] { 1, 2, 3 }, 0, 2);
-        assertTrue(Arrays.equals(new double[] { 2 }, array));
-        assertEquals(Double.TYPE, array.getClass().getComponentType());
-        array = ArrayUtils.removeAll(new double[] { 1, 2, 3, 4, 5 }, 1, 3);
-        assertTrue(Arrays.equals(new double[] { 1, 3, 5 }, array));
-        assertEquals(Double.TYPE, array.getClass().getComponentType());
-        array = ArrayUtils.removeAll(new double[] { 1, 2, 3, 4, 5 }, 0, 2, 4);
-        assertTrue(Arrays.equals(new double[] { 2, 4 }, array));
-        assertEquals(Double.TYPE, array.getClass().getComponentType());
-        array = ArrayUtils.removeAll(new double[] { 1, 2, 3, 4, 5, 6, 7 }, 1, 3, 5);
-        assertTrue(Arrays.equals(new double[] { 1, 3, 5, 7 }, array));
-        assertEquals(Double.TYPE, array.getClass().getComponentType());
-        array = ArrayUtils.removeAll(new double[] { 1, 2, 3, 4, 5, 6, 7 }, 0, 2, 4, 6);
-        assertTrue(Arrays.equals(new double[] { 2, 4, 6 }, array));
-        assertEquals(Double.TYPE, array.getClass().getComponentType());
-    }
-
-    @Test
-    public void testRemoveAllDoubleArrayRemoveNone() {
-        final double[] array1 = new double[] { 1, 2 };
-        final double[] array2 = ArrayUtils.removeAll(array1);
-        assertNotSame(array1, array2);
-        assertTrue(Arrays.equals(array1, array2));
-        assertEquals(double.class, array2.getClass().getComponentType());
-    }
-
-    @Test(expected = IndexOutOfBoundsException.class)
-    public void testRemoveAllDoubleArrayNegativeIndex() {
-        ArrayUtils.removeAll(new double[] { 1, 2 }, -1);
-    }
-
-    @Test(expected = IndexOutOfBoundsException.class)
-    public void testRemoveAllDoubleArrayOutOfBoundsIndex() {
-        ArrayUtils.removeAll(new double[] { 1, 2 }, 2);
-    }
-
-    @Test(expected = IndexOutOfBoundsException.class)
-    public void testRemoveAllNullDoubleArray() {
-        ArrayUtils.removeAll((double[]) null, 0);
-    }
-
-    @Test
-    public void testRemoveAllFloatArray() {
-        float[] array;
-        array = ArrayUtils.removeAll(new float[] { 1 }, 0);
-        assertTrue(Arrays.equals(ArrayUtils.EMPTY_FLOAT_ARRAY, array));
-        assertEquals(Float.TYPE, array.getClass().getComponentType());
-        array = ArrayUtils.removeAll(new float[] { 1, 2 }, 0);
-        assertTrue(Arrays.equals(new float[] { 2 }, array));
-        assertEquals(Float.TYPE, array.getClass().getComponentType());
-        array = ArrayUtils.removeAll(new float[] { 1, 2 }, 1);
-        assertTrue(Arrays.equals(new float[] { 1 }, array));
-        assertEquals(Float.TYPE, array.getClass().getComponentType());
-        array = ArrayUtils.removeAll(new float[] { 1, 2, 1 }, 1);
-        assertTrue(Arrays.equals(new float[] { 1, 1 }, array));
-        assertEquals(Float.TYPE, array.getClass().getComponentType());
-
-        array = ArrayUtils.removeAll(new float[] { 1, 2 }, 0, 1);
-        assertTrue(Arrays.equals(ArrayUtils.EMPTY_FLOAT_ARRAY, array));
-        assertEquals(Float.TYPE, array.getClass().getComponentType());
-        array = ArrayUtils.removeAll(new float[] { 1, 2, 3 }, 0, 1);
-        assertTrue(Arrays.equals(new float[] { 3 }, array));
-        assertEquals(Float.TYPE, array.getClass().getComponentType());
-        array = ArrayUtils.removeAll(new float[] { 1, 2, 3 }, 1, 2);
-        assertTrue(Arrays.equals(new float[] { 1 }, array));
-        assertEquals(Float.TYPE, array.getClass().getComponentType());
-        array = ArrayUtils.removeAll(new float[] { 1, 2, 3 }, 0, 2);
-        assertTrue(Arrays.equals(new float[] { 2 }, array));
-        assertEquals(Float.TYPE, array.getClass().getComponentType());
-        array = ArrayUtils.removeAll(new float[] { 1, 2, 3, 4, 5 }, 1, 3);
-        assertTrue(Arrays.equals(new float[] { 1, 3, 5 }, array));
-        assertEquals(Float.TYPE, array.getClass().getComponentType());
-        array = ArrayUtils.removeAll(new float[] { 1, 2, 3, 4, 5 }, 0, 2, 4);
-        assertTrue(Arrays.equals(new float[] { 2, 4 }, array));
-        assertEquals(Float.TYPE, array.getClass().getComponentType());
-        array = ArrayUtils.removeAll(new float[] { 1, 2, 3, 4, 5, 6, 7 }, 1, 3, 5);
-        assertTrue(Arrays.equals(new float[] { 1, 3, 5, 7 }, array));
-        assertEquals(Float.TYPE, array.getClass().getComponentType());
-        array = ArrayUtils.removeAll(new float[] { 1, 2, 3, 4, 5, 6, 7 }, 0, 2, 4, 6);
-        assertTrue(Arrays.equals(new float[] { 2, 4, 6 }, array));
-        assertEquals(Float.TYPE, array.getClass().getComponentType());
-    }
-
-    @Test
-    public void testRemoveAllFloatArrayRemoveNone() {
-        final float[] array1 = new float[] { 1, 2 };
-        final float[] array2 = ArrayUtils.removeAll(array1);
-        assertNotSame(array1, array2);
-        assertTrue(Arrays.equals(array1, array2));
-        assertEquals(float.class, array2.getClass().getComponentType());
-    }
-
-    @Test(expected = IndexOutOfBoundsException.class)
-    public void testRemoveAllFloatArrayNegativeIndex() {
-        ArrayUtils.removeAll(new float[] { 1, 2 }, -1);
-    }
-
-    @Test(expected = IndexOutOfBoundsException.class)
-    public void testRemoveAllFloatArrayOutOfBoundsIndex() {
-        ArrayUtils.removeAll(new float[] { 1, 2 }, 2);
-    }
-
-    @Test(expected = IndexOutOfBoundsException.class)
-    public void testRemoveAllNullFloatArray() {
-        ArrayUtils.removeAll((float[]) null, 0);
-    }
-
-    @Test
-    public void testRemoveAllIntArray() {
-        int[] array;
-        array = ArrayUtils.removeAll(ArrayUtils.EMPTY_INT_ARRAY, ArrayUtils.EMPTY_INT_ARRAY);
-        assertTrue(Arrays.equals(ArrayUtils.EMPTY_INT_ARRAY, array));
-        array = ArrayUtils.removeAll(new int[] { 1 }, ArrayUtils.EMPTY_INT_ARRAY);
-        assertTrue(Arrays.equals(new int[] { 1 }, array));
-        array = ArrayUtils.removeAll(new int[] { 1 }, 0);
-        assertTrue(Arrays.equals(ArrayUtils.EMPTY_INT_ARRAY, array));
-        assertEquals(Integer.TYPE, array.getClass().getComponentType());
-        array = ArrayUtils.removeAll(new int[] { 1, 2 }, 0);
-        assertTrue(Arrays.equals(new int[] { 2 }, array));
-        assertEquals(Integer.TYPE, array.getClass().getComponentType());
-        array = ArrayUtils.removeAll(new int[] { 1, 2 }, 1);
-        assertTrue(Arrays.equals(new int[] { 1 }, array));
-        assertEquals(Integer.TYPE, array.getClass().getComponentType());
-        array = ArrayUtils.removeAll(new int[] { 1, 2, 1 }, 1);
-        assertTrue(Arrays.equals(new int[] { 1, 1 }, array));
-        assertEquals(Integer.TYPE, array.getClass().getComponentType());
-
-        array = ArrayUtils.removeAll(new int[] { 1, 2 }, 0, 1);
-        assertTrue(Arrays.equals(ArrayUtils.EMPTY_INT_ARRAY, array));
-        assertEquals(Integer.TYPE, array.getClass().getComponentType());
-        array = ArrayUtils.removeAll(new int[] { 1, 2, 3 }, 0, 1);
-        assertTrue(Arrays.equals(new int[] { 3 }, array));
-        assertEquals(Integer.TYPE, array.getClass().getComponentType());
-        array = ArrayUtils.removeAll(new int[] { 1, 2, 3 }, 1, 2);
-        assertTrue(Arrays.equals(new int[] { 1 }, array));
-        assertEquals(Integer.TYPE, array.getClass().getComponentType());
-        array = ArrayUtils.removeAll(new int[] { 1, 2, 3 }, 0, 2);
-        assertTrue(Arrays.equals(new int[] { 2 }, array));
-        assertEquals(Integer.TYPE, array.getClass().getComponentType());
-        array = ArrayUtils.removeAll(new int[] { 1, 2, 3, 4, 5 }, 1, 3);
-        assertTrue(Arrays.equals(new int[] { 1, 3, 5 }, array));
-        assertEquals(Integer.TYPE, array.getClass().getComponentType());
-        array = ArrayUtils.removeAll(new int[] { 1, 2, 3, 4, 5 }, 0, 2, 4);
-        assertTrue(Arrays.equals(new int[] { 2, 4 }, array));
-        assertEquals(Integer.TYPE, array.getClass().getComponentType());
-        array = ArrayUtils.removeAll(new int[] { 1, 2, 3, 4, 5, 6, 7 }, 1, 3, 5);
-        assertTrue(Arrays.equals(new int[] { 1, 3, 5, 7 }, array));
-        assertEquals(Integer.TYPE, array.getClass().getComponentType());
-        array = ArrayUtils.removeAll(new int[] { 1, 2, 3, 4, 5, 6, 7 }, 0, 2, 4, 6);
-        assertTrue(Arrays.equals(new int[] { 2, 4, 6 }, array));
-        assertEquals(Integer.TYPE, array.getClass().getComponentType());
-    }
-
-    @Test
-    public void testRemoveAllIntArrayRemoveNone() {
-        final int[] array1 = new int[] { 1, 2 };
-        final int[] array2 = ArrayUtils.removeAll(array1);
-        assertNotSame(array1, array2);
-        assertArrayEquals(array1, array2);
-        assertEquals(int.class, array2.getClass().getComponentType());
-    }
-
-    @Test(expected = IndexOutOfBoundsException.class)
-    public void testRemoveAllIntArrayNegativeIndex() {
-        ArrayUtils.removeAll(new int[] { 1, 2 }, -1);
-    }
-
-    @Test(expected = IndexOutOfBoundsException.class)
-    public void testRemoveAllIntArrayOutOfBoundsIndex() {
-        ArrayUtils.removeAll(new int[] { 1, 2 }, 2);
-    }
-
-    @Test(expected = IndexOutOfBoundsException.class)
-    public void testRemoveAllNullIntArray() {
-        ArrayUtils.removeAll((int[]) null, 0);
-    }
-
-    @Test
-    public void testRemoveAllLongArray() {
-        long[] array;
-        array = ArrayUtils.removeAll(new long[] { 1 }, 0);
-        assertTrue(Arrays.equals(ArrayUtils.EMPTY_LONG_ARRAY, array));
-        assertEquals(Long.TYPE, array.getClass().getComponentType());
-        array = ArrayUtils.removeAll(new long[] { 1, 2 }, 0);
-        assertTrue(Arrays.equals(new long[] { 2 }, array));
-        assertEquals(Long.TYPE, array.getClass().getComponentType());
-        array = ArrayUtils.removeAll(new long[] { 1, 2 }, 1);
-        assertTrue(Arrays.equals(new long[] { 1 }, array));
-        assertEquals(Long.TYPE, array.getClass().getComponentType());
-        array = ArrayUtils.removeAll(new long[] { 1, 2, 1 }, 1);
-        assertTrue(Arrays.equals(new long[] { 1, 1 }, array));
-        assertEquals(Long.TYPE, array.getClass().getComponentType());
-
-        array = ArrayUtils.removeAll(new long[] { 1, 2 }, 0, 1);
-        assertTrue(Arrays.equals(ArrayUtils.EMPTY_LONG_ARRAY, array));
-        assertEquals(Long.TYPE, array.getClass().getComponentType());
-        array = ArrayUtils.removeAll(new long[] { 1, 2, 3 }, 0, 1);
-        assertTrue(Arrays.equals(new long[] { 3 }, array));
-        assertEquals(Long.TYPE, array.getClass().getComponentType());
-        array = ArrayUtils.removeAll(new long[] { 1, 2, 3 }, 1, 2);
-        assertTrue(Arrays.equals(new long[] { 1 }, array));
-        assertEquals(Long.TYPE, array.getClass().getComponentType());
-        array = ArrayUtils.removeAll(new long[] { 1, 2, 3 }, 0, 2);
-        assertTrue(Arrays.equals(new long[] { 2 }, array));
-        assertEquals(Long.TYPE, array.getClass().getComponentType());
-        array = ArrayUtils.removeAll(new long[] { 1, 2, 3, 4, 5 }, 1, 3);
-        assertTrue(Arrays.equals(new long[] { 1, 3, 5 }, array));
-        assertEquals(Long.TYPE, array.getClass().getComponentType());
-        array = ArrayUtils.removeAll(new long[] { 1, 2, 3, 4, 5 }, 0, 2, 4);
-        assertTrue(Arrays.equals(new long[] { 2, 4 }, array));
-        assertEquals(Long.TYPE, array.getClass().getComponentType());
-        array = ArrayUtils.removeAll(new long[] { 1, 2, 3, 4, 5, 6, 7 }, 1, 3, 5);
-        assertTrue(Arrays.equals(new long[] { 1, 3, 5, 7 }, array));
-        assertEquals(Long.TYPE, array.getClass().getComponentType());
-        array = ArrayUtils.removeAll(new long[] { 1, 2, 3, 4, 5, 6, 7 }, 0, 2, 4, 6);
-        assertTrue(Arrays.equals(new long[] { 2, 4, 6 }, array));
-        assertEquals(Long.TYPE, array.getClass().getComponentType());
-    }
-
-    @Test
-    public void testRemoveAllLongArrayRemoveNone() {
-        final long[] array1 = new long[] { 1, 2 };
-        final long[] array2 = ArrayUtils.removeAll(array1);
-        assertNotSame(array1, array2);
-        assertArrayEquals(array1, array2);
-        assertEquals(long.class, array2.getClass().getComponentType());
-    }
-
-    @Test(expected = IndexOutOfBoundsException.class)
-    public void testRemoveAllLongArrayNegativeIndex() {
-        ArrayUtils.removeAll(new long[] { 1, 2 }, -1);
-    }
-
-    @Test(expected = IndexOutOfBoundsException.class)
-    public void testRemoveAllLongArrayOutOfBoundsIndex() {
-        ArrayUtils.removeAll(new long[] { 1, 2 }, 2);
-    }
-
-    @Test(expected = IndexOutOfBoundsException.class)
-    public void testRemoveAllNullLongArray() {
-        ArrayUtils.removeAll((long[]) null, 0);
-    }
-
-    @Test
-    public void testRemoveAllShortArray() {
-        short[] array;
-        array = ArrayUtils.removeAll(new short[] { 1 }, 0);
-        assertTrue(Arrays.equals(ArrayUtils.EMPTY_SHORT_ARRAY, array));
-        assertEquals(Short.TYPE, array.getClass().getComponentType());
-        array = ArrayUtils.removeAll(new short[] { 1, 2 }, 0);
-        assertTrue(Arrays.equals(new short[] { 2 }, array));
-        assertEquals(Short.TYPE, array.getClass().getComponentType());
-        array = ArrayUtils.removeAll(new short[] { 1, 2 }, 1);
-        assertTrue(Arrays.equals(new short[] { 1 }, array));
-        assertEquals(Short.TYPE, array.getClass().getComponentType());
-        array = ArrayUtils.removeAll(new short[] { 1, 2, 1 }, 1);
-        assertTrue(Arrays.equals(new short[] { 1, 1 }, array));
-        assertEquals(Short.TYPE, array.getClass().getComponentType());
-
-        array = ArrayUtils.removeAll(new short[] { 1, 2 }, 0, 1);
-        assertTrue(Arrays.equals(ArrayUtils.EMPTY_SHORT_ARRAY, array));
-        assertEquals(Short.TYPE, array.getClass().getComponentType());
-        array = ArrayUtils.removeAll(new short[] { 1, 2, 3 }, 0, 1);
-        assertTrue(Arrays.equals(new short[] { 3 }, array));
-        assertEquals(Short.TYPE, array.getClass().getComponentType());
-        array = ArrayUtils.removeAll(new short[] { 1, 2, 3 }, 1, 2);
-        assertTrue(Arrays.equals(new short[] { 1 }, array));
-        assertEquals(Short.TYPE, array.getClass().getComponentType());
-        array = ArrayUtils.removeAll(new short[] { 1, 2, 3 }, 0, 2);
-        assertTrue(Arrays.equals(new short[] { 2 }, array));
-        assertEquals(Short.TYPE, array.getClass().getComponentType());
-        array = ArrayUtils.removeAll(new short[] { 1, 2, 3, 4, 5 }, 1, 3);
-        assertTrue(Arrays.equals(new short[] { 1, 3, 5 }, array));
-        assertEquals(Short.TYPE, array.getClass().getComponentType());
-        array = ArrayUtils.removeAll(new short[] { 1, 2, 3, 4, 5 }, 0, 2, 4);
-        assertTrue(Arrays.equals(new short[] { 2, 4 }, array));
-        assertEquals(Short.TYPE, array.getClass().getComponentType());
-        array = ArrayUtils.removeAll(new short[] { 1, 2, 3, 4, 5, 6, 7 }, 1, 3, 5);
-        assertTrue(Arrays.equals(new short[] { 1, 3, 5, 7 }, array));
-        assertEquals(Short.TYPE, array.getClass().getComponentType());
-        array = ArrayUtils.removeAll(new short[] { 1, 2, 3, 4, 5, 6, 7 }, 0, 2, 4, 6);
-        assertTrue(Arrays.equals(new short[] { 2, 4, 6 }, array));
-        assertEquals(Short.TYPE, array.getClass().getComponentType());
-    }
-
-    @Test
-    public void testRemoveAllShortArrayRemoveNone() {
-        final short[] array1 = new short[] { 1, 2 };
-        final short[] array2 = ArrayUtils.removeAll(array1);
-        assertNotSame(array1, array2);
-        assertArrayEquals(array1, array2);
-        assertEquals(short.class, array2.getClass().getComponentType());
-    }
-
-    @Test(expected = IndexOutOfBoundsException.class)
-    public void testRemoveAllShortArrayNegativeIndex() {
-        ArrayUtils.removeAll(new short[] { 1, 2 }, -1, 0);
-    }
-
-    @Test(expected = IndexOutOfBoundsException.class)
-    public void testRemoveAllShortArrayOutOfBoundsIndex() {
-        ArrayUtils.removeAll(new short[] { 1, 2 }, 2, 0);
-    }
-
-    @Test(expected = IndexOutOfBoundsException.class)
-    public void testRemoveAllNullShortArray() {
-        ArrayUtils.removeAll((short[]) null, 0);
-    }
-
-    @Test
-    public void testRemoveElementsObjectArray() {
-        Object[] array;
-        array = ArrayUtils.removeElements((Object[]) null, "a");
-        assertNull(array);
-        array = ArrayUtils.removeElements(ArrayUtils.EMPTY_OBJECT_ARRAY, "a");
-        assertTrue(Arrays.equals(ArrayUtils.EMPTY_OBJECT_ARRAY, array));
-        assertEquals(Object.class, array.getClass().getComponentType());
-        array = ArrayUtils.removeElements(new Object[] { "a" }, "a");
-        assertTrue(Arrays.equals(ArrayUtils.EMPTY_OBJECT_ARRAY, array));
-        assertEquals(Object.class, array.getClass().getComponentType());
-        array = ArrayUtils.removeElements(new Object[] { "a", "b" }, "a");
-        assertTrue(Arrays.equals(new Object[] { "b" }, array));
-        assertEquals(Object.class, array.getClass().getComponentType());
-        array = ArrayUtils.removeElements(new Object[] { "a", "b", "a" }, "a");
-        assertTrue(Arrays.equals(new Object[] { "b", "a" }, array));
-        assertEquals(Object.class, array.getClass().getComponentType());
-
-        array = ArrayUtils.removeElements((Object[]) null, "a", "b");
-        assertNull(array);
-        array = ArrayUtils.removeElements(ArrayUtils.EMPTY_OBJECT_ARRAY, "a", "b");
-        assertTrue(Arrays.equals(ArrayUtils.EMPTY_OBJECT_ARRAY, array));
-        assertEquals(Object.class, array.getClass().getComponentType());
-        array = ArrayUtils.removeElements(new Object[] { "a" }, "a", "b");
-        assertTrue(Arrays.equals(ArrayUtils.EMPTY_OBJECT_ARRAY, array));
-        assertEquals(Object.class, array.getClass().getComponentType());
-        array = ArrayUtils.removeElements(new Object[] { "a", "b" }, "a", "c");
-        assertTrue(Arrays.equals(new Object[] { "b" }, array));
-        assertEquals(Object.class, array.getClass().getComponentType());
-        array = ArrayUtils.removeElements(new Object[] { "a", "b", "a" }, "a");
-        assertTrue(Arrays.equals(new Object[] { "b", "a" }, array));
-        assertEquals(Object.class, array.getClass().getComponentType());
-        array = ArrayUtils.removeElements(new Object[] { "a", "b", "a" }, "a", "b");
-        assertTrue(Arrays.equals(new Object[] { "a" }, array));
-        assertEquals(Object.class, array.getClass().getComponentType());
-        array = ArrayUtils.removeElements(new Object[] { "a", "b", "a" }, "a", "a");
-        assertTrue(Arrays.equals(new Object[] { "b" }, array));
-        assertEquals(Object.class, array.getClass().getComponentType());
-        array = ArrayUtils.removeElements(new Object[] { "a", "b", "a" }, "a", "a", "a", "a");
-        assertTrue(Arrays.equals(new Object[] { "b" }, array));
-        assertEquals(Object.class, array.getClass().getComponentType());
-    }
-
-    @Test
-    public void testRemoveElementBooleanArray() {
-        boolean[] array;
-        array = ArrayUtils.removeElements((boolean[]) null, true);
-        assertNull(array);
-        array = ArrayUtils.removeElements(ArrayUtils.EMPTY_BOOLEAN_ARRAY, true);
-        assertTrue(Arrays.equals(ArrayUtils.EMPTY_BOOLEAN_ARRAY, array));
-        assertEquals(Boolean.TYPE, array.getClass().getComponentType());
-        array = ArrayUtils.removeElements(new boolean[] { true }, true);
-        assertTrue(Arrays.equals(ArrayUtils.EMPTY_BOOLEAN_ARRAY, array));
-        assertEquals(Boolean.TYPE, array.getClass().getComponentType());
-        array = ArrayUtils.removeElements(new boolean[] { true, false }, true);
-        assertTrue(Arrays.equals(new boolean[] { false }, array));
-        assertEquals(Boolean.TYPE, array.getClass().getComponentType());
-        array = ArrayUtils.removeElements(new boolean[] { true, false, true }, true);
-        assertTrue(Arrays.equals(new boolean[] { false, true }, array));
-        assertEquals(Boolean.TYPE, array.getClass().getComponentType());
-
-        array = ArrayUtils.removeElements((boolean[]) null, true, false);
-        assertNull(array);
-        array = ArrayUtils.removeElements(ArrayUtils.EMPTY_BOOLEAN_ARRAY, true, false);
-        assertTrue(Arrays.equals(ArrayUtils.EMPTY_BOOLEAN_ARRAY, array));
-        assertEquals(Boolean.TYPE, array.getClass().getComponentType());
-        array = ArrayUtils.removeElements(new boolean[] { true }, true, false);
-        assertTrue(Arrays.equals(ArrayUtils.EMPTY_BOOLEAN_ARRAY, array));
-        assertEquals(Boolean.TYPE, array.getClass().getComponentType());
-        array = ArrayUtils.removeElements(new boolean[] { true, false }, true, false);
-        assertTrue(Arrays.equals(ArrayUtils.EMPTY_BOOLEAN_ARRAY, array));
-        assertEquals(Boolean.TYPE, array.getClass().getComponentType());
-        array = ArrayUtils.removeElements(new boolean[] { true, false }, true, true);
-        assertTrue(Arrays.equals(new boolean[] { false }, array));
-        assertEquals(Boolean.TYPE, array.getClass().getComponentType());
-        array = ArrayUtils.removeElements(new boolean[] { true, false, true }, true, false);
-        assertTrue(Arrays.equals(new boolean[] { true }, array));
-        assertEquals(Boolean.TYPE, array.getClass().getComponentType());
-        array = ArrayUtils.removeElements(new boolean[] { true, false, true }, true, true);
-        assertTrue(Arrays.equals(new boolean[] { false }, array));
-        assertEquals(Boolean.TYPE, array.getClass().getComponentType());
-        array = ArrayUtils.removeElements(new boolean[] { true, false, true }, true, true, true, true);
-        assertTrue(Arrays.equals(new boolean[] { false }, array));
-        assertEquals(Boolean.TYPE, array.getClass().getComponentType());
-    }
-
-    @Test
-    public void testRemoveElementByteArray() {
-        byte[] array;
-        array = ArrayUtils.removeElements((byte[]) null, (byte) 1);
-        assertNull(array);
-        array = ArrayUtils.removeElements(ArrayUtils.EMPTY_BYTE_ARRAY, (byte) 1);
-        assertTrue(Arrays.equals(ArrayUtils.EMPTY_BYTE_ARRAY, array));
-        assertEquals(Byte.TYPE, array.getClass().getComponentType());
-        array = ArrayUtils.removeElements(new byte[] { 1 }, (byte) 1);
-        assertTrue(Arrays.equals(ArrayUtils.EMPTY_BYTE_ARRAY, array));
-        assertEquals(Byte.TYPE, array.getClass().getComponentType());
-        array = ArrayUtils.removeElements(new byte[] { 1, 2 }, (byte) 1);
-        assertTrue(Arrays.equals(new byte[] { 2 }, array));
-        assertEquals(Byte.TYPE, array.getClass().getComponentType());
-        array = ArrayUtils.removeElements(new byte[] { 1, 2, 1 }, (byte) 1);
-        assertTrue(Arrays.equals(new byte[] { 2, 1 }, array));
-        assertEquals(Byte.TYPE, array.getClass().getComponentType());
-
-        array = ArrayUtils.removeElements((byte[]) null, (byte) 1, (byte) 2);
-        assertNull(array);
-        array = ArrayUtils.removeElements(ArrayUtils.EMPTY_BYTE_ARRAY, (byte) 1, (byte) 2);
-        assertTrue(Arrays.equals(ArrayUtils.EMPTY_BYTE_ARRAY, array));
-        assertEquals(Byte.TYPE, array.getClass().getComponentType());
-        array = ArrayUtils.removeElements(new byte[] { 1 }, (byte) 1, (byte) 2);
-        assertTrue(Arrays.equals(ArrayUtils.EMPTY_BYTE_ARRAY, array));
-        assertEquals(Byte.TYPE, array.getClass().getComponentType());
-        array = ArrayUtils.removeElements(new byte[] { 1, 2 }, (byte) 1, (byte) 2);
-        assertTrue(Arrays.equals(ArrayUtils.EMPTY_BYTE_ARRAY, array));
-        assertEquals(Byte.TYPE, array.getClass().getComponentType());
-        array = ArrayUtils.removeElements(new byte[] { 1, 2 }, (byte) 1, (byte) 1);
-        assertTrue(Arrays.equals(new byte[] { 2 }, array));
-        assertEquals(Byte.TYPE, array.getClass().getComponentType());
-        array = ArrayUtils.removeElements(new byte[] { 1, 2, 1 }, (byte) 1, (byte) 2);
-        assertTrue(Arrays.equals(new byte[] { 1 }, array));
-        assertEquals(Byte.TYPE, array.getClass().getComponentType());
-        array = ArrayUtils.removeElements(new byte[] { 1, 2, 1 }, (byte) 1, (byte) 1);
-        assertTrue(Arrays.equals(new byte[] { 2 }, array));
-        assertEquals(Byte.TYPE, array.getClass().getComponentType());
-        array = ArrayUtils.removeElements(new byte[] { 1, 2, 1 }, (byte) 1, (byte) 1, (byte) 1, (byte) 1);
-        assertTrue(Arrays.equals(new byte[] { 2 }, array));
-        assertEquals(Byte.TYPE, array.getClass().getComponentType());
-    }
-
-    @Test
-    public void testRemoveElementCharArray() {
-        char[] array;
-        array = ArrayUtils.removeElements((char[]) null, 'a');
-        assertNull(array);
-        array = ArrayUtils.removeElements(ArrayUtils.EMPTY_CHAR_ARRAY, 'a');
-        assertTrue(Arrays.equals(ArrayUtils.EMPTY_CHAR_ARRAY, array));
-        assertEquals(Character.TYPE, array.getClass().getComponentType());
-        array = ArrayUtils.removeElements(new char[] { 'a' }, 'a');
-        assertTrue(Arrays.equals(ArrayUtils.EMPTY_CHAR_ARRAY, array));
-        assertEquals(Character.TYPE, array.getClass().getComponentType());
-        array = ArrayUtils.removeElements(new char[] { 'a', 'b' }, 'a');
-        assertTrue(Arrays.equals(new char[] { 'b' }, array));
-        assertEquals(Character.TYPE, array.getClass().getComponentType());
-        array = ArrayUtils.removeElements(new char[] { 'a', 'b', 'a' }, 'a');
-        assertTrue(Arrays.equals(new char[] { 'b', 'a' }, array));
-        assertEquals(Character.TYPE, array.getClass().getComponentType());
-
-        array = ArrayUtils.removeElements((char[]) null, 'a', 'b');
-        assertNull(array);
-        array = ArrayUtils.removeElements(ArrayUtils.EMPTY_CHAR_ARRAY, 'a', 'b');
-        assertTrue(Arrays.equals(ArrayUtils.EMPTY_CHAR_ARRAY, array));
-        assertEquals(Character.TYPE, array.getClass().getComponentType());
-        array = ArrayUtils.removeElements(new char[] { 'a' }, 'a', 'b');
-        assertTrue(Arrays.equals(ArrayUtils.EMPTY_CHAR_ARRAY, array));
-        assertEquals(Character.TYPE, array.getClass().getComponentType());
-        array = ArrayUtils.removeElements(new char[] { 'a', 'b' }, 'a', 'b');
-        assertTrue(Arrays.equals(ArrayUtils.EMPTY_CHAR_ARRAY, array));
-        assertEquals(Character.TYPE, array.getClass().getComponentType());
-        array = ArrayUtils.removeElements(new char[] { 'a', 'b' }, 'a', 'a');
-        assertTrue(Arrays.equals(new char[] { 'b' }, array));
-        assertEquals(Character.TYPE, array.getClass().getComponentType());
-        array = ArrayUtils.removeElements(new char[] { 'a', 'b', 'a' }, 'a', 'b');
-        assertTrue(Arrays.equals(new char[] { 'a' }, array));
-        assertEquals(Character.TYPE, array.getClass().getComponentType());
-        array = ArrayUtils.removeElements(new char[] { 'a', 'b', 'a' }, 'a', 'a');
-        assertTrue(Arrays.equals(new char[] { 'b' }, array));
-        assertEquals(Character.TYPE, array.getClass().getComponentType());
-        array = ArrayUtils.removeElements(new char[] { 'a', 'b', 'a' }, 'a', 'a', 'a', 'a');
-        assertTrue(Arrays.equals(new char[] { 'b' }, array));
-        assertEquals(Character.TYPE, array.getClass().getComponentType());
-    }
-
-    @Test
-    @SuppressWarnings("cast")
-    public void testRemoveElementDoubleArray() {
-        double[] array;
-        array = ArrayUtils.removeElements((double[]) null, (double) 1);
-        assertNull(array);
-        array = ArrayUtils.removeElements(ArrayUtils.EMPTY_DOUBLE_ARRAY, (double) 1);
-        assertTrue(Arrays.equals(ArrayUtils.EMPTY_DOUBLE_ARRAY, array));
-        assertEquals(Double.TYPE, array.getClass().getComponentType());
-        array = ArrayUtils.removeElements(new double[] { 1 }, (double) 1);
-        assertTrue(Arrays.equals(ArrayUtils.EMPTY_DOUBLE_ARRAY, array));
-        assertEquals(Double.TYPE, array.getClass().getComponentType());
-        array = ArrayUtils.removeElements(new double[] { 1, 2 }, (double) 1);
-        assertTrue(Arrays.equals(new double[] { 2 }, array));
-        assertEquals(Double.TYPE, array.getClass().getComponentType());
-        array = ArrayUtils.removeElements(new double[] { 1, 2, 1 }, (double) 1);
-        assertTrue(Arrays.equals(new double[] { 2, 1 }, array));
-        assertEquals(Double.TYPE, array.getClass().getComponentType());
-
-        array = ArrayUtils.removeElements((double[]) null, (double) 1, (double) 2);
-        assertNull(array);
-        array = ArrayUtils.removeElements(ArrayUtils.EMPTY_DOUBLE_ARRAY, (double) 1, (double) 2);
-        assertTrue(Arrays.equals(ArrayUtils.EMPTY_DOUBLE_ARRAY, array));
-        assertEquals(Double.TYPE, array.getClass().getComponentType());
-        array = ArrayUtils.removeElements(new double[] { 1 }, (double) 1, (double) 2);
-        assertTrue(Arrays.equals(ArrayUtils.EMPTY_DOUBLE_ARRAY, array));
-        assertEquals(Double.TYPE, array.getClass().getComponentType());
-        array = ArrayUtils.removeElements(new double[] { 1, 2 }, (double) 1, (double) 2);
-        assertTrue(Arrays.equals(ArrayUtils.EMPTY_DOUBLE_ARRAY, array));
-        assertEquals(Double.TYPE, array.getClass().getComponentType());
-        array = ArrayUtils.removeElements(new double[] { 1, 2 }, (double) 1, (double) 1);
-        assertTrue(Arrays.equals(new double[] { 2 }, array));
-        assertEquals(Double.TYPE, array.getClass().getComponentType());
-        array = ArrayUtils.removeElements(new double[] { 1, 2, 1 }, (double) 1, (double) 2);
-        assertTrue(Arrays.equals(new double[] { 1 }, array));
-        assertEquals(Double.TYPE, array.getClass().getComponentType());
-        array = ArrayUtils.removeElements(new double[] { 1, 2, 1 }, (double) 1, (double) 1);
-        assertTrue(Arrays.equals(new double[] { 2 }, array));
-        assertEquals(Double.TYPE, array.getClass().getComponentType());
-        array = ArrayUtils.removeElements(new double[] { 1, 2, 1 }, (double) 1, (double) 1, (double) 1, (double) 1);
-        assertTrue(Arrays.equals(new double[] { 2 }, array));
-        assertEquals(Double.TYPE, array.getClass().getComponentType());
-    }
-
-    @Test
-    @SuppressWarnings("cast")
-    public void testRemoveElementFloatArray() {
-        float[] array;
-        array = ArrayUtils.removeElements((float[]) null, (float) 1);
-        assertNull(array);
-        array = ArrayUtils.removeElements(ArrayUtils.EMPTY_FLOAT_ARRAY, (float) 1);
-        assertTrue(Arrays.equals(ArrayUtils.EMPTY_FLOAT_ARRAY, array));
-        assertEquals(Float.TYPE, array.getClass().getComponentType());
-        array = ArrayUtils.removeElements(new float[] { 1 }, (float) 1);
-        assertTrue(Arrays.equals(ArrayUtils.EMPTY_FLOAT_ARRAY, array));
-        assertEquals(Float.TYPE, array.getClass().getComponentType());
-        array = ArrayUtils.removeElements(new float[] { 1, 2 }, (float) 1);
-        assertTrue(Arrays.equals(new float[] { 2 }, array));
-        assertEquals(Float.TYPE, array.getClass().getComponentType());
-        array = ArrayUtils.removeElements(new float[] { 1, 2, 1 }, (float) 1);
-        assertTrue(Arrays.equals(new float[] { 2, 1 }, array));
-        assertEquals(Float.TYPE, array.getClass().getComponentType());
-
-        array = ArrayUtils.removeElements((float[]) null, (float) 1, (float) 1);
-        assertNull(array);
-        array = ArrayUtils.removeElements(ArrayUtils.EMPTY_FLOAT_ARRAY, (float) 1, (float) 1);
-        assertTrue(Arrays.equals(ArrayUtils.EMPTY_FLOAT_ARRAY, array));
-        assertEquals(Float.TYPE, array.getClass().getComponentType());
-        array = ArrayUtils.removeElements(new float[] { 1 }, (float) 1, (float) 1);
-        assertTrue(Arrays.equals(ArrayUtils.EMPTY_FLOAT_ARRAY, array));
-        assertEquals(Float.TYPE, array.getClass().getComponentType());
-        array = ArrayUtils.removeElements(new float[] { 1, 2 }, (float) 1, (float) 2);
-        assertTrue(Arrays.equals(ArrayUtils.EMPTY_FLOAT_ARRAY, array));
-        assertEquals(Float.TYPE, array.getClass().getComponentType());
-        array = ArrayUtils.removeElements(new float[] { 1, 2 }, (float) 1, (float) 1);
-        assertTrue(Arrays.equals(new float[] { 2 }, array));
-        assertEquals(Float.TYPE, array.getClass().getComponentType());
-        array = ArrayUtils.removeElements(new float[] { 1, 2, 1 }, (float) 1, (float) 1);
-        assertTrue(Arrays.equals(new float[] { 2 }, array));
-        assertEquals(Float.TYPE, array.getClass().getComponentType());
-        array = ArrayUtils.removeElements(new float[] { 1, 2, 1 }, (float) 1, (float) 2);
-        assertTrue(Arrays.equals(new float[] { 1 }, array));
-        assertEquals(Float.TYPE, array.getClass().getComponentType());
-        array = ArrayUtils.removeElements(new float[] { 1, 2, 1 }, (float) 1, (float) 1, (float) 1, (float) 1);
-        assertTrue(Arrays.equals(new float[] { 2 }, array));
-        assertEquals(Float.TYPE, array.getClass().getComponentType());
-    }
-
-    @Test
-    public void testRemoveElementIntArray() {
-        int[] array;
-        array = ArrayUtils.removeElements((int[]) null, 1);
-        assertNull(array);
-        array = ArrayUtils.removeElements(ArrayUtils.EMPTY_INT_ARRAY, 1);
-        assertTrue(Arrays.equals(ArrayUtils.EMPTY_INT_ARRAY, array));
-        assertEquals(Integer.TYPE, array.getClass().getComponentType());
-        array = ArrayUtils.removeElements(new int[] { 1 }, 1);
-        assertTrue(Arrays.equals(ArrayUtils.EMPTY_INT_ARRAY, array));
-        assertEquals(Integer.TYPE, array.getClass().getComponentType());
-        array = ArrayUtils.removeElements(new int[] { 1, 2 }, 1);
-        assertTrue(Arrays.equals(new int[] { 2 }, array));
-        assertEquals(Integer.TYPE, array.getClass().getComponentType());
-        array = ArrayUtils.removeElements(new int[] { 1, 2, 1 }, 1);
-        assertTrue(Arrays.equals(new int[] { 2, 1 }, array));
-        assertEquals(Integer.TYPE, array.getClass().getComponentType());
-
-        array = ArrayUtils.removeElements((int[]) null, 1);
-        assertNull(array);
-        array = ArrayUtils.removeElements(ArrayUtils.EMPTY_INT_ARRAY, 1, 1);
-        assertTrue(Arrays.equals(ArrayUtils.EMPTY_INT_ARRAY, array));
-        assertEquals(Integer.TYPE, array.getClass().getComponentType());
-        array = ArrayUtils.removeElements(new int[] { 1 }, 1, 1);
-        assertTrue(Arrays.equals(ArrayUtils.EMPTY_INT_ARRAY, array));
-        assertEquals(Integer.TYPE, array.getClass().getComponentType());
-        array = ArrayUtils.removeElements(new int[] { 1, 2 }, 1, 2);
-        assertTrue(Arrays.equals(ArrayUtils.EMPTY_INT_ARRAY, array));
-        assertEquals(Integer.TYPE, array.getClass().getComponentType());
-        array = ArrayUtils.removeElements(new int[] { 1, 2 }, 1, 1);
-        assertTrue(Arrays.equals(new int[] { 2 }, array));
-        assertEquals(Integer.TYPE, array.getClass().getComponentType());
-        array = ArrayUtils.removeElements(new int[] { 1, 2, 1 }, 1, 2);
-        assertTrue(Arrays.equals(new int[] { 1 }, array));
-        assertEquals(Integer.TYPE, array.getClass().getComponentType());
-        array = ArrayUtils.removeElements(new int[] { 1, 2, 1 }, 1, 1);
-        assertTrue(Arrays.equals(new int[] { 2 }, array));
-        assertEquals(Integer.TYPE, array.getClass().getComponentType());
-        array = ArrayUtils.removeElements(new int[] { 1, 2, 1 }, 1, 1, 1, 1);
-        assertTrue(Arrays.equals(new int[] { 2 }, array));
-        assertEquals(Integer.TYPE, array.getClass().getComponentType());
-    }
-
-    @Test
-    @SuppressWarnings("cast")
-    public void testRemoveElementLongArray() {
-        long[] array;
-        array = ArrayUtils.removeElements((long[]) null, (long) 1);
-        assertNull(array);
-        array = ArrayUtils.removeElements(ArrayUtils.EMPTY_LONG_ARRAY, (long) 1);
-        assertTrue(Arrays.equals(ArrayUtils.EMPTY_LONG_ARRAY, array));
-        assertEquals(Long.TYPE, array.getClass().getComponentType());
-        array = ArrayUtils.removeElements(new long[] { 1 }, (long) 1);
-        assertTrue(Arrays.equals(ArrayUtils.EMPTY_LONG_ARRAY, array));
-        assertEquals(Long.TYPE, array.getClass().getComponentType());
-        array = ArrayUtils.removeElements(new long[] { 1, 2 }, (long) 1);
-        assertTrue(Arrays.equals(new long[] { 2 }, array));
-        assertEquals(Long.TYPE, array.getClass().getComponentType());
-        array = ArrayUtils.removeElements(new long[] { 1, 2, 1 }, (long) 1);
-        assertTrue(Arrays.equals(new long[] { 2, 1 }, array));
-        assertEquals(Long.TYPE, array.getClass().getComponentType());
-
-        array = ArrayUtils.removeElements((long[]) null, (long) 1, (long) 1);
-        assertNull(array);
-        array = ArrayUtils.removeElements(ArrayUtils.EMPTY_LONG_ARRAY, (long) 1, (long) 1);
-        assertTrue(Arrays.equals(ArrayUtils.EMPTY_LONG_ARRAY, array));
-        assertEquals(Long.TYPE, array.getClass().getComponentType());
-        array = ArrayUtils.removeElements(new long[] { 1 }, (long) 1, (long) 1);
-        assertTrue(Arrays.equals(ArrayUtils.EMPTY_LONG_ARRAY, array));
-        assertEquals(Long.TYPE, array.getClass().getComponentType());
-        array = ArrayUtils.removeElements(new long[] { 1, 2 }, (long) 1, (long) 2);
-        assertTrue(Arrays.equals(ArrayUtils.EMPTY_LONG_ARRAY, array));
-        assertEquals(Long.TYPE, array.getClass().getComponentType());
-        array = ArrayUtils.removeElements(new long[] { 1, 2 }, (long) 1, (long) 1);
-        assertTrue(Arrays.equals(new long[] { 2 }, array));
-        assertEquals(Long.TYPE, array.getClass().getComponentType());
-        array = ArrayUtils.removeElements(new long[] { 1, 2, 1 }, (long) 1, (long) 1);
-        assertTrue(Arrays.equals(new long[] { 2 }, array));
-        assertEquals(Long.TYPE, array.getClass().getComponentType());
-        array = ArrayUtils.removeElements(new long[] { 1, 2, 1 }, (long) 1, (long) 2);
-        assertTrue(Arrays.equals(new long[] { 1 }, array));
-        assertEquals(Long.TYPE, array.getClass().getComponentType());
-        array = ArrayUtils.removeElements(new long[] { 1, 2, 1 }, (long) 1, (long) 1, (long) 1, (long) 1);
-        assertTrue(Arrays.equals(new long[] { 2 }, array));
-        assertEquals(Long.TYPE, array.getClass().getComponentType());
-    }
-
-    @Test
-    public void testRemoveElementShortArray() {
-        short[] array;
-        array = ArrayUtils.removeElements((short[]) null, (short) 1);
-        assertNull(array);
-        array = ArrayUtils.removeElements(ArrayUtils.EMPTY_SHORT_ARRAY, (short) 1);
-        assertTrue(Arrays.equals(ArrayUtils.EMPTY_SHORT_ARRAY, array));
-        assertEquals(Short.TYPE, array.getClass().getComponentType());
-        array = ArrayUtils.removeElements(new short[] { 1 }, (short) 1);
-        assertTrue(Arrays.equals(ArrayUtils.EMPTY_SHORT_ARRAY, array));
-        assertEquals(Short.TYPE, array.getClass().getComponentType());
-        array = ArrayUtils.removeElements(new short[] { 1, 2 }, (short) 1);
-        assertTrue(Arrays.equals(new short[] { 2 }, array));
-        assertEquals(Short.TYPE, array.getClass().getComponentType());
-        array = ArrayUtils.removeElements(new short[] { 1, 2, 1 }, (short) 1);
-        assertTrue(Arrays.equals(new short[] { 2, 1 }, array));
-        assertEquals(Short.TYPE, array.getClass().getComponentType());
-
-        array = ArrayUtils.removeElements((short[]) null, (short) 1, (short) 1);
-        assertNull(array);
-        array = ArrayUtils.removeElements(ArrayUtils.EMPTY_SHORT_ARRAY, (short) 1, (short) 1);
-        assertTrue(Arrays.equals(ArrayUtils.EMPTY_SHORT_ARRAY, array));
-        assertEquals(Short.TYPE, array.getClass().getComponentType());
-        array = ArrayUtils.removeElements(new short[] { 1 }, (short) 1, (short) 1);
-        assertTrue(Arrays.equals(ArrayUtils.EMPTY_SHORT_ARRAY, array));
-        assertEquals(Short.TYPE, array.getClass().getComponentType());
-        array = ArrayUtils.removeElements(new short[] { 1, 2 }, (short) 1, (short) 2);
-        assertTrue(Arrays.equals(ArrayUtils.EMPTY_SHORT_ARRAY, array));
-        assertEquals(Short.TYPE, array.getClass().getComponentType());
-        array = ArrayUtils.removeElements(new short[] { 1, 2 }, (short) 1, (short) 1);
-        assertTrue(Arrays.equals(new short[] { 2 }, array));
-        assertEquals(Short.TYPE, array.getClass().getComponentType());
-        array = ArrayUtils.removeElements(new short[] { 1, 2, 1 }, (short) 1, (short) 1);
-        assertTrue(Arrays.equals(new short[] { 2 }, array));
-        assertEquals(Short.TYPE, array.getClass().getComponentType());
-        array = ArrayUtils.removeElements(new short[] { 1, 2, 1 }, (short) 1, (short) 2);
-        assertTrue(Arrays.equals(new short[] { 1 }, array));
-        assertEquals(Short.TYPE, array.getClass().getComponentType());
-        array = ArrayUtils.removeElements(new short[] { 1, 2, 1 }, (short) 1, (short) 1, (short) 1, (short) 1);
-        assertTrue(Arrays.equals(new short[] { 2 }, array));
-        assertEquals(Short.TYPE, array.getClass().getComponentType());
-    }
-
-}
diff --git a/lang/src/test/java/org/apache/commons/lang3/ArrayUtilsRemoveTest.java b/lang/src/test/java/org/apache/commons/lang3/ArrayUtilsRemoveTest.java
deleted file mode 100644
index b74c771..0000000
--- a/lang/src/test/java/org/apache/commons/lang3/ArrayUtilsRemoveTest.java
+++ /dev/null
@@ -1,487 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- * 
- *      http://www.apache.org/licenses/LICENSE-2.0
- * 
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package org.apache.commons.lang3;
-
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertNull;
-import static org.junit.Assert.assertTrue;
-import static org.junit.Assert.fail;
-
-import java.util.Arrays;
-
-import org.junit.Test;
-
-/**
- * Tests ArrayUtils remove and removeElement methods.
- * 
- * @version $Id$
- */
-public class ArrayUtilsRemoveTest {
-
-    @Test
-    public void testRemoveObjectArray() {
-        Object[] array;
-        array = ArrayUtils.remove(new Object[] {"a"}, 0);
-        assertTrue(Arrays.equals(ArrayUtils.EMPTY_OBJECT_ARRAY, array));
-        assertEquals(Object.class, array.getClass().getComponentType());
-        array = ArrayUtils.remove(new Object[] {"a", "b"}, 0);
-        assertTrue(Arrays.equals(new Object[] {"b"}, array));
-        assertEquals(Object.class, array.getClass().getComponentType());
-        array = ArrayUtils.remove(new Object[] {"a", "b"}, 1);
-        assertTrue(Arrays.equals(new Object[] {"a"}, array));
-        assertEquals(Object.class, array.getClass().getComponentType());
-        array = ArrayUtils.remove(new Object[] {"a", "b", "c"}, 1);
-        assertTrue(Arrays.equals(new Object[] {"a", "c"}, array));
-        assertEquals(Object.class, array.getClass().getComponentType());
-        try {
-            ArrayUtils.remove(new Object[] {"a", "b"}, -1);
-            fail("IndexOutOfBoundsException expected");
-        } catch (final IndexOutOfBoundsException e) {}
-        try {
-            ArrayUtils.remove(new Object[] {"a", "b"}, 2);
-            fail("IndexOutOfBoundsException expected");
-        } catch (final IndexOutOfBoundsException e) {}
-        try {
-            ArrayUtils.remove((Object[]) null, 0);
-            fail("IndexOutOfBoundsException expected");
-        } catch (final IndexOutOfBoundsException e) {}
-    }
-
-    @Test
-    public void testRemoveNumberArray(){
-        final Number[] inarray = {Integer.valueOf(1),Long.valueOf(2),Byte.valueOf((byte) 3)};
-        assertEquals(3, inarray.length);
-        Number[] outarray;
-        outarray = ArrayUtils.remove(inarray, 1);
-        assertEquals(2, outarray.length);
-        assertEquals(Number.class, outarray.getClass().getComponentType());
-        outarray = ArrayUtils.remove(outarray, 1);
-        assertEquals(1, outarray.length);
-        assertEquals(Number.class, outarray.getClass().getComponentType());
-        outarray = ArrayUtils.remove(outarray, 0);
-        assertEquals(0, outarray.length);
-        assertEquals(Number.class, outarray.getClass().getComponentType());
-    }
-
-    @Test
-    public void testRemoveBooleanArray() {
-        boolean[] array;
-        array = ArrayUtils.remove(new boolean[] {true}, 0);
-        assertTrue(Arrays.equals(ArrayUtils.EMPTY_BOOLEAN_ARRAY, array));
-        assertEquals(Boolean.TYPE, array.getClass().getComponentType());
-        array = ArrayUtils.remove(new boolean[] {true, false}, 0);
-        assertTrue(Arrays.equals(new boolean[] {false}, array));
-        assertEquals(Boolean.TYPE, array.getClass().getComponentType());
-        array = ArrayUtils.remove(new boolean[] {true, false}, 1);
-        assertTrue(Arrays.equals(new boolean[] {true}, array));
-        assertEquals(Boolean.TYPE, array.getClass().getComponentType());
-        array = ArrayUtils.remove(new boolean[] {true, false, true}, 1);
-        assertTrue(Arrays.equals(new boolean[] {true, true}, array));
-        assertEquals(Boolean.TYPE, array.getClass().getComponentType());
-        try {
-            ArrayUtils.remove(new boolean[] {true, false}, -1);
-            fail("IndexOutOfBoundsException expected");
-        } catch (final IndexOutOfBoundsException e) {}
-        try {
-            ArrayUtils.remove(new boolean[] {true, false}, 2);
-            fail("IndexOutOfBoundsException expected");
-        } catch (final IndexOutOfBoundsException e) {}
-        try {
-            ArrayUtils.remove((boolean[]) null, 0);
-            fail("IndexOutOfBoundsException expected");
-        } catch (final IndexOutOfBoundsException e) {}
-    }
-    
-    @Test
-    public void testRemoveByteArray() {
-        byte[] array;
-        array = ArrayUtils.remove(new byte[] {1}, 0);
-        assertTrue(Arrays.equals(ArrayUtils.EMPTY_BYTE_ARRAY, array));
-        assertEquals(Byte.TYPE, array.getClass().getComponentType());
-        array = ArrayUtils.remove(new byte[] {1, 2}, 0);
-        assertTrue(Arrays.equals(new byte[] {2}, array));
-        assertEquals(Byte.TYPE, array.getClass().getComponentType());
-        array = ArrayUtils.remove(new byte[] {1, 2}, 1);
-        assertTrue(Arrays.equals(new byte[] {1}, array));
-        assertEquals(Byte.TYPE, array.getClass().getComponentType());
-        array = ArrayUtils.remove(new byte[] {1, 2, 1}, 1);
-        assertTrue(Arrays.equals(new byte[] {1, 1}, array));
-        assertEquals(Byte.TYPE, array.getClass().getComponentType());
-        try {
-            ArrayUtils.remove(new byte[] {1, 2}, -1);
-            fail("IndexOutOfBoundsException expected");
-        } catch (final IndexOutOfBoundsException e) {}
-        try {
-            ArrayUtils.remove(new byte[] {1, 2}, 2);
-            fail("IndexOutOfBoundsException expected");
-        } catch (final IndexOutOfBoundsException e) {}
-        try {
-            ArrayUtils.remove((byte[]) null, 0);
-            fail("IndexOutOfBoundsException expected");
-        } catch (final IndexOutOfBoundsException e) {}
-    }
-    
-    @Test
-    public void testRemoveCharArray() {
-        char[] array;
-        array = ArrayUtils.remove(new char[] {'a'}, 0);
-        assertTrue(Arrays.equals(ArrayUtils.EMPTY_CHAR_ARRAY, array));
-        assertEquals(Character.TYPE, array.getClass().getComponentType());
-        array = ArrayUtils.remove(new char[] {'a', 'b'}, 0);
-        assertTrue(Arrays.equals(new char[] {'b'}, array));
-        assertEquals(Character.TYPE, array.getClass().getComponentType());
-        array = ArrayUtils.remove(new char[] {'a', 'b'}, 1);
-        assertTrue(Arrays.equals(new char[] {'a'}, array));
-        assertEquals(Character.TYPE, array.getClass().getComponentType());
-        array = ArrayUtils.remove(new char[] {'a', 'b', 'c'}, 1);
-        assertTrue(Arrays.equals(new char[] {'a', 'c'}, array));
-        assertEquals(Character.TYPE, array.getClass().getComponentType());
-        try {
-            ArrayUtils.remove(new char[] {'a', 'b'}, -1);
-            fail("IndexOutOfBoundsException expected");
-        } catch (final IndexOutOfBoundsException e) {}
-        try {
-            ArrayUtils.remove(new char[] {'a', 'b'}, 2);
-            fail("IndexOutOfBoundsException expected");
-        } catch (final IndexOutOfBoundsException e) {}
-        try {
-            ArrayUtils.remove((char[]) null, 0);
-            fail("IndexOutOfBoundsException expected");
-        } catch (final IndexOutOfBoundsException e) {}
-    }
-    
-    @Test
-    public void testRemoveDoubleArray() {
-        double[] array;
-        array = ArrayUtils.remove(new double[] {1}, 0);
-        assertTrue(Arrays.equals(ArrayUtils.EMPTY_DOUBLE_ARRAY, array));
-        assertEquals(Double.TYPE, array.getClass().getComponentType());
-        array = ArrayUtils.remove(new double[] {1, 2}, 0);
-        assertTrue(Arrays.equals(new double[] {2}, array));
-        assertEquals(Double.TYPE, array.getClass().getComponentType());
-        array = ArrayUtils.remove(new double[] {1, 2}, 1);
-        assertTrue(Arrays.equals(new double[] {1}, array));
-        assertEquals(Double.TYPE, array.getClass().getComponentType());
-        array = ArrayUtils.remove(new double[] {1, 2, 1}, 1);
-        assertTrue(Arrays.equals(new double[] {1, 1}, array));
-        assertEquals(Double.TYPE, array.getClass().getComponentType());
-        try {
-            ArrayUtils.remove(new double[] {1, 2}, -1);
-            fail("IndexOutOfBoundsException expected");
-        } catch (final IndexOutOfBoundsException e) {}
-        try {
-            ArrayUtils.remove(new double[] {1, 2}, 2);
-            fail("IndexOutOfBoundsException expected");
-        } catch (final IndexOutOfBoundsException e) {}
-        try {
-            ArrayUtils.remove((double[]) null, 0);
-            fail("IndexOutOfBoundsException expected");
-        } catch (final IndexOutOfBoundsException e) {}
-    }
-    
-    @Test
-    public void testRemoveFloatArray() {
-        float[] array;
-        array = ArrayUtils.remove(new float[] {1}, 0);
-        assertTrue(Arrays.equals(ArrayUtils.EMPTY_FLOAT_ARRAY, array));
-        assertEquals(Float.TYPE, array.getClass().getComponentType());
-        array = ArrayUtils.remove(new float[] {1, 2}, 0);
-        assertTrue(Arrays.equals(new float[] {2}, array));
-        assertEquals(Float.TYPE, array.getClass().getComponentType());
-        array = ArrayUtils.remove(new float[] {1, 2}, 1);
-        assertTrue(Arrays.equals(new float[] {1}, array));
-        assertEquals(Float.TYPE, array.getClass().getComponentType());
-        array = ArrayUtils.remove(new float[] {1, 2, 1}, 1);
-        assertTrue(Arrays.equals(new float[] {1, 1}, array));
-        assertEquals(Float.TYPE, array.getClass().getComponentType());
-        try {
-            ArrayUtils.remove(new float[] {1, 2}, -1);
-            fail("IndexOutOfBoundsException expected");
-        } catch (final IndexOutOfBoundsException e) {}
-        try {
-            ArrayUtils.remove(new float[] {1, 2}, 2);
-            fail("IndexOutOfBoundsException expected");
-        } catch (final IndexOutOfBoundsException e) {}
-        try {
-            ArrayUtils.remove((float[]) null, 0);
-            fail("IndexOutOfBoundsException expected");
-        } catch (final IndexOutOfBoundsException e) {}
-    }
-    
-    @Test
-    public void testRemoveIntArray() {
-        int[] array;
-        array = ArrayUtils.remove(new int[] {1}, 0);
-        assertTrue(Arrays.equals(ArrayUtils.EMPTY_INT_ARRAY, array));
-        assertEquals(Integer.TYPE, array.getClass().getComponentType());
-        array = ArrayUtils.remove(new int[] {1, 2}, 0);
-        assertTrue(Arrays.equals(new int[] {2}, array));
-        assertEquals(Integer.TYPE, array.getClass().getComponentType());
-        array = ArrayUtils.remove(new int[] {1, 2}, 1);
-        assertTrue(Arrays.equals(new int[] {1}, array));
-        assertEquals(Integer.TYPE, array.getClass().getComponentType());
-        array = ArrayUtils.remove(new int[] {1, 2, 1}, 1);
-        assertTrue(Arrays.equals(new int[] {1, 1}, array));
-        assertEquals(Integer.TYPE, array.getClass().getComponentType());
-        try {
-            ArrayUtils.remove(new int[] {1, 2}, -1);
-            fail("IndexOutOfBoundsException expected");
-        } catch (final IndexOutOfBoundsException e) {}
-        try {
-            ArrayUtils.remove(new int[] {1, 2}, 2);
-            fail("IndexOutOfBoundsException expected");
-        } catch (final IndexOutOfBoundsException e) {}
-        try {
-            ArrayUtils.remove((int[]) null, 0);
-            fail("IndexOutOfBoundsException expected");
-        } catch (final IndexOutOfBoundsException e) {}
-    }
-    
-    @Test
-    public void testRemoveLongArray() {
-        long[] array;
-        array = ArrayUtils.remove(new long[] {1}, 0);
-        assertTrue(Arrays.equals(ArrayUtils.EMPTY_LONG_ARRAY, array));
-        assertEquals(Long.TYPE, array.getClass().getComponentType());
-        array = ArrayUtils.remove(new long[] {1, 2}, 0);
-        assertTrue(Arrays.equals(new long[] {2}, array));
-        assertEquals(Long.TYPE, array.getClass().getComponentType());
-        array = ArrayUtils.remove(new long[] {1, 2}, 1);
-        assertTrue(Arrays.equals(new long[] {1}, array));
-        assertEquals(Long.TYPE, array.getClass().getComponentType());
-        array = ArrayUtils.remove(new long[] {1, 2, 1}, 1);
-        assertTrue(Arrays.equals(new long[] {1, 1}, array));
-        assertEquals(Long.TYPE, array.getClass().getComponentType());
-        try {
-            ArrayUtils.remove(new long[] {1, 2}, -1);
-            fail("IndexOutOfBoundsException expected");
-        } catch (final IndexOutOfBoundsException e) {}
-        try {
-            ArrayUtils.remove(new long[] {1, 2}, 2);
-            fail("IndexOutOfBoundsException expected");
-        } catch (final IndexOutOfBoundsException e) {}
-        try {
-            ArrayUtils.remove((long[]) null, 0);
-            fail("IndexOutOfBoundsException expected");
-        } catch (final IndexOutOfBoundsException e) {}
-    }
-    
-    @Test
-    public void testRemoveShortArray() {
-        short[] array;
-        array = ArrayUtils.remove(new short[] {1}, 0);
-        assertTrue(Arrays.equals(ArrayUtils.EMPTY_SHORT_ARRAY, array));
-        assertEquals(Short.TYPE, array.getClass().getComponentType());
-        array = ArrayUtils.remove(new short[] {1, 2}, 0);
-        assertTrue(Arrays.equals(new short[] {2}, array));
-        assertEquals(Short.TYPE, array.getClass().getComponentType());
-        array = ArrayUtils.remove(new short[] {1, 2}, 1);
-        assertTrue(Arrays.equals(new short[] {1}, array));
-        assertEquals(Short.TYPE, array.getClass().getComponentType());
-        array = ArrayUtils.remove(new short[] {1, 2, 1}, 1);
-        assertTrue(Arrays.equals(new short[] {1, 1}, array));
-        assertEquals(Short.TYPE, array.getClass().getComponentType());
-        try {
-            ArrayUtils.remove(new short[] {1, 2}, -1);
-            fail("IndexOutOfBoundsException expected");
-        } catch (final IndexOutOfBoundsException e) {}
-        try {
-            ArrayUtils.remove(new short[] {1, 2}, 2);
-            fail("IndexOutOfBoundsException expected");
-        } catch (final IndexOutOfBoundsException e) {}
-        try {
-            ArrayUtils.remove((short[]) null, 0);
-            fail("IndexOutOfBoundsException expected");
-        } catch (final IndexOutOfBoundsException e) {}
-    }
-    
-    @Test
-    public void testRemoveElementObjectArray() {
-        Object[] array;
-        array = ArrayUtils.removeElement((Object[]) null, "a");
-        assertNull(array);
-        array = ArrayUtils.removeElement(ArrayUtils.EMPTY_OBJECT_ARRAY, "a");
-        assertTrue(Arrays.equals(ArrayUtils.EMPTY_OBJECT_ARRAY, array));
-        assertEquals(Object.class, array.getClass().getComponentType());
-        array = ArrayUtils.removeElement(new Object[] {"a"}, "a");
-        assertTrue(Arrays.equals(ArrayUtils.EMPTY_OBJECT_ARRAY, array));
-        assertEquals(Object.class, array.getClass().getComponentType());
-        array = ArrayUtils.removeElement(new Object[] {"a", "b"}, "a");
-        assertTrue(Arrays.equals(new Object[] {"b"}, array));
-        assertEquals(Object.class, array.getClass().getComponentType());
-        array = ArrayUtils.removeElement(new Object[] {"a", "b", "a"}, "a");
-        assertTrue(Arrays.equals(new Object[] {"b", "a"}, array));
-        assertEquals(Object.class, array.getClass().getComponentType());
-    }
-    
-    @Test
-    public void testRemoveElementBooleanArray() {
-        boolean[] array;
-        array = ArrayUtils.removeElement((boolean[]) null, true);
-        assertNull(array);
-        array = ArrayUtils.removeElement(ArrayUtils.EMPTY_BOOLEAN_ARRAY, true);
-        assertTrue(Arrays.equals(ArrayUtils.EMPTY_BOOLEAN_ARRAY, array));
-        assertEquals(Boolean.TYPE, array.getClass().getComponentType());
-        array = ArrayUtils.removeElement(new boolean[] {true}, true);
-        assertTrue(Arrays.equals(ArrayUtils.EMPTY_BOOLEAN_ARRAY, array));
-        assertEquals(Boolean.TYPE, array.getClass().getComponentType());
-        array = ArrayUtils.removeElement(new boolean[] {true, false}, true);
-        assertTrue(Arrays.equals(new boolean[] {false}, array));
-        assertEquals(Boolean.TYPE, array.getClass().getComponentType());
-        array = ArrayUtils.removeElement(new boolean[] {true, false, true}, true);
-        assertTrue(Arrays.equals(new boolean[] {false, true}, array));
-        assertEquals(Boolean.TYPE, array.getClass().getComponentType());
-    }
-    
-    @Test
-    public void testRemoveElementByteArray() {
-        byte[] array;
-        array = ArrayUtils.removeElement((byte[]) null, (byte) 1);
-        assertNull(array);
-        array = ArrayUtils.removeElement(ArrayUtils.EMPTY_BYTE_ARRAY, (byte) 1);
-        assertTrue(Arrays.equals(ArrayUtils.EMPTY_BYTE_ARRAY, array));
-        assertEquals(Byte.TYPE, array.getClass().getComponentType());
-        array = ArrayUtils.removeElement(new byte[] {1}, (byte) 1);
-        assertTrue(Arrays.equals(ArrayUtils.EMPTY_BYTE_ARRAY, array));
-        assertEquals(Byte.TYPE, array.getClass().getComponentType());
-        array = ArrayUtils.removeElement(new byte[] {1, 2}, (byte) 1);
-        assertTrue(Arrays.equals(new byte[] {2}, array));
-        assertEquals(Byte.TYPE, array.getClass().getComponentType());
-        array = ArrayUtils.removeElement(new byte[] {1, 2, 1}, (byte) 1);
-        assertTrue(Arrays.equals(new byte[] {2, 1}, array));
-        assertEquals(Byte.TYPE, array.getClass().getComponentType());
-    }
-    
-    @Test
-    public void testRemoveElementCharArray() {
-        char[] array;
-        array = ArrayUtils.removeElement((char[]) null, 'a');
-        assertNull(array);
-        array = ArrayUtils.removeElement(ArrayUtils.EMPTY_CHAR_ARRAY, 'a');
-        assertTrue(Arrays.equals(ArrayUtils.EMPTY_CHAR_ARRAY, array));
-        assertEquals(Character.TYPE, array.getClass().getComponentType());
-        array = ArrayUtils.removeElement(new char[] {'a'}, 'a');
-        assertTrue(Arrays.equals(ArrayUtils.EMPTY_CHAR_ARRAY, array));
-        assertEquals(Character.TYPE, array.getClass().getComponentType());
-        array = ArrayUtils.removeElement(new char[] {'a', 'b'}, 'a');
-        assertTrue(Arrays.equals(new char[] {'b'}, array));
-        assertEquals(Character.TYPE, array.getClass().getComponentType());
-        array = ArrayUtils.removeElement(new char[] {'a', 'b', 'a'}, 'a');
-        assertTrue(Arrays.equals(new char[] {'b', 'a'}, array));
-        assertEquals(Character.TYPE, array.getClass().getComponentType());
-    }
-    
-    @Test
-    @SuppressWarnings("cast")
-    public void testRemoveElementDoubleArray() {
-        double[] array;
-        array = ArrayUtils.removeElement((double[]) null, (double) 1);
-        assertNull(array);
-        array = ArrayUtils.removeElement(ArrayUtils.EMPTY_DOUBLE_ARRAY, (double) 1);
-        assertTrue(Arrays.equals(ArrayUtils.EMPTY_DOUBLE_ARRAY, array));
-        assertEquals(Double.TYPE, array.getClass().getComponentType());
-        array = ArrayUtils.removeElement(new double[] {1}, (double) 1);
-        assertTrue(Arrays.equals(ArrayUtils.EMPTY_DOUBLE_ARRAY, array));
-        assertEquals(Double.TYPE, array.getClass().getComponentType());
-        array = ArrayUtils.removeElement(new double[] {1, 2}, (double) 1);
-        assertTrue(Arrays.equals(new double[] {2}, array));
-        assertEquals(Double.TYPE, array.getClass().getComponentType());
-        array = ArrayUtils.removeElement(new double[] {1, 2, 1}, (double) 1);
-        assertTrue(Arrays.equals(new double[] {2, 1}, array));
-        assertEquals(Double.TYPE, array.getClass().getComponentType());
-    }
-    
-    @Test
-    @SuppressWarnings("cast")
-    public void testRemoveElementFloatArray() {
-        float[] array;
-        array = ArrayUtils.removeElement((float[]) null, (float) 1);
-        assertNull(array);
-        array = ArrayUtils.removeElement(ArrayUtils.EMPTY_FLOAT_ARRAY, (float) 1);
-        assertTrue(Arrays.equals(ArrayUtils.EMPTY_FLOAT_ARRAY, array));
-        assertEquals(Float.TYPE, array.getClass().getComponentType());
-        array = ArrayUtils.removeElement(new float[] {1}, (float) 1);
-        assertTrue(Arrays.equals(ArrayUtils.EMPTY_FLOAT_ARRAY, array));
-        assertEquals(Float.TYPE, array.getClass().getComponentType());
-        array = ArrayUtils.removeElement(new float[] {1, 2}, (float) 1);
-        assertTrue(Arrays.equals(new float[] {2}, array));
-        assertEquals(Float.TYPE, array.getClass().getComponentType());
-        array = ArrayUtils.removeElement(new float[] {1, 2, 1}, (float) 1);
-        assertTrue(Arrays.equals(new float[] {2, 1}, array));
-        assertEquals(Float.TYPE, array.getClass().getComponentType());
-    }
-    
-    @Test
-    public void testRemoveElementIntArray() {
-        int[] array;
-        array = ArrayUtils.removeElement((int[]) null, 1);
-        assertNull(array);
-        array = ArrayUtils.removeElement(ArrayUtils.EMPTY_INT_ARRAY, 1);
-        assertTrue(Arrays.equals(ArrayUtils.EMPTY_INT_ARRAY, array));
-        assertEquals(Integer.TYPE, array.getClass().getComponentType());
-        array = ArrayUtils.removeElement(new int[] {1}, 1);
-        assertTrue(Arrays.equals(ArrayUtils.EMPTY_INT_ARRAY, array));
-        assertEquals(Integer.TYPE, array.getClass().getComponentType());
-        array = ArrayUtils.removeElement(new int[] {1, 2}, 1);
-        assertTrue(Arrays.equals(new int[] {2}, array));
-        assertEquals(Integer.TYPE, array.getClass().getComponentType());
-        array = ArrayUtils.removeElement(new int[] {1, 2, 1}, 1);
-        assertTrue(Arrays.equals(new int[] {2, 1}, array));
-        assertEquals(Integer.TYPE, array.getClass().getComponentType());
-    }
-    
-    @Test
-    @SuppressWarnings("cast")
-    public void testRemoveElementLongArray() {
-        long[] array;
-        array = ArrayUtils.removeElement((long[]) null, (long) 1);
-        assertNull(array);
-        array = ArrayUtils.removeElement(ArrayUtils.EMPTY_LONG_ARRAY, (long) 1);
-        assertTrue(Arrays.equals(ArrayUtils.EMPTY_LONG_ARRAY, array));
-        assertEquals(Long.TYPE, array.getClass().getComponentType());
-        array = ArrayUtils.removeElement(new long[] {1}, (long) 1);
-        assertTrue(Arrays.equals(ArrayUtils.EMPTY_LONG_ARRAY, array));
-        assertEquals(Long.TYPE, array.getClass().getComponentType());
-        array = ArrayUtils.removeElement(new long[] {1, 2}, (long) 1);
-        assertTrue(Arrays.equals(new long[] {2}, array));
-        assertEquals(Long.TYPE, array.getClass().getComponentType());
-        array = ArrayUtils.removeElement(new long[] {1, 2, 1}, (long) 1);
-        assertTrue(Arrays.equals(new long[] {2, 1}, array));
-        assertEquals(Long.TYPE, array.getClass().getComponentType());
-    }
-    
-    @Test
-    public void testRemoveElementShortArray() {
-        short[] array;
-        array = ArrayUtils.removeElement((short[]) null, (short) 1);
-        assertNull(array);
-        array = ArrayUtils.removeElement(ArrayUtils.EMPTY_SHORT_ARRAY, (short) 1);
-        assertTrue(Arrays.equals(ArrayUtils.EMPTY_SHORT_ARRAY, array));
-        assertEquals(Short.TYPE, array.getClass().getComponentType());
-        array = ArrayUtils.removeElement(new short[] {1}, (short) 1);
-        assertTrue(Arrays.equals(ArrayUtils.EMPTY_SHORT_ARRAY, array));
-        assertEquals(Short.TYPE, array.getClass().getComponentType());
-        array = ArrayUtils.removeElement(new short[] {1, 2}, (short) 1);
-        assertTrue(Arrays.equals(new short[] {2}, array));
-        assertEquals(Short.TYPE, array.getClass().getComponentType());
-        array = ArrayUtils.removeElement(new short[] {1, 2, 1}, (short) 1);
-        assertTrue(Arrays.equals(new short[] {2, 1}, array));
-        assertEquals(Short.TYPE, array.getClass().getComponentType());
-    }
-    
-}
diff --git a/lang/src/test/java/org/apache/commons/lang3/ArrayUtilsTest.java b/lang/src/test/java/org/apache/commons/lang3/ArrayUtilsTest.java
deleted file mode 100644
index 27150ae..0000000
--- a/lang/src/test/java/org/apache/commons/lang3/ArrayUtilsTest.java
+++ /dev/null
@@ -1,3629 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- * 
- *      http://www.apache.org/licenses/LICENSE-2.0
- * 
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.commons.lang3;
-
-import static org.junit.Assert.*;
-
-import java.lang.reflect.Constructor;
-import java.lang.reflect.Modifier;
-import java.util.Arrays;
-import java.util.Comparator;
-import java.util.Date;
-import java.util.Map;
-
-import org.junit.Test;
-
-/**
- * Unit tests {@link org.apache.commons.lang3.ArrayUtils}.
- *
- * @version $Id$
- */
-@SuppressWarnings("deprecation") // deliberate use of deprecated code
-public class ArrayUtilsTest  {
-
-    //-----------------------------------------------------------------------
-    @Test
-    public void testConstructor() {
-        assertNotNull(new ArrayUtils());
-        final Constructor<?>[] cons = ArrayUtils.class.getDeclaredConstructors();
-        assertEquals(1, cons.length);
-        assertTrue(Modifier.isPublic(cons[0].getModifiers()));
-        assertTrue(Modifier.isPublic(ArrayUtils.class.getModifiers()));
-        assertFalse(Modifier.isFinal(ArrayUtils.class.getModifiers()));
-    }
-    
-    //-----------------------------------------------------------------------
-    @Test
-    public void testToString() {
-        assertEquals("{}", ArrayUtils.toString(null));
-        assertEquals("{}", ArrayUtils.toString(new Object[0]));
-        assertEquals("{}", ArrayUtils.toString(new String[0]));
-        assertEquals("{<null>}", ArrayUtils.toString(new String[] {null}));
-        assertEquals("{pink,blue}", ArrayUtils.toString(new String[] {"pink","blue"}));
-        
-        assertEquals("<empty>", ArrayUtils.toString(null, "<empty>"));
-        assertEquals("{}", ArrayUtils.toString(new Object[0], "<empty>"));
-        assertEquals("{}", ArrayUtils.toString(new String[0], "<empty>"));
-        assertEquals("{<null>}", ArrayUtils.toString(new String[] {null}, "<empty>"));
-        assertEquals("{pink,blue}", ArrayUtils.toString(new String[] {"pink","blue"}, "<empty>"));
-    }
-
-    //-----------------------------------------------------------------------
-    @Test
-    public void testHashCode() {
-        final long[][] array1 = new long[][] {{2,5}, {4,5}};
-        final long[][] array2 = new long[][] {{2,5}, {4,6}};
-        assertTrue(ArrayUtils.hashCode(array1) == ArrayUtils.hashCode(array1));
-        assertFalse(ArrayUtils.hashCode(array1) == ArrayUtils.hashCode(array2));
-        
-        final Object[] array3 = new Object[] {new String(new char[] {'A', 'B'})};
-        final Object[] array4 = new Object[] {"AB"};
-        assertTrue(ArrayUtils.hashCode(array3) == ArrayUtils.hashCode(array3));
-        assertTrue(ArrayUtils.hashCode(array3) == ArrayUtils.hashCode(array4));
-        
-        final Object[] arrayA = new Object[] {new boolean[] {true, false}, new int[] {6, 7}};
-        final Object[] arrayB = new Object[] {new boolean[] {true, false}, new int[] {6, 7}};
-        assertTrue(ArrayUtils.hashCode(arrayB) == ArrayUtils.hashCode(arrayA));
-    }
-
-    //-----------------------------------------------------------------------
-    private void assertIsEquals(final Object array1, final Object array2, final Object array3) {
-        assertTrue(ArrayUtils.isEquals(array1, array1));
-        assertTrue(ArrayUtils.isEquals(array2, array2));
-        assertTrue(ArrayUtils.isEquals(array3, array3));
-        assertFalse(ArrayUtils.isEquals(array1, array2));
-        assertFalse(ArrayUtils.isEquals(array2, array1));
-        assertFalse(ArrayUtils.isEquals(array1, array3));
-        assertFalse(ArrayUtils.isEquals(array3, array1));
-        assertFalse(ArrayUtils.isEquals(array1, array2));
-        assertFalse(ArrayUtils.isEquals(array2, array1));
-    }
-
-    @Test
-    public void testIsEquals() {
-        final long[][] larray1 = new long[][]{{2, 5}, {4, 5}};
-        final long[][] larray2 = new long[][]{{2, 5}, {4, 6}};
-        final long[] larray3 = new long[]{2, 5};
-        this.assertIsEquals(larray1, larray2, larray3);
-
-        final int[][] iarray1 = new int[][]{{2, 5}, {4, 5}};
-        final int[][] iarray2 = new int[][]{{2, 5}, {4, 6}};
-        final int[] iarray3 = new int[]{2, 5};
-        this.assertIsEquals(iarray1, iarray2, iarray3);
-
-        final short[][] sarray1 = new short[][]{{2, 5}, {4, 5}};
-        final short[][] sarray2 = new short[][]{{2, 5}, {4, 6}};
-        final short[] sarray3 = new short[]{2, 5};
-        this.assertIsEquals(sarray1, sarray2, sarray3);
-
-        final float[][] farray1 = new float[][]{{2, 5}, {4, 5}};
-        final float[][] farray2 = new float[][]{{2, 5}, {4, 6}};
-        final float[] farray3 = new float[]{2, 5};
-        this.assertIsEquals(farray1, farray2, farray3);
-
-        final double[][] darray1 = new double[][]{{2, 5}, {4, 5}};
-        final double[][] darray2 = new double[][]{{2, 5}, {4, 6}};
-        final double[] darray3 = new double[]{2, 5};
-        this.assertIsEquals(darray1, darray2, darray3);
-
-        final byte[][] byteArray1 = new byte[][]{{2, 5}, {4, 5}};
-        final byte[][] byteArray2 = new byte[][]{{2, 5}, {4, 6}};
-        final byte[] byteArray3 = new byte[]{2, 5};
-        this.assertIsEquals(byteArray1, byteArray2, byteArray3);
-
-        final char[][] charArray1 = new char[][]{{2, 5}, {4, 5}};
-        final char[][] charArray2 = new char[][]{{2, 5}, {4, 6}};
-        final char[] charArray3 = new char[]{2, 5};
-        this.assertIsEquals(charArray1, charArray2, charArray3);
-
-        final boolean[][] barray1 = new boolean[][]{{true, false}, {true, true}};
-        final boolean[][] barray2 = new boolean[][]{{true, false}, {true, false}};
-        final boolean[] barray3 = new boolean[]{false, true};
-        this.assertIsEquals(barray1, barray2, barray3);
-
-        final Object[] array3 = new Object[]{new String(new char[]{'A', 'B'})};
-        final Object[] array4 = new Object[]{"AB"};
-        assertTrue(ArrayUtils.isEquals(array3, array3));
-        assertTrue(ArrayUtils.isEquals(array3, array4));
-
-        assertTrue(ArrayUtils.isEquals(null, null));
-        assertFalse(ArrayUtils.isEquals(null, array4));
-    }
-    
-    //-----------------------------------------------------------------------
-    /**
-     * Tests generic array creation with parameters of same type.
-     */
-    @Test
-    public void testArrayCreation()
-    {
-        final String[] array = ArrayUtils.toArray("foo", "bar");
-        assertEquals(2, array.length);
-        assertEquals("foo", array[0]);
-        assertEquals("bar", array[1]);
-    }
-
-    /**
-     * Tests generic array creation with general return type.
-     */
-    @Test
-    public void testArrayCreationWithGeneralReturnType()
-    {
-        final Object obj = ArrayUtils.toArray("foo", "bar");
-        assertTrue(obj instanceof String[]);
-    }
-
-    /**
-     * Tests generic array creation with parameters of common base type.
-     */
-    @Test
-    public void testArrayCreationWithDifferentTypes()
-    {
-        final Number[] array = ArrayUtils.<Number>toArray(Integer.valueOf(42), Double.valueOf(Math.PI));
-        assertEquals(2, array.length);
-        assertEquals(Integer.valueOf(42), array[0]);
-        assertEquals(Double.valueOf(Math.PI), array[1]);
-    }
-
-    /**
-     * Tests generic array creation with generic type.
-     */
-    @Test
-    public void testIndirectArrayCreation()
-    {
-        final String[] array = toArrayPropagatingType("foo", "bar");
-        assertEquals(2, array.length);
-        assertEquals("foo", array[0]);
-        assertEquals("bar", array[1]);
-    }
-
-    /**
-     * Tests generic empty array creation with generic type.
-     */
-    @Test
-    public void testEmptyArrayCreation()
-    {
-        final String[] array = ArrayUtils.<String>toArray();
-        assertEquals(0, array.length);
-    }
-
-    /**
-     * Tests indirect generic empty array creation with generic type.
-     */
-    @Test
-    public void testIndirectEmptyArrayCreation()
-    {
-        final String[] array = ArrayUtilsTest.<String>toArrayPropagatingType();
-        assertEquals(0, array.length);
-    }
-
-    private static <T> T[] toArrayPropagatingType(final T... items)
-    {
-        return ArrayUtils.toArray(items);
-    }
-    
-    //-----------------------------------------------------------------------
-    @Test
-    public void testToMap() {
-        Map<?, ?> map = ArrayUtils.toMap(new String[][] {{"foo", "bar"}, {"hello", "world"}});
-        
-        assertEquals("bar", map.get("foo"));
-        assertEquals("world", map.get("hello"));
-        
-        assertEquals(null, ArrayUtils.toMap(null));
-        try {
-            ArrayUtils.toMap(new String[][] {{"foo", "bar"}, {"short"}});
-            fail("exception expected");
-        } catch (final IllegalArgumentException ex) {}
-        try {
-            ArrayUtils.toMap(new Object[] {new Object[] {"foo", "bar"}, "illegal type"});
-            fail("exception expected");
-        } catch (final IllegalArgumentException ex) {}
-        try {
-            ArrayUtils.toMap(new Object[] {new Object[] {"foo", "bar"}, null});
-            fail("exception expected");
-        } catch (final IllegalArgumentException ex) {}
-        
-        map = ArrayUtils.toMap(new Object[] {new Map.Entry<Object, Object>() {
-            @Override
-            public Object getKey() {
-                return "foo";
-            }
-            @Override
-            public Object getValue() {
-                return "bar";
-            }
-            @Override
-            public Object setValue(final Object value) {
-                throw new UnsupportedOperationException();
-            }
-            @Override
-            public boolean equals(final Object o) {
-                throw new UnsupportedOperationException();
-            }
-            @Override
-            public int hashCode() {
-                throw new UnsupportedOperationException();
-            }
-        }});
-        assertEquals("bar", map.get("foo"));
-    }
-
-    //-----------------------------------------------------------------------
-    @Test
-    public void testClone() {
-        assertArrayEquals(null, ArrayUtils.clone((Object[]) null));
-        Object[] original1 = new Object[0];
-        Object[] cloned1 = ArrayUtils.clone(original1);
-        assertTrue(Arrays.equals(original1, cloned1));
-        assertTrue(original1 != cloned1);
-        
-        final StringBuffer buf = new StringBuffer("pick");
-        original1 = new Object[] {buf, "a", new String[] {"stick"}};
-        cloned1 = ArrayUtils.clone(original1);
-        assertTrue(Arrays.equals(original1, cloned1));
-        assertTrue(original1 != cloned1);
-        assertSame(original1[0], cloned1[0]);
-        assertSame(original1[1], cloned1[1]);
-        assertSame(original1[2], cloned1[2]);
-    }
-
-    @Test
-    public void testCloneBoolean() {
-        assertEquals(null, ArrayUtils.clone((boolean[]) null));
-        final boolean[] original = new boolean[] {true, false};
-        final boolean[] cloned = ArrayUtils.clone(original);
-        assertTrue(Arrays.equals(original, cloned));
-        assertTrue(original != cloned);
-    }
-    
-    @Test
-    public void testCloneLong() {
-        assertEquals(null, ArrayUtils.clone((long[]) null));
-        final long[] original = new long[] {0L, 1L};
-        final long[] cloned = ArrayUtils.clone(original);
-        assertTrue(Arrays.equals(original, cloned));
-        assertTrue(original != cloned);
-    }
-    
-    @Test
-    public void testCloneInt() {
-        assertEquals(null, ArrayUtils.clone((int[]) null));
-        final int[] original = new int[] {5, 8};
-        final int[] cloned = ArrayUtils.clone(original);
-        assertTrue(Arrays.equals(original, cloned));
-        assertTrue(original != cloned);
-    }
-    
-    @Test
-    public void testCloneShort() {
-        assertEquals(null, ArrayUtils.clone((short[]) null));
-        final short[] original = new short[] {1, 4};
-        final short[] cloned = ArrayUtils.clone(original);
-        assertTrue(Arrays.equals(original, cloned));
-        assertTrue(original != cloned);
-    }
-    
-    @Test
-    public void testCloneChar() {
-        assertEquals(null, ArrayUtils.clone((char[]) null));
-        final char[] original = new char[] {'a', '4'};
-        final char[] cloned = ArrayUtils.clone(original);
-        assertTrue(Arrays.equals(original, cloned));
-        assertTrue(original != cloned);
-    }
-    
-    @Test
-    public void testCloneByte() {
-        assertEquals(null, ArrayUtils.clone((byte[]) null));
-        final byte[] original = new byte[] {1, 6};
-        final byte[] cloned = ArrayUtils.clone(original);
-        assertTrue(Arrays.equals(original, cloned));
-        assertTrue(original != cloned);
-    }
-    
-    @Test
-    public void testCloneDouble() {
-        assertEquals(null, ArrayUtils.clone((double[]) null));
-        final double[] original = new double[] {2.4d, 5.7d};
-        final double[] cloned = ArrayUtils.clone(original);
-        assertTrue(Arrays.equals(original, cloned));
-        assertTrue(original != cloned);
-    }
-    
-    @Test
-    public void testCloneFloat() {
-        assertEquals(null, ArrayUtils.clone((float[]) null));
-        final float[] original = new float[] {2.6f, 6.4f};
-        final float[] cloned = ArrayUtils.clone(original);
-        assertTrue(Arrays.equals(original, cloned));
-        assertTrue(original != cloned);
-    }
-
-    //-----------------------------------------------------------------------
-
-
-    @Test
-    public void testNullToEmptyBooleanNull() throws Exception {
-        assertEquals(ArrayUtils.EMPTY_BOOLEAN_ARRAY, ArrayUtils.nullToEmpty((boolean[]) null));
-    }
-
-    @Test
-    public void testNullToEmptyBooleanEmptyArray() throws Exception {
-        final boolean[] empty = new boolean[]{};
-        final boolean[] result = ArrayUtils.nullToEmpty(empty);
-        assertEquals(ArrayUtils.EMPTY_BOOLEAN_ARRAY, result);
-        assertNotSame(empty, result);
-    }
-
-    @Test
-    public void testNullToEmptyBoolean() {
-        final boolean[] original = new boolean[] {true, false};
-        assertEquals(original, ArrayUtils.nullToEmpty(original));
-    }
-
-    @Test
-    public void testNullToEmptyLongNull() throws Exception {
-        assertEquals(ArrayUtils.EMPTY_LONG_ARRAY, ArrayUtils.nullToEmpty((long[]) null));
-    }
-
-    @Test
-    public void testNullToEmptyLongEmptyArray() throws Exception {
-        final long[] empty = new long[]{};
-        final long[] result = ArrayUtils.nullToEmpty(empty);
-        assertEquals(ArrayUtils.EMPTY_LONG_ARRAY, result);
-        assertNotSame(empty, result);
-    }
-
-    @Test
-    public void testNullToEmptyLong() {
-        final long[] original = new long[] {1L, 2L};
-        assertEquals(original, ArrayUtils.nullToEmpty(original));
-    }
-
-    @Test
-    public void testNullToEmptyIntNull() throws Exception {
-        assertEquals(ArrayUtils.EMPTY_INT_ARRAY, ArrayUtils.nullToEmpty((int[]) null));
-    }
-
-    @Test
-    public void testNullToEmptyIntEmptyArray() throws Exception {
-        final int[] empty = new int[]{};
-        final int[] result = ArrayUtils.nullToEmpty(empty);
-        assertEquals(ArrayUtils.EMPTY_INT_ARRAY, result);
-        assertNotSame(empty, result);
-    }
-
-    @Test
-    public void testNullToEmptyInt() {
-        final int[] original = new int[] {1, 2};
-        assertEquals(original, ArrayUtils.nullToEmpty(original));
-    }
-
-    @Test
-    public void testNullToEmptyShortNull() throws Exception {
-        assertEquals(ArrayUtils.EMPTY_SHORT_ARRAY, ArrayUtils.nullToEmpty((short[]) null));
-    }
-
-    @Test
-    public void testNullToEmptyShortEmptyArray() throws Exception {
-        final short[] empty = new short[]{};
-        final short[] result = ArrayUtils.nullToEmpty(empty);
-        assertEquals(ArrayUtils.EMPTY_SHORT_ARRAY, result);
-        assertNotSame(empty, result);
-    }
-
-    @Test
-    public void testNullToEmptyShort() {
-        final short[] original = new short[] {1, 2};
-        assertEquals(original, ArrayUtils.nullToEmpty(original));
-    }
-
-    @Test
-    public void testNullToEmptyCharNull() throws Exception {
-        assertEquals(ArrayUtils.EMPTY_CHAR_ARRAY, ArrayUtils.nullToEmpty((char[]) null));
-    }
-
-    @Test
-    public void testNullToEmptyCharEmptyArray() throws Exception {
-        final char[] empty = new char[]{};
-        final char[] result = ArrayUtils.nullToEmpty(empty);
-        assertEquals(ArrayUtils.EMPTY_CHAR_ARRAY, result);
-        assertNotSame(empty, result);
-    }
-
-    @Test
-    public void testNullToEmptyChar() {
-        final char[] original = new char[] {'a', 'b'};
-        assertEquals(original, ArrayUtils.nullToEmpty(original));
-    }
-
-    @Test
-    public void testNullToEmptyByteNull() throws Exception {
-        assertEquals(ArrayUtils.EMPTY_BYTE_ARRAY, ArrayUtils.nullToEmpty((byte[]) null));
-    }
-
-    @Test
-    public void testNullToEmptyByteEmptyArray() throws Exception {
-        final byte[] empty = new byte[]{};
-        final byte[] result = ArrayUtils.nullToEmpty(empty);
-        assertEquals(ArrayUtils.EMPTY_BYTE_ARRAY, result);
-        assertNotSame(empty, result);
-    }
-
-    @Test
-    public void testNullToEmptyByte() {
-        final byte[] original = new byte[] {0x0F, 0x0E};
-        assertEquals(original, ArrayUtils.nullToEmpty(original));
-    }
-
-    @Test
-    public void testNullToEmptyDoubleNull() throws Exception {
-        assertEquals(ArrayUtils.EMPTY_DOUBLE_ARRAY, ArrayUtils.nullToEmpty((double[]) null));
-    }
-
-    @Test
-    public void testNullToEmptyDoubleEmptyArray() throws Exception {
-        final double[] empty = new double[]{};
-        final double[] result = ArrayUtils.nullToEmpty(empty);
-        assertEquals(ArrayUtils.EMPTY_DOUBLE_ARRAY, result);
-        assertNotSame(empty, result);
-    }
-
-    @Test
-    public void testNullToEmptyDouble() {
-        final double[] original = new double[] {1L, 2L};
-        assertEquals(original, ArrayUtils.nullToEmpty(original));
-    }
-
-    @Test
-    public void testNullToEmptyFloatNull() throws Exception {
-        assertEquals(ArrayUtils.EMPTY_FLOAT_ARRAY, ArrayUtils.nullToEmpty((float[]) null));
-    }
-
-    @Test
-    public void testNullToEmptyFloatEmptyArray() throws Exception {
-        final float[] empty = new float[]{};
-        final float[] result = ArrayUtils.nullToEmpty(empty);
-        assertEquals(ArrayUtils.EMPTY_FLOAT_ARRAY, result);
-        assertNotSame(empty, result);
-    }
-
-    @Test
-    public void testNullToEmptyFloat() {
-        final float[] original = new float[] {2.6f, 3.8f};
-        assertEquals(original, ArrayUtils.nullToEmpty(original));
-    }
-
-    @Test
-    public void testNullToEmptyObjectNull() throws Exception {
-        assertArrayEquals(ArrayUtils.EMPTY_OBJECT_ARRAY, ArrayUtils.nullToEmpty((Object[]) null));
-    }
-
-    @Test
-    public void testNullToEmptyObjectEmptyArray() throws Exception {
-        final Object[] empty = new Object[]{};
-        final Object[] result = ArrayUtils.nullToEmpty(empty);
-        assertArrayEquals(ArrayUtils.EMPTY_OBJECT_ARRAY, result);
-        assertNotSame(empty, result);
-    }
-
-    @Test
-    public void testNullToEmptyObject() {
-        final Object[] original = new Object[] {Boolean.TRUE, Boolean.FALSE};
-        assertArrayEquals(original, ArrayUtils.nullToEmpty(original));
-    }
-
-    @Test
-    public void testNullToEmptyClassNull() throws Exception {
-        assertArrayEquals(ArrayUtils.EMPTY_CLASS_ARRAY, ArrayUtils.nullToEmpty((Class<?>[]) null));
-    }
-
-    @Test
-    public void testNullToEmptyClassEmptyArray() throws Exception {
-        final Class<?>[] empty = {};
-        final Class<?>[] result = ArrayUtils.nullToEmpty(empty);
-        assertArrayEquals(ArrayUtils.EMPTY_CLASS_ARRAY, result);
-        assertNotSame(empty, result);
-    }
-
-    @Test
-    public void testNullToEmptyClass() {
-        final Class<?>[] original = { Object.class, String.class };
-        assertArrayEquals(original, ArrayUtils.nullToEmpty(original));
-    }
-
-    @Test
-    public void testNullToEmptyStringNull() throws Exception {
-        assertArrayEquals(ArrayUtils.EMPTY_STRING_ARRAY, ArrayUtils.nullToEmpty((String[]) null));
-    }
-
-    @Test
-    public void testNullToEmptyStringEmptyArray() throws Exception {
-        final String[] empty = new String[]{};
-        final String[] result = ArrayUtils.nullToEmpty(empty);
-        assertArrayEquals(ArrayUtils.EMPTY_STRING_ARRAY, result);
-        assertNotSame(empty, result);
-    }
-
-    @Test
-    public void testNullToEmptyString() {
-        final String[] original = new String[] {"abc", "def"};
-        assertArrayEquals(original, ArrayUtils.nullToEmpty(original));
-    }
-
-    @Test
-    public void testNullToEmptyBooleanObjectNull() throws Exception {
-        assertArrayEquals(ArrayUtils.EMPTY_BOOLEAN_OBJECT_ARRAY, ArrayUtils.nullToEmpty((Boolean[]) null));
-    }
-
-    @Test
-    public void testNullToEmptyBooleanObjectEmptyArray() throws Exception {
-        final Boolean[] empty = new Boolean[]{};
-        final Boolean[] result = ArrayUtils.nullToEmpty(empty);
-        assertArrayEquals(ArrayUtils.EMPTY_BOOLEAN_OBJECT_ARRAY, result);
-        assertNotSame(empty, result);
-    }
-
-    @Test
-    public void testNullToEmptyBooleanObject() {
-        final Boolean[] original = new Boolean[] {Boolean.TRUE, Boolean.FALSE};
-        assertArrayEquals(original, ArrayUtils.nullToEmpty(original));
-    }
-
-    @Test
-    public void testNullToEmptyLongObjectNull() throws Exception {
-        assertArrayEquals(ArrayUtils.EMPTY_LONG_OBJECT_ARRAY, ArrayUtils.nullToEmpty((Long[]) null));
-    }
-
-    @Test
-    public void testNullToEmptyLongObjectEmptyArray() throws Exception {
-        final Long[] empty = new Long[]{};
-        final Long[] result = ArrayUtils.nullToEmpty(empty);
-        assertArrayEquals(ArrayUtils.EMPTY_LONG_OBJECT_ARRAY, result);
-        assertNotSame(empty, result);
-    }
-
-    @Test
-    public void testNullToEmptyLongObject() {
-        @SuppressWarnings("boxing")
-        final Long[] original = new Long[] {1L, 2L};
-        assertArrayEquals(original, ArrayUtils.nullToEmpty(original));
-    }
-
-    @Test
-    public void testNullToEmptyIntObjectNull() throws Exception {
-        assertArrayEquals(ArrayUtils.EMPTY_INTEGER_OBJECT_ARRAY, ArrayUtils.nullToEmpty((Integer[]) null));
-    }
-
-    @Test
-    public void testNullToEmptyIntObjectEmptyArray() throws Exception {
-        final Integer[] empty = new Integer[]{};
-        final Integer[] result = ArrayUtils.nullToEmpty(empty);
-        assertArrayEquals(ArrayUtils.EMPTY_INTEGER_OBJECT_ARRAY, result);
-        assertNotSame(empty, result);
-    }
-
-    @Test
-    public void testNullToEmptyIntObject() {
-        final Integer[] original = new Integer[] {1, 2};
-        assertArrayEquals(original, ArrayUtils.nullToEmpty(original));
-    }
-
-    @Test
-    public void testNullToEmptyShortObjectNull() throws Exception {
-        assertArrayEquals(ArrayUtils.EMPTY_SHORT_OBJECT_ARRAY, ArrayUtils.nullToEmpty((Short[]) null));
-    }
-
-    @Test
-    public void testNullToEmptyShortObjectEmptyArray() throws Exception {
-        final Short[] empty = new Short[]{};
-        final Short[] result = ArrayUtils.nullToEmpty(empty);
-        assertArrayEquals(ArrayUtils.EMPTY_SHORT_OBJECT_ARRAY, result);
-        assertNotSame(empty, result);
-    }
-
-    @Test
-    public void testNullToEmptyShortObject() {
-        @SuppressWarnings("boxing")
-        final Short[] original = new Short[] {1, 2};
-        assertArrayEquals(original, ArrayUtils.nullToEmpty(original));
-    }
-
-    @Test
-    public void testNUllToEmptyCharObjectNull() throws Exception {
-        assertArrayEquals(ArrayUtils.EMPTY_CHARACTER_OBJECT_ARRAY, ArrayUtils.nullToEmpty((Character[]) null));
-    }
-
-    @Test
-    public void testNullToEmptyCharObjectEmptyArray() throws Exception {
-        final Character[] empty = new Character[]{};
-        final Character[] result = ArrayUtils.nullToEmpty(empty);
-        assertArrayEquals(ArrayUtils.EMPTY_CHARACTER_OBJECT_ARRAY, result);
-        assertNotSame(empty, result);
-    }
-
-    @Test
-    public void testNullToEmptyCharObject() {
-        final Character[] original = new Character[] {'a', 'b'};
-        assertArrayEquals(original, ArrayUtils.nullToEmpty(original));
-    }
-
-    @Test
-    public void testNullToEmptyByteObjectNull() throws Exception {
-        assertArrayEquals(ArrayUtils.EMPTY_BYTE_OBJECT_ARRAY, ArrayUtils.nullToEmpty((Byte[]) null));
-    }
-
-    @Test
-    public void testNullToEmptyByteObjectEmptyArray() throws Exception {
-        final Byte[] empty = new Byte[]{};
-        final Byte[] result = ArrayUtils.nullToEmpty(empty);
-        assertArrayEquals(ArrayUtils.EMPTY_BYTE_OBJECT_ARRAY, result);
-        assertNotSame(empty, result);
-    }
-
-    @Test
-    public void testNullToEmptyByteObject() {
-        final Byte[] original = new Byte[] {0x0F, 0x0E};
-        assertArrayEquals(original, ArrayUtils.nullToEmpty(original));
-    }
-
-    @Test
-    public void testNullToEmptyDoubleObjectNull() throws Exception {
-        assertArrayEquals(ArrayUtils.EMPTY_DOUBLE_OBJECT_ARRAY, ArrayUtils.nullToEmpty((Double[]) null));
-    }
-
-    @Test
-    public void testNullToEmptyDoubleObjectEmptyArray() throws Exception {
-        final Double[] empty = new Double[]{};
-        final Double[] result = ArrayUtils.nullToEmpty(empty);
-        assertArrayEquals(ArrayUtils.EMPTY_DOUBLE_OBJECT_ARRAY, result);
-        assertNotSame(empty, result);
-    }
-
-    @Test
-    public void testNullToEmptyDoubleObject() {
-        final Double[] original = new Double[] {1D, 2D};
-        assertArrayEquals(original, ArrayUtils.nullToEmpty(original));
-    }
-
-    @Test
-    public void testNullToEmptyFloatObjectNull() throws Exception {
-        assertArrayEquals(ArrayUtils.EMPTY_FLOAT_OBJECT_ARRAY, ArrayUtils.nullToEmpty((Float[]) null));
-    }
-
-    @Test
-    public void testNullToEmptyFloatObjectEmptyArray() throws Exception {
-        final Float[] empty = new Float[]{};
-        final Float[] result = ArrayUtils.nullToEmpty(empty);
-        assertArrayEquals(ArrayUtils.EMPTY_FLOAT_OBJECT_ARRAY, result);
-        assertNotSame(empty, result);
-    }
-
-    @Test
-    public void testNullToEmptyFloatObject() {
-        final Float[] original = new Float[] {2.6f, 3.8f};
-        assertArrayEquals(original, ArrayUtils.nullToEmpty(original));
-    }
-
-    //-----------------------------------------------------------------------
-
-    @Test
-    public void testSubarrayObject() {
-        final Object[] nullArray = null;
-        final Object[] objectArray = { "a", "b", "c", "d", "e", "f"};
-
-        assertEquals("0 start, mid end", "abcd",
-            StringUtils.join(ArrayUtils.subarray(objectArray, 0, 4)));
-        assertEquals("0 start, length end", "abcdef",
-            StringUtils.join(ArrayUtils.subarray(objectArray, 0, objectArray.length)));
-        assertEquals("mid start, mid end", "bcd",
-            StringUtils.join(ArrayUtils.subarray(objectArray, 1, 4)));
-        assertEquals("mid start, length end", "bcdef",
-            StringUtils.join(ArrayUtils.subarray(objectArray, 1, objectArray.length)));
-
-        assertNull("null input", ArrayUtils.subarray(nullArray, 0, 3));
-        assertEquals("empty array", "",
-            StringUtils.join(ArrayUtils.subarray(ArrayUtils.EMPTY_OBJECT_ARRAY, 1, 2)));
-        assertEquals("start > end", "",
-            StringUtils.join(ArrayUtils.subarray(objectArray, 4, 2)));
-        assertEquals("start == end", "",
-            StringUtils.join(ArrayUtils.subarray(objectArray, 3, 3)));
-        assertEquals("start undershoot, normal end", "abcd",
-            StringUtils.join(ArrayUtils.subarray(objectArray, -2, 4)));
-        assertEquals("start overshoot, any end", "",
-            StringUtils.join(ArrayUtils.subarray(objectArray, 33, 4)));
-        assertEquals("normal start, end overshoot", "cdef",
-            StringUtils.join(ArrayUtils.subarray(objectArray, 2, 33)));
-        assertEquals("start undershoot, end overshoot", "abcdef",
-            StringUtils.join(ArrayUtils.subarray(objectArray, -2, 12)));
-            
-        // array type tests
-        final Date[] dateArray = { new java.sql.Date(new Date().getTime()),
-            new Date(), new Date(), new Date(), new Date() };
-
-        assertSame("Object type", Object.class,
-            ArrayUtils.subarray(objectArray, 2, 4).getClass().getComponentType());
-        assertSame("java.util.Date type", java.util.Date.class,
-            ArrayUtils.subarray(dateArray, 1, 4).getClass().getComponentType());
-        assertNotSame("java.sql.Date type", java.sql.Date.class,
-            ArrayUtils.subarray(dateArray, 1, 4).getClass().getComponentType());
-        try {
-            @SuppressWarnings("unused")
-            final
-            java.sql.Date[] dummy = (java.sql.Date[])ArrayUtils.subarray(dateArray, 1,3);
-            fail("Invalid downcast");
-        } catch (final ClassCastException e) {}
-    }
-
-    @Test
-    public void testSubarrayLong() {
-        final long[] nullArray = null;
-        final long[] array = { 999910, 999911, 999912, 999913, 999914, 999915 };
-        final long[] leftSubarray     = { 999910, 999911, 999912, 999913 };
-        final long[] midSubarray      = { 999911, 999912, 999913, 999914 };
-        final long[] rightSubarray    = { 999912, 999913, 999914, 999915 };
-
-        assertTrue("0 start, mid end",
-            ArrayUtils.isEquals(leftSubarray,
-                ArrayUtils.subarray(array, 0, 4)));
-
-        assertTrue("0 start, length end",
-            ArrayUtils.isEquals(array,
-                ArrayUtils.subarray(array, 0, array.length)));
-
-        assertTrue("mid start, mid end",
-            ArrayUtils.isEquals(midSubarray,
-                ArrayUtils.subarray(array, 1, 5)));
-
-        assertTrue("mid start, length end",
-            ArrayUtils.isEquals(rightSubarray,
-                ArrayUtils.subarray(array, 2, array.length)));
-
-
-        assertNull("null input", ArrayUtils.subarray(nullArray, 0, 3));
-
-        assertEquals("empty array", ArrayUtils.EMPTY_LONG_ARRAY,
-            ArrayUtils.subarray(ArrayUtils.EMPTY_LONG_ARRAY, 1, 2));
-
-        assertEquals("start > end", ArrayUtils.EMPTY_LONG_ARRAY,
-            ArrayUtils.subarray(array, 4, 2));
-
-        assertEquals("start == end", ArrayUtils.EMPTY_LONG_ARRAY,
-            ArrayUtils.subarray(array, 3, 3));
-
-        assertTrue("start undershoot, normal end",
-            ArrayUtils.isEquals(leftSubarray,
-                ArrayUtils.subarray(array, -2, 4)));
-
-        assertEquals("start overshoot, any end",
-            ArrayUtils.EMPTY_LONG_ARRAY,
-                ArrayUtils.subarray(array, 33, 4));
-
-        assertTrue("normal start, end overshoot",
-            ArrayUtils.isEquals(rightSubarray,
-                ArrayUtils.subarray(array, 2, 33)));
-
-        assertTrue("start undershoot, end overshoot",
-            ArrayUtils.isEquals(array,
-                ArrayUtils.subarray(array, -2, 12)));
-
-        // empty-return tests
-
-        assertSame("empty array, object test",
-            ArrayUtils.EMPTY_LONG_ARRAY,
-                ArrayUtils.subarray(ArrayUtils.EMPTY_LONG_ARRAY, 1, 2));
-
-        assertSame("start > end, object test",
-            ArrayUtils.EMPTY_LONG_ARRAY,
-                ArrayUtils.subarray(array, 4, 1));
-
-        assertSame("start == end, object test",
-            ArrayUtils.EMPTY_LONG_ARRAY,
-                ArrayUtils.subarray(array, 3, 3));
-
-        assertSame("start overshoot, any end, object test",
-            ArrayUtils.EMPTY_LONG_ARRAY,
-                ArrayUtils.subarray(array, 8733, 4));
-
-        // array type tests
-
-        assertSame("long type", long.class,
-            ArrayUtils.subarray(array, 2, 4).getClass().getComponentType());
-
-    }
-
-    @Test
-    public void testSubarrayInt() {
-        final int[] nullArray = null;
-        final int[] array = { 10, 11, 12, 13, 14, 15 };
-        final int[] leftSubarray  = { 10, 11, 12, 13 };
-        final int[] midSubarray   = { 11, 12, 13, 14 };
-        final int[] rightSubarray = { 12, 13, 14, 15 };
-
-
-        assertTrue("0 start, mid end",
-            ArrayUtils.isEquals(leftSubarray,
-                ArrayUtils.subarray(array, 0, 4)));
-
-        assertTrue("0 start, length end",
-            ArrayUtils.isEquals(array,
-                ArrayUtils.subarray(array, 0, array.length)));
-
-        assertTrue("mid start, mid end",
-            ArrayUtils.isEquals(midSubarray,
-                ArrayUtils.subarray(array, 1, 5)));
-
-        assertTrue("mid start, length end",
-            ArrayUtils.isEquals(rightSubarray,
-                ArrayUtils.subarray(array, 2, array.length)));
-
-
-        assertNull("null input", ArrayUtils.subarray(nullArray, 0, 3));
-
-        assertEquals("empty array", ArrayUtils.EMPTY_INT_ARRAY,
-            ArrayUtils.subarray(ArrayUtils.EMPTY_INT_ARRAY, 1, 2));
-
-        assertEquals("start > end", ArrayUtils.EMPTY_INT_ARRAY,
-            ArrayUtils.subarray(array, 4, 2));
-
-        assertEquals("start == end", ArrayUtils.EMPTY_INT_ARRAY,
-            ArrayUtils.subarray(array, 3, 3));
-
-        assertTrue("start undershoot, normal end",
-            ArrayUtils.isEquals(leftSubarray,
-                ArrayUtils.subarray(array, -2, 4)));
-
-        assertEquals("start overshoot, any end",
-            ArrayUtils.EMPTY_INT_ARRAY,
-                ArrayUtils.subarray(array, 33, 4));
-
-        assertTrue("normal start, end overshoot",
-            ArrayUtils.isEquals(rightSubarray,
-                ArrayUtils.subarray(array, 2, 33)));
-
-        assertTrue("start undershoot, end overshoot",
-            ArrayUtils.isEquals(array,
-                ArrayUtils.subarray(array, -2, 12)));
-
-        // empty-return tests
-
-        assertSame("empty array, object test",
-            ArrayUtils.EMPTY_INT_ARRAY,
-                ArrayUtils.subarray(ArrayUtils.EMPTY_INT_ARRAY, 1, 2));
-
-        assertSame("start > end, object test",
-            ArrayUtils.EMPTY_INT_ARRAY,
-                ArrayUtils.subarray(array, 4, 1));
-
-        assertSame("start == end, object test",
-            ArrayUtils.EMPTY_INT_ARRAY,
-                ArrayUtils.subarray(array, 3, 3));
-
-        assertSame("start overshoot, any end, object test",
-            ArrayUtils.EMPTY_INT_ARRAY,
-                ArrayUtils.subarray(array, 8733, 4));
-
-        // array type tests
-
-        assertSame("int type", int.class,
-            ArrayUtils.subarray(array, 2, 4).getClass().getComponentType());
-
-    }
-
-    @Test
-    public void testSubarrayShort() {
-        final short[] nullArray = null;
-        final short[] array = { 10, 11, 12, 13, 14, 15 };
-        final short[] leftSubarray    = { 10, 11, 12, 13 };
-        final short[] midSubarray     = { 11, 12, 13, 14 };
-        final short[] rightSubarray   = { 12, 13, 14, 15 };
-
-
-        assertTrue("0 start, mid end",
-            ArrayUtils.isEquals(leftSubarray,
-                ArrayUtils.subarray(array, 0, 4)));
-
-        assertTrue("0 start, length end",
-            ArrayUtils.isEquals(array,
-                ArrayUtils.subarray(array, 0, array.length)));
-
-        assertTrue("mid start, mid end",
-            ArrayUtils.isEquals(midSubarray,
-                ArrayUtils.subarray(array, 1, 5)));
-
-        assertTrue("mid start, length end",
-            ArrayUtils.isEquals(rightSubarray,
-                ArrayUtils.subarray(array, 2, array.length)));
-
-
-        assertNull("null input", ArrayUtils.subarray(nullArray, 0, 3));
-
-        assertEquals("empty array", ArrayUtils.EMPTY_SHORT_ARRAY,
-            ArrayUtils.subarray(ArrayUtils.EMPTY_SHORT_ARRAY, 1, 2));
-
-        assertEquals("start > end", ArrayUtils.EMPTY_SHORT_ARRAY,
-            ArrayUtils.subarray(array, 4, 2));
-
-        assertEquals("start == end", ArrayUtils.EMPTY_SHORT_ARRAY,
-            ArrayUtils.subarray(array, 3, 3));
-
-        assertTrue("start undershoot, normal end",
-            ArrayUtils.isEquals(leftSubarray,
-                ArrayUtils.subarray(array, -2, 4)));
-
-        assertEquals("start overshoot, any end",
-            ArrayUtils.EMPTY_SHORT_ARRAY,
-                ArrayUtils.subarray(array, 33, 4));
-
-        assertTrue("normal start, end overshoot",
-            ArrayUtils.isEquals(rightSubarray,
-                ArrayUtils.subarray(array, 2, 33)));
-
-        assertTrue("start undershoot, end overshoot",
-            ArrayUtils.isEquals(array,
-                ArrayUtils.subarray(array, -2, 12)));
-
-        // empty-return tests
-
-        assertSame("empty array, object test",
-            ArrayUtils.EMPTY_SHORT_ARRAY,
-                ArrayUtils.subarray(ArrayUtils.EMPTY_SHORT_ARRAY, 1, 2));
-
-        assertSame("start > end, object test",
-            ArrayUtils.EMPTY_SHORT_ARRAY,
-                ArrayUtils.subarray(array, 4, 1));
-
-        assertSame("start == end, object test",
-            ArrayUtils.EMPTY_SHORT_ARRAY,
-                ArrayUtils.subarray(array, 3, 3));
-
-        assertSame("start overshoot, any end, object test",
-            ArrayUtils.EMPTY_SHORT_ARRAY,
-                ArrayUtils.subarray(array, 8733, 4));
-
-        // array type tests
-
-        assertSame("short type", short.class,
-            ArrayUtils.subarray(array, 2, 4).getClass().getComponentType());
-
-    }
-
-    @Test
-    public void testSubarrChar() {
-        final char[] nullArray = null;
-        final char[] array = { 'a', 'b', 'c', 'd', 'e', 'f' };
-        final char[] leftSubarray     = { 'a', 'b', 'c', 'd', };
-        final char[] midSubarray      = { 'b', 'c', 'd', 'e', };
-        final char[] rightSubarray    = { 'c', 'd', 'e', 'f', };
-
-
-        assertTrue("0 start, mid end",
-            ArrayUtils.isEquals(leftSubarray,
-                ArrayUtils.subarray(array, 0, 4)));
-
-        assertTrue("0 start, length end",
-            ArrayUtils.isEquals(array,
-                ArrayUtils.subarray(array, 0, array.length)));
-
-        assertTrue("mid start, mid end",
-            ArrayUtils.isEquals(midSubarray,
-                ArrayUtils.subarray(array, 1, 5)));
-
-        assertTrue("mid start, length end",
-            ArrayUtils.isEquals(rightSubarray,
-                ArrayUtils.subarray(array, 2, array.length)));
-
-
-        assertNull("null input", ArrayUtils.subarray(nullArray, 0, 3));
-
-        assertEquals("empty array", ArrayUtils.EMPTY_CHAR_ARRAY,
-            ArrayUtils.subarray(ArrayUtils.EMPTY_CHAR_ARRAY, 1, 2));
-
-        assertEquals("start > end", ArrayUtils.EMPTY_CHAR_ARRAY,
-            ArrayUtils.subarray(array, 4, 2));
-
-        assertEquals("start == end", ArrayUtils.EMPTY_CHAR_ARRAY,
-            ArrayUtils.subarray(array, 3, 3));
-
-        assertTrue("start undershoot, normal end",
-            ArrayUtils.isEquals(leftSubarray,
-                ArrayUtils.subarray(array, -2, 4)));
-
-        assertEquals("start overshoot, any end",
-            ArrayUtils.EMPTY_CHAR_ARRAY,
-                ArrayUtils.subarray(array, 33, 4));
-
-        assertTrue("normal start, end overshoot",
-            ArrayUtils.isEquals(rightSubarray,
-                ArrayUtils.subarray(array, 2, 33)));
-
-        assertTrue("start undershoot, end overshoot",
-            ArrayUtils.isEquals(array,
-                ArrayUtils.subarray(array, -2, 12)));
-
-        // empty-return tests
-
-        assertSame("empty array, object test",
-            ArrayUtils.EMPTY_CHAR_ARRAY,
-                ArrayUtils.subarray(ArrayUtils.EMPTY_CHAR_ARRAY, 1, 2));
-
-        assertSame("start > end, object test",
-            ArrayUtils.EMPTY_CHAR_ARRAY,
-                ArrayUtils.subarray(array, 4, 1));
-
-        assertSame("start == end, object test",
-            ArrayUtils.EMPTY_CHAR_ARRAY,
-                ArrayUtils.subarray(array, 3, 3));
-
-        assertSame("start overshoot, any end, object test",
-            ArrayUtils.EMPTY_CHAR_ARRAY,
-                ArrayUtils.subarray(array, 8733, 4));
-
-        // array type tests
-
-        assertSame("char type", char.class,
-            ArrayUtils.subarray(array, 2, 4).getClass().getComponentType());
-
-    }
-
-    @Test
-    public void testSubarrayByte() {
-        final byte[] nullArray = null;
-        final byte[] array = { 10, 11, 12, 13, 14, 15 };
-        final byte[] leftSubarray     = { 10, 11, 12, 13 };
-        final byte[] midSubarray      = { 11, 12, 13, 14 };
-        final byte[] rightSubarray = { 12, 13, 14, 15 };
-
-
-        assertTrue("0 start, mid end",
-            ArrayUtils.isEquals(leftSubarray,
-                ArrayUtils.subarray(array, 0, 4)));
-
-        assertTrue("0 start, length end",
-            ArrayUtils.isEquals(array,
-                ArrayUtils.subarray(array, 0, array.length)));
-
-        assertTrue("mid start, mid end",
-            ArrayUtils.isEquals(midSubarray,
-                ArrayUtils.subarray(array, 1, 5)));
-
-        assertTrue("mid start, length end",
-            ArrayUtils.isEquals(rightSubarray,
-                ArrayUtils.subarray(array, 2, array.length)));
-
-
-        assertNull("null input", ArrayUtils.subarray(nullArray, 0, 3));
-
-        assertEquals("empty array", ArrayUtils.EMPTY_BYTE_ARRAY,
-            ArrayUtils.subarray(ArrayUtils.EMPTY_BYTE_ARRAY, 1, 2));
-
-        assertEquals("start > end", ArrayUtils.EMPTY_BYTE_ARRAY,
-            ArrayUtils.subarray(array, 4, 2));
-
-        assertEquals("start == end", ArrayUtils.EMPTY_BYTE_ARRAY,
-            ArrayUtils.subarray(array, 3, 3));
-
-        assertTrue("start undershoot, normal end",
-            ArrayUtils.isEquals(leftSubarray,
-                ArrayUtils.subarray(array, -2, 4)));
-
-        assertEquals("start overshoot, any end",
-            ArrayUtils.EMPTY_BYTE_ARRAY,
-                ArrayUtils.subarray(array, 33, 4));
-
-        assertTrue("normal start, end overshoot",
-            ArrayUtils.isEquals(rightSubarray,
-                ArrayUtils.subarray(array, 2, 33)));
-
-        assertTrue("start undershoot, end overshoot",
-            ArrayUtils.isEquals(array,
-                ArrayUtils.subarray(array, -2, 12)));
-
-        // empty-return tests
-
-        assertSame("empty array, object test",
-            ArrayUtils.EMPTY_BYTE_ARRAY,
-                ArrayUtils.subarray(ArrayUtils.EMPTY_BYTE_ARRAY, 1, 2));
-
-        assertSame("start > end, object test",
-            ArrayUtils.EMPTY_BYTE_ARRAY,
-                ArrayUtils.subarray(array, 4, 1));
-
-        assertSame("start == end, object test",
-            ArrayUtils.EMPTY_BYTE_ARRAY,
-                ArrayUtils.subarray(array, 3, 3));
-
-        assertSame("start overshoot, any end, object test",
-            ArrayUtils.EMPTY_BYTE_ARRAY,
-                ArrayUtils.subarray(array, 8733, 4));
-
-        // array type tests
-
-        assertSame("byte type", byte.class,
-            ArrayUtils.subarray(array, 2, 4).getClass().getComponentType());
-
-    }
-
-    @Test
-    public void testSubarrayDouble() {
-        final double[] nullArray = null;
-        final double[] array = { 10.123, 11.234, 12.345, 13.456, 14.567, 15.678 };
-        final double[] leftSubarray   = { 10.123, 11.234, 12.345, 13.456, };
-        final double[] midSubarray    = { 11.234, 12.345, 13.456, 14.567, };
-        final double[] rightSubarray  = { 12.345, 13.456, 14.567, 15.678 };
-
-
-        assertTrue("0 start, mid end",
-            ArrayUtils.isEquals(leftSubarray,
-                ArrayUtils.subarray(array, 0, 4)));
-
-        assertTrue("0 start, length end",
-            ArrayUtils.isEquals(array,
-                ArrayUtils.subarray(array, 0, array.length)));
-
-        assertTrue("mid start, mid end",
-            ArrayUtils.isEquals(midSubarray,
-                ArrayUtils.subarray(array, 1, 5)));
-
-        assertTrue("mid start, length end",
-            ArrayUtils.isEquals(rightSubarray,
-                ArrayUtils.subarray(array, 2, array.length)));
-
-
-        assertNull("null input", ArrayUtils.subarray(nullArray, 0, 3));
-
-        assertEquals("empty array", ArrayUtils.EMPTY_DOUBLE_ARRAY,
-            ArrayUtils.subarray(ArrayUtils.EMPTY_DOUBLE_ARRAY, 1, 2));
-
-        assertEquals("start > end", ArrayUtils.EMPTY_DOUBLE_ARRAY,
-            ArrayUtils.subarray(array, 4, 2));
-
-        assertEquals("start == end", ArrayUtils.EMPTY_DOUBLE_ARRAY,
-            ArrayUtils.subarray(array, 3, 3));
-
-        assertTrue("start undershoot, normal end",
-            ArrayUtils.isEquals(leftSubarray,
-                ArrayUtils.subarray(array, -2, 4)));
-
-        assertEquals("start overshoot, any end",
-            ArrayUtils.EMPTY_DOUBLE_ARRAY,
-                ArrayUtils.subarray(array, 33, 4));
-
-        assertTrue("normal start, end overshoot",
-            ArrayUtils.isEquals(rightSubarray,
-                ArrayUtils.subarray(array, 2, 33)));
-
-        assertTrue("start undershoot, end overshoot",
-            ArrayUtils.isEquals(array,
-                ArrayUtils.subarray(array, -2, 12)));
-
-        // empty-return tests
-
-        assertSame("empty array, object test",
-            ArrayUtils.EMPTY_DOUBLE_ARRAY,
-                ArrayUtils.subarray(ArrayUtils.EMPTY_DOUBLE_ARRAY, 1, 2));
-
-        assertSame("start > end, object test",
-            ArrayUtils.EMPTY_DOUBLE_ARRAY,
-                ArrayUtils.subarray(array, 4, 1));
-
-        assertSame("start == end, object test",
-            ArrayUtils.EMPTY_DOUBLE_ARRAY,
-                ArrayUtils.subarray(array, 3, 3));
-
-        assertSame("start overshoot, any end, object test",
-            ArrayUtils.EMPTY_DOUBLE_ARRAY,
-                ArrayUtils.subarray(array, 8733, 4));
-
-        // array type tests
-
-        assertSame("double type", double.class,
-            ArrayUtils.subarray(array, 2, 4).getClass().getComponentType());
-
-    }
-
-    @Test
-    public void testSubarrayFloat() {
-        final float[] nullArray = null;
-        final float[] array = { 10, 11, 12, 13, 14, 15 };
-        final float[] leftSubarray    = { 10, 11, 12, 13 };
-        final float[] midSubarray     = { 11, 12, 13, 14 };
-        final float[] rightSubarray   = { 12, 13, 14, 15 };
-
-
-        assertTrue("0 start, mid end",
-            ArrayUtils.isEquals(leftSubarray,
-                ArrayUtils.subarray(array, 0, 4)));
-
-        assertTrue("0 start, length end",
-            ArrayUtils.isEquals(array,
-                ArrayUtils.subarray(array, 0, array.length)));
-
-        assertTrue("mid start, mid end",
-            ArrayUtils.isEquals(midSubarray,
-                ArrayUtils.subarray(array, 1, 5)));
-
-        assertTrue("mid start, length end",
-            ArrayUtils.isEquals(rightSubarray,
-                ArrayUtils.subarray(array, 2, array.length)));
-
-
-        assertNull("null input", ArrayUtils.subarray(nullArray, 0, 3));
-
-        assertEquals("empty array", ArrayUtils.EMPTY_FLOAT_ARRAY,
-            ArrayUtils.subarray(ArrayUtils.EMPTY_FLOAT_ARRAY, 1, 2));
-
-        assertEquals("start > end", ArrayUtils.EMPTY_FLOAT_ARRAY,
-            ArrayUtils.subarray(array, 4, 2));
-
-        assertEquals("start == end", ArrayUtils.EMPTY_FLOAT_ARRAY,
-            ArrayUtils.subarray(array, 3, 3));
-
-        assertTrue("start undershoot, normal end",
-            ArrayUtils.isEquals(leftSubarray,
-                ArrayUtils.subarray(array, -2, 4)));
-
-        assertEquals("start overshoot, any end",
-            ArrayUtils.EMPTY_FLOAT_ARRAY,
-                ArrayUtils.subarray(array, 33, 4));
-
-        assertTrue("normal start, end overshoot",
-            ArrayUtils.isEquals(rightSubarray,
-                ArrayUtils.subarray(array, 2, 33)));
-
-        assertTrue("start undershoot, end overshoot",
-            ArrayUtils.isEquals(array,
-                ArrayUtils.subarray(array, -2, 12)));
-
-        // empty-return tests
-
-        assertSame("empty array, object test",
-            ArrayUtils.EMPTY_FLOAT_ARRAY,
-                ArrayUtils.subarray(ArrayUtils.EMPTY_FLOAT_ARRAY, 1, 2));
-
-        assertSame("start > end, object test",
-            ArrayUtils.EMPTY_FLOAT_ARRAY,
-                ArrayUtils.subarray(array, 4, 1));
-
-        assertSame("start == end, object test",
-            ArrayUtils.EMPTY_FLOAT_ARRAY,
-                ArrayUtils.subarray(array, 3, 3));
-
-        assertSame("start overshoot, any end, object test",
-            ArrayUtils.EMPTY_FLOAT_ARRAY,
-                ArrayUtils.subarray(array, 8733, 4));
-
-        // array type tests
-
-        assertSame("float type", float.class,
-            ArrayUtils.subarray(array, 2, 4).getClass().getComponentType());
-
-    }
-
-    @Test
-    public void testSubarrayBoolean() {
-        final boolean[] nullArray = null;
-        final boolean[] array = { true, true, false, true, false, true };
-        final boolean[] leftSubarray  = { true, true, false, true  };
-        final boolean[] midSubarray   = { true, false, true, false };
-        final boolean[] rightSubarray = { false, true, false, true };
-
-
-        assertTrue("0 start, mid end",
-            ArrayUtils.isEquals(leftSubarray,
-                ArrayUtils.subarray(array, 0, 4)));
-
-        assertTrue("0 start, length end",
-            ArrayUtils.isEquals(array,
-                ArrayUtils.subarray(array, 0, array.length)));
-
-        assertTrue("mid start, mid end",
-            ArrayUtils.isEquals(midSubarray,
-                ArrayUtils.subarray(array, 1, 5)));
-
-        assertTrue("mid start, length end",
-            ArrayUtils.isEquals(rightSubarray,
-                ArrayUtils.subarray(array, 2, array.length)));
-
-
-        assertNull("null input", ArrayUtils.subarray(nullArray, 0, 3));
-
-        assertEquals("empty array", ArrayUtils.EMPTY_BOOLEAN_ARRAY,
-            ArrayUtils.subarray(ArrayUtils.EMPTY_BOOLEAN_ARRAY, 1, 2));
-
-        assertEquals("start > end", ArrayUtils.EMPTY_BOOLEAN_ARRAY,
-            ArrayUtils.subarray(array, 4, 2));
-
-        assertEquals("start == end", ArrayUtils.EMPTY_BOOLEAN_ARRAY,
-            ArrayUtils.subarray(array, 3, 3));
-
-        assertTrue("start undershoot, normal end",
-            ArrayUtils.isEquals(leftSubarray,
-                ArrayUtils.subarray(array, -2, 4)));
-
-        assertEquals("start overshoot, any end",
-            ArrayUtils.EMPTY_BOOLEAN_ARRAY,
-                ArrayUtils.subarray(array, 33, 4));
-
-        assertTrue("normal start, end overshoot",
-            ArrayUtils.isEquals(rightSubarray,
-                ArrayUtils.subarray(array, 2, 33)));
-
-        assertTrue("start undershoot, end overshoot",
-            ArrayUtils.isEquals(array,
-                ArrayUtils.subarray(array, -2, 12)));
-
-        // empty-return tests
-
-        assertSame("empty array, object test",
-            ArrayUtils.EMPTY_BOOLEAN_ARRAY,
-                ArrayUtils.subarray(ArrayUtils.EMPTY_BOOLEAN_ARRAY, 1, 2));
-
-        assertSame("start > end, object test",
-            ArrayUtils.EMPTY_BOOLEAN_ARRAY,
-                ArrayUtils.subarray(array, 4, 1));
-
-        assertSame("start == end, object test",
-            ArrayUtils.EMPTY_BOOLEAN_ARRAY,
-                ArrayUtils.subarray(array, 3, 3));
-
-        assertSame("start overshoot, any end, object test",
-            ArrayUtils.EMPTY_BOOLEAN_ARRAY,
-                ArrayUtils.subarray(array, 8733, 4));
-
-        // array type tests
-
-        assertSame("boolean type", boolean.class,
-            ArrayUtils.subarray(array, 2, 4).getClass().getComponentType());
-
-    }
-    
-    //-----------------------------------------------------------------------
-    @Test
-    public void testSameLength() {
-        final Object[] nullArray = null;
-        final Object[] emptyArray = new Object[0];
-        final Object[] oneArray = new Object[] {"pick"};
-        final Object[] twoArray = new Object[] {"pick", "stick"};
-        
-        assertTrue(ArrayUtils.isSameLength(nullArray, nullArray));
-        assertTrue(ArrayUtils.isSameLength(nullArray, emptyArray));
-        assertFalse(ArrayUtils.isSameLength(nullArray, oneArray));
-        assertFalse(ArrayUtils.isSameLength(nullArray, twoArray));
-        
-        assertTrue(ArrayUtils.isSameLength(emptyArray, nullArray));
-        assertTrue(ArrayUtils.isSameLength(emptyArray, emptyArray));
-        assertFalse(ArrayUtils.isSameLength(emptyArray, oneArray));
-        assertFalse(ArrayUtils.isSameLength(emptyArray, twoArray));
-        
-        assertFalse(ArrayUtils.isSameLength(oneArray, nullArray));
-        assertFalse(ArrayUtils.isSameLength(oneArray, emptyArray));
-        assertTrue(ArrayUtils.isSameLength(oneArray, oneArray));
-        assertFalse(ArrayUtils.isSameLength(oneArray, twoArray));
-        
-        assertFalse(ArrayUtils.isSameLength(twoArray, nullArray));
-        assertFalse(ArrayUtils.isSameLength(twoArray, emptyArray));
-        assertFalse(ArrayUtils.isSameLength(twoArray, oneArray));
-        assertTrue(ArrayUtils.isSameLength(twoArray, twoArray));
-    }
-
-    @Test
-    public void testSameLengthBoolean() {
-        final boolean[] nullArray = null;
-        final boolean[] emptyArray = new boolean[0];
-        final boolean[] oneArray = new boolean[] {true};
-        final boolean[] twoArray = new boolean[] {true, false};
-        
-        assertTrue(ArrayUtils.isSameLength(nullArray, nullArray));
-        assertTrue(ArrayUtils.isSameLength(nullArray, emptyArray));
-        assertFalse(ArrayUtils.isSameLength(nullArray, oneArray));
-        assertFalse(ArrayUtils.isSameLength(nullArray, twoArray));
-        
-        assertTrue(ArrayUtils.isSameLength(emptyArray, nullArray));
-        assertTrue(ArrayUtils.isSameLength(emptyArray, emptyArray));
-        assertFalse(ArrayUtils.isSameLength(emptyArray, oneArray));
-        assertFalse(ArrayUtils.isSameLength(emptyArray, twoArray));
-        
-        assertFalse(ArrayUtils.isSameLength(oneArray, nullArray));
-        assertFalse(ArrayUtils.isSameLength(oneArray, emptyArray));
-        assertTrue(ArrayUtils.isSameLength(oneArray, oneArray));
-        assertFalse(ArrayUtils.isSameLength(oneArray, twoArray));
-        
-        assertFalse(ArrayUtils.isSameLength(twoArray, nullArray));
-        assertFalse(ArrayUtils.isSameLength(twoArray, emptyArray));
-        assertFalse(ArrayUtils.isSameLength(twoArray, oneArray));
-        assertTrue(ArrayUtils.isSameLength(twoArray, twoArray));
-    }
-    
-    @Test
-    public void testSameLengthLong() {
-        final long[] nullArray = null;
-        final long[] emptyArray = new long[0];
-        final long[] oneArray = new long[] {0L};
-        final long[] twoArray = new long[] {0L, 76L};
-        
-        assertTrue(ArrayUtils.isSameLength(nullArray, nullArray));
-        assertTrue(ArrayUtils.isSameLength(nullArray, emptyArray));
-        assertFalse(ArrayUtils.isSameLength(nullArray, oneArray));
-        assertFalse(ArrayUtils.isSameLength(nullArray, twoArray));
-        
-        assertTrue(ArrayUtils.isSameLength(emptyArray, nullArray));
-        assertTrue(ArrayUtils.isSameLength(emptyArray, emptyArray));
-        assertFalse(ArrayUtils.isSameLength(emptyArray, oneArray));
-        assertFalse(ArrayUtils.isSameLength(emptyArray, twoArray));
-        
-        assertFalse(ArrayUtils.isSameLength(oneArray, nullArray));
-        assertFalse(ArrayUtils.isSameLength(oneArray, emptyArray));
-        assertTrue(ArrayUtils.isSameLength(oneArray, oneArray));
-        assertFalse(ArrayUtils.isSameLength(oneArray, twoArray));
-        
-        assertFalse(ArrayUtils.isSameLength(twoArray, nullArray));
-        assertFalse(ArrayUtils.isSameLength(twoArray, emptyArray));
-        assertFalse(ArrayUtils.isSameLength(twoArray, oneArray));
-        assertTrue(ArrayUtils.isSameLength(twoArray, twoArray));
-    }
-    
-    @Test
-    public void testSameLengthInt() {
-        final int[] nullArray = null;
-        final int[] emptyArray = new int[0];
-        final int[] oneArray = new int[] {4};
-        final int[] twoArray = new int[] {5, 7};
-        
-        assertTrue(ArrayUtils.isSameLength(nullArray, nullArray));
-        assertTrue(ArrayUtils.isSameLength(nullArray, emptyArray));
-        assertFalse(ArrayUtils.isSameLength(nullArray, oneArray));
-        assertFalse(ArrayUtils.isSameLength(nullArray, twoArray));
-        
-        assertTrue(ArrayUtils.isSameLength(emptyArray, nullArray));
-        assertTrue(ArrayUtils.isSameLength(emptyArray, emptyArray));
-        assertFalse(ArrayUtils.isSameLength(emptyArray, oneArray));
-        assertFalse(ArrayUtils.isSameLength(emptyArray, twoArray));
-        
-        assertFalse(ArrayUtils.isSameLength(oneArray, nullArray));
-        assertFalse(ArrayUtils.isSameLength(oneArray, emptyArray));
-        assertTrue(ArrayUtils.isSameLength(oneArray, oneArray));
-        assertFalse(ArrayUtils.isSameLength(oneArray, twoArray));
-        
-        assertFalse(ArrayUtils.isSameLength(twoArray, nullArray));
-        assertFalse(ArrayUtils.isSameLength(twoArray, emptyArray));
-        assertFalse(ArrayUtils.isSameLength(twoArray, oneArray));
-        assertTrue(ArrayUtils.isSameLength(twoArray, twoArray));
-    }
-    
-    @Test
-    public void testSameLengthShort() {
-        final short[] nullArray = null;
-        final short[] emptyArray = new short[0];
-        final short[] oneArray = new short[] {4};
-        final short[] twoArray = new short[] {6, 8};
-        
-        assertTrue(ArrayUtils.isSameLength(nullArray, nullArray));
-        assertTrue(ArrayUtils.isSameLength(nullArray, emptyArray));
-        assertFalse(ArrayUtils.isSameLength(nullArray, oneArray));
-        assertFalse(ArrayUtils.isSameLength(nullArray, twoArray));
-        
-        assertTrue(ArrayUtils.isSameLength(emptyArray, nullArray));
-        assertTrue(ArrayUtils.isSameLength(emptyArray, emptyArray));
-        assertFalse(ArrayUtils.isSameLength(emptyArray, oneArray));
-        assertFalse(ArrayUtils.isSameLength(emptyArray, twoArray));
-        
-        assertFalse(ArrayUtils.isSameLength(oneArray, nullArray));
-        assertFalse(ArrayUtils.isSameLength(oneArray, emptyArray));
-        assertTrue(ArrayUtils.isSameLength(oneArray, oneArray));
-        assertFalse(ArrayUtils.isSameLength(oneArray, twoArray));
-        
-        assertFalse(ArrayUtils.isSameLength(twoArray, nullArray));
-        assertFalse(ArrayUtils.isSameLength(twoArray, emptyArray));
-        assertFalse(ArrayUtils.isSameLength(twoArray, oneArray));
-        assertTrue(ArrayUtils.isSameLength(twoArray, twoArray));
-    }
-    
-    @Test
-    public void testSameLengthChar() {
-        final char[] nullArray = null;
-        final char[] emptyArray = new char[0];
-        final char[] oneArray = new char[] {'f'};
-        final char[] twoArray = new char[] {'d', 't'};
-        
-        assertTrue(ArrayUtils.isSameLength(nullArray, nullArray));
-        assertTrue(ArrayUtils.isSameLength(nullArray, emptyArray));
-        assertFalse(ArrayUtils.isSameLength(nullArray, oneArray));
-        assertFalse(ArrayUtils.isSameLength(nullArray, twoArray));
-        
-        assertTrue(ArrayUtils.isSameLength(emptyArray, nullArray));
-        assertTrue(ArrayUtils.isSameLength(emptyArray, emptyArray));
-        assertFalse(ArrayUtils.isSameLength(emptyArray, oneArray));
-        assertFalse(ArrayUtils.isSameLength(emptyArray, twoArray));
-        
-        assertFalse(ArrayUtils.isSameLength(oneArray, nullArray));
-        assertFalse(ArrayUtils.isSameLength(oneArray, emptyArray));
-        assertTrue(ArrayUtils.isSameLength(oneArray, oneArray));
-        assertFalse(ArrayUtils.isSameLength(oneArray, twoArray));
-        
-        assertFalse(ArrayUtils.isSameLength(twoArray, nullArray));
-        assertFalse(ArrayUtils.isSameLength(twoArray, emptyArray));
-        assertFalse(ArrayUtils.isSameLength(twoArray, oneArray));
-        assertTrue(ArrayUtils.isSameLength(twoArray, twoArray));
-    }
-    
-    @Test
-    public void testSameLengthByte() {
-        final byte[] nullArray = null;
-        final byte[] emptyArray = new byte[0];
-        final byte[] oneArray = new byte[] {3};
-        final byte[] twoArray = new byte[] {4, 6};
-        
-        assertTrue(ArrayUtils.isSameLength(nullArray, nullArray));
-        assertTrue(ArrayUtils.isSameLength(nullArray, emptyArray));
-        assertFalse(ArrayUtils.isSameLength(nullArray, oneArray));
-        assertFalse(ArrayUtils.isSameLength(nullArray, twoArray));
-        
-        assertTrue(ArrayUtils.isSameLength(emptyArray, nullArray));
-        assertTrue(ArrayUtils.isSameLength(emptyArray, emptyArray));
-        assertFalse(ArrayUtils.isSameLength(emptyArray, oneArray));
-        assertFalse(ArrayUtils.isSameLength(emptyArray, twoArray));
-        
-        assertFalse(ArrayUtils.isSameLength(oneArray, nullArray));
-        assertFalse(ArrayUtils.isSameLength(oneArray, emptyArray));
-        assertTrue(ArrayUtils.isSameLength(oneArray, oneArray));
-        assertFalse(ArrayUtils.isSameLength(oneArray, twoArray));
-        
-        assertFalse(ArrayUtils.isSameLength(twoArray, nullArray));
-        assertFalse(ArrayUtils.isSameLength(twoArray, emptyArray));
-        assertFalse(ArrayUtils.isSameLength(twoArray, oneArray));
-        assertTrue(ArrayUtils.isSameLength(twoArray, twoArray));
-    }
-    
-    @Test
-    public void testSameLengthDouble() {
-        final double[] nullArray = null;
-        final double[] emptyArray = new double[0];
-        final double[] oneArray = new double[] {1.3d};
-        final double[] twoArray = new double[] {4.5d, 6.3d};
-        
-        assertTrue(ArrayUtils.isSameLength(nullArray, nullArray));
-        assertTrue(ArrayUtils.isSameLength(nullArray, emptyArray));
-        assertFalse(ArrayUtils.isSameLength(nullArray, oneArray));
-        assertFalse(ArrayUtils.isSameLength(nullArray, twoArray));
-        
-        assertTrue(ArrayUtils.isSameLength(emptyArray, nullArray));
-        assertTrue(ArrayUtils.isSameLength(emptyArray, emptyArray));
-        assertFalse(ArrayUtils.isSameLength(emptyArray, oneArray));
-        assertFalse(ArrayUtils.isSameLength(emptyArray, twoArray));
-        
-        assertFalse(ArrayUtils.isSameLength(oneArray, nullArray));
-        assertFalse(ArrayUtils.isSameLength(oneArray, emptyArray));
-        assertTrue(ArrayUtils.isSameLength(oneArray, oneArray));
-        assertFalse(ArrayUtils.isSameLength(oneArray, twoArray));
-        
-        assertFalse(ArrayUtils.isSameLength(twoArray, nullArray));
-        assertFalse(ArrayUtils.isSameLength(twoArray, emptyArray));
-        assertFalse(ArrayUtils.isSameLength(twoArray, oneArray));
-        assertTrue(ArrayUtils.isSameLength(twoArray, twoArray));
-    }
-    
-    @Test
-    public void testSameLengthFloat() {
-        final float[] nullArray = null;
-        final float[] emptyArray = new float[0];
-        final float[] oneArray = new float[] {2.5f};
-        final float[] twoArray = new float[] {6.4f, 5.8f};
-        
-        assertTrue(ArrayUtils.isSameLength(nullArray, nullArray));
-        assertTrue(ArrayUtils.isSameLength(nullArray, emptyArray));
-        assertFalse(ArrayUtils.isSameLength(nullArray, oneArray));
-        assertFalse(ArrayUtils.isSameLength(nullArray, twoArray));
-        
-        assertTrue(ArrayUtils.isSameLength(emptyArray, nullArray));
-        assertTrue(ArrayUtils.isSameLength(emptyArray, emptyArray));
-        assertFalse(ArrayUtils.isSameLength(emptyArray, oneArray));
-        assertFalse(ArrayUtils.isSameLength(emptyArray, twoArray));
-        
-        assertFalse(ArrayUtils.isSameLength(oneArray, nullArray));
-        assertFalse(ArrayUtils.isSameLength(oneArray, emptyArray));
-        assertTrue(ArrayUtils.isSameLength(oneArray, oneArray));
-        assertFalse(ArrayUtils.isSameLength(oneArray, twoArray));
-        
-        assertFalse(ArrayUtils.isSameLength(twoArray, nullArray));
-        assertFalse(ArrayUtils.isSameLength(twoArray, emptyArray));
-        assertFalse(ArrayUtils.isSameLength(twoArray, oneArray));
-        assertTrue(ArrayUtils.isSameLength(twoArray, twoArray));
-    }
-    
-    //-----------------------------------------------------------------------
-    @Test
-    public void testSameType() {
-        try {
-            ArrayUtils.isSameType(null, null);
-            fail();
-        } catch (final IllegalArgumentException ex) {}
-        try {
-            ArrayUtils.isSameType(null, new Object[0]);
-            fail();
-        } catch (final IllegalArgumentException ex) {}
-        try {
-            ArrayUtils.isSameType(new Object[0], null);
-            fail();
-        } catch (final IllegalArgumentException ex) {}
-        
-        assertTrue(ArrayUtils.isSameType(new Object[0], new Object[0]));
-        assertFalse(ArrayUtils.isSameType(new String[0], new Object[0]));
-        assertTrue(ArrayUtils.isSameType(new String[0][0], new String[0][0]));
-        assertFalse(ArrayUtils.isSameType(new String[0], new String[0][0]));
-        assertFalse(ArrayUtils.isSameType(new String[0][0], new String[0]));
-    }
-    
-    //-----------------------------------------------------------------------
-    @Test
-    public void testReverse() {
-        final StringBuffer str1 = new StringBuffer("pick");
-        final String str2 = "a";
-        final String[] str3 = new String[] {"stick"};
-        final String str4 = "up";
-        
-        Object[] array = new Object[] {str1, str2, str3};
-        ArrayUtils.reverse(array);
-        assertEquals(array[0], str3);
-        assertEquals(array[1], str2);
-        assertEquals(array[2], str1);
-        
-        array = new Object[] {str1, str2, str3, str4};
-        ArrayUtils.reverse(array);
-        assertEquals(array[0], str4);
-        assertEquals(array[1], str3);
-        assertEquals(array[2], str2);
-        assertEquals(array[3], str1);
-
-        array = null;
-        ArrayUtils.reverse(array);
-        assertArrayEquals(null, array);
-    }
-
-    @Test
-    public void testReverseLong() {
-        long[] array = new long[] {1L, 2L, 3L};
-        ArrayUtils.reverse(array);
-        assertEquals(array[0], 3L);
-        assertEquals(array[1], 2L);
-        assertEquals(array[2], 1L);
-
-        array = null;
-        ArrayUtils.reverse(array);
-        assertEquals(null, array);
-    }
-    
-    @Test
-    public void testReverseInt() {
-        int[] array = new int[] {1, 2, 3};
-        ArrayUtils.reverse(array);
-        assertEquals(array[0], 3);
-        assertEquals(array[1], 2);
-        assertEquals(array[2], 1);
-
-        array = null;
-        ArrayUtils.reverse(array);
-        assertEquals(null, array);
-    }
-    
-    @Test
-    public void testReverseShort() {
-        short[] array = new short[] {1, 2, 3};
-        ArrayUtils.reverse(array);
-        assertEquals(array[0], 3);
-        assertEquals(array[1], 2);
-        assertEquals(array[2], 1);
-
-        array = null;
-        ArrayUtils.reverse(array);
-        assertEquals(null, array);
-    }
-    
-    @Test
-    public void testReverseChar() {
-        char[] array = new char[] {'a', 'f', 'C'};
-        ArrayUtils.reverse(array);
-        assertEquals(array[0], 'C');
-        assertEquals(array[1], 'f');
-        assertEquals(array[2], 'a');
-
-        array = null;
-        ArrayUtils.reverse(array);
-        assertEquals(null, array);
-    }
-    
-    @Test
-    public void testReverseByte() {
-        byte[] array = new byte[] {2, 3, 4};
-        ArrayUtils.reverse(array);
-        assertEquals(array[0], 4);
-        assertEquals(array[1], 3);
-        assertEquals(array[2], 2);
-
-        array = null;
-        ArrayUtils.reverse(array);
-        assertEquals(null, array);
-    }
-    
-    @Test
-    public void testReverseDouble() {
-        double[] array = new double[] {0.3d, 0.4d, 0.5d};
-        ArrayUtils.reverse(array);
-        assertEquals(array[0], 0.5d, 0.0d);
-        assertEquals(array[1], 0.4d, 0.0d);
-        assertEquals(array[2], 0.3d, 0.0d);
-
-        array = null;
-        ArrayUtils.reverse(array);
-        assertEquals(null, array);
-    }
-    
-    @Test
-    public void testReverseFloat() {
-        float[] array = new float[] {0.3f, 0.4f, 0.5f};
-        ArrayUtils.reverse(array);
-        assertEquals(array[0], 0.5f, 0.0f);
-        assertEquals(array[1], 0.4f, 0.0f);
-        assertEquals(array[2], 0.3f, 0.0f);
-
-        array = null;
-        ArrayUtils.reverse(array);
-        assertEquals(null, array);
-    }
-    
-    @Test
-    public void testReverseBoolean() {
-        boolean[] array = new boolean[] {false, false, true};
-        ArrayUtils.reverse(array);
-        assertTrue(array[0]);
-        assertFalse(array[1]);
-        assertFalse(array[2]);
-
-        array = null;
-        ArrayUtils.reverse(array);
-        assertEquals(null, array);
-    }
-    
-    @Test
-    public void testReverseBooleanRange() {
-        boolean[] array = new boolean[] {false, false, true};
-        // The whole array
-        ArrayUtils.reverse(array, 0, 3);
-        assertTrue(array[0]);
-        assertFalse(array[1]);
-        assertFalse(array[2]);
-        // a range
-        array = new boolean[] {false, false, true};
-        ArrayUtils.reverse(array, 0, 2);
-        assertFalse(array[0]);
-        assertFalse(array[1]);
-        assertTrue(array[2]);
-        // a range with a negative start
-        array = new boolean[] {false, false, true};
-        ArrayUtils.reverse(array, -1, 3);
-        assertTrue(array[0]);
-        assertFalse(array[1]);
-        assertFalse(array[2]);
-        // a range with a large stop idnex
-        array = new boolean[] {false, false, true};
-        ArrayUtils.reverse(array, -1, array.length + 1000);
-        assertTrue(array[0]);
-        assertFalse(array[1]);
-        assertFalse(array[2]);
-        // null
-        array = null;
-        ArrayUtils.reverse(array, 0, 3);
-        assertEquals(null, array);
-    }
-    
-    @Test
-    public void testReverseByteRange() {
-        byte[] array = new byte[] {1, 2, 3};
-        // The whole array
-        ArrayUtils.reverse(array, 0, 3);
-        assertEquals(3, array[0]);
-        assertEquals(2, array[1]);
-        assertEquals(1, array[2]);
-        // a range
-        array = new byte[] {1, 2, 3};
-        ArrayUtils.reverse(array, 0, 2);
-        assertEquals(2, array[0]);
-        assertEquals(1, array[1]);
-        assertEquals(3, array[2]);
-        // a range with a negative start
-        array = new byte[] {1, 2, 3};
-        ArrayUtils.reverse(array, -1, 3);
-        assertEquals(3, array[0]);
-        assertEquals(2, array[1]);
-        assertEquals(1, array[2]);
-        // a range with a large stop idnex
-        array = new byte[] {1, 2, 3};
-        ArrayUtils.reverse(array, -1, array.length + 1000);
-        assertEquals(3, array[0]);
-        assertEquals(2, array[1]);
-        assertEquals(1, array[2]);
-        // null
-        array = null;
-        ArrayUtils.reverse(array, 0, 3);
-        assertEquals(null, array);
-    }
-    
-    @Test
-    public void testReverseCharRange() {
-        char[] array = new char[] {1, 2, 3};
-        // The whole array
-        ArrayUtils.reverse(array, 0, 3);
-        assertEquals(3, array[0]);
-        assertEquals(2, array[1]);
-        assertEquals(1, array[2]);
-        // a range
-        array = new char[] {1, 2, 3};
-        ArrayUtils.reverse(array, 0, 2);
-        assertEquals(2, array[0]);
-        assertEquals(1, array[1]);
-        assertEquals(3, array[2]);
-        // a range with a negative start
-        array = new char[] {1, 2, 3};
-        ArrayUtils.reverse(array, -1, 3);
-        assertEquals(3, array[0]);
-        assertEquals(2, array[1]);
-        assertEquals(1, array[2]);
-        // a range with a large stop idnex
-        array = new char[] {1, 2, 3};
-        ArrayUtils.reverse(array, -1, array.length + 1000);
-        assertEquals(3, array[0]);
-        assertEquals(2, array[1]);
-        assertEquals(1, array[2]);
-        // null
-        array = null;
-        ArrayUtils.reverse(array, 0, 3);
-        assertEquals(null, array);
-    }
-    
-    @Test
-    public void testReverseDoubleRange() {
-        double[] array = new double[] {1, 2, 3};
-        // The whole array
-        ArrayUtils.reverse(array, 0, 3);
-        assertEquals(3, array[0], 0);
-        assertEquals(2, array[1], 0);
-        assertEquals(1, array[2], 0);
-        // a range
-        array = new double[] {1, 2, 3};
-        ArrayUtils.reverse(array, 0, 2);
-        assertEquals(2, array[0], 0);
-        assertEquals(1, array[1], 0);
-        assertEquals(3, array[2], 0);
-        // a range with a negative start
-        array = new double[] {1, 2, 3};
-        ArrayUtils.reverse(array, -1, 3);
-        assertEquals(3, array[0], 0);
-        assertEquals(2, array[1], 0);
-        assertEquals(1, array[2], 0);
-        // a range with a large stop idnex
-        array = new double[] {1, 2, 3};
-        ArrayUtils.reverse(array, -1, array.length + 1000);
-        assertEquals(3, array[0], 0);
-        assertEquals(2, array[1], 0);
-        assertEquals(1, array[2], 0);
-        // null
-        array = null;
-        ArrayUtils.reverse(array, 0, 3);
-        assertEquals(null, array);
-    }
-    
-    @Test
-    public void testReverseFloatRange() {
-        float[] array = new float[] {1, 2, 3};
-        // The whole array
-        ArrayUtils.reverse(array, 0, 3);
-        assertEquals(3, array[0], 0);
-        assertEquals(2, array[1], 0);
-        assertEquals(1, array[2], 0);
-        // a range
-        array = new float[] {1, 2, 3};
-        ArrayUtils.reverse(array, 0, 2);
-        assertEquals(2, array[0], 0);
-        assertEquals(1, array[1], 0);
-        assertEquals(3, array[2], 0);
-        // a range with a negative start
-        array = new float[] {1, 2, 3};
-        ArrayUtils.reverse(array, -1, 3);
-        assertEquals(3, array[0], 0);
-        assertEquals(2, array[1], 0);
-        assertEquals(1, array[2], 0);
-        // a range with a large stop idnex
-        array = new float[] {1, 2, 3};
-        ArrayUtils.reverse(array, -1, array.length + 1000);
-        assertEquals(3, array[0], 0);
-        assertEquals(2, array[1], 0);
-        assertEquals(1, array[2], 0);
-        // null
-        array = null;
-        ArrayUtils.reverse(array, 0, 3);
-        assertEquals(null, array);
-    }
-    
-    @Test
-    public void testReverseIntRange() {
-        int[] array = new int[] {1, 2, 3};
-        // The whole array
-        ArrayUtils.reverse(array, 0, 3);
-        assertEquals(3, array[0]);
-        assertEquals(2, array[1]);
-        assertEquals(1, array[2]);
-        // a range
-        array = new int[] {1, 2, 3};
-        ArrayUtils.reverse(array, 0, 2);
-        assertEquals(2, array[0]);
-        assertEquals(1, array[1]);
-        assertEquals(3, array[2]);
-        // a range with a negative start
-        array = new int[] {1, 2, 3};
-        ArrayUtils.reverse(array, -1, 3);
-        assertEquals(3, array[0]);
-        assertEquals(2, array[1]);
-        assertEquals(1, array[2]);
-        // a range with a large stop idnex
-        array = new int[] {1, 2, 3};
-        ArrayUtils.reverse(array, -1, array.length + 1000);
-        assertEquals(3, array[0]);
-        assertEquals(2, array[1]);
-        assertEquals(1, array[2]);
-        // null
-        array = null;
-        ArrayUtils.reverse(array, 0, 3);
-        assertEquals(null, array);
-    }
-    
-    @Test
-    public void testReverseLongRange() {
-        long[] array = new long[] {1, 2, 3};
-        // The whole array
-        ArrayUtils.reverse(array, 0, 3);
-        assertEquals(3, array[0]);
-        assertEquals(2, array[1]);
-        assertEquals(1, array[2]);
-        // a range
-        array = new long[] {1, 2, 3};
-        ArrayUtils.reverse(array, 0, 2);
-        assertEquals(2, array[0]);
-        assertEquals(1, array[1]);
-        assertEquals(3, array[2]);
-        // a range with a negative start
-        array = new long[] {1, 2, 3};
-        ArrayUtils.reverse(array, -1, 3);
-        assertEquals(3, array[0]);
-        assertEquals(2, array[1]);
-        assertEquals(1, array[2]);
-        // a range with a large stop idnex
-        array = new long[] {1, 2, 3};
-        ArrayUtils.reverse(array, -1, array.length + 1000);
-        assertEquals(3, array[0]);
-        assertEquals(2, array[1]);
-        assertEquals(1, array[2]);
-        // null
-        array = null;
-        ArrayUtils.reverse(array, 0, 3);
-        assertEquals(null, array);
-    }
-    
-    @Test
-    public void testReverseShortRange() {
-        short[] array = new short[] {1, 2, 3};
-        // The whole array
-        ArrayUtils.reverse(array, 0, 3);
-        assertEquals(3, array[0]);
-        assertEquals(2, array[1]);
-        assertEquals(1, array[2]);
-        // a range
-        array = new short[] {1, 2, 3};
-        ArrayUtils.reverse(array, 0, 2);
-        assertEquals(2, array[0]);
-        assertEquals(1, array[1]);
-        assertEquals(3, array[2]);
-        // a range with a negative start
-        array = new short[] {1, 2, 3};
-        ArrayUtils.reverse(array, -1, 3);
-        assertEquals(3, array[0]);
-        assertEquals(2, array[1]);
-        assertEquals(1, array[2]);
-        // a range with a large stop idnex
-        array = new short[] {1, 2, 3};
-        ArrayUtils.reverse(array, -1, array.length + 1000);
-        assertEquals(3, array[0]);
-        assertEquals(2, array[1]);
-        assertEquals(1, array[2]);
-        // null
-        array = null;
-        ArrayUtils.reverse(array, 0, 3);
-        assertEquals(null, array);
-    }
-    
-    @Test
-    public void testReverseObjectRange() {
-        String[] array = new String[] {"1", "2", "3"};
-        // The whole array
-        ArrayUtils.reverse(array, 0, 3);
-        assertEquals("3", array[0]);
-        assertEquals("2", array[1]);
-        assertEquals("1", array[2]);
-        // a range
-        array = new String[] {"1", "2", "3"};
-        ArrayUtils.reverse(array, 0, 2);
-        assertEquals("2", array[0]);
-        assertEquals("1", array[1]);
-        assertEquals("3", array[2]);
-        // a range with a negative start
-        array = new String[] {"1", "2", "3"};
-        ArrayUtils.reverse(array, -1, 3);
-        assertEquals("3", array[0]);
-        assertEquals("2", array[1]);
-        assertEquals("1", array[2]);
-        // a range with a large stop idnex
-        array = new String[] {"1", "2", "3"};
-        ArrayUtils.reverse(array, -1, array.length + 1000);
-        assertEquals("3", array[0]);
-        assertEquals("2", array[1]);
-        assertEquals("1", array[2]);
-        // null
-        array = null;
-        ArrayUtils.reverse(array, 0, 3);
-        assertEquals(null, array);
-    }
-    
-
-    //-----------------------------------------------------------------------
-    @Test
-    public void testIndexOf() {
-        final Object[] array = new Object[] { "0", "1", "2", "3", null, "0" };
-        assertEquals(-1, ArrayUtils.indexOf(null, null));
-        assertEquals(-1, ArrayUtils.indexOf(null, "0"));
-        assertEquals(-1, ArrayUtils.indexOf(new Object[0], "0"));
-        assertEquals(0, ArrayUtils.indexOf(array, "0"));
-        assertEquals(1, ArrayUtils.indexOf(array, "1"));
-        assertEquals(2, ArrayUtils.indexOf(array, "2"));
-        assertEquals(3, ArrayUtils.indexOf(array, "3"));
-        assertEquals(4, ArrayUtils.indexOf(array, null));
-        assertEquals(-1, ArrayUtils.indexOf(array, "notInArray"));
-    }
-
-    @Test
-    public void testIndexOfWithStartIndex() {
-        final Object[] array = new Object[] { "0", "1", "2", "3", null, "0" };
-        assertEquals(-1, ArrayUtils.indexOf(null, null, 2));
-        assertEquals(-1, ArrayUtils.indexOf(new Object[0], "0", 0));
-        assertEquals(-1, ArrayUtils.indexOf(null, "0", 2));
-        assertEquals(5, ArrayUtils.indexOf(array, "0", 2));
-        assertEquals(-1, ArrayUtils.indexOf(array, "1", 2));
-        assertEquals(2, ArrayUtils.indexOf(array, "2", 2));
-        assertEquals(3, ArrayUtils.indexOf(array, "3", 2));
-        assertEquals(4, ArrayUtils.indexOf(array, null, 2));
-        assertEquals(-1, ArrayUtils.indexOf(array, "notInArray", 2));
-        
-        assertEquals(4, ArrayUtils.indexOf(array, null, -1));
-        assertEquals(-1, ArrayUtils.indexOf(array, null, 8));
-        assertEquals(-1, ArrayUtils.indexOf(array, "0", 8));
-    }
-
-    @Test
-    public void testLastIndexOf() {
-        final Object[] array = new Object[] { "0", "1", "2", "3", null, "0" };
-        assertEquals(-1, ArrayUtils.lastIndexOf(null, null));
-        assertEquals(-1, ArrayUtils.lastIndexOf(null, "0"));
-        assertEquals(5, ArrayUtils.lastIndexOf(array, "0"));
-        assertEquals(1, ArrayUtils.lastIndexOf(array, "1"));
-        assertEquals(2, ArrayUtils.lastIndexOf(array, "2"));
-        assertEquals(3, ArrayUtils.lastIndexOf(array, "3"));
-        assertEquals(4, ArrayUtils.lastIndexOf(array, null));
-        assertEquals(-1, ArrayUtils.lastIndexOf(array, "notInArray"));
-    }
-
-    @Test
-    public void testLastIndexOfWithStartIndex() {
-        final Object[] array = new Object[] { "0", "1", "2", "3", null, "0" };
-        assertEquals(-1, ArrayUtils.lastIndexOf(null, null, 2));
-        assertEquals(-1, ArrayUtils.lastIndexOf(null, "0", 2));
-        assertEquals(0, ArrayUtils.lastIndexOf(array, "0", 2));
-        assertEquals(1, ArrayUtils.lastIndexOf(array, "1", 2));
-        assertEquals(2, ArrayUtils.lastIndexOf(array, "2", 2));
-        assertEquals(-1, ArrayUtils.lastIndexOf(array, "3", 2));
-        assertEquals(-1, ArrayUtils.lastIndexOf(array, "3", -1));
-        assertEquals(4, ArrayUtils.lastIndexOf(array, null, 5));
-        assertEquals(-1, ArrayUtils.lastIndexOf(array, null, 2));
-        assertEquals(-1, ArrayUtils.lastIndexOf(array, "notInArray", 5));
-        
-        assertEquals(-1, ArrayUtils.lastIndexOf(array, null, -1));
-        assertEquals(5, ArrayUtils.lastIndexOf(array, "0", 88));
-    }
-
-    @Test
-    public void testContains() {
-        final Object[] array = new Object[] { "0", "1", "2", "3", null, "0" };
-        assertFalse(ArrayUtils.contains(null, null));
-        assertFalse(ArrayUtils.contains(null, "1"));
-        assertTrue(ArrayUtils.contains(array, "0"));
-        assertTrue(ArrayUtils.contains(array, "1"));
-        assertTrue(ArrayUtils.contains(array, "2"));
-        assertTrue(ArrayUtils.contains(array, "3"));
-        assertTrue(ArrayUtils.contains(array, null));
-        assertFalse(ArrayUtils.contains(array, "notInArray"));
-    }
-    
-    //-----------------------------------------------------------------------
-    @Test
-    public void testIndexOfLong() {
-        long[] array = null;
-        assertEquals(-1, ArrayUtils.indexOf(array, 0));
-        array = new long[] { 0, 1, 2, 3, 0 };
-        assertEquals(0, ArrayUtils.indexOf(array, 0));
-        assertEquals(1, ArrayUtils.indexOf(array, 1));
-        assertEquals(2, ArrayUtils.indexOf(array, 2));
-        assertEquals(3, ArrayUtils.indexOf(array, 3));
-        assertEquals(-1, ArrayUtils.indexOf(array, 99));
-    }
-
-    @Test
-    public void testIndexOfLongWithStartIndex() {
-        long[] array = null;
-        assertEquals(-1, ArrayUtils.indexOf(array, 0, 2));
-        array = new long[] { 0, 1, 2, 3, 0 };
-        assertEquals(4, ArrayUtils.indexOf(array, 0, 2));
-        assertEquals(-1, ArrayUtils.indexOf(array, 1, 2));
-        assertEquals(2, ArrayUtils.indexOf(array, 2, 2));
-        assertEquals(3, ArrayUtils.indexOf(array, 3, 2));
-        assertEquals(3, ArrayUtils.indexOf(array, 3, -1));
-        assertEquals(-1, ArrayUtils.indexOf(array, 99, 0));
-        assertEquals(-1, ArrayUtils.indexOf(array, 0, 6));
-    }
-
-    @Test
-    public void testLastIndexOfLong() {
-        long[] array = null;
-        assertEquals(-1, ArrayUtils.lastIndexOf(array, 0));
-        array = new long[] { 0, 1, 2, 3, 0 };
-        assertEquals(4, ArrayUtils.lastIndexOf(array, 0));
-        assertEquals(1, ArrayUtils.lastIndexOf(array, 1));
-        assertEquals(2, ArrayUtils.lastIndexOf(array, 2));
-        assertEquals(3, ArrayUtils.lastIndexOf(array, 3));
-        assertEquals(-1, ArrayUtils.lastIndexOf(array, 99));
-    }
-
-    @Test
-    public void testLastIndexOfLongWithStartIndex() {
-        long[] array = null;
-        assertEquals(-1, ArrayUtils.lastIndexOf(array, 0, 2));
-        array = new long[] { 0, 1, 2, 3, 0 };
-        assertEquals(0, ArrayUtils.lastIndexOf(array, 0, 2));
-        assertEquals(1, ArrayUtils.lastIndexOf(array, 1, 2));
-        assertEquals(2, ArrayUtils.lastIndexOf(array, 2, 2));
-        assertEquals(-1, ArrayUtils.lastIndexOf(array, 3, 2));
-        assertEquals(-1, ArrayUtils.lastIndexOf(array, 3, -1));
-        assertEquals(-1, ArrayUtils.lastIndexOf(array, 99, 4));
-        assertEquals(4, ArrayUtils.lastIndexOf(array, 0, 88));
-    }
-
-    @Test
-    public void testContainsLong() {
-        long[] array = null;
-        assertFalse(ArrayUtils.contains(array, 1));
-        array = new long[] { 0, 1, 2, 3, 0 };
-        assertTrue(ArrayUtils.contains(array, 0));
-        assertTrue(ArrayUtils.contains(array, 1));
-        assertTrue(ArrayUtils.contains(array, 2));
-        assertTrue(ArrayUtils.contains(array, 3));
-        assertFalse(ArrayUtils.contains(array, 99));
-    }
-    
-    //-----------------------------------------------------------------------
-    @Test
-    public void testIndexOfInt() {
-        int[] array = null;
-        assertEquals(-1, ArrayUtils.indexOf(array, 0));
-        array = new int[] { 0, 1, 2, 3, 0 };
-        assertEquals(0, ArrayUtils.indexOf(array, 0));
-        assertEquals(1, ArrayUtils.indexOf(array, 1));
-        assertEquals(2, ArrayUtils.indexOf(array, 2));
-        assertEquals(3, ArrayUtils.indexOf(array, 3));
-        assertEquals(-1, ArrayUtils.indexOf(array, 99));
-    }
-
-    @Test
-    public void testIndexOfIntWithStartIndex() {
-        int[] array = null;
-        assertEquals(-1, ArrayUtils.indexOf(array, 0, 2));
-        array = new int[] { 0, 1, 2, 3, 0 };
-        assertEquals(4, ArrayUtils.indexOf(array, 0, 2));
-        assertEquals(-1, ArrayUtils.indexOf(array, 1, 2));
-        assertEquals(2, ArrayUtils.indexOf(array, 2, 2));
-        assertEquals(3, ArrayUtils.indexOf(array, 3, 2));
-        assertEquals(3, ArrayUtils.indexOf(array, 3, -1));
-        assertEquals(-1, ArrayUtils.indexOf(array, 99, 0));
-        assertEquals(-1, ArrayUtils.indexOf(array, 0, 6));
-    }
-
-    @Test
-    public void testLastIndexOfInt() {
-        int[] array = null;
-        assertEquals(-1, ArrayUtils.lastIndexOf(array, 0));
-        array = new int[] { 0, 1, 2, 3, 0 };
-        assertEquals(4, ArrayUtils.lastIndexOf(array, 0));
-        assertEquals(1, ArrayUtils.lastIndexOf(array, 1));
-        assertEquals(2, ArrayUtils.lastIndexOf(array, 2));
-        assertEquals(3, ArrayUtils.lastIndexOf(array, 3));
-        assertEquals(-1, ArrayUtils.lastIndexOf(array, 99));
-    }
-
-    @Test
-    public void testLastIndexOfIntWithStartIndex() {
-        int[] array = null;
-        assertEquals(-1, ArrayUtils.lastIndexOf(array, 0, 2));
-        array = new int[] { 0, 1, 2, 3, 0 };
-        assertEquals(0, ArrayUtils.lastIndexOf(array, 0, 2));
-        assertEquals(1, ArrayUtils.lastIndexOf(array, 1, 2));
-        assertEquals(2, ArrayUtils.lastIndexOf(array, 2, 2));
-        assertEquals(-1, ArrayUtils.lastIndexOf(array, 3, 2));
-        assertEquals(-1, ArrayUtils.lastIndexOf(array, 3, -1));
-        assertEquals(-1, ArrayUtils.lastIndexOf(array, 99));
-        assertEquals(4, ArrayUtils.lastIndexOf(array, 0, 88));
-    }
-
-    @Test
-    public void testContainsInt() {
-        int[] array = null;
-        assertFalse(ArrayUtils.contains(array, 1));
-        array = new int[] { 0, 1, 2, 3, 0 };
-        assertTrue(ArrayUtils.contains(array, 0));
-        assertTrue(ArrayUtils.contains(array, 1));
-        assertTrue(ArrayUtils.contains(array, 2));
-        assertTrue(ArrayUtils.contains(array, 3));
-        assertFalse(ArrayUtils.contains(array, 99));
-    }
-    
-    //-----------------------------------------------------------------------
-    @Test
-    public void testIndexOfShort() {
-        short[] array = null;
-        assertEquals(-1, ArrayUtils.indexOf(array, (short) 0));
-        array = new short[] { 0, 1, 2, 3, 0 };
-        assertEquals(0, ArrayUtils.indexOf(array, (short) 0));
-        assertEquals(1, ArrayUtils.indexOf(array, (short) 1));
-        assertEquals(2, ArrayUtils.indexOf(array, (short) 2));
-        assertEquals(3, ArrayUtils.indexOf(array, (short) 3));
-        assertEquals(-1, ArrayUtils.indexOf(array, (short) 99));
-    }
-
-    @Test
-    public void testIndexOfShortWithStartIndex() {
-        short[] array = null;
-        assertEquals(-1, ArrayUtils.indexOf(array, (short) 0, 2));
-        array = new short[] { 0, 1, 2, 3, 0 };
-        assertEquals(4, ArrayUtils.indexOf(array, (short) 0, 2));
-        assertEquals(-1, ArrayUtils.indexOf(array, (short) 1, 2));
-        assertEquals(2, ArrayUtils.indexOf(array, (short) 2, 2));
-        assertEquals(3, ArrayUtils.indexOf(array, (short) 3, 2));
-        assertEquals(3, ArrayUtils.indexOf(array, (short) 3, -1));
-        assertEquals(-1, ArrayUtils.indexOf(array, (short) 99, 0));
-        assertEquals(-1, ArrayUtils.indexOf(array, (short) 0, 6));
-    }
-
-    @Test
-    public void testLastIndexOfShort() {
-        short[] array = null;
-        assertEquals(-1, ArrayUtils.lastIndexOf(array, (short) 0));
-        array = new short[] { 0, 1, 2, 3, 0 };
-        assertEquals(4, ArrayUtils.lastIndexOf(array, (short) 0));
-        assertEquals(1, ArrayUtils.lastIndexOf(array, (short) 1));
-        assertEquals(2, ArrayUtils.lastIndexOf(array, (short) 2));
-        assertEquals(3, ArrayUtils.lastIndexOf(array, (short) 3));
-        assertEquals(-1, ArrayUtils.lastIndexOf(array, (short) 99));
-    }
-
-    @Test
-    public void testLastIndexOfShortWithStartIndex() {
-        short[] array = null;
-        assertEquals(-1, ArrayUtils.lastIndexOf(array, (short) 0, 2));
-        array = new short[] { 0, 1, 2, 3, 0 };
-        assertEquals(0, ArrayUtils.lastIndexOf(array, (short) 0, 2));
-        assertEquals(1, ArrayUtils.lastIndexOf(array, (short) 1, 2));
-        assertEquals(2, ArrayUtils.lastIndexOf(array, (short) 2, 2));
-        assertEquals(-1, ArrayUtils.lastIndexOf(array, (short) 3, 2));
-        assertEquals(-1, ArrayUtils.lastIndexOf(array, (short) 3, -1));
-        assertEquals(-1, ArrayUtils.lastIndexOf(array, (short) 99));
-        assertEquals(4, ArrayUtils.lastIndexOf(array, (short) 0, 88));
-    }
-
-    @Test
-    public void testContainsShort() {
-        short[] array = null;
-        assertFalse(ArrayUtils.contains(array, (short) 1));
-        array = new short[] { 0, 1, 2, 3, 0 };
-        assertTrue(ArrayUtils.contains(array, (short) 0));
-        assertTrue(ArrayUtils.contains(array, (short) 1));
-        assertTrue(ArrayUtils.contains(array, (short) 2));
-        assertTrue(ArrayUtils.contains(array, (short) 3));
-        assertFalse(ArrayUtils.contains(array, (short) 99));
-    }
-    
-    //-----------------------------------------------------------------------
-    @Test
-    public void testIndexOfChar() {
-        char[] array = null;
-        assertEquals(-1, ArrayUtils.indexOf(array, 'a'));
-        array = new char[] { 'a', 'b', 'c', 'd', 'a' };
-        assertEquals(0, ArrayUtils.indexOf(array, 'a'));
-        assertEquals(1, ArrayUtils.indexOf(array, 'b'));
-        assertEquals(2, ArrayUtils.indexOf(array, 'c'));
-        assertEquals(3, ArrayUtils.indexOf(array, 'd'));
-        assertEquals(-1, ArrayUtils.indexOf(array, 'e'));
-    }
-
-    @Test
-    public void testIndexOfCharWithStartIndex() {
-        char[] array = null;
-        assertEquals(-1, ArrayUtils.indexOf(array, 'a', 2));
-        array = new char[] { 'a', 'b', 'c', 'd', 'a' };
-        assertEquals(4, ArrayUtils.indexOf(array, 'a', 2));
-        assertEquals(-1, ArrayUtils.indexOf(array, 'b', 2));
-        assertEquals(2, ArrayUtils.indexOf(array, 'c', 2));
-        assertEquals(3, ArrayUtils.indexOf(array, 'd', 2));
-        assertEquals(3, ArrayUtils.indexOf(array, 'd', -1));
-        assertEquals(-1, ArrayUtils.indexOf(array, 'e', 0));
-        assertEquals(-1, ArrayUtils.indexOf(array, 'a', 6));
-    }
-
-    @Test
-    public void testLastIndexOfChar() {
-        char[] array = null;
-        assertEquals(-1, ArrayUtils.lastIndexOf(array, 'a'));
-        array = new char[] { 'a', 'b', 'c', 'd', 'a' };
-        assertEquals(4, ArrayUtils.lastIndexOf(array, 'a'));
-        assertEquals(1, ArrayUtils.lastIndexOf(array, 'b'));
-        assertEquals(2, ArrayUtils.lastIndexOf(array, 'c'));
-        assertEquals(3, ArrayUtils.lastIndexOf(array, 'd'));
-        assertEquals(-1, ArrayUtils.lastIndexOf(array, 'e'));
-    }
-
-    @Test
-    public void testLastIndexOfCharWithStartIndex() {
-        char[] array = null;
-        assertEquals(-1, ArrayUtils.lastIndexOf(array, 'a', 2));
-        array = new char[] { 'a', 'b', 'c', 'd', 'a' };
-        assertEquals(0, ArrayUtils.lastIndexOf(array, 'a', 2));
-        assertEquals(1, ArrayUtils.lastIndexOf(array, 'b', 2));
-        assertEquals(2, ArrayUtils.lastIndexOf(array, 'c', 2));
-        assertEquals(-1, ArrayUtils.lastIndexOf(array, 'd', 2));
-        assertEquals(-1, ArrayUtils.lastIndexOf(array, 'd', -1));
-        assertEquals(-1, ArrayUtils.lastIndexOf(array, 'e'));
-        assertEquals(4, ArrayUtils.lastIndexOf(array, 'a', 88));
-    }
-
-    @Test
-    public void testContainsChar() {
-        char[] array = null;
-        assertFalse(ArrayUtils.contains(array, 'b'));
-        array = new char[] { 'a', 'b', 'c', 'd', 'a' };
-        assertTrue(ArrayUtils.contains(array, 'a'));
-        assertTrue(ArrayUtils.contains(array, 'b'));
-        assertTrue(ArrayUtils.contains(array, 'c'));
-        assertTrue(ArrayUtils.contains(array, 'd'));
-        assertFalse(ArrayUtils.contains(array, 'e'));
-    }
-    
-    //-----------------------------------------------------------------------
-    @Test
-    public void testIndexOfByte() {
-        byte[] array = null;
-        assertEquals(-1, ArrayUtils.indexOf(array, (byte) 0));
-        array = new byte[] { 0, 1, 2, 3, 0 };
-        assertEquals(0, ArrayUtils.indexOf(array, (byte) 0));
-        assertEquals(1, ArrayUtils.indexOf(array, (byte) 1));
-        assertEquals(2, ArrayUtils.indexOf(array, (byte) 2));
-        assertEquals(3, ArrayUtils.indexOf(array, (byte) 3));
-        assertEquals(-1, ArrayUtils.indexOf(array, (byte) 99));
-    }
-
-    @Test
-    public void testIndexOfByteWithStartIndex() {
-        byte[] array = null;
-        assertEquals(-1, ArrayUtils.indexOf(array, (byte) 0, 2));
-        array = new byte[] { 0, 1, 2, 3, 0 };
-        assertEquals(4, ArrayUtils.indexOf(array, (byte) 0, 2));
-        assertEquals(-1, ArrayUtils.indexOf(array, (byte) 1, 2));
-        assertEquals(2, ArrayUtils.indexOf(array, (byte) 2, 2));
-        assertEquals(3, ArrayUtils.indexOf(array, (byte) 3, 2));
-        assertEquals(3, ArrayUtils.indexOf(array, (byte) 3, -1));
-        assertEquals(-1, ArrayUtils.indexOf(array, (byte) 99, 0));
-        assertEquals(-1, ArrayUtils.indexOf(array, (byte) 0, 6));
-    }
-
-    @Test
-    public void testLastIndexOfByte() {
-        byte[] array = null;
-        assertEquals(-1, ArrayUtils.lastIndexOf(array, (byte) 0));
-        array = new byte[] { 0, 1, 2, 3, 0 };
-        assertEquals(4, ArrayUtils.lastIndexOf(array, (byte) 0));
-        assertEquals(1, ArrayUtils.lastIndexOf(array, (byte) 1));
-        assertEquals(2, ArrayUtils.lastIndexOf(array, (byte) 2));
-        assertEquals(3, ArrayUtils.lastIndexOf(array, (byte) 3));
-        assertEquals(-1, ArrayUtils.lastIndexOf(array, (byte) 99));
-    }
-
-    @Test
-    public void testLastIndexOfByteWithStartIndex() {
-        byte[] array = null;
-        assertEquals(-1, ArrayUtils.lastIndexOf(array, (byte) 0, 2));
-        array = new byte[] { 0, 1, 2, 3, 0 };
-        assertEquals(0, ArrayUtils.lastIndexOf(array, (byte) 0, 2));
-        assertEquals(1, ArrayUtils.lastIndexOf(array, (byte) 1, 2));
-        assertEquals(2, ArrayUtils.lastIndexOf(array, (byte) 2, 2));
-        assertEquals(-1, ArrayUtils.lastIndexOf(array, (byte) 3, 2));
-        assertEquals(-1, ArrayUtils.lastIndexOf(array, (byte) 3, -1));
-        assertEquals(-1, ArrayUtils.lastIndexOf(array, (byte) 99));
-        assertEquals(4, ArrayUtils.lastIndexOf(array, (byte) 0, 88));
-    }
-
-    @Test
-    public void testContainsByte() {
-        byte[] array = null;
-        assertFalse(ArrayUtils.contains(array, (byte) 1));
-        array = new byte[] { 0, 1, 2, 3, 0 };
-        assertTrue(ArrayUtils.contains(array, (byte) 0));
-        assertTrue(ArrayUtils.contains(array, (byte) 1));
-        assertTrue(ArrayUtils.contains(array, (byte) 2));
-        assertTrue(ArrayUtils.contains(array, (byte) 3));
-        assertFalse(ArrayUtils.contains(array, (byte) 99));
-    }
-    
-    //-----------------------------------------------------------------------
-    @SuppressWarnings("cast")
-    @Test
-    public void testIndexOfDouble() {
-        double[] array = null;
-        assertEquals(-1, ArrayUtils.indexOf(array, (double) 0));
-        array = new double[0];
-        assertEquals(-1, ArrayUtils.indexOf(array, (double) 0));
-        array = new double[] { 0, 1, 2, 3, 0 };
-        assertEquals(0, ArrayUtils.indexOf(array, (double) 0));
-        assertEquals(1, ArrayUtils.indexOf(array, (double) 1));
-        assertEquals(2, ArrayUtils.indexOf(array, (double) 2));
-        assertEquals(3, ArrayUtils.indexOf(array, (double) 3));
-        assertEquals(3, ArrayUtils.indexOf(array, (double) 3, -1));
-        assertEquals(-1, ArrayUtils.indexOf(array, (double) 99));
-    }
-
-    @SuppressWarnings("cast")
-    @Test
-    public void testIndexOfDoubleTolerance() {
-        double[] array = null;
-        assertEquals(-1, ArrayUtils.indexOf(array, (double) 0, (double) 0));
-        array = new double[0];
-        assertEquals(-1, ArrayUtils.indexOf(array, (double) 0, (double) 0));
-        array = new double[] { 0, 1, 2, 3, 0 };
-        assertEquals(0, ArrayUtils.indexOf(array, (double) 0, (double) 0.3));
-        assertEquals(2, ArrayUtils.indexOf(array, (double) 2.2, (double) 0.35));
-        assertEquals(3, ArrayUtils.indexOf(array, (double) 4.15, (double) 2.0));
-        assertEquals(1, ArrayUtils.indexOf(array, (double) 1.00001324, (double) 0.0001));
-    }
-
-    @SuppressWarnings("cast")
-    @Test
-    public void testIndexOfDoubleWithStartIndex() {
-        double[] array = null;
-        assertEquals(-1, ArrayUtils.indexOf(array, (double) 0, 2));
-        array = new double[0];
-        assertEquals(-1, ArrayUtils.indexOf(array, (double) 0, 2));
-        array = new double[] { 0, 1, 2, 3, 0 };
-        assertEquals(4, ArrayUtils.indexOf(array, (double) 0, 2));
-        assertEquals(-1, ArrayUtils.indexOf(array, (double) 1, 2));
-        assertEquals(2, ArrayUtils.indexOf(array, (double) 2, 2));
-        assertEquals(3, ArrayUtils.indexOf(array, (double) 3, 2));
-        assertEquals(-1, ArrayUtils.indexOf(array, (double) 99, 0));
-        assertEquals(-1, ArrayUtils.indexOf(array, (double) 0, 6));
-    }
-    
-    @SuppressWarnings("cast")
-    @Test
-    public void testIndexOfDoubleWithStartIndexTolerance() {
-        double[] array = null;
-        assertEquals(-1, ArrayUtils.indexOf(array, (double) 0, 2, (double) 0));
-        array = new double[0];
-        assertEquals(-1, ArrayUtils.indexOf(array, (double) 0, 2, (double) 0));
-        array = new double[] { 0, 1, 2, 3, 0 };
-        assertEquals(-1, ArrayUtils.indexOf(array, (double) 0, 99, (double) 0.3));
-        assertEquals(0, ArrayUtils.indexOf(array, (double) 0, 0, (double) 0.3));
-        assertEquals(4, ArrayUtils.indexOf(array, (double) 0, 3, (double) 0.3));
-        assertEquals(2, ArrayUtils.indexOf(array, (double) 2.2, 0, (double) 0.35));
-        assertEquals(3, ArrayUtils.indexOf(array, (double) 4.15, 0, (double) 2.0));
-        assertEquals(1, ArrayUtils.indexOf(array, (double) 1.00001324, 0, (double) 0.0001));
-        assertEquals(3, ArrayUtils.indexOf(array, (double) 4.15, -1, (double) 2.0));
-        assertEquals(1, ArrayUtils.indexOf(array, (double) 1.00001324, -300, (double) 0.0001));
-    }
-
-    @SuppressWarnings("cast")
-    @Test
-    public void testLastIndexOfDouble() {
-        double[] array = null;
-        assertEquals(-1, ArrayUtils.lastIndexOf(array, (double) 0));
-        array = new double[0];
-        assertEquals(-1, ArrayUtils.lastIndexOf(array, (double) 0));
-        array = new double[] { 0, 1, 2, 3, 0 };
-        assertEquals(4, ArrayUtils.lastIndexOf(array, (double) 0));
-        assertEquals(1, ArrayUtils.lastIndexOf(array, (double) 1));
-        assertEquals(2, ArrayUtils.lastIndexOf(array, (double) 2));
-        assertEquals(3, ArrayUtils.lastIndexOf(array, (double) 3));
-        assertEquals(-1, ArrayUtils.lastIndexOf(array, (double) 99));
-    }
-
-    @SuppressWarnings("cast")
-    @Test
-    public void testLastIndexOfDoubleTolerance() {
-        double[] array = null;
-        assertEquals(-1, ArrayUtils.lastIndexOf(array, (double) 0, (double) 0));
-        array = new double[0];
-        assertEquals(-1, ArrayUtils.lastIndexOf(array, (double) 0, (double) 0));
-        array = new double[] { 0, 1, 2, 3, 0 };
-        assertEquals(4, ArrayUtils.lastIndexOf(array, (double) 0, (double) 0.3));
-        assertEquals(2, ArrayUtils.lastIndexOf(array, (double) 2.2, (double) 0.35));
-        assertEquals(3, ArrayUtils.lastIndexOf(array, (double) 4.15, (double) 2.0));
-        assertEquals(1, ArrayUtils.lastIndexOf(array, (double) 1.00001324, (double) 0.0001));
-    }
-
-    @SuppressWarnings("cast")
-    @Test
-    public void testLastIndexOfDoubleWithStartIndex() {
-        double[] array = null;
-        assertEquals(-1, ArrayUtils.lastIndexOf(array, (double) 0, 2));
-        array = new double[0];
-        assertEquals(-1, ArrayUtils.lastIndexOf(array, (double) 0, 2));
-        array = new double[] { 0, 1, 2, 3, 0 };
-        assertEquals(0, ArrayUtils.lastIndexOf(array, (double) 0, 2));
-        assertEquals(1, ArrayUtils.lastIndexOf(array, (double) 1, 2));
-        assertEquals(2, ArrayUtils.lastIndexOf(array, (double) 2, 2));
-        assertEquals(-1, ArrayUtils.lastIndexOf(array, (double) 3, 2));
-        assertEquals(-1, ArrayUtils.lastIndexOf(array, (double) 3, -1));
-        assertEquals(-1, ArrayUtils.lastIndexOf(array, (double) 99));
-        assertEquals(4, ArrayUtils.lastIndexOf(array, (double) 0, 88));
-    }
-
-    @SuppressWarnings("cast")
-    @Test
-    public void testLastIndexOfDoubleWithStartIndexTolerance() {
-        double[] array = null;
-        assertEquals(-1, ArrayUtils.lastIndexOf(array, (double) 0, 2, (double) 0));
-        array = new double[0];
-        assertEquals(-1, ArrayUtils.lastIndexOf(array, (double) 0, 2, (double) 0));
-        array = new double[] { (double) 3 };
-        assertEquals(-1, ArrayUtils.lastIndexOf(array, (double) 1, 0, (double) 0));
-        array = new double[] { 0, 1, 2, 3, 0 };
-        assertEquals(4, ArrayUtils.lastIndexOf(array, (double) 0, 99, (double) 0.3));
-        assertEquals(0, ArrayUtils.lastIndexOf(array, (double) 0, 3, (double) 0.3));
-        assertEquals(2, ArrayUtils.lastIndexOf(array, (double) 2.2, 3, (double) 0.35));
-        assertEquals(3, ArrayUtils.lastIndexOf(array, (double) 4.15, array.length, (double) 2.0));
-        assertEquals(1, ArrayUtils.lastIndexOf(array, (double) 1.00001324, array.length, (double) 0.0001));
-        assertEquals(-1, ArrayUtils.lastIndexOf(array, (double) 4.15, -200, (double) 2.0));
-    }
-
-    @SuppressWarnings("cast")
-    @Test
-    public void testContainsDouble() {
-        double[] array = null;
-        assertFalse(ArrayUtils.contains(array, (double) 1));
-        array = new double[] { 0, 1, 2, 3, 0 };
-        assertTrue(ArrayUtils.contains(array, (double) 0));
-        assertTrue(ArrayUtils.contains(array, (double) 1));
-        assertTrue(ArrayUtils.contains(array, (double) 2));
-        assertTrue(ArrayUtils.contains(array, (double) 3));
-        assertFalse(ArrayUtils.contains(array, (double) 99));
-    }
-
-    @SuppressWarnings("cast")
-    @Test
-    public void testContainsDoubleTolerance() {
-        double[] array = null;
-        assertFalse(ArrayUtils.contains(array, (double) 1, (double) 0));
-        array = new double[] { 0, 1, 2, 3, 0 };
-        assertFalse(ArrayUtils.contains(array, (double) 4.0, (double) 0.33));
-        assertFalse(ArrayUtils.contains(array, (double) 2.5, (double) 0.49));
-        assertTrue(ArrayUtils.contains(array, (double) 2.5, (double) 0.50));
-        assertTrue(ArrayUtils.contains(array, (double) 2.5, (double) 0.51));
-    }
-    
-    //-----------------------------------------------------------------------
-    @SuppressWarnings("cast")
-    @Test
-    public void testIndexOfFloat() {
-        float[] array = null;
-        assertEquals(-1, ArrayUtils.indexOf(array, (float) 0));
-        array = new float[0];
-        assertEquals(-1, ArrayUtils.indexOf(array, (float) 0));
-        array = new float[] { 0, 1, 2, 3, 0 };
-        assertEquals(0, ArrayUtils.indexOf(array, (float) 0));
-        assertEquals(1, ArrayUtils.indexOf(array, (float) 1));
-        assertEquals(2, ArrayUtils.indexOf(array, (float) 2));
-        assertEquals(3, ArrayUtils.indexOf(array, (float) 3));
-        assertEquals(-1, ArrayUtils.indexOf(array, (float) 99));
-    }
-
-    @SuppressWarnings("cast")
-    @Test
-    public void testIndexOfFloatWithStartIndex() {
-        float[] array = null;
-        assertEquals(-1, ArrayUtils.indexOf(array, (float) 0, 2));
-        array = new float[0];
-        assertEquals(-1, ArrayUtils.indexOf(array, (float) 0, 2));
-        array = new float[] { 0, 1, 2, 3, 0 };
-        assertEquals(4, ArrayUtils.indexOf(array, (float) 0, 2));
-        assertEquals(-1, ArrayUtils.indexOf(array, (float) 1, 2));
-        assertEquals(2, ArrayUtils.indexOf(array, (float) 2, 2));
-        assertEquals(3, ArrayUtils.indexOf(array, (float) 3, 2));
-        assertEquals(3, ArrayUtils.indexOf(array, (float) 3, -1));
-        assertEquals(-1, ArrayUtils.indexOf(array, (float) 99, 0));
-        assertEquals(-1, ArrayUtils.indexOf(array, (float) 0, 6));
-    }
-
-    @SuppressWarnings("cast")
-    @Test
-    public void testLastIndexOfFloat() {
-        float[] array = null;
-        assertEquals(-1, ArrayUtils.lastIndexOf(array, (float) 0));
-        array = new float[0];
-        assertEquals(-1, ArrayUtils.lastIndexOf(array, (float) 0));
-        array = new float[] { 0, 1, 2, 3, 0 };
-        assertEquals(4, ArrayUtils.lastIndexOf(array, (float) 0));
-        assertEquals(1, ArrayUtils.lastIndexOf(array, (float) 1));
-        assertEquals(2, ArrayUtils.lastIndexOf(array, (float) 2));
-        assertEquals(3, ArrayUtils.lastIndexOf(array, (float) 3));
-        assertEquals(-1, ArrayUtils.lastIndexOf(array, (float) 99));
-    }
-
-    @SuppressWarnings("cast")
-    @Test
-    public void testLastIndexOfFloatWithStartIndex() {
-        float[] array = null;
-        assertEquals(-1, ArrayUtils.lastIndexOf(array, (float) 0, 2));
-        array = new float[0];
-        assertEquals(-1, ArrayUtils.lastIndexOf(array, (float) 0, 2));
-        array = new float[] { 0, 1, 2, 3, 0 };
-        assertEquals(0, ArrayUtils.lastIndexOf(array, (float) 0, 2));
-        assertEquals(1, ArrayUtils.lastIndexOf(array, (float) 1, 2));
-        assertEquals(2, ArrayUtils.lastIndexOf(array, (float) 2, 2));
-        assertEquals(-1, ArrayUtils.lastIndexOf(array, (float) 3, 2));
-        assertEquals(-1, ArrayUtils.lastIndexOf(array, (float) 3, -1));
-        assertEquals(-1, ArrayUtils.lastIndexOf(array, (float) 99));
-        assertEquals(4, ArrayUtils.lastIndexOf(array, (float) 0, 88));
-    }
-
-    @SuppressWarnings("cast")
-    @Test
-    public void testContainsFloat() {
-        float[] array = null;
-        assertFalse(ArrayUtils.contains(array, (float) 1));
-        array = new float[] { 0, 1, 2, 3, 0 };
-        assertTrue(ArrayUtils.contains(array, (float) 0));
-        assertTrue(ArrayUtils.contains(array, (float) 1));
-        assertTrue(ArrayUtils.contains(array, (float) 2));
-        assertTrue(ArrayUtils.contains(array, (float) 3));
-        assertFalse(ArrayUtils.contains(array, (float) 99));
-    }
-    
-    //-----------------------------------------------------------------------
-    @Test
-    public void testIndexOfBoolean() {
-        boolean[] array = null;
-        assertEquals(-1, ArrayUtils.indexOf(array, true));
-        array = new boolean[0];
-        assertEquals(-1, ArrayUtils.indexOf(array, true));
-        array = new boolean[] { true, false, true };
-        assertEquals(0, ArrayUtils.indexOf(array, true));
-        assertEquals(1, ArrayUtils.indexOf(array, false));
-        array = new boolean[] { true, true };
-        assertEquals(-1, ArrayUtils.indexOf(array, false));
-    }
-
-    @Test
-    public void testIndexOfBooleanWithStartIndex() {
-        boolean[] array = null;
-        assertEquals(-1, ArrayUtils.indexOf(array, true, 2));
-        array = new boolean[0];
-        assertEquals(-1, ArrayUtils.indexOf(array, true, 2));
-        array = new boolean[] { true, false, true };
-        assertEquals(2, ArrayUtils.indexOf(array, true, 1));
-        assertEquals(-1, ArrayUtils.indexOf(array, false, 2));
-        assertEquals(1, ArrayUtils.indexOf(array, false, 0));
-        assertEquals(1, ArrayUtils.indexOf(array, false, -1));
-        array = new boolean[] { true, true };
-        assertEquals(-1, ArrayUtils.indexOf(array, false, 0));
-        assertEquals(-1, ArrayUtils.indexOf(array, false, -1));
-    }
-
-    @Test
-    public void testLastIndexOfBoolean() {
-        boolean[] array = null;
-        assertEquals(-1, ArrayUtils.lastIndexOf(array, true));
-        array = new boolean[0];
-        assertEquals(-1, ArrayUtils.lastIndexOf(array, true));
-        array = new boolean[] { true, false, true };
-        assertEquals(2, ArrayUtils.lastIndexOf(array, true));
-        assertEquals(1, ArrayUtils.lastIndexOf(array, false));
-        array = new boolean[] { true, true };
-        assertEquals(-1, ArrayUtils.lastIndexOf(array, false));
-    }
-
-    @Test
-    public void testLastIndexOfBooleanWithStartIndex() {
-        boolean[] array = null;
-        assertEquals(-1, ArrayUtils.lastIndexOf(array, true, 2));
-        array = new boolean[0];
-        assertEquals(-1, ArrayUtils.lastIndexOf(array, true, 2));
-        array = new boolean[] { true, false, true };
-        assertEquals(2, ArrayUtils.lastIndexOf(array, true, 2));
-        assertEquals(0, ArrayUtils.lastIndexOf(array, true, 1));
-        assertEquals(1, ArrayUtils.lastIndexOf(array, false, 2));
-        assertEquals(-1, ArrayUtils.lastIndexOf(array, true, -1));
-        array = new boolean[] { true, true };
-        assertEquals(-1, ArrayUtils.lastIndexOf(array, false, 2));
-        assertEquals(-1, ArrayUtils.lastIndexOf(array, true, -1));
-    }
-
-    @Test
-    public void testContainsBoolean() {
-        boolean[] array = null;
-        assertFalse(ArrayUtils.contains(array, true));
-        array = new boolean[] { true, false, true };
-        assertTrue(ArrayUtils.contains(array, true));
-        assertTrue(ArrayUtils.contains(array, false));
-        array = new boolean[] { true, true };
-        assertTrue(ArrayUtils.contains(array, true));
-        assertFalse(ArrayUtils.contains(array, false));
-    }
-    
-    // testToPrimitive/Object for boolean
-    //  -----------------------------------------------------------------------
-    @Test
-    public void testToPrimitive_boolean() {
-        final Boolean[] b = null;
-        assertEquals(null, ArrayUtils.toPrimitive(b));
-        assertSame(ArrayUtils.EMPTY_BOOLEAN_ARRAY, ArrayUtils.toPrimitive(new Boolean[0]));
-        assertTrue(Arrays.equals(
-            new boolean[] {true, false, true},
-            ArrayUtils.toPrimitive(new Boolean[] {Boolean.TRUE, Boolean.FALSE, Boolean.TRUE}))
-        );
-
-        try {
-            ArrayUtils.toPrimitive(new Boolean[] {Boolean.TRUE, null});
-            fail();
-        } catch (final NullPointerException ex) {}
-    }
-
-    @Test
-    public void testToPrimitive_boolean_boolean() {
-        assertEquals(null, ArrayUtils.toPrimitive(null, false));
-        assertSame(ArrayUtils.EMPTY_BOOLEAN_ARRAY, ArrayUtils.toPrimitive(new Boolean[0], false));
-        assertTrue(Arrays.equals(
-            new boolean[] {true, false, true},
-            ArrayUtils.toPrimitive(new Boolean[] {Boolean.TRUE, Boolean.FALSE, Boolean.TRUE}, false))
-        );
-        assertTrue(Arrays.equals(
-            new boolean[] {true, false, false},
-            ArrayUtils.toPrimitive(new Boolean[] {Boolean.TRUE, null, Boolean.FALSE}, false))
-        );
-        assertTrue(Arrays.equals(
-            new boolean[] {true, true, false},
-            ArrayUtils.toPrimitive(new Boolean[] {Boolean.TRUE, null, Boolean.FALSE}, true))
-        );
-    }
-
-    @Test
-    public void testToObject_boolean() {
-        final boolean[] b = null;
-        assertArrayEquals(null, ArrayUtils.toObject(b));
-        assertSame(ArrayUtils.EMPTY_BOOLEAN_OBJECT_ARRAY, ArrayUtils.toObject(new boolean[0]));
-        assertTrue(Arrays.equals(
-            new Boolean[] {Boolean.TRUE, Boolean.FALSE, Boolean.TRUE},
-            ArrayUtils.toObject(new boolean[] {true, false, true}))
-        );
-    }
-
-    // testToPrimitive/Object for byte
-    //  -----------------------------------------------------------------------
-    @Test
-    public void testToPrimitive_char() {
-        final Character[] b = null;
-        assertEquals(null, ArrayUtils.toPrimitive(b));
-        
-        assertSame(ArrayUtils.EMPTY_CHAR_ARRAY, ArrayUtils.toPrimitive(new Character[0]));
-        
-        assertTrue(Arrays.equals(
-            new char[] {Character.MIN_VALUE, Character.MAX_VALUE, '0'},
-            ArrayUtils.toPrimitive(new Character[] {new Character(Character.MIN_VALUE), 
-                new Character(Character.MAX_VALUE), new Character('0')}))
-        );
-
-        try {
-            ArrayUtils.toPrimitive(new Character[] {new Character(Character.MIN_VALUE), null});
-            fail();
-        } catch (final NullPointerException ex) {}
-    }
-
-    @Test
-    public void testToPrimitive_char_char() {
-        final Character[] b = null;
-        assertEquals(null, ArrayUtils.toPrimitive(b, Character.MIN_VALUE));
-        
-        assertSame(ArrayUtils.EMPTY_CHAR_ARRAY, 
-            ArrayUtils.toPrimitive(new Character[0], (char)0));
-        
-        assertTrue(Arrays.equals(
-            new char[] {Character.MIN_VALUE, Character.MAX_VALUE, '0'},
-            ArrayUtils.toPrimitive(new Character[] {new Character(Character.MIN_VALUE), 
-                new Character(Character.MAX_VALUE), new Character('0')}, 
-                Character.MIN_VALUE))
-        );
-        
-        assertTrue(Arrays.equals(
-            new char[] {Character.MIN_VALUE, Character.MAX_VALUE, '0'},
-            ArrayUtils.toPrimitive(new Character[] {new Character(Character.MIN_VALUE), null, 
-                new Character('0')}, Character.MAX_VALUE))
-        );
-    }
-
-    @Test
-    public void testToObject_char() {
-        final char[] b = null;
-        assertArrayEquals(null, ArrayUtils.toObject(b));
-        
-        assertSame(ArrayUtils.EMPTY_CHARACTER_OBJECT_ARRAY, 
-            ArrayUtils.toObject(new char[0]));
-        
-        assertTrue(Arrays.equals(
-            new Character[] {new Character(Character.MIN_VALUE), 
-                new Character(Character.MAX_VALUE), new Character('0')},
-                ArrayUtils.toObject(new char[] {Character.MIN_VALUE, Character.MAX_VALUE, 
-                '0'} ))
-        );
-    }
-    
-    // testToPrimitive/Object for byte
-    //  -----------------------------------------------------------------------
-    @Test
-    public void testToPrimitive_byte() {
-        final Byte[] b = null;
-        assertEquals(null, ArrayUtils.toPrimitive(b));
-        
-        assertSame(ArrayUtils.EMPTY_BYTE_ARRAY, ArrayUtils.toPrimitive(new Byte[0]));
-        
-        assertTrue(Arrays.equals(
-            new byte[] {Byte.MIN_VALUE, Byte.MAX_VALUE, (byte)9999999},
-            ArrayUtils.toPrimitive(new Byte[] {Byte.valueOf(Byte.MIN_VALUE), 
-                Byte.valueOf(Byte.MAX_VALUE), Byte.valueOf((byte)9999999)}))
-        );
-
-        try {
-            ArrayUtils.toPrimitive(new Byte[] {Byte.valueOf(Byte.MIN_VALUE), null});
-            fail();
-        } catch (final NullPointerException ex) {}
-    }
-
-    @Test
-    public void testToPrimitive_byte_byte() {
-        final Byte[] b = null;
-        assertEquals(null, ArrayUtils.toPrimitive(b, Byte.MIN_VALUE));
-        
-        assertSame(ArrayUtils.EMPTY_BYTE_ARRAY, 
-            ArrayUtils.toPrimitive(new Byte[0], (byte)1));
-        
-        assertTrue(Arrays.equals(
-            new byte[] {Byte.MIN_VALUE, Byte.MAX_VALUE, (byte)9999999},
-            ArrayUtils.toPrimitive(new Byte[] {Byte.valueOf(Byte.MIN_VALUE), 
-                Byte.valueOf(Byte.MAX_VALUE), Byte.valueOf((byte)9999999)}, 
-                Byte.MIN_VALUE))
-        );
-        
-        assertTrue(Arrays.equals(
-            new byte[] {Byte.MIN_VALUE, Byte.MAX_VALUE, (byte)9999999},
-            ArrayUtils.toPrimitive(new Byte[] {Byte.valueOf(Byte.MIN_VALUE), null, 
-                Byte.valueOf((byte)9999999)}, Byte.MAX_VALUE))
-        );
-    }
-
-    @Test
-    public void testToObject_byte() {
-        final byte[] b = null;
-        assertArrayEquals(null, ArrayUtils.toObject(b));
-        
-        assertSame(ArrayUtils.EMPTY_BYTE_OBJECT_ARRAY, 
-            ArrayUtils.toObject(new byte[0]));
-        
-        assertTrue(Arrays.equals(
-            new Byte[] {Byte.valueOf(Byte.MIN_VALUE), 
-                Byte.valueOf(Byte.MAX_VALUE), Byte.valueOf((byte)9999999)},
-                ArrayUtils.toObject(new byte[] {Byte.MIN_VALUE, Byte.MAX_VALUE, 
-                (byte)9999999}))
-        );
-    }
-
-    // testToPrimitive/Object for short
-    //  -----------------------------------------------------------------------
-    @Test
-    public void testToPrimitive_short() {
-        final Short[] b = null;
-        assertEquals(null, ArrayUtils.toPrimitive(b));
-        
-        assertSame(ArrayUtils.EMPTY_SHORT_ARRAY, ArrayUtils.toPrimitive(new Short[0]));
-        
-        assertTrue(Arrays.equals(
-            new short[] {Short.MIN_VALUE, Short.MAX_VALUE, (short)9999999},
-            ArrayUtils.toPrimitive(new Short[] {Short.valueOf(Short.MIN_VALUE), 
-                Short.valueOf(Short.MAX_VALUE), Short.valueOf((short)9999999)}))
-        );
-
-        try {
-            ArrayUtils.toPrimitive(new Short[] {Short.valueOf(Short.MIN_VALUE), null});
-            fail();
-        } catch (final NullPointerException ex) {}
-    }
-
-    @Test
-    public void testToPrimitive_short_short() {
-        final Short[] s = null;
-        assertEquals(null, ArrayUtils.toPrimitive(s, Short.MIN_VALUE));
-        
-        assertSame(ArrayUtils.EMPTY_SHORT_ARRAY, ArrayUtils.toPrimitive(new Short[0], 
-        Short.MIN_VALUE));
-        
-        assertTrue(Arrays.equals(
-            new short[] {Short.MIN_VALUE, Short.MAX_VALUE, (short)9999999},
-            ArrayUtils.toPrimitive(new Short[] {Short.valueOf(Short.MIN_VALUE), 
-                Short.valueOf(Short.MAX_VALUE), Short.valueOf((short)9999999)}, Short.MIN_VALUE))
-        );
-        
-        assertTrue(Arrays.equals(
-            new short[] {Short.MIN_VALUE, Short.MAX_VALUE, (short)9999999},
-            ArrayUtils.toPrimitive(new Short[] {Short.valueOf(Short.MIN_VALUE), null, 
-                Short.valueOf((short)9999999)}, Short.MAX_VALUE))
-        );
-    }
-
-    @Test
-    public void testToObject_short() {
-        final short[] b = null;
-        assertArrayEquals(null, ArrayUtils.toObject(b));
-        
-        assertSame(ArrayUtils.EMPTY_SHORT_OBJECT_ARRAY, 
-        ArrayUtils.toObject(new short[0]));
-        
-        assertTrue(Arrays.equals(
-            new Short[] {Short.valueOf(Short.MIN_VALUE), Short.valueOf(Short.MAX_VALUE), 
-                Short.valueOf((short)9999999)},
-            ArrayUtils.toObject(new short[] {Short.MIN_VALUE, Short.MAX_VALUE, 
-                (short)9999999}))
-        );
-    }
-
-    //  testToPrimitive/Object for int
-    //  -----------------------------------------------------------------------
-     @Test
-     public void testToPrimitive_int() {
-         final Integer[] b = null;
-         assertEquals(null, ArrayUtils.toPrimitive(b));
-         assertSame(ArrayUtils.EMPTY_INT_ARRAY, ArrayUtils.toPrimitive(new Integer[0]));
-         assertTrue(Arrays.equals(
-             new int[] {Integer.MIN_VALUE, Integer.MAX_VALUE, 9999999},
-             ArrayUtils.toPrimitive(new Integer[] {Integer.valueOf(Integer.MIN_VALUE), 
-                 Integer.valueOf(Integer.MAX_VALUE), Integer.valueOf(9999999)}))
-         );
-
-         try {
-             ArrayUtils.toPrimitive(new Integer[] {Integer.valueOf(Integer.MIN_VALUE), null});
-             fail();
-         } catch (final NullPointerException ex) {}
-     }
-
-     @Test
-     public void testToPrimitive_int_int() {
-         final Long[] l = null;
-         assertEquals(null, ArrayUtils.toPrimitive(l, Integer.MIN_VALUE));
-         assertSame(ArrayUtils.EMPTY_INT_ARRAY, 
-         ArrayUtils.toPrimitive(new Integer[0], 1));
-         assertTrue(Arrays.equals(
-             new int[] {Integer.MIN_VALUE, Integer.MAX_VALUE, 9999999},
-             ArrayUtils.toPrimitive(new Integer[] {Integer.valueOf(Integer.MIN_VALUE), 
-                 Integer.valueOf(Integer.MAX_VALUE), Integer.valueOf(9999999)},1)));
-         assertTrue(Arrays.equals(
-             new int[] {Integer.MIN_VALUE, Integer.MAX_VALUE, 9999999},
-             ArrayUtils.toPrimitive(new Integer[] {Integer.valueOf(Integer.MIN_VALUE), 
-                 null, Integer.valueOf(9999999)}, Integer.MAX_VALUE))
-         );
-     }
-     
-    @Test
-    public void testToPrimitive_intNull() {
-        final Integer[] iArray = null;
-        assertEquals(null, ArrayUtils.toPrimitive(iArray, Integer.MIN_VALUE));
-    }
-
-    @Test
-    public void testToObject_int() {
-        final int[] b = null;
-        assertArrayEquals(null, ArrayUtils.toObject(b));
-    
-        assertSame(
-            ArrayUtils.EMPTY_INTEGER_OBJECT_ARRAY,
-            ArrayUtils.toObject(new int[0]));
-    
-        assertTrue(
-            Arrays.equals(
-                new Integer[] {
-                    Integer.valueOf(Integer.MIN_VALUE),
-                    Integer.valueOf(Integer.MAX_VALUE),
-                    Integer.valueOf(9999999)},
-            ArrayUtils.toObject(
-                new int[] { Integer.MIN_VALUE, Integer.MAX_VALUE, 9999999 })));
-    }
-
-    //  testToPrimitive/Object for long
-    //  -----------------------------------------------------------------------
-     @Test
-     public void testToPrimitive_long() {
-         final Long[] b = null;
-         assertEquals(null, ArrayUtils.toPrimitive(b));
-         
-         assertSame(ArrayUtils.EMPTY_LONG_ARRAY, 
-            ArrayUtils.toPrimitive(new Long[0]));
-         
-         assertTrue(Arrays.equals(
-             new long[] {Long.MIN_VALUE, Long.MAX_VALUE, 9999999},
-             ArrayUtils.toPrimitive(new Long[] {Long.valueOf(Long.MIN_VALUE), 
-                 Long.valueOf(Long.MAX_VALUE), Long.valueOf(9999999)}))
-         );
-
-         try {
-             ArrayUtils.toPrimitive(new Long[] {Long.valueOf(Long.MIN_VALUE), null});
-             fail();
-         } catch (final NullPointerException ex) {}
-     }
-
-     @Test
-     public void testToPrimitive_long_long() {
-         final Long[] l = null;
-         assertEquals(null, ArrayUtils.toPrimitive(l, Long.MIN_VALUE));
-         
-         assertSame(ArrayUtils.EMPTY_LONG_ARRAY, 
-         ArrayUtils.toPrimitive(new Long[0], 1));
-         
-         assertTrue(Arrays.equals(
-             new long[] {Long.MIN_VALUE, Long.MAX_VALUE, 9999999},
-             ArrayUtils.toPrimitive(new Long[] {Long.valueOf(Long.MIN_VALUE), 
-                 Long.valueOf(Long.MAX_VALUE), Long.valueOf(9999999)},1)));
-         
-         assertTrue(Arrays.equals(
-             new long[] {Long.MIN_VALUE, Long.MAX_VALUE, 9999999},
-             ArrayUtils.toPrimitive(new Long[] {Long.valueOf(Long.MIN_VALUE), 
-                 null, Long.valueOf(9999999)}, Long.MAX_VALUE))
-         );
-     }
-     
-    @Test
-    public void testToObject_long() {
-        final long[] b = null;
-        assertArrayEquals(null, ArrayUtils.toObject(b));
-    
-        assertSame(
-            ArrayUtils.EMPTY_LONG_OBJECT_ARRAY,
-            ArrayUtils.toObject(new long[0]));
-    
-        assertTrue(
-            Arrays.equals(
-                new Long[] {
-                    Long.valueOf(Long.MIN_VALUE),
-                    Long.valueOf(Long.MAX_VALUE),
-                    Long.valueOf(9999999)},
-            ArrayUtils.toObject(
-                new long[] { Long.MIN_VALUE, Long.MAX_VALUE, 9999999 })));
-    }
-
-    //  testToPrimitive/Object for float
-    //  -----------------------------------------------------------------------
-     @Test
-     public void testToPrimitive_float() {
-         final Float[] b = null;
-         assertEquals(null, ArrayUtils.toPrimitive(b));
-         
-         assertSame(ArrayUtils.EMPTY_FLOAT_ARRAY, 
-            ArrayUtils.toPrimitive(new Float[0]));
-         
-         assertTrue(Arrays.equals(
-             new float[] {Float.MIN_VALUE, Float.MAX_VALUE, 9999999},
-             ArrayUtils.toPrimitive(new Float[] {Float.valueOf(Float.MIN_VALUE), 
-                 Float.valueOf(Float.MAX_VALUE), Float.valueOf(9999999)}))
-         );
-
-         try {
-             ArrayUtils.toPrimitive(new Float[] {Float.valueOf(Float.MIN_VALUE), null});
-             fail();
-         } catch (final NullPointerException ex) {}
-     }
-
-     @Test
-     public void testToPrimitive_float_float() {
-         final Float[] l = null;
-         assertEquals(null, ArrayUtils.toPrimitive(l, Float.MIN_VALUE));
-         
-         assertSame(ArrayUtils.EMPTY_FLOAT_ARRAY, 
-         ArrayUtils.toPrimitive(new Float[0], 1));
-         
-         assertTrue(Arrays.equals(
-             new float[] {Float.MIN_VALUE, Float.MAX_VALUE, 9999999},
-             ArrayUtils.toPrimitive(new Float[] {Float.valueOf(Float.MIN_VALUE), 
-                 Float.valueOf(Float.MAX_VALUE), Float.valueOf(9999999)},1)));
-         
-         assertTrue(Arrays.equals(
-             new float[] {Float.MIN_VALUE, Float.MAX_VALUE, 9999999},
-             ArrayUtils.toPrimitive(new Float[] {Float.valueOf(Float.MIN_VALUE), 
-                 null, Float.valueOf(9999999)}, Float.MAX_VALUE))
-         );
-     }
-     
-    @Test
-    public void testToObject_float() {
-        final float[] b = null;
-        assertArrayEquals(null, ArrayUtils.toObject(b));
-    
-        assertSame(
-            ArrayUtils.EMPTY_FLOAT_OBJECT_ARRAY,
-            ArrayUtils.toObject(new float[0]));
-    
-        assertTrue(
-            Arrays.equals(
-                new Float[] {
-                    Float.valueOf(Float.MIN_VALUE),
-                    Float.valueOf(Float.MAX_VALUE),
-                    Float.valueOf(9999999)},
-            ArrayUtils.toObject(
-                new float[] { Float.MIN_VALUE, Float.MAX_VALUE, 9999999 })));
-    }
-
-    //  testToPrimitive/Object for double
-    //  -----------------------------------------------------------------------
-     @Test
-     public void testToPrimitive_double() {
-         final Double[] b = null;
-         assertEquals(null, ArrayUtils.toPrimitive(b));
-         
-         assertSame(ArrayUtils.EMPTY_DOUBLE_ARRAY, 
-            ArrayUtils.toPrimitive(new Double[0]));
-         
-         assertTrue(Arrays.equals(
-             new double[] {Double.MIN_VALUE, Double.MAX_VALUE, 9999999},
-             ArrayUtils.toPrimitive(new Double[] {Double.valueOf(Double.MIN_VALUE), 
-                 Double.valueOf(Double.MAX_VALUE), Double.valueOf(9999999)}))
-         );
-
-         try {
-             ArrayUtils.toPrimitive(new Float[] {Float.valueOf(Float.MIN_VALUE), null});
-             fail();
-         } catch (final NullPointerException ex) {}
-     }
-
-     @Test
-     public void testToPrimitive_double_double() {
-         final Double[] l = null;
-         assertEquals(null, ArrayUtils.toPrimitive(l, Double.MIN_VALUE));
-         
-         assertSame(ArrayUtils.EMPTY_DOUBLE_ARRAY, 
-         ArrayUtils.toPrimitive(new Double[0], 1));
-         
-         assertTrue(Arrays.equals(
-             new double[] {Double.MIN_VALUE, Double.MAX_VALUE, 9999999},
-             ArrayUtils.toPrimitive(new Double[] {Double.valueOf(Double.MIN_VALUE), 
-                 Double.valueOf(Double.MAX_VALUE), Double.valueOf(9999999)},1)));
-         
-         assertTrue(Arrays.equals(
-             new double[] {Double.MIN_VALUE, Double.MAX_VALUE, 9999999},
-             ArrayUtils.toPrimitive(new Double[] {Double.valueOf(Double.MIN_VALUE), 
-                 null, Double.valueOf(9999999)}, Double.MAX_VALUE))
-         );
-     }
-     
-    @Test
-    public void testToObject_double() {
-        final double[] b = null;
-        assertArrayEquals(null, ArrayUtils.toObject(b));
-    
-        assertSame(
-            ArrayUtils.EMPTY_DOUBLE_OBJECT_ARRAY,
-            ArrayUtils.toObject(new double[0]));
-    
-        assertTrue(
-            Arrays.equals(
-                new Double[] {
-                    Double.valueOf(Double.MIN_VALUE),
-                    Double.valueOf(Double.MAX_VALUE),
-                    Double.valueOf(9999999)},
-            ArrayUtils.toObject(
-                new double[] { Double.MIN_VALUE, Double.MAX_VALUE, 9999999 })));
-    }
-
-    //-----------------------------------------------------------------------
-    /**
-     * Test for {@link ArrayUtils#isEmpty(java.lang.Object[])}.
-     */
-    @Test
-    public void testIsEmptyObject() {
-        final Object[] emptyArray = new Object[] {};
-        final Object[] notEmptyArray = new Object[] { new String("Value") };
-        assertTrue(ArrayUtils.isEmpty((Object[])null));
-        assertTrue(ArrayUtils.isEmpty(emptyArray));
-        assertFalse(ArrayUtils.isEmpty(notEmptyArray));
-    }
-
-    /**
-     * Tests for {@link ArrayUtils#isEmpty(long[])},
-     * {@link ArrayUtils#isEmpty(int[])},
-     * {@link ArrayUtils#isEmpty(short[])},
-     * {@link ArrayUtils#isEmpty(char[])},
-     * {@link ArrayUtils#isEmpty(byte[])},
-     * {@link ArrayUtils#isEmpty(double[])},
-     * {@link ArrayUtils#isEmpty(float[])} and
-     * {@link ArrayUtils#isEmpty(boolean[])}.
-     */
-    @Test
-    public void testIsEmptyPrimitives() {
-        final long[] emptyLongArray = new long[] {};
-        final long[] notEmptyLongArray = new long[] { 1L };
-        assertTrue(ArrayUtils.isEmpty((long[])null));
-        assertTrue(ArrayUtils.isEmpty(emptyLongArray));
-        assertFalse(ArrayUtils.isEmpty(notEmptyLongArray));
-
-        final int[] emptyIntArray = new int[] {};
-        final int[] notEmptyIntArray = new int[] { 1 };
-        assertTrue(ArrayUtils.isEmpty((int[])null));
-        assertTrue(ArrayUtils.isEmpty(emptyIntArray));
-        assertFalse(ArrayUtils.isEmpty(notEmptyIntArray));
-
-        final short[] emptyShortArray = new short[] {};
-        final short[] notEmptyShortArray = new short[] { 1 };
-        assertTrue(ArrayUtils.isEmpty((short[])null));
-        assertTrue(ArrayUtils.isEmpty(emptyShortArray));
-        assertFalse(ArrayUtils.isEmpty(notEmptyShortArray));
-
-        final char[] emptyCharArray = new char[] {};
-        final char[] notEmptyCharArray = new char[] { 1 };
-        assertTrue(ArrayUtils.isEmpty((char[])null));
-        assertTrue(ArrayUtils.isEmpty(emptyCharArray));
-        assertFalse(ArrayUtils.isEmpty(notEmptyCharArray));
-
-        final byte[] emptyByteArray = new byte[] {};
-        final byte[] notEmptyByteArray = new byte[] { 1 };
-        assertTrue(ArrayUtils.isEmpty((byte[])null));
-        assertTrue(ArrayUtils.isEmpty(emptyByteArray));
-        assertFalse(ArrayUtils.isEmpty(notEmptyByteArray));
-
-        final double[] emptyDoubleArray = new double[] {};
-        final double[] notEmptyDoubleArray = new double[] { 1.0 };
-        assertTrue(ArrayUtils.isEmpty((double[])null));
-        assertTrue(ArrayUtils.isEmpty(emptyDoubleArray));
-        assertFalse(ArrayUtils.isEmpty(notEmptyDoubleArray));
-
-        final float[] emptyFloatArray = new float[] {};
-        final float[] notEmptyFloatArray = new float[] { 1.0F };
-        assertTrue(ArrayUtils.isEmpty((float[])null));
-        assertTrue(ArrayUtils.isEmpty(emptyFloatArray));
-        assertFalse(ArrayUtils.isEmpty(notEmptyFloatArray));
-
-        final boolean[] emptyBooleanArray = new boolean[] {};
-        final boolean[] notEmptyBooleanArray = new boolean[] { true };
-        assertTrue(ArrayUtils.isEmpty((boolean[])null));
-        assertTrue(ArrayUtils.isEmpty(emptyBooleanArray));
-        assertFalse(ArrayUtils.isEmpty(notEmptyBooleanArray));
-    }
-    
-   /**
-     * Test for {@link ArrayUtils#isNotEmpty(java.lang.Object[])}.
-     */
-    @Test
-    public void testIsNotEmptyObject() {
-        final Object[] emptyArray = new Object[] {};
-        final Object[] notEmptyArray = new Object[] { new String("Value") };
-        assertFalse(ArrayUtils.isNotEmpty((Object[])null));
-        assertFalse(ArrayUtils.isNotEmpty(emptyArray));
-        assertTrue(ArrayUtils.isNotEmpty(notEmptyArray));
-    }
-
-   /**
-     * Tests for {@link ArrayUtils#isNotEmpty(long[])},
-     * {@link ArrayUtils#isNotEmpty(int[])},
-     * {@link ArrayUtils#isNotEmpty(short[])},
-     * {@link ArrayUtils#isNotEmpty(char[])},
-     * {@link ArrayUtils#isNotEmpty(byte[])},
-     * {@link ArrayUtils#isNotEmpty(double[])},
-     * {@link ArrayUtils#isNotEmpty(float[])} and
-     * {@link ArrayUtils#isNotEmpty(boolean[])}.
-     */
-    @Test
-    public void testIsNotEmptyPrimitives() {
-        final long[] emptyLongArray = new long[] {};
-        final long[] notEmptyLongArray = new long[] { 1L };
-        assertFalse(ArrayUtils.isNotEmpty((long[])null));
-        assertFalse(ArrayUtils.isNotEmpty(emptyLongArray));
-        assertTrue(ArrayUtils.isNotEmpty(notEmptyLongArray));
-
-        final int[] emptyIntArray = new int[] {};
-        final int[] notEmptyIntArray = new int[] { 1 };
-        assertFalse(ArrayUtils.isNotEmpty((int[])null));
-        assertFalse(ArrayUtils.isNotEmpty(emptyIntArray));
-        assertTrue(ArrayUtils.isNotEmpty(notEmptyIntArray));
-
-        final short[] emptyShortArray = new short[] {};
-        final short[] notEmptyShortArray = new short[] { 1 };
-        assertFalse(ArrayUtils.isNotEmpty((short[])null));
-        assertFalse(ArrayUtils.isNotEmpty(emptyShortArray));
-        assertTrue(ArrayUtils.isNotEmpty(notEmptyShortArray));
-
-        final char[] emptyCharArray = new char[] {};
-        final char[] notEmptyCharArray = new char[] { 1 };
-        assertFalse(ArrayUtils.isNotEmpty((char[])null));
-        assertFalse(ArrayUtils.isNotEmpty(emptyCharArray));
-        assertTrue(ArrayUtils.isNotEmpty(notEmptyCharArray));
-
-        final byte[] emptyByteArray = new byte[] {};
-        final byte[] notEmptyByteArray = new byte[] { 1 };
-        assertFalse(ArrayUtils.isNotEmpty((byte[])null));
-        assertFalse(ArrayUtils.isNotEmpty(emptyByteArray));
-        assertTrue(ArrayUtils.isNotEmpty(notEmptyByteArray));
-
-        final double[] emptyDoubleArray = new double[] {};
-        final double[] notEmptyDoubleArray = new double[] { 1.0 };
-        assertFalse(ArrayUtils.isNotEmpty((double[])null));
-        assertFalse(ArrayUtils.isNotEmpty(emptyDoubleArray));
-        assertTrue(ArrayUtils.isNotEmpty(notEmptyDoubleArray));
-
-        final float[] emptyFloatArray = new float[] {};
-        final float[] notEmptyFloatArray = new float[] { 1.0F };
-        assertFalse(ArrayUtils.isNotEmpty((float[])null));
-        assertFalse(ArrayUtils.isNotEmpty(emptyFloatArray));
-        assertTrue(ArrayUtils.isNotEmpty(notEmptyFloatArray));
-
-        final boolean[] emptyBooleanArray = new boolean[] {};
-        final boolean[] notEmptyBooleanArray = new boolean[] { true };
-        assertFalse(ArrayUtils.isNotEmpty((boolean[])null));
-        assertFalse(ArrayUtils.isNotEmpty(emptyBooleanArray));
-        assertTrue(ArrayUtils.isNotEmpty(notEmptyBooleanArray));
-    }
-    // ------------------------------------------------------------------------
-    @Test
-    public void testGetLength() {
-        assertEquals(0, ArrayUtils.getLength(null));
-        
-        final Object[] emptyObjectArray = new Object[0];
-        final Object[] notEmptyObjectArray = new Object[] {"aValue"};
-        assertEquals(0, ArrayUtils.getLength((Object[]) null));
-        assertEquals(0, ArrayUtils.getLength(emptyObjectArray));
-        assertEquals(1, ArrayUtils.getLength(notEmptyObjectArray));
- 
-        final int[] emptyIntArray = new int[] {};
-        final int[] notEmptyIntArray = new int[] { 1 };
-        assertEquals(0, ArrayUtils.getLength((int[]) null));
-        assertEquals(0, ArrayUtils.getLength(emptyIntArray));
-        assertEquals(1, ArrayUtils.getLength(notEmptyIntArray));
-
-        final short[] emptyShortArray = new short[] {};
-        final short[] notEmptyShortArray = new short[] { 1 };
-        assertEquals(0, ArrayUtils.getLength((short[]) null));
-        assertEquals(0, ArrayUtils.getLength(emptyShortArray));
-        assertEquals(1, ArrayUtils.getLength(notEmptyShortArray));
-
-        final char[] emptyCharArray = new char[] {};
-        final char[] notEmptyCharArray = new char[] { 1 };
-        assertEquals(0, ArrayUtils.getLength((char[]) null));
-        assertEquals(0, ArrayUtils.getLength(emptyCharArray));
-        assertEquals(1, ArrayUtils.getLength(notEmptyCharArray));
-
-        final byte[] emptyByteArray = new byte[] {};
-        final byte[] notEmptyByteArray = new byte[] { 1 };
-        assertEquals(0, ArrayUtils.getLength((byte[]) null));
-        assertEquals(0, ArrayUtils.getLength(emptyByteArray));
-        assertEquals(1, ArrayUtils.getLength(notEmptyByteArray));
-
-        final double[] emptyDoubleArray = new double[] {};
-        final double[] notEmptyDoubleArray = new double[] { 1.0 };
-        assertEquals(0, ArrayUtils.getLength((double[]) null));
-        assertEquals(0, ArrayUtils.getLength(emptyDoubleArray));
-        assertEquals(1, ArrayUtils.getLength(notEmptyDoubleArray));
-
-        final float[] emptyFloatArray = new float[] {};
-        final float[] notEmptyFloatArray = new float[] { 1.0F };
-        assertEquals(0, ArrayUtils.getLength((float[]) null));
-        assertEquals(0, ArrayUtils.getLength(emptyFloatArray));
-        assertEquals(1, ArrayUtils.getLength(notEmptyFloatArray));
-
-        final boolean[] emptyBooleanArray = new boolean[] {};
-        final boolean[] notEmptyBooleanArray = new boolean[] { true };
-        assertEquals(0, ArrayUtils.getLength((boolean[]) null));
-        assertEquals(0, ArrayUtils.getLength(emptyBooleanArray));
-        assertEquals(1, ArrayUtils.getLength(notEmptyBooleanArray));
-        
-        try {
-            ArrayUtils.getLength("notAnArray");
-            fail("IllegalArgumentException should have been thrown");
-        } catch (final IllegalArgumentException e) {}
-    }
-
-    @Test
-    public void testIsSorted() {
-        Integer[] array = null;
-        assertTrue(ArrayUtils.isSorted(array));
-
-        array = new Integer[]{1};
-        assertTrue(ArrayUtils.isSorted(array));
-
-        array = new Integer[]{1,2,3};
-        assertTrue(ArrayUtils.isSorted(array));
-
-        array = new Integer[]{1,3,2};
-        assertFalse(ArrayUtils.isSorted(array));
-    }
-
-    @Test
-    public void testIsSortedComparator() {
-        Comparator<Integer> c = new Comparator<Integer>() {
-                public int compare(Integer o1, Integer o2) {
-                        return o2.compareTo(o1);
-                    }
-            };
-
-        Integer[] array = null;
-        assertTrue(ArrayUtils.isSorted(array, c));
-
-        array = new Integer[]{1};
-        assertTrue(ArrayUtils.isSorted(array, c));
-
-        array = new Integer[]{3,2,1};
-        assertTrue(ArrayUtils.isSorted(array, c));
-
-        array = new Integer[]{1,3,2};
-        assertFalse(ArrayUtils.isSorted(array, c));
-    }
-    
-    @Test(expected = IllegalArgumentException.class)
-    public void testIsSortedNullComparator() throws Exception {
-        ArrayUtils.isSorted(null, null);
-    }
-
-    @Test
-    public void testIsSortedInt() {
-        int[] array = null;
-        assertTrue(ArrayUtils.isSorted(array));
-
-        array = new int[]{1};
-        assertTrue(ArrayUtils.isSorted(array));
-
-        array = new int[]{1,2,3};
-        assertTrue(ArrayUtils.isSorted(array));
-
-        array = new int[]{1,3,2};
-        assertFalse(ArrayUtils.isSorted(array));
-    }
-
-    @Test
-    public void testIsSortedFloat() {
-        float[] array = null;
-        assertTrue(ArrayUtils.isSorted(array));
-
-        array = new float[]{0f};
-        assertTrue(ArrayUtils.isSorted(array));
-
-        array = new float[]{-1f, 0f, 0.1f, 0.2f};
-        assertTrue(ArrayUtils.isSorted(array));
-
-        array = new float[]{-1f, 0.2f, 0.1f, 0f};
-        assertFalse(ArrayUtils.isSorted(array));
-    }
-
-    @Test
-    public void testIsSortedLong() {
-        long[] array = null;
-        assertTrue(ArrayUtils.isSorted(array));
-
-        array = new long[]{0L};
-        assertTrue(ArrayUtils.isSorted(array));
-
-        array = new long[]{-1L, 0L, 1L};
-        assertTrue(ArrayUtils.isSorted(array));
-
-        array = new long[]{-1L, 1L, 0L};
-        assertFalse(ArrayUtils.isSorted(array));
-    }
-
-    @Test
-    public void testIsSortedDouble() {
-        double[] array = null;
-        assertTrue(ArrayUtils.isSorted(array));
-
-        array = new double[]{0.0};
-        assertTrue(ArrayUtils.isSorted(array));
-
-        array = new double[]{-1.0, 0.0, 0.1, 0.2};
-        assertTrue(ArrayUtils.isSorted(array));
-
-        array = new double[]{-1.0, 0.2, 0.1, 0.0};
-        assertFalse(ArrayUtils.isSorted(array));
-    }
-
-    @Test
-    public void testIsSortedChar() {
-        char[] array = null;
-        assertTrue(ArrayUtils.isSorted(array));
-
-        array = new char[]{'a'};
-        assertTrue(ArrayUtils.isSorted(array));
-
-        array = new char[]{'a', 'b', 'c'};
-        assertTrue(ArrayUtils.isSorted(array));
-
-        array = new char[]{'a', 'c', 'b'};
-        assertFalse(ArrayUtils.isSorted(array));
-    }
-
-    @Test
-    public void testIsSortedByte() {
-        byte[] array = null;
-        assertTrue(ArrayUtils.isSorted(array));
-
-        array = new byte[]{0x10};
-        assertTrue(ArrayUtils.isSorted(array));
-
-        array = new byte[]{0x10, 0x20, 0x30};
-        assertTrue(ArrayUtils.isSorted(array));
-
-        array = new byte[]{0x10, 0x30, 0x20};
-        assertFalse(ArrayUtils.isSorted(array));
-    }
-
-    @Test
-    public void testIsSortedShort() {
-        short[] array = null;
-        assertTrue(ArrayUtils.isSorted(array));
-
-        array = new short[]{0};
-        assertTrue(ArrayUtils.isSorted(array));
-
-        array = new short[]{-1, 0, 1};
-        assertTrue(ArrayUtils.isSorted(array));
-
-        array = new short[]{-1, 1, 0};
-        assertFalse(ArrayUtils.isSorted(array));
-    }
-
-    @Test
-    public void testIsSortedBool() {
-        boolean[] array = null;
-        assertTrue(ArrayUtils.isSorted(array));
-
-        array = new boolean[]{true};
-        assertTrue(ArrayUtils.isSorted(array));
-
-        array = new boolean[]{false, true};
-        assertTrue(ArrayUtils.isSorted(array));
-
-        array = new boolean[]{true, false};
-        assertFalse(ArrayUtils.isSorted(array));
-    }
-
-}
diff --git a/lang/src/test/java/org/apache/commons/lang3/BitFieldTest.java b/lang/src/test/java/org/apache/commons/lang3/BitFieldTest.java
deleted file mode 100644
index dd71abd..0000000
--- a/lang/src/test/java/org/apache/commons/lang3/BitFieldTest.java
+++ /dev/null
@@ -1,261 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- * 
- *      http://www.apache.org/licenses/LICENSE-2.0
- * 
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.commons.lang3;
-
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertFalse;
-import static org.junit.Assert.assertTrue;
-
-import org.junit.Test;
-
-/**
- * Class to test BitField functionality
- *
- * @version $Id$
- */
-public class BitFieldTest  {
-
-    private static final BitField bf_multi  = new BitField(0x3F80);
-    private static final BitField bf_single = new BitField(0x4000);
-    private static final BitField bf_zero = new BitField(0);
-
-    /**
-     * test the getValue() method
-     */
-    @Test
-    public void testGetValue() {
-        assertEquals(bf_multi.getValue(-1), 127);
-        assertEquals(bf_multi.getValue(0), 0);
-        assertEquals(bf_single.getValue(-1), 1);
-        assertEquals(bf_single.getValue(0), 0);
-        assertEquals(bf_zero.getValue(-1), 0);
-        assertEquals(bf_zero.getValue(0), 0);
-    }
-
-    /**
-     * test the getShortValue() method
-     */
-    @Test
-    public void testGetShortValue() {
-        assertEquals(bf_multi.getShortValue((short) - 1), (short) 127);
-        assertEquals(bf_multi.getShortValue((short) 0), (short) 0);
-        assertEquals(bf_single.getShortValue((short) - 1), (short) 1);
-        assertEquals(bf_single.getShortValue((short) 0), (short) 0);
-        assertEquals(bf_zero.getShortValue((short) -1), (short) 0);
-        assertEquals(bf_zero.getShortValue((short) 0), (short) 0);
-    }
-
-    /**
-     * test the getRawValue() method
-     */
-    @Test
-    public void testGetRawValue() {
-        assertEquals(bf_multi.getRawValue(-1), 0x3F80);
-        assertEquals(bf_multi.getRawValue(0), 0);
-        assertEquals(bf_single.getRawValue(-1), 0x4000);
-        assertEquals(bf_single.getRawValue(0), 0);
-        assertEquals(bf_zero.getRawValue(-1), 0);
-        assertEquals(bf_zero.getRawValue(0), 0);
-    }
-
-    /**
-     * test the getShortRawValue() method
-     */
-    @Test
-    public void testGetShortRawValue() {
-        assertEquals(bf_multi.getShortRawValue((short) - 1), (short) 0x3F80);
-        assertEquals(bf_multi.getShortRawValue((short) 0), (short) 0);
-        assertEquals(bf_single.getShortRawValue((short) - 1), (short) 0x4000);
-        assertEquals(bf_single.getShortRawValue((short) 0), (short) 0);
-        assertEquals(bf_zero.getShortRawValue((short) -1), (short) 0);
-        assertEquals(bf_zero.getShortRawValue((short) 0), (short) 0);
-    }
-
-    /**
-     * test the isSet() method
-     */
-    @Test
-    public void testIsSet() {
-        assertTrue(!bf_multi.isSet(0));
-        assertTrue(!bf_zero.isSet(0));
-        for (int j = 0x80; j <= 0x3F80; j += 0x80) {
-            assertTrue(bf_multi.isSet(j));
-        }
-        for (int j = 0x80; j <= 0x3F80; j += 0x80) {
-            assertTrue(!bf_zero.isSet(j));
-        }
-        assertTrue(!bf_single.isSet(0));
-        assertTrue(bf_single.isSet(0x4000));
-    }
-
-    /**
-     * test the isAllSet() method
-     */
-    @Test
-    public void testIsAllSet() {
-        for (int j = 0; j < 0x3F80; j += 0x80) {
-            assertTrue(!bf_multi.isAllSet(j));
-            assertTrue(bf_zero.isAllSet(j));
-        }
-        assertTrue(bf_multi.isAllSet(0x3F80));
-        assertTrue(!bf_single.isAllSet(0));
-        assertTrue(bf_single.isAllSet(0x4000));
-    }
-
-    /**
-     * test the setValue() method
-     */
-    @Test
-    public void testSetValue() {
-        for (int j = 0; j < 128; j++) {
-            assertEquals(bf_multi.getValue(bf_multi.setValue(0, j)), j);
-            assertEquals(bf_multi.setValue(0, j), j << 7);
-        }
-        for (int j = 0; j < 128; j++) {
-          assertEquals(bf_zero.getValue(bf_zero.setValue(0, j)), 0);
-          assertEquals(bf_zero.setValue(0, j), 0);
-      }
-
-        // verify that excess bits are stripped off
-        assertEquals(bf_multi.setValue(0x3f80, 128), 0);
-        for (int j = 0; j < 2; j++) {
-            assertEquals(bf_single.getValue(bf_single.setValue(0, j)), j);
-            assertEquals(bf_single.setValue(0, j), j << 14);
-        }
-
-        // verify that excess bits are stripped off
-        assertEquals(bf_single.setValue(0x4000, 2), 0);
-    }
-
-    /**
-     * test the setShortValue() method
-     */
-    @Test
-    public void testSetShortValue() {
-        for (int j = 0; j < 128; j++) {
-            assertEquals(bf_multi.getShortValue(bf_multi.setShortValue((short) 0, (short) j)), (short) j);
-            assertEquals(bf_multi.setShortValue((short) 0, (short) j), (short) (j << 7));
-        }
-        for (int j = 0; j < 128; j++) {
-            assertEquals(bf_zero.getShortValue(bf_zero.setShortValue((short) 0, (short) j)), (short) 0);
-            assertEquals(bf_zero.setShortValue((short) 0, (short) j), (short) 0);
-        }
-
-        // verify that excess bits are stripped off
-        assertEquals(bf_multi.setShortValue((short) 0x3f80, (short) 128), (short) 0);
-        for (int j = 0; j < 2; j++) {
-            assertEquals(bf_single.getShortValue(bf_single.setShortValue((short) 0, (short) j)), (short) j);
-            assertEquals(bf_single.setShortValue((short) 0, (short) j), (short) (j << 14));
-        }
-
-        // verify that excess bits are stripped off
-        assertEquals(bf_single.setShortValue((short) 0x4000, (short) 2), (short) 0);
-    }
-
-    @Test
-    public void testByte() {
-        assertEquals(0, new BitField(0).setByteBoolean((byte) 0, true));
-        assertEquals(1, new BitField(1).setByteBoolean((byte) 0, true));
-        assertEquals(2, new BitField(2).setByteBoolean((byte) 0, true));
-        assertEquals(4, new BitField(4).setByteBoolean((byte) 0, true));
-        assertEquals(8, new BitField(8).setByteBoolean((byte) 0, true));
-        assertEquals(16, new BitField(16).setByteBoolean((byte) 0, true));
-        assertEquals(32, new BitField(32).setByteBoolean((byte) 0, true));
-        assertEquals(64, new BitField(64).setByteBoolean((byte) 0, true));
-        assertEquals(-128, new BitField(128).setByteBoolean((byte) 0, true));
-        assertEquals(1, new BitField(0).setByteBoolean((byte) 1, false));
-        assertEquals(0, new BitField(1).setByteBoolean((byte) 1, false));
-        assertEquals(0, new BitField(2).setByteBoolean((byte) 2, false));
-        assertEquals(0, new BitField(4).setByteBoolean((byte) 4, false));
-        assertEquals(0, new BitField(8).setByteBoolean((byte) 8, false));
-        assertEquals(0, new BitField(16).setByteBoolean((byte) 16, false));
-        assertEquals(0, new BitField(32).setByteBoolean((byte) 32, false));
-        assertEquals(0, new BitField(64).setByteBoolean((byte) 64, false));
-        assertEquals(0, new BitField(128).setByteBoolean((byte) 128, false));
-        assertEquals(-2, new BitField(1).setByteBoolean((byte) 255, false));
-        final byte clearedBit = new BitField(0x40).setByteBoolean((byte) - 63, false);
-
-        assertFalse(new BitField(0x40).isSet(clearedBit));
-    }
-
-    /**
-     * test the clear() method
-     */
-    @Test
-    public void testClear() {
-        assertEquals(bf_multi.clear(-1), 0xFFFFC07F);
-        assertEquals(bf_single.clear(-1), 0xFFFFBFFF);
-        assertEquals(bf_zero.clear(-1), 0xFFFFFFFF);
-    }
-
-    /**
-     * test the clearShort() method
-     */
-    @Test
-    public void testClearShort() {
-        assertEquals(bf_multi.clearShort((short) - 1), (short) 0xC07F);
-        assertEquals(bf_single.clearShort((short) - 1), (short) 0xBFFF);
-        assertEquals(bf_zero.clearShort((short) -1), (short) 0xFFFF);
-    }
-
-    /**
-     * test the set() method
-     */
-    @Test
-    public void testSet() {
-        assertEquals(bf_multi.set(0), 0x3F80);
-        assertEquals(bf_single.set(0), 0x4000);
-        assertEquals(bf_zero.set(0), 0);
-    }
-
-    /**
-     * test the setShort() method
-     */
-    @Test
-    public void testSetShort() {
-        assertEquals(bf_multi.setShort((short) 0), (short) 0x3F80);
-        assertEquals(bf_single.setShort((short) 0), (short) 0x4000);
-        assertEquals(bf_zero.setShort((short) 0), (short) 0);
-    }
-
-    /**
-     * test the setBoolean() method
-     */
-    @Test
-    public void testSetBoolean() {
-        assertEquals(bf_multi.set(0), bf_multi.setBoolean(0, true));
-        assertEquals(bf_single.set(0), bf_single.setBoolean(0, true));
-        assertEquals(bf_zero.set(0), bf_zero.setBoolean(0, true));
-        assertEquals(bf_multi.clear(-1), bf_multi.setBoolean(-1, false));
-        assertEquals(bf_single.clear(-1), bf_single.setBoolean(-1, false));
-        assertEquals(bf_zero.clear(-1), bf_zero.setBoolean(-1, false));
-    }
-
-    /**
-     * test the setShortBoolean() method
-     */
-    @Test
-    public void testSetShortBoolean() {
-        assertEquals(bf_multi.setShort((short) 0), bf_multi.setShortBoolean((short) 0, true));
-        assertEquals(bf_single.setShort((short) 0), bf_single.setShortBoolean((short) 0, true));
-        assertEquals(bf_zero.setShort((short) 0), bf_zero.setShortBoolean((short) 0, true));
-        assertEquals(bf_multi.clearShort((short) - 1), bf_multi.setShortBoolean((short) - 1, false));
-        assertEquals(bf_single.clearShort((short) - 1), bf_single.setShortBoolean((short) - 1, false));
-        assertEquals(bf_zero.clearShort((short) -1), bf_zero.setShortBoolean((short) -1, false));
-    }
-
-}
diff --git a/lang/src/test/java/org/apache/commons/lang3/BooleanUtilsTest.java b/lang/src/test/java/org/apache/commons/lang3/BooleanUtilsTest.java
deleted file mode 100644
index d3464b7..0000000
--- a/lang/src/test/java/org/apache/commons/lang3/BooleanUtilsTest.java
+++ /dev/null
@@ -1,1018 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- * 
- *      http://www.apache.org/licenses/LICENSE-2.0
- * 
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.commons.lang3;
-
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertFalse;
-import static org.junit.Assert.assertNotNull;
-import static org.junit.Assert.assertSame;
-import static org.junit.Assert.assertTrue;
-
-import java.lang.reflect.Constructor;
-import java.lang.reflect.Modifier;
-
-import org.junit.Test;
-
-/**
- * Unit tests {@link org.apache.commons.lang3.BooleanUtils}.
- *
- * @version $Id$
- */
-public class BooleanUtilsTest {
-
-    //-----------------------------------------------------------------------
-    @Test
-    public void testConstructor() {
-        assertNotNull(new BooleanUtils());
-        final Constructor<?>[] cons = BooleanUtils.class.getDeclaredConstructors();
-        assertEquals(1, cons.length);
-        assertTrue(Modifier.isPublic(cons[0].getModifiers()));
-        assertTrue(Modifier.isPublic(BooleanUtils.class.getModifiers()));
-        assertFalse(Modifier.isFinal(BooleanUtils.class.getModifiers()));
-    }
-    
-    //-----------------------------------------------------------------------
-    @Test
-    public void test_negate_Boolean() {
-        assertSame(null, BooleanUtils.negate(null));
-        assertSame(Boolean.TRUE, BooleanUtils.negate(Boolean.FALSE));
-        assertSame(Boolean.FALSE, BooleanUtils.negate(Boolean.TRUE));
-    }
-
-    //-----------------------------------------------------------------------
-    @Test
-    public void test_isTrue_Boolean() {
-        assertTrue(BooleanUtils.isTrue(Boolean.TRUE));
-        assertFalse(BooleanUtils.isTrue(Boolean.FALSE));
-        assertFalse(BooleanUtils.isTrue((Boolean) null));
-    }
-
-    @Test
-    public void test_isNotTrue_Boolean() {
-        assertFalse(BooleanUtils.isNotTrue(Boolean.TRUE));
-        assertTrue(BooleanUtils.isNotTrue(Boolean.FALSE));
-        assertTrue(BooleanUtils.isNotTrue((Boolean) null));
-    }
-
-    //-----------------------------------------------------------------------
-    @Test
-    public void test_isFalse_Boolean() {
-        assertFalse(BooleanUtils.isFalse(Boolean.TRUE));
-        assertTrue(BooleanUtils.isFalse(Boolean.FALSE));
-        assertFalse(BooleanUtils.isFalse((Boolean) null));
-    }
-
-    @Test
-    public void test_isNotFalse_Boolean() {
-        assertTrue(BooleanUtils.isNotFalse(Boolean.TRUE));
-        assertFalse(BooleanUtils.isNotFalse(Boolean.FALSE));
-        assertTrue(BooleanUtils.isNotFalse((Boolean) null));
-    }
-
-    //-----------------------------------------------------------------------
-    @Test
-    public void test_toBoolean_Boolean() {
-        assertTrue(BooleanUtils.toBoolean(Boolean.TRUE));
-        assertFalse(BooleanUtils.toBoolean(Boolean.FALSE));
-        assertFalse(BooleanUtils.toBoolean((Boolean) null));
-    }
-
-    @Test
-    public void test_toBooleanDefaultIfNull_Boolean_boolean() {
-        assertTrue(BooleanUtils.toBooleanDefaultIfNull(Boolean.TRUE, true));
-        assertTrue(BooleanUtils.toBooleanDefaultIfNull(Boolean.TRUE, false));
-        assertFalse(BooleanUtils.toBooleanDefaultIfNull(Boolean.FALSE, true));
-        assertFalse(BooleanUtils.toBooleanDefaultIfNull(Boolean.FALSE, false));
-        assertTrue(BooleanUtils.toBooleanDefaultIfNull((Boolean) null, true));
-        assertFalse(BooleanUtils.toBooleanDefaultIfNull((Boolean) null, false));
-    }
-
-    //-----------------------------------------------------------------------
-    //-----------------------------------------------------------------------
-    @Test
-    public void test_toBoolean_int() {
-        assertTrue(BooleanUtils.toBoolean(1));
-        assertTrue(BooleanUtils.toBoolean(-1));
-        assertFalse(BooleanUtils.toBoolean(0));
-    }
-    
-    @Test
-    public void test_toBooleanObject_int() {
-        assertEquals(Boolean.TRUE, BooleanUtils.toBooleanObject(1));
-        assertEquals(Boolean.TRUE, BooleanUtils.toBooleanObject(-1));
-        assertEquals(Boolean.FALSE, BooleanUtils.toBooleanObject(0));
-    }
-    
-    @Test
-    public void test_toBooleanObject_Integer() {
-        assertEquals(Boolean.TRUE, BooleanUtils.toBooleanObject(Integer.valueOf(1)));
-        assertEquals(Boolean.TRUE, BooleanUtils.toBooleanObject(Integer.valueOf(-1)));
-        assertEquals(Boolean.FALSE, BooleanUtils.toBooleanObject(Integer.valueOf(0)));
-        assertEquals(null, BooleanUtils.toBooleanObject((Integer) null));
-    }
-    
-    //-----------------------------------------------------------------------
-    @Test
-    public void test_toBoolean_int_int_int() {
-        assertTrue(BooleanUtils.toBoolean(6, 6, 7));
-        assertFalse(BooleanUtils.toBoolean(7, 6, 7));
-    }
-
-    @Test(expected = IllegalArgumentException.class)
-    public void test_toBoolean_int_int_int_noMatch() {
-        BooleanUtils.toBoolean(8, 6, 7);
-    }
-    
-    @Test
-    public void test_toBoolean_Integer_Integer_Integer() {
-        final Integer six = Integer.valueOf(6);
-        final Integer seven = Integer.valueOf(7);
-
-        assertTrue(BooleanUtils.toBoolean((Integer) null, null, seven));
-        assertFalse(BooleanUtils.toBoolean((Integer) null, six, null));
-
-        assertTrue(BooleanUtils.toBoolean(Integer.valueOf(6), six, seven));
-        assertFalse(BooleanUtils.toBoolean(Integer.valueOf(7), six, seven));
-    }
-
-    @Test(expected = IllegalArgumentException.class)
-    public void test_toBoolean_Integer_Integer_Integer_nullValue() {
-        BooleanUtils.toBoolean(null, Integer.valueOf(6), Integer.valueOf(7));
-    }
-
-    @Test(expected = IllegalArgumentException.class)
-    public void test_toBoolean_Integer_Integer_Integer_noMatch() {
-        BooleanUtils.toBoolean(Integer.valueOf(8), Integer.valueOf(6), Integer.valueOf(7));
-    }
-    
-    //-----------------------------------------------------------------------
-    @Test
-    public void test_toBooleanObject_int_int_int() {
-        assertEquals(Boolean.TRUE, BooleanUtils.toBooleanObject(6, 6, 7, 8));
-        assertEquals(Boolean.FALSE, BooleanUtils.toBooleanObject(7, 6, 7, 8));
-        assertEquals(null, BooleanUtils.toBooleanObject(8, 6, 7, 8));
-    }
-
-    @Test(expected = IllegalArgumentException.class)
-    public void test_toBooleanObject_int_int_int_noMatch() {
-        BooleanUtils.toBooleanObject(9, 6, 7, 8);
-    }
-    
-    @Test
-    public void test_toBooleanObject_Integer_Integer_Integer_Integer() {
-        final Integer six = Integer.valueOf(6);
-        final Integer seven = Integer.valueOf(7);
-        final Integer eight = Integer.valueOf(8);
-
-        assertSame(Boolean.TRUE, BooleanUtils.toBooleanObject((Integer) null, null, seven, eight));
-        assertSame(Boolean.FALSE, BooleanUtils.toBooleanObject((Integer) null, six, null, eight));
-        assertSame(null, BooleanUtils.toBooleanObject((Integer) null, six, seven, null));
-
-        assertEquals(Boolean.TRUE, BooleanUtils.toBooleanObject(Integer.valueOf(6), six, seven, eight));
-        assertEquals(Boolean.FALSE, BooleanUtils.toBooleanObject(Integer.valueOf(7), six, seven, eight));
-        assertEquals(null, BooleanUtils.toBooleanObject(Integer.valueOf(8), six, seven, eight));
-    }
-
-    @Test(expected = IllegalArgumentException.class)
-    public void test_toBooleanObject_Integer_Integer_Integer_Integer_nullValue() {
-        BooleanUtils.toBooleanObject(null, Integer.valueOf(6), Integer.valueOf(7), Integer.valueOf(8));
-    }
-
-    @Test(expected = IllegalArgumentException.class)
-    public void test_toBooleanObject_Integer_Integer_Integer_Integer_noMatch() {
-        BooleanUtils.toBooleanObject(Integer.valueOf(9), Integer.valueOf(6), Integer.valueOf(7), Integer.valueOf(8));
-    }
-
-    //-----------------------------------------------------------------------
-    @Test
-    public void test_toInteger_boolean() {
-        assertEquals(1, BooleanUtils.toInteger(true));
-        assertEquals(0, BooleanUtils.toInteger(false));
-    }
-    
-    @Test
-    public void test_toIntegerObject_boolean() {
-        assertEquals(Integer.valueOf(1), BooleanUtils.toIntegerObject(true));
-        assertEquals(Integer.valueOf(0), BooleanUtils.toIntegerObject(false));
-    }
-    
-    @Test
-    public void test_toIntegerObject_Boolean() {
-        assertEquals(Integer.valueOf(1), BooleanUtils.toIntegerObject(Boolean.TRUE));
-        assertEquals(Integer.valueOf(0), BooleanUtils.toIntegerObject(Boolean.FALSE));
-        assertEquals(null, BooleanUtils.toIntegerObject((Boolean) null));
-    }
-    
-    //-----------------------------------------------------------------------
-    @Test
-    public void test_toInteger_boolean_int_int() {
-        assertEquals(6, BooleanUtils.toInteger(true, 6, 7));
-        assertEquals(7, BooleanUtils.toInteger(false, 6, 7));
-    }
-    
-    @Test
-    public void test_toInteger_Boolean_int_int_int() {
-        assertEquals(6, BooleanUtils.toInteger(Boolean.TRUE, 6, 7, 8));
-        assertEquals(7, BooleanUtils.toInteger(Boolean.FALSE, 6, 7, 8));
-        assertEquals(8, BooleanUtils.toInteger(null, 6, 7, 8));
-    }
-    
-    @Test
-    public void test_toIntegerObject_boolean_Integer_Integer() {
-        final Integer six = Integer.valueOf(6);
-        final Integer seven = Integer.valueOf(7);
-        assertEquals(six, BooleanUtils.toIntegerObject(true, six, seven));
-        assertEquals(seven, BooleanUtils.toIntegerObject(false, six, seven));
-    }
-    
-    @Test
-    public void test_toIntegerObject_Boolean_Integer_Integer_Integer() {
-        final Integer six = Integer.valueOf(6);
-        final Integer seven = Integer.valueOf(7);
-        final Integer eight = Integer.valueOf(8);
-        assertEquals(six, BooleanUtils.toIntegerObject(Boolean.TRUE, six, seven, eight));
-        assertEquals(seven, BooleanUtils.toIntegerObject(Boolean.FALSE, six, seven, eight));
-        assertEquals(eight, BooleanUtils.toIntegerObject((Boolean) null, six, seven, eight));
-        assertEquals(null, BooleanUtils.toIntegerObject((Boolean) null, six, seven, null));
-    }
-    
-    //-----------------------------------------------------------------------
-    //-----------------------------------------------------------------------
-    @Test
-    public void test_toBooleanObject_String() {
-        assertEquals(null, BooleanUtils.toBooleanObject((String) null));
-        assertEquals(null, BooleanUtils.toBooleanObject(""));
-        assertEquals(Boolean.FALSE, BooleanUtils.toBooleanObject("false"));
-        assertEquals(Boolean.FALSE, BooleanUtils.toBooleanObject("no"));
-        assertEquals(Boolean.FALSE, BooleanUtils.toBooleanObject("off"));
-        assertEquals(Boolean.FALSE, BooleanUtils.toBooleanObject("FALSE"));
-        assertEquals(Boolean.FALSE, BooleanUtils.toBooleanObject("NO"));
-        assertEquals(Boolean.FALSE, BooleanUtils.toBooleanObject("OFF"));
-        assertEquals(null, BooleanUtils.toBooleanObject("oof"));
-        assertEquals(Boolean.TRUE, BooleanUtils.toBooleanObject("true"));
-        assertEquals(Boolean.TRUE, BooleanUtils.toBooleanObject("yes"));
-        assertEquals(Boolean.TRUE, BooleanUtils.toBooleanObject("on"));
-        assertEquals(Boolean.TRUE, BooleanUtils.toBooleanObject("TRUE"));
-        assertEquals(Boolean.TRUE, BooleanUtils.toBooleanObject("ON"));
-        assertEquals(Boolean.TRUE, BooleanUtils.toBooleanObject("YES"));
-        assertEquals(Boolean.TRUE, BooleanUtils.toBooleanObject("TruE"));
-        assertEquals(Boolean.TRUE, BooleanUtils.toBooleanObject("TruE"));
-
-        assertEquals(Boolean.TRUE, BooleanUtils.toBooleanObject("y")); // yes
-        assertEquals(Boolean.TRUE, BooleanUtils.toBooleanObject("Y"));
-        assertEquals(Boolean.TRUE, BooleanUtils.toBooleanObject("t")); // true
-        assertEquals(Boolean.TRUE, BooleanUtils.toBooleanObject("T"));
-        assertEquals(Boolean.FALSE, BooleanUtils.toBooleanObject("f")); // false
-        assertEquals(Boolean.FALSE, BooleanUtils.toBooleanObject("F"));
-        assertEquals(Boolean.FALSE, BooleanUtils.toBooleanObject("n")); // No
-        assertEquals(Boolean.FALSE, BooleanUtils.toBooleanObject("N"));
-        assertEquals(null, BooleanUtils.toBooleanObject("z"));
-
-        assertEquals(null, BooleanUtils.toBooleanObject("ab"));
-        assertEquals(null, BooleanUtils.toBooleanObject("yoo"));
-        assertEquals(null, BooleanUtils.toBooleanObject("true "));
-        assertEquals(null, BooleanUtils.toBooleanObject("ono"));
-    }
-    
-    @Test
-    public void test_toBooleanObject_String_String_String_String() {
-        assertSame(Boolean.TRUE, BooleanUtils.toBooleanObject((String) null, null, "N", "U"));
-        assertSame(Boolean.FALSE, BooleanUtils.toBooleanObject((String) null, "Y", null, "U"));
-        assertSame(null, BooleanUtils.toBooleanObject((String) null, "Y", "N", null));
-
-        assertEquals(Boolean.TRUE, BooleanUtils.toBooleanObject("Y", "Y", "N", "U"));
-        assertEquals(Boolean.FALSE, BooleanUtils.toBooleanObject("N", "Y", "N", "U"));
-        assertEquals(null, BooleanUtils.toBooleanObject("U", "Y", "N", "U"));
-    }
-
-    @Test(expected = IllegalArgumentException.class)
-    public void test_toBooleanObject_String_String_String_String_nullValue() {
-        BooleanUtils.toBooleanObject((String) null, "Y", "N", "U");
-    }
-
-    @Test(expected = IllegalArgumentException.class)
-    public void test_toBooleanObject_String_String_String_String_noMatch() {
-        BooleanUtils.toBooleanObject("X", "Y", "N", "U");
-    }
-
-    //-----------------------------------------------------------------------
-    @Test
-    public void test_toBoolean_String() {
-        assertFalse(BooleanUtils.toBoolean((String) null));
-        assertFalse(BooleanUtils.toBoolean(""));
-        assertFalse(BooleanUtils.toBoolean("off"));
-        assertFalse(BooleanUtils.toBoolean("oof"));
-        assertFalse(BooleanUtils.toBoolean("yep"));
-        assertFalse(BooleanUtils.toBoolean("trux"));
-        assertFalse(BooleanUtils.toBoolean("false"));
-        assertFalse(BooleanUtils.toBoolean("a"));
-        assertTrue(BooleanUtils.toBoolean("true")); // interned handled differently
-        assertTrue(BooleanUtils.toBoolean(new StringBuffer("tr").append("ue").toString()));
-        assertTrue(BooleanUtils.toBoolean("truE"));
-        assertTrue(BooleanUtils.toBoolean("trUe"));
-        assertTrue(BooleanUtils.toBoolean("trUE"));
-        assertTrue(BooleanUtils.toBoolean("tRue"));
-        assertTrue(BooleanUtils.toBoolean("tRuE"));
-        assertTrue(BooleanUtils.toBoolean("tRUe"));
-        assertTrue(BooleanUtils.toBoolean("tRUE"));
-        assertTrue(BooleanUtils.toBoolean("TRUE"));
-        assertTrue(BooleanUtils.toBoolean("TRUe"));
-        assertTrue(BooleanUtils.toBoolean("TRuE"));
-        assertTrue(BooleanUtils.toBoolean("TRue"));
-        assertTrue(BooleanUtils.toBoolean("TrUE"));
-        assertTrue(BooleanUtils.toBoolean("TrUe"));
-        assertTrue(BooleanUtils.toBoolean("TruE"));
-        assertTrue(BooleanUtils.toBoolean("True"));
-        assertTrue(BooleanUtils.toBoolean("on"));
-        assertTrue(BooleanUtils.toBoolean("oN"));
-        assertTrue(BooleanUtils.toBoolean("On"));
-        assertTrue(BooleanUtils.toBoolean("ON"));
-        assertTrue(BooleanUtils.toBoolean("yes"));
-        assertTrue(BooleanUtils.toBoolean("yeS"));
-        assertTrue(BooleanUtils.toBoolean("yEs"));
-        assertTrue(BooleanUtils.toBoolean("yES"));
-        assertTrue(BooleanUtils.toBoolean("Yes"));
-        assertTrue(BooleanUtils.toBoolean("YeS"));
-        assertTrue(BooleanUtils.toBoolean("YEs"));
-        assertTrue(BooleanUtils.toBoolean("YES"));
-        assertFalse(BooleanUtils.toBoolean("yes?"));
-        assertFalse(BooleanUtils.toBoolean("tru"));
-
-        assertFalse(BooleanUtils.toBoolean("no"));
-        assertFalse(BooleanUtils.toBoolean("off"));
-        assertFalse(BooleanUtils.toBoolean("yoo"));
-    }
-
-    @Test
-    public void test_toBoolean_String_String_String() {
-        assertTrue(BooleanUtils.toBoolean((String) null, null, "N"));
-        assertFalse(BooleanUtils.toBoolean((String) null, "Y", null));
-        assertTrue(BooleanUtils.toBoolean("Y", "Y", "N"));
-        assertTrue(BooleanUtils.toBoolean("Y", new String("Y"), new String("N")));
-        assertFalse(BooleanUtils.toBoolean("N", "Y", "N"));
-        assertFalse(BooleanUtils.toBoolean("N", new String("Y"), new String("N")));
-        assertTrue(BooleanUtils.toBoolean((String) null, null, null));
-        assertTrue(BooleanUtils.toBoolean("Y", "Y", "Y"));
-        assertTrue(BooleanUtils.toBoolean("Y", new String("Y"), new String("Y")));
-    }
-
-    @Test(expected = IllegalArgumentException.class)
-    public void test_toBoolean_String_String_String_nullValue() {
-        BooleanUtils.toBoolean(null, "Y", "N");
-    }
-
-    @Test(expected = IllegalArgumentException.class)
-    public void test_toBoolean_String_String_String_noMatch() {
-        BooleanUtils.toBoolean("X", "Y", "N");
-    }
-
-    //-----------------------------------------------------------------------
-    @Test
-    public void test_toStringTrueFalse_Boolean() {
-        assertEquals(null, BooleanUtils.toStringTrueFalse((Boolean) null));
-        assertEquals("true", BooleanUtils.toStringTrueFalse(Boolean.TRUE));
-        assertEquals("false", BooleanUtils.toStringTrueFalse(Boolean.FALSE));
-    }
-    
-    @Test
-    public void test_toStringOnOff_Boolean() {
-        assertEquals(null, BooleanUtils.toStringOnOff((Boolean) null));
-        assertEquals("on", BooleanUtils.toStringOnOff(Boolean.TRUE));
-        assertEquals("off", BooleanUtils.toStringOnOff(Boolean.FALSE));
-    }
-    
-    @Test
-    public void test_toStringYesNo_Boolean() {
-        assertEquals(null, BooleanUtils.toStringYesNo((Boolean) null));
-        assertEquals("yes", BooleanUtils.toStringYesNo(Boolean.TRUE));
-        assertEquals("no", BooleanUtils.toStringYesNo(Boolean.FALSE));
-    }
-    
-    @Test
-    public void test_toString_Boolean_String_String_String() {
-        assertEquals("U", BooleanUtils.toString((Boolean) null, "Y", "N", "U"));
-        assertEquals("Y", BooleanUtils.toString(Boolean.TRUE, "Y", "N", "U"));
-        assertEquals("N", BooleanUtils.toString(Boolean.FALSE, "Y", "N", "U"));
-    }
-    
-    //-----------------------------------------------------------------------
-    @Test
-    public void test_toStringTrueFalse_boolean() {
-        assertEquals("true", BooleanUtils.toStringTrueFalse(true));
-        assertEquals("false", BooleanUtils.toStringTrueFalse(false));
-    }
-    
-    @Test
-    public void test_toStringOnOff_boolean() {
-        assertEquals("on", BooleanUtils.toStringOnOff(true));
-        assertEquals("off", BooleanUtils.toStringOnOff(false));
-    }
-    
-    @Test
-    public void test_toStringYesNo_boolean() {
-        assertEquals("yes", BooleanUtils.toStringYesNo(true));
-        assertEquals("no", BooleanUtils.toStringYesNo(false));
-    }
-    
-    @Test
-    public void test_toString_boolean_String_String_String() {
-        assertEquals("Y", BooleanUtils.toString(true, "Y", "N"));
-        assertEquals("N", BooleanUtils.toString(false, "Y", "N"));
-    }
-    
-    //  testXor
-    //  -----------------------------------------------------------------------
-    @Test(expected = IllegalArgumentException.class)
-    public void testXor_primitive_nullInput() {
-        BooleanUtils.xor((boolean[]) null);
-    }
-
-    @Test(expected = IllegalArgumentException.class)
-    public void testXor_primitive_emptyInput() {
-        BooleanUtils.xor(new boolean[] {});
-    }
-
-    @Test
-    public void testXor_primitive_validInput_2items() {
-        assertEquals(
-            "true ^ true",
-            true ^ true ,
-            BooleanUtils.xor(new boolean[] { true, true }));
-
-        assertEquals(
-            "false ^ false",
-            false ^ false,
-            BooleanUtils.xor(new boolean[] { false, false }));
-
-        assertEquals(
-            "true ^ false",
-            true ^ false,
-            BooleanUtils.xor(new boolean[] { true, false }));
-
-        assertEquals(
-            "false ^ true",
-            false ^ true,
-            BooleanUtils.xor(new boolean[] { false, true }));
-    }
-
-    @Test
-    public void testXor_primitive_validInput_3items() {
-        assertEquals(
-            "false ^ false ^ false",
-            false ^ false ^ false,
-            BooleanUtils.xor(new boolean[] { false, false, false }));
-
-        assertEquals(
-            "false ^ false ^ true",
-            false ^ false ^ true,
-            BooleanUtils.xor(new boolean[] { false, false, true }));
-
-        assertEquals(
-            "false ^ true ^ false",
-            false ^ true ^ false,
-            BooleanUtils.xor(new boolean[] { false, true, false }));
-
-        assertEquals(
-            "false ^ true ^ true",
-            false ^ true ^ true,
-            BooleanUtils.xor(new boolean[] { false, true, true }));
-
-        assertEquals(
-            "true ^ false ^ false",
-            true ^ false ^ false,
-            BooleanUtils.xor(new boolean[] { true, false, false }));
-
-        assertEquals(
-            "true ^ false ^ true",
-            true ^ false ^ true,
-            BooleanUtils.xor(new boolean[] { true, false, true }));
-
-        assertEquals(
-            "true ^ true ^ false",
-            true ^ true ^ false,
-            BooleanUtils.xor(new boolean[] { true, true, false }));
-
-        assertEquals(
-            "true ^ true ^ true",
-            true ^ true ^ true,
-            BooleanUtils.xor(new boolean[] { true, true, true }));
-    }
-
-    @Test(expected = IllegalArgumentException.class)
-    public void testXor_object_nullInput() {
-        BooleanUtils.xor((Boolean[]) null);
-    }
-
-    @Test(expected = IllegalArgumentException.class)
-    public void testXor_object_emptyInput() {
-        BooleanUtils.xor(new Boolean[] {});
-    }
-    
-    @Test(expected = IllegalArgumentException.class)
-    public void testXor_object_nullElementInput() {
-        BooleanUtils.xor(new Boolean[] {null});
-    }
-
-    @Test
-    public void testXor_object_validInput_2items() {
-        assertEquals(
-            "false ^ false",
-            false ^ false,
-            BooleanUtils
-                .xor(new Boolean[] { Boolean.FALSE, Boolean.FALSE })
-                .booleanValue());
-
-        assertEquals(
-            "false ^ true",
-            false ^ true,
-            BooleanUtils
-                .xor(new Boolean[] { Boolean.FALSE, Boolean.TRUE })
-                .booleanValue());
-
-        assertEquals(
-            "true ^ false",
-            true ^ false,
-            BooleanUtils
-                .xor(new Boolean[] { Boolean.TRUE, Boolean.FALSE })
-                .booleanValue());
-
-        assertEquals(
-            "true ^ true",
-            true ^ true,
-            BooleanUtils
-                .xor(new Boolean[] { Boolean.TRUE, Boolean.TRUE })
-                .booleanValue());
-    }
-
-    @Test
-    public void testXor_object_validInput_3items() {
-        assertEquals(
-                "false ^ false ^ false",
-                false ^ false ^ false,
-                BooleanUtils.xor(
-                        new Boolean[] {
-                                Boolean.FALSE,
-                                Boolean.FALSE,
-                                Boolean.FALSE })
-                        .booleanValue());
-
-        assertEquals(
-            "false ^ false ^ true",
-            false ^ false ^ true,
-            BooleanUtils
-                .xor(
-                    new Boolean[] {
-                        Boolean.FALSE,
-                        Boolean.FALSE,
-                        Boolean.TRUE })
-                .booleanValue());
-
-        assertEquals(
-            "false ^ true ^ false",
-            false ^ true ^ false,
-            BooleanUtils
-                .xor(
-                    new Boolean[] {
-                        Boolean.FALSE,
-                        Boolean.TRUE,
-                        Boolean.FALSE })
-                .booleanValue());
-
-        assertEquals(
-            "true ^ false ^ false",
-            true ^ false ^ false,
-            BooleanUtils
-                .xor(
-                    new Boolean[] {
-                        Boolean.TRUE,
-                        Boolean.FALSE,
-                        Boolean.FALSE })
-                .booleanValue());
-
-        assertEquals(
-                "true ^ false ^ true",
-                true ^ false ^ true,
-                BooleanUtils.xor(
-                        new Boolean[] {
-                                Boolean.TRUE,
-                                Boolean.FALSE,
-                                Boolean.TRUE })
-                        .booleanValue());
-
-        assertEquals(
-            "true ^ true ^ false",
-            true ^ true ^ false,
-            BooleanUtils.xor(
-                    new Boolean[] {
-                        Boolean.TRUE,
-                        Boolean.TRUE,
-                        Boolean.FALSE })
-                .booleanValue());
-
-        assertEquals(
-            "false ^ true ^ true",
-            false ^ true ^ true,
-            BooleanUtils.xor(
-                    new Boolean[] {
-                        Boolean.FALSE,
-                        Boolean.TRUE,
-                        Boolean.TRUE })
-                .booleanValue());
-
-        assertEquals(
-                "true ^ true ^ true",
-                true ^ true ^ true,
-                BooleanUtils
-                        .xor(new Boolean[] { Boolean.TRUE, Boolean.TRUE, Boolean.TRUE })
-                        .booleanValue());
-    }
-
-    //  testAnd
-    //  -----------------------------------------------------------------------
-    @Test(expected = IllegalArgumentException.class)
-    public void testAnd_primitive_nullInput() {
-        BooleanUtils.and((boolean[]) null);
-    }
-    
-    @Test(expected = IllegalArgumentException.class)
-    public void testAnd_primitive_emptyInput() {
-        BooleanUtils.and(new boolean[] {});
-    }
-    
-    @Test
-    public void testAnd_primitive_validInput_2items() {
-        assertTrue(
-            "False result for (true, true)",
-            BooleanUtils.and(new boolean[] { true, true }));
-        
-        assertTrue(
-            "True result for (false, false)",
-            ! BooleanUtils.and(new boolean[] { false, false }));
-        
-        assertTrue(
-            "True result for (true, false)",
-            ! BooleanUtils.and(new boolean[] { true, false }));
-        
-        assertTrue(
-            "True result for (false, true)",
-            ! BooleanUtils.and(new boolean[] { false, true }));
-    }
-    
-    @Test
-    public void testAnd_primitive_validInput_3items() {
-        assertTrue(
-            "True result for (false, false, true)",
-            ! BooleanUtils.and(new boolean[] { false, false, true }));
-        
-        assertTrue(
-            "True result for (false, true, false)",
-            ! BooleanUtils.and(new boolean[] { false, true, false }));
-        
-        assertTrue(
-            "True result for (true, false, false)",
-            ! BooleanUtils.and(new boolean[] { true, false, false }));
-        
-        assertTrue(
-            "False result for (true, true, true)",
-            BooleanUtils.and(new boolean[] { true, true, true }));
-        
-        assertTrue(
-            "True result for (false, false)",
-            ! BooleanUtils.and(new boolean[] { false, false, false }));
-        
-        assertTrue(
-            "True result for (true, true, false)",
-            ! BooleanUtils.and(new boolean[] { true, true, false }));
-        
-        assertTrue(
-            "True result for (true, false, true)",
-            ! BooleanUtils.and(new boolean[] { true, false, true }));
-        
-        assertTrue(
-            "True result for (false, true, true)",
-            ! BooleanUtils.and(new boolean[] { false, true, true }));
-    }
-    
-    @Test(expected = IllegalArgumentException.class)
-    public void testAnd_object_nullInput() {
-        BooleanUtils.and((Boolean[]) null);
-    }
-    
-    @Test(expected = IllegalArgumentException.class)
-    public void testAnd_object_emptyInput() {
-        BooleanUtils.and(new Boolean[] {});
-    }
-    
-    @Test(expected = IllegalArgumentException.class)
-    public void testAnd_object_nullElementInput() {
-        BooleanUtils.and(new Boolean[] {null});
-    }
-    
-    @Test
-    public void testAnd_object_validInput_2items() {
-        assertTrue(
-            "False result for (true, true)",
-            BooleanUtils
-            .and(new Boolean[] { Boolean.TRUE, Boolean.TRUE })
-            .booleanValue());
-        
-        assertTrue(
-            "True result for (false, false)",
-            ! BooleanUtils
-            .and(new Boolean[] { Boolean.FALSE, Boolean.FALSE })
-            .booleanValue());
-        
-        assertTrue(
-            "True result for (true, false)",
-            ! BooleanUtils
-            .and(new Boolean[] { Boolean.TRUE, Boolean.FALSE })
-            .booleanValue());
-        
-        assertTrue(
-            "True result for (false, true)",
-            ! BooleanUtils
-            .and(new Boolean[] { Boolean.FALSE, Boolean.TRUE })
-            .booleanValue());
-    }
-    
-    @Test
-    public void testAnd_object_validInput_3items() {
-        assertTrue(
-            "True result for (false, false, true)",
-            ! BooleanUtils
-            .and(
-                new Boolean[] {
-                    Boolean.FALSE,
-                    Boolean.FALSE,
-                    Boolean.TRUE })
-                    .booleanValue());
-        
-        assertTrue(
-            "True result for (false, true, false)",
-            ! BooleanUtils
-            .and(
-                new Boolean[] {
-                    Boolean.FALSE,
-                    Boolean.TRUE,
-                    Boolean.FALSE })
-                    .booleanValue());
-        
-        assertTrue(
-            "True result for (true, false, false)",
-            ! BooleanUtils
-            .and(
-                new Boolean[] {
-                    Boolean.TRUE,
-                    Boolean.FALSE,
-                    Boolean.FALSE })
-                    .booleanValue());
-        
-        assertTrue(
-            "False result for (true, true, true)",
-            BooleanUtils
-            .and(new Boolean[] { Boolean.TRUE, Boolean.TRUE, Boolean.TRUE })
-            .booleanValue());
-        
-        assertTrue(
-            "True result for (false, false)",
-            ! BooleanUtils.and(
-                new Boolean[] {
-                    Boolean.FALSE,
-                    Boolean.FALSE,
-                    Boolean.FALSE })
-                    .booleanValue());
-        
-        assertTrue(
-            "True result for (true, true, false)",
-            ! BooleanUtils.and(
-                new Boolean[] {
-                    Boolean.TRUE,
-                    Boolean.TRUE,
-                    Boolean.FALSE })
-                    .booleanValue());
-        
-        assertTrue(
-            "True result for (true, false, true)",
-            ! BooleanUtils.and(
-                new Boolean[] {
-                    Boolean.TRUE,
-                    Boolean.FALSE,
-                    Boolean.TRUE })
-                    .booleanValue());
-        
-        assertTrue(
-            "True result for (false, true, true)",
-            ! BooleanUtils.and(
-                new Boolean[] {
-                    Boolean.FALSE,
-                    Boolean.TRUE,
-                    Boolean.TRUE })
-                    .booleanValue());
-    }
-    
-    //  testOr
-    //  -----------------------------------------------------------------------
-    @Test(expected = IllegalArgumentException.class)
-    public void testOr_primitive_nullInput() {
-        BooleanUtils.or((boolean[]) null);
-    }
-    
-    @Test(expected = IllegalArgumentException.class)
-    public void testOr_primitive_emptyInput() {
-        BooleanUtils.or(new boolean[] {});
-    }
-    
-    @Test
-    public void testOr_primitive_validInput_2items() {
-        assertTrue(
-            "False result for (true, true)",
-            BooleanUtils.or(new boolean[] { true, true }));
-        
-        assertTrue(
-            "True result for (false, false)",
-            ! BooleanUtils.or(new boolean[] { false, false }));
-        
-        assertTrue(
-            "False result for (true, false)",
-            BooleanUtils.or(new boolean[] { true, false }));
-        
-        assertTrue(
-            "False result for (false, true)",
-            BooleanUtils.or(new boolean[] { false, true }));
-    }
-    
-    @Test
-    public void testOr_primitive_validInput_3items() {
-        assertTrue(
-            "False result for (false, false, true)",
-            BooleanUtils.or(new boolean[] { false, false, true }));
-        
-        assertTrue(
-            "False result for (false, true, false)",
-            BooleanUtils.or(new boolean[] { false, true, false }));
-        
-        assertTrue(
-            "False result for (true, false, false)",
-            BooleanUtils.or(new boolean[] { true, false, false }));
-        
-        assertTrue(
-            "False result for (true, true, true)",
-            BooleanUtils.or(new boolean[] { true, true, true }));
-        
-        assertTrue(
-            "True result for (false, false)",
-            ! BooleanUtils.or(new boolean[] { false, false, false }));
-        
-        assertTrue(
-            "False result for (true, true, false)",
-            BooleanUtils.or(new boolean[] { true, true, false }));
-        
-        assertTrue(
-            "False result for (true, false, true)",
-            BooleanUtils.or(new boolean[] { true, false, true }));
-        
-        assertTrue(
-            "False result for (false, true, true)",
-            BooleanUtils.or(new boolean[] { false, true, true }));
-    
-    }
-    @Test(expected = IllegalArgumentException.class)
-    public void testOr_object_nullInput() {
-        BooleanUtils.or((Boolean[]) null);
-    }
-    
-    @Test(expected = IllegalArgumentException.class)
-    public void testOr_object_emptyInput() {
-        BooleanUtils.or(new Boolean[] {});
-    }
-    
-    @Test(expected = IllegalArgumentException.class)
-    public void testOr_object_nullElementInput() {
-        BooleanUtils.or(new Boolean[] {null});
-    }
-    
-    @Test
-    public void testOr_object_validInput_2items() {
-        assertTrue(
-            "False result for (true, true)",
-            BooleanUtils
-            .or(new Boolean[] { Boolean.TRUE, Boolean.TRUE })
-            .booleanValue());
-        
-        assertTrue(
-            "True result for (false, false)",
-            ! BooleanUtils
-            .or(new Boolean[] { Boolean.FALSE, Boolean.FALSE })
-            .booleanValue());
-        
-        assertTrue(
-            "False result for (true, false)",
-            BooleanUtils
-            .or(new Boolean[] { Boolean.TRUE, Boolean.FALSE })
-            .booleanValue());
-        
-        assertTrue(
-            "False result for (false, true)",
-            BooleanUtils
-            .or(new Boolean[] { Boolean.FALSE, Boolean.TRUE })
-            .booleanValue());
-    }
-    
-    @Test
-    public void testOr_object_validInput_3items() {
-        assertTrue(
-            "False result for (false, false, true)",
-            BooleanUtils
-            .or(
-                new Boolean[] {
-                    Boolean.FALSE,
-                    Boolean.FALSE,
-                    Boolean.TRUE })
-                    .booleanValue());
-        
-        assertTrue(
-            "False result for (false, true, false)",
-            BooleanUtils
-            .or(
-                new Boolean[] {
-                    Boolean.FALSE,
-                    Boolean.TRUE,
-                    Boolean.FALSE })
-                    .booleanValue());
-        
-        assertTrue(
-            "False result for (true, false, false)",
-            BooleanUtils
-            .or(
-                new Boolean[] {
-                    Boolean.TRUE,
-                    Boolean.FALSE,
-                    Boolean.FALSE })
-                    .booleanValue());
-        
-        assertTrue(
-            "False result for (true, true, true)",
-            BooleanUtils
-            .or(new Boolean[] { Boolean.TRUE, Boolean.TRUE, Boolean.TRUE })
-            .booleanValue());
-        
-        assertTrue(
-            "True result for (false, false)",
-            ! BooleanUtils.or(
-                new Boolean[] {
-                    Boolean.FALSE,
-                    Boolean.FALSE,
-                    Boolean.FALSE })
-                    .booleanValue());
-        
-        assertTrue(
-            "False result for (true, true, false)",
-            BooleanUtils.or(
-                new Boolean[] {
-                    Boolean.TRUE,
-                    Boolean.TRUE,
-                    Boolean.FALSE })
-                    .booleanValue());
-        
-        assertTrue(
-            "False result for (true, false, true)",
-            BooleanUtils.or(
-                new Boolean[] {
-                    Boolean.TRUE,
-                    Boolean.FALSE,
-                    Boolean.TRUE })
-                    .booleanValue());
-        
-        assertTrue(
-            "False result for (false, true, true)",
-            BooleanUtils.or(
-                new Boolean[] {
-                    Boolean.FALSE,
-                    Boolean.TRUE,
-                    Boolean.TRUE })
-                    .booleanValue());
-    }
-
-    @Test
-    public void testCompare(){
-        assertTrue(BooleanUtils.compare(true, false) > 0);
-        assertTrue(BooleanUtils.compare(true, true) == 0);
-        assertTrue(BooleanUtils.compare(false, false) == 0);
-        assertTrue(BooleanUtils.compare(false, true) < 0);
-    }
-    
-}
diff --git a/lang/src/test/java/org/apache/commons/lang3/CharEncodingTest.java b/lang/src/test/java/org/apache/commons/lang3/CharEncodingTest.java
deleted file mode 100644
index b3c9208..0000000
--- a/lang/src/test/java/org/apache/commons/lang3/CharEncodingTest.java
+++ /dev/null
@@ -1,112 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- * 
- *      http://www.apache.org/licenses/LICENSE-2.0
- * 
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package org.apache.commons.lang3;
-
-import static org.apache.commons.lang3.JavaVersion.JAVA_1_1;
-import static org.apache.commons.lang3.JavaVersion.JAVA_1_2;
-import static org.apache.commons.lang3.JavaVersion.JAVA_1_3;
-import static org.junit.Assert.assertFalse;
-import static org.junit.Assert.assertTrue;
-
-import org.junit.Test;
-
-/**
- * Tests CharEncoding.
- * 
- * @see CharEncoding
- * @version $Id$
- */
-public class CharEncodingTest  {
-
-    private void assertSupportedEncoding(final String name) {
-        assertTrue("Encoding should be supported: " + name, CharEncoding.isSupported(name));
-    }
-
-    /**
-     * The class can be instantiated.
-     */
-    @Test
-    public void testConstructor() {
-        new CharEncoding();
-    }
-
-    @Test
-    public void testMustBeSupportedJava1_3_1() {
-        if (SystemUtils.isJavaVersionAtLeast(JAVA_1_3)) {
-            this.assertSupportedEncoding(CharEncoding.ISO_8859_1);
-            this.assertSupportedEncoding(CharEncoding.US_ASCII);
-            this.assertSupportedEncoding(CharEncoding.UTF_16);
-            this.assertSupportedEncoding(CharEncoding.UTF_16BE);
-            this.assertSupportedEncoding(CharEncoding.UTF_16LE);
-            this.assertSupportedEncoding(CharEncoding.UTF_8);
-        } else {
-            this.warn("Java 1.3 tests not run since the current version is " + SystemUtils.JAVA_SPECIFICATION_VERSION);
-        }
-    }
-
-    @Test
-    public void testSupported() {
-        assertTrue(CharEncoding.isSupported("UTF8"));
-        assertTrue(CharEncoding.isSupported("UTF-8"));
-        assertTrue(CharEncoding.isSupported("ASCII"));
-    }
-
-    @Test
-    public void testNotSupported() {
-        assertFalse(CharEncoding.isSupported(null));
-        assertFalse(CharEncoding.isSupported(""));
-        assertFalse(CharEncoding.isSupported(" "));
-        assertFalse(CharEncoding.isSupported("\t\r\n"));
-        assertFalse(CharEncoding.isSupported("DOESNOTEXIST"));
-        assertFalse(CharEncoding.isSupported("this is not a valid encoding name"));
-    }
-
-    @Test
-    public void testWorksOnJava1_1_8() {
-        //
-        // In this test, I simply deleted the encodings from the 1.3.1 list.
-        // The Javadoc do not specify which encodings are required.
-        //
-        if (SystemUtils.isJavaVersionAtLeast(JAVA_1_1)) {
-            this.assertSupportedEncoding(CharEncoding.ISO_8859_1);
-            this.assertSupportedEncoding(CharEncoding.US_ASCII);
-            this.assertSupportedEncoding(CharEncoding.UTF_8);
-        } else {
-            this.warn("Java 1.1 tests not run since the current version is " + SystemUtils.JAVA_SPECIFICATION_VERSION);
-        }
-    }
-
-    @Test
-    public void testWorksOnJava1_2_2() {
-        //
-        // In this test, I simply deleted the encodings from the 1.3.1 list.
-        // The Javadoc do not specify which encodings are required.
-        //
-        if (SystemUtils.isJavaVersionAtLeast(JAVA_1_2)) {
-            this.assertSupportedEncoding(CharEncoding.ISO_8859_1);
-            this.assertSupportedEncoding(CharEncoding.US_ASCII);
-            this.assertSupportedEncoding(CharEncoding.UTF_8);
-        } else {
-            this.warn("Java 1.2 tests not run since the current version is " + SystemUtils.JAVA_SPECIFICATION_VERSION);
-        }
-    }
-
-    void warn(final String msg) {
-        System.err.println(msg);
-    }
-}
diff --git a/lang/src/test/java/org/apache/commons/lang3/CharRangeTest.java b/lang/src/test/java/org/apache/commons/lang3/CharRangeTest.java
deleted file mode 100644
index 301e6f7..0000000
--- a/lang/src/test/java/org/apache/commons/lang3/CharRangeTest.java
+++ /dev/null
@@ -1,402 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-package org.apache.commons.lang3;
-
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertFalse;
-import static org.junit.Assert.assertNotNull;
-import static org.junit.Assert.assertTrue;
-import static org.junit.Assert.fail;
-
-import java.lang.reflect.Modifier;
-import java.util.Iterator;
-import java.util.NoSuchElementException;
-
-import org.junit.Test;
-
-/**
- * Unit tests {@link org.apache.commons.lang3.CharRange}.
- *
- * @version $Id$
- */
-public class CharRangeTest  {
-
-    //-----------------------------------------------------------------------
-    @Test
-    public void testClass() {
-        // class changed to non-public in 3.0
-        assertFalse(Modifier.isPublic(CharRange.class.getModifiers()));
-        assertTrue(Modifier.isFinal(CharRange.class.getModifiers()));
-    }
-
-    //-----------------------------------------------------------------------
-    @Test
-    public void testConstructorAccessors_is() {
-        final CharRange rangea = CharRange.is('a');
-        assertEquals('a', rangea.getStart());
-        assertEquals('a', rangea.getEnd());
-        assertFalse(rangea.isNegated());
-        assertEquals("a", rangea.toString());
-    }
-
-    @Test
-    public void testConstructorAccessors_isNot() {
-        final CharRange rangea = CharRange.isNot('a');
-        assertEquals('a', rangea.getStart());
-        assertEquals('a', rangea.getEnd());
-        assertTrue(rangea.isNegated());
-        assertEquals("^a", rangea.toString());
-    }
-
-    @Test
-    public void testConstructorAccessors_isIn_Same() {
-        final CharRange rangea = CharRange.isIn('a', 'a');
-        assertEquals('a', rangea.getStart());
-        assertEquals('a', rangea.getEnd());
-        assertFalse(rangea.isNegated());
-        assertEquals("a", rangea.toString());
-    }
-
-    @Test
-    public void testConstructorAccessors_isIn_Normal() {
-        final CharRange rangea = CharRange.isIn('a', 'e');
-        assertEquals('a', rangea.getStart());
-        assertEquals('e', rangea.getEnd());
-        assertFalse(rangea.isNegated());
-        assertEquals("a-e", rangea.toString());
-    }
-
-    @Test
-    public void testConstructorAccessors_isIn_Reversed() {
-        final CharRange rangea = CharRange.isIn('e', 'a');
-        assertEquals('a', rangea.getStart());
-        assertEquals('e', rangea.getEnd());
-        assertFalse(rangea.isNegated());
-        assertEquals("a-e", rangea.toString());
-    }
-
-    @Test
-    public void testConstructorAccessors_isNotIn_Same() {
-        final CharRange rangea = CharRange.isNotIn('a', 'a');
-        assertEquals('a', rangea.getStart());
-        assertEquals('a', rangea.getEnd());
-        assertTrue(rangea.isNegated());
-        assertEquals("^a", rangea.toString());
-    }
-
-    @Test
-    public void testConstructorAccessors_isNotIn_Normal() {
-        final CharRange rangea = CharRange.isNotIn('a', 'e');
-        assertEquals('a', rangea.getStart());
-        assertEquals('e', rangea.getEnd());
-        assertTrue(rangea.isNegated());
-        assertEquals("^a-e", rangea.toString());
-    }
-
-    @Test
-    public void testConstructorAccessors_isNotIn_Reversed() {
-        final CharRange rangea = CharRange.isNotIn('e', 'a');
-        assertEquals('a', rangea.getStart());
-        assertEquals('e', rangea.getEnd());
-        assertTrue(rangea.isNegated());
-        assertEquals("^a-e", rangea.toString());
-    }
-
-    //-----------------------------------------------------------------------
-    @Test
-    public void testEquals_Object() {
-        final CharRange rangea = CharRange.is('a');
-        final CharRange rangeae = CharRange.isIn('a', 'e');
-        final CharRange rangenotbf = CharRange.isIn('b', 'f');
-
-        assertFalse(rangea.equals(null));
-
-        assertTrue(rangea.equals(rangea));
-        assertTrue(rangea.equals(CharRange.is('a')));
-        assertTrue(rangeae.equals(rangeae));
-        assertTrue(rangeae.equals(CharRange.isIn('a', 'e')));
-        assertTrue(rangenotbf.equals(rangenotbf));
-        assertTrue(rangenotbf.equals(CharRange.isIn('b', 'f')));
-
-        assertFalse(rangea.equals(rangeae));
-        assertFalse(rangea.equals(rangenotbf));
-        assertFalse(rangeae.equals(rangea));
-        assertFalse(rangeae.equals(rangenotbf));
-        assertFalse(rangenotbf.equals(rangea));
-        assertFalse(rangenotbf.equals(rangeae));
-    }
-
-    @Test
-    public void testHashCode() {
-        final CharRange rangea = CharRange.is('a');
-        final CharRange rangeae = CharRange.isIn('a', 'e');
-        final CharRange rangenotbf = CharRange.isIn('b', 'f');
-
-        assertTrue(rangea.hashCode() == rangea.hashCode());
-        assertTrue(rangea.hashCode() == CharRange.is('a').hashCode());
-        assertTrue(rangeae.hashCode() == rangeae.hashCode());
-        assertTrue(rangeae.hashCode() == CharRange.isIn('a', 'e').hashCode());
-        assertTrue(rangenotbf.hashCode() == rangenotbf.hashCode());
-        assertTrue(rangenotbf.hashCode() == CharRange.isIn('b', 'f').hashCode());
-
-        assertFalse(rangea.hashCode() == rangeae.hashCode());
-        assertFalse(rangea.hashCode() == rangenotbf.hashCode());
-        assertFalse(rangeae.hashCode() == rangea.hashCode());
-        assertFalse(rangeae.hashCode() == rangenotbf.hashCode());
-        assertFalse(rangenotbf.hashCode() == rangea.hashCode());
-        assertFalse(rangenotbf.hashCode() == rangeae.hashCode());
-    }
-
-    //-----------------------------------------------------------------------
-    @Test
-    public void testContains_Char() {
-        CharRange range = CharRange.is('c');
-        assertFalse(range.contains('b'));
-        assertTrue(range.contains('c'));
-        assertFalse(range.contains('d'));
-        assertFalse(range.contains('e'));
-
-        range = CharRange.isIn('c', 'd');
-        assertFalse(range.contains('b'));
-        assertTrue(range.contains('c'));
-        assertTrue(range.contains('d'));
-        assertFalse(range.contains('e'));
-
-        range = CharRange.isIn('d', 'c');
-        assertFalse(range.contains('b'));
-        assertTrue(range.contains('c'));
-        assertTrue(range.contains('d'));
-        assertFalse(range.contains('e'));
-
-        range = CharRange.isNotIn('c', 'd');
-        assertTrue(range.contains('b'));
-        assertFalse(range.contains('c'));
-        assertFalse(range.contains('d'));
-        assertTrue(range.contains('e'));
-        assertTrue(range.contains((char) 0));
-        assertTrue(range.contains(Character.MAX_VALUE));
-    }
-
-    //-----------------------------------------------------------------------
-    @Test
-    public void testContains_Charrange() {
-        final CharRange a = CharRange.is('a');
-        final CharRange b = CharRange.is('b');
-        final CharRange c = CharRange.is('c');
-        final CharRange c2 = CharRange.is('c');
-        final CharRange d = CharRange.is('d');
-        final CharRange e = CharRange.is('e');
-        final CharRange cd = CharRange.isIn('c', 'd');
-        final CharRange bd = CharRange.isIn('b', 'd');
-        final CharRange bc = CharRange.isIn('b', 'c');
-        final CharRange ab = CharRange.isIn('a', 'b');
-        final CharRange de = CharRange.isIn('d', 'e');
-        final CharRange ef = CharRange.isIn('e', 'f');
-        final CharRange ae = CharRange.isIn('a', 'e');
-
-        // normal/normal
-        assertFalse(c.contains(b));
-        assertTrue(c.contains(c));
-        assertTrue(c.contains(c2));
-        assertFalse(c.contains(d));
-
-        assertFalse(c.contains(cd));
-        assertFalse(c.contains(bd));
-        assertFalse(c.contains(bc));
-        assertFalse(c.contains(ab));
-        assertFalse(c.contains(de));
-
-        assertTrue(cd.contains(c));
-        assertTrue(bd.contains(c));
-        assertTrue(bc.contains(c));
-        assertFalse(ab.contains(c));
-        assertFalse(de.contains(c));
-
-        assertTrue(ae.contains(b));
-        assertTrue(ae.contains(ab));
-        assertTrue(ae.contains(bc));
-        assertTrue(ae.contains(cd));
-        assertTrue(ae.contains(de));
-
-        final CharRange notb = CharRange.isNot('b');
-        final CharRange notc = CharRange.isNot('c');
-        final CharRange notd = CharRange.isNot('d');
-        final CharRange notab = CharRange.isNotIn('a', 'b');
-        final CharRange notbc = CharRange.isNotIn('b', 'c');
-        final CharRange notbd = CharRange.isNotIn('b', 'd');
-        final CharRange notcd = CharRange.isNotIn('c', 'd');
-        final CharRange notde = CharRange.isNotIn('d', 'e');
-        final CharRange notae = CharRange.isNotIn('a', 'e');
-        final CharRange all = CharRange.isIn((char) 0, Character.MAX_VALUE);
-        final CharRange allbutfirst = CharRange.isIn((char) 1, Character.MAX_VALUE);
-
-        // normal/negated
-        assertFalse(c.contains(notc));
-        assertFalse(c.contains(notbd));
-        assertTrue(all.contains(notc));
-        assertTrue(all.contains(notbd));
-        assertFalse(allbutfirst.contains(notc));
-        assertFalse(allbutfirst.contains(notbd));
-
-        // negated/normal
-        assertTrue(notc.contains(a));
-        assertTrue(notc.contains(b));
-        assertFalse(notc.contains(c));
-        assertTrue(notc.contains(d));
-        assertTrue(notc.contains(e));
-
-        assertTrue(notc.contains(ab));
-        assertFalse(notc.contains(bc));
-        assertFalse(notc.contains(bd));
-        assertFalse(notc.contains(cd));
-        assertTrue(notc.contains(de));
-        assertFalse(notc.contains(ae));
-        assertFalse(notc.contains(all));
-        assertFalse(notc.contains(allbutfirst));
-
-        assertTrue(notbd.contains(a));
-        assertFalse(notbd.contains(b));
-        assertFalse(notbd.contains(c));
-        assertFalse(notbd.contains(d));
-        assertTrue(notbd.contains(e));
-
-        assertTrue(notcd.contains(ab));
-        assertFalse(notcd.contains(bc));
-        assertFalse(notcd.contains(bd));
-        assertFalse(notcd.contains(cd));
-        assertFalse(notcd.contains(de));
-        assertFalse(notcd.contains(ae));
-        assertTrue(notcd.contains(ef));
-        assertFalse(notcd.contains(all));
-        assertFalse(notcd.contains(allbutfirst));
-
-        // negated/negated
-        assertFalse(notc.contains(notb));
-        assertTrue(notc.contains(notc));
-        assertFalse(notc.contains(notd));
-
-        assertFalse(notc.contains(notab));
-        assertTrue(notc.contains(notbc));
-        assertTrue(notc.contains(notbd));
-        assertTrue(notc.contains(notcd));
-        assertFalse(notc.contains(notde));
-
-        assertFalse(notbd.contains(notb));
-        assertFalse(notbd.contains(notc));
-        assertFalse(notbd.contains(notd));
-
-        assertFalse(notbd.contains(notab));
-        assertFalse(notbd.contains(notbc));
-        assertTrue(notbd.contains(notbd));
-        assertFalse(notbd.contains(notcd));
-        assertFalse(notbd.contains(notde));
-        assertTrue(notbd.contains(notae));
-    }
-
-    @Test
-    public void testContainsNullArg() {
-        final CharRange range = CharRange.is('a');
-        try {
-            @SuppressWarnings("unused")
-            final
-            boolean contains = range.contains(null);
-        } catch(final IllegalArgumentException e) {
-            assertEquals("The Range must not be null", e.getMessage());
-        }
-    }
-
-    @Test
-    public void testIterator() {
-        final CharRange a = CharRange.is('a');
-        final CharRange ad = CharRange.isIn('a', 'd');
-        final CharRange nota = CharRange.isNot('a');
-        final CharRange emptySet = CharRange.isNotIn((char) 0, Character.MAX_VALUE);
-        final CharRange notFirst = CharRange.isNotIn((char) 1, Character.MAX_VALUE);
-        final CharRange notLast = CharRange.isNotIn((char) 0, (char) (Character.MAX_VALUE - 1));
-
-        final Iterator<Character> aIt = a.iterator();
-        assertNotNull(aIt);
-        assertTrue(aIt.hasNext());
-        assertEquals(Character.valueOf('a'), aIt.next());
-        assertFalse(aIt.hasNext());
-
-        final Iterator<Character> adIt = ad.iterator();
-        assertNotNull(adIt);
-        assertTrue(adIt.hasNext());
-        assertEquals(Character.valueOf('a'), adIt.next());
-        assertEquals(Character.valueOf('b'), adIt.next());
-        assertEquals(Character.valueOf('c'), adIt.next());
-        assertEquals(Character.valueOf('d'), adIt.next());
-        assertFalse(adIt.hasNext());
-
-        final Iterator<Character> notaIt = nota.iterator();
-        assertNotNull(notaIt);
-        assertTrue(notaIt.hasNext());
-        while (notaIt.hasNext()) {
-            final Character c = notaIt.next();
-            assertFalse('a' == c.charValue());
-        }
-
-        final Iterator<Character> emptySetIt = emptySet.iterator();
-        assertNotNull(emptySetIt);
-        assertFalse(emptySetIt.hasNext());
-        try {
-            emptySetIt.next();
-            fail("Should throw NoSuchElementException");
-        } catch (final NoSuchElementException e) {
-            assertTrue(true);
-        }
-
-        final Iterator<Character> notFirstIt = notFirst.iterator();
-        assertNotNull(notFirstIt);
-        assertTrue(notFirstIt.hasNext());
-        assertEquals(Character.valueOf((char) 0), notFirstIt.next());
-        assertFalse(notFirstIt.hasNext());
-        try {
-            notFirstIt.next();
-            fail("Should throw NoSuchElementException");
-        } catch (final NoSuchElementException e) {
-            assertTrue(true);
-        }
-
-        final Iterator<Character> notLastIt = notLast.iterator();
-        assertNotNull(notLastIt);
-        assertTrue(notLastIt.hasNext());
-        assertEquals(Character.valueOf(Character.MAX_VALUE), notLastIt.next());
-        assertFalse(notLastIt.hasNext());
-        try {
-            notLastIt.next();
-            fail("Should throw NoSuchElementException");
-        } catch (final NoSuchElementException e) {
-            assertTrue(true);
-        }
-    }
-
-    //-----------------------------------------------------------------------
-    @Test
-    public void testSerialization() {
-        CharRange range = CharRange.is('a');
-        assertEquals(range, SerializationUtils.clone(range)); 
-        range = CharRange.isIn('a', 'e');
-        assertEquals(range, SerializationUtils.clone(range)); 
-        range = CharRange.isNotIn('a', 'e');
-        assertEquals(range, SerializationUtils.clone(range)); 
-    }
-
-}
diff --git a/lang/src/test/java/org/apache/commons/lang3/CharSequenceUtilsTest.java b/lang/src/test/java/org/apache/commons/lang3/CharSequenceUtilsTest.java
deleted file mode 100644
index bb76dab..0000000
--- a/lang/src/test/java/org/apache/commons/lang3/CharSequenceUtilsTest.java
+++ /dev/null
@@ -1,83 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.commons.lang3;
-
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertFalse;
-import static org.junit.Assert.assertNotNull;
-import static org.junit.Assert.assertTrue;
-
-import java.lang.reflect.Constructor;
-import java.lang.reflect.Modifier;
-
-import org.junit.Assert;
-
-import org.junit.Test;
-
-/**
- * Tests CharSequenceUtils
- *
- * @version $Id: CharSequenceUtilsTest.java 1066341 2011-02-02 06:21:53Z bayard $
- */
-public class CharSequenceUtilsTest {
-
-    //-----------------------------------------------------------------------
-    @Test
-    public void testConstructor() {
-        assertNotNull(new CharSequenceUtils());
-        final Constructor<?>[] cons = CharSequenceUtils.class.getDeclaredConstructors();
-        assertEquals(1, cons.length);
-        assertTrue(Modifier.isPublic(cons[0].getModifiers()));
-        assertTrue(Modifier.isPublic(CharSequenceUtils.class.getModifiers()));
-        assertFalse(Modifier.isFinal(CharSequenceUtils.class.getModifiers()));
-    }
-    
-    //-----------------------------------------------------------------------
-    @Test
-    public void testSubSequence() {
-        //
-        // null input
-        //
-        Assert.assertEquals(null, CharSequenceUtils.subSequence(null, -1));
-        Assert.assertEquals(null, CharSequenceUtils.subSequence(null, 0));
-        Assert.assertEquals(null, CharSequenceUtils.subSequence(null, 1));
-        //
-        // non-null input
-        //
-        Assert.assertEquals(StringUtils.EMPTY, CharSequenceUtils.subSequence(StringUtils.EMPTY, 0));
-        Assert.assertEquals("012", CharSequenceUtils.subSequence("012", 0));
-        Assert.assertEquals("12", CharSequenceUtils.subSequence("012", 1));
-        Assert.assertEquals("2", CharSequenceUtils.subSequence("012", 2));
-        Assert.assertEquals(StringUtils.EMPTY, CharSequenceUtils.subSequence("012", 3));
-        //
-        // Exception expected
-        //
-        try {
-            Assert.assertEquals(null, CharSequenceUtils.subSequence(StringUtils.EMPTY, -1));
-            Assert.fail("Expected " + IndexOutOfBoundsException.class.getName());
-        } catch (final IndexOutOfBoundsException e) {
-            // Expected
-        }
-        try {
-            Assert.assertEquals(null, CharSequenceUtils.subSequence(StringUtils.EMPTY, 1));
-            Assert.fail("Expected " + IndexOutOfBoundsException.class.getName());
-        } catch (final IndexOutOfBoundsException e) {
-            // Expected
-        }
-    }
-
-}
diff --git a/lang/src/test/java/org/apache/commons/lang3/CharSetTest.java b/lang/src/test/java/org/apache/commons/lang3/CharSetTest.java
deleted file mode 100644
index 014d7b7..0000000
--- a/lang/src/test/java/org/apache/commons/lang3/CharSetTest.java
+++ /dev/null
@@ -1,469 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-package org.apache.commons.lang3;
-
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertFalse;
-import static org.junit.Assert.assertSame;
-import static org.junit.Assert.assertTrue;
-
-import java.lang.reflect.Modifier;
-
-import org.junit.Test;
-
-/**
- * Unit tests {@link org.apache.commons.lang3.CharSet}.
- *
- * @version $Id$
- */
-public class CharSetTest  {
-
-    //-----------------------------------------------------------------------
-    @Test
-    public void testClass() {
-        assertTrue(Modifier.isPublic(CharSet.class.getModifiers()));
-        assertFalse(Modifier.isFinal(CharSet.class.getModifiers()));
-    }
-    
-    //-----------------------------------------------------------------------
-    @Test
-    public void testGetInstance() {
-        assertSame(CharSet.EMPTY, CharSet.getInstance( (String) null));
-        assertSame(CharSet.EMPTY, CharSet.getInstance(""));
-        assertSame(CharSet.ASCII_ALPHA, CharSet.getInstance("a-zA-Z"));
-        assertSame(CharSet.ASCII_ALPHA, CharSet.getInstance("A-Za-z"));
-        assertSame(CharSet.ASCII_ALPHA_LOWER, CharSet.getInstance("a-z"));
-        assertSame(CharSet.ASCII_ALPHA_UPPER, CharSet.getInstance("A-Z"));
-        assertSame(CharSet.ASCII_NUMERIC, CharSet.getInstance("0-9"));
-    }
-
-    //-----------------------------------------------------------------------
-    @Test
-    public void testGetInstance_Stringarray() {
-        assertEquals(null, CharSet.getInstance((String[]) null));
-        assertEquals("[]", CharSet.getInstance(new String[0]).toString());
-        assertEquals("[]", CharSet.getInstance(new String[] {null}).toString());
-        assertEquals("[a-e]", CharSet.getInstance(new String[] {"a-e"}).toString());
-    }
-    
-    //-----------------------------------------------------------------------
-    @Test
-    public void testConstructor_String_simple() {
-        CharSet set;
-        CharRange[] array;
-        
-        set = CharSet.getInstance((String) null);
-        array = set.getCharRanges();
-        assertEquals("[]", set.toString());
-        assertEquals(0, array.length);
-        
-        set = CharSet.getInstance("");
-        array = set.getCharRanges();
-        assertEquals("[]", set.toString());
-        assertEquals(0, array.length);
-        
-        set = CharSet.getInstance("a");
-        array = set.getCharRanges();
-        assertEquals("[a]", set.toString());
-        assertEquals(1, array.length);
-        assertEquals("a", array[0].toString());
-        
-        set = CharSet.getInstance("^a");
-        array = set.getCharRanges();
-        assertEquals("[^a]", set.toString());
-        assertEquals(1, array.length);
-        assertEquals("^a", array[0].toString());
-        
-        set = CharSet.getInstance("a-e");
-        array = set.getCharRanges();
-        assertEquals("[a-e]", set.toString());
-        assertEquals(1, array.length);
-        assertEquals("a-e", array[0].toString());
-        
-        set = CharSet.getInstance("^a-e");
-        array = set.getCharRanges();
-        assertEquals("[^a-e]", set.toString());
-        assertEquals(1, array.length);
-        assertEquals("^a-e", array[0].toString());
-    }
-    
-    @Test
-    public void testConstructor_String_combo() {
-        CharSet set;
-        CharRange[] array;
-        
-        set = CharSet.getInstance("abc");
-        array = set.getCharRanges();
-        assertEquals(3, array.length);
-        assertTrue(ArrayUtils.contains(array, CharRange.is('a')));
-        assertTrue(ArrayUtils.contains(array, CharRange.is('b')));
-        assertTrue(ArrayUtils.contains(array, CharRange.is('c')));
-        
-        set = CharSet.getInstance("a-ce-f");
-        array = set.getCharRanges();
-        assertEquals(2, array.length);
-        assertTrue(ArrayUtils.contains(array, CharRange.isIn('a', 'c')));
-        assertTrue(ArrayUtils.contains(array, CharRange.isIn('e', 'f')));
-        
-        set = CharSet.getInstance("ae-f");
-        array = set.getCharRanges();
-        assertEquals(2, array.length);
-        assertTrue(ArrayUtils.contains(array, CharRange.is('a')));
-        assertTrue(ArrayUtils.contains(array, CharRange.isIn('e', 'f')));
-        
-        set = CharSet.getInstance("e-fa");
-        array = set.getCharRanges();
-        assertEquals(2, array.length);
-        assertTrue(ArrayUtils.contains(array, CharRange.is('a')));
-        assertTrue(ArrayUtils.contains(array, CharRange.isIn('e', 'f')));
-        
-        set = CharSet.getInstance("ae-fm-pz");
-        array = set.getCharRanges();
-        assertEquals(4, array.length);
-        assertTrue(ArrayUtils.contains(array, CharRange.is('a')));
-        assertTrue(ArrayUtils.contains(array, CharRange.isIn('e', 'f')));
-        assertTrue(ArrayUtils.contains(array, CharRange.isIn('m', 'p')));
-        assertTrue(ArrayUtils.contains(array, CharRange.is('z')));
-    }
-    
-    @Test
-    public void testConstructor_String_comboNegated() {
-        CharSet set;
-        CharRange[] array;
-        
-        set = CharSet.getInstance("^abc");
-        array = set.getCharRanges();
-        assertEquals(3, array.length);
-        assertTrue(ArrayUtils.contains(array, CharRange.isNot('a')));
-        assertTrue(ArrayUtils.contains(array, CharRange.is('b')));
-        assertTrue(ArrayUtils.contains(array, CharRange.is('c')));
-        
-        set = CharSet.getInstance("b^ac");
-        array = set.getCharRanges();
-        assertEquals(3, array.length);
-        assertTrue(ArrayUtils.contains(array, CharRange.is('b')));
-        assertTrue(ArrayUtils.contains(array, CharRange.isNot('a')));
-        assertTrue(ArrayUtils.contains(array, CharRange.is('c')));
-        
-        set = CharSet.getInstance("db^ac");
-        array = set.getCharRanges();
-        assertEquals(4, array.length);
-        assertTrue(ArrayUtils.contains(array, CharRange.is('d')));
-        assertTrue(ArrayUtils.contains(array, CharRange.is('b')));
-        assertTrue(ArrayUtils.contains(array, CharRange.isNot('a')));
-        assertTrue(ArrayUtils.contains(array, CharRange.is('c')));
-        
-        set = CharSet.getInstance("^b^a");
-        array = set.getCharRanges();
-        assertEquals(2, array.length);
-        assertTrue(ArrayUtils.contains(array, CharRange.isNot('b')));
-        assertTrue(ArrayUtils.contains(array, CharRange.isNot('a')));
-        
-        set = CharSet.getInstance("b^a-c^z");
-        array = set.getCharRanges();
-        assertEquals(3, array.length);
-        assertTrue(ArrayUtils.contains(array, CharRange.isNotIn('a', 'c')));
-        assertTrue(ArrayUtils.contains(array, CharRange.isNot('z')));
-        assertTrue(ArrayUtils.contains(array, CharRange.is('b')));
-    }
-
-    @Test
-    public void testConstructor_String_oddDash() {
-        CharSet set;
-        CharRange[] array;
-        
-        set = CharSet.getInstance("-");
-        array = set.getCharRanges();
-        assertEquals(1, array.length);
-        assertTrue(ArrayUtils.contains(array, CharRange.is('-')));
-        
-        set = CharSet.getInstance("--");
-        array = set.getCharRanges();
-        assertEquals(1, array.length);
-        assertTrue(ArrayUtils.contains(array, CharRange.is('-')));
-        
-        set = CharSet.getInstance("---");
-        array = set.getCharRanges();
-        assertEquals(1, array.length);
-        assertTrue(ArrayUtils.contains(array, CharRange.is('-')));
-        
-        set = CharSet.getInstance("----");
-        array = set.getCharRanges();
-        assertEquals(1, array.length);
-        assertTrue(ArrayUtils.contains(array, CharRange.is('-')));
-        
-        set = CharSet.getInstance("-a");
-        array = set.getCharRanges();
-        assertEquals(2, array.length);
-        assertTrue(ArrayUtils.contains(array, CharRange.is('-')));
-        assertTrue(ArrayUtils.contains(array, CharRange.is('a')));
-        
-        set = CharSet.getInstance("a-");
-        array = set.getCharRanges();
-        assertEquals(2, array.length);
-        assertTrue(ArrayUtils.contains(array, CharRange.is('a')));
-        assertTrue(ArrayUtils.contains(array, CharRange.is('-')));
-        
-        set = CharSet.getInstance("a--");
-        array = set.getCharRanges();
-        assertEquals(1, array.length);
-        assertTrue(ArrayUtils.contains(array, CharRange.isIn('a', '-')));
-        
-        set = CharSet.getInstance("--a");
-        array = set.getCharRanges();
-        assertEquals(1, array.length);
-        assertTrue(ArrayUtils.contains(array, CharRange.isIn('-', 'a')));
-    }
-    
-    @Test
-    public void testConstructor_String_oddNegate() {
-        CharSet set;
-        CharRange[] array;
-        set = CharSet.getInstance("^");
-        array = set.getCharRanges();
-        assertEquals(1, array.length);
-        assertTrue(ArrayUtils.contains(array, CharRange.is('^'))); // "^"
-        
-        set = CharSet.getInstance("^^");
-        array = set.getCharRanges();
-        assertEquals(1, array.length);
-        assertTrue(ArrayUtils.contains(array, CharRange.isNot('^'))); // "^^"
-        
-        set = CharSet.getInstance("^^^");
-        array = set.getCharRanges();
-        assertEquals(2, array.length);
-        assertTrue(ArrayUtils.contains(array, CharRange.isNot('^'))); // "^^"
-        assertTrue(ArrayUtils.contains(array, CharRange.is('^'))); // "^"
-        
-        set = CharSet.getInstance("^^^^");
-        array = set.getCharRanges();
-        assertEquals(1, array.length);
-        assertTrue(ArrayUtils.contains(array, CharRange.isNot('^'))); // "^^" x2
-        
-        set = CharSet.getInstance("a^");
-        array = set.getCharRanges();
-        assertEquals(2, array.length);
-        assertTrue(ArrayUtils.contains(array, CharRange.is('a'))); // "a"
-        assertTrue(ArrayUtils.contains(array, CharRange.is('^'))); // "^"
-        
-        set = CharSet.getInstance("^a-");
-        array = set.getCharRanges();
-        assertEquals(2, array.length);
-        assertTrue(ArrayUtils.contains(array, CharRange.isNot('a'))); // "^a"
-        assertTrue(ArrayUtils.contains(array, CharRange.is('-'))); // "-"
-        
-        set = CharSet.getInstance("^^-c");
-        array = set.getCharRanges();
-        assertEquals(1, array.length);
-        assertTrue(ArrayUtils.contains(array, CharRange.isNotIn('^', 'c'))); // "^^-c"
-        
-        set = CharSet.getInstance("^c-^");
-        array = set.getCharRanges();
-        assertEquals(1, array.length);
-        assertTrue(ArrayUtils.contains(array, CharRange.isNotIn('c', '^'))); // "^c-^"
-        
-        set = CharSet.getInstance("^c-^d");
-        array = set.getCharRanges();
-        assertEquals(2, array.length);
-        assertTrue(ArrayUtils.contains(array, CharRange.isNotIn('c', '^'))); // "^c-^"
-        assertTrue(ArrayUtils.contains(array, CharRange.is('d'))); // "d"
-        
-        set = CharSet.getInstance("^^-");
-        array = set.getCharRanges();
-        assertEquals(2, array.length);
-        assertTrue(ArrayUtils.contains(array, CharRange.isNot('^'))); // "^^"
-        assertTrue(ArrayUtils.contains(array, CharRange.is('-'))); // "-"
-    }
-    
-    @Test
-    public void testConstructor_String_oddCombinations() {
-        CharSet set;
-        CharRange[] array = null;
-        
-        set = CharSet.getInstance("a-^c");
-        array = set.getCharRanges();
-        assertTrue(ArrayUtils.contains(array, CharRange.isIn('a', '^'))); // "a-^"
-        assertTrue(ArrayUtils.contains(array, CharRange.is('c'))); // "c"
-        assertFalse(set.contains('b'));
-        assertTrue(set.contains('^'));  
-        assertTrue(set.contains('_')); // between ^ and a
-        assertTrue(set.contains('c'));  
-        
-        set = CharSet.getInstance("^a-^c");
-        array = set.getCharRanges();
-        assertTrue(ArrayUtils.contains(array, CharRange.isNotIn('a', '^'))); // "^a-^"
-        assertTrue(ArrayUtils.contains(array, CharRange.is('c'))); // "c"
-        assertTrue(set.contains('b'));
-        assertFalse(set.contains('^'));  
-        assertFalse(set.contains('_')); // between ^ and a
-        
-        set = CharSet.getInstance("a- ^-- "); //contains everything
-        array = set.getCharRanges();
-        assertTrue(ArrayUtils.contains(array, CharRange.isIn('a', ' '))); // "a- "
-        assertTrue(ArrayUtils.contains(array, CharRange.isNotIn('-', ' '))); // "^-- "
-        assertTrue(set.contains('#'));
-        assertTrue(set.contains('^'));
-        assertTrue(set.contains('a'));
-        assertTrue(set.contains('*'));
-        assertTrue(set.contains('A'));
-        
-        set = CharSet.getInstance("^-b");
-        array = set.getCharRanges();
-        assertTrue(ArrayUtils.contains(array, CharRange.isIn('^','b'))); // "^-b"
-        assertTrue(set.contains('b'));
-        assertTrue(set.contains('_')); // between ^ and a
-        assertFalse(set.contains('A'));
-        assertTrue(set.contains('^')); 
-        
-        set = CharSet.getInstance("b-^");
-        array = set.getCharRanges();
-        assertTrue(ArrayUtils.contains(array, CharRange.isIn('^','b'))); // "b-^"
-        assertTrue(set.contains('b'));
-        assertTrue(set.contains('^'));
-        assertTrue(set.contains('a')); // between ^ and b
-        assertFalse(set.contains('c')); 
-    }
-        
-    //-----------------------------------------------------------------------    
-    @Test
-    public void testEquals_Object() {
-        final CharSet abc = CharSet.getInstance("abc");
-        final CharSet abc2 = CharSet.getInstance("abc");
-        final CharSet atoc = CharSet.getInstance("a-c");
-        final CharSet atoc2 = CharSet.getInstance("a-c");
-        final CharSet notatoc = CharSet.getInstance("^a-c");
-        final CharSet notatoc2 = CharSet.getInstance("^a-c");
-        
-        assertFalse(abc.equals(null));
-        
-        assertTrue(abc.equals(abc));
-        assertTrue(abc.equals(abc2));
-        assertFalse(abc.equals(atoc));
-        assertFalse(abc.equals(notatoc));
-        
-        assertFalse(atoc.equals(abc));
-        assertTrue(atoc.equals(atoc));
-        assertTrue(atoc.equals(atoc2));
-        assertFalse(atoc.equals(notatoc));
-        
-        assertFalse(notatoc.equals(abc));
-        assertFalse(notatoc.equals(atoc));
-        assertTrue(notatoc.equals(notatoc));
-        assertTrue(notatoc.equals(notatoc2));
-    }
-            
-    @Test
-    public void testHashCode() {
-        final CharSet abc = CharSet.getInstance("abc");
-        final CharSet abc2 = CharSet.getInstance("abc");
-        final CharSet atoc = CharSet.getInstance("a-c");
-        final CharSet atoc2 = CharSet.getInstance("a-c");
-        final CharSet notatoc = CharSet.getInstance("^a-c");
-        final CharSet notatoc2 = CharSet.getInstance("^a-c");
-        
-        assertEquals(abc.hashCode(), abc.hashCode());
-        assertEquals(abc.hashCode(), abc2.hashCode());
-        assertEquals(atoc.hashCode(), atoc.hashCode());
-        assertEquals(atoc.hashCode(), atoc2.hashCode());
-        assertEquals(notatoc.hashCode(), notatoc.hashCode());
-        assertEquals(notatoc.hashCode(), notatoc2.hashCode());
-    }
-    
-    //-----------------------------------------------------------------------    
-    @Test
-    public void testContains_Char() {
-        final CharSet btod = CharSet.getInstance("b-d");
-        final CharSet dtob = CharSet.getInstance("d-b");
-        final CharSet bcd = CharSet.getInstance("bcd");
-        final CharSet bd = CharSet.getInstance("bd");
-        final CharSet notbtod = CharSet.getInstance("^b-d");
-        
-        assertFalse(btod.contains('a'));
-        assertTrue(btod.contains('b'));
-        assertTrue(btod.contains('c'));
-        assertTrue(btod.contains('d'));
-        assertFalse(btod.contains('e'));
-        
-        assertFalse(bcd.contains('a'));
-        assertTrue(bcd.contains('b'));
-        assertTrue(bcd.contains('c'));
-        assertTrue(bcd.contains('d'));
-        assertFalse(bcd.contains('e'));
-        
-        assertFalse(bd.contains('a'));
-        assertTrue(bd.contains('b'));
-        assertFalse(bd.contains('c'));
-        assertTrue(bd.contains('d'));
-        assertFalse(bd.contains('e'));
-        
-        assertTrue(notbtod.contains('a'));
-        assertFalse(notbtod.contains('b'));
-        assertFalse(notbtod.contains('c'));
-        assertFalse(notbtod.contains('d'));
-        assertTrue(notbtod.contains('e'));
-        
-        assertFalse(dtob.contains('a'));
-        assertTrue(dtob.contains('b'));
-        assertTrue(dtob.contains('c'));
-        assertTrue(dtob.contains('d'));
-        assertFalse(dtob.contains('e'));
-      
-        final CharRange[] array = dtob.getCharRanges();
-        assertEquals("[b-d]", dtob.toString());
-        assertEquals(1, array.length);
-    }
-    
-    //-----------------------------------------------------------------------    
-    @Test
-    public void testSerialization() {
-        CharSet set = CharSet.getInstance("a");
-        assertEquals(set, SerializationUtils.clone(set)); 
-        set = CharSet.getInstance("a-e");
-        assertEquals(set, SerializationUtils.clone(set)); 
-        set = CharSet.getInstance("be-f^a-z");
-        assertEquals(set, SerializationUtils.clone(set)); 
-    }
-    
-    //-----------------------------------------------------------------------    
-    @Test
-    public void testStatics() {
-        CharRange[] array;
-        
-        array = CharSet.EMPTY.getCharRanges();
-        assertEquals(0, array.length);
-        
-        array = CharSet.ASCII_ALPHA.getCharRanges();
-        assertEquals(2, array.length);
-        assertTrue(ArrayUtils.contains(array, CharRange.isIn('a', 'z')));
-        assertTrue(ArrayUtils.contains(array, CharRange.isIn('A', 'Z')));
-        
-        array = CharSet.ASCII_ALPHA_LOWER.getCharRanges();
-        assertEquals(1, array.length);
-        assertTrue(ArrayUtils.contains(array, CharRange.isIn('a', 'z')));
-        
-        array = CharSet.ASCII_ALPHA_UPPER.getCharRanges();
-        assertEquals(1, array.length);
-        assertTrue(ArrayUtils.contains(array, CharRange.isIn('A', 'Z')));
-        
-        array = CharSet.ASCII_NUMERIC.getCharRanges();
-        assertEquals(1, array.length);
-        assertTrue(ArrayUtils.contains(array, CharRange.isIn('0', '9')));
-    }
-    
-}
diff --git a/lang/src/test/java/org/apache/commons/lang3/CharSetUtilsTest.java b/lang/src/test/java/org/apache/commons/lang3/CharSetUtilsTest.java
deleted file mode 100644
index d0df7ad..0000000
--- a/lang/src/test/java/org/apache/commons/lang3/CharSetUtilsTest.java
+++ /dev/null
@@ -1,254 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- * 
- *      http://www.apache.org/licenses/LICENSE-2.0
- * 
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.commons.lang3;
-
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertFalse;
-import static org.junit.Assert.assertNotNull;
-import static org.junit.Assert.assertTrue;
-
-import java.lang.reflect.Constructor;
-import java.lang.reflect.Modifier;
-
-import org.junit.Test;
-
-/**
- * Unit tests {@link org.apache.commons.lang3.CharSetUtils}.
- *
- * @version $Id$
- */
-public class CharSetUtilsTest  {
-
-    //-----------------------------------------------------------------------
-    @Test
-    public void testConstructor() {
-        assertNotNull(new CharSetUtils());
-        final Constructor<?>[] cons = CharSetUtils.class.getDeclaredConstructors();
-        assertEquals(1, cons.length);
-        assertTrue(Modifier.isPublic(cons[0].getModifiers()));
-        assertTrue(Modifier.isPublic(CharSetUtils.class.getModifiers()));
-        assertFalse(Modifier.isFinal(CharSetUtils.class.getModifiers()));
-    }
-    
-    //-----------------------------------------------------------------------
-    @Test
-    public void testSqueeze_StringString() {
-        assertEquals(null, CharSetUtils.squeeze(null, (String) null));
-        assertEquals(null, CharSetUtils.squeeze(null, ""));
-        
-        assertEquals("", CharSetUtils.squeeze("", (String) null));
-        assertEquals("", CharSetUtils.squeeze("", ""));
-        assertEquals("", CharSetUtils.squeeze("", "a-e"));
-        
-        assertEquals("hello", CharSetUtils.squeeze("hello", (String) null));
-        assertEquals("hello", CharSetUtils.squeeze("hello", ""));
-        assertEquals("hello", CharSetUtils.squeeze("hello", "a-e"));
-        assertEquals("helo", CharSetUtils.squeeze("hello", "l-p"));
-        assertEquals("heloo", CharSetUtils.squeeze("helloo", "l"));
-        assertEquals("hello", CharSetUtils.squeeze("helloo", "^l"));
-    }
-    
-    @Test
-    public void testSqueeze_StringStringarray() {
-        assertEquals(null, CharSetUtils.squeeze(null, (String[]) null));
-        assertEquals(null, CharSetUtils.squeeze(null, new String[0]));
-        assertEquals(null, CharSetUtils.squeeze(null, new String[] {null}));
-        assertEquals(null, CharSetUtils.squeeze(null, new String[] {"el"}));
-        
-        assertEquals("", CharSetUtils.squeeze("", (String[]) null));
-        assertEquals("", CharSetUtils.squeeze("", new String[0]));
-        assertEquals("", CharSetUtils.squeeze("", new String[] {null}));
-        assertEquals("", CharSetUtils.squeeze("", new String[] {"a-e"}));
-        
-        assertEquals("hello", CharSetUtils.squeeze("hello", (String[]) null));
-        assertEquals("hello", CharSetUtils.squeeze("hello", new String[0]));
-        assertEquals("hello", CharSetUtils.squeeze("hello", new String[] {null}));
-        assertEquals("hello", CharSetUtils.squeeze("hello", new String[] {"a-e"}));
-        
-        assertEquals("helo", CharSetUtils.squeeze("hello", new String[] { "el" }));
-        assertEquals("hello", CharSetUtils.squeeze("hello", new String[] { "e" }));
-        assertEquals("fofof", CharSetUtils.squeeze("fooffooff", new String[] { "of" }));
-        assertEquals("fof", CharSetUtils.squeeze("fooooff", new String[] { "fo" }));
-    }
-
-    //-----------------------------------------------------------------------
-    @Test
-    public void testContainsAny_StringString() {
-        assertFalse(CharSetUtils.containsAny(null, (String) null));
-        assertFalse(CharSetUtils.containsAny(null, ""));
-        
-        assertFalse(CharSetUtils.containsAny("", (String) null));
-        assertFalse(CharSetUtils.containsAny("", ""));
-        assertFalse(CharSetUtils.containsAny("", "a-e"));
-        
-        assertFalse(CharSetUtils.containsAny("hello", (String) null));
-        assertFalse(CharSetUtils.containsAny("hello", ""));
-        assertTrue(CharSetUtils.containsAny("hello", "a-e"));
-        assertTrue(CharSetUtils.containsAny("hello", "l-p"));
-    }
-    
-    @Test
-    public void testContainsAny_StringStringarray() {
-        assertFalse(CharSetUtils.containsAny(null, (String[]) null));
-        assertFalse(CharSetUtils.containsAny(null, new String[0]));
-        assertFalse(CharSetUtils.containsAny(null, new String[] {null}));
-        assertFalse(CharSetUtils.containsAny(null, new String[] {"a-e"}));
-        
-        assertFalse(CharSetUtils.containsAny("", (String[]) null));
-        assertFalse(CharSetUtils.containsAny("", new String[0]));
-        assertFalse(CharSetUtils.containsAny("", new String[] {null}));
-        assertFalse(CharSetUtils.containsAny("", new String[] {"a-e"}));
-        
-        assertFalse(CharSetUtils.containsAny("hello", (String[]) null));
-        assertFalse(CharSetUtils.containsAny("hello", new String[0]));
-        assertFalse(CharSetUtils.containsAny("hello", new String[] {null}));
-        assertTrue(CharSetUtils.containsAny("hello", new String[] {"a-e"}));
-        
-        assertTrue(CharSetUtils.containsAny("hello", new String[] { "el" }));
-        assertFalse(CharSetUtils.containsAny("hello", new String[] { "x" }));
-        assertTrue(CharSetUtils.containsAny("hello", new String[] { "e-i" }));
-        assertTrue(CharSetUtils.containsAny("hello", new String[] { "a-z" }));
-        assertFalse(CharSetUtils.containsAny("hello", new String[] { "" }));
-    }
-
-    //-----------------------------------------------------------------------
-    @Test
-    public void testCount_StringString() {
-        assertEquals(0, CharSetUtils.count(null, (String) null));
-        assertEquals(0, CharSetUtils.count(null, ""));
-        
-        assertEquals(0, CharSetUtils.count("", (String) null));
-        assertEquals(0, CharSetUtils.count("", ""));
-        assertEquals(0, CharSetUtils.count("", "a-e"));
-        
-        assertEquals(0, CharSetUtils.count("hello", (String) null));
-        assertEquals(0, CharSetUtils.count("hello", ""));
-        assertEquals(1, CharSetUtils.count("hello", "a-e"));
-        assertEquals(3, CharSetUtils.count("hello", "l-p"));
-    }
-    
-    @Test
-    public void testCount_StringStringarray() {
-        assertEquals(0, CharSetUtils.count(null, (String[]) null));
-        assertEquals(0, CharSetUtils.count(null, new String[0]));
-        assertEquals(0, CharSetUtils.count(null, new String[] {null}));
-        assertEquals(0, CharSetUtils.count(null, new String[] {"a-e"}));
-        
-        assertEquals(0, CharSetUtils.count("", (String[]) null));
-        assertEquals(0, CharSetUtils.count("", new String[0]));
-        assertEquals(0, CharSetUtils.count("", new String[] {null}));
-        assertEquals(0, CharSetUtils.count("", new String[] {"a-e"}));
-        
-        assertEquals(0, CharSetUtils.count("hello", (String[]) null));
-        assertEquals(0, CharSetUtils.count("hello", new String[0]));
-        assertEquals(0, CharSetUtils.count("hello", new String[] {null}));
-        assertEquals(1, CharSetUtils.count("hello", new String[] {"a-e"}));
-        
-        assertEquals(3, CharSetUtils.count("hello", new String[] { "el" }));
-        assertEquals(0, CharSetUtils.count("hello", new String[] { "x" }));
-        assertEquals(2, CharSetUtils.count("hello", new String[] { "e-i" }));
-        assertEquals(5, CharSetUtils.count("hello", new String[] { "a-z" }));
-        assertEquals(0, CharSetUtils.count("hello", new String[] { "" }));
-    }
-
-    //-----------------------------------------------------------------------
-    @Test
-    public void testKeep_StringString() {
-        assertEquals(null, CharSetUtils.keep(null, (String) null));
-        assertEquals(null, CharSetUtils.keep(null, ""));
-        
-        assertEquals("", CharSetUtils.keep("", (String) null));
-        assertEquals("", CharSetUtils.keep("", ""));
-        assertEquals("", CharSetUtils.keep("", "a-e"));
-        
-        assertEquals("", CharSetUtils.keep("hello", (String) null));
-        assertEquals("", CharSetUtils.keep("hello", ""));
-        assertEquals("", CharSetUtils.keep("hello", "xyz"));
-        assertEquals("hello", CharSetUtils.keep("hello", "a-z"));
-        assertEquals("hello", CharSetUtils.keep("hello", "oleh"));
-        assertEquals("ell", CharSetUtils.keep("hello", "el"));
-    }
-    
-    @Test
-    public void testKeep_StringStringarray() {
-        assertEquals(null, CharSetUtils.keep(null, (String[]) null));
-        assertEquals(null, CharSetUtils.keep(null, new String[0]));
-        assertEquals(null, CharSetUtils.keep(null, new String[] {null}));
-        assertEquals(null, CharSetUtils.keep(null, new String[] {"a-e"}));
-        
-        assertEquals("", CharSetUtils.keep("", (String[]) null));
-        assertEquals("", CharSetUtils.keep("", new String[0]));
-        assertEquals("", CharSetUtils.keep("", new String[] {null}));
-        assertEquals("", CharSetUtils.keep("", new String[] {"a-e"}));
-        
-        assertEquals("", CharSetUtils.keep("hello", (String[]) null));
-        assertEquals("", CharSetUtils.keep("hello", new String[0]));
-        assertEquals("", CharSetUtils.keep("hello", new String[] {null}));
-        assertEquals("e", CharSetUtils.keep("hello", new String[] {"a-e"}));
-        
-        assertEquals("e", CharSetUtils.keep("hello", new String[] { "a-e" }));
-        assertEquals("ell", CharSetUtils.keep("hello", new String[] { "el" }));
-        assertEquals("hello", CharSetUtils.keep("hello", new String[] { "elho" }));
-        assertEquals("hello", CharSetUtils.keep("hello", new String[] { "a-z" }));
-        assertEquals("----", CharSetUtils.keep("----", new String[] { "-" }));
-        assertEquals("ll", CharSetUtils.keep("hello", new String[] { "l" }));
-    }
-
-    //-----------------------------------------------------------------------
-    @Test
-    public void testDelete_StringString() {
-        assertEquals(null, CharSetUtils.delete(null, (String) null));
-        assertEquals(null, CharSetUtils.delete(null, ""));
-        
-        assertEquals("", CharSetUtils.delete("", (String) null));
-        assertEquals("", CharSetUtils.delete("", ""));
-        assertEquals("", CharSetUtils.delete("", "a-e"));
-        
-        assertEquals("hello", CharSetUtils.delete("hello", (String) null));
-        assertEquals("hello", CharSetUtils.delete("hello", ""));
-        assertEquals("hllo", CharSetUtils.delete("hello", "a-e"));
-        assertEquals("he", CharSetUtils.delete("hello", "l-p"));
-        assertEquals("hello", CharSetUtils.delete("hello", "z"));
-    }
-    
-    @Test
-    public void testDelete_StringStringarray() {
-        assertEquals(null, CharSetUtils.delete(null, (String[]) null));
-        assertEquals(null, CharSetUtils.delete(null, new String[0]));
-        assertEquals(null, CharSetUtils.delete(null, new String[] {null}));
-        assertEquals(null, CharSetUtils.delete(null, new String[] {"el"}));
-        
-        assertEquals("", CharSetUtils.delete("", (String[]) null));
-        assertEquals("", CharSetUtils.delete("", new String[0]));
-        assertEquals("", CharSetUtils.delete("", new String[] {null}));
-        assertEquals("", CharSetUtils.delete("", new String[] {"a-e"}));
-        
-        assertEquals("hello", CharSetUtils.delete("hello", (String[]) null));
-        assertEquals("hello", CharSetUtils.delete("hello", new String[0]));
-        assertEquals("hello", CharSetUtils.delete("hello", new String[] {null}));
-        assertEquals("hello", CharSetUtils.delete("hello", new String[] {"xyz"}));
-
-        assertEquals("ho", CharSetUtils.delete("hello", new String[] { "el" }));
-        assertEquals("", CharSetUtils.delete("hello", new String[] { "elho" }));
-        assertEquals("hello", CharSetUtils.delete("hello", new String[] { "" }));
-        assertEquals("hello", CharSetUtils.delete("hello", ""));
-        assertEquals("", CharSetUtils.delete("hello", new String[] { "a-z" }));
-        assertEquals("", CharSetUtils.delete("----", new String[] { "-" }));
-        assertEquals("heo", CharSetUtils.delete("hello", new String[] { "l" }));
-    }
-    
-}
diff --git a/lang/src/test/java/org/apache/commons/lang3/CharUtilsPerfRun.java b/lang/src/test/java/org/apache/commons/lang3/CharUtilsPerfRun.java
deleted file mode 100644
index d6b54d9..0000000
--- a/lang/src/test/java/org/apache/commons/lang3/CharUtilsPerfRun.java
+++ /dev/null
@@ -1,162 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- * 
- *      http://www.apache.org/licenses/LICENSE-2.0
- * 
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package org.apache.commons.lang3;
-
-import java.text.NumberFormat;
-import java.util.Calendar;
-
-/**
- * Tests the difference in performance between CharUtils and CharSet.
- * 
- * Sample runs:
-
-Now: Thu Mar 18 14:29:48 PST 2004
-Sun Microsystems Inc. Java(TM) 2 Runtime Environment, Standard Edition 1.3.1_10-b03
-Sun Microsystems Inc. Java HotSpot(TM) Client VM 1.3.1_10-b03
-Windows XP 5.1 x86 pentium i486 i386
-Do nohting: 0 milliseconds.
-run_CharUtils_isAsciiNumeric: 4,545 milliseconds.
-run_inlined_CharUtils_isAsciiNumeric: 3,417 milliseconds.
-run_inlined_CharUtils_isAsciiNumeric: 85,679 milliseconds.
-
-
-Now: Thu Mar 18 14:24:51 PST 2004
-Sun Microsystems Inc. Java(TM) 2 Runtime Environment, Standard Edition 1.4.2_04-b05
-Sun Microsystems Inc. Java HotSpot(TM) Client VM 1.4.2_04-b05
-Windows XP 5.1 x86 pentium i486 i386
-Do nohting: 0 milliseconds.
-run_CharUtils_isAsciiNumeric: 2,578 milliseconds.
-run_inlined_CharUtils_isAsciiNumeric: 2,477 milliseconds.
-run_inlined_CharUtils_isAsciiNumeric: 114,429 milliseconds.
-
-Now: Thu Mar 18 14:27:55 PST 2004
-Sun Microsystems Inc. Java(TM) 2 Runtime Environment, Standard Edition 1.4.2_04-b05
-Sun Microsystems Inc. Java HotSpot(TM) Server VM 1.4.2_04-b05
-Windows XP 5.1 x86 pentium i486 i386
-Do nohting: 0 milliseconds.
-run_CharUtils_isAsciiNumeric: 630 milliseconds.
-run_inlined_CharUtils_isAsciiNumeric: 709 milliseconds.
-run_inlined_CharUtils_isAsciiNumeric: 84,420 milliseconds.
-
-
- * @version $Id$
- */
-public class CharUtilsPerfRun {
-    final static String VERSION = "$Id$";
-
-    final static int WARM_UP = 100;
-
-    final static int COUNT = 5000;
-
-    final static char[] CHAR_SAMPLES;
-    static {
-        CHAR_SAMPLES = new char[Character.MAX_VALUE];
-        for (char i = Character.MIN_VALUE; i < Character.MAX_VALUE; i++) {
-            CHAR_SAMPLES[i] = i;
-        }
-    }
-
-    public static void main(final String[] args) {
-        new CharUtilsPerfRun().run();
-    }
-
-    private void printSysInfo() {
-        System.out.println(VERSION);
-        System.out.println("Now: " + Calendar.getInstance().getTime());
-        System.out.println(System.getProperty("java.vendor")
-                + " "
-                + System.getProperty("java.runtime.name")
-                + " "
-                + System.getProperty("java.runtime.version"));
-        System.out.println(System.getProperty("java.vm.vendor")
-                + " "
-                + System.getProperty("java.vm.name")
-                + " "
-                + System.getProperty("java.vm.version"));
-        System.out.println(System.getProperty("os.name")
-            + " "
-            + System.getProperty("os.version")
-            + " "
-            + System.getProperty("os.arch")
-            + " "
-            + System.getProperty("sun.cpu.isalist"));
-    }
-
-    private void run() {
-        this.printSysInfo();
-        long start;
-        start = System.currentTimeMillis();
-        this.printlnTotal("Do nohting", start);
-        //System.out.println("Warming up...");
-        run_CharUtils_isAsciiNumeric(WARM_UP);
-        //System.out.println("Measuring...");
-        start = System.currentTimeMillis();
-        run_CharUtils_isAsciiNumeric(COUNT);
-        this.printlnTotal("run_CharUtils_isAsciiNumeric", start);
-        //System.out.println("Warming up...");
-        run_inlined_CharUtils_isAsciiNumeric(WARM_UP);
-        //System.out.println("Measuring...");
-        start = System.currentTimeMillis();
-        run_inlined_CharUtils_isAsciiNumeric(COUNT);
-        this.printlnTotal("run_inlined_CharUtils_isAsciiNumeric", start);
-        //System.out.println("Warming up...");
-        run_CharSet(WARM_UP);
-        //System.out.println("Measuring...");
-        start = System.currentTimeMillis();
-        run_CharSet(COUNT);
-        this.printlnTotal("run_CharSet", start);
-    }
-
-    private int run_CharSet(final int loopCount) {
-        int t = 0;
-        for (int i = 0; i < loopCount; i++) {
-            for (final char ch : CHAR_SAMPLES) {
-                final boolean b = CharSet.ASCII_NUMERIC.contains(ch);
-                t += b ? 1 : 0;
-            }
-        }
-        return t;
-    }
-
-    private int run_CharUtils_isAsciiNumeric(final int loopCount) {
-        int t = 0;
-        for (int i = 0; i < loopCount; i++) {
-            for (final char ch : CHAR_SAMPLES) {
-                final boolean b = CharUtils.isAsciiNumeric(ch);
-                t += b ? 1 : 0;
-            }
-        }
-        return t;
-    }
-
-    private int run_inlined_CharUtils_isAsciiNumeric(final int loopCount) {
-        int t = 0;
-        for (int i = 0; i < loopCount; i++) {
-            for (final char ch : CHAR_SAMPLES) {
-                final boolean b = ch >= '0' && ch <= '9';
-                t += b ? 1 : 0;
-            }
-        }
-        return t;
-    }
-
-    private void printlnTotal(final String prefix, final long start) {
-        final long total = System.currentTimeMillis() - start;
-        System.out.println(prefix + ": " + NumberFormat.getInstance().format(total) + " milliseconds.");
-    }
-}
diff --git a/lang/src/test/java/org/apache/commons/lang3/CharUtilsTest.java b/lang/src/test/java/org/apache/commons/lang3/CharUtilsTest.java
deleted file mode 100644
index f6297c6..0000000
--- a/lang/src/test/java/org/apache/commons/lang3/CharUtilsTest.java
+++ /dev/null
@@ -1,365 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- * 
- *      http://www.apache.org/licenses/LICENSE-2.0
- * 
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.commons.lang3;
-
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertFalse;
-import static org.junit.Assert.assertNotNull;
-import static org.junit.Assert.assertSame;
-import static org.junit.Assert.assertTrue;
-
-import java.lang.reflect.Constructor;
-import java.lang.reflect.Modifier;
-
-import org.junit.Test;
-
-/**
- * Unit tests {@link org.apache.commons.lang3.CharUtils}.
- *
- * @version $Id$
- */
-public class CharUtilsTest {
-
-    private static final Character CHARACTER_A = new Character('A');
-    private static final Character CHARACTER_B = new Character('B');
-    private static final char CHAR_COPY = '\u00a9';
-    
-    @Test
-    public void testConstructor() {
-        assertNotNull(new CharUtils());
-        final Constructor<?>[] cons = CharUtils.class.getDeclaredConstructors();
-        assertEquals(1, cons.length);
-        assertTrue(Modifier.isPublic(cons[0].getModifiers()));
-        assertTrue(Modifier.isPublic(BooleanUtils.class.getModifiers()));
-        assertFalse(Modifier.isFinal(BooleanUtils.class.getModifiers()));
-    }
-    
-    @SuppressWarnings("deprecation") // intentional test of deprecated method
-    @Test
-    public void testToCharacterObject_char() {
-        assertEquals(new Character('a'), CharUtils.toCharacterObject('a'));
-        assertSame(CharUtils.toCharacterObject('a'), CharUtils.toCharacterObject('a'));
-       
-        for (int i = 0; i < 128; i++) {
-            final Character ch = CharUtils.toCharacterObject((char) i);
-            final Character ch2 = CharUtils.toCharacterObject((char) i);
-            assertSame(ch, ch2);
-            assertEquals(i, ch.charValue());
-        }
-        for (int i = 128; i < 196; i++) {
-            final Character ch = CharUtils.toCharacterObject((char) i);
-            final Character ch2 = CharUtils.toCharacterObject((char) i);
-            assertEquals(ch, ch2);
-            assertTrue(ch != ch2);
-            assertEquals(i, ch.charValue());
-            assertEquals(i, ch2.charValue());
-        }
-        assertSame(CharUtils.toCharacterObject("a"), CharUtils.toCharacterObject('a'));
-    }
-    
-    @Test
-    public void testToCharacterObject_String() {
-        assertEquals(null, CharUtils.toCharacterObject(null));
-        assertEquals(null, CharUtils.toCharacterObject(""));
-        assertEquals(new Character('a'), CharUtils.toCharacterObject("a"));
-        assertEquals(new Character('a'), CharUtils.toCharacterObject("abc"));
-        assertSame(CharUtils.toCharacterObject("a"), CharUtils.toCharacterObject("a"));
-    }
-    
-    @Test
-    public void testToChar_Character() {
-        assertEquals('A', CharUtils.toChar(CHARACTER_A));
-        assertEquals('B', CharUtils.toChar(CHARACTER_B));
-        try {
-            CharUtils.toChar((Character) null);
-        } catch (final IllegalArgumentException ex) {}
-    }
-    
-    @Test
-    public void testToChar_Character_char() {
-        assertEquals('A', CharUtils.toChar(CHARACTER_A, 'X'));
-        assertEquals('B', CharUtils.toChar(CHARACTER_B, 'X'));
-        assertEquals('X', CharUtils.toChar((Character) null, 'X'));
-    }
-    
-    @Test
-    public void testToChar_String() {
-        assertEquals('A', CharUtils.toChar("A"));
-        assertEquals('B', CharUtils.toChar("BA"));
-        try {
-            CharUtils.toChar((String) null);
-        } catch (final IllegalArgumentException ex) {}
-        try {
-            CharUtils.toChar("");
-        } catch (final IllegalArgumentException ex) {}
-    }
-    
-    @Test
-    public void testToChar_String_char() {
-        assertEquals('A', CharUtils.toChar("A", 'X'));
-        assertEquals('B', CharUtils.toChar("BA", 'X'));
-        assertEquals('X', CharUtils.toChar("", 'X'));
-        assertEquals('X', CharUtils.toChar((String) null, 'X'));
-    }
-    
-    @Test
-    public void testToIntValue_char() {
-        assertEquals(0, CharUtils.toIntValue('0'));
-        assertEquals(1, CharUtils.toIntValue('1'));
-        assertEquals(2, CharUtils.toIntValue('2'));
-        assertEquals(3, CharUtils.toIntValue('3'));
-        assertEquals(4, CharUtils.toIntValue('4'));
-        assertEquals(5, CharUtils.toIntValue('5'));
-        assertEquals(6, CharUtils.toIntValue('6'));
-        assertEquals(7, CharUtils.toIntValue('7'));
-        assertEquals(8, CharUtils.toIntValue('8'));
-        assertEquals(9, CharUtils.toIntValue('9'));
-        try {
-            CharUtils.toIntValue('a');
-        } catch (final IllegalArgumentException ex) {}
-    }
-    
-    @Test
-    public void testToIntValue_char_int() {
-        assertEquals(0, CharUtils.toIntValue('0', -1));
-        assertEquals(3, CharUtils.toIntValue('3', -1));
-        assertEquals(-1, CharUtils.toIntValue('a', -1));
-    }
-    
-    @Test
-    public void testToIntValue_Character() {
-        assertEquals(0, CharUtils.toIntValue(new Character('0')));
-        assertEquals(3, CharUtils.toIntValue(new Character('3')));
-        try {
-            CharUtils.toIntValue(null);
-        } catch (final IllegalArgumentException ex) {}
-        try {
-            CharUtils.toIntValue(CHARACTER_A);
-        } catch (final IllegalArgumentException ex) {}
-    }
-    
-    @Test
-    public void testToIntValue_Character_int() {
-        assertEquals(0, CharUtils.toIntValue(new Character('0'), -1));
-        assertEquals(3, CharUtils.toIntValue(new Character('3'), -1));
-        assertEquals(-1, CharUtils.toIntValue(new Character('A'), -1));
-        assertEquals(-1, CharUtils.toIntValue(null, -1));
-    }
-    
-    @Test
-    public void testToString_char() {
-        assertEquals("a", CharUtils.toString('a'));
-        assertSame(CharUtils.toString('a'), CharUtils.toString('a'));
-       
-        for (int i = 0; i < 128; i++) {
-            final String str = CharUtils.toString((char) i);
-            final String str2 = CharUtils.toString((char) i);
-            assertSame(str, str2);
-            assertEquals(1, str.length());
-            assertEquals(i, str.charAt(0));
-        }
-        for (int i = 128; i < 196; i++) {
-            final String str = CharUtils.toString((char) i);
-            final String str2 = CharUtils.toString((char) i);
-            assertEquals(str, str2);
-            assertTrue(str != str2);
-            assertEquals(1, str.length());
-            assertEquals(i, str.charAt(0));
-            assertEquals(1, str2.length());
-            assertEquals(i, str2.charAt(0));
-        }
-    }
-    
-    @Test
-    public void testToString_Character() {
-        assertEquals(null, CharUtils.toString(null));
-        assertEquals("A", CharUtils.toString(CHARACTER_A));
-        assertSame(CharUtils.toString(CHARACTER_A), CharUtils.toString(CHARACTER_A));
-    }
-    
-    @Test
-    public void testToUnicodeEscaped_char() {
-        assertEquals("\\u0041", CharUtils.unicodeEscaped('A'));
-        assertEquals("\\u004c", CharUtils.unicodeEscaped('L'));
-       
-        for (int i = 0; i < 196; i++) {
-            final String str = CharUtils.unicodeEscaped((char) i);
-            assertEquals(6, str.length());
-            final int val = Integer.parseInt(str.substring(2), 16);
-            assertEquals(i, val);
-        }
-        assertEquals("\\u0999", CharUtils.unicodeEscaped((char) 0x999));
-        assertEquals("\\u1001", CharUtils.unicodeEscaped((char) 0x1001));
-    }
-    
-    @Test
-    public void testToUnicodeEscaped_Character() {
-        assertEquals(null, CharUtils.unicodeEscaped(null));
-        assertEquals("\\u0041", CharUtils.unicodeEscaped(CHARACTER_A));
-    }
-    
-    @Test
-    public void testIsAscii_char() {
-        assertTrue(CharUtils.isAscii('a'));
-        assertTrue(CharUtils.isAscii('A'));
-        assertTrue(CharUtils.isAscii('3'));
-        assertTrue(CharUtils.isAscii('-'));
-        assertTrue(CharUtils.isAscii('\n'));
-        assertFalse(CharUtils.isAscii(CHAR_COPY));
-       
-        for (int i = 0; i < 128; i++) {
-            if (i < 128) {
-                assertTrue(CharUtils.isAscii((char) i));
-            } else {
-                assertFalse(CharUtils.isAscii((char) i));
-            }
-        }
-    }
-    
-    @Test
-    public void testIsAsciiPrintable_char() {
-        assertTrue(CharUtils.isAsciiPrintable('a'));
-        assertTrue(CharUtils.isAsciiPrintable('A'));
-        assertTrue(CharUtils.isAsciiPrintable('3'));
-        assertTrue(CharUtils.isAsciiPrintable('-'));
-        assertFalse(CharUtils.isAsciiPrintable('\n'));
-        assertFalse(CharUtils.isAscii(CHAR_COPY));
-       
-        for (int i = 0; i < 196; i++) {
-            if (i >= 32 && i <= 126) {
-                assertTrue(CharUtils.isAsciiPrintable((char) i));
-            } else {
-                assertFalse(CharUtils.isAsciiPrintable((char) i));
-            }
-        }
-    }
-    
-    @Test
-    public void testIsAsciiControl_char() {
-        assertFalse(CharUtils.isAsciiControl('a'));
-        assertFalse(CharUtils.isAsciiControl('A'));
-        assertFalse(CharUtils.isAsciiControl('3'));
-        assertFalse(CharUtils.isAsciiControl('-'));
-        assertTrue(CharUtils.isAsciiControl('\n'));
-        assertFalse(CharUtils.isAsciiControl(CHAR_COPY));
-       
-        for (int i = 0; i < 196; i++) {
-            if (i < 32 || i == 127) {
-                assertTrue(CharUtils.isAsciiControl((char) i));
-            } else {
-                assertFalse(CharUtils.isAsciiControl((char) i));
-            }
-        }
-    }
-    
-    @Test
-    public void testIsAsciiAlpha_char() {
-        assertTrue(CharUtils.isAsciiAlpha('a'));
-        assertTrue(CharUtils.isAsciiAlpha('A'));
-        assertFalse(CharUtils.isAsciiAlpha('3'));
-        assertFalse(CharUtils.isAsciiAlpha('-'));
-        assertFalse(CharUtils.isAsciiAlpha('\n'));
-        assertFalse(CharUtils.isAsciiAlpha(CHAR_COPY));
-       
-        for (int i = 0; i < 196; i++) {
-            if ((i >= 'A' && i <= 'Z') || (i >= 'a' && i <= 'z')) {
-                assertTrue(CharUtils.isAsciiAlpha((char) i));
-            } else {
-                assertFalse(CharUtils.isAsciiAlpha((char) i));
-            }
-        }
-    }
-    
-    @Test
-    public void testIsAsciiAlphaUpper_char() {
-        assertFalse(CharUtils.isAsciiAlphaUpper('a'));
-        assertTrue(CharUtils.isAsciiAlphaUpper('A'));
-        assertFalse(CharUtils.isAsciiAlphaUpper('3'));
-        assertFalse(CharUtils.isAsciiAlphaUpper('-'));
-        assertFalse(CharUtils.isAsciiAlphaUpper('\n'));
-        assertFalse(CharUtils.isAsciiAlphaUpper(CHAR_COPY));
-       
-        for (int i = 0; i < 196; i++) {
-            if (i >= 'A' && i <= 'Z') {
-                assertTrue(CharUtils.isAsciiAlphaUpper((char) i));
-            } else {
-                assertFalse(CharUtils.isAsciiAlphaUpper((char) i));
-            }
-        }
-    }
-    
-    @Test
-    public void testIsAsciiAlphaLower_char() {
-        assertTrue(CharUtils.isAsciiAlphaLower('a'));
-        assertFalse(CharUtils.isAsciiAlphaLower('A'));
-        assertFalse(CharUtils.isAsciiAlphaLower('3'));
-        assertFalse(CharUtils.isAsciiAlphaLower('-'));
-        assertFalse(CharUtils.isAsciiAlphaLower('\n'));
-        assertFalse(CharUtils.isAsciiAlphaLower(CHAR_COPY));
-       
-        for (int i = 0; i < 196; i++) {
-            if (i >= 'a' && i <= 'z') {
-                assertTrue(CharUtils.isAsciiAlphaLower((char) i));
-            } else {
-                assertFalse(CharUtils.isAsciiAlphaLower((char) i));
-            }
-        }
-    }
-    
-    @Test
-    public void testIsAsciiNumeric_char() {
-        assertFalse(CharUtils.isAsciiNumeric('a'));
-        assertFalse(CharUtils.isAsciiNumeric('A'));
-        assertTrue(CharUtils.isAsciiNumeric('3'));
-        assertFalse(CharUtils.isAsciiNumeric('-'));
-        assertFalse(CharUtils.isAsciiNumeric('\n'));
-        assertFalse(CharUtils.isAsciiNumeric(CHAR_COPY));
-       
-        for (int i = 0; i < 196; i++) {
-            if (i >= '0' && i <= '9') {
-                assertTrue(CharUtils.isAsciiNumeric((char) i));
-            } else {
-                assertFalse(CharUtils.isAsciiNumeric((char) i));
-            }
-        }
-    }
-    
-    @Test
-    public void testIsAsciiAlphanumeric_char() {
-        assertTrue(CharUtils.isAsciiAlphanumeric('a'));
-        assertTrue(CharUtils.isAsciiAlphanumeric('A'));
-        assertTrue(CharUtils.isAsciiAlphanumeric('3'));
-        assertFalse(CharUtils.isAsciiAlphanumeric('-'));
-        assertFalse(CharUtils.isAsciiAlphanumeric('\n'));
-        assertFalse(CharUtils.isAsciiAlphanumeric(CHAR_COPY));
-       
-        for (int i = 0; i < 196; i++) {
-            if ((i >= 'A' && i <= 'Z') || (i >= 'a' && i <= 'z') || (i >= '0' && i <= '9')) {
-                assertTrue(CharUtils.isAsciiAlphanumeric((char) i));
-            } else {
-                assertFalse(CharUtils.isAsciiAlphanumeric((char) i));
-            }
-        }
-    }
-
-    @Test
-    public void testCompare() {
-        assertTrue(CharUtils.compare('a', 'b') < 0);
-        assertTrue(CharUtils.compare('c', 'c') == 0);
-        assertTrue(CharUtils.compare('c', 'a') > 0);
-    }
-}
diff --git a/lang/src/test/java/org/apache/commons/lang3/ClassPathUtilsTest.java b/lang/src/test/java/org/apache/commons/lang3/ClassPathUtilsTest.java
deleted file mode 100644
index d8790f3..0000000
--- a/lang/src/test/java/org/apache/commons/lang3/ClassPathUtilsTest.java
+++ /dev/null
@@ -1,115 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.commons.lang3;
-
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertFalse;
-import static org.junit.Assert.assertNotNull;
-import static org.junit.Assert.assertTrue;
-
-import java.lang.reflect.Constructor;
-import java.lang.reflect.Modifier;
-
-import org.junit.Test;
-
-/**
- * @version $Id$
- */
-public class ClassPathUtilsTest {
-
-    @Test
-    public void testConstructor() {
-        assertNotNull(new ClassPathUtils());
-        final Constructor<?>[] cons = ClassPathUtils.class.getDeclaredConstructors();
-        assertEquals(1, cons.length);
-        assertTrue(Modifier.isPublic(cons[0].getModifiers()));
-        assertTrue(Modifier.isPublic(ClassPathUtils.class.getModifiers()));
-        assertFalse(Modifier.isFinal(ClassPathUtils.class.getModifiers()));
-    }
-
-    @Test(expected = NullPointerException.class)
-    public void testToFullyQualifiedNameNullClassString() throws Exception {
-        ClassPathUtils.toFullyQualifiedName((Class<?>) null, "Test.properties");
-    }
-
-    @Test(expected = NullPointerException.class)
-    public void testToFullyQualifiedNameClassNull() throws Exception {
-        ClassPathUtils.toFullyQualifiedName(ClassPathUtils.class, null);
-    }
-
-    @Test
-    public void testToFullyQualifiedNameClassString() throws Exception {
-        final String expected = "org.apache.commons.lang3.Test.properties";
-        final String actual = ClassPathUtils.toFullyQualifiedName(ClassPathUtils.class, "Test.properties");
-
-        assertEquals(expected, actual);
-    }
-
-    @Test(expected = NullPointerException.class)
-    public void testToFullyQualifiedNameNullPackageString() throws Exception {
-        ClassPathUtils.toFullyQualifiedName((Package) null, "Test.properties");
-    }
-
-    @Test(expected = NullPointerException.class)
-    public void testToFullyQualifiedNamePackageNull() throws Exception {
-        ClassPathUtils.toFullyQualifiedName(ClassPathUtils.class.getPackage(), null);
-    }
-
-    @Test
-    public void testToFullyQualifiedNamePackageString() throws Exception {
-        final String expected = "org.apache.commons.lang3.Test.properties";
-        final String actual = ClassPathUtils.toFullyQualifiedName(ClassPathUtils.class.getPackage(), "Test.properties");
-
-        assertEquals(expected, actual);
-    }
-
-    @Test(expected = NullPointerException.class)
-    public void testToFullyQualifiedPathClassNullString() throws Exception {
-        ClassPathUtils.toFullyQualifiedPath((Class<?>) null, "Test.properties");
-    }
-
-    @Test(expected = NullPointerException.class)
-    public void testToFullyQualifiedPathClassNull() throws Exception {
-        ClassPathUtils.toFullyQualifiedPath(ClassPathUtils.class, null);
-    }
-
-    @Test
-    public void testToFullyQualifiedPathClass() throws Exception {
-        final String expected = "org/apache/commons/lang3/Test.properties";
-        final String actual = ClassPathUtils.toFullyQualifiedPath(ClassPathUtils.class, "Test.properties");
-
-        assertEquals(expected, actual);
-    }
-
-    @Test(expected = NullPointerException.class)
-    public void testToFullyQualifiedPathPackageNullString() throws Exception {
-        ClassPathUtils.toFullyQualifiedPath((Package) null, "Test.properties");
-    }
-
-    @Test(expected = NullPointerException.class)
-    public void testToFullyQualifiedPathPackageNull() throws Exception {
-        ClassPathUtils.toFullyQualifiedPath(ClassPathUtils.class.getPackage(), null);
-    }
-
-    @Test
-    public void testToFullyQualifiedPathPackage() throws Exception {
-        final String expected = "org/apache/commons/lang3/Test.properties";
-        final String actual = ClassPathUtils.toFullyQualifiedPath(ClassPathUtils.class.getPackage(), "Test.properties");
-
-        assertEquals(expected, actual);
-    }
-}
diff --git a/lang/src/test/java/org/apache/commons/lang3/ClassUtilsTest.java b/lang/src/test/java/org/apache/commons/lang3/ClassUtilsTest.java
deleted file mode 100644
index 0ee67e8..0000000
--- a/lang/src/test/java/org/apache/commons/lang3/ClassUtilsTest.java
+++ /dev/null
@@ -1,1277 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.commons.lang3;
-
-import static org.apache.commons.lang3.JavaVersion.JAVA_1_5;
-import static org.junit.Assert.assertArrayEquals;
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertFalse;
-import static org.junit.Assert.assertNotNull;
-import static org.junit.Assert.assertNotSame;
-import static org.junit.Assert.assertNull;
-import static org.junit.Assert.assertSame;
-import static org.junit.Assert.assertTrue;
-import static org.junit.Assert.fail;
-
-import java.lang.reflect.Constructor;
-import java.lang.reflect.Method;
-import java.lang.reflect.Modifier;
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.Collections;
-import java.util.HashSet;
-import java.util.Iterator;
-import java.util.List;
-import java.util.Map;
-import java.util.Set;
-
-import org.apache.commons.lang3.ClassUtils.Interfaces;
-import org.apache.commons.lang3.reflect.testbed.GenericConsumer;
-import org.apache.commons.lang3.reflect.testbed.GenericParent;
-import org.apache.commons.lang3.reflect.testbed.StringParameterizedChild;
-import org.junit.Test;
-
-/**
- * Unit tests {@link org.apache.commons.lang3.ClassUtils}.
- *
- * @version $Id$
- */
-@SuppressWarnings("boxing") // JUnit4 does not support primitive equality testing apart from long
-public class ClassUtilsTest  {
-
-    private static class Inner {
-        private class DeeplyNested{}
-    }
-
-    //-----------------------------------------------------------------------
-    @Test
-    public void testConstructor() {
-        assertNotNull(new ClassUtils());
-        final Constructor<?>[] cons = ClassUtils.class.getDeclaredConstructors();
-        assertEquals(1, cons.length);
-        assertTrue(Modifier.isPublic(cons[0].getModifiers()));
-        assertTrue(Modifier.isPublic(ClassUtils.class.getModifiers()));
-        assertFalse(Modifier.isFinal(ClassUtils.class.getModifiers()));
-    }
-
-    // -------------------------------------------------------------------------
-    @Test
-    public void test_getShortClassName_Object() {
-        assertEquals("ClassUtils", ClassUtils.getShortClassName(new ClassUtils(), "<null>"));
-        assertEquals("ClassUtilsTest.Inner", ClassUtils.getShortClassName(new Inner(), "<null>"));
-        assertEquals("String", ClassUtils.getShortClassName("hello", "<null>"));
-        assertEquals("<null>", ClassUtils.getShortClassName(null, "<null>"));
-
-        // Inner types
-        class Named {}
-        assertEquals("ClassUtilsTest.1", ClassUtils.getShortClassName(new Object(){}, "<null>"));
-        assertEquals("ClassUtilsTest.1Named", ClassUtils.getShortClassName(new Named(), "<null>"));
-        assertEquals("ClassUtilsTest.Inner", ClassUtils.getShortClassName(new Inner(), "<null>"));
-    }
-
-    @Test
-    public void test_getShortClassName_Class() {
-        assertEquals("ClassUtils", ClassUtils.getShortClassName(ClassUtils.class));
-        assertEquals("Map.Entry", ClassUtils.getShortClassName(Map.Entry.class));
-        assertEquals("", ClassUtils.getShortClassName((Class<?>) null));
-
-        // LANG-535
-        assertEquals("String[]", ClassUtils.getShortClassName(String[].class));
-        assertEquals("Map.Entry[]", ClassUtils.getShortClassName(Map.Entry[].class));
-
-        // Primitives
-        assertEquals("boolean", ClassUtils.getShortClassName(boolean.class));
-        assertEquals("byte", ClassUtils.getShortClassName(byte.class));
-        assertEquals("char", ClassUtils.getShortClassName(char.class));
-        assertEquals("short", ClassUtils.getShortClassName(short.class));
-        assertEquals("int", ClassUtils.getShortClassName(int.class));
-        assertEquals("long", ClassUtils.getShortClassName(long.class));
-        assertEquals("float", ClassUtils.getShortClassName(float.class));
-        assertEquals("double", ClassUtils.getShortClassName(double.class));
-
-        // Primitive Arrays
-        assertEquals("boolean[]", ClassUtils.getShortClassName(boolean[].class));
-        assertEquals("byte[]", ClassUtils.getShortClassName(byte[].class));
-        assertEquals("char[]", ClassUtils.getShortClassName(char[].class));
-        assertEquals("short[]", ClassUtils.getShortClassName(short[].class));
-        assertEquals("int[]", ClassUtils.getShortClassName(int[].class));
-        assertEquals("long[]", ClassUtils.getShortClassName(long[].class));
-        assertEquals("float[]", ClassUtils.getShortClassName(float[].class));
-        assertEquals("double[]", ClassUtils.getShortClassName(double[].class));
-
-        // Arrays of arrays of ...
-        assertEquals("String[][]", ClassUtils.getShortClassName(String[][].class));
-        assertEquals("String[][][]", ClassUtils.getShortClassName(String[][][].class));
-        assertEquals("String[][][][]", ClassUtils.getShortClassName(String[][][][].class));
-        
-        // Inner types
-        class Named {}
-        assertEquals("ClassUtilsTest.2", ClassUtils.getShortClassName(new Object(){}.getClass()));
-        assertEquals("ClassUtilsTest.2Named", ClassUtils.getShortClassName(Named.class));
-        assertEquals("ClassUtilsTest.Inner", ClassUtils.getShortClassName(Inner.class));
-    }
-
-
-
-    @Test
-    public void test_getShortClassName_String() {
-        assertEquals("ClassUtils", ClassUtils.getShortClassName(ClassUtils.class.getName()));
-        assertEquals("Map.Entry", ClassUtils.getShortClassName(Map.Entry.class.getName()));
-        assertEquals("", ClassUtils.getShortClassName((String) null));
-        assertEquals("", ClassUtils.getShortClassName(""));
-    }
-
-    @Test
-    public void test_getSimpleName_Class() {
-        assertEquals("ClassUtils", ClassUtils.getSimpleName(ClassUtils.class));
-        assertEquals("Entry", ClassUtils.getSimpleName(Map.Entry.class));
-        assertEquals("", ClassUtils.getSimpleName((Class<?>) null));
-
-        // LANG-535
-        assertEquals("String[]", ClassUtils.getSimpleName(String[].class));
-        assertEquals("Entry[]", ClassUtils.getSimpleName(Map.Entry[].class));
-
-        // Primitives
-        assertEquals("boolean", ClassUtils.getSimpleName(boolean.class));
-        assertEquals("byte", ClassUtils.getSimpleName(byte.class));
-        assertEquals("char", ClassUtils.getSimpleName(char.class));
-        assertEquals("short", ClassUtils.getSimpleName(short.class));
-        assertEquals("int", ClassUtils.getSimpleName(int.class));
-        assertEquals("long", ClassUtils.getSimpleName(long.class));
-        assertEquals("float", ClassUtils.getSimpleName(float.class));
-        assertEquals("double", ClassUtils.getSimpleName(double.class));
-
-        // Primitive Arrays
-        assertEquals("boolean[]", ClassUtils.getSimpleName(boolean[].class));
-        assertEquals("byte[]", ClassUtils.getSimpleName(byte[].class));
-        assertEquals("char[]", ClassUtils.getSimpleName(char[].class));
-        assertEquals("short[]", ClassUtils.getSimpleName(short[].class));
-        assertEquals("int[]", ClassUtils.getSimpleName(int[].class));
-        assertEquals("long[]", ClassUtils.getSimpleName(long[].class));
-        assertEquals("float[]", ClassUtils.getSimpleName(float[].class));
-        assertEquals("double[]", ClassUtils.getSimpleName(double[].class));
-
-        // Arrays of arrays of ...
-        assertEquals("String[][]", ClassUtils.getSimpleName(String[][].class));
-        assertEquals("String[][][]", ClassUtils.getSimpleName(String[][][].class));
-        assertEquals("String[][][][]", ClassUtils.getSimpleName(String[][][][].class));
-        
-        // On-the-fly types
-        class Named {}
-        assertEquals("", ClassUtils.getSimpleName(new Object(){}.getClass()));
-        assertEquals("Named", ClassUtils.getSimpleName(Named.class));
-    }
-
-    @Test
-    public void test_getSimpleName_Object() {
-        assertEquals("ClassUtils", ClassUtils.getSimpleName(new ClassUtils(), "<null>"));
-        assertEquals("Inner", ClassUtils.getSimpleName(new Inner(), "<null>"));
-        assertEquals("String", ClassUtils.getSimpleName("hello", "<null>"));
-        assertEquals("<null>", ClassUtils.getSimpleName(null, "<null>"));
-    }
-
-    // -------------------------------------------------------------------------
-    @Test
-    public void test_getPackageName_Object() {
-        assertEquals("org.apache.commons.lang3", ClassUtils.getPackageName(new ClassUtils(), "<null>"));
-        assertEquals("org.apache.commons.lang3", ClassUtils.getPackageName(new Inner(), "<null>"));
-        assertEquals("<null>", ClassUtils.getPackageName(null, "<null>"));
-    }
-
-    @Test
-    public void test_getPackageName_Class() {
-        assertEquals("java.lang", ClassUtils.getPackageName(String.class));
-        assertEquals("java.util", ClassUtils.getPackageName(Map.Entry.class));
-        assertEquals("", ClassUtils.getPackageName((Class<?>) null));
-
-        // LANG-535
-        assertEquals("java.lang", ClassUtils.getPackageName(String[].class));
-
-        // Primitive Arrays
-        assertEquals("", ClassUtils.getPackageName(boolean[].class));
-        assertEquals("", ClassUtils.getPackageName(byte[].class));
-        assertEquals("", ClassUtils.getPackageName(char[].class));
-        assertEquals("", ClassUtils.getPackageName(short[].class));
-        assertEquals("", ClassUtils.getPackageName(int[].class));
-        assertEquals("", ClassUtils.getPackageName(long[].class));
-        assertEquals("", ClassUtils.getPackageName(float[].class));
-        assertEquals("", ClassUtils.getPackageName(double[].class));
-
-        // Arrays of arrays of ...
-        assertEquals("java.lang", ClassUtils.getPackageName(String[][].class));
-        assertEquals("java.lang", ClassUtils.getPackageName(String[][][].class));
-        assertEquals("java.lang", ClassUtils.getPackageName(String[][][][].class));
-        
-        // On-the-fly types
-        class Named {}
-        assertEquals("org.apache.commons.lang3", ClassUtils.getPackageName(new Object() {
-        }.getClass()));
-        assertEquals("org.apache.commons.lang3", ClassUtils.getPackageName(Named.class));
-    }
-
-    @Test
-    public void test_getPackageName_String() {
-        assertEquals("org.apache.commons.lang3", ClassUtils.getPackageName(ClassUtils.class.getName()));
-        assertEquals("java.util", ClassUtils.getPackageName(Map.Entry.class.getName()));
-        assertEquals("", ClassUtils.getPackageName((String) null));
-        assertEquals("", ClassUtils.getPackageName(""));
-    }
-
-    // -------------------------------------------------------------------------
-    @Test
-    public void test_getAbbreviatedName_Class() {
-        assertEquals("", ClassUtils.getAbbreviatedName((Class<?>)null, 1));
-        assertEquals("j.l.String", ClassUtils.getAbbreviatedName(String.class, 1));
-        assertEquals("j.l.String", ClassUtils.getAbbreviatedName(String.class, 5));
-        assertEquals("j.lang.String", ClassUtils.getAbbreviatedName(String.class, 13));
-        assertEquals("j.lang.String", ClassUtils.getAbbreviatedName(String.class, 15));
-        assertEquals("java.lang.String", ClassUtils.getAbbreviatedName(String.class, 20));
-    }
-
-    @Test(expected = IllegalArgumentException.class)
-    public void test_getAbbreviatedName_Class_ZeroLen() {
-        ClassUtils.getAbbreviatedName(String.class, 0);
-    }
-
-    @Test(expected = IllegalArgumentException.class)
-    public void test_getAbbreviatedName_Class_NegativeLen() {
-        ClassUtils.getAbbreviatedName(String.class, -10);
-    }
-
-    @Test
-    public void test_getAbbreviatedName_String() {
-        assertEquals("", ClassUtils.getAbbreviatedName((String) null, 1));
-        assertEquals("WithoutPackage", ClassUtils.getAbbreviatedName("WithoutPackage", 1));
-        assertEquals("j.l.String", ClassUtils.getAbbreviatedName("java.lang.String", 1));
-    }
-
-    // -------------------------------------------------------------------------
-    @Test
-    public void test_getAllSuperclasses_Class() {
-        final List<?> list = ClassUtils.getAllSuperclasses(CY.class);
-        assertEquals(2, list.size());
-        assertEquals(CX.class, list.get(0));
-        assertEquals(Object.class, list.get(1));
-
-        assertEquals(null, ClassUtils.getAllSuperclasses(null));
-    }
-
-    @Test
-    public void test_getAllInterfaces_Class() {
-        final List<?> list = ClassUtils.getAllInterfaces(CY.class);
-        assertEquals(6, list.size());
-        assertEquals(IB.class, list.get(0));
-        assertEquals(IC.class, list.get(1));
-        assertEquals(ID.class, list.get(2));
-        assertEquals(IE.class, list.get(3));
-        assertEquals(IF.class, list.get(4));
-        assertEquals(IA.class, list.get(5));
-
-        assertEquals(null, ClassUtils.getAllInterfaces(null));
-    }
-
-    private static interface IA {
-    }
-    private static interface IB {
-    }
-    private static interface IC extends ID, IE {
-    }
-    private static interface ID {
-    }
-    private static interface IE extends IF {
-    }
-    private static interface IF {
-    }
-    private static class CX implements IB, IA, IE {
-    }
-    private static class CY extends CX implements IB, IC {
-    }
-
-    // -------------------------------------------------------------------------
-    @Test
-    public void test_convertClassNamesToClasses_List() {
-        final List<String> list = new ArrayList<String>();
-        List<Class<?>> result = ClassUtils.convertClassNamesToClasses(list);
-        assertEquals(0, result.size());
-
-        list.add("java.lang.String");
-        list.add("java.lang.xxx");
-        list.add("java.lang.Object");
-        result = ClassUtils.convertClassNamesToClasses(list);
-        assertEquals(3, result.size());
-        assertEquals(String.class, result.get(0));
-        assertEquals(null, result.get(1));
-        assertEquals(Object.class, result.get(2));
-
-        @SuppressWarnings("unchecked") // test what happens when non-generic code adds wrong type of element
-        final
-        List<Object> olist = (List<Object>)(List<?>)list;
-        olist.add(new Object());
-        try {
-            ClassUtils.convertClassNamesToClasses(list);
-            fail("Should not have been able to convert list");
-        } catch (final ClassCastException expected) {}
-        assertEquals(null, ClassUtils.convertClassNamesToClasses(null));
-    }
-
-    @Test
-    public void test_convertClassesToClassNames_List() {
-        final List<Class<?>> list = new ArrayList<Class<?>>();
-        List<String> result = ClassUtils.convertClassesToClassNames(list);
-        assertEquals(0, result.size());
-
-        list.add(String.class);
-        list.add(null);
-        list.add(Object.class);
-        result = ClassUtils.convertClassesToClassNames(list);
-        assertEquals(3, result.size());
-        assertEquals("java.lang.String", result.get(0));
-        assertEquals(null, result.get(1));
-        assertEquals("java.lang.Object", result.get(2));
-
-        @SuppressWarnings("unchecked") // test what happens when non-generic code adds wrong type of element
-        final
-        List<Object> olist = (List<Object>)(List<?>)list;
-        olist.add(new Object());
-        try {
-            ClassUtils.convertClassesToClassNames(list);
-            fail("Should not have been able to convert list");
-        } catch (final ClassCastException expected) {}
-        assertEquals(null, ClassUtils.convertClassesToClassNames(null));
-    }
-
-    // -------------------------------------------------------------------------
-    @Test
-    public void test_isInnerClass_Class() {
-        assertTrue(ClassUtils.isInnerClass(Inner.class));
-        assertTrue(ClassUtils.isInnerClass(Map.Entry.class));
-        assertTrue(ClassUtils.isInnerClass(new Cloneable() {
-        }.getClass()));
-        assertFalse(ClassUtils.isInnerClass(this.getClass()));
-        assertFalse(ClassUtils.isInnerClass(String.class));
-        assertFalse(ClassUtils.isInnerClass(null));
-    }
-
-    // -------------------------------------------------------------------------
-    @Test
-    public void test_isAssignable_ClassArray_ClassArray() throws Exception {
-        final Class<?>[] array2 = new Class[] {Object.class, Object.class};
-        final Class<?>[] array1 = new Class[] {Object.class};
-        final Class<?>[] array1s = new Class[] {String.class};
-        final Class<?>[] array0 = new Class[] {};
-        final Class<?>[] arrayPrimitives = { Integer.TYPE, Boolean.TYPE };
-        final Class<?>[] arrayWrappers = { Integer.class, Boolean.class };
-
-        assertFalse(ClassUtils.isAssignable(array1, array2));
-        assertFalse(ClassUtils.isAssignable(null, array2));
-        assertTrue(ClassUtils.isAssignable(null, array0));
-        assertTrue(ClassUtils.isAssignable(array0, array0));
-//        assertTrue(ClassUtils.isAssignable(array0, null)); 
-        assertTrue(ClassUtils.isAssignable(array0, (Class<?>[]) null)); // explicit cast to avoid warning
-        assertTrue(ClassUtils.isAssignable((Class[]) null, (Class[]) null));
-
-        assertFalse(ClassUtils.isAssignable(array1, array1s));
-        assertTrue(ClassUtils.isAssignable(array1s, array1s));
-        assertTrue(ClassUtils.isAssignable(array1s, array1));
-
-        final boolean autoboxing = SystemUtils.isJavaVersionAtLeast(JAVA_1_5);
-
-        assertEquals(autoboxing, ClassUtils.isAssignable(arrayPrimitives, arrayWrappers));
-        assertEquals(autoboxing, ClassUtils.isAssignable(arrayWrappers, arrayPrimitives));
-        assertFalse(ClassUtils.isAssignable(arrayPrimitives, array1));
-        assertFalse(ClassUtils.isAssignable(arrayWrappers, array1));
-        assertEquals(autoboxing, ClassUtils.isAssignable(arrayPrimitives, array2));
-        assertTrue(ClassUtils.isAssignable(arrayWrappers, array2));
-    }
-
-    @Test
-    public void test_isAssignable_ClassArray_ClassArray_Autoboxing() throws Exception {
-        final Class<?>[] array2 = new Class[] {Object.class, Object.class};
-        final Class<?>[] array1 = new Class[] {Object.class};
-        final Class<?>[] array1s = new Class[] {String.class};
-        final Class<?>[] array0 = new Class[] {};
-        final Class<?>[] arrayPrimitives = { Integer.TYPE, Boolean.TYPE };
-        final Class<?>[] arrayWrappers = { Integer.class, Boolean.class };
-
-        assertFalse(ClassUtils.isAssignable(array1, array2, true));
-        assertFalse(ClassUtils.isAssignable(null, array2, true));
-        assertTrue(ClassUtils.isAssignable(null, array0, true));
-        assertTrue(ClassUtils.isAssignable(array0, array0, true));
-        assertTrue(ClassUtils.isAssignable(array0, null, true));
-        assertTrue(ClassUtils.isAssignable((Class[]) null, (Class[]) null, true));
-
-        assertFalse(ClassUtils.isAssignable(array1, array1s, true));
-        assertTrue(ClassUtils.isAssignable(array1s, array1s, true));
-        assertTrue(ClassUtils.isAssignable(array1s, array1, true));
-
-        assertTrue(ClassUtils.isAssignable(arrayPrimitives, arrayWrappers, true));
-        assertTrue(ClassUtils.isAssignable(arrayWrappers, arrayPrimitives, true));
-        assertFalse(ClassUtils.isAssignable(arrayPrimitives, array1, true));
-        assertFalse(ClassUtils.isAssignable(arrayWrappers, array1, true));
-        assertTrue(ClassUtils.isAssignable(arrayPrimitives, array2, true));
-        assertTrue(ClassUtils.isAssignable(arrayWrappers, array2, true));
-    }
-
-    @Test
-    public void test_isAssignable_ClassArray_ClassArray_NoAutoboxing() throws Exception {
-        final Class<?>[] array2 = new Class[] {Object.class, Object.class};
-        final Class<?>[] array1 = new Class[] {Object.class};
-        final Class<?>[] array1s = new Class[] {String.class};
-        final Class<?>[] array0 = new Class[] {};
-        final Class<?>[] arrayPrimitives = { Integer.TYPE, Boolean.TYPE };
-        final Class<?>[] arrayWrappers = { Integer.class, Boolean.class };
-
-        assertFalse(ClassUtils.isAssignable(array1, array2, false));
-        assertFalse(ClassUtils.isAssignable(null, array2, false));
-        assertTrue(ClassUtils.isAssignable(null, array0, false));
-        assertTrue(ClassUtils.isAssignable(array0, array0, false));
-        assertTrue(ClassUtils.isAssignable(array0, null, false));
-        assertTrue(ClassUtils.isAssignable((Class[]) null, (Class[]) null, false));
-
-        assertFalse(ClassUtils.isAssignable(array1, array1s, false));
-        assertTrue(ClassUtils.isAssignable(array1s, array1s, false));
-        assertTrue(ClassUtils.isAssignable(array1s, array1, false));
-
-        assertFalse(ClassUtils.isAssignable(arrayPrimitives, arrayWrappers, false));
-        assertFalse(ClassUtils.isAssignable(arrayWrappers, arrayPrimitives, false));
-        assertFalse(ClassUtils.isAssignable(arrayPrimitives, array1, false));
-        assertFalse(ClassUtils.isAssignable(arrayWrappers, array1, false));
-        assertTrue(ClassUtils.isAssignable(arrayWrappers, array2, false));
-        assertFalse(ClassUtils.isAssignable(arrayPrimitives, array2, false));
-    }
-
-    @Test
-    public void test_isAssignable() throws Exception {
-        assertFalse(ClassUtils.isAssignable((Class<?>) null, null));
-        assertFalse(ClassUtils.isAssignable(String.class, null));
-
-        assertTrue(ClassUtils.isAssignable(null, Object.class));
-        assertTrue(ClassUtils.isAssignable(null, Integer.class));
-        assertFalse(ClassUtils.isAssignable(null, Integer.TYPE));
-        assertTrue(ClassUtils.isAssignable(String.class, Object.class));
-        assertTrue(ClassUtils.isAssignable(String.class, String.class));
-        assertFalse(ClassUtils.isAssignable(Object.class, String.class));
-
-        final boolean autoboxing = SystemUtils.isJavaVersionAtLeast(JAVA_1_5);
-
-        assertEquals(autoboxing, ClassUtils.isAssignable(Integer.TYPE, Integer.class));
-        assertEquals(autoboxing, ClassUtils.isAssignable(Integer.TYPE, Object.class));
-        assertEquals(autoboxing, ClassUtils.isAssignable(Integer.class, Integer.TYPE));
-        assertEquals(autoboxing, ClassUtils.isAssignable(Integer.class, Object.class));
-        assertTrue(ClassUtils.isAssignable(Integer.TYPE, Integer.TYPE));
-        assertTrue(ClassUtils.isAssignable(Integer.class, Integer.class));
-        assertEquals(autoboxing, ClassUtils.isAssignable(Boolean.TYPE, Boolean.class));
-        assertEquals(autoboxing, ClassUtils.isAssignable(Boolean.TYPE, Object.class));
-        assertEquals(autoboxing, ClassUtils.isAssignable(Boolean.class, Boolean.TYPE));
-        assertEquals(autoboxing, ClassUtils.isAssignable(Boolean.class, Object.class));
-        assertTrue(ClassUtils.isAssignable(Boolean.TYPE, Boolean.TYPE));
-        assertTrue(ClassUtils.isAssignable(Boolean.class, Boolean.class));
-    }
-
-    @Test
-    public void test_isAssignable_Autoboxing() throws Exception {
-        assertFalse(ClassUtils.isAssignable((Class<?>) null, null, true));
-        assertFalse(ClassUtils.isAssignable(String.class, null, true));
-
-        assertTrue(ClassUtils.isAssignable(null, Object.class, true));
-        assertTrue(ClassUtils.isAssignable(null, Integer.class, true));
-        assertFalse(ClassUtils.isAssignable(null, Integer.TYPE, true));
-        assertTrue(ClassUtils.isAssignable(String.class, Object.class, true));
-        assertTrue(ClassUtils.isAssignable(String.class, String.class, true));
-        assertFalse(ClassUtils.isAssignable(Object.class, String.class, true));
-        assertTrue(ClassUtils.isAssignable(Integer.TYPE, Integer.class, true));
-        assertTrue(ClassUtils.isAssignable(Integer.TYPE, Object.class, true));
-        assertTrue(ClassUtils.isAssignable(Integer.class, Integer.TYPE, true));
-        assertTrue(ClassUtils.isAssignable(Integer.class, Object.class, true));
-        assertTrue(ClassUtils.isAssignable(Integer.TYPE, Integer.TYPE, true));
-        assertTrue(ClassUtils.isAssignable(Integer.class, Integer.class, true));
-        assertTrue(ClassUtils.isAssignable(Boolean.TYPE, Boolean.class, true));
-        assertTrue(ClassUtils.isAssignable(Boolean.class, Boolean.TYPE, true));
-        assertTrue(ClassUtils.isAssignable(Boolean.class, Object.class, true));
-        assertTrue(ClassUtils.isAssignable(Boolean.TYPE, Boolean.TYPE, true));
-        assertTrue(ClassUtils.isAssignable(Boolean.class, Boolean.class, true));
-    }
-
-    @Test
-    public void test_isAssignable_NoAutoboxing() throws Exception {
-        assertFalse(ClassUtils.isAssignable((Class<?>) null, null, false));
-        assertFalse(ClassUtils.isAssignable(String.class, null, false));
-
-        assertTrue(ClassUtils.isAssignable(null, Object.class, false));
-        assertTrue(ClassUtils.isAssignable(null, Integer.class, false));
-        assertFalse(ClassUtils.isAssignable(null, Integer.TYPE, false));
-        assertTrue(ClassUtils.isAssignable(String.class, Object.class, false));
-        assertTrue(ClassUtils.isAssignable(String.class, String.class, false));
-        assertFalse(ClassUtils.isAssignable(Object.class, String.class, false));
-        assertFalse(ClassUtils.isAssignable(Integer.TYPE, Integer.class, false));
-        assertFalse(ClassUtils.isAssignable(Integer.TYPE, Object.class, false));
-        assertFalse(ClassUtils.isAssignable(Integer.class, Integer.TYPE, false));
-        assertTrue(ClassUtils.isAssignable(Integer.TYPE, Integer.TYPE, false));
-        assertTrue(ClassUtils.isAssignable(Integer.class, Integer.class, false));
-        assertFalse(ClassUtils.isAssignable(Boolean.TYPE, Boolean.class, false));
-        assertFalse(ClassUtils.isAssignable(Boolean.TYPE, Object.class, false));
-        assertFalse(ClassUtils.isAssignable(Boolean.class, Boolean.TYPE, false));
-        assertTrue(ClassUtils.isAssignable(Boolean.class, Object.class, false));
-        assertTrue(ClassUtils.isAssignable(Boolean.TYPE, Boolean.TYPE, false));
-        assertTrue(ClassUtils.isAssignable(Boolean.class, Boolean.class, false));
-    }
-
-    @Test
-    public void test_isAssignable_Widening() throws Exception {
-        // test byte conversions
-        assertFalse("byte -> char", ClassUtils.isAssignable(Byte.TYPE, Character.TYPE));
-        assertTrue("byte -> byte", ClassUtils.isAssignable(Byte.TYPE, Byte.TYPE));
-        assertTrue("byte -> short", ClassUtils.isAssignable(Byte.TYPE, Short.TYPE));
-        assertTrue("byte -> int", ClassUtils.isAssignable(Byte.TYPE, Integer.TYPE));
-        assertTrue("byte -> long", ClassUtils.isAssignable(Byte.TYPE, Long.TYPE));
-        assertTrue("byte -> float", ClassUtils.isAssignable(Byte.TYPE, Float.TYPE));
-        assertTrue("byte -> double", ClassUtils.isAssignable(Byte.TYPE, Double.TYPE));
-        assertFalse("byte -> boolean", ClassUtils.isAssignable(Byte.TYPE, Boolean.TYPE));
-
-        // test short conversions
-        assertFalse("short -> char", ClassUtils.isAssignable(Short.TYPE, Character.TYPE));
-        assertFalse("short -> byte", ClassUtils.isAssignable(Short.TYPE, Byte.TYPE));
-        assertTrue("short -> short", ClassUtils.isAssignable(Short.TYPE, Short.TYPE));
-        assertTrue("short -> int", ClassUtils.isAssignable(Short.TYPE, Integer.TYPE));
-        assertTrue("short -> long", ClassUtils.isAssignable(Short.TYPE, Long.TYPE));
-        assertTrue("short -> float", ClassUtils.isAssignable(Short.TYPE, Float.TYPE));
-        assertTrue("short -> double", ClassUtils.isAssignable(Short.TYPE, Double.TYPE));
-        assertFalse("short -> boolean", ClassUtils.isAssignable(Short.TYPE, Boolean.TYPE));
-
-        // test char conversions
-        assertTrue("char -> char", ClassUtils.isAssignable(Character.TYPE, Character.TYPE));
-        assertFalse("char -> byte", ClassUtils.isAssignable(Character.TYPE, Byte.TYPE));
-        assertFalse("char -> short", ClassUtils.isAssignable(Character.TYPE, Short.TYPE));
-        assertTrue("char -> int", ClassUtils.isAssignable(Character.TYPE, Integer.TYPE));
-        assertTrue("char -> long", ClassUtils.isAssignable(Character.TYPE, Long.TYPE));
-        assertTrue("char -> float", ClassUtils.isAssignable(Character.TYPE, Float.TYPE));
-        assertTrue("char -> double", ClassUtils.isAssignable(Character.TYPE, Double.TYPE));
-        assertFalse("char -> boolean", ClassUtils.isAssignable(Character.TYPE, Boolean.TYPE));
-
-        // test int conversions
-        assertFalse("int -> char", ClassUtils.isAssignable(Integer.TYPE, Character.TYPE));
-        assertFalse("int -> byte", ClassUtils.isAssignable(Integer.TYPE, Byte.TYPE));
-        assertFalse("int -> short", ClassUtils.isAssignable(Integer.TYPE, Short.TYPE));
-        assertTrue("int -> int", ClassUtils.isAssignable(Integer.TYPE, Integer.TYPE));
-        assertTrue("int -> long", ClassUtils.isAssignable(Integer.TYPE, Long.TYPE));
-        assertTrue("int -> float", ClassUtils.isAssignable(Integer.TYPE, Float.TYPE));
-        assertTrue("int -> double", ClassUtils.isAssignable(Integer.TYPE, Double.TYPE));
-        assertFalse("int -> boolean", ClassUtils.isAssignable(Integer.TYPE, Boolean.TYPE));
-
-        // test long conversions
-        assertFalse("long -> char", ClassUtils.isAssignable(Long.TYPE, Character.TYPE));
-        assertFalse("long -> byte", ClassUtils.isAssignable(Long.TYPE, Byte.TYPE));
-        assertFalse("long -> short", ClassUtils.isAssignable(Long.TYPE, Short.TYPE));
-        assertFalse("long -> int", ClassUtils.isAssignable(Long.TYPE, Integer.TYPE));
-        assertTrue("long -> long", ClassUtils.isAssignable(Long.TYPE, Long.TYPE));
-        assertTrue("long -> float", ClassUtils.isAssignable(Long.TYPE, Float.TYPE));
-        assertTrue("long -> double", ClassUtils.isAssignable(Long.TYPE, Double.TYPE));
-        assertFalse("long -> boolean", ClassUtils.isAssignable(Long.TYPE, Boolean.TYPE));
-
-        // test float conversions
-        assertFalse("float -> char", ClassUtils.isAssignable(Float.TYPE, Character.TYPE));
-        assertFalse("float -> byte", ClassUtils.isAssignable(Float.TYPE, Byte.TYPE));
-        assertFalse("float -> short", ClassUtils.isAssignable(Float.TYPE, Short.TYPE));
-        assertFalse("float -> int", ClassUtils.isAssignable(Float.TYPE, Integer.TYPE));
-        assertFalse("float -> long", ClassUtils.isAssignable(Float.TYPE, Long.TYPE));
-        assertTrue("float -> float", ClassUtils.isAssignable(Float.TYPE, Float.TYPE));
-        assertTrue("float -> double", ClassUtils.isAssignable(Float.TYPE, Double.TYPE));
-        assertFalse("float -> boolean", ClassUtils.isAssignable(Float.TYPE, Boolean.TYPE));
-
-        // test double conversions
-        assertFalse("double -> char", ClassUtils.isAssignable(Double.TYPE, Character.TYPE));
-        assertFalse("double -> byte", ClassUtils.isAssignable(Double.TYPE, Byte.TYPE));
-        assertFalse("double -> short", ClassUtils.isAssignable(Double.TYPE, Short.TYPE));
-        assertFalse("double -> int", ClassUtils.isAssignable(Double.TYPE, Integer.TYPE));
-        assertFalse("double -> long", ClassUtils.isAssignable(Double.TYPE, Long.TYPE));
-        assertFalse("double -> float", ClassUtils.isAssignable(Double.TYPE, Float.TYPE));
-        assertTrue("double -> double", ClassUtils.isAssignable(Double.TYPE, Double.TYPE));
-        assertFalse("double -> boolean", ClassUtils.isAssignable(Double.TYPE, Boolean.TYPE));
-
-        // test boolean conversions
-        assertFalse("boolean -> char", ClassUtils.isAssignable(Boolean.TYPE, Character.TYPE));
-        assertFalse("boolean -> byte", ClassUtils.isAssignable(Boolean.TYPE, Byte.TYPE));
-        assertFalse("boolean -> short", ClassUtils.isAssignable(Boolean.TYPE, Short.TYPE));
-        assertFalse("boolean -> int", ClassUtils.isAssignable(Boolean.TYPE, Integer.TYPE));
-        assertFalse("boolean -> long", ClassUtils.isAssignable(Boolean.TYPE, Long.TYPE));
-        assertFalse("boolean -> float", ClassUtils.isAssignable(Boolean.TYPE, Float.TYPE));
-        assertFalse("boolean -> double", ClassUtils.isAssignable(Boolean.TYPE, Double.TYPE));
-        assertTrue("boolean -> boolean", ClassUtils.isAssignable(Boolean.TYPE, Boolean.TYPE));
-    }
-
-    @Test
-    public void test_isAssignable_DefaultUnboxing_Widening() throws Exception {
-        final boolean autoboxing = SystemUtils.isJavaVersionAtLeast(JAVA_1_5);
-
-        // test byte conversions
-        assertFalse("byte -> char", ClassUtils.isAssignable(Byte.class, Character.TYPE));
-        assertEquals("byte -> byte", autoboxing, ClassUtils.isAssignable(Byte.class, Byte.TYPE));
-        assertEquals("byte -> short", autoboxing, ClassUtils.isAssignable(Byte.class, Short.TYPE));
-        assertEquals("byte -> int", autoboxing, ClassUtils.isAssignable(Byte.class, Integer.TYPE));
-        assertEquals("byte -> long", autoboxing, ClassUtils.isAssignable(Byte.class, Long.TYPE));
-        assertEquals("byte -> float", autoboxing, ClassUtils.isAssignable(Byte.class, Float.TYPE));
-        assertEquals("byte -> double", autoboxing, ClassUtils.isAssignable(Byte.class, Double.TYPE));
-        assertFalse("byte -> boolean", ClassUtils.isAssignable(Byte.class, Boolean.TYPE));
-
-        // test short conversions
-        assertFalse("short -> char", ClassUtils.isAssignable(Short.class, Character.TYPE));
-        assertFalse("short -> byte", ClassUtils.isAssignable(Short.class, Byte.TYPE));
-        assertEquals("short -> short", autoboxing, ClassUtils.isAssignable(Short.class, Short.TYPE));
-        assertEquals("short -> int", autoboxing, ClassUtils.isAssignable(Short.class, Integer.TYPE));
-        assertEquals("short -> long", autoboxing, ClassUtils.isAssignable(Short.class, Long.TYPE));
-        assertEquals("short -> float", autoboxing, ClassUtils.isAssignable(Short.class, Float.TYPE));
-        assertEquals("short -> double", autoboxing, ClassUtils.isAssignable(Short.class, Double.TYPE));
-        assertFalse("short -> boolean", ClassUtils.isAssignable(Short.class, Boolean.TYPE));
-
-        // test char conversions
-        assertEquals("char -> char", autoboxing, ClassUtils.isAssignable(Character.class, Character.TYPE));
-        assertFalse("char -> byte", ClassUtils.isAssignable(Character.class, Byte.TYPE));
-        assertFalse("char -> short", ClassUtils.isAssignable(Character.class, Short.TYPE));
-        assertEquals("char -> int", autoboxing, ClassUtils.isAssignable(Character.class, Integer.TYPE));
-        assertEquals("char -> long", autoboxing, ClassUtils.isAssignable(Character.class, Long.TYPE));
-        assertEquals("char -> float", autoboxing, ClassUtils.isAssignable(Character.class, Float.TYPE));
-        assertEquals("char -> double", autoboxing, ClassUtils.isAssignable(Character.class, Double.TYPE));
-        assertFalse("char -> boolean", ClassUtils.isAssignable(Character.class, Boolean.TYPE));
-
-        // test int conversions
-        assertFalse("int -> char", ClassUtils.isAssignable(Integer.class, Character.TYPE));
-        assertFalse("int -> byte", ClassUtils.isAssignable(Integer.class, Byte.TYPE));
-        assertFalse("int -> short", ClassUtils.isAssignable(Integer.class, Short.TYPE));
-        assertEquals("int -> int", autoboxing, ClassUtils.isAssignable(Integer.class, Integer.TYPE));
-        assertEquals("int -> long", autoboxing, ClassUtils.isAssignable(Integer.class, Long.TYPE));
-        assertEquals("int -> float", autoboxing, ClassUtils.isAssignable(Integer.class, Float.TYPE));
-        assertEquals("int -> double", autoboxing, ClassUtils.isAssignable(Integer.class, Double.TYPE));
-        assertFalse("int -> boolean", ClassUtils.isAssignable(Integer.class, Boolean.TYPE));
-
-        // test long conversions
-        assertFalse("long -> char", ClassUtils.isAssignable(Long.class, Character.TYPE));
-        assertFalse("long -> byte", ClassUtils.isAssignable(Long.class, Byte.TYPE));
-        assertFalse("long -> short", ClassUtils.isAssignable(Long.class, Short.TYPE));
-        assertFalse("long -> int", ClassUtils.isAssignable(Long.class, Integer.TYPE));
-        assertEquals("long -> long", autoboxing, ClassUtils.isAssignable(Long.class, Long.TYPE));
-        assertEquals("long -> float", autoboxing, ClassUtils.isAssignable(Long.class, Float.TYPE));
-        assertEquals("long -> double", autoboxing, ClassUtils.isAssignable(Long.class, Double.TYPE));
-        assertFalse("long -> boolean", ClassUtils.isAssignable(Long.class, Boolean.TYPE));
-
-        // test float conversions
-        assertFalse("float -> char", ClassUtils.isAssignable(Float.class, Character.TYPE));
-        assertFalse("float -> byte", ClassUtils.isAssignable(Float.class, Byte.TYPE));
-        assertFalse("float -> short", ClassUtils.isAssignable(Float.class, Short.TYPE));
-        assertFalse("float -> int", ClassUtils.isAssignable(Float.class, Integer.TYPE));
-        assertFalse("float -> long", ClassUtils.isAssignable(Float.class, Long.TYPE));
-        assertEquals("float -> float", autoboxing, ClassUtils.isAssignable(Float.class, Float.TYPE));
-        assertEquals("float -> double", autoboxing, ClassUtils.isAssignable(Float.class, Double.TYPE));
-        assertFalse("float -> boolean", ClassUtils.isAssignable(Float.class, Boolean.TYPE));
-
-        // test double conversions
-        assertFalse("double -> char", ClassUtils.isAssignable(Double.class, Character.TYPE));
-        assertFalse("double -> byte", ClassUtils.isAssignable(Double.class, Byte.TYPE));
-        assertFalse("double -> short", ClassUtils.isAssignable(Double.class, Short.TYPE));
-        assertFalse("double -> int", ClassUtils.isAssignable(Double.class, Integer.TYPE));
-        assertFalse("double -> long", ClassUtils.isAssignable(Double.class, Long.TYPE));
-        assertFalse("double -> float", ClassUtils.isAssignable(Double.class, Float.TYPE));
-        assertEquals("double -> double", autoboxing, ClassUtils.isAssignable(Double.class, Double.TYPE));
-        assertFalse("double -> boolean", ClassUtils.isAssignable(Double.class, Boolean.TYPE));
-
-        // test boolean conversions
-        assertFalse("boolean -> char", ClassUtils.isAssignable(Boolean.class, Character.TYPE));
-        assertFalse("boolean -> byte", ClassUtils.isAssignable(Boolean.class, Byte.TYPE));
-        assertFalse("boolean -> short", ClassUtils.isAssignable(Boolean.class, Short.TYPE));
-        assertFalse("boolean -> int", ClassUtils.isAssignable(Boolean.class, Integer.TYPE));
-        assertFalse("boolean -> long", ClassUtils.isAssignable(Boolean.class, Long.TYPE));
-        assertFalse("boolean -> float", ClassUtils.isAssignable(Boolean.class, Float.TYPE));
-        assertFalse("boolean -> double", ClassUtils.isAssignable(Boolean.class, Double.TYPE));
-        assertEquals("boolean -> boolean", autoboxing, ClassUtils.isAssignable(Boolean.class, Boolean.TYPE));
-    }
-
-    @Test
-    public void test_isAssignable_Unboxing_Widening() throws Exception {
-        // test byte conversions
-        assertFalse("byte -> char", ClassUtils.isAssignable(Byte.class, Character.TYPE, true));
-        assertTrue("byte -> byte", ClassUtils.isAssignable(Byte.class, Byte.TYPE, true));
-        assertTrue("byte -> short", ClassUtils.isAssignable(Byte.class, Short.TYPE, true));
-        assertTrue("byte -> int", ClassUtils.isAssignable(Byte.class, Integer.TYPE, true));
-        assertTrue("byte -> long", ClassUtils.isAssignable(Byte.class, Long.TYPE, true));
-        assertTrue("byte -> float", ClassUtils.isAssignable(Byte.class, Float.TYPE, true));
-        assertTrue("byte -> double", ClassUtils.isAssignable(Byte.class, Double.TYPE, true));
-        assertFalse("byte -> boolean", ClassUtils.isAssignable(Byte.class, Boolean.TYPE, true));
-
-        // test short conversions
-        assertFalse("short -> char", ClassUtils.isAssignable(Short.class, Character.TYPE, true));
-        assertFalse("short -> byte", ClassUtils.isAssignable(Short.class, Byte.TYPE, true));
-        assertTrue("short -> short", ClassUtils.isAssignable(Short.class, Short.TYPE, true));
-        assertTrue("short -> int", ClassUtils.isAssignable(Short.class, Integer.TYPE, true));
-        assertTrue("short -> long", ClassUtils.isAssignable(Short.class, Long.TYPE, true));
-        assertTrue("short -> float", ClassUtils.isAssignable(Short.class, Float.TYPE, true));
-        assertTrue("short -> double", ClassUtils.isAssignable(Short.class, Double.TYPE, true));
-        assertFalse("short -> boolean", ClassUtils.isAssignable(Short.class, Boolean.TYPE, true));
-
-        // test char conversions
-        assertTrue("char -> char", ClassUtils.isAssignable(Character.class, Character.TYPE, true));
-        assertFalse("char -> byte", ClassUtils.isAssignable(Character.class, Byte.TYPE, true));
-        assertFalse("char -> short", ClassUtils.isAssignable(Character.class, Short.TYPE, true));
-        assertTrue("char -> int", ClassUtils.isAssignable(Character.class, Integer.TYPE, true));
-        assertTrue("char -> long", ClassUtils.isAssignable(Character.class, Long.TYPE, true));
-        assertTrue("char -> float", ClassUtils.isAssignable(Character.class, Float.TYPE, true));
-        assertTrue("char -> double", ClassUtils.isAssignable(Character.class, Double.TYPE, true));
-        assertFalse("char -> boolean", ClassUtils.isAssignable(Character.class, Boolean.TYPE, true));
-
-        // test int conversions
-        assertFalse("int -> char", ClassUtils.isAssignable(Integer.class, Character.TYPE, true));
-        assertFalse("int -> byte", ClassUtils.isAssignable(Integer.class, Byte.TYPE, true));
-        assertFalse("int -> short", ClassUtils.isAssignable(Integer.class, Short.TYPE, true));
-        assertTrue("int -> int", ClassUtils.isAssignable(Integer.class, Integer.TYPE, true));
-        assertTrue("int -> long", ClassUtils.isAssignable(Integer.class, Long.TYPE, true));
-        assertTrue("int -> float", ClassUtils.isAssignable(Integer.class, Float.TYPE, true));
-        assertTrue("int -> double", ClassUtils.isAssignable(Integer.class, Double.TYPE, true));
-        assertFalse("int -> boolean", ClassUtils.isAssignable(Integer.class, Boolean.TYPE, true));
-
-        // test long conversions
-        assertFalse("long -> char", ClassUtils.isAssignable(Long.class, Character.TYPE, true));
-        assertFalse("long -> byte", ClassUtils.isAssignable(Long.class, Byte.TYPE, true));
-        assertFalse("long -> short", ClassUtils.isAssignable(Long.class, Short.TYPE, true));
-        assertFalse("long -> int", ClassUtils.isAssignable(Long.class, Integer.TYPE, true));
-        assertTrue("long -> long", ClassUtils.isAssignable(Long.class, Long.TYPE, true));
-        assertTrue("long -> float", ClassUtils.isAssignable(Long.class, Float.TYPE, true));
-        assertTrue("long -> double", ClassUtils.isAssignable(Long.class, Double.TYPE, true));
-        assertFalse("long -> boolean", ClassUtils.isAssignable(Long.class, Boolean.TYPE, true));
-
-        // test float conversions
-        assertFalse("float -> char", ClassUtils.isAssignable(Float.class, Character.TYPE, true));
-        assertFalse("float -> byte", ClassUtils.isAssignable(Float.class, Byte.TYPE, true));
-        assertFalse("float -> short", ClassUtils.isAssignable(Float.class, Short.TYPE, true));
-        assertFalse("float -> int", ClassUtils.isAssignable(Float.class, Integer.TYPE, true));
-        assertFalse("float -> long", ClassUtils.isAssignable(Float.class, Long.TYPE, true));
-        assertTrue("float -> float", ClassUtils.isAssignable(Float.class, Float.TYPE, true));
-        assertTrue("float -> double", ClassUtils.isAssignable(Float.class, Double.TYPE, true));
-        assertFalse("float -> boolean", ClassUtils.isAssignable(Float.class, Boolean.TYPE, true));
-
-        // test double conversions
-        assertFalse("double -> char", ClassUtils.isAssignable(Double.class, Character.TYPE, true));
-        assertFalse("double -> byte", ClassUtils.isAssignable(Double.class, Byte.TYPE, true));
-        assertFalse("double -> short", ClassUtils.isAssignable(Double.class, Short.TYPE, true));
-        assertFalse("double -> int", ClassUtils.isAssignable(Double.class, Integer.TYPE, true));
-        assertFalse("double -> long", ClassUtils.isAssignable(Double.class, Long.TYPE, true));
-        assertFalse("double -> float", ClassUtils.isAssignable(Double.class, Float.TYPE, true));
-        assertTrue("double -> double", ClassUtils.isAssignable(Double.class, Double.TYPE, true));
-        assertFalse("double -> boolean", ClassUtils.isAssignable(Double.class, Boolean.TYPE, true));
-
-        // test boolean conversions
-        assertFalse("boolean -> char", ClassUtils.isAssignable(Boolean.class, Character.TYPE, true));
-        assertFalse("boolean -> byte", ClassUtils.isAssignable(Boolean.class, Byte.TYPE, true));
-        assertFalse("boolean -> short", ClassUtils.isAssignable(Boolean.class, Short.TYPE, true));
-        assertFalse("boolean -> int", ClassUtils.isAssignable(Boolean.class, Integer.TYPE, true));
-        assertFalse("boolean -> long", ClassUtils.isAssignable(Boolean.class, Long.TYPE, true));
-        assertFalse("boolean -> float", ClassUtils.isAssignable(Boolean.class, Float.TYPE, true));
-        assertFalse("boolean -> double", ClassUtils.isAssignable(Boolean.class, Double.TYPE, true));
-        assertTrue("boolean -> boolean", ClassUtils.isAssignable(Boolean.class, Boolean.TYPE, true));
-    }
-
-    @Test
-    public void testIsPrimitiveOrWrapper() {
-
-        // test primitive wrapper classes
-        assertTrue("Boolean.class", ClassUtils.isPrimitiveOrWrapper(Boolean.class));
-        assertTrue("Byte.class", ClassUtils.isPrimitiveOrWrapper(Byte.class));
-        assertTrue("Character.class", ClassUtils.isPrimitiveOrWrapper(Character.class));
-        assertTrue("Short.class", ClassUtils.isPrimitiveOrWrapper(Short.class));
-        assertTrue("Integer.class", ClassUtils.isPrimitiveOrWrapper(Integer.class));
-        assertTrue("Long.class", ClassUtils.isPrimitiveOrWrapper(Long.class));
-        assertTrue("Double.class", ClassUtils.isPrimitiveOrWrapper(Double.class));
-        assertTrue("Float.class", ClassUtils.isPrimitiveOrWrapper(Float.class));
-        
-        // test primitive classes
-        assertTrue("boolean", ClassUtils.isPrimitiveOrWrapper(Boolean.TYPE));
-        assertTrue("byte", ClassUtils.isPrimitiveOrWrapper(Byte.TYPE));
-        assertTrue("char", ClassUtils.isPrimitiveOrWrapper(Character.TYPE));
-        assertTrue("short", ClassUtils.isPrimitiveOrWrapper(Short.TYPE));
-        assertTrue("int", ClassUtils.isPrimitiveOrWrapper(Integer.TYPE));
-        assertTrue("long", ClassUtils.isPrimitiveOrWrapper(Long.TYPE));
-        assertTrue("double", ClassUtils.isPrimitiveOrWrapper(Double.TYPE));
-        assertTrue("float", ClassUtils.isPrimitiveOrWrapper(Float.TYPE));
-        assertTrue("Void.TYPE", ClassUtils.isPrimitiveOrWrapper(Void.TYPE));
-        
-        // others
-        assertFalse("null", ClassUtils.isPrimitiveOrWrapper(null));
-        assertFalse("Void.class", ClassUtils.isPrimitiveOrWrapper(Void.class));
-        assertFalse("String.class", ClassUtils.isPrimitiveOrWrapper(String.class));
-        assertFalse("this.getClass()", ClassUtils.isPrimitiveOrWrapper(this.getClass()));
-    }
-    
-    @Test
-    public void testIsPrimitiveWrapper() {
-
-        // test primitive wrapper classes
-        assertTrue("Boolean.class", ClassUtils.isPrimitiveWrapper(Boolean.class));
-        assertTrue("Byte.class", ClassUtils.isPrimitiveWrapper(Byte.class));
-        assertTrue("Character.class", ClassUtils.isPrimitiveWrapper(Character.class));
-        assertTrue("Short.class", ClassUtils.isPrimitiveWrapper(Short.class));
-        assertTrue("Integer.class", ClassUtils.isPrimitiveWrapper(Integer.class));
-        assertTrue("Long.class", ClassUtils.isPrimitiveWrapper(Long.class));
-        assertTrue("Double.class", ClassUtils.isPrimitiveWrapper(Double.class));
-        assertTrue("Float.class", ClassUtils.isPrimitiveWrapper(Float.class));
-        
-        // test primitive classes
-        assertFalse("boolean", ClassUtils.isPrimitiveWrapper(Boolean.TYPE));
-        assertFalse("byte", ClassUtils.isPrimitiveWrapper(Byte.TYPE));
-        assertFalse("char", ClassUtils.isPrimitiveWrapper(Character.TYPE));
-        assertFalse("short", ClassUtils.isPrimitiveWrapper(Short.TYPE));
-        assertFalse("int", ClassUtils.isPrimitiveWrapper(Integer.TYPE));
-        assertFalse("long", ClassUtils.isPrimitiveWrapper(Long.TYPE));
-        assertFalse("double", ClassUtils.isPrimitiveWrapper(Double.TYPE));
-        assertFalse("float", ClassUtils.isPrimitiveWrapper(Float.TYPE));
-        
-        // others
-        assertFalse("null", ClassUtils.isPrimitiveWrapper(null));
-        assertFalse("Void.class", ClassUtils.isPrimitiveWrapper(Void.class));
-        assertFalse("Void.TYPE", ClassUtils.isPrimitiveWrapper(Void.TYPE));
-        assertFalse("String.class", ClassUtils.isPrimitiveWrapper(String.class));
-        assertFalse("this.getClass()", ClassUtils.isPrimitiveWrapper(this.getClass()));
-    }
-    
-    @Test
-    public void testPrimitiveToWrapper() {
-
-        // test primitive classes
-        assertEquals("boolean -> Boolean.class",
-            Boolean.class, ClassUtils.primitiveToWrapper(Boolean.TYPE));
-        assertEquals("byte -> Byte.class",
-            Byte.class, ClassUtils.primitiveToWrapper(Byte.TYPE));
-        assertEquals("char -> Character.class",
-            Character.class, ClassUtils.primitiveToWrapper(Character.TYPE));
-        assertEquals("short -> Short.class",
-            Short.class, ClassUtils.primitiveToWrapper(Short.TYPE));
-        assertEquals("int -> Integer.class",
-            Integer.class, ClassUtils.primitiveToWrapper(Integer.TYPE));
-        assertEquals("long -> Long.class",
-            Long.class, ClassUtils.primitiveToWrapper(Long.TYPE));
-        assertEquals("double -> Double.class",
-            Double.class, ClassUtils.primitiveToWrapper(Double.TYPE));
-        assertEquals("float -> Float.class",
-            Float.class, ClassUtils.primitiveToWrapper(Float.TYPE));
-
-        // test a few other classes
-        assertEquals("String.class -> String.class",
-            String.class, ClassUtils.primitiveToWrapper(String.class));
-        assertEquals("ClassUtils.class -> ClassUtils.class",
-            org.apache.commons.lang3.ClassUtils.class,
-            ClassUtils.primitiveToWrapper(org.apache.commons.lang3.ClassUtils.class));
-        assertEquals("Void.TYPE -> Void.TYPE",
-            Void.TYPE, ClassUtils.primitiveToWrapper(Void.TYPE));
-
-        // test null
-        assertNull("null -> null",
-            ClassUtils.primitiveToWrapper(null));
-    }
-
-    @Test
-    public void testPrimitivesToWrappers() {
-        // test null
-//        assertNull("null -> null", ClassUtils.primitivesToWrappers(null)); // generates warning
-        assertNull("null -> null", ClassUtils.primitivesToWrappers((Class<?>[]) null)); // equivalent cast to avoid warning
-        // Other possible casts for null
-        assertTrue("empty -> empty", Arrays.equals(ArrayUtils.EMPTY_CLASS_ARRAY, ClassUtils.primitivesToWrappers()));
-        final Class<?>[] castNull = ClassUtils.primitivesToWrappers((Class<?>)null); // == new Class<?>[]{null}
-        assertTrue("(Class<?>)null -> [null]", Arrays.equals(new Class<?>[]{null}, castNull));
-        // test empty array is returned unchanged
-        // TODO this is not documented
-        assertArrayEquals("empty -> empty",
-                ArrayUtils.EMPTY_CLASS_ARRAY, ClassUtils.primitivesToWrappers(ArrayUtils.EMPTY_CLASS_ARRAY));
-
-        // test an array of various classes
-        final Class<?>[] primitives = new Class[] {
-                Boolean.TYPE, Byte.TYPE, Character.TYPE, Short.TYPE,
-                Integer.TYPE, Long.TYPE, Double.TYPE, Float.TYPE,
-                String.class, ClassUtils.class
-        };
-        final Class<?>[] wrappers= ClassUtils.primitivesToWrappers(primitives);
-
-        for (int i=0; i < primitives.length; i++) {
-            // test each returned wrapper
-            final Class<?> primitive = primitives[i];
-            final Class<?> expectedWrapper = ClassUtils.primitiveToWrapper(primitive);
-
-            assertEquals(primitive + " -> " + expectedWrapper, expectedWrapper, wrappers[i]);
-        }
-
-        // test an array of no primitive classes
-        final Class<?>[] noPrimitives = new Class[] {
-                String.class, ClassUtils.class, Void.TYPE
-        };
-        // This used to return the exact same array, but no longer does.
-        assertNotSame("unmodified", noPrimitives, ClassUtils.primitivesToWrappers(noPrimitives));
-    }
-
-    @Test
-    public void testWrapperToPrimitive() {
-        // an array with classes to convert
-        final Class<?>[] primitives = {
-                Boolean.TYPE, Byte.TYPE, Character.TYPE, Short.TYPE,
-                Integer.TYPE, Long.TYPE, Float.TYPE, Double.TYPE
-        };
-        for (final Class<?> primitive : primitives) {
-            final Class<?> wrapperCls = ClassUtils.primitiveToWrapper(primitive);
-            assertFalse("Still primitive", wrapperCls.isPrimitive());
-            assertEquals(wrapperCls + " -> " + primitive, primitive,
-                    ClassUtils.wrapperToPrimitive(wrapperCls));
-        }
-    }
-
-    @Test
-    public void testWrapperToPrimitiveNoWrapper() {
-        assertNull("Wrong result for non wrapper class", ClassUtils.wrapperToPrimitive(String.class));
-    }
-
-    @Test
-    public void testWrapperToPrimitiveNull() {
-        assertNull("Wrong result for null class", ClassUtils.wrapperToPrimitive(null));
-    }
-
-    @Test
-    public void testWrappersToPrimitives() {
-        // an array with classes to test
-        final Class<?>[] classes = {
-                Boolean.class, Byte.class, Character.class, Short.class,
-                Integer.class, Long.class, Float.class, Double.class,
-                String.class, ClassUtils.class, null
-        };
-
-        final Class<?>[] primitives = ClassUtils.wrappersToPrimitives(classes);
-        // now test the result
-        assertEquals("Wrong length of result array", classes.length, primitives.length);
-        for (int i = 0; i < classes.length; i++) {
-            final Class<?> expectedPrimitive = ClassUtils.wrapperToPrimitive(classes[i]);
-            assertEquals(classes[i] + " -> " + expectedPrimitive, expectedPrimitive,
-                    primitives[i]);
-        }
-    }
-
-    @Test
-    public void testWrappersToPrimitivesNull() {
-//        assertNull("Wrong result for null input", ClassUtils.wrappersToPrimitives(null)); // generates warning
-        assertNull("Wrong result for null input", ClassUtils.wrappersToPrimitives((Class<?>[]) null)); // equivalent cast
-        // Other possible casts for null
-        assertTrue("empty -> empty", Arrays.equals(ArrayUtils.EMPTY_CLASS_ARRAY, ClassUtils.wrappersToPrimitives()));
-        final Class<?>[] castNull = ClassUtils.wrappersToPrimitives((Class<?>)null); // == new Class<?>[]{null}
-        assertTrue("(Class<?>)null -> [null]", Arrays.equals(new Class<?>[]{null}, castNull));
-}
-
-    @Test
-    public void testWrappersToPrimitivesEmpty() {
-        final Class<?>[] empty = new Class[0];
-        assertArrayEquals("Wrong result for empty input", empty, ClassUtils.wrappersToPrimitives(empty));
-    }
-
-    @Test
-    public void testGetClassClassNotFound() throws Exception {
-        assertGetClassThrowsClassNotFound( "bool" );
-        assertGetClassThrowsClassNotFound( "bool[]" );
-        assertGetClassThrowsClassNotFound( "integer[]" );
-    }
-
-    @Test
-    public void testGetClassInvalidArguments() throws Exception {
-        assertGetClassThrowsNullPointerException( null );
-        assertGetClassThrowsClassNotFound( "[][][]" );
-        assertGetClassThrowsClassNotFound( "[[]" );
-        assertGetClassThrowsClassNotFound( "[" );
-        assertGetClassThrowsClassNotFound( "java.lang.String][" );
-        assertGetClassThrowsClassNotFound( ".hello.world" );
-        assertGetClassThrowsClassNotFound( "hello..world" );
-    }
-
-    @Test
-    public void testWithInterleavingWhitespace() throws ClassNotFoundException {
-        assertEquals( int[].class, ClassUtils.getClass( " int [ ] " ) );
-        assertEquals( long[].class, ClassUtils.getClass( "\rlong\t[\n]\r" ) );
-        assertEquals( short[].class, ClassUtils.getClass( "\tshort                \t\t[]" ) );
-        assertEquals( byte[].class, ClassUtils.getClass( "byte[\t\t\n\r]   " ) );
-    }
-
-    @Test
-    public void testGetInnerClass() throws ClassNotFoundException {
-        assertEquals( Inner.DeeplyNested.class, ClassUtils.getClass( "org.apache.commons.lang3.ClassUtilsTest.Inner.DeeplyNested" ) );
-        assertEquals( Inner.DeeplyNested.class, ClassUtils.getClass( "org.apache.commons.lang3.ClassUtilsTest.Inner$DeeplyNested" ) );
-        assertEquals( Inner.DeeplyNested.class, ClassUtils.getClass( "org.apache.commons.lang3.ClassUtilsTest$Inner$DeeplyNested" ) );
-        assertEquals( Inner.DeeplyNested.class, ClassUtils.getClass( "org.apache.commons.lang3.ClassUtilsTest$Inner.DeeplyNested" ) );
-    }
-
-    @Test
-    public void testGetClassByNormalNameArrays() throws ClassNotFoundException {
-        assertEquals( int[].class, ClassUtils.getClass( "int[]" ) );
-        assertEquals( long[].class, ClassUtils.getClass( "long[]" ) );
-        assertEquals( short[].class, ClassUtils.getClass( "short[]" ) );
-        assertEquals( byte[].class, ClassUtils.getClass( "byte[]" ) );
-        assertEquals( char[].class, ClassUtils.getClass( "char[]" ) );
-        assertEquals( float[].class, ClassUtils.getClass( "float[]" ) );
-        assertEquals( double[].class, ClassUtils.getClass( "double[]" ) );
-        assertEquals( boolean[].class, ClassUtils.getClass( "boolean[]" ) );
-        assertEquals( String[].class, ClassUtils.getClass( "java.lang.String[]" ) );
-        assertEquals( java.util.Map.Entry[].class, ClassUtils.getClass( "java.util.Map.Entry[]" ) );
-        assertEquals( java.util.Map.Entry[].class, ClassUtils.getClass( "java.util.Map$Entry[]" ) );
-        assertEquals( java.util.Map.Entry[].class, ClassUtils.getClass( "[Ljava.util.Map.Entry;" ) );
-        assertEquals( java.util.Map.Entry[].class, ClassUtils.getClass( "[Ljava.util.Map$Entry;" ) );
-    }
-
-    @Test
-    public void testGetClassByNormalNameArrays2D() throws ClassNotFoundException {
-        assertEquals( int[][].class, ClassUtils.getClass( "int[][]" ) );
-        assertEquals( long[][].class, ClassUtils.getClass( "long[][]" ) );
-        assertEquals( short[][].class, ClassUtils.getClass( "short[][]" ) );
-        assertEquals( byte[][].class, ClassUtils.getClass( "byte[][]" ) );
-        assertEquals( char[][].class, ClassUtils.getClass( "char[][]" ) );
-        assertEquals( float[][].class, ClassUtils.getClass( "float[][]" ) );
-        assertEquals( double[][].class, ClassUtils.getClass( "double[][]" ) );
-        assertEquals( boolean[][].class, ClassUtils.getClass( "boolean[][]" ) );
-        assertEquals( String[][].class, ClassUtils.getClass( "java.lang.String[][]" ) );
-    }
-
-    @Test
-    public void testGetClassWithArrayClasses2D() throws Exception {
-        assertGetClassReturnsClass( String[][].class );
-        assertGetClassReturnsClass( int[][].class );
-        assertGetClassReturnsClass( long[][].class );
-        assertGetClassReturnsClass( short[][].class );
-        assertGetClassReturnsClass( byte[][].class );
-        assertGetClassReturnsClass( char[][].class );
-        assertGetClassReturnsClass( float[][].class );
-        assertGetClassReturnsClass( double[][].class );
-        assertGetClassReturnsClass( boolean[][].class );
-    }
-
-    @Test
-    public void testGetClassWithArrayClasses() throws Exception {
-        assertGetClassReturnsClass( String[].class );
-        assertGetClassReturnsClass( int[].class );
-        assertGetClassReturnsClass( long[].class );
-        assertGetClassReturnsClass( short[].class );
-        assertGetClassReturnsClass( byte[].class );
-        assertGetClassReturnsClass( char[].class );
-        assertGetClassReturnsClass( float[].class );
-        assertGetClassReturnsClass( double[].class );
-        assertGetClassReturnsClass( boolean[].class );
-    }
-
-    @Test
-    public void testGetClassRawPrimitives() throws ClassNotFoundException {
-        assertEquals( int.class, ClassUtils.getClass( "int" ) );
-        assertEquals( long.class, ClassUtils.getClass( "long" ) );
-        assertEquals( short.class, ClassUtils.getClass( "short" ) );
-        assertEquals( byte.class, ClassUtils.getClass( "byte" ) );
-        assertEquals( char.class, ClassUtils.getClass( "char" ) );
-        assertEquals( float.class, ClassUtils.getClass( "float" ) );
-        assertEquals( double.class, ClassUtils.getClass( "double" ) );
-        assertEquals( boolean.class, ClassUtils.getClass( "boolean" ) );
-    }
-
-    private void assertGetClassReturnsClass( final Class<?> c ) throws Exception {
-        assertEquals( c, ClassUtils.getClass( c.getName() ) );
-    }
-
-    private void assertGetClassThrowsException( final String className, final Class<?> exceptionType ) throws Exception {
-        try {
-            ClassUtils.getClass( className );
-            fail( "ClassUtils.getClass() should fail with an exception of type " + exceptionType.getName() + " when given class name \"" + className + "\"." );
-        }
-        catch( final Exception e ) {
-            assertTrue( exceptionType.isAssignableFrom( e.getClass() ) );
-        }
-    }
-
-    private void assertGetClassThrowsNullPointerException( final String className ) throws Exception {
-        assertGetClassThrowsException( className, NullPointerException.class );
-    }
-
-    private void assertGetClassThrowsClassNotFound( final String className ) throws Exception {
-        assertGetClassThrowsException( className, ClassNotFoundException.class );
-    }
-
-    // Show the Java bug: http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=4071957
-    // We may have to delete this if a JDK fixes the bug.
-    @Test
-    public void testShowJavaBug() throws Exception {
-        // Tests with Collections$UnmodifiableSet
-        final Set<?> set = Collections.unmodifiableSet(new HashSet<Object>());
-        final Method isEmptyMethod = set.getClass().getMethod("isEmpty",  new Class[0]);
-        try {
-            isEmptyMethod.invoke(set, new Object[0]);
-            fail("Failed to throw IllegalAccessException as expected");
-        } catch(final IllegalAccessException iae) {
-            // expected
-        }
-    }
-
-    @Test
-    public void testGetPublicMethod() throws Exception {
-        // Tests with Collections$UnmodifiableSet
-        final Set<?> set = Collections.unmodifiableSet(new HashSet<Object>());
-        final Method isEmptyMethod = ClassUtils.getPublicMethod(set.getClass(), "isEmpty",  new Class[0]);
-            assertTrue(Modifier.isPublic(isEmptyMethod.getDeclaringClass().getModifiers()));
-
-        try {
-            isEmptyMethod.invoke(set, new Object[0]);
-        } catch(final java.lang.IllegalAccessException iae) {
-            fail("Should not have thrown IllegalAccessException");
-        }
-
-        // Tests with a public Class
-        final Method toStringMethod = ClassUtils.getPublicMethod(Object.class, "toString",  new Class[0]);
-            assertEquals(Object.class.getMethod("toString", new Class[0]), toStringMethod);
-    }
-
-    @Test
-    public void testToClass_object() {
-//        assertNull(ClassUtils.toClass(null)); // generates warning
-        assertNull(ClassUtils.toClass((Object[]) null)); // equivalent explicit cast
-        
-        // Additional varargs tests
-        assertTrue("empty -> empty", Arrays.equals(ArrayUtils.EMPTY_CLASS_ARRAY, ClassUtils.toClass()));
-        final Class<?>[] castNull = ClassUtils.toClass((Object) null); // == new Object[]{null}
-        assertTrue("(Object)null -> [null]", Arrays.equals(new Object[]{null}, castNull));
-
-        assertSame(ArrayUtils.EMPTY_CLASS_ARRAY, ClassUtils.toClass(ArrayUtils.EMPTY_OBJECT_ARRAY));
-
-        assertTrue(Arrays.equals(new Class[] { String.class, Integer.class, Double.class },
-                ClassUtils.toClass(new Object[] { "Test", Integer.valueOf(1), Double.valueOf(99d) })));
-
-        assertTrue(Arrays.equals(new Class[] { String.class, null, Double.class },
-                ClassUtils.toClass(new Object[] { "Test", null, Double.valueOf(99d) })));
-    }
-
-    @Test
-    public void test_getShortCanonicalName_Object() {
-        assertEquals("<null>", ClassUtils.getShortCanonicalName(null, "<null>"));
-        assertEquals("ClassUtils", ClassUtils.getShortCanonicalName(new ClassUtils(), "<null>"));
-        assertEquals("ClassUtils[]", ClassUtils.getShortCanonicalName(new ClassUtils[0], "<null>"));
-        assertEquals("ClassUtils[][]", ClassUtils.getShortCanonicalName(new ClassUtils[0][0], "<null>"));
-        assertEquals("int[]", ClassUtils.getShortCanonicalName(new int[0], "<null>"));
-        assertEquals("int[][]", ClassUtils.getShortCanonicalName(new int[0][0], "<null>"));
-
-        // Inner types
-        class Named {}
-        assertEquals("ClassUtilsTest.6", ClassUtils.getShortCanonicalName(new Object(){}, "<null>"));
-        assertEquals("ClassUtilsTest.5Named", ClassUtils.getShortCanonicalName(new Named(), "<null>"));
-        assertEquals("ClassUtilsTest.Inner", ClassUtils.getShortCanonicalName(new Inner(), "<null>"));
-    }
-
-    @Test
-    public void test_getShortCanonicalName_Class() {
-        assertEquals("ClassUtils", ClassUtils.getShortCanonicalName(ClassUtils.class));
-        assertEquals("ClassUtils[]", ClassUtils.getShortCanonicalName(ClassUtils[].class));
-        assertEquals("ClassUtils[][]", ClassUtils.getShortCanonicalName(ClassUtils[][].class));
-        assertEquals("int[]", ClassUtils.getShortCanonicalName(int[].class));
-        assertEquals("int[][]", ClassUtils.getShortCanonicalName(int[][].class));
-        
-        // Inner types
-        class Named {}
-        assertEquals("ClassUtilsTest.7", ClassUtils.getShortCanonicalName(new Object(){}.getClass()));
-        assertEquals("ClassUtilsTest.6Named", ClassUtils.getShortCanonicalName(Named.class));
-        assertEquals("ClassUtilsTest.Inner", ClassUtils.getShortCanonicalName(Inner.class));
-    }
-
-    @Test
-    public void test_getShortCanonicalName_String() {
-        assertEquals("ClassUtils", ClassUtils.getShortCanonicalName("org.apache.commons.lang3.ClassUtils"));
-        assertEquals("ClassUtils[]", ClassUtils.getShortCanonicalName("[Lorg.apache.commons.lang3.ClassUtils;"));
-        assertEquals("ClassUtils[][]", ClassUtils.getShortCanonicalName("[[Lorg.apache.commons.lang3.ClassUtils;"));
-        assertEquals("ClassUtils[]", ClassUtils.getShortCanonicalName("org.apache.commons.lang3.ClassUtils[]"));
-        assertEquals("ClassUtils[][]", ClassUtils.getShortCanonicalName("org.apache.commons.lang3.ClassUtils[][]"));
-        assertEquals("int[]", ClassUtils.getShortCanonicalName("[I"));
-        assertEquals("int[][]", ClassUtils.getShortCanonicalName("[[I"));
-        assertEquals("int[]", ClassUtils.getShortCanonicalName("int[]"));
-        assertEquals("int[][]", ClassUtils.getShortCanonicalName("int[][]"));
-        
-        // Inner types
-        assertEquals("ClassUtilsTest.6", ClassUtils.getShortCanonicalName("org.apache.commons.lang3.ClassUtilsTest$6"));
-        assertEquals("ClassUtilsTest.5Named", ClassUtils.getShortCanonicalName("org.apache.commons.lang3.ClassUtilsTest$5Named"));
-        assertEquals("ClassUtilsTest.Inner", ClassUtils.getShortCanonicalName("org.apache.commons.lang3.ClassUtilsTest$Inner"));
-    }
-
-    @Test
-    public void test_getPackageCanonicalName_Object() {
-        assertEquals("<null>", ClassUtils.getPackageCanonicalName(null, "<null>"));
-        assertEquals("org.apache.commons.lang3", ClassUtils.getPackageCanonicalName(new ClassUtils(), "<null>"));
-        assertEquals("org.apache.commons.lang3", ClassUtils.getPackageCanonicalName(new ClassUtils[0], "<null>"));
-        assertEquals("org.apache.commons.lang3", ClassUtils.getPackageCanonicalName(new ClassUtils[0][0], "<null>"));
-        assertEquals("", ClassUtils.getPackageCanonicalName(new int[0], "<null>"));
-        assertEquals("", ClassUtils.getPackageCanonicalName(new int[0][0], "<null>"));
-        
-        // Inner types
-        class Named {}
-        assertEquals("org.apache.commons.lang3", ClassUtils.getPackageCanonicalName(new Object(){}, "<null>"));
-        assertEquals("org.apache.commons.lang3", ClassUtils.getPackageCanonicalName(new Named(), "<null>"));
-        assertEquals("org.apache.commons.lang3", ClassUtils.getPackageCanonicalName(new Inner(), "<null>"));
-    }
-
-    @Test
-    public void test_getPackageCanonicalName_Class() {
-        assertEquals("org.apache.commons.lang3", ClassUtils.getPackageCanonicalName(ClassUtils.class));
-        assertEquals("org.apache.commons.lang3", ClassUtils.getPackageCanonicalName(ClassUtils[].class));
-        assertEquals("org.apache.commons.lang3", ClassUtils.getPackageCanonicalName(ClassUtils[][].class));
-        assertEquals("", ClassUtils.getPackageCanonicalName(int[].class));
-        assertEquals("", ClassUtils.getPackageCanonicalName(int[][].class));
-        
-        // Inner types
-        class Named {}
-        assertEquals("org.apache.commons.lang3", ClassUtils.getPackageCanonicalName(new Object(){}.getClass()));
-        assertEquals("org.apache.commons.lang3", ClassUtils.getPackageCanonicalName(Named.class));
-        assertEquals("org.apache.commons.lang3", ClassUtils.getPackageCanonicalName(Inner.class));
-    }
-
-    @Test
-    public void test_getPackageCanonicalName_String() {
-        assertEquals("org.apache.commons.lang3",
-            ClassUtils.getPackageCanonicalName("org.apache.commons.lang3.ClassUtils"));
-        assertEquals("org.apache.commons.lang3",
-            ClassUtils.getPackageCanonicalName("[Lorg.apache.commons.lang3.ClassUtils;"));
-        assertEquals("org.apache.commons.lang3",
-            ClassUtils.getPackageCanonicalName("[[Lorg.apache.commons.lang3.ClassUtils;"));
-        assertEquals("org.apache.commons.lang3",
-            ClassUtils.getPackageCanonicalName("org.apache.commons.lang3.ClassUtils[]"));
-        assertEquals("org.apache.commons.lang3",
-            ClassUtils.getPackageCanonicalName("org.apache.commons.lang3.ClassUtils[][]"));
-        assertEquals("", ClassUtils.getPackageCanonicalName("[I"));
-        assertEquals("", ClassUtils.getPackageCanonicalName("[[I"));
-        assertEquals("", ClassUtils.getPackageCanonicalName("int[]"));
-        assertEquals("", ClassUtils.getPackageCanonicalName("int[][]"));
-        
-        // Inner types
-        assertEquals("org.apache.commons.lang3", ClassUtils.getPackageCanonicalName("org.apache.commons.lang3.ClassUtilsTest$6"));
-        assertEquals("org.apache.commons.lang3", ClassUtils.getPackageCanonicalName("org.apache.commons.lang3.ClassUtilsTest$5Named"));
-        assertEquals("org.apache.commons.lang3", ClassUtils.getPackageCanonicalName("org.apache.commons.lang3.ClassUtilsTest$Inner"));
-    }
-
-    @Test
-    public void testHierarchyIncludingInterfaces() {
-        final Iterator<Class<?>> iter =
-            ClassUtils.hierarchy(StringParameterizedChild.class, Interfaces.INCLUDE).iterator();
-        assertEquals(StringParameterizedChild.class, iter.next());
-        assertEquals(GenericParent.class, iter.next());
-        assertEquals(GenericConsumer.class, iter.next());
-        assertEquals(Object.class, iter.next());
-        assertFalse(iter.hasNext());
-    }
-
-    @Test
-    public void testHierarchyExcludingInterfaces() {
-        final Iterator<Class<?>> iter = ClassUtils.hierarchy(StringParameterizedChild.class).iterator();
-        assertEquals(StringParameterizedChild.class, iter.next());
-        assertEquals(GenericParent.class, iter.next());
-        assertEquals(Object.class, iter.next());
-        assertFalse(iter.hasNext());
-    }
-}
diff --git a/lang/src/test/java/org/apache/commons/lang3/ConversionTest.java b/lang/src/test/java/org/apache/commons/lang3/ConversionTest.java
deleted file mode 100644
index 4cf34d4..0000000
--- a/lang/src/test/java/org/apache/commons/lang3/ConversionTest.java
+++ /dev/null
@@ -1,1824 +0,0 @@
-/*******************************************************************************
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- *******************************************************************************/
-package org.apache.commons.lang3;
-
-import static org.junit.Assert.assertArrayEquals;
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.fail;
-
-import java.util.UUID;
-
-import org.junit.Test;
-
-
-/**
- * Unit tests {@link Conversion}.
- * 
- * @version $Id$
- */
-public class ConversionTest {
-
-    /**
-     * Tests {@link Conversion#hexDigitToInt(char)}.
-     */
-    @Test
-    public void testHexDigitToInt() {
-        assertEquals(0, Conversion.hexDigitToInt('0'));
-        assertEquals(1, Conversion.hexDigitToInt('1'));
-        assertEquals(2, Conversion.hexDigitToInt('2'));
-        assertEquals(3, Conversion.hexDigitToInt('3'));
-        assertEquals(4, Conversion.hexDigitToInt('4'));
-        assertEquals(5, Conversion.hexDigitToInt('5'));
-        assertEquals(6, Conversion.hexDigitToInt('6'));
-        assertEquals(7, Conversion.hexDigitToInt('7'));
-        assertEquals(8, Conversion.hexDigitToInt('8'));
-        assertEquals(9, Conversion.hexDigitToInt('9'));
-        assertEquals(10, Conversion.hexDigitToInt('A'));
-        assertEquals(10, Conversion.hexDigitToInt('a'));
-        assertEquals(11, Conversion.hexDigitToInt('B'));
-        assertEquals(11, Conversion.hexDigitToInt('b'));
-        assertEquals(12, Conversion.hexDigitToInt('C'));
-        assertEquals(12, Conversion.hexDigitToInt('c'));
-        assertEquals(13, Conversion.hexDigitToInt('D'));
-        assertEquals(13, Conversion.hexDigitToInt('d'));
-        assertEquals(14, Conversion.hexDigitToInt('E'));
-        assertEquals(14, Conversion.hexDigitToInt('e'));
-        assertEquals(15, Conversion.hexDigitToInt('F'));
-        assertEquals(15, Conversion.hexDigitToInt('f'));
-        try {
-            Conversion.hexDigitToInt('G');
-            fail("Thrown " + IllegalArgumentException.class.getName() + " expected");
-        } catch (final IllegalArgumentException e) {
-            // OK
-        }
-    }
-
-    /**
-     * Tests {@link Conversion#hexDigitMsb0ToInt(char)}.
-     */
-    @Test
-    public void testHexDigitMsb0ToInt() {
-        assertEquals(0x0, Conversion.hexDigitMsb0ToInt('0'));
-        assertEquals(0x8, Conversion.hexDigitMsb0ToInt('1'));
-        assertEquals(0x4, Conversion.hexDigitMsb0ToInt('2'));
-        assertEquals(0xC, Conversion.hexDigitMsb0ToInt('3'));
-        assertEquals(0x2, Conversion.hexDigitMsb0ToInt('4'));
-        assertEquals(0xA, Conversion.hexDigitMsb0ToInt('5'));
-        assertEquals(0x6, Conversion.hexDigitMsb0ToInt('6'));
-        assertEquals(0xE, Conversion.hexDigitMsb0ToInt('7'));
-        assertEquals(0x1, Conversion.hexDigitMsb0ToInt('8'));
-        assertEquals(0x9, Conversion.hexDigitMsb0ToInt('9'));
-        assertEquals(0x5, Conversion.hexDigitMsb0ToInt('A'));
-        assertEquals(0x5, Conversion.hexDigitMsb0ToInt('a'));
-        assertEquals(0xD, Conversion.hexDigitMsb0ToInt('B'));
-        assertEquals(0xD, Conversion.hexDigitMsb0ToInt('b'));
-        assertEquals(0x3, Conversion.hexDigitMsb0ToInt('C'));
-        assertEquals(0x3, Conversion.hexDigitMsb0ToInt('c'));
-        assertEquals(0xB, Conversion.hexDigitMsb0ToInt('D'));
-        assertEquals(0xB, Conversion.hexDigitMsb0ToInt('d'));
-        assertEquals(0x7, Conversion.hexDigitMsb0ToInt('E'));
-        assertEquals(0x7, Conversion.hexDigitMsb0ToInt('e'));
-        assertEquals(0xF, Conversion.hexDigitMsb0ToInt('F'));
-        assertEquals(0xF, Conversion.hexDigitMsb0ToInt('f'));
-        try {
-            Conversion.hexDigitMsb0ToInt('G');
-            fail("Thrown " + IllegalArgumentException.class.getName() + " expected");
-        } catch (final IllegalArgumentException e) {
-            // OK
-        }
-    }
-
-    /**
-     * Tests {@link Conversion#hexDigitToBinary(char)}.
-     */
-    @Test
-    public void testHexDigitToBinary() {
-        assertBinaryEquals(
-            new boolean[]{false, false, false, false}, Conversion.hexDigitToBinary('0'));
-        assertBinaryEquals(
-            new boolean[]{true, false, false, false}, Conversion.hexDigitToBinary('1'));
-        assertBinaryEquals(
-            new boolean[]{false, true, false, false}, Conversion.hexDigitToBinary('2'));
-        assertBinaryEquals(
-            new boolean[]{true, true, false, false}, Conversion.hexDigitToBinary('3'));
-        assertBinaryEquals(
-            new boolean[]{false, false, true, false}, Conversion.hexDigitToBinary('4'));
-        assertBinaryEquals(
-            new boolean[]{true, false, true, false}, Conversion.hexDigitToBinary('5'));
-        assertBinaryEquals(
-            new boolean[]{false, true, true, false}, Conversion.hexDigitToBinary('6'));
-        assertBinaryEquals(
-            new boolean[]{true, true, true, false}, Conversion.hexDigitToBinary('7'));
-        assertBinaryEquals(
-            new boolean[]{false, false, false, true}, Conversion.hexDigitToBinary('8'));
-        assertBinaryEquals(
-            new boolean[]{true, false, false, true}, Conversion.hexDigitToBinary('9'));
-        assertBinaryEquals(
-            new boolean[]{false, true, false, true}, Conversion.hexDigitToBinary('A'));
-        assertBinaryEquals(
-            new boolean[]{false, true, false, true}, Conversion.hexDigitToBinary('a'));
-        assertBinaryEquals(
-            new boolean[]{true, true, false, true}, Conversion.hexDigitToBinary('B'));
-        assertBinaryEquals(
-            new boolean[]{true, true, false, true}, Conversion.hexDigitToBinary('b'));
-        assertBinaryEquals(
-            new boolean[]{false, false, true, true}, Conversion.hexDigitToBinary('C'));
-        assertBinaryEquals(
-            new boolean[]{false, false, true, true}, Conversion.hexDigitToBinary('c'));
-        assertBinaryEquals(
-            new boolean[]{true, false, true, true}, Conversion.hexDigitToBinary('D'));
-        assertBinaryEquals(
-            new boolean[]{true, false, true, true}, Conversion.hexDigitToBinary('d'));
-        assertBinaryEquals(
-            new boolean[]{false, true, true, true}, Conversion.hexDigitToBinary('E'));
-        assertBinaryEquals(
-            new boolean[]{false, true, true, true}, Conversion.hexDigitToBinary('e'));
-        assertBinaryEquals(
-            new boolean[]{true, true, true, true}, Conversion.hexDigitToBinary('F'));
-        assertBinaryEquals(
-            new boolean[]{true, true, true, true}, Conversion.hexDigitToBinary('f'));
-        try {
-            Conversion.hexDigitToBinary('G');
-            fail("Thrown " + IllegalArgumentException.class.getName() + " expected");
-        } catch (final IllegalArgumentException e) {
-            // OK
-        }
-    }
-
-    /**
-     * Tests {@link Conversion#hexDigitMsb0ToBinary(char)}.
-     */
-    @Test
-    public void testHexDigitMsb0ToBinary() {
-        assertBinaryEquals(
-            new boolean[]{false, false, false, false}, Conversion.hexDigitMsb0ToBinary('0'));
-        assertBinaryEquals(
-            new boolean[]{false, false, false, true}, Conversion.hexDigitMsb0ToBinary('1'));
-        assertBinaryEquals(
-            new boolean[]{false, false, true, false}, Conversion.hexDigitMsb0ToBinary('2'));
-        assertBinaryEquals(
-            new boolean[]{false, false, true, true}, Conversion.hexDigitMsb0ToBinary('3'));
-        assertBinaryEquals(
-            new boolean[]{false, true, false, false}, Conversion.hexDigitMsb0ToBinary('4'));
-        assertBinaryEquals(
-            new boolean[]{false, true, false, true}, Conversion.hexDigitMsb0ToBinary('5'));
-        assertBinaryEquals(
-            new boolean[]{false, true, true, false}, Conversion.hexDigitMsb0ToBinary('6'));
-        assertBinaryEquals(
-            new boolean[]{false, true, true, true}, Conversion.hexDigitMsb0ToBinary('7'));
-        assertBinaryEquals(
-            new boolean[]{true, false, false, false}, Conversion.hexDigitMsb0ToBinary('8'));
-        assertBinaryEquals(
-            new boolean[]{true, false, false, true}, Conversion.hexDigitMsb0ToBinary('9'));
-        assertBinaryEquals(
-            new boolean[]{true, false, true, false}, Conversion.hexDigitMsb0ToBinary('A'));
-        assertBinaryEquals(
-            new boolean[]{true, false, true, false}, Conversion.hexDigitMsb0ToBinary('a'));
-        assertBinaryEquals(
-            new boolean[]{true, false, true, true}, Conversion.hexDigitMsb0ToBinary('B'));
-        assertBinaryEquals(
-            new boolean[]{true, false, true, true}, Conversion.hexDigitMsb0ToBinary('b'));
-        assertBinaryEquals(
-            new boolean[]{true, true, false, false}, Conversion.hexDigitMsb0ToBinary('C'));
-        assertBinaryEquals(
-            new boolean[]{true, true, false, false}, Conversion.hexDigitMsb0ToBinary('c'));
-        assertBinaryEquals(
-            new boolean[]{true, true, false, true}, Conversion.hexDigitMsb0ToBinary('D'));
-        assertBinaryEquals(
-            new boolean[]{true, true, false, true}, Conversion.hexDigitMsb0ToBinary('d'));
-        assertBinaryEquals(
-            new boolean[]{true, true, true, false}, Conversion.hexDigitMsb0ToBinary('E'));
-        assertBinaryEquals(
-            new boolean[]{true, true, true, false}, Conversion.hexDigitMsb0ToBinary('e'));
-        assertBinaryEquals(
-            new boolean[]{true, true, true, true}, Conversion.hexDigitMsb0ToBinary('F'));
-        assertBinaryEquals(
-            new boolean[]{true, true, true, true}, Conversion.hexDigitMsb0ToBinary('f'));
-        try {
-            Conversion.hexDigitMsb0ToBinary('G');
-            fail("Thrown " + IllegalArgumentException.class.getName() + " expected");
-        } catch (final IllegalArgumentException e) {
-            // OK
-        }
-    }
-
-    /**
-     * Tests {@link Conversion#binaryToHexDigit(boolean[])}.
-     */
-    @Test
-    public void testBinaryToHexDigit() {
-        assertEquals(
-            '0', Conversion.binaryToHexDigit(new boolean[]{false, false, false, false}));
-        assertEquals('1', Conversion.binaryToHexDigit(new boolean[]{true, false, false, false}));
-        assertEquals('2', Conversion.binaryToHexDigit(new boolean[]{false, true, false, false}));
-        assertEquals('3', Conversion.binaryToHexDigit(new boolean[]{true, true, false, false}));
-        assertEquals('4', Conversion.binaryToHexDigit(new boolean[]{false, false, true, false}));
-        assertEquals('5', Conversion.binaryToHexDigit(new boolean[]{true, false, true, false}));
-        assertEquals('6', Conversion.binaryToHexDigit(new boolean[]{false, true, true, false}));
-        assertEquals('7', Conversion.binaryToHexDigit(new boolean[]{true, true, true, false}));
-        assertEquals('8', Conversion.binaryToHexDigit(new boolean[]{false, false, false, true}));
-        assertEquals('9', Conversion.binaryToHexDigit(new boolean[]{true, false, false, true}));
-        assertEquals('a', Conversion.binaryToHexDigit(new boolean[]{false, true, false, true}));
-        assertEquals('b', Conversion.binaryToHexDigit(new boolean[]{true, true, false, true}));
-        assertEquals('c', Conversion.binaryToHexDigit(new boolean[]{false, false, true, true}));
-        assertEquals('d', Conversion.binaryToHexDigit(new boolean[]{true, false, true, true}));
-        assertEquals('e', Conversion.binaryToHexDigit(new boolean[]{false, true, true, true}));
-        assertEquals('f', Conversion.binaryToHexDigit(new boolean[]{true, true, true, true}));
-        assertEquals('1', Conversion.binaryToHexDigit(new boolean[]{true}));
-        assertEquals(
-            'f', Conversion.binaryToHexDigit(new boolean[]{true, true, true, true, true}));
-        try {
-            Conversion.binaryToHexDigit(new boolean[]{});
-            fail("Thrown " + IllegalArgumentException.class.getName() + " expected");
-        } catch (final IllegalArgumentException e) {
-            // OK
-        }
-    }
-
-    /**
-     * Tests {@link Conversion#binaryBeMsb0ToHexDigit(boolean[], int)}.
-     */
-    @Test
-    public void testBinaryToHexDigit_2args() {
-        final boolean[] shortArray = new boolean[]{false, true, true};
-        assertEquals('6', Conversion.binaryToHexDigit(shortArray, 0));
-        assertEquals('3', Conversion.binaryToHexDigit(shortArray, 1));
-        assertEquals('1', Conversion.binaryToHexDigit(shortArray, 2));
-        final boolean[] longArray = new boolean[]{true, false, true, false, false, true, true};
-        assertEquals('5', Conversion.binaryToHexDigit(longArray, 0));
-        assertEquals('2', Conversion.binaryToHexDigit(longArray, 1));
-        assertEquals('9', Conversion.binaryToHexDigit(longArray, 2));
-        assertEquals('c', Conversion.binaryToHexDigit(longArray, 3));
-        assertEquals('6', Conversion.binaryToHexDigit(longArray, 4));
-        assertEquals('3', Conversion.binaryToHexDigit(longArray, 5));
-        assertEquals('1', Conversion.binaryToHexDigit(longArray, 6));
-    }
-
-    /**
-     * Tests {@link Conversion#binaryToHexDigitMsb0_4bits(boolean[])}.
-     */
-    @Test
-    public void testBinaryToHexDigitMsb0_bits() {
-        assertEquals(
-            '0',
-            Conversion.binaryToHexDigitMsb0_4bits(new boolean[]{false, false, false, false}));
-        assertEquals(
-            '1',
-            Conversion.binaryToHexDigitMsb0_4bits(new boolean[]{false, false, false, true}));
-        assertEquals(
-            '2',
-            Conversion.binaryToHexDigitMsb0_4bits(new boolean[]{false, false, true, false}));
-        assertEquals(
-            '3', Conversion.binaryToHexDigitMsb0_4bits(new boolean[]{false, false, true, true}));
-        assertEquals(
-            '4',
-            Conversion.binaryToHexDigitMsb0_4bits(new boolean[]{false, true, false, false}));
-        assertEquals(
-            '5', Conversion.binaryToHexDigitMsb0_4bits(new boolean[]{false, true, false, true}));
-        assertEquals(
-            '6', Conversion.binaryToHexDigitMsb0_4bits(new boolean[]{false, true, true, false}));
-        assertEquals(
-            '7', Conversion.binaryToHexDigitMsb0_4bits(new boolean[]{false, true, true, true}));
-        assertEquals(
-            '8',
-            Conversion.binaryToHexDigitMsb0_4bits(new boolean[]{true, false, false, false}));
-        assertEquals(
-            '9', Conversion.binaryToHexDigitMsb0_4bits(new boolean[]{true, false, false, true}));
-        assertEquals(
-            'a', Conversion.binaryToHexDigitMsb0_4bits(new boolean[]{true, false, true, false}));
-        assertEquals(
-            'b', Conversion.binaryToHexDigitMsb0_4bits(new boolean[]{true, false, true, true}));
-        assertEquals(
-            'c', Conversion.binaryToHexDigitMsb0_4bits(new boolean[]{true, true, false, false}));
-        assertEquals(
-            'd', Conversion.binaryToHexDigitMsb0_4bits(new boolean[]{true, true, false, true}));
-        assertEquals(
-            'e', Conversion.binaryToHexDigitMsb0_4bits(new boolean[]{true, true, true, false}));
-        assertEquals(
-            'f', Conversion.binaryToHexDigitMsb0_4bits(new boolean[]{true, true, true, true}));
-        try {
-            Conversion.binaryToHexDigitMsb0_4bits(new boolean[]{});
-            fail("Thrown " + IllegalArgumentException.class.getName() + " expected");
-        } catch (final IllegalArgumentException e) {
-            // OK
-        }
-    }
-
-    /**
-     * Tests {@link Conversion#binaryToHexDigitMsb0_4bits(boolean[], int)}.
-     */
-    @Test
-    public void testBinaryToHexDigitMsb0_4bits_2args() {
-        // boolean[] shortArray = new boolean[]{true,true,false};
-        // assertEquals('6', Conversion.BinaryToHexDigitMsb0(shortArray,0));
-        // assertEquals('3', Conversion.BinaryToHexDigitMsb0(shortArray,1));
-        // assertEquals('1', Conversion.BinaryToHexDigitMsb0(shortArray,2));
-        final boolean[] shortArray = new boolean[]{true, true, false, true};
-        assertEquals('d', Conversion.binaryToHexDigitMsb0_4bits(shortArray, 0));
-        final boolean[] longArray = new boolean[]{true, false, true, false, false, true, true};
-        assertEquals('a', Conversion.binaryToHexDigitMsb0_4bits(longArray, 0));
-        assertEquals('4', Conversion.binaryToHexDigitMsb0_4bits(longArray, 1));
-        assertEquals('9', Conversion.binaryToHexDigitMsb0_4bits(longArray, 2));
-        assertEquals('3', Conversion.binaryToHexDigitMsb0_4bits(longArray, 3));
-        // assertEquals('6', Conversion.BinaryToHexDigitMsb0(longArray,4));
-        // assertEquals('3', Conversion.BinaryToHexDigitMsb0(longArray,5));
-        // assertEquals('1', Conversion.BinaryToHexDigitMsb0(longArray,6));
-        final boolean[] maxLengthArray = new boolean[]{
-            true, false, true, false, false, true, true, true};
-        assertEquals('a', Conversion.binaryToHexDigitMsb0_4bits(maxLengthArray, 0));
-        assertEquals('4', Conversion.binaryToHexDigitMsb0_4bits(maxLengthArray, 1));
-        assertEquals('9', Conversion.binaryToHexDigitMsb0_4bits(maxLengthArray, 2));
-        assertEquals('3', Conversion.binaryToHexDigitMsb0_4bits(maxLengthArray, 3));
-        assertEquals('7', Conversion.binaryToHexDigitMsb0_4bits(maxLengthArray, 4));
-        // assertEquals('7', Conversion.BinaryToHexDigitMsb0(longArray,5));
-        // assertEquals('3', Conversion.BinaryToHexDigitMsb0(longArray,6));
-        // assertEquals('1', Conversion.BinaryToHexDigitMsb0(longArray,7));
-        final boolean[] javaDocCheck = new boolean[]{
-            true, false, false, true, true, false, true, false};
-        assertEquals('d', Conversion.binaryToHexDigitMsb0_4bits(javaDocCheck, 3));
-
-    }
-
-    /**
-     * Tests {@link Conversion#binaryToHexDigit(boolean[])}.
-     */
-    @Test
-    public void testBinaryBeMsb0ToHexDigit() {
-        assertEquals(
-            '0', Conversion.binaryBeMsb0ToHexDigit(new boolean[]{false, false, false, false}));
-        assertEquals(
-            '1', Conversion.binaryBeMsb0ToHexDigit(new boolean[]{false, false, false, true}));
-        assertEquals(
-            '2', Conversion.binaryBeMsb0ToHexDigit(new boolean[]{false, false, true, false}));
-        assertEquals(
-            '3', Conversion.binaryBeMsb0ToHexDigit(new boolean[]{false, false, true, true}));
-        assertEquals(
-            '4', Conversion.binaryBeMsb0ToHexDigit(new boolean[]{false, true, false, false}));
-        assertEquals(
-            '5', Conversion.binaryBeMsb0ToHexDigit(new boolean[]{false, true, false, true}));
-        assertEquals(
-            '6', Conversion.binaryBeMsb0ToHexDigit(new boolean[]{false, true, true, false}));
-        assertEquals(
-            '7', Conversion.binaryBeMsb0ToHexDigit(new boolean[]{false, true, true, true}));
-        assertEquals(
-            '8', Conversion.binaryBeMsb0ToHexDigit(new boolean[]{true, false, false, false}));
-        assertEquals(
-            '9', Conversion.binaryBeMsb0ToHexDigit(new boolean[]{true, false, false, true}));
-        assertEquals(
-            'a', Conversion.binaryBeMsb0ToHexDigit(new boolean[]{true, false, true, false}));
-        assertEquals(
-            'b', Conversion.binaryBeMsb0ToHexDigit(new boolean[]{true, false, true, true}));
-        assertEquals(
-            'c', Conversion.binaryBeMsb0ToHexDigit(new boolean[]{true, true, false, false}));
-        assertEquals(
-            'd', Conversion.binaryBeMsb0ToHexDigit(new boolean[]{true, true, false, true}));
-        assertEquals(
-            'e', Conversion.binaryBeMsb0ToHexDigit(new boolean[]{true, true, true, false}));
-        assertEquals(
-            'f', Conversion.binaryBeMsb0ToHexDigit(new boolean[]{true, true, true, true}));
-        assertEquals(
-            '4',
-            Conversion.binaryBeMsb0ToHexDigit(new boolean[]{
-                true, false, false, false, false, false, false, false, false, false, false,
-                false, false, true, false, false}));
-        try {
-            Conversion.binaryBeMsb0ToHexDigit(new boolean[]{});
-            fail("Thrown " + IllegalArgumentException.class.getName() + " expected");
-        } catch (final IllegalArgumentException e) {
-            // OK
-        }
-    }
-
-    /**
-     * Tests {@link Conversion#binaryToHexDigit(boolean[], int)}.
-     */
-    @Test
-    public void testBinaryBeMsb0ToHexDigit_2args() {
-        assertEquals(
-            '5',
-            Conversion.binaryBeMsb0ToHexDigit(new boolean[]{
-                true, false, false, false, false, false, false, false, false, false, false,
-                true, false, true, false, false}, 2));
-
-        final boolean[] shortArray = new boolean[]{true, true, false};
-        assertEquals('6', Conversion.binaryBeMsb0ToHexDigit(shortArray, 0));
-        assertEquals('3', Conversion.binaryBeMsb0ToHexDigit(shortArray, 1));
-        assertEquals('1', Conversion.binaryBeMsb0ToHexDigit(shortArray, 2));
-        final boolean[] shortArray2 = new boolean[]{true, true, true, false, false, true, false, true};
-        assertEquals('5', Conversion.binaryBeMsb0ToHexDigit(shortArray2, 0));
-        assertEquals('2', Conversion.binaryBeMsb0ToHexDigit(shortArray2, 1));
-        assertEquals('9', Conversion.binaryBeMsb0ToHexDigit(shortArray2, 2));
-        assertEquals('c', Conversion.binaryBeMsb0ToHexDigit(shortArray2, 3));
-        assertEquals('e', Conversion.binaryBeMsb0ToHexDigit(shortArray2, 4));
-        assertEquals('7', Conversion.binaryBeMsb0ToHexDigit(shortArray2, 5));
-        assertEquals('3', Conversion.binaryBeMsb0ToHexDigit(shortArray2, 6));
-        assertEquals('1', Conversion.binaryBeMsb0ToHexDigit(shortArray2, 7));
-        final boolean[] multiBytesArray = new boolean[]{
-            true, true, false, false, true, false, true, false, true, true, true, false, false,
-            true, false, true};
-        assertEquals('5', Conversion.binaryBeMsb0ToHexDigit(multiBytesArray, 0));
-        assertEquals('2', Conversion.binaryBeMsb0ToHexDigit(multiBytesArray, 1));
-        assertEquals('9', Conversion.binaryBeMsb0ToHexDigit(multiBytesArray, 2));
-        assertEquals('c', Conversion.binaryBeMsb0ToHexDigit(multiBytesArray, 3));
-        assertEquals('e', Conversion.binaryBeMsb0ToHexDigit(multiBytesArray, 4));
-        assertEquals('7', Conversion.binaryBeMsb0ToHexDigit(multiBytesArray, 5));
-        assertEquals('b', Conversion.binaryBeMsb0ToHexDigit(multiBytesArray, 6));
-        assertEquals('5', Conversion.binaryBeMsb0ToHexDigit(multiBytesArray, 7));
-
-        assertEquals('a', Conversion.binaryBeMsb0ToHexDigit(multiBytesArray, 8));
-        assertEquals('5', Conversion.binaryBeMsb0ToHexDigit(multiBytesArray, 9));
-        assertEquals('2', Conversion.binaryBeMsb0ToHexDigit(multiBytesArray, 10));
-        assertEquals('9', Conversion.binaryBeMsb0ToHexDigit(multiBytesArray, 11));
-        assertEquals('c', Conversion.binaryBeMsb0ToHexDigit(multiBytesArray, 12));
-        assertEquals('6', Conversion.binaryBeMsb0ToHexDigit(multiBytesArray, 13));
-        assertEquals('3', Conversion.binaryBeMsb0ToHexDigit(multiBytesArray, 14));
-        assertEquals('1', Conversion.binaryBeMsb0ToHexDigit(multiBytesArray, 15));
-
-    }
-
-    /**
-     * Tests {@link Conversion#intToHexDigit(int)}.
-     */
-    @Test
-    public void testIntToHexDigit() {
-        assertEquals('0', Conversion.intToHexDigit(0));
-        assertEquals('1', Conversion.intToHexDigit(1));
-        assertEquals('2', Conversion.intToHexDigit(2));
-        assertEquals('3', Conversion.intToHexDigit(3));
-        assertEquals('4', Conversion.intToHexDigit(4));
-        assertEquals('5', Conversion.intToHexDigit(5));
-        assertEquals('6', Conversion.intToHexDigit(6));
-        assertEquals('7', Conversion.intToHexDigit(7));
-        assertEquals('8', Conversion.intToHexDigit(8));
-        assertEquals('9', Conversion.intToHexDigit(9));
-        assertEquals('a', Conversion.intToHexDigit(10));
-        assertEquals('b', Conversion.intToHexDigit(11));
-        assertEquals('c', Conversion.intToHexDigit(12));
-        assertEquals('d', Conversion.intToHexDigit(13));
-        assertEquals('e', Conversion.intToHexDigit(14));
-        assertEquals('f', Conversion.intToHexDigit(15));
-        try {
-            Conversion.intToHexDigit(16);
-            fail("Thrown " + IllegalArgumentException.class.getName() + " expected");
-        } catch (final IllegalArgumentException e) {
-            // OK
-        }
-    }
-
-    /**
-     * Tests {@link Conversion#intToHexDigitMsb0(int)}.
-     */
-    @Test
-    public void testIntToHexDigitMsb0() {
-        assertEquals('0', Conversion.intToHexDigitMsb0(0));
-        assertEquals('8', Conversion.intToHexDigitMsb0(1));
-        assertEquals('4', Conversion.intToHexDigitMsb0(2));
-        assertEquals('c', Conversion.intToHexDigitMsb0(3));
-        assertEquals('2', Conversion.intToHexDigitMsb0(4));
-        assertEquals('a', Conversion.intToHexDigitMsb0(5));
-        assertEquals('6', Conversion.intToHexDigitMsb0(6));
-        assertEquals('e', Conversion.intToHexDigitMsb0(7));
-        assertEquals('1', Conversion.intToHexDigitMsb0(8));
-        assertEquals('9', Conversion.intToHexDigitMsb0(9));
-        assertEquals('5', Conversion.intToHexDigitMsb0(10));
-        assertEquals('d', Conversion.intToHexDigitMsb0(11));
-        assertEquals('3', Conversion.intToHexDigitMsb0(12));
-        assertEquals('b', Conversion.intToHexDigitMsb0(13));
-        assertEquals('7', Conversion.intToHexDigitMsb0(14));
-        assertEquals('f', Conversion.intToHexDigitMsb0(15));
-        try {
-            Conversion.intToHexDigitMsb0(16);
-            fail("Thrown " + IllegalArgumentException.class.getName() + " expected");
-        } catch (final IllegalArgumentException e) {
-            // OK
-        }
-    }
-
-    static String dbgPrint(final boolean[] src) {
-        final StringBuilder sb = new StringBuilder();
-        for (final boolean e : src) {
-            if (e) {
-                sb.append("1,");
-            } else {
-                sb.append("0,");
-            }
-        }
-        final String out = sb.toString();
-        return out.substring(0, out.length() - 1);
-    }
-
-    // org.junit.Assert(boolean[], boolean[]) does not exist in JUnit 4.2
-    static void assertBinaryEquals(final boolean[] expected, final boolean[] actual) {
-        assertEquals(expected.length, actual.length);
-        for (int i = 0; i < expected.length; i++ ) {
-            try {
-                assertEquals(expected[i], actual[i]);
-            } catch (final Throwable e) {
-                final String msg = "Mismatch at index "
-                    + i
-                    + " between:\n"
-                    + dbgPrint(expected)
-                    + " and\n"
-                    + dbgPrint(actual);
-                fail(msg + "\n" + e.getMessage());
-            }
-        }
-    }
-
-    /**
-     * Tests {@link Conversion#intArrayToLong(int[], int, long, int, int)}.
-     */
-    @Test
-    public void testIntArrayToLong() {
-        final int[] src = new int[]{0xCDF1F0C1, 0x0F123456, 0x78000000};
-        assertEquals(0x0000000000000000L, Conversion.intArrayToLong(src, 0, 0L, 0, 0));
-        assertEquals(0x0000000000000000L, Conversion.intArrayToLong(src, 1, 0L, 0, 0));
-        assertEquals(0x00000000CDF1F0C1L, Conversion.intArrayToLong(src, 0, 0L, 0, 1));
-        assertEquals(0x0F123456CDF1F0C1L, Conversion.intArrayToLong(src, 0, 0L, 0, 2));
-        assertEquals(0x000000000F123456L, Conversion.intArrayToLong(src, 1, 0L, 0, 1));
-        assertEquals(
-            0x123456789ABCDEF0L, Conversion.intArrayToLong(src, 0, 0x123456789ABCDEF0L, 0, 0));
-        assertEquals(
-            0x1234567878000000L, Conversion.intArrayToLong(src, 2, 0x123456789ABCDEF0L, 0, 1));
-        // assertEquals(0x0F12345678000000L,Conversion.intsToLong(src,1,0x123456789ABCDEF0L,32,2));
-    }
-
-    /**
-     * Tests {@link Conversion#shortArrayToLong(short[], int, long, int, int)}.
-     */
-    @Test
-    public void testShortArrayToLong() {
-        final short[] src = new short[]{
-            (short)0xCDF1, (short)0xF0C1, (short)0x0F12, (short)0x3456, (short)0x7800};
-        assertEquals(0x0000000000000000L, Conversion.shortArrayToLong(src, 0, 0L, 0, 0));
-        assertEquals(0x000000000000CDF1L, Conversion.shortArrayToLong(src, 0, 0L, 0, 1));
-        assertEquals(0x00000000F0C1CDF1L, Conversion.shortArrayToLong(src, 0, 0L, 0, 2));
-        assertEquals(0x780034560F12F0C1L, Conversion.shortArrayToLong(src, 1, 0L, 0, 4));
-        assertEquals(
-            0x123456789ABCDEF0L, Conversion.shortArrayToLong(src, 0, 0x123456789ABCDEF0L, 0, 0));
-        assertEquals(
-            0x123456CDF1BCDEF0L,
-            Conversion.shortArrayToLong(src, 0, 0x123456789ABCDEF0L, 24, 1));
-        assertEquals(
-            0x123478003456DEF0L,
-            Conversion.shortArrayToLong(src, 3, 0x123456789ABCDEF0L, 16, 2));
-    }
-
-    /**
-     * Tests {@link Conversion#byteArrayToLong(byte[], int, long, int, int)}.
-     */
-    @Test
-    public void testByteArrayToLong() {
-        final byte[] src = new byte[]{
-            (byte)0xCD, (byte)0xF1, (byte)0xF0, (byte)0xC1, (byte)0x0F, (byte)0x12, (byte)0x34,
-            (byte)0x56, (byte)0x78};
-        assertEquals(0x0000000000000000L, Conversion.byteArrayToLong(src, 0, 0L, 0, 0));
-        assertEquals(0x00000000000000CDL, Conversion.byteArrayToLong(src, 0, 0L, 0, 1));
-        assertEquals(0x00000000C1F0F1CDL, Conversion.byteArrayToLong(src, 0, 0L, 0, 4));
-        assertEquals(0x000000000FC1F0F1L, Conversion.byteArrayToLong(src, 1, 0L, 0, 4));
-        assertEquals(
-            0x123456789ABCDEF0L, Conversion.byteArrayToLong(src, 0, 0x123456789ABCDEF0L, 0, 0));
-        assertEquals(
-            0x12345678CDBCDEF0L, Conversion.byteArrayToLong(src, 0, 0x123456789ABCDEF0L, 24, 1));
-        assertEquals(
-            0x123456789A7856F0L, Conversion.byteArrayToLong(src, 7, 0x123456789ABCDEF0L, 8, 2));
-    }
-
-    /**
-     * Tests {@link Conversion#shortArrayToInt(short[], int, int, int, int)}.
-     */
-    @Test
-    public void testShortArrayToInt() {
-        final short[] src = new short[]{
-            (short)0xCDF1, (short)0xF0C1, (short)0x0F12, (short)0x3456, (short)0x7800};
-        assertEquals(0x00000000, Conversion.shortArrayToInt(src, 0, 0, 0, 0));
-        assertEquals(0x0000CDF1, Conversion.shortArrayToInt(src, 0, 0, 0, 1));
-        assertEquals(0xF0C1CDF1, Conversion.shortArrayToInt(src, 0, 0, 0, 2));
-        assertEquals(0x0F12F0C1, Conversion.shortArrayToInt(src, 1, 0, 0, 2));
-        assertEquals(0x12345678, Conversion.shortArrayToInt(src, 0, 0x12345678, 0, 0));
-        assertEquals(0xCDF15678, Conversion.shortArrayToInt(src, 0, 0x12345678, 16, 1));
-        // assertEquals(0x34567800,Conversion.ShortArrayToInt(src, 3, 0x12345678, 16, 2));
-    }
-
-    /**
-     * Tests {@link Conversion#byteArrayToInt(byte[], int, int, int, int)}.
-     */
-    @Test
-    public void testByteArrayToInt() {
-        final byte[] src = new byte[]{
-            (byte)0xCD, (byte)0xF1, (byte)0xF0, (byte)0xC1, (byte)0x0F, (byte)0x12, (byte)0x34,
-            (byte)0x56, (byte)0x78};
-        assertEquals(0x00000000, Conversion.byteArrayToInt(src, 0, 0, 0, 0));
-        assertEquals(0x000000CD, Conversion.byteArrayToInt(src, 0, 0, 0, 1));
-        assertEquals(0xC1F0F1CD, Conversion.byteArrayToInt(src, 0, 0, 0, 4));
-        assertEquals(0x0FC1F0F1, Conversion.byteArrayToInt(src, 1, 0, 0, 4));
-        assertEquals(0x12345678, Conversion.byteArrayToInt(src, 0, 0x12345678, 0, 0));
-        assertEquals(0xCD345678, Conversion.byteArrayToInt(src, 0, 0x12345678, 24, 1));
-        // assertEquals(0x56341278,Conversion.ByteArrayToInt(src, 5, 0x01234567, 8, 4));
-    }
-
-    /**
-     * Tests {@link Conversion#byteArrayToShort(byte[], int, short, int, int)}.
-     */
-    @Test
-    public void testByteArrayToShort() {
-        final byte[] src = new byte[]{
-            (byte)0xCD, (byte)0xF1, (byte)0xF0, (byte)0xC1, (byte)0x0F, (byte)0x12, (byte)0x34,
-            (byte)0x56, (byte)0x78};
-        assertEquals((short)0x0000, Conversion.byteArrayToShort(src, 0, (short)0, 0, 0));
-        assertEquals((short)0x00CD, Conversion.byteArrayToShort(src, 0, (short)0, 0, 1));
-        assertEquals((short)0xF1CD, Conversion.byteArrayToShort(src, 0, (short)0, 0, 2));
-        assertEquals((short)0xF0F1, Conversion.byteArrayToShort(src, 1, (short)0, 0, 2));
-        assertEquals((short)0x1234, Conversion.byteArrayToShort(src, 0, (short)0x1234, 0, 0));
-        assertEquals((short)0xCD34, Conversion.byteArrayToShort(src, 0, (short)0x1234, 8, 1));
-        // assertEquals((short)0x5678,Conversion.ByteArrayToShort(src, 7, (short) 0x0123, 8,
-        // 2));
-    }
-
-    /**
-     * Tests {@link Conversion#hexToLong(String, int, long, int, int)}.
-     */
-    @Test
-    public void testHexToLong() {
-        final String src = "CDF1F0C10F12345678";
-        assertEquals(0x0000000000000000L, Conversion.hexToLong(src, 0, 0L, 0, 0));
-        assertEquals(0x000000000000000CL, Conversion.hexToLong(src, 0, 0L, 0, 1));
-        assertEquals(0x000000001C0F1FDCL, Conversion.hexToLong(src, 0, 0L, 0, 8));
-        assertEquals(0x0000000001C0F1FDL, Conversion.hexToLong(src, 1, 0L, 0, 8));
-        assertEquals(
-            0x123456798ABCDEF0L, Conversion.hexToLong(src, 0, 0x123456798ABCDEF0L, 0, 0));
-        assertEquals(
-            0x1234567876BCDEF0L, Conversion.hexToLong(src, 15, 0x123456798ABCDEF0L, 24, 3));
-    }
-
-    /**
-     * Tests {@link Conversion#hexToInt(String, int, int, int, int)}.
-     */
-    @Test
-    public void testHexToInt() {
-        final String src = "CDF1F0C10F12345678";
-        assertEquals(0x00000000, Conversion.hexToInt(src, 0, 0, 0, 0));
-        assertEquals(0x0000000C, Conversion.hexToInt(src, 0, 0, 0, 1));
-        assertEquals(0x1C0F1FDC, Conversion.hexToInt(src, 0, 0, 0, 8));
-        assertEquals(0x01C0F1FD, Conversion.hexToInt(src, 1, 0, 0, 8));
-        assertEquals(0x12345679, Conversion.hexToInt(src, 0, 0x12345679, 0, 0));
-        assertEquals(0x87645679, Conversion.hexToInt(src, 15, 0x12345679, 20, 3));
-    }
-
-    /**
-     * Tests {@link Conversion#hexToShort(String, int, short, int, int)}.
-     */
-    @Test
-    public void testHexToShort() {
-        final String src = "CDF1F0C10F12345678";
-        assertEquals((short)0x0000, Conversion.hexToShort(src, 0, (short)0, 0, 0));
-        assertEquals((short)0x000C, Conversion.hexToShort(src, 0, (short)0, 0, 1));
-        assertEquals((short)0x1FDC, Conversion.hexToShort(src, 0, (short)0, 0, 4));
-        assertEquals((short)0xF1FD, Conversion.hexToShort(src, 1, (short)0, 0, 4));
-        assertEquals((short)0x1234, Conversion.hexToShort(src, 0, (short)0x1234, 0, 0));
-        assertEquals((short)0x8764, Conversion.hexToShort(src, 15, (short)0x1234, 4, 3));
-    }
-
-    /**
-     * Tests {@link Conversion#hexToByte(String, int, byte, int, int)}.
-     */
-    @Test
-    public void testHexToByte() {
-        final String src = "CDF1F0C10F12345678";
-        assertEquals((byte)0x00, Conversion.hexToByte(src, 0, (byte)0, 0, 0));
-        assertEquals((byte)0x0C, Conversion.hexToByte(src, 0, (byte)0, 0, 1));
-        assertEquals((byte)0xDC, Conversion.hexToByte(src, 0, (byte)0, 0, 2));
-        assertEquals((byte)0xFD, Conversion.hexToByte(src, 1, (byte)0, 0, 2));
-        assertEquals((byte)0x34, Conversion.hexToByte(src, 0, (byte)0x34, 0, 0));
-        assertEquals((byte)0x84, Conversion.hexToByte(src, 17, (byte)0x34, 4, 1));
-    }
-
-    /**
-     * Tests {@link Conversion#binaryToLong(boolean[], int, long, int, int)}.
-     */
-    @Test
-    public void testBinaryToLong() {
-        final boolean[] src = new boolean[]{
-            false, false, true, true, true, false, true, true, true, true, true, true, true,
-            false, false, false, true, true, true, true, false, false, false, false, false,
-            false, true, true, true, false, false, false, false, false, false, false, true,
-            true, true, true, true, false, false, false, false, true, false, false, true, true,
-            false, false, false, false, true, false, true, false, true, false, false, true,
-            true, false, true, true, true, false, false, false, false, true};
-        // conversion of "CDF1F0C10F12345678" by HexToBinary
-        assertEquals(0x0000000000000000L, Conversion.binaryToLong(src, 0, 0L, 0, 0));
-        assertEquals(0x000000000000000CL, Conversion.binaryToLong(src, 0, 0L, 0, 1 * 4));
-        assertEquals(0x000000001C0F1FDCL, Conversion.binaryToLong(src, 0, 0L, 0, 8 * 4));
-        assertEquals(0x0000000001C0F1FDL, Conversion.binaryToLong(src, 1 * 4, 0L, 0, 8 * 4));
-        assertEquals(
-            0x123456798ABCDEF0L, Conversion.binaryToLong(src, 0, 0x123456798ABCDEF0L, 0, 0));
-        assertEquals(
-            0x1234567876BCDEF0L,
-            Conversion.binaryToLong(src, 15 * 4, 0x123456798ABCDEF0L, 24, 3 * 4));
-    }
-
-    /**
-     * Tests {@link Conversion#binaryToInt(boolean[], int, int, int, int)}.
-     */
-    @Test
-    public void testBinaryToInt() {
-        final boolean[] src = new boolean[]{
-            false, false, true, true, true, false, true, true, true, true, true, true, true,
-            false, false, false, true, true, true, true, false, false, false, false, false,
-            false, true, true, true, false, false, false, false, false, false, false, true,
-            true, true, true, true, false, false, false, false, true, false, false, true, true,
-            false, false, false, false, true, false, true, false, true, false, false, true,
-            true, false, true, true, true, false, false, false, false, true};
-        // conversion of "CDF1F0C10F12345678" by HexToBinary
-        assertEquals(0x00000000, Conversion.binaryToInt(src, 0 * 4, 0, 0, 0 * 4));
-        assertEquals(0x0000000C, Conversion.binaryToInt(src, 0 * 4, 0, 0, 1 * 4));
-        assertEquals(0x1C0F1FDC, Conversion.binaryToInt(src, 0 * 4, 0, 0, 8 * 4));
-        assertEquals(0x01C0F1FD, Conversion.binaryToInt(src, 1 * 4, 0, 0, 8 * 4));
-        assertEquals(0x12345679, Conversion.binaryToInt(src, 0 * 4, 0x12345679, 0, 0 * 4));
-        assertEquals(0x87645679, Conversion.binaryToInt(src, 15 * 4, 0x12345679, 20, 3 * 4));
-    }
-
-    /**
-     * Tests {@link Conversion#binaryToShort(boolean[], int, short, int, int)}.
-     */
-    @Test
-    public void testBinaryToShort() {
-        final boolean[] src = new boolean[]{
-            false, false, true, true, true, false, true, true, true, true, true, true, true,
-            false, false, false, true, true, true, true, false, false, false, false, false,
-            false, true, true, true, false, false, false, false, false, false, false, true,
-            true, true, true, true, false, false, false, false, true, false, false, true, true,
-            false, false, false, false, true, false, true, false, true, false, false, true,
-            true, false, true, true, true, false, false, false, false, true};
-        // conversion of "CDF1F0C10F12345678" by HexToBinary
-        assertEquals((short)0x0000, Conversion.binaryToShort(src, 0 * 4, (short)0, 0, 0 * 4));
-        assertEquals((short)0x000C, Conversion.binaryToShort(src, 0 * 4, (short)0, 0, 1 * 4));
-        assertEquals((short)0x1FDC, Conversion.binaryToShort(src, 0 * 4, (short)0, 0, 4 * 4));
-        assertEquals((short)0xF1FD, Conversion.binaryToShort(src, 1 * 4, (short)0, 0, 4 * 4));
-        assertEquals(
-            (short)0x1234, Conversion.binaryToShort(src, 0 * 4, (short)0x1234, 0, 0 * 4));
-        assertEquals(
-            (short)0x8764, Conversion.binaryToShort(src, 15 * 4, (short)0x1234, 4, 3 * 4));
-    }
-
-    /**
-     * Tests {@link Conversion#binaryToByte(boolean[], int, byte, int, int)}.
-     */
-    @Test
-    public void testBinaryToByte() {
-        final boolean[] src = new boolean[]{
-            false, false, true, true, true, false, true, true, true, true, true, true, true,
-            false, false, false, true, true, true, true, false, false, false, false, false,
-            false, true, true, true, false, false, false, false, false, false, false, true,
-            true, true, true, true, false, false, false, false, true, false, false, true, true,
-            false, false, false, false, true, false, true, false, true, false, false, true,
-            true, false, true, true, true, false, false, false, false, true};
-        // conversion of "CDF1F0C10F12345678" by HexToBinary
-        assertEquals((byte)0x00, Conversion.binaryToByte(src, 0 * 4, (byte)0, 0, 0 * 4));
-        assertEquals((byte)0x0C, Conversion.binaryToByte(src, 0 * 4, (byte)0, 0, 1 * 4));
-        assertEquals((byte)0xDC, Conversion.binaryToByte(src, 0 * 4, (byte)0, 0, 2 * 4));
-        assertEquals((byte)0xFD, Conversion.binaryToByte(src, 1 * 4, (byte)0, 0, 2 * 4));
-        assertEquals((byte)0x34, Conversion.binaryToByte(src, 0 * 4, (byte)0x34, 0, 0 * 4));
-        assertEquals((byte)0x84, Conversion.binaryToByte(src, 17 * 4, (byte)0x34, 4, 1 * 4));
-    }
-
-    /**
-     * Tests {@link Conversion#longToIntArray(long, int, int[], int, int)}.
-     */
-    @Test
-    public void testLongToIntArray() {
-        assertArrayEquals(
-            new int[]{}, Conversion.longToIntArray(0x0000000000000000L, 0, new int[]{}, 0, 0));
-        assertArrayEquals(
-            new int[]{}, Conversion.longToIntArray(0x0000000000000000L, 100, new int[]{}, 0, 0));
-        assertArrayEquals(
-            new int[]{}, Conversion.longToIntArray(0x0000000000000000L, 0, new int[]{}, 100, 0));
-        assertArrayEquals(
-            new int[]{0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF},
-            Conversion.longToIntArray(0x1234567890ABCDEFL, 0, new int[]{-1, -1, -1, -1}, 0, 0));
-        assertArrayEquals(
-            new int[]{0x90ABCDEF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF},
-            Conversion.longToIntArray(0x1234567890ABCDEFL, 0, new int[]{-1, -1, -1, -1}, 0, 1));
-        assertArrayEquals(
-            new int[]{0x90ABCDEF, 0x12345678, 0xFFFFFFFF, 0xFFFFFFFF},
-            Conversion.longToIntArray(0x1234567890ABCDEFL, 0, new int[]{-1, -1, -1, -1}, 0, 2));
-        // assertArrayEquals(new
-        // int[]{0x90ABCDEF,0x12345678,0x90ABCDEF,0x12345678},Conversion.longToIntArray(0x1234567890ABCDEFL,
-        // 0,new int[]{-1,-1,-1,-1},0,4));//rejected by assertion
-        // assertArrayEquals(new
-        // int[]{0xFFFFFFFF,0x90ABCDEF,0x12345678,0x90ABCDEF},Conversion.longToIntArray(0x1234567890ABCDEFL,
-        // 0,new int[]{-1,-1,-1,-1},1,3));
-        assertArrayEquals(
-            new int[]{0xFFFFFFFF, 0xFFFFFFFF, 0x90ABCDEF, 0x12345678},
-            Conversion.longToIntArray(0x1234567890ABCDEFL, 0, new int[]{-1, -1, -1, -1}, 2, 2));
-        assertArrayEquals(
-            new int[]{0xFFFFFFFF, 0xFFFFFFFF, 0x90ABCDEF, 0xFFFFFFFF},
-            Conversion.longToIntArray(0x1234567890ABCDEFL, 0, new int[]{-1, -1, -1, -1}, 2, 1));
-        assertArrayEquals(
-            new int[]{0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0x90ABCDEF},
-            Conversion.longToIntArray(0x1234567890ABCDEFL, 0, new int[]{-1, -1, -1, -1}, 3, 1));
-        assertArrayEquals(
-            new int[]{0xFFFFFFFF, 0xFFFFFFFF, 0x4855E6F7, 0xFFFFFFFF},
-            Conversion.longToIntArray(0x1234567890ABCDEFL, 1, new int[]{-1, -1, -1, -1}, 2, 1));
-        assertArrayEquals(
-            new int[]{0xFFFFFFFF, 0xFFFFFFFF, 0x242AF37B, 0xFFFFFFFF},
-            Conversion.longToIntArray(0x1234567890ABCDEFL, 2, new int[]{-1, -1, -1, -1}, 2, 1));
-        assertArrayEquals(
-            new int[]{0xFFFFFFFF, 0xFFFFFFFF, 0x121579BD, 0xFFFFFFFF},
-            Conversion.longToIntArray(0x1234567890ABCDEFL, 3, new int[]{-1, -1, -1, -1}, 2, 1));
-        assertArrayEquals(
-            new int[]{0xFFFFFFFF, 0xFFFFFFFF, 0x890ABCDE, 0xFFFFFFFF},
-            Conversion.longToIntArray(0x1234567890ABCDEFL, 4, new int[]{-1, -1, -1, -1}, 2, 1));
-        // assertArrayEquals(new
-        // int[]{0x4855E6F7,0x091A2B3C,0x4855E6F7,0x091A2B3C},Conversion.longToIntArray(0x1234567890ABCDEFL,
-        // 1,new int[]{-1,-1,-1,-1},0,4));//rejected by assertion
-        assertArrayEquals(
-            new int[]{0x091A2B3C},
-            Conversion.longToIntArray(0x1234567890ABCDEFL, 33, new int[]{0}, 0, 1));
-    }
-
-    /**
-     * Tests {@link Conversion#longToShortArray(long, int, short[], int, int)}.
-     */
-    @Test
-    public void testLongToShortArray() {
-        assertArrayEquals(
-            new short[]{},
-            Conversion.longToShortArray(0x0000000000000000L, 0, new short[]{}, 0, 0));
-        assertArrayEquals(
-            new short[]{},
-            Conversion.longToShortArray(0x0000000000000000L, 100, new short[]{}, 0, 0));
-        assertArrayEquals(
-            new short[]{},
-            Conversion.longToShortArray(0x0000000000000000L, 0, new short[]{}, 100, 0));
-        assertArrayEquals(
-            new short[]{(short)0xFFFF, (short)0xFFFF, (short)0xFFFF, (short)0xFFFF},
-            Conversion.longToShortArray(
-                0x1234567890ABCDEFL, 0, new short[]{-1, -1, -1, -1}, 0, 0));
-        assertArrayEquals(
-            new short[]{(short)0xCDEF, (short)0xFFFF, (short)0xFFFF, (short)0xFFFF},
-            Conversion.longToShortArray(
-                0x1234567890ABCDEFL, 0, new short[]{-1, -1, -1, -1}, 0, 1));
-        assertArrayEquals(
-            new short[]{(short)0xCDEF, (short)0x90AB, (short)0xFFFF, (short)0xFFFF},
-            Conversion.longToShortArray(
-                0x1234567890ABCDEFL, 0, new short[]{-1, -1, -1, -1}, 0, 2));
-        assertArrayEquals(
-            new short[]{(short)0xCDEF, (short)0x90AB, (short)0x5678, (short)0xFFFF},
-            Conversion.longToShortArray(
-                0x1234567890ABCDEFL, 0, new short[]{-1, -1, -1, -1}, 0, 3));
-        assertArrayEquals(
-            new short[]{(short)0xCDEF, (short)0x90AB, (short)0x5678, (short)0x1234},
-            Conversion.longToShortArray(
-                0x1234567890ABCDEFL, 0, new short[]{-1, -1, -1, -1}, 0, 4));
-        assertArrayEquals(
-            new short[]{(short)0xFFFF, (short)0xCDEF, (short)0x90AB, (short)0x5678},
-            Conversion.longToShortArray(
-                0x1234567890ABCDEFL, 0, new short[]{-1, -1, -1, -1}, 1, 3));
-        assertArrayEquals(
-            new short[]{(short)0xFFFF, (short)0xFFFF, (short)0xCDEF, (short)0x90AB},
-            Conversion.longToShortArray(
-                0x1234567890ABCDEFL, 0, new short[]{-1, -1, -1, -1}, 2, 2));
-        assertArrayEquals(
-            new short[]{(short)0xFFFF, (short)0xFFFF, (short)0xCDEF, (short)0xFFFF},
-            Conversion.longToShortArray(
-                0x1234567890ABCDEFL, 0, new short[]{-1, -1, -1, -1}, 2, 1));
-        assertArrayEquals(
-            new short[]{(short)0xFFFF, (short)0xFFFF, (short)0xFFFF, (short)0xCDEF},
-            Conversion.longToShortArray(
-                0x1234567890ABCDEFL, 0, new short[]{-1, -1, -1, -1}, 3, 1));
-        assertArrayEquals(
-            new short[]{(short)0xFFFF, (short)0xFFFF, (short)0xE6F7, (short)0xFFFF},
-            Conversion.longToShortArray(
-                0x1234567890ABCDEFL, 1, new short[]{-1, -1, -1, -1}, 2, 1));
-        assertArrayEquals(
-            new short[]{(short)0xFFFF, (short)0xFFFF, (short)0xF37B, (short)0xFFFF},
-            Conversion.longToShortArray(
-                0x1234567890ABCDEFL, 2, new short[]{-1, -1, -1, -1}, 2, 1));
-        assertArrayEquals(
-            new short[]{(short)0xFFFF, (short)0xFFFF, (short)0x79BD, (short)0xFFFF},
-            Conversion.longToShortArray(
-                0x1234567890ABCDEFL, 3, new short[]{-1, -1, -1, -1}, 2, 1));
-        assertArrayEquals(
-            new short[]{(short)0xFFFF, (short)0xFFFF, (short)0xBCDE, (short)0xFFFF},
-            Conversion.longToShortArray(
-                0x1234567890ABCDEFL, 4, new short[]{-1, -1, -1, -1}, 2, 1));
-        assertArrayEquals(
-            new short[]{(short)0xE6F7, (short)0x4855, (short)0x2B3C, (short)0x091A},
-            Conversion.longToShortArray(
-                0x1234567890ABCDEFL, 1, new short[]{-1, -1, -1, -1}, 0, 4));
-        assertArrayEquals(
-            new short[]{(short)0x2B3C},
-            Conversion.longToShortArray(0x1234567890ABCDEFL, 33, new short[]{0}, 0, 1));
-    }
-
-    /**
-     * Tests {@link Conversion#intToShortArray(int, int, short[], int, int)}.
-     */
-    @Test
-    public void testIntToShortArray() {
-        assertArrayEquals(
-            new short[]{}, Conversion.intToShortArray(0x00000000, 0, new short[]{}, 0, 0));
-        assertArrayEquals(
-            new short[]{}, Conversion.intToShortArray(0x00000000, 100, new short[]{}, 0, 0));
-        assertArrayEquals(
-            new short[]{}, Conversion.intToShortArray(0x00000000, 0, new short[]{}, 100, 0));
-        assertArrayEquals(
-            new short[]{(short)0xFFFF, (short)0xFFFF, (short)0xFFFF, (short)0xFFFF},
-            Conversion.intToShortArray(0x12345678, 0, new short[]{-1, -1, -1, -1}, 0, 0));
-        assertArrayEquals(
-            new short[]{(short)0x5678, (short)0xFFFF, (short)0xFFFF, (short)0xFFFF},
-            Conversion.intToShortArray(0x12345678, 0, new short[]{-1, -1, -1, -1}, 0, 1));
-        assertArrayEquals(
-            new short[]{(short)0x5678, (short)0x1234, (short)0xFFFF, (short)0xFFFF},
-            Conversion.intToShortArray(0x12345678, 0, new short[]{-1, -1, -1, -1}, 0, 2));
-        // assertArrayEquals(new
-        // short[]{(short)0x5678,(short)0x1234,(short)0x5678,(short)0xFFFF},Conversion.intToShortArray(0x12345678,
-        // 0,new short[]{-1,-1,-1,-1},0,3));//rejected by assertion
-        // assertArrayEquals(new
-        // short[]{(short)0x5678,(short)0x1234,(short)0x5678,(short)0x1234},Conversion.intToShortArray(0x12345678,
-        // 0,new short[]{-1,-1,-1,-1},0,4));
-        // assertArrayEquals(new
-        // short[]{(short)0xFFFF,(short)0x5678,(short)0x1234,(short)0x5678},Conversion.intToShortArray(0x12345678,
-        // 0,new short[]{-1,-1,-1,-1},1,3));
-        assertArrayEquals(
-            new short[]{(short)0xFFFF, (short)0xFFFF, (short)0x5678, (short)0x1234},
-            Conversion.intToShortArray(0x12345678, 0, new short[]{-1, -1, -1, -1}, 2, 2));
-        assertArrayEquals(
-            new short[]{(short)0xFFFF, (short)0xFFFF, (short)0x5678, (short)0xFFFF},
-            Conversion.intToShortArray(0x12345678, 0, new short[]{-1, -1, -1, -1}, 2, 1));
-        assertArrayEquals(
-            new short[]{(short)0xFFFF, (short)0xFFFF, (short)0xFFFF, (short)0x5678},
-            Conversion.intToShortArray(0x12345678, 0, new short[]{-1, -1, -1, -1}, 3, 1));
-        assertArrayEquals(
-            new short[]{(short)0xFFFF, (short)0xFFFF, (short)0x2B3C, (short)0xFFFF},
-            Conversion.intToShortArray(0x12345678, 1, new short[]{-1, -1, -1, -1}, 2, 1));
-        assertArrayEquals(
-            new short[]{(short)0xFFFF, (short)0xFFFF, (short)0x159E, (short)0xFFFF},
-            Conversion.intToShortArray(0x12345678, 2, new short[]{-1, -1, -1, -1}, 2, 1));
-        assertArrayEquals(
-            new short[]{(short)0xFFFF, (short)0xFFFF, (short)0x8ACF, (short)0xFFFF},
-            Conversion.intToShortArray(0x12345678, 3, new short[]{-1, -1, -1, -1}, 2, 1));
-        assertArrayEquals(
-            new short[]{(short)0xFFFF, (short)0xFFFF, (short)0x4567, (short)0xFFFF},
-            Conversion.intToShortArray(0x12345678, 4, new short[]{-1, -1, -1, -1}, 2, 1));
-        // assertArrayEquals(new
-        // short[]{(short)0xE6F7,(short)0x4855,(short)0x2B3C,(short)0x091A},Conversion.intToShortArray(0x12345678,
-        // 1,new short[]{-1,-1,-1,-1},0,4));//rejected by assertion
-        // assertArrayEquals(new
-        // short[]{(short)0x2B3C},Conversion.intToShortArray(0x12345678,33,new
-        // short[]{0},0,1));//rejected by assertion
-        assertArrayEquals(
-            new short[]{(short)0x091A},
-            Conversion.intToShortArray(0x12345678, 17, new short[]{0}, 0, 1));
-    }
-
-    /**
-     * Tests {@link Conversion#longToByteArray(long, int, byte[], int, int)}.
-     */
-    @Test
-    public void testLongToByteArray() {
-        assertArrayEquals(
-            new byte[]{},
-            Conversion.longToByteArray(0x0000000000000000L, 0, new byte[]{}, 0, 0));
-        assertArrayEquals(
-            new byte[]{},
-            Conversion.longToByteArray(0x0000000000000000L, 100, new byte[]{}, 0, 0));
-        assertArrayEquals(
-            new byte[]{},
-            Conversion.longToByteArray(0x0000000000000000L, 0, new byte[]{}, 100, 0));
-        assertArrayEquals(
-            new byte[]{
-                (byte)0xFF, (byte)0xFF, (byte)0xFF, (byte)0xFF, (byte)0xFF, (byte)0xFF,
-                (byte)0xFF, (byte)0xFF, (byte)0xFF, (byte)0xFF, (byte)0xFF},
-            Conversion.longToByteArray(0x1234567890ABCDEFL, 0, new byte[]{
-                -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, 0, 0));
-        assertArrayEquals(
-            new byte[]{
-                (byte)0xEF, (byte)0xFF, (byte)0xFF, (byte)0xFF, (byte)0xFF, (byte)0xFF,
-                (byte)0xFF, (byte)0xFF, (byte)0xFF, (byte)0xFF, (byte)0xFF},
-            Conversion.longToByteArray(0x1234567890ABCDEFL, 0, new byte[]{
-                -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, 0, 1));
-        assertArrayEquals(
-            new byte[]{
-                (byte)0xEF, (byte)0xCD, (byte)0xFF, (byte)0xFF, (byte)0xFF, (byte)0xFF,
-                (byte)0xFF, (byte)0xFF, (byte)0xFF, (byte)0xFF, (byte)0xFF},
-            Conversion.longToByteArray(0x1234567890ABCDEFL, 0, new byte[]{
-                -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, 0, 2));
-        assertArrayEquals(
-            new byte[]{
-                (byte)0xEF, (byte)0xCD, (byte)0xAB, (byte)0x90, (byte)0xFF, (byte)0xFF,
-                (byte)0xFF, (byte)0xFF, (byte)0xFF, (byte)0xFF, (byte)0xFF},
-            Conversion.longToByteArray(0x1234567890ABCDEFL, 0, new byte[]{
-                -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, 0, 4));
-        assertArrayEquals(
-            new byte[]{
-                (byte)0xEF, (byte)0xCD, (byte)0xAB, (byte)0x90, (byte)0x78, (byte)0x56,
-                (byte)0x34, (byte)0xFF, (byte)0xFF, (byte)0xFF, (byte)0xFF},
-            Conversion.longToByteArray(0x1234567890ABCDEFL, 0, new byte[]{
-                -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, 0, 7));
-        assertArrayEquals(
-            new byte[]{
-                (byte)0xEF, (byte)0xCD, (byte)0xAB, (byte)0x90, (byte)0x78, (byte)0x56,
-                (byte)0x34, (byte)0x12, (byte)0xFF, (byte)0xFF, (byte)0xFF},
-            Conversion.longToByteArray(0x1234567890ABCDEFL, 0, new byte[]{
-                -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, 0, 8));
-        assertArrayEquals(
-            new byte[]{
-                (byte)0xFF, (byte)0xFF, (byte)0xFF, (byte)0xEF, (byte)0xFF, (byte)0xFF,
-                (byte)0xFF, (byte)0xFF, (byte)0xFF, (byte)0xFF, (byte)0xFF},
-            Conversion.longToByteArray(0x1234567890ABCDEFL, 0, new byte[]{
-                -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, 3, 1));
-        assertArrayEquals(
-            new byte[]{
-                (byte)0xFF, (byte)0xFF, (byte)0xFF, (byte)0xEF, (byte)0xCD, (byte)0xFF,
-                (byte)0xFF, (byte)0xFF, (byte)0xFF, (byte)0xFF, (byte)0xFF},
-            Conversion.longToByteArray(0x1234567890ABCDEFL, 0, new byte[]{
-                -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, 3, 2));
-        assertArrayEquals(
-            new byte[]{
-                (byte)0xFF, (byte)0xFF, (byte)0xFF, (byte)0xEF, (byte)0xCD, (byte)0xAB,
-                (byte)0x90, (byte)0xFF, (byte)0xFF, (byte)0xFF, (byte)0xFF},
-            Conversion.longToByteArray(0x1234567890ABCDEFL, 0, new byte[]{
-                -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, 3, 4));
-        assertArrayEquals(
-            new byte[]{
-                (byte)0xFF, (byte)0xFF, (byte)0xFF, (byte)0xEF, (byte)0xCD, (byte)0xAB,
-                (byte)0x90, (byte)0x78, (byte)0x56, (byte)0x34, (byte)0xFF},
-            Conversion.longToByteArray(0x1234567890ABCDEFL, 0, new byte[]{
-                -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, 3, 7));
-        assertArrayEquals(
-            new byte[]{
-                (byte)0xFF, (byte)0xFF, (byte)0xFF, (byte)0xEF, (byte)0xCD, (byte)0xAB,
-                (byte)0x90, (byte)0x78, (byte)0x56, (byte)0x34, (byte)0x12},
-            Conversion.longToByteArray(0x1234567890ABCDEFL, 0, new byte[]{
-                -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, 3, 8));
-        assertArrayEquals(
-            new byte[]{
-                (byte)0xF7, (byte)0xFF, (byte)0xFF, (byte)0xFF, (byte)0xFF, (byte)0xFF,
-                (byte)0xFF, (byte)0xFF, (byte)0xFF, (byte)0xFF, (byte)0xFF},
-            Conversion.longToByteArray(0x1234567890ABCDEFL, 1, new byte[]{
-                -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, 0, 1));
-        assertArrayEquals(
-            new byte[]{
-                (byte)0x7B, (byte)0xFF, (byte)0xFF, (byte)0xFF, (byte)0xFF, (byte)0xFF,
-                (byte)0xFF, (byte)0xFF, (byte)0xFF, (byte)0xFF, (byte)0xFF},
-            Conversion.longToByteArray(0x1234567890ABCDEFL, 2, new byte[]{
-                -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, 0, 1));
-        assertArrayEquals(
-            new byte[]{
-                (byte)0xFF, (byte)0x00, (byte)0xFF, (byte)0x6F, (byte)0x5E, (byte)0x85,
-                (byte)0xC4, (byte)0xB3, (byte)0xA2, (byte)0x91, (byte)0x00},
-            Conversion.longToByteArray(0x1234567890ABCDEFL, 5, new byte[]{
-                -1, 0, -1, -1, -1, -1, -1, -1, -1, -1, -1}, 3, 8));
-        // assertArrayEquals(new
-        // byte[]{(byte)0xFF,(byte)0x00,(byte)0xFF,(byte)0x5E,(byte)0x85,(byte)0xC4,(byte)0xB3,(byte)0xA2,(byte)0x91,(byte)0x00,(byte)0x00},Conversion.longToByteArray(0x1234567890ABCDEFL,13,new
-        // byte[]{-1, 0,-1,-1,-1,-1,-1,-1,-1,-1,-1},3,8));//rejected by assertion
-        assertArrayEquals(
-            new byte[]{
-                (byte)0xFF, (byte)0x00, (byte)0xFF, (byte)0x5E, (byte)0x85, (byte)0xC4,
-                (byte)0xB3, (byte)0xA2, (byte)0x91, (byte)0x00, (byte)0xFF},
-            Conversion.longToByteArray(0x1234567890ABCDEFL, 13, new byte[]{
-                -1, 0, -1, -1, -1, -1, -1, -1, -1, -1, -1}, 3, 7));
-    }
-
-    /**
-     * Tests {@link Conversion#intToByteArray(int, int, byte[], int, int)}.
-     */
-    @Test
-    public void testIntToByteArray() {
-        assertArrayEquals(
-            new byte[]{}, Conversion.intToByteArray(0x00000000, 0, new byte[]{}, 0, 0));
-        assertArrayEquals(
-            new byte[]{}, Conversion.intToByteArray(0x00000000, 100, new byte[]{}, 0, 0));
-        assertArrayEquals(
-            new byte[]{}, Conversion.intToByteArray(0x00000000, 0, new byte[]{}, 100, 0));
-        assertArrayEquals(
-            new byte[]{
-                (byte)0xFF, (byte)0xFF, (byte)0xFF, (byte)0xFF, (byte)0xFF, (byte)0xFF,
-                (byte)0xFF, (byte)0xFF, (byte)0xFF, (byte)0xFF, (byte)0xFF},
-            Conversion.intToByteArray(0x90ABCDEF, 0, new byte[]{
-                -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, 0, 0));
-        assertArrayEquals(
-            new byte[]{
-                (byte)0xEF, (byte)0xFF, (byte)0xFF, (byte)0xFF, (byte)0xFF, (byte)0xFF,
-                (byte)0xFF, (byte)0xFF, (byte)0xFF, (byte)0xFF, (byte)0xFF},
-            Conversion.intToByteArray(0x90ABCDEF, 0, new byte[]{
-                -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, 0, 1));
-        assertArrayEquals(
-            new byte[]{
-                (byte)0xEF, (byte)0xCD, (byte)0xFF, (byte)0xFF, (byte)0xFF, (byte)0xFF,
-                (byte)0xFF, (byte)0xFF, (byte)0xFF, (byte)0xFF, (byte)0xFF},
-            Conversion.intToByteArray(0x90ABCDEF, 0, new byte[]{
-                -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, 0, 2));
-        assertArrayEquals(
-            new byte[]{
-                (byte)0xEF, (byte)0xCD, (byte)0xAB, (byte)0x90, (byte)0xFF, (byte)0xFF,
-                (byte)0xFF, (byte)0xFF, (byte)0xFF, (byte)0xFF, (byte)0xFF},
-            Conversion.intToByteArray(0x90ABCDEF, 0, new byte[]{
-                -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, 0, 4));
-        assertArrayEquals(
-            new byte[]{
-                (byte)0xFF, (byte)0xFF, (byte)0xFF, (byte)0xEF, (byte)0xFF, (byte)0xFF,
-                (byte)0xFF, (byte)0xFF, (byte)0xFF, (byte)0xFF, (byte)0xFF},
-            Conversion.intToByteArray(0x90ABCDEF, 0, new byte[]{
-                -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, 3, 1));
-        assertArrayEquals(
-            new byte[]{
-                (byte)0xFF, (byte)0xFF, (byte)0xFF, (byte)0xEF, (byte)0xCD, (byte)0xFF,
-                (byte)0xFF, (byte)0xFF, (byte)0xFF, (byte)0xFF, (byte)0xFF},
-            Conversion.intToByteArray(0x90ABCDEF, 0, new byte[]{
-                -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, 3, 2));
-        assertArrayEquals(
-            new byte[]{
-                (byte)0xFF, (byte)0xFF, (byte)0xFF, (byte)0xEF, (byte)0xCD, (byte)0xAB,
-                (byte)0x90, (byte)0xFF, (byte)0xFF, (byte)0xFF, (byte)0xFF},
-            Conversion.intToByteArray(0x90ABCDEF, 0, new byte[]{
-                -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, 3, 4));
-        assertArrayEquals(
-            new byte[]{
-                (byte)0xF7, (byte)0xFF, (byte)0xFF, (byte)0xFF, (byte)0xFF, (byte)0xFF,
-                (byte)0xFF, (byte)0xFF, (byte)0xFF, (byte)0xFF, (byte)0xFF},
-            Conversion.intToByteArray(0x90ABCDEF, 1, new byte[]{
-                -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, 0, 1));
-        assertArrayEquals(
-            new byte[]{
-                (byte)0x7B, (byte)0xFF, (byte)0xFF, (byte)0xFF, (byte)0xFF, (byte)0xFF,
-                (byte)0xFF, (byte)0xFF, (byte)0xFF, (byte)0xFF, (byte)0xFF},
-            Conversion.intToByteArray(0x90ABCDEF, 2, new byte[]{
-                -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, 0, 1));
-        assertArrayEquals(
-            new byte[]{
-                (byte)0xFF, (byte)0x00, (byte)0xFF, (byte)0x6F, (byte)0x5E, (byte)0x85,
-                (byte)0xFC, (byte)0xFF, (byte)0xFF, (byte)0xFF, (byte)0xFF},
-            Conversion.intToByteArray(0x90ABCDEF, 5, new byte[]{
-                -1, 0, -1, -1, -1, -1, -1, -1, -1, -1, -1}, 3, 4));
-        // assertArrayEquals(new
-        // byte[]{(byte)0xFF,(byte)0x00,(byte)0xFF,(byte)0x5E,(byte)0x85,(byte)0xFC,(byte)0x00,(byte)0xFF,(byte)0xFF,(byte)0xFF,(byte)0xFF},Conversion.intToByteArray(0x90ABCDEF,13,new
-        // byte[]{-1, 0,-1,-1,-1,-1,-1,-1,-1,-1,-1},3,4));//rejected by assertion
-        assertArrayEquals(
-            new byte[]{
-                (byte)0xFF, (byte)0x00, (byte)0xFF, (byte)0x5E, (byte)0x85, (byte)0xFC,
-                (byte)0xFF, (byte)0xFF, (byte)0xFF, (byte)0xFF, (byte)0xFF},
-            Conversion.intToByteArray(0x90ABCDEF, 13, new byte[]{
-                -1, 0, -1, -1, -1, -1, -1, -1, -1, -1, -1}, 3, 3));
-    }
-
-    /**
-     * Tests {@link Conversion#shortToByteArray(short, int, byte[], int, int)}.
-     */
-    @Test
-    public void testShortToByteArray() {
-        assertArrayEquals(
-            new byte[]{}, Conversion.shortToByteArray((short)0x0000, 0, new byte[]{}, 0, 0));
-        assertArrayEquals(
-            new byte[]{}, Conversion.shortToByteArray((short)0x0000, 100, new byte[]{}, 0, 0));
-        assertArrayEquals(
-            new byte[]{}, Conversion.shortToByteArray((short)0x0000, 0, new byte[]{}, 100, 0));
-        assertArrayEquals(
-            new byte[]{
-                (byte)0xFF, (byte)0xFF, (byte)0xFF, (byte)0xFF, (byte)0xFF, (byte)0xFF,
-                (byte)0xFF}, Conversion.shortToByteArray((short)0xCDEF, 0, new byte[]{
-                -1, -1, -1, -1, -1, -1, -1}, 0, 0));
-        assertArrayEquals(
-            new byte[]{
-                (byte)0xEF, (byte)0xFF, (byte)0xFF, (byte)0xFF, (byte)0xFF, (byte)0xFF,
-                (byte)0xFF}, Conversion.shortToByteArray((short)0xCDEF, 0, new byte[]{
-                -1, -1, -1, -1, -1, -1, -1}, 0, 1));
-        assertArrayEquals(
-            new byte[]{
-                (byte)0xEF, (byte)0xCD, (byte)0xFF, (byte)0xFF, (byte)0xFF, (byte)0xFF,
-                (byte)0xFF}, Conversion.shortToByteArray((short)0xCDEF, 0, new byte[]{
-                -1, -1, -1, -1, -1, -1, -1}, 0, 2));
-        assertArrayEquals(
-            new byte[]{
-                (byte)0xFF, (byte)0xFF, (byte)0xFF, (byte)0xEF, (byte)0xFF, (byte)0xFF,
-                (byte)0xFF}, Conversion.shortToByteArray((short)0xCDEF, 0, new byte[]{
-                -1, -1, -1, -1, -1, -1, -1}, 3, 1));
-        assertArrayEquals(
-            new byte[]{
-                (byte)0xFF, (byte)0xFF, (byte)0xFF, (byte)0xEF, (byte)0xCD, (byte)0xFF,
-                (byte)0xFF}, Conversion.shortToByteArray((short)0xCDEF, 0, new byte[]{
-                -1, -1, -1, -1, -1, -1, -1}, 3, 2));
-        assertArrayEquals(
-            new byte[]{
-                (byte)0xF7, (byte)0xFF, (byte)0xFF, (byte)0xFF, (byte)0xFF, (byte)0xFF,
-                (byte)0xFF}, Conversion.shortToByteArray((short)0xCDEF, 1, new byte[]{
-                -1, -1, -1, -1, -1, -1, -1}, 0, 1));
-        assertArrayEquals(
-            new byte[]{
-                (byte)0x7B, (byte)0xFF, (byte)0xFF, (byte)0xFF, (byte)0xFF, (byte)0xFF,
-                (byte)0xFF}, Conversion.shortToByteArray((short)0xCDEF, 2, new byte[]{
-                -1, -1, -1, -1, -1, -1, -1}, 0, 1));
-        assertArrayEquals(
-            new byte[]{
-                (byte)0xFF, (byte)0x00, (byte)0xFF, (byte)0x6F, (byte)0xFE, (byte)0xFF,
-                (byte)0xFF}, Conversion.shortToByteArray((short)0xCDEF, 5, new byte[]{
-                -1, 0, -1, -1, -1, -1, -1}, 3, 2));
-        // assertArrayEquals(new
-        // byte[]{(byte)0xFF,(byte)0x00,(byte)0xFF,(byte)0x5E,(byte)0xFF,(byte)0xFF,(byte)0xFF},Conversion.shortToByteArray((short)0xCDEF,13,new
-        // byte[]{-1, 0,-1,-1,-1,-1,-1},3,2));//rejected by assertion
-        assertArrayEquals(
-            new byte[]{
-                (byte)0xFF, (byte)0x00, (byte)0xFF, (byte)0xFE, (byte)0xFF, (byte)0xFF,
-                (byte)0xFF}, Conversion.shortToByteArray((short)0xCDEF, 13, new byte[]{
-                -1, 0, -1, -1, -1, -1, -1}, 3, 1));
-    }
-
-    /**
-     * Tests {@link Conversion#longToHex(long, int, String, int, int)}.
-     */
-    @Test
-    public void testLongToHex() {
-        assertEquals("", Conversion.longToHex(0x0000000000000000L, 0, "", 0, 0));
-        assertEquals("", Conversion.longToHex(0x0000000000000000L, 100, "", 0, 0));
-        assertEquals("", Conversion.longToHex(0x0000000000000000L, 0, "", 100, 0));
-        assertEquals(
-            "ffffffffffffffffffffffff",
-            Conversion.longToHex(0x1234567890ABCDEFL, 0, "ffffffffffffffffffffffff", 0, 0));
-        assertEquals(
-            "3fffffffffffffffffffffff",
-            Conversion.longToHex(0x1234567890ABCDE3L, 0, "ffffffffffffffffffffffff", 0, 1));
-        assertEquals(
-            "feffffffffffffffffffffff",
-            Conversion.longToHex(0x1234567890ABCDEFL, 0, "ffffffffffffffffffffffff", 0, 2));
-        assertEquals(
-            "fedcffffffffffffffffffff",
-            Conversion.longToHex(0x1234567890ABCDEFL, 0, "ffffffffffffffffffffffff", 0, 4));
-        assertEquals(
-            "fedcba098765432fffffffff",
-            Conversion.longToHex(0x1234567890ABCDEFL, 0, "ffffffffffffffffffffffff", 0, 15));
-        assertEquals(
-            "fedcba0987654321ffffffff",
-            Conversion.longToHex(0x1234567890ABCDEFL, 0, "ffffffffffffffffffffffff", 0, 16));
-        assertEquals(
-            "fff3ffffffffffffffffffff",
-            Conversion.longToHex(0x1234567890ABCDE3L, 0, "ffffffffffffffffffffffff", 3, 1));
-        assertEquals(
-            "ffffefffffffffffffffffff",
-            Conversion.longToHex(0x1234567890ABCDEFL, 0, "ffffffffffffffffffffffff", 3, 2));
-        assertEquals(
-            "ffffedcfffffffffffffffff",
-            Conversion.longToHex(0x1234567890ABCDEFL, 0, "ffffffffffffffffffffffff", 3, 4));
-        assertEquals(
-            "ffffedcba098765432ffffff",
-            Conversion.longToHex(0x1234567890ABCDEFL, 0, "ffffffffffffffffffffffff", 3, 15));
-        assertEquals(
-            "ffffedcba0987654321fffff",
-            Conversion.longToHex(0x1234567890ABCDEFL, 0, "ffffffffffffffffffffffff", 3, 16));
-        assertEquals(
-            "7fffffffffffffffffffffff",
-            Conversion.longToHex(0x1234567890ABCDEFL, 1, "ffffffffffffffffffffffff", 0, 1));
-        assertEquals(
-            "bfffffffffffffffffffffff",
-            Conversion.longToHex(0x1234567890ABCDEFL, 2, "ffffffffffffffffffffffff", 0, 1));
-        assertEquals(
-            "fffdb975121fca86420fffff",
-            Conversion.longToHex(0x1234567890ABCDEFL, 3, "ffffffffffffffffffffffff", 3, 16));
-        // assertEquals("ffffffffffffffffffffffff",Conversion.longToHex(0x1234567890ABCDEFL,4,"ffffffffffffffffffffffff",3,16));//rejected
-        // by assertion
-        assertEquals(
-            "fffedcba0987654321ffffff",
-            Conversion.longToHex(0x1234567890ABCDEFL, 4, "ffffffffffffffffffffffff", 3, 15));
-        assertEquals(
-            "fedcba0987654321", Conversion.longToHex(0x1234567890ABCDEFL, 0, "", 0, 16));
-        try {
-            Conversion.longToHex(0x1234567890ABCDEFL, 0, "", 1, 8);
-            fail("Thrown " + StringIndexOutOfBoundsException.class.getName() + " expected");
-        } catch (final StringIndexOutOfBoundsException e) {
-            // OK
-        }
-    }
-
-    /**
-     * Tests {@link Conversion#intToHex(int, int, String, int, int)}.
-     */
-    @Test
-    public void testIntToHex() {
-        assertEquals("", Conversion.intToHex(0x00000000, 0, "", 0, 0));
-        assertEquals("", Conversion.intToHex(0x00000000, 100, "", 0, 0));
-        assertEquals("", Conversion.intToHex(0x00000000, 0, "", 100, 0));
-        assertEquals(
-            "ffffffffffffffffffffffff",
-            Conversion.intToHex(0x90ABCDEF, 0, "ffffffffffffffffffffffff", 0, 0));
-        assertEquals(
-            "3fffffffffffffffffffffff",
-            Conversion.intToHex(0x90ABCDE3, 0, "ffffffffffffffffffffffff", 0, 1));
-        assertEquals(
-            "feffffffffffffffffffffff",
-            Conversion.intToHex(0x90ABCDEF, 0, "ffffffffffffffffffffffff", 0, 2));
-        assertEquals(
-            "fedcffffffffffffffffffff",
-            Conversion.intToHex(0x90ABCDEF, 0, "ffffffffffffffffffffffff", 0, 4));
-        assertEquals(
-            "fedcba0fffffffffffffffff",
-            Conversion.intToHex(0x90ABCDEF, 0, "ffffffffffffffffffffffff", 0, 7));
-        assertEquals(
-            "fedcba09ffffffffffffffff",
-            Conversion.intToHex(0x90ABCDEF, 0, "ffffffffffffffffffffffff", 0, 8));
-        assertEquals(
-            "fff3ffffffffffffffffffff",
-            Conversion.intToHex(0x90ABCDE3, 0, "ffffffffffffffffffffffff", 3, 1));
-        assertEquals(
-            "ffffefffffffffffffffffff",
-            Conversion.intToHex(0x90ABCDEF, 0, "ffffffffffffffffffffffff", 3, 2));
-        assertEquals(
-            "ffffedcfffffffffffffffff",
-            Conversion.intToHex(0x90ABCDEF, 0, "ffffffffffffffffffffffff", 3, 4));
-        assertEquals(
-            "ffffedcba0ffffffffffffff",
-            Conversion.intToHex(0x90ABCDEF, 0, "ffffffffffffffffffffffff", 3, 7));
-        assertEquals(
-            "ffffedcba09fffffffffffff",
-            Conversion.intToHex(0x90ABCDEF, 0, "ffffffffffffffffffffffff", 3, 8));
-        assertEquals(
-            "7fffffffffffffffffffffff",
-            Conversion.intToHex(0x90ABCDEF, 1, "ffffffffffffffffffffffff", 0, 1));
-        assertEquals(
-            "bfffffffffffffffffffffff",
-            Conversion.intToHex(0x90ABCDEF, 2, "ffffffffffffffffffffffff", 0, 1));
-        assertEquals(
-            "fffdb97512ffffffffffffff",
-            Conversion.intToHex(0x90ABCDEF, 3, "ffffffffffffffffffffffff", 3, 8));
-        // assertEquals("ffffffffffffffffffffffff",Conversion.intToHex(0x90ABCDEF,
-        // 4,"ffffffffffffffffffffffff",3,8));//rejected by assertion
-        assertEquals(
-            "fffedcba09ffffffffffffff",
-            Conversion.intToHex(0x90ABCDEF, 4, "ffffffffffffffffffffffff", 3, 7));
-        assertEquals("fedcba09", Conversion.intToHex(0x90ABCDEF, 0, "", 0, 8));
-        try {
-            Conversion.intToHex(0x90ABCDEF, 0, "", 1, 8);
-            fail("Thrown " + StringIndexOutOfBoundsException.class.getName() + " expected");
-        } catch (final StringIndexOutOfBoundsException e) {
-            // OK
-        }
-    }
-
-    /**
-     * Tests {@link Conversion#shortToHex(short, int, String, int, int)}.
-     */
-    @Test
-    public void testShortToHex() {
-        assertEquals("", Conversion.shortToHex((short)0x0000, 0, "", 0, 0));
-        assertEquals("", Conversion.shortToHex((short)0x0000, 100, "", 0, 0));
-        assertEquals("", Conversion.shortToHex((short)0x0000, 0, "", 100, 0));
-        assertEquals(
-            "ffffffffffffffffffffffff",
-            Conversion.shortToHex((short)0xCDEF, 0, "ffffffffffffffffffffffff", 0, 0));
-        assertEquals(
-            "3fffffffffffffffffffffff",
-            Conversion.shortToHex((short)0xCDE3, 0, "ffffffffffffffffffffffff", 0, 1));
-        assertEquals(
-            "feffffffffffffffffffffff",
-            Conversion.shortToHex((short)0xCDEF, 0, "ffffffffffffffffffffffff", 0, 2));
-        assertEquals(
-            "fedfffffffffffffffffffff",
-            Conversion.shortToHex((short)0xCDEF, 0, "ffffffffffffffffffffffff", 0, 3));
-        assertEquals(
-            "fedcffffffffffffffffffff",
-            Conversion.shortToHex((short)0xCDEF, 0, "ffffffffffffffffffffffff", 0, 4));
-        assertEquals(
-            "fff3ffffffffffffffffffff",
-            Conversion.shortToHex((short)0xCDE3, 0, "ffffffffffffffffffffffff", 3, 1));
-        assertEquals(
-            "ffffefffffffffffffffffff",
-            Conversion.shortToHex((short)0xCDEF, 0, "ffffffffffffffffffffffff", 3, 2));
-        assertEquals(
-            "7fffffffffffffffffffffff",
-            Conversion.shortToHex((short)0xCDEF, 1, "ffffffffffffffffffffffff", 0, 1));
-        assertEquals(
-            "bfffffffffffffffffffffff",
-            Conversion.shortToHex((short)0xCDEF, 2, "ffffffffffffffffffffffff", 0, 1));
-        assertEquals(
-            "fffdb9ffffffffffffffffff",
-            Conversion.shortToHex((short)0xCDEF, 3, "ffffffffffffffffffffffff", 3, 4));
-        // assertEquals("ffffffffffffffffffffffff",Conversion.shortToHex((short)0xCDEF,
-        // 4,"ffffffffffffffffffffffff",3,4));//rejected by assertion
-        assertEquals(
-            "fffedcffffffffffffffffff",
-            Conversion.shortToHex((short)0xCDEF, 4, "ffffffffffffffffffffffff", 3, 3));
-        assertEquals("fedc", Conversion.shortToHex((short)0xCDEF, 0, "", 0, 4));
-        try {
-            Conversion.shortToHex((short)0xCDEF, 0, "", 1, 4);
-            fail("Thrown " + StringIndexOutOfBoundsException.class.getName() + " expected");
-        } catch (final StringIndexOutOfBoundsException e) {
-            // OK
-        }
-    }
-
-    /**
-     * Tests {@link Conversion#byteToHex(byte, int, String, int, int)}.
-     */
-    @Test
-    public void testByteToHex() {
-        assertEquals("", Conversion.byteToHex((byte)0x00, 0, "", 0, 0));
-        assertEquals("", Conversion.byteToHex((byte)0x00, 100, "", 0, 0));
-        assertEquals("", Conversion.byteToHex((byte)0x00, 0, "", 100, 0));
-        assertEquals("00000", Conversion.byteToHex((byte)0xEF, 0, "00000", 0, 0));
-        assertEquals("f0000", Conversion.byteToHex((byte)0xEF, 0, "00000", 0, 1));
-        assertEquals("fe000", Conversion.byteToHex((byte)0xEF, 0, "00000", 0, 2));
-        assertEquals("000f0", Conversion.byteToHex((byte)0xEF, 0, "00000", 3, 1));
-        assertEquals("000fe", Conversion.byteToHex((byte)0xEF, 0, "00000", 3, 2));
-        assertEquals("70000", Conversion.byteToHex((byte)0xEF, 1, "00000", 0, 1));
-        assertEquals("b0000", Conversion.byteToHex((byte)0xEF, 2, "00000", 0, 1));
-        assertEquals("000df", Conversion.byteToHex((byte)0xEF, 3, "00000", 3, 2));
-        // assertEquals("00000",Conversion.byteToHex((byte)0xEF, 4,"00000",3,2));//rejected by
-        // assertion
-        assertEquals("000e0", Conversion.byteToHex((byte)0xEF, 4, "00000", 3, 1));
-        assertEquals("fe", Conversion.byteToHex((byte)0xEF, 0, "", 0, 2));
-        try {
-            Conversion.byteToHex((byte)0xEF, 0, "", 1, 2);
-            fail("Thrown " + StringIndexOutOfBoundsException.class.getName() + " expected");
-        } catch (final StringIndexOutOfBoundsException e) {
-            // OK
-        }
-    }
-
-    /**
-     * Tests {@link Conversion#longToBinary(long, int, boolean[], int, int)}.
-     */
-    @Test
-    public void testLongToBinary() {
-        assertBinaryEquals(
-            new boolean[]{},
-            Conversion.longToBinary(0x0000000000000000L, 0, new boolean[]{}, 0, 0));
-        assertBinaryEquals(
-            new boolean[]{},
-            Conversion.longToBinary(0x0000000000000000L, 100, new boolean[]{}, 0, 0));
-        assertBinaryEquals(
-            new boolean[]{},
-            Conversion.longToBinary(0x0000000000000000L, 0, new boolean[]{}, 100, 0));
-        assertBinaryEquals(
-            new boolean[69],
-            Conversion.longToBinary(0x1234567890ABCDEFL, 0, new boolean[69], 0, 0));
-
-        assertBinaryEquals(
-            new boolean[]{
-                true, false, false, false, false, false, false, false, false, false, false,
-                false, false, false, false, false, false, false, false, false, false, false,
-                false, false, false, false, false, false, false, false, false, false, false,
-                false, false, false, false, false, false, false, false, false, false, false,
-                false, false, false, false, false, false, false, false, false, false, false,
-                false, false, false, false, false, false, false, false, false, false, false,
-                false, false, false},
-            Conversion.longToBinary(0x1234567890ABCDEFL, 0, new boolean[69], 0, 1));
-        assertBinaryEquals(
-            new boolean[]{
-                true, true, false, false, false, false, false, false, false, false, false,
-                false, false, false, false, false, false, false, false, false, false, false,
-                false, false, false, false, false, false, false, false, false, false, false,
-                false, false, false, false, false, false, false, false, false, false, false,
-                false, false, false, false, false, false, false, false, false, false, false,
-                false, false, false, false, false, false, false, false, false, false, false,
-                false, false, false},
-            Conversion.longToBinary(0x1234567890ABCDEFL, 0, new boolean[69], 0, 2));
-        assertBinaryEquals(
-            new boolean[]{
-                true, true, true, false, false, false, false, false, false, false, false,
-                false, false, false, false, false, false, false, false, false, false, false,
-                false, false, false, false, false, false, false, false, false, false, false,
-                false, false, false, false, false, false, false, false, false, false, false,
-                false, false, false, false, false, false, false, false, false, false, false,
-                false, false, false, false, false, false, false, false, false, false, false,
-                false, false, false},
-            Conversion.longToBinary(0x1234567890ABCDEFL, 0, new boolean[69], 0, 3));
-        assertBinaryEquals(
-            new boolean[]{
-                true, true, true, true, false, true, true, true, true, false, true, true,
-                false, false, true, true, true, true, false, true, false, true, false, true,
-                false, false, false, false, true, false, false, true, false, false, false,
-                true, true, true, true, false, false, true, true, false, true, false, true,
-                false, false, false, true, false, true, true, false, false, false, true, false,
-                false, true, false, false, false, false, false, false, false, false},
-            Conversion.longToBinary(0x1234567890ABCDEFL, 0, new boolean[69], 0, 63));
-        assertBinaryEquals(
-            new boolean[]{
-                true, true, true, true, false, true, true, true, true, false, true, true,
-                false, false, true, true, true, true, false, true, false, true, false, true,
-                false, false, false, false, true, false, false, true, false, false, false,
-                true, true, true, true, false, false, true, true, false, true, false, true,
-                false, false, false, true, false, true, true, false, false, false, true, false,
-                false, true, false, false, false, false, false, false, false, false},
-            Conversion.longToBinary(0x1234567890ABCDEFL, 0, new boolean[69], 0, 64));
-        assertBinaryEquals(
-            new boolean[]{
-                false, false, true, false, false, false, false, false, false, false, false,
-                false, false, false, false, false, false, false, false, false, false, false,
-                false, false, false, false, false, false, false, false, false, false, false,
-                false, false, false, false, false, false, false, false, false, false, false,
-                false, false, false, false, false, false, false, false, false, false, false,
-                false, false, false, false, false, false, false, false, false, false, false,
-                false, false, false},
-            Conversion.longToBinary(0x1234567890ABCDEFL, 0, new boolean[69], 2, 1));
-        assertBinaryEquals(
-            new boolean[]{
-                false, false, true, true, true, true, false, true, true, true, true, false,
-                true, true, false, false, true, true, true, true, false, true, false, true,
-                false, true, false, false, false, false, true, false, false, true, false,
-                false, false, true, true, true, true, false, false, true, true, false, true,
-                false, true, false, false, false, true, false, true, true, false, false, false,
-                true, false, false, true, false, false, false, false, false, false},
-            Conversion.longToBinary(0x1234567890ABCDEFL, 0, new boolean[69], 2, 64));
-        assertBinaryEquals(
-            new boolean[]{
-                true, true, true, false, true, true, true, true, false, true, true, false,
-                false, true, true, true, true, false, true, false, true, false, true, false,
-                false, false, false, true, false, false, true, false, false, false, true, true,
-                true, true, false, false, true, true, false, true, false, true, false, false,
-                false, true, false, true, true, false, false, false, true, false, false, true,
-                false, false, false, false, false, false, false, false, false},
-            Conversion.longToBinary(0x1234567890ABCDEFL, 1, new boolean[69], 0, 63));
-        assertBinaryEquals(
-            new boolean[]{
-                true, true, false, true, true, true, true, false, true, true, false, false,
-                true, true, true, true, false, true, false, true, false, true, false, false,
-                false, false, true, false, false, true, false, false, false, true, true, true,
-                true, false, false, true, true, false, true, false, true, false, false, false,
-                true, false, true, true, false, false, false, true, false, false, true, false,
-                false, false, false, false, false, false, false, false, false},
-            Conversion.longToBinary(0x1234567890ABCDEFL, 2, new boolean[69], 0, 62));
-
-        // assertBinaryEquals(new boolean[]{false,false,false, true, true, false, true, true,
-        // true, true, false, true, true, false, false, true, true, true, true, false, true,
-        // false, true, false, true, false, false, false, false, true, false, false, true,
-        // false, false, false, true, true, true, true, false, false, true, true, false, true,
-        // false, true, false, false, false, true, false, true, true, false, false, false, true,
-        // false, false, true, false, false, false
-        // ,false,false,false,false},Conversion.longToBinary(0x1234567890ABCDEFL, 2,new
-        // boolean[69], 3, 63));//rejected by assertion
-        assertBinaryEquals(
-            new boolean[]{
-                false, false, false, true, true, false, true, true, true, true, false, true,
-                true, false, false, true, true, true, true, false, true, false, true, false,
-                true, false, false, false, false, true, false, false, true, false, false,
-                false, true, true, true, true, false, false, true, true, false, true, false,
-                true, false, false, false, true, false, true, true, false, false, false, true,
-                false, false, true, false, false, false, false, false, false, false},
-            Conversion.longToBinary(0x1234567890ABCDEFL, 2, new boolean[69], 3, 62));
-    }
-
-    /**
-     * Tests {@link Conversion#intToBinary(int, int, boolean[], int, int)}.
-     */
-    @Test
-    public void testIntToBinary() {
-        assertBinaryEquals(
-            new boolean[]{}, Conversion.intToBinary(0x00000000, 0, new boolean[]{}, 0, 0));
-        assertBinaryEquals(
-            new boolean[]{}, Conversion.intToBinary(0x00000000, 100, new boolean[]{}, 0, 0));
-        assertBinaryEquals(
-            new boolean[]{}, Conversion.intToBinary(0x00000000, 0, new boolean[]{}, 100, 0));
-        assertBinaryEquals(
-            new boolean[69], Conversion.intToBinary(0x90ABCDEF, 0, new boolean[69], 0, 0));
-        assertBinaryEquals(new boolean[]{
-            true, false, false, false, false, false, false, false, false, false, false, false,
-            false, false, false, false, false, false, false, false, false, false, false, false,
-            false, false, false, false, false, false, false, false, false, false, false, false,
-            false}, Conversion.intToBinary(0x90ABCDEF, 0, new boolean[37], 0, 1));
-        assertBinaryEquals(new boolean[]{
-            true, true, false, false, false, false, false, false, false, false, false, false,
-            false, false, false, false, false, false, false, false, false, false, false, false,
-            false, false, false, false, false, false, false, false, false, false, false, false,
-            false}, Conversion.intToBinary(0x90ABCDEF, 0, new boolean[37], 0, 2));
-        assertBinaryEquals(new boolean[]{
-            true, true, true, false, false, false, false, false, false, false, false, false,
-            false, false, false, false, false, false, false, false, false, false, false, false,
-            false, false, false, false, false, false, false, false, false, false, false, false,
-            false}, Conversion.intToBinary(0x90ABCDEF, 0, new boolean[37], 0, 3));
-        assertBinaryEquals(
-            new boolean[]{
-                true, true, true, true, false, true, true, true, true, false, true, true,
-                false, false, true, true, true, true, false, true, false, true, false, true,
-                false, false, false, false, true, false, false, false, false, false, false,
-                false, false}, Conversion.intToBinary(0x90ABCDEF, 0, new boolean[37], 0, 31));
-        assertBinaryEquals(
-            new boolean[]{
-                true, true, true, true, false, true, true, true, true, false, true, true,
-                false, false, true, true, true, true, false, true, false, true, false, true,
-                false, false, false, false, true, false, false, true, false, false, false,
-                false, false}, Conversion.intToBinary(0x90ABCDEF, 0, new boolean[37], 0, 32));
-        assertBinaryEquals(new boolean[]{
-            false, false, true, false, false, false, false, false, false, false, false, false,
-            false, false, false, false, false, false, false, false, false, false, false, false,
-            false, false, false, false, false, false, false, false, false, false, false, false,
-            false}, Conversion.intToBinary(0x90ABCDEF, 0, new boolean[37], 2, 1));
-        assertBinaryEquals(
-            new boolean[]{
-                false, false, true, true, true, true, false, true, true, true, true, false,
-                true, true, false, false, true, true, true, true, false, true, false, true,
-                false, true, false, false, false, false, true, false, false, true, false,
-                false, false}, Conversion.intToBinary(0x90ABCDEF, 0, new boolean[37], 2, 32));
-        assertBinaryEquals(
-            new boolean[]{
-                true, true, true, false, true, true, true, true, false, true, true, false,
-                false, true, true, true, true, false, true, false, true, false, true, false,
-                false, false, false, true, false, false, true, false, false, false, false,
-                false, false}, Conversion.intToBinary(0x90ABCDEF, 1, new boolean[37], 0, 31));
-        assertBinaryEquals(
-            new boolean[]{
-                true, true, false, true, true, true, true, false, true, true, false, false,
-                true, true, true, true, false, true, false, true, false, true, false, false,
-                false, false, true, false, false, true, false, false, false, false, false,
-                false, false}, Conversion.intToBinary(0x90ABCDEF, 2, new boolean[37], 0, 30));
-        // assertBinaryEquals(new boolean[]{false, false, false, true, true, false, true,
-        // true,
-        // true, true, false, true, true, false, false, true, true, true, true, false, true,
-        // false, true, false, true, false, false, false, false, true, false, false, false,
-        // false, false, false, false},Conversion.intToBinary(0x90ABCDEF, 2,new boolean[37],
-        // 3,31));//rejected by assertion
-        assertBinaryEquals(
-            new boolean[]{
-                false, false, false, true, true, false, true, true, true, true, false, true,
-                true, false, false, true, true, true, true, false, true, false, true, false,
-                true, false, false, false, false, true, false, false, true, false, false,
-                false, false}, Conversion.intToBinary(0x90ABCDEF, 2, new boolean[37], 3, 30));
-    }
-
-    /**
-     * Tests {@link Conversion#shortToBinary(short, int, boolean[], int, int)}.
-     */
-    @Test
-    public void testShortToBinary() {
-        assertBinaryEquals(
-            new boolean[]{}, Conversion.shortToBinary((short)0x0000, 0, new boolean[]{}, 0, 0));
-        assertBinaryEquals(
-            new boolean[]{},
-            Conversion.shortToBinary((short)0x0000, 100, new boolean[]{}, 0, 0));
-        assertBinaryEquals(
-            new boolean[]{},
-            Conversion.shortToBinary((short)0x0000, 0, new boolean[]{}, 100, 0));
-        assertBinaryEquals(
-            new boolean[69], Conversion.shortToBinary((short)0xCDEF, 0, new boolean[69], 0, 0));
-        assertBinaryEquals(
-            new boolean[]{
-                true, false, false, false, false, false, false, false, false, false, false,
-                false, false, false, false, false, false, false, false, false, false},
-            Conversion.shortToBinary((short)0xCDEF, 0, new boolean[21], 0, 1));
-        assertBinaryEquals(
-            new boolean[]{
-                true, true, false, false, false, false, false, false, false, false, false,
-                false, false, false, false, false, false, false, false, false, false},
-            Conversion.shortToBinary((short)0xCDEF, 0, new boolean[21], 0, 2));
-        assertBinaryEquals(
-            new boolean[]{
-                true, true, true, false, false, false, false, false, false, false, false,
-                false, false, false, false, false, false, false, false, false, false},
-            Conversion.shortToBinary((short)0xCDEF, 0, new boolean[21], 0, 3));
-        assertBinaryEquals(
-            new boolean[]{
-                true, true, true, true, false, true, true, true, true, false, true, true,
-                false, false, true, false, false, false, false, false, false},
-            Conversion.shortToBinary((short)0xCDEF, 0, new boolean[21], 0, 15));
-        assertBinaryEquals(
-            new boolean[]{
-                true, true, true, true, false, true, true, true, true, false, true, true,
-                false, false, true, true, false, false, false, false, false},
-            Conversion.shortToBinary((short)0xCDEF, 0, new boolean[21], 0, 16));
-        assertBinaryEquals(
-            new boolean[]{
-                false, false, true, false, false, false, false, false, false, false, false,
-                false, false, false, false, false, false, false, false, false, false},
-            Conversion.shortToBinary((short)0xCDEF, 0, new boolean[21], 2, 1));
-        assertBinaryEquals(
-            new boolean[]{
-                false, false, true, true, true, true, false, true, true, true, true, false,
-                true, true, false, false, true, true, false, false, false},
-            Conversion.shortToBinary((short)0xCDEF, 0, new boolean[21], 2, 16));
-        assertBinaryEquals(
-            new boolean[]{
-                true, true, true, false, true, true, true, true, false, true, true, false,
-                false, true, true, false, false, false, false, false, false},
-            Conversion.shortToBinary((short)0xCDEF, 1, new boolean[21], 0, 15));
-        assertBinaryEquals(
-            new boolean[]{
-                true, true, false, true, true, true, true, false, true, true, false, false,
-                true, true, false, false, false, false, false, false, false},
-            Conversion.shortToBinary((short)0xCDEF, 2, new boolean[21], 0, 14));
-        // assertArrayEquals(new boolean[]{false, false, false, true, true, false, true, true,
-        // true, true, false, true, true, false, false, true, false, false, false, false,
-        // false},Conversion.shortToBinary((short)0xCDEF, 2,new boolean[21],
-        // 3,15));//rejected by
-        // assertion
-        assertBinaryEquals(
-            new boolean[]{
-                false, false, false, true, true, false, true, true, true, true, false, true,
-                true, false, false, true, true, false, false, false, false},
-            Conversion.shortToBinary((short)0xCDEF, 2, new boolean[21], 3, 14));
-    }
-
-    /**
-     * Tests {@link Conversion#byteToBinary(byte, int, boolean[], int, int)}.
-     */
-    @Test
-    public void testByteToBinary() {
-        assertBinaryEquals(
-            new boolean[]{}, Conversion.byteToBinary((byte)0x00, 0, new boolean[]{}, 0, 0));
-        assertBinaryEquals(
-            new boolean[]{}, Conversion.byteToBinary((byte)0x00, 100, new boolean[]{}, 0, 0));
-        assertBinaryEquals(
-            new boolean[]{}, Conversion.byteToBinary((byte)0x00, 0, new boolean[]{}, 100, 0));
-        assertBinaryEquals(
-            new boolean[69], Conversion.byteToBinary((byte)0xEF, 0, new boolean[69], 0, 0));
-        assertBinaryEquals(new boolean[]{
-            true, false, false, false, false, false, false, false, false, false, false, false,
-            false}, Conversion.byteToBinary((byte)0x95, 0, new boolean[13], 0, 1));
-        assertBinaryEquals(new boolean[]{
-            true, false, false, false, false, false, false, false, false, false, false, false,
-            false}, Conversion.byteToBinary((byte)0x95, 0, new boolean[13], 0, 2));
-        assertBinaryEquals(new boolean[]{
-            true, false, true, false, false, false, false, false, false, false, false, false,
-            false}, Conversion.byteToBinary((byte)0x95, 0, new boolean[13], 0, 3));
-        assertBinaryEquals(new boolean[]{
-            true, false, true, false, true, false, false, false, false, false, false, false,
-            false}, Conversion.byteToBinary((byte)0x95, 0, new boolean[13], 0, 7));
-        assertBinaryEquals(new boolean[]{
-            true, false, true, false, true, false, false, true, false, false, false, false,
-            false}, Conversion.byteToBinary((byte)0x95, 0, new boolean[13], 0, 8));
-        assertBinaryEquals(new boolean[]{
-            false, false, true, false, false, false, false, false, false, false, false, false,
-            false}, Conversion.byteToBinary((byte)0x95, 0, new boolean[13], 2, 1));
-        assertBinaryEquals(new boolean[]{
-            false, false, true, false, true, false, true, false, false, true, false, false,
-            false}, Conversion.byteToBinary((byte)0x95, 0, new boolean[13], 2, 8));
-        assertBinaryEquals(new boolean[]{
-            false, true, false, true, false, false, true, false, false, false, false, false,
-            false}, Conversion.byteToBinary((byte)0x95, 1, new boolean[13], 0, 7));
-        assertBinaryEquals(new boolean[]{
-            true, false, true, false, false, true, false, false, false, false, false, false,
-            false}, Conversion.byteToBinary((byte)0x95, 2, new boolean[13], 0, 6));
-        // assertArrayEquals(new boolean[]{false, false, false, true, true, false, true, true,
-        // false, false, false, false, false},Conversion.byteToBinary((byte)0x95, 2,new
-        // boolean[13], 3, 7));//rejected by assertion
-        assertBinaryEquals(new boolean[]{
-            false, false, false, true, false, true, false, false, true, false, false, false,
-            false}, Conversion.byteToBinary((byte)0x95, 2, new boolean[13], 3, 6));
-    }
-
-    /**
-     * Tests {@link Conversion#uuidToByteArray(UUID, byte[], int, int)}.
-     */
-    @Test
-    public void testUuidToByteArray() {
-        assertArrayEquals(new byte[]{
-            (byte)0xff, (byte)0xff, (byte)0xff, (byte)0xff, (byte)0xff, (byte)0xff, (byte)0xff,
-            (byte)0xff, (byte)0xff, (byte)0xff, (byte)0xff, (byte)0xff, (byte)0xff, (byte)0xff,
-            (byte)0xff, (byte)0xff}, Conversion.uuidToByteArray(new UUID(
-            0xFFFFFFFFFFFFFFFFL, 0xFFFFFFFFFFFFFFFFL), new byte[16], 0, 16));
-        assertArrayEquals(new byte[]{
-            (byte)0x88, (byte)0x99, (byte)0xaa, (byte)0xbb, (byte)0xcc, (byte)0xdd, (byte)0xee,
-            (byte)0xff, (byte)0x00, (byte)0x11, (byte)0x22, (byte)0x33, (byte)0x44, (byte)0x55,
-            (byte)0x66, (byte)0x77}, Conversion.uuidToByteArray(new UUID(
-            0xFFEEDDCCBBAA9988L, 0x7766554433221100L), new byte[16], 0, 16));
-        assertArrayEquals(new byte[]{
-            (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x88, (byte)0x99, (byte)0xaa,
-            (byte)0xbb, (byte)0xcc, (byte)0xdd, (byte)0xee, (byte)0xff, (byte)0x00, (byte)0x00,
-            (byte)0x00, (byte)0x00}, Conversion.uuidToByteArray(new UUID(
-            0xFFEEDDCCBBAA9988L, 0x7766554433221100L), new byte[16], 4, 8));
-        assertArrayEquals(new byte[]{
-            (byte)0x00, (byte)0x00, (byte)0x88, (byte)0x99, (byte)0xaa, (byte)0xbb, (byte)0xcc,
-            (byte)0xdd, (byte)0xee, (byte)0xff, (byte)0x00, (byte)0x11, (byte)0x22, (byte)0x33,
-            (byte)0x00, (byte)0x00}, Conversion.uuidToByteArray(new UUID(
-            0xFFEEDDCCBBAA9988L, 0x7766554433221100L), new byte[16], 2, 12));
-    }
-
-    /**
-     * Tests {@link Conversion#byteArrayToUuid(byte[], int)}.
-     */
-    @Test
-    public void testByteArrayToUuid() {
-        assertEquals(
-            new UUID(0xFFFFFFFFFFFFFFFFL, 0xFFFFFFFFFFFFFFFFL),
-            Conversion.byteArrayToUuid(new byte[]{
-                (byte)0xff, (byte)0xff, (byte)0xff, (byte)0xff, (byte)0xff, (byte)0xff,
-                (byte)0xff, (byte)0xff, (byte)0xff, (byte)0xff, (byte)0xff, (byte)0xff,
-                (byte)0xff, (byte)0xff, (byte)0xff, (byte)0xff}, 0));
-        assertEquals(
-            new UUID(0xFFEEDDCCBBAA9988L, 0x7766554433221100L),
-            Conversion.byteArrayToUuid(new byte[]{
-                (byte)0x88, (byte)0x99, (byte)0xaa, (byte)0xbb, (byte)0xcc, (byte)0xdd,
-                (byte)0xee, (byte)0xff, (byte)0x00, (byte)0x11, (byte)0x22, (byte)0x33,
-                (byte)0x44, (byte)0x55, (byte)0x66, (byte)0x77}, 0));
-        assertEquals(
-            new UUID(0xFFEEDDCCBBAA9988L, 0x7766554433221100L),
-            Conversion.byteArrayToUuid(new byte[]{
-                0, 0, (byte)0x88, (byte)0x99, (byte)0xaa, (byte)0xbb, (byte)0xcc, (byte)0xdd,
-                (byte)0xee, (byte)0xff, (byte)0x00, (byte)0x11, (byte)0x22, (byte)0x33,
-                (byte)0x44, (byte)0x55, (byte)0x66, (byte)0x77}, 2));
-    }
-}
diff --git a/lang/src/test/java/org/apache/commons/lang3/EnumUtilsTest.java b/lang/src/test/java/org/apache/commons/lang3/EnumUtilsTest.java
deleted file mode 100644
index 92995e7..0000000
--- a/lang/src/test/java/org/apache/commons/lang3/EnumUtilsTest.java
+++ /dev/null
@@ -1,377 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-package org.apache.commons.lang3;
-
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertFalse;
-import static org.junit.Assert.assertTrue;
-
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.EnumSet;
-import java.util.List;
-import java.util.Map;
-
-import org.junit.Assert;
-import org.junit.Test;
-
-/**
- * 
- * @version $Id$
- */
-public class EnumUtilsTest {
-
-    @Test
-    public void testConstructable() {
-        // enforce public constructor
-        new EnumUtils();
-    }
-
-    @Test
-    public void test_getEnumMap() {
-        final Map<String, Traffic> test = EnumUtils.getEnumMap(Traffic.class);
-        assertEquals( "getEnumMap not created correctly", "{RED=RED, AMBER=AMBER, GREEN=GREEN}", test.toString());
-        assertEquals(3, test.size());
-        assertTrue(test.containsKey("RED"));
-        assertEquals(Traffic.RED, test.get("RED"));
-        assertTrue(test.containsKey("AMBER"));
-        assertEquals(Traffic.AMBER, test.get("AMBER"));
-        assertTrue(test.containsKey("GREEN"));
-        assertEquals(Traffic.GREEN, test.get("GREEN"));
-        assertFalse(test.containsKey("PURPLE"));
-    }
-
-    @Test
-    public void test_getEnumList() {
-        final List<Traffic> test = EnumUtils.getEnumList(Traffic.class);
-        assertEquals(3, test.size());
-        assertEquals(Traffic.RED, test.get(0));
-        assertEquals(Traffic.AMBER, test.get(1));
-        assertEquals(Traffic.GREEN, test.get(2));
-    }
-
-    @Test
-    public void test_isEnum() {
-        assertTrue(EnumUtils.isValidEnum(Traffic.class, "RED"));
-        assertTrue(EnumUtils.isValidEnum(Traffic.class, "AMBER"));
-        assertTrue(EnumUtils.isValidEnum(Traffic.class, "GREEN"));
-        assertFalse(EnumUtils.isValidEnum(Traffic.class, "PURPLE"));
-        assertFalse(EnumUtils.isValidEnum(Traffic.class, null));
-    }
-
-    @Test(expected=NullPointerException.class)
-    public void test_isEnum_nullClass() {
-        EnumUtils.isValidEnum((Class<Traffic>) null, "PURPLE");
-    }
-
-    @Test
-    public void test_getEnum() {
-        assertEquals(Traffic.RED, EnumUtils.getEnum(Traffic.class, "RED"));
-        assertEquals(Traffic.AMBER, EnumUtils.getEnum(Traffic.class, "AMBER"));
-        assertEquals(Traffic.GREEN, EnumUtils.getEnum(Traffic.class, "GREEN"));
-        assertEquals(null, EnumUtils.getEnum(Traffic.class, "PURPLE"));
-        assertEquals(null, EnumUtils.getEnum(Traffic.class, null));
-    }
-
-    @Test(expected=NullPointerException.class)
-    public void test_getEnum_nullClass() {
-        EnumUtils.getEnum((Class<Traffic>) null, "PURPLE");
-    }
-
-    @Test(expected=NullPointerException.class)
-    public void test_generateBitVector_nullClass() {
-        EnumUtils.generateBitVector(null, EnumSet.of(Traffic.RED));
-    }
-
-    @Test(expected=NullPointerException.class)
-    public void test_generateBitVectors_nullClass() {
-        EnumUtils.generateBitVectors(null, EnumSet.of(Traffic.RED));
-    }
-    
-    @Test(expected=NullPointerException.class)
-    public void test_generateBitVector_nullIterable() {
-        EnumUtils.generateBitVector(Traffic.class, (Iterable<Traffic>) null);
-    }
-
-    @Test(expected=NullPointerException.class)
-    public void test_generateBitVectors_nullIterable() {
-        EnumUtils.generateBitVectors(null, (Iterable<Traffic>) null);
-    }
-    
-    @Test(expected=IllegalArgumentException.class)
-    public void test_generateBitVector_nullElement() {
-        EnumUtils.generateBitVector(Traffic.class, Arrays.asList(Traffic.RED, null));
-    }
-    
-    @Test(expected=IllegalArgumentException.class)
-    public void test_generateBitVectors_nullElement() {
-        EnumUtils.generateBitVectors(Traffic.class, Arrays.asList(Traffic.RED, null));
-    }
-    
-    @Test(expected=NullPointerException.class)
-    public void test_generateBitVector_nullClassWithArray() {
-        EnumUtils.generateBitVector(null, Traffic.RED);
-    }
-    
-    @Test(expected=NullPointerException.class)
-    public void test_generateBitVectors_nullClassWithArray() {
-        EnumUtils.generateBitVectors(null, Traffic.RED);
-    }
-    
-    @Test(expected=NullPointerException.class)
-    public void test_generateBitVector_nullArray() {
-        EnumUtils.generateBitVector(Traffic.class, (Traffic[]) null);
-    }
-
-    @Test(expected=NullPointerException.class)
-    public void test_generateBitVectors_nullArray() {
-        EnumUtils.generateBitVectors(Traffic.class, (Traffic[]) null);
-    }
-    
-    @Test(expected=IllegalArgumentException.class)
-    public void test_generateBitVector_nullArrayElement() {
-        EnumUtils.generateBitVector(Traffic.class, Traffic.RED, null);
-    }
-    
-    @Test(expected=IllegalArgumentException.class)
-    public void test_generateBitVectors_nullArrayElement() {
-        EnumUtils.generateBitVectors(Traffic.class, Traffic.RED, null);
-    }
-    
-    @Test(expected=IllegalArgumentException.class)
-    public void test_generateBitVector_longClass() {
-        EnumUtils.generateBitVector(TooMany.class, EnumSet.of(TooMany.A1));
-    }
-
-    @Test(expected=IllegalArgumentException.class)
-    public void test_generateBitVector_longClassWithArray() {
-        EnumUtils.generateBitVector(TooMany.class, TooMany.A1);
-    }
-
-    @SuppressWarnings("unchecked")
-    @Test(expected=IllegalArgumentException.class)
-    public void test_generateBitVector_nonEnumClass() {
-        @SuppressWarnings("rawtypes")
-        final
-        Class rawType = Object.class;
-        @SuppressWarnings("rawtypes")
-        final
-        List rawList = new ArrayList();
-        EnumUtils.generateBitVector(rawType, rawList);
-    }
-    
-    @SuppressWarnings("unchecked")
-    @Test(expected=IllegalArgumentException.class)
-    public void test_generateBitVectors_nonEnumClass() {
-        @SuppressWarnings("rawtypes")
-        final
-        Class rawType = Object.class;
-        @SuppressWarnings("rawtypes")
-        final
-        List rawList = new ArrayList();
-        EnumUtils.generateBitVectors(rawType, rawList);
-    }
-    
-    @SuppressWarnings("unchecked")
-    @Test(expected=IllegalArgumentException.class)
-    public void test_generateBitVector_nonEnumClassWithArray() {
-        @SuppressWarnings("rawtypes")
-        final
-        Class rawType = Object.class;
-        EnumUtils.generateBitVector(rawType);
-    }
-
-    @SuppressWarnings("unchecked")
-    @Test(expected=IllegalArgumentException.class)
-    public void test_generateBitVectors_nonEnumClassWithArray() {
-        @SuppressWarnings("rawtypes")
-        final
-        Class rawType = Object.class;
-        EnumUtils.generateBitVectors(rawType);
-    }
-    
-    @Test
-    public void test_generateBitVector() {
-        assertEquals(0L, EnumUtils.generateBitVector(Traffic.class, EnumSet.noneOf(Traffic.class)));
-        assertEquals(1L, EnumUtils.generateBitVector(Traffic.class, EnumSet.of(Traffic.RED)));
-        assertEquals(2L, EnumUtils.generateBitVector(Traffic.class, EnumSet.of(Traffic.AMBER)));
-        assertEquals(4L, EnumUtils.generateBitVector(Traffic.class, EnumSet.of(Traffic.GREEN)));
-        assertEquals(3L, EnumUtils.generateBitVector(Traffic.class, EnumSet.of(Traffic.RED, Traffic.AMBER)));
-        assertEquals(5L, EnumUtils.generateBitVector(Traffic.class, EnumSet.of(Traffic.RED, Traffic.GREEN)));
-        assertEquals(6L, EnumUtils.generateBitVector(Traffic.class, EnumSet.of(Traffic.AMBER, Traffic.GREEN)));
-        assertEquals(7L, EnumUtils.generateBitVector(Traffic.class, EnumSet.of(Traffic.RED, Traffic.AMBER, Traffic.GREEN)));
-    }
-
-    @Test
-    public void test_generateBitVectors() {
-        assertArrayEquals(EnumUtils.generateBitVectors(Traffic.class, EnumSet.noneOf(Traffic.class)), 0L);
-        assertArrayEquals(EnumUtils.generateBitVectors(Traffic.class, EnumSet.of(Traffic.RED)), 1L);
-        assertArrayEquals(EnumUtils.generateBitVectors(Traffic.class, EnumSet.of(Traffic.AMBER)), 2L);
-        assertArrayEquals(EnumUtils.generateBitVectors(Traffic.class, EnumSet.of(Traffic.GREEN)), 4L);
-        assertArrayEquals(EnumUtils.generateBitVectors(Traffic.class, EnumSet.of(Traffic.RED, Traffic.AMBER)), 3L);
-        assertArrayEquals(EnumUtils.generateBitVectors(Traffic.class, EnumSet.of(Traffic.RED, Traffic.GREEN)), 5L);
-        assertArrayEquals(EnumUtils.generateBitVectors(Traffic.class, EnumSet.of(Traffic.AMBER, Traffic.GREEN)), 6L);
-        assertArrayEquals(EnumUtils.generateBitVectors(Traffic.class, EnumSet.of(Traffic.RED, Traffic.AMBER, Traffic.GREEN)), 7L);
-    }
-
-    @Test
-    public void test_generateBitVectorFromArray() {
-        assertEquals(0L, EnumUtils.generateBitVector(Traffic.class));
-        assertEquals(1L, EnumUtils.generateBitVector(Traffic.class, Traffic.RED));
-        assertEquals(2L, EnumUtils.generateBitVector(Traffic.class, Traffic.AMBER));
-        assertEquals(4L, EnumUtils.generateBitVector(Traffic.class, Traffic.GREEN));
-        assertEquals(3L, EnumUtils.generateBitVector(Traffic.class, Traffic.RED, Traffic.AMBER));
-        assertEquals(5L, EnumUtils.generateBitVector(Traffic.class, Traffic.RED, Traffic.GREEN));
-        assertEquals(6L, EnumUtils.generateBitVector(Traffic.class, Traffic.AMBER, Traffic.GREEN));
-        assertEquals(7L, EnumUtils.generateBitVector(Traffic.class, Traffic.RED, Traffic.AMBER, Traffic.GREEN));
-        //gracefully handles duplicates:
-        assertEquals(7L, EnumUtils.generateBitVector(Traffic.class, Traffic.RED, Traffic.AMBER, Traffic.GREEN, Traffic.GREEN));
-    }
-    
-    @Test
-    public void test_generateBitVectorsFromArray() {
-        assertArrayEquals(EnumUtils.generateBitVectors(Traffic.class), 0L);
-        assertArrayEquals(EnumUtils.generateBitVectors(Traffic.class, Traffic.RED), 1L);
-        assertArrayEquals(EnumUtils.generateBitVectors(Traffic.class, Traffic.AMBER), 2L);
-        assertArrayEquals(EnumUtils.generateBitVectors(Traffic.class, Traffic.GREEN), 4L);
-        assertArrayEquals(EnumUtils.generateBitVectors(Traffic.class, Traffic.RED, Traffic.AMBER), 3L);
-        assertArrayEquals(EnumUtils.generateBitVectors(Traffic.class, Traffic.RED, Traffic.GREEN), 5L);
-        assertArrayEquals(EnumUtils.generateBitVectors(Traffic.class, Traffic.AMBER, Traffic.GREEN), 6L);
-        assertArrayEquals(EnumUtils.generateBitVectors(Traffic.class, Traffic.RED, Traffic.AMBER, Traffic.GREEN), 7L);
-        //gracefully handles duplicates:
-        assertArrayEquals(EnumUtils.generateBitVectors(Traffic.class, Traffic.RED, Traffic.AMBER, Traffic.GREEN, Traffic.GREEN), 7L);
-    }
-
-    private void assertArrayEquals(final long[] actual, final long... expected) {
-        Assert.assertArrayEquals(expected, actual);
-    }
-
-    @Test(expected=NullPointerException.class)
-    public void test_processBitVector_nullClass() {
-        final Class<Traffic> empty = null;
-        EnumUtils.processBitVector(empty, 0L);
-    }
-
-    @Test(expected=NullPointerException.class)
-    public void test_processBitVectors_nullClass() {
-        final Class<Traffic> empty = null;
-        EnumUtils.processBitVectors(empty, 0L);
-    }
-
-    @Test
-    public void test_processBitVector() {
-        assertEquals(EnumSet.noneOf(Traffic.class), EnumUtils.processBitVector(Traffic.class, 0L));
-        assertEquals(EnumSet.of(Traffic.RED), EnumUtils.processBitVector(Traffic.class, 1L));
-        assertEquals(EnumSet.of(Traffic.AMBER), EnumUtils.processBitVector(Traffic.class, 2L));
-        assertEquals(EnumSet.of(Traffic.RED, Traffic.AMBER), EnumUtils.processBitVector(Traffic.class, 3L));
-        assertEquals(EnumSet.of(Traffic.GREEN), EnumUtils.processBitVector(Traffic.class, 4L));
-        assertEquals(EnumSet.of(Traffic.RED, Traffic.GREEN), EnumUtils.processBitVector(Traffic.class, 5L));
-        assertEquals(EnumSet.of(Traffic.AMBER, Traffic.GREEN), EnumUtils.processBitVector(Traffic.class, 6L));
-        assertEquals(EnumSet.of(Traffic.RED, Traffic.AMBER, Traffic.GREEN), EnumUtils.processBitVector(Traffic.class, 7L));
-    }
-
-    @Test
-    public void test_processBitVectors() {
-        assertEquals(EnumSet.noneOf(Traffic.class), EnumUtils.processBitVectors(Traffic.class, 0L));
-        assertEquals(EnumSet.of(Traffic.RED), EnumUtils.processBitVectors(Traffic.class, 1L));
-        assertEquals(EnumSet.of(Traffic.AMBER), EnumUtils.processBitVectors(Traffic.class, 2L));
-        assertEquals(EnumSet.of(Traffic.RED, Traffic.AMBER), EnumUtils.processBitVectors(Traffic.class, 3L));
-        assertEquals(EnumSet.of(Traffic.GREEN), EnumUtils.processBitVectors(Traffic.class, 4L));
-        assertEquals(EnumSet.of(Traffic.RED, Traffic.GREEN), EnumUtils.processBitVectors(Traffic.class, 5L));
-        assertEquals(EnumSet.of(Traffic.AMBER, Traffic.GREEN), EnumUtils.processBitVectors(Traffic.class, 6L));
-        assertEquals(EnumSet.of(Traffic.RED, Traffic.AMBER, Traffic.GREEN), EnumUtils.processBitVectors(Traffic.class, 7L));
-
-        assertEquals(EnumSet.noneOf(Traffic.class), EnumUtils.processBitVectors(Traffic.class, 0L, 0L));
-        assertEquals(EnumSet.of(Traffic.RED), EnumUtils.processBitVectors(Traffic.class, 0L, 1L));
-        assertEquals(EnumSet.of(Traffic.AMBER), EnumUtils.processBitVectors(Traffic.class, 0L, 2L));
-        assertEquals(EnumSet.of(Traffic.RED, Traffic.AMBER), EnumUtils.processBitVectors(Traffic.class, 0L, 3L));
-        assertEquals(EnumSet.of(Traffic.GREEN), EnumUtils.processBitVectors(Traffic.class, 0L, 4L));
-        assertEquals(EnumSet.of(Traffic.RED, Traffic.GREEN), EnumUtils.processBitVectors(Traffic.class, 0L, 5L));
-        assertEquals(EnumSet.of(Traffic.AMBER, Traffic.GREEN), EnumUtils.processBitVectors(Traffic.class, 0L, 6L));
-        assertEquals(EnumSet.of(Traffic.RED, Traffic.AMBER, Traffic.GREEN), EnumUtils.processBitVectors(Traffic.class, 0L, 7L));
-
-        // demonstrate tolerance of irrelevant high-order digits:
-        assertEquals(EnumSet.noneOf(Traffic.class), EnumUtils.processBitVectors(Traffic.class, 666L, 0L));
-        assertEquals(EnumSet.of(Traffic.RED), EnumUtils.processBitVectors(Traffic.class, 666L, 1L));
-        assertEquals(EnumSet.of(Traffic.AMBER), EnumUtils.processBitVectors(Traffic.class, 666L, 2L));
-        assertEquals(EnumSet.of(Traffic.RED, Traffic.AMBER), EnumUtils.processBitVectors(Traffic.class, 666L, 3L));
-        assertEquals(EnumSet.of(Traffic.GREEN), EnumUtils.processBitVectors(Traffic.class, 666L, 4L));
-        assertEquals(EnumSet.of(Traffic.RED, Traffic.GREEN), EnumUtils.processBitVectors(Traffic.class, 666L, 5L));
-        assertEquals(EnumSet.of(Traffic.AMBER, Traffic.GREEN), EnumUtils.processBitVectors(Traffic.class, 666L, 6L));
-        assertEquals(EnumSet.of(Traffic.RED, Traffic.AMBER, Traffic.GREEN), EnumUtils.processBitVectors(Traffic.class, 666L, 7L));
-    }
-
-    @Test(expected=IllegalArgumentException.class)
-    public void test_processBitVector_longClass() {
-        EnumUtils.processBitVector(TooMany.class, 0L);
-    }
-    
-    public void test_processBitVectors_longClass() {
-        assertEquals(EnumSet.noneOf(TooMany.class), EnumUtils.processBitVectors(TooMany.class, 0L));
-        assertEquals(EnumSet.of(TooMany.A), EnumUtils.processBitVectors(TooMany.class, 1L));
-        assertEquals(EnumSet.of(TooMany.B), EnumUtils.processBitVectors(TooMany.class, 2L));
-        assertEquals(EnumSet.of(TooMany.A, TooMany.B), EnumUtils.processBitVectors(TooMany.class, 3L));
-        assertEquals(EnumSet.of(TooMany.C), EnumUtils.processBitVectors(TooMany.class, 4L));
-        assertEquals(EnumSet.of(TooMany.A, TooMany.C), EnumUtils.processBitVectors(TooMany.class, 5L));
-        assertEquals(EnumSet.of(TooMany.B, TooMany.C), EnumUtils.processBitVectors(TooMany.class, 6L));
-        assertEquals(EnumSet.of(TooMany.A, TooMany.B, TooMany.C), EnumUtils.processBitVectors(TooMany.class, 7L));
-
-        assertEquals(EnumSet.noneOf(TooMany.class), EnumUtils.processBitVectors(TooMany.class, 0L, 0L));
-        assertEquals(EnumSet.of(TooMany.A), EnumUtils.processBitVectors(TooMany.class, 0L, 1L));
-        assertEquals(EnumSet.of(TooMany.B), EnumUtils.processBitVectors(TooMany.class, 0L, 2L));
-        assertEquals(EnumSet.of(TooMany.A, TooMany.B), EnumUtils.processBitVectors(TooMany.class, 0L, 3L));
-        assertEquals(EnumSet.of(TooMany.C), EnumUtils.processBitVectors(TooMany.class, 0L, 4L));
-        assertEquals(EnumSet.of(TooMany.A, TooMany.C), EnumUtils.processBitVectors(TooMany.class, 0L, 5L));
-        assertEquals(EnumSet.of(TooMany.B, TooMany.C), EnumUtils.processBitVectors(TooMany.class, 0L, 6L));
-        assertEquals(EnumSet.of(TooMany.A, TooMany.B, TooMany.C), EnumUtils.processBitVectors(TooMany.class, 0L, 7L));
-        assertEquals(EnumSet.of(TooMany.A, TooMany.B, TooMany.C), EnumUtils.processBitVectors(TooMany.class, 0L, 7L));
-
-        assertEquals(EnumSet.of(TooMany.M2), EnumUtils.processBitVectors(TooMany.class, 1L, 0L));
-        assertEquals(EnumSet.of(TooMany.A, TooMany.M2), EnumUtils.processBitVectors(TooMany.class, 1L, 1L));
-        assertEquals(EnumSet.of(TooMany.B, TooMany.M2), EnumUtils.processBitVectors(TooMany.class, 1L, 2L));
-        assertEquals(EnumSet.of(TooMany.A, TooMany.B, TooMany.M2), EnumUtils.processBitVectors(TooMany.class, 1L, 3L));
-        assertEquals(EnumSet.of(TooMany.C, TooMany.M2), EnumUtils.processBitVectors(TooMany.class, 1L, 4L));
-        assertEquals(EnumSet.of(TooMany.A, TooMany.C, TooMany.M2), EnumUtils.processBitVectors(TooMany.class, 1L, 5L));
-        assertEquals(EnumSet.of(TooMany.B, TooMany.C, TooMany.M2), EnumUtils.processBitVectors(TooMany.class, 1L, 6L));
-        assertEquals(EnumSet.of(TooMany.A, TooMany.B, TooMany.C, TooMany.M2), EnumUtils.processBitVectors(TooMany.class, 1L, 7L));
-        assertEquals(EnumSet.of(TooMany.A, TooMany.B, TooMany.C, TooMany.M2), EnumUtils.processBitVectors(TooMany.class, 1L, 7L));
-
-        // demonstrate tolerance of irrelevant high-order digits:
-        assertEquals(EnumSet.of(TooMany.M2), EnumUtils.processBitVectors(TooMany.class, 9L, 0L));
-        assertEquals(EnumSet.of(TooMany.A, TooMany.M2), EnumUtils.processBitVectors(TooMany.class, 9L, 1L));
-        assertEquals(EnumSet.of(TooMany.B, TooMany.M2), EnumUtils.processBitVectors(TooMany.class, 9L, 2L));
-        assertEquals(EnumSet.of(TooMany.A, TooMany.B, TooMany.M2), EnumUtils.processBitVectors(TooMany.class, 9L, 3L));
-        assertEquals(EnumSet.of(TooMany.C, TooMany.M2), EnumUtils.processBitVectors(TooMany.class, 9L, 4L));
-        assertEquals(EnumSet.of(TooMany.A, TooMany.C, TooMany.M2), EnumUtils.processBitVectors(TooMany.class, 9L, 5L));
-        assertEquals(EnumSet.of(TooMany.B, TooMany.C, TooMany.M2), EnumUtils.processBitVectors(TooMany.class, 9L, 6L));
-        assertEquals(EnumSet.of(TooMany.A, TooMany.B, TooMany.C, TooMany.M2), EnumUtils.processBitVectors(TooMany.class, 9L, 7L));
-        assertEquals(EnumSet.of(TooMany.A, TooMany.B, TooMany.C, TooMany.M2), EnumUtils.processBitVectors(TooMany.class, 9L, 7L));
-    }
-
-}
-
-enum Traffic {
-    RED, AMBER, GREEN
-}
-
-enum TooMany {
-    A,B,C,D,E,F,G,H,I,J,K,L,M,N,O,P,Q,R,S,T,U,V,W,X,Y,Z,
-    A1,B1,C1,D1,E1,F1,G1,H1,I1,J1,K1,L1,M1,N1,O1,P1,Q1,R1,S1,T1,U1,V1,W1,X1,Y1,Z1,
-    A2,B2,C2,D2,E2,F2,G2,H2,I2,J2,K2,L2,M2;
-}
diff --git a/lang/src/test/java/org/apache/commons/lang3/HashSetvBitSetTest.java b/lang/src/test/java/org/apache/commons/lang3/HashSetvBitSetTest.java
deleted file mode 100644
index eb35089..0000000
--- a/lang/src/test/java/org/apache/commons/lang3/HashSetvBitSetTest.java
+++ /dev/null
@@ -1,174 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- * 
- *      http://www.apache.org/licenses/LICENSE-2.0
- * 
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.commons.lang3;
-
-import java.util.BitSet;
-import java.util.HashSet;
-
-import org.junit.Assert;
-import org.junit.Test;
-
-/**
- * Test to show whether using BitSet for removeAll() methods is faster than using HashSet.
- */
-public class HashSetvBitSetTest {
-
-    private static final int LOOPS = 2000; // number of times to invoke methods
-    private static final int LOOPS2 = 10000;
-
-    @Test
-    public void testTimes() {
-        timeHashSet(10); // warmup
-        timeBitSet(10); // warmup
-        long timeDiff = printTimes(0);
-        timeDiff += printTimes(5);
-        timeDiff += printTimes(10);
-        timeDiff += printTimes(200);
-        timeDiff += printTimes(50);
-        timeDiff += printTimes(100);
-        timeDiff += printTimes(1000);
-        timeDiff += printTimes(2000);
-        Assert.assertTrue(timeDiff <= 0);
-    }
-
-    /**
-     * @return bitSet - HashSet
-     */
-    private long printTimes(final int count) {
-        final long hashSet = timeHashSet(count);
-        final long bitSet = timeBitSet(count);
-        // If percent is less than 100, then bitset is faster
-        System.out.println("Ratio="+(bitSet*100/hashSet)+"% count="+count+" hash="+hashSet+" bits="+bitSet);
-        return bitSet - hashSet;
-    }
-
-    private static long timeHashSet(final int count) {
-        int [] result = new int[0];
-        final long start = System.nanoTime();
-        for (int i = 0; i < LOOPS; i++) {
-            result = testHashSet(count);
-        }
-        final long elapsed = System.nanoTime() - start;
-        Assert.assertEquals(count, result.length);
-        return elapsed;
-    }
-
-    private static long timeBitSet(final int count) {
-        int [] result = new int[0];
-        final long start = System.nanoTime();
-        for (int i = 0; i < LOOPS; i++) {
-            result = testBitSet(count);
-        }
-        final long elapsed = System.nanoTime() - start;
-        Assert.assertEquals(count, result.length);
-        return elapsed;
-    }
-
-    @SuppressWarnings("boxing")
-    private static int[] testHashSet(final int count) {
-        final HashSet<Integer> toRemove = new HashSet<Integer>();
-            int found = 0;
-            for (int i = 0; i < count; i++) {
-                toRemove.add(found++);
-            }
-            return extractIndices(toRemove);
-        }
-    
-    private static int[] testBitSet(final int count) {
-        final BitSet toRemove = new BitSet();
-        int found = 0;
-        for (int i = 0; i < count; i++) {
-            toRemove.set(found++);
-        }
-        return extractIndices(toRemove);
-    }
-    
-
-    private static int[] extractIndices(final HashSet<Integer> coll) {
-        final int[] result = new int[coll.size()];
-        int i = 0;
-        for (final Integer index : coll) {
-            result[i++] = index.intValue();
-        }
-        return result;
-    }
-
-    private static int[] extractIndices(final BitSet coll) {
-        final int[] result = new int[coll.cardinality()];
-        int i = 0;
-        int j=0;
-        while((j=coll.nextSetBit(j)) != -1) {
-            result[i++] = j++;            
-        }
-        return result;
-    }
-    
-    @Test
-    public void testTimesExtractOrBitset() {
-        final BitSet toRemove = new BitSet();
-        final int[] array = new int[100];
-        toRemove.set(10, 20);
-        timeBitSetRemoveAll(array, toRemove); // warmup
-        timeExtractRemoveAll(array, toRemove); // warmup
-        long timeDiff = printTimes(100,1);
-        timeDiff += printTimes(100,10);
-        timeDiff += printTimes(100,50);
-        timeDiff += printTimes(100,100);
-        timeDiff += printTimes(1000,10);
-        timeDiff += printTimes(1000,100);
-        timeDiff += printTimes(1000,500);
-        timeDiff += printTimes(1000,1000);
-        Assert.assertTrue(timeDiff <= 0);
-    }
-
-    private long printTimes(final int arraySize, final int bitSetSize) {
-        final int[] array = new int[arraySize];
-        final BitSet remove = new BitSet();
-        for (int i = 0; i < bitSetSize; i++) {
-            remove.set(i);
-        }
-        final long bitSet = timeBitSetRemoveAll(array, remove );
-        final long extract = timeExtractRemoveAll(array, remove);
-        // If percent is less than 100, then direct use of bitset is faster
-        System.out.println("Ratio="+(bitSet*100/extract)+"% array="+array.length+" count="+remove.cardinality()+" extract="+extract+" bitset="+bitSet);
-        return bitSet - extract;
-    }
-
-    private long timeBitSetRemoveAll(final int[] array, final BitSet toRemove) {
-        int[] output = new int[0];
-        final long start = System.nanoTime();
-        for(int i = 0; i < LOOPS2; i++){
-            output = (int[]) ArrayUtils.removeAll(array, toRemove);            
-        }
-        final long end = System.nanoTime();
-        Assert.assertEquals(array.length-toRemove.cardinality(), output.length);
-        return end - start;
-    }
-    
-    private long timeExtractRemoveAll(final int[] array, final BitSet toRemove) {
-        int[] output = new int[0];
-        final long start = System.nanoTime();
-        for(int i = 0; i < LOOPS2; i++){
-            final int[] extractIndices = extractIndices(toRemove);
-            output = (int[]) ArrayUtils.removeAll((Object)array, extractIndices);
-        }
-        final long end = System.nanoTime();
-        Assert.assertEquals(array.length-toRemove.cardinality(), output.length);
-        return end - start;
-    }
-    
-}
\ No newline at end of file
diff --git a/lang/src/test/java/org/apache/commons/lang3/JavaVersionTest.java b/lang/src/test/java/org/apache/commons/lang3/JavaVersionTest.java
deleted file mode 100644
index c8a6c81..0000000
--- a/lang/src/test/java/org/apache/commons/lang3/JavaVersionTest.java
+++ /dev/null
@@ -1,77 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-package org.apache.commons.lang3;
-
-import org.junit.Test;
-
-import static org.apache.commons.lang3.JavaVersion.JAVA_RECENT;
-import static org.junit.Assert.*;
-import static org.apache.commons.lang3.JavaVersion.JAVA_0_9;
-import static org.apache.commons.lang3.JavaVersion.JAVA_1_1;
-import static org.apache.commons.lang3.JavaVersion.JAVA_1_2;
-import static org.apache.commons.lang3.JavaVersion.JAVA_1_3;
-import static org.apache.commons.lang3.JavaVersion.JAVA_1_4;
-import static org.apache.commons.lang3.JavaVersion.JAVA_1_5;
-import static org.apache.commons.lang3.JavaVersion.JAVA_1_6;
-import static org.apache.commons.lang3.JavaVersion.JAVA_1_7;
-import static org.apache.commons.lang3.JavaVersion.JAVA_1_8;
-import static org.apache.commons.lang3.JavaVersion.JAVA_1_9;
-import static org.apache.commons.lang3.JavaVersion.get;
-import static org.apache.commons.lang3.JavaVersion.getJavaVersion;
-
-/**
- * Unit tests {@link org.apache.commons.lang3.JavaVersion}.
- *
- * @version $Id$
- */
-public class JavaVersionTest {
-
-    @Test
-    public void testGetJavaVersion() {
-        assertEquals("0.9 failed", JAVA_0_9, get("0.9"));
-        assertEquals("1.1 failed", JAVA_1_1, get("1.1"));
-        assertEquals("1.2 failed", JAVA_1_2, get("1.2"));
-        assertEquals("1.3 failed", JAVA_1_3, get("1.3"));
-        assertEquals("1.4 failed", JAVA_1_4, get("1.4"));
-        assertEquals("1.5 failed", JAVA_1_5, get("1.5"));
-        assertEquals("1.6 failed", JAVA_1_6, get("1.6"));
-        assertEquals("1.7 failed", JAVA_1_7, get("1.7"));
-        assertEquals("1.8 failed", JAVA_1_8, get("1.8"));
-        assertEquals("1.9 failed", JAVA_1_9, get("1.9"));
-        assertEquals("1.10 failed", JAVA_RECENT, get("1.10"));
-        // assertNull("2.10 unexpectedly worked", get("2.10"));
-        assertEquals("Wrapper method failed", get("1.5"), getJavaVersion("1.5"));
-    }
-
-    @Test
-    public void testAtLeast() {
-        assertFalse("1.2 at least 1.5 passed", JAVA_1_2.atLeast(JAVA_1_5));
-        assertTrue("1.5 at least 1.2 failed", JAVA_1_5.atLeast(JAVA_1_2));
-        assertFalse("1.6 at least 1.7 passed", JAVA_1_6.atLeast(JAVA_1_7));
-
-        assertTrue("0.9 at least 1.5 failed", JAVA_0_9.atLeast(JAVA_1_5));
-        assertFalse("0.9 at least 1.6 passed", JAVA_0_9.atLeast(JAVA_1_6));
-    }
-
-    @Test
-    public void testToString() {
-        assertEquals("1.2", JAVA_1_2.toString());
-    }
-
-}
diff --git a/lang/src/test/java/org/apache/commons/lang3/LocaleUtilsTest.java b/lang/src/test/java/org/apache/commons/lang3/LocaleUtilsTest.java
deleted file mode 100644
index ba2cc00..0000000
--- a/lang/src/test/java/org/apache/commons/lang3/LocaleUtilsTest.java
+++ /dev/null
@@ -1,592 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- * 
- *      http://www.apache.org/licenses/LICENSE-2.0
- * 
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.commons.lang3;
-
-import static org.apache.commons.lang3.JavaVersion.JAVA_1_4;
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertFalse;
-import static org.junit.Assert.assertNotNull;
-import static org.junit.Assert.assertNull;
-import static org.junit.Assert.assertSame;
-import static org.junit.Assert.assertTrue;
-import static org.junit.Assert.fail;
-
-import java.lang.reflect.Constructor;
-import java.lang.reflect.Modifier;
-import java.util.Arrays;
-import java.util.Collection;
-import java.util.HashSet;
-import java.util.Iterator;
-import java.util.List;
-import java.util.Locale;
-import java.util.Set;
-
-import org.junit.Before;
-import org.junit.Test;
-
-/**
- * Unit tests for {@link LocaleUtils}.
- *
- * @version $Id$
- */
-public class LocaleUtilsTest  {
-
-    private static final Locale LOCALE_EN = new Locale("en", "");
-    private static final Locale LOCALE_EN_US = new Locale("en", "US");
-    private static final Locale LOCALE_EN_US_ZZZZ = new Locale("en", "US", "ZZZZ");
-    private static final Locale LOCALE_FR = new Locale("fr", "");
-    private static final Locale LOCALE_FR_CA = new Locale("fr", "CA");
-    private static final Locale LOCALE_QQ = new Locale("qq", "");
-    private static final Locale LOCALE_QQ_ZZ = new Locale("qq", "ZZ"); 
-
-    @Before
-    public void setUp() throws Exception {
-        // Testing #LANG-304. Must be called before availableLocaleSet is called.
-        LocaleUtils.isAvailableLocale(Locale.getDefault());
-    }
-
-    //-----------------------------------------------------------------------
-    /**
-     * Test that constructors are public, and work, etc.
-     */
-    @Test
-    public void testConstructor() {
-        assertNotNull(new LocaleUtils());
-        final Constructor<?>[] cons = LocaleUtils.class.getDeclaredConstructors();
-        assertEquals(1, cons.length);
-        assertTrue(Modifier.isPublic(cons[0].getModifiers()));
-        assertTrue(Modifier.isPublic(LocaleUtils.class.getModifiers()));
-        assertFalse(Modifier.isFinal(LocaleUtils.class.getModifiers()));
-    }
-
-    //-----------------------------------------------------------------------
-    /**
-     * Pass in a valid language, test toLocale.
-     *
-     * @param language  the language string
-     */
-    private static void assertValidToLocale(final String language) {
-        final Locale locale = LocaleUtils.toLocale(language);
-        assertNotNull("valid locale", locale);
-        assertEquals(language, locale.getLanguage());
-        //country and variant are empty
-        assertTrue(locale.getCountry() == null || locale.getCountry().isEmpty());
-        assertTrue(locale.getVariant() == null || locale.getVariant().isEmpty());
-    }
-
-    /**
-     * Pass in a valid language, test toLocale.
-     *
-     * @param localeString to pass to toLocale()
-     * @param language of the resulting Locale
-     * @param country of the resulting Locale
-     */
-    private static void assertValidToLocale(final String localeString, final String language, final String country) {
-        final Locale locale = LocaleUtils.toLocale(localeString);
-        assertNotNull("valid locale", locale);
-        assertEquals(language, locale.getLanguage());
-        assertEquals(country, locale.getCountry());
-        //variant is empty
-        assertTrue(locale.getVariant() == null || locale.getVariant().isEmpty());
-    }
-
-    /**
-     * Pass in a valid language, test toLocale.
-     *
-     * @param localeString to pass to toLocale()
-     * @param language of the resulting Locale
-     * @param country of the resulting Locale
-     * @param variant of the resulting Locale
-     */
-    private static void assertValidToLocale(
-            final String localeString, final String language, 
-            final String country, final String variant) {
-        final Locale locale = LocaleUtils.toLocale(localeString);
-        assertNotNull("valid locale", locale);
-        assertEquals(language, locale.getLanguage());
-        assertEquals(country, locale.getCountry());
-        assertEquals(variant, locale.getVariant());
-    }
-
-    /**
-     * Test toLocale() method.
-     */
-    @Test
-    public void testToLocale_1Part() {
-        assertNull(LocaleUtils.toLocale((String) null));
-        
-        assertValidToLocale("us");
-        assertValidToLocale("fr");
-        assertValidToLocale("de");
-        assertValidToLocale("zh");
-        // Valid format but lang doesnt exist, should make instance anyway
-        assertValidToLocale("qq");
-        // LANG-941: JDK 8 introduced the empty locale as one of the default locales
-        assertValidToLocale("");
-
-        try {
-            LocaleUtils.toLocale("Us");
-            fail("Should fail if not lowercase");
-        } catch (final IllegalArgumentException iae) {}
-        try {
-            LocaleUtils.toLocale("US");
-            fail("Should fail if not lowercase");
-        } catch (final IllegalArgumentException iae) {}
-        try {
-            LocaleUtils.toLocale("uS");
-            fail("Should fail if not lowercase");
-        } catch (final IllegalArgumentException iae) {}
-        try {
-            LocaleUtils.toLocale("u#");
-            fail("Should fail if not lowercase");
-        } catch (final IllegalArgumentException iae) {}
-        
-        try {
-            LocaleUtils.toLocale("u");
-            fail("Must be 2 chars if less than 5");
-        } catch (final IllegalArgumentException iae) {}
-
-        try {
-            LocaleUtils.toLocale("uu_U");
-            fail("Must be 2 chars if less than 5");
-        } catch (final IllegalArgumentException iae) {}
-    }        
-
-    /**
-     * Test toLocale() method.
-     */
-    @Test
-    public void testToLocale_2Part() {
-        assertValidToLocale("us_EN", "us", "EN");
-        //valid though doesnt exist
-        assertValidToLocale("us_ZH", "us", "ZH");
-        
-        try {
-            LocaleUtils.toLocale("us-EN");
-            fail("Should fail as not underscore");
-        } catch (final IllegalArgumentException iae) {}
-        try {
-            LocaleUtils.toLocale("us_En");
-            fail("Should fail second part not uppercase");
-        } catch (final IllegalArgumentException iae) {}
-        try {
-            LocaleUtils.toLocale("us_en");
-            fail("Should fail second part not uppercase");
-        } catch (final IllegalArgumentException iae) {}
-        try {
-            LocaleUtils.toLocale("us_eN");
-            fail("Should fail second part not uppercase");
-        } catch (final IllegalArgumentException iae) {}
-        try {
-            LocaleUtils.toLocale("uS_EN");
-            fail("Should fail first part not lowercase");
-        } catch (final IllegalArgumentException iae) {}
-        try {
-            LocaleUtils.toLocale("us_E3");
-            fail("Should fail second part not uppercase");
-        } catch (final IllegalArgumentException iae) {}
-    }        
-
-    /**
-     * Test toLocale() method.
-     */
-    @Test
-    public void testToLocale_3Part() {
-        assertValidToLocale("us_EN_A", "us", "EN", "A");
-        // this isn't pretty, but was caused by a jdk bug it seems
-        // http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=4210525
-        if (SystemUtils.isJavaVersionAtLeast(JAVA_1_4)) {
-            assertValidToLocale("us_EN_a", "us", "EN", "a");
-            assertValidToLocale("us_EN_SFsafdFDsdfF", "us", "EN", "SFsafdFDsdfF");
-        } else {
-            assertValidToLocale("us_EN_a", "us", "EN", "A");
-            assertValidToLocale("us_EN_SFsafdFDsdfF", "us", "EN", "SFSAFDFDSDFF");
-        }
-        
-        try {
-            LocaleUtils.toLocale("us_EN-a");
-            fail("Should fail as not underscore");
-        } catch (final IllegalArgumentException iae) {}
-        try {
-            LocaleUtils.toLocale("uu_UU_");
-            fail("Must be 3, 5 or 7+ in length");
-        } catch (final IllegalArgumentException iae) {}
-    }
-
-    //-----------------------------------------------------------------------
-    /**
-     * Helper method for local lookups.
-     *
-     * @param locale  the input locale
-     * @param defaultLocale  the input default locale
-     * @param expected  expected results
-     */
-    private static void assertLocaleLookupList(final Locale locale, final Locale defaultLocale, final Locale[] expected) {
-        final List<Locale> localeList = defaultLocale == null ?
-                LocaleUtils.localeLookupList(locale) :
-                LocaleUtils.localeLookupList(locale, defaultLocale);
-        
-        assertEquals(expected.length, localeList.size());
-        assertEquals(Arrays.asList(expected), localeList);
-        assertUnmodifiableCollection(localeList);
-    }
-
-    //-----------------------------------------------------------------------
-    /**
-     * Test localeLookupList() method.
-     */
-    @Test
-    public void testLocaleLookupList_Locale() {
-        assertLocaleLookupList(null, null, new Locale[0]);
-        assertLocaleLookupList(LOCALE_QQ, null, new Locale[]{LOCALE_QQ});
-        assertLocaleLookupList(LOCALE_EN, null, new Locale[]{LOCALE_EN});
-        assertLocaleLookupList(LOCALE_EN, null, new Locale[]{LOCALE_EN});
-        assertLocaleLookupList(LOCALE_EN_US, null,
-            new Locale[] {
-                LOCALE_EN_US,
-                LOCALE_EN});
-        assertLocaleLookupList(LOCALE_EN_US_ZZZZ, null,
-            new Locale[] {
-                LOCALE_EN_US_ZZZZ,
-                LOCALE_EN_US,
-                LOCALE_EN});
-    }        
-
-    /**
-     * Test localeLookupList() method.
-     */
-    @Test
-    public void testLocaleLookupList_LocaleLocale() {
-        assertLocaleLookupList(LOCALE_QQ, LOCALE_QQ, 
-                new Locale[]{LOCALE_QQ});
-        assertLocaleLookupList(LOCALE_EN, LOCALE_EN, 
-                new Locale[]{LOCALE_EN});
-        
-        assertLocaleLookupList(LOCALE_EN_US, LOCALE_EN_US, 
-            new Locale[]{
-                LOCALE_EN_US,
-                LOCALE_EN});
-        assertLocaleLookupList(LOCALE_EN_US, LOCALE_QQ,
-            new Locale[] {
-                LOCALE_EN_US,
-                LOCALE_EN,
-                LOCALE_QQ});
-        assertLocaleLookupList(LOCALE_EN_US, LOCALE_QQ_ZZ,
-            new Locale[] {
-                LOCALE_EN_US,
-                LOCALE_EN,
-                LOCALE_QQ_ZZ});
-        
-        assertLocaleLookupList(LOCALE_EN_US_ZZZZ, null,
-            new Locale[] {
-                LOCALE_EN_US_ZZZZ,
-                LOCALE_EN_US,
-                LOCALE_EN});
-        assertLocaleLookupList(LOCALE_EN_US_ZZZZ, LOCALE_EN_US_ZZZZ,
-            new Locale[] {
-                LOCALE_EN_US_ZZZZ,
-                LOCALE_EN_US,
-                LOCALE_EN});
-        assertLocaleLookupList(LOCALE_EN_US_ZZZZ, LOCALE_QQ,
-            new Locale[] {
-                LOCALE_EN_US_ZZZZ,
-                LOCALE_EN_US,
-                LOCALE_EN,
-                LOCALE_QQ});
-        assertLocaleLookupList(LOCALE_EN_US_ZZZZ, LOCALE_QQ_ZZ,
-            new Locale[] {
-                LOCALE_EN_US_ZZZZ,
-                LOCALE_EN_US,
-                LOCALE_EN,
-                LOCALE_QQ_ZZ});
-        assertLocaleLookupList(LOCALE_FR_CA, LOCALE_EN,
-            new Locale[] {
-                LOCALE_FR_CA,
-                LOCALE_FR,
-                LOCALE_EN});
-    }
-
-    //-----------------------------------------------------------------------
-    /**
-     * Test availableLocaleList() method.
-     */
-    @Test
-    public void testAvailableLocaleList() {
-        final List<Locale> list = LocaleUtils.availableLocaleList();
-        final List<Locale> list2 = LocaleUtils.availableLocaleList();
-        assertNotNull(list);
-        assertSame(list, list2);
-        assertUnmodifiableCollection(list);
-        
-        final Locale[] jdkLocaleArray = Locale.getAvailableLocales();
-        final List<Locale> jdkLocaleList = Arrays.asList(jdkLocaleArray);
-        assertEquals(jdkLocaleList, list);
-    }
-
-    //-----------------------------------------------------------------------
-    /**
-     * Test availableLocaleSet() method.
-     */
-    @Test
-    public void testAvailableLocaleSet() {
-        final Set<Locale> set = LocaleUtils.availableLocaleSet();
-        final Set<Locale> set2 = LocaleUtils.availableLocaleSet();
-        assertNotNull(set);
-        assertSame(set, set2);
-        assertUnmodifiableCollection(set);
-        
-        final Locale[] jdkLocaleArray = Locale.getAvailableLocales();
-        final List<Locale> jdkLocaleList = Arrays.asList(jdkLocaleArray);
-        final Set<Locale> jdkLocaleSet = new HashSet<Locale>(jdkLocaleList);
-        assertEquals(jdkLocaleSet, set);
-    }
-
-    //-----------------------------------------------------------------------
-    /**
-     * Test availableLocaleSet() method.
-     */
-    @SuppressWarnings("boxing") // JUnit4 does not support primitive equality testing apart from long
-    @Test
-    public void testIsAvailableLocale() {
-        final Set<Locale> set = LocaleUtils.availableLocaleSet();
-        assertEquals(set.contains(LOCALE_EN), LocaleUtils.isAvailableLocale(LOCALE_EN));
-        assertEquals(set.contains(LOCALE_EN_US), LocaleUtils.isAvailableLocale(LOCALE_EN_US));
-        assertEquals(set.contains(LOCALE_EN_US_ZZZZ), LocaleUtils.isAvailableLocale(LOCALE_EN_US_ZZZZ));
-        assertEquals(set.contains(LOCALE_FR), LocaleUtils.isAvailableLocale(LOCALE_FR));
-        assertEquals(set.contains(LOCALE_FR_CA), LocaleUtils.isAvailableLocale(LOCALE_FR_CA));
-        assertEquals(set.contains(LOCALE_QQ), LocaleUtils.isAvailableLocale(LOCALE_QQ));
-        assertEquals(set.contains(LOCALE_QQ_ZZ), LocaleUtils.isAvailableLocale(LOCALE_QQ_ZZ));
-    }
-    
-    /**
-     * Test for 3-chars locale, further details at LANG-915
-     * 
-     */
-    @Test
-    public void testThreeCharsLocale() {
-        for (final String str : Arrays.asList("udm", "tet")) {
-            final Locale locale = LocaleUtils.toLocale(str);
-            assertNotNull(locale);
-            assertEquals(str, locale.getLanguage());
-            assertTrue(StringUtils.isBlank(locale.getCountry()));
-            assertEquals(new Locale(str), locale);
-        }
-    }
-
-    //-----------------------------------------------------------------------
-    /**
-     * Make sure the language by country is correct. It checks that 
-     * the LocaleUtils.languagesByCountry(country) call contains the 
-     * array of languages passed in. It may contain more due to JVM 
-     * variations.
-     *
-     * @param country
-     * @param languages array of languages that should be returned
-     */
-    private static void assertLanguageByCountry(final String country, final String[] languages) {
-        final List<Locale> list = LocaleUtils.languagesByCountry(country);
-        final List<Locale> list2 = LocaleUtils.languagesByCountry(country);
-        assertNotNull(list);
-        assertSame(list, list2);
-        //search through langauges
-        for (final String language : languages) {
-            final Iterator<Locale> iterator = list.iterator();
-            boolean found = false;
-            // see if it was returned by the set
-            while (iterator.hasNext()) {
-                final Locale locale = iterator.next();
-                // should have an en empty variant
-                assertTrue(locale.getVariant() == null
-                        || locale.getVariant().isEmpty());
-                assertEquals(country, locale.getCountry());
-                if (language.equals(locale.getLanguage())) {
-                    found = true;
-                    break;
-                }
-            }
-            if (!found) {
-                fail("Cound not find language: " + language
-                        + " for country: " + country);
-            }
-        }
-        assertUnmodifiableCollection(list);
-    }
-
-    /**
-     * Test languagesByCountry() method.
-     */
-    @Test
-    public void testLanguagesByCountry() {
-        assertLanguageByCountry(null, new String[0]);
-        assertLanguageByCountry("GB", new String[]{"en"});
-        assertLanguageByCountry("ZZ", new String[0]);
-        assertLanguageByCountry("CH", new String[]{"fr", "de", "it"});
-    }
-
-    //-----------------------------------------------------------------------
-    /**
-     * Make sure the country by language is correct. It checks that 
-     * the LocaleUtils.countryByLanguage(language) call contains the 
-     * array of countries passed in. It may contain more due to JVM 
-     * variations.
-     *
-     *
-     * @param language
-     * @param countries array of countries that should be returned
-     */
-    private static void assertCountriesByLanguage(final String language, final String[] countries) {
-        final List<Locale> list = LocaleUtils.countriesByLanguage(language);
-        final List<Locale> list2 = LocaleUtils.countriesByLanguage(language);
-        assertNotNull(list);
-        assertSame(list, list2);
-        //search through langauges
-        for (final String countrie : countries) {
-            final Iterator<Locale> iterator = list.iterator();
-            boolean found = false;
-            // see if it was returned by the set
-            while (iterator.hasNext()) {
-                final Locale locale = iterator.next();
-                // should have an en empty variant
-                assertTrue(locale.getVariant() == null
-                        || locale.getVariant().isEmpty());
-                assertEquals(language, locale.getLanguage());
-                if (countrie.equals(locale.getCountry())) {
-                    found = true;
-                    break;
-                }
-            }
-            if (!found) {
-                fail("Cound not find language: " + countrie
-                        + " for country: " + language);
-            }
-        }
-        assertUnmodifiableCollection(list);
-    }
-
-    /**
-     * Test countriesByLanguage() method.
-     */
-    @Test
-    public void testCountriesByLanguage() {
-        assertCountriesByLanguage(null, new String[0]);
-        assertCountriesByLanguage("de", new String[]{"DE", "CH", "AT", "LU"});
-        assertCountriesByLanguage("zz", new String[0]);
-        assertCountriesByLanguage("it", new String[]{"IT", "CH"});
-    }
-
-    /**
-     * @param coll  the collection to check
-     */
-    private static void assertUnmodifiableCollection(final Collection<?> coll) {
-        try {
-            coll.add(null);
-            fail();
-        } catch (final UnsupportedOperationException ex) {}
-    }
-
-    /**
-     * Tests #LANG-328 - only language+variant
-     */
-    @Test
-    public void testLang328() {
-        assertValidToLocale("fr__P", "fr", "", "P");
-        assertValidToLocale("fr__POSIX", "fr", "", "POSIX");
-    }
-
-    /**
-     * Tests #LANG-865, strings starting with an underscore.
-     */
-    @Test
-    public void testLang865() {
-        assertValidToLocale("_GB", "", "GB", "");
-        assertValidToLocale("_GB_P", "", "GB", "P");
-        assertValidToLocale("_GB_POSIX", "", "GB", "POSIX");
-        try {
-            LocaleUtils.toLocale("_G");
-            fail("Must be at least 3 chars if starts with underscore");
-        } catch (final IllegalArgumentException iae) {
-        }
-        try {
-            LocaleUtils.toLocale("_Gb");
-            fail("Must be uppercase if starts with underscore");
-        } catch (final IllegalArgumentException iae) {
-        }
-        try {
-            LocaleUtils.toLocale("_gB");
-            fail("Must be uppercase if starts with underscore");
-        } catch (final IllegalArgumentException iae) {
-        }
-        try {
-            LocaleUtils.toLocale("_1B");
-            fail("Must be letter if starts with underscore");
-        } catch (final IllegalArgumentException iae) {
-        }
-        try {
-            LocaleUtils.toLocale("_G1");
-            fail("Must be letter if starts with underscore");
-        } catch (final IllegalArgumentException iae) {
-        }
-        try {
-            LocaleUtils.toLocale("_GB_");
-            fail("Must be at least 5 chars if starts with underscore");
-        } catch (final IllegalArgumentException iae) {
-        }
-        try {
-            LocaleUtils.toLocale("_GBAP");
-            fail("Must have underscore after the country if starts with underscore and is at least 5 chars");
-        } catch (final IllegalArgumentException iae) {
-        }
-    }
-
-    @Test
-    public void testParseAllLocales() {
-        final Locale[] locales = Locale.getAvailableLocales();
-        int failures = 0;
-        for (final Locale l : locales) {
-            // Check if it's possible to recreate the Locale using just the standard constructor
-            final Locale locale = new Locale(l.getLanguage(), l.getCountry(), l.getVariant());
-            if (l.equals(locale)) { // it is possible for LocaleUtils.toLocale to handle these Locales
-                String str = l.toString();
-                // Look for the script/extension suffix
-                int suff = str.indexOf("_#");
-                if (suff == - 1) {
-                    suff = str.indexOf("#");
-                }
-                if (suff >= 0) { // we have a suffix
-                    try {
-                        LocaleUtils.toLocale(str); // shouuld cause IAE
-                        System.out.println("Should not have parsed: " + str);
-                        failures++;
-                        continue; // try next Locale
-                    } catch (final IllegalArgumentException iae) {
-                        // expected; try without suffix
-                        str = str.substring(0, suff);
-                    }
-                }
-                final Locale loc = LocaleUtils.toLocale(str);
-                if (!l.equals(loc)) {
-                    System.out.println("Failed to parse: " + str);
-                    failures++;
-                }
-            }
-        }
-        if (failures > 0) {
-            fail("Failed "+failures+" test(s)");
-        }
-    }
-
-}
\ No newline at end of file
diff --git a/lang/src/test/java/org/apache/commons/lang3/NotImplementedExceptionTest.java b/lang/src/test/java/org/apache/commons/lang3/NotImplementedExceptionTest.java
deleted file mode 100644
index a0b1ade..0000000
--- a/lang/src/test/java/org/apache/commons/lang3/NotImplementedExceptionTest.java
+++ /dev/null
@@ -1,56 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- * 
- *      http://www.apache.org/licenses/LICENSE-2.0
- * 
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.commons.lang3;
-
-import org.junit.Test;
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertNotNull;
-
-/**
- * Unit tests {@link org.apache.commons.lang3.NotImplementedException}.
- * 
- * @version $Id: NotImplementedExceptionTest.java 905628 2010-02-02 13:29:55Z niallp $
- */
-public class NotImplementedExceptionTest {
-
-    @Test
-    public void testConstructors() {
-        final Throwable nested = new RuntimeException();
-        final String message = "Not Implemented";
-        final String code = "CODE";
-
-        NotImplementedException nie = new NotImplementedException(message);
-        assertCorrect("Issue in (String)", nie, message, null, null);
-        nie = new NotImplementedException(nested);
-        assertCorrect("Issue in (Throwable)", nie, nested.toString(), nested, null);
-        nie = new NotImplementedException(message, nested);
-        assertCorrect("Issue in (String, Throwable)", nie, message, nested, null);
-        nie = new NotImplementedException(message, code);
-        assertCorrect("Issue in (String, String)", nie, message, null, code);
-        nie = new NotImplementedException(nested, code);
-        assertCorrect("Issue in (Throwable, String)", nie, nested.toString(), nested, code);
-        nie = new NotImplementedException(message, nested, code);
-        assertCorrect("Issue in (String, Throwable, String)", nie, message, nested, code);
-    }
-
-    private void assertCorrect(final String assertMessage, final NotImplementedException nie, final String message, final Throwable nested, final String code) {
-        assertNotNull(assertMessage + ": target is null", nie);
-        assertEquals(assertMessage + ": Message not equal", message, nie.getMessage());
-        assertEquals(assertMessage + ": Nested throwable not equal", nested, nie.getCause());
-        assertEquals(assertMessage + ": Code not equal", code, nie.getCode());
-    }
-}
diff --git a/lang/src/test/java/org/apache/commons/lang3/ObjectUtilsTest.java b/lang/src/test/java/org/apache/commons/lang3/ObjectUtilsTest.java
deleted file mode 100644
index 4d48e5a..0000000
--- a/lang/src/test/java/org/apache/commons/lang3/ObjectUtilsTest.java
+++ /dev/null
@@ -1,682 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- * 
- *      http://www.apache.org/licenses/LICENSE-2.0
- * 
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.commons.lang3;
-
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertFalse;
-import static org.junit.Assert.assertNotNull;
-import static org.junit.Assert.assertNotSame;
-import static org.junit.Assert.assertNull;
-import static org.junit.Assert.assertSame;
-import static org.junit.Assert.assertTrue;
-import static org.junit.Assert.fail;
-
-import java.io.IOException;
-import java.lang.reflect.Constructor;
-import java.lang.reflect.Modifier;
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.Calendar;
-import java.util.Comparator;
-import java.util.Date;
-import java.util.List;
-
-import org.apache.commons.lang3.exception.CloneFailedException;
-import org.apache.commons.lang3.mutable.MutableObject;
-import org.apache.commons.lang3.text.StrBuilder;
-import org.junit.Test;
-
-/**
- * Unit tests {@link org.apache.commons.lang3.ObjectUtils}.
- *
- * @version $Id$
- */
-@SuppressWarnings("deprecation") // deliberate use of deprecated code
-public class ObjectUtilsTest {
-    private static final String FOO = "foo";
-    private static final String BAR = "bar";
-
-    //-----------------------------------------------------------------------
-    @Test
-    public void testConstructor() {
-        assertNotNull(new ObjectUtils());
-        final Constructor<?>[] cons = ObjectUtils.class.getDeclaredConstructors();
-        assertEquals(1, cons.length);
-        assertTrue(Modifier.isPublic(cons[0].getModifiers()));
-        assertTrue(Modifier.isPublic(ObjectUtils.class.getModifiers()));
-        assertFalse(Modifier.isFinal(ObjectUtils.class.getModifiers()));
-    }
-
-    //-----------------------------------------------------------------------
-    @Test
-    public void testIsNull() {
-        final Object o = FOO;
-        final Object dflt = BAR;
-        assertSame("dflt was not returned when o was null", dflt, ObjectUtils.defaultIfNull(null, dflt));
-        assertSame("dflt was returned when o was not null", o, ObjectUtils.defaultIfNull(o, dflt));
-    }
-
-    @Test
-    public void testFirstNonNull() {
-        assertEquals("", ObjectUtils.firstNonNull(null, ""));
-        final String firstNonNullGenerics = ObjectUtils.firstNonNull(null, null, "123", "456");
-        assertEquals("123", firstNonNullGenerics);
-        assertEquals("123", ObjectUtils.firstNonNull("123", null, "456", null));
-        assertSame(Boolean.TRUE, ObjectUtils.firstNonNull(Boolean.TRUE));
-        
-        // Explicitly pass in an empty array of Object type to ensure compiler doesn't complain of unchecked generic array creation
-        assertNull(ObjectUtils.firstNonNull(new Object[0]));
-        
-        // Cast to Object in line below ensures compiler doesn't complain of unchecked generic array creation
-        assertNull(ObjectUtils.firstNonNull((Object) null, (Object) null));
-        
-//        assertSame("123", ObjectUtils.firstNonNull(null, ObjectUtils.NULL, "123", "456"));
-//        assertSame("456", ObjectUtils.firstNonNull(ObjectUtils.NULL, "456", "123", null));
-//        assertNull(ObjectUtils.firstNonNull(null, null, ObjectUtils.NULL));
-        assertNull(ObjectUtils.firstNonNull((Object) null));
-        assertNull(ObjectUtils.firstNonNull((Object[]) null));
-    }
-
-    //-----------------------------------------------------------------------
-    @Test
-    public void testEquals() {
-        assertTrue("ObjectUtils.equals(null, null) returned false", ObjectUtils.equals(null, null));
-        assertTrue("ObjectUtils.equals(\"foo\", null) returned true", !ObjectUtils.equals(FOO, null));
-        assertTrue("ObjectUtils.equals(null, \"bar\") returned true", !ObjectUtils.equals(null, BAR));
-        assertTrue("ObjectUtils.equals(\"foo\", \"bar\") returned true", !ObjectUtils.equals(FOO, BAR));
-        assertTrue("ObjectUtils.equals(\"foo\", \"foo\") returned false", ObjectUtils.equals(FOO, FOO));
-    }
-
-    @Test
-    public void testNotEqual() {
-        assertFalse("ObjectUtils.notEqual(null, null) returned false", ObjectUtils.notEqual(null, null));
-        assertTrue("ObjectUtils.notEqual(\"foo\", null) returned true", ObjectUtils.notEqual(FOO, null));
-        assertTrue("ObjectUtils.notEqual(null, \"bar\") returned true", ObjectUtils.notEqual(null, BAR));
-        assertTrue("ObjectUtils.notEqual(\"foo\", \"bar\") returned true", ObjectUtils.notEqual(FOO, BAR));
-        assertFalse("ObjectUtils.notEqual(\"foo\", \"foo\") returned false", ObjectUtils.notEqual(FOO, FOO));
-    }
-
-    @Test
-    public void testHashCode() {
-        assertEquals(0, ObjectUtils.hashCode(null));
-        assertEquals("a".hashCode(), ObjectUtils.hashCode("a"));
-    }
-
-    @Test
-    public void testHashCodeMulti_multiple_emptyArray() {
-        final Object[] array = new Object[0];
-        assertEquals(1, ObjectUtils.hashCodeMulti(array));
-    }
-
-    @Test
-    public void testHashCodeMulti_multiple_nullArray() {
-        final Object[] array = null;
-        assertEquals(1, ObjectUtils.hashCodeMulti(array));
-    }
-
-    @Test
-    public void testHashCodeMulti_multiple_likeList() {
-        final List<Object> list0 = new ArrayList<Object>(Arrays.asList(new Object[0]));
-        assertEquals(list0.hashCode(), ObjectUtils.hashCodeMulti());
-        
-        final List<Object> list1 = new ArrayList<Object>(Arrays.asList("a"));
-        assertEquals(list1.hashCode(), ObjectUtils.hashCodeMulti("a"));
-        
-        final List<Object> list2 = new ArrayList<Object>(Arrays.asList("a", "b"));
-        assertEquals(list2.hashCode(), ObjectUtils.hashCodeMulti("a", "b"));
-        
-        final List<Object> list3 = new ArrayList<Object>(Arrays.asList("a", "b", "c"));
-        assertEquals(list3.hashCode(), ObjectUtils.hashCodeMulti("a", "b", "c"));
-    }
-
-//    /**
-//     * Show that java.util.Date and java.sql.Timestamp are apples and oranges.
-//     * Prompted by an email discussion. 
-//     * 
-//     * The behavior is different b/w Sun Java 1.3.1_10 and 1.4.2_03.
-//     */
-//    public void testDateEqualsJava() {
-//        long now = 1076957313284L; // Feb 16, 2004 10:49... PST
-//        java.util.Date date = new java.util.Date(now);
-//        java.sql.Timestamp realTimestamp = new java.sql.Timestamp(now);
-//        java.util.Date timestamp = realTimestamp;
-//        // sanity check 1:
-//        assertEquals(284000000, realTimestamp.getNanos());
-//        assertEquals(1076957313284L, date.getTime());
-//        //
-//        // On Sun 1.3.1_10:
-//        //junit.framework.AssertionFailedError: expected:<1076957313284> but was:<1076957313000>
-//        //
-//        //assertEquals(1076957313284L, timestamp.getTime());
-//        //
-//        //junit.framework.AssertionFailedError: expected:<1076957313284> but was:<1076957313000>
-//        //
-//        //assertEquals(1076957313284L, realTimestamp.getTime());
-//        // sanity check 2:        
-//        assertEquals(date.getDay(), realTimestamp.getDay());
-//        assertEquals(date.getHours(), realTimestamp.getHours());
-//        assertEquals(date.getMinutes(), realTimestamp.getMinutes());
-//        assertEquals(date.getMonth(), realTimestamp.getMonth());
-//        assertEquals(date.getSeconds(), realTimestamp.getSeconds());
-//        assertEquals(date.getTimezoneOffset(), realTimestamp.getTimezoneOffset());
-//        assertEquals(date.getYear(), realTimestamp.getYear());
-//        //
-//        // Time values are == and equals() on Sun 1.4.2_03 but NOT on Sun 1.3.1_10:
-//        //
-//        //assertFalse("Sanity check failed: date.getTime() == timestamp.getTime()", date.getTime() == timestamp.getTime());
-//        //assertFalse("Sanity check failed: timestamp.equals(date)", timestamp.equals(date));
-//        //assertFalse("Sanity check failed: date.equals(timestamp)", date.equals(timestamp));
-//        // real test:
-//        //assertFalse("java.util.Date and java.sql.Timestamp should be equal", ObjectUtils.equals(date, timestamp));
-//    }
-    
-    @Test
-    public void testIdentityToStringStringBuffer() {
-        final Integer i = Integer.valueOf(45);
-        final String expected = "java.lang.Integer@" + Integer.toHexString(System.identityHashCode(i));
-
-        final StringBuffer buffer = new StringBuffer();
-        ObjectUtils.identityToString(buffer, i);
-        assertEquals(expected, buffer.toString());
-
-        try {
-            ObjectUtils.identityToString((StringBuffer)null, "tmp");
-            fail("NullPointerException expected");
-        } catch(final NullPointerException npe) {
-        }
-        try {
-            ObjectUtils.identityToString(new StringBuffer(), null);
-            fail("NullPointerException expected");
-        } catch(final NullPointerException npe) {
-        }
-    }
-    
-    @Test
-    public void testIdentityToStringStringBuilder() {
-        assertEquals(null, ObjectUtils.identityToString(null));
-        assertEquals(
-            "java.lang.String@" + Integer.toHexString(System.identityHashCode(FOO)),
-            ObjectUtils.identityToString(FOO));
-        final Integer i = Integer.valueOf(90);
-        final String expected = "java.lang.Integer@" + Integer.toHexString(System.identityHashCode(i));
-        
-        assertEquals(expected, ObjectUtils.identityToString(i));
-        
-        final StringBuilder builder = new StringBuilder();
-        ObjectUtils.identityToString(builder, i);
-        assertEquals(expected, builder.toString());
-
-        try {
-            ObjectUtils.identityToString((StringBuilder)null, "tmp");
-            fail("NullPointerException expected");
-        } catch(final NullPointerException npe) {
-        }
-        
-        try {
-            ObjectUtils.identityToString(new StringBuilder(), null);
-            fail("NullPointerException expected");
-        } catch(final NullPointerException npe) {
-        }
-    }
-    
-    @Test
-    public void testIdentityToStringStrBuilder() {
-        final Integer i = Integer.valueOf(102);
-        final String expected = "java.lang.Integer@" + Integer.toHexString(System.identityHashCode(i));
-
-        final StrBuilder builder = new StrBuilder();
-        ObjectUtils.identityToString(builder, i);
-        assertEquals(expected, builder.toString());
-
-        try {
-            ObjectUtils.identityToString((StrBuilder)null, "tmp");
-            fail("NullPointerException expected");
-        } catch(final NullPointerException npe) {
-        }
-        
-        try {
-            ObjectUtils.identityToString(new StrBuilder(), null);
-            fail("NullPointerException expected");
-        } catch(final NullPointerException npe) {
-        }
-    }
-    
-    @Test
-    public void testIdentityToStringAppendable() {
-        final Integer i = Integer.valueOf(121);
-        final String expected = "java.lang.Integer@" + Integer.toHexString(System.identityHashCode(i));
-
-        try {
-            final Appendable appendable = new StringBuilder();
-            ObjectUtils.identityToString(appendable, i);
-            assertEquals(expected, appendable.toString());
-        } catch(final IOException ex) {
-            fail("IOException unexpected");
-        }
-        
-        try {
-            ObjectUtils.identityToString((Appendable)null, "tmp");
-            fail("NullPointerException expected");
-        } catch(final NullPointerException npe) {
-        } catch (final IOException ex) {
-        }
-        
-        try {
-            ObjectUtils.identityToString((Appendable)(new StringBuilder()), null);
-            fail("NullPointerException expected");
-        } catch(final NullPointerException npe) {
-        } catch (final IOException ex) {
-        }
-    }
-
-    @Test
-    public void testToString_Object() {
-        assertEquals("", ObjectUtils.toString((Object) null) );
-        assertEquals(Boolean.TRUE.toString(), ObjectUtils.toString(Boolean.TRUE) );
-    }
-
-    @Test
-    public void testToString_ObjectString() {
-        assertEquals(BAR, ObjectUtils.toString((Object) null, BAR) );
-        assertEquals(Boolean.TRUE.toString(), ObjectUtils.toString(Boolean.TRUE, BAR) );
-    }
-
-    @SuppressWarnings("cast") // 1 OK, because we are checking for code change
-    @Test
-    public void testNull() {
-        assertNotNull(ObjectUtils.NULL);
-        // 1 Check that NULL really is a Null i.e. the definition has not been changed
-        assertTrue(ObjectUtils.NULL instanceof ObjectUtils.Null);
-        assertSame(ObjectUtils.NULL, SerializationUtils.clone(ObjectUtils.NULL));
-    }
-
-    @Test
-    public void testMax() {
-        final Calendar calendar = Calendar.getInstance();
-        final Date nonNullComparable1 = calendar.getTime();
-        final Date nonNullComparable2 = calendar.getTime();
-        final String[] nullAray = null;
-        
-        calendar.set( Calendar.YEAR, calendar.get( Calendar.YEAR ) -1 );
-        final Date minComparable = calendar.getTime();
-        
-        assertNotSame( nonNullComparable1, nonNullComparable2 );
-        
-        assertNull(ObjectUtils.max( (String) null ) );
-        assertNull(ObjectUtils.max( nullAray ) );
-        assertSame( nonNullComparable1, ObjectUtils.max( null, nonNullComparable1 ) );
-        assertSame( nonNullComparable1, ObjectUtils.max( nonNullComparable1, null ) );
-        assertSame( nonNullComparable1, ObjectUtils.max( null, nonNullComparable1, null ) );
-        assertSame( nonNullComparable1, ObjectUtils.max( nonNullComparable1, nonNullComparable2 ) );
-        assertSame( nonNullComparable2, ObjectUtils.max( nonNullComparable2, nonNullComparable1 ) );
-        assertSame( nonNullComparable1, ObjectUtils.max( nonNullComparable1, minComparable ) );
-        assertSame( nonNullComparable1, ObjectUtils.max( minComparable, nonNullComparable1 ) );
-        assertSame( nonNullComparable1, ObjectUtils.max( null, minComparable, null, nonNullComparable1 ) );
-
-        assertNull( ObjectUtils.max((String)null, (String)null) );
-    }
-
-    @Test
-    public void testMin() {
-        final Calendar calendar = Calendar.getInstance();
-        final Date nonNullComparable1 = calendar.getTime();
-        final Date nonNullComparable2 = calendar.getTime();
-        final String[] nullAray = null;
-        
-        calendar.set( Calendar.YEAR, calendar.get( Calendar.YEAR ) -1 );
-        final Date minComparable = calendar.getTime();
-        
-        assertNotSame( nonNullComparable1, nonNullComparable2 );
-        
-        assertNull(ObjectUtils.min( (String) null ) );
-        assertNull(ObjectUtils.min( nullAray ) );
-        assertSame( nonNullComparable1, ObjectUtils.min( null, nonNullComparable1 ) );
-        assertSame( nonNullComparable1, ObjectUtils.min( nonNullComparable1, null ) );
-        assertSame( nonNullComparable1, ObjectUtils.min( null, nonNullComparable1, null ) );
-        assertSame( nonNullComparable1, ObjectUtils.min( nonNullComparable1, nonNullComparable2 ) );
-        assertSame( nonNullComparable2, ObjectUtils.min( nonNullComparable2, nonNullComparable1 ) );
-        assertSame( minComparable, ObjectUtils.min( nonNullComparable1, minComparable ) );
-        assertSame( minComparable, ObjectUtils.min( minComparable, nonNullComparable1 ) );
-        assertSame( minComparable, ObjectUtils.min( null, nonNullComparable1, null, minComparable ) );
-
-        assertNull( ObjectUtils.min((String)null, (String)null) );
-    }
-
-    /**
-     * Tests {@link ObjectUtils#compare(Comparable, Comparable, boolean)}.
-     */
-    @Test
-    public void testCompare() {
-        final Integer one = Integer.valueOf(1);
-        final Integer two = Integer.valueOf(2);
-        final Integer nullValue = null;
-
-        assertEquals("Null Null false", 0, ObjectUtils.compare(nullValue, nullValue));
-        assertEquals("Null Null true",  0, ObjectUtils.compare(nullValue, nullValue, true));
-
-        assertEquals("Null one false", -1, ObjectUtils.compare(nullValue, one));
-        assertEquals("Null one true",   1, ObjectUtils.compare(nullValue, one, true));
-        
-        assertEquals("one Null false", 1, ObjectUtils.compare(one, nullValue));
-        assertEquals("one Null true", -1, ObjectUtils.compare(one, nullValue, true));
-
-        assertEquals("one two false", -1, ObjectUtils.compare(one, two));
-        assertEquals("one two true",  -1, ObjectUtils.compare(one, two, true));
-    }
-
-    @Test
-    public void testMedian() {
-        assertEquals("foo", ObjectUtils.median("foo"));
-        assertEquals("bar", ObjectUtils.median("foo", "bar"));
-        assertEquals("baz", ObjectUtils.median("foo", "bar", "baz"));
-        assertEquals("baz", ObjectUtils.median("foo", "bar", "baz", "blah"));
-        assertEquals("blah", ObjectUtils.median("foo", "bar", "baz", "blah", "wah"));
-        assertEquals(Integer.valueOf(5),
-            ObjectUtils.median(Integer.valueOf(1), Integer.valueOf(5), Integer.valueOf(10)));
-        assertEquals(
-            Integer.valueOf(7),
-            ObjectUtils.median(Integer.valueOf(5), Integer.valueOf(6), Integer.valueOf(7), Integer.valueOf(8),
-                Integer.valueOf(9)));
-        assertEquals(Integer.valueOf(6),
-            ObjectUtils.median(Integer.valueOf(5), Integer.valueOf(6), Integer.valueOf(7), Integer.valueOf(8)));
-    }
-
-    @Test(expected = NullPointerException.class)
-    public void testMedian_nullItems() {
-        ObjectUtils.median((String[]) null);
-    }
-
-    @Test(expected = IllegalArgumentException.class)
-    public void testMedian_emptyItems() {
-        ObjectUtils.<String> median();
-    }
-
-    @Test
-    public void testComparatorMedian() {
-        final CharSequenceComparator cmp = new CharSequenceComparator();
-        final NonComparableCharSequence foo = new NonComparableCharSequence("foo");
-        final NonComparableCharSequence bar = new NonComparableCharSequence("bar");
-        final NonComparableCharSequence baz = new NonComparableCharSequence("baz");
-        final NonComparableCharSequence blah = new NonComparableCharSequence("blah");
-        final NonComparableCharSequence wah = new NonComparableCharSequence("wah");
-        assertSame(foo, ObjectUtils.median(cmp, foo));
-        assertSame(bar, ObjectUtils.median(cmp, foo, bar));
-        assertSame(baz, ObjectUtils.median(cmp, foo, bar, baz));
-        assertSame(baz, ObjectUtils.median(cmp, foo, bar, baz, blah));
-        assertSame(blah, ObjectUtils.median(cmp, foo, bar, baz, blah, wah));
-    }
-
-    @Test(expected = NullPointerException.class)
-    public void testComparatorMedian_nullComparator() {
-        ObjectUtils.median((Comparator<CharSequence>) null, new NonComparableCharSequence("foo"));
-    }
-
-    @Test(expected = NullPointerException.class)
-    public void testComparatorMedian_nullItems() {
-        ObjectUtils.median(new CharSequenceComparator(), (CharSequence[]) null);
-    }
-
-    @Test(expected = IllegalArgumentException.class)
-    public void testComparatorMedian_emptyItems() {
-        ObjectUtils.median(new CharSequenceComparator());
-    }
-
-    @SuppressWarnings("unchecked")
-    @Test
-    public void testMode() {
-        assertNull(ObjectUtils.mode((Object[]) null));
-        assertNull(ObjectUtils.mode());
-        assertNull(ObjectUtils.mode("foo", "bar", "baz"));
-        assertNull(ObjectUtils.mode("foo", "bar", "baz", "foo", "bar"));
-        assertEquals("foo", ObjectUtils.mode("foo", "bar", "baz", "foo"));
-        assertEquals(Integer.valueOf(9),
-            ObjectUtils.mode("foo", "bar", "baz", Integer.valueOf(9), Integer.valueOf(10), Integer.valueOf(9)));
-    }
-
-    /**
-     * Tests {@link ObjectUtils#clone(Object)} with a cloneable object.
-     */
-    @Test
-    public void testCloneOfCloneable() {
-        final CloneableString string = new CloneableString("apache");
-        final CloneableString stringClone = ObjectUtils.clone(string);
-        assertEquals("apache", stringClone.getValue());
-    }
-
-    /**
-     * Tests {@link ObjectUtils#clone(Object)} with a not cloneable object.
-     */
-    @Test
-    public void testCloneOfNotCloneable() {
-        final String string = new String("apache");
-        assertNull(ObjectUtils.clone(string));
-    }
-
-    /**
-     * Tests {@link ObjectUtils#clone(Object)} with an uncloneable object.
-     *
-     * @throws java.lang.Throwable because we expect this to fail
-     */
-    @Test(expected = NoSuchMethodException.class)
-    public void testCloneOfUncloneable() throws Throwable {
-        final UncloneableString string = new UncloneableString("apache");
-        try {
-            ObjectUtils.clone(string);
-            fail("Thrown " + CloneFailedException.class.getName() + " expected");
-        } catch (final CloneFailedException e) {
-            throw e.getCause();
-        }
-    }
-
-    /**
-     * Tests {@link ObjectUtils#clone(Object)} with an object array.
-     */
-    @Test
-    public void testCloneOfStringArray() {
-        assertTrue(Arrays.deepEquals(
-            new String[]{"string"}, ObjectUtils.clone(new String[]{"string"})));
-    }
-
-    /**
-     * Tests {@link ObjectUtils#clone(Object)} with an array of primitives.
-     */
-    @Test
-    public void testCloneOfPrimitiveArray() {
-        assertTrue(Arrays.equals(new int[]{1}, ObjectUtils.clone(new int[]{1})));
-    }
-
-    /**
-     * Tests {@link ObjectUtils#cloneIfPossible(Object)} with a cloneable object.
-     */
-    @Test
-    public void testPossibleCloneOfCloneable() {
-        final CloneableString string = new CloneableString("apache");
-        final CloneableString stringClone = ObjectUtils.cloneIfPossible(string);
-        assertEquals("apache", stringClone.getValue());
-    }
-
-    /**
-     * Tests {@link ObjectUtils#cloneIfPossible(Object)} with a not cloneable object.
-     */
-    @Test
-    public void testPossibleCloneOfNotCloneable() {
-        final String string = new String("apache");
-        assertSame(string, ObjectUtils.cloneIfPossible(string));
-    }
-
-    /**
-     * Tests {@link ObjectUtils#cloneIfPossible(Object)} with an uncloneable object.
-     *
-     * @throws java.lang.Throwable because we expect this to fail
-     */
-    @Test(expected = NoSuchMethodException.class)
-    public void testPossibleCloneOfUncloneable() throws Throwable {
-        final UncloneableString string = new UncloneableString("apache");
-        try {
-            ObjectUtils.cloneIfPossible(string);
-            fail("Thrown " + CloneFailedException.class.getName() + " expected");
-        } catch (final CloneFailedException e) {
-            throw e.getCause();
-        }
-    }
-
-    @Test
-    public void testConstMethods() {
-
-        // To truly test the CONST() method, we'd want to look in the
-        // bytecode to see if the literals were folded into the
-        // class, or if the bytecode kept the method call.
-
-        assertTrue("CONST(boolean)", ObjectUtils.CONST(true));
-        assertEquals("CONST(byte)", (byte) 3, ObjectUtils.CONST((byte) 3));
-        assertEquals("CONST(char)", (char) 3, ObjectUtils.CONST((char) 3));
-        assertEquals("CONST(short)", (short) 3, ObjectUtils.CONST((short) 3));
-        assertEquals("CONST(int)", 3, ObjectUtils.CONST(3));
-        assertEquals("CONST(long)", 3l, ObjectUtils.CONST(3l));
-        assertEquals("CONST(float)", 3f, ObjectUtils.CONST(3f), 0);
-        assertEquals("CONST(double)", 3.0, ObjectUtils.CONST(3.0), 0);
-        assertEquals("CONST(Object)", "abc", ObjectUtils.CONST("abc"));
-
-        // Make sure documentation examples from Javadoc all work
-        // (this fixed a lot of my bugs when I these!)
-        //
-        // My bugs should be in a software engineering textbook
-        // for "Can you screw this up?"  The answer is, yes,
-        // you can even screw this up.  (When you == Julius)
-        // .
-        final boolean MAGIC_FLAG = ObjectUtils.CONST(true);
-        final byte MAGIC_BYTE1 = ObjectUtils.CONST((byte) 127);
-        final byte MAGIC_BYTE2 = ObjectUtils.CONST_BYTE(127);
-        final char MAGIC_CHAR = ObjectUtils.CONST('a');
-        final short MAGIC_SHORT1 = ObjectUtils.CONST((short) 123);
-        final short MAGIC_SHORT2 = ObjectUtils.CONST_SHORT(127);
-        final int MAGIC_INT = ObjectUtils.CONST(123);
-        final long MAGIC_LONG1 = ObjectUtils.CONST(123L);
-        final long MAGIC_LONG2 = ObjectUtils.CONST(3);
-        final float MAGIC_FLOAT = ObjectUtils.CONST(1.0f);
-        final double MAGIC_DOUBLE = ObjectUtils.CONST(1.0);
-        final String MAGIC_STRING = ObjectUtils.CONST("abc");
-
-        assertTrue(MAGIC_FLAG);
-        assertEquals(127, MAGIC_BYTE1);
-        assertEquals(127, MAGIC_BYTE2);
-        assertEquals('a', MAGIC_CHAR);
-        assertEquals(123, MAGIC_SHORT1);
-        assertEquals(127, MAGIC_SHORT2);
-        assertEquals(123, MAGIC_INT);
-        assertEquals(123, MAGIC_LONG1);
-        assertEquals(3, MAGIC_LONG2);
-        assertEquals(1.0f, MAGIC_FLOAT, 0.0f);
-        assertEquals(1.0, MAGIC_DOUBLE, 0.0);
-        assertEquals("abc", MAGIC_STRING);
-
-        try {
-            ObjectUtils.CONST_BYTE(-129);
-            fail("CONST_BYTE(-129): IllegalArgumentException should have been thrown.");
-        } catch (final IllegalArgumentException iae) {
-
-        }
-        try {
-            ObjectUtils.CONST_BYTE(128);
-            fail("CONST_BYTE(128): IllegalArgumentException should have been thrown.");
-        } catch (final IllegalArgumentException iae) {
-
-        }
-        try {
-            ObjectUtils.CONST_SHORT(-32769);
-            fail("CONST_SHORT(-32769): IllegalArgumentException should have been thrown.");
-        } catch (final IllegalArgumentException iae) {
-
-        }
-        try {
-            ObjectUtils.CONST_BYTE(32768);
-            fail("CONST_SHORT(32768): IllegalArgumentException should have been thrown.");
-        } catch (final IllegalArgumentException iae) {
-
-        }
-
-    }
-
-    /**
-     * String that is cloneable.
-     */
-    static final class CloneableString extends MutableObject<String> implements Cloneable {
-        private static final long serialVersionUID = 1L;
-        CloneableString(final String s) {
-            super(s);
-        }
-
-        @Override
-        public CloneableString clone() throws CloneNotSupportedException {
-            return (CloneableString)super.clone();
-        }
-    }
-
-    /**
-     * String that is not cloneable.
-     */
-    static final class UncloneableString extends MutableObject<String> implements Cloneable {
-        private static final long serialVersionUID = 1L;
-        UncloneableString(final String s) {
-            super(s);
-        }
-    }
-
-    static final class NonComparableCharSequence implements CharSequence {
-        final String value;
-
-        /**
-         * Create a new NonComparableCharSequence instance.
-         *
-         * @param value
-         */
-        public NonComparableCharSequence(final String value) {
-            super();
-            Validate.notNull(value);
-            this.value = value;
-        }
-
-        @Override
-        public char charAt(final int arg0) {
-            return value.charAt(arg0);
-        }
-
-        @Override
-        public int length() {
-            return value.length();
-        }
-
-        @Override
-        public CharSequence subSequence(final int arg0, final int arg1) {
-            return value.subSequence(arg0, arg1);
-        }
-
-        @Override
-        public String toString() {
-            return value;
-        }
-    }
-
-    static final class CharSequenceComparator implements Comparator<CharSequence> {
-
-        @Override
-        public int compare(final CharSequence o1, final CharSequence o2) {
-            return o1.toString().compareTo(o2.toString());
-        }
-
-    }
-}
diff --git a/lang/src/test/java/org/apache/commons/lang3/RandomStringUtilsTest.java b/lang/src/test/java/org/apache/commons/lang3/RandomStringUtilsTest.java
deleted file mode 100644
index f9fcd03..0000000
--- a/lang/src/test/java/org/apache/commons/lang3/RandomStringUtilsTest.java
+++ /dev/null
@@ -1,360 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- * 
- *      http://www.apache.org/licenses/LICENSE-2.0
- * 
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.commons.lang3;
-
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertFalse;
-import static org.junit.Assert.assertNotNull;
-import static org.junit.Assert.assertTrue;
-import static org.junit.Assert.fail;
-
-import java.lang.reflect.Constructor;
-import java.lang.reflect.Modifier;
-import java.nio.charset.Charset;
-import java.util.Random;
-
-import org.junit.Test;
-
-/**
- * Unit tests {@link org.apache.commons.lang3.RandomStringUtils}.
- *
- * @version $Id$
- */
-public class RandomStringUtilsTest {
-
-    //-----------------------------------------------------------------------
-    @Test
-    public void testConstructor() {
-        assertNotNull(new RandomStringUtils());
-        final Constructor<?>[] cons = RandomStringUtils.class.getDeclaredConstructors();
-        assertEquals(1, cons.length);
-        assertTrue(Modifier.isPublic(cons[0].getModifiers()));
-        assertTrue(Modifier.isPublic(RandomStringUtils.class.getModifiers()));
-        assertFalse(Modifier.isFinal(RandomStringUtils.class.getModifiers()));
-    }
-    
-    //-----------------------------------------------------------------------
-    /**
-     * Test the implementation
-     */
-    @Test
-    public void testRandomStringUtils() {
-        String r1 = RandomStringUtils.random(50);
-        assertEquals("random(50) length", 50, r1.length());
-        String r2 = RandomStringUtils.random(50);
-        assertEquals("random(50) length", 50, r2.length());
-        assertTrue("!r1.equals(r2)", !r1.equals(r2));
-        
-        r1 = RandomStringUtils.randomAscii(50);
-        assertEquals("randomAscii(50) length", 50, r1.length());
-        for(int i = 0; i < r1.length(); i++) {
-            assertTrue("char between 32 and 127", r1.charAt(i) >= 32 && r1.charAt(i) <= 127);
-        }        
-        r2 = RandomStringUtils.randomAscii(50);
-        assertTrue("!r1.equals(r2)", !r1.equals(r2));
-
-        r1 = RandomStringUtils.randomAlphabetic(50);
-        assertEquals("randomAlphabetic(50)", 50, r1.length());
-        for(int i = 0; i < r1.length(); i++) {
-            assertTrue("r1 contains alphabetic", Character.isLetter(r1.charAt(i)) && !Character.isDigit(r1.charAt(i)));
-        }
-        r2 = RandomStringUtils.randomAlphabetic(50);
-        assertTrue("!r1.equals(r2)", !r1.equals(r2));
-        
-        r1 = RandomStringUtils.randomAlphanumeric(50);
-        assertEquals("randomAlphanumeric(50)", 50, r1.length());
-        for(int i = 0; i < r1.length(); i++) {
-            assertTrue("r1 contains alphanumeric", Character.isLetterOrDigit(r1.charAt(i)));
-        }
-        r2 = RandomStringUtils.randomAlphabetic(50);
-        assertTrue("!r1.equals(r2)", !r1.equals(r2));
-        
-        r1 = RandomStringUtils.randomNumeric(50);
-        assertEquals("randomNumeric(50)", 50, r1.length());
-        for(int i = 0; i < r1.length(); i++) {
-            assertTrue("r1 contains numeric", Character.isDigit(r1.charAt(i)) && !Character.isLetter(r1.charAt(i)));
-        }
-        r2 = RandomStringUtils.randomNumeric(50);
-        assertTrue("!r1.equals(r2)", !r1.equals(r2));
-        
-        String set = "abcdefg";
-        r1 = RandomStringUtils.random(50, set);
-        assertEquals("random(50, \"abcdefg\")", 50, r1.length());
-        for(int i = 0; i < r1.length(); i++) {
-            assertTrue("random char in set", set.indexOf(r1.charAt(i)) > -1);
-        }
-        r2 = RandomStringUtils.random(50, set);
-        assertTrue("!r1.equals(r2)", !r1.equals(r2));
-        
-        r1 = RandomStringUtils.random(50, (String) null);
-        assertEquals("random(50) length", 50, r1.length());
-        r2 = RandomStringUtils.random(50, (String) null);
-        assertEquals("random(50) length", 50, r2.length());
-        assertTrue("!r1.equals(r2)", !r1.equals(r2));
-        
-        set = "stuvwxyz";
-        r1 = RandomStringUtils.random(50, set.toCharArray());
-        assertEquals("random(50, \"stuvwxyz\")", 50, r1.length());
-        for(int i = 0; i < r1.length(); i++) {
-            assertTrue("random char in set", set.indexOf(r1.charAt(i)) > -1);
-        }
-        r2 = RandomStringUtils.random(50, set);
-        assertTrue("!r1.equals(r2)", !r1.equals(r2));
-        
-        r1 = RandomStringUtils.random(50, (char[]) null);
-        assertEquals("random(50) length", 50, r1.length());
-        r2 = RandomStringUtils.random(50, (char[]) null);
-        assertEquals("random(50) length", 50, r2.length());
-        assertTrue("!r1.equals(r2)", !r1.equals(r2));
-
-        final long seed = System.currentTimeMillis();
-        r1 = RandomStringUtils.random(50,0,0,true,true,null,new Random(seed));
-        r2 = RandomStringUtils.random(50,0,0,true,true,null,new Random(seed));
-        assertEquals("r1.equals(r2)", r1, r2);
-
-        r1 = RandomStringUtils.random(0);
-        assertEquals("random(0).equals(\"\")", "", r1);
-    }
-
-    @Test
-    public void testLANG805() {
-        final long seed = System.currentTimeMillis();
-        assertEquals("aaa", RandomStringUtils.random(3,0,0,false,false,new char[]{'a'},new Random(seed)));
-    }
-
-    @Test
-    public void testLANG807() {
-        try {
-            RandomStringUtils.random(3,5,5,false,false);
-            fail("Expected IllegalArgumentException");
-        } catch (final IllegalArgumentException ex) { // distinguish from Random#nextInt message
-            final String msg = ex.getMessage();
-            assertTrue("Message (" + msg + ") must contain 'start'", msg.contains("start"));
-            assertTrue("Message (" + msg + ") must contain 'end'", msg.contains("end"));
-        }
-    }
-
-    @Test
-    public void testExceptions() {
-        final char[] DUMMY = new char[]{'a'}; // valid char array
-        try {
-            RandomStringUtils.random(-1);
-            fail();
-        } catch (final IllegalArgumentException ex) {}
-        try {
-            RandomStringUtils.random(-1, true, true);
-            fail();
-        } catch (final IllegalArgumentException ex) {}
-        try {
-            RandomStringUtils.random(-1, DUMMY);
-            fail();
-        } catch (final IllegalArgumentException ex) {}
-        try {
-            RandomStringUtils.random(1, new char[0]); // must not provide empty array => IAE
-            fail();
-        } catch (final IllegalArgumentException ex) {}
-        try {
-            RandomStringUtils.random(-1, "");
-            fail();
-        } catch (final IllegalArgumentException ex) {}
-        try {
-            RandomStringUtils.random(-1, (String)null);
-            fail();
-        } catch (final IllegalArgumentException ex) {}
-        try {
-            RandomStringUtils.random(-1, 'a', 'z', false, false);
-            fail();
-        } catch (final IllegalArgumentException ex) {}
-        try {
-            RandomStringUtils.random(-1, 'a', 'z', false, false, DUMMY);
-            fail();
-        } catch (final IllegalArgumentException ex) {}
-        try {
-            RandomStringUtils.random(-1, 'a', 'z', false, false, DUMMY, new Random());
-            fail();
-        } catch (final IllegalArgumentException ex) {}
-    }
-    
-    /**
-     * Make sure boundary alphanumeric characters are generated by randomAlphaNumeric
-     * This test will fail randomly with probability = 6 * (61/62)**1000 ~ 5.2E-7
-     */  
-    @Test
-    public void testRandomAlphaNumeric() {
-        final char[] testChars = {'a', 'z', 'A', 'Z', '0', '9'};
-        final boolean[] found = {false, false, false, false, false, false};
-        for (int i = 0; i < 100; i++) {
-            final String randString = RandomStringUtils.randomAlphanumeric(10);
-            for (int j = 0; j < testChars.length; j++) {
-                if (randString.indexOf(testChars[j]) > 0) {
-                    found[j] = true;
-                }
-            }
-        }
-        for (int i = 0; i < testChars.length; i++) {
-            if (!found[i]) {
-                fail("alphanumeric character not generated in 1000 attempts: " 
-                   + testChars[i] +" -- repeated failures indicate a problem ");
-            }
-        }
-    }
-    
-    /**
-     * Make sure '0' and '9' are generated by randomNumeric
-     * This test will fail randomly with probability = 2 * (9/10)**1000 ~ 3.5E-46
-     */  
-    @Test
-    public void testRandomNumeric() {
-        final char[] testChars = {'0','9'};
-        final boolean[] found = {false, false};
-        for (int i = 0; i < 100; i++) {
-            final String randString = RandomStringUtils.randomNumeric(10);
-            for (int j = 0; j < testChars.length; j++) {
-                if (randString.indexOf(testChars[j]) > 0) {
-                    found[j] = true;
-                }
-            }
-        }
-        for (int i = 0; i < testChars.length; i++) {
-            if (!found[i]) {
-                fail("digit not generated in 1000 attempts: " 
-                   + testChars[i] +" -- repeated failures indicate a problem ");
-            }
-        }  
-    }
-    
-    /**
-     * Make sure boundary alpha characters are generated by randomAlphabetic
-     * This test will fail randomly with probability = 4 * (51/52)**1000 ~ 1.58E-8
-     */  
-    @Test
-    public void testRandomAlphabetic() {
-        final char[] testChars = {'a', 'z', 'A', 'Z'};
-        final boolean[] found = {false, false, false, false};
-        for (int i = 0; i < 100; i++) {
-            final String randString = RandomStringUtils.randomAlphabetic(10);
-            for (int j = 0; j < testChars.length; j++) {
-                if (randString.indexOf(testChars[j]) > 0) {
-                    found[j] = true;
-                }
-            }
-        }
-        for (int i = 0; i < testChars.length; i++) {
-            if (!found[i]) {
-                fail("alphanumeric character not generated in 1000 attempts: " 
-                   + testChars[i] +" -- repeated failures indicate a problem ");
-            }
-        }
-    }
-    
-    /**
-     * Make sure 32 and 127 are generated by randomNumeric
-     * This test will fail randomly with probability = 2*(95/96)**1000 ~ 5.7E-5
-     */  
-    @Test
-    public void testRandomAscii() {
-        final char[] testChars = {(char) 32, (char) 126};
-        final boolean[] found = {false, false};
-        for (int i = 0; i < 100; i++) {
-            final String randString = RandomStringUtils.randomAscii(10);
-            for (int j = 0; j < testChars.length; j++) {
-                if (randString.indexOf(testChars[j]) > 0) {
-                    found[j] = true;
-                }
-            }
-        }
-        for (int i = 0; i < testChars.length; i++) {
-            if (!found[i]) {
-                fail("ascii character not generated in 1000 attempts: " 
-                + (int) testChars[i] + 
-                 " -- repeated failures indicate a problem");
-            }
-        }  
-    }
-    
-    /** 
-     * Test homogeneity of random strings generated --
-     * i.e., test that characters show up with expected frequencies
-     * in generated strings.  Will fail randomly about 1 in 1000 times.
-     * Repeated failures indicate a problem.
-     */
-    @Test
-    public void testRandomStringUtilsHomog() {
-        final String set = "abc";
-        final char[] chars = set.toCharArray();
-        String gen = "";
-        final int[] counts = {0,0,0};
-        final int[] expected = {200,200,200};
-        for (int i = 0; i< 100; i++) {
-           gen = RandomStringUtils.random(6,chars);
-           for (int j = 0; j < 6; j++) {
-               switch (gen.charAt(j)) {
-                   case 'a': {counts[0]++; break;}
-                   case 'b': {counts[1]++; break;}
-                   case 'c': {counts[2]++; break;}
-                   default: {fail("generated character not in set");}
-               }
-           }
-        } 
-        // Perform chi-square test with df = 3-1 = 2, testing at .001 level
-        assertTrue("test homogeneity -- will fail about 1 in 1000 times",
-            chiSquare(expected,counts) < 13.82);  
-    }
-    
-    /**
-     * Computes Chi-Square statistic given observed and expected counts
-     * @param observed array of observed frequency counts
-     * @param expected array of expected frequency counts
-     */
-    private double chiSquare(final int[] expected, final int[] observed) {
-        double sumSq = 0.0d;
-        double dev = 0.0d;
-        for (int i = 0; i < observed.length; i++) {
-            dev = observed[i] - expected[i];
-            sumSq += dev * dev / expected[i];
-        }
-        return sumSq;
-    }           
-
-    /**
-     * Checks if the string got by {@link RandomStringUtils#random(int)}
-     * can be converted to UTF-8 and back without loss.
-     *
-     * @see <a href="http://issues.apache.org/jira/browse/LANG-100">LANG-100</a>
-     */
-    @Test
-    public void testLang100() {
-        final int size = 5000;
-        final Charset charset = Charset.forName("UTF-8");
-        final String orig = RandomStringUtils.random(size);
-        final byte[] bytes = orig.getBytes(charset);
-        final String copy = new String(bytes, charset);
-
-        // for a verbose compare:
-        for (int i=0; i < orig.length() && i < copy.length(); i++) {
-            final char o = orig.charAt(i);
-            final char c = copy.charAt(i);
-            assertEquals("differs at " + i + "(" + Integer.toHexString(new Character(o).hashCode()) + "," +
-            Integer.toHexString(new Character(c).hashCode()) + ")", o, c);
-        }
-        // compare length also
-        assertEquals(orig.length(), copy.length());
-        // just to be complete
-        assertEquals(orig, copy);
-    }
-}
-
diff --git a/lang/src/test/java/org/apache/commons/lang3/RandomUtilsTest.java b/lang/src/test/java/org/apache/commons/lang3/RandomUtilsTest.java
deleted file mode 100644
index f1080c9..0000000
--- a/lang/src/test/java/org/apache/commons/lang3/RandomUtilsTest.java
+++ /dev/null
@@ -1,204 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.commons.lang3;
-
-import static org.junit.Assert.assertArrayEquals;
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertTrue;
-
-import org.junit.Test;
-
-/**
- * Tests for {@link RandomUtils}
- *
- * @version $Id$
- */
-public class RandomUtilsTest {
-
-    /**
-     * For comparing doubles and floats
-     */
-    private static final double DELTA = 1e-5;
-
-
-    @Test(expected = IllegalArgumentException.class)
-    public void testNextBytesNegative() throws Exception {
-        RandomUtils.nextBytes(-1);
-    }
-
-    @Test(expected = IllegalArgumentException.class)
-    public void testNextIntNegative() throws Exception {
-        RandomUtils.nextInt(-1, 1);
-    }
-
-    @Test(expected = IllegalArgumentException.class)
-    public void testNextLongNegative() throws Exception {
-        RandomUtils.nextLong(-1, 1);
-    }
-
-    @Test(expected = IllegalArgumentException.class)
-    public void testNextDoubleNegative() throws Exception {
-        RandomUtils.nextDouble(-1, 1);
-    }
-
-    @Test(expected = IllegalArgumentException.class)
-    public void testNextFloatNegative() throws Exception {
-        RandomUtils.nextFloat(-1, 1);
-    }
-
-    @Test(expected = IllegalArgumentException.class)
-    public void testNextIntLowerGreaterUpper() throws Exception {
-        RandomUtils.nextInt(2, 1);
-    }
-
-    @Test(expected = IllegalArgumentException.class)
-    public void testNextLongLowerGreaterUpper() throws Exception {
-        RandomUtils.nextLong(2, 1);
-    }
-
-    @Test(expected = IllegalArgumentException.class)
-    public void testNextDoubleLowerGreaterUpper() throws Exception {
-        RandomUtils.nextDouble(2, 1);
-    }
-
-    @Test(expected = IllegalArgumentException.class)
-    public void testNextFloatLowerGreaterUpper() throws Exception {
-        RandomUtils.nextFloat(2, 1);
-    }
-
-    /**
-     * Tests a zero byte array length.
-     */
-    @Test
-    public void testZeroLengthNextBytes() {
-        assertArrayEquals(new byte[0], RandomUtils.nextBytes(0));
-    }
-
-    /**
-     * Tests random byte array.
-     */
-    @Test
-    public void testNextBytes() {
-        final byte[] result = RandomUtils.nextBytes(20);
-        assertEquals(20, result.length);
-    }
-
-    /**
-     * Test next int range with minimal range.
-     */
-    @Test
-    public void testNextIntMinimalRange() {
-        assertEquals(42, RandomUtils.nextInt(42, 42));
-    }
-    
-    /**
-     * Tests next int range.
-     */
-    @Test
-    public void testNextInt() {
-        final int result = RandomUtils.nextInt(33, 42);
-        assertTrue(result >= 33 && result < 42);
-    }
-    
-    /**
-     * Test next double range with minimal range.
-     */
-    @Test
-    public void testNextDoubleMinimalRange() {
-        assertEquals(42.1, RandomUtils.nextDouble(42.1, 42.1), DELTA);
-    }    
-    
-    /**
-     * Test next float range with minimal range.
-     */
-    @Test
-    public void testNextFloatMinimalRange() {
-        assertEquals(42.1f, RandomUtils.nextFloat(42.1f, 42.1f), DELTA);
-    }     
-    
-    /**
-     * Tests next double range.
-     */
-    @Test
-    public void testNextDouble() {
-        final double result = RandomUtils.nextDouble(33d, 42d);
-        assertTrue(result >= 33d && result <= 42d);
-    }
-    
-    /**
-     * Tests next float range.
-     */
-    @Test
-    public void testNextFloat() {
-        final double result = RandomUtils.nextFloat(33f, 42f);
-        assertTrue(result >= 33f && result <= 42f);
-    }    
-
-    /**
-     * Test next long range with minimal range.
-     */
-    @Test
-    public void testNextLongMinimalRange() {
-        assertEquals(42L, RandomUtils.nextLong(42L, 42L));
-    }
-    
-    /**
-     * Tests next long range.
-     */
-    @Test
-    public void testNextLong() {
-        final long result = RandomUtils.nextLong(33L, 42L);
-        assertTrue(result >= 33L && result < 42L);
-    }
-    
-    
-    /**
-     * Tests extreme range.
-     */
-    @Test
-    public void testExtremeRangeInt() {
-        final int result = RandomUtils.nextInt(0, Integer.MAX_VALUE);
-        assertTrue(result >= 0 && result < Integer.MAX_VALUE);
-    }
-    
-    /**
-     * Tests extreme range.
-     */
-    @Test
-    public void testExtremeRangeLong() {
-        final long result = RandomUtils.nextLong(0, Long.MAX_VALUE);
-        assertTrue(result >= 0 && result < Long.MAX_VALUE);
-    }    
-    
-    /**
-     * Tests extreme range.
-     */
-    @Test
-    public void testExtremeRangeFloat() {
-        final float result = RandomUtils.nextFloat(0, Float.MAX_VALUE);
-        assertTrue(result >= 0f && result <= Float.MAX_VALUE);
-    }    
-    
-    /**
-     * Tests extreme range.
-     */
-    @Test
-    public void testExtremeRangeDouble() {
-        final double result = RandomUtils.nextDouble(0, Double.MAX_VALUE);
-        assertTrue(result >= 0 && result <= Double.MAX_VALUE);
-    }    
-}
diff --git a/lang/src/test/java/org/apache/commons/lang3/RangeTest.java b/lang/src/test/java/org/apache/commons/lang3/RangeTest.java
deleted file mode 100644
index 16d49e2..0000000
--- a/lang/src/test/java/org/apache/commons/lang3/RangeTest.java
+++ /dev/null
@@ -1,380 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- * 
- *      http://www.apache.org/licenses/LICENSE-2.0
- * 
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package org.apache.commons.lang3;
-
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertFalse;
-import static org.junit.Assert.assertNotNull;
-import static org.junit.Assert.assertSame;
-import static org.junit.Assert.assertTrue;
-import static org.junit.Assert.fail;
-
-import java.util.Comparator;
-
-import org.junit.Before;
-import org.junit.Test;
-
-/**
- * <p>
- * Tests the methods in the {@link org.apache.commons.lang3.Range} class.
- * </p>
- * 
- * @version $Id$
- */
-@SuppressWarnings("boxing")
-public class RangeTest {
-
-    private Range<Byte> byteRange;
-    private Range<Byte> byteRange2;
-    private Range<Byte> byteRange3;
-
-    private Range<Integer> intRange;
-    private Range<Long> longRange;
-    private Range<Float> floatRange;
-    private Range<Double> doubleRange;
-
-    @SuppressWarnings("cast") // intRange
-    @Before
-    public void setUp() {
-        byteRange   = Range.between((byte) 0, (byte) 5);
-        byteRange2  = Range.between((byte) 0, (byte) 5);
-        byteRange3  = Range.between((byte) 0, (byte) 10);
-
-        intRange    = Range.between((int) 10, (int) 20);
-        longRange   = Range.between((long) 10, (long) 20);
-        floatRange  = Range.between((float) 10, (float) 20);
-        doubleRange = Range.between((double) 10, (double) 20);
-    }
-
-    //-----------------------------------------------------------------------
-    @SuppressWarnings({ "rawtypes", "unchecked" })
-    @Test
-    public void testComparableConstructors() {
-        final Comparable c = 
-            new Comparable() { 
-                @Override
-                public int compareTo(final Object other) {
-                    return 1;
-                }
-            };
-        final Range r1 = Range.is(c);
-        final Range r2 = Range.between(c, c);
-        assertEquals(true, r1.isNaturalOrdering());
-        assertEquals(true, r2.isNaturalOrdering());
-    }
-
-    @Test
-    public void testIsWithCompare(){
-        final Comparator<Integer> c = new Comparator<Integer>(){
-            @Override
-            public int compare(final Integer o1, final Integer o2) {
-                return 0; // all integers are equal
-            }
-        };
-        Range<Integer> ri = Range.is(10);
-        assertFalse("should not contain null",ri.contains(null));
-        assertTrue("should contain 10",ri.contains(10));
-        assertFalse("should not contain 11",ri.contains(11));
-        ri = Range.is(10,c);
-        assertFalse("should not contain null",ri.contains(null));
-        assertTrue("should contain 10",ri.contains(10));
-        assertTrue("should contain 11",ri.contains(11));
-    }
-
-    @Test
-    public void testBetweenWithCompare(){
-        // TODO add tests with a better comparator
-        final Comparator<Integer> c = new Comparator<Integer>(){
-            @Override
-            public int compare(final Integer o1, final Integer o2) {
-                return 0; // all integers are equal
-            }
-        };
-        Range<Integer> rb = Range.between(-10,20);
-        assertFalse("should not contain null",rb.contains(null));
-        assertTrue("should contain 10",rb.contains(10));
-        assertTrue("should contain -10",rb.contains(-10));
-        assertFalse("should not contain 21",rb.contains(21));
-        assertFalse("should not contain -11",rb.contains(-11));
-        rb = Range.between(-10,20,c);
-        assertFalse("should not contain null",rb.contains(null));
-        assertTrue("should contain 10",rb.contains(10));
-        assertTrue("should contain -10",rb.contains(-10));
-        assertTrue("should contain 21",rb.contains(21));
-        assertTrue("should contain -11",rb.contains(-11));
-    }
-
-    //-----------------------------------------------------------------------
-    @Test
-    public void testRangeOfChars() {
-        final Range<Character> chars = Range.between('a', 'z');
-        assertTrue(chars.contains('b'));
-        assertFalse(chars.contains('B'));
-    }
-
-    //-----------------------------------------------------------------------
-    @Test
-    public void testEqualsObject() {
-        assertEquals(byteRange, byteRange);
-        assertEquals(byteRange, byteRange2);
-        assertEquals(byteRange2, byteRange2);
-        assertTrue(byteRange.equals(byteRange));
-        assertTrue(byteRange2.equals(byteRange2));
-        assertTrue(byteRange3.equals(byteRange3));
-        assertFalse(byteRange2.equals(byteRange3));
-        assertFalse(byteRange2.equals(null));
-        assertFalse(byteRange2.equals("Ni!"));
-    }
-
-    @Test
-    public void testHashCode() {
-        assertEquals(byteRange.hashCode(), byteRange2.hashCode());
-        assertFalse(byteRange.hashCode() == byteRange3.hashCode());
-        
-        assertEquals(intRange.hashCode(), intRange.hashCode());
-        assertTrue(intRange.hashCode() != 0);
-    }
-
-    @Test
-    public void testToString() {
-        assertNotNull(byteRange.toString());
-        
-        final String str = intRange.toString();
-        assertEquals("[10..20]", str);
-        assertEquals("[-20..-10]", Range.between(-20, -10).toString());
-    }
-
-    @Test
-    public void testToStringFormat() {
-        final String str = intRange.toString("From %1$s to %2$s");
-        assertEquals("From 10 to 20", str);
-    }
-
-    //-----------------------------------------------------------------------
-    @Test
-    public void testGetMinimum() {
-        assertEquals(10, (int) intRange.getMinimum());
-        assertEquals(10L, (long) longRange.getMinimum());
-        assertEquals(10f, floatRange.getMinimum(), 0.00001f);
-        assertEquals(10d, doubleRange.getMinimum(), 0.00001d);
-    }
-
-    @Test
-    public void testGetMaximum() {
-        assertEquals(20, (int) intRange.getMaximum());
-        assertEquals(20L, (long) longRange.getMaximum());
-        assertEquals(20f, floatRange.getMaximum(), 0.00001f);
-        assertEquals(20d, doubleRange.getMaximum(), 0.00001d);
-    }
-
-    @Test
-    public void testContains() {
-        assertFalse(intRange.contains(null));
-        
-        assertFalse(intRange.contains(5));
-        assertTrue(intRange.contains(10));
-        assertTrue(intRange.contains(15));
-        assertTrue(intRange.contains(20));
-        assertFalse(intRange.contains(25));
-    }
-
-    @Test
-    public void testIsAfter() {
-        assertFalse(intRange.isAfter(null));
-        
-        assertTrue(intRange.isAfter(5));
-        assertFalse(intRange.isAfter(10));
-        assertFalse(intRange.isAfter(15));
-        assertFalse(intRange.isAfter(20));
-        assertFalse(intRange.isAfter(25));
-    }
-
-    @Test
-    public void testIsStartedBy() {
-        assertFalse(intRange.isStartedBy(null));
-        
-        assertFalse(intRange.isStartedBy(5));
-        assertTrue(intRange.isStartedBy(10));
-        assertFalse(intRange.isStartedBy(15));
-        assertFalse(intRange.isStartedBy(20));
-        assertFalse(intRange.isStartedBy(25));
-    }
-
-    @Test
-    public void testIsEndedBy() {
-        assertFalse(intRange.isEndedBy(null));
-        
-        assertFalse(intRange.isEndedBy(5));
-        assertFalse(intRange.isEndedBy(10));
-        assertFalse(intRange.isEndedBy(15));
-        assertTrue(intRange.isEndedBy(20));
-        assertFalse(intRange.isEndedBy(25));
-    }
-
-    @Test
-    public void testIsBefore() {
-        assertFalse(intRange.isBefore(null));
-        
-        assertFalse(intRange.isBefore(5));
-        assertFalse(intRange.isBefore(10));
-        assertFalse(intRange.isBefore(15));
-        assertFalse(intRange.isBefore(20));
-        assertTrue(intRange.isBefore(25));
-    }
-
-    @Test
-    public void testElementCompareTo() {
-        try {
-            intRange.elementCompareTo(null);
-            fail("NullPointerException should have been thrown");
-        } catch(final NullPointerException npe) {
-            // expected
-        }
-        
-        assertEquals(-1, intRange.elementCompareTo(5));
-        assertEquals(0, intRange.elementCompareTo(10));
-        assertEquals(0, intRange.elementCompareTo(15));
-        assertEquals(0, intRange.elementCompareTo(20));
-        assertEquals(1, intRange.elementCompareTo(25));
-    }
-
-    //-----------------------------------------------------------------------
-    @Test
-    public void testContainsRange() {
-
-        // null handling
-        assertFalse(intRange.containsRange(null));
-
-        // easy inside range
-        assertTrue(intRange.containsRange(Range.between(12, 18)));
-
-        // outside range on each side
-        assertFalse(intRange.containsRange(Range.between(32, 45)));
-        assertFalse(intRange.containsRange(Range.between(2, 8)));
-
-        // equals range
-        assertTrue(intRange.containsRange(Range.between(10, 20)));
-
-        // overlaps
-        assertFalse(intRange.containsRange(Range.between(9, 14)));
-        assertFalse(intRange.containsRange(Range.between(16, 21)));
-
-        // touches lower boundary
-        assertTrue(intRange.containsRange(Range.between(10, 19)));
-        assertFalse(intRange.containsRange(Range.between(10, 21)));
-
-        // touches upper boundary
-        assertTrue(intRange.containsRange(Range.between(11, 20)));
-        assertFalse(intRange.containsRange(Range.between(9, 20)));
-        
-        // negative
-        assertFalse(intRange.containsRange(Range.between(-11, -18)));
-    }
-
-    @Test
-    public void testIsAfterRange() {
-        assertFalse(intRange.isAfterRange(null));
-        
-        assertTrue(intRange.isAfterRange(Range.between(5, 9)));
-        
-        assertFalse(intRange.isAfterRange(Range.between(5, 10)));
-        assertFalse(intRange.isAfterRange(Range.between(5, 20)));
-        assertFalse(intRange.isAfterRange(Range.between(5, 25)));
-        assertFalse(intRange.isAfterRange(Range.between(15, 25)));
-        
-        assertFalse(intRange.isAfterRange(Range.between(21, 25)));
-        
-        assertFalse(intRange.isAfterRange(Range.between(10, 20)));
-    }
-
-    @Test
-    public void testIsOverlappedBy() {
-
-        // null handling
-        assertFalse(intRange.isOverlappedBy(null));
-
-        // easy inside range
-        assertTrue(intRange.isOverlappedBy(Range.between(12, 18)));
-
-        // outside range on each side
-        assertFalse(intRange.isOverlappedBy(Range.between(32, 45)));
-        assertFalse(intRange.isOverlappedBy(Range.between(2, 8)));
-
-        // equals range
-        assertTrue(intRange.isOverlappedBy(Range.between(10, 20)));
-
-        // overlaps
-        assertTrue(intRange.isOverlappedBy(Range.between(9, 14)));
-        assertTrue(intRange.isOverlappedBy(Range.between(16, 21)));
-
-        // touches lower boundary
-        assertTrue(intRange.isOverlappedBy(Range.between(10, 19)));
-        assertTrue(intRange.isOverlappedBy(Range.between(10, 21)));
-
-        // touches upper boundary
-        assertTrue(intRange.isOverlappedBy(Range.between(11, 20)));
-        assertTrue(intRange.isOverlappedBy(Range.between(9, 20)));
-        
-        // negative
-        assertFalse(intRange.isOverlappedBy(Range.between(-11, -18)));
-    }
-
-    @Test
-    public void testIsBeforeRange() {
-        assertFalse(intRange.isBeforeRange(null));
-        
-        assertFalse(intRange.isBeforeRange(Range.between(5, 9)));
-        
-        assertFalse(intRange.isBeforeRange(Range.between(5, 10)));
-        assertFalse(intRange.isBeforeRange(Range.between(5, 20)));
-        assertFalse(intRange.isBeforeRange(Range.between(5, 25)));
-        assertFalse(intRange.isBeforeRange(Range.between(15, 25)));
-        
-        assertTrue(intRange.isBeforeRange(Range.between(21, 25)));
-        
-        assertFalse(intRange.isBeforeRange(Range.between(10, 20)));
-    }
-
-    @Test
-    public void testIntersectionWith() {
-        assertSame(intRange, intRange.intersectionWith(intRange));
-        assertSame(byteRange, byteRange.intersectionWith(byteRange));
-        assertSame(longRange, longRange.intersectionWith(longRange));
-        assertSame(floatRange, floatRange.intersectionWith(floatRange));
-        assertSame(doubleRange, doubleRange.intersectionWith(doubleRange));
-
-        assertEquals(Range.between(10, 15), intRange.intersectionWith(Range.between(5, 15)));
-    }
-
-    @Test(expected = IllegalArgumentException.class)
-    public void testIntersectionWithNull() {
-        intRange.intersectionWith(null);
-    }
-
-    @Test(expected = IllegalArgumentException.class)
-    public void testIntersectionWithNonOverlapping() {
-        intRange.intersectionWith(Range.between(0, 9));
-    }
-
-    //-----------------------------------------------------------------------
-    @Test
-    public void testSerializing() {
-        SerializationUtils.clone(intRange);
-    }
-
-}
diff --git a/lang/src/test/java/org/apache/commons/lang3/SerializationUtilsTest.java b/lang/src/test/java/org/apache/commons/lang3/SerializationUtilsTest.java
deleted file mode 100644
index 0e82ded..0000000
--- a/lang/src/test/java/org/apache/commons/lang3/SerializationUtilsTest.java
+++ /dev/null
@@ -1,435 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- * 
- *      http://www.apache.org/licenses/LICENSE-2.0
- * 
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.commons.lang3;
-
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertFalse;
-import static org.junit.Assert.assertNotNull;
-import static org.junit.Assert.assertNull;
-import static org.junit.Assert.assertSame;
-import static org.junit.Assert.assertTrue;
-import static org.junit.Assert.fail;
-
-import java.io.ByteArrayInputStream;
-import java.io.ByteArrayOutputStream;
-import java.io.IOException;
-import java.io.InputStream;
-import java.io.ObjectInputStream;
-import java.io.ObjectOutputStream;
-import java.io.OutputStream;
-import java.io.Serializable;
-import java.lang.reflect.Constructor;
-import java.lang.reflect.Modifier;
-import java.util.HashMap;
-
-import org.junit.Assert;
-import org.junit.Before;
-import org.junit.Test;
-
-/**
- * Unit tests {@link org.apache.commons.lang3.SerializationUtils}.
- *
- * @version $Id$
- */
-public class SerializationUtilsTest {
-
-  static final String CLASS_NOT_FOUND_MESSAGE = "ClassNotFoundSerialization.readObject fake exception";
-    protected static final String SERIALIZE_IO_EXCEPTION_MESSAGE = "Anonymous OutputStream I/O exception";
-  
-    private String iString;
-    private Integer iInteger;
-    private HashMap<Object, Object> iMap;
-
-    @Before
-    public void setUp() {
-        iString = "foo";
-        iInteger = Integer.valueOf(7);
-        iMap = new HashMap<Object, Object>();
-        iMap.put("FOO", iString);
-        iMap.put("BAR", iInteger);
-    }
-
-    //-----------------------------------------------------------------------
-
-    @Test
-    public void testConstructor() {
-        assertNotNull(new SerializationUtils());
-        final Constructor<?>[] cons = SerializationUtils.class.getDeclaredConstructors();
-        assertEquals(1, cons.length);
-        assertTrue(Modifier.isPublic(cons[0].getModifiers()));
-        assertTrue(Modifier.isPublic(SerializationUtils.class.getModifiers()));
-        assertFalse(Modifier.isFinal(SerializationUtils.class.getModifiers()));
-    }
-    
-    @Test
-    public void testException() {
-        SerializationException serEx;
-        final Exception ex = new Exception();
-        
-        serEx = new SerializationException();
-        assertSame(null, serEx.getMessage());
-        assertSame(null, serEx.getCause());
-        
-        serEx = new SerializationException("Message");
-        assertSame("Message", serEx.getMessage());
-        assertSame(null, serEx.getCause());
-        
-        serEx = new SerializationException(ex);
-        assertEquals("java.lang.Exception", serEx.getMessage());
-        assertSame(ex, serEx.getCause());
-        
-        serEx = new SerializationException("Message", ex);
-        assertSame("Message", serEx.getMessage());
-        assertSame(ex, serEx.getCause());
-    }
-    
-    //-----------------------------------------------------------------------
-
-    @Test
-    public void testSerializeStream() throws Exception {
-        final ByteArrayOutputStream streamTest = new ByteArrayOutputStream();
-        SerializationUtils.serialize(iMap, streamTest);
-
-        final ByteArrayOutputStream streamReal = new ByteArrayOutputStream();
-        final ObjectOutputStream oos = new ObjectOutputStream(streamReal);
-        oos.writeObject(iMap);
-        oos.flush();
-        oos.close();
-
-        final byte[] testBytes = streamTest.toByteArray();
-        final byte[] realBytes = streamReal.toByteArray();
-        assertEquals(testBytes.length, realBytes.length);
-        for (int i = 0; i < realBytes.length; i++) {
-            assertEquals(realBytes[i], testBytes[i]);
-        }
-    }
-
-    @Test
-    public void testSerializeStreamUnserializable() throws Exception {
-        final ByteArrayOutputStream streamTest = new ByteArrayOutputStream();
-        try {
-            iMap.put(new Object(), new Object());
-            SerializationUtils.serialize(iMap, streamTest);
-        } catch (final SerializationException ex) {
-            return;
-        }
-        fail();
-    }
-
-    @Test
-    public void testSerializeStreamNullObj() throws Exception {
-        final ByteArrayOutputStream streamTest = new ByteArrayOutputStream();
-        SerializationUtils.serialize(null, streamTest);
-
-        final ByteArrayOutputStream streamReal = new ByteArrayOutputStream();
-        final ObjectOutputStream oos = new ObjectOutputStream(streamReal);
-        oos.writeObject(null);
-        oos.flush();
-        oos.close();
-
-        final byte[] testBytes = streamTest.toByteArray();
-        final byte[] realBytes = streamReal.toByteArray();
-        assertEquals(testBytes.length, realBytes.length);
-        for (int i = 0; i < realBytes.length; i++) {
-            assertEquals(realBytes[i], testBytes[i]);
-        }
-    }
-
-    @Test
-    public void testSerializeStreamObjNull() throws Exception {
-        try {
-            SerializationUtils.serialize(iMap, null);
-        } catch (final IllegalArgumentException ex) {
-            return;
-        }
-        fail();
-    }
-
-    @Test
-    public void testSerializeStreamNullNull() throws Exception {
-        try {
-            SerializationUtils.serialize(null, null);
-        } catch (final IllegalArgumentException ex) {
-            return;
-        }
-        fail();
-    }
-    
-    @Test
-    public void testSerializeIOException() throws Exception {
-        // forces an IOException when the ObjectOutputStream is created, to test not closing the stream
-        // in the finally block
-        final OutputStream streamTest = new OutputStream() {
-            @Override
-            public void write(final int arg0) throws IOException {
-                throw new IOException(SERIALIZE_IO_EXCEPTION_MESSAGE);
-            }
-        };
-        try {
-            SerializationUtils.serialize(iMap, streamTest);
-        }
-        catch(final SerializationException e) {
-            assertEquals("java.io.IOException: " + SERIALIZE_IO_EXCEPTION_MESSAGE, e.getMessage());
-        }
-    }
-
-    //-----------------------------------------------------------------------
-
-    @Test
-    public void testDeserializeStream() throws Exception {
-        final ByteArrayOutputStream streamReal = new ByteArrayOutputStream();
-        final ObjectOutputStream oos = new ObjectOutputStream(streamReal);
-        oos.writeObject(iMap);
-        oos.flush();
-        oos.close();
-
-        final ByteArrayInputStream inTest = new ByteArrayInputStream(streamReal.toByteArray());
-        final Object test = SerializationUtils.deserialize(inTest);
-        assertNotNull(test);
-        assertTrue(test instanceof HashMap<?, ?>);
-        assertTrue(test != iMap);
-        final HashMap<?, ?> testMap = (HashMap<?, ?>) test;
-        assertEquals(iString, testMap.get("FOO"));
-        assertTrue(iString != testMap.get("FOO"));
-        assertEquals(iInteger, testMap.get("BAR"));
-        assertTrue(iInteger != testMap.get("BAR"));
-        assertEquals(iMap, testMap);
-    }
-
-    @Test(expected=ClassCastException.class)
-    public void testDeserializeClassCastException() {
-        final String value = "Hello";
-        final byte[] serialized = SerializationUtils.serialize(value);
-        Assert.assertEquals(value, SerializationUtils.deserialize(serialized));
-        // Causes ClassCastException in call site, not in SerializationUtils.deserialize
-        @SuppressWarnings("unused") // needed to cause Exception
-        final Integer i = SerializationUtils.deserialize(serialized);
-    }
-
-    @Test
-    public void testDeserializeStreamOfNull() throws Exception {
-        final ByteArrayOutputStream streamReal = new ByteArrayOutputStream();
-        final ObjectOutputStream oos = new ObjectOutputStream(streamReal);
-        oos.writeObject(null);
-        oos.flush();
-        oos.close();
-
-        final ByteArrayInputStream inTest = new ByteArrayInputStream(streamReal.toByteArray());
-        final Object test = SerializationUtils.deserialize(inTest);
-        assertNull(test);
-    }
-
-    @Test
-    public void testDeserializeStreamNull() throws Exception {
-        try {
-            SerializationUtils.deserialize((InputStream) null);
-        } catch (final IllegalArgumentException ex) {
-            return;
-        }
-        fail();
-    }
-
-    @Test
-    public void testDeserializeStreamBadStream() throws Exception {
-        try {
-            SerializationUtils.deserialize(new ByteArrayInputStream(new byte[0]));
-        } catch (final SerializationException ex) {
-            return;
-        }
-        fail();
-    }
-
-    @Test
-    public void testDeserializeStreamClassNotFound() throws Exception {
-        final ByteArrayOutputStream streamReal = new ByteArrayOutputStream();
-        final ObjectOutputStream oos = new ObjectOutputStream(streamReal);
-        oos.writeObject(new ClassNotFoundSerialization());
-        oos.flush();
-        oos.close();
-
-        final ByteArrayInputStream inTest = new ByteArrayInputStream(streamReal.toByteArray());
-        try {
-            @SuppressWarnings("unused")
-            final
-            Object test = SerializationUtils.deserialize(inTest);
-        } catch(final SerializationException se) {
-            assertEquals("java.lang.ClassNotFoundException: " + CLASS_NOT_FOUND_MESSAGE, se.getMessage());
-        }
-    }
-    
-    @Test 
-    public void testRoundtrip() {
-        final HashMap<Object, Object> newMap = SerializationUtils.roundtrip(iMap);
-        assertEquals(iMap, newMap);
-    }
-    
-    //-----------------------------------------------------------------------
-
-    @Test
-    public void testSerializeBytes() throws Exception {
-        final byte[] testBytes = SerializationUtils.serialize(iMap);
-
-        final ByteArrayOutputStream streamReal = new ByteArrayOutputStream();
-        final ObjectOutputStream oos = new ObjectOutputStream(streamReal);
-        oos.writeObject(iMap);
-        oos.flush();
-        oos.close();
-
-        final byte[] realBytes = streamReal.toByteArray();
-        assertEquals(testBytes.length, realBytes.length);
-        for (int i = 0; i < realBytes.length; i++) {
-            assertEquals(realBytes[i], testBytes[i]);
-        }
-    }
-
-    @Test
-    public void testSerializeBytesUnserializable() throws Exception {
-        try {
-            iMap.put(new Object(), new Object());
-            SerializationUtils.serialize(iMap);
-        } catch (final SerializationException ex) {
-            return;
-        }
-        fail();
-    }
-
-    @Test
-    public void testSerializeBytesNull() throws Exception {
-        final byte[] testBytes = SerializationUtils.serialize(null);
-
-        final ByteArrayOutputStream streamReal = new ByteArrayOutputStream();
-        final ObjectOutputStream oos = new ObjectOutputStream(streamReal);
-        oos.writeObject(null);
-        oos.flush();
-        oos.close();
-
-        final byte[] realBytes = streamReal.toByteArray();
-        assertEquals(testBytes.length, realBytes.length);
-        for (int i = 0; i < realBytes.length; i++) {
-            assertEquals(realBytes[i], testBytes[i]);
-        }
-    }
-
-    //-----------------------------------------------------------------------
-
-    @Test
-    public void testDeserializeBytes() throws Exception {
-        final ByteArrayOutputStream streamReal = new ByteArrayOutputStream();
-        final ObjectOutputStream oos = new ObjectOutputStream(streamReal);
-        oos.writeObject(iMap);
-        oos.flush();
-        oos.close();
-
-        final Object test = SerializationUtils.deserialize(streamReal.toByteArray());
-        assertNotNull(test);
-        assertTrue(test instanceof HashMap<?, ?>);
-        assertTrue(test != iMap);
-        final HashMap<?, ?> testMap = (HashMap<?, ?>) test;
-        assertEquals(iString, testMap.get("FOO"));
-        assertTrue(iString != testMap.get("FOO"));
-        assertEquals(iInteger, testMap.get("BAR"));
-        assertTrue(iInteger != testMap.get("BAR"));
-        assertEquals(iMap, testMap);
-    }
-
-    @Test
-    public void testDeserializeBytesOfNull() throws Exception {
-        final ByteArrayOutputStream streamReal = new ByteArrayOutputStream();
-        final ObjectOutputStream oos = new ObjectOutputStream(streamReal);
-        oos.writeObject(null);
-        oos.flush();
-        oos.close();
-
-        final Object test = SerializationUtils.deserialize(streamReal.toByteArray());
-        assertNull(test);
-    }
-
-    @Test
-    public void testDeserializeBytesNull() throws Exception {
-        try {
-            SerializationUtils.deserialize((byte[]) null);
-        } catch (final IllegalArgumentException ex) {
-            return;
-        }
-        fail();
-    }
-
-    @Test
-    public void testDeserializeBytesBadStream() throws Exception {
-        try {
-            SerializationUtils.deserialize(new byte[0]);
-        } catch (final SerializationException ex) {
-            return;
-        }
-        fail();
-    }
-
-    //-----------------------------------------------------------------------
-
-    @Test
-    public void testClone() throws Exception {
-        final Object test = SerializationUtils.clone(iMap);
-        assertNotNull(test);
-        assertTrue(test instanceof HashMap<?,?>);
-        assertTrue(test != iMap);
-        final HashMap<?, ?> testMap = (HashMap<?, ?>) test;
-        assertEquals(iString, testMap.get("FOO"));
-        assertTrue(iString != testMap.get("FOO"));
-        assertEquals(iInteger, testMap.get("BAR"));
-        assertTrue(iInteger != testMap.get("BAR"));
-        assertEquals(iMap, testMap);
-    }
-
-    @Test
-    public void testCloneNull() throws Exception {
-        final Object test = SerializationUtils.clone(null);
-        assertNull(test);
-    }
-
-    @Test
-    public void testCloneUnserializable() throws Exception {
-        try {
-            iMap.put(new Object(), new Object());
-            SerializationUtils.clone(iMap);
-        } catch (final SerializationException ex) {
-            return;
-        }
-        fail();
-    }
-    
-    @Test
-    public void testPrimitiveTypeClassSerialization() {
-        final Class<?>[] primitiveTypes = { byte.class, short.class, int.class, long.class, float.class, double.class,
-                boolean.class, char.class, void.class };
-
-        for (final Class<?> primitiveType : primitiveTypes) {
-            final Class<?> clone = SerializationUtils.clone(primitiveType);
-            assertEquals(primitiveType, clone);
-        }
-    }
-
-}
-
-class ClassNotFoundSerialization implements Serializable
-{
-
-    private static final long serialVersionUID = 1L;
-
-    private void readObject(final ObjectInputStream in) throws ClassNotFoundException    {
-        throw new ClassNotFoundException(SerializationUtilsTest.CLASS_NOT_FOUND_MESSAGE);
-    }
-}
diff --git a/lang/src/test/java/org/apache/commons/lang3/StringEscapeUtilsTest.java b/lang/src/test/java/org/apache/commons/lang3/StringEscapeUtilsTest.java
deleted file mode 100644
index 1e31309..0000000
--- a/lang/src/test/java/org/apache/commons/lang3/StringEscapeUtilsTest.java
+++ /dev/null
@@ -1,618 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- * 
- *      http://www.apache.org/licenses/LICENSE-2.0
- * 
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.commons.lang3;
-
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertFalse;
-import static org.junit.Assert.assertNotNull;
-import static org.junit.Assert.assertTrue;
-import static org.junit.Assert.fail;
-
-import java.io.FileInputStream;
-import java.io.IOException;
-import java.io.StringWriter;
-import java.lang.reflect.Constructor;
-import java.lang.reflect.Modifier;
-import java.nio.charset.Charset;
-
-import org.apache.commons.io.IOUtils;
-import org.apache.commons.lang3.text.translate.CharSequenceTranslator;
-import org.apache.commons.lang3.text.translate.NumericEntityEscaper;
-import org.junit.Test;
-
-/**
- * Unit tests for {@link StringEscapeUtils}.
- *
- * @version $Id$
- */
-public class StringEscapeUtilsTest {
-    private final static String FOO = "foo";
-
-    @Test
-    public void testConstructor() {
-        assertNotNull(new StringEscapeUtils());
-        final Constructor<?>[] cons = StringEscapeUtils.class.getDeclaredConstructors();
-        assertEquals(1, cons.length);
-        assertTrue(Modifier.isPublic(cons[0].getModifiers()));
-        assertTrue(Modifier.isPublic(StringEscapeUtils.class.getModifiers()));
-        assertFalse(Modifier.isFinal(StringEscapeUtils.class.getModifiers()));
-    }
-    
-    @Test
-    public void testEscapeJava() throws IOException {
-        assertEquals(null, StringEscapeUtils.escapeJava(null));
-        try {
-            StringEscapeUtils.ESCAPE_JAVA.translate(null, null);
-            fail();
-        } catch (final IOException ex) {
-            fail();
-        } catch (final IllegalArgumentException ex) {
-        }
-        try {
-            StringEscapeUtils.ESCAPE_JAVA.translate("", null);
-            fail();
-        } catch (final IOException ex) {
-            fail();
-        } catch (final IllegalArgumentException ex) {
-        }
-        
-        assertEscapeJava("empty string", "", "");
-        assertEscapeJava(FOO, FOO);
-        assertEscapeJava("tab", "\\t", "\t");
-        assertEscapeJava("backslash", "\\\\", "\\");
-        assertEscapeJava("single quote should not be escaped", "'", "'");
-        assertEscapeJava("\\\\\\b\\t\\r", "\\\b\t\r");
-        assertEscapeJava("\\u1234", "\u1234");
-        assertEscapeJava("\\u0234", "\u0234");
-        assertEscapeJava("\\u00EF", "\u00ef");
-        assertEscapeJava("\\u0001", "\u0001");
-        assertEscapeJava("Should use capitalized Unicode hex", "\\uABCD", "\uabcd");
-
-        assertEscapeJava("He didn't say, \\\"stop!\\\"",
-                "He didn't say, \"stop!\"");
-        assertEscapeJava("non-breaking space", "This space is non-breaking:" + "\\u00A0",
-                "This space is non-breaking:\u00a0");
-        assertEscapeJava("\\uABCD\\u1234\\u012C",
-                "\uABCD\u1234\u012C");
-    }
-
-    /**
-     * Tests https://issues.apache.org/jira/browse/LANG-421
-     */
-    @Test
-    public void testEscapeJavaWithSlash() {
-        final String input = "String with a slash (/) in it";
-
-        final String expected = input;
-        final String actual = StringEscapeUtils.escapeJava(input);
-
-        /**
-         * In 2.4 StringEscapeUtils.escapeJava(String) escapes '/' characters, which are not a valid character to escape
-         * in a Java string.
-         */
-        assertEquals(expected, actual);
-    }
-    
-    private void assertEscapeJava(final String escaped, final String original) throws IOException {
-        assertEscapeJava(null, escaped, original);
-    }
-
-    private void assertEscapeJava(String message, final String expected, final String original) throws IOException {
-        final String converted = StringEscapeUtils.escapeJava(original);
-        message = "escapeJava(String) failed" + (message == null ? "" : (": " + message));
-        assertEquals(message, expected, converted);
-
-        final StringWriter writer = new StringWriter();
-        StringEscapeUtils.ESCAPE_JAVA.translate(original, writer);
-        assertEquals(expected, writer.toString());
-    }
-
-    @Test
-    public void testUnescapeJava() throws IOException {
-        assertEquals(null, StringEscapeUtils.unescapeJava(null));
-        try {
-            StringEscapeUtils.UNESCAPE_JAVA.translate(null, null);
-            fail();
-        } catch (final IOException ex) {
-            fail();
-        } catch (final IllegalArgumentException ex) {
-        }
-        try {
-            StringEscapeUtils.UNESCAPE_JAVA.translate("", null);
-            fail();
-        } catch (final IOException ex) {
-            fail();
-        } catch (final IllegalArgumentException ex) {
-        }
-        try {
-            StringEscapeUtils.unescapeJava("\\u02-3");
-            fail();
-        } catch (final RuntimeException ex) {
-        }
-        
-        assertUnescapeJava("", "");
-        assertUnescapeJava("test", "test");
-        assertUnescapeJava("\ntest\b", "\\ntest\\b");
-        assertUnescapeJava("\u123425foo\ntest\b", "\\u123425foo\\ntest\\b");
-        assertUnescapeJava("'\foo\teste\r", "\\'\\foo\\teste\\r");
-        assertUnescapeJava("", "\\");
-        //foo
-        assertUnescapeJava("lowercase Unicode", "\uABCDx", "\\uabcdx");
-        assertUnescapeJava("uppercase Unicode", "\uABCDx", "\\uABCDx");
-        assertUnescapeJava("Unicode as final character", "\uABCD", "\\uabcd");
-    }
-
-    private void assertUnescapeJava(final String unescaped, final String original) throws IOException {
-        assertUnescapeJava(null, unescaped, original);
-    }
-
-    private void assertUnescapeJava(final String message, final String unescaped, final String original) throws IOException {
-        final String expected = unescaped;
-        final String actual = StringEscapeUtils.unescapeJava(original);
-
-        assertEquals("unescape(String) failed" +
-                (message == null ? "" : (": " + message)) +
-                ": expected '" + StringEscapeUtils.escapeJava(expected) +
-                // we escape this so we can see it in the error message
-                "' actual '" + StringEscapeUtils.escapeJava(actual) + "'",
-                expected, actual);
-
-        final StringWriter writer = new StringWriter();
-        StringEscapeUtils.UNESCAPE_JAVA.translate(original, writer);
-        assertEquals(unescaped, writer.toString());
-
-    }
-
-    @Test
-    public void testEscapeEcmaScript() {
-        assertEquals(null, StringEscapeUtils.escapeEcmaScript(null));
-        try {
-            StringEscapeUtils.ESCAPE_ECMASCRIPT.translate(null, null);
-            fail();
-        } catch (final IOException ex) {
-            fail();
-        } catch (final IllegalArgumentException ex) {
-        }
-        try {
-            StringEscapeUtils.ESCAPE_ECMASCRIPT.translate("", null);
-            fail();
-        } catch (final IOException ex) {
-            fail();
-        } catch (final IllegalArgumentException ex) {
-        }
-        
-        assertEquals("He didn\\'t say, \\\"stop!\\\"", StringEscapeUtils.escapeEcmaScript("He didn't say, \"stop!\""));
-        assertEquals("document.getElementById(\\\"test\\\").value = \\'<script>alert(\\'aaa\\');<\\/script>\\';", 
-                StringEscapeUtils.escapeEcmaScript("document.getElementById(\"test\").value = '<script>alert('aaa');</script>';"));
-    }
-
-
-    // HTML and XML
-    //--------------------------------------------------------------
-
-    private static final String[][] HTML_ESCAPES = {
-        {"no escaping", "plain text", "plain text"},
-        {"no escaping", "plain text", "plain text"},
-        {"empty string", "", ""},
-        {"null", null, null},
-        {"ampersand", "bread &amp; butter", "bread & butter"},
-        {"quotes", "&quot;bread&quot; &amp; butter", "\"bread\" & butter"},
-        {"final character only", "greater than &gt;", "greater than >"},
-        {"first character only", "&lt; less than", "< less than"},
-        {"apostrophe", "Huntington's chorea", "Huntington's chorea"},
-        {"languages", "English,Fran&ccedil;ais,\u65E5\u672C\u8A9E (nihongo)", "English,Fran\u00E7ais,\u65E5\u672C\u8A9E (nihongo)"},
-        {"8-bit ascii shouldn't number-escape", "\u0080\u009F", "\u0080\u009F"},
-    };
-
-    @Test
-    public void testEscapeHtml() {
-        for (final String[] element : HTML_ESCAPES) {
-            final String message = element[0];
-            final String expected = element[1];
-            final String original = element[2];
-            assertEquals(message, expected, StringEscapeUtils.escapeHtml4(original));
-            final StringWriter sw = new StringWriter();
-            try {
-                StringEscapeUtils.ESCAPE_HTML4.translate(original, sw);
-            } catch (final IOException e) {
-            }
-            final String actual = original == null ? null : sw.toString();
-            assertEquals(message, expected, actual);
-        }
-    }
-
-    @Test
-    public void testUnescapeHtml4() {
-        for (final String[] element : HTML_ESCAPES) {
-            final String message = element[0];
-            final String expected = element[2];
-            final String original = element[1];
-            assertEquals(message, expected, StringEscapeUtils.unescapeHtml4(original));
-            
-            final StringWriter sw = new StringWriter();
-            try {
-                StringEscapeUtils.UNESCAPE_HTML4.translate(original, sw);
-            } catch (final IOException e) {
-            }
-            final String actual = original == null ? null : sw.toString();
-            assertEquals(message, expected, actual);
-        }
-        // \u00E7 is a cedilla (c with wiggle under)
-        // note that the test string must be 7-bit-clean (Unicode escaped) or else it will compile incorrectly
-        // on some locales        
-        assertEquals("funny chars pass through OK", "Fran\u00E7ais", StringEscapeUtils.unescapeHtml4("Fran\u00E7ais"));
-        
-        assertEquals("Hello&;World", StringEscapeUtils.unescapeHtml4("Hello&;World"));
-        assertEquals("Hello&#;World", StringEscapeUtils.unescapeHtml4("Hello&#;World"));
-        assertEquals("Hello&# ;World", StringEscapeUtils.unescapeHtml4("Hello&# ;World"));
-        assertEquals("Hello&##;World", StringEscapeUtils.unescapeHtml4("Hello&##;World"));
-    }
-
-    @Test
-    public void testUnescapeHexCharsHtml() {
-        // Simple easy to grok test 
-        assertEquals("hex number unescape", "\u0080\u009F", StringEscapeUtils.unescapeHtml4("&#x80;&#x9F;"));
-        assertEquals("hex number unescape", "\u0080\u009F", StringEscapeUtils.unescapeHtml4("&#X80;&#X9F;"));
-        // Test all Character values:
-        for (char i = Character.MIN_VALUE; i < Character.MAX_VALUE; i++) {
-            final Character c1 = new Character(i);
-            final Character c2 = new Character((char)(i+1));
-            final String expected = c1.toString() + c2.toString();
-            final String escapedC1 = "&#x" + Integer.toHexString((c1.charValue())) + ";";
-            final String escapedC2 = "&#x" + Integer.toHexString((c2.charValue())) + ";";
-            assertEquals("hex number unescape index " + (int)i, expected, StringEscapeUtils.unescapeHtml4(escapedC1 + escapedC2));
-        }
-    }
-
-    @Test
-    public void testUnescapeUnknownEntity() throws Exception {
-        assertEquals("&zzzz;", StringEscapeUtils.unescapeHtml4("&zzzz;"));
-    }
-
-    @Test
-    public void testEscapeHtmlVersions() throws Exception {
-        assertEquals("&Beta;", StringEscapeUtils.escapeHtml4("\u0392"));
-        assertEquals("\u0392", StringEscapeUtils.unescapeHtml4("&Beta;"));
-
-        // TODO: refine API for escaping/unescaping specific HTML versions
-    }
-
-    @Test
-    @SuppressWarnings( "deprecation" ) // ESCAPE_XML has been replaced by ESCAPE_XML10 and ESCAPE_XML11 in 3.3
-    public void testEscapeXml() throws Exception {
-        assertEquals("&lt;abc&gt;", StringEscapeUtils.escapeXml("<abc>"));
-        assertEquals("<abc>", StringEscapeUtils.unescapeXml("&lt;abc&gt;"));
-
-        assertEquals("XML should not escape >0x7f values",
-                "\u00A1", StringEscapeUtils.escapeXml("\u00A1"));
-        assertEquals("XML should be able to unescape >0x7f values",
-                "\u00A0", StringEscapeUtils.unescapeXml("&#160;"));
-        assertEquals("XML should be able to unescape >0x7f values with one leading 0",
-                "\u00A0", StringEscapeUtils.unescapeXml("&#0160;"));
-        assertEquals("XML should be able to unescape >0x7f values with two leading 0s",
-                "\u00A0", StringEscapeUtils.unescapeXml("&#00160;"));
-        assertEquals("XML should be able to unescape >0x7f values with three leading 0s",
-                "\u00A0", StringEscapeUtils.unescapeXml("&#000160;"));
-
-        assertEquals("ain't", StringEscapeUtils.unescapeXml("ain&apos;t"));
-        assertEquals("ain&apos;t", StringEscapeUtils.escapeXml("ain't"));
-        assertEquals("", StringEscapeUtils.escapeXml(""));
-        assertEquals(null, StringEscapeUtils.escapeXml(null));
-        assertEquals(null, StringEscapeUtils.unescapeXml(null));
-
-        StringWriter sw = new StringWriter();
-        try {
-            StringEscapeUtils.ESCAPE_XML.translate("<abc>", sw);
-        } catch (final IOException e) {
-        }
-        assertEquals("XML was escaped incorrectly", "&lt;abc&gt;", sw.toString() );
-
-        sw = new StringWriter();
-        try {
-            StringEscapeUtils.UNESCAPE_XML.translate("&lt;abc&gt;", sw);
-        } catch (final IOException e) {
-        }
-        assertEquals("XML was unescaped incorrectly", "<abc>", sw.toString() );
-    }
-    
-    @Test
-    public void testEscapeXml10() throws Exception {
-        assertEquals("a&lt;b&gt;c&quot;d&apos;e&amp;f", StringEscapeUtils.escapeXml10("a<b>c\"d'e&f"));
-        assertEquals("XML 1.0 should not escape \t \n \r",
-                "a\tb\rc\nd", StringEscapeUtils.escapeXml10("a\tb\rc\nd"));
-        assertEquals("XML 1.0 should omit most #x0-x8 | #xb | #xc | #xe-#x19",
-                "ab", StringEscapeUtils.escapeXml10("a\u0000\u0001\u0008\u000b\u000c\u000e\u001fb"));
-        assertEquals("XML 1.0 should omit #xd800-#xdfff",
-                "a\ud7ff  \ue000b", StringEscapeUtils.escapeXml10("a\ud7ff\ud800 \udfff \ue000b"));
-        assertEquals("XML 1.0 should omit #xfffe | #xffff",
-                "a\ufffdb", StringEscapeUtils.escapeXml10("a\ufffd\ufffe\uffffb"));
-        assertEquals("XML 1.0 should escape #x7f-#x84 | #x86 - #x9f, for XML 1.1 compatibility",
-                "a\u007e&#127;&#132;\u0085&#134;&#159;\u00a0b", StringEscapeUtils.escapeXml10("a\u007e\u007f\u0084\u0085\u0086\u009f\u00a0b"));
-    }
-    
-    @Test
-    public void testEscapeXml11() throws Exception {
-        assertEquals("a&lt;b&gt;c&quot;d&apos;e&amp;f", StringEscapeUtils.escapeXml11("a<b>c\"d'e&f"));
-        assertEquals("XML 1.1 should not escape \t \n \r",
-                "a\tb\rc\nd", StringEscapeUtils.escapeXml11("a\tb\rc\nd"));
-        assertEquals("XML 1.1 should omit #x0",
-                "ab", StringEscapeUtils.escapeXml11("a\u0000b"));
-        assertEquals("XML 1.1 should escape #x1-x8 | #xb | #xc | #xe-#x19",
-                "a&#1;&#8;&#11;&#12;&#14;&#31;b", StringEscapeUtils.escapeXml11("a\u0001\u0008\u000b\u000c\u000e\u001fb"));
-        assertEquals("XML 1.1 should escape #x7F-#x84 | #x86-#x9F",
-                "a\u007e&#127;&#132;\u0085&#134;&#159;\u00a0b", StringEscapeUtils.escapeXml11("a\u007e\u007f\u0084\u0085\u0086\u009f\u00a0b"));
-        assertEquals("XML 1.1 should omit #xd800-#xdfff",
-                "a\ud7ff  \ue000b", StringEscapeUtils.escapeXml11("a\ud7ff\ud800 \udfff \ue000b"));
-        assertEquals("XML 1.1 should omit #xfffe | #xffff",
-                "a\ufffdb", StringEscapeUtils.escapeXml11("a\ufffd\ufffe\uffffb"));
-    }
-
-    /**
-     * Tests Supplementary characters. 
-     * <p>
-     * From http://www.w3.org/International/questions/qa-escapes
-     * </p>
-     * <blockquote>
-     * Supplementary characters are those Unicode characters that have code points higher than the characters in
-     * the Basic Multilingual Plane (BMP). In UTF-16 a supplementary character is encoded using two 16-bit surrogate code points from the
-     * BMP. Because of this, some people think that supplementary characters need to be represented using two escapes, but this is incorrect
-     * - you must use the single, code point value for that character. For example, use &amp;&#35;x233B4&#59; rather than
-     * &amp;&#35;xD84C&#59;&amp;&#35;xDFB4&#59;.
-     * </blockquote>
-     * @see <a href="http://www.w3.org/International/questions/qa-escapes">Using character escapes in markup and CSS</a>
-     * @see <a href="https://issues.apache.org/jira/browse/LANG-728">LANG-728</a>
-     */
-    @Test
-    @SuppressWarnings( "deprecation" ) // ESCAPE_XML has been replaced by ESCAPE_XML10 and ESCAPE_XML11 in 3.3
-    public void testEscapeXmlSupplementaryCharacters() {
-        final CharSequenceTranslator escapeXml = 
-            StringEscapeUtils.ESCAPE_XML.with( NumericEntityEscaper.between(0x7f, Integer.MAX_VALUE) );
-
-        assertEquals("Supplementary character must be represented using a single escape", "&#144308;",
-                escapeXml.translate("\uD84C\uDFB4"));
-
-        assertEquals("Supplementary characters mixed with basic characters should be encoded correctly", "a b c &#144308;",
-                        escapeXml.translate("a b c \uD84C\uDFB4"));
-    }
-    
-    @Test
-    @SuppressWarnings( "deprecation" ) // ESCAPE_XML has been replaced by ESCAPE_XML10 and ESCAPE_XML11 in 3.3
-    public void testEscapeXmlAllCharacters() {
-        // http://www.w3.org/TR/xml/#charsets says:
-        // Char ::= #x9 | #xA | #xD | [#x20-#xD7FF] | [#xE000-#xFFFD] | [#x10000-#x10FFFF] /* any Unicode character,
-        // excluding the surrogate blocks, FFFE, and FFFF. */
-        final CharSequenceTranslator escapeXml = StringEscapeUtils.ESCAPE_XML
-                .with(NumericEntityEscaper.below(9), NumericEntityEscaper.between(0xB, 0xC), NumericEntityEscaper.between(0xE, 0x19),
-                        NumericEntityEscaper.between(0xD800, 0xDFFF), NumericEntityEscaper.between(0xFFFE, 0xFFFF), NumericEntityEscaper.above(0x110000));
-
-        assertEquals("&#0;&#1;&#2;&#3;&#4;&#5;&#6;&#7;&#8;", escapeXml.translate("\u0000\u0001\u0002\u0003\u0004\u0005\u0006\u0007\u0008"));
-        assertEquals("\t", escapeXml.translate("\t")); // 0x9
-        assertEquals("\n", escapeXml.translate("\n")); // 0xA
-        assertEquals("&#11;&#12;", escapeXml.translate("\u000B\u000C"));
-        assertEquals("\r", escapeXml.translate("\r")); // 0xD
-        assertEquals("Hello World! Ain&apos;t this great?", escapeXml.translate("Hello World! Ain't this great?"));
-        assertEquals("&#14;&#15;&#24;&#25;", escapeXml.translate("\u000E\u000F\u0018\u0019"));
-    }
-    
-    /**
-     * Reverse of the above.
-     *
-     * @see <a href="https://issues.apache.org/jira/browse/LANG-729">LANG-729</a>
-     */
-    @Test
-    public void testUnescapeXmlSupplementaryCharacters() {
-        assertEquals("Supplementary character must be represented using a single escape", "\uD84C\uDFB4",
-                StringEscapeUtils.unescapeXml("&#144308;") );
-
-        assertEquals("Supplementary characters mixed with basic characters should be decoded correctly", "a b c \uD84C\uDFB4",
-                StringEscapeUtils.unescapeXml("a b c &#144308;") );
-    }
-        
-    // Tests issue #38569
-    // http://issues.apache.org/bugzilla/show_bug.cgi?id=38569
-    @Test
-    public void testStandaloneAmphersand() {
-        assertEquals("<P&O>", StringEscapeUtils.unescapeHtml4("&lt;P&O&gt;"));
-        assertEquals("test & <", StringEscapeUtils.unescapeHtml4("test & &lt;"));
-        assertEquals("<P&O>", StringEscapeUtils.unescapeXml("&lt;P&O&gt;"));
-        assertEquals("test & <", StringEscapeUtils.unescapeXml("test & &lt;"));
-    }
-
-    @Test
-    public void testLang313() {
-        assertEquals("& &", StringEscapeUtils.unescapeHtml4("& &amp;"));
-    }
-
-    @Test
-    public void testEscapeCsvString() throws Exception {
-        assertEquals("foo.bar",            StringEscapeUtils.escapeCsv("foo.bar"));
-        assertEquals("\"foo,bar\"",        StringEscapeUtils.escapeCsv("foo,bar"));
-        assertEquals("\"foo\nbar\"",       StringEscapeUtils.escapeCsv("foo\nbar"));
-        assertEquals("\"foo\rbar\"",       StringEscapeUtils.escapeCsv("foo\rbar"));
-        assertEquals("\"foo\"\"bar\"",     StringEscapeUtils.escapeCsv("foo\"bar"));
-        assertEquals("foo\uD84C\uDFB4bar", StringEscapeUtils.escapeCsv("foo\uD84C\uDFB4bar"));
-        assertEquals("",   StringEscapeUtils.escapeCsv(""));
-        assertEquals(null, StringEscapeUtils.escapeCsv(null));
-    }
-
-    @Test
-    public void testEscapeCsvWriter() throws Exception {
-        checkCsvEscapeWriter("foo.bar",            "foo.bar");
-        checkCsvEscapeWriter("\"foo,bar\"",        "foo,bar");
-        checkCsvEscapeWriter("\"foo\nbar\"",       "foo\nbar");
-        checkCsvEscapeWriter("\"foo\rbar\"",       "foo\rbar");
-        checkCsvEscapeWriter("\"foo\"\"bar\"",     "foo\"bar");
-        checkCsvEscapeWriter("foo\uD84C\uDFB4bar", "foo\uD84C\uDFB4bar");
-        checkCsvEscapeWriter("", null);
-        checkCsvEscapeWriter("", "");
-    }
-
-    private void checkCsvEscapeWriter(final String expected, final String value) {
-        try {
-            final StringWriter writer = new StringWriter();
-            StringEscapeUtils.ESCAPE_CSV.translate(value, writer);
-            assertEquals(expected, writer.toString());
-        } catch (final IOException e) {
-            fail("Threw: " + e);
-        }
-    }
-
-    @Test
-    public void testUnescapeCsvString() throws Exception {
-        assertEquals("foo.bar",              StringEscapeUtils.unescapeCsv("foo.bar"));
-        assertEquals("foo,bar",              StringEscapeUtils.unescapeCsv("\"foo,bar\""));
-        assertEquals("foo\nbar",             StringEscapeUtils.unescapeCsv("\"foo\nbar\""));
-        assertEquals("foo\rbar",             StringEscapeUtils.unescapeCsv("\"foo\rbar\""));
-        assertEquals("foo\"bar",             StringEscapeUtils.unescapeCsv("\"foo\"\"bar\""));
-        assertEquals("foo\uD84C\uDFB4bar",   StringEscapeUtils.unescapeCsv("foo\uD84C\uDFB4bar"));
-        assertEquals("",   StringEscapeUtils.unescapeCsv(""));
-        assertEquals(null, StringEscapeUtils.unescapeCsv(null));
-
-        assertEquals("\"foo.bar\"",          StringEscapeUtils.unescapeCsv("\"foo.bar\""));
-    }
-
-    @Test
-    public void testUnescapeCsvWriter() throws Exception {
-        checkCsvUnescapeWriter("foo.bar",            "foo.bar");
-        checkCsvUnescapeWriter("foo,bar",            "\"foo,bar\"");
-        checkCsvUnescapeWriter("foo\nbar",           "\"foo\nbar\"");
-        checkCsvUnescapeWriter("foo\rbar",           "\"foo\rbar\"");
-        checkCsvUnescapeWriter("foo\"bar",           "\"foo\"\"bar\"");
-        checkCsvUnescapeWriter("foo\uD84C\uDFB4bar", "foo\uD84C\uDFB4bar");
-        checkCsvUnescapeWriter("", null);
-        checkCsvUnescapeWriter("", "");
-
-        checkCsvUnescapeWriter("\"foo.bar\"",        "\"foo.bar\"");
-    }
-
-    private void checkCsvUnescapeWriter(final String expected, final String value) {
-        try {
-            final StringWriter writer = new StringWriter();
-            StringEscapeUtils.UNESCAPE_CSV.translate(value, writer);
-            assertEquals(expected, writer.toString());
-        } catch (final IOException e) {
-            fail("Threw: " + e);
-        }
-    }
-
-    /**
-     * Tests // https://issues.apache.org/jira/browse/LANG-480
-     */
-    @Test
-    public void testEscapeHtmlHighUnicode() {
-        // this is the utf8 representation of the character:
-        // COUNTING ROD UNIT DIGIT THREE
-        // in Unicode
-        // codepoint: U+1D362
-        final byte[] data = new byte[] { (byte)0xF0, (byte)0x9D, (byte)0x8D, (byte)0xA2 };
-
-        final String original = new String(data, Charset.forName("UTF8"));
-
-        final String escaped = StringEscapeUtils.escapeHtml4( original );
-        assertEquals( "High Unicode should not have been escaped", original, escaped);
-
-        final String unescaped = StringEscapeUtils.unescapeHtml4( escaped );
-        assertEquals( "High Unicode should have been unchanged", original, unescaped);
-
-// TODO: I think this should hold, needs further investigation
-//        String unescapedFromEntity = StringEscapeUtils.unescapeHtml4( "&#119650;" );
-//        assertEquals( "High Unicode should have been unescaped", original, unescapedFromEntity);
-    }
-
-    /**
-     * Tests https://issues.apache.org/jira/browse/LANG-339
-     */
-    @Test
-    public void testEscapeHiragana() {
-        // Some random Japanese Unicode characters
-        final String original = "\u304B\u304C\u3068";
-        final String escaped = StringEscapeUtils.escapeHtml4(original);
-        assertEquals( "Hiragana character Unicode behaviour should not be being escaped by escapeHtml4",
-        original, escaped);
-
-        final String unescaped = StringEscapeUtils.unescapeHtml4( escaped );
-
-        assertEquals( "Hiragana character Unicode behaviour has changed - expected no unescaping", escaped, unescaped);
-    }
-
-    /**
-     * Tests https://issues.apache.org/jira/browse/LANG-708
-     * 
-     * @throws IOException
-     *             if an I/O error occurs
-     */
-    @Test
-    public void testLang708() throws IOException {
-        final FileInputStream fis = new FileInputStream("src/test/resources/lang-708-input.txt");
-        final String input = IOUtils.toString(fis, "UTF-8");
-        final String escaped = StringEscapeUtils.escapeEcmaScript(input);
-        // just the end:
-        assertTrue(escaped, escaped.endsWith("}]"));
-        // a little more:
-        assertTrue(escaped, escaped.endsWith("\"valueCode\\\":\\\"\\\"}]"));
-        fis.close();
-    }
-
-    /**
-     * Tests https://issues.apache.org/jira/browse/LANG-720
-     */
-    @Test
-    @SuppressWarnings( "deprecation" ) // escapeXml(String) has been replaced by escapeXml10(String) and escapeXml11(String) in 3.3
-    public void testLang720() {
-        final String input = new StringBuilder("\ud842\udfb7").append("A").toString();
-        final String escaped = StringEscapeUtils.escapeXml(input);
-        assertEquals(input, escaped);
-    }
-
-    /**
-     * Tests https://issues.apache.org/jira/browse/LANG-911
-     */
-    @Test
-    public void testLang911() {
-        final String bellsTest = "\ud83d\udc80\ud83d\udd14";
-        final String value = StringEscapeUtils.escapeJava(bellsTest);
-        final String valueTest = StringEscapeUtils.unescapeJava(value);
-        assertEquals(bellsTest, valueTest);
-    }
-
-    @Test
-    public void testEscapeJson() {
-        assertEquals(null, StringEscapeUtils.escapeJson(null));
-        try {
-            StringEscapeUtils.ESCAPE_JSON.translate(null, null);
-            fail();
-        } catch (final IOException ex) {
-            fail();
-        } catch (final IllegalArgumentException ex) {
-        }
-        try {
-            StringEscapeUtils.ESCAPE_JSON.translate("", null);
-            fail();
-        } catch (final IOException ex) {
-            fail();
-        } catch (final IllegalArgumentException ex) {
-        }
-
-        assertEquals("He didn't say, \\\"stop!\\\"", StringEscapeUtils.escapeJson("He didn't say, \"stop!\""));
-
-        final String expected = "\\\"foo\\\" isn't \\\"bar\\\". specials: \\b\\r\\n\\f\\t\\\\\\/";
-        final String input ="\"foo\" isn't \"bar\". specials: \b\r\n\f\t\\/";
-
-        assertEquals(expected, StringEscapeUtils.escapeJson(input));
-    }
-
-}
diff --git a/lang/src/test/java/org/apache/commons/lang3/StringUtilsEqualsIndexOfTest.java b/lang/src/test/java/org/apache/commons/lang3/StringUtilsEqualsIndexOfTest.java
deleted file mode 100644
index 99c766a..0000000
--- a/lang/src/test/java/org/apache/commons/lang3/StringUtilsEqualsIndexOfTest.java
+++ /dev/null
@@ -1,1029 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.commons.lang3;
-
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertFalse;
-import static org.junit.Assert.assertThat;
-import static org.junit.Assert.assertTrue;
-
-import java.util.Locale;
-
-import org.hamcrest.core.IsNot;
-import org.junit.Test;
-
-/**
- * Unit tests {@link org.apache.commons.lang3.StringUtils} - Substring methods
- *
- * @version $Id$
- */
-public class StringUtilsEqualsIndexOfTest  {
-    private static final String BAR = "bar";
-    /**
-     * Supplementary character U+20000
-     * See http://www.oracle.com/technetwork/articles/javase/supplementary-142654.html
-     */
-    private static final String CharU20000 = "\uD840\uDC00";
-    /**
-     * Supplementary character U+20001
-     * See http://www.oracle.com/technetwork/articles/javase/supplementary-142654.html
-     */
-    private static final String CharU20001 = "\uD840\uDC01";
-    /**
-     * Incomplete supplementary character U+20000, high surrogate only.
-     * See http://www.oracle.com/technetwork/articles/javase/supplementary-142654.html
-     */
-    private static final String CharUSuppCharHigh = "\uDC00";
-
-    /**
-     * Incomplete supplementary character U+20000, low surrogate only.
-     * See http://www.oracle.com/technetwork/articles/javase/supplementary-142654.html
-     */
-    private static final String CharUSuppCharLow = "\uD840";
-
-    private static final String FOO = "foo";
-
-    private static final String FOOBAR = "foobar";
-
-    private static final String[] FOOBAR_SUB_ARRAY = new String[] {"ob", "ba"};
-
-    @Test
-    public void testContains_Char() {
-        assertFalse(StringUtils.contains(null, ' '));
-        assertFalse(StringUtils.contains("", ' '));
-        assertFalse(StringUtils.contains("", null));
-        assertFalse(StringUtils.contains(null, null));
-        assertTrue(StringUtils.contains("abc", 'a'));
-        assertTrue(StringUtils.contains("abc", 'b'));
-        assertTrue(StringUtils.contains("abc", 'c'));
-        assertFalse(StringUtils.contains("abc", 'z'));
-    }
-
-    @Test
-    public void testContains_String() {
-        assertFalse(StringUtils.contains(null, null));
-        assertFalse(StringUtils.contains(null, ""));
-        assertFalse(StringUtils.contains(null, "a"));
-        assertFalse(StringUtils.contains("", null));
-        assertTrue(StringUtils.contains("", ""));
-        assertFalse(StringUtils.contains("", "a"));
-        assertTrue(StringUtils.contains("abc", "a"));
-        assertTrue(StringUtils.contains("abc", "b"));
-        assertTrue(StringUtils.contains("abc", "c"));
-        assertTrue(StringUtils.contains("abc", "abc"));
-        assertFalse(StringUtils.contains("abc", "z"));
-    }
-
-    /**
-     * See http://www.oracle.com/technetwork/articles/javase/supplementary-142654.html
-     */
-    @Test
-    public void testContains_StringWithBadSupplementaryChars() {
-        // Test edge case: 1/2 of a (broken) supplementary char
-        assertFalse(StringUtils.contains(CharUSuppCharHigh, CharU20001));
-        assertFalse(StringUtils.contains(CharUSuppCharLow, CharU20001));
-        assertFalse(StringUtils.contains(CharU20001, CharUSuppCharHigh));
-        assertEquals(0, CharU20001.indexOf(CharUSuppCharLow));
-        assertTrue(StringUtils.contains(CharU20001, CharUSuppCharLow));
-        assertTrue(StringUtils.contains(CharU20001 + CharUSuppCharLow + "a", "a"));
-        assertTrue(StringUtils.contains(CharU20001 + CharUSuppCharHigh + "a", "a"));
-    }
-
-    /**
-     * See http://www.oracle.com/technetwork/articles/javase/supplementary-142654.html
-     */
-    @Test
-    public void testContains_StringWithSupplementaryChars() {
-        assertTrue(StringUtils.contains(CharU20000 + CharU20001, CharU20000));
-        assertTrue(StringUtils.contains(CharU20000 + CharU20001, CharU20001));
-        assertTrue(StringUtils.contains(CharU20000, CharU20000));
-        assertFalse(StringUtils.contains(CharU20000, CharU20001));
-    }
-
-    @Test
-    public void testContainsAny_StringCharArray() {
-        assertFalse(StringUtils.containsAny(null, (char[]) null));
-        assertFalse(StringUtils.containsAny(null, new char[0]));
-        assertFalse(StringUtils.containsAny(null, new char[] { 'a', 'b' }));
-
-        assertFalse(StringUtils.containsAny("", (char[]) null));
-        assertFalse(StringUtils.containsAny("", new char[0]));
-        assertFalse(StringUtils.containsAny("", new char[] { 'a', 'b' }));
-
-        assertFalse(StringUtils.containsAny("zzabyycdxx", (char[]) null));
-        assertFalse(StringUtils.containsAny("zzabyycdxx", new char[0]));
-        assertTrue(StringUtils.containsAny("zzabyycdxx", new char[] { 'z', 'a' }));
-        assertTrue(StringUtils.containsAny("zzabyycdxx", new char[] { 'b', 'y' }));
-        assertFalse(StringUtils.containsAny("ab", new char[] { 'z' }));
-    }
-
-    /**
-     * See http://www.oracle.com/technetwork/articles/javase/supplementary-142654.html
-     */
-    @Test
-    public void testContainsAny_StringCharArrayWithBadSupplementaryChars() {
-        // Test edge case: 1/2 of a (broken) supplementary char
-        assertFalse(StringUtils.containsAny(CharUSuppCharHigh, CharU20001.toCharArray()));
-        assertFalse(StringUtils.containsAny("abc" + CharUSuppCharHigh + "xyz", CharU20001.toCharArray()));
-        assertEquals(-1, CharUSuppCharLow.indexOf(CharU20001));
-        assertFalse(StringUtils.containsAny(CharUSuppCharLow, CharU20001.toCharArray()));
-        assertFalse(StringUtils.containsAny(CharU20001, CharUSuppCharHigh.toCharArray()));
-        assertEquals(0, CharU20001.indexOf(CharUSuppCharLow));
-        assertTrue(StringUtils.containsAny(CharU20001, CharUSuppCharLow.toCharArray()));
-    }
-
-    /**
-     * See http://www.oracle.com/technetwork/articles/javase/supplementary-142654.html
-     */
-    @Test
-    public void testContainsAny_StringCharArrayWithSupplementaryChars() {
-        assertTrue(StringUtils.containsAny(CharU20000 + CharU20001, CharU20000.toCharArray()));
-        assertTrue(StringUtils.containsAny("a" + CharU20000 + CharU20001, "a".toCharArray()));
-        assertTrue(StringUtils.containsAny(CharU20000 + "a" + CharU20001, "a".toCharArray()));
-        assertTrue(StringUtils.containsAny(CharU20000 + CharU20001 + "a", "a".toCharArray()));
-        assertTrue(StringUtils.containsAny(CharU20000 + CharU20001, CharU20001.toCharArray()));
-        assertTrue(StringUtils.containsAny(CharU20000, CharU20000.toCharArray()));
-        // Sanity check:
-        assertEquals(-1, CharU20000.indexOf(CharU20001));
-        assertEquals(0, CharU20000.indexOf(CharU20001.charAt(0)));
-        assertEquals(-1, CharU20000.indexOf(CharU20001.charAt(1)));
-        // Test:
-        assertFalse(StringUtils.containsAny(CharU20000, CharU20001.toCharArray()));
-        assertFalse(StringUtils.containsAny(CharU20001, CharU20000.toCharArray()));
-    }
-
-    @Test
-    public void testContainsAny_StringString() {
-        assertFalse(StringUtils.containsAny(null, (String) null));
-        assertFalse(StringUtils.containsAny(null, ""));
-        assertFalse(StringUtils.containsAny(null, "ab"));
-
-        assertFalse(StringUtils.containsAny("", (String) null));
-        assertFalse(StringUtils.containsAny("", ""));
-        assertFalse(StringUtils.containsAny("", "ab"));
-
-        assertFalse(StringUtils.containsAny("zzabyycdxx", (String) null));
-        assertFalse(StringUtils.containsAny("zzabyycdxx", ""));
-        assertTrue(StringUtils.containsAny("zzabyycdxx", "za"));
-        assertTrue(StringUtils.containsAny("zzabyycdxx", "by"));
-        assertFalse(StringUtils.containsAny("ab", "z"));
-    }
-
-    /**
-     * See http://www.oracle.com/technetwork/articles/javase/supplementary-142654.html
-     */
-    @Test
-    public void testContainsAny_StringWithBadSupplementaryChars() {
-        // Test edge case: 1/2 of a (broken) supplementary char
-        assertFalse(StringUtils.containsAny(CharUSuppCharHigh, CharU20001));
-        assertEquals(-1, CharUSuppCharLow.indexOf(CharU20001));
-        assertFalse(StringUtils.containsAny(CharUSuppCharLow, CharU20001));
-        assertFalse(StringUtils.containsAny(CharU20001, CharUSuppCharHigh));
-        assertEquals(0, CharU20001.indexOf(CharUSuppCharLow));
-        assertTrue(StringUtils.containsAny(CharU20001, CharUSuppCharLow));
-    }
-
-    /**
-     * See http://www.oracle.com/technetwork/articles/javase/supplementary-142654.html
-     */
-    @Test
-    public void testContainsAny_StringWithSupplementaryChars() {
-        assertTrue(StringUtils.containsAny(CharU20000 + CharU20001, CharU20000));
-        assertTrue(StringUtils.containsAny(CharU20000 + CharU20001, CharU20001));
-        assertTrue(StringUtils.containsAny(CharU20000, CharU20000));
-        // Sanity check:
-        assertEquals(-1, CharU20000.indexOf(CharU20001));
-        assertEquals(0, CharU20000.indexOf(CharU20001.charAt(0)));
-        assertEquals(-1, CharU20000.indexOf(CharU20001.charAt(1)));
-        // Test:
-        assertFalse(StringUtils.containsAny(CharU20000, CharU20001));
-        assertFalse(StringUtils.containsAny(CharU20001, CharU20000));
-    }
-    
-    @Test
-    public void testContainsAny_StringStringArray() {
-        assertFalse(StringUtils.containsAny(null, (String[]) null));
-        assertFalse(StringUtils.containsAny(null, new String[0]));
-        assertFalse(StringUtils.containsAny(null, new String[] { "hello" }));
-        assertFalse(StringUtils.containsAny("", (String[]) null));
-        assertFalse(StringUtils.containsAny("", new String[0]));
-        assertFalse(StringUtils.containsAny("", new String[] { "hello" }));
-        assertFalse(StringUtils.containsAny("hello, goodbye", (String[]) null));
-        assertFalse(StringUtils.containsAny("hello, goodbye", new String[0]));
-        assertTrue(StringUtils.containsAny("hello, goodbye", new String[] { "hello", "goodbye" }));
-        assertTrue(StringUtils.containsAny("hello, goodbye", new String[] { "hello", "Goodbye" }));
-        assertFalse(StringUtils.containsAny("hello, goodbye", new String[] { "Hello", "Goodbye" }));
-    }
-
-    @Test
-    public void testContainsIgnoreCase_LocaleIndependence() {
-        final Locale orig = Locale.getDefault();
-
-        final Locale[] locales = { Locale.ENGLISH, new Locale("tr"), Locale.getDefault() };
-
-        final String[][] tdata = {
-            { "i", "I" },
-            { "I", "i" },
-            { "\u03C2", "\u03C3" },
-            { "\u03A3", "\u03C2" },
-            { "\u03A3", "\u03C3" },
-        };
-
-        final String[][] fdata = {
-            { "\u00DF", "SS" },
-        };
-
-        try {
-            for (final Locale locale : locales) {
-                Locale.setDefault(locale);
-                for (int j = 0; j < tdata.length; j++) {
-                    assertTrue(Locale.getDefault() + ": " + j + " " + tdata[j][0] + " " + tdata[j][1], StringUtils
-                            .containsIgnoreCase(tdata[j][0], tdata[j][1]));
-                }
-                for (int j = 0; j < fdata.length; j++) {
-                    assertFalse(Locale.getDefault() + ": " + j + " " + fdata[j][0] + " " + fdata[j][1], StringUtils
-                            .containsIgnoreCase(fdata[j][0], fdata[j][1]));
-                }
-            }
-        } finally {
-            Locale.setDefault(orig);
-        }
-    }
-
-    @Test
-    public void testContainsIgnoreCase_StringString() {
-        assertFalse(StringUtils.containsIgnoreCase(null, null));
-
-        // Null tests
-        assertFalse(StringUtils.containsIgnoreCase(null, ""));
-        assertFalse(StringUtils.containsIgnoreCase(null, "a"));
-        assertFalse(StringUtils.containsIgnoreCase(null, "abc"));
-
-        assertFalse(StringUtils.containsIgnoreCase("", null));
-        assertFalse(StringUtils.containsIgnoreCase("a", null));
-        assertFalse(StringUtils.containsIgnoreCase("abc", null));
-
-        // Match len = 0
-        assertTrue(StringUtils.containsIgnoreCase("", ""));
-        assertTrue(StringUtils.containsIgnoreCase("a", ""));
-        assertTrue(StringUtils.containsIgnoreCase("abc", ""));
-
-        // Match len = 1
-        assertFalse(StringUtils.containsIgnoreCase("", "a"));
-        assertTrue(StringUtils.containsIgnoreCase("a", "a"));
-        assertTrue(StringUtils.containsIgnoreCase("abc", "a"));
-        assertFalse(StringUtils.containsIgnoreCase("", "A"));
-        assertTrue(StringUtils.containsIgnoreCase("a", "A"));
-        assertTrue(StringUtils.containsIgnoreCase("abc", "A"));
-
-        // Match len > 1
-        assertFalse(StringUtils.containsIgnoreCase("", "abc"));
-        assertFalse(StringUtils.containsIgnoreCase("a", "abc"));
-        assertTrue(StringUtils.containsIgnoreCase("xabcz", "abc"));
-        assertFalse(StringUtils.containsIgnoreCase("", "ABC"));
-        assertFalse(StringUtils.containsIgnoreCase("a", "ABC"));
-        assertTrue(StringUtils.containsIgnoreCase("xabcz", "ABC"));
-    }
-
-    @Test
-    public void testContainsNone_CharArray() {
-        final String str1 = "a";
-        final String str2 = "b";
-        final String str3 = "ab.";
-        final char[] chars1= {'b'};
-        final char[] chars2= {'.'};
-        final char[] chars3= {'c', 'd'};
-        final char[] emptyChars = new char[0];
-        assertTrue(StringUtils.containsNone(null, (char[]) null));
-        assertTrue(StringUtils.containsNone("", (char[]) null));
-        assertTrue(StringUtils.containsNone(null, emptyChars));
-        assertTrue(StringUtils.containsNone(str1, emptyChars));
-        assertTrue(StringUtils.containsNone("", emptyChars));
-        assertTrue(StringUtils.containsNone("", chars1));
-        assertTrue(StringUtils.containsNone(str1, chars1));
-        assertTrue(StringUtils.containsNone(str1, chars2));
-        assertTrue(StringUtils.containsNone(str1, chars3));
-        assertFalse(StringUtils.containsNone(str2, chars1));
-        assertTrue(StringUtils.containsNone(str2, chars2));
-        assertTrue(StringUtils.containsNone(str2, chars3));
-        assertFalse(StringUtils.containsNone(str3, chars1));
-        assertFalse(StringUtils.containsNone(str3, chars2));
-        assertTrue(StringUtils.containsNone(str3, chars3));
-    }
-
-    /**
-     * See http://www.oracle.com/technetwork/articles/javase/supplementary-142654.html
-     */
-    @Test
-    public void testContainsNone_CharArrayWithBadSupplementaryChars() {
-        // Test edge case: 1/2 of a (broken) supplementary char
-        assertTrue(StringUtils.containsNone(CharUSuppCharHigh, CharU20001.toCharArray()));
-        assertEquals(-1, CharUSuppCharLow.indexOf(CharU20001));
-        assertTrue(StringUtils.containsNone(CharUSuppCharLow, CharU20001.toCharArray()));
-        assertEquals(-1, CharU20001.indexOf(CharUSuppCharHigh));
-        assertTrue(StringUtils.containsNone(CharU20001, CharUSuppCharHigh.toCharArray()));
-        assertEquals(0, CharU20001.indexOf(CharUSuppCharLow));
-        assertFalse(StringUtils.containsNone(CharU20001, CharUSuppCharLow.toCharArray()));
-    }
-
-    /**
-     * See http://www.oracle.com/technetwork/articles/javase/supplementary-142654.html
-     */
-    @Test
-    public void testContainsNone_CharArrayWithSupplementaryChars() {
-        assertFalse(StringUtils.containsNone(CharU20000 + CharU20001, CharU20000.toCharArray()));
-        assertFalse(StringUtils.containsNone(CharU20000 + CharU20001, CharU20001.toCharArray()));
-        assertFalse(StringUtils.containsNone(CharU20000, CharU20000.toCharArray()));
-        // Sanity check:
-        assertEquals(-1, CharU20000.indexOf(CharU20001));
-        assertEquals(0, CharU20000.indexOf(CharU20001.charAt(0)));
-        assertEquals(-1, CharU20000.indexOf(CharU20001.charAt(1)));
-        // Test:
-        assertTrue(StringUtils.containsNone(CharU20000, CharU20001.toCharArray()));
-        assertTrue(StringUtils.containsNone(CharU20001, CharU20000.toCharArray()));
-    }
-
-    @Test
-    public void testContainsNone_String() {
-        final String str1 = "a";
-        final String str2 = "b";
-        final String str3 = "ab.";
-        final String chars1= "b";
-        final String chars2= ".";
-        final String chars3= "cd";
-        assertTrue(StringUtils.containsNone(null, (String) null));
-        assertTrue(StringUtils.containsNone("", (String) null));
-        assertTrue(StringUtils.containsNone(null, ""));
-        assertTrue(StringUtils.containsNone(str1, ""));
-        assertTrue(StringUtils.containsNone("", ""));
-        assertTrue(StringUtils.containsNone("", chars1));
-        assertTrue(StringUtils.containsNone(str1, chars1));
-        assertTrue(StringUtils.containsNone(str1, chars2));
-        assertTrue(StringUtils.containsNone(str1, chars3));
-        assertFalse(StringUtils.containsNone(str2, chars1));
-        assertTrue(StringUtils.containsNone(str2, chars2));
-        assertTrue(StringUtils.containsNone(str2, chars3));
-        assertFalse(StringUtils.containsNone(str3, chars1));
-        assertFalse(StringUtils.containsNone(str3, chars2));
-        assertTrue(StringUtils.containsNone(str3, chars3));
-    }
-
-    /**
-     * See http://www.oracle.com/technetwork/articles/javase/supplementary-142654.html
-     */
-    @Test
-    public void testContainsNone_StringWithBadSupplementaryChars() {
-        // Test edge case: 1/2 of a (broken) supplementary char
-        assertTrue(StringUtils.containsNone(CharUSuppCharHigh, CharU20001));
-        assertEquals(-1, CharUSuppCharLow.indexOf(CharU20001));
-        assertTrue(StringUtils.containsNone(CharUSuppCharLow, CharU20001));
-        assertEquals(-1, CharU20001.indexOf(CharUSuppCharHigh));
-        assertTrue(StringUtils.containsNone(CharU20001, CharUSuppCharHigh));
-        assertEquals(0, CharU20001.indexOf(CharUSuppCharLow));
-        assertFalse(StringUtils.containsNone(CharU20001, CharUSuppCharLow));
-    }
-
-    /**
-     * See http://www.oracle.com/technetwork/articles/javase/supplementary-142654.html
-     */
-    @Test
-    public void testContainsNone_StringWithSupplementaryChars() {
-        assertFalse(StringUtils.containsNone(CharU20000 + CharU20001, CharU20000));
-        assertFalse(StringUtils.containsNone(CharU20000 + CharU20001, CharU20001));
-        assertFalse(StringUtils.containsNone(CharU20000, CharU20000));
-        // Sanity check:
-        assertEquals(-1, CharU20000.indexOf(CharU20001));
-        assertEquals(0, CharU20000.indexOf(CharU20001.charAt(0)));
-        assertEquals(-1, CharU20000.indexOf(CharU20001.charAt(1)));
-        // Test:
-        assertTrue(StringUtils.containsNone(CharU20000, CharU20001));
-        assertTrue(StringUtils.containsNone(CharU20001, CharU20000));
-    }
-
-    @Test
-    public void testContainsOnly_CharArray() {
-        final String str1 = "a";
-        final String str2 = "b";
-        final String str3 = "ab";
-        final char[] chars1= {'b'};
-        final char[] chars2= {'a'};
-        final char[] chars3= {'a', 'b'};
-        final char[] emptyChars = new char[0];
-        assertFalse(StringUtils.containsOnly(null, (char[]) null));
-        assertFalse(StringUtils.containsOnly("", (char[]) null));
-        assertFalse(StringUtils.containsOnly(null, emptyChars));
-        assertFalse(StringUtils.containsOnly(str1, emptyChars));
-        assertTrue(StringUtils.containsOnly("", emptyChars));
-        assertTrue(StringUtils.containsOnly("", chars1));
-        assertFalse(StringUtils.containsOnly(str1, chars1));
-        assertTrue(StringUtils.containsOnly(str1, chars2));
-        assertTrue(StringUtils.containsOnly(str1, chars3));
-        assertTrue(StringUtils.containsOnly(str2, chars1));
-        assertFalse(StringUtils.containsOnly(str2, chars2));
-        assertTrue(StringUtils.containsOnly(str2, chars3));
-        assertFalse(StringUtils.containsOnly(str3, chars1));
-        assertFalse(StringUtils.containsOnly(str3, chars2));
-        assertTrue(StringUtils.containsOnly(str3, chars3));
-    }
-
-    @Test
-    public void testContainsOnly_String() {
-        final String str1 = "a";
-        final String str2 = "b";
-        final String str3 = "ab";
-        final String chars1= "b";
-        final String chars2= "a";
-        final String chars3= "ab";
-        assertFalse(StringUtils.containsOnly(null, (String) null));
-        assertFalse(StringUtils.containsOnly("", (String) null));
-        assertFalse(StringUtils.containsOnly(null, ""));
-        assertFalse(StringUtils.containsOnly(str1, ""));
-        assertTrue(StringUtils.containsOnly("", ""));
-        assertTrue(StringUtils.containsOnly("", chars1));
-        assertFalse(StringUtils.containsOnly(str1, chars1));
-        assertTrue(StringUtils.containsOnly(str1, chars2));
-        assertTrue(StringUtils.containsOnly(str1, chars3));
-        assertTrue(StringUtils.containsOnly(str2, chars1));
-        assertFalse(StringUtils.containsOnly(str2, chars2));
-        assertTrue(StringUtils.containsOnly(str2, chars3));
-        assertFalse(StringUtils.containsOnly(str3, chars1));
-        assertFalse(StringUtils.containsOnly(str3, chars2));
-        assertTrue(StringUtils.containsOnly(str3, chars3));
-    }
-
-    @Test
-    public void testContainsWhitespace() {
-        assertFalse( StringUtils.containsWhitespace("") );
-        assertTrue( StringUtils.containsWhitespace(" ") );
-        assertFalse( StringUtils.containsWhitespace("a") );
-        assertTrue( StringUtils.containsWhitespace("a ") );
-        assertTrue( StringUtils.containsWhitespace(" a") );
-        assertTrue( StringUtils.containsWhitespace("a\t") );
-        assertTrue( StringUtils.containsWhitespace("\n") );
-    }
-
-    // The purpose of this class is to test StringUtils#equals(CharSequence, CharSequence)
-    // with a CharSequence implementation whose equals(Object) override requires that the
-    // other object be an instance of CustomCharSequence, even though, as char sequences,
-    // `seq` may equal the other object.
-    private static class CustomCharSequence implements CharSequence {
-        private final CharSequence seq;
-
-        public CustomCharSequence(final CharSequence seq) {
-            this.seq = seq;
-        }
-
-        @Override
-        public char charAt(final int index) {
-            return seq.charAt(index);
-        }
-
-        @Override
-        public int length() {
-            return seq.length();
-        }
-
-        @Override
-        public CharSequence subSequence(final int start, final int end) {
-            return new CustomCharSequence(seq.subSequence(start, end));
-        }
-
-        @Override
-        public boolean equals(final Object obj) {
-            if (obj == null || !(obj instanceof CustomCharSequence)) {
-                return false;
-            }
-            final CustomCharSequence other = (CustomCharSequence) obj;
-            return seq.equals(other.seq);
-        }
-
-        @Override
-        public int hashCode() {
-            return seq.hashCode();
-        }
-
-        @Override
-        public String toString() {
-            return seq.toString();
-        }
-    }
-
-    @Test
-    public void testCustomCharSequence() {
-        assertThat(new CustomCharSequence(FOO), IsNot.<CharSequence>not(FOO));
-        assertThat(FOO, IsNot.<CharSequence>not(new CustomCharSequence(FOO)));
-        assertEquals(new CustomCharSequence(FOO), new CustomCharSequence(FOO));
-    }
-
-    @Test
-    public void testEquals() {
-        final CharSequence fooCs = FOO, barCs = BAR, foobarCs = FOOBAR;
-        assertTrue(StringUtils.equals(null, null));
-        assertTrue(StringUtils.equals(fooCs, fooCs));
-        assertTrue(StringUtils.equals(fooCs, new StringBuilder(FOO)));
-        assertTrue(StringUtils.equals(fooCs, new String(new char[] { 'f', 'o', 'o' })));
-        assertTrue(StringUtils.equals(fooCs, new CustomCharSequence(FOO)));
-        assertTrue(StringUtils.equals(new CustomCharSequence(FOO), fooCs));
-        assertFalse(StringUtils.equals(fooCs, new String(new char[] { 'f', 'O', 'O' })));
-        assertFalse(StringUtils.equals(fooCs, barCs));
-        assertFalse(StringUtils.equals(fooCs, null));
-        assertFalse(StringUtils.equals(null, fooCs));
-        assertFalse(StringUtils.equals(fooCs, foobarCs));
-        assertFalse(StringUtils.equals(foobarCs, fooCs));
-    }
-
-    @Test
-    public void testEqualsOnStrings() {
-        assertTrue(StringUtils.equals(null, null));
-        assertTrue(StringUtils.equals(FOO, FOO));
-        assertTrue(StringUtils.equals(FOO, new String(new char[] { 'f', 'o', 'o' })));
-        assertFalse(StringUtils.equals(FOO, new String(new char[] { 'f', 'O', 'O' })));
-        assertFalse(StringUtils.equals(FOO, BAR));
-        assertFalse(StringUtils.equals(FOO, null));
-        assertFalse(StringUtils.equals(null, FOO));
-        assertFalse(StringUtils.equals(FOO, FOOBAR));
-        assertFalse(StringUtils.equals(FOOBAR, FOO));
-    }
-
-    @Test
-    public void testEqualsIgnoreCase() {
-        assertTrue(StringUtils.equalsIgnoreCase(null, null));
-        assertTrue(StringUtils.equalsIgnoreCase(FOO, FOO));
-        assertTrue(StringUtils.equalsIgnoreCase(FOO, new String(new char[] { 'f', 'o', 'o' })));
-        assertTrue(StringUtils.equalsIgnoreCase(FOO, new String(new char[] { 'f', 'O', 'O' })));
-        assertFalse(StringUtils.equalsIgnoreCase(FOO, BAR));
-        assertFalse(StringUtils.equalsIgnoreCase(FOO, null));
-        assertFalse(StringUtils.equalsIgnoreCase(null, FOO));
-        assertTrue(StringUtils.equalsIgnoreCase("",""));
-        assertFalse(StringUtils.equalsIgnoreCase("abcd","abcd "));
-    }
-
-    //-----------------------------------------------------------------------
-    @Test
-    public void testIndexOf_char() {
-        assertEquals(-1, StringUtils.indexOf(null, ' '));
-        assertEquals(-1, StringUtils.indexOf("", ' '));
-        assertEquals(0, StringUtils.indexOf("aabaabaa", 'a'));
-        assertEquals(2, StringUtils.indexOf("aabaabaa", 'b'));
-
-        assertEquals(2, StringUtils.indexOf(new StringBuilder("aabaabaa"), 'b'));
-    }
-
-    @Test
-    public void testIndexOf_charInt() {
-        assertEquals(-1, StringUtils.indexOf(null, ' ', 0));
-        assertEquals(-1, StringUtils.indexOf(null, ' ', -1));
-        assertEquals(-1, StringUtils.indexOf("", ' ', 0));
-        assertEquals(-1, StringUtils.indexOf("", ' ', -1));
-        assertEquals(0, StringUtils.indexOf("aabaabaa", 'a', 0));
-        assertEquals(2, StringUtils.indexOf("aabaabaa", 'b', 0));
-        assertEquals(5, StringUtils.indexOf("aabaabaa", 'b', 3));
-        assertEquals(-1, StringUtils.indexOf("aabaabaa", 'b', 9));
-        assertEquals(2, StringUtils.indexOf("aabaabaa", 'b', -1));
-
-        assertEquals(5, StringUtils.indexOf(new StringBuilder("aabaabaa"), 'b', 3));
-    }
-
-    @Test
-    public void testIndexOf_String() {
-        assertEquals(-1, StringUtils.indexOf(null, null));
-        assertEquals(-1, StringUtils.indexOf("", null));
-        assertEquals(0, StringUtils.indexOf("", ""));
-        assertEquals(0, StringUtils.indexOf("aabaabaa", "a"));
-        assertEquals(2, StringUtils.indexOf("aabaabaa", "b"));
-        assertEquals(1, StringUtils.indexOf("aabaabaa", "ab"));
-        assertEquals(0, StringUtils.indexOf("aabaabaa", ""));
-
-        assertEquals(2, StringUtils.indexOf(new StringBuilder("aabaabaa"), "b"));
-    }
-
-    @Test
-    public void testIndexOf_StringInt() {
-        assertEquals(-1, StringUtils.indexOf(null, null, 0));
-        assertEquals(-1, StringUtils.indexOf(null, null, -1));
-        assertEquals(-1, StringUtils.indexOf(null, "", 0));
-        assertEquals(-1, StringUtils.indexOf(null, "", -1));
-        assertEquals(-1, StringUtils.indexOf("", null, 0));
-        assertEquals(-1, StringUtils.indexOf("", null, -1));
-        assertEquals(0, StringUtils.indexOf("", "", 0));
-        assertEquals(0, StringUtils.indexOf("", "", -1));
-        assertEquals(0, StringUtils.indexOf("", "", 9));
-        assertEquals(0, StringUtils.indexOf("abc", "", 0));
-        assertEquals(0, StringUtils.indexOf("abc", "", -1));
-        assertEquals(3, StringUtils.indexOf("abc", "", 9));
-        assertEquals(3, StringUtils.indexOf("abc", "", 3));
-        assertEquals(0, StringUtils.indexOf("aabaabaa", "a", 0));
-        assertEquals(2, StringUtils.indexOf("aabaabaa", "b", 0));
-        assertEquals(1, StringUtils.indexOf("aabaabaa", "ab", 0));
-        assertEquals(5, StringUtils.indexOf("aabaabaa", "b", 3));
-        assertEquals(-1, StringUtils.indexOf("aabaabaa", "b", 9));
-        assertEquals(2, StringUtils.indexOf("aabaabaa", "b", -1));
-        assertEquals(2,StringUtils.indexOf("aabaabaa", "", 2));
-
-        // Test that startIndex works correctly, i.e. cannot match before startIndex
-        assertEquals(7, StringUtils.indexOf("12345678", "8", 5));
-        assertEquals(7, StringUtils.indexOf("12345678", "8", 6));
-        assertEquals(7, StringUtils.indexOf("12345678", "8", 7)); // 7 is last index
-        assertEquals(-1, StringUtils.indexOf("12345678", "8", 8));
-
-        assertEquals(5, StringUtils.indexOf(new StringBuilder("aabaabaa"), "b", 3));
-    }
-
-    @Test
-    public void testIndexOfAny_StringCharArray() {
-        assertEquals(-1, StringUtils.indexOfAny(null, (char[]) null));
-        assertEquals(-1, StringUtils.indexOfAny(null, new char[0]));
-        assertEquals(-1, StringUtils.indexOfAny(null, new char[] {'a','b'}));
-
-        assertEquals(-1, StringUtils.indexOfAny("", (char[]) null));
-        assertEquals(-1, StringUtils.indexOfAny("", new char[0]));
-        assertEquals(-1, StringUtils.indexOfAny("", new char[] {'a','b'}));
-
-        assertEquals(-1, StringUtils.indexOfAny("zzabyycdxx", (char[]) null));
-        assertEquals(-1, StringUtils.indexOfAny("zzabyycdxx", new char[0]));
-        assertEquals(0, StringUtils.indexOfAny("zzabyycdxx", new char[] {'z','a'}));
-        assertEquals(3, StringUtils.indexOfAny("zzabyycdxx", new char[] {'b','y'}));
-        assertEquals(-1, StringUtils.indexOfAny("ab", new char[] {'z'}));
-    }
-
-    /**
-     * See http://www.oracle.com/technetwork/articles/javase/supplementary-142654.html
-     */
-    @Test
-    public void testIndexOfAny_StringCharArrayWithSupplementaryChars() {
-        assertEquals(0, StringUtils.indexOfAny(CharU20000 + CharU20001, CharU20000.toCharArray()));
-        assertEquals(2, StringUtils.indexOfAny(CharU20000 + CharU20001, CharU20001.toCharArray()));
-        assertEquals(0, StringUtils.indexOfAny(CharU20000, CharU20000.toCharArray()));
-        assertEquals(-1, StringUtils.indexOfAny(CharU20000, CharU20001.toCharArray()));
-    }
-
-    @Test
-    public void testIndexOfAny_StringString() {
-        assertEquals(-1, StringUtils.indexOfAny(null, (String) null));
-        assertEquals(-1, StringUtils.indexOfAny(null, ""));
-        assertEquals(-1, StringUtils.indexOfAny(null, "ab"));
-
-        assertEquals(-1, StringUtils.indexOfAny("", (String) null));
-        assertEquals(-1, StringUtils.indexOfAny("", ""));
-        assertEquals(-1, StringUtils.indexOfAny("", "ab"));
-
-        assertEquals(-1, StringUtils.indexOfAny("zzabyycdxx", (String) null));
-        assertEquals(-1, StringUtils.indexOfAny("zzabyycdxx", ""));
-        assertEquals(0, StringUtils.indexOfAny("zzabyycdxx", "za"));
-        assertEquals(3, StringUtils.indexOfAny("zzabyycdxx", "by"));
-        assertEquals(-1, StringUtils.indexOfAny("ab", "z"));
-    }
-
-    @Test
-    public void testIndexOfAny_StringStringArray() {
-        assertEquals(-1, StringUtils.indexOfAny(null, (String[]) null));
-        assertEquals(-1, StringUtils.indexOfAny(null, FOOBAR_SUB_ARRAY));
-        assertEquals(-1, StringUtils.indexOfAny(FOOBAR, (String[]) null));
-        assertEquals(2, StringUtils.indexOfAny(FOOBAR, FOOBAR_SUB_ARRAY));
-        assertEquals(-1, StringUtils.indexOfAny(FOOBAR, new String[0]));
-        assertEquals(-1, StringUtils.indexOfAny(null, new String[0]));
-        assertEquals(-1, StringUtils.indexOfAny("", new String[0]));
-        assertEquals(-1, StringUtils.indexOfAny(FOOBAR, new String[] {"llll"}));
-        assertEquals(0, StringUtils.indexOfAny(FOOBAR, new String[] {""}));
-        assertEquals(0, StringUtils.indexOfAny("", new String[] {""}));
-        assertEquals(-1, StringUtils.indexOfAny("", new String[] {"a"}));
-        assertEquals(-1, StringUtils.indexOfAny("", new String[] {null}));
-        assertEquals(-1, StringUtils.indexOfAny(FOOBAR, new String[] {null}));
-        assertEquals(-1, StringUtils.indexOfAny(null, new String[] {null}));
-    }
-
-    /**
-     * See http://www.oracle.com/technetwork/articles/javase/supplementary-142654.html
-     */
-    @Test
-    public void testIndexOfAny_StringStringWithSupplementaryChars() {
-        assertEquals(0, StringUtils.indexOfAny(CharU20000 + CharU20001, CharU20000));
-        assertEquals(2, StringUtils.indexOfAny(CharU20000 + CharU20001, CharU20001));
-        assertEquals(0, StringUtils.indexOfAny(CharU20000, CharU20000));
-        assertEquals(-1, StringUtils.indexOfAny(CharU20000, CharU20001));
-    }
-
-    @Test
-    public void testIndexOfAnyBut_StringCharArray() {
-        assertEquals(-1, StringUtils.indexOfAnyBut(null, (char[]) null));
-        assertEquals(-1, StringUtils.indexOfAnyBut(null, new char[0]));
-        assertEquals(-1, StringUtils.indexOfAnyBut(null, new char[] {'a','b'}));
-
-        assertEquals(-1, StringUtils.indexOfAnyBut("", (char[]) null));
-        assertEquals(-1, StringUtils.indexOfAnyBut("", new char[0]));
-        assertEquals(-1, StringUtils.indexOfAnyBut("", new char[] {'a','b'}));
-
-        assertEquals(-1, StringUtils.indexOfAnyBut("zzabyycdxx", (char[]) null));
-        assertEquals(-1, StringUtils.indexOfAnyBut("zzabyycdxx", new char[0]));
-        assertEquals(3, StringUtils.indexOfAnyBut("zzabyycdxx", new char[] {'z','a'}));
-        assertEquals(0, StringUtils.indexOfAnyBut("zzabyycdxx", new char[] {'b','y'}));
-        assertEquals(-1, StringUtils.indexOfAnyBut("aba", new char[] {'a', 'b'}));
-        assertEquals(0, StringUtils.indexOfAnyBut("aba", new char[] {'z'}));
-
-    }
-
-    @Test
-    public void testIndexOfAnyBut_StringCharArrayWithSupplementaryChars() {
-        assertEquals(2, StringUtils.indexOfAnyBut(CharU20000 + CharU20001, CharU20000.toCharArray()));
-        assertEquals(0, StringUtils.indexOfAnyBut(CharU20000 + CharU20001, CharU20001.toCharArray()));
-        assertEquals(-1, StringUtils.indexOfAnyBut(CharU20000, CharU20000.toCharArray()));
-        assertEquals(0, StringUtils.indexOfAnyBut(CharU20000, CharU20001.toCharArray()));
-    }
-
-    @Test
-    public void testIndexOfAnyBut_StringString() {
-        assertEquals(-1, StringUtils.indexOfAnyBut(null, (String) null));
-        assertEquals(-1, StringUtils.indexOfAnyBut(null, ""));
-        assertEquals(-1, StringUtils.indexOfAnyBut(null, "ab"));
-
-        assertEquals(-1, StringUtils.indexOfAnyBut("", (String) null));
-        assertEquals(-1, StringUtils.indexOfAnyBut("", ""));
-        assertEquals(-1, StringUtils.indexOfAnyBut("", "ab"));
-
-        assertEquals(-1, StringUtils.indexOfAnyBut("zzabyycdxx", (String) null));
-        assertEquals(-1, StringUtils.indexOfAnyBut("zzabyycdxx", ""));
-        assertEquals(3, StringUtils.indexOfAnyBut("zzabyycdxx", "za"));
-        assertEquals(0, StringUtils.indexOfAnyBut("zzabyycdxx", "by"));
-        assertEquals(0, StringUtils.indexOfAnyBut("ab", "z"));
-    }
-
-    @Test
-    public void testIndexOfAnyBut_StringStringWithSupplementaryChars() {
-        assertEquals(2, StringUtils.indexOfAnyBut(CharU20000 + CharU20001, CharU20000));
-        assertEquals(0, StringUtils.indexOfAnyBut(CharU20000 + CharU20001, CharU20001));
-        assertEquals(-1, StringUtils.indexOfAnyBut(CharU20000, CharU20000));
-        assertEquals(0, StringUtils.indexOfAnyBut(CharU20000, CharU20001));
-    }
-
-    @Test
-    public void testIndexOfIgnoreCase_String() {
-        assertEquals(-1, StringUtils.indexOfIgnoreCase(null, null));
-        assertEquals(-1, StringUtils.indexOfIgnoreCase(null, ""));
-        assertEquals(-1, StringUtils.indexOfIgnoreCase("", null));
-        assertEquals(0, StringUtils.indexOfIgnoreCase("", ""));
-        assertEquals(0, StringUtils.indexOfIgnoreCase("aabaabaa", "a"));
-        assertEquals(0, StringUtils.indexOfIgnoreCase("aabaabaa", "A"));
-        assertEquals(2, StringUtils.indexOfIgnoreCase("aabaabaa", "b"));
-        assertEquals(2, StringUtils.indexOfIgnoreCase("aabaabaa", "B"));
-        assertEquals(1, StringUtils.indexOfIgnoreCase("aabaabaa", "ab"));
-        assertEquals(1, StringUtils.indexOfIgnoreCase("aabaabaa", "AB"));
-        assertEquals(0, StringUtils.indexOfIgnoreCase("aabaabaa", ""));
-    }
-
-    @Test
-    public void testIndexOfIgnoreCase_StringInt() {
-        assertEquals(1, StringUtils.indexOfIgnoreCase("aabaabaa", "AB", -1));
-        assertEquals(1, StringUtils.indexOfIgnoreCase("aabaabaa", "AB", 0));
-        assertEquals(1, StringUtils.indexOfIgnoreCase("aabaabaa", "AB", 1));
-        assertEquals(4, StringUtils.indexOfIgnoreCase("aabaabaa", "AB", 2));
-        assertEquals(4, StringUtils.indexOfIgnoreCase("aabaabaa", "AB", 3));
-        assertEquals(4, StringUtils.indexOfIgnoreCase("aabaabaa", "AB", 4));
-        assertEquals(-1, StringUtils.indexOfIgnoreCase("aabaabaa", "AB", 5));
-        assertEquals(-1, StringUtils.indexOfIgnoreCase("aabaabaa", "AB", 6));
-        assertEquals(-1, StringUtils.indexOfIgnoreCase("aabaabaa", "AB", 7));
-        assertEquals(-1, StringUtils.indexOfIgnoreCase("aabaabaa", "AB", 8));
-        assertEquals(1, StringUtils.indexOfIgnoreCase("aab", "AB", 1));
-        assertEquals(5, StringUtils.indexOfIgnoreCase("aabaabaa", "", 5));
-        assertEquals(-1, StringUtils.indexOfIgnoreCase("ab", "AAB", 0));
-        assertEquals(-1, StringUtils.indexOfIgnoreCase("aab", "AAB", 1));
-    }
-
-    @Test
-    public void testLastIndexOf_char() {
-        assertEquals(-1, StringUtils.lastIndexOf(null, ' '));
-        assertEquals(-1, StringUtils.lastIndexOf("", ' '));
-        assertEquals(7, StringUtils.lastIndexOf("aabaabaa", 'a'));
-        assertEquals(5, StringUtils.lastIndexOf("aabaabaa", 'b'));
-
-        assertEquals(5, StringUtils.lastIndexOf(new StringBuilder("aabaabaa"), 'b'));
-    }
-
-    @Test
-    public void testLastIndexOf_charInt() {
-        assertEquals(-1, StringUtils.lastIndexOf(null, ' ', 0));
-        assertEquals(-1, StringUtils.lastIndexOf(null, ' ', -1));
-        assertEquals(-1, StringUtils.lastIndexOf("", ' ', 0));
-        assertEquals(-1, StringUtils.lastIndexOf("", ' ', -1));
-        assertEquals(7, StringUtils.lastIndexOf("aabaabaa", 'a', 8));
-        assertEquals(5, StringUtils.lastIndexOf("aabaabaa", 'b', 8));
-        assertEquals(2, StringUtils.lastIndexOf("aabaabaa", 'b', 3));
-        assertEquals(5, StringUtils.lastIndexOf("aabaabaa", 'b', 9));
-        assertEquals(-1, StringUtils.lastIndexOf("aabaabaa", 'b', -1));
-        assertEquals(0, StringUtils.lastIndexOf("aabaabaa", 'a', 0));
-
-        assertEquals(2, StringUtils.lastIndexOf(new StringBuilder("aabaabaa"), 'b', 2));
-    }
-
-    @Test
-    public void testLastIndexOf_String() {
-        assertEquals(-1, StringUtils.lastIndexOf(null, null));
-        assertEquals(-1, StringUtils.lastIndexOf("", null));
-        assertEquals(-1, StringUtils.lastIndexOf("", "a"));
-        assertEquals(0, StringUtils.lastIndexOf("", ""));
-        assertEquals(8, StringUtils.lastIndexOf("aabaabaa", ""));
-        assertEquals(7, StringUtils.lastIndexOf("aabaabaa", "a"));
-        assertEquals(5, StringUtils.lastIndexOf("aabaabaa", "b"));
-        assertEquals(4, StringUtils.lastIndexOf("aabaabaa", "ab"));
-
-        assertEquals(4, StringUtils.lastIndexOf(new StringBuilder("aabaabaa"), "ab"));
-    }
-
-    @Test
-    public void testLastIndexOf_StringInt() {
-        assertEquals(-1, StringUtils.lastIndexOf(null, null, 0));
-        assertEquals(-1, StringUtils.lastIndexOf(null, null, -1));
-        assertEquals(-1, StringUtils.lastIndexOf(null, "", 0));
-        assertEquals(-1, StringUtils.lastIndexOf(null, "", -1));
-        assertEquals(-1, StringUtils.lastIndexOf("", null, 0));
-        assertEquals(-1, StringUtils.lastIndexOf("", null, -1));
-        assertEquals(0, StringUtils.lastIndexOf("", "", 0));
-        assertEquals(-1, StringUtils.lastIndexOf("", "", -1));
-        assertEquals(0, StringUtils.lastIndexOf("", "", 9));
-        assertEquals(0, StringUtils.lastIndexOf("abc", "", 0));
-        assertEquals(-1, StringUtils.lastIndexOf("abc", "", -1));
-        assertEquals(3, StringUtils.lastIndexOf("abc", "", 9));
-        assertEquals(7, StringUtils.lastIndexOf("aabaabaa", "a", 8));
-        assertEquals(5, StringUtils.lastIndexOf("aabaabaa", "b", 8));
-        assertEquals(4, StringUtils.lastIndexOf("aabaabaa", "ab", 8));
-        assertEquals(2, StringUtils.lastIndexOf("aabaabaa", "b", 3));
-        assertEquals(5, StringUtils.lastIndexOf("aabaabaa", "b", 9));
-        assertEquals(-1, StringUtils.lastIndexOf("aabaabaa", "b", -1));
-        assertEquals(-1, StringUtils.lastIndexOf("aabaabaa", "b", 0));
-        assertEquals(0, StringUtils.lastIndexOf("aabaabaa", "a", 0));
-        assertEquals(-1, StringUtils.lastIndexOf("aabaabaa", "a", -1));
-
-        // Test that fromIndex works correctly, i.e. cannot match after fromIndex
-        assertEquals(7, StringUtils.lastIndexOf("12345678", "8", 9));
-        assertEquals(7, StringUtils.lastIndexOf("12345678", "8", 8));
-        assertEquals(7, StringUtils.lastIndexOf("12345678", "8", 7)); // 7 is last index
-        assertEquals(-1, StringUtils.lastIndexOf("12345678", "8", 6));
-
-        assertEquals(-1, StringUtils.lastIndexOf("aabaabaa", "b", 1));
-        assertEquals(2, StringUtils.lastIndexOf("aabaabaa", "b", 2));
-        assertEquals(2, StringUtils.lastIndexOf("aabaabaa", "ba", 2));
-        assertEquals(2, StringUtils.lastIndexOf("aabaabaa", "ba", 3));
-
-        assertEquals(2, StringUtils.lastIndexOf(new StringBuilder("aabaabaa"), "b", 3));
-    }
-
-    @Test
-    public void testLastIndexOfAny_StringStringArray() {
-        assertEquals(-1, StringUtils.lastIndexOfAny(null, (CharSequence) null));   // test both types of ...
-        assertEquals(-1, StringUtils.lastIndexOfAny(null, (CharSequence[]) null)); // ... varargs invocation
-        assertEquals(-1, StringUtils.lastIndexOfAny(null)); // Missing varag
-        assertEquals(-1, StringUtils.lastIndexOfAny(null, FOOBAR_SUB_ARRAY));
-        assertEquals(-1, StringUtils.lastIndexOfAny(FOOBAR, (CharSequence) null));   // test both types of ...
-        assertEquals(-1, StringUtils.lastIndexOfAny(FOOBAR, (CharSequence[]) null)); // ... varargs invocation
-        assertEquals(-1, StringUtils.lastIndexOfAny(FOOBAR)); // Missing vararg
-        assertEquals(3, StringUtils.lastIndexOfAny(FOOBAR, FOOBAR_SUB_ARRAY));
-        assertEquals(-1, StringUtils.lastIndexOfAny(FOOBAR, new String[0]));
-        assertEquals(-1, StringUtils.lastIndexOfAny(null, new String[0]));
-        assertEquals(-1, StringUtils.lastIndexOfAny("", new String[0]));
-        assertEquals(-1, StringUtils.lastIndexOfAny(FOOBAR, new String[] {"llll"}));
-        assertEquals(6, StringUtils.lastIndexOfAny(FOOBAR, new String[] {""}));
-        assertEquals(0, StringUtils.lastIndexOfAny("", new String[] {""}));
-        assertEquals(-1, StringUtils.lastIndexOfAny("", new String[] {"a"}));
-        assertEquals(-1, StringUtils.lastIndexOfAny("", new String[] {null}));
-        assertEquals(-1, StringUtils.lastIndexOfAny(FOOBAR, new String[] {null}));
-        assertEquals(-1, StringUtils.lastIndexOfAny(null, new String[] {null}));
-    }
-
-    @Test
-    public void testLastIndexOfIgnoreCase_String() {
-        assertEquals(-1, StringUtils.lastIndexOfIgnoreCase(null, null));
-        assertEquals(-1, StringUtils.lastIndexOfIgnoreCase("", null));
-        assertEquals(-1, StringUtils.lastIndexOfIgnoreCase(null, ""));
-        assertEquals(-1, StringUtils.lastIndexOfIgnoreCase("", "a"));
-        assertEquals(0, StringUtils.lastIndexOfIgnoreCase("", ""));
-        assertEquals(8, StringUtils.lastIndexOfIgnoreCase("aabaabaa", ""));
-        assertEquals(7, StringUtils.lastIndexOfIgnoreCase("aabaabaa", "a"));
-        assertEquals(7, StringUtils.lastIndexOfIgnoreCase("aabaabaa", "A"));
-        assertEquals(5, StringUtils.lastIndexOfIgnoreCase("aabaabaa", "b"));
-        assertEquals(5, StringUtils.lastIndexOfIgnoreCase("aabaabaa", "B"));
-        assertEquals(4, StringUtils.lastIndexOfIgnoreCase("aabaabaa", "ab"));
-        assertEquals(4, StringUtils.lastIndexOfIgnoreCase("aabaabaa", "AB"));
-        assertEquals(-1, StringUtils.lastIndexOfIgnoreCase("ab", "AAB"));
-        assertEquals(0, StringUtils.lastIndexOfIgnoreCase("aab", "AAB"));
-    }
-
-    @Test
-    public void testLastIndexOfIgnoreCase_StringInt() {
-        assertEquals(-1, StringUtils.lastIndexOfIgnoreCase(null, null, 0));
-        assertEquals(-1, StringUtils.lastIndexOfIgnoreCase(null, null, -1));
-        assertEquals(-1, StringUtils.lastIndexOfIgnoreCase(null, "", 0));
-        assertEquals(-1, StringUtils.lastIndexOfIgnoreCase(null, "", -1));
-        assertEquals(-1, StringUtils.lastIndexOfIgnoreCase("", null, 0));
-        assertEquals(-1, StringUtils.lastIndexOfIgnoreCase("", null, -1));
-        assertEquals(0, StringUtils.lastIndexOfIgnoreCase("", "", 0));
-        assertEquals(-1, StringUtils.lastIndexOfIgnoreCase("", "", -1));
-        assertEquals(0, StringUtils.lastIndexOfIgnoreCase("", "", 9));
-        assertEquals(0, StringUtils.lastIndexOfIgnoreCase("abc", "", 0));
-        assertEquals(-1, StringUtils.lastIndexOfIgnoreCase("abc", "", -1));
-        assertEquals(3, StringUtils.lastIndexOfIgnoreCase("abc", "", 9));
-        assertEquals(7, StringUtils.lastIndexOfIgnoreCase("aabaabaa", "A", 8));
-        assertEquals(5, StringUtils.lastIndexOfIgnoreCase("aabaabaa", "B", 8));
-        assertEquals(4, StringUtils.lastIndexOfIgnoreCase("aabaabaa", "AB", 8));
-        assertEquals(2, StringUtils.lastIndexOfIgnoreCase("aabaabaa", "B", 3));
-        assertEquals(5, StringUtils.lastIndexOfIgnoreCase("aabaabaa", "B", 9));
-        assertEquals(-1, StringUtils.lastIndexOfIgnoreCase("aabaabaa", "B", -1));
-        assertEquals(-1, StringUtils.lastIndexOfIgnoreCase("aabaabaa", "B", 0));
-        assertEquals(0, StringUtils.lastIndexOfIgnoreCase("aabaabaa", "A", 0));
-        assertEquals(1, StringUtils.lastIndexOfIgnoreCase("aab", "AB", 1));
-    }
-
-    @Test
-    public void testLastOrdinalIndexOf() {
-        assertEquals(-1, StringUtils.lastOrdinalIndexOf(null, "*", 42) );
-        assertEquals(-1, StringUtils.lastOrdinalIndexOf("*", null, 42) );
-        assertEquals(0, StringUtils.lastOrdinalIndexOf("", "", 42) );
-        assertEquals(7, StringUtils.lastOrdinalIndexOf("aabaabaa", "a", 1) );
-        assertEquals(6, StringUtils.lastOrdinalIndexOf("aabaabaa", "a", 2) );
-        assertEquals(5, StringUtils.lastOrdinalIndexOf("aabaabaa", "b", 1) );
-        assertEquals(2, StringUtils.lastOrdinalIndexOf("aabaabaa", "b", 2) );
-        assertEquals(4, StringUtils.lastOrdinalIndexOf("aabaabaa", "ab", 1) );
-        assertEquals(1, StringUtils.lastOrdinalIndexOf("aabaabaa", "ab", 2) );
-        assertEquals(8, StringUtils.lastOrdinalIndexOf("aabaabaa", "", 1) );
-        assertEquals(8, StringUtils.lastOrdinalIndexOf("aabaabaa", "", 2) );
-    }
-
-    @Test
-    public void testOrdinalIndexOf() {
-        assertEquals(-1, StringUtils.ordinalIndexOf(null, null, Integer.MIN_VALUE));
-        assertEquals(-1, StringUtils.ordinalIndexOf("", null, Integer.MIN_VALUE));
-        assertEquals(-1, StringUtils.ordinalIndexOf("", "", Integer.MIN_VALUE));
-        assertEquals(-1, StringUtils.ordinalIndexOf("aabaabaa", "a", Integer.MIN_VALUE));
-        assertEquals(-1, StringUtils.ordinalIndexOf("aabaabaa", "b", Integer.MIN_VALUE));
-        assertEquals(-1, StringUtils.ordinalIndexOf("aabaabaa", "ab", Integer.MIN_VALUE));
-        assertEquals(-1, StringUtils.ordinalIndexOf("aabaabaa", "", Integer.MIN_VALUE));
-
-        assertEquals(-1, StringUtils.ordinalIndexOf(null, null, -1));
-        assertEquals(-1, StringUtils.ordinalIndexOf("", null, -1));
-        assertEquals(-1, StringUtils.ordinalIndexOf("", "", -1));
-        assertEquals(-1, StringUtils.ordinalIndexOf("aabaabaa", "a", -1));
-        assertEquals(-1, StringUtils.ordinalIndexOf("aabaabaa", "b", -1));
-        assertEquals(-1, StringUtils.ordinalIndexOf("aabaabaa", "ab", -1));
-        assertEquals(-1, StringUtils.ordinalIndexOf("aabaabaa", "", -1));
-
-        assertEquals(-1, StringUtils.ordinalIndexOf(null, null, 0));
-        assertEquals(-1, StringUtils.ordinalIndexOf("", null, 0));
-        assertEquals(-1, StringUtils.ordinalIndexOf("", "", 0));
-        assertEquals(-1, StringUtils.ordinalIndexOf("aabaabaa", "a", 0));
-        assertEquals(-1, StringUtils.ordinalIndexOf("aabaabaa", "b", 0));
-        assertEquals(-1, StringUtils.ordinalIndexOf("aabaabaa", "ab", 0));
-        assertEquals(-1, StringUtils.ordinalIndexOf("aabaabaa", "", 0));
-
-        assertEquals(-1, StringUtils.ordinalIndexOf(null, null, 1));
-        assertEquals(-1, StringUtils.ordinalIndexOf("", null, 1));
-        assertEquals(0, StringUtils.ordinalIndexOf("", "", 1));
-        assertEquals(0, StringUtils.ordinalIndexOf("aabaabaa", "a", 1));
-        assertEquals(2, StringUtils.ordinalIndexOf("aabaabaa", "b", 1));
-        assertEquals(1, StringUtils.ordinalIndexOf("aabaabaa", "ab", 1));
-        assertEquals(0, StringUtils.ordinalIndexOf("aabaabaa", "", 1));
-
-        assertEquals(-1, StringUtils.ordinalIndexOf(null, null, 2));
-        assertEquals(-1, StringUtils.ordinalIndexOf("", null, 2));
-        assertEquals(0, StringUtils.ordinalIndexOf("", "", 2));
-        assertEquals(1, StringUtils.ordinalIndexOf("aabaabaa", "a", 2));
-        assertEquals(5, StringUtils.ordinalIndexOf("aabaabaa", "b", 2));
-        assertEquals(4, StringUtils.ordinalIndexOf("aabaabaa", "ab", 2));
-        assertEquals(0, StringUtils.ordinalIndexOf("aabaabaa", "", 2));
-
-        assertEquals(-1, StringUtils.ordinalIndexOf(null, null, Integer.MAX_VALUE));
-        assertEquals(-1, StringUtils.ordinalIndexOf("", null, Integer.MAX_VALUE));
-        assertEquals(0, StringUtils.ordinalIndexOf("", "", Integer.MAX_VALUE));
-        assertEquals(-1, StringUtils.ordinalIndexOf("aabaabaa", "a", Integer.MAX_VALUE));
-        assertEquals(-1, StringUtils.ordinalIndexOf("aabaabaa", "b", Integer.MAX_VALUE));
-        assertEquals(-1, StringUtils.ordinalIndexOf("aabaabaa", "ab", Integer.MAX_VALUE));
-        assertEquals(0, StringUtils.ordinalIndexOf("aabaabaa", "", Integer.MAX_VALUE));
-
-        assertEquals(-1, StringUtils.ordinalIndexOf("aaaaaaaaa", "a", 0));
-        assertEquals(0, StringUtils.ordinalIndexOf("aaaaaaaaa", "a", 1));
-        assertEquals(1, StringUtils.ordinalIndexOf("aaaaaaaaa", "a", 2));
-        assertEquals(2, StringUtils.ordinalIndexOf("aaaaaaaaa", "a", 3));
-        assertEquals(3, StringUtils.ordinalIndexOf("aaaaaaaaa", "a", 4));
-        assertEquals(4, StringUtils.ordinalIndexOf("aaaaaaaaa", "a", 5));
-        assertEquals(5, StringUtils.ordinalIndexOf("aaaaaaaaa", "a", 6));
-        assertEquals(6, StringUtils.ordinalIndexOf("aaaaaaaaa", "a", 7));
-        assertEquals(7, StringUtils.ordinalIndexOf("aaaaaaaaa", "a", 8));
-        assertEquals(8, StringUtils.ordinalIndexOf("aaaaaaaaa", "a", 9));
-        assertEquals(-1, StringUtils.ordinalIndexOf("aaaaaaaaa", "a", 10));
-
-        assertEquals(3, StringUtils.ordinalIndexOf("aaaaaa", "aa", 2));
-        assertEquals(-1, StringUtils.ordinalIndexOf("aaaaaa", "aa", 3));
-    }
-
-}
diff --git a/lang/src/test/java/org/apache/commons/lang3/StringUtilsIsTest.java b/lang/src/test/java/org/apache/commons/lang3/StringUtilsIsTest.java
deleted file mode 100644
index 057aa76..0000000
--- a/lang/src/test/java/org/apache/commons/lang3/StringUtilsIsTest.java
+++ /dev/null
@@ -1,177 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- * 
- *      http://www.apache.org/licenses/LICENSE-2.0
- * 
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.commons.lang3;
-
-import static org.junit.Assert.assertFalse;
-import static org.junit.Assert.assertTrue;
-
-import org.junit.Test;
-
-/**
- * Unit tests {@link org.apache.commons.lang3.StringUtils} - Substring methods
- *
- * @version $Id$
- */
-public class StringUtilsIsTest  {
-
-    //-----------------------------------------------------------------------
-
-    @Test
-    public void testIsAlpha() {
-        assertFalse(StringUtils.isAlpha(null));
-        assertFalse(StringUtils.isAlpha(""));
-        assertFalse(StringUtils.isAlpha(" "));
-        assertTrue(StringUtils.isAlpha("a"));
-        assertTrue(StringUtils.isAlpha("A"));
-        assertTrue(StringUtils.isAlpha("kgKgKgKgkgkGkjkjlJlOKLgHdGdHgl"));
-        assertFalse(StringUtils.isAlpha("ham kso"));
-        assertFalse(StringUtils.isAlpha("1"));
-        assertFalse(StringUtils.isAlpha("hkHKHik6iUGHKJgU7tUJgKJGI87GIkug"));
-        assertFalse(StringUtils.isAlpha("_"));
-        assertFalse(StringUtils.isAlpha("hkHKHik*khbkuh"));
-    }
-
-    @Test
-    public void testIsAlphanumeric() {
-        assertFalse(StringUtils.isAlphanumeric(null));
-        assertFalse(StringUtils.isAlphanumeric(""));
-        assertFalse(StringUtils.isAlphanumeric(" "));
-        assertTrue(StringUtils.isAlphanumeric("a"));
-        assertTrue(StringUtils.isAlphanumeric("A"));
-        assertTrue(StringUtils.isAlphanumeric("kgKgKgKgkgkGkjkjlJlOKLgHdGdHgl"));
-        assertFalse(StringUtils.isAlphanumeric("ham kso"));
-        assertTrue(StringUtils.isAlphanumeric("1"));
-        assertTrue(StringUtils.isAlphanumeric("hkHKHik6iUGHKJgU7tUJgKJGI87GIkug"));
-        assertFalse(StringUtils.isAlphanumeric("_"));
-        assertFalse(StringUtils.isAlphanumeric("hkHKHik*khbkuh"));
-    }
-
-    @Test
-    public void testIsWhitespace() {
-        assertFalse(StringUtils.isWhitespace(null));
-        assertTrue(StringUtils.isWhitespace(""));
-        assertTrue(StringUtils.isWhitespace(" "));
-        assertTrue(StringUtils.isWhitespace("\t \n \t"));
-        assertFalse(StringUtils.isWhitespace("\t aa\n \t"));
-        assertTrue(StringUtils.isWhitespace(" "));
-        assertFalse(StringUtils.isWhitespace(" a "));
-        assertFalse(StringUtils.isWhitespace("a  "));
-        assertFalse(StringUtils.isWhitespace("  a"));
-        assertFalse(StringUtils.isWhitespace("aba"));
-        assertTrue(StringUtils.isWhitespace(StringUtilsTest.WHITESPACE));
-        assertFalse(StringUtils.isWhitespace(StringUtilsTest.NON_WHITESPACE));
-    }
-
-    @Test
-    public void testIsAlphaspace() {
-        assertFalse(StringUtils.isAlphaSpace(null));
-        assertTrue(StringUtils.isAlphaSpace(""));
-        assertTrue(StringUtils.isAlphaSpace(" "));
-        assertTrue(StringUtils.isAlphaSpace("a"));
-        assertTrue(StringUtils.isAlphaSpace("A"));
-        assertTrue(StringUtils.isAlphaSpace("kgKgKgKgkgkGkjkjlJlOKLgHdGdHgl"));
-        assertTrue(StringUtils.isAlphaSpace("ham kso"));
-        assertFalse(StringUtils.isAlphaSpace("1"));
-        assertFalse(StringUtils.isAlphaSpace("hkHKHik6iUGHKJgU7tUJgKJGI87GIkug"));
-        assertFalse(StringUtils.isAlphaSpace("_"));
-        assertFalse(StringUtils.isAlphaSpace("hkHKHik*khbkuh"));
-    }
-
-    @Test
-    public void testIsAlphanumericSpace() {
-        assertFalse(StringUtils.isAlphanumericSpace(null));
-        assertTrue(StringUtils.isAlphanumericSpace(""));
-        assertTrue(StringUtils.isAlphanumericSpace(" "));
-        assertTrue(StringUtils.isAlphanumericSpace("a"));
-        assertTrue(StringUtils.isAlphanumericSpace("A"));
-        assertTrue(StringUtils.isAlphanumericSpace("kgKgKgKgkgkGkjkjlJlOKLgHdGdHgl"));
-        assertTrue(StringUtils.isAlphanumericSpace("ham kso"));
-        assertTrue(StringUtils.isAlphanumericSpace("1"));
-        assertTrue(StringUtils.isAlphanumericSpace("hkHKHik6iUGHKJgU7tUJgKJGI87GIkug"));
-        assertFalse(StringUtils.isAlphanumericSpace("_"));
-        assertFalse(StringUtils.isAlphanumericSpace("hkHKHik*khbkuh"));
-    }
-
-    @Test
-    public void testIsAsciiPrintable_String() {
-        assertFalse(StringUtils.isAsciiPrintable(null));
-        assertTrue(StringUtils.isAsciiPrintable(""));
-        assertTrue(StringUtils.isAsciiPrintable(" "));
-        assertTrue(StringUtils.isAsciiPrintable("a"));
-        assertTrue(StringUtils.isAsciiPrintable("A"));
-        assertTrue(StringUtils.isAsciiPrintable("1"));
-        assertTrue(StringUtils.isAsciiPrintable("Ceki"));
-        assertTrue(StringUtils.isAsciiPrintable("!ab2c~"));
-        assertTrue(StringUtils.isAsciiPrintable("1000"));
-        assertTrue(StringUtils.isAsciiPrintable("10 00"));
-        assertFalse(StringUtils.isAsciiPrintable("10\t00"));
-        assertTrue(StringUtils.isAsciiPrintable("10.00"));
-        assertTrue(StringUtils.isAsciiPrintable("10,00"));
-        assertTrue(StringUtils.isAsciiPrintable("!ab-c~"));
-        assertTrue(StringUtils.isAsciiPrintable("hkHK=Hik6i?UGH_KJgU7.tUJgKJ*GI87GI,kug"));
-        assertTrue(StringUtils.isAsciiPrintable("\u0020"));
-        assertTrue(StringUtils.isAsciiPrintable("\u0021"));
-        assertTrue(StringUtils.isAsciiPrintable("\u007e"));
-        assertFalse(StringUtils.isAsciiPrintable("\u007f"));
-        assertTrue(StringUtils.isAsciiPrintable("G?lc?"));
-        assertTrue(StringUtils.isAsciiPrintable("=?iso-8859-1?Q?G=FClc=FC?="));
-        assertFalse(StringUtils.isAsciiPrintable("G\u00fclc\u00fc"));
-    }
-  
-    @Test
-    public void testIsNumeric() {
-        assertFalse(StringUtils.isNumeric(null));
-        assertFalse(StringUtils.isNumeric(""));
-        assertFalse(StringUtils.isNumeric(" "));
-        assertFalse(StringUtils.isNumeric("a"));
-        assertFalse(StringUtils.isNumeric("A"));
-        assertFalse(StringUtils.isNumeric("kgKgKgKgkgkGkjkjlJlOKLgHdGdHgl"));
-        assertFalse(StringUtils.isNumeric("ham kso"));
-        assertTrue(StringUtils.isNumeric("1"));
-        assertTrue(StringUtils.isNumeric("1000"));
-        assertTrue(StringUtils.isNumeric("\u0967\u0968\u0969"));
-        assertFalse(StringUtils.isNumeric("\u0967\u0968 \u0969"));
-        assertFalse(StringUtils.isNumeric("2.3"));
-        assertFalse(StringUtils.isNumeric("10 00"));
-        assertFalse(StringUtils.isNumeric("hkHKHik6iUGHKJgU7tUJgKJGI87GIkug"));
-        assertFalse(StringUtils.isNumeric("_"));
-        assertFalse(StringUtils.isNumeric("hkHKHik*khbkuh"));
-        assertFalse(StringUtils.isNumeric("+123"));
-        assertFalse(StringUtils.isNumeric("-123"));
-    }
-
-    @Test
-    public void testIsNumericSpace() {
-        assertFalse(StringUtils.isNumericSpace(null));
-        assertTrue(StringUtils.isNumericSpace(""));
-        assertTrue(StringUtils.isNumericSpace(" "));
-        assertFalse(StringUtils.isNumericSpace("a"));
-        assertFalse(StringUtils.isNumericSpace("A"));
-        assertFalse(StringUtils.isNumericSpace("kgKgKgKgkgkGkjkjlJlOKLgHdGdHgl"));
-        assertFalse(StringUtils.isNumericSpace("ham kso"));
-        assertTrue(StringUtils.isNumericSpace("1"));
-        assertTrue(StringUtils.isNumericSpace("1000"));
-        assertFalse(StringUtils.isNumericSpace("2.3"));
-        assertTrue(StringUtils.isNumericSpace("10 00"));
-        assertTrue(StringUtils.isNumericSpace("\u0967\u0968\u0969"));
-        assertTrue(StringUtils.isNumericSpace("\u0967\u0968 \u0969"));
-        assertFalse(StringUtils.isNumericSpace("hkHKHik6iUGHKJgU7tUJgKJGI87GIkug"));
-        assertFalse(StringUtils.isNumericSpace("_"));
-        assertFalse(StringUtils.isNumericSpace("hkHKHik*khbkuh"));
-    }
-
-}
diff --git a/lang/src/test/java/org/apache/commons/lang3/StringUtilsStartsEndsWithTest.java b/lang/src/test/java/org/apache/commons/lang3/StringUtilsStartsEndsWithTest.java
deleted file mode 100644
index 440793d..0000000
--- a/lang/src/test/java/org/apache/commons/lang3/StringUtilsStartsEndsWithTest.java
+++ /dev/null
@@ -1,183 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- * 
- *      http://www.apache.org/licenses/LICENSE-2.0
- * 
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.commons.lang3;
-
-import org.junit.Test;
-import static org.junit.Assert.*;
-import org.apache.commons.lang3.text.StrBuilder;
-
-/**
- * Unit tests {@link org.apache.commons.lang3.StringUtils} - StartsWith/EndsWith methods
- *
- * @version $Id$
- */
-public class StringUtilsStartsEndsWithTest {
-    private static final String foo    = "foo";
-    private static final String bar    = "bar";
-    private static final String foobar = "foobar";
-    private static final String FOO    = "FOO";
-    private static final String BAR    = "BAR";
-    private static final String FOOBAR = "FOOBAR";
-
-    //-----------------------------------------------------------------------
-
-    /**
-     * Test StringUtils.startsWith()
-     */
-    @Test
-    public void testStartsWith() {
-        assertTrue("startsWith(null, null)", StringUtils.startsWith(null, (String)null));
-        assertFalse("startsWith(FOOBAR, null)", StringUtils.startsWith(FOOBAR, (String)null));
-        assertFalse("startsWith(null, FOO)",    StringUtils.startsWith(null, FOO));
-        assertTrue("startsWith(FOOBAR, \"\")",  StringUtils.startsWith(FOOBAR, ""));
-
-        assertTrue("startsWith(foobar, foo)",  StringUtils.startsWith(foobar, foo));
-        assertTrue("startsWith(FOOBAR, FOO)",  StringUtils.startsWith(FOOBAR, FOO));
-        assertFalse("startsWith(foobar, FOO)", StringUtils.startsWith(foobar, FOO));
-        assertFalse("startsWith(FOOBAR, foo)", StringUtils.startsWith(FOOBAR, foo));
-
-        assertFalse("startsWith(foo, foobar)", StringUtils.startsWith(foo, foobar));
-        assertFalse("startsWith(foo, foobar)", StringUtils.startsWith(bar, foobar));
-
-        assertFalse("startsWith(foobar, bar)", StringUtils.startsWith(foobar, bar));
-        assertFalse("startsWith(FOOBAR, BAR)", StringUtils.startsWith(FOOBAR, BAR));
-        assertFalse("startsWith(foobar, BAR)", StringUtils.startsWith(foobar, BAR));
-        assertFalse("startsWith(FOOBAR, bar)", StringUtils.startsWith(FOOBAR, bar));
-    }
-
-    /**
-     * Test StringUtils.testStartsWithIgnoreCase()
-     */
-    @Test
-    public void testStartsWithIgnoreCase() {
-        assertTrue("startsWithIgnoreCase(null, null)",    StringUtils.startsWithIgnoreCase(null, (String)null));
-        assertFalse("startsWithIgnoreCase(FOOBAR, null)", StringUtils.startsWithIgnoreCase(FOOBAR, (String)null));
-        assertFalse("startsWithIgnoreCase(null, FOO)",    StringUtils.startsWithIgnoreCase(null, FOO));
-        assertTrue("startsWithIgnoreCase(FOOBAR, \"\")",  StringUtils.startsWithIgnoreCase(FOOBAR, ""));
-
-        assertTrue("startsWithIgnoreCase(foobar, foo)", StringUtils.startsWithIgnoreCase(foobar, foo));
-        assertTrue("startsWithIgnoreCase(FOOBAR, FOO)", StringUtils.startsWithIgnoreCase(FOOBAR, FOO));
-        assertTrue("startsWithIgnoreCase(foobar, FOO)", StringUtils.startsWithIgnoreCase(foobar, FOO));
-        assertTrue("startsWithIgnoreCase(FOOBAR, foo)", StringUtils.startsWithIgnoreCase(FOOBAR, foo));
-
-        assertFalse("startsWithIgnoreCase(foo, foobar)", StringUtils.startsWithIgnoreCase(foo, foobar));
-        assertFalse("startsWithIgnoreCase(foo, foobar)", StringUtils.startsWithIgnoreCase(bar, foobar));
-
-        assertFalse("startsWithIgnoreCase(foobar, bar)", StringUtils.startsWithIgnoreCase(foobar, bar));
-        assertFalse("startsWithIgnoreCase(FOOBAR, BAR)", StringUtils.startsWithIgnoreCase(FOOBAR, BAR));
-        assertFalse("startsWithIgnoreCase(foobar, BAR)", StringUtils.startsWithIgnoreCase(foobar, BAR));
-        assertFalse("startsWithIgnoreCase(FOOBAR, bar)", StringUtils.startsWithIgnoreCase(FOOBAR, bar));
-    }
-
-    @Test
-    public void testStartsWithAny() {
-        assertFalse(StringUtils.startsWithAny(null, (String[])null));
-        assertFalse(StringUtils.startsWithAny(null, "abc"));
-        assertFalse(StringUtils.startsWithAny("abcxyz", (String[])null));
-        assertFalse(StringUtils.startsWithAny("abcxyz"));
-        assertTrue(StringUtils.startsWithAny("abcxyz", "abc"));
-        assertTrue(StringUtils.startsWithAny("abcxyz", null, "xyz", "abc"));
-        assertFalse(StringUtils.startsWithAny("abcxyz", null, "xyz", "abcd"));
-
-        assertTrue("StringUtils.startsWithAny(abcxyz, StringBuilder(xyz), StringBuffer(abc))", StringUtils.startsWithAny("abcxyz", new StringBuilder("xyz"), new StringBuffer("abc")));
-        assertTrue("StringUtils.startsWithAny( StrBuilder(abcxyz), StringBuilder(xyz), StringBuffer(abc))", StringUtils.startsWithAny( new StrBuilder("abcxyz"), new StringBuilder("xyz"), new StringBuffer("abc")));
-    }
- 
-
-    /**
-     * Test StringUtils.endsWith()
-     */
-    @Test
-    public void testEndsWith() {
-        assertTrue("endsWith(null, null)",    StringUtils.endsWith(null, (String)null));
-        assertFalse("endsWith(FOOBAR, null)", StringUtils.endsWith(FOOBAR, (String)null));
-        assertFalse("endsWith(null, FOO)",    StringUtils.endsWith(null, FOO));
-        assertTrue("endsWith(FOOBAR, \"\")",  StringUtils.endsWith(FOOBAR, ""));
-
-        assertFalse("endsWith(foobar, foo)", StringUtils.endsWith(foobar, foo));
-        assertFalse("endsWith(FOOBAR, FOO)", StringUtils.endsWith(FOOBAR, FOO));
-        assertFalse("endsWith(foobar, FOO)", StringUtils.endsWith(foobar, FOO));
-        assertFalse("endsWith(FOOBAR, foo)", StringUtils.endsWith(FOOBAR, foo));
-
-        assertFalse("endsWith(foo, foobar)", StringUtils.endsWith(foo, foobar));
-        assertFalse("endsWith(foo, foobar)", StringUtils.endsWith(bar, foobar));
-
-        assertTrue("endsWith(foobar, bar)",  StringUtils.endsWith(foobar, bar));
-        assertTrue("endsWith(FOOBAR, BAR)",  StringUtils.endsWith(FOOBAR, BAR));
-        assertFalse("endsWith(foobar, BAR)", StringUtils.endsWith(foobar, BAR));
-        assertFalse("endsWith(FOOBAR, bar)", StringUtils.endsWith(FOOBAR, bar));
-
-        // "alpha,beta,gamma,delta".endsWith("delta")
-        assertTrue("endsWith(\u03B1\u03B2\u03B3\u03B4, \u03B4)",
-                StringUtils.endsWith("\u03B1\u03B2\u03B3\u03B4", "\u03B4"));
-        // "alpha,beta,gamma,delta".endsWith("gamma,DELTA")
-        assertFalse("endsWith(\u03B1\u03B2\u03B3\u03B4, \u03B3\u0394)",
-                StringUtils.endsWith("\u03B1\u03B2\u03B3\u03B4", "\u03B3\u0394"));
-    }
-
-    /**
-     * Test StringUtils.endsWithIgnoreCase()
-     */
-    @Test
-    public void testEndsWithIgnoreCase() {
-        assertTrue("endsWithIgnoreCase(null, null)",    StringUtils.endsWithIgnoreCase(null, (String)null));
-        assertFalse("endsWithIgnoreCase(FOOBAR, null)", StringUtils.endsWithIgnoreCase(FOOBAR, (String)null));
-        assertFalse("endsWithIgnoreCase(null, FOO)",    StringUtils.endsWithIgnoreCase(null, FOO));
-        assertTrue("endsWithIgnoreCase(FOOBAR, \"\")",  StringUtils.endsWithIgnoreCase(FOOBAR, ""));
-
-        assertFalse("endsWithIgnoreCase(foobar, foo)", StringUtils.endsWithIgnoreCase(foobar, foo));
-        assertFalse("endsWithIgnoreCase(FOOBAR, FOO)", StringUtils.endsWithIgnoreCase(FOOBAR, FOO));
-        assertFalse("endsWithIgnoreCase(foobar, FOO)", StringUtils.endsWithIgnoreCase(foobar, FOO));
-        assertFalse("endsWithIgnoreCase(FOOBAR, foo)", StringUtils.endsWithIgnoreCase(FOOBAR, foo));
-
-        assertFalse("endsWithIgnoreCase(foo, foobar)", StringUtils.endsWithIgnoreCase(foo, foobar));
-        assertFalse("endsWithIgnoreCase(foo, foobar)", StringUtils.endsWithIgnoreCase(bar, foobar));
-
-        assertTrue("endsWithIgnoreCase(foobar, bar)", StringUtils.endsWithIgnoreCase(foobar, bar));
-        assertTrue("endsWithIgnoreCase(FOOBAR, BAR)", StringUtils.endsWithIgnoreCase(FOOBAR, BAR));
-        assertTrue("endsWithIgnoreCase(foobar, BAR)", StringUtils.endsWithIgnoreCase(foobar, BAR));
-        assertTrue("endsWithIgnoreCase(FOOBAR, bar)", StringUtils.endsWithIgnoreCase(FOOBAR, bar));
-
-        // javadoc
-        assertTrue(StringUtils.endsWithIgnoreCase("abcdef", "def"));
-        assertTrue(StringUtils.endsWithIgnoreCase("ABCDEF", "def"));
-        assertFalse(StringUtils.endsWithIgnoreCase("ABCDEF", "cde"));
-
-        // "alpha,beta,gamma,delta".endsWith("DELTA")
-        assertTrue("endsWith(\u03B1\u03B2\u03B3\u03B4, \u0394)",
-                StringUtils.endsWithIgnoreCase("\u03B1\u03B2\u03B3\u03B4", "\u0394"));
-        // "alpha,beta,gamma,delta".endsWith("GAMMA")
-        assertFalse("endsWith(\u03B1\u03B2\u03B3\u03B4, \u0393)",
-                StringUtils.endsWithIgnoreCase("\u03B1\u03B2\u03B3\u03B4", "\u0393"));
-    }
-
-    @Test
-    public void testEndsWithAny() {
-        assertFalse("StringUtils.endsWithAny(null, null)", StringUtils.endsWithAny(null, (String)null));
-        assertFalse("StringUtils.endsWithAny(null, new String[] {abc})", StringUtils.endsWithAny(null, new String[] {"abc"}));
-        assertFalse("StringUtils.endsWithAny(abcxyz, null)", StringUtils.endsWithAny("abcxyz", (String)null));
-        assertTrue("StringUtils.endsWithAny(abcxyz, new String[] {\"\"})", StringUtils.endsWithAny("abcxyz", new String[] {""}));
-        assertTrue("StringUtils.endsWithAny(abcxyz, new String[] {xyz})", StringUtils.endsWithAny("abcxyz", new String[] {"xyz"}));
-        assertTrue("StringUtils.endsWithAny(abcxyz, new String[] {null, xyz, abc})", StringUtils.endsWithAny("abcxyz", new String[] {null, "xyz", "abc"}));
-        assertFalse("StringUtils.endsWithAny(defg, new String[] {null, xyz, abc})", StringUtils.endsWithAny("defg", new String[] {null, "xyz", "abc"}));
-
-        assertTrue("StringUtils.endsWithAny(abcxyz, StringBuilder(abc), StringBuffer(xyz))", StringUtils.endsWithAny("abcxyz", new StringBuilder("abc"), new StringBuffer("xyz")));
-        assertTrue("StringUtils.endsWithAny( StrBuilder(abcxyz), StringBuilder(abc), StringBuffer(xyz))", StringUtils.endsWithAny( new StrBuilder("abcxyz"), new StringBuilder("abc"), new StringBuffer("xyz")));
-    }
-
-
-}
diff --git a/lang/src/test/java/org/apache/commons/lang3/StringUtilsSubstringTest.java b/lang/src/test/java/org/apache/commons/lang3/StringUtilsSubstringTest.java
deleted file mode 100644
index b7e83b6..0000000
--- a/lang/src/test/java/org/apache/commons/lang3/StringUtilsSubstringTest.java
+++ /dev/null
@@ -1,333 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- * 
- *      http://www.apache.org/licenses/LICENSE-2.0
- * 
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.commons.lang3;
-
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertNull;
-import static org.junit.Assert.assertSame;
-
-import org.junit.Test;
-
-/**
- * Unit tests {@link org.apache.commons.lang3.StringUtils} - Substring methods
- *
- * @version $Id$
- */
-public class StringUtilsSubstringTest  {
-    private static final String FOO = "foo";
-    private static final String BAR = "bar";
-    private static final String BAZ = "baz";
-    private static final String FOOBAR = "foobar";
-    private static final String SENTENCE = "foo bar baz";
-
-    //-----------------------------------------------------------------------
-
-    @Test
-    public void testSubstring_StringInt() {
-        assertEquals(null, StringUtils.substring(null, 0));
-        assertEquals("", StringUtils.substring("", 0));
-        assertEquals("", StringUtils.substring("", 2));
-        
-        assertEquals("", StringUtils.substring(SENTENCE, 80));
-        assertEquals(BAZ, StringUtils.substring(SENTENCE, 8));
-        assertEquals(BAZ, StringUtils.substring(SENTENCE, -3));
-        assertEquals(SENTENCE, StringUtils.substring(SENTENCE, 0));
-        assertEquals("abc", StringUtils.substring("abc", -4));
-        assertEquals("abc", StringUtils.substring("abc", -3));
-        assertEquals("bc", StringUtils.substring("abc", -2));
-        assertEquals("c", StringUtils.substring("abc", -1));
-        assertEquals("abc", StringUtils.substring("abc", 0));
-        assertEquals("bc", StringUtils.substring("abc", 1));
-        assertEquals("c", StringUtils.substring("abc", 2));
-        assertEquals("", StringUtils.substring("abc", 3));
-        assertEquals("", StringUtils.substring("abc", 4));
-    }
-    
-    @Test
-    public void testSubstring_StringIntInt() {
-        assertEquals(null, StringUtils.substring(null, 0, 0));
-        assertEquals(null, StringUtils.substring(null, 1, 2));
-        assertEquals("", StringUtils.substring("", 0, 0));
-        assertEquals("", StringUtils.substring("", 1, 2));
-        assertEquals("", StringUtils.substring("", -2, -1));
-        
-        assertEquals("", StringUtils.substring(SENTENCE, 8, 6));
-        assertEquals(FOO, StringUtils.substring(SENTENCE, 0, 3));
-        assertEquals("o", StringUtils.substring(SENTENCE, -9, 3));
-        assertEquals(FOO, StringUtils.substring(SENTENCE, 0, -8));
-        assertEquals("o", StringUtils.substring(SENTENCE, -9, -8));
-        assertEquals(SENTENCE, StringUtils.substring(SENTENCE, 0, 80));
-        assertEquals("", StringUtils.substring(SENTENCE, 2, 2));
-        assertEquals("b",StringUtils.substring("abc", -2, -1));
-    }
-           
-    @Test
-    public void testLeft_String() {
-        assertSame(null, StringUtils.left(null, -1));
-        assertSame(null, StringUtils.left(null, 0));
-        assertSame(null, StringUtils.left(null, 2));
-        
-        assertEquals("", StringUtils.left("", -1));
-        assertEquals("", StringUtils.left("", 0));
-        assertEquals("", StringUtils.left("", 2));
-        
-        assertEquals("", StringUtils.left(FOOBAR, -1));
-        assertEquals("", StringUtils.left(FOOBAR, 0));
-        assertEquals(FOO, StringUtils.left(FOOBAR, 3));
-        assertSame(FOOBAR, StringUtils.left(FOOBAR, 80));
-    }
-    
-    @Test
-    public void testRight_String() {
-        assertSame(null, StringUtils.right(null, -1));
-        assertSame(null, StringUtils.right(null, 0));
-        assertSame(null, StringUtils.right(null, 2));
-        
-        assertEquals("", StringUtils.right("", -1));
-        assertEquals("", StringUtils.right("", 0));
-        assertEquals("", StringUtils.right("", 2));
-        
-        assertEquals("", StringUtils.right(FOOBAR, -1));
-        assertEquals("", StringUtils.right(FOOBAR, 0));
-        assertEquals(BAR, StringUtils.right(FOOBAR, 3));
-        assertSame(FOOBAR, StringUtils.right(FOOBAR, 80));
-    }
-    
-    @Test
-    public void testMid_String() {
-        assertSame(null, StringUtils.mid(null, -1, 0));
-        assertSame(null, StringUtils.mid(null, 0, -1));
-        assertSame(null, StringUtils.mid(null, 3, 0));
-        assertSame(null, StringUtils.mid(null, 3, 2));
-        
-        assertEquals("", StringUtils.mid("", 0, -1));
-        assertEquals("", StringUtils.mid("", 0, 0));
-        assertEquals("", StringUtils.mid("", 0, 2));
-        
-        assertEquals("", StringUtils.mid(FOOBAR, 3, -1));
-        assertEquals("", StringUtils.mid(FOOBAR, 3, 0));
-        assertEquals("b", StringUtils.mid(FOOBAR, 3, 1));
-        assertEquals(FOO, StringUtils.mid(FOOBAR, 0, 3));
-        assertEquals(BAR, StringUtils.mid(FOOBAR, 3, 3));
-        assertEquals(FOOBAR, StringUtils.mid(FOOBAR, 0, 80));
-        assertEquals(BAR, StringUtils.mid(FOOBAR, 3, 80));
-        assertEquals("", StringUtils.mid(FOOBAR, 9, 3));
-        assertEquals(FOO, StringUtils.mid(FOOBAR, -1, 3));
-    }
-    
-    //-----------------------------------------------------------------------
-    @Test
-    public void testSubstringBefore_StringString() {
-        assertEquals("foo", StringUtils.substringBefore("fooXXbarXXbaz", "XX"));
-
-        assertEquals(null, StringUtils.substringBefore(null, null));
-        assertEquals(null, StringUtils.substringBefore(null, ""));
-        assertEquals(null, StringUtils.substringBefore(null, "XX"));
-        assertEquals("", StringUtils.substringBefore("", null));
-        assertEquals("", StringUtils.substringBefore("", ""));
-        assertEquals("", StringUtils.substringBefore("", "XX"));
-        
-        assertEquals("foo", StringUtils.substringBefore("foo", null));
-        assertEquals("foo", StringUtils.substringBefore("foo", "b"));
-        assertEquals("f", StringUtils.substringBefore("foot", "o"));
-        assertEquals("", StringUtils.substringBefore("abc", "a"));
-        assertEquals("a", StringUtils.substringBefore("abcba", "b"));
-        assertEquals("ab", StringUtils.substringBefore("abc", "c"));
-        assertEquals("", StringUtils.substringBefore("abc", ""));
-    }
-    
-    @Test
-    public void testSubstringAfter_StringString() {
-        assertEquals("barXXbaz", StringUtils.substringAfter("fooXXbarXXbaz", "XX"));
-        
-        assertEquals(null, StringUtils.substringAfter(null, null));
-        assertEquals(null, StringUtils.substringAfter(null, ""));
-        assertEquals(null, StringUtils.substringAfter(null, "XX"));
-        assertEquals("", StringUtils.substringAfter("", null));
-        assertEquals("", StringUtils.substringAfter("", ""));
-        assertEquals("", StringUtils.substringAfter("", "XX"));
-        
-        assertEquals("", StringUtils.substringAfter("foo", null));
-        assertEquals("ot", StringUtils.substringAfter("foot", "o"));
-        assertEquals("bc", StringUtils.substringAfter("abc", "a"));
-        assertEquals("cba", StringUtils.substringAfter("abcba", "b"));
-        assertEquals("", StringUtils.substringAfter("abc", "c"));
-        assertEquals("abc", StringUtils.substringAfter("abc", ""));
-        assertEquals("", StringUtils.substringAfter("abc", "d"));
-    }
-
-    @Test
-    public void testSubstringBeforeLast_StringString() {
-        assertEquals("fooXXbar", StringUtils.substringBeforeLast("fooXXbarXXbaz", "XX"));
-
-        assertEquals(null, StringUtils.substringBeforeLast(null, null));
-        assertEquals(null, StringUtils.substringBeforeLast(null, ""));
-        assertEquals(null, StringUtils.substringBeforeLast(null, "XX"));
-        assertEquals("", StringUtils.substringBeforeLast("", null));
-        assertEquals("", StringUtils.substringBeforeLast("", ""));
-        assertEquals("", StringUtils.substringBeforeLast("", "XX"));
-
-        assertEquals("foo", StringUtils.substringBeforeLast("foo", null));
-        assertEquals("foo", StringUtils.substringBeforeLast("foo", "b"));
-        assertEquals("fo", StringUtils.substringBeforeLast("foo", "o"));
-        assertEquals("abc\r\n", StringUtils.substringBeforeLast("abc\r\n", "d"));
-        assertEquals("abc", StringUtils.substringBeforeLast("abcdabc", "d"));
-        assertEquals("abcdabc", StringUtils.substringBeforeLast("abcdabcd", "d"));
-        assertEquals("a", StringUtils.substringBeforeLast("abc", "b"));
-        assertEquals("abc ", StringUtils.substringBeforeLast("abc \n", "\n"));
-        assertEquals("a", StringUtils.substringBeforeLast("a", null));
-        assertEquals("a", StringUtils.substringBeforeLast("a", ""));
-        assertEquals("", StringUtils.substringBeforeLast("a", "a"));
-    }
-    
-    @Test
-    public void testSubstringAfterLast_StringString() {
-        assertEquals("baz", StringUtils.substringAfterLast("fooXXbarXXbaz", "XX"));
-
-        assertEquals(null, StringUtils.substringAfterLast(null, null));
-        assertEquals(null, StringUtils.substringAfterLast(null, ""));
-        assertEquals(null, StringUtils.substringAfterLast(null, "XX"));
-        assertEquals("", StringUtils.substringAfterLast("", null));
-        assertEquals("", StringUtils.substringAfterLast("", ""));
-        assertEquals("", StringUtils.substringAfterLast("", "a"));
-
-        assertEquals("", StringUtils.substringAfterLast("foo", null));
-        assertEquals("", StringUtils.substringAfterLast("foo", "b"));
-        assertEquals("t", StringUtils.substringAfterLast("foot", "o"));
-        assertEquals("bc", StringUtils.substringAfterLast("abc", "a"));
-        assertEquals("a", StringUtils.substringAfterLast("abcba", "b"));
-        assertEquals("", StringUtils.substringAfterLast("abc", "c"));
-        assertEquals("", StringUtils.substringAfterLast("", "d"));
-        assertEquals("", StringUtils.substringAfterLast("abc", ""));
-    }        
-        
-    //-----------------------------------------------------------------------
-    @Test
-    public void testSubstringBetween_StringString() {
-        assertEquals(null, StringUtils.substringBetween(null, "tag"));
-        assertEquals("", StringUtils.substringBetween("", ""));
-        assertEquals(null, StringUtils.substringBetween("", "abc"));
-        assertEquals("", StringUtils.substringBetween("    ", " "));
-        assertEquals(null, StringUtils.substringBetween("abc", null));
-        assertEquals("", StringUtils.substringBetween("abc", ""));
-        assertEquals(null, StringUtils.substringBetween("abc", "a"));
-        assertEquals("bc", StringUtils.substringBetween("abca", "a"));
-        assertEquals("bc", StringUtils.substringBetween("abcabca", "a"));
-        assertEquals("bar", StringUtils.substringBetween("\nbar\n", "\n"));
-    }
-            
-    @Test
-    public void testSubstringBetween_StringStringString() {
-        assertEquals(null, StringUtils.substringBetween(null, "", ""));
-        assertEquals(null, StringUtils.substringBetween("", null, ""));
-        assertEquals(null, StringUtils.substringBetween("", "", null));
-        assertEquals("", StringUtils.substringBetween("", "", ""));
-        assertEquals("", StringUtils.substringBetween("foo", "", ""));
-        assertEquals(null, StringUtils.substringBetween("foo", "", "]"));
-        assertEquals(null, StringUtils.substringBetween("foo", "[", "]"));
-        assertEquals("", StringUtils.substringBetween("    ", " ", "  "));
-        assertEquals("bar", StringUtils.substringBetween("<foo>bar</foo>", "<foo>", "</foo>") );
-    }
-
-   /**
-     * Tests the substringsBetween method that returns an String Array of substrings.
-     */
-    @Test
-    public void testSubstringsBetween_StringStringString() {
-
-        String[] results = StringUtils.substringsBetween("[one], [two], [three]", "[", "]");
-        assertEquals(3, results.length);
-        assertEquals("one", results[0]);
-        assertEquals("two", results[1]);
-        assertEquals("three", results[2]);
-
-        results = StringUtils.substringsBetween("[one], [two], three", "[", "]");
-        assertEquals(2, results.length);
-        assertEquals("one", results[0]);
-        assertEquals("two", results[1]);
-
-        results = StringUtils.substringsBetween("[one], [two], three]", "[", "]");
-        assertEquals(2, results.length);
-        assertEquals("one", results[0]);
-        assertEquals("two", results[1]);
-
-        results = StringUtils.substringsBetween("[one], two], three]", "[", "]");
-        assertEquals(1, results.length);
-        assertEquals("one", results[0]);
-
-        results = StringUtils.substringsBetween("one], two], [three]", "[", "]");
-        assertEquals(1, results.length);
-        assertEquals("three", results[0]);
-
-        // 'ab hello ba' will match, but 'ab non ba' won't
-        // this is because the 'a' is shared between the two and can't be matched twice
-        results = StringUtils.substringsBetween("aabhellobabnonba", "ab", "ba");
-        assertEquals(1, results.length);
-        assertEquals("hello", results[0]);
-
-        results = StringUtils.substringsBetween("one, two, three", "[", "]");
-        assertNull(results);
-
-        results = StringUtils.substringsBetween("[one, two, three", "[", "]");
-        assertNull(results);
-
-        results = StringUtils.substringsBetween("one, two, three]", "[", "]");
-        assertNull(results);
-
-        results = StringUtils.substringsBetween("[one], [two], [three]", "[", null);
-        assertNull(results);
-
-        results = StringUtils.substringsBetween("[one], [two], [three]", null, "]");
-        assertNull(results);
-
-        results = StringUtils.substringsBetween("[one], [two], [three]", "", "");
-        assertNull(results);
-
-        results = StringUtils.substringsBetween(null, "[", "]");
-        assertNull(results);
-
-        results = StringUtils.substringsBetween("", "[", "]");
-        assertEquals(0, results.length);
-    }
-
-    //-----------------------------------------------------------------------
-    @Test
-    public void testCountMatches_String() {
-        assertEquals(0, StringUtils.countMatches(null, null));
-        assertEquals(0, StringUtils.countMatches("blah", null));
-        assertEquals(0, StringUtils.countMatches(null, "DD"));
-
-        assertEquals(0, StringUtils.countMatches("x", ""));
-        assertEquals(0, StringUtils.countMatches("", ""));
-
-        assertEquals(3, 
-             StringUtils.countMatches("one long someone sentence of one", "one"));
-        assertEquals(0, 
-             StringUtils.countMatches("one long someone sentence of one", "two"));
-        assertEquals(4, 
-             StringUtils.countMatches("oooooooooooo", "ooo"));
-    }
-
-    @Test
-    public void testCountMatches_char() {
-        assertEquals(0, StringUtils.countMatches(null, 'D'));
-        assertEquals(5, StringUtils.countMatches("one long someone sentence of one", ' '));
-        assertEquals(6, StringUtils.countMatches("one long someone sentence of one", 'o'));
-        assertEquals(4, StringUtils.countMatches("oooooooooooo", "ooo"));
-    }
-
-}
diff --git a/lang/src/test/java/org/apache/commons/lang3/StringUtilsTest.java b/lang/src/test/java/org/apache/commons/lang3/StringUtilsTest.java
deleted file mode 100644
index dd14c8f..0000000
--- a/lang/src/test/java/org/apache/commons/lang3/StringUtilsTest.java
+++ /dev/null
@@ -1,2533 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- * 
- *      http://www.apache.org/licenses/LICENSE-2.0
- * 
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.commons.lang3;
-
-import static org.junit.Assert.assertArrayEquals;
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertFalse;
-import static org.junit.Assert.assertNotNull;
-import static org.junit.Assert.assertNull;
-import static org.junit.Assert.assertSame;
-import static org.junit.Assert.assertTrue;
-import static org.junit.Assert.fail;
-
-import java.io.UnsupportedEncodingException;
-import java.lang.reflect.Constructor;
-import java.lang.reflect.Method;
-import java.lang.reflect.Modifier;
-import java.nio.CharBuffer;
-import java.nio.charset.Charset;
-import java.util.Arrays;
-import java.util.Collections;
-import java.util.Iterator;
-import java.util.Locale;
-
-import org.apache.commons.lang3.text.WordUtils;
-import org.junit.Test;
-
-/**
- * Unit tests {@link org.apache.commons.lang3.StringUtils}.
- *
- * @version $Id$
- */
-@SuppressWarnings("deprecation") // deliberate use of deprecated code
-public class StringUtilsTest {
-    
-    static final String WHITESPACE;
-    static final String NON_WHITESPACE;
-    static final String HARD_SPACE;
-    static final String TRIMMABLE;
-    static final String NON_TRIMMABLE;
-    static {
-        String ws = "";
-        String nws = "";
-        final String hs = String.valueOf(((char) 160));
-        String tr = "";
-        String ntr = "";
-        for (int i = 0; i < Character.MAX_VALUE; i++) {
-            if (Character.isWhitespace((char) i)) {
-                ws += String.valueOf((char) i);
-                if (i > 32) {
-                    ntr += String.valueOf((char) i);
-                }
-            } else if (i < 40) {
-                nws += String.valueOf((char) i);
-            }
-        }
-        for (int i = 0; i <= 32; i++) {
-            tr += String.valueOf((char) i);
-        }
-        WHITESPACE = ws;
-        NON_WHITESPACE = nws;
-        HARD_SPACE = hs;
-        TRIMMABLE = tr;
-        NON_TRIMMABLE = ntr;
-    }
-
-    private static final String[] ARRAY_LIST = { "foo", "bar", "baz" };
-    private static final String[] EMPTY_ARRAY_LIST = {};
-    private static final String[] NULL_ARRAY_LIST = {null};
-    private static final Object[] NULL_TO_STRING_LIST = {
-        new Object(){
-            @Override
-            public String toString() {
-                return null;
-            }
-        }
-    };
-    private static final String[] MIXED_ARRAY_LIST = {null, "", "foo"};
-    private static final Object[] MIXED_TYPE_LIST = {"foo", Long.valueOf(2L)};
-    private static final long[] LONG_PRIM_LIST = {1, 2};
-    private static final int[] INT_PRIM_LIST = {1, 2};
-    private static final byte[] BYTE_PRIM_LIST = {1, 2};
-    private static final short[] SHORT_PRIM_LIST = {1, 2};
-    private static final char[] CHAR_PRIM_LIST = {'1', '2'};
-    private static final float[] FLOAT_PRIM_LIST = {1, 2};
-    private static final double[] DOUBLE_PRIM_LIST = {1, 2};
-
-    private static final String SEPARATOR = ",";
-    private static final char   SEPARATOR_CHAR = ';';
-
-    private static final String TEXT_LIST = "foo,bar,baz";
-    private static final String TEXT_LIST_CHAR = "foo;bar;baz";
-    private static final String TEXT_LIST_NOSEP = "foobarbaz";
-
-    private static final String FOO_UNCAP = "foo";
-    private static final String FOO_CAP = "Foo";
-
-    private static final String SENTENCE_UNCAP = "foo bar baz";
-    private static final String SENTENCE_CAP = "Foo Bar Baz";
-
-    //-----------------------------------------------------------------------
-    @Test
-    public void testConstructor() {
-        assertNotNull(new StringUtils());
-        final Constructor<?>[] cons = StringUtils.class.getDeclaredConstructors();
-        assertEquals(1, cons.length);
-        assertTrue(Modifier.isPublic(cons[0].getModifiers()));
-        assertTrue(Modifier.isPublic(StringUtils.class.getModifiers()));
-        assertFalse(Modifier.isFinal(StringUtils.class.getModifiers()));
-    }
-    
-    //-----------------------------------------------------------------------
-    @Test
-    public void testIsEmpty(){
-      assertTrue(StringUtils.isEmpty(null));
-      assertTrue(StringUtils.isEmpty(""));
-      assertFalse(StringUtils.isEmpty(" "));
-      assertFalse(StringUtils.isEmpty("bob"));
-      assertFalse(StringUtils.isEmpty("  bob  "));
-    }
-    
-    @Test
-    public void testIsNotEmpty(){
-      assertFalse(StringUtils.isNotEmpty(null));
-      assertFalse(StringUtils.isNotEmpty(""));
-      assertTrue(StringUtils.isNotEmpty(" "));
-      assertTrue(StringUtils.isNotEmpty("bob"));
-      assertTrue(StringUtils.isNotEmpty("  bob  "));
-    }
-    
-    @Test
-    public void testIsAnyEmpty(){
-      assertTrue(StringUtils.isAnyEmpty((String) null));
-      assertTrue(StringUtils.isAnyEmpty((String[]) null));
-      assertTrue(StringUtils.isAnyEmpty(null, "foo"));
-      assertTrue(StringUtils.isAnyEmpty("", "bar"));
-      assertTrue(StringUtils.isAnyEmpty("bob", ""));
-      assertTrue(StringUtils.isAnyEmpty("  bob  ", null));
-      assertFalse(StringUtils.isAnyEmpty(" ","bar"));
-      assertFalse(StringUtils.isAnyEmpty("foo","bar"));
-    }
-    
-    @Test
-    public void testIsNoneEmpty(){
-      assertFalse(StringUtils.isNoneEmpty((String) null));
-      assertFalse(StringUtils.isNoneEmpty((String[]) null));
-      assertFalse(StringUtils.isNoneEmpty(null, "foo"));
-      assertFalse(StringUtils.isNoneEmpty("", "bar"));
-      assertFalse(StringUtils.isNoneEmpty("bob", ""));
-      assertFalse(StringUtils.isNoneEmpty("  bob  ", null));
-      assertTrue(StringUtils.isNoneEmpty(" ", "bar"));
-      assertTrue(StringUtils.isNoneEmpty("foo", "bar"));
-    }
-    
-    @Test
-    public void testIsBlank(){
-      assertTrue(StringUtils.isBlank(null));
-      assertTrue(StringUtils.isBlank(""));
-      assertTrue(StringUtils.isBlank(" "));
-      assertFalse(StringUtils.isBlank("bob"));
-      assertFalse(StringUtils.isBlank("  bob  "));
-    }
-    
-    @Test
-    public void testIsNotBlank(){
-      assertFalse(StringUtils.isNotBlank(null));
-      assertFalse(StringUtils.isNotBlank(""));
-      assertFalse(StringUtils.isNotBlank(" "));
-      assertTrue(StringUtils.isNotBlank("bob"));
-      assertTrue(StringUtils.isNotBlank("  bob  "));
-    }
-    
-     @Test
-    public void testIsAnyBlank(){
-      assertTrue(StringUtils.isAnyBlank((String) null));
-      assertTrue(StringUtils.isAnyBlank((String[]) null));
-      assertTrue(StringUtils.isAnyBlank(null, "foo"));
-      assertTrue(StringUtils.isAnyBlank(null, null));
-      assertTrue(StringUtils.isAnyBlank("", "bar"));
-      assertTrue(StringUtils.isAnyBlank("bob", ""));
-      assertTrue(StringUtils.isAnyBlank("  bob  ", null));
-      assertTrue(StringUtils.isAnyBlank(" ","bar"));
-      assertFalse(StringUtils.isAnyBlank("foo","bar"));
-    }
-    
-    @Test
-    public void testIsNoneBlank(){
-      assertFalse(StringUtils.isNoneBlank((String) null));
-      assertFalse(StringUtils.isNoneBlank((String[]) null));
-      assertFalse(StringUtils.isNoneBlank(null, "foo"));
-      assertFalse(StringUtils.isNoneBlank(null, null));
-      assertFalse(StringUtils.isNoneBlank("", "bar"));
-      assertFalse(StringUtils.isNoneBlank("bob", ""));
-      assertFalse(StringUtils.isNoneBlank("  bob  ", null));
-      assertFalse(StringUtils.isNoneBlank(" ", "bar"));
-      assertTrue(StringUtils.isNoneBlank("foo", "bar"));
-    }
-    
-    //-----------------------------------------------------------------------
-    @Test
-    public void testCaseFunctions() {
-        assertNull(StringUtils.upperCase(null));
-        assertNull(StringUtils.upperCase(null, Locale.ENGLISH));
-        assertNull(StringUtils.lowerCase(null));
-        assertNull(StringUtils.lowerCase(null, Locale.ENGLISH));
-        assertNull(StringUtils.capitalize(null));
-        assertNull(StringUtils.uncapitalize(null));
-
-        assertEquals("capitalize(empty-string) failed",
-                "", StringUtils.capitalize("") );
-        assertEquals("capitalize(single-char-string) failed",
-                "X", StringUtils.capitalize("x") );
-        assertEquals("capitalize(String) failed",
-                FOO_CAP, StringUtils.capitalize(FOO_CAP) );
-        assertEquals("capitalize(string) failed",
-                FOO_CAP, StringUtils.capitalize(FOO_UNCAP) );
-
-        assertEquals("uncapitalize(String) failed",
-                FOO_UNCAP, StringUtils.uncapitalize(FOO_CAP) );
-        assertEquals("uncapitalize(string) failed",
-                FOO_UNCAP, StringUtils.uncapitalize(FOO_UNCAP) );
-        assertEquals("uncapitalize(empty-string) failed",
-                "", StringUtils.uncapitalize("") );
-        assertEquals("uncapitalize(single-char-string) failed",
-                "x", StringUtils.uncapitalize("X") );
-                     
-        // reflection type of tests: Sentences.
-        assertEquals("uncapitalize(capitalize(String)) failed",
-                     SENTENCE_UNCAP, StringUtils.uncapitalize(StringUtils.capitalize(SENTENCE_UNCAP)) );
-        assertEquals("capitalize(uncapitalize(String)) failed",
-                     SENTENCE_CAP, StringUtils.capitalize(StringUtils.uncapitalize(SENTENCE_CAP)) );
-
-        // reflection type of tests: One word.
-        assertEquals("uncapitalize(capitalize(String)) failed",
-                     FOO_UNCAP, StringUtils.uncapitalize(StringUtils.capitalize(FOO_UNCAP)) );
-        assertEquals("capitalize(uncapitalize(String)) failed",
-                     FOO_CAP, StringUtils.capitalize(StringUtils.uncapitalize(FOO_CAP)) );
-
-        assertEquals("upperCase(String) failed",
-                     "FOO TEST THING", StringUtils.upperCase("fOo test THING") );
-        assertEquals("upperCase(empty-string) failed",
-                     "", StringUtils.upperCase("") );
-        assertEquals("lowerCase(String) failed",
-                     "foo test thing", StringUtils.lowerCase("fOo test THING") );
-        assertEquals("lowerCase(empty-string) failed",
-                     "", StringUtils.lowerCase("") );
-
-        assertEquals("upperCase(String, Locale) failed",
-                     "FOO TEST THING", StringUtils.upperCase("fOo test THING", Locale.ENGLISH) );
-        assertEquals("upperCase(empty-string, Locale) failed",
-                     "", StringUtils.upperCase("", Locale.ENGLISH) );
-        assertEquals("lowerCase(String, Locale) failed",
-                     "foo test thing", StringUtils.lowerCase("fOo test THING", Locale.ENGLISH) );
-        assertEquals("lowerCase(empty-string, Locale) failed",
-                     "", StringUtils.lowerCase("", Locale.ENGLISH) );
-    }
-
-    @Test
-    public void testSwapCase_String() {
-        assertNull(StringUtils.swapCase(null));
-        assertEquals("", StringUtils.swapCase(""));
-        assertEquals("  ", StringUtils.swapCase("  "));
-        
-        assertEquals("i", WordUtils.swapCase("I") );
-        assertEquals("I", WordUtils.swapCase("i") );
-        assertEquals("I AM HERE 123", StringUtils.swapCase("i am here 123") );
-        assertEquals("i aM hERE 123", StringUtils.swapCase("I Am Here 123") );
-        assertEquals("I AM here 123", StringUtils.swapCase("i am HERE 123") );
-        assertEquals("i am here 123", StringUtils.swapCase("I AM HERE 123") );
-        
-        final String test = "This String contains a TitleCase character: \u01C8";
-        final String expect = "tHIS sTRING CONTAINS A tITLEcASE CHARACTER: \u01C9";
-        assertEquals(expect, WordUtils.swapCase(test));
-    }
-
-    //-----------------------------------------------------------------------
-    @Test
-    public void testJoin_Objects() {
-        assertEquals("abc", StringUtils.join("a", "b", "c"));
-        assertEquals("a",   StringUtils.join(null, "", "a"));
-        assertNull( StringUtils.join((Object[])null));
-    }
-
-    @Test
-    public void testJoin_Objectarray() {
-//        assertNull(StringUtils.join(null)); // generates warning
-        assertNull(StringUtils.join((Object[]) null)); // equivalent explicit cast
-        // test additional varargs calls
-        assertEquals("", StringUtils.join(new Object[0])); // empty array
-        assertEquals("", StringUtils.join((Object) null)); // => new Object[]{null}
-
-        assertEquals("", StringUtils.join(EMPTY_ARRAY_LIST));
-        assertEquals("", StringUtils.join(NULL_ARRAY_LIST));
-        assertEquals("null", StringUtils.join(NULL_TO_STRING_LIST));
-        assertEquals("abc", StringUtils.join(new String[] {"a", "b", "c"}));
-        assertEquals("a", StringUtils.join(new String[] {null, "a", ""}));
-        assertEquals("foo", StringUtils.join(MIXED_ARRAY_LIST));
-        assertEquals("foo2", StringUtils.join(MIXED_TYPE_LIST));
-    }
-        
-    @Test
-    public void testJoin_ArrayCharSeparator() {
-        assertNull(StringUtils.join((Object[]) null, ','));
-        assertEquals(TEXT_LIST_CHAR, StringUtils.join(ARRAY_LIST, SEPARATOR_CHAR));
-        assertEquals("", StringUtils.join(EMPTY_ARRAY_LIST, SEPARATOR_CHAR));
-        assertEquals(";;foo", StringUtils.join(MIXED_ARRAY_LIST, SEPARATOR_CHAR));
-        assertEquals("foo;2", StringUtils.join(MIXED_TYPE_LIST, SEPARATOR_CHAR));
-
-        assertEquals("/", StringUtils.join(MIXED_ARRAY_LIST, '/', 0, MIXED_ARRAY_LIST.length-1));
-        assertEquals("foo", StringUtils.join(MIXED_TYPE_LIST, '/', 0, 1));
-        assertEquals("null", StringUtils.join(NULL_TO_STRING_LIST,'/', 0, 1));
-        assertEquals("foo/2", StringUtils.join(MIXED_TYPE_LIST, '/', 0, 2));
-        assertEquals("2", StringUtils.join(MIXED_TYPE_LIST, '/', 1, 2));
-        assertEquals("", StringUtils.join(MIXED_TYPE_LIST, '/', 2, 1));
-    }
-    
-    @Test
-    public void testJoin_ArrayOfChars() {
-        assertNull(StringUtils.join((char[]) null, ','));
-        assertEquals("1;2", StringUtils.join(CHAR_PRIM_LIST, SEPARATOR_CHAR));
-        assertEquals("2", StringUtils.join(CHAR_PRIM_LIST, SEPARATOR_CHAR, 1, 2));
-    }
-    
-    @Test
-    public void testJoin_ArrayOfBytes() {
-        assertNull(StringUtils.join((byte[]) null, ','));
-        assertEquals("1;2", StringUtils.join(BYTE_PRIM_LIST, SEPARATOR_CHAR));
-        assertEquals("2", StringUtils.join(BYTE_PRIM_LIST, SEPARATOR_CHAR, 1, 2));
-    }
-    
-    @Test
-    public void testJoin_ArrayOfInts() {
-        assertNull(StringUtils.join((int[]) null, ','));
-        assertEquals("1;2", StringUtils.join(INT_PRIM_LIST, SEPARATOR_CHAR));
-        assertEquals("2", StringUtils.join(INT_PRIM_LIST, SEPARATOR_CHAR, 1, 2));
-    }
-    
-    @Test
-    public void testJoin_ArrayOfLongs() {
-        assertNull(StringUtils.join((long[]) null, ','));
-        assertEquals("1;2", StringUtils.join(LONG_PRIM_LIST, SEPARATOR_CHAR));
-        assertEquals("2", StringUtils.join(LONG_PRIM_LIST, SEPARATOR_CHAR, 1, 2));
-    }
-    
-    @Test
-    public void testJoin_ArrayOfFloats() {
-        assertNull(StringUtils.join((float[]) null, ','));
-        assertEquals("1.0;2.0", StringUtils.join(FLOAT_PRIM_LIST, SEPARATOR_CHAR));
-        assertEquals("2.0", StringUtils.join(FLOAT_PRIM_LIST, SEPARATOR_CHAR, 1, 2));
-    }
-    
-    @Test
-    public void testJoin_ArrayOfDoubles() {
-        assertNull(StringUtils.join((double[]) null, ','));
-        assertEquals("1.0;2.0", StringUtils.join(DOUBLE_PRIM_LIST, SEPARATOR_CHAR));
-        assertEquals("2.0", StringUtils.join(DOUBLE_PRIM_LIST, SEPARATOR_CHAR, 1, 2));
-    }
-    
-    @Test
-    public void testJoin_ArrayOfShorts() {
-        assertNull(StringUtils.join((short[]) null, ','));
-        assertEquals("1;2", StringUtils.join(SHORT_PRIM_LIST, SEPARATOR_CHAR));
-        assertEquals("2", StringUtils.join(SHORT_PRIM_LIST, SEPARATOR_CHAR, 1, 2));
-    }
-    
-    @Test
-    public void testJoin_ArrayString() {
-        assertNull(StringUtils.join((Object[]) null, null));
-        assertEquals(TEXT_LIST_NOSEP, StringUtils.join(ARRAY_LIST, null));
-        assertEquals(TEXT_LIST_NOSEP, StringUtils.join(ARRAY_LIST, ""));
-        
-        assertEquals("", StringUtils.join(NULL_ARRAY_LIST, null));
-        
-        assertEquals("", StringUtils.join(EMPTY_ARRAY_LIST, null));
-        assertEquals("", StringUtils.join(EMPTY_ARRAY_LIST, ""));
-        assertEquals("", StringUtils.join(EMPTY_ARRAY_LIST, SEPARATOR));
-
-        assertEquals(TEXT_LIST, StringUtils.join(ARRAY_LIST, SEPARATOR));
-        assertEquals(",,foo", StringUtils.join(MIXED_ARRAY_LIST, SEPARATOR));
-        assertEquals("foo,2", StringUtils.join(MIXED_TYPE_LIST, SEPARATOR));
-
-        assertEquals("/", StringUtils.join(MIXED_ARRAY_LIST, "/", 0, MIXED_ARRAY_LIST.length-1));
-        assertEquals("", StringUtils.join(MIXED_ARRAY_LIST, "", 0, MIXED_ARRAY_LIST.length-1));
-        assertEquals("foo", StringUtils.join(MIXED_TYPE_LIST, "/", 0, 1));
-        assertEquals("foo/2", StringUtils.join(MIXED_TYPE_LIST, "/", 0, 2));
-        assertEquals("2", StringUtils.join(MIXED_TYPE_LIST, "/", 1, 2));
-        assertEquals("", StringUtils.join(MIXED_TYPE_LIST, "/", 2, 1));
-    }
-    
-    @Test
-    public void testJoin_IteratorChar() {
-        assertNull(StringUtils.join((Iterator<?>) null, ','));
-        assertEquals(TEXT_LIST_CHAR, StringUtils.join(Arrays.asList(ARRAY_LIST).iterator(), SEPARATOR_CHAR));
-        assertEquals("", StringUtils.join(Arrays.asList(NULL_ARRAY_LIST).iterator(), SEPARATOR_CHAR));
-        assertEquals("", StringUtils.join(Arrays.asList(EMPTY_ARRAY_LIST).iterator(), SEPARATOR_CHAR));
-        assertEquals("foo", StringUtils.join(Collections.singleton("foo").iterator(), 'x'));
-    }
-    
-    @Test
-    public void testJoin_IteratorString() {
-        assertNull(StringUtils.join((Iterator<?>) null, null));
-        assertEquals(TEXT_LIST_NOSEP, StringUtils.join(Arrays.asList(ARRAY_LIST).iterator(), null));
-        assertEquals(TEXT_LIST_NOSEP, StringUtils.join(Arrays.asList(ARRAY_LIST).iterator(), ""));
-        assertEquals("foo", StringUtils.join(Collections.singleton("foo").iterator(), "x"));
-        assertEquals("foo", StringUtils.join(Collections.singleton("foo").iterator(), null));
-
-        assertEquals("", StringUtils.join(Arrays.asList(NULL_ARRAY_LIST).iterator(), null));
-        
-        assertEquals("", StringUtils.join(Arrays.asList(EMPTY_ARRAY_LIST).iterator(), null));
-        assertEquals("", StringUtils.join(Arrays.asList(EMPTY_ARRAY_LIST).iterator(), ""));
-        assertEquals("", StringUtils.join(Arrays.asList(EMPTY_ARRAY_LIST).iterator(), SEPARATOR));
-        
-        assertEquals(TEXT_LIST, StringUtils.join(Arrays.asList(ARRAY_LIST).iterator(), SEPARATOR));
-
-        assertNull(StringUtils.join(Arrays.asList(NULL_TO_STRING_LIST).iterator(), SEPARATOR));
-    }
-
-    @Test
-    public void testJoin_IterableChar() {
-        assertNull(StringUtils.join((Iterable<?>) null, ','));
-        assertEquals(TEXT_LIST_CHAR, StringUtils.join(Arrays.asList(ARRAY_LIST), SEPARATOR_CHAR));
-        assertEquals("", StringUtils.join(Arrays.asList(NULL_ARRAY_LIST), SEPARATOR_CHAR));
-        assertEquals("", StringUtils.join(Arrays.asList(EMPTY_ARRAY_LIST), SEPARATOR_CHAR));
-        assertEquals("foo", StringUtils.join(Collections.singleton("foo"), 'x'));
-    }
-
-    @Test
-    public void testJoin_IterableString() {
-        assertNull(StringUtils.join((Iterable<?>) null, null));
-        assertEquals(TEXT_LIST_NOSEP, StringUtils.join(Arrays.asList(ARRAY_LIST), null));
-        assertEquals(TEXT_LIST_NOSEP, StringUtils.join(Arrays.asList(ARRAY_LIST), ""));
-        assertEquals("foo", StringUtils.join(Collections.singleton("foo"), "x"));
-        assertEquals("foo", StringUtils.join(Collections.singleton("foo"), null));
-
-        assertEquals("", StringUtils.join(Arrays.asList(NULL_ARRAY_LIST), null));
-
-        assertEquals("", StringUtils.join(Arrays.asList(EMPTY_ARRAY_LIST), null));
-        assertEquals("", StringUtils.join(Arrays.asList(EMPTY_ARRAY_LIST), ""));
-        assertEquals("", StringUtils.join(Arrays.asList(EMPTY_ARRAY_LIST), SEPARATOR));
-
-        assertEquals(TEXT_LIST, StringUtils.join(Arrays.asList(ARRAY_LIST), SEPARATOR));
-    }
-
-    @Test
-    public void testSplit_String() {
-        assertNull(StringUtils.split(null));
-        assertEquals(0, StringUtils.split("").length);
-        
-        String str = "a b  .c";
-        String[] res = StringUtils.split(str);
-        assertEquals(3, res.length);
-        assertEquals("a", res[0]);
-        assertEquals("b", res[1]);
-        assertEquals(".c", res[2]);
-        
-        str = " a ";
-        res = StringUtils.split(str);
-        assertEquals(1, res.length);
-        assertEquals("a", res[0]);
-        
-        str = "a" + WHITESPACE + "b" + NON_WHITESPACE + "c";
-        res = StringUtils.split(str);
-        assertEquals(2, res.length);
-        assertEquals("a", res[0]);
-        assertEquals("b" + NON_WHITESPACE + "c", res[1]);                       
-    }
-    
-    @Test
-    public void testSplit_StringChar() {
-        assertNull(StringUtils.split(null, '.'));
-        assertEquals(0, StringUtils.split("", '.').length);
-
-        String str = "a.b.. c";
-        String[] res = StringUtils.split(str, '.');
-        assertEquals(3, res.length);
-        assertEquals("a", res[0]);
-        assertEquals("b", res[1]);
-        assertEquals(" c", res[2]);
-            
-        str = ".a.";
-        res = StringUtils.split(str, '.');
-        assertEquals(1, res.length);
-        assertEquals("a", res[0]);
-        
-        str = "a b c";
-        res = StringUtils.split(str,' ');
-        assertEquals(3, res.length);
-        assertEquals("a", res[0]);
-        assertEquals("b", res[1]);
-        assertEquals("c", res[2]);
-    }
-    
-    @Test
-    public void testSplit_StringString_StringStringInt() {
-        assertNull(StringUtils.split(null, "."));
-        assertNull(StringUtils.split(null, ".", 3));
-        
-        assertEquals(0, StringUtils.split("", ".").length);
-        assertEquals(0, StringUtils.split("", ".", 3).length);
-        
-        innerTestSplit('.', ".", ' ');
-        innerTestSplit('.', ".", ',');
-        innerTestSplit('.', ".,", 'x');
-        for (int i = 0; i < WHITESPACE.length(); i++) {
-            for (int j = 0; j < NON_WHITESPACE.length(); j++) {
-                innerTestSplit(WHITESPACE.charAt(i), null, NON_WHITESPACE.charAt(j));
-                innerTestSplit(WHITESPACE.charAt(i), String.valueOf(WHITESPACE.charAt(i)), NON_WHITESPACE.charAt(j));
-            }
-        }
-        
-        String[] results;
-        final String[] expectedResults = {"ab", "de fg"};
-        results = StringUtils.split("ab   de fg", null, 2);
-        assertEquals(expectedResults.length, results.length);
-        for (int i = 0; i < expectedResults.length; i++) {
-            assertEquals(expectedResults[i], results[i]);
-        }
-        
-        final String[] expectedResults2 = {"ab", "cd:ef"};
-        results = StringUtils.split("ab:cd:ef",":", 2);
-        assertEquals(expectedResults2.length, results.length);
-        for (int i = 0; i < expectedResults2.length; i++) {
-            assertEquals(expectedResults2[i], results[i]);
-        }
-    }
-    
-    private void innerTestSplit(final char separator, final String sepStr, final char noMatch) {
-        final String msg = "Failed on separator hex(" + Integer.toHexString(separator) +
-            "), noMatch hex(" + Integer.toHexString(noMatch) + "), sepStr(" + sepStr + ")";
-        
-        final String str = "a" + separator + "b" + separator + separator + noMatch + "c";
-        String[] res;
-        // (str, sepStr)
-        res = StringUtils.split(str, sepStr);
-        assertEquals(msg, 3, res.length);
-        assertEquals(msg, "a", res[0]);
-        assertEquals(msg, "b", res[1]);
-        assertEquals(msg, noMatch + "c", res[2]);
-        
-        final String str2 = separator + "a" + separator;
-        res = StringUtils.split(str2, sepStr);
-        assertEquals(msg, 1, res.length);
-        assertEquals(msg, "a", res[0]);
-
-        res = StringUtils.split(str, sepStr, -1);
-        assertEquals(msg, 3, res.length);
-        assertEquals(msg, "a", res[0]);
-        assertEquals(msg, "b", res[1]);
-        assertEquals(msg, noMatch + "c", res[2]);
-        
-        res = StringUtils.split(str, sepStr, 0);
-        assertEquals(msg, 3, res.length);
-        assertEquals(msg, "a", res[0]);
-        assertEquals(msg, "b", res[1]);
-        assertEquals(msg, noMatch + "c", res[2]);
-        
-        res = StringUtils.split(str, sepStr, 1);
-        assertEquals(msg, 1, res.length);
-        assertEquals(msg, str, res[0]);
-        
-        res = StringUtils.split(str, sepStr, 2);
-        assertEquals(msg, 2, res.length);
-        assertEquals(msg, "a", res[0]);
-        assertEquals(msg, str.substring(2), res[1]);
-    }
-
-    @Test
-    public void testSplitByWholeString_StringStringBoolean() {
-        assertArrayEquals( null, StringUtils.splitByWholeSeparator( null, "." ) ) ;
-
-        assertEquals( 0, StringUtils.splitByWholeSeparator( "", "." ).length ) ;
-
-        final String stringToSplitOnNulls = "ab   de fg" ;
-        final String[] splitOnNullExpectedResults = { "ab", "de", "fg" } ;
-
-        final String[] splitOnNullResults = StringUtils.splitByWholeSeparator( stringToSplitOnNulls, null ) ;
-        assertEquals( splitOnNullExpectedResults.length, splitOnNullResults.length ) ;
-        for ( int i = 0 ; i < splitOnNullExpectedResults.length ; i+= 1 ) {
-            assertEquals( splitOnNullExpectedResults[i], splitOnNullResults[i] ) ;
-        }
-
-        final String stringToSplitOnCharactersAndString = "abstemiouslyaeiouyabstemiously" ;
-
-        final String[] splitOnStringExpectedResults = { "abstemiously", "abstemiously" } ;
-        final String[] splitOnStringResults = StringUtils.splitByWholeSeparator( stringToSplitOnCharactersAndString, "aeiouy" ) ;
-        assertEquals( splitOnStringExpectedResults.length, splitOnStringResults.length ) ;
-        for ( int i = 0 ; i < splitOnStringExpectedResults.length ; i+= 1 ) {
-            assertEquals( splitOnStringExpectedResults[i], splitOnStringResults[i] ) ;
-        }
-
-        final String[] splitWithMultipleSeparatorExpectedResults = {"ab", "cd", "ef"};
-        final String[] splitWithMultipleSeparator = StringUtils.splitByWholeSeparator("ab:cd::ef", ":");
-        assertEquals( splitWithMultipleSeparatorExpectedResults.length, splitWithMultipleSeparator.length );
-        for( int i = 0; i < splitWithMultipleSeparatorExpectedResults.length ; i++ ) {
-            assertEquals( splitWithMultipleSeparatorExpectedResults[i], splitWithMultipleSeparator[i] ) ;
-        }
-    }
-
-    @Test
-    public void testSplitByWholeString_StringStringBooleanInt() {
-        assertArrayEquals( null, StringUtils.splitByWholeSeparator( null, ".", 3 ) ) ;
-
-        assertEquals( 0, StringUtils.splitByWholeSeparator( "", ".", 3 ).length ) ;
-
-        final String stringToSplitOnNulls = "ab   de fg" ;
-        final String[] splitOnNullExpectedResults = { "ab", "de fg" } ;
-        //String[] splitOnNullExpectedResults = { "ab", "de" } ;
-
-        final String[] splitOnNullResults = StringUtils.splitByWholeSeparator( stringToSplitOnNulls, null, 2 ) ;
-        assertEquals( splitOnNullExpectedResults.length, splitOnNullResults.length ) ;
-        for ( int i = 0 ; i < splitOnNullExpectedResults.length ; i+= 1 ) {
-            assertEquals( splitOnNullExpectedResults[i], splitOnNullResults[i] ) ;
-        }
-
-        final String stringToSplitOnCharactersAndString = "abstemiouslyaeiouyabstemiouslyaeiouyabstemiously" ;
-
-        final String[] splitOnStringExpectedResults = { "abstemiously", "abstemiouslyaeiouyabstemiously" } ;
-        //String[] splitOnStringExpectedResults = { "abstemiously", "abstemiously" } ;
-        final String[] splitOnStringResults = StringUtils.splitByWholeSeparator( stringToSplitOnCharactersAndString, "aeiouy", 2 ) ;
-        assertEquals( splitOnStringExpectedResults.length, splitOnStringResults.length ) ;
-        for ( int i = 0 ; i < splitOnStringExpectedResults.length ; i++ ) {
-            assertEquals( splitOnStringExpectedResults[i], splitOnStringResults[i] ) ;
-        }
-    }
-
-    @Test
-    public void testSplitByWholeSeparatorPreserveAllTokens_StringStringInt() {
-        assertArrayEquals( null, StringUtils.splitByWholeSeparatorPreserveAllTokens( null, ".", -1 ) ) ;
-
-        assertEquals( 0, StringUtils.splitByWholeSeparatorPreserveAllTokens( "", ".", -1 ).length ) ;
-
-        // test whitespace
-        String input = "ab   de fg" ;
-        String[] expected = new String[] { "ab", "", "", "de", "fg" } ;
-
-        String[] actual = StringUtils.splitByWholeSeparatorPreserveAllTokens( input, null, -1 ) ;
-        assertEquals( expected.length, actual.length ) ;
-        for ( int i = 0 ; i < actual.length ; i+= 1 ) {
-            assertEquals( expected[i], actual[i] );
-        }
-
-        // test delimiter singlechar
-        input = "1::2:::3::::4";
-        expected = new String[] { "1", "", "2", "", "", "3", "", "", "", "4" };
-
-        actual = StringUtils.splitByWholeSeparatorPreserveAllTokens( input, ":", -1 ) ;
-        assertEquals( expected.length, actual.length ) ;
-        for ( int i = 0 ; i < actual.length ; i+= 1 ) {
-            assertEquals( expected[i], actual[i] );
-        }
-
-        // test delimiter multichar
-        input = "1::2:::3::::4";
-        expected = new String[] { "1", "2", ":3", "", "4" };
-
-        actual = StringUtils.splitByWholeSeparatorPreserveAllTokens( input, "::", -1 ) ;
-        assertEquals( expected.length, actual.length ) ;
-        for ( int i = 0 ; i < actual.length ; i+= 1 ) {
-            assertEquals( expected[i], actual[i] );
-        }
-
-        // test delimiter char with max
-        input = "1::2::3:4";
-        expected = new String[] { "1", "", "2", ":3:4" };
-
-        actual = StringUtils.splitByWholeSeparatorPreserveAllTokens( input, ":", 4 ) ;
-        assertEquals( expected.length, actual.length ) ;
-        for ( int i = 0 ; i < actual.length ; i+= 1 ) {
-            assertEquals( expected[i], actual[i] );
-        }
-    }
-    
-    @Test
-    public void testSplitPreserveAllTokens_String() {
-        assertNull(StringUtils.splitPreserveAllTokens(null));
-        assertEquals(0, StringUtils.splitPreserveAllTokens("").length);
-        
-        String str = "abc def";
-        String[] res = StringUtils.splitPreserveAllTokens(str);
-        assertEquals(2, res.length);
-        assertEquals("abc", res[0]);
-        assertEquals("def", res[1]);
-        
-        str = "abc  def";
-        res = StringUtils.splitPreserveAllTokens(str);
-        assertEquals(3, res.length);
-        assertEquals("abc", res[0]);
-        assertEquals("", res[1]);
-        assertEquals("def", res[2]);
-        
-        str = " abc ";
-        res = StringUtils.splitPreserveAllTokens(str);
-        assertEquals(3, res.length);
-        assertEquals("", res[0]);
-        assertEquals("abc", res[1]);
-        assertEquals("", res[2]);
-        
-        str = "a b .c";
-        res = StringUtils.splitPreserveAllTokens(str);
-        assertEquals(3, res.length);
-        assertEquals("a", res[0]);
-        assertEquals("b", res[1]);
-        assertEquals(".c", res[2]);
-        
-        str = " a b .c";
-        res = StringUtils.splitPreserveAllTokens(str);
-        assertEquals(4, res.length);
-        assertEquals("", res[0]);
-        assertEquals("a", res[1]);
-        assertEquals("b", res[2]);
-        assertEquals(".c", res[3]);
-        
-        str = "a  b  .c";
-        res = StringUtils.splitPreserveAllTokens(str);
-        assertEquals(5, res.length);
-        assertEquals("a", res[0]);
-        assertEquals("", res[1]);
-        assertEquals("b", res[2]);
-        assertEquals("", res[3]);
-        assertEquals(".c", res[4]);
-        
-        str = " a  ";
-        res = StringUtils.splitPreserveAllTokens(str);
-        assertEquals(4, res.length);
-        assertEquals("", res[0]);
-        assertEquals("a", res[1]);
-        assertEquals("", res[2]);
-        assertEquals("", res[3]);
-
-        str = " a  b";
-        res = StringUtils.splitPreserveAllTokens(str);
-        assertEquals(4, res.length);
-        assertEquals("", res[0]);
-        assertEquals("a", res[1]);
-        assertEquals("", res[2]);
-        assertEquals("b", res[3]);
-
-        str = "a" + WHITESPACE + "b" + NON_WHITESPACE + "c";
-        res = StringUtils.splitPreserveAllTokens(str);
-        assertEquals(WHITESPACE.length() + 1, res.length);
-        assertEquals("a", res[0]);
-        for(int i = 1; i < WHITESPACE.length()-1; i++)
-        {
-          assertEquals("", res[i]);
-        }
-        assertEquals("b" + NON_WHITESPACE + "c", res[WHITESPACE.length()]);                       
-    }
-    
-    @Test
-    public void testSplitPreserveAllTokens_StringChar() {
-        assertNull(StringUtils.splitPreserveAllTokens(null, '.'));
-        assertEquals(0, StringUtils.splitPreserveAllTokens("", '.').length);
-
-        String str = "a.b. c";
-        String[] res = StringUtils.splitPreserveAllTokens(str, '.');
-        assertEquals(3, res.length);
-        assertEquals("a", res[0]);
-        assertEquals("b", res[1]);
-        assertEquals(" c", res[2]);
-            
-        str = "a.b.. c";
-        res = StringUtils.splitPreserveAllTokens(str, '.');
-        assertEquals(4, res.length);
-        assertEquals("a", res[0]);
-        assertEquals("b", res[1]);
-        assertEquals("", res[2]);
-        assertEquals(" c", res[3]);
-
-        str = ".a.";
-        res = StringUtils.splitPreserveAllTokens(str, '.');
-        assertEquals(3, res.length);
-        assertEquals("", res[0]);
-        assertEquals("a", res[1]);
-        assertEquals("", res[2]);
-       
-        str = ".a..";
-        res = StringUtils.splitPreserveAllTokens(str, '.');
-        assertEquals(4, res.length);
-        assertEquals("", res[0]);
-        assertEquals("a", res[1]);
-        assertEquals("", res[2]);
-        assertEquals("", res[3]);
-        
-        str = "..a.";
-        res = StringUtils.splitPreserveAllTokens(str, '.');
-        assertEquals(4, res.length);
-        assertEquals("", res[0]);
-        assertEquals("", res[1]);
-        assertEquals("a", res[2]);
-        assertEquals("", res[3]);
-        
-        str = "..a";
-        res = StringUtils.splitPreserveAllTokens(str, '.');
-        assertEquals(3, res.length);
-        assertEquals("", res[0]);
-        assertEquals("", res[1]);
-        assertEquals("a", res[2]);
-        
-        str = "a b c";
-        res = StringUtils.splitPreserveAllTokens(str,' ');
-        assertEquals(3, res.length);
-        assertEquals("a", res[0]);
-        assertEquals("b", res[1]);
-        assertEquals("c", res[2]);
-
-        str = "a  b  c";
-        res = StringUtils.splitPreserveAllTokens(str,' ');
-        assertEquals(5, res.length);
-        assertEquals("a", res[0]);
-        assertEquals("", res[1]);
-        assertEquals("b", res[2]);
-        assertEquals("", res[3]);
-        assertEquals("c", res[4]);
-        
-        str = " a b c";
-        res = StringUtils.splitPreserveAllTokens(str,' ');
-        assertEquals(4, res.length);
-        assertEquals("", res[0]);
-        assertEquals("a", res[1]);
-        assertEquals("b", res[2]);
-        assertEquals("c", res[3]);
-
-        str = "  a b c";
-        res = StringUtils.splitPreserveAllTokens(str,' ');
-        assertEquals(5, res.length);
-        assertEquals("", res[0]);
-        assertEquals("", res[1]);
-        assertEquals("a", res[2]);
-        assertEquals("b", res[3]);
-        assertEquals("c", res[4]);
-
-        str = "a b c ";
-        res = StringUtils.splitPreserveAllTokens(str,' ');
-        assertEquals(4, res.length);
-        assertEquals("a", res[0]);
-        assertEquals("b", res[1]);
-        assertEquals("c", res[2]);
-        assertEquals("", res[3]);
-
-        str = "a b c  ";
-        res = StringUtils.splitPreserveAllTokens(str,' ');
-        assertEquals(5, res.length);
-        assertEquals("a", res[0]);
-        assertEquals("b", res[1]);
-        assertEquals("c", res[2]);
-        assertEquals("", res[3]);
-        assertEquals("", res[3]);
-
-        // Match example in javadoc
-        {
-          String[] results;
-          final String[] expectedResults = {"a", "", "b", "c"};
-          results = StringUtils.splitPreserveAllTokens("a..b.c",'.');
-          assertEquals(expectedResults.length, results.length);
-          for (int i = 0; i < expectedResults.length; i++) {
-              assertEquals(expectedResults[i], results[i]);
-          }
-        }
-    }
-    
-    @Test
-    public void testSplitPreserveAllTokens_StringString_StringStringInt() {
-        assertNull(StringUtils.splitPreserveAllTokens(null, "."));
-        assertNull(StringUtils.splitPreserveAllTokens(null, ".", 3));
-        
-        assertEquals(0, StringUtils.splitPreserveAllTokens("", ".").length);
-        assertEquals(0, StringUtils.splitPreserveAllTokens("", ".", 3).length);
-        
-        innerTestSplitPreserveAllTokens('.', ".", ' ');
-        innerTestSplitPreserveAllTokens('.', ".", ',');
-        innerTestSplitPreserveAllTokens('.', ".,", 'x');
-        for (int i = 0; i < WHITESPACE.length(); i++) {
-            for (int j = 0; j < NON_WHITESPACE.length(); j++) {
-                innerTestSplitPreserveAllTokens(WHITESPACE.charAt(i), null, NON_WHITESPACE.charAt(j));
-                innerTestSplitPreserveAllTokens(WHITESPACE.charAt(i), String.valueOf(WHITESPACE.charAt(i)), NON_WHITESPACE.charAt(j));
-            }
-        }
-
-        {
-          String[] results;
-          final String[] expectedResults = {"ab", "de fg"};
-          results = StringUtils.splitPreserveAllTokens("ab de fg", null, 2);
-          assertEquals(expectedResults.length, results.length);
-          for (int i = 0; i < expectedResults.length; i++) {
-              assertEquals(expectedResults[i], results[i]);
-          }
-        }
-
-        {
-          String[] results;
-          final String[] expectedResults = {"ab", "  de fg"};
-          results = StringUtils.splitPreserveAllTokens("ab   de fg", null, 2);
-          assertEquals(expectedResults.length, results.length);
-          for (int i = 0; i < expectedResults.length; i++) {
-              assertEquals(expectedResults[i], results[i]);
-          }
-        }
-        
-        {
-          String[] results;
-          final String[] expectedResults = {"ab", "::de:fg"};
-          results = StringUtils.splitPreserveAllTokens("ab:::de:fg", ":", 2);
-          assertEquals(expectedResults.length, results.length);
-          for (int i = 0; i < expectedResults.length; i++) {
-              assertEquals(expectedResults[i], results[i]);
-          }
-        }
-        
-        {
-          String[] results;
-          final String[] expectedResults = {"ab", "", " de fg"};
-          results = StringUtils.splitPreserveAllTokens("ab   de fg", null, 3);
-          assertEquals(expectedResults.length, results.length);
-          for (int i = 0; i < expectedResults.length; i++) {
-              assertEquals(expectedResults[i], results[i]);
-          }
-        }
-        
-        {
-          String[] results;
-          final String[] expectedResults = {"ab", "", "", "de fg"};
-          results = StringUtils.splitPreserveAllTokens("ab   de fg", null, 4);
-          assertEquals(expectedResults.length, results.length);
-          for (int i = 0; i < expectedResults.length; i++) {
-              assertEquals(expectedResults[i], results[i]);
-          }
-        }
-
-        {
-          final String[] expectedResults = {"ab", "cd:ef"};
-          String[] results;
-          results = StringUtils.splitPreserveAllTokens("ab:cd:ef",":", 2);
-          assertEquals(expectedResults.length, results.length);
-          for (int i = 0; i < expectedResults.length; i++) {
-              assertEquals(expectedResults[i], results[i]);
-          }
-        }
-
-        {
-          String[] results;
-          final String[] expectedResults = {"ab", ":cd:ef"};
-          results = StringUtils.splitPreserveAllTokens("ab::cd:ef",":", 2);
-          assertEquals(expectedResults.length, results.length);
-          for (int i = 0; i < expectedResults.length; i++) {
-              assertEquals(expectedResults[i], results[i]);
-          }
-        }
-
-        {
-          String[] results;
-          final String[] expectedResults = {"ab", "", ":cd:ef"};
-          results = StringUtils.splitPreserveAllTokens("ab:::cd:ef",":", 3);
-          assertEquals(expectedResults.length, results.length);
-          for (int i = 0; i < expectedResults.length; i++) {
-              assertEquals(expectedResults[i], results[i]);
-          }
-        }
-
-        {
-          String[] results;
-          final String[] expectedResults = {"ab", "", "", "cd:ef"};
-          results = StringUtils.splitPreserveAllTokens("ab:::cd:ef",":", 4);
-          assertEquals(expectedResults.length, results.length);
-          for (int i = 0; i < expectedResults.length; i++) {
-              assertEquals(expectedResults[i], results[i]);
-          }
-        }
-
-        {
-          String[] results;
-          final String[] expectedResults = {"", "ab", "", "", "cd:ef"};
-          results = StringUtils.splitPreserveAllTokens(":ab:::cd:ef",":", 5);
-          assertEquals(expectedResults.length, results.length);
-          for (int i = 0; i < expectedResults.length; i++) {
-              assertEquals(expectedResults[i], results[i]);
-          }
-        }
-        
-        {
-          String[] results;
-          final String[] expectedResults = {"", "", "ab", "", "", "cd:ef"};
-          results = StringUtils.splitPreserveAllTokens("::ab:::cd:ef",":", 6);
-          assertEquals(expectedResults.length, results.length);
-          for (int i = 0; i < expectedResults.length; i++) {
-              assertEquals(expectedResults[i], results[i]);
-          }
-        }
-        
-    }
-    
-    private void innerTestSplitPreserveAllTokens(final char separator, final String sepStr, final char noMatch) {
-        final String msg = "Failed on separator hex(" + Integer.toHexString(separator) +
-            "), noMatch hex(" + Integer.toHexString(noMatch) + "), sepStr(" + sepStr + ")";
-        
-        final String str = "a" + separator + "b" + separator + separator + noMatch + "c";
-        String[] res;
-        // (str, sepStr)
-        res = StringUtils.splitPreserveAllTokens(str, sepStr);
-        assertEquals(msg, 4, res.length);
-        assertEquals(msg, "a", res[0]);
-        assertEquals(msg, "b", res[1]);
-        assertEquals(msg, "", res[2]);
-        assertEquals(msg, noMatch + "c", res[3]);
-        
-        final String str2 = separator + "a" + separator;
-        res = StringUtils.splitPreserveAllTokens(str2, sepStr);
-        assertEquals(msg, 3, res.length);
-        assertEquals(msg, "", res[0]);
-        assertEquals(msg, "a", res[1]);
-        assertEquals(msg, "", res[2]);
-
-        res = StringUtils.splitPreserveAllTokens(str, sepStr, -1);
-        assertEquals(msg, 4, res.length);
-        assertEquals(msg, "a", res[0]);
-        assertEquals(msg, "b", res[1]);
-        assertEquals(msg, "", res[2]);
-        assertEquals(msg, noMatch + "c", res[3]);
-        
-        res = StringUtils.splitPreserveAllTokens(str, sepStr, 0);
-        assertEquals(msg, 4, res.length);
-        assertEquals(msg, "a", res[0]);
-        assertEquals(msg, "b", res[1]);
-        assertEquals(msg, "", res[2]);
-        assertEquals(msg, noMatch + "c", res[3]);
-        
-        res = StringUtils.splitPreserveAllTokens(str, sepStr, 1);
-        assertEquals(msg, 1, res.length);
-        assertEquals(msg, str, res[0]);
-        
-        res = StringUtils.splitPreserveAllTokens(str, sepStr, 2);
-        assertEquals(msg, 2, res.length);
-        assertEquals(msg, "a", res[0]);
-        assertEquals(msg, str.substring(2), res[1]);
-    }
-
-    @Test
-    public void testSplitByCharacterType() {
-        assertNull(StringUtils.splitByCharacterType(null));
-        assertEquals(0, StringUtils.splitByCharacterType("").length);
-        
-        assertTrue(ArrayUtils.isEquals(new String[] { "ab", " ", "de", " ",
-        "fg" }, StringUtils.splitByCharacterType("ab de fg")));
-        
-        assertTrue(ArrayUtils.isEquals(new String[] { "ab", "   ", "de", " ",
-        "fg" }, StringUtils.splitByCharacterType("ab   de fg")));
-        
-        assertTrue(ArrayUtils.isEquals(new String[] { "ab", ":", "cd", ":",
-        "ef" }, StringUtils.splitByCharacterType("ab:cd:ef")));
-        
-        assertTrue(ArrayUtils.isEquals(new String[] { "number", "5" },
-                StringUtils.splitByCharacterType("number5")));
-        
-        assertTrue(ArrayUtils.isEquals(new String[] { "foo", "B", "ar" },
-                StringUtils.splitByCharacterType("fooBar")));
-        
-        assertTrue(ArrayUtils.isEquals(new String[] { "foo", "200", "B", "ar" },
-                StringUtils.splitByCharacterType("foo200Bar")));
-        
-        assertTrue(ArrayUtils.isEquals(new String[] { "ASFR", "ules" },
-                StringUtils.splitByCharacterType("ASFRules")));
-    }
-    
-    @Test
-    public void testSplitByCharacterTypeCamelCase() {
-        assertNull(StringUtils.splitByCharacterTypeCamelCase(null));
-        assertEquals(0, StringUtils.splitByCharacterTypeCamelCase("").length);
-
-        assertTrue(ArrayUtils.isEquals(new String[] { "ab", " ", "de", " ",
-                "fg" }, StringUtils.splitByCharacterTypeCamelCase("ab de fg")));
-
-        assertTrue(ArrayUtils.isEquals(new String[] { "ab", "   ", "de", " ",
-                "fg" }, StringUtils.splitByCharacterTypeCamelCase("ab   de fg")));
-
-        assertTrue(ArrayUtils.isEquals(new String[] { "ab", ":", "cd", ":",
-                "ef" }, StringUtils.splitByCharacterTypeCamelCase("ab:cd:ef")));
-        
-        assertTrue(ArrayUtils.isEquals(new String[] { "number", "5" },
-                StringUtils.splitByCharacterTypeCamelCase("number5")));
-
-        assertTrue(ArrayUtils.isEquals(new String[] { "foo", "Bar" },
-                StringUtils.splitByCharacterTypeCamelCase("fooBar")));
-
-        assertTrue(ArrayUtils.isEquals(new String[] { "foo", "200", "Bar" },
-                StringUtils.splitByCharacterTypeCamelCase("foo200Bar")));
-
-        assertTrue(ArrayUtils.isEquals(new String[] { "ASF", "Rules" },
-                StringUtils.splitByCharacterTypeCamelCase("ASFRules")));
-    }
-
-    @Test
-    public void testDeleteWhitespace_String() {
-        assertNull(StringUtils.deleteWhitespace(null));
-        assertEquals("", StringUtils.deleteWhitespace(""));
-        assertEquals("", StringUtils.deleteWhitespace("  \u000C  \t\t\u001F\n\n \u000B  "));
-        assertEquals("", StringUtils.deleteWhitespace(StringUtilsTest.WHITESPACE));
-        assertEquals(StringUtilsTest.NON_WHITESPACE, StringUtils.deleteWhitespace(StringUtilsTest.NON_WHITESPACE));
-        // Note: u-2007 and u-000A both cause problems in the source code
-        // it should ignore 2007 but delete 000A
-        assertEquals("\u00A0\u202F", StringUtils.deleteWhitespace("  \u00A0  \t\t\n\n \u202F  "));
-        assertEquals("\u00A0\u202F", StringUtils.deleteWhitespace("\u00A0\u202F"));
-        assertEquals("test", StringUtils.deleteWhitespace("\u000Bt  \t\n\u0009e\rs\n\n   \tt"));
-    }
-
-    @Test
-    public void testLang623() {
-        assertEquals("t", StringUtils.replaceChars("\u00DE", '\u00DE', 't'));
-        assertEquals("t", StringUtils.replaceChars("\u00FE", '\u00FE', 't'));
-    }
-
-    @Test
-    public void testReplace_StringStringString() {
-        assertNull(StringUtils.replace(null, null, null));
-        assertNull(StringUtils.replace(null, null, "any"));
-        assertNull(StringUtils.replace(null, "any", null));
-        assertNull(StringUtils.replace(null, "any", "any"));
-
-        assertEquals("", StringUtils.replace("", null, null));
-        assertEquals("", StringUtils.replace("", null, "any"));
-        assertEquals("", StringUtils.replace("", "any", null));
-        assertEquals("", StringUtils.replace("", "any", "any"));
-
-        assertEquals("FOO", StringUtils.replace("FOO", "", "any"));
-        assertEquals("FOO", StringUtils.replace("FOO", null, "any"));
-        assertEquals("FOO", StringUtils.replace("FOO", "F", null));
-        assertEquals("FOO", StringUtils.replace("FOO", null, null));
-
-        assertEquals("", StringUtils.replace("foofoofoo", "foo", ""));
-        assertEquals("barbarbar", StringUtils.replace("foofoofoo", "foo", "bar"));
-        assertEquals("farfarfar", StringUtils.replace("foofoofoo", "oo", "ar"));
-    }
-    
-    @Test
-    public void testReplacePattern() {
-        assertEquals("X", StringUtils.replacePattern("<A>\nxy\n</A>", "<A>.*</A>", "X"));
-    }
-    
-    @Test
-    public void testRemovePattern() {
-        assertEquals("", StringUtils.removePattern("<A>x\\ny</A>", "<A>.*</A>"));
-    }
-    
-    @Test
-    public void testReplace_StringStringStringInt() {
-        assertNull(StringUtils.replace(null, null, null, 2));
-        assertNull(StringUtils.replace(null, null, "any", 2));
-        assertNull(StringUtils.replace(null, "any", null, 2));
-        assertNull(StringUtils.replace(null, "any", "any", 2));
-
-        assertEquals("", StringUtils.replace("", null, null, 2));
-        assertEquals("", StringUtils.replace("", null, "any", 2));
-        assertEquals("", StringUtils.replace("", "any", null, 2));
-        assertEquals("", StringUtils.replace("", "any", "any", 2));
-        
-        final String str = new String(new char[] {'o', 'o', 'f', 'o', 'o'});
-        assertSame(str, StringUtils.replace(str, "x", "", -1));
-        
-        assertEquals("f", StringUtils.replace("oofoo", "o", "", -1));
-        assertEquals("oofoo", StringUtils.replace("oofoo", "o", "", 0));
-        assertEquals("ofoo", StringUtils.replace("oofoo", "o", "", 1));
-        assertEquals("foo", StringUtils.replace("oofoo", "o", "", 2));
-        assertEquals("fo", StringUtils.replace("oofoo", "o", "", 3));
-        assertEquals("f", StringUtils.replace("oofoo", "o", "", 4));
-        
-        assertEquals("f", StringUtils.replace("oofoo", "o", "", -5));
-        assertEquals("f", StringUtils.replace("oofoo", "o", "", 1000));
-    }
-    
-    @Test
-    public void testReplaceOnce_StringStringString() {
-        assertNull(StringUtils.replaceOnce(null, null, null));
-        assertNull(StringUtils.replaceOnce(null, null, "any"));
-        assertNull(StringUtils.replaceOnce(null, "any", null));
-        assertNull(StringUtils.replaceOnce(null, "any", "any"));
-
-        assertEquals("", StringUtils.replaceOnce("", null, null));
-        assertEquals("", StringUtils.replaceOnce("", null, "any"));
-        assertEquals("", StringUtils.replaceOnce("", "any", null));
-        assertEquals("", StringUtils.replaceOnce("", "any", "any"));
-
-        assertEquals("FOO", StringUtils.replaceOnce("FOO", "", "any"));
-        assertEquals("FOO", StringUtils.replaceOnce("FOO", null, "any"));
-        assertEquals("FOO", StringUtils.replaceOnce("FOO", "F", null));
-        assertEquals("FOO", StringUtils.replaceOnce("FOO", null, null));
-
-        assertEquals("foofoo", StringUtils.replaceOnce("foofoofoo", "foo", ""));
-    }
-
-    /**
-     * Test method for 'StringUtils.replaceEach(String, String[], String[])'
-     */
-    @Test
-    public void testReplace_StringStringArrayStringArray() {
-        //JAVADOC TESTS START
-        assertNull(StringUtils.replaceEach(null, new String[]{"a"}, new String[]{"b"}));
-        assertEquals(StringUtils.replaceEach("", new String[]{"a"}, new String[]{"b"}),"");
-        assertEquals(StringUtils.replaceEach("aba", null, null),"aba");
-        assertEquals(StringUtils.replaceEach("aba", new String[0], null),"aba");
-        assertEquals(StringUtils.replaceEach("aba", null, new String[0]),"aba");
-        assertEquals(StringUtils.replaceEach("aba", new String[]{"a"}, null),"aba");
-
-        assertEquals(StringUtils.replaceEach("aba", new String[]{"a"}, new String[]{""}),"b");
-        assertEquals(StringUtils.replaceEach("aba", new String[]{null}, new String[]{"a"}),"aba");
-        assertEquals(StringUtils.replaceEach("abcde", new String[]{"ab", "d"}, new String[]{"w", "t"}),"wcte");
-        assertEquals(StringUtils.replaceEach("abcde", new String[]{"ab", "d"}, new String[]{"d", "t"}),"dcte");
-        //JAVADOC TESTS END
-
-        assertEquals("bcc", StringUtils.replaceEach("abc", new String[]{"a", "b"}, new String[]{"b", "c"}));
-        assertEquals("q651.506bera", StringUtils.replaceEach("d216.102oren",
-            new String[]{"a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k", "l", "m", "n", 
-                "o", "p", "q", "r", "s", "t", "u", "v", "w", "x", "y", "z", "A", "B", "C", "D", 
-                "E", "F", "G", "H", "I", "J", "K", "L", "M", "N", "O", "P", "Q", "R", "S", "T", 
-                "U", "V", "W", "X", "Y", "Z", "1", "2", "3", "4", "5", "6", "7", "8", "9"},
-            new String[]{"n", "o", "p", "q", "r", "s", "t", "u", "v", "w", "x", "y", "z", "a", 
-                "b", "c", "d", "e", "f", "g", "h", "i", "j", "k", "l", "m", "N", "O", "P", "Q", 
-                "R", "S", "T", "U", "V", "W", "X", "Y", "Z", "A", "B", "C", "D", "E", "F", "G", 
-                "H", "I", "J", "K", "L", "M", "5", "6", "7", "8", "9", "1", "2", "3", "4"}));
-
-        // Test null safety inside arrays - LANG-552
-        assertEquals(StringUtils.replaceEach("aba", new String[]{"a"}, new String[]{null}),"aba");
-        assertEquals(StringUtils.replaceEach("aba", new String[]{"a", "b"}, new String[]{"c", null}),"cbc");
-    }
-
-    /**
-     * Test method for 'StringUtils.replaceEachRepeatedly(String, String[], String[])'
-     */
-    @Test
-    public void testReplace_StringStringArrayStringArrayBoolean() {
-        //JAVADOC TESTS START
-        assertNull(StringUtils.replaceEachRepeatedly(null, new String[]{"a"}, new String[]{"b"}));
-        assertEquals(StringUtils.replaceEachRepeatedly("", new String[]{"a"}, new String[]{"b"}),"");
-        assertEquals(StringUtils.replaceEachRepeatedly("aba", null, null),"aba");
-        assertEquals(StringUtils.replaceEachRepeatedly("aba", new String[0], null),"aba");
-        assertEquals(StringUtils.replaceEachRepeatedly("aba", null, new String[0]),"aba");
-        assertEquals(StringUtils.replaceEachRepeatedly("aba", new String[0], null),"aba");
-
-        assertEquals(StringUtils.replaceEachRepeatedly("aba", new String[]{"a"}, new String[]{""}),"b");
-        assertEquals(StringUtils.replaceEachRepeatedly("aba", new String[]{null}, new String[]{"a"}),"aba");
-        assertEquals(StringUtils.replaceEachRepeatedly("abcde", new String[]{"ab", "d"}, new String[]{"w", "t"}),"wcte");
-        assertEquals(StringUtils.replaceEachRepeatedly("abcde", new String[]{"ab", "d"}, new String[]{"d", "t"}),"tcte");
-
-        try {
-            StringUtils.replaceEachRepeatedly("abcde", new String[]{"ab", "d"}, new String[]{"d", "ab"});
-            fail("Should be a circular reference");
-        } catch (final IllegalStateException e) {}
-
-        //JAVADOC TESTS END
-    }
-    
-    @Test
-    public void testReplaceChars_StringCharChar() {
-        assertNull(StringUtils.replaceChars(null, 'b', 'z'));
-        assertEquals("", StringUtils.replaceChars("", 'b', 'z'));
-        assertEquals("azcza", StringUtils.replaceChars("abcba", 'b', 'z'));
-        assertEquals("abcba", StringUtils.replaceChars("abcba", 'x', 'z'));
-    }
-    
-    @Test
-    public void testReplaceChars_StringStringString() {
-        assertNull(StringUtils.replaceChars(null, null, null));
-        assertNull(StringUtils.replaceChars(null, "", null));
-        assertNull(StringUtils.replaceChars(null, "a", null));
-        assertNull(StringUtils.replaceChars(null, null, ""));
-        assertNull(StringUtils.replaceChars(null, null, "x"));
-        
-        assertEquals("", StringUtils.replaceChars("", null, null));
-        assertEquals("", StringUtils.replaceChars("", "", null));
-        assertEquals("", StringUtils.replaceChars("", "a", null));
-        assertEquals("", StringUtils.replaceChars("", null, ""));
-        assertEquals("", StringUtils.replaceChars("", null, "x"));
-
-        assertEquals("abc", StringUtils.replaceChars("abc", null, null));
-        assertEquals("abc", StringUtils.replaceChars("abc", null, ""));
-        assertEquals("abc", StringUtils.replaceChars("abc", null, "x"));
-        
-        assertEquals("abc", StringUtils.replaceChars("abc", "", null));
-        assertEquals("abc", StringUtils.replaceChars("abc", "", ""));
-        assertEquals("abc", StringUtils.replaceChars("abc", "", "x"));
-        
-        assertEquals("ac", StringUtils.replaceChars("abc", "b", null));
-        assertEquals("ac", StringUtils.replaceChars("abc", "b", ""));
-        assertEquals("axc", StringUtils.replaceChars("abc", "b", "x"));
-        
-        assertEquals("ayzya", StringUtils.replaceChars("abcba", "bc", "yz"));
-        assertEquals("ayya", StringUtils.replaceChars("abcba", "bc", "y"));
-        assertEquals("ayzya", StringUtils.replaceChars("abcba", "bc", "yzx"));
-        
-        assertEquals("abcba", StringUtils.replaceChars("abcba", "z", "w"));
-        assertSame("abcba", StringUtils.replaceChars("abcba", "z", "w"));
-        
-        // Javadoc examples:
-        assertEquals("jelly", StringUtils.replaceChars("hello", "ho", "jy"));
-        assertEquals("ayzya", StringUtils.replaceChars("abcba", "bc", "yz"));
-        assertEquals("ayya", StringUtils.replaceChars("abcba", "bc", "y"));
-        assertEquals("ayzya", StringUtils.replaceChars("abcba", "bc", "yzx"));
-        
-        // From http://issues.apache.org/bugzilla/show_bug.cgi?id=25454
-        assertEquals("bcc", StringUtils.replaceChars("abc", "ab", "bc"));
-        assertEquals("q651.506bera", StringUtils.replaceChars("d216.102oren",
-            "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ123456789",
-            "nopqrstuvwxyzabcdefghijklmNOPQRSTUVWXYZABCDEFGHIJKLM567891234"));
-    }
-    
-    @Test
-    public void testOverlay_StringStringIntInt() {
-        assertNull(StringUtils.overlay(null, null, 2, 4));
-        assertNull(StringUtils.overlay(null, null, -2, -4));
-        
-        assertEquals("", StringUtils.overlay("", null, 0, 0));
-        assertEquals("", StringUtils.overlay("", "", 0, 0));
-        assertEquals("zzzz", StringUtils.overlay("", "zzzz", 0, 0));
-        assertEquals("zzzz", StringUtils.overlay("", "zzzz", 2, 4));
-        assertEquals("zzzz", StringUtils.overlay("", "zzzz", -2, -4));
-        
-        assertEquals("abef", StringUtils.overlay("abcdef", null, 2, 4));
-        assertEquals("abef", StringUtils.overlay("abcdef", null, 4, 2));
-        assertEquals("abef", StringUtils.overlay("abcdef", "", 2, 4));
-        assertEquals("abef", StringUtils.overlay("abcdef", "", 4, 2));
-        assertEquals("abzzzzef", StringUtils.overlay("abcdef", "zzzz", 2, 4));
-        assertEquals("abzzzzef", StringUtils.overlay("abcdef", "zzzz", 4, 2));
-        
-        assertEquals("zzzzef", StringUtils.overlay("abcdef", "zzzz", -1, 4));
-        assertEquals("zzzzef", StringUtils.overlay("abcdef", "zzzz", 4, -1));
-        assertEquals("zzzzabcdef", StringUtils.overlay("abcdef", "zzzz", -2, -1));
-        assertEquals("zzzzabcdef", StringUtils.overlay("abcdef", "zzzz", -1, -2));
-        assertEquals("abcdzzzz", StringUtils.overlay("abcdef", "zzzz", 4, 10));
-        assertEquals("abcdzzzz", StringUtils.overlay("abcdef", "zzzz", 10, 4));
-        assertEquals("abcdefzzzz", StringUtils.overlay("abcdef", "zzzz", 8, 10));
-        assertEquals("abcdefzzzz", StringUtils.overlay("abcdef", "zzzz", 10, 8));
-    }
-
-    @Test
-    public void testRepeat_StringInt() {
-        assertNull(StringUtils.repeat(null, 2));
-        assertEquals("", StringUtils.repeat("ab", 0));
-        assertEquals("", StringUtils.repeat("", 3));
-        assertEquals("aaa", StringUtils.repeat("a", 3));
-        assertEquals("ababab", StringUtils.repeat("ab", 3));
-        assertEquals("abcabcabc", StringUtils.repeat("abc", 3));
-        final String str = StringUtils.repeat("a", 10000);  // bigger than pad limit
-        assertEquals(10000, str.length());
-        assertTrue(StringUtils.containsOnly(str, new char[] {'a'}));
-    }
-
-    @Test
-    public void testRepeat_StringStringInt() {
-        assertNull(StringUtils.repeat(null, null, 2));
-        assertNull(StringUtils.repeat(null, "x", 2));
-        assertEquals("", StringUtils.repeat("", null, 2));
-
-        assertEquals("", StringUtils.repeat("ab", "", 0));
-        assertEquals("", StringUtils.repeat("", "", 2));
-
-        assertEquals("xx", StringUtils.repeat("", "x", 3));
-
-        assertEquals("?, ?, ?", StringUtils.repeat("?", ", ", 3));
-    }
-
-    @Test
-    public void testChop() {
-
-        final String[][] chopCases = {
-            { FOO_UNCAP + "\r\n", FOO_UNCAP } ,
-            { FOO_UNCAP + "\n" , FOO_UNCAP } ,
-            { FOO_UNCAP + "\r", FOO_UNCAP },
-            { FOO_UNCAP + " \r", FOO_UNCAP + " " },
-            { "foo", "fo"},
-            { "foo\nfoo", "foo\nfo" },
-            { "\n", "" },
-            { "\r", "" },
-            { "\r\n", "" },
-            { null, null },
-            { "", "" },
-            { "a", "" },
-        };
-        for (final String[] chopCase : chopCases) {
-            final String original = chopCase[0];
-            final String expectedResult = chopCase[1];
-            assertEquals("chop(String) failed",
-                    expectedResult, StringUtils.chop(original));
-        }
-    }
-
-    @Test
-    public void testChomp() {
-
-        final String[][] chompCases = {
-            { FOO_UNCAP + "\r\n", FOO_UNCAP },
-            { FOO_UNCAP + "\n" , FOO_UNCAP },
-            { FOO_UNCAP + "\r", FOO_UNCAP },
-            { FOO_UNCAP + " \r", FOO_UNCAP + " " },
-            { FOO_UNCAP, FOO_UNCAP },
-            { FOO_UNCAP + "\n\n", FOO_UNCAP + "\n"},
-            { FOO_UNCAP + "\r\n\r\n", FOO_UNCAP + "\r\n" },
-            { "foo\nfoo", "foo\nfoo" },
-            { "foo\n\rfoo", "foo\n\rfoo" },
-            { "\n", "" },
-            { "\r", "" },
-            { "a", "a" },
-            { "\r\n", "" },
-            { "", "" },
-            { null, null },
-            { FOO_UNCAP + "\n\r", FOO_UNCAP + "\n"}
-        };
-        for (final String[] chompCase : chompCases) {
-            final String original = chompCase[0];
-            final String expectedResult = chompCase[1];
-            assertEquals("chomp(String) failed",
-                    expectedResult, StringUtils.chomp(original));
-        }
-
-        assertEquals("chomp(String, String) failed",
-                "foo", StringUtils.chomp("foobar", "bar"));
-        assertEquals("chomp(String, String) failed",
-                "foobar", StringUtils.chomp("foobar", "baz"));
-        assertEquals("chomp(String, String) failed",
-                "foo", StringUtils.chomp("foo", "foooo"));
-        assertEquals("chomp(String, String) failed",
-                "foobar", StringUtils.chomp("foobar", ""));
-        assertEquals("chomp(String, String) failed",
-                "foobar", StringUtils.chomp("foobar", null));
-        assertEquals("chomp(String, String) failed",
-                "", StringUtils.chomp("", "foo"));
-        assertEquals("chomp(String, String) failed",
-                "", StringUtils.chomp("", null));
-        assertEquals("chomp(String, String) failed",
-                "", StringUtils.chomp("", ""));
-        assertEquals("chomp(String, String) failed",
-                null, StringUtils.chomp(null, "foo"));
-        assertEquals("chomp(String, String) failed",
-                null, StringUtils.chomp(null, null));
-        assertEquals("chomp(String, String) failed",
-                null, StringUtils.chomp(null, ""));
-        assertEquals("chomp(String, String) failed",
-                "", StringUtils.chomp("foo", "foo"));
-        assertEquals("chomp(String, String) failed",
-                " ", StringUtils.chomp(" foo", "foo"));
-        assertEquals("chomp(String, String) failed",
-                "foo ", StringUtils.chomp("foo ", "foo"));
-    }
-
-    //-----------------------------------------------------------------------
-    @Test
-    public void testRightPad_StringInt() {
-        assertNull(StringUtils.rightPad(null, 5));
-        assertEquals("     ", StringUtils.rightPad("", 5));
-        assertEquals("abc  ", StringUtils.rightPad("abc", 5));
-        assertEquals("abc", StringUtils.rightPad("abc", 2));
-        assertEquals("abc", StringUtils.rightPad("abc", -1));
-    }
-
-    @Test
-    public void testRightPad_StringIntChar() {
-        assertNull(StringUtils.rightPad(null, 5, ' '));
-        assertEquals("     ", StringUtils.rightPad("", 5, ' '));
-        assertEquals("abc  ", StringUtils.rightPad("abc", 5, ' '));
-        assertEquals("abc", StringUtils.rightPad("abc", 2, ' '));
-        assertEquals("abc", StringUtils.rightPad("abc", -1, ' '));
-        assertEquals("abcxx", StringUtils.rightPad("abc", 5, 'x'));
-        final String str = StringUtils.rightPad("aaa", 10000, 'a');  // bigger than pad length
-        assertEquals(10000, str.length());
-        assertTrue(StringUtils.containsOnly(str, new char[] {'a'}));
-    }
-
-    @Test
-    public void testRightPad_StringIntString() {
-        assertNull(StringUtils.rightPad(null, 5, "-+"));
-        assertEquals("     ", StringUtils.rightPad("", 5, " "));
-        assertNull(StringUtils.rightPad(null, 8, null));
-        assertEquals("abc-+-+", StringUtils.rightPad("abc", 7, "-+"));
-        assertEquals("abc-+~", StringUtils.rightPad("abc", 6, "-+~"));
-        assertEquals("abc-+", StringUtils.rightPad("abc", 5, "-+~"));
-        assertEquals("abc", StringUtils.rightPad("abc", 2, " "));
-        assertEquals("abc", StringUtils.rightPad("abc", -1, " "));
-        assertEquals("abc  ", StringUtils.rightPad("abc", 5, null));
-        assertEquals("abc  ", StringUtils.rightPad("abc", 5, ""));
-    }
-        
-    //-----------------------------------------------------------------------
-    @Test
-    public void testLeftPad_StringInt() {
-        assertNull(StringUtils.leftPad(null, 5));
-        assertEquals("     ", StringUtils.leftPad("", 5));
-        assertEquals("  abc", StringUtils.leftPad("abc", 5));
-        assertEquals("abc", StringUtils.leftPad("abc", 2));
-    }
-        
-    @Test
-    public void testLeftPad_StringIntChar() {
-        assertNull(StringUtils.leftPad(null, 5, ' '));
-        assertEquals("     ", StringUtils.leftPad("", 5, ' '));
-        assertEquals("  abc", StringUtils.leftPad("abc", 5, ' '));
-        assertEquals("xxabc", StringUtils.leftPad("abc", 5, 'x'));
-        assertEquals("\uffff\uffffabc", StringUtils.leftPad("abc", 5, '\uffff'));
-        assertEquals("abc", StringUtils.leftPad("abc", 2, ' '));
-        final String str = StringUtils.leftPad("aaa", 10000, 'a');  // bigger than pad length
-        assertEquals(10000, str.length());
-        assertTrue(StringUtils.containsOnly(str, new char[] {'a'}));
-    }
-        
-    @Test
-    public void testLeftPad_StringIntString() {
-        assertNull(StringUtils.leftPad(null, 5, "-+"));
-        assertNull(StringUtils.leftPad(null, 5, null));
-        assertEquals("     ", StringUtils.leftPad("", 5, " "));
-        assertEquals("-+-+abc", StringUtils.leftPad("abc", 7, "-+"));
-        assertEquals("-+~abc", StringUtils.leftPad("abc", 6, "-+~"));
-        assertEquals("-+abc", StringUtils.leftPad("abc", 5, "-+~"));
-        assertEquals("abc", StringUtils.leftPad("abc", 2, " "));
-        assertEquals("abc", StringUtils.leftPad("abc", -1, " "));
-        assertEquals("  abc", StringUtils.leftPad("abc", 5, null));
-        assertEquals("  abc", StringUtils.leftPad("abc", 5, ""));
-    }
-
-    @Test
-    public void testLengthString() {
-        assertEquals(0, StringUtils.length(null));
-        assertEquals(0, StringUtils.length(""));
-        assertEquals(0, StringUtils.length(StringUtils.EMPTY));
-        assertEquals(1, StringUtils.length("A"));
-        assertEquals(1, StringUtils.length(" "));
-        assertEquals(8, StringUtils.length("ABCDEFGH"));
-    }
-
-    @Test
-    public void testLengthStringBuffer() {
-        assertEquals(0, StringUtils.length(new StringBuffer("")));
-        assertEquals(0, StringUtils.length(new StringBuffer(StringUtils.EMPTY)));
-        assertEquals(1, StringUtils.length(new StringBuffer("A")));
-        assertEquals(1, StringUtils.length(new StringBuffer(" ")));
-        assertEquals(8, StringUtils.length(new StringBuffer("ABCDEFGH")));
-    }
-
-    @Test
-    public void testLengthStringBuilder() {
-        assertEquals(0, StringUtils.length(new StringBuilder("")));
-        assertEquals(0, StringUtils.length(new StringBuilder(StringUtils.EMPTY)));
-        assertEquals(1, StringUtils.length(new StringBuilder("A")));
-        assertEquals(1, StringUtils.length(new StringBuilder(" ")));
-        assertEquals(8, StringUtils.length(new StringBuilder("ABCDEFGH")));
-    }
-    
-    @Test
-    public void testLength_CharBuffer() {
-        assertEquals(0, StringUtils.length(CharBuffer.wrap("")));
-        assertEquals(1, StringUtils.length(CharBuffer.wrap("A")));
-        assertEquals(1, StringUtils.length(CharBuffer.wrap(" ")));
-        assertEquals(8, StringUtils.length(CharBuffer.wrap("ABCDEFGH")));
-    }
-
-    //-----------------------------------------------------------------------
-    @Test
-    public void testCenter_StringInt() {
-        assertNull(StringUtils.center(null, -1));
-        assertNull(StringUtils.center(null, 4));
-        assertEquals("    ", StringUtils.center("", 4));
-        assertEquals("ab", StringUtils.center("ab", 0));
-        assertEquals("ab", StringUtils.center("ab", -1));
-        assertEquals("ab", StringUtils.center("ab", 1));
-        assertEquals("    ", StringUtils.center("", 4));
-        assertEquals(" ab ", StringUtils.center("ab", 4));
-        assertEquals("abcd", StringUtils.center("abcd", 2));
-        assertEquals(" a  ", StringUtils.center("a", 4));
-        assertEquals("  a  ", StringUtils.center("a", 5));
-    }
-    
-    @Test
-    public void testCenter_StringIntChar() {
-        assertNull(StringUtils.center(null, -1, ' '));
-        assertNull(StringUtils.center(null, 4, ' '));
-        assertEquals("    ", StringUtils.center("", 4, ' '));
-        assertEquals("ab", StringUtils.center("ab", 0, ' '));
-        assertEquals("ab", StringUtils.center("ab", -1, ' '));
-        assertEquals("ab", StringUtils.center("ab", 1, ' '));
-        assertEquals("    ", StringUtils.center("", 4, ' '));
-        assertEquals(" ab ", StringUtils.center("ab", 4, ' '));
-        assertEquals("abcd", StringUtils.center("abcd", 2, ' '));
-        assertEquals(" a  ", StringUtils.center("a", 4, ' '));
-        assertEquals("  a  ", StringUtils.center("a", 5, ' '));
-        assertEquals("xxaxx", StringUtils.center("a", 5, 'x'));
-    }
-    
-    @Test
-    public void testCenter_StringIntString() {
-        assertNull(StringUtils.center(null, 4, null));
-        assertNull(StringUtils.center(null, -1, " "));
-        assertNull(StringUtils.center(null, 4, " "));
-        assertEquals("    ", StringUtils.center("", 4, " "));
-        assertEquals("ab", StringUtils.center("ab", 0, " "));
-        assertEquals("ab", StringUtils.center("ab", -1, " "));
-        assertEquals("ab", StringUtils.center("ab", 1, " "));
-        assertEquals("    ", StringUtils.center("", 4, " "));
-        assertEquals(" ab ", StringUtils.center("ab", 4, " "));
-        assertEquals("abcd", StringUtils.center("abcd", 2, " "));
-        assertEquals(" a  ", StringUtils.center("a", 4, " "));
-        assertEquals("yayz", StringUtils.center("a", 4, "yz"));
-        assertEquals("yzyayzy", StringUtils.center("a", 7, "yz"));
-        assertEquals("  abc  ", StringUtils.center("abc", 7, null));
-        assertEquals("  abc  ", StringUtils.center("abc", 7, ""));
-    }
-
-    //-----------------------------------------------------------------------
-    @Test
-    public void testReverse_String() {
-        assertNull(StringUtils.reverse(null) );
-        assertEquals("", StringUtils.reverse("") );
-        assertEquals("sdrawkcab", StringUtils.reverse("backwards") );
-    }
-        
-    @Test
-    public void testReverseDelimited_StringChar() {
-        assertNull(StringUtils.reverseDelimited(null, '.') );
-        assertEquals("", StringUtils.reverseDelimited("", '.') );
-        assertEquals("c.b.a", StringUtils.reverseDelimited("a.b.c", '.') );
-        assertEquals("a b c", StringUtils.reverseDelimited("a b c", '.') );
-        assertEquals("", StringUtils.reverseDelimited("", '.') );
-    }
-
-    //-----------------------------------------------------------------------
-    @Test
-    public void testDefault_String() {
-        assertEquals("", StringUtils.defaultString(null));
-        assertEquals("", StringUtils.defaultString(""));
-        assertEquals("abc", StringUtils.defaultString("abc"));
-    }
-
-    @Test
-    public void testDefault_StringString() {
-        assertEquals("NULL", StringUtils.defaultString(null, "NULL"));
-        assertEquals("", StringUtils.defaultString("", "NULL"));
-        assertEquals("abc", StringUtils.defaultString("abc", "NULL"));
-    }
-
-    @Test
-    public void testDefaultIfEmpty_StringString() {
-        assertEquals("NULL", StringUtils.defaultIfEmpty(null, "NULL"));
-        assertEquals("NULL", StringUtils.defaultIfEmpty("", "NULL"));
-        assertEquals("abc", StringUtils.defaultIfEmpty("abc", "NULL"));
-        assertNull(StringUtils.defaultIfEmpty("", null));
-        // Tests compatibility for the API return type
-        final String s = StringUtils.defaultIfEmpty("abc", "NULL");
-        assertEquals("abc", s);
-    }
-
-    @Test
-    public void testDefaultIfBlank_StringString() {
-        assertEquals("NULL", StringUtils.defaultIfBlank(null, "NULL"));
-        assertEquals("NULL", StringUtils.defaultIfBlank("", "NULL"));
-        assertEquals("NULL", StringUtils.defaultIfBlank(" ", "NULL"));
-        assertEquals("abc", StringUtils.defaultIfBlank("abc", "NULL"));
-        assertNull(StringUtils.defaultIfBlank("", null));
-        // Tests compatibility for the API return type
-        final String s = StringUtils.defaultIfBlank("abc", "NULL");
-        assertEquals("abc", s);
-    }
-
-    @Test
-    public void testDefaultIfEmpty_StringBuilders() {
-        assertEquals("NULL", StringUtils.defaultIfEmpty(new StringBuilder(""), new StringBuilder("NULL")).toString());
-        assertEquals("abc", StringUtils.defaultIfEmpty(new StringBuilder("abc"), new StringBuilder("NULL")).toString());
-        assertNull(StringUtils.defaultIfEmpty(new StringBuilder(""), null));
-        // Tests compatibility for the API return type
-        final StringBuilder s = StringUtils.defaultIfEmpty(new StringBuilder("abc"), new StringBuilder("NULL"));
-        assertEquals("abc", s.toString());
-    }
-
-    @Test
-    public void testDefaultIfBlank_StringBuilders() {
-        assertEquals("NULL", StringUtils.defaultIfBlank(new StringBuilder(""), new StringBuilder("NULL")).toString());
-        assertEquals("NULL", StringUtils.defaultIfBlank(new StringBuilder(" "), new StringBuilder("NULL")).toString());
-        assertEquals("abc", StringUtils.defaultIfBlank(new StringBuilder("abc"), new StringBuilder("NULL")).toString());
-        assertNull(StringUtils.defaultIfBlank(new StringBuilder(""), null));
-        // Tests compatibility for the API return type
-        final StringBuilder s = StringUtils.defaultIfBlank(new StringBuilder("abc"), new StringBuilder("NULL"));
-        assertEquals("abc", s.toString());
-    }
-
-    @Test
-    public void testDefaultIfEmpty_StringBuffers() {
-        assertEquals("NULL", StringUtils.defaultIfEmpty(new StringBuffer(""), new StringBuffer("NULL")).toString());
-        assertEquals("abc", StringUtils.defaultIfEmpty(new StringBuffer("abc"), new StringBuffer("NULL")).toString());
-        assertNull(StringUtils.defaultIfEmpty(new StringBuffer(""), null));
-        // Tests compatibility for the API return type
-        final StringBuffer s = StringUtils.defaultIfEmpty(new StringBuffer("abc"), new StringBuffer("NULL"));
-        assertEquals("abc", s.toString());
-    }
-
-    @Test
-    public void testDefaultIfBlank_StringBuffers() {
-        assertEquals("NULL", StringUtils.defaultIfBlank(new StringBuffer(""), new StringBuffer("NULL")).toString());
-        assertEquals("NULL", StringUtils.defaultIfBlank(new StringBuffer(" "), new StringBuffer("NULL")).toString());
-        assertEquals("abc", StringUtils.defaultIfBlank(new StringBuffer("abc"), new StringBuffer("NULL")).toString());
-        assertNull(StringUtils.defaultIfBlank(new StringBuffer(""), null));
-        // Tests compatibility for the API return type
-        final StringBuffer s = StringUtils.defaultIfBlank(new StringBuffer("abc"), new StringBuffer("NULL"));
-        assertEquals("abc", s.toString());
-    }
-
-    @Test
-    public void testDefaultIfEmpty_CharBuffers() {
-        assertEquals("NULL", StringUtils.defaultIfEmpty(CharBuffer.wrap(""), CharBuffer.wrap("NULL")).toString());
-        assertEquals("abc", StringUtils.defaultIfEmpty(CharBuffer.wrap("abc"), CharBuffer.wrap("NULL")).toString());
-        assertNull(StringUtils.defaultIfEmpty(CharBuffer.wrap(""), null));
-        // Tests compatibility for the API return type
-        final CharBuffer s = StringUtils.defaultIfEmpty(CharBuffer.wrap("abc"), CharBuffer.wrap("NULL"));
-        assertEquals("abc", s.toString());
-    }
-
-    @Test
-    public void testDefaultIfBlank_CharBuffers() {
-        assertEquals("NULL", StringUtils.defaultIfBlank(CharBuffer.wrap(""), CharBuffer.wrap("NULL")).toString());
-        assertEquals("NULL", StringUtils.defaultIfBlank(CharBuffer.wrap(" "), CharBuffer.wrap("NULL")).toString());
-        assertEquals("abc", StringUtils.defaultIfBlank(CharBuffer.wrap("abc"), CharBuffer.wrap("NULL")).toString());
-        assertNull(StringUtils.defaultIfBlank(CharBuffer.wrap(""), null));
-        // Tests compatibility for the API return type
-        final CharBuffer s = StringUtils.defaultIfBlank(CharBuffer.wrap("abc"), CharBuffer.wrap("NULL"));
-        assertEquals("abc", s.toString());
-    }
-
-    //-----------------------------------------------------------------------
-    @Test
-    public void testAbbreviate_StringInt() {
-        assertNull(StringUtils.abbreviate(null, 10));
-        assertEquals("", StringUtils.abbreviate("", 10));
-        assertEquals("short", StringUtils.abbreviate("short", 10));
-        assertEquals("Now is ...", StringUtils.abbreviate("Now is the time for all good men to come to the aid of their party.", 10));
-
-        final String raspberry = "raspberry peach";
-        assertEquals("raspberry p...", StringUtils.abbreviate(raspberry, 14));
-        assertEquals("raspberry peach", StringUtils.abbreviate("raspberry peach", 15));
-        assertEquals("raspberry peach", StringUtils.abbreviate("raspberry peach", 16));
-        assertEquals("abc...", StringUtils.abbreviate("abcdefg", 6));
-        assertEquals("abcdefg", StringUtils.abbreviate("abcdefg", 7));
-        assertEquals("abcdefg", StringUtils.abbreviate("abcdefg", 8));
-        assertEquals("a...", StringUtils.abbreviate("abcdefg", 4));
-        assertEquals("", StringUtils.abbreviate("", 4));
-        
-        try {
-            @SuppressWarnings("unused")
-            final
-            String res = StringUtils.abbreviate("abc", 3);
-            fail("StringUtils.abbreviate expecting IllegalArgumentException");
-        } catch (final IllegalArgumentException ex) {
-                // empty
-        }              
-    }
-    
-    @Test
-    public void testAbbreviate_StringIntInt() {
-        assertNull(StringUtils.abbreviate(null, 10, 12));
-        assertEquals("", StringUtils.abbreviate("", 0, 10));
-        assertEquals("", StringUtils.abbreviate("", 2, 10));
-        
-        try {
-            @SuppressWarnings("unused")
-            final
-            String res = StringUtils.abbreviate("abcdefghij", 0, 3);
-            fail("StringUtils.abbreviate expecting IllegalArgumentException");
-        } catch (final IllegalArgumentException ex) {
-                // empty
-        }      
-        try {
-            @SuppressWarnings("unused")
-            final
-            String res = StringUtils.abbreviate("abcdefghij", 5, 6);
-            fail("StringUtils.abbreviate expecting IllegalArgumentException");
-        } catch (final IllegalArgumentException ex) {
-                // empty
-        }      
-        
-
-        final String raspberry = "raspberry peach";
-        assertEquals("raspberry peach", StringUtils.abbreviate(raspberry, 11, 15));
-
-        assertNull(StringUtils.abbreviate(null, 7, 14));
-        assertAbbreviateWithOffset("abcdefg...", -1, 10);
-        assertAbbreviateWithOffset("abcdefg...", 0, 10);
-        assertAbbreviateWithOffset("abcdefg...", 1, 10);
-        assertAbbreviateWithOffset("abcdefg...", 2, 10);
-        assertAbbreviateWithOffset("abcdefg...", 3, 10);
-        assertAbbreviateWithOffset("abcdefg...", 4, 10);
-        assertAbbreviateWithOffset("...fghi...", 5, 10);
-        assertAbbreviateWithOffset("...ghij...", 6, 10);
-        assertAbbreviateWithOffset("...hijk...", 7, 10);
-        assertAbbreviateWithOffset("...ijklmno", 8, 10);
-        assertAbbreviateWithOffset("...ijklmno", 9, 10);
-        assertAbbreviateWithOffset("...ijklmno", 10, 10);
-        assertAbbreviateWithOffset("...ijklmno", 10, 10);
-        assertAbbreviateWithOffset("...ijklmno", 11, 10);
-        assertAbbreviateWithOffset("...ijklmno", 12, 10);
-        assertAbbreviateWithOffset("...ijklmno", 13, 10);
-        assertAbbreviateWithOffset("...ijklmno", 14, 10);
-        assertAbbreviateWithOffset("...ijklmno", 15, 10);
-        assertAbbreviateWithOffset("...ijklmno", 16, 10);
-        assertAbbreviateWithOffset("...ijklmno", Integer.MAX_VALUE, 10);
-    }
-
-    private void assertAbbreviateWithOffset(final String expected, final int offset, final int maxWidth) {
-        final String abcdefghijklmno = "abcdefghijklmno";
-        final String message = "abbreviate(String,int,int) failed";
-        final String actual = StringUtils.abbreviate(abcdefghijklmno, offset, maxWidth);
-        if (offset >= 0 && offset < abcdefghijklmno.length()) {
-            assertTrue(message + " -- should contain offset character",
-                    actual.indexOf((char)('a'+offset)) != -1);
-        }
-        assertTrue(message + " -- should not be greater than maxWidth",
-                actual.length() <= maxWidth);
-        assertEquals(message, expected, actual);
-    }
-
-    @Test
-    public void testAbbreviateMiddle() {
-        // javadoc examples
-        assertNull( StringUtils.abbreviateMiddle(null, null, 0) );
-        assertEquals( "abc", StringUtils.abbreviateMiddle("abc", null, 0) );
-        assertEquals( "abc", StringUtils.abbreviateMiddle("abc", ".", 0) );
-        assertEquals( "abc", StringUtils.abbreviateMiddle("abc", ".", 3) );
-        assertEquals( "ab.f", StringUtils.abbreviateMiddle("abcdef", ".", 4) );
-
-        // JIRA issue (LANG-405) example (slightly different than actual expected result)
-        assertEquals( 
-            "A very long text with un...f the text is complete.",
-            StringUtils.abbreviateMiddle(
-                "A very long text with unimportant stuff in the middle but interesting start and " +
-                "end to see if the text is complete.", "...", 50) );
-
-        // Test a much longer text :)
-        final String longText = "Start text" + StringUtils.repeat("x", 10000) + "Close text";
-        assertEquals( 
-            "Start text->Close text",
-            StringUtils.abbreviateMiddle( longText, "->", 22 ) );
-
-        // Test negative length
-        assertEquals("abc", StringUtils.abbreviateMiddle("abc", ".", -1));
-
-        // Test boundaries
-        // Fails to change anything as method ensures first and last char are kept
-        assertEquals("abc", StringUtils.abbreviateMiddle("abc", ".", 1));
-        assertEquals("abc", StringUtils.abbreviateMiddle("abc", ".", 2));
-
-        // Test length of n=1
-        assertEquals("a", StringUtils.abbreviateMiddle("a", ".", 1));
-
-        // Test smallest length that can lead to success
-        assertEquals("a.d", StringUtils.abbreviateMiddle("abcd", ".", 3));
-
-        // More from LANG-405
-        assertEquals("a..f", StringUtils.abbreviateMiddle("abcdef", "..", 4));
-        assertEquals("ab.ef", StringUtils.abbreviateMiddle("abcdef", ".", 5));
-    }
-
-    //-----------------------------------------------------------------------
-    @Test
-    public void testDifference_StringString() {
-        assertNull(StringUtils.difference(null, null));
-        assertEquals("", StringUtils.difference("", ""));
-        assertEquals("abc", StringUtils.difference("", "abc"));
-        assertEquals("", StringUtils.difference("abc", ""));
-        assertEquals("i am a robot", StringUtils.difference(null, "i am a robot"));
-        assertEquals("i am a machine", StringUtils.difference("i am a machine", null));
-        assertEquals("robot", StringUtils.difference("i am a machine", "i am a robot"));
-        assertEquals("", StringUtils.difference("abc", "abc"));
-        assertEquals("you are a robot", StringUtils.difference("i am a robot", "you are a robot"));
-    }
-
-    @Test
-    public void testDifferenceAt_StringString() {
-        assertEquals(-1, StringUtils.indexOfDifference(null, null));
-        assertEquals(0, StringUtils.indexOfDifference(null, "i am a robot"));
-        assertEquals(-1, StringUtils.indexOfDifference("", ""));
-        assertEquals(0, StringUtils.indexOfDifference("", "abc"));
-        assertEquals(0, StringUtils.indexOfDifference("abc", ""));
-        assertEquals(0, StringUtils.indexOfDifference("i am a machine", null));
-        assertEquals(7, StringUtils.indexOfDifference("i am a machine", "i am a robot"));
-        assertEquals(-1, StringUtils.indexOfDifference("foo", "foo"));
-        assertEquals(0, StringUtils.indexOfDifference("i am a robot", "you are a robot"));
-        //System.out.println("indexOfDiff: " + StringUtils.indexOfDifference("i am a robot", "not machine"));
-    }
-
-    //-----------------------------------------------------------------------
-    @Test
-    public void testGetLevenshteinDistance_StringString() {
-        assertEquals(0, StringUtils.getLevenshteinDistance("", "") );
-        assertEquals(1, StringUtils.getLevenshteinDistance("", "a") );
-        assertEquals(7, StringUtils.getLevenshteinDistance("aaapppp", "") );
-        assertEquals(1, StringUtils.getLevenshteinDistance("frog", "fog") );
-        assertEquals(3, StringUtils.getLevenshteinDistance("fly", "ant") );
-        assertEquals(7, StringUtils.getLevenshteinDistance("elephant", "hippo") );
-        assertEquals(7, StringUtils.getLevenshteinDistance("hippo", "elephant") );
-        assertEquals(8, StringUtils.getLevenshteinDistance("hippo", "zzzzzzzz") );
-        assertEquals(8, StringUtils.getLevenshteinDistance("zzzzzzzz", "hippo") );
-        assertEquals(1, StringUtils.getLevenshteinDistance("hello", "hallo") );
-    }
-
-    @Test(expected = IllegalArgumentException.class)
-    public void testGetLevenshteinDistance_NullString() throws Exception {
-        StringUtils.getLevenshteinDistance("a", null);
-    }
-
-    @Test(expected = IllegalArgumentException.class)
-    public void testGetLevenshteinDistance_StringNull() throws Exception {
-        StringUtils.getLevenshteinDistance(null, "a");
-    }
-
-    @Test
-    public void testGetLevenshteinDistance_StringStringInt() {
-        // empty strings
-        assertEquals(0, StringUtils.getLevenshteinDistance("", "", 0));
-        assertEquals(7, StringUtils.getLevenshteinDistance("aaapppp", "", 8));
-        assertEquals(7, StringUtils.getLevenshteinDistance("aaapppp", "", 7));
-        assertEquals(-1, StringUtils.getLevenshteinDistance("aaapppp", "", 6));
-
-        // unequal strings, zero threshold
-        assertEquals(-1, StringUtils.getLevenshteinDistance("b", "a", 0));
-        assertEquals(-1, StringUtils.getLevenshteinDistance("a", "b", 0));
-    
-        // equal strings
-        assertEquals(0, StringUtils.getLevenshteinDistance("aa", "aa", 0));
-        assertEquals(0, StringUtils.getLevenshteinDistance("aa", "aa", 2));
-
-        // same length
-        assertEquals(-1, StringUtils.getLevenshteinDistance("aaa", "bbb", 2));
-        assertEquals(3, StringUtils.getLevenshteinDistance("aaa", "bbb", 3));
-    
-        // big stripe
-        assertEquals(6, StringUtils.getLevenshteinDistance("aaaaaa", "b", 10));
-
-        // distance less than threshold
-        assertEquals(7, StringUtils.getLevenshteinDistance("aaapppp", "b", 8));
-        assertEquals(3, StringUtils.getLevenshteinDistance("a", "bbb", 4));
-    
-        // distance equal to threshold
-        assertEquals(7, StringUtils.getLevenshteinDistance("aaapppp", "b", 7));
-        assertEquals(3, StringUtils.getLevenshteinDistance("a", "bbb", 3));
-
-        // distance greater than threshold
-        assertEquals(-1, StringUtils.getLevenshteinDistance("a", "bbb", 2));
-        assertEquals(-1, StringUtils.getLevenshteinDistance("bbb", "a", 2));
-        assertEquals(-1, StringUtils.getLevenshteinDistance("aaapppp", "b", 6));
-
-        // stripe runs off array, strings not similar
-        assertEquals(-1, StringUtils.getLevenshteinDistance("a", "bbb", 1));
-        assertEquals(-1, StringUtils.getLevenshteinDistance("bbb", "a", 1));
-
-        // stripe runs off array, strings are similar
-        assertEquals(-1, StringUtils.getLevenshteinDistance("12345", "1234567", 1));
-        assertEquals(-1, StringUtils.getLevenshteinDistance("1234567", "12345", 1));
-
-        // old getLevenshteinDistance test cases
-        assertEquals(1, StringUtils.getLevenshteinDistance("frog", "fog",1) );
-        assertEquals(3, StringUtils.getLevenshteinDistance("fly", "ant",3) );
-        assertEquals(7, StringUtils.getLevenshteinDistance("elephant", "hippo",7) );
-        assertEquals(-1, StringUtils.getLevenshteinDistance("elephant", "hippo",6) );
-        assertEquals(7, StringUtils.getLevenshteinDistance("hippo", "elephant",7) );
-        assertEquals(-1, StringUtils.getLevenshteinDistance("hippo", "elephant",6) );
-        assertEquals(8, StringUtils.getLevenshteinDistance("hippo", "zzzzzzzz",8) );
-        assertEquals(8, StringUtils.getLevenshteinDistance("zzzzzzzz", "hippo",8) );
-        assertEquals(1, StringUtils.getLevenshteinDistance("hello", "hallo",1) );
-
-        assertEquals(1, StringUtils.getLevenshteinDistance("frog", "fog", Integer.MAX_VALUE) );
-        assertEquals(3, StringUtils.getLevenshteinDistance("fly", "ant", Integer.MAX_VALUE) );
-        assertEquals(7, StringUtils.getLevenshteinDistance("elephant", "hippo", Integer.MAX_VALUE) );
-        assertEquals(7, StringUtils.getLevenshteinDistance("hippo", "elephant", Integer.MAX_VALUE) );
-        assertEquals(8, StringUtils.getLevenshteinDistance("hippo", "zzzzzzzz", Integer.MAX_VALUE) );
-        assertEquals(8, StringUtils.getLevenshteinDistance("zzzzzzzz", "hippo", Integer.MAX_VALUE) );
-        assertEquals(1, StringUtils.getLevenshteinDistance("hello", "hallo", Integer.MAX_VALUE));
-    }
-
-    @Test(expected = IllegalArgumentException.class)
-    public void testGetLevenshteinDistance_NullStringInt() throws Exception {
-            StringUtils.getLevenshteinDistance(null, "a", 0);
-    }
-
-    @Test(expected = IllegalArgumentException.class)
-    public void testGetLevenshteinDistance_StringNullInt() throws Exception {
-            StringUtils.getLevenshteinDistance("a", null, 0);
-    }
-
-    @Test(expected = IllegalArgumentException.class)
-    public void testGetLevenshteinDistance_StringStringNegativeInt() throws Exception {
-            StringUtils.getLevenshteinDistance("a", "a", -1);
-    }
-
-    @Test
-    public void testGetJaroWinklerDistance_StringString() {
-        assertEquals(0.93d, StringUtils.getJaroWinklerDistance("frog", "fog"), 0.0d);
-        assertEquals(0.0d, StringUtils.getJaroWinklerDistance("fly", "ant"), 0.0d);
-        assertEquals(0.44d, StringUtils.getJaroWinklerDistance("elephant", "hippo"), 0.0d);
-        assertEquals(0.91d, StringUtils.getJaroWinklerDistance("ABC Corporation", "ABC Corp"), 0.0d);
-        assertEquals(0.93d, StringUtils.getJaroWinklerDistance("D N H Enterprises Inc", "D & H Enterprises, Inc."), 0.0d);
-        assertEquals(0.94d, StringUtils.getJaroWinklerDistance("My Gym Children's Fitness Center", "My Gym. Childrens Fitness"), 0.0d);
-        assertEquals(0.9d, StringUtils.getJaroWinklerDistance("PENNSYLVANIA", "PENNCISYLVNIA"), 0.0d);
-    }
-
-    @Test(expected = IllegalArgumentException.class)
-    public void testGetJaroWinklerDistance_NullNull() throws Exception {
-            StringUtils.getJaroWinklerDistance(null, null);
-    }
-
-    @Test(expected = IllegalArgumentException.class)
-    public void testGetJaroWinklerDistance_StringNull() throws Exception {
-            StringUtils.getJaroWinklerDistance(" ", null);
-    }
-
-    @Test(expected = IllegalArgumentException.class)
-    public void testGetJaroWinklerDistance_NullString() throws Exception {
-            StringUtils.getJaroWinklerDistance(null, "clear");
-    }
-
-    @Test
-    public void testGetFuzzyDistance() throws Exception {
-        assertEquals(0, StringUtils.getFuzzyDistance("", "", Locale.ENGLISH));
-        assertEquals(0, StringUtils.getFuzzyDistance("Workshop", "b", Locale.ENGLISH));
-        assertEquals(1, StringUtils.getFuzzyDistance("Room", "o", Locale.ENGLISH));
-        assertEquals(1, StringUtils.getFuzzyDistance("Workshop", "w", Locale.ENGLISH));
-        assertEquals(2, StringUtils.getFuzzyDistance("Workshop", "ws", Locale.ENGLISH));
-        assertEquals(4, StringUtils.getFuzzyDistance("Workshop", "wo", Locale.ENGLISH));
-        assertEquals(3, StringUtils.getFuzzyDistance("Apache Software Foundation", "asf", Locale.ENGLISH));
-    }
-
-    @Test(expected = IllegalArgumentException.class)
-    public void testGetFuzzyDistance_NullNullNull() throws Exception {
-        StringUtils.getFuzzyDistance(null, null, null);
-    }
-
-    @Test(expected = IllegalArgumentException.class)
-    public void testGetFuzzyDistance_StringNullLoclae() throws Exception {
-        StringUtils.getFuzzyDistance(" ", null, Locale.ENGLISH);
-    }
-
-    @Test(expected = IllegalArgumentException.class)
-    public void testGetFuzzyDistance_NullStringLocale() throws Exception {
-        StringUtils.getFuzzyDistance(null, "clear", Locale.ENGLISH);
-    }
-
-    @Test(expected = IllegalArgumentException.class)
-    public void testGetFuzzyDistance_StringStringNull() throws Exception {
-        StringUtils.getFuzzyDistance(" ", "clear", null);
-    }
-
-    /**
-     * A sanity check for {@link StringUtils#EMPTY}.
-     */
-    @Test
-    public void testEMPTY() {
-        assertNotNull(StringUtils.EMPTY);
-        assertEquals("", StringUtils.EMPTY);
-        assertEquals(0, StringUtils.EMPTY.length());
-    }
-
-    /**
-     * Test for {@link StringUtils#isAllLowerCase(CharSequence)}.
-     */
-    @Test
-    public void testIsAllLowerCase() {
-        assertFalse(StringUtils.isAllLowerCase(null));
-        assertFalse(StringUtils.isAllLowerCase(StringUtils.EMPTY));
-        assertFalse(StringUtils.isAllLowerCase("  "));
-        assertTrue(StringUtils.isAllLowerCase("abc"));
-        assertFalse(StringUtils.isAllLowerCase("abc "));
-        assertFalse(StringUtils.isAllLowerCase("abc\n"));
-        assertFalse(StringUtils.isAllLowerCase("abC"));
-        assertFalse(StringUtils.isAllLowerCase("ab c"));
-        assertFalse(StringUtils.isAllLowerCase("ab1c"));
-        assertFalse(StringUtils.isAllLowerCase("ab/c"));
-    }
-
-    /**
-     * Test for {@link StringUtils#isAllUpperCase(CharSequence)}.
-     */
-    @Test
-    public void testIsAllUpperCase() {
-        assertFalse(StringUtils.isAllUpperCase(null));
-        assertFalse(StringUtils.isAllUpperCase(StringUtils.EMPTY));
-        assertFalse(StringUtils.isAllUpperCase("  "));
-        assertTrue(StringUtils.isAllUpperCase("ABC"));
-        assertFalse(StringUtils.isAllUpperCase("ABC "));
-        assertFalse(StringUtils.isAllUpperCase("ABC\n"));
-        assertFalse(StringUtils.isAllUpperCase("aBC"));
-        assertFalse(StringUtils.isAllUpperCase("A C"));
-        assertFalse(StringUtils.isAllUpperCase("A1C"));
-        assertFalse(StringUtils.isAllUpperCase("A/C"));
-    }
-
-    @Test
-    public void testRemoveStart() {
-        // StringUtils.removeStart("", *)        = ""
-        assertNull(StringUtils.removeStart(null, null));
-        assertNull(StringUtils.removeStart(null, ""));
-        assertNull(StringUtils.removeStart(null, "a"));
-        
-        // StringUtils.removeStart(*, null)      = *
-        assertEquals(StringUtils.removeStart("", null), "");
-        assertEquals(StringUtils.removeStart("", ""), "");
-        assertEquals(StringUtils.removeStart("", "a"), "");
-        
-        // All others:
-        assertEquals(StringUtils.removeStart("www.domain.com", "www."), "domain.com");
-        assertEquals(StringUtils.removeStart("domain.com", "www."), "domain.com");
-        assertEquals(StringUtils.removeStart("domain.com", ""), "domain.com");        
-        assertEquals(StringUtils.removeStart("domain.com", null), "domain.com");        
-    }
-    
-    @Test
-    public void testRemoveStartIgnoreCase() {
-        // StringUtils.removeStart("", *)        = ""
-        assertNull("removeStartIgnoreCase(null, null)", StringUtils.removeStartIgnoreCase(null, null));
-        assertNull("removeStartIgnoreCase(null, \"\")", StringUtils.removeStartIgnoreCase(null, ""));
-        assertNull("removeStartIgnoreCase(null, \"a\")", StringUtils.removeStartIgnoreCase(null, "a"));
-        
-        // StringUtils.removeStart(*, null)      = *
-        assertEquals("removeStartIgnoreCase(\"\", null)", StringUtils.removeStartIgnoreCase("", null), "");
-        assertEquals("removeStartIgnoreCase(\"\", \"\")", StringUtils.removeStartIgnoreCase("", ""), "");
-        assertEquals("removeStartIgnoreCase(\"\", \"a\")", StringUtils.removeStartIgnoreCase("", "a"), "");
-        
-        // All others:
-        assertEquals("removeStartIgnoreCase(\"www.domain.com\", \"www.\")", StringUtils.removeStartIgnoreCase("www.domain.com", "www."), "domain.com");
-        assertEquals("removeStartIgnoreCase(\"domain.com\", \"www.\")", StringUtils.removeStartIgnoreCase("domain.com", "www."), "domain.com");
-        assertEquals("removeStartIgnoreCase(\"domain.com\", \"\")", StringUtils.removeStartIgnoreCase("domain.com", ""), "domain.com");        
-        assertEquals("removeStartIgnoreCase(\"domain.com\", null)", StringUtils.removeStartIgnoreCase("domain.com", null), "domain.com");        
-        
-        // Case insensitive:
-        assertEquals("removeStartIgnoreCase(\"www.domain.com\", \"WWW.\")", StringUtils.removeStartIgnoreCase("www.domain.com", "WWW."), "domain.com");
-    }
-
-    @Test
-    public void testRemoveEnd() {
-        // StringUtils.removeEnd("", *)        = ""
-        assertNull(StringUtils.removeEnd(null, null));
-        assertNull(StringUtils.removeEnd(null, ""));
-        assertNull(StringUtils.removeEnd(null, "a"));
-        
-        // StringUtils.removeEnd(*, null)      = *
-        assertEquals(StringUtils.removeEnd("", null), "");
-        assertEquals(StringUtils.removeEnd("", ""), "");
-        assertEquals(StringUtils.removeEnd("", "a"), "");
-        
-        // All others:
-        assertEquals(StringUtils.removeEnd("www.domain.com.", ".com"), "www.domain.com.");
-        assertEquals(StringUtils.removeEnd("www.domain.com", ".com"), "www.domain");
-        assertEquals(StringUtils.removeEnd("www.domain", ".com"), "www.domain");
-        assertEquals(StringUtils.removeEnd("domain.com", ""), "domain.com");   
-        assertEquals(StringUtils.removeEnd("domain.com", null), "domain.com");   
-    }
-
-    @Test
-    public void testRemoveEndIgnoreCase() {
-        // StringUtils.removeEndIgnoreCase("", *)        = ""
-        assertNull("removeEndIgnoreCase(null, null)", StringUtils.removeEndIgnoreCase(null, null));
-        assertNull("removeEndIgnoreCase(null, \"\")", StringUtils.removeEndIgnoreCase(null, ""));
-        assertNull("removeEndIgnoreCase(null, \"a\")", StringUtils.removeEndIgnoreCase(null, "a"));
-        
-        // StringUtils.removeEnd(*, null)      = *
-        assertEquals("removeEndIgnoreCase(\"\", null)", StringUtils.removeEndIgnoreCase("", null), "");
-        assertEquals("removeEndIgnoreCase(\"\", \"\")", StringUtils.removeEndIgnoreCase("", ""), "");
-        assertEquals("removeEndIgnoreCase(\"\", \"a\")", StringUtils.removeEndIgnoreCase("", "a"), "");
-        
-        // All others:
-        assertEquals("removeEndIgnoreCase(\"www.domain.com.\", \".com\")", StringUtils.removeEndIgnoreCase("www.domain.com.", ".com"), "www.domain.com.");
-        assertEquals("removeEndIgnoreCase(\"www.domain.com\", \".com\")", StringUtils.removeEndIgnoreCase("www.domain.com", ".com"), "www.domain");
-        assertEquals("removeEndIgnoreCase(\"www.domain\", \".com\")", StringUtils.removeEndIgnoreCase("www.domain", ".com"), "www.domain");
-        assertEquals("removeEndIgnoreCase(\"domain.com\", \"\")", StringUtils.removeEndIgnoreCase("domain.com", ""), "domain.com");   
-        assertEquals("removeEndIgnoreCase(\"domain.com\", null)", StringUtils.removeEndIgnoreCase("domain.com", null), "domain.com");   
-
-        // Case insensitive:
-        assertEquals("removeEndIgnoreCase(\"www.domain.com\", \".COM\")", StringUtils.removeEndIgnoreCase("www.domain.com", ".COM"), "www.domain");
-        assertEquals("removeEndIgnoreCase(\"www.domain.COM\", \".com\")", StringUtils.removeEndIgnoreCase("www.domain.COM", ".com"), "www.domain");
-    }
-
-    @Test
-    public void testRemove_String() {
-        // StringUtils.remove(null, *)        = null
-        assertNull(StringUtils.remove(null, null));
-        assertNull(StringUtils.remove(null, ""));
-        assertNull(StringUtils.remove(null, "a"));
-        
-        // StringUtils.remove("", *)          = ""
-        assertEquals("", StringUtils.remove("", null));
-        assertEquals("", StringUtils.remove("", ""));
-        assertEquals("", StringUtils.remove("", "a"));
-        
-        // StringUtils.remove(*, null)        = *
-        assertNull(StringUtils.remove(null, null));
-        assertEquals("", StringUtils.remove("", null));
-        assertEquals("a", StringUtils.remove("a", null));
-        
-        // StringUtils.remove(*, "")          = *
-        assertNull(StringUtils.remove(null, ""));
-        assertEquals("", StringUtils.remove("", ""));
-        assertEquals("a", StringUtils.remove("a", ""));
-        
-        // StringUtils.remove("queued", "ue") = "qd"
-        assertEquals("qd", StringUtils.remove("queued", "ue"));
-        
-        // StringUtils.remove("queued", "zz") = "queued"
-        assertEquals("queued", StringUtils.remove("queued", "zz"));
-    }
-
-    @Test
-    public void testRemove_char() {
-        // StringUtils.remove(null, *)       = null
-        assertNull(StringUtils.remove(null, 'a'));
-        assertNull(StringUtils.remove(null, 'a'));
-        assertNull(StringUtils.remove(null, 'a'));
-        
-        // StringUtils.remove("", *)          = ""
-        assertEquals("", StringUtils.remove("", 'a'));
-        assertEquals("", StringUtils.remove("", 'a'));
-        assertEquals("", StringUtils.remove("", 'a'));
-        
-        // StringUtils.remove("queued", 'u') = "qeed"
-        assertEquals("qeed", StringUtils.remove("queued", 'u'));
-        
-        // StringUtils.remove("queued", 'z') = "queued"
-        assertEquals("queued", StringUtils.remove("queued", 'z'));
-    }
-    
-    @Test
-    public void testDifferenceAt_StringArray() {        
-        assertEquals(-1, StringUtils.indexOfDifference((String[])null));
-        assertEquals(-1, StringUtils.indexOfDifference(new String[] {}));
-        assertEquals(-1, StringUtils.indexOfDifference(new String[] {"abc"}));
-        assertEquals(-1, StringUtils.indexOfDifference(new String[] {null, null}));
-        assertEquals(-1, StringUtils.indexOfDifference(new String[] {"", ""}));
-        assertEquals(0, StringUtils.indexOfDifference(new String[] {"", null}));
-        assertEquals(0, StringUtils.indexOfDifference(new String[] {"abc", null, null}));
-        assertEquals(0, StringUtils.indexOfDifference(new String[] {null, null, "abc"}));
-        assertEquals(0, StringUtils.indexOfDifference(new String[] {"", "abc"}));
-        assertEquals(0, StringUtils.indexOfDifference(new String[] {"abc", ""}));
-        assertEquals(-1, StringUtils.indexOfDifference(new String[] {"abc", "abc"}));
-        assertEquals(1, StringUtils.indexOfDifference(new String[] {"abc", "a"}));
-        assertEquals(2, StringUtils.indexOfDifference(new String[] {"ab", "abxyz"}));
-        assertEquals(2, StringUtils.indexOfDifference(new String[] {"abcde", "abxyz"}));
-        assertEquals(0, StringUtils.indexOfDifference(new String[] {"abcde", "xyz"}));
-        assertEquals(0, StringUtils.indexOfDifference(new String[] {"xyz", "abcde"}));
-        assertEquals(7, StringUtils.indexOfDifference(new String[] {"i am a machine", "i am a robot"}));
-    }
-    
-    @Test
-    public void testGetCommonPrefix_StringArray() {
-        assertEquals("", StringUtils.getCommonPrefix((String[])null));
-        assertEquals("", StringUtils.getCommonPrefix());
-        assertEquals("abc", StringUtils.getCommonPrefix("abc"));
-        assertEquals("", StringUtils.getCommonPrefix(null, null));
-        assertEquals("", StringUtils.getCommonPrefix("", ""));
-        assertEquals("", StringUtils.getCommonPrefix("", null));
-        assertEquals("", StringUtils.getCommonPrefix("abc", null, null));
-        assertEquals("", StringUtils.getCommonPrefix(null, null, "abc"));
-        assertEquals("", StringUtils.getCommonPrefix("", "abc"));
-        assertEquals("", StringUtils.getCommonPrefix("abc", ""));
-        assertEquals("abc", StringUtils.getCommonPrefix("abc", "abc"));
-        assertEquals("a", StringUtils.getCommonPrefix("abc", "a"));
-        assertEquals("ab", StringUtils.getCommonPrefix("ab", "abxyz"));
-        assertEquals("ab", StringUtils.getCommonPrefix("abcde", "abxyz"));
-        assertEquals("", StringUtils.getCommonPrefix("abcde", "xyz"));
-        assertEquals("", StringUtils.getCommonPrefix("xyz", "abcde"));
-        assertEquals("i am a ", StringUtils.getCommonPrefix("i am a machine", "i am a robot"));
-    }
-
-    @Test
-    public void testNormalizeSpace() {
-        assertNull(StringUtils.normalizeSpace(null));
-        assertEquals("", StringUtils.normalizeSpace(""));
-        assertEquals("", StringUtils.normalizeSpace(" "));
-        assertEquals("", StringUtils.normalizeSpace("\t"));
-        assertEquals("", StringUtils.normalizeSpace("\n"));
-        assertEquals("", StringUtils.normalizeSpace("\u0009"));
-        assertEquals("", StringUtils.normalizeSpace("\u000B"));
-        assertEquals("", StringUtils.normalizeSpace("\u000C"));
-        assertEquals("", StringUtils.normalizeSpace("\u001C"));
-        assertEquals("", StringUtils.normalizeSpace("\u001D"));
-        assertEquals("", StringUtils.normalizeSpace("\u001E"));
-        assertEquals("", StringUtils.normalizeSpace("\u001F"));
-        assertEquals("", StringUtils.normalizeSpace("\f"));
-        assertEquals("", StringUtils.normalizeSpace("\r"));
-        assertEquals("a", StringUtils.normalizeSpace("  a  "));
-        assertEquals("a b c", StringUtils.normalizeSpace("  a  b   c  "));
-        assertEquals("a b c", StringUtils.normalizeSpace("a\t\f\r  b\u000B   c\n"));
-        assertEquals("a   b c", StringUtils.normalizeSpace("a\t\f\r  " + HARD_SPACE + HARD_SPACE + "b\u000B   c\n"));
-    }
-
-    @Test
-    public void testLANG666() {
-        assertEquals("12",StringUtils.stripEnd("120.00", ".0"));
-        assertEquals("121",StringUtils.stripEnd("121.00", ".0"));
-    }
-
-    // Methods on StringUtils that are immutable in spirit (i.e. calculate the length) 
-    // should take a CharSequence parameter. Methods that are mutable in spirit (i.e. capitalize) 
-    // should take a String or String[] parameter and return String or String[].
-    // This test enforces that this is done.
-    @Test
-    public void testStringUtilsCharSequenceContract() {
-        final Class<StringUtils> c = StringUtils.class;
-        final Method[] methods = c.getMethods();
-        for (final Method m : methods) {
-            if (m.getReturnType() == String.class || m.getReturnType() == String[].class) {
-                // Assume this is mutable and ensure the first parameter is not CharSequence.
-                // It may be String or it may be something else (String[], Object, Object[]) so 
-                // don't actively test for that.
-                final Class<?>[] params = m.getParameterTypes();
-                if ( params.length > 0 && (params[0] == CharSequence.class || params[0] == CharSequence[].class)) {
-                    fail("The method " + m + " appears to be mutable in spirit and therefore must not accept a CharSequence");
-                }
-            } else {
-                // Assume this is immutable in spirit and ensure the first parameter is not String.
-                // As above, it may be something other than CharSequence.
-                final Class<?>[] params = m.getParameterTypes();
-                if ( params.length > 0 && (params[0] == String.class || params[0] == String[].class)) {
-                    fail("The method " + m + " appears to be immutable in spirit and therefore must not accept a String");
-                }
-            }
-        }
-    }
-
-    /**
-     * Tests {@link StringUtils#toString(byte[], String)}
-     *
-     * @throws java.io.UnsupportedEncodingException because the method under test max throw it
-     * @see StringUtils#toString(byte[], String)
-     */
-    @Test
-    public void testToString() throws UnsupportedEncodingException {
-        final String expectedString = "The quick brown fox jumped over the lazy dog.";
-        byte[] expectedBytes = expectedString.getBytes(Charset.defaultCharset());
-        // sanity check start
-        assertArrayEquals(expectedBytes, expectedString.getBytes());
-        // sanity check end
-        assertEquals(expectedString, StringUtils.toString(expectedBytes, null));
-        assertEquals(expectedString, StringUtils.toString(expectedBytes, SystemUtils.FILE_ENCODING));
-        String encoding = "UTF-16";
-        expectedBytes = expectedString.getBytes(Charset.forName(encoding));
-        assertEquals(expectedString, StringUtils.toString(expectedBytes, encoding));
-    }
-    
-    @Test
-    public void testEscapeSurrogatePairs() throws Exception {
-        assertEquals("\uD83D\uDE30", StringEscapeUtils.escapeCsv("\uD83D\uDE30"));
-        // Examples from https://en.wikipedia.org/wiki/UTF-16
-        assertEquals("\uD800\uDC00", StringEscapeUtils.escapeCsv("\uD800\uDC00"));
-        assertEquals("\uD834\uDD1E", StringEscapeUtils.escapeCsv("\uD834\uDD1E"));
-        assertEquals("\uDBFF\uDFFD", StringEscapeUtils.escapeCsv("\uDBFF\uDFFD"));
-        assertEquals("\uDBFF\uDFFD", StringEscapeUtils.escapeHtml3("\uDBFF\uDFFD"));
-        assertEquals("\uDBFF\uDFFD", StringEscapeUtils.escapeHtml4("\uDBFF\uDFFD"));
-        assertEquals("\uDBFF\uDFFD", StringEscapeUtils.escapeXml("\uDBFF\uDFFD"));
-    }
-    
-    /**
-     * Tests LANG-858.
-     */
-    @Test
-    public void testEscapeSurrogatePairsLang858() {
-        assertEquals("\\uDBFF\\uDFFD", StringEscapeUtils.escapeJava("\uDBFF\uDFFD"));       //fail LANG-858
-        assertEquals("\\uDBFF\\uDFFD", StringEscapeUtils.escapeEcmaScript("\uDBFF\uDFFD")); //fail LANG-858
-    }
-    
-    @Test
-    public void testUnescapeSurrogatePairs() throws Exception {
-        assertEquals("\uD83D\uDE30", StringEscapeUtils.unescapeCsv("\uD83D\uDE30"));
-        // Examples from https://en.wikipedia.org/wiki/UTF-16
-        assertEquals("\uD800\uDC00", StringEscapeUtils.unescapeCsv("\uD800\uDC00"));
-        assertEquals("\uD834\uDD1E", StringEscapeUtils.unescapeCsv("\uD834\uDD1E"));
-        assertEquals("\uDBFF\uDFFD", StringEscapeUtils.unescapeCsv("\uDBFF\uDFFD"));
-        assertEquals("\uDBFF\uDFFD", StringEscapeUtils.unescapeHtml3("\uDBFF\uDFFD"));
-        assertEquals("\uDBFF\uDFFD", StringEscapeUtils.unescapeHtml4("\uDBFF\uDFFD"));
-    }
-
-    /**
-     * Tests {@code appendIfMissing}.
-     */
-    @Test
-    public void testAppendIfMissing() {
-        assertEquals("appendIfMissing(null,null)", null, StringUtils.appendIfMissing(null,null));
-        assertEquals("appendIfMissing(abc,null)", "abc", StringUtils.appendIfMissing("abc",null));
-        assertEquals("appendIfMissing(\"\",xyz)", "xyz", StringUtils.appendIfMissing("","xyz"));
-        assertEquals("appendIfMissing(abc,xyz)", "abcxyz", StringUtils.appendIfMissing("abc","xyz"));
-        assertEquals("appendIfMissing(abcxyz,xyz)", "abcxyz", StringUtils.appendIfMissing("abcxyz","xyz"));
-        assertEquals("appendIfMissing(aXYZ,xyz)", "aXYZxyz", StringUtils.appendIfMissing("aXYZ","xyz"));
-
-        assertEquals("appendIfMissing(null,null,null)", null, StringUtils.appendIfMissing(null,null,(CharSequence[]) null));
-        assertEquals("appendIfMissing(abc,null,null)", "abc", StringUtils.appendIfMissing("abc",null,(CharSequence[]) null));
-        assertEquals("appendIfMissing(\"\",xyz,null))", "xyz", StringUtils.appendIfMissing("","xyz",(CharSequence[]) null));
-        assertEquals("appendIfMissing(abc,xyz,{null})", "abcxyz", StringUtils.appendIfMissing("abc","xyz",new CharSequence[]{null}));
-        assertEquals("appendIfMissing(abc,xyz,\"\")", "abc", StringUtils.appendIfMissing("abc","xyz",""));
-        assertEquals("appendIfMissing(abc,xyz,mno)", "abcxyz", StringUtils.appendIfMissing("abc","xyz","mno"));
-        assertEquals("appendIfMissing(abcxyz,xyz,mno)", "abcxyz", StringUtils.appendIfMissing("abcxyz","xyz","mno"));
-        assertEquals("appendIfMissing(abcmno,xyz,mno)", "abcmno", StringUtils.appendIfMissing("abcmno","xyz","mno"));
-        assertEquals("appendIfMissing(abcXYZ,xyz,mno)", "abcXYZxyz", StringUtils.appendIfMissing("abcXYZ","xyz","mno"));
-        assertEquals("appendIfMissing(abcMNO,xyz,mno)", "abcMNOxyz", StringUtils.appendIfMissing("abcMNO","xyz","mno"));
-    }
-
-    /**
-     * Tests {@code appendIfMissingIgnoreCase}.
-     */
-    @Test
-    public void testAppendIfMissingIgnoreCase() {
-        assertEquals("appendIfMissingIgnoreCase(null,null)", null, StringUtils.appendIfMissingIgnoreCase(null,null));
-        assertEquals("appendIfMissingIgnoreCase(abc,null)", "abc", StringUtils.appendIfMissingIgnoreCase("abc",null));
-        assertEquals("appendIfMissingIgnoreCase(\"\",xyz)", "xyz", StringUtils.appendIfMissingIgnoreCase("","xyz"));
-        assertEquals("appendIfMissingIgnoreCase(abc,xyz)", "abcxyz", StringUtils.appendIfMissingIgnoreCase("abc","xyz"));
-        assertEquals("appendIfMissingIgnoreCase(abcxyz,xyz)", "abcxyz", StringUtils.appendIfMissingIgnoreCase("abcxyz","xyz"));
-        assertEquals("appendIfMissingIgnoreCase(abcXYZ,xyz)", "abcXYZ", StringUtils.appendIfMissingIgnoreCase("abcXYZ","xyz"));
-
-        assertEquals("appendIfMissingIgnoreCase(null,null,null)", null, StringUtils.appendIfMissingIgnoreCase(null,null,(CharSequence[]) null));
-        assertEquals("appendIfMissingIgnoreCase(abc,null,null)", "abc", StringUtils.appendIfMissingIgnoreCase("abc",null,(CharSequence[]) null));
-        assertEquals("appendIfMissingIgnoreCase(\"\",xyz,null)", "xyz", StringUtils.appendIfMissingIgnoreCase("","xyz",(CharSequence[]) null));
-        assertEquals("appendIfMissingIgnoreCase(abc,xyz,{null})", "abcxyz", StringUtils.appendIfMissingIgnoreCase("abc","xyz",new CharSequence[]{null}));
-        assertEquals("appendIfMissingIgnoreCase(abc,xyz,\"\")", "abc", StringUtils.appendIfMissingIgnoreCase("abc","xyz",""));
-        assertEquals("appendIfMissingIgnoreCase(abc,xyz,mno)", "abcxyz", StringUtils.appendIfMissingIgnoreCase("abc","xyz","mno"));
-        assertEquals("appendIfMissingIgnoreCase(abcxyz,xyz,mno)", "abcxyz", StringUtils.appendIfMissingIgnoreCase("abcxyz","xyz","mno"));       
-        assertEquals("appendIfMissingIgnoreCase(abcmno,xyz,mno)", "abcmno", StringUtils.appendIfMissingIgnoreCase("abcmno","xyz","mno"));       
-        assertEquals("appendIfMissingIgnoreCase(abcXYZ,xyz,mno)", "abcXYZ", StringUtils.appendIfMissingIgnoreCase("abcXYZ","xyz","mno"));
-        assertEquals("appendIfMissingIgnoreCase(abcMNO,xyz,mno)", "abcMNO", StringUtils.appendIfMissingIgnoreCase("abcMNO","xyz","mno"));
-    }
-
-    /**
-     * Tests {@code prependIfMissing}.
-     */
-    @Test
-    public void testPrependIfMissing() {
-        assertEquals("prependIfMissing(null,null)", null, StringUtils.prependIfMissing(null,null));
-        assertEquals("prependIfMissing(abc,null)", "abc", StringUtils.prependIfMissing("abc",null));
-        assertEquals("prependIfMissing(\"\",xyz)", "xyz", StringUtils.prependIfMissing("","xyz"));
-        assertEquals("prependIfMissing(abc,xyz)", "xyzabc", StringUtils.prependIfMissing("abc","xyz"));
-        assertEquals("prependIfMissing(xyzabc,xyz)", "xyzabc", StringUtils.prependIfMissing("xyzabc","xyz"));
-        assertEquals("prependIfMissing(XYZabc,xyz)", "xyzXYZabc", StringUtils.prependIfMissing("XYZabc","xyz"));
-
-        assertEquals("prependIfMissing(null,null null)", null, StringUtils.prependIfMissing(null,null,(CharSequence[]) null));
-        assertEquals("prependIfMissing(abc,null,null)", "abc", StringUtils.prependIfMissing("abc",null,(CharSequence[]) null));
-        assertEquals("prependIfMissing(\"\",xyz,null)", "xyz", StringUtils.prependIfMissing("","xyz",(CharSequence[]) null));
-        assertEquals("prependIfMissing(abc,xyz,{null})","xyzabc", StringUtils.prependIfMissing("abc","xyz",new CharSequence[]{null}));
-        assertEquals("prependIfMissing(abc,xyz,\"\")","abc", StringUtils.prependIfMissing("abc","xyz",""));
-        assertEquals("prependIfMissing(abc,xyz,mno)","xyzabc", StringUtils.prependIfMissing("abc","xyz","mno"));
-        assertEquals("prependIfMissing(xyzabc,xyz,mno)", "xyzabc", StringUtils.prependIfMissing("xyzabc","xyz","mno"));
-        assertEquals("prependIfMissing(mnoabc,xyz,mno)", "mnoabc", StringUtils.prependIfMissing("mnoabc","xyz","mno"));
-        assertEquals("prependIfMissing(XYZabc,xyz,mno)", "xyzXYZabc", StringUtils.prependIfMissing("XYZabc","xyz","mno"));
-        assertEquals("prependIfMissing(MNOabc,xyz,mno)", "xyzMNOabc", StringUtils.prependIfMissing("MNOabc","xyz","mno"));
-    }
-
-    /**
-     * Tests {@code prependIfMissingIgnoreCase}.
-     */
-    @Test
-    public void testPrependIfMissingIgnoreCase() {
-        assertEquals("prependIfMissingIgnoreCase(null,null)", null, StringUtils.prependIfMissingIgnoreCase(null,null));
-        assertEquals("prependIfMissingIgnoreCase(abc,null)", "abc", StringUtils.prependIfMissingIgnoreCase("abc",null));
-        assertEquals("prependIfMissingIgnoreCase(\"\",xyz)", "xyz", StringUtils.prependIfMissingIgnoreCase("","xyz"));
-        assertEquals("prependIfMissingIgnoreCase(abc,xyz)", "xyzabc", StringUtils.prependIfMissingIgnoreCase("abc","xyz"));
-        assertEquals("prependIfMissingIgnoreCase(xyzabc,xyz)", "xyzabc", StringUtils.prependIfMissingIgnoreCase("xyzabc","xyz"));
-        assertEquals("prependIfMissingIgnoreCase(XYZabc,xyz)", "XYZabc", StringUtils.prependIfMissingIgnoreCase("XYZabc","xyz"));
-
-        assertEquals("prependIfMissingIgnoreCase(null,null null)", null, StringUtils.prependIfMissingIgnoreCase(null,null,(CharSequence[]) null));
-        assertEquals("prependIfMissingIgnoreCase(abc,null,null)", "abc", StringUtils.prependIfMissingIgnoreCase("abc",null,(CharSequence[]) null));
-        assertEquals("prependIfMissingIgnoreCase(\"\",xyz,null)", "xyz", StringUtils.prependIfMissingIgnoreCase("","xyz",(CharSequence[]) null));
-        assertEquals("prependIfMissingIgnoreCase(abc,xyz,{null})","xyzabc", StringUtils.prependIfMissingIgnoreCase("abc","xyz",new CharSequence[]{null}));
-        assertEquals("prependIfMissingIgnoreCase(abc,xyz,\"\")","abc", StringUtils.prependIfMissingIgnoreCase("abc","xyz",""));
-        assertEquals("prependIfMissingIgnoreCase(abc,xyz,mno)","xyzabc", StringUtils.prependIfMissingIgnoreCase("abc","xyz","mno"));
-        assertEquals("prependIfMissingIgnoreCase(xyzabc,xyz,mno)", "xyzabc", StringUtils.prependIfMissingIgnoreCase("xyzabc","xyz","mno"));
-        assertEquals("prependIfMissingIgnoreCase(mnoabc,xyz,mno)", "mnoabc", StringUtils.prependIfMissingIgnoreCase("mnoabc","xyz","mno"));
-        assertEquals("prependIfMissingIgnoreCase(XYZabc,xyz,mno)", "XYZabc", StringUtils.prependIfMissingIgnoreCase("XYZabc","xyz","mno"));
-        assertEquals("prependIfMissingIgnoreCase(MNOabc,xyz,mno)", "MNOabc", StringUtils.prependIfMissingIgnoreCase("MNOabc","xyz","mno"));
-    }
-    
-    /**
-     * Tests {@link StringUtils#toEncodedString(byte[], Charset)}
-     * 
-     * @see StringUtils#toEncodedString(byte[], Charset)
-     */
-    @Test
-    public void testToEncodedString() {
-        final String expectedString = "The quick brown fox jumped over the lazy dog.";
-        String encoding = SystemUtils.FILE_ENCODING;
-        byte[] expectedBytes = expectedString.getBytes(Charset.defaultCharset());
-        // sanity check start
-        assertArrayEquals(expectedBytes, expectedString.getBytes());
-        // sanity check end
-        assertEquals(expectedString, StringUtils.toEncodedString(expectedBytes, Charset.defaultCharset()));
-        assertEquals(expectedString, StringUtils.toEncodedString(expectedBytes, Charset.forName(encoding)));
-        encoding = "UTF-16";
-        expectedBytes = expectedString.getBytes(Charset.forName(encoding));
-        assertEquals(expectedString, StringUtils.toEncodedString(expectedBytes, Charset.forName(encoding)));
-    }
-    
-    // -----------------------------------------------------------------------
-
-    @Test
-    public void testWrap_StringChar() {
-        assertNull(StringUtils.wrap(null, null));
-        assertNull(StringUtils.wrap(null, '\0'));
-        assertNull(StringUtils.wrap(null, '1'));
-
-        assertEquals(null, StringUtils.wrap(null, null));
-        assertEquals("", StringUtils.wrap("", '\0'));
-        assertEquals("xabx", StringUtils.wrap("ab", 'x'));
-        assertEquals("\"ab\"", StringUtils.wrap("ab", '\"'));
-        assertEquals("\"\"ab\"\"", StringUtils.wrap("\"ab\"", '\"'));
-        assertEquals("'ab'", StringUtils.wrap("ab", '\''));
-        assertEquals("''abcd''", StringUtils.wrap("'abcd'", '\''));
-        assertEquals("'\"abcd\"'", StringUtils.wrap("\"abcd\"", '\''));
-        assertEquals("\"'abcd'\"", StringUtils.wrap("'abcd'", '\"'));
-    }
-
-    @Test
-    public void testWrap_StringString() {
-        assertNull(StringUtils.wrap(null, null));
-        assertNull(StringUtils.wrap(null, ""));
-        assertNull(StringUtils.wrap(null, "1"));
-
-        assertEquals(null, StringUtils.wrap(null, null));
-        assertEquals("", StringUtils.wrap("", ""));
-        assertEquals("ab", StringUtils.wrap("ab", null));
-        assertEquals("xabx", StringUtils.wrap("ab", "x"));
-        assertEquals("\"ab\"", StringUtils.wrap("ab", "\""));
-        assertEquals("\"\"ab\"\"", StringUtils.wrap("\"ab\"", "\""));
-        assertEquals("'ab'", StringUtils.wrap("ab", "'"));
-        assertEquals("''abcd''", StringUtils.wrap("'abcd'", "'"));
-        assertEquals("'\"abcd\"'", StringUtils.wrap("\"abcd\"", "'"));
-        assertEquals("\"'abcd'\"", StringUtils.wrap("'abcd'", "\""));
-    }
-}
diff --git a/lang/src/test/java/org/apache/commons/lang3/StringUtilsTrimEmptyTest.java b/lang/src/test/java/org/apache/commons/lang3/StringUtilsTrimEmptyTest.java
deleted file mode 100644
index e020ee5..0000000
--- a/lang/src/test/java/org/apache/commons/lang3/StringUtilsTrimEmptyTest.java
+++ /dev/null
@@ -1,279 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- * 
- *      http://www.apache.org/licenses/LICENSE-2.0
- * 
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.commons.lang3;
-
-import static org.junit.Assert.assertArrayEquals;
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertFalse;
-import static org.junit.Assert.assertNull;
-import static org.junit.Assert.assertTrue;
-
-import org.junit.Test;
-
-/**
- * Unit tests {@link org.apache.commons.lang3.StringUtils} - Trim/Empty methods
- *
- * @version $Id$
- */
-public class StringUtilsTrimEmptyTest  {
-    private static final String FOO = "foo";
-
-    //-----------------------------------------------------------------------
-    @Test
-    public void testIsEmpty() {
-        assertTrue(StringUtils.isEmpty(null));
-        assertTrue(StringUtils.isEmpty(""));
-        assertFalse(StringUtils.isEmpty(" "));
-        assertFalse(StringUtils.isEmpty("foo"));
-        assertFalse(StringUtils.isEmpty("  foo  "));
-    }
-
-    @Test
-    public void testIsNotEmpty() {
-        assertFalse(StringUtils.isNotEmpty(null));
-        assertFalse(StringUtils.isNotEmpty(""));
-        assertTrue(StringUtils.isNotEmpty(" "));
-        assertTrue(StringUtils.isNotEmpty("foo"));
-        assertTrue(StringUtils.isNotEmpty("  foo  "));
-    }
-
-    @Test
-    public void testIsBlank() {
-        assertTrue(StringUtils.isBlank(null));
-        assertTrue(StringUtils.isBlank(""));
-        assertTrue(StringUtils.isBlank(StringUtilsTest.WHITESPACE));
-        assertFalse(StringUtils.isBlank("foo"));
-        assertFalse(StringUtils.isBlank("  foo  "));
-    }
-
-    @Test
-    public void testIsNotBlank() {
-        assertFalse(StringUtils.isNotBlank(null));
-        assertFalse(StringUtils.isNotBlank(""));
-        assertFalse(StringUtils.isNotBlank(StringUtilsTest.WHITESPACE));
-        assertTrue(StringUtils.isNotBlank("foo"));
-        assertTrue(StringUtils.isNotBlank("  foo  "));
-    }
-
-    //-----------------------------------------------------------------------
-    @Test
-    public void testTrim() {
-        assertEquals(FOO, StringUtils.trim(FOO + "  "));
-        assertEquals(FOO, StringUtils.trim(" " + FOO + "  "));
-        assertEquals(FOO, StringUtils.trim(" " + FOO));
-        assertEquals(FOO, StringUtils.trim(FOO + ""));
-        assertEquals("", StringUtils.trim(" \t\r\n\b "));
-        assertEquals("", StringUtils.trim(StringUtilsTest.TRIMMABLE));
-        assertEquals(StringUtilsTest.NON_TRIMMABLE, StringUtils.trim(StringUtilsTest.NON_TRIMMABLE));
-        assertEquals("", StringUtils.trim(""));
-        assertEquals(null, StringUtils.trim(null));
-    }
-
-    @Test
-    public void testTrimToNull() {
-        assertEquals(FOO, StringUtils.trimToNull(FOO + "  "));
-        assertEquals(FOO, StringUtils.trimToNull(" " + FOO + "  "));
-        assertEquals(FOO, StringUtils.trimToNull(" " + FOO));
-        assertEquals(FOO, StringUtils.trimToNull(FOO + ""));
-        assertEquals(null, StringUtils.trimToNull(" \t\r\n\b "));
-        assertEquals(null, StringUtils.trimToNull(StringUtilsTest.TRIMMABLE));
-        assertEquals(StringUtilsTest.NON_TRIMMABLE, StringUtils.trimToNull(StringUtilsTest.NON_TRIMMABLE));
-        assertEquals(null, StringUtils.trimToNull(""));
-        assertEquals(null, StringUtils.trimToNull(null));
-    }
-
-    @Test
-    public void testTrimToEmpty() {
-        assertEquals(FOO, StringUtils.trimToEmpty(FOO + "  "));
-        assertEquals(FOO, StringUtils.trimToEmpty(" " + FOO + "  "));
-        assertEquals(FOO, StringUtils.trimToEmpty(" " + FOO));
-        assertEquals(FOO, StringUtils.trimToEmpty(FOO + ""));
-        assertEquals("", StringUtils.trimToEmpty(" \t\r\n\b "));
-        assertEquals("", StringUtils.trimToEmpty(StringUtilsTest.TRIMMABLE));
-        assertEquals(StringUtilsTest.NON_TRIMMABLE, StringUtils.trimToEmpty(StringUtilsTest.NON_TRIMMABLE));
-        assertEquals("", StringUtils.trimToEmpty(""));
-        assertEquals("", StringUtils.trimToEmpty(null));
-    }
-
-    //-----------------------------------------------------------------------
-    @Test
-    public void testStrip_String() {
-        assertEquals(null, StringUtils.strip(null));
-        assertEquals("", StringUtils.strip(""));
-        assertEquals("", StringUtils.strip("        "));
-        assertEquals("abc", StringUtils.strip("  abc  "));
-        assertEquals(StringUtilsTest.NON_WHITESPACE, 
-            StringUtils.strip(StringUtilsTest.WHITESPACE + StringUtilsTest.NON_WHITESPACE + StringUtilsTest.WHITESPACE));
-    }
-    
-    @Test
-    public void testStripToNull_String() {
-        assertEquals(null, StringUtils.stripToNull(null));
-        assertEquals(null, StringUtils.stripToNull(""));
-        assertEquals(null, StringUtils.stripToNull("        "));
-        assertEquals(null, StringUtils.stripToNull(StringUtilsTest.WHITESPACE));
-        assertEquals("ab c", StringUtils.stripToNull("  ab c  "));
-        assertEquals(StringUtilsTest.NON_WHITESPACE, 
-            StringUtils.stripToNull(StringUtilsTest.WHITESPACE + StringUtilsTest.NON_WHITESPACE + StringUtilsTest.WHITESPACE));
-    }
-    
-    @Test
-    public void testStripToEmpty_String() {
-        assertEquals("", StringUtils.stripToEmpty(null));
-        assertEquals("", StringUtils.stripToEmpty(""));
-        assertEquals("", StringUtils.stripToEmpty("        "));
-        assertEquals("", StringUtils.stripToEmpty(StringUtilsTest.WHITESPACE));
-        assertEquals("ab c", StringUtils.stripToEmpty("  ab c  "));
-        assertEquals(StringUtilsTest.NON_WHITESPACE, 
-            StringUtils.stripToEmpty(StringUtilsTest.WHITESPACE + StringUtilsTest.NON_WHITESPACE + StringUtilsTest.WHITESPACE));
-    }
-    
-    @Test
-    public void testStrip_StringString() {
-        // null strip
-        assertEquals(null, StringUtils.strip(null, null));
-        assertEquals("", StringUtils.strip("", null));
-        assertEquals("", StringUtils.strip("        ", null));
-        assertEquals("abc", StringUtils.strip("  abc  ", null));
-        assertEquals(StringUtilsTest.NON_WHITESPACE, 
-            StringUtils.strip(StringUtilsTest.WHITESPACE + StringUtilsTest.NON_WHITESPACE + StringUtilsTest.WHITESPACE, null));
-
-        // "" strip
-        assertEquals(null, StringUtils.strip(null, ""));
-        assertEquals("", StringUtils.strip("", ""));
-        assertEquals("        ", StringUtils.strip("        ", ""));
-        assertEquals("  abc  ", StringUtils.strip("  abc  ", ""));
-        assertEquals(StringUtilsTest.WHITESPACE, StringUtils.strip(StringUtilsTest.WHITESPACE, ""));
-        
-        // " " strip
-        assertEquals(null, StringUtils.strip(null, " "));
-        assertEquals("", StringUtils.strip("", " "));
-        assertEquals("", StringUtils.strip("        ", " "));
-        assertEquals("abc", StringUtils.strip("  abc  ", " "));
-        
-        // "ab" strip
-        assertEquals(null, StringUtils.strip(null, "ab"));
-        assertEquals("", StringUtils.strip("", "ab"));
-        assertEquals("        ", StringUtils.strip("        ", "ab"));
-        assertEquals("  abc  ", StringUtils.strip("  abc  ", "ab"));
-        assertEquals("c", StringUtils.strip("abcabab", "ab"));
-        assertEquals(StringUtilsTest.WHITESPACE, StringUtils.strip(StringUtilsTest.WHITESPACE, ""));
-    }
-    
-    @Test
-    public void testStripStart_StringString() {
-        // null stripStart
-        assertEquals(null, StringUtils.stripStart(null, null));
-        assertEquals("", StringUtils.stripStart("", null));
-        assertEquals("", StringUtils.stripStart("        ", null));
-        assertEquals("abc  ", StringUtils.stripStart("  abc  ", null));
-        assertEquals(StringUtilsTest.NON_WHITESPACE + StringUtilsTest.WHITESPACE, 
-            StringUtils.stripStart(StringUtilsTest.WHITESPACE + StringUtilsTest.NON_WHITESPACE + StringUtilsTest.WHITESPACE, null));
-
-        // "" stripStart
-        assertEquals(null, StringUtils.stripStart(null, ""));
-        assertEquals("", StringUtils.stripStart("", ""));
-        assertEquals("        ", StringUtils.stripStart("        ", ""));
-        assertEquals("  abc  ", StringUtils.stripStart("  abc  ", ""));
-        assertEquals(StringUtilsTest.WHITESPACE, StringUtils.stripStart(StringUtilsTest.WHITESPACE, ""));
-        
-        // " " stripStart
-        assertEquals(null, StringUtils.stripStart(null, " "));
-        assertEquals("", StringUtils.stripStart("", " "));
-        assertEquals("", StringUtils.stripStart("        ", " "));
-        assertEquals("abc  ", StringUtils.stripStart("  abc  ", " "));
-        
-        // "ab" stripStart
-        assertEquals(null, StringUtils.stripStart(null, "ab"));
-        assertEquals("", StringUtils.stripStart("", "ab"));
-        assertEquals("        ", StringUtils.stripStart("        ", "ab"));
-        assertEquals("  abc  ", StringUtils.stripStart("  abc  ", "ab"));
-        assertEquals("cabab", StringUtils.stripStart("abcabab", "ab"));
-        assertEquals(StringUtilsTest.WHITESPACE, StringUtils.stripStart(StringUtilsTest.WHITESPACE, ""));
-    }
-    
-    @Test
-    public void testStripEnd_StringString() {
-        // null stripEnd
-        assertEquals(null, StringUtils.stripEnd(null, null));
-        assertEquals("", StringUtils.stripEnd("", null));
-        assertEquals("", StringUtils.stripEnd("        ", null));
-        assertEquals("  abc", StringUtils.stripEnd("  abc  ", null));
-        assertEquals(StringUtilsTest.WHITESPACE + StringUtilsTest.NON_WHITESPACE, 
-            StringUtils.stripEnd(StringUtilsTest.WHITESPACE + StringUtilsTest.NON_WHITESPACE + StringUtilsTest.WHITESPACE, null));
-
-        // "" stripEnd
-        assertEquals(null, StringUtils.stripEnd(null, ""));
-        assertEquals("", StringUtils.stripEnd("", ""));
-        assertEquals("        ", StringUtils.stripEnd("        ", ""));
-        assertEquals("  abc  ", StringUtils.stripEnd("  abc  ", ""));
-        assertEquals(StringUtilsTest.WHITESPACE, StringUtils.stripEnd(StringUtilsTest.WHITESPACE, ""));
-        
-        // " " stripEnd
-        assertEquals(null, StringUtils.stripEnd(null, " "));
-        assertEquals("", StringUtils.stripEnd("", " "));
-        assertEquals("", StringUtils.stripEnd("        ", " "));
-        assertEquals("  abc", StringUtils.stripEnd("  abc  ", " "));
-        
-        // "ab" stripEnd
-        assertEquals(null, StringUtils.stripEnd(null, "ab"));
-        assertEquals("", StringUtils.stripEnd("", "ab"));
-        assertEquals("        ", StringUtils.stripEnd("        ", "ab"));
-        assertEquals("  abc  ", StringUtils.stripEnd("  abc  ", "ab"));
-        assertEquals("abc", StringUtils.stripEnd("abcabab", "ab"));
-        assertEquals(StringUtilsTest.WHITESPACE, StringUtils.stripEnd(StringUtilsTest.WHITESPACE, ""));
-    }
-
-    @Test
-    public void testStripAll() {
-        // test stripAll method, merely an array version of the above strip
-        final String[] empty = new String[0];
-        final String[] fooSpace = new String[] { "  "+FOO+"  ", "  "+FOO, FOO+"  " };
-        final String[] fooDots = new String[] { ".."+FOO+"..", ".."+FOO, FOO+".." };
-        final String[] foo = new String[] { FOO, FOO, FOO };
-
-        assertNull(StringUtils.stripAll((String[]) null));
-        // Additional varargs tests
-        assertArrayEquals(empty, StringUtils.stripAll()); // empty array
-        assertArrayEquals(new String[]{null}, StringUtils.stripAll((String) null)); // == new String[]{null}
-
-        assertArrayEquals(empty, StringUtils.stripAll(empty));
-        assertArrayEquals(foo, StringUtils.stripAll(fooSpace));
-        
-        assertNull(StringUtils.stripAll(null, null));
-        assertArrayEquals(foo, StringUtils.stripAll(fooSpace, null));
-        assertArrayEquals(foo, StringUtils.stripAll(fooDots, "."));
-    }
-
-    @Test
-    public void testStripAccents() {
-        final String cue = "\u00C7\u00FA\u00EA";
-        assertEquals( "Failed to strip accents from " + cue, "Cue", StringUtils.stripAccents(cue));
-
-        final String lots = "\u00C0\u00C1\u00C2\u00C3\u00C4\u00C5\u00C7\u00C8\u00C9" + 
-                      "\u00CA\u00CB\u00CC\u00CD\u00CE\u00CF\u00D1\u00D2\u00D3" + 
-                      "\u00D4\u00D5\u00D6\u00D9\u00DA\u00DB\u00DC\u00DD";
-        assertEquals( "Failed to strip accents from " + lots, 
-                      "AAAAAACEEEEIIIINOOOOOUUUUY", 
-                      StringUtils.stripAccents(lots));
-
-        assertNull( "Failed null safety", StringUtils.stripAccents(null) );
-        assertEquals( "Failed empty String", "", StringUtils.stripAccents("") );
-        assertEquals( "Failed to handle non-accented text", "control", StringUtils.stripAccents("control") );
-        assertEquals( "Failed to handle easy example", "eclair", StringUtils.stripAccents("\u00E9clair") );
-    }
-}
diff --git a/lang/src/test/java/org/apache/commons/lang3/SystemUtilsTest.java b/lang/src/test/java/org/apache/commons/lang3/SystemUtilsTest.java
deleted file mode 100644
index 3082370..0000000
--- a/lang/src/test/java/org/apache/commons/lang3/SystemUtilsTest.java
+++ /dev/null
@@ -1,463 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package org.apache.commons.lang3;
-
-import static org.apache.commons.lang3.JavaVersion.JAVA_1_4;
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertFalse;
-import static org.junit.Assert.assertNotNull;
-import static org.junit.Assert.assertNull;
-import static org.junit.Assert.assertTrue;
-
-import java.io.File;
-import java.lang.reflect.Constructor;
-import java.lang.reflect.Modifier;
-import java.util.Locale;
-
-import org.junit.Assert;
-import org.junit.Test;
-
-/**
- * Unit tests {@link org.apache.commons.lang3.SystemUtils}.
- * 
- * Only limited testing can be performed.
- * 
- * @version $Id$
- */
-public class SystemUtilsTest {
-
-    @Test
-    public void testConstructor() {
-        assertNotNull(new SystemUtils());
-        final Constructor<?>[] cons = SystemUtils.class.getDeclaredConstructors();
-        assertEquals(1, cons.length);
-        assertTrue(Modifier.isPublic(cons[0].getModifiers()));
-        assertTrue(Modifier.isPublic(SystemUtils.class.getModifiers()));
-        assertFalse(Modifier.isFinal(SystemUtils.class.getModifiers()));
-    }
-
-    /**
-     * Assums no security manager exists.
-     */
-    @Test
-    public void testGetJavaHome() {
-        final File dir = SystemUtils.getJavaHome();
-        Assert.assertNotNull(dir);
-        Assert.assertTrue(dir.exists());
-    }
-
-    /**
-     * Assums no security manager exists.
-     */
-    @Test
-    public void testGetJavaIoTmpDir() {
-        final File dir = SystemUtils.getJavaIoTmpDir();
-        Assert.assertNotNull(dir);
-        Assert.assertTrue(dir.exists());
-    }
-
-    /**
-     * Assums no security manager exists.
-     */
-    @Test
-    public void testGetUserDir() {
-        final File dir = SystemUtils.getUserDir();
-        Assert.assertNotNull(dir);
-        Assert.assertTrue(dir.exists());
-    }
-
-    /**
-     * Assums no security manager exists.
-     */
-    @Test
-    public void testGetUserHome() {
-        final File dir = SystemUtils.getUserHome();
-        Assert.assertNotNull(dir);
-        Assert.assertTrue(dir.exists());
-    }
-
-    @Test
-    public void testIS_JAVA() {
-        final String javaVersion = System.getProperty("java.version");
-        if (javaVersion == null) {
-            assertFalse(SystemUtils.IS_JAVA_1_1);
-            assertFalse(SystemUtils.IS_JAVA_1_2);
-            assertFalse(SystemUtils.IS_JAVA_1_3);
-            assertFalse(SystemUtils.IS_JAVA_1_4);
-            assertFalse(SystemUtils.IS_JAVA_1_5);
-            assertFalse(SystemUtils.IS_JAVA_1_6);
-            assertFalse(SystemUtils.IS_JAVA_1_7);
-            assertFalse(SystemUtils.IS_JAVA_1_8);
-            assertFalse(SystemUtils.IS_JAVA_1_9);
-        } else if (javaVersion.startsWith("1.1")) {
-            assertTrue(SystemUtils.IS_JAVA_1_1);
-            assertFalse(SystemUtils.IS_JAVA_1_2);
-            assertFalse(SystemUtils.IS_JAVA_1_3);
-            assertFalse(SystemUtils.IS_JAVA_1_4);
-            assertFalse(SystemUtils.IS_JAVA_1_5);
-            assertFalse(SystemUtils.IS_JAVA_1_6);
-            assertFalse(SystemUtils.IS_JAVA_1_7);
-            assertFalse(SystemUtils.IS_JAVA_1_8);
-            assertFalse(SystemUtils.IS_JAVA_1_9);
-        } else if (javaVersion.startsWith("1.2")) {
-            assertFalse(SystemUtils.IS_JAVA_1_1);
-            assertTrue(SystemUtils.IS_JAVA_1_2);
-            assertFalse(SystemUtils.IS_JAVA_1_3);
-            assertFalse(SystemUtils.IS_JAVA_1_4);
-            assertFalse(SystemUtils.IS_JAVA_1_5);
-            assertFalse(SystemUtils.IS_JAVA_1_6);
-            assertFalse(SystemUtils.IS_JAVA_1_7);
-            assertFalse(SystemUtils.IS_JAVA_1_8);
-            assertFalse(SystemUtils.IS_JAVA_1_9);
-        } else if (javaVersion.startsWith("1.3")) {
-            assertFalse(SystemUtils.IS_JAVA_1_1);
-            assertFalse(SystemUtils.IS_JAVA_1_2);
-            assertTrue(SystemUtils.IS_JAVA_1_3);
-            assertFalse(SystemUtils.IS_JAVA_1_4);
-            assertFalse(SystemUtils.IS_JAVA_1_5);
-            assertFalse(SystemUtils.IS_JAVA_1_6);
-            assertFalse(SystemUtils.IS_JAVA_1_7);
-            assertFalse(SystemUtils.IS_JAVA_1_8);
-            assertFalse(SystemUtils.IS_JAVA_1_9);
-        } else if (javaVersion.startsWith("1.4")) {
-            assertFalse(SystemUtils.IS_JAVA_1_1);
-            assertFalse(SystemUtils.IS_JAVA_1_2);
-            assertFalse(SystemUtils.IS_JAVA_1_3);
-            assertTrue(SystemUtils.IS_JAVA_1_4);
-            assertFalse(SystemUtils.IS_JAVA_1_5);
-            assertFalse(SystemUtils.IS_JAVA_1_6);
-            assertFalse(SystemUtils.IS_JAVA_1_7);
-            assertFalse(SystemUtils.IS_JAVA_1_8);
-            assertFalse(SystemUtils.IS_JAVA_1_9);
-        } else if (javaVersion.startsWith("1.5")) {
-            assertFalse(SystemUtils.IS_JAVA_1_1);
-            assertFalse(SystemUtils.IS_JAVA_1_2);
-            assertFalse(SystemUtils.IS_JAVA_1_3);
-            assertFalse(SystemUtils.IS_JAVA_1_4);
-            assertTrue(SystemUtils.IS_JAVA_1_5);
-            assertFalse(SystemUtils.IS_JAVA_1_6);
-            assertFalse(SystemUtils.IS_JAVA_1_7);
-            assertFalse(SystemUtils.IS_JAVA_1_8);
-            assertFalse(SystemUtils.IS_JAVA_1_9);
-        } else if (javaVersion.startsWith("1.6")) {
-            assertFalse(SystemUtils.IS_JAVA_1_1);
-            assertFalse(SystemUtils.IS_JAVA_1_2);
-            assertFalse(SystemUtils.IS_JAVA_1_3);
-            assertFalse(SystemUtils.IS_JAVA_1_4);
-            assertFalse(SystemUtils.IS_JAVA_1_5);
-            assertTrue(SystemUtils.IS_JAVA_1_6);
-            assertFalse(SystemUtils.IS_JAVA_1_7);
-            assertFalse(SystemUtils.IS_JAVA_1_8);
-            assertFalse(SystemUtils.IS_JAVA_1_9);
-        } else if (javaVersion.startsWith("1.7")) {
-            assertFalse(SystemUtils.IS_JAVA_1_1);
-            assertFalse(SystemUtils.IS_JAVA_1_2);
-            assertFalse(SystemUtils.IS_JAVA_1_3);
-            assertFalse(SystemUtils.IS_JAVA_1_4);
-            assertFalse(SystemUtils.IS_JAVA_1_5);
-            assertFalse(SystemUtils.IS_JAVA_1_6);
-            assertTrue(SystemUtils.IS_JAVA_1_7);
-            assertFalse(SystemUtils.IS_JAVA_1_8);
-            assertFalse(SystemUtils.IS_JAVA_1_9);
-        } else if (javaVersion.startsWith("1.8")) {
-            assertFalse(SystemUtils.IS_JAVA_1_1);
-            assertFalse(SystemUtils.IS_JAVA_1_2);
-            assertFalse(SystemUtils.IS_JAVA_1_3);
-            assertFalse(SystemUtils.IS_JAVA_1_4);
-            assertFalse(SystemUtils.IS_JAVA_1_5);
-            assertFalse(SystemUtils.IS_JAVA_1_6);
-            assertFalse(SystemUtils.IS_JAVA_1_7);
-            assertTrue(SystemUtils.IS_JAVA_1_8);
-            assertFalse(SystemUtils.IS_JAVA_1_9);
-        } else if (javaVersion.startsWith("1.9")) {
-            assertFalse(SystemUtils.IS_JAVA_1_1);
-            assertFalse(SystemUtils.IS_JAVA_1_2);
-            assertFalse(SystemUtils.IS_JAVA_1_3);
-            assertFalse(SystemUtils.IS_JAVA_1_4);
-            assertFalse(SystemUtils.IS_JAVA_1_5);
-            assertFalse(SystemUtils.IS_JAVA_1_6);
-            assertFalse(SystemUtils.IS_JAVA_1_7);
-            assertFalse(SystemUtils.IS_JAVA_1_8);
-            assertTrue(SystemUtils.IS_JAVA_1_9);
-        } else {
-            System.out.println("Can't test IS_JAVA value: "+javaVersion);
-        }
-    }
-
-    @Test
-    public void testIS_OS() {
-        final String osName = System.getProperty("os.name");
-        if (osName == null) {
-            assertFalse(SystemUtils.IS_OS_WINDOWS);
-            assertFalse(SystemUtils.IS_OS_UNIX);
-            assertFalse(SystemUtils.IS_OS_SOLARIS);
-            assertFalse(SystemUtils.IS_OS_LINUX);
-            assertFalse(SystemUtils.IS_OS_MAC_OSX);
-        } else if (osName.startsWith("Windows")) {
-            assertFalse(SystemUtils.IS_OS_UNIX);
-            assertTrue(SystemUtils.IS_OS_WINDOWS);
-        } else if (osName.startsWith("Solaris")) {
-            assertTrue(SystemUtils.IS_OS_SOLARIS);
-            assertTrue(SystemUtils.IS_OS_UNIX);
-            assertFalse(SystemUtils.IS_OS_WINDOWS);
-        } else if (osName.toLowerCase(Locale.ENGLISH).startsWith("linux")) {
-            assertTrue(SystemUtils.IS_OS_LINUX);
-            assertTrue(SystemUtils.IS_OS_UNIX);
-            assertFalse(SystemUtils.IS_OS_WINDOWS);
-        } else if (osName.startsWith("Mac OS X")) {
-            assertTrue(SystemUtils.IS_OS_MAC_OSX);
-            assertTrue(SystemUtils.IS_OS_UNIX);
-            assertFalse(SystemUtils.IS_OS_WINDOWS);
-        } else if (osName.startsWith("OS/2")) {
-            assertTrue(SystemUtils.IS_OS_OS2);
-            assertFalse(SystemUtils.IS_OS_UNIX);
-            assertFalse(SystemUtils.IS_OS_WINDOWS);
-        } else if (osName.startsWith("SunOS")) {
-            assertTrue(SystemUtils.IS_OS_SUN_OS);
-            assertTrue(SystemUtils.IS_OS_UNIX);
-            assertFalse(SystemUtils.IS_OS_WINDOWS);
-        } else if (osName.startsWith("FreeBSD")) {
-            assertTrue(SystemUtils.IS_OS_FREE_BSD);
-            assertTrue(SystemUtils.IS_OS_UNIX);
-            assertFalse(SystemUtils.IS_OS_WINDOWS);
-        } else {
-            System.out.println("Can't test IS_OS value: " + osName);
-        }
-    }
-
-    @Test
-    public void testJavaVersionMatches() {
-        String javaVersion = null;
-        assertFalse(SystemUtils.isJavaVersionMatch(javaVersion, "1.0"));
-        assertFalse(SystemUtils.isJavaVersionMatch(javaVersion, "1.1"));
-        assertFalse(SystemUtils.isJavaVersionMatch(javaVersion, "1.2"));
-        assertFalse(SystemUtils.isJavaVersionMatch(javaVersion, "1.3"));
-        assertFalse(SystemUtils.isJavaVersionMatch(javaVersion, "1.4"));
-        assertFalse(SystemUtils.isJavaVersionMatch(javaVersion, "1.5"));
-        assertFalse(SystemUtils.isJavaVersionMatch(javaVersion, "1.6"));
-        assertFalse(SystemUtils.isJavaVersionMatch(javaVersion, "1.7"));
-        javaVersion = "";
-        assertFalse(SystemUtils.isJavaVersionMatch(javaVersion, "1.0"));
-        assertFalse(SystemUtils.isJavaVersionMatch(javaVersion, "1.1"));
-        assertFalse(SystemUtils.isJavaVersionMatch(javaVersion, "1.2"));
-        assertFalse(SystemUtils.isJavaVersionMatch(javaVersion, "1.3"));
-        assertFalse(SystemUtils.isJavaVersionMatch(javaVersion, "1.4"));
-        assertFalse(SystemUtils.isJavaVersionMatch(javaVersion, "1.5"));
-        assertFalse(SystemUtils.isJavaVersionMatch(javaVersion, "1.6"));
-        assertFalse(SystemUtils.isJavaVersionMatch(javaVersion, "1.7"));
-        javaVersion = "1.0";
-        assertTrue(SystemUtils.isJavaVersionMatch(javaVersion, "1.0"));
-        assertFalse(SystemUtils.isJavaVersionMatch(javaVersion, "1.1"));
-        assertFalse(SystemUtils.isJavaVersionMatch(javaVersion, "1.2"));
-        assertFalse(SystemUtils.isJavaVersionMatch(javaVersion, "1.3"));
-        assertFalse(SystemUtils.isJavaVersionMatch(javaVersion, "1.4"));
-        assertFalse(SystemUtils.isJavaVersionMatch(javaVersion, "1.5"));
-        assertFalse(SystemUtils.isJavaVersionMatch(javaVersion, "1.6"));
-        assertFalse(SystemUtils.isJavaVersionMatch(javaVersion, "1.7"));
-        javaVersion = "1.1";
-        assertFalse(SystemUtils.isJavaVersionMatch(javaVersion, "1.0"));
-        assertTrue(SystemUtils.isJavaVersionMatch(javaVersion, "1.1"));
-        assertFalse(SystemUtils.isJavaVersionMatch(javaVersion, "1.2"));
-        assertFalse(SystemUtils.isJavaVersionMatch(javaVersion, "1.3"));
-        assertFalse(SystemUtils.isJavaVersionMatch(javaVersion, "1.4"));
-        assertFalse(SystemUtils.isJavaVersionMatch(javaVersion, "1.5"));
-        assertFalse(SystemUtils.isJavaVersionMatch(javaVersion, "1.6"));
-        assertFalse(SystemUtils.isJavaVersionMatch(javaVersion, "1.7"));
-        javaVersion = "1.2";
-        assertFalse(SystemUtils.isJavaVersionMatch(javaVersion, "1.0"));
-        assertFalse(SystemUtils.isJavaVersionMatch(javaVersion, "1.1"));
-        assertTrue(SystemUtils.isJavaVersionMatch(javaVersion, "1.2"));
-        assertFalse(SystemUtils.isJavaVersionMatch(javaVersion, "1.3"));
-        assertFalse(SystemUtils.isJavaVersionMatch(javaVersion, "1.4"));
-        assertFalse(SystemUtils.isJavaVersionMatch(javaVersion, "1.5"));
-        assertFalse(SystemUtils.isJavaVersionMatch(javaVersion, "1.6"));
-        assertFalse(SystemUtils.isJavaVersionMatch(javaVersion, "1.7"));
-        javaVersion = "1.3.0";
-        assertFalse(SystemUtils.isJavaVersionMatch(javaVersion, "1.0"));
-        assertFalse(SystemUtils.isJavaVersionMatch(javaVersion, "1.1"));
-        assertFalse(SystemUtils.isJavaVersionMatch(javaVersion, "1.2"));
-        assertTrue(SystemUtils.isJavaVersionMatch(javaVersion, "1.3"));
-        assertFalse(SystemUtils.isJavaVersionMatch(javaVersion, "1.4"));
-        assertFalse(SystemUtils.isJavaVersionMatch(javaVersion, "1.5"));
-        assertFalse(SystemUtils.isJavaVersionMatch(javaVersion, "1.6"));
-        assertFalse(SystemUtils.isJavaVersionMatch(javaVersion, "1.7"));
-        javaVersion = "1.3.1";
-        assertFalse(SystemUtils.isJavaVersionMatch(javaVersion, "1.0"));
-        assertFalse(SystemUtils.isJavaVersionMatch(javaVersion, "1.1"));
-        assertFalse(SystemUtils.isJavaVersionMatch(javaVersion, "1.2"));
-        assertTrue(SystemUtils.isJavaVersionMatch(javaVersion, "1.3"));
-        assertFalse(SystemUtils.isJavaVersionMatch(javaVersion, "1.4"));
-        assertFalse(SystemUtils.isJavaVersionMatch(javaVersion, "1.5"));
-        assertFalse(SystemUtils.isJavaVersionMatch(javaVersion, "1.6"));
-        assertFalse(SystemUtils.isJavaVersionMatch(javaVersion, "1.7"));
-        javaVersion = "1.4.0";
-        assertFalse(SystemUtils.isJavaVersionMatch(javaVersion, "1.0"));
-        assertFalse(SystemUtils.isJavaVersionMatch(javaVersion, "1.1"));
-        assertFalse(SystemUtils.isJavaVersionMatch(javaVersion, "1.2"));
-        assertFalse(SystemUtils.isJavaVersionMatch(javaVersion, "1.3"));
-        assertTrue(SystemUtils.isJavaVersionMatch(javaVersion, "1.4"));
-        assertFalse(SystemUtils.isJavaVersionMatch(javaVersion, "1.5"));
-        assertFalse(SystemUtils.isJavaVersionMatch(javaVersion, "1.6"));
-        assertFalse(SystemUtils.isJavaVersionMatch(javaVersion, "1.7"));
-        javaVersion = "1.4.1";
-        assertFalse(SystemUtils.isJavaVersionMatch(javaVersion, "1.0"));
-        assertFalse(SystemUtils.isJavaVersionMatch(javaVersion, "1.1"));
-        assertFalse(SystemUtils.isJavaVersionMatch(javaVersion, "1.2"));
-        assertFalse(SystemUtils.isJavaVersionMatch(javaVersion, "1.3"));
-        assertTrue(SystemUtils.isJavaVersionMatch(javaVersion, "1.4"));
-        assertFalse(SystemUtils.isJavaVersionMatch(javaVersion, "1.5"));
-        assertFalse(SystemUtils.isJavaVersionMatch(javaVersion, "1.6"));
-        assertFalse(SystemUtils.isJavaVersionMatch(javaVersion, "1.7"));
-        javaVersion = "1.4.2";
-        assertFalse(SystemUtils.isJavaVersionMatch(javaVersion, "1.0"));
-        assertFalse(SystemUtils.isJavaVersionMatch(javaVersion, "1.1"));
-        assertFalse(SystemUtils.isJavaVersionMatch(javaVersion, "1.2"));
-        assertFalse(SystemUtils.isJavaVersionMatch(javaVersion, "1.3"));
-        assertTrue(SystemUtils.isJavaVersionMatch(javaVersion, "1.4"));
-        assertFalse(SystemUtils.isJavaVersionMatch(javaVersion, "1.5"));
-        assertFalse(SystemUtils.isJavaVersionMatch(javaVersion, "1.6"));
-        assertFalse(SystemUtils.isJavaVersionMatch(javaVersion, "1.7"));
-        javaVersion = "1.5.0";
-        assertFalse(SystemUtils.isJavaVersionMatch(javaVersion, "1.0"));
-        assertFalse(SystemUtils.isJavaVersionMatch(javaVersion, "1.1"));
-        assertFalse(SystemUtils.isJavaVersionMatch(javaVersion, "1.2"));
-        assertFalse(SystemUtils.isJavaVersionMatch(javaVersion, "1.3"));
-        assertFalse(SystemUtils.isJavaVersionMatch(javaVersion, "1.4"));
-        assertTrue(SystemUtils.isJavaVersionMatch(javaVersion, "1.5"));
-        assertFalse(SystemUtils.isJavaVersionMatch(javaVersion, "1.6"));
-        assertFalse(SystemUtils.isJavaVersionMatch(javaVersion, "1.7"));
-        javaVersion = "1.6.0";
-        assertFalse(SystemUtils.isJavaVersionMatch(javaVersion, "1.0"));
-        assertFalse(SystemUtils.isJavaVersionMatch(javaVersion, "1.1"));
-        assertFalse(SystemUtils.isJavaVersionMatch(javaVersion, "1.2"));
-        assertFalse(SystemUtils.isJavaVersionMatch(javaVersion, "1.3"));
-        assertFalse(SystemUtils.isJavaVersionMatch(javaVersion, "1.4"));
-        assertFalse(SystemUtils.isJavaVersionMatch(javaVersion, "1.5"));
-        assertTrue(SystemUtils.isJavaVersionMatch(javaVersion, "1.6"));
-        assertFalse(SystemUtils.isJavaVersionMatch(javaVersion, "1.7"));
-        javaVersion = "1.7.0";
-        assertFalse(SystemUtils.isJavaVersionMatch(javaVersion, "1.0"));
-        assertFalse(SystemUtils.isJavaVersionMatch(javaVersion, "1.1"));
-        assertFalse(SystemUtils.isJavaVersionMatch(javaVersion, "1.2"));
-        assertFalse(SystemUtils.isJavaVersionMatch(javaVersion, "1.3"));
-        assertFalse(SystemUtils.isJavaVersionMatch(javaVersion, "1.4"));
-        assertFalse(SystemUtils.isJavaVersionMatch(javaVersion, "1.5"));
-        assertFalse(SystemUtils.isJavaVersionMatch(javaVersion, "1.6"));
-        assertTrue(SystemUtils.isJavaVersionMatch(javaVersion, "1.7"));
-    }
-
-    @Test
-    public void testOSMatchesName() {
-        String osName = null;
-        assertFalse(SystemUtils.isOSNameMatch(osName, "Windows"));
-        osName = "";
-        assertFalse(SystemUtils.isOSNameMatch(osName, "Windows"));
-        osName = "Windows 95";
-        assertTrue(SystemUtils.isOSNameMatch(osName, "Windows"));
-        osName = "Windows NT";
-        assertTrue(SystemUtils.isOSNameMatch(osName, "Windows"));
-        osName = "OS/2";
-        assertFalse(SystemUtils.isOSNameMatch(osName, "Windows"));
-    }
-
-    @Test
-    public void testOSMatchesNameAndVersion() {
-        String osName = null;
-        String osVersion = null;
-        assertFalse(SystemUtils.isOSMatch(osName, osVersion, "Windows 9", "4.1"));
-        osName = "";
-        osVersion = "";
-        assertFalse(SystemUtils.isOSMatch(osName, osVersion, "Windows 9", "4.1"));
-        osName = "Windows 95";
-        osVersion = "4.0";
-        assertFalse(SystemUtils.isOSMatch(osName, osVersion, "Windows 9", "4.1"));
-        osName = "Windows 95";
-        osVersion = "4.1";
-        assertTrue(SystemUtils.isOSMatch(osName, osVersion, "Windows 9", "4.1"));
-        osName = "Windows 98";
-        osVersion = "4.1";
-        assertTrue(SystemUtils.isOSMatch(osName, osVersion, "Windows 9", "4.1"));
-        osName = "Windows NT";
-        osVersion = "4.0";
-        assertFalse(SystemUtils.isOSMatch(osName, osVersion, "Windows 9", "4.1"));
-        osName = "OS/2";
-        osVersion = "4.0";
-        assertFalse(SystemUtils.isOSMatch(osName, osVersion, "Windows 9", "4.1"));
-    }
-
-    @Test
-    public void testOsVersionMatches() throws Exception {
-        String osVersion = null;
-        assertFalse(SystemUtils.isOSVersionMatch(osVersion, "10.1"));
-
-        osVersion = "";
-        assertFalse(SystemUtils.isOSVersionMatch(osVersion, "10.1"));
-
-        osVersion = "10";
-        assertTrue(SystemUtils.isOSVersionMatch(osVersion, "10.1"));
-        assertTrue(SystemUtils.isOSVersionMatch(osVersion, "10.1.1"));
-        assertTrue(SystemUtils.isOSVersionMatch(osVersion, "10.10"));
-        assertTrue(SystemUtils.isOSVersionMatch(osVersion, "10.10.1"));
-
-        osVersion = "10.1";
-        assertTrue(SystemUtils.isOSVersionMatch(osVersion, "10.1"));
-        assertTrue(SystemUtils.isOSVersionMatch(osVersion, "10.1.1"));
-        assertFalse(SystemUtils.isOSVersionMatch(osVersion, "10.10"));
-        assertFalse(SystemUtils.isOSVersionMatch(osVersion, "10.10.1"));
-
-        osVersion = "10.1.1";
-        assertTrue(SystemUtils.isOSVersionMatch(osVersion, "10.1"));
-        assertTrue(SystemUtils.isOSVersionMatch(osVersion, "10.1.1"));
-        assertFalse(SystemUtils.isOSVersionMatch(osVersion, "10.10"));
-        assertFalse(SystemUtils.isOSVersionMatch(osVersion, "10.10.1"));
-
-        osVersion = "10.10";
-        assertFalse(SystemUtils.isOSVersionMatch(osVersion, "10.1"));
-        assertFalse(SystemUtils.isOSVersionMatch(osVersion, "10.1.1"));
-        assertTrue(SystemUtils.isOSVersionMatch(osVersion, "10.10"));
-        assertTrue(SystemUtils.isOSVersionMatch(osVersion, "10.10.1"));
-
-        osVersion = "10.10.1";
-        assertFalse(SystemUtils.isOSVersionMatch(osVersion, "10.1"));
-        assertFalse(SystemUtils.isOSVersionMatch(osVersion, "10.1.1"));
-        assertTrue(SystemUtils.isOSVersionMatch(osVersion, "10.10"));
-        assertTrue(SystemUtils.isOSVersionMatch(osVersion, "10.10.1"));
-    }
-
-    @Test
-    public void testJavaAwtHeadless() {
-        final boolean atLeastJava14 = SystemUtils.isJavaVersionAtLeast(JAVA_1_4);
-        final String expectedStringValue = System.getProperty("java.awt.headless");
-        final String expectedStringValueWithDefault = System.getProperty("java.awt.headless", "false");
-        assertNotNull(expectedStringValueWithDefault);
-        if (atLeastJava14) {
-            final boolean expectedValue = Boolean.valueOf(expectedStringValue).booleanValue();
-            if (expectedStringValue != null) {
-                assertEquals(expectedStringValue, SystemUtils.JAVA_AWT_HEADLESS);
-            }
-            assertEquals(expectedValue, SystemUtils.isJavaAwtHeadless());
-        } else {
-            assertNull(expectedStringValue);
-            assertNull(SystemUtils.JAVA_AWT_HEADLESS);
-            assertEquals(expectedStringValueWithDefault, "" + SystemUtils.isJavaAwtHeadless());
-        }
-        assertEquals(expectedStringValueWithDefault, "" + SystemUtils.isJavaAwtHeadless());
-    }
-}
diff --git a/lang/src/test/java/org/apache/commons/lang3/ValidateTest.java b/lang/src/test/java/org/apache/commons/lang3/ValidateTest.java
deleted file mode 100644
index be4f4d7..0000000
--- a/lang/src/test/java/org/apache/commons/lang3/ValidateTest.java
+++ /dev/null
@@ -1,1100 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-package org.apache.commons.lang3;
-
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertFalse;
-import static org.junit.Assert.assertNotNull;
-import static org.junit.Assert.assertSame;
-import static org.junit.Assert.assertTrue;
-import static org.junit.Assert.fail;
-
-import java.lang.reflect.Constructor;
-import java.lang.reflect.Modifier;
-import java.util.AbstractList;
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.Collection;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-
-import org.junit.Test;
-
-/**
- * Unit tests {@link org.apache.commons.lang3.Validate}.
- *
- * @version $Id$
- */
-public class ValidateTest  {
-    
-    //-----------------------------------------------------------------------
-    @Test
-    public void testIsTrue1() {
-        Validate.isTrue(true);
-        try {
-            Validate.isTrue(false);
-            fail("Expecting IllegalArgumentException");
-        } catch (final IllegalArgumentException ex) {
-            assertEquals("The validated expression is false", ex.getMessage());
-        }
-    }
-
-    //-----------------------------------------------------------------------
-    @Test
-    public void testIsTrue2() {
-        Validate.isTrue(true, "MSG");
-        try {
-            Validate.isTrue(false, "MSG");
-            fail("Expecting IllegalArgumentException");
-        } catch (final IllegalArgumentException ex) {
-            assertEquals("MSG", ex.getMessage());
-        }
-    }
-
-    //-----------------------------------------------------------------------
-    @Test
-    public void testIsTrue3() {
-        Validate.isTrue(true, "MSG", 6);
-        try {
-            Validate.isTrue(false, "MSG", 6);
-            fail("Expecting IllegalArgumentException");
-        } catch (final IllegalArgumentException ex) {
-            assertEquals("MSG", ex.getMessage());
-        }
-    }
-
-    //-----------------------------------------------------------------------
-    @Test
-    public void testIsTrue4() {
-        Validate.isTrue(true, "MSG", 7);
-        try {
-            Validate.isTrue(false, "MSG", 7);
-            fail("Expecting IllegalArgumentException");
-        } catch (final IllegalArgumentException ex) {
-            assertEquals("MSG", ex.getMessage());
-        }
-    }
-
-    //-----------------------------------------------------------------------
-    @Test
-    public void testIsTrue5() {
-        Validate.isTrue(true, "MSG", 7.4d);
-        try {
-            Validate.isTrue(false, "MSG", 7.4d);
-            fail("Expecting IllegalArgumentException");
-        } catch (final IllegalArgumentException ex) {
-            assertEquals("MSG", ex.getMessage());
-        }
-    }
-
-    //-----------------------------------------------------------------------
-    //-----------------------------------------------------------------------
-    @SuppressWarnings("unused")
-    @Test
-    public void testNotNull1() {
-        Validate.notNull(new Object());
-        try {
-            Validate.notNull(null);
-            fail("Expecting NullPointerException");
-        } catch (final NullPointerException ex) {
-            assertEquals("The validated object is null", ex.getMessage());
-        }
-        
-        final String str = "Hi";
-        final String testStr = Validate.notNull(str);
-        assertSame(str, testStr);
-    }
-
-    //-----------------------------------------------------------------------
-    @SuppressWarnings("unused")
-    @Test
-    public void testNotNull2() {
-        Validate.notNull(new Object(), "MSG");
-        try {
-            Validate.notNull(null, "MSG");
-            fail("Expecting NullPointerException");
-        } catch (final NullPointerException ex) {
-            assertEquals("MSG", ex.getMessage());
-        }
-        
-        final String str = "Hi";
-        final String testStr = Validate.notNull(str, "Message");
-        assertSame(str, testStr);
-    }
-
-    //-----------------------------------------------------------------------
-    //-----------------------------------------------------------------------
-    @Test
-    public void testNotEmptyArray1() {
-        Validate.notEmpty(new Object[] {null});
-        try {
-            Validate.notEmpty((Object[]) null);
-            fail("Expecting NullPointerException");
-        } catch (final NullPointerException ex) {
-            assertEquals("The validated array is empty", ex.getMessage());
-        }
-        try {
-            Validate.notEmpty(new Object[0]);
-            fail("Expecting IllegalArgumentException");
-        } catch (final IllegalArgumentException ex) {
-            assertEquals("The validated array is empty", ex.getMessage());
-        }
-        
-        final String[] array = new String[] {"hi"};
-        final String[] test = Validate.notEmpty(array);
-        assertSame(array, test);
-    }
-
-    //-----------------------------------------------------------------------
-    @Test
-    public void testNotEmptyArray2() {
-        Validate.notEmpty(new Object[] {null}, "MSG");
-        try {
-            Validate.notEmpty((Object[]) null, "MSG");
-            fail("Expecting NullPointerException");
-        } catch (final NullPointerException ex) {
-            assertEquals("MSG", ex.getMessage());
-        }
-        try {
-            Validate.notEmpty(new Object[0], "MSG");
-            fail("Expecting IllegalArgumentException");
-        } catch (final IllegalArgumentException ex) {
-            assertEquals("MSG", ex.getMessage());
-        }
-        
-        final String[] array = new String[] {"hi"};
-        final String[] test = Validate.notEmpty(array, "Message");
-        assertSame(array, test);
-    }
-
-    //-----------------------------------------------------------------------
-    //-----------------------------------------------------------------------
-    @Test
-    public void testNotEmptyCollection1() {
-        final Collection<Integer> coll = new ArrayList<Integer>();
-        try {
-            Validate.notEmpty((Collection<?>) null);
-            fail("Expecting NullPointerException");
-        } catch (final NullPointerException ex) {
-            assertEquals("The validated collection is empty", ex.getMessage());
-        }
-        try {
-            Validate.notEmpty(coll);
-            fail("Expecting IllegalArgumentException");
-        } catch (final IllegalArgumentException ex) {
-            assertEquals("The validated collection is empty", ex.getMessage());
-        }
-        coll.add(Integer.valueOf(8));
-        Validate.notEmpty(coll);
-        
-        final Collection<Integer> test = Validate.notEmpty(coll);
-        assertSame(coll, test);
-    }
-
-    //-----------------------------------------------------------------------
-    @Test
-    public void testNotEmptyCollection2() {
-        final Collection<Integer> coll = new ArrayList<Integer>();
-        try {
-            Validate.notEmpty((Collection<?>) null, "MSG");
-            fail("Expecting NullPointerException");
-        } catch (final NullPointerException ex) {
-            assertEquals("MSG", ex.getMessage());
-        }
-        try {
-            Validate.notEmpty(coll, "MSG");
-            fail("Expecting IllegalArgumentException");
-        } catch (final IllegalArgumentException ex) {
-            assertEquals("MSG", ex.getMessage());
-        }
-        coll.add(Integer.valueOf(8));
-        Validate.notEmpty(coll, "MSG");
-        
-        final Collection<Integer> test = Validate.notEmpty(coll, "Message");
-        assertSame(coll, test);
-    }
-
-    //-----------------------------------------------------------------------
-    //-----------------------------------------------------------------------
-    @Test
-    public void testNotEmptyMap1() {
-        final Map<String, Integer> map = new HashMap<String, Integer>();
-        try {
-            Validate.notEmpty((Map<?, ?>) null);
-            fail("Expecting NullPointerException");
-        } catch (final NullPointerException ex) {
-            assertEquals("The validated map is empty", ex.getMessage());
-        }
-        try {
-            Validate.notEmpty(map);
-            fail("Expecting IllegalArgumentException");
-        } catch (final IllegalArgumentException ex) {
-            assertEquals("The validated map is empty", ex.getMessage());
-        }
-        map.put("ll", Integer.valueOf(8));
-        Validate.notEmpty(map);
-        
-        final Map<String, Integer> test = Validate.notEmpty(map);
-        assertSame(map, test);
-    }
-
-    //-----------------------------------------------------------------------
-    @Test
-    public void testNotEmptyMap2() {
-        final Map<String, Integer> map = new HashMap<String, Integer>();
-        try {
-            Validate.notEmpty((Map<?, ?>) null, "MSG");
-            fail("Expecting NullPointerException");
-        } catch (final NullPointerException ex) {
-            assertEquals("MSG", ex.getMessage());
-        }
-        try {
-            Validate.notEmpty(map, "MSG");
-            fail("Expecting IllegalArgumentException");
-        } catch (final IllegalArgumentException ex) {
-            assertEquals("MSG", ex.getMessage());
-        }
-        map.put("ll", Integer.valueOf(8));
-        Validate.notEmpty(map, "MSG");
-        
-        final Map<String, Integer> test = Validate.notEmpty(map, "Message");
-        assertSame(map, test);
-    }
-
-    //-----------------------------------------------------------------------
-    //-----------------------------------------------------------------------
-    @Test
-    public void testNotEmptyString1() {
-        Validate.notEmpty("hjl");
-        try {
-            Validate.notEmpty((String) null);
-            fail("Expecting NullPointerException");
-        } catch (final NullPointerException ex) {
-            assertEquals("The validated character sequence is empty", ex.getMessage());
-        }
-        try {
-            Validate.notEmpty("");
-            fail("Expecting IllegalArgumentException");
-        } catch (final IllegalArgumentException ex) {
-            assertEquals("The validated character sequence is empty", ex.getMessage());
-        }
-        
-        final String str = "Hi";
-        final String testStr = Validate.notEmpty(str);
-        assertSame(str, testStr);
-    }
-
-    //-----------------------------------------------------------------------
-    @Test
-    public void testNotEmptyString2() {
-        Validate.notEmpty("a", "MSG");
-        try {
-            Validate.notEmpty((String) null, "MSG");
-            fail("Expecting NullPointerException");
-        } catch (final NullPointerException ex) {
-            assertEquals("MSG", ex.getMessage());
-        }
-        try {
-            Validate.notEmpty("", "MSG");
-            fail("Expecting IllegalArgumentException");
-        } catch (final IllegalArgumentException ex) {
-            assertEquals("MSG", ex.getMessage());
-        }
-        
-        final String str = "Hi";
-        final String testStr = Validate.notEmpty(str, "Message");
-        assertSame(str, testStr);
-    }
-
-    //-----------------------------------------------------------------------
-    //-----------------------------------------------------------------------
-    @Test
-    public void testNotBlankNullStringShouldThrow() {
-        //given
-        final String string = null;
-
-        try {
-            //when
-            Validate.notBlank(string);
-            fail("Expecting NullPointerException");
-        } catch (final NullPointerException e) {
-            //then
-            assertEquals("The validated character sequence is blank", e.getMessage());
-        }
-    }
-
-    //-----------------------------------------------------------------------
-    @Test
-    public void testNotBlankMsgNullStringShouldThrow() {
-        //given
-        final String string = null;
-
-        try {
-            //when
-            Validate.notBlank(string, "Message");
-            fail("Expecting NullPointerException");
-        } catch (final NullPointerException e) {
-            //then
-            assertEquals("Message", e.getMessage());
-        }
-    }
-
-    //-----------------------------------------------------------------------
-    @Test
-    public void testNotBlankEmptyStringShouldThrow() {
-        //given
-        final String string = "";
-
-        try {
-            //when
-            Validate.notBlank(string);
-            fail("Expecting IllegalArgumentException");
-        } catch (final IllegalArgumentException e) {
-            //then
-            assertEquals("The validated character sequence is blank", e.getMessage());
-        }
-    }
-
-    //-----------------------------------------------------------------------
-    @Test
-    public void testNotBlankBlankStringWithWhitespacesShouldThrow() {
-        //given
-        final String string = "   ";
-
-        try {
-            //when
-            Validate.notBlank(string);
-            fail("Expecting IllegalArgumentException");
-        } catch (final IllegalArgumentException e) {
-            //then
-            assertEquals("The validated character sequence is blank", e.getMessage());
-        }
-    }
-
-    //-----------------------------------------------------------------------
-    @Test
-    public void testNotBlankBlankStringWithNewlinesShouldThrow() {
-        //given
-        final String string = " \n \t \r \n ";
-
-        try {
-            //when
-            Validate.notBlank(string);
-            fail("Expecting IllegalArgumentException");
-        } catch (final IllegalArgumentException e) {
-            //then
-            assertEquals("The validated character sequence is blank", e.getMessage());
-        }
-    }
-
-    //-----------------------------------------------------------------------
-    @Test
-    public void testNotBlankMsgBlankStringShouldThrow() {
-        //given
-        final String string = " \n \t \r \n ";
-
-        try {
-            //when
-            Validate.notBlank(string, "Message");
-            fail("Expecting IllegalArgumentException");
-        } catch (final IllegalArgumentException e) {
-            //then
-            assertEquals("Message", e.getMessage());
-        }
-    }
-
-    //-----------------------------------------------------------------------
-    @Test
-    public void testNotBlankMsgBlankStringWithWhitespacesShouldThrow() {
-        //given
-        final String string = "   ";
-
-        try {
-            //when
-            Validate.notBlank(string, "Message");
-            fail("Expecting IllegalArgumentException");
-        } catch (final IllegalArgumentException e) {
-            //then
-            assertEquals("Message", e.getMessage());
-        }
-    }
-
-    //-----------------------------------------------------------------------
-    @Test
-    public void testNotBlankMsgEmptyStringShouldThrow() {
-        //given
-        final String string = "";
-
-        try {
-            //when
-            Validate.notBlank(string, "Message");
-            fail("Expecting IllegalArgumentException");
-        } catch (final IllegalArgumentException e) {
-            //then
-            assertEquals("Message", e.getMessage());
-        }
-    }
-
-    //-----------------------------------------------------------------------
-    @Test
-    public void testNotBlankNotBlankStringShouldNotThrow() {
-        //given
-        final String string = "abc";
-
-        //when
-        Validate.notBlank(string);
-
-        //then should not throw
-    }
-
-    //-----------------------------------------------------------------------
-    @Test
-    public void testNotBlankNotBlankStringWithWhitespacesShouldNotThrow() {
-        //given
-        final String string = "  abc   ";
-
-        //when
-        Validate.notBlank(string);
-
-        //then should not throw
-    }
-
-    //-----------------------------------------------------------------------
-    @Test
-    public void testNotBlankNotBlankStringWithNewlinesShouldNotThrow() {
-        //given
-        final String string = " \n \t abc \r \n ";
-
-        //when
-        Validate.notBlank(string);
-
-        //then should not throw
-    }
-
-    //-----------------------------------------------------------------------
-    @Test
-    public void testNotBlankMsgNotBlankStringShouldNotThrow() {
-        //given
-        final String string = "abc";
-
-        //when
-        Validate.notBlank(string, "Message");
-
-        //then should not throw
-    }
-
-    //-----------------------------------------------------------------------
-    @Test
-    public void testNotBlankMsgNotBlankStringWithWhitespacesShouldNotThrow() {
-        //given
-        final String string = "  abc   ";
-
-        //when
-        Validate.notBlank(string, "Message");
-
-        //then should not throw
-    }
-
-    //-----------------------------------------------------------------------
-    @Test
-    public void testNotBlankMsgNotBlankStringWithNewlinesShouldNotThrow() {
-        //given
-        final String string = " \n \t abc \r \n ";
-
-        //when
-        Validate.notBlank(string, "Message");
-
-        //then should not throw
-    }
-
-    //-----------------------------------------------------------------------
-    @Test
-    public void testNotBlankReturnValues1() {
-        final String str = "Hi";
-        final String test = Validate.notBlank(str);
-        assertSame(str, test);
-    }
-
-    @Test
-    public void testNotBlankReturnValues2() {
-        final String str = "Hi";
-        final String test = Validate.notBlank(str, "Message");
-        assertSame(str, test);
-    }
-
-    //-----------------------------------------------------------------------
-    //-----------------------------------------------------------------------
-    @Test
-    public void testNoNullElementsArray1() {
-        String[] array = new String[] {"a", "b"};
-        Validate.noNullElements(array);
-        try {
-            Validate.noNullElements((Object[]) null);
-            fail("Expecting NullPointerException");
-        } catch (final NullPointerException ex) {
-            assertEquals("The validated object is null", ex.getMessage());
-        }
-        array[1] = null;
-        try {
-            Validate.noNullElements(array);
-            fail("Expecting IllegalArgumentException");
-        } catch (final IllegalArgumentException ex) {
-            assertEquals("The validated array contains null element at index: 1", ex.getMessage());
-        }
-        
-        array = new String[] {"a", "b"};
-        final String[] test = Validate.noNullElements(array);
-        assertSame(array, test);
-    }
-
-    //-----------------------------------------------------------------------
-    @Test
-    public void testNoNullElementsArray2() {
-        String[] array = new String[] {"a", "b"};
-        Validate.noNullElements(array, "MSG");
-        try {
-            Validate.noNullElements((Object[]) null, "MSG");
-            fail("Expecting NullPointerException");
-        } catch (final NullPointerException ex) {
-            assertEquals("The validated object is null", ex.getMessage());
-        }
-        array[1] = null;
-        try {
-            Validate.noNullElements(array, "MSG");
-            fail("Expecting IllegalArgumentException");
-        } catch (final IllegalArgumentException ex) {
-            assertEquals("MSG", ex.getMessage());
-        }
-        
-        array = new String[] {"a", "b"};
-        final String[] test = Validate.noNullElements(array, "Message");
-        assertSame(array, test);
-    }
-
-    //-----------------------------------------------------------------------
-    //-----------------------------------------------------------------------
-    @Test
-    public void testNoNullElementsCollection1() {
-        final List<String> coll = new ArrayList<String>();
-        coll.add("a");
-        coll.add("b");
-        Validate.noNullElements(coll);
-        try {
-            Validate.noNullElements((Collection<?>) null);
-            fail("Expecting NullPointerException");
-        } catch (final NullPointerException ex) {
-            assertEquals("The validated object is null", ex.getMessage());
-        }
-        coll.set(1, null);
-        try {
-            Validate.noNullElements(coll);
-            fail("Expecting IllegalArgumentException");
-        } catch (final IllegalArgumentException ex) {
-            assertEquals("The validated collection contains null element at index: 1", ex.getMessage());
-        }
-        
-        coll.set(1, "b");
-        final List<String> test = Validate.noNullElements(coll);
-        assertSame(coll, test);
-    }
-
-    //-----------------------------------------------------------------------
-    @Test
-    public void testNoNullElementsCollection2() {
-        final List<String> coll = new ArrayList<String>();
-        coll.add("a");
-        coll.add("b");
-        Validate.noNullElements(coll, "MSG");
-        try {
-            Validate.noNullElements((Collection<?>) null, "MSG");
-            fail("Expecting NullPointerException");
-        } catch (final NullPointerException ex) {
-            assertEquals("The validated object is null", ex.getMessage());
-        }
-        coll.set(1, null);
-        try {
-            Validate.noNullElements(coll, "MSG");
-            fail("Expecting IllegalArgumentException");
-        } catch (final IllegalArgumentException ex) {
-            assertEquals("MSG", ex.getMessage());
-        }
-        
-        coll.set(1, "b");
-        final List<String> test = Validate.noNullElements(coll, "Message");
-        assertSame(coll, test);
-    }
-
-    //-----------------------------------------------------------------------
-    //-----------------------------------------------------------------------
-    @Test
-    public void testConstructor() {
-        assertNotNull(new Validate());
-        final Constructor<?>[] cons = Validate.class.getDeclaredConstructors();
-        assertEquals(1, cons.length);
-        assertTrue(Modifier.isPublic(cons[0].getModifiers()));
-        assertTrue(Modifier.isPublic(Validate.class.getModifiers()));
-        assertFalse(Modifier.isFinal(Validate.class.getModifiers()));
-    }
-
-    //-----------------------------------------------------------------------
-    //-----------------------------------------------------------------------
-    @Test
-    public void testValidIndex_withMessage_array() {
-        final Object[] array = new Object[2];
-        Validate.validIndex(array, 0, "Broken: ");
-        Validate.validIndex(array, 1, "Broken: ");
-        try {
-            Validate.validIndex(array, -1, "Broken: ");
-            fail("Expecting IndexOutOfBoundsException");
-        } catch (final IndexOutOfBoundsException ex) {
-            assertEquals("Broken: ", ex.getMessage());
-        }
-        try {
-            Validate.validIndex(array, 2, "Broken: ");
-            fail("Expecting IndexOutOfBoundsException");
-        } catch (final IndexOutOfBoundsException ex) {
-            assertEquals("Broken: ", ex.getMessage());
-        }
-        
-        final String[] strArray = new String[] {"Hi"};
-        final String[] test = Validate.noNullElements(strArray, "Message");
-        assertSame(strArray, test);
-    }
-
-    @Test
-    public void testValidIndex_array() {
-        final Object[] array = new Object[2];
-        Validate.validIndex(array, 0);
-        Validate.validIndex(array, 1);
-        try {
-            Validate.validIndex(array, -1);
-            fail("Expecting IndexOutOfBoundsException");
-        } catch (final IndexOutOfBoundsException ex) {
-            assertEquals("The validated array index is invalid: -1", ex.getMessage());
-        }
-        try {
-            Validate.validIndex(array, 2);
-            fail("Expecting IndexOutOfBoundsException");
-        } catch (final IndexOutOfBoundsException ex) {
-            assertEquals("The validated array index is invalid: 2", ex.getMessage());
-        }
-        
-        final String[] strArray = new String[] {"Hi"};
-        final String[] test = Validate.noNullElements(strArray);
-        assertSame(strArray, test);
-    }
-
-    //-----------------------------------------------------------------------
-    //-----------------------------------------------------------------------
-    @Test
-    public void testValidIndex_withMessage_collection() {
-        final Collection<String> coll = new ArrayList<String>();
-        coll.add(null);
-        coll.add(null);
-        Validate.validIndex(coll, 0, "Broken: ");
-        Validate.validIndex(coll, 1, "Broken: ");
-        try {
-            Validate.validIndex(coll, -1, "Broken: ");
-            fail("Expecting IndexOutOfBoundsException");
-        } catch (final IndexOutOfBoundsException ex) {
-            assertEquals("Broken: ", ex.getMessage());
-        }
-        try {
-            Validate.validIndex(coll, 2, "Broken: ");
-            fail("Expecting IndexOutOfBoundsException");
-        } catch (final IndexOutOfBoundsException ex) {
-            assertEquals("Broken: ", ex.getMessage());
-        }
-        
-        final List<String> strColl = Arrays.asList(new String[] {"Hi"});
-        final List<String> test = Validate.validIndex(strColl, 0, "Message");
-        assertSame(strColl, test);
-    }
-
-    @Test
-    public void testValidIndex_collection() {
-        final Collection<String> coll = new ArrayList<String>();
-        coll.add(null);
-        coll.add(null);
-        Validate.validIndex(coll, 0);
-        Validate.validIndex(coll, 1);
-        try {
-            Validate.validIndex(coll, -1);
-            fail("Expecting IndexOutOfBoundsException");
-        } catch (final IndexOutOfBoundsException ex) {
-            assertEquals("The validated collection index is invalid: -1", ex.getMessage());
-        }
-        try {
-            Validate.validIndex(coll, 2);
-            fail("Expecting IndexOutOfBoundsException");
-        } catch (final IndexOutOfBoundsException ex) {
-            assertEquals("The validated collection index is invalid: 2", ex.getMessage());
-        }
-        
-        final List<String> strColl = Arrays.asList(new String[] {"Hi"});
-        final List<String> test = Validate.validIndex(strColl, 0);
-        assertSame(strColl, test);
-    }
-
-    //-----------------------------------------------------------------------
-    //-----------------------------------------------------------------------
-    @Test
-    public void testValidIndex_withMessage_charSequence() {
-        final CharSequence str = "Hi";
-        Validate.validIndex(str, 0, "Broken: ");
-        Validate.validIndex(str, 1, "Broken: ");
-        try {
-            Validate.validIndex(str, -1, "Broken: ");
-            fail("Expecting IndexOutOfBoundsException");
-        } catch (final IndexOutOfBoundsException ex) {
-            assertEquals("Broken: ", ex.getMessage());
-        }
-        try {
-            Validate.validIndex(str, 2, "Broken: ");
-            fail("Expecting IndexOutOfBoundsException");
-        } catch (final IndexOutOfBoundsException ex) {
-            assertEquals("Broken: ", ex.getMessage());
-        }
-        
-        final String input = "Hi";
-        final String test = Validate.validIndex(input, 0, "Message");
-        assertSame(input, test);
-    }
-
-    @Test
-    public void testValidIndex_charSequence() {
-        final CharSequence str = "Hi";
-        Validate.validIndex(str, 0);
-        Validate.validIndex(str, 1);
-        try {
-            Validate.validIndex(str, -1);
-            fail("Expecting IndexOutOfBoundsException");
-        } catch (final IndexOutOfBoundsException ex) {
-            assertEquals("The validated character sequence index is invalid: -1", ex.getMessage());
-        }
-        try {
-            Validate.validIndex(str, 2);
-            fail("Expecting IndexOutOfBoundsException");
-        } catch (final IndexOutOfBoundsException ex) {
-            assertEquals("The validated character sequence index is invalid: 2", ex.getMessage());
-        }
-        
-        final String input = "Hi";
-        final String test = Validate.validIndex(input, 0);
-        assertSame(input, test);
-    }
-    
-    @Test
-    public void testMatchesPattern()
-    {
-        final CharSequence str = "hi";
-        Validate.matchesPattern(str, "[a-z]*");
-        try
-        {
-            Validate.matchesPattern(str, "[0-9]*");
-            fail("Expecting IllegalArgumentException");
-        }
-        catch (final IllegalArgumentException e)
-        {
-            assertEquals("The string hi does not match the pattern [0-9]*", e.getMessage());
-        }
-    }
-    
-    @Test
-    public void testMatchesPattern_withMessage()
-    {
-        final CharSequence str = "hi";
-        Validate.matchesPattern(str, "[a-z]*", "Does not match");
-        try
-        {
-            Validate.matchesPattern(str, "[0-9]*", "Does not match");
-            fail("Expecting IllegalArgumentException");
-        }
-        catch (final IllegalArgumentException e)
-        {
-            assertEquals("Does not match", e.getMessage());
-        }
-    }
-    
-    @Test
-    public void testInclusiveBetween()
-    {
-        Validate.inclusiveBetween("a", "c", "b");
-        try {
-            Validate.inclusiveBetween("0", "5", "6");
-            fail("Expecting IllegalArgumentException");
-        } catch (final IllegalArgumentException e) {
-            assertEquals("The value 6 is not in the specified inclusive range of 0 to 5", e.getMessage());
-        }
-    }
-    
-    @Test
-    public void testInclusiveBetween_withMessage()
-    {
-        Validate.inclusiveBetween("a", "c", "b", "Error");
-        try {
-            Validate.inclusiveBetween("0", "5", "6", "Error");
-            fail("Expecting IllegalArgumentException");
-        } catch (final IllegalArgumentException e) {
-            assertEquals("Error", e.getMessage());
-        }
-    }
-
-    @Test
-    public void testInclusiveBetweenLong()
-    {
-        Validate.inclusiveBetween(0, 2, 1);
-        Validate.inclusiveBetween(0, 2, 2);
-        try {
-            Validate.inclusiveBetween(0, 5, 6);
-            fail("Expecting IllegalArgumentException");
-        } catch (final IllegalArgumentException e) {
-            assertEquals("The value 6 is not in the specified inclusive range of 0 to 5", e.getMessage());
-        }
-    }
-
-    @Test
-    public void testInclusiveBetweenLong_withMessage()
-    {
-        Validate.inclusiveBetween(0, 2, 1, "Error");
-        Validate.inclusiveBetween(0, 2, 2, "Error");
-        try {
-            Validate.inclusiveBetween(0, 5, 6, "Error");
-            fail("Expecting IllegalArgumentException");
-        } catch (final IllegalArgumentException e) {
-            assertEquals("Error", e.getMessage());
-        }
-    }
-
-    @Test
-    public void testInclusiveBetweenDouble()
-    {
-        Validate.inclusiveBetween(0.1, 2.1, 1.1);
-        Validate.inclusiveBetween(0.1, 2.1, 2.1);
-        try {
-            Validate.inclusiveBetween(0.1, 5.1, 6.1);
-            fail("Expecting IllegalArgumentException");
-        } catch (final IllegalArgumentException e) {
-            assertEquals("The value 6.1 is not in the specified inclusive range of 0.1 to 5.1", e.getMessage());
-        }
-    }
-
-    @Test
-    public void testInclusiveBetweenDouble_withMessage()
-    {
-        Validate.inclusiveBetween(0.1, 2.1, 1.1, "Error");
-        Validate.inclusiveBetween(0.1, 2.1, 2.1, "Error");
-        try {
-            Validate.inclusiveBetween(0.1, 5.1, 6.1, "Error");
-            fail("Expecting IllegalArgumentException");
-        } catch (final IllegalArgumentException e) {
-            assertEquals("Error", e.getMessage());
-        }
-    }
-    
-    @Test
-    public void testExclusiveBetween()
-    {
-        Validate.exclusiveBetween("a", "c", "b");
-        try {
-            Validate.exclusiveBetween("0", "5", "6");
-            fail("Expecting IllegalArgumentException");
-        } catch (final IllegalArgumentException e) {
-            assertEquals("The value 6 is not in the specified exclusive range of 0 to 5", e.getMessage());
-        }
-        try {
-            Validate.exclusiveBetween("0", "5", "5");
-            fail("Expecting IllegalArgumentException");
-        } catch (final IllegalArgumentException e) {
-            assertEquals("The value 5 is not in the specified exclusive range of 0 to 5", e.getMessage());
-        }
-    }
-    
-    @Test
-    public void testExclusiveBetween_withMessage()
-    {
-        Validate.exclusiveBetween("a", "c", "b", "Error");
-        try {
-            Validate.exclusiveBetween("0", "5", "6", "Error");
-            fail("Expecting IllegalArgumentException");
-        } catch (final IllegalArgumentException e) {
-            assertEquals("Error", e.getMessage());
-        }
-        try {
-            Validate.exclusiveBetween("0", "5", "5", "Error");
-            fail("Expecting IllegalArgumentException");
-        } catch (final IllegalArgumentException e) {
-            assertEquals("Error", e.getMessage());
-        }
-    }
-
-    @Test
-    public void testExclusiveBetweenLong()
-    {
-        Validate.exclusiveBetween(0, 2, 1);
-        try {
-            Validate.exclusiveBetween(0, 5, 6);
-            fail("Expecting IllegalArgumentException");
-        } catch (final IllegalArgumentException e) {
-            assertEquals("The value 6 is not in the specified exclusive range of 0 to 5", e.getMessage());
-        }
-        try {
-            Validate.exclusiveBetween(0, 5, 5);
-            fail("Expecting IllegalArgumentException");
-        } catch (final IllegalArgumentException e) {
-            assertEquals("The value 5 is not in the specified exclusive range of 0 to 5", e.getMessage());
-        }
-    }
-
-    @Test
-    public void testExclusiveBetweenLong_withMessage()
-    {
-        Validate.exclusiveBetween(0, 2, 1, "Error");
-        try {
-            Validate.exclusiveBetween(0, 5, 6, "Error");
-            fail("Expecting IllegalArgumentException");
-        } catch (final IllegalArgumentException e) {
-            assertEquals("Error", e.getMessage());
-        }
-        try {
-            Validate.exclusiveBetween(0, 5, 5, "Error");
-            fail("Expecting IllegalArgumentException");
-        } catch (final IllegalArgumentException e) {
-            assertEquals("Error", e.getMessage());
-        }
-    }
-
-    @Test
-    public void testExclusiveBetweenDouble()
-    {
-        Validate.exclusiveBetween(0.1, 2.1, 1.1);
-        try {
-            Validate.exclusiveBetween(0.1, 5.1, 6.1);
-            fail("Expecting IllegalArgumentException");
-        } catch (final IllegalArgumentException e) {
-            assertEquals("The value 6.1 is not in the specified exclusive range of 0.1 to 5.1", e.getMessage());
-        }
-        try {
-            Validate.exclusiveBetween(0.1, 5.1, 5.1);
-            fail("Expecting IllegalArgumentException");
-        } catch (final IllegalArgumentException e) {
-            assertEquals("The value 5.1 is not in the specified exclusive range of 0.1 to 5.1", e.getMessage());
-        }
-    }
-
-    @Test
-    public void testExclusiveBetweenDouble_withMessage()
-    {
-        Validate.exclusiveBetween(0.1, 2.1, 1.1, "Error");
-        try {
-            Validate.exclusiveBetween(0.1, 5.1, 6.1, "Error");
-            fail("Expecting IllegalArgumentException");
-        } catch (final IllegalArgumentException e) {
-            assertEquals("Error", e.getMessage());
-        }
-        try {
-            Validate.exclusiveBetween(0.1, 5.1, 5.1, "Error");
-            fail("Expecting IllegalArgumentException");
-        } catch (final IllegalArgumentException e) {
-            assertEquals("Error", e.getMessage());
-        }
-    }
-
-    @Test
-    public void testIsInstanceOf() {
-        Validate.isInstanceOf(String.class, "hi");
-        Validate.isInstanceOf(Integer.class, 1);
-    }
-    
-    @Test
-    public void testIsInstanceOfExceptionMessage() {
-        try {
-            Validate.isInstanceOf(List.class, "hi");
-            fail("Expecting IllegalArgumentException");
-        } catch(final IllegalArgumentException e) {
-            assertEquals("Expected type: java.util.List, actual: java.lang.String", e.getMessage());
-        }
-    }
-    
-    @Test
-    public void testIsInstanceOf_withMessage() {
-        Validate.isInstanceOf(String.class, "hi", "Error");
-        Validate.isInstanceOf(Integer.class, 1, "Error");
-        try {
-            Validate.isInstanceOf(List.class, "hi", "Error");
-            fail("Expecting IllegalArgumentException");
-        } catch(final IllegalArgumentException e) {
-            assertEquals("Error", e.getMessage());
-        }
-    }
-    
-    @Test
-    public void testIsInstanceOf_withMessageArgs() {
-        Validate.isInstanceOf(String.class, "hi", "Error %s=%s", "Name", "Value");
-        Validate.isInstanceOf(Integer.class, 1, "Error %s=%s", "Name", "Value");
-        try {
-            Validate.isInstanceOf(List.class, "hi", "Error %s=%s", "Name", "Value");
-            fail("Expecting IllegalArgumentException");
-        } catch(final IllegalArgumentException e) {
-            assertEquals("Error Name=Value", e.getMessage());
-        }
-        try {
-            Validate.isInstanceOf(List.class, "hi", "Error %s=%s", List.class, "Value");
-            fail("Expecting IllegalArgumentException");
-        } catch(final IllegalArgumentException e) {
-            assertEquals("Error interface java.util.List=Value", e.getMessage());
-        }
-        try {
-            Validate.isInstanceOf(List.class, "hi", "Error %s=%s", List.class, null);
-            fail("Expecting IllegalArgumentException");
-        } catch(final IllegalArgumentException e) {
-            assertEquals("Error interface java.util.List=null", e.getMessage());
-        }
-    }
-    
-    @Test
-    public void testIsAssignable() {
-        Validate.isAssignableFrom(CharSequence.class, String.class);
-        Validate.isAssignableFrom(AbstractList.class, ArrayList.class);
-    }
-    
-    @Test
-    public void testIsAssignableExceptionMessage() {
-        try {
-            Validate.isAssignableFrom(List.class, String.class);
-            fail("Expecting IllegalArgumentException");
-        } catch(final IllegalArgumentException e) {
-            assertEquals("Cannot assign a java.lang.String to a java.util.List", e.getMessage());
-        }
-    }
-    
-    @Test
-    public void testIsAssignable_withMessage() {
-        Validate.isAssignableFrom(CharSequence.class, String.class, "Error");
-        Validate.isAssignableFrom(AbstractList.class, ArrayList.class, "Error");
-        try {
-            Validate.isAssignableFrom(List.class, String.class, "Error");
-            fail("Expecting IllegalArgumentException");
-        } catch(final IllegalArgumentException e) {
-            assertEquals("Error", e.getMessage());
-        }
-    }
-
-}
diff --git a/lang/src/test/java/org/apache/commons/lang3/builder/CompareToBuilderTest.java b/lang/src/test/java/org/apache/commons/lang3/builder/CompareToBuilderTest.java
deleted file mode 100644
index 294e50c..0000000
--- a/lang/src/test/java/org/apache/commons/lang3/builder/CompareToBuilderTest.java
+++ /dev/null
@@ -1,1167 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- * 
- *      http://www.apache.org/licenses/LICENSE-2.0
- * 
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.commons.lang3.builder;
-
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertTrue;
-
-import java.math.BigInteger;
-
-import org.junit.Test;
-
-/**
- * Unit tests {@link org.apache.commons.lang3.builder.CompareToBuilder}.
- *
- * @version $Id$
- */
-public class CompareToBuilderTest {
-
-    //-----------------------------------------------------------------------
-
-    static class TestObject implements Comparable<TestObject> {
-        private int a;
-        public TestObject(final int a) {
-            this.a = a;
-        }
-        @Override
-        public boolean equals(final Object o) {
-            if (o == this) {
-                return true;
-            }
-            if (!(o instanceof TestObject)) {
-                return false;
-            }
-            final TestObject rhs = (TestObject) o;
-            return a == rhs.a;
-        }
-
-        @Override
-        public int hashCode() {
-            return a;
-        }
-
-        public void setA(final int a) {
-            this.a = a;
-        }
-
-        public int getA() {
-            return a;
-        }
-        @Override
-        public int compareTo(final TestObject rhs) {
-            return a < rhs.a ? -1 : a > rhs.a ? +1 : 0;
-        }
-    }
-
-    static class TestSubObject extends TestObject {
-        private int b;
-        public TestSubObject() {
-            super(0);
-        }
-        public TestSubObject(final int a, final int b) {
-            super(a);
-            this.b = b;
-        }
-        @Override
-        public boolean equals(final Object o) {
-            if (o == this) {
-                return true;
-            }
-            if (!(o instanceof TestSubObject)) {
-                return false;
-            }
-            final TestSubObject rhs = (TestSubObject) o;
-            return super.equals(o) && b == rhs.b;
-        }
-    }
-
-    static class TestTransientSubObject extends TestObject {
-        @SuppressWarnings("unused")
-        private transient int t;
-        public TestTransientSubObject(final int a, final int t) {
-            super(a);
-            this.t = t;
-        }
-    }
-    
-    @Test
-    public void testReflectionCompare() {
-        final TestObject o1 = new TestObject(4);
-        final TestObject o2 = new TestObject(4);
-        assertTrue(CompareToBuilder.reflectionCompare(o1, o1) == 0);
-        assertTrue(CompareToBuilder.reflectionCompare(o1, o2) == 0);
-        o2.setA(5);
-        assertTrue(CompareToBuilder.reflectionCompare(o1, o2) < 0);
-        assertTrue(CompareToBuilder.reflectionCompare(o2, o1) > 0);
-    }
-
-    @Test(expected=NullPointerException.class)
-    public void testReflectionCompareEx1() {
-        final TestObject o1 = new TestObject(4);
-        CompareToBuilder.reflectionCompare(o1, null);
-    }
-
-    @Test(expected=ClassCastException.class)
-    public void testReflectionCompareEx2() {
-        final TestObject o1 = new TestObject(4);
-        final Object o2 = new Object();
-        CompareToBuilder.reflectionCompare(o1, o2);
-    }
-
-    @Test
-    public void testReflectionHierarchyCompare() {
-        testReflectionHierarchyCompare(false, null);
-    }
-    
-    @Test
-    public void testReflectionHierarchyCompareExcludeFields() {
-        final String[] excludeFields = new String[] { "b" };
-        testReflectionHierarchyCompare(true, excludeFields);
-        
-        TestSubObject x;
-        TestSubObject y;
-        TestSubObject z;
-        
-        x = new TestSubObject(1, 1);
-        y = new TestSubObject(2, 1);
-        z = new TestSubObject(3, 1);
-        assertXYZCompareOrder(x, y, z, true, excludeFields);
-
-        x = new TestSubObject(1, 3);
-        y = new TestSubObject(2, 2);
-        z = new TestSubObject(3, 1);
-        assertXYZCompareOrder(x, y, z, true, excludeFields);
-    }
-    
-    @Test
-    public void testReflectionHierarchyCompareTransients() {
-        testReflectionHierarchyCompare(true, null);
-
-        TestTransientSubObject x;
-        TestTransientSubObject y;
-        TestTransientSubObject z;
-
-        x = new TestTransientSubObject(1, 1);
-        y = new TestTransientSubObject(2, 2);
-        z = new TestTransientSubObject(3, 3);
-        assertXYZCompareOrder(x, y, z, true, null);
-        
-        x = new TestTransientSubObject(1, 1);
-        y = new TestTransientSubObject(1, 2);
-        z = new TestTransientSubObject(1, 3);
-        assertXYZCompareOrder(x, y, z, true, null);  
-    }
-    
-    private void assertXYZCompareOrder(final Object x, final Object y, final Object z, final boolean testTransients, final String[] excludeFields) {
-        assertTrue(0 == CompareToBuilder.reflectionCompare(x, x, testTransients, null, excludeFields));
-        assertTrue(0 == CompareToBuilder.reflectionCompare(y, y, testTransients, null, excludeFields));
-        assertTrue(0 == CompareToBuilder.reflectionCompare(z, z, testTransients, null, excludeFields));
-        
-        assertTrue(0 > CompareToBuilder.reflectionCompare(x, y, testTransients, null, excludeFields));
-        assertTrue(0 > CompareToBuilder.reflectionCompare(x, z, testTransients, null, excludeFields));
-        assertTrue(0 > CompareToBuilder.reflectionCompare(y, z, testTransients, null, excludeFields));
-        
-        assertTrue(0 < CompareToBuilder.reflectionCompare(y, x, testTransients, null, excludeFields));
-        assertTrue(0 < CompareToBuilder.reflectionCompare(z, x, testTransients, null, excludeFields));
-        assertTrue(0 < CompareToBuilder.reflectionCompare(z, y, testTransients, null, excludeFields));
-    }
-    
-    private void testReflectionHierarchyCompare(final boolean testTransients, final String[] excludeFields) {
-        final TestObject to1 = new TestObject(1);
-        final TestObject to2 = new TestObject(2);
-        final TestObject to3 = new TestObject(3);
-        final TestSubObject tso1 = new TestSubObject(1, 1);
-        final TestSubObject tso2 = new TestSubObject(2, 2);
-        final TestSubObject tso3 = new TestSubObject(3, 3);
-        
-        assertReflectionCompareContract(to1, to1, to1, false, excludeFields);
-        assertReflectionCompareContract(to1, to2, to3, false, excludeFields);
-        assertReflectionCompareContract(tso1, tso1, tso1, false, excludeFields);
-        assertReflectionCompareContract(tso1, tso2, tso3, false, excludeFields);
-        assertReflectionCompareContract("1", "2", "3", false, excludeFields);
-        
-        assertTrue(0 != CompareToBuilder.reflectionCompare(tso1, new TestSubObject(1, 0), testTransients));
-        assertTrue(0 != CompareToBuilder.reflectionCompare(tso1, new TestSubObject(0, 1), testTransients));
-
-        // root class
-        assertXYZCompareOrder(to1, to2, to3, true, null);
-        // subclass  
-        assertXYZCompareOrder(tso1, tso2, tso3, true, null);  
-    }
-
-    /**
-     * See "Effective Java" under "Consider Implementing Comparable".
-     *  
-     * @param x an object to compare 
-     * @param y an object to compare
-     * @param z an object to compare
-     * @param testTransients Whether to include transients in the comparison
-     * @param excludeFields fields to exclude
-     */
-    private void assertReflectionCompareContract(final Object x, final Object y, final Object z, final boolean testTransients, final String[] excludeFields) {
-
-        // signum
-        assertTrue(reflectionCompareSignum(x, y, testTransients, excludeFields) == -reflectionCompareSignum(y, x, testTransients, excludeFields));
-        
-        // transitive
-        if (CompareToBuilder.reflectionCompare(x, y, testTransients, null, excludeFields) > 0 
-                && CompareToBuilder.reflectionCompare(y, z, testTransients, null, excludeFields) > 0){
-            assertTrue(CompareToBuilder.reflectionCompare(x, z, testTransients, null, excludeFields) > 0);
-        }
-        
-        // un-named
-        if (CompareToBuilder.reflectionCompare(x, y, testTransients, null, excludeFields) == 0) {
-            assertTrue(reflectionCompareSignum(x, z, testTransients, excludeFields) == -reflectionCompareSignum(y, z, testTransients, excludeFields));
-        }
-        
-        // strongly recommended but not strictly required
-        assertTrue(CompareToBuilder.reflectionCompare(x, y, testTransients) ==0 == EqualsBuilder.reflectionEquals(x, y, testTransients));
-    }
-    
-    /**
-     * Returns the signum of the result of comparing x and y with
-     * <code>CompareToBuilder.reflectionCompare</code>
-     * 
-     * @param lhs The "left-hand-side" of the comparison.
-     * @param rhs The "right-hand-side" of the comparison.
-     * @param testTransients Whether to include transients in the comparison
-     * @param excludeFields fields to exclude
-     * @return int The signum
-     */
-    private int reflectionCompareSignum(final Object lhs, final Object rhs, final boolean testTransients, final String[] excludeFields) {
-        return BigInteger.valueOf(CompareToBuilder.reflectionCompare(lhs, rhs, testTransients)).signum();
-    }
-    
-    @Test
-    public void testAppendSuper() {
-        final TestObject o1 = new TestObject(4);
-        final TestObject o2 = new TestObject(5);
-        assertTrue(new CompareToBuilder().appendSuper(0).append(o1, o1).toComparison() == 0);
-        assertTrue(new CompareToBuilder().appendSuper(0).append(o1, o2).toComparison() < 0);
-        assertTrue(new CompareToBuilder().appendSuper(0).append(o2, o1).toComparison() > 0);
-        
-        assertTrue(new CompareToBuilder().appendSuper(-1).append(o1, o1).toComparison() < 0);
-        assertTrue(new CompareToBuilder().appendSuper(-1).append(o1, o2).toComparison() < 0);
-        
-        assertTrue(new CompareToBuilder().appendSuper(1).append(o1, o1).toComparison() > 0);
-        assertTrue(new CompareToBuilder().appendSuper(1).append(o1, o2).toComparison() > 0);
-    }
-    
-    @Test
-    public void testObject() {
-        final TestObject o1 = new TestObject(4);
-        final TestObject o2 = new TestObject(4);
-        assertTrue(new CompareToBuilder().append(o1, o1).toComparison() == 0);
-        assertTrue(new CompareToBuilder().append(o1, o2).toComparison() == 0);
-        o2.setA(5);
-        assertTrue(new CompareToBuilder().append(o1, o2).toComparison() < 0);
-        assertTrue(new CompareToBuilder().append(o2, o1).toComparison() > 0);
-        
-        assertTrue(new CompareToBuilder().append(o1, null).toComparison() > 0);
-        assertTrue(new CompareToBuilder().append((Object) null, (Object) null).toComparison() == 0);
-        assertTrue(new CompareToBuilder().append(null, o1).toComparison() < 0);
-    }
-    
-    @Test
-    public void testObjectBuild() {
-        final TestObject o1 = new TestObject(4);
-        final TestObject o2 = new TestObject(4);
-        assertEquals(Integer.valueOf(0), new CompareToBuilder().append(o1, o1).build());
-        assertEquals(Integer.valueOf(0), new CompareToBuilder().append(o1, o2).build());
-        o2.setA(5);
-        assertTrue(new CompareToBuilder().append(o1, o2).build().intValue() < 0);
-        assertTrue(new CompareToBuilder().append(o2, o1).build().intValue() > 0);
-        
-        assertTrue(new CompareToBuilder().append(o1, null).build().intValue() > 0);
-        assertEquals(Integer.valueOf(0), new CompareToBuilder().append((Object) null, (Object) null).build());
-        assertTrue(new CompareToBuilder().append(null, o1).build().intValue() < 0);
-    }
-
-    @Test(expected=ClassCastException.class)
-    public void testObjectEx2() {
-        final TestObject o1 = new TestObject(4);
-        final Object o2 = new Object();
-        new CompareToBuilder().append(o1, o2);
-    }
-
-    @Test
-    public void testObjectComparator() {
-        final String o1 = "Fred";
-        String o2 = "Fred";
-        assertTrue(new CompareToBuilder().append(o1, o1, String.CASE_INSENSITIVE_ORDER).toComparison() == 0);
-        assertTrue(new CompareToBuilder().append(o1, o2, String.CASE_INSENSITIVE_ORDER).toComparison() == 0);
-        o2 = "FRED";
-        assertTrue(new CompareToBuilder().append(o1, o2, String.CASE_INSENSITIVE_ORDER).toComparison() == 0);
-        assertTrue(new CompareToBuilder().append(o2, o1, String.CASE_INSENSITIVE_ORDER).toComparison() == 0);
-        o2 = "FREDA";
-        assertTrue(new CompareToBuilder().append(o1, o2, String.CASE_INSENSITIVE_ORDER).toComparison() < 0);
-        assertTrue(new CompareToBuilder().append(o2, o1, String.CASE_INSENSITIVE_ORDER).toComparison() > 0);
-        
-        assertTrue(new CompareToBuilder().append(o1, null, String.CASE_INSENSITIVE_ORDER).toComparison() > 0);
-        assertTrue(new CompareToBuilder().append((Object) null, (Object) null, String.CASE_INSENSITIVE_ORDER).toComparison() == 0);
-        assertTrue(new CompareToBuilder().append(null, o1, String.CASE_INSENSITIVE_ORDER).toComparison() < 0);
-    }
-    
-    @Test
-    public void testObjectComparatorNull() {
-        final String o1 = "Fred";
-        String o2 = "Fred";
-        assertTrue(new CompareToBuilder().append(o1, o1, null).toComparison() == 0);
-        assertTrue(new CompareToBuilder().append(o1, o2, null).toComparison() == 0);
-        o2 = "Zebra";
-        assertTrue(new CompareToBuilder().append(o1, o2, null).toComparison() < 0);
-        assertTrue(new CompareToBuilder().append(o2, o1, null).toComparison() > 0);
-        
-        assertTrue(new CompareToBuilder().append(o1, null, null).toComparison() > 0);
-        assertTrue(new CompareToBuilder().append((Object) null, (Object) null, null).toComparison() == 0);
-        assertTrue(new CompareToBuilder().append(null, o1, null).toComparison() < 0);
-    }
-
-    @Test
-    public void testLong() {
-        final long o1 = 1L;
-        final long o2 = 2L;
-        assertTrue(new CompareToBuilder().append(o1, o1).toComparison() == 0);
-        assertTrue(new CompareToBuilder().append(o1, o2).toComparison() < 0);
-        assertTrue(new CompareToBuilder().append(o2, o1).toComparison() > 0);
-        assertTrue(new CompareToBuilder().append(o1, Long.MAX_VALUE).toComparison() < 0);
-        assertTrue(new CompareToBuilder().append(Long.MAX_VALUE, o1).toComparison() > 0);
-        assertTrue(new CompareToBuilder().append(o1, Long.MIN_VALUE).toComparison() > 0);
-        assertTrue(new CompareToBuilder().append(Long.MIN_VALUE, o1).toComparison() < 0);
-    }
-
-    @Test
-    public void testInt() {
-        final int o1 = 1;
-        final int o2 = 2;
-        assertTrue(new CompareToBuilder().append(o1, o1).toComparison() == 0);
-        assertTrue(new CompareToBuilder().append(o1, o2).toComparison() < 0);
-        assertTrue(new CompareToBuilder().append(o2, o1).toComparison() > 0);
-        assertTrue(new CompareToBuilder().append(o1, Integer.MAX_VALUE).toComparison() < 0);
-        assertTrue(new CompareToBuilder().append(Integer.MAX_VALUE, o1).toComparison() > 0);
-        assertTrue(new CompareToBuilder().append(o1, Integer.MIN_VALUE).toComparison() > 0);
-        assertTrue(new CompareToBuilder().append(Integer.MIN_VALUE, o1).toComparison() < 0);
-    }
-
-    @Test
-    public void testShort() {
-        final short o1 = 1;
-        final short o2 = 2;
-        assertTrue(new CompareToBuilder().append(o1, o1).toComparison() == 0);
-        assertTrue(new CompareToBuilder().append(o1, o2).toComparison() < 0);
-        assertTrue(new CompareToBuilder().append(o2, o1).toComparison() > 0);
-        assertTrue(new CompareToBuilder().append(o1, Short.MAX_VALUE).toComparison() < 0);
-        assertTrue(new CompareToBuilder().append(Short.MAX_VALUE, o1).toComparison() > 0);
-        assertTrue(new CompareToBuilder().append(o1, Short.MIN_VALUE).toComparison() > 0);
-        assertTrue(new CompareToBuilder().append(Short.MIN_VALUE, o1).toComparison() < 0);
-    }
-
-    @Test
-    public void testChar() {
-        final char o1 = 1;
-        final char o2 = 2;
-        assertTrue(new CompareToBuilder().append(o1, o1).toComparison() == 0);
-        assertTrue(new CompareToBuilder().append(o1, o2).toComparison() < 0);
-        assertTrue(new CompareToBuilder().append(o2, o1).toComparison() > 0);
-        assertTrue(new CompareToBuilder().append(o1, Character.MAX_VALUE).toComparison() < 0);
-        assertTrue(new CompareToBuilder().append(Character.MAX_VALUE, o1).toComparison() > 0);
-        assertTrue(new CompareToBuilder().append(o1, Character.MIN_VALUE).toComparison() > 0);
-        assertTrue(new CompareToBuilder().append(Character.MIN_VALUE, o1).toComparison() < 0);
-    }
-
-    @Test
-    public void testByte() {
-        final byte o1 = 1;
-        final byte o2 = 2;
-        assertTrue(new CompareToBuilder().append(o1, o1).toComparison() == 0);
-        assertTrue(new CompareToBuilder().append(o1, o2).toComparison() < 0);
-        assertTrue(new CompareToBuilder().append(o2, o1).toComparison() > 0);
-        assertTrue(new CompareToBuilder().append(o1, Byte.MAX_VALUE).toComparison() < 0);
-        assertTrue(new CompareToBuilder().append(Byte.MAX_VALUE, o1).toComparison() > 0);
-        assertTrue(new CompareToBuilder().append(o1, Byte.MIN_VALUE).toComparison() > 0);
-        assertTrue(new CompareToBuilder().append(Byte.MIN_VALUE, o1).toComparison() < 0);
-    }
-
-    @Test
-    public void testDouble() {
-        final double o1 = 1;
-        final double o2 = 2;
-        assertTrue(new CompareToBuilder().append(o1, o1).toComparison() == 0);
-        assertTrue(new CompareToBuilder().append(o1, o2).toComparison() < 0);
-        assertTrue(new CompareToBuilder().append(o2, o1).toComparison() > 0);
-        assertTrue(new CompareToBuilder().append(o1, Double.MAX_VALUE).toComparison() < 0);
-        assertTrue(new CompareToBuilder().append(Double.MAX_VALUE, o1).toComparison() > 0);
-        assertTrue(new CompareToBuilder().append(o1, Double.MIN_VALUE).toComparison() > 0);
-        assertTrue(new CompareToBuilder().append(Double.MIN_VALUE, o1).toComparison() < 0);
-        assertTrue(new CompareToBuilder().append(Double.NaN, Double.NaN).toComparison() == 0);
-        assertTrue(new CompareToBuilder().append(Double.NaN, Double.MAX_VALUE).toComparison() > 0);
-        assertTrue(new CompareToBuilder().append(Double.POSITIVE_INFINITY, Double.MAX_VALUE).toComparison() > 0);
-        assertTrue(new CompareToBuilder().append(Double.NEGATIVE_INFINITY, Double.MIN_VALUE).toComparison() < 0);
-        assertTrue(new CompareToBuilder().append(o1, Double.NaN).toComparison() < 0);
-        assertTrue(new CompareToBuilder().append(Double.NaN, o1).toComparison() > 0);
-        assertTrue(new CompareToBuilder().append(-0.0, 0.0).toComparison() < 0);
-        assertTrue(new CompareToBuilder().append(0.0, -0.0).toComparison() > 0);
-    }
-
-    @Test
-    public void testFloat() {
-        final float o1 = 1;
-        final float o2 = 2;
-        assertTrue(new CompareToBuilder().append(o1, o1).toComparison() == 0);
-        assertTrue(new CompareToBuilder().append(o1, o2).toComparison() < 0);
-        assertTrue(new CompareToBuilder().append(o2, o1).toComparison() > 0);
-        assertTrue(new CompareToBuilder().append(o1, Float.MAX_VALUE).toComparison() < 0);
-        assertTrue(new CompareToBuilder().append(Float.MAX_VALUE, o1).toComparison() > 0);
-        assertTrue(new CompareToBuilder().append(o1, Float.MIN_VALUE).toComparison() > 0);
-        assertTrue(new CompareToBuilder().append(Float.MIN_VALUE, o1).toComparison() < 0);
-        assertTrue(new CompareToBuilder().append(Float.NaN, Float.NaN).toComparison() == 0);
-        assertTrue(new CompareToBuilder().append(Float.NaN, Float.MAX_VALUE).toComparison() > 0);
-        assertTrue(new CompareToBuilder().append(Float.POSITIVE_INFINITY, Float.MAX_VALUE).toComparison() > 0);
-        assertTrue(new CompareToBuilder().append(Float.NEGATIVE_INFINITY, Float.MIN_VALUE).toComparison() < 0);
-        assertTrue(new CompareToBuilder().append(o1, Float.NaN).toComparison() < 0);
-        assertTrue(new CompareToBuilder().append(Float.NaN, o1).toComparison() > 0);
-        assertTrue(new CompareToBuilder().append(-0.0, 0.0).toComparison() < 0);
-        assertTrue(new CompareToBuilder().append(0.0, -0.0).toComparison() > 0);
-    }
-
-    @Test
-    public void testBoolean() {
-        final boolean o1 = true;
-        final boolean o2 = false;
-        assertTrue(new CompareToBuilder().append(o1, o1).toComparison() == 0);
-        assertTrue(new CompareToBuilder().append(o2, o2).toComparison() == 0);
-        assertTrue(new CompareToBuilder().append(o1, o2).toComparison() > 0);
-        assertTrue(new CompareToBuilder().append(o2, o1).toComparison() < 0);
-    }
-
-    @Test
-    public void testObjectArray() {
-        final TestObject[] obj1 = new TestObject[2];
-        obj1[0] = new TestObject(4);
-        obj1[1] = new TestObject(5);
-        final TestObject[] obj2 = new TestObject[2];
-        obj2[0] = new TestObject(4);
-        obj2[1] = new TestObject(5);
-        final TestObject[] obj3 = new TestObject[3];
-        obj3[0] = new TestObject(4);
-        obj3[1] = new TestObject(5);
-        obj3[2] = new TestObject(6);
-        
-        assertTrue(new CompareToBuilder().append(obj1, obj1).toComparison() == 0);
-        assertTrue(new CompareToBuilder().append(obj1, obj2).toComparison() == 0);
-        assertTrue(new CompareToBuilder().append(obj1, obj3).toComparison() < 0);
-        assertTrue(new CompareToBuilder().append(obj3, obj1).toComparison() > 0);
-        
-        obj1[1] = new TestObject(7);
-        assertTrue(new CompareToBuilder().append(obj1, obj2).toComparison() > 0);
-        assertTrue(new CompareToBuilder().append(obj2, obj1).toComparison() < 0);
-
-        assertTrue(new CompareToBuilder().append(obj1, null).toComparison() > 0);
-        assertTrue(new CompareToBuilder().append((Object[]) null, (Object[]) null).toComparison() == 0);
-        assertTrue(new CompareToBuilder().append(null, obj1).toComparison() < 0);
-    }
-
-    @Test
-    public void testLongArray() {
-        final long[] obj1 = new long[2];
-        obj1[0] = 5L;
-        obj1[1] = 6L;
-        final long[] obj2 = new long[2];
-        obj2[0] = 5L;
-        obj2[1] = 6L;
-        final long[] obj3 = new long[3];
-        obj3[0] = 5L;
-        obj3[1] = 6L;
-        obj3[2] = 7L;
-        
-        assertTrue(new CompareToBuilder().append(obj1, obj1).toComparison() == 0);
-        assertTrue(new CompareToBuilder().append(obj1, obj2).toComparison() == 0);
-        assertTrue(new CompareToBuilder().append(obj1, obj3).toComparison() < 0);
-        assertTrue(new CompareToBuilder().append(obj3, obj1).toComparison() > 0);
-
-        obj1[1] = 7;
-        assertTrue(new CompareToBuilder().append(obj1, obj2).toComparison() > 0);
-        assertTrue(new CompareToBuilder().append(obj2, obj1).toComparison() < 0);
-
-        assertTrue(new CompareToBuilder().append(obj1, null).toComparison() > 0);
-        assertTrue(new CompareToBuilder().append((long[]) null, (long[]) null).toComparison() == 0);
-        assertTrue(new CompareToBuilder().append(null, obj1).toComparison() < 0);
-    }
-
-    @Test
-    public void testIntArray() {
-        final int[] obj1 = new int[2];
-        obj1[0] = 5;
-        obj1[1] = 6;
-        final int[] obj2 = new int[2];
-        obj2[0] = 5;
-        obj2[1] = 6;
-        final int[] obj3 = new int[3];
-        obj3[0] = 5;
-        obj3[1] = 6;
-        obj3[2] = 7;
-
-        assertTrue(new CompareToBuilder().append(obj1, obj1).toComparison() == 0);
-        assertTrue(new CompareToBuilder().append(obj1, obj2).toComparison() == 0);
-        assertTrue(new CompareToBuilder().append(obj1, obj3).toComparison() < 0);
-        assertTrue(new CompareToBuilder().append(obj3, obj1).toComparison() > 0);
-
-        obj1[1] = 7;
-        assertTrue(new CompareToBuilder().append(obj1, obj2).toComparison() > 0);
-        assertTrue(new CompareToBuilder().append(obj2, obj1).toComparison() < 0);
-
-        assertTrue(new CompareToBuilder().append(obj1, null).toComparison() > 0);
-        assertTrue(new CompareToBuilder().append((int[]) null, (int[]) null).toComparison() == 0);
-        assertTrue(new CompareToBuilder().append(null, obj1).toComparison() < 0);
-    }
-
-    @Test
-    public void testShortArray() {
-        final short[] obj1 = new short[2];
-        obj1[0] = 5;
-        obj1[1] = 6;
-        final short[] obj2 = new short[2];
-        obj2[0] = 5;
-        obj2[1] = 6;
-        final short[] obj3 = new short[3];
-        obj3[0] = 5;
-        obj3[1] = 6;
-        obj3[2] = 7;
-
-        assertTrue(new CompareToBuilder().append(obj1, obj1).toComparison() == 0);
-        assertTrue(new CompareToBuilder().append(obj1, obj2).toComparison() == 0);
-        assertTrue(new CompareToBuilder().append(obj1, obj3).toComparison() < 0);
-        assertTrue(new CompareToBuilder().append(obj3, obj1).toComparison() > 0);
-
-        obj1[1] = 7;
-        assertTrue(new CompareToBuilder().append(obj1, obj2).toComparison() > 0);
-        assertTrue(new CompareToBuilder().append(obj2, obj1).toComparison() < 0);
-
-        assertTrue(new CompareToBuilder().append(obj1, null).toComparison() > 0);
-        assertTrue(new CompareToBuilder().append((short[]) null, (short[]) null).toComparison() == 0);
-        assertTrue(new CompareToBuilder().append(null, obj1).toComparison() < 0);
-    }
-
-    @Test
-    public void testCharArray() {
-        final char[] obj1 = new char[2];
-        obj1[0] = 5;
-        obj1[1] = 6;
-        final char[] obj2 = new char[2];
-        obj2[0] = 5;
-        obj2[1] = 6;
-        final char[] obj3 = new char[3];
-        obj3[0] = 5;
-        obj3[1] = 6;
-        obj3[2] = 7;
-
-        assertTrue(new CompareToBuilder().append(obj1, obj1).toComparison() == 0);
-        assertTrue(new CompareToBuilder().append(obj1, obj2).toComparison() == 0);
-        assertTrue(new CompareToBuilder().append(obj1, obj3).toComparison() < 0);
-        assertTrue(new CompareToBuilder().append(obj3, obj1).toComparison() > 0);
-
-        obj1[1] = 7;
-        assertTrue(new CompareToBuilder().append(obj1, obj2).toComparison() > 0);
-        assertTrue(new CompareToBuilder().append(obj2, obj1).toComparison() < 0);
-
-        assertTrue(new CompareToBuilder().append(obj1, null).toComparison() > 0);
-        assertTrue(new CompareToBuilder().append((char[]) null, (char[]) null).toComparison() == 0);
-        assertTrue(new CompareToBuilder().append(null, obj1).toComparison() < 0);
-    }
-
-    @Test
-    public void testByteArray() {
-        final byte[] obj1 = new byte[2];
-        obj1[0] = 5;
-        obj1[1] = 6;
-        final byte[] obj2 = new byte[2];
-        obj2[0] = 5;
-        obj2[1] = 6;
-        final byte[] obj3 = new byte[3];
-        obj3[0] = 5;
-        obj3[1] = 6;
-        obj3[2] = 7;
-
-        assertTrue(new CompareToBuilder().append(obj1, obj1).toComparison() == 0);
-        assertTrue(new CompareToBuilder().append(obj1, obj2).toComparison() == 0);
-        assertTrue(new CompareToBuilder().append(obj1, obj3).toComparison() < 0);
-        assertTrue(new CompareToBuilder().append(obj3, obj1).toComparison() > 0);
-
-        obj1[1] = 7;
-        assertTrue(new CompareToBuilder().append(obj1, obj2).toComparison() > 0);
-        assertTrue(new CompareToBuilder().append(obj2, obj1).toComparison() < 0);
-
-        assertTrue(new CompareToBuilder().append(obj1, null).toComparison() > 0);
-        assertTrue(new CompareToBuilder().append((byte[]) null, (byte[]) null).toComparison() == 0);
-        assertTrue(new CompareToBuilder().append(null, obj1).toComparison() < 0);
-    }
-
-    @Test
-    public void testDoubleArray() {
-        final double[] obj1 = new double[2];
-        obj1[0] = 5;
-        obj1[1] = 6;
-        final double[] obj2 = new double[2];
-        obj2[0] = 5;
-        obj2[1] = 6;
-        final double[] obj3 = new double[3];
-        obj3[0] = 5;
-        obj3[1] = 6;
-        obj3[2] = 7;
-
-        assertTrue(new CompareToBuilder().append(obj1, obj1).toComparison() == 0);
-        assertTrue(new CompareToBuilder().append(obj1, obj2).toComparison() == 0);
-        assertTrue(new CompareToBuilder().append(obj1, obj3).toComparison() < 0);
-        assertTrue(new CompareToBuilder().append(obj3, obj1).toComparison() > 0);
-
-        obj1[1] = 7;
-        assertTrue(new CompareToBuilder().append(obj1, obj2).toComparison() > 0);
-        assertTrue(new CompareToBuilder().append(obj2, obj1).toComparison() < 0);
-
-        assertTrue(new CompareToBuilder().append(obj1, null).toComparison() > 0);
-        assertTrue(new CompareToBuilder().append((double[]) null, (double[]) null).toComparison() == 0);
-        assertTrue(new CompareToBuilder().append(null, obj1).toComparison() < 0);
-    }
-
-    @Test
-    public void testFloatArray() {
-        final float[] obj1 = new float[2];
-        obj1[0] = 5;
-        obj1[1] = 6;
-        final float[] obj2 = new float[2];
-        obj2[0] = 5;
-        obj2[1] = 6;
-        final float[] obj3 = new float[3];
-        obj3[0] = 5;
-        obj3[1] = 6;
-        obj3[2] = 7;
-
-        assertTrue(new CompareToBuilder().append(obj1, obj1).toComparison() == 0);
-        assertTrue(new CompareToBuilder().append(obj1, obj2).toComparison() == 0);
-        assertTrue(new CompareToBuilder().append(obj1, obj3).toComparison() < 0);
-        assertTrue(new CompareToBuilder().append(obj3, obj1).toComparison() > 0);
-
-        obj1[1] = 7;
-        assertTrue(new CompareToBuilder().append(obj1, obj2).toComparison() > 0);
-        assertTrue(new CompareToBuilder().append(obj2, obj1).toComparison() < 0);
-
-        assertTrue(new CompareToBuilder().append(obj1, null).toComparison() > 0);
-        assertTrue(new CompareToBuilder().append((float[]) null, (float[]) null).toComparison() == 0);
-        assertTrue(new CompareToBuilder().append(null, obj1).toComparison() < 0);
-    }
-
-    @Test
-    public void testBooleanArray() {
-        final boolean[] obj1 = new boolean[2];
-        obj1[0] = true;
-        obj1[1] = false;
-        final boolean[] obj2 = new boolean[2];
-        obj2[0] = true;
-        obj2[1] = false;
-        final boolean[] obj3 = new boolean[3];
-        obj3[0] = true;
-        obj3[1] = false;
-        obj3[2] = true;
-
-        assertTrue(new CompareToBuilder().append(obj1, obj1).toComparison() == 0);
-        assertTrue(new CompareToBuilder().append(obj1, obj2).toComparison() == 0);
-        assertTrue(new CompareToBuilder().append(obj1, obj3).toComparison() < 0);
-        assertTrue(new CompareToBuilder().append(obj3, obj1).toComparison() > 0);
-
-        obj1[1] = true;
-        assertTrue(new CompareToBuilder().append(obj1, obj2).toComparison() > 0);
-        assertTrue(new CompareToBuilder().append(obj2, obj1).toComparison() < 0);
-
-        assertTrue(new CompareToBuilder().append(obj1, null).toComparison() > 0);
-        assertTrue(new CompareToBuilder().append((boolean[]) null, (boolean[]) null).toComparison() == 0);
-        assertTrue(new CompareToBuilder().append(null, obj1).toComparison() < 0);
-    }
-
-    @Test
-    public void testMultiLongArray() {
-        final long[][] array1 = new long[2][2];
-        final long[][] array2 = new long[2][2];
-        final long[][] array3 = new long[2][3];
-        for (int i = 0; i < array1.length; ++i) {
-            for (int j = 0; j < array1[0].length; j++) {
-                array1[i][j] = (i + 1) * (j + 1);
-                array2[i][j] = (i + 1) * (j + 1);
-                array3[i][j] = (i + 1) * (j + 1);
-            }
-        }
-        array3[1][2] = 100;
-        array3[1][2] = 100;
-        
-        assertTrue(new CompareToBuilder().append(array1, array1).toComparison() == 0);
-        assertTrue(new CompareToBuilder().append(array1, array2).toComparison() == 0);
-        assertTrue(new CompareToBuilder().append(array1, array3).toComparison() < 0);
-        assertTrue(new CompareToBuilder().append(array3, array1).toComparison() > 0);
-        array1[1][1] = 200;
-        assertTrue(new CompareToBuilder().append(array1, array2).toComparison() > 0);
-        assertTrue(new CompareToBuilder().append(array2, array1).toComparison() < 0);
-    }
-
-    @Test
-    public void testMultiIntArray() {
-        final int[][] array1 = new int[2][2];
-        final int[][] array2 = new int[2][2];
-        final int[][] array3 = new int[2][3];
-        for (int i = 0; i < array1.length; ++i) {
-            for (int j = 0; j < array1[0].length; j++) {
-                array1[i][j] = (i + 1) * (j + 1);
-                array2[i][j] = (i + 1) * (j + 1);
-                array3[i][j] = (i + 1) * (j + 1);
-            }
-        }
-        array3[1][2] = 100;
-        array3[1][2] = 100;
-        
-        assertTrue(new CompareToBuilder().append(array1, array1).toComparison() == 0);
-        assertTrue(new CompareToBuilder().append(array1, array2).toComparison() == 0);
-        assertTrue(new CompareToBuilder().append(array1, array3).toComparison() < 0);
-        assertTrue(new CompareToBuilder().append(array3, array1).toComparison() > 0);
-        array1[1][1] = 200;
-        assertTrue(new CompareToBuilder().append(array1, array2).toComparison() > 0);
-        assertTrue(new CompareToBuilder().append(array2, array1).toComparison() < 0);
-    }
-
-    @Test
-    public void testMultiShortArray() {
-        final short[][] array1 = new short[2][2];
-        final short[][] array2 = new short[2][2];
-        final short[][] array3 = new short[2][3];
-        for (short i = 0; i < array1.length; ++i) {
-            for (short j = 0; j < array1[0].length; j++) {
-                array1[i][j] = (short)((i + 1) * (j + 1));
-                array2[i][j] = (short)((i + 1) * (j + 1));
-                array3[i][j] = (short)((i + 1) * (j + 1));
-            }
-        }
-        array3[1][2] = 100;
-        array3[1][2] = 100;
-        
-        assertTrue(new CompareToBuilder().append(array1, array1).toComparison() == 0);
-        assertTrue(new CompareToBuilder().append(array1, array2).toComparison() == 0);
-        assertTrue(new CompareToBuilder().append(array1, array3).toComparison() < 0);
-        assertTrue(new CompareToBuilder().append(array3, array1).toComparison() > 0);
-        array1[1][1] = 200;
-        assertTrue(new CompareToBuilder().append(array1, array2).toComparison() > 0);
-        assertTrue(new CompareToBuilder().append(array2, array1).toComparison() < 0);
-    }
-
-    @Test
-    public void testMultiCharArray() {
-        final char[][] array1 = new char[2][2];
-        final char[][] array2 = new char[2][2];
-        final char[][] array3 = new char[2][3];
-        for (short i = 0; i < array1.length; ++i) {
-            for (short j = 0; j < array1[0].length; j++) {
-                array1[i][j] = (char)((i + 1) * (j + 1));
-                array2[i][j] = (char)((i + 1) * (j + 1));
-                array3[i][j] = (char)((i + 1) * (j + 1));
-            }
-        }
-        array3[1][2] = 100;
-        array3[1][2] = 100;
-        
-        assertTrue(new CompareToBuilder().append(array1, array1).toComparison() == 0);
-        assertTrue(new CompareToBuilder().append(array1, array2).toComparison() == 0);
-        assertTrue(new CompareToBuilder().append(array1, array3).toComparison() < 0);
-        assertTrue(new CompareToBuilder().append(array3, array1).toComparison() > 0);
-        array1[1][1] = 200;
-        assertTrue(new CompareToBuilder().append(array1, array2).toComparison() > 0);
-        assertTrue(new CompareToBuilder().append(array2, array1).toComparison() < 0);
-    }
-
-    @Test
-    public void testMultiByteArray() {
-        final byte[][] array1 = new byte[2][2];
-        final byte[][] array2 = new byte[2][2];
-        final byte[][] array3 = new byte[2][3];
-        for (byte i = 0; i < array1.length; ++i) {
-            for (byte j = 0; j < array1[0].length; j++) {
-                array1[i][j] = (byte)((i + 1) * (j + 1));
-                array2[i][j] = (byte)((i + 1) * (j + 1));
-                array3[i][j] = (byte)((i + 1) * (j + 1));
-            }
-        }
-        array3[1][2] = 100;
-        array3[1][2] = 100;
-        
-        assertTrue(new CompareToBuilder().append(array1, array1).toComparison() == 0);
-        assertTrue(new CompareToBuilder().append(array1, array2).toComparison() == 0);
-        assertTrue(new CompareToBuilder().append(array1, array3).toComparison() < 0);
-        assertTrue(new CompareToBuilder().append(array3, array1).toComparison() > 0);
-        array1[1][1] = 127;
-        assertTrue(new CompareToBuilder().append(array1, array2).toComparison() > 0);
-        assertTrue(new CompareToBuilder().append(array2, array1).toComparison() < 0);
-    }
-    
-    @Test
-    public void testMultiFloatArray() {
-        final float[][] array1 = new float[2][2];
-        final float[][] array2 = new float[2][2];
-        final float[][] array3 = new float[2][3];
-        for (int i = 0; i < array1.length; ++i) {
-            for (int j = 0; j < array1[0].length; j++) {
-                array1[i][j] = (i + 1) * (j + 1);
-                array2[i][j] = (i + 1) * (j + 1);
-                array3[i][j] = (i + 1) * (j + 1);
-            }
-        }
-        array3[1][2] = 100;
-        array3[1][2] = 100;
-        
-        assertTrue(new CompareToBuilder().append(array1, array1).toComparison() == 0);
-        assertTrue(new CompareToBuilder().append(array1, array2).toComparison() == 0);
-        assertTrue(new CompareToBuilder().append(array1, array3).toComparison() < 0);
-        assertTrue(new CompareToBuilder().append(array3, array1).toComparison() > 0);
-        array1[1][1] = 127;
-        assertTrue(new CompareToBuilder().append(array1, array2).toComparison() > 0);
-        assertTrue(new CompareToBuilder().append(array2, array1).toComparison() < 0);
-    }
-
-    @Test
-    public void testMultiDoubleArray() {
-        final double[][] array1 = new double[2][2];
-        final double[][] array2 = new double[2][2];
-        final double[][] array3 = new double[2][3];
-        for (int i = 0; i < array1.length; ++i) {
-            for (int j = 0; j < array1[0].length; j++) {
-                array1[i][j] = (i + 1) * (j + 1);
-                array2[i][j] = (i + 1) * (j + 1);
-                array3[i][j] = (i + 1) * (j + 1);
-            }
-        }
-        array3[1][2] = 100;
-        array3[1][2] = 100;
-        
-        assertTrue(new CompareToBuilder().append(array1, array1).toComparison() == 0);
-        assertTrue(new CompareToBuilder().append(array1, array2).toComparison() == 0);
-        assertTrue(new CompareToBuilder().append(array1, array3).toComparison() < 0);
-        assertTrue(new CompareToBuilder().append(array3, array1).toComparison() > 0);
-        array1[1][1] = 127;
-        assertTrue(new CompareToBuilder().append(array1, array2).toComparison() > 0);
-        assertTrue(new CompareToBuilder().append(array2, array1).toComparison() < 0);
-    }
-
-    @Test
-    public void testMultiBooleanArray() {
-        final boolean[][] array1 = new boolean[2][2];
-        final boolean[][] array2 = new boolean[2][2];
-        final boolean[][] array3 = new boolean[2][3];
-        for (int i = 0; i < array1.length; ++i) {
-            for (int j = 0; j < array1[0].length; j++) {
-                array1[i][j] = i == 1 ^ j == 1;
-                array2[i][j] = i == 1 ^ j == 1;
-                array3[i][j] = i == 1 ^ j == 1;
-            }
-        }
-        array3[1][2] = false;
-        array3[1][2] = false;
-        
-        assertTrue(new CompareToBuilder().append(array1, array1).toComparison() == 0);
-        assertTrue(new CompareToBuilder().append(array1, array2).toComparison() == 0);
-        assertTrue(new CompareToBuilder().append(array1, array3).toComparison() < 0);
-        assertTrue(new CompareToBuilder().append(array3, array1).toComparison() > 0);
-        array1[1][1] = true;
-        assertTrue(new CompareToBuilder().append(array1, array2).toComparison() > 0);
-        assertTrue(new CompareToBuilder().append(array2, array1).toComparison() < 0);
-    }
-
-    @Test
-    public void testRaggedArray() {
-        final long array1[][] = new long[2][];
-        final long array2[][] = new long[2][];
-        final long array3[][] = new long[3][];
-        for (int i = 0; i < array1.length; ++i) {
-            array1[i] = new long[2];
-            array2[i] = new long[2];
-            array3[i] = new long[3];
-            for (int j = 0; j < array1[i].length; ++j) {
-                array1[i][j] = (i + 1) * (j + 1);
-                array2[i][j] = (i + 1) * (j + 1);
-                array3[i][j] = (i + 1) * (j + 1);
-            }
-        }
-        array3[1][2] = 100;
-        array3[1][2] = 100;
-        
-        
-        assertTrue(new CompareToBuilder().append(array1, array1).toComparison() == 0);
-        assertTrue(new CompareToBuilder().append(array1, array2).toComparison() == 0);
-        assertTrue(new CompareToBuilder().append(array1, array3).toComparison() < 0);
-        assertTrue(new CompareToBuilder().append(array3, array1).toComparison() > 0);
-        array1[1][1] = 200;
-        assertTrue(new CompareToBuilder().append(array1, array2).toComparison() > 0);
-        assertTrue(new CompareToBuilder().append(array2, array1).toComparison() < 0);
-    }
-
-    @Test
-    public void testMixedArray() {
-        final Object array1[] = new Object[2];
-        final Object array2[] = new Object[2];
-        final Object array3[] = new Object[2];
-        for (int i = 0; i < array1.length; ++i) {
-            array1[i] = new long[2];
-            array2[i] = new long[2];
-            array3[i] = new long[3];
-            for (int j = 0; j < 2; ++j) {
-                ((long[]) array1[i])[j] = (i + 1) * (j + 1);
-                ((long[]) array2[i])[j] = (i + 1) * (j + 1);
-                ((long[]) array3[i])[j] = (i + 1) * (j + 1);
-            }
-        }
-        ((long[]) array3[0])[2] = 1;
-        ((long[]) array3[1])[2] = 1;
-        assertTrue(new CompareToBuilder().append(array1, array1).toComparison() == 0);
-        assertTrue(new CompareToBuilder().append(array1, array2).toComparison() == 0);
-        assertTrue(new CompareToBuilder().append(array1, array3).toComparison() < 0);
-        assertTrue(new CompareToBuilder().append(array3, array1).toComparison() > 0);
-        ((long[]) array1[1])[1] = 200;
-        assertTrue(new CompareToBuilder().append(array1, array2).toComparison() > 0);
-        assertTrue(new CompareToBuilder().append(array2, array1).toComparison() < 0);
-    }
-
-    @Test
-    public void testObjectArrayHiddenByObject() {
-        final TestObject[] array1 = new TestObject[2];
-        array1[0] = new TestObject(4);
-        array1[1] = new TestObject(5);
-        final TestObject[] array2 = new TestObject[2];
-        array2[0] = new TestObject(4);
-        array2[1] = new TestObject(5);
-        final TestObject[] array3 = new TestObject[3];
-        array3[0] = new TestObject(4);
-        array3[1] = new TestObject(5);
-        array3[2] = new TestObject(6);
-        
-        final Object obj1 = array1;
-        final Object obj2 = array2;
-        final Object obj3 = array3;
-        
-        assertTrue(new CompareToBuilder().append(obj1, obj1).toComparison() == 0);
-        assertTrue(new CompareToBuilder().append(obj1, obj2).toComparison() == 0);
-        assertTrue(new CompareToBuilder().append(obj1, obj3).toComparison() < 0);
-        assertTrue(new CompareToBuilder().append(obj3, obj1).toComparison() > 0);
-
-        array1[1] = new TestObject(7);
-        assertTrue(new CompareToBuilder().append(obj1, obj2).toComparison() > 0);
-        assertTrue(new CompareToBuilder().append(obj2, obj1).toComparison() < 0);
-    }
-
-    @Test
-    public void testLongArrayHiddenByObject() {
-        final long[] array1 = new long[2];
-        array1[0] = 5L;
-        array1[1] = 6L;
-        final long[] array2 = new long[2];
-        array2[0] = 5L;
-        array2[1] = 6L;
-        final long[] array3 = new long[3];
-        array3[0] = 5L;
-        array3[1] = 6L;
-        array3[2] = 7L;
-        final Object obj1 = array1;
-        final Object obj2 = array2;
-        final Object obj3 = array3;
-        assertTrue(new CompareToBuilder().append(obj1, obj1).toComparison() == 0);
-        assertTrue(new CompareToBuilder().append(obj1, obj2).toComparison() == 0);
-        assertTrue(new CompareToBuilder().append(obj1, obj3).toComparison() < 0);
-        assertTrue(new CompareToBuilder().append(obj3, obj1).toComparison() > 0);
-
-        array1[1] = 7;
-        assertTrue(new CompareToBuilder().append(obj1, obj2).toComparison() > 0);
-        assertTrue(new CompareToBuilder().append(obj2, obj1).toComparison() < 0);
-    }
-
-    @Test
-    public void testIntArrayHiddenByObject() {
-        final int[] array1 = new int[2];
-        array1[0] = 5;
-        array1[1] = 6;
-        final int[] array2 = new int[2];
-        array2[0] = 5;
-        array2[1] = 6;
-        final int[] array3 = new int[3];
-        array3[0] = 5;
-        array3[1] = 6;
-        array3[2] = 7;
-        final Object obj1 = array1;
-        final Object obj2 = array2;
-        final Object obj3 = array3;
-        assertTrue(new CompareToBuilder().append(obj1, obj1).toComparison() == 0);
-        assertTrue(new CompareToBuilder().append(obj1, obj2).toComparison() == 0);
-        assertTrue(new CompareToBuilder().append(obj1, obj3).toComparison() < 0);
-        assertTrue(new CompareToBuilder().append(obj3, obj1).toComparison() > 0);
-
-        array1[1] = 7;
-        assertTrue(new CompareToBuilder().append(obj1, obj2).toComparison() > 0);
-        assertTrue(new CompareToBuilder().append(obj2, obj1).toComparison() < 0);
-    }
-
-    @Test
-    public void testShortArrayHiddenByObject() {
-        final short[] array1 = new short[2];
-        array1[0] = 5;
-        array1[1] = 6;
-        final short[] array2 = new short[2];
-        array2[0] = 5;
-        array2[1] = 6;
-        final short[] array3 = new short[3];
-        array3[0] = 5;
-        array3[1] = 6;
-        array3[2] = 7;
-        final Object obj1 = array1;
-        final Object obj2 = array2;
-        final Object obj3 = array3;
-        assertTrue(new CompareToBuilder().append(obj1, obj1).toComparison() == 0);
-        assertTrue(new CompareToBuilder().append(obj1, obj2).toComparison() == 0);
-        assertTrue(new CompareToBuilder().append(obj1, obj3).toComparison() < 0);
-        assertTrue(new CompareToBuilder().append(obj3, obj1).toComparison() > 0);
-
-        array1[1] = 7;
-        assertTrue(new CompareToBuilder().append(obj1, obj2).toComparison() > 0);
-        assertTrue(new CompareToBuilder().append(obj2, obj1).toComparison() < 0);
-    }
-
-    @Test
-    public void testCharArrayHiddenByObject() {
-        final char[] array1 = new char[2];
-        array1[0] = 5;
-        array1[1] = 6;
-        final char[] array2 = new char[2];
-        array2[0] = 5;
-        array2[1] = 6;
-        final char[] array3 = new char[3];
-        array3[0] = 5;
-        array3[1] = 6;
-        array3[2] = 7;
-        final Object obj1 = array1;
-        final Object obj2 = array2;
-        final Object obj3 = array3;
-        assertTrue(new CompareToBuilder().append(obj1, obj1).toComparison() == 0);
-        assertTrue(new CompareToBuilder().append(obj1, obj2).toComparison() == 0);
-        assertTrue(new CompareToBuilder().append(obj1, obj3).toComparison() < 0);
-        assertTrue(new CompareToBuilder().append(obj3, obj1).toComparison() > 0);
-
-        array1[1] = 7;
-        assertTrue(new CompareToBuilder().append(obj1, obj2).toComparison() > 0);
-        assertTrue(new CompareToBuilder().append(obj2, obj1).toComparison() < 0);
-    }
-
-    @Test
-    public void testByteArrayHiddenByObject() {
-        final byte[] array1 = new byte[2];
-        array1[0] = 5;
-        array1[1] = 6;
-        final byte[] array2 = new byte[2];
-        array2[0] = 5;
-        array2[1] = 6;
-        final byte[] array3 = new byte[3];
-        array3[0] = 5;
-        array3[1] = 6;
-        array3[2] = 7;
-        final Object obj1 = array1;
-        final Object obj2 = array2;
-        final Object obj3 = array3;
-        assertTrue(new CompareToBuilder().append(obj1, obj1).toComparison() == 0);
-        assertTrue(new CompareToBuilder().append(obj1, obj2).toComparison() == 0);
-        assertTrue(new CompareToBuilder().append(obj1, obj3).toComparison() < 0);
-        assertTrue(new CompareToBuilder().append(obj3, obj1).toComparison() > 0);
-
-        array1[1] = 7;
-        assertTrue(new CompareToBuilder().append(obj1, obj2).toComparison() > 0);
-        assertTrue(new CompareToBuilder().append(obj2, obj1).toComparison() < 0);
-    }
-
-    @Test
-    public void testDoubleArrayHiddenByObject() {
-        final double[] array1 = new double[2];
-        array1[0] = 5;
-        array1[1] = 6;
-        final double[] array2 = new double[2];
-        array2[0] = 5;
-        array2[1] = 6;
-        final double[] array3 = new double[3];
-        array3[0] = 5;
-        array3[1] = 6;
-        array3[2] = 7;
-        final Object obj1 = array1;
-        final Object obj2 = array2;
-        final Object obj3 = array3;
-        assertTrue(new CompareToBuilder().append(obj1, obj1).toComparison() == 0);
-        assertTrue(new CompareToBuilder().append(obj1, obj2).toComparison() == 0);
-        assertTrue(new CompareToBuilder().append(obj1, obj3).toComparison() < 0);
-        assertTrue(new CompareToBuilder().append(obj3, obj1).toComparison() > 0);
-
-        array1[1] = 7;
-        assertTrue(new CompareToBuilder().append(obj1, obj2).toComparison() > 0);
-        assertTrue(new CompareToBuilder().append(obj2, obj1).toComparison() < 0);
-    }
-
-    @Test
-    public void testFloatArrayHiddenByObject() {
-        final float[] array1 = new float[2];
-        array1[0] = 5;
-        array1[1] = 6;
-        final float[] array2 = new float[2];
-        array2[0] = 5;
-        array2[1] = 6;
-        final float[] array3 = new float[3];
-        array3[0] = 5;
-        array3[1] = 6;
-        array3[2] = 7;
-        final Object obj1 = array1;
-        final Object obj2 = array2;
-        final Object obj3 = array3;
-        assertTrue(new CompareToBuilder().append(obj1, obj1).toComparison() == 0);
-        assertTrue(new CompareToBuilder().append(obj1, obj2).toComparison() == 0);
-        assertTrue(new CompareToBuilder().append(obj1, obj3).toComparison() < 0);
-        assertTrue(new CompareToBuilder().append(obj3, obj1).toComparison() > 0);
-
-        array1[1] = 7;
-        assertTrue(new CompareToBuilder().append(obj1, obj2).toComparison() > 0);
-        assertTrue(new CompareToBuilder().append(obj2, obj1).toComparison() < 0);
-    }
-
-    @Test
-    public void testBooleanArrayHiddenByObject() {
-        final boolean[] array1 = new boolean[2];
-        array1[0] = true;
-        array1[1] = false;
-        final boolean[] array2 = new boolean[2];
-        array2[0] = true;
-        array2[1] = false;
-        final boolean[] array3 = new boolean[3];
-        array3[0] = true;
-        array3[1] = false;
-        array3[2] = true;
-        final Object obj1 = array1;
-        final Object obj2 = array2;
-        final Object obj3 = array3;
-        assertTrue(new CompareToBuilder().append(obj1, obj1).toComparison() == 0);
-        assertTrue(new CompareToBuilder().append(obj1, obj2).toComparison() == 0);
-        assertTrue(new CompareToBuilder().append(obj1, obj3).toComparison() < 0);
-        assertTrue(new CompareToBuilder().append(obj3, obj1).toComparison() > 0);
-
-        array1[1] = true;
-        assertTrue(new CompareToBuilder().append(obj1, obj2).toComparison() > 0);
-        assertTrue(new CompareToBuilder().append(obj2, obj1).toComparison() < 0);
-    }
-  
- }
diff --git a/lang/src/test/java/org/apache/commons/lang3/builder/DefaultToStringStyleTest.java b/lang/src/test/java/org/apache/commons/lang3/builder/DefaultToStringStyleTest.java
deleted file mode 100644
index e1511b7..0000000
--- a/lang/src/test/java/org/apache/commons/lang3/builder/DefaultToStringStyleTest.java
+++ /dev/null
@@ -1,131 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- * 
- *      http://www.apache.org/licenses/LICENSE-2.0
- * 
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.commons.lang3.builder;
-
-import static org.junit.Assert.assertEquals;
-
-import java.util.ArrayList;
-import java.util.HashMap;
-
-import org.apache.commons.lang3.builder.ToStringStyleTest.Person;
-import org.junit.After;
-import org.junit.Before;
-import org.junit.Test;
-
-/**
- * Unit tests {@link org.apache.commons.lang3.builder.DefaultToStringStyleTest}.
- *
- * @version $Id$
- */
-public class DefaultToStringStyleTest {
-
-    private final Integer base = Integer.valueOf(5);
-    private final String baseStr = base.getClass().getName() + "@" + Integer.toHexString(System.identityHashCode(base));
-    
-    @Before
-    public void setUp() throws Exception {
-        ToStringBuilder.setDefaultStyle(ToStringStyle.DEFAULT_STYLE);
-    }
-
-    @After
-    public void tearDown() throws Exception {
-        ToStringBuilder.setDefaultStyle(ToStringStyle.DEFAULT_STYLE);
-    }
-
-    //----------------------------------------------------------------
-    
-    @Test
-    public void testBlank() {
-        assertEquals(baseStr + "[]", new ToStringBuilder(base).toString());
-    }
-
-    @Test
-    public void testAppendSuper() {
-        assertEquals(baseStr + "[]", new ToStringBuilder(base).appendSuper("Integer@8888[]").toString());
-        assertEquals(baseStr + "[<null>]", new ToStringBuilder(base).appendSuper("Integer@8888[<null>]").toString());
-        
-        assertEquals(baseStr + "[a=hello]", new ToStringBuilder(base).appendSuper("Integer@8888[]").append("a", "hello").toString());
-        assertEquals(baseStr + "[<null>,a=hello]", new ToStringBuilder(base).appendSuper("Integer@8888[<null>]").append("a", "hello").toString());
-        assertEquals(baseStr + "[a=hello]", new ToStringBuilder(base).appendSuper(null).append("a", "hello").toString());
-    }
-    
-    @Test
-    public void testObject() {
-        final Integer i3 = Integer.valueOf(3);
-        final Integer i4 = Integer.valueOf(4);
-        assertEquals(baseStr + "[<null>]", new ToStringBuilder(base).append((Object) null).toString());
-        assertEquals(baseStr + "[3]", new ToStringBuilder(base).append(i3).toString());
-        assertEquals(baseStr + "[a=<null>]", new ToStringBuilder(base).append("a", (Object) null).toString());
-        assertEquals(baseStr + "[a=3]", new ToStringBuilder(base).append("a", i3).toString());
-        assertEquals(baseStr + "[a=3,b=4]", new ToStringBuilder(base).append("a", i3).append("b", i4).toString());
-        assertEquals(baseStr + "[a=<Integer>]", new ToStringBuilder(base).append("a", i3, false).toString());
-        assertEquals(baseStr + "[a=<size=0>]", new ToStringBuilder(base).append("a", new ArrayList<Object>(), false).toString());
-        assertEquals(baseStr + "[a=[]]", new ToStringBuilder(base).append("a", new ArrayList<Object>(), true).toString());
-        assertEquals(baseStr + "[a=<size=0>]", new ToStringBuilder(base).append("a", new HashMap<Object, Object>(), false).toString());
-        assertEquals(baseStr + "[a={}]", new ToStringBuilder(base).append("a", new HashMap<Object, Object>(), true).toString());
-        assertEquals(baseStr + "[a=<size=0>]", new ToStringBuilder(base).append("a", (Object) new String[0], false).toString());
-        assertEquals(baseStr + "[a={}]", new ToStringBuilder(base).append("a", (Object) new String[0], true).toString());
-    }
-
-    @Test
-    public void testPerson() {
-        final Person p = new Person();
-        p.name = "John Doe";
-        p.age = 33;
-        p.smoker = false;
-        final String pBaseStr = p.getClass().getName() + "@" + Integer.toHexString(System.identityHashCode(p));
-        assertEquals(pBaseStr + "[name=John Doe,age=33,smoker=false]", new ToStringBuilder(p).append("name", p.name).append("age", p.age).append("smoker", p.smoker).toString());
-    }
-
-    @Test
-    public void testLong() {
-        assertEquals(baseStr + "[3]", new ToStringBuilder(base).append(3L).toString());
-        assertEquals(baseStr + "[a=3]", new ToStringBuilder(base).append("a", 3L).toString());
-        assertEquals(baseStr + "[a=3,b=4]", new ToStringBuilder(base).append("a", 3L).append("b", 4L).toString());
-    }
-
-    @Test
-    public void testObjectArray() {
-        Object[] array = new Object[] {null, base, new int[] {3, 6}};
-        assertEquals(baseStr + "[{<null>,5,{3,6}}]", new ToStringBuilder(base).append(array).toString());
-        assertEquals(baseStr + "[{<null>,5,{3,6}}]", new ToStringBuilder(base).append((Object) array).toString());
-        array = null;
-        assertEquals(baseStr + "[<null>]", new ToStringBuilder(base).append(array).toString());
-        assertEquals(baseStr + "[<null>]", new ToStringBuilder(base).append((Object) array).toString());
-    }
-
-    @Test
-    public void testLongArray() {
-        long[] array = new long[] {1, 2, -3, 4};
-        assertEquals(baseStr + "[{1,2,-3,4}]", new ToStringBuilder(base).append(array).toString());
-        assertEquals(baseStr + "[{1,2,-3,4}]", new ToStringBuilder(base).append((Object) array).toString());
-        array = null;
-        assertEquals(baseStr + "[<null>]", new ToStringBuilder(base).append(array).toString());
-        assertEquals(baseStr + "[<null>]", new ToStringBuilder(base).append((Object) array).toString());
-    }
-
-    @Test
-    public void testLongArrayArray() {
-        long[][] array = new long[][] {{1, 2}, null, {5}};
-        assertEquals(baseStr + "[{{1,2},<null>,{5}}]", new ToStringBuilder(base).append(array).toString());
-        assertEquals(baseStr + "[{{1,2},<null>,{5}}]", new ToStringBuilder(base).append((Object) array).toString());
-        array = null;
-        assertEquals(baseStr + "[<null>]", new ToStringBuilder(base).append(array).toString());
-        assertEquals(baseStr + "[<null>]", new ToStringBuilder(base).append((Object) array).toString());
-    }
-
-}
diff --git a/lang/src/test/java/org/apache/commons/lang3/builder/DiffBuilderTest.java b/lang/src/test/java/org/apache/commons/lang3/builder/DiffBuilderTest.java
deleted file mode 100644
index 9d7c397..0000000
--- a/lang/src/test/java/org/apache/commons/lang3/builder/DiffBuilderTest.java
+++ /dev/null
@@ -1,498 +0,0 @@
-/**
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.commons.lang3.builder;
-
-import static org.hamcrest.core.IsEqual.equalTo;
-import static org.junit.Assert.assertArrayEquals;
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertFalse;
-import static org.junit.Assert.assertThat;
-import static org.junit.Assert.assertTrue;
-
-import org.apache.commons.lang3.ArrayUtils;
-import org.hamcrest.Matcher;
-import org.junit.Test;
-
-
-/**
- * Unit tests {@link DiffBuilder}.
- *
- * @version $Id$
- */
-public class DiffBuilderTest {
-    
-    private static final ToStringStyle SHORT_STYLE = ToStringStyle.SHORT_PREFIX_STYLE;
-
-    private static class TypeTestClass implements Diffable<TypeTestClass> {
-        private ToStringStyle style = SHORT_STYLE;
-        private boolean booleanField = true;
-        private boolean[] booleanArrayField = {true};
-        private byte byteField = (byte) 0xFF;
-        private byte[] byteArrayField = {(byte) 0xFF};
-        private char charField = 'a';
-        private char[] charArrayField = {'a'};
-        private double doubleField = 1.0;
-        private double[] doubleArrayField = {1.0};
-        private float floatField = 1.0f;
-        private float[] floatArrayField = {1.0f};
-        private int intField = 1;
-        private int[] intArrayField = {1};
-        private long longField = 1L;
-        private long[] longArrayField = {1L};
-        private short shortField = 1;
-        private short[] shortArrayField = {1};
-        private Object objectField = null;
-        private Object[] objectArrayField = {null};
-
-        @Override
-        public DiffResult diff(final TypeTestClass obj) {
-            return new DiffBuilder(this, obj, style)
-                .append("boolean", booleanField, obj.booleanField)
-                .append("booleanArray", booleanArrayField, obj.booleanArrayField)
-                .append("byte", byteField, obj.byteField)
-                .append("byteArray", byteArrayField, obj.byteArrayField)
-                .append("char", charField, obj.charField)
-                .append("charArray", charArrayField, obj.charArrayField)
-                .append("double", doubleField, obj.doubleField)
-                .append("doubleArray", doubleArrayField, obj.doubleArrayField)
-                .append("float", floatField, obj.floatField)
-                .append("floatArray", floatArrayField, obj.floatArrayField)
-                .append("int", intField, obj.intField)
-                .append("intArray", intArrayField, obj.intArrayField)
-                .append("long", longField, obj.longField)
-                .append("longArray", longArrayField, obj.longArrayField)
-                .append("short", shortField, obj.shortField)
-                .append("shortArray", shortArrayField, obj.shortArrayField)
-                .append("objectField", objectField, obj.objectField)
-                .append("objectArrayField", objectArrayField, obj.objectArrayField)
-                .build();
-        }        
-
-        @Override
-        public int hashCode() {
-            return HashCodeBuilder.reflectionHashCode(this, false);
-        }
-        
-        @Override
-        public boolean equals(final Object obj) {
-            return EqualsBuilder.reflectionEquals(this, obj, false);
-        }
-    }
-    
-    
-    @Test
-    public void testBoolean() {
-        final TypeTestClass class1 = new TypeTestClass();
-        final TypeTestClass class2 = new TypeTestClass();
-        class2.booleanField = false;
-        final DiffResult list = class1.diff(class2);
-        assertEquals(1, list.getNumberOfDiffs());
-        final Diff<?> diff = list.getDiffs().get(0);
-        assertEquals(Boolean.class, diff.getType());
-        assertEquals(Boolean.TRUE, diff.getLeft());
-        assertEquals(Boolean.FALSE, diff.getRight());        
-    }
-
-    @Test
-    public void testBooleanArray() throws Exception {
-        final TypeTestClass class1 = new TypeTestClass();
-        final TypeTestClass class2 = new TypeTestClass();
-        class2.booleanArrayField = new boolean[] {false, false};
-        final DiffResult list = class1.diff(class2);
-        assertEquals(1, list.getNumberOfDiffs());
-        final Diff<?> diff = list.getDiffs().get(0);
-        assertArrayEquals(ArrayUtils.toObject(class1.booleanArrayField), 
-                (Object[]) diff.getLeft());
-        assertArrayEquals(ArrayUtils.toObject(class2.booleanArrayField), 
-                (Object[]) diff.getRight());
-    }
-
-    
-    @Test
-    public void testByte() {
-        final TypeTestClass class1 = new TypeTestClass();
-        final TypeTestClass class2 = new TypeTestClass();
-        class2.byteField = 0x01;
-        final DiffResult list = class1.diff(class2);
-        assertEquals(1, list.getNumberOfDiffs());
-        final Diff<?> diff = list.getDiffs().get(0);
-        assertEquals(Byte.valueOf(class1.byteField), diff.getLeft());
-        assertEquals(Byte.valueOf(class2.byteField), diff.getRight());        
-    }
-    
-    @Test
-    public void testByteArray() throws Exception {
-        final TypeTestClass class1 = new TypeTestClass();
-        final TypeTestClass class2 = new TypeTestClass();
-        class2.byteArrayField= new byte[] {0x01, 0x02};
-        final DiffResult list = class1.diff(class2);
-        assertEquals(1, list.getNumberOfDiffs());
-        final Diff<?> diff = list.getDiffs().get(0);
-        assertArrayEquals(ArrayUtils.toObject(class1.byteArrayField), 
-                (Object[]) diff.getLeft());
-        assertArrayEquals(ArrayUtils.toObject(class2.byteArrayField), 
-                (Object[]) diff.getRight());
-    }
-
-    @Test
-    public void testChar() {
-        final TypeTestClass class1 = new TypeTestClass();
-        final TypeTestClass class2 = new TypeTestClass();
-        class2.charField = 'z';
-        final DiffResult list = class1.diff(class2);
-        assertEquals(1, list.getNumberOfDiffs());
-        final Diff<?> diff = list.getDiffs().get(0);
-        assertEquals(Character.valueOf(class1.charField), diff.getLeft());
-        assertEquals(Character.valueOf(class2.charField), diff.getRight());
-    }
-    
-    
-    @Test
-    public void testCharArray() throws Exception {
-        final TypeTestClass class1 = new TypeTestClass();
-        final TypeTestClass class2 = new TypeTestClass();
-        class2.charArrayField = new char[] {'f', 'o', 'o'};
-        final DiffResult list = class1.diff(class2);
-        assertEquals(1, list.getNumberOfDiffs());
-        final Diff<?> diff = list.getDiffs().get(0);
-        assertArrayEquals(ArrayUtils.toObject(class1.charArrayField), 
-                (Object[]) diff.getLeft());
-        assertArrayEquals(ArrayUtils.toObject(class2.charArrayField), 
-                (Object[]) diff.getRight());
-    }
-    
-    
-    @Test
-    public void testDouble() {
-        final TypeTestClass class1 = new TypeTestClass();
-        final TypeTestClass class2 = new TypeTestClass();
-        class2.doubleField = 99.99;
-        final DiffResult list = class1.diff(class2);
-        assertEquals(1, list.getNumberOfDiffs());
-        final Diff<?> diff = list.getDiffs().get(0);
-        assertEquals(Double.valueOf(class1.doubleField), diff.getLeft());
-        assertEquals(Double.valueOf(class2.doubleField), diff.getRight());
-    }    
-
-    
-    @Test
-    public void testDoubleArray() throws Exception {
-        final TypeTestClass class1 = new TypeTestClass();
-        final TypeTestClass class2 = new TypeTestClass();
-        class2.doubleArrayField = new double[] {3.0, 2.9, 2.8};
-        final DiffResult list = class1.diff(class2);
-        assertEquals(1, list.getNumberOfDiffs());
-        final Diff<?> diff = list.getDiffs().get(0);
-        assertArrayEquals(ArrayUtils.toObject(class1.doubleArrayField), 
-                (Object[]) diff.getLeft());
-        assertArrayEquals(ArrayUtils.toObject(class2.doubleArrayField), 
-                (Object[]) diff.getRight());
-    }
-    
-    @Test
-    public void testFloat() {
-        final TypeTestClass class1 = new TypeTestClass();
-        final TypeTestClass class2 = new TypeTestClass();
-        class2.floatField = 99.99F;
-        final DiffResult list = class1.diff(class2);
-        assertEquals(1, list.getNumberOfDiffs());
-        final Diff<?> diff = list.getDiffs().get(0);
-        assertEquals(Float.valueOf(class1.floatField), diff.getLeft());
-        assertEquals(Float.valueOf(class2.floatField), diff.getRight());
-    }    
-
-    
-    @Test
-    public void testFloatArray() throws Exception {
-        final TypeTestClass class1 = new TypeTestClass();
-        final TypeTestClass class2 = new TypeTestClass();
-        class2.floatArrayField = new float[] {3.0F, 2.9F, 2.8F};
-        final DiffResult list = class1.diff(class2);
-        assertEquals(1, list.getNumberOfDiffs());
-        final Diff<?> diff = list.getDiffs().get(0);
-        assertArrayEquals(ArrayUtils.toObject(class1.floatArrayField), 
-                (Object[]) diff.getLeft());
-        assertArrayEquals(ArrayUtils.toObject(class2.floatArrayField), 
-                (Object[]) diff.getRight());
-    }    
-    
-    
-    @Test
-    public void testInt() {
-        final TypeTestClass class1 = new TypeTestClass();
-        final TypeTestClass class2 = new TypeTestClass();
-        class2.intField = 42;
-        final DiffResult list = class1.diff(class2);
-        assertEquals(1, list.getNumberOfDiffs());
-        final Diff<?> diff = list.getDiffs().get(0);
-        assertEquals(Integer.valueOf(class1.intField), diff.getLeft());
-        assertEquals(Integer.valueOf(class2.intField), diff.getRight());
-    }    
-
-    
-    @Test
-    public void testIntArray() throws Exception {
-        final TypeTestClass class1 = new TypeTestClass();
-        final TypeTestClass class2 = new TypeTestClass();
-        class2.intArrayField = new int[] {3, 2, 1};
-        final DiffResult list = class1.diff(class2);
-        assertEquals(1, list.getNumberOfDiffs());
-        final Diff<?> diff = list.getDiffs().get(0);
-        assertArrayEquals(ArrayUtils.toObject(class1.intArrayField), 
-                (Object[]) diff.getLeft());
-        assertArrayEquals(ArrayUtils.toObject(class2.intArrayField), 
-                (Object[]) diff.getRight());
-    }
-    
-    @Test
-    public void testLong() {
-        final TypeTestClass class1 = new TypeTestClass();
-        final TypeTestClass class2 = new TypeTestClass();
-        class2.longField = 42L;
-        final DiffResult list = class1.diff(class2);
-        assertEquals(1, list.getNumberOfDiffs());
-        final Diff<?> diff = list.getDiffs().get(0);
-        assertEquals(Long.valueOf(class1.longField), diff.getLeft());
-        assertEquals(Long.valueOf(class2.longField), diff.getRight());
-    }    
-
-    
-    @Test
-    public void testLongArray() throws Exception {
-        final TypeTestClass class1 = new TypeTestClass();
-        final TypeTestClass class2 = new TypeTestClass();
-        class2.longArrayField = new long[] {3L, 2L, 1L};
-        final DiffResult list = class1.diff(class2);
-        assertEquals(1, list.getNumberOfDiffs());
-        final Diff<?> diff = list.getDiffs().get(0);
-        assertArrayEquals(ArrayUtils.toObject(class1.longArrayField), 
-                (Object[]) diff.getLeft());
-        assertArrayEquals(ArrayUtils.toObject(class2.longArrayField), 
-                (Object[]) diff.getRight());
-    }
-    
-    @Test
-    public void testShort() {
-        final TypeTestClass class1 = new TypeTestClass();
-        final TypeTestClass class2 = new TypeTestClass();
-        class2.shortField = 42;
-        final DiffResult list = class1.diff(class2);
-        assertEquals(1, list.getNumberOfDiffs());
-        final Diff<?> diff = list.getDiffs().get(0);
-        assertEquals(Short.valueOf(class1.shortField), diff.getLeft());
-        assertEquals(Short.valueOf(class2.shortField), diff.getRight());
-    }    
-
-    
-    @Test
-    public void testShortArray() throws Exception {
-        final TypeTestClass class1 = new TypeTestClass();
-        final TypeTestClass class2 = new TypeTestClass();
-        class2.shortArrayField = new short[] {3, 2, 1};
-        final DiffResult list = class1.diff(class2);
-        assertEquals(1, list.getNumberOfDiffs());
-        final Diff<?> diff = list.getDiffs().get(0);
-        assertArrayEquals(ArrayUtils.toObject(class1.shortArrayField), 
-                (Object[]) diff.getLeft());
-        assertArrayEquals(ArrayUtils.toObject(class2.shortArrayField), 
-                (Object[]) diff.getRight());
-    }
-    
-    @Test
-    public void testObject() throws Exception {        
-        final TypeTestClass class1 = new TypeTestClass();
-        final TypeTestClass class2 = new TypeTestClass();
-        class2.objectField = "Some string";
-        final DiffResult list = class1.diff(class2);
-        assertEquals(1, list.getNumberOfDiffs());
-        final Diff<?> diff = list.getDiffs().get(0);
-        assertEquals(class1.objectField, diff.getLeft());
-        assertEquals(class2.objectField, diff.getRight());                
-    }
-
-    /** 
-     * Test that "left" and "right" are the same instance and are equal. 
-     */
-    @Test
-    public void testObjectsSameAndEqual() throws Exception {
-        final Integer sameObject = 1;
-        final TypeTestClass left = new TypeTestClass();
-        left.objectField = sameObject;
-        final TypeTestClass right = new TypeTestClass();
-        right.objectField = sameObject;
-        assertTrue(left.objectField == right.objectField);
-        assertTrue(left.objectField.equals(right.objectField));
-
-        final DiffResult list = left.diff(right);
-        assertEquals(0, list.getNumberOfDiffs());
-    }
-
-    /** 
-     * Test that "left" and "right" are the same instance but are equal. 
-     */
-    @Test
-    public void testObjectsNotSameButEqual() throws Exception {
-        final TypeTestClass left = new TypeTestClass();
-        left.objectField = new Integer(1);
-        final TypeTestClass right = new TypeTestClass();
-        right.objectField = new Integer(1);
-        assertFalse(left.objectField == right.objectField);
-        assertTrue(left.objectField.equals(right.objectField));
-
-        final DiffResult list = left.diff(right);
-        assertEquals(0, list.getNumberOfDiffs());
-    }
-
-    /** 
-     * Test that "left" and "right" are not the same instance and are not equal. 
-     */
-    @Test
-    public void testObjectsNotSameNorEqual() throws Exception {
-        final TypeTestClass left = new TypeTestClass();
-        left.objectField = 4;
-        final TypeTestClass right = new TypeTestClass();
-        right.objectField = 100;
-        assertFalse(left.objectField == right.objectField);
-        assertFalse(left.objectField.equals(right.objectField));
-
-        final DiffResult list = left.diff(right);
-        assertEquals(1, list.getNumberOfDiffs());
-    }
-
-    @Test
-    public void testObjectArray() throws Exception {
-        final TypeTestClass class1 = new TypeTestClass();
-        final TypeTestClass class2 = new TypeTestClass();
-        class2.objectArrayField = new Object[] {"string", 1, 2};
-        final DiffResult list = class1.diff(class2);
-        assertEquals(1, list.getNumberOfDiffs());
-        final Diff<?> diff = list.getDiffs().get(0);
-        assertArrayEquals(class1.objectArrayField, (Object[]) diff.getLeft());
-        assertArrayEquals(class2.objectArrayField, (Object[]) diff.getRight());
-    }   
-    
-    @Test
-    public void testObjectArrayEqual() throws Exception {
-        final TypeTestClass class1 = new TypeTestClass();
-        final TypeTestClass class2 = new TypeTestClass();
-        class1.objectArrayField = new Object[] {"string", 1, 2};
-        class2.objectArrayField = new Object[] {"string", 1, 2};
-        final DiffResult list = class1.diff(class2);
-        assertEquals(0, list.getNumberOfDiffs());
-    }  
-    
-    
-    @Test
-    public void testByteArrayEqualAsObject() throws Exception {
-        final DiffResult list = new DiffBuilder("String1", "String2", SHORT_STYLE)
-            .append("foo", (Object) new boolean[] {false}, (Object) new boolean[] {false})
-            .append("foo", (Object) new byte[] {0x01}, (Object) new byte[] {0x01})
-            .append("foo", (Object) new char[] {'a'}, (Object) new char[] {'a'})
-            .append("foo", (Object) new double[] {1.0}, (Object) new double[] {1.0})
-            .append("foo", (Object) new float[] {1.0F}, (Object) new float[] {1.0F})
-            .append("foo", (Object) new int[] {1}, (Object) new int[] {1})
-            .append("foo", (Object) new long[] {1L}, (Object) new long[] {1L})
-            .append("foo", (Object) new short[] {1}, (Object) new short[] {1})
-            .append("foo", (Object) new Object[] {1, "two"}, (Object) new Object[] {1, "two"})
-            .build();
-
-        assertEquals(0, list.getNumberOfDiffs());
-    }
-    
-
-    @Test(expected=IllegalArgumentException.class)
-    public void testNullLhs() {      
-        new DiffBuilder(null, this, ToStringStyle.DEFAULT_STYLE);
-    }
-    
-
-    @Test(expected=IllegalArgumentException.class)
-    public void testNullRhs() {      
-        new DiffBuilder(this, null, ToStringStyle.DEFAULT_STYLE);
-    }   
-    
-    @Test
-    public void testSameObjectIgnoresAppends() {
-        final TypeTestClass testClass = new TypeTestClass();        
-        final DiffResult list = new DiffBuilder(testClass, testClass, SHORT_STYLE)
-            .append("ignored", false, true)
-            .build();
-        assertEquals(0, list.getNumberOfDiffs());
-    }
-    
-    @Test
-    public void testSimilarObjectIgnoresAppends() {
-        final TypeTestClass testClass1 = new TypeTestClass();
-        final TypeTestClass testClass2 = new TypeTestClass();
-        final DiffResult list = new DiffBuilder(testClass1, testClass2, SHORT_STYLE)
-            .append("ignored", false, true)
-            .build();
-        assertEquals(0, list.getNumberOfDiffs());
-    }
-    
-    
-    @Test
-    public void testStylePassedToDiffResult() {
-        final TypeTestClass class1 = new TypeTestClass();
-        DiffResult list = class1.diff(class1);
-        assertEquals(SHORT_STYLE, list.getToStringStyle());
-        
-        class1.style = ToStringStyle.MULTI_LINE_STYLE;
-        list = class1.diff(class1);
-        assertEquals(ToStringStyle.MULTI_LINE_STYLE, list.getToStringStyle());
-    }
-
-    @Test
-    public void testTriviallyEqualTestDisabled() {
-        final Matcher<Integer> equalToOne = equalTo(1);
-
-        // Constructor's arguments are not trivially equal, but not testing for that.
-        DiffBuilder explicitTestAndNotEqual1 = new DiffBuilder(1, 2, null, false);
-        explicitTestAndNotEqual1.append("letter", "X", "Y");
-        assertThat(explicitTestAndNotEqual1.build().getNumberOfDiffs(), equalToOne);
-
-        // Constructor's arguments are trivially equal, but not testing for that.
-        DiffBuilder explicitTestAndNotEqual2 = new DiffBuilder(1, 1, null, false);
-        // This append(f, l, r) will not abort early.
-        explicitTestAndNotEqual2.append("letter", "X", "Y");
-        assertThat(explicitTestAndNotEqual2.build().getNumberOfDiffs(), equalToOne);
-    }
-
-    @Test
-    public void testTriviallyEqualTestEnabled() {
-        final Matcher<Integer> equalToZero = equalTo(0);
-        final Matcher<Integer> equalToOne = equalTo(1);
-
-        // The option to test if trivially equal is enabled by default.
-        DiffBuilder implicitTestAndEqual = new DiffBuilder(1, 1, null);
-        // This append(f, l, r) will abort without creating a Diff for letter.
-        implicitTestAndEqual.append("letter", "X", "Y");
-        assertThat(implicitTestAndEqual.build().getNumberOfDiffs(), equalToZero);
-
-        DiffBuilder implicitTestAndNotEqual = new DiffBuilder(1, 2, null);
-        // This append(f, l, r) will not abort early
-        // because the constructor's arguments were not trivially equal.
-        implicitTestAndNotEqual.append("letter", "X", "Y");
-        assertThat(implicitTestAndNotEqual.build().getNumberOfDiffs(), equalToOne);
-
-        // This is explicitly enabling the trivially equal test.
-        DiffBuilder explicitTestAndEqual = new DiffBuilder(1, 1, null, true);
-        explicitTestAndEqual.append("letter", "X", "Y");
-        assertThat(explicitTestAndEqual.build().getNumberOfDiffs(), equalToZero);
-    }
-
-}
diff --git a/lang/src/test/java/org/apache/commons/lang3/builder/DiffResultTest.java b/lang/src/test/java/org/apache/commons/lang3/builder/DiffResultTest.java
deleted file mode 100644
index a5f42ff..0000000
--- a/lang/src/test/java/org/apache/commons/lang3/builder/DiffResultTest.java
+++ /dev/null
@@ -1,149 +0,0 @@
-/**
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.commons.lang3.builder;
-
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertTrue;
-
-import java.util.Iterator;
-import java.util.List;
-
-import org.junit.Test;
-
-/**
- * Unit tests {@link DiffResult}.
- *
- * @version $Id$
- */
-public class DiffResultTest {
-
-    private static final SimpleClass SIMPLE_FALSE = new SimpleClass(false);
-    private static final SimpleClass SIMPLE_TRUE = new SimpleClass(true);
-    private static final ToStringStyle SHORT_STYLE = ToStringStyle.SHORT_PREFIX_STYLE;
-
-    private static class SimpleClass implements Diffable<SimpleClass> {
-        private final boolean booleanField;
-
-        public SimpleClass(final boolean booleanField) {
-            this.booleanField = booleanField;
-        }
-
-        public static String getFieldName() {
-            return "booleanField";
-        }
-
-        @Override
-        public DiffResult diff(final SimpleClass obj) {
-            return new DiffBuilder(this, obj, ToStringStyle.SHORT_PREFIX_STYLE)
-                    .append(getFieldName(), booleanField, obj.booleanField)
-                    .build();
-        }
-    }
-
-    private static class EmptyClass {
-    }
-
-    @Test(expected = UnsupportedOperationException.class)
-    public void testListIsNonModifiable() {
-        final SimpleClass lhs = new SimpleClass(true);
-        final SimpleClass rhs = new SimpleClass(false);
-
-        final List<Diff<?>> diffs = lhs.diff(rhs).getDiffs();
-
-        final DiffResult list = new DiffResult(lhs, rhs, diffs, SHORT_STYLE);
-        assertEquals(diffs, list.getDiffs());
-        assertEquals(1, list.getNumberOfDiffs());
-        list.getDiffs().remove(0);
-    }
-
-    @Test
-    public void testIterator() {
-        final SimpleClass lhs = new SimpleClass(true);
-        final SimpleClass rhs = new SimpleClass(false);
-
-        final List<Diff<?>> diffs = lhs.diff(rhs).getDiffs();
-        final Iterator<Diff<?>> expectedIterator = diffs.iterator();
-
-        final DiffResult list = new DiffResult(lhs, rhs, diffs, SHORT_STYLE);
-        final Iterator<Diff<?>> iterator = list.iterator();
-
-        while (iterator.hasNext()) {
-            assertTrue(expectedIterator.hasNext());
-            assertEquals(expectedIterator.next(), iterator.next());
-        }
-    }
-
-    @Test
-    public void testToStringOutput() {
-        final DiffResult list = new DiffBuilder(new EmptyClass(), new EmptyClass(),
-                ToStringStyle.SHORT_PREFIX_STYLE).append("test", false, true)
-                .build();
-        assertEquals(
-                "DiffResultTest.EmptyClass[test=false] differs from DiffResultTest.EmptyClass[test=true]",
-                list.toString());
-    }
-
-    @Test
-    public void testToStringSpecifyStyleOutput() {
-        final DiffResult list = SIMPLE_FALSE.diff(SIMPLE_TRUE);
-        assertTrue(list.getToStringStyle().equals(SHORT_STYLE));
-
-        final String lhsString = new ToStringBuilder(SIMPLE_FALSE,
-                ToStringStyle.MULTI_LINE_STYLE).append(
-                SimpleClass.getFieldName(), SIMPLE_FALSE.booleanField).build();
-
-        final String rhsString = new ToStringBuilder(SIMPLE_TRUE,
-                ToStringStyle.MULTI_LINE_STYLE).append(
-                SimpleClass.getFieldName(), SIMPLE_TRUE.booleanField).build();
-
-        final String expectedOutput = String.format("%s differs from %s", lhsString,
-                rhsString);
-        assertEquals(expectedOutput,
-                list.toString(ToStringStyle.MULTI_LINE_STYLE));
-    }
-
-    @Test(expected = IllegalArgumentException.class)
-    public void testNullLhs() {
-        new DiffResult(null, SIMPLE_FALSE, SIMPLE_TRUE.diff(SIMPLE_FALSE)
-                .getDiffs(), SHORT_STYLE);
-    }
-
-    @Test(expected = IllegalArgumentException.class)
-    public void testNullRhs() {
-        new DiffResult(SIMPLE_TRUE, null, SIMPLE_TRUE.diff(SIMPLE_FALSE)
-                .getDiffs(), SHORT_STYLE);
-    }
-
-    @Test(expected = IllegalArgumentException.class)
-    public void testNullList() {
-        new DiffResult(SIMPLE_TRUE, SIMPLE_FALSE, null, SHORT_STYLE);
-    }
-
-    @Test
-    public void testNullStyle() {
-        final DiffResult diffResult = new DiffResult(SIMPLE_TRUE, SIMPLE_FALSE, SIMPLE_TRUE
-                .diff(SIMPLE_FALSE).getDiffs(), null);
-        assertEquals(ToStringStyle.DEFAULT_STYLE, diffResult.getToStringStyle());
-    }
-
-    @Test
-    public void testNoDifferencesString() {
-        final DiffResult diffResult = new DiffBuilder(SIMPLE_TRUE, SIMPLE_TRUE,
-                SHORT_STYLE).build();
-        assertEquals(DiffResult.OBJECTS_SAME_STRING, diffResult.toString());
-    }
-}
diff --git a/lang/src/test/java/org/apache/commons/lang3/builder/DiffTest.java b/lang/src/test/java/org/apache/commons/lang3/builder/DiffTest.java
deleted file mode 100644
index 4ae8ff2..0000000
--- a/lang/src/test/java/org/apache/commons/lang3/builder/DiffTest.java
+++ /dev/null
@@ -1,72 +0,0 @@
-/**
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.commons.lang3.builder;
-
-import static org.junit.Assert.assertEquals;
-
-import org.junit.Test;
-
-
-/**
- * Unit tests {@link Diff}.
- *
- * @version $Id$
- */
-public class DiffTest {
-
-    private static final String FIELD_NAME = "field";
-    private static final Diff<Boolean> booleanDiff = new BooleanDiff(FIELD_NAME);
-    
-    private static class BooleanDiff extends Diff<Boolean> {        
-        private static final long serialVersionUID = 1L;
-
-        protected BooleanDiff(final String fieldName) {
-            super(fieldName);        
-        }
-
-        @Override
-        public Boolean getLeft() {
-            return Boolean.TRUE;
-        }
-
-        @Override
-        public Boolean getRight() {
-            return Boolean.FALSE;
-        }        
-    }
-    
-    @Test(expected = UnsupportedOperationException.class)
-    public void testCannotModify() {
-        booleanDiff.setValue(Boolean.FALSE);
-    }
-    
-    @Test
-    public void testGetFieldName() {
-        assertEquals(FIELD_NAME, booleanDiff.getFieldName());
-    }
-    
-    @Test
-    public void testGetType() {
-        assertEquals(Boolean.class, booleanDiff.getType());
-    }
-    
-    @Test
-    public void testToString() {
-        assertEquals(String.format("[%s: %s, %s]", FIELD_NAME, booleanDiff.getLeft(), 
-                booleanDiff.getRight()), booleanDiff.toString());
-    }
-}
diff --git a/lang/src/test/java/org/apache/commons/lang3/builder/EqualsBuilderTest.java b/lang/src/test/java/org/apache/commons/lang3/builder/EqualsBuilderTest.java
deleted file mode 100644
index 30e2e22..0000000
--- a/lang/src/test/java/org/apache/commons/lang3/builder/EqualsBuilderTest.java
+++ /dev/null
@@ -1,1154 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- * 
- *      http://www.apache.org/licenses/LICENSE-2.0
- * 
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.commons.lang3.builder;
-
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertFalse;
-import static org.junit.Assert.assertNull;
-import static org.junit.Assert.assertTrue;
-
-import java.util.Arrays;
-
-import org.junit.Test;
-
-/**
- * Unit tests {@link org.apache.commons.lang3.builder.EqualsBuilder}.
- *
- * @version $Id$
- */
-public class EqualsBuilderTest {
-
-    //-----------------------------------------------------------------------
-
-    static class TestObject {
-        private int a;
-        public TestObject() {
-        }
-        public TestObject(final int a) {
-            this.a = a;
-        }
-        @Override
-        public boolean equals(final Object o) {
-            if (o == null) { return false; }
-            if (o == this) { return true; }
-            if (o.getClass() != getClass()) {
-                return false;
-            }
-
-            final TestObject rhs = (TestObject) o;
-            return a == rhs.a;
-        }
-
-        @Override
-        public int hashCode() {
-            return a;
-        }
-
-        public void setA(final int a) {
-            this.a = a;
-        }
-
-        public int getA() {
-            return a;
-        }
-    }
-
-    static class TestSubObject extends TestObject {
-        private int b;
-        public TestSubObject() {
-            super(0);
-        }
-        public TestSubObject(final int a, final int b) {
-            super(a);
-            this.b = b;
-        }
-        @Override
-        public boolean equals(final Object o) {
-            if (o == null) { return false; }
-            if (o == this) { return true; }
-            if (o.getClass() != getClass()) {
-                return false;
-            }
-
-            final TestSubObject rhs = (TestSubObject) o;
-            return super.equals(o) && b == rhs.b;
-        }
-
-        @Override
-        public int hashCode() {
-            return b *17 + super.hashCode();
-        }
-
-        public void setB(final int b) {
-            this.b = b;
-        }
-
-        public int getB() {
-            return b;
-        }
-    }
-    
-    static class TestEmptySubObject extends TestObject {
-        public TestEmptySubObject(final int a) {
-            super(a);
-        }
-    }
-
-    static class TestTSubObject extends TestObject {
-        @SuppressWarnings("unused")
-        private transient int t;
-        public TestTSubObject(final int a, final int t) {
-            super(a);
-            this.t = t;
-        }
-    }
-
-    static class TestTTSubObject extends TestTSubObject {
-        @SuppressWarnings("unused")
-        private transient int tt;
-        public TestTTSubObject(final int a, final int t, final int tt) {
-            super(a, t);
-            this.tt = tt;
-        }
-    }
-
-    static class TestTTLeafObject extends TestTTSubObject {
-        @SuppressWarnings("unused")
-        private final int leafValue;
-        public TestTTLeafObject(final int a, final int t, final int tt, final int leafValue) {
-            super(a, t, tt);
-            this.leafValue = leafValue;
-        }
-    }
-
-    static class TestTSubObject2 extends TestObject {
-        private transient int t;
-        public TestTSubObject2(final int a, final int t) {
-            super(a);
-        }
-        public int getT() {
-            return t;
-        }
-        public void setT(final int t) {
-            this.t = t;
-        }
-    }
-
-    @Test
-    public void testReflectionEquals() {
-        final TestObject o1 = new TestObject(4);
-        final TestObject o2 = new TestObject(5);
-        assertTrue(EqualsBuilder.reflectionEquals(o1, o1));
-        assertTrue(!EqualsBuilder.reflectionEquals(o1, o2));
-        o2.setA(4);
-        assertTrue(EqualsBuilder.reflectionEquals(o1, o2));
-
-        assertTrue(!EqualsBuilder.reflectionEquals(o1, this));
-
-        assertTrue(!EqualsBuilder.reflectionEquals(o1, null));
-        assertTrue(!EqualsBuilder.reflectionEquals(null, o2));
-        assertTrue(EqualsBuilder.reflectionEquals((Object) null, (Object) null));
-    }
-    
-    @Test
-    public void testReflectionHierarchyEquals() {
-        testReflectionHierarchyEquals(false);
-        testReflectionHierarchyEquals(true);
-        // Transients
-        assertTrue(EqualsBuilder.reflectionEquals(new TestTTLeafObject(1, 2, 3, 4), new TestTTLeafObject(1, 2, 3, 4), true));
-        assertTrue(EqualsBuilder.reflectionEquals(new TestTTLeafObject(1, 2, 3, 4), new TestTTLeafObject(1, 2, 3, 4), false));
-        assertTrue(!EqualsBuilder.reflectionEquals(new TestTTLeafObject(1, 0, 0, 4), new TestTTLeafObject(1, 2, 3, 4), true));
-        assertTrue(!EqualsBuilder.reflectionEquals(new TestTTLeafObject(1, 2, 3, 4), new TestTTLeafObject(1, 2, 3, 0), true));
-        assertTrue(!EqualsBuilder.reflectionEquals(new TestTTLeafObject(0, 2, 3, 4), new TestTTLeafObject(1, 2, 3, 4), true));
-    }
-
-    private void testReflectionHierarchyEquals(final boolean testTransients) {
-        final TestObject to1 = new TestObject(4);
-        final TestObject to1Bis = new TestObject(4);
-        final TestObject to1Ter = new TestObject(4);
-        final TestObject to2 = new TestObject(5);
-        final TestEmptySubObject teso = new TestEmptySubObject(4);
-        final TestTSubObject ttso = new TestTSubObject(4, 1);
-        final TestTTSubObject tttso = new TestTTSubObject(4, 1, 2);
-        final TestTTLeafObject ttlo = new TestTTLeafObject(4, 1, 2, 3);
-        final TestSubObject tso1 = new TestSubObject(1, 4);
-        final TestSubObject tso1bis = new TestSubObject(1, 4);
-        final TestSubObject tso1ter = new TestSubObject(1, 4);
-        final TestSubObject tso2 = new TestSubObject(2, 5);
-
-        testReflectionEqualsEquivalenceRelationship(to1, to1Bis, to1Ter, to2, new TestObject(), testTransients);
-        testReflectionEqualsEquivalenceRelationship(tso1, tso1bis, tso1ter, tso2, new TestSubObject(), testTransients);
-
-        // More sanity checks:
-
-        // same values
-        assertTrue(EqualsBuilder.reflectionEquals(ttlo, ttlo, testTransients));
-        assertTrue(EqualsBuilder.reflectionEquals(new TestSubObject(1, 10), new TestSubObject(1, 10), testTransients));
-        // same super values, diff sub values
-        assertTrue(!EqualsBuilder.reflectionEquals(new TestSubObject(1, 10), new TestSubObject(1, 11), testTransients));
-        assertTrue(!EqualsBuilder.reflectionEquals(new TestSubObject(1, 11), new TestSubObject(1, 10), testTransients));
-        // diff super values, same sub values
-        assertTrue(!EqualsBuilder.reflectionEquals(new TestSubObject(0, 10), new TestSubObject(1, 10), testTransients));
-        assertTrue(!EqualsBuilder.reflectionEquals(new TestSubObject(1, 10), new TestSubObject(0, 10), testTransients));
-
-        // mix super and sub types: equals
-        assertTrue(EqualsBuilder.reflectionEquals(to1, teso, testTransients));
-        assertTrue(EqualsBuilder.reflectionEquals(teso, to1, testTransients));
-
-        assertTrue(EqualsBuilder.reflectionEquals(to1, ttso, false)); // Force testTransients = false for this assert
-        assertTrue(EqualsBuilder.reflectionEquals(ttso, to1, false)); // Force testTransients = false for this assert
-
-        assertTrue(EqualsBuilder.reflectionEquals(to1, tttso, false)); // Force testTransients = false for this assert
-        assertTrue(EqualsBuilder.reflectionEquals(tttso, to1, false)); // Force testTransients = false for this assert
-
-        assertTrue(EqualsBuilder.reflectionEquals(ttso, tttso, false)); // Force testTransients = false for this assert
-        assertTrue(EqualsBuilder.reflectionEquals(tttso, ttso, false)); // Force testTransients = false for this assert
-
-        // mix super and sub types: NOT equals
-        assertTrue(!EqualsBuilder.reflectionEquals(new TestObject(0), new TestEmptySubObject(1), testTransients));
-        assertTrue(!EqualsBuilder.reflectionEquals(new TestEmptySubObject(1), new TestObject(0), testTransients));
-
-        assertTrue(!EqualsBuilder.reflectionEquals(new TestObject(0), new TestTSubObject(1, 1), testTransients));
-        assertTrue(!EqualsBuilder.reflectionEquals(new TestTSubObject(1, 1), new TestObject(0), testTransients));
-
-        assertTrue(!EqualsBuilder.reflectionEquals(new TestObject(1), new TestSubObject(0, 10), testTransients));
-        assertTrue(!EqualsBuilder.reflectionEquals(new TestSubObject(0, 10), new TestObject(1), testTransients));
-
-        assertTrue(!EqualsBuilder.reflectionEquals(to1, ttlo));
-        assertTrue(!EqualsBuilder.reflectionEquals(tso1, this));
-    }
-
-    /**
-     * Equivalence relationship tests inspired by "Effective Java":
-     * <ul>
-     * <li>reflection</li>
-     * <li>symmetry</li>
-     * <li>transitive</li>
-     * <li>consistency</li>
-     * <li>non-null reference</li>
-     * </ul>
-     * @param to a TestObject
-     * @param toBis a TestObject, equal to to and toTer
-     * @param toTer Left hand side, equal to to and toBis
-     * @param to2 a different TestObject
-     * @param oToChange a TestObject that will be changed
-     * @param testTransients whether to test transient instance variables 
-     */
-    private void testReflectionEqualsEquivalenceRelationship(
-        final TestObject to,
-        final TestObject toBis,
-        final TestObject toTer,
-        final TestObject to2,
-        final TestObject oToChange,
-        final boolean testTransients) {
-
-        // reflection test
-        assertTrue(EqualsBuilder.reflectionEquals(to, to, testTransients));
-        assertTrue(EqualsBuilder.reflectionEquals(to2, to2, testTransients));
-
-        // symmetry test
-        assertTrue(EqualsBuilder.reflectionEquals(to, toBis, testTransients) && EqualsBuilder.reflectionEquals(toBis, to, testTransients));
-
-        // transitive test
-        assertTrue(
-            EqualsBuilder.reflectionEquals(to, toBis, testTransients)
-                && EqualsBuilder.reflectionEquals(toBis, toTer, testTransients)
-                && EqualsBuilder.reflectionEquals(to, toTer, testTransients));
-
-        // consistency test
-        oToChange.setA(to.getA());
-        if (oToChange instanceof TestSubObject) {
-            ((TestSubObject) oToChange).setB(((TestSubObject) to).getB());
-        }
-        assertTrue(EqualsBuilder.reflectionEquals(oToChange, to, testTransients));
-        assertTrue(EqualsBuilder.reflectionEquals(oToChange, to, testTransients));
-        oToChange.setA(to.getA() + 1);
-        if (oToChange instanceof TestSubObject) {
-            ((TestSubObject) oToChange).setB(((TestSubObject) to).getB() + 1);
-        }
-        assertTrue(!EqualsBuilder.reflectionEquals(oToChange, to, testTransients));
-        assertTrue(!EqualsBuilder.reflectionEquals(oToChange, to, testTransients));
-
-        // non-null reference test
-        assertTrue(!EqualsBuilder.reflectionEquals(to, null, testTransients));
-        assertTrue(!EqualsBuilder.reflectionEquals(to2, null, testTransients));
-        assertTrue(!EqualsBuilder.reflectionEquals(null, to, testTransients));
-        assertTrue(!EqualsBuilder.reflectionEquals(null, to2, testTransients));
-        assertTrue(EqualsBuilder.reflectionEquals((Object) null, (Object) null, testTransients));
-    }
-
-    @Test
-    public void testSuper() {
-        final TestObject o1 = new TestObject(4);
-        final TestObject o2 = new TestObject(5);
-        assertTrue(new EqualsBuilder().appendSuper(true).append(o1, o1).isEquals());
-        assertFalse(new EqualsBuilder().appendSuper(false).append(o1, o1).isEquals());
-        assertFalse(new EqualsBuilder().appendSuper(true).append(o1, o2).isEquals());
-        assertFalse(new EqualsBuilder().appendSuper(false).append(o1, o2).isEquals());
-    }
-
-    @Test
-    public void testObject() {
-        final TestObject o1 = new TestObject(4);
-        final TestObject o2 = new TestObject(5);
-        assertTrue(new EqualsBuilder().append(o1, o1).isEquals());
-        assertTrue(!new EqualsBuilder().append(o1, o2).isEquals());
-        o2.setA(4);
-        assertTrue(new EqualsBuilder().append(o1, o2).isEquals());
-
-        assertTrue(!new EqualsBuilder().append(o1, this).isEquals());
-        
-        assertTrue(!new EqualsBuilder().append(o1, null).isEquals());
-        assertTrue(!new EqualsBuilder().append(null, o2).isEquals());
-        assertTrue(new EqualsBuilder().append((Object) null, (Object) null).isEquals());
-    }
-    
-    @Test
-    public void testObjectBuild() {
-        final TestObject o1 = new TestObject(4);
-        final TestObject o2 = new TestObject(5);
-        assertEquals(Boolean.TRUE, new EqualsBuilder().append(o1, o1).build());
-        assertEquals(Boolean.FALSE, new EqualsBuilder().append(o1, o2).build());
-        o2.setA(4);
-        assertEquals(Boolean.TRUE, new EqualsBuilder().append(o1, o2).build());
-
-        assertEquals(Boolean.FALSE, new EqualsBuilder().append(o1, this).build());
-        
-        assertEquals(Boolean.FALSE, new EqualsBuilder().append(o1, null).build());
-        assertEquals(Boolean.FALSE, new EqualsBuilder().append(null, o2).build());
-        assertEquals(Boolean.TRUE, new EqualsBuilder().append((Object) null, (Object) null).build());
-    }
-
-    @Test
-    public void testLong() {
-        final long o1 = 1L;
-        final long o2 = 2L;
-        assertTrue(new EqualsBuilder().append(o1, o1).isEquals());
-        assertTrue(!new EqualsBuilder().append(o1, o2).isEquals());
-    }
-
-    @Test
-    public void testInt() {
-        final int o1 = 1;
-        final int o2 = 2;
-        assertTrue(new EqualsBuilder().append(o1, o1).isEquals());
-        assertTrue(!new EqualsBuilder().append(o1, o2).isEquals());
-    }
-
-    @Test
-    public void testShort() {
-        final short o1 = 1;
-        final short o2 = 2;
-        assertTrue(new EqualsBuilder().append(o1, o1).isEquals());
-        assertTrue(!new EqualsBuilder().append(o1, o2).isEquals());
-    }
-
-    @Test
-    public void testChar() {
-        final char o1 = 1;
-        final char o2 = 2;
-        assertTrue(new EqualsBuilder().append(o1, o1).isEquals());
-        assertTrue(!new EqualsBuilder().append(o1, o2).isEquals());
-    }
-
-    @Test
-    public void testByte() {
-        final byte o1 = 1;
-        final byte o2 = 2;
-        assertTrue(new EqualsBuilder().append(o1, o1).isEquals());
-        assertTrue(!new EqualsBuilder().append(o1, o2).isEquals());
-    }
-
-    @Test
-    public void testDouble() {
-        final double o1 = 1;
-        final double o2 = 2;
-        assertTrue(new EqualsBuilder().append(o1, o1).isEquals());
-        assertTrue(!new EqualsBuilder().append(o1, o2).isEquals());
-        assertTrue(!new EqualsBuilder().append(o1, Double.NaN).isEquals());
-        assertTrue(new EqualsBuilder().append(Double.NaN, Double.NaN).isEquals());
-        assertTrue(new EqualsBuilder().append(Double.POSITIVE_INFINITY, Double.POSITIVE_INFINITY).isEquals());
-    }
-
-    @Test
-    public void testFloat() {
-        final float o1 = 1;
-        final float o2 = 2;
-        assertTrue(new EqualsBuilder().append(o1, o1).isEquals());
-        assertTrue(!new EqualsBuilder().append(o1, o2).isEquals());
-        assertTrue(!new EqualsBuilder().append(o1, Float.NaN).isEquals());
-        assertTrue(new EqualsBuilder().append(Float.NaN, Float.NaN).isEquals());
-        assertTrue(new EqualsBuilder().append(Float.POSITIVE_INFINITY, Float.POSITIVE_INFINITY).isEquals());
-    }
-
-    @Test
-    public void testAccessors() {
-        final EqualsBuilder equalsBuilder = new EqualsBuilder();
-        assertTrue(equalsBuilder.isEquals());
-        equalsBuilder.setEquals(true);
-        assertTrue(equalsBuilder.isEquals());
-        equalsBuilder.setEquals(false);
-        assertFalse(equalsBuilder.isEquals());
-    }
-
-    @Test
-    public void testReset() {
-        final EqualsBuilder equalsBuilder = new EqualsBuilder();
-        assertTrue(equalsBuilder.isEquals());
-        equalsBuilder.setEquals(false);
-        assertFalse(equalsBuilder.isEquals());
-        equalsBuilder.reset();
-        assertTrue(equalsBuilder.isEquals());
-    }
-    
-    @Test
-    public void testBoolean() {
-        final boolean o1 = true;
-        final boolean o2 = false;
-        assertTrue(new EqualsBuilder().append(o1, o1).isEquals());
-        assertTrue(!new EqualsBuilder().append(o1, o2).isEquals());
-    }
-
-    @Test
-    public void testObjectArray() {
-        TestObject[] obj1 = new TestObject[3];
-        obj1[0] = new TestObject(4);
-        obj1[1] = new TestObject(5);
-        obj1[2] = null;
-        TestObject[] obj2 = new TestObject[3];
-        obj2[0] = new TestObject(4);
-        obj2[1] = new TestObject(5);
-        obj2[2] = null;
-        
-        assertTrue(new EqualsBuilder().append(obj1, obj1).isEquals());
-        assertTrue(new EqualsBuilder().append(obj2, obj2).isEquals());
-        assertTrue(new EqualsBuilder().append(obj1, obj2).isEquals());
-        obj1[1].setA(6);
-        assertTrue(!new EqualsBuilder().append(obj1, obj2).isEquals());
-        obj1[1].setA(5);
-        assertTrue(new EqualsBuilder().append(obj1, obj2).isEquals());
-        obj1[2] = obj1[1];
-        assertTrue(!new EqualsBuilder().append(obj1, obj2).isEquals());
-        obj1[2] = null;
-        assertTrue(new EqualsBuilder().append(obj1, obj2).isEquals());
-                       
-        obj2 = null;
-        assertTrue(!new EqualsBuilder().append(obj1, obj2).isEquals());
-        obj1 = null;
-        assertTrue(new EqualsBuilder().append(obj1, obj2).isEquals());
-    }
-
-    @Test
-    public void testLongArray() {
-        long[] obj1 = new long[2];
-        obj1[0] = 5L;
-        obj1[1] = 6L;
-        long[] obj2 = new long[2];
-        obj2[0] = 5L;
-        obj2[1] = 6L;
-        assertTrue(new EqualsBuilder().append(obj1, obj1).isEquals());
-        assertTrue(new EqualsBuilder().append(obj1, obj2).isEquals());
-        obj1[1] = 7;
-        assertTrue(!new EqualsBuilder().append(obj1, obj2).isEquals());
-
-        obj2 = null;
-        assertTrue(!new EqualsBuilder().append(obj1, obj2).isEquals());
-        obj1 = null;
-        assertTrue(new EqualsBuilder().append(obj1, obj2).isEquals());
-    }
-
-    @Test
-    public void testIntArray() {
-        int[] obj1 = new int[2];
-        obj1[0] = 5;
-        obj1[1] = 6;
-        int[] obj2 = new int[2];
-        obj2[0] = 5;
-        obj2[1] = 6;
-        assertTrue(new EqualsBuilder().append(obj1, obj1).isEquals());
-        assertTrue(new EqualsBuilder().append(obj1, obj2).isEquals());
-        obj1[1] = 7;
-        assertTrue(!new EqualsBuilder().append(obj1, obj2).isEquals());
-
-        obj2 = null;
-        assertTrue(!new EqualsBuilder().append(obj1, obj2).isEquals());
-        obj1 = null;
-        assertTrue(new EqualsBuilder().append(obj1, obj2).isEquals());
-    }
-
-    @Test
-    public void testShortArray() {
-        short[] obj1 = new short[2];
-        obj1[0] = 5;
-        obj1[1] = 6;
-        short[] obj2 = new short[2];
-        obj2[0] = 5;
-        obj2[1] = 6;
-        assertTrue(new EqualsBuilder().append(obj1, obj1).isEquals());
-        assertTrue(new EqualsBuilder().append(obj1, obj2).isEquals());
-        obj1[1] = 7;
-        assertTrue(!new EqualsBuilder().append(obj1, obj2).isEquals());
-
-        obj2 = null;
-        assertTrue(!new EqualsBuilder().append(obj1, obj2).isEquals());
-        obj1 = null;
-        assertTrue(new EqualsBuilder().append(obj1, obj2).isEquals());
-    }
-
-    @Test
-    public void testCharArray() {
-        char[] obj1 = new char[2];
-        obj1[0] = 5;
-        obj1[1] = 6;
-        char[] obj2 = new char[2];
-        obj2[0] = 5;
-        obj2[1] = 6;
-        assertTrue(new EqualsBuilder().append(obj1, obj1).isEquals());
-        assertTrue(new EqualsBuilder().append(obj1, obj2).isEquals());
-        obj1[1] = 7;
-        assertTrue(!new EqualsBuilder().append(obj1, obj2).isEquals());
-
-        obj2 = null;
-        assertTrue(!new EqualsBuilder().append(obj1, obj2).isEquals());
-        obj1 = null;
-        assertTrue(new EqualsBuilder().append(obj1, obj2).isEquals());
-    }
-
-    @Test
-    public void testByteArray() {
-        byte[] obj1 = new byte[2];
-        obj1[0] = 5;
-        obj1[1] = 6;
-        byte[] obj2 = new byte[2];
-        obj2[0] = 5;
-        obj2[1] = 6;
-        assertTrue(new EqualsBuilder().append(obj1, obj1).isEquals());
-        assertTrue(new EqualsBuilder().append(obj1, obj2).isEquals());
-        obj1[1] = 7;
-        assertTrue(!new EqualsBuilder().append(obj1, obj2).isEquals());
-
-        obj2 = null;
-        assertTrue(!new EqualsBuilder().append(obj1, obj2).isEquals());
-        obj1 = null;
-        assertTrue(new EqualsBuilder().append(obj1, obj2).isEquals());
-    }
-
-    @Test
-    public void testDoubleArray() {
-        double[] obj1 = new double[2];
-        obj1[0] = 5;
-        obj1[1] = 6;
-        double[] obj2 = new double[2];
-        obj2[0] = 5;
-        obj2[1] = 6;
-        assertTrue(new EqualsBuilder().append(obj1, obj1).isEquals());
-        assertTrue(new EqualsBuilder().append(obj1, obj2).isEquals());
-        obj1[1] = 7;
-        assertTrue(!new EqualsBuilder().append(obj1, obj2).isEquals());
-
-        obj2 = null;
-        assertTrue(!new EqualsBuilder().append(obj1, obj2).isEquals());
-        obj1 = null;
-        assertTrue(new EqualsBuilder().append(obj1, obj2).isEquals());
-    }
-
-    @Test
-    public void testFloatArray() {
-        float[] obj1 = new float[2];
-        obj1[0] = 5;
-        obj1[1] = 6;
-        float[] obj2 = new float[2];
-        obj2[0] = 5;
-        obj2[1] = 6;
-        assertTrue(new EqualsBuilder().append(obj1, obj1).isEquals());
-        assertTrue(new EqualsBuilder().append(obj1, obj2).isEquals());
-        obj1[1] = 7;
-        assertTrue(!new EqualsBuilder().append(obj1, obj2).isEquals());
-
-        obj2 = null;
-        assertTrue(!new EqualsBuilder().append(obj1, obj2).isEquals());
-        obj1 = null;
-        assertTrue(new EqualsBuilder().append(obj1, obj2).isEquals());
-    }
-
-    @Test
-    public void testBooleanArray() {
-        boolean[] obj1 = new boolean[2];
-        obj1[0] = true;
-        obj1[1] = false;
-        boolean[] obj2 = new boolean[2];
-        obj2[0] = true;
-        obj2[1] = false;
-        assertTrue(new EqualsBuilder().append(obj1, obj1).isEquals());
-        assertTrue(new EqualsBuilder().append(obj1, obj2).isEquals());
-        obj1[1] = true;
-        assertTrue(!new EqualsBuilder().append(obj1, obj2).isEquals());
-
-        obj2 = null;
-        assertTrue(!new EqualsBuilder().append(obj1, obj2).isEquals());
-        obj1 = null;
-        assertTrue(new EqualsBuilder().append(obj1, obj2).isEquals());
-    }
-
-    @Test
-    public void testMultiLongArray() {
-        final long[][] array1 = new long[2][2];
-        final long[][] array2 = new long[2][2];
-        for (int i = 0; i < array1.length; ++i) {
-            for (int j = 0; j < array1[0].length; j++) {
-                array1[i][j] = (i + 1) * (j + 1);
-                array2[i][j] = (i + 1) * (j + 1);
-            }
-        }
-        assertTrue(new EqualsBuilder().append(array1, array1).isEquals());
-        assertTrue(new EqualsBuilder().append(array1, array2).isEquals());
-        array1[1][1] = 0;
-        assertTrue(!new EqualsBuilder().append(array1, array2).isEquals());
-    }
-
-    @Test
-    public void testMultiIntArray() {
-        final int[][] array1 = new int[2][2];
-        final int[][] array2 = new int[2][2];
-        for (int i = 0; i < array1.length; ++i) {
-            for (int j = 0; j < array1[0].length; j++) {
-                array1[i][j] = (i + 1) * (j + 1);
-                array2[i][j] = (i + 1) * (j + 1);
-            }
-        }
-        assertTrue(new EqualsBuilder().append(array1, array1).isEquals());
-        assertTrue(new EqualsBuilder().append(array1, array2).isEquals());
-        array1[1][1] = 0;
-        assertTrue(!new EqualsBuilder().append(array1, array2).isEquals());
-    }
-
-    @Test
-    public void testMultiShortArray() {
-        final short[][] array1 = new short[2][2];
-        final short[][] array2 = new short[2][2];
-        for (short i = 0; i < array1.length; ++i) {
-            for (short j = 0; j < array1[0].length; j++) {
-                array1[i][j] = i;
-                array2[i][j] = i;
-            }
-        }
-        assertTrue(new EqualsBuilder().append(array1, array1).isEquals());
-        assertTrue(new EqualsBuilder().append(array1, array2).isEquals());
-        array1[1][1] = 0;
-        assertTrue(!new EqualsBuilder().append(array1, array2).isEquals());
-    }
-
-    @Test
-    public void testMultiCharArray() {
-        final char[][] array1 = new char[2][2];
-        final char[][] array2 = new char[2][2];
-        for (char i = 0; i < array1.length; ++i) {
-            for (char j = 0; j < array1[0].length; j++) {
-                array1[i][j] = i;
-                array2[i][j] = i;
-            }
-        }
-        assertTrue(new EqualsBuilder().append(array1, array1).isEquals());
-        assertTrue(new EqualsBuilder().append(array1, array2).isEquals());
-        array1[1][1] = 0;
-        assertTrue(!new EqualsBuilder().append(array1, array2).isEquals());
-    }
-
-    @Test
-    public void testMultiByteArray() {
-        final byte[][] array1 = new byte[2][2];
-        final byte[][] array2 = new byte[2][2];
-        for (byte i = 0; i < array1.length; ++i) {
-            for (byte j = 0; j < array1[0].length; j++) {
-                array1[i][j] = i;
-                array2[i][j] = i;
-            }
-        }
-        assertTrue(new EqualsBuilder().append(array1, array1).isEquals());
-        assertTrue(new EqualsBuilder().append(array1, array2).isEquals());
-        array1[1][1] = 0;
-        assertTrue(!new EqualsBuilder().append(array1, array2).isEquals());
-    }
-
-    @Test
-    public void testMultiFloatArray() {
-        final float[][] array1 = new float[2][2];
-        final float[][] array2 = new float[2][2];
-        for (int i = 0; i < array1.length; ++i) {
-            for (int j = 0; j < array1[0].length; j++) {
-                array1[i][j] = (i + 1) * (j + 1);
-                array2[i][j] = (i + 1) * (j + 1);
-            }
-        }
-        assertTrue(new EqualsBuilder().append(array1, array1).isEquals());
-        assertTrue(new EqualsBuilder().append(array1, array2).isEquals());
-        array1[1][1] = 0;
-        assertTrue(!new EqualsBuilder().append(array1, array2).isEquals());
-    }
-
-    @Test
-    public void testMultiDoubleArray() {
-        final double[][] array1 = new double[2][2];
-        final double[][] array2 = new double[2][2];
-        for (int i = 0; i < array1.length; ++i) {
-            for (int j = 0; j < array1[0].length; j++) {
-                array1[i][j] = (i + 1) * (j + 1);
-                array2[i][j] = (i + 1) * (j + 1);
-            }
-        }
-        assertTrue(new EqualsBuilder().append(array1, array1).isEquals());
-        assertTrue(new EqualsBuilder().append(array1, array2).isEquals());
-        array1[1][1] = 0;
-        assertTrue(!new EqualsBuilder().append(array1, array2).isEquals());
-    }
-
-    @Test
-    public void testMultiBooleanArray() {
-        final boolean[][] array1 = new boolean[2][2];
-        final boolean[][] array2 = new boolean[2][2];
-        for (int i = 0; i < array1.length; ++i) {
-            for (int j = 0; j < array1[0].length; j++) {
-                array1[i][j] = i == 1 || j == 1;
-                array2[i][j] = i == 1 || j == 1;
-            }
-        }
-        assertTrue(new EqualsBuilder().append(array1, array1).isEquals());
-        assertTrue(new EqualsBuilder().append(array1, array2).isEquals());
-        array1[1][1] = false;
-        assertTrue(!new EqualsBuilder().append(array1, array2).isEquals());
-        
-        // compare 1 dim to 2.
-        final boolean[] array3 = new boolean[]{true, true};
-        assertFalse(new EqualsBuilder().append(array1, array3).isEquals());
-        assertFalse(new EqualsBuilder().append(array3, array1).isEquals());
-        assertFalse(new EqualsBuilder().append(array2, array3).isEquals());
-        assertFalse(new EqualsBuilder().append(array3, array2).isEquals());
-    }
-
-    @Test
-    public void testRaggedArray() {
-        final long array1[][] = new long[2][];
-        final long array2[][] = new long[2][];
-        for (int i = 0; i < array1.length; ++i) {
-            array1[i] = new long[2];
-            array2[i] = new long[2];
-            for (int j = 0; j < array1[i].length; ++j) {
-                array1[i][j] = (i + 1) * (j + 1);
-                array2[i][j] = (i + 1) * (j + 1);
-            }
-        }
-        assertTrue(new EqualsBuilder().append(array1, array1).isEquals());
-        assertTrue(new EqualsBuilder().append(array1, array2).isEquals());
-        array1[1][1] = 0;
-        assertTrue(!new EqualsBuilder().append(array1, array2).isEquals());
-    }
-
-    @Test
-    public void testMixedArray() {
-        final Object array1[] = new Object[2];
-        final Object array2[] = new Object[2];
-        for (int i = 0; i < array1.length; ++i) {
-            array1[i] = new long[2];
-            array2[i] = new long[2];
-            for (int j = 0; j < 2; ++j) {
-                ((long[]) array1[i])[j] = (i + 1) * (j + 1);
-                ((long[]) array2[i])[j] = (i + 1) * (j + 1);
-            }
-        }
-        assertTrue(new EqualsBuilder().append(array1, array1).isEquals());
-        assertTrue(new EqualsBuilder().append(array1, array2).isEquals());
-        ((long[]) array1[1])[1] = 0;
-        assertTrue(!new EqualsBuilder().append(array1, array2).isEquals());
-    }
-
-    @Test
-    public void testObjectArrayHiddenByObject() {
-        final TestObject[] array1 = new TestObject[2];
-        array1[0] = new TestObject(4);
-        array1[1] = new TestObject(5);
-        final TestObject[] array2 = new TestObject[2];
-        array2[0] = new TestObject(4);
-        array2[1] = new TestObject(5);
-        final Object obj1 = array1;
-        final Object obj2 = array2;
-        assertTrue(new EqualsBuilder().append(obj1, obj1).isEquals());
-        assertTrue(new EqualsBuilder().append(obj1, array1).isEquals());
-        assertTrue(new EqualsBuilder().append(obj1, obj2).isEquals());
-        assertTrue(new EqualsBuilder().append(obj1, array2).isEquals());
-        array1[1].setA(6);
-        assertTrue(!new EqualsBuilder().append(obj1, obj2).isEquals());
-    }
-
-    @Test
-    public void testLongArrayHiddenByObject() {
-        final long[] array1 = new long[2];
-        array1[0] = 5L;
-        array1[1] = 6L;
-        final long[] array2 = new long[2];
-        array2[0] = 5L;
-        array2[1] = 6L;
-        final Object obj1 = array1;
-        final Object obj2 = array2;
-        assertTrue(new EqualsBuilder().append(obj1, obj1).isEquals());
-        assertTrue(new EqualsBuilder().append(obj1, array1).isEquals());
-        assertTrue(new EqualsBuilder().append(obj1, obj2).isEquals());
-        assertTrue(new EqualsBuilder().append(obj1, array2).isEquals());
-        array1[1] = 7;
-        assertTrue(!new EqualsBuilder().append(obj1, obj2).isEquals());
-    }
-
-    @Test
-    public void testIntArrayHiddenByObject() {
-        final int[] array1 = new int[2];
-        array1[0] = 5;
-        array1[1] = 6;
-        final int[] array2 = new int[2];
-        array2[0] = 5;
-        array2[1] = 6;
-        final Object obj1 = array1;
-        final Object obj2 = array2;
-        assertTrue(new EqualsBuilder().append(obj1, obj1).isEquals());
-        assertTrue(new EqualsBuilder().append(obj1, array1).isEquals());
-        assertTrue(new EqualsBuilder().append(obj1, obj2).isEquals());
-        assertTrue(new EqualsBuilder().append(obj1, array2).isEquals());
-        array1[1] = 7;
-        assertTrue(!new EqualsBuilder().append(obj1, obj2).isEquals());
-    }
-
-    @Test
-    public void testShortArrayHiddenByObject() {
-        final short[] array1 = new short[2];
-        array1[0] = 5;
-        array1[1] = 6;
-        final short[] array2 = new short[2];
-        array2[0] = 5;
-        array2[1] = 6;
-        final Object obj1 = array1;
-        final Object obj2 = array2;
-        assertTrue(new EqualsBuilder().append(obj1, obj1).isEquals());
-        assertTrue(new EqualsBuilder().append(obj1, array1).isEquals());
-        assertTrue(new EqualsBuilder().append(obj1, obj2).isEquals());
-        assertTrue(new EqualsBuilder().append(obj1, array2).isEquals());
-        array1[1] = 7;
-        assertTrue(!new EqualsBuilder().append(obj1, obj2).isEquals());
-    }
-
-    @Test
-    public void testCharArrayHiddenByObject() {
-        final char[] array1 = new char[2];
-        array1[0] = 5;
-        array1[1] = 6;
-        final char[] array2 = new char[2];
-        array2[0] = 5;
-        array2[1] = 6;
-        final Object obj1 = array1;
-        final Object obj2 = array2;
-        assertTrue(new EqualsBuilder().append(obj1, obj1).isEquals());
-        assertTrue(new EqualsBuilder().append(obj1, array1).isEquals());
-        assertTrue(new EqualsBuilder().append(obj1, obj2).isEquals());
-        assertTrue(new EqualsBuilder().append(obj1, array2).isEquals());
-        array1[1] = 7;
-        assertTrue(!new EqualsBuilder().append(obj1, obj2).isEquals());
-    }
-
-    @Test
-    public void testByteArrayHiddenByObject() {
-        final byte[] array1 = new byte[2];
-        array1[0] = 5;
-        array1[1] = 6;
-        final byte[] array2 = new byte[2];
-        array2[0] = 5;
-        array2[1] = 6;
-        final Object obj1 = array1;
-        final Object obj2 = array2;
-        assertTrue(new EqualsBuilder().append(obj1, obj1).isEquals());
-        assertTrue(new EqualsBuilder().append(obj1, array1).isEquals());
-        assertTrue(new EqualsBuilder().append(obj1, obj2).isEquals());
-        assertTrue(new EqualsBuilder().append(obj1, array2).isEquals());
-        array1[1] = 7;
-        assertTrue(!new EqualsBuilder().append(obj1, obj2).isEquals());
-    }
-
-    @Test
-    public void testDoubleArrayHiddenByObject() {
-        final double[] array1 = new double[2];
-        array1[0] = 5;
-        array1[1] = 6;
-        final double[] array2 = new double[2];
-        array2[0] = 5;
-        array2[1] = 6;
-        final Object obj1 = array1;
-        final Object obj2 = array2;
-        assertTrue(new EqualsBuilder().append(obj1, obj1).isEquals());
-        assertTrue(new EqualsBuilder().append(obj1, array1).isEquals());
-        assertTrue(new EqualsBuilder().append(obj1, obj2).isEquals());
-        assertTrue(new EqualsBuilder().append(obj1, array2).isEquals());
-        array1[1] = 7;
-        assertTrue(!new EqualsBuilder().append(obj1, obj2).isEquals());
-    }
-
-    @Test
-    public void testFloatArrayHiddenByObject() {
-        final float[] array1 = new float[2];
-        array1[0] = 5;
-        array1[1] = 6;
-        final float[] array2 = new float[2];
-        array2[0] = 5;
-        array2[1] = 6;
-        final Object obj1 = array1;
-        final Object obj2 = array2;
-        assertTrue(new EqualsBuilder().append(obj1, obj1).isEquals());
-        assertTrue(new EqualsBuilder().append(obj1, array1).isEquals());
-        assertTrue(new EqualsBuilder().append(obj1, obj2).isEquals());
-        assertTrue(new EqualsBuilder().append(obj1, array2).isEquals());
-        array1[1] = 7;
-        assertTrue(!new EqualsBuilder().append(obj1, obj2).isEquals());
-    }
-
-    @Test
-    public void testBooleanArrayHiddenByObject() {
-        final boolean[] array1 = new boolean[2];
-        array1[0] = true;
-        array1[1] = false;
-        final boolean[] array2 = new boolean[2];
-        array2[0] = true;
-        array2[1] = false;
-        final Object obj1 = array1;
-        final Object obj2 = array2;
-        assertTrue(new EqualsBuilder().append(obj1, obj1).isEquals());
-        assertTrue(new EqualsBuilder().append(obj1, array1).isEquals());
-        assertTrue(new EqualsBuilder().append(obj1, obj2).isEquals());
-        assertTrue(new EqualsBuilder().append(obj1, array2).isEquals());
-        array1[1] = true;
-        assertTrue(!new EqualsBuilder().append(obj1, obj2).isEquals());
-    }
-    
-    public static class TestACanEqualB {
-        private final int a;
-
-        public TestACanEqualB(final int a) {
-            this.a = a;
-        }
-
-        @Override
-        public boolean equals(final Object o) {
-            if (o == this) {
-                return true;
-            }
-            if (o instanceof TestACanEqualB) {
-                return this.a == ((TestACanEqualB) o).getA();
-            }
-            if (o instanceof TestBCanEqualA) {
-                return this.a == ((TestBCanEqualA) o).getB();
-            }
-            return false;
-        }
-
-        @Override
-        public int hashCode() {
-            return a;
-        }
-
-        public int getA() {
-            return this.a;
-        }
-    }
-
-    public static class TestBCanEqualA {
-        private final int b;
-
-        public TestBCanEqualA(final int b) {
-            this.b = b;
-        }
-
-        @Override
-        public boolean equals(final Object o) {
-            if (o == this) {
-                return true;
-            }
-            if (o instanceof TestACanEqualB) {
-                return this.b == ((TestACanEqualB) o).getA();
-            }
-            if (o instanceof TestBCanEqualA) {
-                return this.b == ((TestBCanEqualA) o).getB();
-            }
-            return false;
-        }
-
-        @Override
-        public int hashCode() {
-            return b;
-        }
-
-        public int getB() {
-            return this.b;
-        }
-    }
-    
-    /**
-     * Tests two instances of classes that can be equal and that are not "related". The two classes are not subclasses
-     * of each other and do not share a parent aside from Object.
-     * See http://issues.apache.org/bugzilla/show_bug.cgi?id=33069
-     */
-    @Test
-    public void testUnrelatedClasses() {
-        final Object[] x = new Object[]{new TestACanEqualB(1)};
-        final Object[] y = new Object[]{new TestBCanEqualA(1)};
-
-        // sanity checks:
-        assertTrue(Arrays.equals(x, x));
-        assertTrue(Arrays.equals(y, y));
-        assertTrue(Arrays.equals(x, y));
-        assertTrue(Arrays.equals(y, x));
-        // real tests:
-        assertTrue(x[0].equals(x[0]));
-        assertTrue(y[0].equals(y[0]));
-        assertTrue(x[0].equals(y[0]));
-        assertTrue(y[0].equals(x[0]));
-        assertTrue(new EqualsBuilder().append(x, x).isEquals());
-        assertTrue(new EqualsBuilder().append(y, y).isEquals());
-        assertTrue(new EqualsBuilder().append(x, y).isEquals());
-        assertTrue(new EqualsBuilder().append(y, x).isEquals());
-    }
-    
-    /**
-     * Test from http://issues.apache.org/bugzilla/show_bug.cgi?id=33067
-     */
-    @Test
-    public void testNpeForNullElement() {
-        final Object[] x1 = new Object[] { Integer.valueOf(1), null, Integer.valueOf(3) };
-        final Object[] x2 = new Object[] { Integer.valueOf(1), Integer.valueOf(2), Integer.valueOf(3) };
-
-        // causes an NPE in 2.0 according to:
-        // http://issues.apache.org/bugzilla/show_bug.cgi?id=33067
-        new EqualsBuilder().append(x1, x2);
-    }
-
-    @Test
-    public void testReflectionEqualsExcludeFields() throws Exception {
-        final TestObjectWithMultipleFields x1 = new TestObjectWithMultipleFields(1, 2, 3);
-        final TestObjectWithMultipleFields x2 = new TestObjectWithMultipleFields(1, 3, 4);
-
-        // not equal when including all fields
-        assertTrue(!EqualsBuilder.reflectionEquals(x1, x2));
-
-        // doesn't barf on null, empty array, or non-existent field, but still tests as not equal
-        assertTrue(!EqualsBuilder.reflectionEquals(x1, x2, (String[]) null));
-        assertTrue(!EqualsBuilder.reflectionEquals(x1, x2, new String[] {}));
-        assertTrue(!EqualsBuilder.reflectionEquals(x1, x2, new String[] {"xxx"}));
-
-        // not equal if only one of the differing fields excluded
-        assertTrue(!EqualsBuilder.reflectionEquals(x1, x2, new String[] {"two"}));
-        assertTrue(!EqualsBuilder.reflectionEquals(x1, x2, new String[] {"three"}));
-
-        // equal if both differing fields excluded
-        assertTrue(EqualsBuilder.reflectionEquals(x1, x2, new String[] {"two", "three"}));
-
-        // still equal as long as both differing fields are among excluded
-        assertTrue(EqualsBuilder.reflectionEquals(x1, x2, new String[] {"one", "two", "three"}));
-        assertTrue(EqualsBuilder.reflectionEquals(x1, x2, new String[] {"one", "two", "three", "xxx"}));
-    }
-
-    static class TestObjectWithMultipleFields {
-        @SuppressWarnings("unused")
-        private final TestObject one;
-        @SuppressWarnings("unused")
-        private final TestObject two;
-        @SuppressWarnings("unused")
-        private final TestObject three;
-
-        public TestObjectWithMultipleFields(final int one, final int two, final int three) {
-            this.one = new TestObject(one);
-            this.two = new TestObject(two);
-            this.three = new TestObject(three);
-        }
-    }
-    
-    /**
-     * Test cyclical object references which cause a StackOverflowException if
-     * not handled properly. s. LANG-606
-     */
-    @Test
-    public void testCyclicalObjectReferences() {
-        final TestObjectReference refX1 = new TestObjectReference(1);
-        final TestObjectReference x1 = new TestObjectReference(1);
-        x1.setObjectReference(refX1);
-        refX1.setObjectReference(x1);
-
-        final TestObjectReference refX2 = new TestObjectReference(1);
-        final TestObjectReference x2 = new TestObjectReference(1);
-        x2.setObjectReference(refX2);
-        refX2.setObjectReference(x2);
-
-        final TestObjectReference refX3 = new TestObjectReference(2);
-        final TestObjectReference x3 = new TestObjectReference(2);
-        x3.setObjectReference(refX3);
-        refX3.setObjectReference(x3);
-
-        assertTrue(x1.equals(x2));
-        assertNull(EqualsBuilder.getRegistry());
-        assertFalse(x1.equals(x3));
-        assertNull(EqualsBuilder.getRegistry());
-        assertFalse(x2.equals(x3));
-        assertNull(EqualsBuilder.getRegistry());
-    }
-
-    static class TestObjectReference {
-        @SuppressWarnings("unused")
-        private TestObjectReference reference;
-        @SuppressWarnings("unused")
-        private final TestObject one;
-
-        public TestObjectReference(final int one) {
-            this.one = new TestObject(one);
-        }
-
-        public void setObjectReference(final TestObjectReference reference) {
-            this.reference = reference;
-        }
-
-        @Override
-        public boolean equals(final Object obj) {
-            return EqualsBuilder.reflectionEquals(this, obj);
-        }
-    }
-    
-    @Test
-    public void testReflectionArrays() throws Exception {
-
-        final TestObject one = new TestObject(1);
-        final TestObject two = new TestObject(2);
-
-        final Object[] o1 = new Object[] { one };
-        final Object[] o2 = new Object[] { two };
-        final Object[] o3 = new Object[] { one };
-
-        assertTrue(!EqualsBuilder.reflectionEquals(o1, o2));
-        assertTrue(EqualsBuilder.reflectionEquals(o1, o1));
-        assertTrue(EqualsBuilder.reflectionEquals(o1, o3));
-        
-        final double[] d1 = { 0, 1 };
-        final double[] d2 = { 2, 3 };
-        final double[] d3 = { 0, 1 };
-        
-        assertTrue(!EqualsBuilder.reflectionEquals(d1, d2));
-        assertTrue(EqualsBuilder.reflectionEquals(d1, d1));
-        assertTrue(EqualsBuilder.reflectionEquals(d1, d3));
-    }
-
-}
-
diff --git a/lang/src/test/java/org/apache/commons/lang3/builder/HashCodeBuilderAndEqualsBuilderTest.java b/lang/src/test/java/org/apache/commons/lang3/builder/HashCodeBuilderAndEqualsBuilderTest.java
deleted file mode 100644
index 250d49b..0000000
--- a/lang/src/test/java/org/apache/commons/lang3/builder/HashCodeBuilderAndEqualsBuilderTest.java
+++ /dev/null
@@ -1,140 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- * 
- *      http://www.apache.org/licenses/LICENSE-2.0
- * 
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.commons.lang3.builder;
-
-import static org.junit.Assert.assertEquals;
-
-import org.junit.Test;
-
-/**
- * Tests {@link org.apache.commons.lang3.builder.HashCodeBuilder} and
- * {@link org.apache.commons.lang3.builder.EqualsBuilderTest} to insure that equal
- * objects must have equal hash codes.
- * 
- * @version $Id$
- */
-public class HashCodeBuilderAndEqualsBuilderTest {
-
-    //-----------------------------------------------------------------------
-
-    private void testInteger(final boolean testTransients) {
-        final Integer i1 = Integer.valueOf(12345);
-        final Integer i2 = Integer.valueOf(12345);
-        assertEqualsAndHashCodeContract(i1, i2, testTransients);
-    }
-
-    @Test
-    public void testInteger() {
-        testInteger(false);
-    }
-
-    @Test
-    public void testIntegerWithTransients() {
-        testInteger(true);
-    }
-
-    @Test
-    public void testFixture() {
-        testFixture(false);
-    }
-
-    @Test
-    public void testFixtureWithTransients() {
-        testFixture(true);
-    }
-
-    private void testFixture(final boolean testTransients) {
-        assertEqualsAndHashCodeContract(new TestFixture(2, 'c', "Test", (short) 2), new TestFixture(2, 'c', "Test", (short) 2), testTransients);
-        assertEqualsAndHashCodeContract(
-            new AllTransientFixture(2, 'c', "Test", (short) 2),
-            new AllTransientFixture(2, 'c', "Test", (short) 2),
-            testTransients);
-        assertEqualsAndHashCodeContract(
-            new SubTestFixture(2, 'c', "Test", (short) 2, "Same"),
-            new SubTestFixture(2, 'c', "Test", (short) 2, "Same"),
-            testTransients);
-        assertEqualsAndHashCodeContract(
-            new SubAllTransientFixture(2, 'c', "Test", (short) 2, "Same"),
-            new SubAllTransientFixture(2, 'c', "Test", (short) 2, "Same"),
-            testTransients);
-    }
-
-    /**
-     * Asserts that if <code>lhs</code> equals <code>rhs</code> 
-     * then their hash codes MUST be identical.
-     * 
-     * @param lhs The Left-Hand-Side of the equals test
-     * @param rhs The Right-Hand-Side of the equals test
-     * @param testTransients whether to test transient fields
-     */
-    private void assertEqualsAndHashCodeContract(final Object lhs, final Object rhs, final boolean testTransients) {
-        if (EqualsBuilder.reflectionEquals(lhs, rhs, testTransients)) {
-            // test a couple of times for consistency.
-            assertEquals(HashCodeBuilder.reflectionHashCode(lhs, testTransients), HashCodeBuilder.reflectionHashCode(rhs, testTransients));
-            assertEquals(HashCodeBuilder.reflectionHashCode(lhs, testTransients), HashCodeBuilder.reflectionHashCode(rhs, testTransients));
-            assertEquals(HashCodeBuilder.reflectionHashCode(lhs, testTransients), HashCodeBuilder.reflectionHashCode(rhs, testTransients));
-        }
-    }
-
-    static class TestFixture {
-        int i;
-        char c;
-        String string;
-        short s;
-
-        TestFixture(final int i, final char c, final String string, final short s) {
-            this.i = i;
-            this.c = c;
-            this.string = string;
-            this.s = s;
-        }
-    }
-
-    static class SubTestFixture extends TestFixture {
-        transient String tString;
-
-        SubTestFixture(final int i, final char c, final String string, final short s, final String tString) {
-            super(i, c, string, s);
-            this.tString = tString;
-        }
-    }
-
-    static class AllTransientFixture {
-        transient int i;
-        transient char c;
-        transient String string;
-        transient short s;
-
-        AllTransientFixture(final int i, final char c, final String string, final short s) {
-            this.i = i;
-            this.c = c;
-            this.string = string;
-            this.s = s;
-        }
-    }
-
-    static class SubAllTransientFixture extends AllTransientFixture {
-        transient String tString;
-
-        SubAllTransientFixture(final int i, final char c, final String string, final short s, final String tString) {
-            super(i, c, string, s);
-            this.tString = tString;
-        }
-    }
-
-
-}
diff --git a/lang/src/test/java/org/apache/commons/lang3/builder/HashCodeBuilderTest.java b/lang/src/test/java/org/apache/commons/lang3/builder/HashCodeBuilderTest.java
deleted file mode 100644
index 0b51cd5..0000000
--- a/lang/src/test/java/org/apache/commons/lang3/builder/HashCodeBuilderTest.java
+++ /dev/null
@@ -1,568 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- * 
- *      http://www.apache.org/licenses/LICENSE-2.0
- * 
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package org.apache.commons.lang3.builder;
-
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertNull;
-import org.junit.Test;
-
-/**
- * Unit tests {@link org.apache.commons.lang3.builder.HashCodeBuilder}.
- * 
- * @version $Id$
- */
-public class HashCodeBuilderTest {
-
-    /**
-     * A reflection test fixture.
-     */
-    static class ReflectionTestCycleA {
-        ReflectionTestCycleB b;
-
-        @Override
-        public int hashCode() {
-            return HashCodeBuilder.reflectionHashCode(this);
-        }
-    }
-
-    /**
-     * A reflection test fixture.
-     */
-    static class ReflectionTestCycleB {
-        ReflectionTestCycleA a;
-
-        @Override
-        public int hashCode() {
-            return HashCodeBuilder.reflectionHashCode(this);
-        }
-    }
-
-    // -----------------------------------------------------------------------
-
-    @Test(expected=IllegalArgumentException.class)
-    public void testConstructorExZero() {
-        new HashCodeBuilder(0, 0);
-    }
-
-    @Test(expected=IllegalArgumentException.class)
-    public void testConstructorExEvenFirst() {
-        new HashCodeBuilder(2, 3);
-    }
-    
-    @Test(expected=IllegalArgumentException.class)
-    public void testConstructorExEvenSecond() {
-        new HashCodeBuilder(3, 2);
-    }
-
-    @Test(expected=IllegalArgumentException.class)
-    public void testConstructorExEvenNegative() {
-        new HashCodeBuilder(-2, -2);
-    }
-
-    static class TestObject {
-        private int a;
-
-        public TestObject(final int a) {
-            this.a = a;
-        }
-
-        @Override
-        public boolean equals(final Object o) {
-            if (o == this) {
-                return true;
-            }
-            if (!(o instanceof TestObject)) {
-                return false;
-            }
-            final TestObject rhs = (TestObject) o;
-            return a == rhs.a;
-        }
-
-        @Override
-        public int hashCode() {
-            return a;
-        }
-
-        public void setA(final int a) {
-            this.a = a;
-        }
-
-        public int getA() {
-            return a;
-        }
-    }
-
-    static class TestSubObject extends TestObject {
-        private int b;
-
-        @SuppressWarnings("unused")
-        transient private int t;
-
-        public TestSubObject() {
-            super(0);
-        }
-
-        public TestSubObject(final int a, final int b, final int t) {
-            super(a);
-            this.b = b;
-            this.t = t;
-        }
-
-        @Override
-        public boolean equals(final Object o) {
-            if (o == this) {
-                return true;
-            }
-            if (!(o instanceof TestSubObject)) {
-                return false;
-            }
-            final TestSubObject rhs = (TestSubObject) o;
-            return super.equals(o) && b == rhs.b;
-        }
-
-        @Override
-        public int hashCode() {
-            return b*17 + super.hashCode();
-        }
-
-    }
-
-    @Test
-    public void testReflectionHashCode() {
-        assertEquals(17 * 37, HashCodeBuilder.reflectionHashCode(new TestObject(0)));
-        assertEquals(17 * 37 + 123456, HashCodeBuilder.reflectionHashCode(new TestObject(123456)));
-    }
-
-    @Test
-    public void testReflectionHierarchyHashCode() {
-        assertEquals(17 * 37 * 37, HashCodeBuilder.reflectionHashCode(new TestSubObject(0, 0, 0)));
-        assertEquals(17 * 37 * 37 * 37, HashCodeBuilder.reflectionHashCode(new TestSubObject(0, 0, 0), true));
-        assertEquals((17 * 37 + 7890) * 37 + 123456, HashCodeBuilder.reflectionHashCode(new TestSubObject(123456, 7890,
-                0)));
-        assertEquals(((17 * 37 + 7890) * 37 + 0) * 37 + 123456, HashCodeBuilder.reflectionHashCode(new TestSubObject(
-                123456, 7890, 0), true));
-    }
-
-    @Test(expected=IllegalArgumentException.class)
-    public void testReflectionHierarchyHashCodeEx1() {
-        HashCodeBuilder.reflectionHashCode(0, 0, new TestSubObject(0, 0, 0), true);
-    }
-
-    @Test(expected=IllegalArgumentException.class)
-    public void testReflectionHierarchyHashCodeEx2() {
-        HashCodeBuilder.reflectionHashCode(2, 2, new TestSubObject(0, 0, 0), true);
-    }
-
-    @Test(expected=IllegalArgumentException.class)
-    public void testReflectionHashCodeEx1() {
-        HashCodeBuilder.reflectionHashCode(0, 0, new TestObject(0), true);
-    }
-
-    @Test(expected=IllegalArgumentException.class)
-    public void testReflectionHashCodeEx2() {
-        HashCodeBuilder.reflectionHashCode(2, 2, new TestObject(0), true);
-    }
-
-    @Test(expected=IllegalArgumentException.class)
-    public void testReflectionHashCodeEx3() {
-        HashCodeBuilder.reflectionHashCode(13, 19, null, true);
-    }
-
-    @Test
-    public void testSuper() {
-        final Object obj = new Object();
-        assertEquals(17 * 37 + 19 * 41 + obj.hashCode(), new HashCodeBuilder(17, 37).appendSuper(
-                new HashCodeBuilder(19, 41).append(obj).toHashCode()).toHashCode());
-    }
-
-    @Test
-    public void testObject() {
-        Object obj = null;
-        assertEquals(17 * 37, new HashCodeBuilder(17, 37).append(obj).toHashCode());
-        obj = new Object();
-        assertEquals(17 * 37 + obj.hashCode(), new HashCodeBuilder(17, 37).append(obj).toHashCode());
-    }
-    
-    @Test
-    public void testObjectBuild() {
-        Object obj = null;
-        assertEquals(17 * 37, new HashCodeBuilder(17, 37).append(obj).build().intValue());
-        obj = new Object();
-        assertEquals(17 * 37 + obj.hashCode(), new HashCodeBuilder(17, 37).append(obj).build().intValue());
-    }
-
-    @Test
-    @SuppressWarnings("cast") // cast is not really needed, keep for consistency
-    public void testLong() {
-        assertEquals(17 * 37, new HashCodeBuilder(17, 37).append((long) 0L).toHashCode());
-        assertEquals(17 * 37 + (int) (123456789L ^ 123456789L >> 32), new HashCodeBuilder(17, 37).append(
-                (long) 123456789L).toHashCode());
-    }
-
-    @Test
-    @SuppressWarnings("cast") // cast is not really needed, keep for consistency
-    public void testInt() {
-        assertEquals(17 * 37, new HashCodeBuilder(17, 37).append((int) 0).toHashCode());
-        assertEquals(17 * 37 + 123456, new HashCodeBuilder(17, 37).append((int) 123456).toHashCode());
-    }
-
-    @Test
-    public void testShort() {
-        assertEquals(17 * 37, new HashCodeBuilder(17, 37).append((short) 0).toHashCode());
-        assertEquals(17 * 37 + 12345, new HashCodeBuilder(17, 37).append((short) 12345).toHashCode());
-    }
-
-    @Test
-    public void testChar() {
-        assertEquals(17 * 37, new HashCodeBuilder(17, 37).append((char) 0).toHashCode());
-        assertEquals(17 * 37 + 1234, new HashCodeBuilder(17, 37).append((char) 1234).toHashCode());
-    }
-
-    @Test
-    public void testByte() {
-        assertEquals(17 * 37, new HashCodeBuilder(17, 37).append((byte) 0).toHashCode());
-        assertEquals(17 * 37 + 123, new HashCodeBuilder(17, 37).append((byte) 123).toHashCode());
-    }
-
-    @Test
-    @SuppressWarnings("cast") // cast is not really needed, keep for consistency
-    public void testDouble() {
-        assertEquals(17 * 37, new HashCodeBuilder(17, 37).append((double) 0d).toHashCode());
-        final double d = 1234567.89;
-        final long l = Double.doubleToLongBits(d);
-        assertEquals(17 * 37 + (int) (l ^ l >> 32), new HashCodeBuilder(17, 37).append(d).toHashCode());
-    }
-
-    @Test
-    @SuppressWarnings("cast") // cast is not really needed, keep for consistency
-    public void testFloat() {
-        assertEquals(17 * 37, new HashCodeBuilder(17, 37).append((float) 0f).toHashCode());
-        final float f = 1234.89f;
-        final int i = Float.floatToIntBits(f);
-        assertEquals(17 * 37 + i, new HashCodeBuilder(17, 37).append(f).toHashCode());
-    }
-
-    @Test
-    public void testBoolean() {
-        assertEquals(17 * 37 + 0, new HashCodeBuilder(17, 37).append(true).toHashCode());
-        assertEquals(17 * 37 + 1, new HashCodeBuilder(17, 37).append(false).toHashCode());
-    }
-
-    @Test
-    public void testObjectArray() {
-        assertEquals(17 * 37, new HashCodeBuilder(17, 37).append((Object[]) null).toHashCode());
-        final Object[] obj = new Object[2];
-        assertEquals(17 * 37 * 37, new HashCodeBuilder(17, 37).append(obj).toHashCode());
-        obj[0] = new Object();
-        assertEquals((17 * 37 + obj[0].hashCode()) * 37, new HashCodeBuilder(17, 37).append(obj).toHashCode());
-        obj[1] = new Object();
-        assertEquals((17 * 37 + obj[0].hashCode()) * 37 + obj[1].hashCode(), new HashCodeBuilder(17, 37).append(obj)
-                .toHashCode());
-    }
-
-    @Test
-    public void testObjectArrayAsObject() {
-        final Object[] obj = new Object[2];
-        assertEquals(17 * 37 * 37, new HashCodeBuilder(17, 37).append((Object) obj).toHashCode());
-        obj[0] = new Object();
-        assertEquals((17 * 37 + obj[0].hashCode()) * 37, new HashCodeBuilder(17, 37).append((Object) obj).toHashCode());
-        obj[1] = new Object();
-        assertEquals((17 * 37 + obj[0].hashCode()) * 37 + obj[1].hashCode(), new HashCodeBuilder(17, 37).append(
-                (Object) obj).toHashCode());
-    }
-
-    @Test
-    public void testLongArray() {
-        assertEquals(17 * 37, new HashCodeBuilder(17, 37).append((long[]) null).toHashCode());
-        final long[] obj = new long[2];
-        assertEquals(17 * 37 * 37, new HashCodeBuilder(17, 37).append(obj).toHashCode());
-        obj[0] = 5L;
-        final int h1 = (int) (5L ^ 5L >> 32);
-        assertEquals((17 * 37 + h1) * 37, new HashCodeBuilder(17, 37).append(obj).toHashCode());
-        obj[1] = 6L;
-        final int h2 = (int) (6L ^ 6L >> 32);
-        assertEquals((17 * 37 + h1) * 37 + h2, new HashCodeBuilder(17, 37).append(obj).toHashCode());
-    }
-
-    @Test
-    public void testLongArrayAsObject() {
-        final long[] obj = new long[2];
-        assertEquals(17 * 37 * 37, new HashCodeBuilder(17, 37).append((Object) obj).toHashCode());
-        obj[0] = 5L;
-        final int h1 = (int) (5L ^ 5L >> 32);
-        assertEquals((17 * 37 + h1) * 37, new HashCodeBuilder(17, 37).append((Object) obj).toHashCode());
-        obj[1] = 6L;
-        final int h2 = (int) (6L ^ 6L >> 32);
-        assertEquals((17 * 37 + h1) * 37 + h2, new HashCodeBuilder(17, 37).append((Object) obj).toHashCode());
-    }
-
-    @Test
-    public void testIntArray() {
-        assertEquals(17 * 37, new HashCodeBuilder(17, 37).append((int[]) null).toHashCode());
-        final int[] obj = new int[2];
-        assertEquals(17 * 37 * 37, new HashCodeBuilder(17, 37).append(obj).toHashCode());
-        obj[0] = 5;
-        assertEquals((17 * 37 + 5) * 37, new HashCodeBuilder(17, 37).append(obj).toHashCode());
-        obj[1] = 6;
-        assertEquals((17 * 37 + 5) * 37 + 6, new HashCodeBuilder(17, 37).append(obj).toHashCode());
-    }
-
-    @Test
-    public void testIntArrayAsObject() {
-        final int[] obj = new int[2];
-        assertEquals(17 * 37 * 37, new HashCodeBuilder(17, 37).append((Object) obj).toHashCode());
-        obj[0] = 5;
-        assertEquals((17 * 37 + 5) * 37, new HashCodeBuilder(17, 37).append((Object) obj).toHashCode());
-        obj[1] = 6;
-        assertEquals((17 * 37 + 5) * 37 + 6, new HashCodeBuilder(17, 37).append((Object) obj).toHashCode());
-    }
-
-    @Test
-    public void testShortArray() {
-        assertEquals(17 * 37, new HashCodeBuilder(17, 37).append((short[]) null).toHashCode());
-        final short[] obj = new short[2];
-        assertEquals(17 * 37 * 37, new HashCodeBuilder(17, 37).append(obj).toHashCode());
-        obj[0] = (short) 5;
-        assertEquals((17 * 37 + 5) * 37, new HashCodeBuilder(17, 37).append(obj).toHashCode());
-        obj[1] = (short) 6;
-        assertEquals((17 * 37 + 5) * 37 + 6, new HashCodeBuilder(17, 37).append(obj).toHashCode());
-    }
-
-    @Test
-    public void testShortArrayAsObject() {
-        final short[] obj = new short[2];
-        assertEquals(17 * 37 * 37, new HashCodeBuilder(17, 37).append((Object) obj).toHashCode());
-        obj[0] = (short) 5;
-        assertEquals((17 * 37 + 5) * 37, new HashCodeBuilder(17, 37).append((Object) obj).toHashCode());
-        obj[1] = (short) 6;
-        assertEquals((17 * 37 + 5) * 37 + 6, new HashCodeBuilder(17, 37).append((Object) obj).toHashCode());
-    }
-
-    @Test
-    public void testCharArray() {
-        assertEquals(17 * 37, new HashCodeBuilder(17, 37).append((char[]) null).toHashCode());
-        final char[] obj = new char[2];
-        assertEquals(17 * 37 * 37, new HashCodeBuilder(17, 37).append(obj).toHashCode());
-        obj[0] = (char) 5;
-        assertEquals((17 * 37 + 5) * 37, new HashCodeBuilder(17, 37).append(obj).toHashCode());
-        obj[1] = (char) 6;
-        assertEquals((17 * 37 + 5) * 37 + 6, new HashCodeBuilder(17, 37).append(obj).toHashCode());
-    }
-
-    @Test
-    public void testCharArrayAsObject() {
-        final char[] obj = new char[2];
-        assertEquals(17 * 37 * 37, new HashCodeBuilder(17, 37).append((Object) obj).toHashCode());
-        obj[0] = (char) 5;
-        assertEquals((17 * 37 + 5) * 37, new HashCodeBuilder(17, 37).append((Object) obj).toHashCode());
-        obj[1] = (char) 6;
-        assertEquals((17 * 37 + 5) * 37 + 6, new HashCodeBuilder(17, 37).append((Object) obj).toHashCode());
-    }
-
-    @Test
-    public void testByteArray() {
-        assertEquals(17 * 37, new HashCodeBuilder(17, 37).append((byte[]) null).toHashCode());
-        final byte[] obj = new byte[2];
-        assertEquals(17 * 37 * 37, new HashCodeBuilder(17, 37).append(obj).toHashCode());
-        obj[0] = (byte) 5;
-        assertEquals((17 * 37 + 5) * 37, new HashCodeBuilder(17, 37).append(obj).toHashCode());
-        obj[1] = (byte) 6;
-        assertEquals((17 * 37 + 5) * 37 + 6, new HashCodeBuilder(17, 37).append(obj).toHashCode());
-    }
-
-    @Test
-    public void testByteArrayAsObject() {
-        final byte[] obj = new byte[2];
-        assertEquals(17 * 37 * 37, new HashCodeBuilder(17, 37).append((Object) obj).toHashCode());
-        obj[0] = (byte) 5;
-        assertEquals((17 * 37 + 5) * 37, new HashCodeBuilder(17, 37).append((Object) obj).toHashCode());
-        obj[1] = (byte) 6;
-        assertEquals((17 * 37 + 5) * 37 + 6, new HashCodeBuilder(17, 37).append((Object) obj).toHashCode());
-    }
-
-    @Test
-    public void testDoubleArray() {
-        assertEquals(17 * 37, new HashCodeBuilder(17, 37).append((double[]) null).toHashCode());
-        final double[] obj = new double[2];
-        assertEquals(17 * 37 * 37, new HashCodeBuilder(17, 37).append(obj).toHashCode());
-        obj[0] = 5.4d;
-        final long l1 = Double.doubleToLongBits(5.4d);
-        final int h1 = (int) (l1 ^ l1 >> 32);
-        assertEquals((17 * 37 + h1) * 37, new HashCodeBuilder(17, 37).append(obj).toHashCode());
-        obj[1] = 6.3d;
-        final long l2 = Double.doubleToLongBits(6.3d);
-        final int h2 = (int) (l2 ^ l2 >> 32);
-        assertEquals((17 * 37 + h1) * 37 + h2, new HashCodeBuilder(17, 37).append(obj).toHashCode());
-    }
-
-    @Test
-    public void testDoubleArrayAsObject() {
-        final double[] obj = new double[2];
-        assertEquals(17 * 37 * 37, new HashCodeBuilder(17, 37).append((Object) obj).toHashCode());
-        obj[0] = 5.4d;
-        final long l1 = Double.doubleToLongBits(5.4d);
-        final int h1 = (int) (l1 ^ l1 >> 32);
-        assertEquals((17 * 37 + h1) * 37, new HashCodeBuilder(17, 37).append((Object) obj).toHashCode());
-        obj[1] = 6.3d;
-        final long l2 = Double.doubleToLongBits(6.3d);
-        final int h2 = (int) (l2 ^ l2 >> 32);
-        assertEquals((17 * 37 + h1) * 37 + h2, new HashCodeBuilder(17, 37).append((Object) obj).toHashCode());
-    }
-
-    @Test
-    public void testFloatArray() {
-        assertEquals(17 * 37, new HashCodeBuilder(17, 37).append((float[]) null).toHashCode());
-        final float[] obj = new float[2];
-        assertEquals(17 * 37 * 37, new HashCodeBuilder(17, 37).append(obj).toHashCode());
-        obj[0] = 5.4f;
-        final int h1 = Float.floatToIntBits(5.4f);
-        assertEquals((17 * 37 + h1) * 37, new HashCodeBuilder(17, 37).append(obj).toHashCode());
-        obj[1] = 6.3f;
-        final int h2 = Float.floatToIntBits(6.3f);
-        assertEquals((17 * 37 + h1) * 37 + h2, new HashCodeBuilder(17, 37).append(obj).toHashCode());
-    }
-
-    @Test
-    public void testFloatArrayAsObject() {
-        final float[] obj = new float[2];
-        assertEquals(17 * 37 * 37, new HashCodeBuilder(17, 37).append((Object) obj).toHashCode());
-        obj[0] = 5.4f;
-        final int h1 = Float.floatToIntBits(5.4f);
-        assertEquals((17 * 37 + h1) * 37, new HashCodeBuilder(17, 37).append((Object) obj).toHashCode());
-        obj[1] = 6.3f;
-        final int h2 = Float.floatToIntBits(6.3f);
-        assertEquals((17 * 37 + h1) * 37 + h2, new HashCodeBuilder(17, 37).append((Object) obj).toHashCode());
-    }
-
-    @Test
-    public void testBooleanArray() {
-        assertEquals(17 * 37, new HashCodeBuilder(17, 37).append((boolean[]) null).toHashCode());
-        final boolean[] obj = new boolean[2];
-        assertEquals((17 * 37 + 1) * 37 + 1, new HashCodeBuilder(17, 37).append(obj).toHashCode());
-        obj[0] = true;
-        assertEquals((17 * 37 + 0) * 37 + 1, new HashCodeBuilder(17, 37).append(obj).toHashCode());
-        obj[1] = false;
-        assertEquals((17 * 37 + 0) * 37 + 1, new HashCodeBuilder(17, 37).append(obj).toHashCode());
-    }
-
-    @Test
-    public void testBooleanArrayAsObject() {
-        final boolean[] obj = new boolean[2];
-        assertEquals((17 * 37 + 1) * 37 + 1, new HashCodeBuilder(17, 37).append((Object) obj).toHashCode());
-        obj[0] = true;
-        assertEquals((17 * 37 + 0) * 37 + 1, new HashCodeBuilder(17, 37).append((Object) obj).toHashCode());
-        obj[1] = false;
-        assertEquals((17 * 37 + 0) * 37 + 1, new HashCodeBuilder(17, 37).append((Object) obj).toHashCode());
-    }
-
-    @Test
-    public void testBooleanMultiArray() {
-        final boolean[][] obj = new boolean[2][];
-        assertEquals(17 * 37 * 37, new HashCodeBuilder(17, 37).append(obj).toHashCode());
-        obj[0] = new boolean[0];
-        assertEquals(17 * 37, new HashCodeBuilder(17, 37).append(obj).toHashCode());
-        obj[0] = new boolean[1];
-        assertEquals((17 * 37 + 1) * 37, new HashCodeBuilder(17, 37).append(obj).toHashCode());
-        obj[0] = new boolean[2];
-        assertEquals(((17 * 37 + 1) * 37 + 1) * 37, new HashCodeBuilder(17, 37).append(obj).toHashCode());
-        obj[0][0] = true;
-        assertEquals(((17 * 37 + 0) * 37 + 1) * 37, new HashCodeBuilder(17, 37).append(obj).toHashCode());
-        obj[1] = new boolean[1];
-        assertEquals(((17 * 37 + 0) * 37 + 1) * 37 + 1, new HashCodeBuilder(17, 37).append(obj).toHashCode());
-    }
-
-    @Test
-    public void testReflectionHashCodeExcludeFields() throws Exception {
-        final TestObjectWithMultipleFields x = new TestObjectWithMultipleFields(1, 2, 3);
-
-        assertEquals(((17 * 37 + 1) * 37 + 2) * 37 + 3, HashCodeBuilder.reflectionHashCode(x));
-
-        assertEquals(((17 * 37 + 1) * 37 + 2) * 37 + 3, HashCodeBuilder.reflectionHashCode(x, (String[]) null));
-        assertEquals(((17 * 37 + 1) * 37 + 2) * 37 + 3, HashCodeBuilder.reflectionHashCode(x, new String[]{}));
-        assertEquals(((17 * 37 + 1) * 37 + 2) * 37 + 3, HashCodeBuilder.reflectionHashCode(x, new String[]{"xxx"}));
-
-        assertEquals((17 * 37 + 1) * 37 + 3, HashCodeBuilder.reflectionHashCode(x, new String[]{"two"}));
-        assertEquals((17 * 37 + 1) * 37 + 2, HashCodeBuilder.reflectionHashCode(x, new String[]{"three"}));
-
-        assertEquals(17 * 37 + 1, HashCodeBuilder.reflectionHashCode(x, new String[]{"two", "three"}));
-
-        assertEquals(17, HashCodeBuilder.reflectionHashCode(x, new String[]{"one", "two", "three"}));
-        assertEquals(17, HashCodeBuilder.reflectionHashCode(x, new String[]{"one", "two", "three", "xxx"}));
-    }
-
-    static class TestObjectWithMultipleFields {
-        @SuppressWarnings("unused")
-        private int one = 0;
-
-        @SuppressWarnings("unused")
-        private int two = 0;
-
-        @SuppressWarnings("unused")
-        private int three = 0;
-
-        public TestObjectWithMultipleFields(final int one, final int two, final int three) {
-            this.one = one;
-            this.two = two;
-            this.three = three;
-        }
-    }
-
-    /**
-     * Test Objects pointing to each other.
-     */
-    @Test
-    public void testReflectionObjectCycle() {
-        final ReflectionTestCycleA a = new ReflectionTestCycleA();
-        final ReflectionTestCycleB b = new ReflectionTestCycleB();
-        a.b = b;
-        b.a = a;
-        
-        // Used to caused:
-        // java.lang.StackOverflowError
-        // at java.lang.ClassLoader.getCallerClassLoader(Native Method)
-        // at java.lang.Class.getDeclaredFields(Class.java:992)
-        // at org.apache.commons.lang.builder.HashCodeBuilder.reflectionAppend(HashCodeBuilder.java:373)
-        // at org.apache.commons.lang.builder.HashCodeBuilder.reflectionHashCode(HashCodeBuilder.java:349)
-        // at org.apache.commons.lang.builder.HashCodeBuilder.reflectionHashCode(HashCodeBuilder.java:155)
-        // at
-        // org.apache.commons.lang.builder.HashCodeBuilderTest$ReflectionTestCycleB.hashCode(HashCodeBuilderTest.java:53)
-        // at org.apache.commons.lang.builder.HashCodeBuilder.append(HashCodeBuilder.java:422)
-        // at org.apache.commons.lang.builder.HashCodeBuilder.reflectionAppend(HashCodeBuilder.java:383)
-        // at org.apache.commons.lang.builder.HashCodeBuilder.reflectionHashCode(HashCodeBuilder.java:349)
-        // at org.apache.commons.lang.builder.HashCodeBuilder.reflectionHashCode(HashCodeBuilder.java:155)
-        // at
-        // org.apache.commons.lang.builder.HashCodeBuilderTest$ReflectionTestCycleA.hashCode(HashCodeBuilderTest.java:42)
-        // at org.apache.commons.lang.builder.HashCodeBuilder.append(HashCodeBuilder.java:422)
-
-        a.hashCode();
-        assertNull(HashCodeBuilder.getRegistry());
-        b.hashCode();
-        assertNull(HashCodeBuilder.getRegistry());
-    }
-
-    /**
-     * Ensures LANG-520 remains true
-     */
-    @Test
-    public void testToHashCodeEqualsHashCode() {
-        final HashCodeBuilder hcb = new HashCodeBuilder(17, 37).append(new Object()).append('a');
-        assertEquals("hashCode() is no longer returning the same value as toHashCode() - see LANG-520", 
-                     hcb.toHashCode(), hcb.hashCode());
-    }
-
-}
diff --git a/lang/src/test/java/org/apache/commons/lang3/builder/JsonToStringStyleTest.java b/lang/src/test/java/org/apache/commons/lang3/builder/JsonToStringStyleTest.java
deleted file mode 100644
index 530e679..0000000
--- a/lang/src/test/java/org/apache/commons/lang3/builder/JsonToStringStyleTest.java
+++ /dev/null
@@ -1,306 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- * 
- *      http://www.apache.org/licenses/LICENSE-2.0
- * 
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.commons.lang3.builder;
-
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.fail;
-
-import java.util.ArrayList;
-import java.util.HashMap;
-
-import org.apache.commons.lang3.SystemUtils;
-import org.apache.commons.lang3.builder.ToStringStyleTest.Person;
-import org.junit.After;
-import org.junit.Before;
-import org.junit.Test;
-
-/**
- * Unit tests {@link org.apache.commons.lang3.builder.JsonToStringStyleTest}.
- *
- * @version $Id$
- */
-public class JsonToStringStyleTest {
-
-    private final Integer base = Integer.valueOf(5);
-
-    @Before
-    public void setUp() throws Exception {
-        ToStringBuilder.setDefaultStyle(ToStringStyle.JSON_STYLE);
-    }
-
-    @After
-    public void tearDown() throws Exception {
-        ToStringBuilder.setDefaultStyle(ToStringStyle.DEFAULT_STYLE);
-    }
-
-    // ----------------------------------------------------------------
-
-    @Test
-    public void testNull() {
-        assertEquals("null", new ToStringBuilder(null).toString());
-    }
-
-    @Test
-    public void testBlank() {
-        assertEquals("{}", new ToStringBuilder(base).toString());
-    }
-
-    @Test
-    public void testAppendSuper() {
-        assertEquals(
-                "{}",
-                new ToStringBuilder(base).appendSuper(
-                        "Integer@8888[" + SystemUtils.LINE_SEPARATOR + "]")
-                        .toString());
-        assertEquals(
-                "{}",
-                new ToStringBuilder(base).appendSuper(
-                        "Integer@8888[" + SystemUtils.LINE_SEPARATOR + "  null"
-                                + SystemUtils.LINE_SEPARATOR + "]").toString());
-        assertEquals(
-                "{\"a\":\"hello\"}",
-                new ToStringBuilder(base)
-                        .appendSuper(
-                                "Integer@8888[" + SystemUtils.LINE_SEPARATOR
-                                        + "]").append("a", "hello").toString());
-        assertEquals(
-                "{\"a\":\"hello\"}",
-                new ToStringBuilder(base)
-                        .appendSuper(
-                                "Integer@8888[" + SystemUtils.LINE_SEPARATOR
-                                        + "  null" + SystemUtils.LINE_SEPARATOR
-                                        + "]").append("a", "hello").toString());
-        assertEquals("{\"a\":\"hello\"}", new ToStringBuilder(base)
-                .appendSuper(null).append("a", "hello").toString());
-
-        assertEquals("{\"a\":\"hello\",\"b\":\"world\"}", new ToStringBuilder(base)
-                .appendSuper("{\"a\":\"hello\"}").append("b", "world").toString());
-    }
-
-    @Test
-    public void testObject() {
-
-        final Integer i3 = Integer.valueOf(3);
-        final Integer i4 = Integer.valueOf(4);
-
-        try {
-            new ToStringBuilder(base).append((Object) null).toString();
-            fail("Should have generated UnsupportedOperationException");
-        } catch (UnsupportedOperationException e) {
-        }
-
-        try {
-            new ToStringBuilder(base).append(i3).toString();
-            fail("Should have generated UnsupportedOperationException");
-        } catch (UnsupportedOperationException e) {
-        }
-
-        assertEquals("{\"a\":null}",
-                new ToStringBuilder(base).append("a", (Object) null).toString());
-        assertEquals("{\"a\":3}", new ToStringBuilder(base).append("a", i3)
-                .toString());
-        assertEquals("{\"a\":3,\"b\":4}",
-                new ToStringBuilder(base).append("a", i3).append("b", i4)
-                        .toString());
-
-        try {
-            new ToStringBuilder(base).append("a", i3, false).toString();
-            fail("Should have generated UnsupportedOperationException");
-        } catch (UnsupportedOperationException e) {
-        }
-
-        try {
-            new ToStringBuilder(base).append("a", new ArrayList<Object>(), false).toString();
-            fail("Should have generated UnsupportedOperationException");
-        } catch (UnsupportedOperationException e) {
-        }
-
-        assertEquals(
-                "{\"a\":[]}",
-                new ToStringBuilder(base).append("a", new ArrayList<Object>(),
-                        true).toString());
-
-        try {
-            new ToStringBuilder(base).append("a", new HashMap<Object, Object>(), false).toString();
-            fail("Should have generated UnsupportedOperationException");
-        } catch (UnsupportedOperationException e) {
-        }
-
-        assertEquals(
-                "{\"a\":{}}",
-                new ToStringBuilder(base).append("a",
-                        new HashMap<Object, Object>(), true).toString());
-
-        try {
-            new ToStringBuilder(base).append("a", (Object) new String[0], false).toString();
-            fail("Should have generated UnsupportedOperationException");
-        } catch (UnsupportedOperationException e) {
-        }
-
-        assertEquals(
-                "{\"a\":[]}",
-                new ToStringBuilder(base).append("a", (Object) new String[0],
-                        true).toString());
-
-        try {
-            new ToStringBuilder(base).append("a", (Object) new int[]{1, 2, 3}, false).toString();
-            fail("Should have generated UnsupportedOperationException");
-        } catch (UnsupportedOperationException e) {
-        }
-
-
-        assertEquals(
-                "{\"a\":[1,2,3]}",
-                new ToStringBuilder(base).append("a",
-                        (Object) new int[]{1, 2, 3}, true).toString());
-
-        try {
-            new ToStringBuilder(base).append("a", (Object) new String[]{"v", "x", "y", "z"}, false).toString();
-            fail("Should have generated UnsupportedOperationException");
-        } catch (UnsupportedOperationException e) {
-        }
-
-
-        assertEquals(
-                "{\"a\":[\"v\",\"x\",\"y\",\"z\"]}",
-                new ToStringBuilder(base).append("a",
-                        (Object) new String[]{"v", "x", "y", "z"}, true)
-                        .toString());
-    }
-
-    @Test
-    public void testPerson() {
-        final Person p = new Person();
-        p.name = "Jane Doe";
-        p.age = 25;
-        p.smoker = true;
-
-        assertEquals(
-                "{\"name\":\"Jane Doe\",\"age\":25,\"smoker\":true}",
-                new ToStringBuilder(p).append("name", p.name)
-                        .append("age", p.age).append("smoker", p.smoker)
-                        .toString());
-    }
-
-    @Test
-    public void testLong() {
-
-        try {
-            new ToStringBuilder(base).append(3L).toString();
-            fail("Should have generated UnsupportedOperationException");
-        } catch (UnsupportedOperationException e) {
-        }
-
-        assertEquals("{\"a\":3}", new ToStringBuilder(base).append("a", 3L)
-                .toString());
-        assertEquals("{\"a\":3,\"b\":4}",
-                new ToStringBuilder(base).append("a", 3L).append("b", 4L)
-                        .toString());
-    }
-
-    @Test
-    public void testObjectArray() {
-        Object[] array = new Object[]{null, base, new int[]{3, 6}};
-
-        try {
-            new ToStringBuilder(base).append(array).toString();
-            fail("Should have generated UnsupportedOperationException");
-        } catch (UnsupportedOperationException e) {
-        }
-
-        try {
-            new ToStringBuilder(base).append((Object) array).toString();
-            fail("Should have generated UnsupportedOperationException");
-        } catch (UnsupportedOperationException e) {
-        }
-
-        array = null;
-        try {
-            new ToStringBuilder(base).append(array).toString();
-            fail("Should have generated UnsupportedOperationException");
-        } catch (UnsupportedOperationException e) {
-        }
-
-        try {
-            new ToStringBuilder(base).append((Object) array).toString();
-            fail("Should have generated UnsupportedOperationException");
-        } catch (UnsupportedOperationException e) {
-        }
-    }
-
-    @Test
-    public void testLongArray() {
-        long[] array = new long[]{1, 2, -3, 4};
-
-        try {
-            new ToStringBuilder(base).append(array).toString();
-            fail("Should have generated UnsupportedOperationException");
-        } catch (UnsupportedOperationException e) {
-        }
-
-        try {
-            new ToStringBuilder(base).append((Object) array).toString();
-            fail("Should have generated UnsupportedOperationException");
-        } catch (UnsupportedOperationException e) {
-        }
-
-        array = null;
-
-        try {
-            new ToStringBuilder(base).append(array).toString();
-            fail("Should have generated UnsupportedOperationException");
-        } catch (UnsupportedOperationException e) {
-        }
-
-        try {
-            new ToStringBuilder(base).append((Object) array).toString();
-            fail("Should have generated UnsupportedOperationException");
-        } catch (UnsupportedOperationException e) {
-        }
-    }
-
-    @Test
-    public void testLongArrayArray() {
-        long[][] array = new long[][]{{1, 2}, null, {5}};
-
-        try {
-            new ToStringBuilder(base).append(array).toString();
-            fail("Should have generated UnsupportedOperationException");
-        } catch (UnsupportedOperationException e) {
-        }
-
-        try {
-            new ToStringBuilder(base).append((Object) array).toString();
-            fail("Should have generated UnsupportedOperationException");
-        } catch (UnsupportedOperationException e) {
-        }
-
-        array = null;
-
-        try {
-            new ToStringBuilder(base).append(array).toString();
-            fail("Should have generated UnsupportedOperationException");
-        } catch (UnsupportedOperationException e) {
-        }
-
-        try {
-            new ToStringBuilder(base).append((Object) array).toString();
-            fail("Should have generated UnsupportedOperationException");
-        } catch (UnsupportedOperationException e) {
-        }
-    }
-}
diff --git a/lang/src/test/java/org/apache/commons/lang3/builder/MultiLineToStringStyleTest.java b/lang/src/test/java/org/apache/commons/lang3/builder/MultiLineToStringStyleTest.java
deleted file mode 100644
index 3a506a0..0000000
--- a/lang/src/test/java/org/apache/commons/lang3/builder/MultiLineToStringStyleTest.java
+++ /dev/null
@@ -1,132 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- * 
- *      http://www.apache.org/licenses/LICENSE-2.0
- * 
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.commons.lang3.builder;
-
-import static org.junit.Assert.assertEquals;
-
-import java.util.ArrayList;
-import java.util.HashMap;
-
-import org.apache.commons.lang3.SystemUtils;
-import org.apache.commons.lang3.builder.ToStringStyleTest.Person;
-import org.junit.After;
-import org.junit.Before;
-import org.junit.Test;
-
-/**
- * Unit tests {@link org.apache.commons.lang3.builder.MultiLineToStringStyleTest}.
- *
- * @version $Id$
- */
-public class MultiLineToStringStyleTest {
-
-    private final Integer base = Integer.valueOf(5);
-    private final String baseStr = base.getClass().getName() + "@" + Integer.toHexString(System.identityHashCode(base));
-    
-    @Before
-    public void setUp() throws Exception {
-        ToStringBuilder.setDefaultStyle(ToStringStyle.MULTI_LINE_STYLE);
-    }
-
-    @After
-    public void tearDown() throws Exception {
-        ToStringBuilder.setDefaultStyle(ToStringStyle.DEFAULT_STYLE);
-    }
-
-    //----------------------------------------------------------------
-
-    @Test
-    public void testBlank() {
-        assertEquals(baseStr + "[" + SystemUtils.LINE_SEPARATOR + "]", new ToStringBuilder(base).toString());
-    }
-
-    @Test
-    public void testAppendSuper() {
-        assertEquals(baseStr + "[" + SystemUtils.LINE_SEPARATOR + "]", new ToStringBuilder(base).appendSuper("Integer@8888[" + SystemUtils.LINE_SEPARATOR + "]").toString());
-        assertEquals(baseStr + "[" + SystemUtils.LINE_SEPARATOR + "  <null>" + SystemUtils.LINE_SEPARATOR + "]", new ToStringBuilder(base).appendSuper("Integer@8888[" + SystemUtils.LINE_SEPARATOR + "  <null>" + SystemUtils.LINE_SEPARATOR + "]").toString());
-        
-        assertEquals(baseStr + "[" + SystemUtils.LINE_SEPARATOR + "  a=hello" + SystemUtils.LINE_SEPARATOR + "]", new ToStringBuilder(base).appendSuper("Integer@8888[" + SystemUtils.LINE_SEPARATOR + "]").append("a", "hello").toString());
-        assertEquals(baseStr + "[" + SystemUtils.LINE_SEPARATOR + "  <null>" + SystemUtils.LINE_SEPARATOR + "  a=hello" + SystemUtils.LINE_SEPARATOR + "]", new ToStringBuilder(base).appendSuper("Integer@8888[" + SystemUtils.LINE_SEPARATOR + "  <null>" + SystemUtils.LINE_SEPARATOR + "]").append("a", "hello").toString());
-        assertEquals(baseStr + "[" + SystemUtils.LINE_SEPARATOR + "  a=hello" + SystemUtils.LINE_SEPARATOR + "]", new ToStringBuilder(base).appendSuper(null).append("a", "hello").toString());
-    }
-    
-    @Test
-    public void testObject() {
-        final Integer i3 = Integer.valueOf(3);
-        final Integer i4 = Integer.valueOf(4);
-        assertEquals(baseStr + "[" + SystemUtils.LINE_SEPARATOR + "  <null>" + SystemUtils.LINE_SEPARATOR + "]", new ToStringBuilder(base).append((Object) null).toString());
-        assertEquals(baseStr + "[" + SystemUtils.LINE_SEPARATOR + "  3" + SystemUtils.LINE_SEPARATOR + "]", new ToStringBuilder(base).append(i3).toString());
-        assertEquals(baseStr + "[" + SystemUtils.LINE_SEPARATOR + "  a=<null>" + SystemUtils.LINE_SEPARATOR + "]", new ToStringBuilder(base).append("a", (Object) null).toString());
-        assertEquals(baseStr + "[" + SystemUtils.LINE_SEPARATOR + "  a=3" + SystemUtils.LINE_SEPARATOR + "]", new ToStringBuilder(base).append("a", i3).toString());
-        assertEquals(baseStr + "[" + SystemUtils.LINE_SEPARATOR + "  a=3" + SystemUtils.LINE_SEPARATOR + "  b=4" + SystemUtils.LINE_SEPARATOR + "]", new ToStringBuilder(base).append("a", i3).append("b", i4).toString());
-        assertEquals(baseStr + "[" + SystemUtils.LINE_SEPARATOR + "  a=<Integer>" + SystemUtils.LINE_SEPARATOR + "]", new ToStringBuilder(base).append("a", i3, false).toString());
-        assertEquals(baseStr + "[" + SystemUtils.LINE_SEPARATOR + "  a=<size=0>" + SystemUtils.LINE_SEPARATOR + "]", new ToStringBuilder(base).append("a", new ArrayList<Object>(), false).toString());
-        assertEquals(baseStr + "[" + SystemUtils.LINE_SEPARATOR + "  a=[]" + SystemUtils.LINE_SEPARATOR + "]", new ToStringBuilder(base).append("a", new ArrayList<Object>(), true).toString());
-        assertEquals(baseStr + "[" + SystemUtils.LINE_SEPARATOR + "  a=<size=0>" + SystemUtils.LINE_SEPARATOR + "]", new ToStringBuilder(base).append("a", new HashMap<Object, Object>(), false).toString());
-        assertEquals(baseStr + "[" + SystemUtils.LINE_SEPARATOR + "  a={}" + SystemUtils.LINE_SEPARATOR + "]", new ToStringBuilder(base).append("a", new HashMap<Object, Object>(), true).toString());
-        assertEquals(baseStr + "[" + SystemUtils.LINE_SEPARATOR + "  a=<size=0>" + SystemUtils.LINE_SEPARATOR + "]", new ToStringBuilder(base).append("a", (Object) new String[0], false).toString());
-        assertEquals(baseStr + "[" + SystemUtils.LINE_SEPARATOR + "  a={}" + SystemUtils.LINE_SEPARATOR + "]", new ToStringBuilder(base).append("a", (Object) new String[0], true).toString());
-    }
-
-    @Test
-    public void testPerson() {
-        final Person p = new Person();
-        p.name = "Jane Doe";
-        p.age = 25;
-        p.smoker = true;
-        final String pBaseStr = p.getClass().getName() + "@" + Integer.toHexString(System.identityHashCode(p));
-        assertEquals(pBaseStr + "[" + SystemUtils.LINE_SEPARATOR + "  name=Jane Doe" + SystemUtils.LINE_SEPARATOR + "  age=25" + SystemUtils.LINE_SEPARATOR + "  smoker=true" + SystemUtils.LINE_SEPARATOR + "]", new ToStringBuilder(p).append("name", p.name).append("age", p.age).append("smoker", p.smoker).toString());
-    }
-
-    @Test
-    public void testLong() {
-        assertEquals(baseStr + "[" + SystemUtils.LINE_SEPARATOR + "  3" + SystemUtils.LINE_SEPARATOR + "]", new ToStringBuilder(base).append(3L).toString());
-        assertEquals(baseStr + "[" + SystemUtils.LINE_SEPARATOR + "  a=3" + SystemUtils.LINE_SEPARATOR + "]", new ToStringBuilder(base).append("a", 3L).toString());
-        assertEquals(baseStr + "[" + SystemUtils.LINE_SEPARATOR + "  a=3" + SystemUtils.LINE_SEPARATOR + "  b=4" + SystemUtils.LINE_SEPARATOR + "]", new ToStringBuilder(base).append("a", 3L).append("b", 4L).toString());
-    }
-
-    @Test
-    public void testObjectArray() {
-        Object[] array = new Object[] {null, base, new int[] {3, 6}};
-        assertEquals(baseStr + "[" + SystemUtils.LINE_SEPARATOR + "  {<null>,5,{3,6}}" + SystemUtils.LINE_SEPARATOR + "]", new ToStringBuilder(base).append(array).toString());
-        assertEquals(baseStr + "[" + SystemUtils.LINE_SEPARATOR + "  {<null>,5,{3,6}}" + SystemUtils.LINE_SEPARATOR + "]", new ToStringBuilder(base).append((Object) array).toString());
-        array = null;
-        assertEquals(baseStr + "[" + SystemUtils.LINE_SEPARATOR + "  <null>" + SystemUtils.LINE_SEPARATOR + "]", new ToStringBuilder(base).append(array).toString());
-        assertEquals(baseStr + "[" + SystemUtils.LINE_SEPARATOR + "  <null>" + SystemUtils.LINE_SEPARATOR + "]", new ToStringBuilder(base).append((Object) array).toString());
-    }
-
-    @Test
-    public void testLongArray() {
-        long[] array = new long[] {1, 2, -3, 4};
-        assertEquals(baseStr + "[" + SystemUtils.LINE_SEPARATOR + "  {1,2,-3,4}" + SystemUtils.LINE_SEPARATOR + "]", new ToStringBuilder(base).append(array).toString());
-        assertEquals(baseStr + "[" + SystemUtils.LINE_SEPARATOR + "  {1,2,-3,4}" + SystemUtils.LINE_SEPARATOR + "]", new ToStringBuilder(base).append((Object) array).toString());
-        array = null;
-        assertEquals(baseStr + "[" + SystemUtils.LINE_SEPARATOR + "  <null>" + SystemUtils.LINE_SEPARATOR + "]", new ToStringBuilder(base).append(array).toString());
-        assertEquals(baseStr + "[" + SystemUtils.LINE_SEPARATOR + "  <null>" + SystemUtils.LINE_SEPARATOR + "]", new ToStringBuilder(base).append((Object) array).toString());
-    }
-
-    @Test
-    public void testLongArrayArray() {
-        long[][] array = new long[][] {{1, 2}, null, {5}};
-        assertEquals(baseStr + "[" + SystemUtils.LINE_SEPARATOR + "  {{1,2},<null>,{5}}" + SystemUtils.LINE_SEPARATOR + "]", new ToStringBuilder(base).append(array).toString());
-        assertEquals(baseStr + "[" + SystemUtils.LINE_SEPARATOR + "  {{1,2},<null>,{5}}" + SystemUtils.LINE_SEPARATOR + "]", new ToStringBuilder(base).append((Object) array).toString());
-        array = null;
-        assertEquals(baseStr + "[" + SystemUtils.LINE_SEPARATOR + "  <null>" + SystemUtils.LINE_SEPARATOR + "]", new ToStringBuilder(base).append(array).toString());
-        assertEquals(baseStr + "[" + SystemUtils.LINE_SEPARATOR + "  <null>" + SystemUtils.LINE_SEPARATOR + "]", new ToStringBuilder(base).append((Object) array).toString());
-    }
-
-}
diff --git a/lang/src/test/java/org/apache/commons/lang3/builder/MultilineRecursiveToStringStyleTest.java b/lang/src/test/java/org/apache/commons/lang3/builder/MultilineRecursiveToStringStyleTest.java
deleted file mode 100644
index abf64f0..0000000
--- a/lang/src/test/java/org/apache/commons/lang3/builder/MultilineRecursiveToStringStyleTest.java
+++ /dev/null
@@ -1,264 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- * 
- *      http://www.apache.org/licenses/LICENSE-2.0
- * 
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package org.apache.commons.lang3.builder;
-
-import static org.junit.Assert.*;
-
-import java.util.ArrayList;
-import java.util.List;
-
-import org.apache.commons.lang3.SystemUtils;
-import org.junit.Test;
-
-/**
- * @version $Id$
- */
-public class MultilineRecursiveToStringStyleTest {
-
-    private final String BR = SystemUtils.LINE_SEPARATOR;
-
-    @Test
-    public void simpleObject() {
-        Transaction tx = new Transaction("2014.10.15", 100);
-        String expected = getClassPrefix(tx) + "[" + BR 
-                        + "  amount=100.0," + BR 
-                        + "  date=2014.10.15" + BR 
-                        + "]";
-        assertEquals(expected, toString(tx));
-    }
-
-    @Test
-    public void nestedElements() {
-        Customer customer = new Customer("Douglas Adams");
-        Bank bank = new Bank("ASF Bank");
-        customer.bank = bank;
-        String exp = getClassPrefix(customer) + "[" + BR 
-                   + "  name=Douglas Adams," + BR 
-                   + "  bank=" + getClassPrefix(bank) + "[" + BR 
-                   + "    name=ASF Bank" + BR 
-                   + "  ]," + BR 
-                   + "  accounts=<null>" + BR 
-                   + "]";
-        assertEquals(exp, toString(customer));
-    }
-
-    @Test
-    public void nestedAndArray() {
-        Account acc = new Account();
-        Transaction tx1 = new Transaction("2014.10.14", 100);
-        Transaction tx2 = new Transaction("2014.10.15", 50);
-        acc.transactions.add(tx1);
-        acc.transactions.add(tx2);
-        String expected = getClassPrefix(acc) + "[" + BR 
-                        + "  owner=<null>," + BR 
-                        + "  transactions=" + getClassPrefix(acc.transactions) + "{" + BR 
-                        + "    " + getClassPrefix(tx1) + "[" + BR 
-                        + "      amount=100.0," + BR 
-                        + "      date=2014.10.14" + BR 
-                        + "    ]," + BR 
-                        + "    " + getClassPrefix(tx2) + "[" + BR
-                        + "      amount=50.0," + BR 
-                        + "      date=2014.10.15" + BR 
-                        + "    ]" + BR 
-                        + "  }" + BR 
-                        + "]";
-        assertEquals(expected, toString(acc));
-    }
-
-    @Test
-    public void noArray() {
-        WithArrays wa = new WithArrays();
-        String exp = getClassPrefix(wa) + "[" + BR 
-                   + "  boolArray=<null>," + BR 
-                   + "  charArray=<null>," + BR
-                   + "  intArray=<null>," + BR 
-                   + "  doubleArray=<null>," + BR 
-                   + "  longArray=<null>," + BR 
-                   + "  stringArray=<null>" + BR 
-                   + "]";
-        assertEquals(exp, toString(wa));
-    }
-
-    @Test
-    public void boolArray() {
-        WithArrays wa = new WithArrays();
-        wa.boolArray = new boolean[] { true, false, true };
-        String exp = getClassPrefix(wa) + "[" + BR 
-                   + "  boolArray={" + BR 
-                   + "    true," + BR 
-                   + "    false," + BR 
-                   + "    true" + BR 
-                   + "  }," + BR 
-                   + "  charArray=<null>," + BR 
-                   + "  intArray=<null>," + BR 
-                   + "  doubleArray=<null>," + BR
-                   + "  longArray=<null>," + BR 
-                   + "  stringArray=<null>" + BR 
-                   + "]";
-        assertEquals(exp, toString(wa));
-    }
-
-    @Test
-    public void charArray() {
-        WithArrays wa = new WithArrays();
-        wa.charArray = new char[] { 'a', 'A' };
-        String exp = getClassPrefix(wa) + "[" + BR 
-                   + "  boolArray=<null>," + BR 
-                   + "  charArray={" + BR 
-                   + "    a," + BR 
-                   + "    A" + BR 
-                   + "  }," + BR 
-                   + "  intArray=<null>," + BR 
-                   + "  doubleArray=<null>," + BR 
-                   + "  longArray=<null>," + BR
-                   + "  stringArray=<null>" + BR 
-                   + "]";
-        assertEquals(exp, toString(wa));
-    }
-
-    @Test
-    public void intArray() {
-        WithArrays wa = new WithArrays();
-        wa.intArray = new int[] { 1, 2 };
-        String exp = getClassPrefix(wa) + "[" + BR 
-                   + "  boolArray=<null>," + BR 
-                   + "  charArray=<null>," + BR 
-                   + "  intArray={" + BR 
-                   + "    1," + BR 
-                   + "    2" + BR 
-                   + "  }," + BR 
-                   + "  doubleArray=<null>," + BR 
-                   + "  longArray=<null>," + BR
-                   + "  stringArray=<null>" + BR 
-                   + "]";
-        assertEquals(exp, toString(wa));
-    }
-
-    @Test
-    public void doubleArray() {
-        WithArrays wa = new WithArrays();
-        wa.doubleArray = new double[] { 1, 2 };
-        String exp = getClassPrefix(wa) + "[" + BR 
-                   + "  boolArray=<null>," + BR 
-                   + "  charArray=<null>," + BR
-                   + "  intArray=<null>," + BR 
-                   + "  doubleArray={" + BR 
-                   + "    1.0," + BR 
-                   + "    2.0" + BR 
-                   + "  }," + BR
-                   + "  longArray=<null>," + BR 
-                   + "  stringArray=<null>" + BR 
-                   + "]";
-        assertEquals(exp, toString(wa));
-    }
-
-    @Test
-    public void longArray() {
-        WithArrays wa = new WithArrays();
-        wa.longArray = new long[] { 1L, 2L };
-        String exp = getClassPrefix(wa) + "[" + BR 
-                   + "  boolArray=<null>," + BR 
-                   + "  charArray=<null>," + BR
-                   + "  intArray=<null>," + BR 
-                   + "  doubleArray=<null>," + BR 
-                   + "  longArray={" + BR 
-                   + "    1," + BR 
-                   + "    2" + BR
-                   + "  }," + BR 
-                   + "  stringArray=<null>" + BR 
-                   + "]";
-        assertEquals(exp, toString(wa));
-    }
-
-    @Test
-    public void stringArray() {
-        WithArrays wa = new WithArrays();
-        wa.stringArray = new String[] { "a", "A" };
-        String exp = getClassPrefix(wa) + "[" + BR 
-                   + "  boolArray=<null>," + BR 
-                   + "  charArray=<null>," + BR
-                   + "  intArray=<null>," + BR 
-                   + "  doubleArray=<null>," + BR 
-                   + "  longArray=<null>," + BR 
-                   + "  stringArray={" + BR
-                   + "    a," + BR 
-                   + "    A" + BR 
-                   + "  }" + BR 
-                   + "]";
-        assertEquals(exp, toString(wa));
-    }
-
-    private String getClassPrefix(Object object) {
-        return object.getClass().getName() + "@" + Integer.toHexString(System.identityHashCode(object));
-    }
-
-    private String toString(Object object) {
-        return new ReflectionToStringBuilder(object, new MultilineRecursiveToStringStyle()).toString();
-    }
-
-    static class WithArrays {
-        boolean[] boolArray;
-        char[] charArray;
-        int[] intArray;
-        double[] doubleArray;
-        long[] longArray;
-        String[] stringArray;
-    }
-
-    static class Bank {
-        String name;
-
-        public Bank(String name) {
-            this.name = name;
-        }
-    }
-
-    static class Customer {
-        String name;
-        Bank bank;
-        List<Account> accounts;
-
-        public Customer(String name) {
-            this.name = name;
-        }
-    }
-
-    static class Account {
-        Customer owner;
-        List<Transaction> transactions = new ArrayList<Transaction>();
-
-        public double getBalance() {
-            double balance = 0;
-            for (Transaction tx : transactions) {
-                balance += tx.amount;
-            }
-            return balance;
-        }
-    }
-
-    static class Transaction {
-        double amount;
-        String date;
-
-        public Transaction(String datum, double betrag) {
-            this.date = datum;
-            this.amount = betrag;
-        }
-    }
-
-}
diff --git a/lang/src/test/java/org/apache/commons/lang3/builder/NoClassNameToStringStyleTest.java b/lang/src/test/java/org/apache/commons/lang3/builder/NoClassNameToStringStyleTest.java
deleted file mode 100644
index 6b09348..0000000
--- a/lang/src/test/java/org/apache/commons/lang3/builder/NoClassNameToStringStyleTest.java
+++ /dev/null
@@ -1,129 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- * 
- *      http://www.apache.org/licenses/LICENSE-2.0
- * 
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.commons.lang3.builder;
-
-import org.apache.commons.lang3.builder.ToStringStyleTest.Person;
-import org.junit.After;
-import org.junit.Before;
-import org.junit.Test;
-
-import java.util.ArrayList;
-import java.util.HashMap;
-
-import static org.junit.Assert.assertEquals;
-
-/**
- * Unit tests {@link ToStringStyle#NO_CLASS_NAME_STYLE}.
- *
- * @version $Id$
- */
-public class NoClassNameToStringStyleTest {
-
-    private final Integer base = Integer.valueOf(5);
-
-    @Before
-    public void setUp() throws Exception {
-        ToStringBuilder.setDefaultStyle(ToStringStyle.NO_CLASS_NAME_STYLE);
-    }
-
-    @After
-    public void tearDown() throws Exception {
-        ToStringBuilder.setDefaultStyle(ToStringStyle.DEFAULT_STYLE);
-    }
-
-    //----------------------------------------------------------------
-
-    @Test
-    public void testBlank() {
-        assertEquals("[]", new ToStringBuilder(base).toString());
-    }
-
-    @Test
-    public void testAppendSuper() {
-        assertEquals("[]", new ToStringBuilder(base).appendSuper("Integer@8888[]").toString());
-        assertEquals("[<null>]", new ToStringBuilder(base).appendSuper("Integer@8888[<null>]").toString());
-
-        assertEquals("[a=hello]", new ToStringBuilder(base).appendSuper("Integer@8888[]").append("a", "hello").toString());
-        assertEquals("[<null>,a=hello]", new ToStringBuilder(base).appendSuper("Integer@8888[<null>]").append("a", "hello").toString());
-        assertEquals("[a=hello]", new ToStringBuilder(base).appendSuper(null).append("a", "hello").toString());
-    }
-
-    @Test
-    public void testObject() {
-        final Integer i3 = Integer.valueOf(3);
-        final Integer i4 = Integer.valueOf(4);
-        assertEquals("[<null>]", new ToStringBuilder(base).append((Object) null).toString());
-        assertEquals("[3]", new ToStringBuilder(base).append(i3).toString());
-        assertEquals("[a=<null>]", new ToStringBuilder(base).append("a", (Object) null).toString());
-        assertEquals("[a=3]", new ToStringBuilder(base).append("a", i3).toString());
-        assertEquals("[a=3,b=4]", new ToStringBuilder(base).append("a", i3).append("b", i4).toString());
-        assertEquals("[a=<Integer>]", new ToStringBuilder(base).append("a", i3, false).toString());
-        assertEquals("[a=<size=0>]", new ToStringBuilder(base).append("a", new ArrayList<Object>(), false).toString());
-        assertEquals("[a=[]]", new ToStringBuilder(base).append("a", new ArrayList<Object>(), true).toString());
-        assertEquals("[a=<size=0>]", new ToStringBuilder(base).append("a", new HashMap<Object, Object>(), false).toString());
-        assertEquals("[a={}]", new ToStringBuilder(base).append("a", new HashMap<Object, Object>(), true).toString());
-        assertEquals("[a=<size=0>]", new ToStringBuilder(base).append("a", (Object) new String[0], false).toString());
-        assertEquals("[a={}]", new ToStringBuilder(base).append("a", (Object) new String[0], true).toString());
-    }
-
-    @Test
-    public void testPerson() {
-        final Person p = new Person();
-        p.name = "John Q. Public";
-        p.age = 45;
-        p.smoker = true;
-        assertEquals("[name=John Q. Public,age=45,smoker=true]", new ToStringBuilder(p).append("name", p.name).append("age", p.age).append("smoker", p.smoker).toString());
-    }
-
-    @Test
-    public void testLong() {
-        assertEquals("[3]", new ToStringBuilder(base).append(3L).toString());
-        assertEquals("[a=3]", new ToStringBuilder(base).append("a", 3L).toString());
-        assertEquals("[a=3,b=4]", new ToStringBuilder(base).append("a", 3L).append("b", 4L).toString());
-    }
-
-    @Test
-    public void testObjectArray() {
-        Object[] array = new Object[] {null, base, new int[] {3, 6}};
-        assertEquals("[{<null>,5,{3,6}}]", new ToStringBuilder(base).append(array).toString());
-        assertEquals("[{<null>,5,{3,6}}]", new ToStringBuilder(base).append((Object) array).toString());
-        array = null;
-        assertEquals("[<null>]", new ToStringBuilder(base).append(array).toString());
-        assertEquals("[<null>]", new ToStringBuilder(base).append((Object) array).toString());
-    }
-
-    @Test
-    public void testLongArray() {
-        long[] array = new long[] {1, 2, -3, 4};
-        assertEquals("[{1,2,-3,4}]", new ToStringBuilder(base).append(array).toString());
-        assertEquals("[{1,2,-3,4}]", new ToStringBuilder(base).append((Object) array).toString());
-        array = null;
-        assertEquals("[<null>]", new ToStringBuilder(base).append(array).toString());
-        assertEquals("[<null>]", new ToStringBuilder(base).append((Object) array).toString());
-    }
-
-    @Test
-    public void testLongArrayArray() {
-        long[][] array = new long[][] {{1, 2}, null, {5}};
-        assertEquals("[{{1,2},<null>,{5}}]", new ToStringBuilder(base).append(array).toString());
-        assertEquals("[{{1,2},<null>,{5}}]", new ToStringBuilder(base).append((Object) array).toString());
-        array = null;
-        assertEquals("[<null>]", new ToStringBuilder(base).append(array).toString());
-        assertEquals("[<null>]", new ToStringBuilder(base).append((Object) array).toString());
-    }
-
-}
diff --git a/lang/src/test/java/org/apache/commons/lang3/builder/NoFieldNamesToStringStyleTest.java b/lang/src/test/java/org/apache/commons/lang3/builder/NoFieldNamesToStringStyleTest.java
deleted file mode 100644
index 7d64e8f..0000000
--- a/lang/src/test/java/org/apache/commons/lang3/builder/NoFieldNamesToStringStyleTest.java
+++ /dev/null
@@ -1,131 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- * 
- *      http://www.apache.org/licenses/LICENSE-2.0
- * 
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.commons.lang3.builder;
-
-import static org.junit.Assert.assertEquals;
-
-import java.util.ArrayList;
-import java.util.HashMap;
-
-import org.apache.commons.lang3.builder.ToStringStyleTest.Person;
-import org.junit.After;
-import org.junit.Before;
-import org.junit.Test;
-
-/**
- * Unit tests {@link org.apache.commons.lang3.builder.NoFieldNamesToStringStyleTest}.
- *
- * @version $Id$
- */
-public class NoFieldNamesToStringStyleTest {
-
-    private final Integer base = Integer.valueOf(5);
-    private final String baseStr = base.getClass().getName() + "@" + Integer.toHexString(System.identityHashCode(base));
-    
-    @Before
-    public void setUp() throws Exception {
-        ToStringBuilder.setDefaultStyle(ToStringStyle.NO_FIELD_NAMES_STYLE);
-    }
-
-    @After
-    public void tearDown() throws Exception {
-        ToStringBuilder.setDefaultStyle(ToStringStyle.DEFAULT_STYLE);
-    }
-
-    //----------------------------------------------------------------
-    
-    @Test
-    public void testBlank() {
-        assertEquals(baseStr + "[]", new ToStringBuilder(base).toString());
-    }
-
-    @Test
-    public void testAppendSuper() {
-        assertEquals(baseStr + "[]", new ToStringBuilder(base).appendSuper("Integer@8888[]").toString());
-        assertEquals(baseStr + "[<null>]", new ToStringBuilder(base).appendSuper("Integer@8888[<null>]").toString());
-        
-        assertEquals(baseStr + "[hello]", new ToStringBuilder(base).appendSuper("Integer@8888[]").append("a", "hello").toString());
-        assertEquals(baseStr + "[<null>,hello]", new ToStringBuilder(base).appendSuper("Integer@8888[<null>]").append("a", "hello").toString());
-        assertEquals(baseStr + "[hello]", new ToStringBuilder(base).appendSuper(null).append("a", "hello").toString());
-    }
-    
-    @Test
-    public void testObject() {
-        final Integer i3 = Integer.valueOf(3);
-        final Integer i4 = Integer.valueOf(4);
-        assertEquals(baseStr + "[<null>]", new ToStringBuilder(base).append((Object) null).toString());
-        assertEquals(baseStr + "[3]", new ToStringBuilder(base).append(i3).toString());
-        assertEquals(baseStr + "[<null>]", new ToStringBuilder(base).append("a", (Object) null).toString());
-        assertEquals(baseStr + "[3]", new ToStringBuilder(base).append("a", i3).toString());
-        assertEquals(baseStr + "[3,4]", new ToStringBuilder(base).append("a", i3).append("b", i4).toString());
-        assertEquals(baseStr + "[<Integer>]", new ToStringBuilder(base).append("a", i3, false).toString());
-        assertEquals(baseStr + "[<size=0>]", new ToStringBuilder(base).append("a", new ArrayList<Object>(), false).toString());
-        assertEquals(baseStr + "[[]]", new ToStringBuilder(base).append("a", new ArrayList<Object>(), true).toString());
-        assertEquals(baseStr + "[<size=0>]", new ToStringBuilder(base).append("a", new HashMap<Object, Object>(), false).toString());
-        assertEquals(baseStr + "[{}]", new ToStringBuilder(base).append("a", new HashMap<Object, Object>(), true).toString());
-        assertEquals(baseStr + "[<size=0>]", new ToStringBuilder(base).append("a", (Object) new String[0], false).toString());
-        assertEquals(baseStr + "[{}]", new ToStringBuilder(base).append("a", (Object) new String[0], true).toString());
-    }
-
-    @Test
-    public void testPerson() {
-        final Person p = new Person();
-        p.name = "Ron Paul";
-        p.age = 72;
-        p.smoker = false;
-        final String pBaseStr = p.getClass().getName() + "@" + Integer.toHexString(System.identityHashCode(p));
-        assertEquals(pBaseStr + "[Ron Paul,72,false]", new ToStringBuilder(p).append("name", p.name).append("age", p.age).append("smoker", p.smoker).toString());
-    }
-
-    @Test
-    public void testLong() {
-        assertEquals(baseStr + "[3]", new ToStringBuilder(base).append(3L).toString());
-        assertEquals(baseStr + "[3]", new ToStringBuilder(base).append("a", 3L).toString());
-        assertEquals(baseStr + "[3,4]", new ToStringBuilder(base).append("a", 3L).append("b", 4L).toString());
-    }
-
-    @Test
-    public void testObjectArray() {
-        Object[] array = new Object[] {null, base, new int[] {3, 6}};
-        assertEquals(baseStr + "[{<null>,5,{3,6}}]", new ToStringBuilder(base).append(array).toString());
-        assertEquals(baseStr + "[{<null>,5,{3,6}}]", new ToStringBuilder(base).append((Object) array).toString());
-        array = null;
-        assertEquals(baseStr + "[<null>]", new ToStringBuilder(base).append(array).toString());
-        assertEquals(baseStr + "[<null>]", new ToStringBuilder(base).append((Object) array).toString());
-    }
-
-    @Test
-    public void testLongArray() {
-        long[] array = new long[] {1, 2, -3, 4};
-        assertEquals(baseStr + "[{1,2,-3,4}]", new ToStringBuilder(base).append(array).toString());
-        assertEquals(baseStr + "[{1,2,-3,4}]", new ToStringBuilder(base).append((Object) array).toString());
-        array = null;
-        assertEquals(baseStr + "[<null>]", new ToStringBuilder(base).append(array).toString());
-        assertEquals(baseStr + "[<null>]", new ToStringBuilder(base).append((Object) array).toString());
-    }
-
-    @Test
-    public void testLongArrayArray() {
-        long[][] array = new long[][] {{1, 2}, null, {5}};
-        assertEquals(baseStr + "[{{1,2},<null>,{5}}]", new ToStringBuilder(base).append(array).toString());
-        assertEquals(baseStr + "[{{1,2},<null>,{5}}]", new ToStringBuilder(base).append((Object) array).toString());
-        array = null;
-        assertEquals(baseStr + "[<null>]", new ToStringBuilder(base).append(array).toString());
-        assertEquals(baseStr + "[<null>]", new ToStringBuilder(base).append((Object) array).toString());
-    }
-
-}
diff --git a/lang/src/test/java/org/apache/commons/lang3/builder/RecursiveToStringStyleTest.java b/lang/src/test/java/org/apache/commons/lang3/builder/RecursiveToStringStyleTest.java
deleted file mode 100644
index ffaa349..0000000
--- a/lang/src/test/java/org/apache/commons/lang3/builder/RecursiveToStringStyleTest.java
+++ /dev/null
@@ -1,163 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- * 
- *      http://www.apache.org/licenses/LICENSE-2.0
- * 
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.commons.lang3.builder;
-
-import static org.junit.Assert.assertEquals;
-
-import java.util.ArrayList;
-import java.util.HashMap;
-
-import org.junit.After;
-import org.junit.Before;
-import org.junit.Test;
-
-/**
- * Unit tests {@link org.apache.commons.lang3.builder.RecursiveToStringStyleTest}.
- *
- * @version $Id$
- */
-public class RecursiveToStringStyleTest {
-
-    private final Integer base = Integer.valueOf(5);
-    private final String baseStr = base.getClass().getName() + "@" + Integer.toHexString(System.identityHashCode(base));
-    
-    @Before
-    public void setUp() throws Exception {
-        ToStringBuilder.setDefaultStyle(ToStringStyle.DEFAULT_STYLE);
-    }
-
-    @After
-    public void tearDown() throws Exception {
-        ToStringBuilder.setDefaultStyle(ToStringStyle.DEFAULT_STYLE);
-    }
-
-    //----------------------------------------------------------------
-    
-    @Test
-    public void testBlank() {
-        assertEquals(baseStr + "[]", new ToStringBuilder(base).toString());
-    }
-
-    @Test
-    public void testAppendSuper() {
-        assertEquals(baseStr + "[]", new ToStringBuilder(base).appendSuper("Integer@8888[]").toString());
-        assertEquals(baseStr + "[<null>]", new ToStringBuilder(base).appendSuper("Integer@8888[<null>]").toString());
-        
-        assertEquals(baseStr + "[a=hello]", new ToStringBuilder(base).appendSuper("Integer@8888[]").append("a", "hello").toString());
-        assertEquals(baseStr + "[<null>,a=hello]", new ToStringBuilder(base).appendSuper("Integer@8888[<null>]").append("a", "hello").toString());
-        assertEquals(baseStr + "[a=hello]", new ToStringBuilder(base).appendSuper(null).append("a", "hello").toString());
-    }
-    
-    @Test
-    public void testObject() {
-        final Integer i3 = Integer.valueOf(3);
-        final Integer i4 = Integer.valueOf(4);
-        assertEquals(baseStr + "[<null>]", new ToStringBuilder(base).append((Object) null).toString());
-        assertEquals(baseStr + "[3]", new ToStringBuilder(base).append(i3).toString());
-        assertEquals(baseStr + "[a=<null>]", new ToStringBuilder(base).append("a", (Object) null).toString());
-        assertEquals(baseStr + "[a=3]", new ToStringBuilder(base).append("a", i3).toString());
-        assertEquals(baseStr + "[a=3,b=4]", new ToStringBuilder(base).append("a", i3).append("b", i4).toString());
-        assertEquals(baseStr + "[a=<Integer>]", new ToStringBuilder(base).append("a", i3, false).toString());
-        assertEquals(baseStr + "[a=<size=0>]", new ToStringBuilder(base).append("a", new ArrayList<Object>(), false).toString());
-        assertEquals(baseStr + "[a=[]]", new ToStringBuilder(base).append("a", new ArrayList<Object>(), true).toString());
-        assertEquals(baseStr + "[a=<size=0>]", new ToStringBuilder(base).append("a", new HashMap<Object, Object>(), false).toString());
-        assertEquals(baseStr + "[a={}]", new ToStringBuilder(base).append("a", new HashMap<Object, Object>(), true).toString());
-        assertEquals(baseStr + "[a=<size=0>]", new ToStringBuilder(base).append("a", (Object) new String[0], false).toString());
-        assertEquals(baseStr + "[a={}]", new ToStringBuilder(base).append("a", (Object) new String[0], true).toString());
-    }
-
-    @Test
-    public void testPerson() {
-        final Person p = new Person();
-        p.name = "John Doe";
-        p.age = 33;
-        p.smoker = false;
-        p.job = new Job();
-        p.job.title = "Manager";
-        final String pBaseStr = p.getClass().getName() + "@" + Integer.toHexString(System.identityHashCode(p));
-        final String pJobStr  = p.job.getClass().getName() + "@" + Integer.toHexString(System.identityHashCode(p.job));
-        assertEquals(pBaseStr + "[name=John Doe,age=33,smoker=false,job=" + pJobStr + "[title=Manager]]",
-                     new ReflectionToStringBuilder(p, new RecursiveToStringStyle()).toString());
-    }
-
-    @Test
-    public void testLong() {
-        assertEquals(baseStr + "[3]", new ToStringBuilder(base).append(3L).toString());
-        assertEquals(baseStr + "[a=3]", new ToStringBuilder(base).append("a", 3L).toString());
-        assertEquals(baseStr + "[a=3,b=4]", new ToStringBuilder(base).append("a", 3L).append("b", 4L).toString());
-    }
-
-    @Test
-    public void testObjectArray() {
-        Object[] array = new Object[] {null, base, new int[] {3, 6}};
-        assertEquals(baseStr + "[{<null>,5,{3,6}}]", new ToStringBuilder(base).append(array).toString());
-        assertEquals(baseStr + "[{<null>,5,{3,6}}]", new ToStringBuilder(base).append((Object) array).toString());
-        array = null;
-        assertEquals(baseStr + "[<null>]", new ToStringBuilder(base).append(array).toString());
-        assertEquals(baseStr + "[<null>]", new ToStringBuilder(base).append((Object) array).toString());
-    }
-
-    @Test
-    public void testLongArray() {
-        long[] array = new long[] {1, 2, -3, 4};
-        assertEquals(baseStr + "[{1,2,-3,4}]", new ToStringBuilder(base).append(array).toString());
-        assertEquals(baseStr + "[{1,2,-3,4}]", new ToStringBuilder(base).append((Object) array).toString());
-        array = null;
-        assertEquals(baseStr + "[<null>]", new ToStringBuilder(base).append(array).toString());
-        assertEquals(baseStr + "[<null>]", new ToStringBuilder(base).append((Object) array).toString());
-    }
-
-    @Test
-    public void testLongArrayArray() {
-        long[][] array = new long[][] {{1, 2}, null, {5}};
-        assertEquals(baseStr + "[{{1,2},<null>,{5}}]", new ToStringBuilder(base).append(array).toString());
-        assertEquals(baseStr + "[{{1,2},<null>,{5}}]", new ToStringBuilder(base).append((Object) array).toString());
-        array = null;
-        assertEquals(baseStr + "[<null>]", new ToStringBuilder(base).append(array).toString());
-        assertEquals(baseStr + "[<null>]", new ToStringBuilder(base).append((Object) array).toString());
-    }
-
-    static class Person {
-        /**
-         * Test String field.
-         */
-        String name;
-
-        /**
-         * Test integer field.
-         */
-        int age;
-
-        /**
-         * Test boolean field.
-         */
-        boolean smoker;
-        
-        /**
-         * Test Object field.
-         */
-        Job job;
-    }
-    
-    static class Job {
-        /**
-         * Test String field.
-         */
-        String title;
-    }
-
-}
diff --git a/lang/src/test/java/org/apache/commons/lang3/builder/ReflectionToStringBuilderConcurrencyTest.java b/lang/src/test/java/org/apache/commons/lang3/builder/ReflectionToStringBuilderConcurrencyTest.java
deleted file mode 100644
index 1ce1cd9..0000000
--- a/lang/src/test/java/org/apache/commons/lang3/builder/ReflectionToStringBuilderConcurrencyTest.java
+++ /dev/null
@@ -1,122 +0,0 @@
-/*

- * Licensed to the Apache Software Foundation (ASF) under one or more

- * contributor license agreements.  See the NOTICE file distributed with

- * this work for additional information regarding copyright ownership.

- * The ASF licenses this file to You under the Apache License, Version 2.0

- * (the "License"); you may not use this file except in compliance with

- * the License.  You may obtain a copy of the License at

- *

- *      http://www.apache.org/licenses/LICENSE-2.0

- *

- * Unless required by applicable law or agreed to in writing, software

- * distributed under the License is distributed on an "AS IS" BASIS,

- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.

- * See the License for the specific language governing permissions and

- * limitations under the License.

- */

-

-package org.apache.commons.lang3.builder;

-

-import java.util.ArrayList;

-import java.util.Collection;

-import java.util.LinkedList;

-import java.util.List;

-import java.util.concurrent.Callable;

-import java.util.concurrent.CopyOnWriteArrayList;

-import java.util.concurrent.ExecutionException;

-import java.util.concurrent.ExecutorService;

-import java.util.concurrent.Executors;

-import java.util.concurrent.Future;

-import java.util.concurrent.TimeUnit;

-

-import org.junit.Assert;

-import org.junit.Ignore;

-import org.junit.Test;

-

-/**

- * Tests concurrent access for {@link ReflectionToStringBuilder}.

- * <p>

- * The {@link ToStringStyle} class includes a registry to avoid infinite loops for objects with circular references. We

- * want to make sure that we do not get concurrency exceptions accessing this registry.

- * </p>

- * <p>

- * The tests on the non-thread-safe collections do not pass.

- * </p>

- * 

- * @see <a href="https://issues.apache.org/jira/browse/LANG-762">[LANG-762] Handle or document ReflectionToStringBuilder

- *      and ToStringBuilder for collections that are not thread safe</a>

- * @since 3.1

- * @version $Id$

- */

-public class ReflectionToStringBuilderConcurrencyTest {

-

-    static class CollectionHolder<T extends Collection<?>> {

-        T collection;

-

-        CollectionHolder(final T collection) {

-            this.collection = collection;

-        }

-    }

-

-    private static final int DATA_SIZE = 100000;

-    private static final int REPEAT = 100;

-

-    @Test

-    @Ignore

-    public void testLinkedList() throws InterruptedException, ExecutionException {

-        this.testConcurrency(new CollectionHolder<List<Integer>>(new LinkedList<Integer>()));

-    }

-

-    @Test

-    @Ignore

-    public void testArrayList() throws InterruptedException, ExecutionException {

-        this.testConcurrency(new CollectionHolder<List<Integer>>(new ArrayList<Integer>()));

-    }

-

-    @Test

-    @Ignore

-    public void testCopyOnWriteArrayList() throws InterruptedException, ExecutionException {

-        this.testConcurrency(new CollectionHolder<List<Integer>>(new CopyOnWriteArrayList<Integer>()));

-    }

-

-    private void testConcurrency(final CollectionHolder<List<Integer>> holder) throws InterruptedException,

-            ExecutionException {

-        final List<Integer> list = holder.collection;

-        // make a big array that takes a long time to toString()

-        for (int i = 0; i < DATA_SIZE; i++) {

-            list.add(Integer.valueOf(i));

-        }

-        // Create a thread pool with two threads to cause the most contention on the underlying resource.

-        final ExecutorService threadPool = Executors.newFixedThreadPool(2);

-        // Consumes toStrings

-        final Callable<Integer> consumer = new Callable<Integer>() {

-            @Override

-            public Integer call() {

-                for (int i = 0; i < REPEAT; i++) {

-                    final String s = ReflectionToStringBuilder.toString(holder);

-                    Assert.assertNotNull(s);

-                }

-                return Integer.valueOf(REPEAT);

-            }

-        };

-        // Produces changes in the list

-        final Callable<Integer> producer = new Callable<Integer>() {

-            @Override

-            public Integer call() {

-                for (int i = 0; i < DATA_SIZE; i++) {

-                    list.remove(list.get(0));

-                }

-                return Integer.valueOf(REPEAT);

-            }

-        };

-        final Collection<Callable<Integer>> tasks = new ArrayList<Callable<Integer>>();

-        tasks.add(consumer);

-        tasks.add(producer);

-        final List<Future<Integer>> futures = threadPool.invokeAll(tasks);

-        for (final Future<Integer> future : futures) {

-            Assert.assertEquals(REPEAT, future.get().intValue());

-        }

-        threadPool.shutdown();

-        threadPool.awaitTermination(1, TimeUnit.SECONDS);

-    }

-}

diff --git a/lang/src/test/java/org/apache/commons/lang3/builder/ReflectionToStringBuilderExcludeTest.java b/lang/src/test/java/org/apache/commons/lang3/builder/ReflectionToStringBuilderExcludeTest.java
deleted file mode 100644
index 505c1dc..0000000
--- a/lang/src/test/java/org/apache/commons/lang3/builder/ReflectionToStringBuilderExcludeTest.java
+++ /dev/null
@@ -1,137 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- * 
- *      http://www.apache.org/licenses/LICENSE-2.0
- * 
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package org.apache.commons.lang3.builder;
-
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.List;
-
-import org.junit.Assert;
-
-import org.apache.commons.lang3.ArrayUtils;
-import org.junit.Test;
-
-/**
- * @version $Id$
- */
-public class ReflectionToStringBuilderExcludeTest {
-
-    class TestFixture {
-        @SuppressWarnings("unused")
-        private final String secretField = SECRET_VALUE;
-
-        @SuppressWarnings("unused")
-        private final String showField = NOT_SECRET_VALUE;
-    }
-
-    private static final String NOT_SECRET_FIELD = "showField";
-
-    private static final String NOT_SECRET_VALUE = "Hello World!";
-
-    private static final String SECRET_FIELD = "secretField";
-
-    private static final String SECRET_VALUE = "secret value";
-
-    @Test
-    public void test_toStringExclude() {
-        final String toString = ReflectionToStringBuilder.toStringExclude(new TestFixture(), SECRET_FIELD);
-        this.validateSecretFieldAbsent(toString);
-    }
-
-    @Test
-    public void test_toStringExcludeArray() {
-        final String toString = ReflectionToStringBuilder.toStringExclude(new TestFixture(), new String[]{SECRET_FIELD});
-        this.validateSecretFieldAbsent(toString);
-    }
-
-    @Test
-    public void test_toStringExcludeArrayWithNull() {
-        final String toString = ReflectionToStringBuilder.toStringExclude(new TestFixture(), new String[]{null});
-        this.validateSecretFieldPresent(toString);
-    }
-
-    @Test
-    public void test_toStringExcludeArrayWithNulls() {
-        final String toString = ReflectionToStringBuilder.toStringExclude(new TestFixture(), new String[]{null, null});
-        this.validateSecretFieldPresent(toString);
-    }
-
-    @Test
-    public void test_toStringExcludeCollection() {
-        final List<String> excludeList = new ArrayList<String>();
-        excludeList.add(SECRET_FIELD);
-        final String toString = ReflectionToStringBuilder.toStringExclude(new TestFixture(), excludeList);
-        this.validateSecretFieldAbsent(toString);
-    }
-
-    @Test
-    public void test_toStringExcludeCollectionWithNull() {
-        final List<String> excludeList = new ArrayList<String>();
-        excludeList.add(null);
-        final String toString = ReflectionToStringBuilder.toStringExclude(new TestFixture(), excludeList);
-        this.validateSecretFieldPresent(toString);
-    }
-
-    @Test
-    public void test_toStringExcludeCollectionWithNulls() {
-        final List<String> excludeList = new ArrayList<String>();
-        excludeList.add(null);
-        excludeList.add(null);
-        final String toString = ReflectionToStringBuilder.toStringExclude(new TestFixture(), excludeList);
-        this.validateSecretFieldPresent(toString);
-    }
-
-    @Test
-    public void test_toStringExcludeEmptyArray() {
-        final String toString = ReflectionToStringBuilder.toStringExclude(new TestFixture(), ArrayUtils.EMPTY_STRING_ARRAY);
-        this.validateSecretFieldPresent(toString);
-    }
-
-    @Test
-    public void test_toStringExcludeEmptyCollection() {
-        final String toString = ReflectionToStringBuilder.toStringExclude(new TestFixture(), new ArrayList<String>());
-        this.validateSecretFieldPresent(toString);
-    }
-
-    @Test
-    public void test_toStringExcludeNullArray() {
-        final String toString = ReflectionToStringBuilder.toStringExclude(new TestFixture(), (String[]) null);
-        this.validateSecretFieldPresent(toString);
-    }
-
-    @Test
-    public void test_toStringExcludeNullCollection() {
-        final String toString = ReflectionToStringBuilder.toStringExclude(new TestFixture(), (Collection<String>) null);
-        this.validateSecretFieldPresent(toString);
-    }
-
-    private void validateNonSecretField(final String toString) {
-        Assert.assertTrue(toString.indexOf(NOT_SECRET_FIELD) > ArrayUtils.INDEX_NOT_FOUND);
-        Assert.assertTrue(toString.indexOf(NOT_SECRET_VALUE) > ArrayUtils.INDEX_NOT_FOUND);
-    }
-
-    private void validateSecretFieldAbsent(final String toString) {
-        Assert.assertEquals(ArrayUtils.INDEX_NOT_FOUND, toString.indexOf(SECRET_VALUE));
-        this.validateNonSecretField(toString);
-    }
-
-    private void validateSecretFieldPresent(final String toString) {
-        Assert.assertTrue(toString.indexOf(SECRET_VALUE) > 0);
-        this.validateNonSecretField(toString);
-    }
-}
diff --git a/lang/src/test/java/org/apache/commons/lang3/builder/ReflectionToStringBuilderMutateInspectConcurrencyTest.java b/lang/src/test/java/org/apache/commons/lang3/builder/ReflectionToStringBuilderMutateInspectConcurrencyTest.java
deleted file mode 100644
index c489911..0000000
--- a/lang/src/test/java/org/apache/commons/lang3/builder/ReflectionToStringBuilderMutateInspectConcurrencyTest.java
+++ /dev/null
@@ -1,108 +0,0 @@
-/*

- * Licensed to the Apache Software Foundation (ASF) under one or more

- * contributor license agreements.  See the NOTICE file distributed with

- * this work for additional information regarding copyright ownership.

- * The ASF licenses this file to You under the Apache License, Version 2.0

- * (the "License"); you may not use this file except in compliance with

- * the License.  You may obtain a copy of the License at

- * 

- *      http://www.apache.org/licenses/LICENSE-2.0

- * 

- * Unless required by applicable law or agreed to in writing, software

- * distributed under the License is distributed on an "AS IS" BASIS,

- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.

- * See the License for the specific language governing permissions and

- * limitations under the License.

- */

-

-package org.apache.commons.lang3.builder;

-

-import java.util.LinkedList;

-import java.util.Random;

-

-import org.junit.Ignore;

-import org.junit.Test;

-

-/**

- * Tests concurrent access for {@link ReflectionToStringBuilder}.

- * <p>

- * The {@link ToStringStyle} class includes a registry to avoid infinite loops for objects with circular references. We

- * want to make sure that we do not get concurrency exceptions accessing this registry.

- * </p>

- * 

- * @see <a href="https://issues.apache.org/jira/browse/LANG-762">[LANG-762] Handle or document ReflectionToStringBuilder

- *      and ToStringBuilder for collections that are not thread safe</a>

- * @since 3.1

- * @version $Id$

- */

-public class ReflectionToStringBuilderMutateInspectConcurrencyTest {

-

-    class TestFixture {

-        final private LinkedList<Integer> listField = new LinkedList<Integer>();

-        final private Random random = new Random();

-        private final int N = 100;

-

-        public TestFixture() {

-            synchronized (this) {

-                for (int i = 0; i < N; i++) {

-                    listField.add(Integer.valueOf(i));

-                }

-            }

-        }

-

-        public synchronized void add() {

-            listField.add(Integer.valueOf(random.nextInt(N)));

-        }

-

-        public synchronized void delete() {

-            listField.remove(Integer.valueOf(random.nextInt(N)));

-        }

-    }

-

-    class MutatingClient implements Runnable {

-        final private TestFixture testFixture;

-        final private Random random = new Random();

-

-        public MutatingClient(final TestFixture testFixture) {

-            this.testFixture = testFixture;

-        }

-

-        @Override

-        public void run() {

-            if (random.nextBoolean()) {

-                testFixture.add();

-            } else {

-                testFixture.delete();

-            }

-        }

-    }

-

-    class InspectingClient implements Runnable {

-        final private TestFixture testFixture;

-

-        public InspectingClient(final TestFixture testFixture) {

-            this.testFixture = testFixture;

-        }

-

-        @Override

-        public void run() {

-            ReflectionToStringBuilder.toString(testFixture);

-        }

-    }

-

-    @Test

-    @Ignore

-    public void testConcurrency() throws Exception {

-        final TestFixture testFixture = new TestFixture();

-        final int numMutators = 10;

-        final int numIterations = 10;

-        for (int i = 0; i < numIterations; i++) {

-            for (int j = 0; j < numMutators; j++) {

-                final Thread t = new Thread(new MutatingClient(testFixture));

-                t.start();

-                final Thread s = new Thread(new InspectingClient(testFixture));

-                s.start();

-            }

-        }

-    }

-}

diff --git a/lang/src/test/java/org/apache/commons/lang3/builder/ShortPrefixToStringStyleTest.java b/lang/src/test/java/org/apache/commons/lang3/builder/ShortPrefixToStringStyleTest.java
deleted file mode 100644
index 124cb1a..0000000
--- a/lang/src/test/java/org/apache/commons/lang3/builder/ShortPrefixToStringStyleTest.java
+++ /dev/null
@@ -1,131 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- * 
- *      http://www.apache.org/licenses/LICENSE-2.0
- * 
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.commons.lang3.builder;
-
-import static org.junit.Assert.assertEquals;
-
-import java.util.ArrayList;
-import java.util.HashMap;
-
-import org.apache.commons.lang3.builder.ToStringStyleTest.Person;
-import org.junit.After;
-import org.junit.Before;
-import org.junit.Test;
-
-/**
- * Unit tests {@link org.apache.commons.lang3.builder.ToStringStyle#SHORT_PREFIX_STYLE}.
- * 
- * @version $Id$
- */
-public class ShortPrefixToStringStyleTest {
-
-    private final Integer base = Integer.valueOf(5);
-    private final String baseStr = "Integer";
-    
-    @Before
-    public void setUp() throws Exception {
-        ToStringBuilder.setDefaultStyle(ToStringStyle.SHORT_PREFIX_STYLE);
-    }
-
-    @After
-    public void tearDown() throws Exception {
-        ToStringBuilder.setDefaultStyle(ToStringStyle.DEFAULT_STYLE);
-    }
-
-    //----------------------------------------------------------------
-    
-    @Test
-    public void testBlank() {
-        assertEquals(baseStr + "[]", new ToStringBuilder(base).toString());
-    }
-
-    @Test
-    public void testAppendSuper() {
-        assertEquals(baseStr + "[]", new ToStringBuilder(base).appendSuper("Integer@8888[]").toString());
-        assertEquals(baseStr + "[<null>]", new ToStringBuilder(base).appendSuper("Integer@8888[<null>]").toString());
-        
-        assertEquals(baseStr + "[a=hello]", new ToStringBuilder(base).appendSuper("Integer@8888[]").append("a", "hello").toString());
-        assertEquals(baseStr + "[<null>,a=hello]", new ToStringBuilder(base).appendSuper("Integer@8888[<null>]").append("a", "hello").toString());
-        assertEquals(baseStr + "[a=hello]", new ToStringBuilder(base).appendSuper(null).append("a", "hello").toString());
-    }
-    
-    @Test
-    public void testObject() {
-        final Integer i3 = Integer.valueOf(3);
-        final Integer i4 = Integer.valueOf(4);
-        assertEquals(baseStr + "[<null>]", new ToStringBuilder(base).append((Object) null).toString());
-        assertEquals(baseStr + "[3]", new ToStringBuilder(base).append(i3).toString());
-        assertEquals(baseStr + "[a=<null>]", new ToStringBuilder(base).append("a", (Object) null).toString());
-        assertEquals(baseStr + "[a=3]", new ToStringBuilder(base).append("a", i3).toString());
-        assertEquals(baseStr + "[a=3,b=4]", new ToStringBuilder(base).append("a", i3).append("b", i4).toString());
-        assertEquals(baseStr + "[a=<Integer>]", new ToStringBuilder(base).append("a", i3, false).toString());
-        assertEquals(baseStr + "[a=<size=0>]", new ToStringBuilder(base).append("a", new ArrayList<Object>(), false).toString());
-        assertEquals(baseStr + "[a=[]]", new ToStringBuilder(base).append("a", new ArrayList<Object>(), true).toString());
-        assertEquals(baseStr + "[a=<size=0>]", new ToStringBuilder(base).append("a", new HashMap<Object, Object>(), false).toString());
-        assertEquals(baseStr + "[a={}]", new ToStringBuilder(base).append("a", new HashMap<Object, Object>(), true).toString());
-        assertEquals(baseStr + "[a=<size=0>]", new ToStringBuilder(base).append("a", (Object) new String[0], false).toString());
-        assertEquals(baseStr + "[a={}]", new ToStringBuilder(base).append("a", (Object) new String[0], true).toString());
-    }
-
-    @Test
-    public void testPerson() {
-        final Person p = new Person();
-        p.name = "John Q. Public";
-        p.age = 45;
-        p.smoker = true;
-        final String pBaseStr = "ToStringStyleTest.Person";
-        assertEquals(pBaseStr + "[name=John Q. Public,age=45,smoker=true]", new ToStringBuilder(p).append("name", p.name).append("age", p.age).append("smoker", p.smoker).toString());
-    }
-
-    @Test
-    public void testLong() {
-        assertEquals(baseStr + "[3]", new ToStringBuilder(base).append(3L).toString());
-        assertEquals(baseStr + "[a=3]", new ToStringBuilder(base).append("a", 3L).toString());
-        assertEquals(baseStr + "[a=3,b=4]", new ToStringBuilder(base).append("a", 3L).append("b", 4L).toString());
-    }
-
-    @Test
-    public void testObjectArray() {
-        Object[] array = new Object[] {null, base, new int[] {3, 6}};
-        assertEquals(baseStr + "[{<null>,5,{3,6}}]", new ToStringBuilder(base).append(array).toString());
-        assertEquals(baseStr + "[{<null>,5,{3,6}}]", new ToStringBuilder(base).append((Object) array).toString());
-        array = null;
-        assertEquals(baseStr + "[<null>]", new ToStringBuilder(base).append(array).toString());
-        assertEquals(baseStr + "[<null>]", new ToStringBuilder(base).append((Object) array).toString());
-    }
-
-    @Test
-    public void testLongArray() {
-        long[] array = new long[] {1, 2, -3, 4};
-        assertEquals(baseStr + "[{1,2,-3,4}]", new ToStringBuilder(base).append(array).toString());
-        assertEquals(baseStr + "[{1,2,-3,4}]", new ToStringBuilder(base).append((Object) array).toString());
-        array = null;
-        assertEquals(baseStr + "[<null>]", new ToStringBuilder(base).append(array).toString());
-        assertEquals(baseStr + "[<null>]", new ToStringBuilder(base).append((Object) array).toString());
-    }
-
-    @Test
-    public void testLongArrayArray() {
-        long[][] array = new long[][] {{1, 2}, null, {5}};
-        assertEquals(baseStr + "[{{1,2},<null>,{5}}]", new ToStringBuilder(base).append(array).toString());
-        assertEquals(baseStr + "[{{1,2},<null>,{5}}]", new ToStringBuilder(base).append((Object) array).toString());
-        array = null;
-        assertEquals(baseStr + "[<null>]", new ToStringBuilder(base).append(array).toString());
-        assertEquals(baseStr + "[<null>]", new ToStringBuilder(base).append((Object) array).toString());
-    }
-    
-}
diff --git a/lang/src/test/java/org/apache/commons/lang3/builder/SimpleToStringStyleTest.java b/lang/src/test/java/org/apache/commons/lang3/builder/SimpleToStringStyleTest.java
deleted file mode 100644
index 93e0b85..0000000
--- a/lang/src/test/java/org/apache/commons/lang3/builder/SimpleToStringStyleTest.java
+++ /dev/null
@@ -1,129 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- * 
- *      http://www.apache.org/licenses/LICENSE-2.0
- * 
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.commons.lang3.builder;
-
-import static org.junit.Assert.assertEquals;
-
-import java.util.ArrayList;
-import java.util.HashMap;
-
-import org.apache.commons.lang3.builder.ToStringStyleTest.Person;
-import org.junit.After;
-import org.junit.Before;
-import org.junit.Test;
-
-/**
- * Unit tests {@link org.apache.commons.lang3.builder.SimpleToStringStyleTest}.
- *
- * @version $Id$
- */
-public class SimpleToStringStyleTest {
-
-    private final Integer base = Integer.valueOf(5);
-    
-    @Before
-    public void setUp() throws Exception {
-        ToStringBuilder.setDefaultStyle(ToStringStyle.SIMPLE_STYLE);
-    }
-
-    @After
-    public void tearDown() throws Exception {
-        ToStringBuilder.setDefaultStyle(ToStringStyle.DEFAULT_STYLE);
-    }
-
-    //----------------------------------------------------------------
-    
-    @Test
-    public void testBlank() {
-        assertEquals("", new ToStringBuilder(base).toString());
-    }
-
-    @Test
-    public void testAppendSuper() {
-        assertEquals("", new ToStringBuilder(base).appendSuper("").toString());
-        assertEquals("<null>", new ToStringBuilder(base).appendSuper("<null>").toString());
-        
-        assertEquals("hello", new ToStringBuilder(base).appendSuper("").append("a", "hello").toString());
-        assertEquals("<null>,hello", new ToStringBuilder(base).appendSuper("<null>").append("a", "hello").toString());
-        assertEquals("hello", new ToStringBuilder(base).appendSuper(null).append("a", "hello").toString());
-    }
-    
-    @Test
-    public void testObject() {
-        final Integer i3 = Integer.valueOf(3);
-        final Integer i4 = Integer.valueOf(4);
-        assertEquals("<null>", new ToStringBuilder(base).append((Object) null).toString());
-        assertEquals("3", new ToStringBuilder(base).append(i3).toString());
-        assertEquals("<null>", new ToStringBuilder(base).append("a", (Object) null).toString());
-        assertEquals("3", new ToStringBuilder(base).append("a", i3).toString());
-        assertEquals("3,4", new ToStringBuilder(base).append("a", i3).append("b", i4).toString());
-        assertEquals("<Integer>", new ToStringBuilder(base).append("a", i3, false).toString());
-        assertEquals("<size=0>", new ToStringBuilder(base).append("a", new ArrayList<Object>(), false).toString());
-        assertEquals("[]", new ToStringBuilder(base).append("a", new ArrayList<Object>(), true).toString());
-        assertEquals("<size=0>", new ToStringBuilder(base).append("a", new HashMap<Object, Object>(), false).toString());
-        assertEquals("{}", new ToStringBuilder(base).append("a", new HashMap<Object, Object>(), true).toString());
-        assertEquals("<size=0>", new ToStringBuilder(base).append("a", (Object) new String[0], false).toString());
-        assertEquals("{}", new ToStringBuilder(base).append("a", (Object) new String[0], true).toString());
-    }
-
-    @Test
-    public void testPerson() {
-        final Person p = new Person();
-        p.name = "Jane Q. Public";
-        p.age = 47;
-        p.smoker = false;
-        assertEquals("Jane Q. Public,47,false", new ToStringBuilder(p).append("name", p.name).append("age", p.age).append("smoker", p.smoker).toString());
-    }
-
-    @Test
-    public void testLong() {
-        assertEquals("3", new ToStringBuilder(base).append(3L).toString());
-        assertEquals("3", new ToStringBuilder(base).append("a", 3L).toString());
-        assertEquals("3,4", new ToStringBuilder(base).append("a", 3L).append("b", 4L).toString());
-    }
-
-    @Test
-    public void testObjectArray() {
-        Object[] array = new Object[] {null, base, new int[] {3, 6}};
-        assertEquals("{<null>,5,{3,6}}", new ToStringBuilder(base).append(array).toString());
-        assertEquals("{<null>,5,{3,6}}", new ToStringBuilder(base).append((Object) array).toString());
-        array = null;
-        assertEquals("<null>", new ToStringBuilder(base).append(array).toString());
-        assertEquals("<null>", new ToStringBuilder(base).append((Object) array).toString());
-    }
-
-    @Test
-    public void testLongArray() {
-        long[] array = new long[] {1, 2, -3, 4};
-        assertEquals("{1,2,-3,4}", new ToStringBuilder(base).append(array).toString());
-        assertEquals("{1,2,-3,4}", new ToStringBuilder(base).append((Object) array).toString());
-        array = null;
-        assertEquals("<null>", new ToStringBuilder(base).append(array).toString());
-        assertEquals("<null>", new ToStringBuilder(base).append((Object) array).toString());
-    }
-
-    @Test
-    public void testLongArrayArray() {
-        long[][] array = new long[][] {{1, 2}, null, {5}};
-        assertEquals("{{1,2},<null>,{5}}", new ToStringBuilder(base).append(array).toString());
-        assertEquals("{{1,2},<null>,{5}}", new ToStringBuilder(base).append((Object) array).toString());
-        array = null;
-        assertEquals("<null>", new ToStringBuilder(base).append(array).toString());
-        assertEquals("<null>", new ToStringBuilder(base).append((Object) array).toString());
-    }
-
-}
diff --git a/lang/src/test/java/org/apache/commons/lang3/builder/StandardToStringStyleTest.java b/lang/src/test/java/org/apache/commons/lang3/builder/StandardToStringStyleTest.java
deleted file mode 100644
index 7036395..0000000
--- a/lang/src/test/java/org/apache/commons/lang3/builder/StandardToStringStyleTest.java
+++ /dev/null
@@ -1,146 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- * 
- *      http://www.apache.org/licenses/LICENSE-2.0
- * 
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.commons.lang3.builder;
-
-import static org.junit.Assert.assertEquals;
-
-import java.util.ArrayList;
-import java.util.HashMap;
-
-import org.apache.commons.lang3.builder.ToStringStyleTest.Person;
-import org.junit.After;
-import org.junit.Before;
-import org.junit.Test;
-
-/**
- * Unit tests {@link org.apache.commons.lang3.builder.ToStringStyle}.
- *
- * @version $Id$
- */
-public class StandardToStringStyleTest {
-
-    private final Integer base = Integer.valueOf(5);
-    private final String baseStr = "Integer";
-    
-    private static final StandardToStringStyle STYLE = new StandardToStringStyle();
-    
-    static {
-        STYLE.setUseShortClassName(true);
-        STYLE.setUseIdentityHashCode(false);
-        STYLE.setArrayStart("[");
-        STYLE.setArraySeparator(", ");
-        STYLE.setArrayEnd("]");
-        STYLE.setNullText("%NULL%");
-        STYLE.setSizeStartText("%SIZE=");
-        STYLE.setSizeEndText("%");
-        STYLE.setSummaryObjectStartText("%");
-        STYLE.setSummaryObjectEndText("%");
-    }
-    
-    @Before
-    public void setUp() throws Exception {
-        ToStringBuilder.setDefaultStyle(STYLE);
-    }
-
-    @After
-    public void tearDown() throws Exception {
-        ToStringBuilder.setDefaultStyle(ToStringStyle.DEFAULT_STYLE);
-    }
-
-    //----------------------------------------------------------------
-    
-    @Test
-    public void testBlank() {
-        assertEquals(baseStr + "[]", new ToStringBuilder(base).toString());
-    }
-
-    @Test
-    public void testAppendSuper() {
-        assertEquals(baseStr + "[]", new ToStringBuilder(base).appendSuper("Integer@8888[]").toString());
-        assertEquals(baseStr + "[%NULL%]", new ToStringBuilder(base).appendSuper("Integer@8888[%NULL%]").toString());
-        
-        assertEquals(baseStr + "[a=hello]", new ToStringBuilder(base).appendSuper("Integer@8888[]").append("a", "hello").toString());
-        assertEquals(baseStr + "[%NULL%,a=hello]", new ToStringBuilder(base).appendSuper("Integer@8888[%NULL%]").append("a", "hello").toString());
-        assertEquals(baseStr + "[a=hello]", new ToStringBuilder(base).appendSuper(null).append("a", "hello").toString());
-    }
-    
-    @Test
-    public void testObject() {
-        final Integer i3 = Integer.valueOf(3);
-        final Integer i4 = Integer.valueOf(4);
-        assertEquals(baseStr + "[%NULL%]", new ToStringBuilder(base).append((Object) null).toString());
-        assertEquals(baseStr + "[3]", new ToStringBuilder(base).append(i3).toString());
-        assertEquals(baseStr + "[a=%NULL%]", new ToStringBuilder(base).append("a", (Object) null).toString());
-        assertEquals(baseStr + "[a=3]", new ToStringBuilder(base).append("a", i3).toString());
-        assertEquals(baseStr + "[a=3,b=4]", new ToStringBuilder(base).append("a", i3).append("b", i4).toString());
-        assertEquals(baseStr + "[a=%Integer%]", new ToStringBuilder(base).append("a", i3, false).toString());
-        assertEquals(baseStr + "[a=%SIZE=0%]", new ToStringBuilder(base).append("a", new ArrayList<Object>(), false).toString());
-        assertEquals(baseStr + "[a=[]]", new ToStringBuilder(base).append("a", new ArrayList<Object>(), true).toString());
-        assertEquals(baseStr + "[a=%SIZE=0%]", new ToStringBuilder(base).append("a", new HashMap<Object, Object>(), false).toString());
-        assertEquals(baseStr + "[a={}]", new ToStringBuilder(base).append("a", new HashMap<Object, Object>(), true).toString());
-        assertEquals(baseStr + "[a=%SIZE=0%]", new ToStringBuilder(base).append("a", (Object) new String[0], false).toString());
-        assertEquals(baseStr + "[a=[]]", new ToStringBuilder(base).append("a", (Object) new String[0], true).toString());
-    }
-
-    @Test
-    public void testPerson() {
-        final Person p = new Person();
-        p.name = "Suzy Queue";
-        p.age = 19;
-        p.smoker = false;
-        final String pBaseStr = "ToStringStyleTest.Person";
-        assertEquals(pBaseStr + "[name=Suzy Queue,age=19,smoker=false]", new ToStringBuilder(p).append("name", p.name).append("age", p.age).append("smoker", p.smoker).toString());
-    }
-
-    @Test
-    public void testLong() {
-        assertEquals(baseStr + "[3]", new ToStringBuilder(base).append(3L).toString());
-        assertEquals(baseStr + "[a=3]", new ToStringBuilder(base).append("a", 3L).toString());
-        assertEquals(baseStr + "[a=3,b=4]", new ToStringBuilder(base).append("a", 3L).append("b", 4L).toString());
-    }
-
-    @Test
-    public void testObjectArray() {
-        Object[] array = new Object[] {null, base, new int[] {3, 6}};
-        assertEquals(baseStr + "[[%NULL%, 5, [3, 6]]]", new ToStringBuilder(base).append(array).toString());
-        assertEquals(baseStr + "[[%NULL%, 5, [3, 6]]]", new ToStringBuilder(base).append((Object) array).toString());
-        array = null;
-        assertEquals(baseStr + "[%NULL%]", new ToStringBuilder(base).append(array).toString());
-        assertEquals(baseStr + "[%NULL%]", new ToStringBuilder(base).append((Object) array).toString());
-    }
-
-    @Test
-    public void testLongArray() {
-        long[] array = new long[] {1, 2, -3, 4};
-        assertEquals(baseStr + "[[1, 2, -3, 4]]", new ToStringBuilder(base).append(array).toString());
-        assertEquals(baseStr + "[[1, 2, -3, 4]]", new ToStringBuilder(base).append((Object) array).toString());
-        array = null;
-        assertEquals(baseStr + "[%NULL%]", new ToStringBuilder(base).append(array).toString());
-        assertEquals(baseStr + "[%NULL%]", new ToStringBuilder(base).append((Object) array).toString());
-    }
-
-    @Test
-    public void testLongArrayArray() {
-        long[][] array = new long[][] {{1, 2}, null, {5}};
-        assertEquals(baseStr + "[[[1, 2], %NULL%, [5]]]", new ToStringBuilder(base).append(array).toString());
-        assertEquals(baseStr + "[[[1, 2], %NULL%, [5]]]", new ToStringBuilder(base).append((Object) array).toString());
-        array = null;
-        assertEquals(baseStr + "[%NULL%]", new ToStringBuilder(base).append(array).toString());
-        assertEquals(baseStr + "[%NULL%]", new ToStringBuilder(base).append((Object) array).toString());
-    }
-
-}
diff --git a/lang/src/test/java/org/apache/commons/lang3/builder/ToStringBuilderTest.java b/lang/src/test/java/org/apache/commons/lang3/builder/ToStringBuilderTest.java
deleted file mode 100644
index d52dd52..0000000
--- a/lang/src/test/java/org/apache/commons/lang3/builder/ToStringBuilderTest.java
+++ /dev/null
@@ -1,1071 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.commons.lang3.builder;
-
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertNull;
-import static org.junit.Assert.assertSame;
-import static org.junit.Assume.assumeFalse;
-
-import java.util.ArrayList;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-
-import org.apache.commons.lang3.SystemUtils;
-import org.junit.After;
-import org.junit.Test;
-
-/**
- * Unit tests for {@link org.apache.commons.lang3.builder.ToStringBuilder}.
- *
- * @version $Id$
- */
-public class ToStringBuilderTest {
-
-    private final Integer base = Integer.valueOf(5);
-    private final String baseStr = base.getClass().getName() + "@" + Integer.toHexString(System.identityHashCode(base));
-
-    /*
-     * All tests should leave the registry empty. 
-     */
-    @After
-    public void after(){
-        validateNullToStringStyleRegistry();
-    }
-
-    //-----------------------------------------------------------------------
-
-    @Test
-    public void testConstructorEx1() {
-        assertEquals("<null>", new ToStringBuilder(null).toString());
-    }
-
-    @Test
-    public void testConstructorEx2() {
-        assertEquals("<null>", new ToStringBuilder(null, null).toString());
-        new ToStringBuilder(this.base, null).toString();
-    }
-
-    @Test
-    public void testConstructorEx3() {
-        assertEquals("<null>", new ToStringBuilder(null, null, null).toString());
-        new ToStringBuilder(this.base, null, null).toString();
-        new ToStringBuilder(this.base, ToStringStyle.DEFAULT_STYLE, null).toString();
-    }
-
-    @Test
-    public void testGetSetDefault() {
-        try {
-            ToStringBuilder.setDefaultStyle(ToStringStyle.NO_FIELD_NAMES_STYLE);
-            assertSame(ToStringStyle.NO_FIELD_NAMES_STYLE, ToStringBuilder.getDefaultStyle());
-        } finally {
-            // reset for other tests
-            ToStringBuilder.setDefaultStyle(ToStringStyle.DEFAULT_STYLE);
-        }
-    }
-
-    @Test(expected=IllegalArgumentException.class)
-    public void testSetDefaultEx() {
-        ToStringBuilder.setDefaultStyle(null);
-    }
-
-    @Test
-    public void testBlank() {
-        assertEquals(baseStr + "[]", new ToStringBuilder(base).toString());
-    }
-
-    /**
-     * Test wrapper for int primitive.
-     */
-    @Test
-    public void testReflectionInteger() {
-        assertEquals(baseStr + "[value=5]", ToStringBuilder.reflectionToString(base));
-    }
-
-    /**
-     * Test wrapper for char primitive.
-     */
-    @Test
-    public void testReflectionCharacter() {
-        final Character c = new Character('A');
-        assertEquals(this.toBaseString(c) + "[value=A]", ToStringBuilder.reflectionToString(c));
-    }
-
-    /**
-     * Test wrapper for char boolean.
-     */
-    @Test
-    public void testReflectionBoolean() {
-        Boolean b;
-        b = Boolean.TRUE;
-        assertEquals(this.toBaseString(b) + "[value=true]", ToStringBuilder.reflectionToString(b));
-        b = Boolean.FALSE;
-        assertEquals(this.toBaseString(b) + "[value=false]", ToStringBuilder.reflectionToString(b));
-    }
-
-    /**
-     * Create the same toString() as Object.toString().
-     * @param o the object to create the string for.
-     * @return a String in the Object.toString format.
-     */
-    private String toBaseString(final Object o) {
-        return o.getClass().getName() + "@" + Integer.toHexString(System.identityHashCode(o));
-    }
-
-    // Reflection Array tests
-
-    //
-    // Note on the following line of code repeated in the reflection array tests.
-    //
-    // assertReflectionArray("<null>", array);
-    //
-    // The expected value is not baseStr + "[<null>]" since array==null and is typed as Object.
-    // The null array does not carry array type information.
-    // If we added a primitive array type constructor and pile of associated methods,
-    // then type declaring type information could be carried forward. IMHO, null is null.
-    //
-    // Gary Gregory - 2003-03-12 - ggregory@seagullsw.com
-    //
-
-    public void assertReflectionArray(final String expected, final Object actual) {
-        if (actual == null) {
-            // Until ToStringBuilder supports null objects.
-            return;
-        }
-        assertEquals(expected, ToStringBuilder.reflectionToString(actual));
-        assertEquals(expected, ToStringBuilder.reflectionToString(actual, null));
-        assertEquals(expected, ToStringBuilder.reflectionToString(actual, null, true));
-        assertEquals(expected, ToStringBuilder.reflectionToString(actual, null, false));
-    }
-
-    @Test
-    public void testReflectionObjectArray() {
-        Object[] array = new Object[] { null, base, new int[] { 3, 6 } };
-        final String baseString = this.toBaseString(array);
-        assertEquals(baseString + "[{<null>,5,{3,6}}]", ToStringBuilder.reflectionToString(array));
-        array = null;
-        assertReflectionArray("<null>", array);
-    }
-
-    @Test
-    public void testReflectionLongArray() {
-        long[] array = new long[] { 1, 2, -3, 4 };
-        final String baseString = this.toBaseString(array);
-        assertEquals(baseString + "[{1,2,-3,4}]", ToStringBuilder.reflectionToString(array));
-        array = null;
-        assertReflectionArray("<null>", array);
-    }
-
-    @Test
-    public void testReflectionIntArray() {
-        int[] array = new int[] { 1, 2, -3, 4 };
-        final String baseString = this.toBaseString(array);
-        assertEquals(baseString + "[{1,2,-3,4}]", ToStringBuilder.reflectionToString(array));
-        array = null;
-        assertReflectionArray("<null>", array);
-    }
-
-    @Test
-    public void testReflectionShortArray() {
-        short[] array = new short[] { 1, 2, -3, 4 };
-        final String baseString = this.toBaseString(array);
-        assertEquals(baseString + "[{1,2,-3,4}]", ToStringBuilder.reflectionToString(array));
-        array = null;
-        assertReflectionArray("<null>", array);
-    }
-
-    @Test
-    public void testReflectionyteArray() {
-        byte[] array = new byte[] { 1, 2, -3, 4 };
-        final String baseString = this.toBaseString(array);
-        assertEquals(baseString + "[{1,2,-3,4}]", ToStringBuilder.reflectionToString(array));
-        array = null;
-        assertReflectionArray("<null>", array);
-    }
-
-    @Test
-    public void testReflectionCharArray() {
-        char[] array = new char[] { 'A', '2', '_', 'D' };
-        final String baseString = this.toBaseString(array);
-        assertEquals(baseString + "[{A,2,_,D}]", ToStringBuilder.reflectionToString(array));
-        array = null;
-        assertReflectionArray("<null>", array);
-    }
-
-    @Test
-    public void testReflectionDoubleArray() {
-        double[] array = new double[] { 1.0, 2.9876, -3.00001, 4.3 };
-        final String baseString = this.toBaseString(array);
-        assertEquals(baseString + "[{1.0,2.9876,-3.00001,4.3}]", ToStringBuilder.reflectionToString(array));
-        array = null;
-        assertReflectionArray("<null>", array);
-    }
-
-    @Test
-    public void testReflectionFloatArray() {
-        float[] array = new float[] { 1.0f, 2.9876f, -3.00001f, 4.3f };
-        final String baseString = this.toBaseString(array);
-        assertEquals(baseString + "[{1.0,2.9876,-3.00001,4.3}]", ToStringBuilder.reflectionToString(array));
-        array = null;
-        assertReflectionArray("<null>", array);
-    }
-
-    @Test
-    public void testReflectionBooleanArray() {
-        boolean[] array = new boolean[] { true, false, false };
-        final String baseString = this.toBaseString(array);
-        assertEquals(baseString + "[{true,false,false}]", ToStringBuilder.reflectionToString(array));
-        array = null;
-        assertReflectionArray("<null>", array);
-    }
-
-    // Reflection Array Array tests
-
-    @Test
-    public void testReflectionFloatArrayArray() {
-        float[][] array = new float[][] { { 1.0f, 2.29686f }, null, { Float.NaN } };
-        final String baseString = this.toBaseString(array);
-        assertEquals(baseString + "[{{1.0,2.29686},<null>,{NaN}}]", ToStringBuilder.reflectionToString(array));
-        array = null;
-        assertReflectionArray("<null>", array);
-    }
-
-
-    @Test
-    public void testReflectionLongArrayArray() {
-        long[][] array = new long[][] { { 1, 2 }, null, { 5 } };
-        final String baseString = this.toBaseString(array);
-        assertEquals(baseString + "[{{1,2},<null>,{5}}]", ToStringBuilder.reflectionToString(array));
-        array = null;
-        assertReflectionArray("<null>", array);
-    }
-
-    @Test
-    public void testReflectionIntArrayArray() {
-        int[][] array = new int[][] { { 1, 2 }, null, { 5 } };
-        final String baseString = this.toBaseString(array);
-        assertEquals(baseString + "[{{1,2},<null>,{5}}]", ToStringBuilder.reflectionToString(array));
-        array = null;
-        assertReflectionArray("<null>", array);
-    }
-
-    @Test
-    public void testReflectionhortArrayArray() {
-        short[][] array = new short[][] { { 1, 2 }, null, { 5 } };
-        final String baseString = this.toBaseString(array);
-        assertEquals(baseString + "[{{1,2},<null>,{5}}]", ToStringBuilder.reflectionToString(array));
-        array = null;
-        assertReflectionArray("<null>", array);
-    }
-
-    @Test
-    public void testReflectionByteArrayArray() {
-        byte[][] array = new byte[][] { { 1, 2 }, null, { 5 } };
-        final String baseString = this.toBaseString(array);
-        assertEquals(baseString + "[{{1,2},<null>,{5}}]", ToStringBuilder.reflectionToString(array));
-        array = null;
-        assertReflectionArray("<null>", array);
-    }
-
-    @Test
-    public void testReflectionCharArrayArray() {
-        char[][] array = new char[][] { { 'A', 'B' }, null, { 'p' } };
-        final String baseString = this.toBaseString(array);
-        assertEquals(baseString + "[{{A,B},<null>,{p}}]", ToStringBuilder.reflectionToString(array));
-        array = null;
-        assertReflectionArray("<null>", array);
-    }
-
-    @Test
-    public void testReflectionDoubleArrayArray() {
-        double[][] array = new double[][] { { 1.0, 2.29686 }, null, { Double.NaN } };
-        final String baseString = this.toBaseString(array);
-        assertEquals(baseString + "[{{1.0,2.29686},<null>,{NaN}}]", ToStringBuilder.reflectionToString(array));
-        array = null;
-        assertReflectionArray("<null>", array);
-    }
-
-    @Test
-    public void testReflectionBooleanArrayArray() {
-        boolean[][] array = new boolean[][] { { true, false }, null, { false } };
-        final String baseString = this.toBaseString(array);
-        assertEquals(baseString + "[{{true,false},<null>,{false}}]", ToStringBuilder.reflectionToString(array));
-        assertEquals(baseString + "[{{true,false},<null>,{false}}]", ToStringBuilder.reflectionToString(array));
-        array = null;
-        assertReflectionArray("<null>", array);
-    }
-
-    // Reflection hierarchy tests
-    @Test
-    public void testReflectionHierarchyArrayList() {
-        // note, the test data depends on the internal representation of the ArrayList, which may differ between JDK versions and vendors
-        // representation different for IBM JDK 1.6.0, LANG-727
-        assumeFalse("IBM Corporation".equals(SystemUtils.JAVA_VENDOR) && "1.6".equals(SystemUtils.JAVA_SPECIFICATION_VERSION));
-        assumeFalse("Oracle Corporation".equals(SystemUtils.JAVA_VENDOR) && "1.6".compareTo(SystemUtils.JAVA_SPECIFICATION_VERSION) < 0);
-        final List<Object> list = new ArrayList<Object>();
-        final String baseString = this.toBaseString(list);
-        final String expectedWithTransients = baseString + "[elementData={<null>,<null>,<null>,<null>,<null>,<null>,<null>,<null>,<null>,<null>},size=0,modCount=0]";
-        final String toStringWithTransients = ToStringBuilder.reflectionToString(list, null, true);
-        if (!expectedWithTransients.equals(toStringWithTransients)) {
-            assertEquals(expectedWithTransients, toStringWithTransients);
-        }
-        final String expectedWithoutTransients = baseString + "[size=0]";
-        final String toStringWithoutTransients = ToStringBuilder.reflectionToString(list, null, false);
-        if (!expectedWithoutTransients.equals(toStringWithoutTransients)) {
-            assertEquals(expectedWithoutTransients, toStringWithoutTransients);
-        }
-    }
-
-    @Test
-    public void testReflectionHierarchy() {
-        final ReflectionTestFixtureA baseA = new ReflectionTestFixtureA();
-        String baseString = this.toBaseString(baseA);
-        assertEquals(baseString + "[a=a]", ToStringBuilder.reflectionToString(baseA));
-        assertEquals(baseString + "[a=a]", ToStringBuilder.reflectionToString(baseA, null));
-        assertEquals(baseString + "[a=a]", ToStringBuilder.reflectionToString(baseA, null, false));
-        assertEquals(baseString + "[a=a,transientA=t]", ToStringBuilder.reflectionToString(baseA, null, true));
-        assertEquals(baseString + "[a=a]", ToStringBuilder.reflectionToString(baseA, null, false, null));
-        assertEquals(baseString + "[a=a]", ToStringBuilder.reflectionToString(baseA, null, false, Object.class));
-        assertEquals(baseString + "[a=a]", ToStringBuilder.reflectionToString(baseA, null, false, ReflectionTestFixtureA.class));
-
-        final ReflectionTestFixtureB baseB = new ReflectionTestFixtureB();
-        baseString = this.toBaseString(baseB);
-        assertEquals(baseString + "[b=b,a=a]", ToStringBuilder.reflectionToString(baseB));
-        assertEquals(baseString + "[b=b,a=a]", ToStringBuilder.reflectionToString(baseB));
-        assertEquals(baseString + "[b=b,a=a]", ToStringBuilder.reflectionToString(baseB, null));
-        assertEquals(baseString + "[b=b,a=a]", ToStringBuilder.reflectionToString(baseB, null, false));
-        assertEquals(baseString + "[b=b,transientB=t,a=a,transientA=t]", ToStringBuilder.reflectionToString(baseB, null, true));
-        assertEquals(baseString + "[b=b,a=a]", ToStringBuilder.reflectionToString(baseB, null, false, null));
-        assertEquals(baseString + "[b=b,a=a]", ToStringBuilder.reflectionToString(baseB, null, false, Object.class));
-        assertEquals(baseString + "[b=b,a=a]", ToStringBuilder.reflectionToString(baseB, null, false, ReflectionTestFixtureA.class));
-        assertEquals(baseString + "[b=b]", ToStringBuilder.reflectionToString(baseB, null, false, ReflectionTestFixtureB.class));
-    }
-
-    static class ReflectionTestFixtureA {
-        @SuppressWarnings("unused")
-        private final char a='a';
-        @SuppressWarnings("unused")
-        private transient char transientA='t';
-    }
-
-    static class ReflectionTestFixtureB extends ReflectionTestFixtureA {
-        @SuppressWarnings("unused")
-        private final char b='b';
-        @SuppressWarnings("unused")
-        private transient char transientB='t';
-    }
-
-    @Test
-    public void testInnerClassReflection() {
-        final Outer outer = new Outer();
-        assertEquals(toBaseString(outer) + "[inner=" + toBaseString(outer.inner) + "[]]", outer.toString());
-    }
-
-    static class Outer {
-        Inner inner = new Inner();
-        class Inner {
-            @Override
-            public String toString() {
-                return ToStringBuilder.reflectionToString(this);
-            }
-        }
-        @Override
-        public String toString() {
-            return ToStringBuilder.reflectionToString(this);
-        }
-    }
-
-    // Reflection cycle tests
-
-    /**
-     * Test an array element pointing to its container.
-     */
-    @Test
-    public void testReflectionArrayCycle() {
-        final Object[] objects = new Object[1];
-        objects[0] = objects;
-        assertEquals(
-            this.toBaseString(objects) + "[{" + this.toBaseString(objects) + "}]",
-            ToStringBuilder.reflectionToString(objects));
-    }
-
-    /**
-     * Test an array element pointing to its container.
-     */
-    @Test
-    public void testReflectionArrayCycleLevel2() {
-        final Object[] objects = new Object[1];
-        final Object[] objectsLevel2 = new Object[1];
-        objects[0] = objectsLevel2;
-        objectsLevel2[0] = objects;
-        assertEquals(
-            this.toBaseString(objects) + "[{{" + this.toBaseString(objects) + "}}]",
-            ToStringBuilder.reflectionToString(objects));
-        assertEquals(
-            this.toBaseString(objectsLevel2) + "[{{" + this.toBaseString(objectsLevel2) + "}}]",
-            ToStringBuilder.reflectionToString(objectsLevel2));
-    }
-
-    @Test
-    public void testReflectionArrayArrayCycle() throws Exception {
-        final Object[][] objects = new Object[2][2];
-        objects[0][0] = objects;
-        objects[0][1] = objects;
-        objects[1][0] = objects;
-        objects[1][1] = objects;
-        final String basicToString = this.toBaseString(objects);
-        assertEquals(
-            basicToString
-                + "[{{"
-                + basicToString
-                + ","
-                + basicToString
-                + "},{"
-                + basicToString
-                + ","
-                + basicToString
-                + "}}]",
-            ToStringBuilder.reflectionToString(objects));
-    }
-
-    /**
-     * A reflection test fixture.
-     */
-    static class ReflectionTestCycleA {
-        ReflectionTestCycleB b;
-
-        @Override
-        public String toString() {
-            return ToStringBuilder.reflectionToString(this);
-        }
-    }
-
-    /**
-     * A reflection test fixture.
-     */
-    static class ReflectionTestCycleB {
-        ReflectionTestCycleA a;
-
-        @Override
-        public String toString() {
-            return ToStringBuilder.reflectionToString(this);
-        }
-    }
-
-    /**
-     * A reflection test fixture.
-     */
-    static class SimpleReflectionTestFixture {
-        Object o;
-
-        public SimpleReflectionTestFixture() {
-        }
-
-        public SimpleReflectionTestFixture(final Object o) {
-            this.o = o;
-        }
-
-        @Override
-        public String toString() {
-            return ToStringBuilder.reflectionToString(this);
-        }
-    }
-
-    private static class SelfInstanceVarReflectionTestFixture {
-        @SuppressWarnings("unused")
-        private final SelfInstanceVarReflectionTestFixture typeIsSelf;
-
-        public SelfInstanceVarReflectionTestFixture() {
-            this.typeIsSelf = this;
-        }
-
-        @Override
-        public String toString() {
-            return ToStringBuilder.reflectionToString(this);
-        }
-      }
-
-    private static class SelfInstanceTwoVarsReflectionTestFixture {
-        @SuppressWarnings("unused")
-        private final SelfInstanceTwoVarsReflectionTestFixture typeIsSelf;
-        private final String otherType = "The Other Type";
-
-        public SelfInstanceTwoVarsReflectionTestFixture() {
-            this.typeIsSelf = this;
-        }
-
-        public String getOtherType(){
-            return this.otherType;
-        }
-
-        @Override
-        public String toString() {
-            return ToStringBuilder.reflectionToString(this);
-        }
-      }
-
-
-    /**
-     * Test an Object pointing to itself, the simplest test.
-     */
-    @Test
-    public void testSimpleReflectionObjectCycle() {
-        final SimpleReflectionTestFixture simple = new SimpleReflectionTestFixture();
-        simple.o = simple;
-        assertEquals(this.toBaseString(simple) + "[o=" + this.toBaseString(simple) + "]", simple.toString());
-    }
-
-    /**
-     * Test a class that defines an ivar pointing to itself.
-     */
-    @Test
-    public void testSelfInstanceVarReflectionObjectCycle() {
-        final SelfInstanceVarReflectionTestFixture test = new SelfInstanceVarReflectionTestFixture();
-        assertEquals(this.toBaseString(test) + "[typeIsSelf=" + this.toBaseString(test) + "]", test.toString());
-    }
-
-    /**
-     * Test a class that defines an ivar pointing to itself.  This test was
-     * created to show that handling cyclical object resulted in a missing endFieldSeparator call.
-     */
-    @Test
-    public void testSelfInstanceTwoVarsReflectionObjectCycle() {
-        final SelfInstanceTwoVarsReflectionTestFixture test = new SelfInstanceTwoVarsReflectionTestFixture();
-        assertEquals(this.toBaseString(test) + "[typeIsSelf=" + this.toBaseString(test) + ",otherType=" + test.getOtherType().toString() + "]", test.toString());
-    }
-
-
-    /**
-     * Test Objects pointing to each other.
-     */
-    @Test
-    public void testReflectionObjectCycle() {
-        final ReflectionTestCycleA a = new ReflectionTestCycleA();
-        final ReflectionTestCycleB b = new ReflectionTestCycleB();
-        a.b = b;
-        b.a = a;
-        assertEquals(
-            this.toBaseString(a) + "[b=" + this.toBaseString(b) + "[a=" + this.toBaseString(a) + "]]",
-            a.toString());
-    }
-
-    /**
-     * Test a nasty combination of arrays and Objects pointing to each other.
-     * objects[0] -&gt; SimpleReflectionTestFixture[ o -&gt; objects ]
-     */
-    @Test
-    public void testReflectionArrayAndObjectCycle() {
-        final Object[] objects = new Object[1];
-        final SimpleReflectionTestFixture simple = new SimpleReflectionTestFixture(objects);
-        objects[0] = simple;
-        assertEquals(
-            this.toBaseString(objects)
-                + "[{"
-                + this.toBaseString(simple)
-                + "[o="
-                + this.toBaseString(objects)
-                + "]"
-                + "}]",
-            ToStringBuilder.reflectionToString(objects));
-        assertEquals(
-            this.toBaseString(simple)
-                + "[o={"
-                + this.toBaseString(simple)
-                + "}]",
-            ToStringBuilder.reflectionToString(simple));
-    }
-
-    void validateNullToStringStyleRegistry() {
-        final Map<Object, Object> registry = ToStringStyle.getRegistry();
-        assertNull("Expected null, actual: "+registry, registry);
-    }
-    //  End: Reflection cycle tests
-
-    @Test
-    public void testAppendSuper() {
-        assertEquals(baseStr + "[]", new ToStringBuilder(base).appendSuper("Integer@8888[]").toString());
-        assertEquals(baseStr + "[<null>]", new ToStringBuilder(base).appendSuper("Integer@8888[<null>]").toString());
-
-        assertEquals(baseStr + "[a=hello]", new ToStringBuilder(base).appendSuper("Integer@8888[]").append("a", "hello").toString());
-        assertEquals(baseStr + "[<null>,a=hello]", new ToStringBuilder(base).appendSuper("Integer@8888[<null>]").append("a", "hello").toString());
-        assertEquals(baseStr + "[a=hello]", new ToStringBuilder(base).appendSuper(null).append("a", "hello").toString());
-    }
-
-    @Test
-    public void testAppendToString() {
-        assertEquals(baseStr + "[]", new ToStringBuilder(base).appendToString("Integer@8888[]").toString());
-        assertEquals(baseStr + "[<null>]", new ToStringBuilder(base).appendToString("Integer@8888[<null>]").toString());
-
-        assertEquals(baseStr + "[a=hello]", new ToStringBuilder(base).appendToString("Integer@8888[]").append("a", "hello").toString());
-        assertEquals(baseStr + "[<null>,a=hello]", new ToStringBuilder(base).appendToString("Integer@8888[<null>]").append("a", "hello").toString());
-        assertEquals(baseStr + "[a=hello]", new ToStringBuilder(base).appendToString(null).append("a", "hello").toString());
-    }
-
-    @Test
-    public void testObject() {
-        final Integer i3 = Integer.valueOf(3);
-        final Integer i4 = Integer.valueOf(4);
-        assertEquals(baseStr + "[<null>]", new ToStringBuilder(base).append((Object) null).toString());
-        assertEquals(baseStr + "[3]", new ToStringBuilder(base).append(i3).toString());
-        assertEquals(baseStr + "[a=<null>]", new ToStringBuilder(base).append("a", (Object) null).toString());
-        assertEquals(baseStr + "[a=3]", new ToStringBuilder(base).append("a", i3).toString());
-        assertEquals(baseStr + "[a=3,b=4]", new ToStringBuilder(base).append("a", i3).append("b", i4).toString());
-        assertEquals(baseStr + "[a=<Integer>]", new ToStringBuilder(base).append("a", i3, false).toString());
-        assertEquals(baseStr + "[a=<size=0>]", new ToStringBuilder(base).append("a", new ArrayList<Object>(), false).toString());
-        assertEquals(baseStr + "[a=[]]", new ToStringBuilder(base).append("a", new ArrayList<Object>(), true).toString());
-        assertEquals(baseStr + "[a=<size=0>]", new ToStringBuilder(base).append("a", new HashMap<Object, Object>(), false).toString());
-        assertEquals(baseStr + "[a={}]", new ToStringBuilder(base).append("a", new HashMap<Object, Object>(), true).toString());
-        assertEquals(baseStr + "[a=<size=0>]", new ToStringBuilder(base).append("a", (Object) new String[0], false).toString());
-        assertEquals(baseStr + "[a={}]", new ToStringBuilder(base).append("a", (Object) new String[0], true).toString());
-    }
-    
-    @Test
-    public void testObjectBuild() {
-        final Integer i3 = Integer.valueOf(3);
-        final Integer i4 = Integer.valueOf(4);
-        assertEquals(baseStr + "[<null>]", new ToStringBuilder(base).append((Object) null).build());
-        assertEquals(baseStr + "[3]", new ToStringBuilder(base).append(i3).build());
-        assertEquals(baseStr + "[a=<null>]", new ToStringBuilder(base).append("a", (Object) null).build());
-        assertEquals(baseStr + "[a=3]", new ToStringBuilder(base).append("a", i3).build());
-        assertEquals(baseStr + "[a=3,b=4]", new ToStringBuilder(base).append("a", i3).append("b", i4).build());
-        assertEquals(baseStr + "[a=<Integer>]", new ToStringBuilder(base).append("a", i3, false).build());
-        assertEquals(baseStr + "[a=<size=0>]", new ToStringBuilder(base).append("a", new ArrayList<Object>(), false).build());
-        assertEquals(baseStr + "[a=[]]", new ToStringBuilder(base).append("a", new ArrayList<Object>(), true).build());
-        assertEquals(baseStr + "[a=<size=0>]", new ToStringBuilder(base).append("a", new HashMap<Object, Object>(), false).build());
-        assertEquals(baseStr + "[a={}]", new ToStringBuilder(base).append("a", new HashMap<Object, Object>(), true).build());
-        assertEquals(baseStr + "[a=<size=0>]", new ToStringBuilder(base).append("a", (Object) new String[0], false).build());
-        assertEquals(baseStr + "[a={}]", new ToStringBuilder(base).append("a", (Object) new String[0], true).build());
-    }
-
-    @Test
-    public void testLong() {
-        assertEquals(baseStr + "[3]", new ToStringBuilder(base).append(3L).toString());
-        assertEquals(baseStr + "[a=3]", new ToStringBuilder(base).append("a", 3L).toString());
-        assertEquals(baseStr + "[a=3,b=4]", new ToStringBuilder(base).append("a", 3L).append("b", 4L).toString());
-    }
-
-    @SuppressWarnings("cast") // cast is not really needed, keep for consistency
-    @Test
-    public void testInt() {
-        assertEquals(baseStr + "[3]", new ToStringBuilder(base).append((int) 3).toString());
-        assertEquals(baseStr + "[a=3]", new ToStringBuilder(base).append("a", (int) 3).toString());
-        assertEquals(baseStr + "[a=3,b=4]", new ToStringBuilder(base).append("a", (int) 3).append("b", (int) 4).toString());
-    }
-
-    @Test
-    public void testShort() {
-        assertEquals(baseStr + "[3]", new ToStringBuilder(base).append((short) 3).toString());
-        assertEquals(baseStr + "[a=3]", new ToStringBuilder(base).append("a", (short) 3).toString());
-        assertEquals(baseStr + "[a=3,b=4]", new ToStringBuilder(base).append("a", (short) 3).append("b", (short) 4).toString());
-    }
-
-    @Test
-    public void testChar() {
-        assertEquals(baseStr + "[A]", new ToStringBuilder(base).append((char) 65).toString());
-        assertEquals(baseStr + "[a=A]", new ToStringBuilder(base).append("a", (char) 65).toString());
-        assertEquals(baseStr + "[a=A,b=B]", new ToStringBuilder(base).append("a", (char) 65).append("b", (char) 66).toString());
-    }
-
-    @Test
-    public void testByte() {
-        assertEquals(baseStr + "[3]", new ToStringBuilder(base).append((byte) 3).toString());
-        assertEquals(baseStr + "[a=3]", new ToStringBuilder(base).append("a", (byte) 3).toString());
-        assertEquals(baseStr + "[a=3,b=4]", new ToStringBuilder(base).append("a", (byte) 3).append("b", (byte) 4).toString());
-    }
-
-    @SuppressWarnings("cast")
-    @Test
-    public void testDouble() {
-        assertEquals(baseStr + "[3.2]", new ToStringBuilder(base).append((double) 3.2).toString());
-        assertEquals(baseStr + "[a=3.2]", new ToStringBuilder(base).append("a", (double) 3.2).toString());
-        assertEquals(baseStr + "[a=3.2,b=4.3]", new ToStringBuilder(base).append("a", (double) 3.2).append("b", (double) 4.3).toString());
-    }
-
-    @Test
-    public void testFloat() {
-        assertEquals(baseStr + "[3.2]", new ToStringBuilder(base).append((float) 3.2).toString());
-        assertEquals(baseStr + "[a=3.2]", new ToStringBuilder(base).append("a", (float) 3.2).toString());
-        assertEquals(baseStr + "[a=3.2,b=4.3]", new ToStringBuilder(base).append("a", (float) 3.2).append("b", (float) 4.3).toString());
-    }
-
-    @Test
-    public void testBoolean() {
-        assertEquals(baseStr + "[true]", new ToStringBuilder(base).append(true).toString());
-        assertEquals(baseStr + "[a=true]", new ToStringBuilder(base).append("a", true).toString());
-        assertEquals(baseStr + "[a=true,b=false]", new ToStringBuilder(base).append("a", true).append("b", false).toString());
-    }
-
-
-    @Test
-    public void testObjectArray() {
-        Object[] array = new Object[] {null, base, new int[] {3, 6}};
-        assertEquals(baseStr + "[{<null>,5,{3,6}}]", new ToStringBuilder(base).append(array).toString());
-        assertEquals(baseStr + "[{<null>,5,{3,6}}]", new ToStringBuilder(base).append((Object) array).toString());
-        array = null;
-        assertEquals(baseStr + "[<null>]", new ToStringBuilder(base).append(array).toString());
-        assertEquals(baseStr + "[<null>]", new ToStringBuilder(base).append((Object) array).toString());
-    }
-
-    @Test
-    public void testLongArray() {
-        long[] array = new long[] {1, 2, -3, 4};
-        assertEquals(baseStr + "[{1,2,-3,4}]", new ToStringBuilder(base).append(array).toString());
-        assertEquals(baseStr + "[{1,2,-3,4}]", new ToStringBuilder(base).append((Object) array).toString());
-        array = null;
-        assertEquals(baseStr + "[<null>]", new ToStringBuilder(base).append(array).toString());
-        assertEquals(baseStr + "[<null>]", new ToStringBuilder(base).append((Object) array).toString());
-    }
-
-    @Test
-    public void testIntArray() {
-        int[] array = new int[] {1, 2, -3, 4};
-        assertEquals(baseStr + "[{1,2,-3,4}]", new ToStringBuilder(base).append(array).toString());
-        assertEquals(baseStr + "[{1,2,-3,4}]", new ToStringBuilder(base).append((Object) array).toString());
-        array = null;
-        assertEquals(baseStr + "[<null>]", new ToStringBuilder(base).append(array).toString());
-        assertEquals(baseStr + "[<null>]", new ToStringBuilder(base).append((Object) array).toString());
-    }
-
-    @Test
-    public void testShortArray() {
-        short[] array = new short[] {1, 2, -3, 4};
-        assertEquals(baseStr + "[{1,2,-3,4}]", new ToStringBuilder(base).append(array).toString());
-        assertEquals(baseStr + "[{1,2,-3,4}]", new ToStringBuilder(base).append((Object) array).toString());
-        array = null;
-        assertEquals(baseStr + "[<null>]", new ToStringBuilder(base).append(array).toString());
-        assertEquals(baseStr + "[<null>]", new ToStringBuilder(base).append((Object) array).toString());
-    }
-
-    @Test
-    public void testByteArray() {
-        byte[] array = new byte[] {1, 2, -3, 4};
-        assertEquals(baseStr + "[{1,2,-3,4}]", new ToStringBuilder(base).append(array).toString());
-        assertEquals(baseStr + "[{1,2,-3,4}]", new ToStringBuilder(base).append((Object) array).toString());
-        array = null;
-        assertEquals(baseStr + "[<null>]", new ToStringBuilder(base).append(array).toString());
-        assertEquals(baseStr + "[<null>]", new ToStringBuilder(base).append((Object) array).toString());
-    }
-
-    @Test
-    public void testCharArray() {
-        char[] array = new char[] {'A', '2', '_', 'D'};
-        assertEquals(baseStr + "[{A,2,_,D}]", new ToStringBuilder(base).append(array).toString());
-        assertEquals(baseStr + "[{A,2,_,D}]", new ToStringBuilder(base).append((Object) array).toString());
-        array = null;
-        assertEquals(baseStr + "[<null>]", new ToStringBuilder(base).append(array).toString());
-        assertEquals(baseStr + "[<null>]", new ToStringBuilder(base).append((Object) array).toString());
-    }
-
-    @Test
-    public void testDoubleArray() {
-        double[] array = new double[] {1.0, 2.9876, -3.00001, 4.3};
-        assertEquals(baseStr + "[{1.0,2.9876,-3.00001,4.3}]", new ToStringBuilder(base).append(array).toString());
-        assertEquals(baseStr + "[{1.0,2.9876,-3.00001,4.3}]", new ToStringBuilder(base).append((Object) array).toString());
-        array = null;
-        assertEquals(baseStr + "[<null>]", new ToStringBuilder(base).append(array).toString());
-        assertEquals(baseStr + "[<null>]", new ToStringBuilder(base).append((Object) array).toString());
-    }
-
-    @Test
-    public void testFloatArray() {
-        float[] array = new float[] {1.0f, 2.9876f, -3.00001f, 4.3f};
-        assertEquals(baseStr + "[{1.0,2.9876,-3.00001,4.3}]", new ToStringBuilder(base).append(array).toString());
-        assertEquals(baseStr + "[{1.0,2.9876,-3.00001,4.3}]", new ToStringBuilder(base).append((Object) array).toString());
-        array = null;
-        assertEquals(baseStr + "[<null>]", new ToStringBuilder(base).append(array).toString());
-        assertEquals(baseStr + "[<null>]", new ToStringBuilder(base).append((Object) array).toString());
-    }
-
-    @Test
-    public void testBooleanArray() {
-        boolean[] array = new boolean[] {true, false, false};
-        assertEquals(baseStr + "[{true,false,false}]", new ToStringBuilder(base).append(array).toString());
-        assertEquals(baseStr + "[{true,false,false}]", new ToStringBuilder(base).append((Object) array).toString());
-        array = null;
-        assertEquals(baseStr + "[<null>]", new ToStringBuilder(base).append(array).toString());
-        assertEquals(baseStr + "[<null>]", new ToStringBuilder(base).append((Object) array).toString());
-    }
-
-    @Test
-    public void testLongArrayArray() {
-        long[][] array = new long[][] {{1, 2}, null, {5}};
-        assertEquals(baseStr + "[{{1,2},<null>,{5}}]", new ToStringBuilder(base).append(array).toString());
-        assertEquals(baseStr + "[{{1,2},<null>,{5}}]", new ToStringBuilder(base).append((Object) array).toString());
-        array = null;
-        assertEquals(baseStr + "[<null>]", new ToStringBuilder(base).append(array).toString());
-        assertEquals(baseStr + "[<null>]", new ToStringBuilder(base).append((Object) array).toString());
-    }
-
-    @Test
-    public void testIntArrayArray() {
-        int[][] array = new int[][] {{1, 2}, null, {5}};
-        assertEquals(baseStr + "[{{1,2},<null>,{5}}]", new ToStringBuilder(base).append(array).toString());
-        assertEquals(baseStr + "[{{1,2},<null>,{5}}]", new ToStringBuilder(base).append((Object) array).toString());
-        array = null;
-        assertEquals(baseStr + "[<null>]", new ToStringBuilder(base).append(array).toString());
-        assertEquals(baseStr + "[<null>]", new ToStringBuilder(base).append((Object) array).toString());
-    }
-
-    @Test
-    public void testShortArrayArray() {
-        short[][] array = new short[][] {{1, 2}, null, {5}};
-        assertEquals(baseStr + "[{{1,2},<null>,{5}}]", new ToStringBuilder(base).append(array).toString());
-        assertEquals(baseStr + "[{{1,2},<null>,{5}}]", new ToStringBuilder(base).append((Object) array).toString());
-        array = null;
-        assertEquals(baseStr + "[<null>]", new ToStringBuilder(base).append(array).toString());
-        assertEquals(baseStr + "[<null>]", new ToStringBuilder(base).append((Object) array).toString());
-    }
-
-    @Test
-    public void testByteArrayArray() {
-        byte[][] array = new byte[][] {{1, 2}, null, {5}};
-        assertEquals(baseStr + "[{{1,2},<null>,{5}}]", new ToStringBuilder(base).append(array).toString());
-        assertEquals(baseStr + "[{{1,2},<null>,{5}}]", new ToStringBuilder(base).append((Object) array).toString());
-        array = null;
-        assertEquals(baseStr + "[<null>]", new ToStringBuilder(base).append(array).toString());
-        assertEquals(baseStr + "[<null>]", new ToStringBuilder(base).append((Object) array).toString());
-    }
-
-    @Test
-    public void testCharArrayArray() {
-        char[][] array = new char[][] {{'A', 'B'}, null, {'p'}};
-        assertEquals(baseStr + "[{{A,B},<null>,{p}}]", new ToStringBuilder(base).append(array).toString());
-        assertEquals(baseStr + "[{{A,B},<null>,{p}}]", new ToStringBuilder(base).append((Object) array).toString());
-        array = null;
-        assertEquals(baseStr + "[<null>]", new ToStringBuilder(base).append(array).toString());
-        assertEquals(baseStr + "[<null>]", new ToStringBuilder(base).append((Object) array).toString());
-    }
-
-    @Test
-    public void testDoubleArrayArray() {
-        double[][] array = new double[][] {{1.0, 2.29686}, null, {Double.NaN}};
-        assertEquals(baseStr + "[{{1.0,2.29686},<null>,{NaN}}]", new ToStringBuilder(base).append(array).toString());
-        assertEquals(baseStr + "[{{1.0,2.29686},<null>,{NaN}}]", new ToStringBuilder(base).append((Object) array).toString());
-        array = null;
-        assertEquals(baseStr + "[<null>]", new ToStringBuilder(base).append(array).toString());
-        assertEquals(baseStr + "[<null>]", new ToStringBuilder(base).append((Object) array).toString());
-    }
-
-    @Test
-    public void testFloatArrayArray() {
-        float[][] array = new float[][] {{1.0f, 2.29686f}, null, {Float.NaN}};
-        assertEquals(baseStr + "[{{1.0,2.29686},<null>,{NaN}}]", new ToStringBuilder(base).append(array).toString());
-        assertEquals(baseStr + "[{{1.0,2.29686},<null>,{NaN}}]", new ToStringBuilder(base).append((Object) array).toString());
-        array = null;
-        assertEquals(baseStr + "[<null>]", new ToStringBuilder(base).append(array).toString());
-        assertEquals(baseStr + "[<null>]", new ToStringBuilder(base).append((Object) array).toString());
-    }
-
-    @Test
-    public void testBooleanArrayArray() {
-        boolean[][] array = new boolean[][] {{true, false}, null, {false}};
-        assertEquals(baseStr + "[{{true,false},<null>,{false}}]", new ToStringBuilder(base).append(array).toString());
-        assertEquals(baseStr + "[{{true,false},<null>,{false}}]", new ToStringBuilder(base).append((Object) array).toString());
-        array = null;
-        assertEquals(baseStr + "[<null>]", new ToStringBuilder(base).append(array).toString());
-        assertEquals(baseStr + "[<null>]", new ToStringBuilder(base).append((Object) array).toString());
-    }
-
-    @Test
-    public void testObjectCycle() {
-        final ObjectCycle a = new ObjectCycle();
-        final ObjectCycle b = new ObjectCycle();
-        a.obj = b;
-        b.obj = a;
-
-        final String expected = toBaseString(a) + "[" + toBaseString(b) + "[" + toBaseString(a) + "]]";
-        assertEquals(expected, a.toString());
-    }
-
-    static class ObjectCycle {
-        Object obj;
-
-        @Override
-        public String toString() {
-            return new ToStringBuilder(this).append(obj).toString();
-        }
-    }
-
-    @Test
-    public void testSimpleReflectionStatics() {
-        final SimpleReflectionStaticFieldsFixture instance1 = new SimpleReflectionStaticFieldsFixture();
-        assertEquals(
-            this.toBaseString(instance1) + "[staticString=staticString,staticInt=12345]",
-            ReflectionToStringBuilder.toString(instance1, null, false, true, SimpleReflectionStaticFieldsFixture.class));
-        assertEquals(
-            this.toBaseString(instance1) + "[staticString=staticString,staticInt=12345]",
-            ReflectionToStringBuilder.toString(instance1, null, true, true, SimpleReflectionStaticFieldsFixture.class));
-        assertEquals(
-            this.toBaseString(instance1) + "[staticString=staticString,staticInt=12345]",
-            this.toStringWithStatics(instance1, null, SimpleReflectionStaticFieldsFixture.class));
-        assertEquals(
-            this.toBaseString(instance1) + "[staticString=staticString,staticInt=12345]",
-            this.toStringWithStatics(instance1, null, SimpleReflectionStaticFieldsFixture.class));
-    }
-
-    /**
-     * Tests ReflectionToStringBuilder.toString() for statics.
-     */
-    @Test
-    public void testReflectionStatics() {
-        final ReflectionStaticFieldsFixture instance1 = new ReflectionStaticFieldsFixture();
-        assertEquals(
-            this.toBaseString(instance1) + "[staticString=staticString,staticInt=12345,instanceString=instanceString,instanceInt=67890]",
-            ReflectionToStringBuilder.toString(instance1, null, false, true, ReflectionStaticFieldsFixture.class));
-        assertEquals(
-            this.toBaseString(instance1) + "[staticString=staticString,staticInt=12345,staticTransientString=staticTransientString,staticTransientInt=54321,instanceString=instanceString,instanceInt=67890,transientString=transientString,transientInt=98765]",
-            ReflectionToStringBuilder.toString(instance1, null, true, true, ReflectionStaticFieldsFixture.class));
-        assertEquals(
-            this.toBaseString(instance1) + "[staticString=staticString,staticInt=12345,instanceString=instanceString,instanceInt=67890]",
-            this.toStringWithStatics(instance1, null, ReflectionStaticFieldsFixture.class));
-        assertEquals(
-            this.toBaseString(instance1) + "[staticString=staticString,staticInt=12345,instanceString=instanceString,instanceInt=67890]",
-            this.toStringWithStatics(instance1, null, ReflectionStaticFieldsFixture.class));
-    }
-
-    /**
-     * Tests ReflectionToStringBuilder.toString() for statics.
-     */
-    @Test
-    public void testInheritedReflectionStatics() {
-        final InheritedReflectionStaticFieldsFixture instance1 = new InheritedReflectionStaticFieldsFixture();
-        assertEquals(
-            this.toBaseString(instance1) + "[staticString2=staticString2,staticInt2=67890]",
-            ReflectionToStringBuilder.toString(instance1, null, false, true, InheritedReflectionStaticFieldsFixture.class));
-        assertEquals(
-            this.toBaseString(instance1) + "[staticString2=staticString2,staticInt2=67890,staticString=staticString,staticInt=12345]",
-            ReflectionToStringBuilder.toString(instance1, null, false, true, SimpleReflectionStaticFieldsFixture.class));
-        assertEquals(
-            this.toBaseString(instance1) + "[staticString2=staticString2,staticInt2=67890,staticString=staticString,staticInt=12345]",
-            this.toStringWithStatics(instance1, null, SimpleReflectionStaticFieldsFixture.class));
-        assertEquals(
-            this.toBaseString(instance1) + "[staticString2=staticString2,staticInt2=67890,staticString=staticString,staticInt=12345]",
-            this.toStringWithStatics(instance1, null, SimpleReflectionStaticFieldsFixture.class));
-    }
-
-    /**
-     * <p>This method uses reflection to build a suitable
-     * <code>toString</code> value which includes static fields.</p>
-     *
-     * <p>It uses <code>AccessibleObject.setAccessible</code> to gain access to private
-     * fields. This means that it will throw a security exception if run
-     * under a security manager, if the permissions are not set up correctly.
-     * It is also not as efficient as testing explicitly. </p>
-     *
-     * <p>Transient fields are not output.</p>
-     *
-     * <p>Superclass fields will be appended up to and including the specified superclass.
-     * A null superclass is treated as <code>java.lang.Object</code>.</p>
-     *
-     * <p>If the style is <code>null</code>, the default
-     * <code>ToStringStyle</code> is used.</p>
-     *
-     * @param <T> the type of the output object
-     * @param object  the Object to be output
-     * @param style  the style of the <code>toString</code> to create,
-     *  may be <code>null</code>
-     * @param reflectUpToClass  the superclass to reflect up to (inclusive),
-     *  may be <code>null</code>
-     * @return the String result
-     * @throws IllegalArgumentException if the Object is <code>null</code>
-     */
-    public <T> String toStringWithStatics(final T object, final ToStringStyle style, final Class<? super T> reflectUpToClass) {
-        return ReflectionToStringBuilder.toString(object, style, false, true, reflectUpToClass);
-    }
-
-    /**
-     * Tests ReflectionToStringBuilder setUpToClass().
-     */
-    @Test
-    public void test_setUpToClass_valid() {
-        final Integer val = Integer.valueOf(5);
-        final ReflectionToStringBuilder test = new ReflectionToStringBuilder(val);
-        test.setUpToClass(Number.class);
-        test.toString();
-    }
-
-    /**
-     * Tests ReflectionToStringBuilder setUpToClass().
-     */
-    @Test(expected=IllegalArgumentException.class)
-    public void test_setUpToClass_invalid() {
-        final Integer val = Integer.valueOf(5);
-        final ReflectionToStringBuilder test = new ReflectionToStringBuilder(val);
-        try {
-            test.setUpToClass(String.class);
-        } finally {
-            test.toString();
-        }
-    }
-
-    /**
-     * Tests ReflectionToStringBuilder.toString() for statics.
-     */
-    class ReflectionStaticFieldsFixture {
-        static final String staticString = "staticString";
-        static final int staticInt = 12345;
-        static final transient String staticTransientString = "staticTransientString";
-        static final transient int staticTransientInt = 54321;
-        String instanceString = "instanceString";
-        int instanceInt = 67890;
-        transient String transientString = "transientString";
-        transient int transientInt = 98765;
-    }
-
-    /**
-     * Test fixture for ReflectionToStringBuilder.toString() for statics.
-     */
-    class SimpleReflectionStaticFieldsFixture {
-        static final String staticString = "staticString";
-        static final int staticInt = 12345;
-    }
-
-    /**
-     * Test fixture for ReflectionToStringBuilder.toString() for statics.
-     */
-    class InheritedReflectionStaticFieldsFixture extends SimpleReflectionStaticFieldsFixture {
-        static final String staticString2 = "staticString2";
-        static final int staticInt2 = 67890;
-    }
-
-    @Test
-    public void testReflectionNull() {
-        assertEquals("<null>", ReflectionToStringBuilder.toString(null));
-    }
-
-    /**
-     * Points out failure to print anything from appendToString methods using MULTI_LINE_STYLE.
-     * See issue LANG-372.
-     */
-    class MultiLineTestObject {
-        Integer i = Integer.valueOf(31337);
-        @Override
-        public String toString() {
-            return new ToStringBuilder(this).append("testInt", i).toString();
-        }
-    }
-
-    @Test
-    public void testAppendToStringUsingMultiLineStyle() {
-        final MultiLineTestObject obj = new MultiLineTestObject();
-        final ToStringBuilder testBuilder = new ToStringBuilder(this, ToStringStyle.MULTI_LINE_STYLE)
-                                          .appendToString(obj.toString());
-        assertEquals(testBuilder.toString().indexOf("testInt=31337"), -1);
-    }
-
-}
diff --git a/lang/src/test/java/org/apache/commons/lang3/builder/ToStringStyleConcurrencyTest.java b/lang/src/test/java/org/apache/commons/lang3/builder/ToStringStyleConcurrencyTest.java
deleted file mode 100644
index db590e9..0000000
--- a/lang/src/test/java/org/apache/commons/lang3/builder/ToStringStyleConcurrencyTest.java
+++ /dev/null
@@ -1,113 +0,0 @@
-/*

- * Licensed to the Apache Software Foundation (ASF) under one or more

- * contributor license agreements.  See the NOTICE file distributed with

- * this work for additional information regarding copyright ownership.

- * The ASF licenses this file to You under the Apache License, Version 2.0

- * (the "License"); you may not use this file except in compliance with

- * the License.  You may obtain a copy of the License at

- *

- *      http://www.apache.org/licenses/LICENSE-2.0

- *

- * Unless required by applicable law or agreed to in writing, software

- * distributed under the License is distributed on an "AS IS" BASIS,

- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.

- * See the License for the specific language governing permissions and

- * limitations under the License.

- */

-

-package org.apache.commons.lang3.builder;

-

-import java.util.ArrayList;

-import java.util.Collection;

-import java.util.LinkedList;

-import java.util.List;

-import java.util.concurrent.Callable;

-import java.util.concurrent.CopyOnWriteArrayList;

-import java.util.concurrent.ExecutionException;

-import java.util.concurrent.ExecutorService;

-import java.util.concurrent.Executors;

-import java.util.concurrent.Future;

-import java.util.concurrent.TimeUnit;

-

-import org.junit.Test;

-

-/**

- * Tests concurrent access for the default {@link ToStringStyle}.

- * <p>

- * The {@link ToStringStyle} class includes a registry to avoid infinite loops for objects with circular references. We

- * want to make sure that we do not get concurrency exceptions accessing this registry.

- * </p>

- * <p>

- * This test passes but only tests one aspect of the issue.

- * </p>

- * 

- * @see <a href="https://issues.apache.org/jira/browse/LANG-762">[LANG-762] Handle or document ReflectionToStringBuilder

- *      and ToStringBuilder for collections that are not thread safe</a>

- * @since 3.1

- * @version $Id$

- */

-public class ToStringStyleConcurrencyTest {

-

-    static class CollectionHolder<T extends Collection<?>> {

-        T collection;

-

-        CollectionHolder(final T collection) {

-            this.collection = collection;

-        }

-    }

-

-    private static final List<Integer> LIST;

-    private static final int LIST_SIZE = 100000;

-    private static final int REPEAT = 100;

-

-    static {

-        LIST = new ArrayList<Integer>(LIST_SIZE);

-        for (int i = 0; i < LIST_SIZE; i++) {

-            LIST.add(Integer.valueOf(i));

-        }

-    }

-

-    @Test

-    public void testLinkedList() throws InterruptedException, ExecutionException {

-        this.testConcurrency(new CollectionHolder<List<Integer>>(new LinkedList<Integer>()));

-    }

-

-    @Test

-    public void testArrayList() throws InterruptedException, ExecutionException {

-        this.testConcurrency(new CollectionHolder<List<Integer>>(new ArrayList<Integer>()));

-    }

-

-    @Test

-    public void testCopyOnWriteArrayList() throws InterruptedException, ExecutionException {

-        this.testConcurrency(new CollectionHolder<List<Integer>>(new CopyOnWriteArrayList<Integer>()));

-    }

-

-    private void testConcurrency(final CollectionHolder<List<Integer>> holder) throws InterruptedException,

-            ExecutionException {

-        final List<Integer> list = holder.collection;

-        // make a big array that takes a long time to toString()

-        list.addAll(LIST);

-        // Create a thread pool with two threads to cause the most contention on the underlying resource.

-        final ExecutorService threadPool = Executors.newFixedThreadPool(2);

-        // Consumes toStrings

-        final Callable<Integer> consumer = new Callable<Integer>() {

-            @Override

-            public Integer call() {

-                for (int i = 0; i < REPEAT; i++) {

-                    // Calls ToStringStyle

-                    new ToStringBuilder(holder).append(holder.collection);

-                }

-                return Integer.valueOf(REPEAT);

-            }

-        };

-        final Collection<Callable<Integer>> tasks = new ArrayList<Callable<Integer>>();

-        tasks.add(consumer);

-        tasks.add(consumer);

-        final List<Future<Integer>> futures = threadPool.invokeAll(tasks);

-        for (final Future<Integer> future : futures) {

-            future.get();

-        }

-        threadPool.shutdown();

-        threadPool.awaitTermination(1, TimeUnit.SECONDS);

-    }

-}

diff --git a/lang/src/test/java/org/apache/commons/lang3/builder/ToStringStyleTest.java b/lang/src/test/java/org/apache/commons/lang3/builder/ToStringStyleTest.java
deleted file mode 100644
index 2747a7d..0000000
--- a/lang/src/test/java/org/apache/commons/lang3/builder/ToStringStyleTest.java
+++ /dev/null
@@ -1,140 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- * 
- *      http://www.apache.org/licenses/LICENSE-2.0
- * 
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.commons.lang3.builder;
-
-import static org.junit.Assert.assertEquals;
-
-import org.junit.Test;
-
-/**
- * Test case for ToStringStyle.
- * 
- * @version $Id$
- */
-public class ToStringStyleTest {
-
-    private static class ToStringStyleImpl extends ToStringStyle {
-        private static final long serialVersionUID = 1L;
-
-    }
-
-    //-----------------------------------------------------------------------
-    @Test
-    public void testSetArrayStart() {
-        final ToStringStyle style = new ToStringStyleImpl();
-        style.setArrayStart(null);
-        assertEquals("", style.getArrayStart());
-    }
-
-    @Test
-    public void testSetArrayEnd() {
-        final ToStringStyle style = new ToStringStyleImpl();
-        style.setArrayEnd(null);
-        assertEquals("", style.getArrayEnd());
-    }
-
-    @Test
-    public void testSetArraySeparator() {
-        final ToStringStyle style = new ToStringStyleImpl();
-        style.setArraySeparator(null);
-        assertEquals("", style.getArraySeparator());
-    }
-
-    @Test
-    public void testSetContentStart() {
-        final ToStringStyle style = new ToStringStyleImpl();
-        style.setContentStart(null);
-        assertEquals("", style.getContentStart());
-    }
-
-    @Test
-    public void testSetContentEnd() {
-        final ToStringStyle style = new ToStringStyleImpl();
-        style.setContentEnd(null);
-        assertEquals("", style.getContentEnd());
-    }
-
-    @Test
-    public void testSetFieldNameValueSeparator() {
-        final ToStringStyle style = new ToStringStyleImpl();
-        style.setFieldNameValueSeparator(null);
-        assertEquals("", style.getFieldNameValueSeparator());
-    }
-
-    @Test
-    public void testSetFieldSeparator() {
-        final ToStringStyle style = new ToStringStyleImpl();
-        style.setFieldSeparator(null);
-        assertEquals("", style.getFieldSeparator());
-    }
-
-    @Test
-    public void testSetNullText() {
-        final ToStringStyle style = new ToStringStyleImpl();
-        style.setNullText(null);
-        assertEquals("", style.getNullText());
-    }
-
-    @Test
-    public void testSetSizeStartText() {
-        final ToStringStyle style = new ToStringStyleImpl();
-        style.setSizeStartText(null);
-        assertEquals("", style.getSizeStartText());
-    }
-
-    @Test
-    public void testSetSizeEndText() {
-        final ToStringStyle style = new ToStringStyleImpl();
-        style.setSizeEndText(null);
-        assertEquals("", style.getSizeEndText());
-    }
-
-    @Test
-    public void testSetSummaryObjectStartText() {
-        final ToStringStyle style = new ToStringStyleImpl();
-        style.setSummaryObjectStartText(null);
-        assertEquals("", style.getSummaryObjectStartText());
-    }
-
-    @Test
-    public void testSetSummaryObjectEndText() {
-        final ToStringStyle style = new ToStringStyleImpl();
-        style.setSummaryObjectEndText(null);
-        assertEquals("", style.getSummaryObjectEndText());
-    }
-
-    /**
-     * An object used to test {@link ToStringStyle}.
-     * 
-     */
-    static class Person {
-        /**
-         * Test String field.
-         */
-        String name;
-
-        /**
-         * Test integer field.
-         */
-        int age;
-
-        /**
-         * Test boolean field.
-         */
-        boolean smoker;
-    }
-}
diff --git a/lang/src/test/java/org/apache/commons/lang3/concurrent/AbstractConcurrentInitializerTest.java b/lang/src/test/java/org/apache/commons/lang3/concurrent/AbstractConcurrentInitializerTest.java
deleted file mode 100644
index 6bd8204..0000000
--- a/lang/src/test/java/org/apache/commons/lang3/concurrent/AbstractConcurrentInitializerTest.java
+++ /dev/null
@@ -1,122 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.commons.lang3.concurrent;
-
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertNotNull;
-
-import java.util.concurrent.CountDownLatch;
-
-import org.junit.Test;
-
-/**
- * <p>
- * An abstract base class for tests of concrete {@code ConcurrentInitializer}
- * implementations.
- * </p>
- * <p>
- * This class provides some basic tests for initializer implementations. Derived
- * class have to create a {@link ConcurrentInitializer} object on which the
- * tests are executed.
- * </p>
- *
- * @version $Id$
- */
-public abstract class AbstractConcurrentInitializerTest {
-    /**
-     * Tests a simple invocation of the get() method.
-     *
-     * @throws org.apache.commons.lang3.concurrent.ConcurrentException because the object under test may throw it
-     */
-    @Test
-    public void testGet() throws ConcurrentException {
-        assertNotNull("No managed object", createInitializer().get());
-    }
-
-    /**
-     * Tests whether sequential get() invocations always return the same
-     * instance.
-     *
-     * @throws org.apache.commons.lang3.concurrent.ConcurrentException because the object under test may throw it
-     */
-    @Test
-    public void testGetMultipleTimes() throws ConcurrentException {
-        final ConcurrentInitializer<Object> initializer = createInitializer();
-        final Object obj = initializer.get();
-        for (int i = 0; i < 10; i++) {
-            assertEquals("Got different object at " + i, obj, initializer.get());
-        }
-    }
-
-    /**
-     * Tests whether get() can be invoked from multiple threads concurrently.
-     * Always the same object should be returned.
-     *
-     * @throws org.apache.commons.lang3.concurrent.ConcurrentException because the object under test may throw it
-     * @throws java.lang.InterruptedException because the threading API my throw it
-     */
-    @Test
-    public void testGetConcurrent() throws ConcurrentException,
-            InterruptedException {
-        final ConcurrentInitializer<Object> initializer = createInitializer();
-        final int threadCount = 20;
-        final CountDownLatch startLatch = new CountDownLatch(1);
-        class GetThread extends Thread {
-            Object object;
-
-            @Override
-            public void run() {
-                try {
-                    // wait until all threads are ready for maximum parallelism
-                    startLatch.await();
-                    // access the initializer
-                    object = initializer.get();
-                } catch (final InterruptedException iex) {
-                    // ignore
-                } catch (final ConcurrentException cex) {
-                    object = cex;
-                }
-            }
-        }
-
-        final GetThread[] threads = new GetThread[threadCount];
-        for (int i = 0; i < threadCount; i++) {
-            threads[i] = new GetThread();
-            threads[i].start();
-        }
-
-        // fire all threads and wait until they are ready
-        startLatch.countDown();
-        for (final Thread t : threads) {
-            t.join();
-        }
-
-        // check results
-        final Object managedObject = initializer.get();
-        for (final GetThread t : threads) {
-            assertEquals("Wrong object", managedObject, t.object);
-        }
-    }
-
-    /**
-     * Creates the {@link ConcurrentInitializer} object to be tested. This
-     * method is called whenever the test fixture needs to be obtained.
-     *
-     * @return the initializer object to be tested
-     */
-    protected abstract ConcurrentInitializer<Object> createInitializer();
-}
diff --git a/lang/src/test/java/org/apache/commons/lang3/concurrent/AtomicInitializerTest.java b/lang/src/test/java/org/apache/commons/lang3/concurrent/AtomicInitializerTest.java
deleted file mode 100644
index 7434bb5..0000000
--- a/lang/src/test/java/org/apache/commons/lang3/concurrent/AtomicInitializerTest.java
+++ /dev/null
@@ -1,39 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.commons.lang3.concurrent;
-
-/**
- * Test class for {@code AtomicInitializer}.
- *
- * @version $Id$
- */
-public class AtomicInitializerTest extends AbstractConcurrentInitializerTest {
-    /**
-     * Returns the initializer to be tested.
-     *
-     * @return the {@code AtomicInitializer}
-     */
-    @Override
-    protected ConcurrentInitializer<Object> createInitializer() {
-        return new AtomicInitializer<Object>() {
-            @Override
-            protected Object initialize() throws ConcurrentException {
-                return new Object();
-            }
-        };
-    }
-}
diff --git a/lang/src/test/java/org/apache/commons/lang3/concurrent/AtomicSafeInitializerTest.java b/lang/src/test/java/org/apache/commons/lang3/concurrent/AtomicSafeInitializerTest.java
deleted file mode 100644
index bcf1688..0000000
--- a/lang/src/test/java/org/apache/commons/lang3/concurrent/AtomicSafeInitializerTest.java
+++ /dev/null
@@ -1,81 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.commons.lang3.concurrent;
-
-import static org.junit.Assert.assertEquals;
-
-import java.util.concurrent.atomic.AtomicInteger;
-
-import org.junit.Before;
-import org.junit.Test;
-
-/**
- * Test class for {@code AtomicSafeInitializer}.
- *
- * @version $Id$
- */
-public class AtomicSafeInitializerTest extends
-        AbstractConcurrentInitializerTest {
-    /** The instance to be tested. */
-    private AtomicSafeInitializerTestImpl initializer;
-
-    @Before
-    public void setUp() throws Exception {
-        initializer = new AtomicSafeInitializerTestImpl();
-    }
-
-    /**
-     * Returns the initializer to be tested.
-     *
-     * @return the {@code AtomicSafeInitializer} under test
-     */
-    @Override
-    protected ConcurrentInitializer<Object> createInitializer() {
-        return initializer;
-    }
-
-    /**
-     * Tests that initialize() is called only once.
-     *
-     * @throws org.apache.commons.lang3.concurrent.ConcurrentException because {@link #testGetConcurrent()} may throw it
-     * @throws java.lang.InterruptedException because {@link #testGetConcurrent()} may throw it
-     */
-    @Test
-    public void testNumberOfInitializeInvocations() throws ConcurrentException,
-            InterruptedException {
-        testGetConcurrent();
-        assertEquals("Wrong number of invocations", 1,
-                initializer.initCounter.get());
-    }
-
-    /**
-     * A concrete test implementation of {@code AtomicSafeInitializer}. This
-     * implementation also counts the number of invocations of the initialize()
-     * method.
-     */
-    private static class AtomicSafeInitializerTestImpl extends
-            AtomicSafeInitializer<Object> {
-        /** A counter for initialize() invocations. */
-        final AtomicInteger initCounter = new AtomicInteger();
-
-        @Override
-        protected Object initialize() throws ConcurrentException {
-            initCounter.incrementAndGet();
-            return new Object();
-        }
-    }
-}
diff --git a/lang/src/test/java/org/apache/commons/lang3/concurrent/BackgroundInitializerTest.java b/lang/src/test/java/org/apache/commons/lang3/concurrent/BackgroundInitializerTest.java
deleted file mode 100644
index c480599..0000000
--- a/lang/src/test/java/org/apache/commons/lang3/concurrent/BackgroundInitializerTest.java
+++ /dev/null
@@ -1,319 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.commons.lang3.concurrent;
-
-import org.junit.Test;
-
-import static org.junit.Assert.*;
-
-import java.util.concurrent.CountDownLatch;
-import java.util.concurrent.ExecutorService;
-import java.util.concurrent.Executors;
-import java.util.concurrent.TimeUnit;
-import java.util.concurrent.atomic.AtomicReference;
-
-public class BackgroundInitializerTest {
-    /**
-     * Helper method for checking whether the initialize() method was correctly
-     * called. start() must already have been invoked.
-     *
-     * @param init the initializer to test
-     */
-    private void checkInitialize(final BackgroundInitializerTestImpl init) {
-        try {
-            final Integer result = init.get();
-            assertEquals("Wrong result", 1, result.intValue());
-            assertEquals("Wrong number of invocations", 1, init.initializeCalls);
-            assertNotNull("No future", init.getFuture());
-        } catch (final ConcurrentException cex) {
-            fail("Unexpected exception: " + cex);
-        }
-    }
-
-    /**
-     * Tests whether initialize() is invoked.
-     */
-    @Test
-    public void testInitialize() {
-        final BackgroundInitializerTestImpl init = new BackgroundInitializerTestImpl();
-        init.start();
-        checkInitialize(init);
-    }
-
-    /**
-     * Tries to obtain the executor before start(). It should not have been
-     * initialized yet.
-     */
-    @Test
-    public void testGetActiveExecutorBeforeStart() {
-        final BackgroundInitializerTestImpl init = new BackgroundInitializerTestImpl();
-        assertNull("Got an executor", init.getActiveExecutor());
-    }
-
-    /**
-     * Tests whether an external executor is correctly detected.
-     */
-    @Test
-    public void testGetActiveExecutorExternal() throws InterruptedException {
-        final ExecutorService exec = Executors.newSingleThreadExecutor();
-        try {
-            final BackgroundInitializerTestImpl init = new BackgroundInitializerTestImpl(
-                    exec);
-            init.start();
-            assertSame("Wrong executor", exec, init.getActiveExecutor());
-            checkInitialize(init);
-        } finally {
-            exec.shutdown();
-            exec.awaitTermination(1, TimeUnit.SECONDS);
-        }
-    }
-
-    /**
-     * Tests getActiveExecutor() for a temporary executor.
-     */
-    @Test
-    public void testGetActiveExecutorTemp() {
-        final BackgroundInitializerTestImpl init = new BackgroundInitializerTestImpl();
-        init.start();
-        assertNotNull("No active executor", init.getActiveExecutor());
-        checkInitialize(init);
-    }
-
-    /**
-     * Tests the execution of the background task if a temporary executor has to
-     * be created.
-     */
-    @Test
-    public void testInitializeTempExecutor() {
-        final BackgroundInitializerTestImpl init = new BackgroundInitializerTestImpl();
-        assertTrue("Wrong result of start()", init.start());
-        checkInitialize(init);
-        assertTrue("Executor not shutdown", init.getActiveExecutor()
-                .isShutdown());
-    }
-
-    /**
-     * Tests whether an external executor can be set using the
-     * setExternalExecutor() method.
-     */
-    @Test
-    public void testSetExternalExecutor() {
-        final ExecutorService exec = Executors.newCachedThreadPool();
-        try {
-            final BackgroundInitializerTestImpl init = new BackgroundInitializerTestImpl();
-            init.setExternalExecutor(exec);
-            assertEquals("Wrong executor service", exec, init
-                    .getExternalExecutor());
-            assertTrue("Wrong result of start()", init.start());
-            assertSame("Wrong active executor", exec, init.getActiveExecutor());
-            checkInitialize(init);
-            assertFalse("Executor was shutdown", exec.isShutdown());
-        } finally {
-            exec.shutdown();
-        }
-    }
-
-    /**
-     * Tests that setting an executor after start() causes an exception.
-     *
-     * @throws org.apache.commons.lang3.concurrent.ConcurrentException because the test implementation may throw it
-     */
-    @Test
-    public void testSetExternalExecutorAfterStart() throws ConcurrentException, InterruptedException {
-        final BackgroundInitializerTestImpl init = new BackgroundInitializerTestImpl();
-        init.start();
-        ExecutorService exec = Executors.newSingleThreadExecutor();
-        try {
-            init.setExternalExecutor(exec);
-            fail("Could set executor after start()!");
-        } catch (final IllegalStateException istex) {
-            init.get();
-        } finally {
-            exec.shutdown();
-            exec.awaitTermination(1, TimeUnit.SECONDS);
-        }
-    }
-
-    /**
-     * Tests invoking start() multiple times. Only the first invocation should
-     * have an effect.
-     */
-    @Test
-    public void testStartMultipleTimes() {
-        final BackgroundInitializerTestImpl init = new BackgroundInitializerTestImpl();
-        assertTrue("Wrong result for start()", init.start());
-        for (int i = 0; i < 10; i++) {
-            assertFalse("Could start again", init.start());
-        }
-        checkInitialize(init);
-    }
-
-    /**
-     * Tests calling get() before start(). This should cause an exception.
-     *
-     * @throws org.apache.commons.lang3.concurrent.ConcurrentException because the test implementation may throw it
-     */
-    @Test(expected=IllegalStateException.class)
-    public void testGetBeforeStart() throws ConcurrentException {
-        final BackgroundInitializerTestImpl init = new BackgroundInitializerTestImpl();
-        init.get();
-    }
-
-    /**
-     * Tests the get() method if background processing causes a runtime
-     * exception.
-     */
-    @Test
-    public void testGetRuntimeException() {
-        final BackgroundInitializerTestImpl init = new BackgroundInitializerTestImpl();
-        final RuntimeException rex = new RuntimeException();
-        init.ex = rex;
-        init.start();
-        try {
-            init.get();
-            fail("Exception not thrown!");
-        } catch (final Exception ex) {
-            assertEquals("Runtime exception not thrown", rex, ex);
-        }
-    }
-
-    /**
-     * Tests the get() method if background processing causes a checked
-     * exception.
-     */
-    @Test
-    public void testGetCheckedException() {
-        final BackgroundInitializerTestImpl init = new BackgroundInitializerTestImpl();
-        final Exception ex = new Exception();
-        init.ex = ex;
-        init.start();
-        try {
-            init.get();
-            fail("Exception not thrown!");
-        } catch (final ConcurrentException cex) {
-            assertEquals("Exception not thrown", ex, cex.getCause());
-        }
-    }
-
-    /**
-     * Tests the get() method if waiting for the initialization is interrupted.
-     *
-     * @throws java.lang.InterruptedException because we're making use of Java's concurrent API
-     */
-    @Test
-    public void testGetInterruptedException() throws InterruptedException {
-        final ExecutorService exec = Executors.newSingleThreadExecutor();
-        final BackgroundInitializerTestImpl init = new BackgroundInitializerTestImpl(
-                exec);
-        final CountDownLatch latch1 = new CountDownLatch(1);
-        init.shouldSleep = true;
-        init.start();
-        final AtomicReference<InterruptedException> iex = new AtomicReference<InterruptedException>();
-        final Thread getThread = new Thread() {
-            @Override
-            public void run() {
-                try {
-                    init.get();
-                } catch (final ConcurrentException cex) {
-                    if (cex.getCause() instanceof InterruptedException) {
-                        iex.set((InterruptedException) cex.getCause());
-                    }
-                } finally {
-                    assertTrue("Thread not interrupted", isInterrupted());
-                    latch1.countDown();
-                }
-            }
-        };
-        getThread.start();
-        getThread.interrupt();
-        latch1.await();
-        exec.shutdownNow();
-        exec.awaitTermination(1, TimeUnit.SECONDS);
-        assertNotNull("No interrupted exception", iex.get());
-    }
-
-    /**
-     * Tests isStarted() before start() was called.
-     */
-    @Test
-    public void testIsStartedFalse() {
-        final BackgroundInitializerTestImpl init = new BackgroundInitializerTestImpl();
-        assertFalse("Already started", init.isStarted());
-    }
-
-    /**
-     * Tests isStarted() after start().
-     */
-    @Test
-    public void testIsStartedTrue() {
-        final BackgroundInitializerTestImpl init = new BackgroundInitializerTestImpl();
-        init.start();
-        assertTrue("Not started", init.isStarted());
-    }
-
-    /**
-     * Tests isStarted() after the background task has finished.
-     */
-    @Test
-    public void testIsStartedAfterGet() {
-        final BackgroundInitializerTestImpl init = new BackgroundInitializerTestImpl();
-        init.start();
-        checkInitialize(init);
-        assertTrue("Not started", init.isStarted());
-    }
-
-    /**
-     * A concrete implementation of BackgroundInitializer. It also overloads
-     * some methods that simplify testing.
-     */
-    private static class BackgroundInitializerTestImpl extends
-            BackgroundInitializer<Integer> {
-        /** An exception to be thrown by initialize(). */
-        Exception ex;
-
-        /** A flag whether the background task should sleep a while. */
-        boolean shouldSleep;
-
-        /** The number of invocations of initialize(). */
-        volatile int initializeCalls;
-
-        public BackgroundInitializerTestImpl() {
-            super();
-        }
-
-        public BackgroundInitializerTestImpl(final ExecutorService exec) {
-            super(exec);
-        }
-
-        /**
-         * Records this invocation. Optionally throws an exception or sleeps a
-         * while.
-         *
-         * @throws Exception in case of an error
-         */
-        @Override
-        protected Integer initialize() throws Exception {
-            if (ex != null) {
-                throw ex;
-            }
-            if (shouldSleep) {
-                Thread.sleep(60000L);
-            }
-            return Integer.valueOf(++initializeCalls);
-        }
-    }
-}
diff --git a/lang/src/test/java/org/apache/commons/lang3/concurrent/BasicThreadFactoryTest.java b/lang/src/test/java/org/apache/commons/lang3/concurrent/BasicThreadFactoryTest.java
deleted file mode 100644
index 3bf8a86..0000000
--- a/lang/src/test/java/org/apache/commons/lang3/concurrent/BasicThreadFactoryTest.java
+++ /dev/null
@@ -1,302 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.commons.lang3.concurrent;
-
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertFalse;
-import static org.junit.Assert.assertNotNull;
-import static org.junit.Assert.assertNotSame;
-import static org.junit.Assert.assertNull;
-import static org.junit.Assert.assertSame;
-import static org.junit.Assert.assertTrue;
-
-import java.util.concurrent.ThreadFactory;
-
-import org.easymock.EasyMock;
-import org.junit.Before;
-import org.junit.Test;
-
-/**
- * Test class for {@code BasicThreadFactory}.
- *
- * @version $Id$
- */
-public class BasicThreadFactoryTest {
-    /** Constant for the test naming pattern. */
-    private static final String PATTERN = "testThread-%d";
-
-    /** The builder for creating a thread factory. */
-    private BasicThreadFactory.Builder builder;
-
-    @Before
-    public void setUp() throws Exception {
-        builder = new BasicThreadFactory.Builder();
-    }
-
-    /**
-     * Tests the default options of a thread factory.
-     *
-     * @param factory the factory to be checked
-     */
-    private void checkFactoryDefaults(final BasicThreadFactory factory) {
-        assertNull("Got a naming pattern", factory.getNamingPattern());
-        assertNull("Got an exception handler", factory
-                .getUncaughtExceptionHandler());
-        assertNull("Got a priority", factory.getPriority());
-        assertNull("Got a daemon flag", factory.getDaemonFlag());
-        assertNotNull("No wrapped factory", factory.getWrappedFactory());
-    }
-
-    /**
-     * Tests the default values used by the builder.
-     */
-    @Test
-    public void testBuildDefaults() {
-        final BasicThreadFactory factory = builder.build();
-        checkFactoryDefaults(factory);
-    }
-
-    /**
-     * Tries to set a null naming pattern.
-     */
-    @Test(expected = NullPointerException.class)
-    public void testBuildNamingPatternNull() {
-        builder.namingPattern(null);
-    }
-
-    /**
-     * Tries to set a null wrapped factory.
-     */
-    @Test(expected = NullPointerException.class)
-    public void testBuildWrappedFactoryNull() {
-        builder.wrappedFactory(null);
-    }
-
-    /**
-     * Tries to set a null exception handler.
-     */
-    @Test(expected = NullPointerException.class)
-    public void testBuildUncaughtExceptionHandlerNull() {
-        builder.uncaughtExceptionHandler(null);
-    }
-
-    /**
-     * Tests the reset() method of the builder.
-     */
-    @Test
-    public void testBuilderReset() {
-        final ThreadFactory wrappedFactory = EasyMock.createMock(ThreadFactory.class);
-        final Thread.UncaughtExceptionHandler exHandler = EasyMock
-                .createMock(Thread.UncaughtExceptionHandler.class);
-        EasyMock.replay(wrappedFactory, exHandler);
-        builder.namingPattern(PATTERN).daemon(true).priority(
-                Thread.MAX_PRIORITY).uncaughtExceptionHandler(exHandler)
-                .wrappedFactory(wrappedFactory);
-        builder.reset();
-        final BasicThreadFactory factory = builder.build();
-        checkFactoryDefaults(factory);
-        assertNotSame("Wrapped factory not reset", wrappedFactory, factory
-                .getWrappedFactory());
-        EasyMock.verify(wrappedFactory, exHandler);
-    }
-
-    /**
-     * Tests whether reset() is automatically called after build().
-     */
-    @Test
-    public void testBuilderResetAfterBuild() {
-        builder.wrappedFactory(EasyMock.createNiceMock(ThreadFactory.class))
-                .namingPattern(PATTERN).daemon(true).build();
-        checkFactoryDefaults(builder.build());
-    }
-
-    /**
-     * Tests whether the naming pattern is applied to new threads.
-     */
-    @Test
-    public void testNewThreadNamingPattern() {
-        final ThreadFactory wrapped = EasyMock.createMock(ThreadFactory.class);
-        final Runnable r = EasyMock.createMock(Runnable.class);
-        final int count = 12;
-        for (int i = 0; i < count; i++) {
-            EasyMock.expect(wrapped.newThread(r)).andReturn(new Thread());
-        }
-        EasyMock.replay(wrapped, r);
-        final BasicThreadFactory factory = builder.wrappedFactory(wrapped)
-                .namingPattern(PATTERN).build();
-        for (int i = 0; i < count; i++) {
-            final Thread t = factory.newThread(r);
-            assertEquals("Wrong thread name", String.format(PATTERN, Long
-                    .valueOf(i + 1)), t.getName());
-            assertEquals("Wrong thread count", i + 1, factory.getThreadCount());
-        }
-        EasyMock.verify(wrapped, r);
-    }
-
-    /**
-     * Tests whether the thread name is not modified if no naming pattern is
-     * set.
-     */
-    @Test
-    public void testNewThreadNoNamingPattern() {
-        final ThreadFactory wrapped = EasyMock.createMock(ThreadFactory.class);
-        final Runnable r = EasyMock.createMock(Runnable.class);
-        final String name = "unchangedThreadName";
-        final Thread t = new Thread(name);
-        EasyMock.expect(wrapped.newThread(r)).andReturn(t);
-        EasyMock.replay(wrapped, r);
-        final BasicThreadFactory factory = builder.wrappedFactory(wrapped).build();
-        assertSame("Wrong thread", t, factory.newThread(r));
-        assertEquals("Name was changed", name, t.getName());
-        EasyMock.verify(wrapped, r);
-    }
-
-    /**
-     * Helper method for testing whether the daemon flag is taken into account.
-     *
-     * @param flag the value of the flag
-     */
-    private void checkDaemonFlag(final boolean flag) {
-        final ThreadFactory wrapped = EasyMock.createMock(ThreadFactory.class);
-        final Runnable r = EasyMock.createMock(Runnable.class);
-        final Thread t = new Thread();
-        EasyMock.expect(wrapped.newThread(r)).andReturn(t);
-        EasyMock.replay(wrapped, r);
-        final BasicThreadFactory factory = builder.wrappedFactory(wrapped).daemon(
-                flag).build();
-        assertSame("Wrong thread", t, factory.newThread(r));
-        assertTrue("Wrong daemon flag", flag == t.isDaemon());
-        EasyMock.verify(wrapped, r);
-    }
-
-    /**
-     * Tests whether daemon threads can be created.
-     */
-    @Test
-    public void testNewThreadDaemonTrue() {
-        checkDaemonFlag(true);
-    }
-
-    /**
-     * Tests whether the daemon status of new threads can be turned off.
-     */
-    @Test
-    public void testNewThreadDaemonFalse() {
-        checkDaemonFlag(false);
-    }
-
-    /**
-     * Tests whether the daemon flag is not touched on newly created threads if
-     * it is not specified.
-     */
-    @Test
-    public void testNewThreadNoDaemonFlag() {
-        final ThreadFactory wrapped = EasyMock.createMock(ThreadFactory.class);
-        final Runnable r1 = EasyMock.createMock(Runnable.class);
-        final Runnable r2 = EasyMock.createMock(Runnable.class);
-        final Thread t1 = new Thread();
-        final Thread t2 = new Thread();
-        t1.setDaemon(true);
-        EasyMock.expect(wrapped.newThread(r1)).andReturn(t1);
-        EasyMock.expect(wrapped.newThread(r2)).andReturn(t2);
-        EasyMock.replay(wrapped, r1, r2);
-        final BasicThreadFactory factory = builder.wrappedFactory(wrapped).build();
-        assertSame("Wrong thread 1", t1, factory.newThread(r1));
-        assertTrue("No daemon thread", t1.isDaemon());
-        assertSame("Wrong thread 2", t2, factory.newThread(r2));
-        assertFalse("A daemon thread", t2.isDaemon());
-        EasyMock.verify(wrapped, r1, r2);
-    }
-
-    /**
-     * Tests whether the priority is set on newly created threads.
-     */
-    @Test
-    public void testNewThreadPriority() {
-        final ThreadFactory wrapped = EasyMock.createMock(ThreadFactory.class);
-        final Runnable r = EasyMock.createMock(Runnable.class);
-        final Thread t = new Thread();
-        EasyMock.expect(wrapped.newThread(r)).andReturn(t);
-        EasyMock.replay(wrapped, r);
-        final int priority = Thread.NORM_PRIORITY + 1;
-        final BasicThreadFactory factory = builder.wrappedFactory(wrapped).priority(
-                priority).build();
-        assertSame("Wrong thread", t, factory.newThread(r));
-        assertEquals("Wrong priority", priority, t.getPriority());
-        EasyMock.verify(wrapped, r);
-    }
-
-    /**
-     * Tests whether the original priority is not changed if no priority is
-     * specified.
-     */
-    @Test
-    public void testNewThreadNoPriority() {
-        final ThreadFactory wrapped = EasyMock.createMock(ThreadFactory.class);
-        final Runnable r = EasyMock.createMock(Runnable.class);
-        final int orgPriority = Thread.NORM_PRIORITY + 1;
-        final Thread t = new Thread();
-        t.setPriority(orgPriority);
-        EasyMock.expect(wrapped.newThread(r)).andReturn(t);
-        EasyMock.replay(wrapped, r);
-        final BasicThreadFactory factory = builder.wrappedFactory(wrapped).build();
-        assertSame("Wrong thread", t, factory.newThread(r));
-        assertEquals("Wrong priority", orgPriority, t.getPriority());
-        EasyMock.verify(wrapped, r);
-    }
-
-    /**
-     * Tests whether the exception handler is set if one is provided.
-     */
-    @Test
-    public void testNewThreadExHandler() {
-        final ThreadFactory wrapped = EasyMock.createMock(ThreadFactory.class);
-        final Runnable r = EasyMock.createMock(Runnable.class);
-        final Thread.UncaughtExceptionHandler handler = EasyMock
-                .createMock(Thread.UncaughtExceptionHandler.class);
-        final Thread t = new Thread();
-        EasyMock.expect(wrapped.newThread(r)).andReturn(t);
-        EasyMock.replay(wrapped, r, handler);
-        final BasicThreadFactory factory = builder.wrappedFactory(wrapped)
-                .uncaughtExceptionHandler(handler).build();
-        assertSame("Wrong thread", t, factory.newThread(r));
-        assertEquals("Wrong exception handler", handler, t
-                .getUncaughtExceptionHandler());
-        EasyMock.verify(wrapped, r, handler);
-    }
-
-    /**
-     * Tests whether the original exception hander is not touched if none is
-     * specified.
-     */
-    @Test
-    public void testNewThreadNoExHandler() {
-        final ThreadFactory wrapped = EasyMock.createMock(ThreadFactory.class);
-        final Runnable r = EasyMock.createMock(Runnable.class);
-        final Thread.UncaughtExceptionHandler handler = EasyMock
-                .createMock(Thread.UncaughtExceptionHandler.class);
-        final Thread t = new Thread();
-        t.setUncaughtExceptionHandler(handler);
-        EasyMock.expect(wrapped.newThread(r)).andReturn(t);
-        EasyMock.replay(wrapped, r, handler);
-        final BasicThreadFactory factory = builder.wrappedFactory(wrapped).build();
-        assertSame("Wrong thread", t, factory.newThread(r));
-        assertEquals("Wrong exception handler", handler, t
-                .getUncaughtExceptionHandler());
-        EasyMock.verify(wrapped, r, handler);
-    }
-}
diff --git a/lang/src/test/java/org/apache/commons/lang3/concurrent/CallableBackgroundInitializerTest.java b/lang/src/test/java/org/apache/commons/lang3/concurrent/CallableBackgroundInitializerTest.java
deleted file mode 100644
index ac78126..0000000
--- a/lang/src/test/java/org/apache/commons/lang3/concurrent/CallableBackgroundInitializerTest.java
+++ /dev/null
@@ -1,107 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.commons.lang3.concurrent;
-
-import static org.junit.Assert.assertEquals;
-
-import java.util.concurrent.Callable;
-import java.util.concurrent.ExecutorService;
-import java.util.concurrent.Executors;
-import java.util.concurrent.TimeUnit;
-
-import org.junit.Test;
-
-/**
- * Test class for {@code CallableBackgroundInitializer}
- *
- * @version $Id$
- */
-public class CallableBackgroundInitializerTest  {
-    /** Constant for the result of the call() invocation. */
-    private static final Integer RESULT = Integer.valueOf(42);
-
-    /**
-     * Tries to create an instance without a Callable. This should cause an
-     * exception.
-     */
-    @Test(expected=IllegalArgumentException.class)
-    public void testInitNullCallable() {
-        new CallableBackgroundInitializer<Object>(null);
-    }
-
-    /**
-     * Tests whether the executor service is correctly passed to the super
-     * class.
-     */
-    @Test
-    public void testInitExecutor() throws InterruptedException {
-        final ExecutorService exec = Executors.newSingleThreadExecutor();
-        final CallableBackgroundInitializer<Integer> init = new CallableBackgroundInitializer<Integer>(
-                new TestCallable(), exec);
-        assertEquals("Executor not set", exec, init.getExternalExecutor());
-        exec.shutdown();
-        exec.awaitTermination(1, TimeUnit.SECONDS);
-    }
-
-    /**
-     * Tries to pass a null Callable to the constructor that takes an executor.
-     * This should cause an exception.
-     */
-    @Test(expected=IllegalArgumentException.class)
-    public void testInitExecutorNullCallable() throws InterruptedException {
-        final ExecutorService exec = Executors.newSingleThreadExecutor();
-        try {
-            new CallableBackgroundInitializer<Integer>(null, exec);
-        } finally {
-            exec.shutdown();
-            exec.awaitTermination(1, TimeUnit.SECONDS);
-        }
-        
-    }
-
-    /**
-     * Tests the implementation of initialize().
-     *
-     * @throws java.lang.Exception so we don't have to catch it
-     */
-    @Test
-    public void testInitialize() throws Exception {
-        final TestCallable call = new TestCallable();
-        final CallableBackgroundInitializer<Integer> init = new CallableBackgroundInitializer<Integer>(
-                call);
-        assertEquals("Wrong result", RESULT, init.initialize());
-        assertEquals("Wrong number of invocations", 1, call.callCount);
-    }
-
-    /**
-     * A test Callable implementation for checking the initializer's
-     * implementation of the initialize() method.
-     */
-    private static class TestCallable implements Callable<Integer> {
-        /** A counter for the number of call() invocations. */
-        int callCount;
-
-        /**
-         * Records this invocation and returns the test result.
-         */
-        @Override
-        public Integer call() throws Exception {
-            callCount++;
-            return RESULT;
-        }
-    }
-}
diff --git a/lang/src/test/java/org/apache/commons/lang3/concurrent/ConcurrentUtilsTest.java b/lang/src/test/java/org/apache/commons/lang3/concurrent/ConcurrentUtilsTest.java
deleted file mode 100644
index d23d954..0000000
--- a/lang/src/test/java/org/apache/commons/lang3/concurrent/ConcurrentUtilsTest.java
+++ /dev/null
@@ -1,583 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.commons.lang3.concurrent;
-
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertFalse;
-import static org.junit.Assert.assertNull;
-import static org.junit.Assert.assertSame;
-import static org.junit.Assert.assertTrue;
-import static org.junit.Assert.fail;
-
-import java.util.concurrent.ConcurrentHashMap;
-import java.util.concurrent.ConcurrentMap;
-import java.util.concurrent.ExecutionException;
-import java.util.concurrent.Future;
-import java.util.concurrent.TimeUnit;
-
-import org.easymock.EasyMock;
-import org.junit.Test;
-
-/**
- * Test class for {@link ConcurrentUtils}.
- *
- * @version $Id$
- */
-public class ConcurrentUtilsTest {
-    /**
-     * Tests creating a ConcurrentException with a runtime exception as cause.
-     */
-    @Test(expected = IllegalArgumentException.class)
-    public void testConcurrentExceptionCauseUnchecked() {
-        new ConcurrentException(new RuntimeException());
-    }
-
-    /**
-     * Tests creating a ConcurrentException with an error as cause.
-     */
-    @Test(expected = IllegalArgumentException.class)
-    public void testConcurrentExceptionCauseError() {
-        new ConcurrentException("An error", new Error());
-    }
-
-    /**
-     * Tests creating a ConcurrentException with null as cause.
-     */
-    @Test(expected = IllegalArgumentException.class)
-    public void testConcurrentExceptionCauseNull() {
-        new ConcurrentException(null);
-    }
-
-    /**
-     * Tries to create a ConcurrentRuntimeException with a runtime as cause.
-     */
-    @Test(expected = IllegalArgumentException.class)
-    public void testConcurrentRuntimeExceptionCauseUnchecked() {
-        new ConcurrentRuntimeException(new RuntimeException());
-    }
-
-    /**
-     * Tries to create a ConcurrentRuntimeException with an error as cause.
-     */
-    @Test(expected = IllegalArgumentException.class)
-    public void testConcurrentRuntimeExceptionCauseError() {
-        new ConcurrentRuntimeException("An error", new Error());
-    }
-
-    /**
-     * Tries to create a ConcurrentRuntimeException with null as cause.
-     */
-    @Test(expected = IllegalArgumentException.class)
-    public void testConcurrentRuntimeExceptionCauseNull() {
-        new ConcurrentRuntimeException(null);
-    }
-
-    /**
-     * Tests extractCause() for a null exception.
-     */
-    @Test
-    public void testExtractCauseNull() {
-        assertNull("Non null result", ConcurrentUtils.extractCause(null));
-    }
-
-    /**
-     * Tests extractCause() if the cause of the passed in exception is null.
-     */
-    @Test
-    public void testExtractCauseNullCause() {
-        assertNull("Non null result", ConcurrentUtils
-                .extractCause(new ExecutionException("Test", null)));
-    }
-
-    /**
-     * Tests extractCause() if the cause is an error.
-     */
-    @Test
-    public void testExtractCauseError() {
-        final Error err = new AssertionError("Test");
-        try {
-            ConcurrentUtils.extractCause(new ExecutionException(err));
-            fail("Error not thrown!");
-        } catch (final Error e) {
-            assertEquals("Wrong error", err, e);
-        }
-    }
-
-    /**
-     * Tests extractCause() if the cause is an unchecked exception.
-     */
-    @Test
-    public void testExtractCauseUncheckedException() {
-        final RuntimeException rex = new RuntimeException("Test");
-        try {
-            ConcurrentUtils.extractCause(new ExecutionException(rex));
-            fail("Runtime exception not thrown!");
-        } catch (final RuntimeException r) {
-            assertEquals("Wrong exception", rex, r);
-        }
-    }
-
-    /**
-     * Tests extractCause() if the cause is a checked exception.
-     */
-    @Test
-    public void testExtractCauseChecked() {
-        final Exception ex = new Exception("Test");
-        final ConcurrentException cex = ConcurrentUtils
-                .extractCause(new ExecutionException(ex));
-        assertSame("Wrong cause", ex, cex.getCause());
-    }
-
-    /**
-     * Tests extractCauseUnchecked() for a null exception.
-     */
-    @Test
-    public void testExtractCauseUncheckedNull() {
-        assertNull("Non null result", ConcurrentUtils.extractCauseUnchecked(null));
-    }
-
-    /**
-     * Tests extractCauseUnchecked() if the cause of the passed in exception is null.
-     */
-    @Test
-    public void testExtractCauseUncheckedNullCause() {
-        assertNull("Non null result", ConcurrentUtils
-                .extractCauseUnchecked(new ExecutionException("Test", null)));
-    }
-
-    /**
-     * Tests extractCauseUnchecked() if the cause is an error.
-     */
-    @Test
-    public void testExtractCauseUncheckedError() {
-        final Error err = new AssertionError("Test");
-        try {
-            ConcurrentUtils.extractCauseUnchecked(new ExecutionException(err));
-            fail("Error not thrown!");
-        } catch (final Error e) {
-            assertEquals("Wrong error", err, e);
-        }
-    }
-
-    /**
-     * Tests extractCauseUnchecked() if the cause is an unchecked exception.
-     */
-    @Test
-    public void testExtractCauseUncheckedUncheckedException() {
-        final RuntimeException rex = new RuntimeException("Test");
-        try {
-            ConcurrentUtils.extractCauseUnchecked(new ExecutionException(rex));
-            fail("Runtime exception not thrown!");
-        } catch (final RuntimeException r) {
-            assertEquals("Wrong exception", rex, r);
-        }
-    }
-
-    /**
-     * Tests extractCauseUnchecked() if the cause is a checked exception.
-     */
-    @Test
-    public void testExtractCauseUncheckedChecked() {
-        final Exception ex = new Exception("Test");
-        final ConcurrentRuntimeException cex = ConcurrentUtils
-                .extractCauseUnchecked(new ExecutionException(ex));
-        assertSame("Wrong cause", ex, cex.getCause());
-    }
-
-    /**
-     * Tests handleCause() if the cause is an error.
-     *
-     * @throws org.apache.commons.lang3.concurrent.ConcurrentException so we don't have to catch it
-     */
-    @Test
-    public void testHandleCauseError() throws ConcurrentException {
-        final Error err = new AssertionError("Test");
-        try {
-            ConcurrentUtils.handleCause(new ExecutionException(err));
-            fail("Error not thrown!");
-        } catch (final Error e) {
-            assertEquals("Wrong error", err, e);
-        }
-    }
-
-    /**
-     * Tests handleCause() if the cause is an unchecked exception.
-     *
-     * @throws org.apache.commons.lang3.concurrent.ConcurrentException so we don't have to catch it
-     */
-    @Test
-    public void testHandleCauseUncheckedException() throws ConcurrentException {
-        final RuntimeException rex = new RuntimeException("Test");
-        try {
-            ConcurrentUtils.handleCause(new ExecutionException(rex));
-            fail("Runtime exception not thrown!");
-        } catch (final RuntimeException r) {
-            assertEquals("Wrong exception", rex, r);
-        }
-    }
-
-    /**
-     * Tests handleCause() if the cause is a checked exception.
-     */
-    @Test
-    public void testHandleCauseChecked() {
-        final Exception ex = new Exception("Test");
-        try {
-            ConcurrentUtils.handleCause(new ExecutionException(ex));
-            fail("ConcurrentException not thrown!");
-        } catch (final ConcurrentException cex) {
-            assertEquals("Wrong cause", ex, cex.getCause());
-        }
-    }
-
-    /**
-     * Tests handleCause() for a null parameter or a null cause. In this case
-     * the method should do nothing. We can only test that no exception is
-     * thrown.
-     *
-     * @throws org.apache.commons.lang3.concurrent.ConcurrentException so we don't have to catch it
-     */
-    @Test
-    public void testHandleCauseNull() throws ConcurrentException {
-        ConcurrentUtils.handleCause(null);
-        ConcurrentUtils.handleCause(new ExecutionException("Test", null));
-    }
-
-    /**
-     * Tests handleCauseUnchecked() if the cause is an error.
-     */
-    @Test
-    public void testHandleCauseUncheckedError() {
-        final Error err = new AssertionError("Test");
-        try {
-            ConcurrentUtils.handleCauseUnchecked(new ExecutionException(err));
-            fail("Error not thrown!");
-        } catch (final Error e) {
-            assertEquals("Wrong error", err, e);
-        }
-    }
-
-    /**
-     * Tests handleCauseUnchecked() if the cause is an unchecked exception.
-     */
-    @Test
-    public void testHandleCauseUncheckedUncheckedException() {
-        final RuntimeException rex = new RuntimeException("Test");
-        try {
-            ConcurrentUtils.handleCauseUnchecked(new ExecutionException(rex));
-            fail("Runtime exception not thrown!");
-        } catch (final RuntimeException r) {
-            assertEquals("Wrong exception", rex, r);
-        }
-    }
-
-    /**
-     * Tests handleCauseUnchecked() if the cause is a checked exception.
-     */
-    @Test
-    public void testHandleCauseUncheckedChecked() {
-        final Exception ex = new Exception("Test");
-        try {
-            ConcurrentUtils.handleCauseUnchecked(new ExecutionException(ex));
-            fail("ConcurrentRuntimeException not thrown!");
-        } catch (final ConcurrentRuntimeException crex) {
-            assertEquals("Wrong cause", ex, crex.getCause());
-        }
-    }
-
-    /**
-     * Tests handleCauseUnchecked() for a null parameter or a null cause. In
-     * this case the method should do nothing. We can only test that no
-     * exception is thrown.
-     */
-    @Test
-    public void testHandleCauseUncheckedNull() {
-        ConcurrentUtils.handleCauseUnchecked(null);
-        ConcurrentUtils.handleCauseUnchecked(new ExecutionException("Test",
-                null));
-    }
-
-    //-----------------------------------------------------------------------
-    /**
-     * Tests initialize() for a null argument.
-     *
-     * @throws org.apache.commons.lang3.concurrent.ConcurrentException so we don't have to catch it
-     */
-    @Test
-    public void testInitializeNull() throws ConcurrentException {
-        assertNull("Got a result", ConcurrentUtils.initialize(null));
-    }
-
-    /**
-     * Tests a successful initialize() operation.
-     *
-     * @throws org.apache.commons.lang3.concurrent.ConcurrentException so we don't have to catch it
-     */
-    @Test
-    public void testInitialize() throws ConcurrentException {
-        @SuppressWarnings("unchecked")
-        final
-        ConcurrentInitializer<Object> init = EasyMock
-                .createMock(ConcurrentInitializer.class);
-        final Object result = new Object();
-        EasyMock.expect(init.get()).andReturn(result);
-        EasyMock.replay(init);
-        assertSame("Wrong result object", result, ConcurrentUtils
-                .initialize(init));
-        EasyMock.verify(init);
-    }
-
-    /**
-     * Tests initializeUnchecked() for a null argument.
-     */
-    @Test
-    public void testInitializeUncheckedNull() {
-        assertNull("Got a result", ConcurrentUtils.initializeUnchecked(null));
-    }
-
-    /**
-     * Tests a successful initializeUnchecked() operation.
-     *
-     * @throws org.apache.commons.lang3.concurrent.ConcurrentException so we don't have to catch it
-     */
-    @Test
-    public void testInitializeUnchecked() throws ConcurrentException {
-        @SuppressWarnings("unchecked")
-        final
-        ConcurrentInitializer<Object> init = EasyMock
-                .createMock(ConcurrentInitializer.class);
-        final Object result = new Object();
-        EasyMock.expect(init.get()).andReturn(result);
-        EasyMock.replay(init);
-        assertSame("Wrong result object", result, ConcurrentUtils
-                .initializeUnchecked(init));
-        EasyMock.verify(init);
-    }
-
-    /**
-     * Tests whether exceptions are correctly handled by initializeUnchecked().
-     *
-     * @throws org.apache.commons.lang3.concurrent.ConcurrentException so we don't have to catch it
-     */
-    @Test
-    public void testInitializeUncheckedEx() throws ConcurrentException {
-        @SuppressWarnings("unchecked")
-        final
-        ConcurrentInitializer<Object> init = EasyMock
-                .createMock(ConcurrentInitializer.class);
-        final Exception cause = new Exception();
-        EasyMock.expect(init.get()).andThrow(new ConcurrentException(cause));
-        EasyMock.replay(init);
-        try {
-            ConcurrentUtils.initializeUnchecked(init);
-            fail("Exception not thrown!");
-        } catch (final ConcurrentRuntimeException crex) {
-            assertSame("Wrong cause", cause, crex.getCause());
-        }
-        EasyMock.verify(init);
-    }
-
-    //-----------------------------------------------------------------------
-    /**
-     * Tests constant future.
-     *
-     * @throws java.lang.Exception so we don't have to catch it
-     */
-    @Test
-    public void testConstantFuture_Integer() throws Exception {
-        final Integer value = Integer.valueOf(5);
-        final Future<Integer> test = ConcurrentUtils.constantFuture(value);
-        assertTrue(test.isDone());
-        assertSame(value, test.get());
-        assertSame(value, test.get(1000, TimeUnit.SECONDS));
-        assertSame(value, test.get(1000, null));
-        assertFalse(test.isCancelled());
-        assertFalse(test.cancel(true));
-        assertFalse(test.cancel(false));
-    }
-
-    /**
-     * Tests constant future.
-     *
-     * @throws java.lang.Exception so we don't have to catch it
-     */
-    @Test
-    public void testConstantFuture_null() throws Exception {
-        final Integer value = null;
-        final Future<Integer> test = ConcurrentUtils.constantFuture(value);
-        assertTrue(test.isDone());
-        assertSame(value, test.get());
-        assertSame(value, test.get(1000, TimeUnit.SECONDS));
-        assertSame(value, test.get(1000, null));
-        assertFalse(test.isCancelled());
-        assertFalse(test.cancel(true));
-        assertFalse(test.cancel(false));
-    }
-
-    //-----------------------------------------------------------------------
-    /**
-     * Tests putIfAbsent() if the map contains the key in question.
-     */
-    @Test
-    public void testPutIfAbsentKeyPresent() {
-        final String key = "testKey";
-        final Integer value = 42;
-        final ConcurrentMap<String, Integer> map = new ConcurrentHashMap<String, Integer>();
-        map.put(key, value);
-        assertEquals("Wrong result", value,
-                ConcurrentUtils.putIfAbsent(map, key, 0));
-        assertEquals("Wrong value in map", value, map.get(key));
-    }
-
-    /**
-     * Tests putIfAbsent() if the map does not contain the key in question.
-     */
-    @Test
-    public void testPutIfAbsentKeyNotPresent() {
-        final String key = "testKey";
-        final Integer value = 42;
-        final ConcurrentMap<String, Integer> map = new ConcurrentHashMap<String, Integer>();
-        assertEquals("Wrong result", value,
-                ConcurrentUtils.putIfAbsent(map, key, value));
-        assertEquals("Wrong value in map", value, map.get(key));
-    }
-
-    /**
-     * Tests putIfAbsent() if a null map is passed in.
-     */
-    @Test
-    public void testPutIfAbsentNullMap() {
-        assertNull("Wrong result",
-                ConcurrentUtils.putIfAbsent(null, "test", 100));
-    }
-
-    /**
-     * Tests createIfAbsent() if the key is found in the map.
-     *
-     * @throws org.apache.commons.lang3.concurrent.ConcurrentException so we don't have to catch it
-     */
-    @Test
-    public void testCreateIfAbsentKeyPresent() throws ConcurrentException {
-        @SuppressWarnings("unchecked")
-        final
-        ConcurrentInitializer<Integer> init = EasyMock
-                .createMock(ConcurrentInitializer.class);
-        EasyMock.replay(init);
-        final String key = "testKey";
-        final Integer value = 42;
-        final ConcurrentMap<String, Integer> map = new ConcurrentHashMap<String, Integer>();
-        map.put(key, value);
-        assertEquals("Wrong result", value,
-                ConcurrentUtils.createIfAbsent(map, key, init));
-        assertEquals("Wrong value in map", value, map.get(key));
-        EasyMock.verify(init);
-    }
-
-    /**
-     * Tests createIfAbsent() if the map does not contain the key in question.
-     *
-     * @throws org.apache.commons.lang3.concurrent.ConcurrentException so we don't have to catch it
-     */
-    @Test
-    public void testCreateIfAbsentKeyNotPresent() throws ConcurrentException {
-        @SuppressWarnings("unchecked")
-        final
-        ConcurrentInitializer<Integer> init = EasyMock
-                .createMock(ConcurrentInitializer.class);
-        final String key = "testKey";
-        final Integer value = 42;
-        EasyMock.expect(init.get()).andReturn(value);
-        EasyMock.replay(init);
-        final ConcurrentMap<String, Integer> map = new ConcurrentHashMap<String, Integer>();
-        assertEquals("Wrong result", value,
-                ConcurrentUtils.createIfAbsent(map, key, init));
-        assertEquals("Wrong value in map", value, map.get(key));
-        EasyMock.verify(init);
-    }
-
-    /**
-     * Tests createIfAbsent() if a null map is passed in.
-     *
-     * @throws org.apache.commons.lang3.concurrent.ConcurrentException so we don't have to catch it
-     */
-    @Test
-    public void testCreateIfAbsentNullMap() throws ConcurrentException {
-        @SuppressWarnings("unchecked")
-        final
-        ConcurrentInitializer<Integer> init = EasyMock
-                .createMock(ConcurrentInitializer.class);
-        EasyMock.replay(init);
-        assertNull("Wrong result",
-                ConcurrentUtils.createIfAbsent(null, "test", init));
-        EasyMock.verify(init);
-    }
-
-    /**
-     * Tests createIfAbsent() if a null initializer is passed in.
-     *
-     * @throws org.apache.commons.lang3.concurrent.ConcurrentException so we don't have to catch it
-     */
-    @Test
-    public void testCreateIfAbsentNullInit() throws ConcurrentException {
-        final ConcurrentMap<String, Integer> map = new ConcurrentHashMap<String, Integer>();
-        final String key = "testKey";
-        final Integer value = 42;
-        map.put(key, value);
-        assertNull("Wrong result",
-                ConcurrentUtils.createIfAbsent(map, key, null));
-        assertEquals("Map was changed", value, map.get(key));
-    }
-
-    /**
-     * Tests createIfAbsentUnchecked() if no exception is thrown.
-     */
-    @Test
-    public void testCreateIfAbsentUncheckedSuccess() {
-        final String key = "testKey";
-        final Integer value = 42;
-        final ConcurrentMap<String, Integer> map = new ConcurrentHashMap<String, Integer>();
-        assertEquals("Wrong result", value,
-                ConcurrentUtils.createIfAbsentUnchecked(map, key,
-                        new ConstantInitializer<Integer>(value)));
-        assertEquals("Wrong value in map", value, map.get(key));
-    }
-
-    /**
-     * Tests createIfAbsentUnchecked() if an exception is thrown.
-     *
-     * @throws org.apache.commons.lang3.concurrent.ConcurrentException so we don't have to catch it
-     */
-    @Test
-    public void testCreateIfAbsentUncheckedException()
-            throws ConcurrentException {
-        @SuppressWarnings("unchecked")
-        final
-        ConcurrentInitializer<Integer> init = EasyMock
-                .createMock(ConcurrentInitializer.class);
-        final Exception ex = new Exception();
-        EasyMock.expect(init.get()).andThrow(new ConcurrentException(ex));
-        EasyMock.replay(init);
-        try {
-            ConcurrentUtils.createIfAbsentUnchecked(
-                    new ConcurrentHashMap<String, Integer>(), "test", init);
-            fail("Exception not thrown!");
-        } catch (final ConcurrentRuntimeException crex) {
-            assertEquals("Wrong cause", ex, crex.getCause());
-        }
-        EasyMock.verify(init);
-    }
-}
diff --git a/lang/src/test/java/org/apache/commons/lang3/concurrent/ConstantInitializerTest.java b/lang/src/test/java/org/apache/commons/lang3/concurrent/ConstantInitializerTest.java
deleted file mode 100644
index 446089c..0000000
--- a/lang/src/test/java/org/apache/commons/lang3/concurrent/ConstantInitializerTest.java
+++ /dev/null
@@ -1,135 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.commons.lang3.concurrent;
-
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertTrue;
-
-import java.util.regex.Pattern;
-
-import org.junit.Before;
-import org.junit.Test;
-
-/**
- * Test class for {@code ConstantInitializer}.
- *
- * @version $Id$
- */
-public class ConstantInitializerTest {
-    /** Constant for the object managed by the initializer. */
-    private static final Integer VALUE = 42;
-
-    /** The initializer to be tested. */
-    private ConstantInitializer<Integer> init;
-
-    @Before
-    public void setUp() throws Exception {
-        init = new ConstantInitializer<Integer>(VALUE);
-    }
-
-    /**
-     * Helper method for testing equals() and hashCode().
-     *
-     * @param obj the object to compare with the test instance
-     * @param expected the expected result
-     */
-    private void checkEquals(final Object obj, final boolean expected) {
-        assertTrue("Wrong result of equals", expected == init.equals(obj));
-        if (obj != null) {
-            assertTrue("Not symmetric", expected == obj.equals(init));
-            if (expected) {
-                assertEquals("Different hash codes", init.hashCode(),
-                        obj.hashCode());
-            }
-        }
-    }
-
-    /**
-     * Tests whether the correct object is returned.
-     */
-    @Test
-    public void testGetObject() {
-        assertEquals("Wrong object", VALUE, init.getObject());
-    }
-
-    /**
-     * Tests whether get() returns the correct object.
-     *
-     * @throws org.apache.commons.lang3.concurrent.ConcurrentException so we don't have to catch it
-     */
-    @Test
-    public void testGet() throws ConcurrentException {
-        assertEquals("Wrong object", VALUE, init.get());
-    }
-
-    /**
-     * Tests equals() if the expected result is true.
-     */
-    @Test
-    public void testEqualsTrue() {
-        checkEquals(init, true);
-        ConstantInitializer<Integer> init2 = new ConstantInitializer<Integer>(
-                Integer.valueOf(VALUE.intValue()));
-        checkEquals(init2, true);
-        init = new ConstantInitializer<Integer>(null);
-        init2 = new ConstantInitializer<Integer>(null);
-        checkEquals(init2, true);
-    }
-
-    /**
-     * Tests equals() if the expected result is false.
-     */
-    @Test
-    public void testEqualsFalse() {
-        ConstantInitializer<Integer> init2 = new ConstantInitializer<Integer>(
-                null);
-        checkEquals(init2, false);
-        init2 = new ConstantInitializer<Integer>(VALUE + 1);
-        checkEquals(init2, false);
-    }
-
-    /**
-     * Tests equals() with objects of other classes.
-     */
-    @Test
-    public void testEqualsWithOtherObjects() {
-        checkEquals(null, false);
-        checkEquals(this, false);
-        checkEquals(new ConstantInitializer<String>("Test"), false);
-    }
-
-    /**
-     * Tests the string representation.
-     */
-    @Test
-    public void testToString() {
-        final String s = init.toString();
-        final Pattern pattern = Pattern
-                .compile("ConstantInitializer@-?\\d+ \\[ object = " + VALUE
-                        + " \\]");
-        assertTrue("Wrong string: " + s, pattern.matcher(s).matches());
-    }
-
-    /**
-     * Tests the string representation if the managed object is null.
-     */
-    @Test
-    public void testToStringNull() {
-        final String s = new ConstantInitializer<Object>(null).toString();
-        assertTrue("Object not found: " + s, s.indexOf("object = null") > 0);
-    }
-}
diff --git a/lang/src/test/java/org/apache/commons/lang3/concurrent/LazyInitializerTest.java b/lang/src/test/java/org/apache/commons/lang3/concurrent/LazyInitializerTest.java
deleted file mode 100644
index 409234f..0000000
--- a/lang/src/test/java/org/apache/commons/lang3/concurrent/LazyInitializerTest.java
+++ /dev/null
@@ -1,58 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.commons.lang3.concurrent;
-
-import org.junit.Before;
-
-/**
- * Test class for {@code LazyInitializer}.
- *
- * @version $Id$
- */
-public class LazyInitializerTest extends AbstractConcurrentInitializerTest {
-    /** The initializer to be tested. */
-    private LazyInitializerTestImpl initializer;
-
-    @Before
-    public void setUp() throws Exception {
-        initializer = new LazyInitializerTestImpl();
-    }
-
-    /**
-     * Returns the initializer to be tested. This implementation returns the
-     * {@code LazyInitializer} created in the {@code setUp()} method.
-     *
-     * @return the initializer to be tested
-     */
-    @Override
-    protected ConcurrentInitializer<Object> createInitializer() {
-        return initializer;
-    }
-
-    /**
-     * A test implementation of LazyInitializer. This class creates a plain
-     * Object. As Object does not provide a specific equals() method, it is easy
-     * to check whether multiple instances were created.
-     */
-    private static class LazyInitializerTestImpl extends
-            LazyInitializer<Object> {
-        @Override
-        protected Object initialize() {
-            return new Object();
-        }
-    }
-}
diff --git a/lang/src/test/java/org/apache/commons/lang3/concurrent/MultiBackgroundInitializerTest.java b/lang/src/test/java/org/apache/commons/lang3/concurrent/MultiBackgroundInitializerTest.java
deleted file mode 100644
index 72183c1..0000000
--- a/lang/src/test/java/org/apache/commons/lang3/concurrent/MultiBackgroundInitializerTest.java
+++ /dev/null
@@ -1,414 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.commons.lang3.concurrent;
-
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertFalse;
-import static org.junit.Assert.assertNull;
-import static org.junit.Assert.assertTrue;
-import static org.junit.Assert.fail;
-
-import java.util.Iterator;
-import java.util.NoSuchElementException;
-import java.util.concurrent.ExecutorService;
-import java.util.concurrent.Executors;
-import java.util.concurrent.TimeUnit;
-
-import org.junit.Before;
-import org.junit.Test;
-
-/**
- * Test class for {@link MultiBackgroundInitializer}.
- *
- * @version $Id$
- */
-public class MultiBackgroundInitializerTest {
-    /** Constant for the names of the child initializers. */
-    private static final String CHILD_INIT = "childInitializer";
-
-    /** The initializer to be tested. */
-    private MultiBackgroundInitializer initializer;
-
-    @Before
-    public void setUp() throws Exception {
-        initializer = new MultiBackgroundInitializer();
-    }
-
-    /**
-     * Tests whether a child initializer has been executed. Optionally the
-     * expected executor service can be checked, too.
-     *
-     * @param child the child initializer
-     * @param expExec the expected executor service (null if the executor should
-     * not be checked)
-     * @throws ConcurrentException if an error occurs
-     */
-    private void checkChild(final BackgroundInitializer<?> child,
-            final ExecutorService expExec) throws ConcurrentException {
-        final ChildBackgroundInitializer cinit = (ChildBackgroundInitializer) child;
-        final Integer result = cinit.get();
-        assertEquals("Wrong result", 1, result.intValue());
-        assertEquals("Wrong number of executions", 1, cinit.initializeCalls);
-        if (expExec != null) {
-            assertEquals("Wrong executor service", expExec,
-                    cinit.currentExecutor);
-        }
-    }
-
-    /**
-     * Tests addInitializer() if a null name is passed in. This should cause an
-     * exception.
-     */
-    @Test(expected = IllegalArgumentException.class)
-    public void testAddInitializerNullName() {
-        initializer.addInitializer(null, new ChildBackgroundInitializer());
-    }
-
-    /**
-     * Tests addInitializer() if a null initializer is passed in. This should
-     * cause an exception.
-     */
-    @Test(expected = IllegalArgumentException.class)
-    public void testAddInitializerNullInit() {
-        initializer.addInitializer(CHILD_INIT, null);
-    }
-
-    /**
-     * Tests the background processing if there are no child initializers.
-     *
-     * @throws org.apache.commons.lang3.concurrent.ConcurrentException so we don't have to catch it
-     */
-    @Test
-    public void testInitializeNoChildren() throws ConcurrentException {
-        assertTrue("Wrong result of start()", initializer.start());
-        final MultiBackgroundInitializer.MultiBackgroundInitializerResults res = initializer
-                .get();
-        assertTrue("Got child initializers", res.initializerNames().isEmpty());
-        assertTrue("Executor not shutdown", initializer.getActiveExecutor()
-                .isShutdown());
-    }
-
-    /**
-     * Helper method for testing the initialize() method. This method can
-     * operate with both an external and a temporary executor service.
-     *
-     * @return the result object produced by the initializer
-     *
-     * @throws org.apache.commons.lang3.concurrent.ConcurrentException so we don't have to catch it
-     */
-    private MultiBackgroundInitializer.MultiBackgroundInitializerResults checkInitialize()
-            throws ConcurrentException {
-        final int count = 5;
-        for (int i = 0; i < count; i++) {
-            initializer.addInitializer(CHILD_INIT + i,
-                    new ChildBackgroundInitializer());
-        }
-        initializer.start();
-        final MultiBackgroundInitializer.MultiBackgroundInitializerResults res = initializer
-                .get();
-        assertEquals("Wrong number of child initializers", count, res
-                .initializerNames().size());
-        for (int i = 0; i < count; i++) {
-            final String key = CHILD_INIT + i;
-            assertTrue("Name not found: " + key, res.initializerNames()
-                    .contains(key));
-            assertEquals("Wrong result object", Integer.valueOf(1), res
-                    .getResultObject(key));
-            assertFalse("Exception flag", res.isException(key));
-            assertNull("Got an exception", res.getException(key));
-            checkChild(res.getInitializer(key), initializer.getActiveExecutor());
-        }
-        return res;
-    }
-
-    /**
-     * Tests background processing if a temporary executor is used.
-     *
-     * @throws org.apache.commons.lang3.concurrent.ConcurrentException so we don't have to catch it
-     */
-    @Test
-    public void testInitializeTempExec() throws ConcurrentException {
-        checkInitialize();
-        assertTrue("Executor not shutdown", initializer.getActiveExecutor()
-                .isShutdown());
-    }
-
-    /**
-     * Tests background processing if an external executor service is provided.
-     *
-     * @throws org.apache.commons.lang3.concurrent.ConcurrentException so we don't have to catch it
-     */
-    @Test
-    public void testInitializeExternalExec() throws ConcurrentException, InterruptedException {
-        final ExecutorService exec = Executors.newCachedThreadPool();
-        try {
-            initializer = new MultiBackgroundInitializer(exec);
-            checkInitialize();
-            assertEquals("Wrong executor", exec, initializer
-                    .getActiveExecutor());
-            assertFalse("Executor was shutdown", exec.isShutdown());
-        } finally {
-            exec.shutdown();
-            exec.awaitTermination(1, TimeUnit.SECONDS);
-        }
-    }
-
-    /**
-     * Tests the behavior of initialize() if a child initializer has a specific
-     * executor service. Then this service should not be overridden.
-     *
-     * @throws org.apache.commons.lang3.concurrent.ConcurrentException so we don't have to catch it
-     */
-    @Test
-    public void testInitializeChildWithExecutor() throws ConcurrentException, InterruptedException {
-        final String initExec = "childInitializerWithExecutor";
-        final ExecutorService exec = Executors.newSingleThreadExecutor();
-        try {
-            final ChildBackgroundInitializer c1 = new ChildBackgroundInitializer();
-            final ChildBackgroundInitializer c2 = new ChildBackgroundInitializer();
-            c2.setExternalExecutor(exec);
-            initializer.addInitializer(CHILD_INIT, c1);
-            initializer.addInitializer(initExec, c2);
-            initializer.start();
-            initializer.get();
-            checkChild(c1, initializer.getActiveExecutor());
-            checkChild(c2, exec);
-        } finally {
-            exec.shutdown();
-            exec.awaitTermination(1, TimeUnit.SECONDS);
-        }
-    }
-
-    /**
-     * Tries to add another child initializer after the start() method has been
-     * called. This should not be allowed.
-     *
-     * @throws org.apache.commons.lang3.concurrent.ConcurrentException so we don't have to catch it
-     */
-    @Test
-    public void testAddInitializerAfterStart() throws ConcurrentException {
-        initializer.start();
-        try {
-            initializer.addInitializer(CHILD_INIT,
-                    new ChildBackgroundInitializer());
-            fail("Could add initializer after start()!");
-        } catch (final IllegalStateException istex) {
-            initializer.get();
-        }
-    }
-
-    /**
-     * Tries to query an unknown child initializer from the results object. This
-     * should cause an exception.
-     *
-     * @throws org.apache.commons.lang3.concurrent.ConcurrentException so we don't have to catch it
-     */
-    @Test(expected = NoSuchElementException.class)
-    public void testResultGetInitializerUnknown() throws ConcurrentException {
-        final MultiBackgroundInitializer.MultiBackgroundInitializerResults res = checkInitialize();
-        res.getInitializer("unknown");
-    }
-
-    /**
-     * Tries to query the results of an unknown child initializer from the
-     * results object. This should cause an exception.
-     *
-     * @throws org.apache.commons.lang3.concurrent.ConcurrentException so we don't have to catch it
-     */
-    @Test(expected = NoSuchElementException.class)
-    public void testResultGetResultObjectUnknown() throws ConcurrentException {
-        final MultiBackgroundInitializer.MultiBackgroundInitializerResults res = checkInitialize();
-        res.getResultObject("unknown");
-    }
-
-    /**
-     * Tries to query the exception of an unknown child initializer from the
-     * results object. This should cause an exception.
-     *
-     * @throws org.apache.commons.lang3.concurrent.ConcurrentException so we don't have to catch it
-     */
-    @Test(expected = NoSuchElementException.class)
-    public void testResultGetExceptionUnknown() throws ConcurrentException {
-        final MultiBackgroundInitializer.MultiBackgroundInitializerResults res = checkInitialize();
-        res.getException("unknown");
-    }
-
-    /**
-     * Tries to query the exception flag of an unknown child initializer from
-     * the results object. This should cause an exception.
-     *
-     * @throws org.apache.commons.lang3.concurrent.ConcurrentException so we don't have to catch it
-     */
-    @Test(expected = NoSuchElementException.class)
-    public void testResultIsExceptionUnknown() throws ConcurrentException {
-        final MultiBackgroundInitializer.MultiBackgroundInitializerResults res = checkInitialize();
-        res.isException("unknown");
-    }
-
-    /**
-     * Tests that the set with the names of the initializers cannot be modified.
-     *
-     * @throws org.apache.commons.lang3.concurrent.ConcurrentException so we don't have to catch it
-     */
-    @Test(expected = UnsupportedOperationException.class)
-    public void testResultInitializerNamesModify() throws ConcurrentException {
-        checkInitialize();
-        final MultiBackgroundInitializer.MultiBackgroundInitializerResults res = initializer
-                .get();
-        final Iterator<String> it = res.initializerNames().iterator();
-        it.next();
-        it.remove();
-    }
-
-    /**
-     * Tests the behavior of the initializer if one of the child initializers
-     * throws a runtime exception.
-     */
-    @Test
-    public void testInitializeRuntimeEx() {
-        final ChildBackgroundInitializer child = new ChildBackgroundInitializer();
-        child.ex = new RuntimeException();
-        initializer.addInitializer(CHILD_INIT, child);
-        initializer.start();
-        try {
-            initializer.get();
-            fail("Runtime exception not thrown!");
-        } catch (final Exception ex) {
-            assertEquals("Wrong exception", child.ex, ex);
-        }
-    }
-
-    /**
-     * Tests the behavior of the initializer if one of the child initializers
-     * throws a checked exception.
-     *
-     * @throws org.apache.commons.lang3.concurrent.ConcurrentException so we don't have to catch it
-     */
-    @Test
-    public void testInitializeEx() throws ConcurrentException {
-        final ChildBackgroundInitializer child = new ChildBackgroundInitializer();
-        child.ex = new Exception();
-        initializer.addInitializer(CHILD_INIT, child);
-        initializer.start();
-        final MultiBackgroundInitializer.MultiBackgroundInitializerResults res = initializer
-                .get();
-        assertTrue("No exception flag", res.isException(CHILD_INIT));
-        assertNull("Got a results object", res.getResultObject(CHILD_INIT));
-        final ConcurrentException cex = res.getException(CHILD_INIT);
-        assertEquals("Wrong cause", child.ex, cex.getCause());
-    }
-
-    /**
-     * Tests the isSuccessful() method of the result object if no child
-     * initializer has thrown an exception.
-     *
-     * @throws org.apache.commons.lang3.concurrent.ConcurrentException so we don't have to catch it
-     */
-    @Test
-    public void testInitializeResultsIsSuccessfulTrue()
-            throws ConcurrentException {
-        final ChildBackgroundInitializer child = new ChildBackgroundInitializer();
-        initializer.addInitializer(CHILD_INIT, child);
-        initializer.start();
-        final MultiBackgroundInitializer.MultiBackgroundInitializerResults res = initializer
-                .get();
-        assertTrue("Wrong success flag", res.isSuccessful());
-    }
-
-    /**
-     * Tests the isSuccessful() method of the result object if at least one
-     * child initializer has thrown an exception.
-     *
-     * @throws org.apache.commons.lang3.concurrent.ConcurrentException so we don't have to catch it
-     */
-    @Test
-    public void testInitializeResultsIsSuccessfulFalse()
-            throws ConcurrentException {
-        final ChildBackgroundInitializer child = new ChildBackgroundInitializer();
-        child.ex = new Exception();
-        initializer.addInitializer(CHILD_INIT, child);
-        initializer.start();
-        final MultiBackgroundInitializer.MultiBackgroundInitializerResults res = initializer
-                .get();
-        assertFalse("Wrong success flag", res.isSuccessful());
-    }
-
-    /**
-     * Tests whether MultiBackgroundInitializers can be combined in a nested
-     * way.
-     *
-     * @throws org.apache.commons.lang3.concurrent.ConcurrentException so we don't have to catch it
-     */
-    @Test
-    public void testInitializeNested() throws ConcurrentException {
-        final String nameMulti = "multiChildInitializer";
-        initializer
-                .addInitializer(CHILD_INIT, new ChildBackgroundInitializer());
-        final MultiBackgroundInitializer mi2 = new MultiBackgroundInitializer();
-        final int count = 3;
-        for (int i = 0; i < count; i++) {
-            mi2
-                    .addInitializer(CHILD_INIT + i,
-                            new ChildBackgroundInitializer());
-        }
-        initializer.addInitializer(nameMulti, mi2);
-        initializer.start();
-        final MultiBackgroundInitializer.MultiBackgroundInitializerResults res = initializer
-                .get();
-        final ExecutorService exec = initializer.getActiveExecutor();
-        checkChild(res.getInitializer(CHILD_INIT), exec);
-        final MultiBackgroundInitializer.MultiBackgroundInitializerResults res2 = (MultiBackgroundInitializer.MultiBackgroundInitializerResults) res
-                .getResultObject(nameMulti);
-        assertEquals("Wrong number of initializers", count, res2
-                .initializerNames().size());
-        for (int i = 0; i < count; i++) {
-            checkChild(res2.getInitializer(CHILD_INIT + i), exec);
-        }
-        assertTrue("Executor not shutdown", exec.isShutdown());
-    }
-
-    /**
-     * A concrete implementation of {@code BackgroundInitializer} used for
-     * defining background tasks for {@code MultiBackgroundInitializer}.
-     */
-    private static class ChildBackgroundInitializer extends
-            BackgroundInitializer<Integer> {
-        /** Stores the current executor service. */
-        volatile ExecutorService currentExecutor;
-
-        /** A counter for the invocations of initialize(). */
-        volatile int initializeCalls;
-
-        /** An exception to be thrown by initialize(). */
-        Exception ex;
-
-        /**
-         * Records this invocation. Optionally throws an exception.
-         */
-        @Override
-        protected Integer initialize() throws Exception {
-            currentExecutor = getActiveExecutor();
-            initializeCalls++;
-
-            if (ex != null) {
-                throw ex;
-            }
-
-            return Integer.valueOf(initializeCalls);
-        }
-    }
-}
diff --git a/lang/src/test/java/org/apache/commons/lang3/concurrent/TimedSemaphoreTest.java b/lang/src/test/java/org/apache/commons/lang3/concurrent/TimedSemaphoreTest.java
deleted file mode 100644
index 745c712..0000000
--- a/lang/src/test/java/org/apache/commons/lang3/concurrent/TimedSemaphoreTest.java
+++ /dev/null
@@ -1,500 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.commons.lang3.concurrent;
-
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertFalse;
-import static org.junit.Assert.assertNotNull;
-import static org.junit.Assert.assertTrue;
-import static org.junit.Assert.fail;
-
-import java.util.concurrent.CountDownLatch;
-import java.util.concurrent.ScheduledExecutorService;
-import java.util.concurrent.ScheduledFuture;
-import java.util.concurrent.ScheduledThreadPoolExecutor;
-import java.util.concurrent.TimeUnit;
-
-import org.easymock.EasyMock;
-import org.junit.Test;
-
-/**
- * Test class for TimedSemaphore.
- *
- * @version $Id$
- */
-public class TimedSemaphoreTest {
-    /** Constant for the time period. */
-    private static final long PERIOD = 500;
-
-    /** Constant for the time unit. */
-    private static final TimeUnit UNIT = TimeUnit.MILLISECONDS;
-
-    /** Constant for the default limit. */
-    private static final int LIMIT = 10;
-
-    /**
-     * Tests creating a new instance.
-     */
-    @Test
-    public void testInit() {
-        final ScheduledExecutorService service = EasyMock
-                .createMock(ScheduledExecutorService.class);
-        EasyMock.replay(service);
-        final TimedSemaphore semaphore = new TimedSemaphore(service, PERIOD, UNIT,
-                LIMIT);
-        EasyMock.verify(service);
-        assertEquals("Wrong service", service, semaphore.getExecutorService());
-        assertEquals("Wrong period", PERIOD, semaphore.getPeriod());
-        assertEquals("Wrong unit", UNIT, semaphore.getUnit());
-        assertEquals("Statistic available", 0, semaphore
-                .getLastAcquiresPerPeriod());
-        assertEquals("Average available", 0.0, semaphore
-                .getAverageCallsPerPeriod(), .05);
-        assertFalse("Already shutdown", semaphore.isShutdown());
-        assertEquals("Wrong limit", LIMIT, semaphore.getLimit());
-    }
-
-    /**
-     * Tries to create an instance with a negative period. This should cause an
-     * exception.
-     */
-    @Test(expected = IllegalArgumentException.class)
-    public void testInitInvalidPeriod() {
-        new TimedSemaphore(0L, UNIT, LIMIT);
-    }
-
-    /**
-     * Tests whether a default executor service is created if no service is
-     * provided.
-     */
-    @Test
-    public void testInitDefaultService() {
-        final TimedSemaphore semaphore = new TimedSemaphore(PERIOD, UNIT, LIMIT);
-        final ScheduledThreadPoolExecutor exec = (ScheduledThreadPoolExecutor) semaphore
-                .getExecutorService();
-        assertFalse("Wrong periodic task policy", exec
-                .getContinueExistingPeriodicTasksAfterShutdownPolicy());
-        assertFalse("Wrong delayed task policy", exec
-                .getExecuteExistingDelayedTasksAfterShutdownPolicy());
-        assertFalse("Already shutdown", exec.isShutdown());
-        semaphore.shutdown();
-    }
-
-    /**
-     * Tests starting the timer.
-     *
-     * @throws java.lang.InterruptedException so we don't have to catch it
-     */
-    @Test
-    public void testStartTimer() throws InterruptedException {
-        final TimedSemaphoreTestImpl semaphore = new TimedSemaphoreTestImpl(PERIOD,
-                UNIT, LIMIT);
-        final ScheduledFuture<?> future = semaphore.startTimer();
-        assertNotNull("No future returned", future);
-        Thread.sleep(PERIOD);
-        final int trials = 10;
-        int count = 0;
-        do {
-            Thread.sleep(PERIOD);
-            if (count++ > trials) {
-                fail("endOfPeriod() not called!");
-            }
-        } while (semaphore.getPeriodEnds() <= 0);
-        semaphore.shutdown();
-    }
-
-    /**
-     * Tests the shutdown() method if the executor belongs to the semaphore. In
-     * this case it has to be shut down.
-     */
-    @Test
-    public void testShutdownOwnExecutor() {
-        final TimedSemaphore semaphore = new TimedSemaphore(PERIOD, UNIT, LIMIT);
-        semaphore.shutdown();
-        assertTrue("Not shutdown", semaphore.isShutdown());
-        assertTrue("Executor not shutdown", semaphore.getExecutorService()
-                .isShutdown());
-    }
-
-    /**
-     * Tests the shutdown() method for a shared executor service before a task
-     * was started. This should do pretty much nothing.
-     */
-    @Test
-    public void testShutdownSharedExecutorNoTask() {
-        final ScheduledExecutorService service = EasyMock
-                .createMock(ScheduledExecutorService.class);
-        EasyMock.replay(service);
-        final TimedSemaphore semaphore = new TimedSemaphore(service, PERIOD, UNIT,
-                LIMIT);
-        semaphore.shutdown();
-        assertTrue("Not shutdown", semaphore.isShutdown());
-        EasyMock.verify(service);
-    }
-
-    /**
-     * Prepares an executor service mock to expect the start of the timer.
-     *
-     * @param service the mock
-     * @param future the future
-     */
-    private void prepareStartTimer(final ScheduledExecutorService service,
-            final ScheduledFuture<?> future) {
-        service.scheduleAtFixedRate((Runnable) EasyMock.anyObject(), EasyMock
-                .eq(PERIOD), EasyMock.eq(PERIOD), EasyMock.eq(UNIT));
-        EasyMock.expectLastCall().andReturn(future);
-    }
-
-    /**
-     * Tests the shutdown() method for a shared executor after the task was
-     * started. In this case the task must be canceled.
-     *
-     * @throws java.lang.InterruptedException so we don't have to catch it
-     */
-    @Test
-    public void testShutdownSharedExecutorTask() throws InterruptedException {
-        final ScheduledExecutorService service = EasyMock
-                .createMock(ScheduledExecutorService.class);
-        final ScheduledFuture<?> future = EasyMock.createMock(ScheduledFuture.class);
-        prepareStartTimer(service, future);
-        EasyMock.expect(Boolean.valueOf(future.cancel(false))).andReturn(Boolean.TRUE);
-        EasyMock.replay(service, future);
-        final TimedSemaphoreTestImpl semaphore = new TimedSemaphoreTestImpl(service,
-                PERIOD, UNIT, LIMIT);
-        semaphore.acquire();
-        semaphore.shutdown();
-        assertTrue("Not shutdown", semaphore.isShutdown());
-        EasyMock.verify(service, future);
-    }
-
-    /**
-     * Tests multiple invocations of the shutdown() method.
-     *
-     * @throws java.lang.InterruptedException so we don't have to catch it
-     */
-    @Test
-    public void testShutdownMultipleTimes() throws InterruptedException {
-        final ScheduledExecutorService service = EasyMock
-                .createMock(ScheduledExecutorService.class);
-        final ScheduledFuture<?> future = EasyMock.createMock(ScheduledFuture.class);
-        prepareStartTimer(service, future);
-        EasyMock.expect(Boolean.valueOf(future.cancel(false))).andReturn(Boolean.TRUE);
-        EasyMock.replay(service, future);
-        final TimedSemaphoreTestImpl semaphore = new TimedSemaphoreTestImpl(service,
-                PERIOD, UNIT, LIMIT);
-        semaphore.acquire();
-        for (int i = 0; i < 10; i++) {
-            semaphore.shutdown();
-        }
-        EasyMock.verify(service, future);
-    }
-
-    /**
-     * Tests the acquire() method if a limit is set.
-     *
-     * @throws java.lang.InterruptedException so we don't have to catch it
-     */
-    @Test
-    public void testAcquireLimit() throws InterruptedException {
-        final ScheduledExecutorService service = EasyMock
-                .createMock(ScheduledExecutorService.class);
-        final ScheduledFuture<?> future = EasyMock.createMock(ScheduledFuture.class);
-        prepareStartTimer(service, future);
-        EasyMock.replay(service, future);
-        final int count = 10;
-        final CountDownLatch latch = new CountDownLatch(count - 1);
-        final TimedSemaphore semaphore = new TimedSemaphore(service, PERIOD, UNIT, 1);
-        final SemaphoreThread t = new SemaphoreThread(semaphore, latch, count,
-                count - 1);
-        semaphore.setLimit(count - 1);
-
-        // start a thread that calls the semaphore count times
-        t.start();
-        latch.await();
-        // now the semaphore's limit should be reached and the thread blocked
-        assertEquals("Wrong semaphore count", count - 1, semaphore
-                .getAcquireCount());
-
-        // this wakes up the thread, it should call the semaphore once more
-        semaphore.endOfPeriod();
-        t.join();
-        assertEquals("Wrong semaphore count (2)", 1, semaphore
-                .getAcquireCount());
-        assertEquals("Wrong acquire() count", count - 1, semaphore
-                .getLastAcquiresPerPeriod());
-        EasyMock.verify(service, future);
-    }
-
-    /**
-     * Tests the acquire() method if more threads are involved than the limit.
-     * This method starts a number of threads that all invoke the semaphore. The
-     * semaphore's limit is set to 1, so in each period only a single thread can
-     * acquire the semaphore.
-     *
-     * @throws java.lang.InterruptedException so we don't have to catch it
-     */
-    @Test
-    public void testAcquireMultipleThreads() throws InterruptedException {
-        final ScheduledExecutorService service = EasyMock
-                .createMock(ScheduledExecutorService.class);
-        final ScheduledFuture<?> future = EasyMock.createMock(ScheduledFuture.class);
-        prepareStartTimer(service, future);
-        EasyMock.replay(service, future);
-        final TimedSemaphoreTestImpl semaphore = new TimedSemaphoreTestImpl(service,
-                PERIOD, UNIT, 1);
-        semaphore.latch = new CountDownLatch(1);
-        final int count = 10;
-        final SemaphoreThread[] threads = new SemaphoreThread[count];
-        for (int i = 0; i < count; i++) {
-            threads[i] = new SemaphoreThread(semaphore, null, 1, 0);
-            threads[i].start();
-        }
-        for (int i = 0; i < count; i++) {
-            semaphore.latch.await();
-            assertEquals("Wrong count", 1, semaphore.getAcquireCount());
-            semaphore.latch = new CountDownLatch(1);
-            semaphore.endOfPeriod();
-            assertEquals("Wrong acquire count", 1, semaphore
-                    .getLastAcquiresPerPeriod());
-        }
-        for (int i = 0; i < count; i++) {
-            threads[i].join();
-        }
-        EasyMock.verify(service, future);
-    }
-
-    /**
-     * Tests the acquire() method if no limit is set. A test thread is started
-     * that calls the semaphore a large number of times. Even if the semaphore's
-     * period does not end, the thread should never block.
-     *
-     * @throws java.lang.InterruptedException so we don't have to catch it
-     */
-    @Test
-    public void testAcquireNoLimit() throws InterruptedException {
-        final ScheduledExecutorService service = EasyMock
-                .createMock(ScheduledExecutorService.class);
-        final ScheduledFuture<?> future = EasyMock.createMock(ScheduledFuture.class);
-        prepareStartTimer(service, future);
-        EasyMock.replay(service, future);
-        final TimedSemaphoreTestImpl semaphore = new TimedSemaphoreTestImpl(service,
-                PERIOD, UNIT, TimedSemaphore.NO_LIMIT);
-        final int count = 1000;
-        final CountDownLatch latch = new CountDownLatch(count);
-        final SemaphoreThread t = new SemaphoreThread(semaphore, latch, count, count);
-        t.start();
-        latch.await();
-        EasyMock.verify(service, future);
-    }
-
-    /**
-     * Tries to call acquire() after shutdown(). This should cause an exception.
-     *
-     * @throws java.lang.InterruptedException so we don't have to catch it
-     */
-    @Test(expected = IllegalStateException.class)
-    public void testPassAfterShutdown() throws InterruptedException {
-        final TimedSemaphore semaphore = new TimedSemaphore(PERIOD, UNIT, LIMIT);
-        semaphore.shutdown();
-        semaphore.acquire();
-    }
-
-    /**
-     * Tests a bigger number of invocations that span multiple periods. The
-     * period is set to a very short time. A background thread calls the
-     * semaphore a large number of times. While it runs at last one end of a
-     * period should be reached.
-     *
-     * @throws java.lang.InterruptedException so we don't have to catch it
-     */
-    @Test
-    public void testAcquireMultiplePeriods() throws InterruptedException {
-        final int count = 1000;
-        final TimedSemaphoreTestImpl semaphore = new TimedSemaphoreTestImpl(
-                PERIOD / 10, TimeUnit.MILLISECONDS, 1);
-        semaphore.setLimit(count / 4);
-        final CountDownLatch latch = new CountDownLatch(count);
-        final SemaphoreThread t = new SemaphoreThread(semaphore, latch, count, count);
-        t.start();
-        latch.await();
-        semaphore.shutdown();
-        assertTrue("End of period not reached", semaphore.getPeriodEnds() > 0);
-    }
-
-    /**
-     * Tests the methods for statistics.
-     *
-     * @throws java.lang.InterruptedException so we don't have to catch it
-     */
-    @Test
-    public void testGetAverageCallsPerPeriod() throws InterruptedException {
-        final ScheduledExecutorService service = EasyMock
-                .createMock(ScheduledExecutorService.class);
-        final ScheduledFuture<?> future = EasyMock.createMock(ScheduledFuture.class);
-        prepareStartTimer(service, future);
-        EasyMock.replay(service, future);
-        final TimedSemaphore semaphore = new TimedSemaphore(service, PERIOD, UNIT,
-                LIMIT);
-        semaphore.acquire();
-        semaphore.endOfPeriod();
-        assertEquals("Wrong average (1)", 1.0, semaphore
-                .getAverageCallsPerPeriod(), .005);
-        semaphore.acquire();
-        semaphore.acquire();
-        semaphore.endOfPeriod();
-        assertEquals("Wrong average (2)", 1.5, semaphore
-                .getAverageCallsPerPeriod(), .005);
-        EasyMock.verify(service, future);
-    }
-
-    /**
-     * Tests whether the available non-blocking calls can be queried.
-     *
-     * @throws java.lang.InterruptedException so we don't have to catch it
-     */
-    @Test
-    public void testGetAvailablePermits() throws InterruptedException {
-        final ScheduledExecutorService service = EasyMock
-                .createMock(ScheduledExecutorService.class);
-        final ScheduledFuture<?> future = EasyMock.createMock(ScheduledFuture.class);
-        prepareStartTimer(service, future);
-        EasyMock.replay(service, future);
-        final TimedSemaphore semaphore = new TimedSemaphore(service, PERIOD, UNIT,
-                LIMIT);
-        for (int i = 0; i < LIMIT; i++) {
-            assertEquals("Wrong available count at " + i, LIMIT - i, semaphore
-                    .getAvailablePermits());
-            semaphore.acquire();
-        }
-        semaphore.endOfPeriod();
-        assertEquals("Wrong available count in new period", LIMIT, semaphore
-                .getAvailablePermits());
-        EasyMock.verify(service, future);
-    }
-
-    /**
-     * A specialized implementation of {@code TimedSemaphore} that is easier to
-     * test.
-     */
-    private static class TimedSemaphoreTestImpl extends TimedSemaphore {
-        /** A mock scheduled future. */
-        ScheduledFuture<?> schedFuture;
-
-        /** A latch for synchronizing with the main thread. */
-        volatile CountDownLatch latch;
-
-        /** Counter for the endOfPeriod() invocations. */
-        private int periodEnds;
-
-        public TimedSemaphoreTestImpl(final long timePeriod, final TimeUnit timeUnit,
-                final int limit) {
-            super(timePeriod, timeUnit, limit);
-        }
-
-        public TimedSemaphoreTestImpl(final ScheduledExecutorService service,
-                final long timePeriod, final TimeUnit timeUnit, final int limit) {
-            super(service, timePeriod, timeUnit, limit);
-        }
-
-        /**
-         * Returns the number of invocations of the endOfPeriod() method.
-         *
-         * @return the endOfPeriod() invocations
-         */
-        public int getPeriodEnds() {
-            synchronized (this) {
-                return periodEnds;
-            }
-        }
-
-        /**
-         * Invokes the latch if one is set.
-         *
-         * @throws java.lang.InterruptedException because it is declared that way in TimedSemaphore
-         */
-        @Override
-        public synchronized void acquire() throws InterruptedException {
-            super.acquire();
-            if (latch != null) {
-                latch.countDown();
-            }
-        }
-
-        /**
-         * Counts the number of invocations.
-         */
-        @Override
-        protected synchronized void endOfPeriod() {
-            super.endOfPeriod();
-            periodEnds++;
-        }
-
-        /**
-         * Either returns the mock future or calls the super method.
-         */
-        @Override
-        protected ScheduledFuture<?> startTimer() {
-            return schedFuture != null ? schedFuture : super.startTimer();
-        }
-    }
-
-    /**
-     * A test thread class that will be used by tests for triggering the
-     * semaphore. The thread calls the semaphore a configurable number of times.
-     * When this is done, it can notify the main thread.
-     */
-    private static class SemaphoreThread extends Thread {
-        /** The semaphore. */
-        private final TimedSemaphore semaphore;
-
-        /** A latch for communication with the main thread. */
-        private final CountDownLatch latch;
-
-        /** The number of acquire() calls. */
-        private final int count;
-
-        /** The number of invocations of the latch. */
-        private final int latchCount;
-
-        public SemaphoreThread(final TimedSemaphore b, final CountDownLatch l, final int c, final int lc) {
-            semaphore = b;
-            latch = l;
-            count = c;
-            latchCount = lc;
-        }
-
-        /**
-         * Calls acquire() on the semaphore for the specified number of times.
-         * Optionally the latch will also be triggered to synchronize with the
-         * main test thread.
-         */
-        @Override
-        public void run() {
-            try {
-                for (int i = 0; i < count; i++) {
-                    semaphore.acquire();
-
-                    if (i < latchCount) {
-                        latch.countDown();
-                    }
-                }
-            } catch (final InterruptedException iex) {
-                Thread.currentThread().interrupt();
-            }
-        }
-    }
-}
diff --git a/lang/src/test/java/org/apache/commons/lang3/event/EventListenerSupportTest.java b/lang/src/test/java/org/apache/commons/lang3/event/EventListenerSupportTest.java
deleted file mode 100644
index 8923b4e..0000000
--- a/lang/src/test/java/org/apache/commons/lang3/event/EventListenerSupportTest.java
+++ /dev/null
@@ -1,225 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package org.apache.commons.lang3.event;
-
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertSame;
-
-import java.beans.PropertyChangeEvent;
-import java.beans.PropertyVetoException;
-import java.beans.VetoableChangeListener;
-import java.io.ByteArrayInputStream;
-import java.io.ByteArrayOutputStream;
-import java.io.IOException;
-import java.io.ObjectInputStream;
-import java.io.ObjectOutputStream;
-import java.lang.reflect.Method;
-import java.util.ArrayList;
-import java.util.Date;
-import java.util.List;
-
-import org.easymock.EasyMock;
-import org.junit.Test;
-
-/**
- * @since 3.0
- * @version $Id$
- */
-public class EventListenerSupportTest 
-{
-    @Test(expected=NullPointerException.class)
-    public void testAddNullListener()
-    {
-        final EventListenerSupport<VetoableChangeListener> listenerSupport = EventListenerSupport.create(VetoableChangeListener.class);
-        listenerSupport.addListener(null);
-    }
-
-    @Test(expected=NullPointerException.class)
-    public void testRemoveNullListener()
-    {
-        final EventListenerSupport<VetoableChangeListener> listenerSupport = EventListenerSupport.create(VetoableChangeListener.class);
-        listenerSupport.removeListener(null);
-    }
-
-    @Test
-    public void testEventDispatchOrder() throws PropertyVetoException
-    {
-        final EventListenerSupport<VetoableChangeListener> listenerSupport = EventListenerSupport.create(VetoableChangeListener.class);
-        final List<VetoableChangeListener> calledListeners = new ArrayList<VetoableChangeListener>();
-
-        final VetoableChangeListener listener1 = createListener(calledListeners);
-        final VetoableChangeListener listener2 = createListener(calledListeners);
-        listenerSupport.addListener(listener1);
-        listenerSupport.addListener(listener2);
-        listenerSupport.fire().vetoableChange(new PropertyChangeEvent(new Date(), "Day", 4, 5));
-        assertEquals(calledListeners.size(), 2);
-        assertSame(calledListeners.get(0), listener1);
-        assertSame(calledListeners.get(1), listener2);
-    }
-
-    @Test(expected=IllegalArgumentException.class)
-    public void testCreateWithNonInterfaceParameter()
-    {
-        EventListenerSupport.create(String.class);
-    }
-
-    @Test(expected=NullPointerException.class)
-    public void testCreateWithNullParameter()
-    {
-        EventListenerSupport.create(null);
-    }
-
-    @Test
-    public void testRemoveListenerDuringEvent() throws PropertyVetoException
-    {
-        final EventListenerSupport<VetoableChangeListener> listenerSupport = EventListenerSupport.create(VetoableChangeListener.class);
-        for (int i = 0; i < 10; ++i)
-        {
-            addDeregisterListener(listenerSupport);
-        }
-        assertEquals(listenerSupport.getListenerCount(), 10);
-        listenerSupport.fire().vetoableChange(new PropertyChangeEvent(new Date(), "Day", 4, 5));
-        assertEquals(listenerSupport.getListenerCount(), 0);
-    }
-
-    @Test
-    public void testGetListeners() {
-        final EventListenerSupport<VetoableChangeListener> listenerSupport = EventListenerSupport.create(VetoableChangeListener.class);
-
-        final VetoableChangeListener[] listeners = listenerSupport.getListeners();
-        assertEquals(0, listeners.length);
-        assertEquals(VetoableChangeListener.class, listeners.getClass().getComponentType());
-        final VetoableChangeListener[] empty = listeners;
-        //for fun, show that the same empty instance is used 
-        assertSame(empty, listenerSupport.getListeners());
-
-        final VetoableChangeListener listener1 = EasyMock.createNiceMock(VetoableChangeListener.class);
-        listenerSupport.addListener(listener1);
-        assertEquals(1, listenerSupport.getListeners().length);
-        final VetoableChangeListener listener2 = EasyMock.createNiceMock(VetoableChangeListener.class);
-        listenerSupport.addListener(listener2);
-        assertEquals(2, listenerSupport.getListeners().length);
-        listenerSupport.removeListener(listener1);
-        assertEquals(1, listenerSupport.getListeners().length);
-        listenerSupport.removeListener(listener2);
-        assertSame(empty, listenerSupport.getListeners());
-    }
-
-    @Test
-    public void testSerialization() throws IOException, ClassNotFoundException, PropertyVetoException {
-        final EventListenerSupport<VetoableChangeListener> listenerSupport = EventListenerSupport.create(VetoableChangeListener.class);
-        listenerSupport.addListener(new VetoableChangeListener() {
-            
-            @Override
-            public void vetoableChange(final PropertyChangeEvent e) {
-            }
-        });
-        listenerSupport.addListener(EasyMock.createNiceMock(VetoableChangeListener.class));
-
-        //serialize:
-        final ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
-        final ObjectOutputStream objectOutputStream = new ObjectOutputStream(outputStream);
-
-        objectOutputStream.writeObject(listenerSupport);
-        objectOutputStream.close();
-
-        //deserialize:
-        @SuppressWarnings("unchecked")
-        final
-        EventListenerSupport<VetoableChangeListener> deserializedListenerSupport = (EventListenerSupport<VetoableChangeListener>) new ObjectInputStream(
-                new ByteArrayInputStream(outputStream.toByteArray())).readObject();
-
-        //make sure we get a listener array back, of the correct component type, and that it contains only the serializable mock
-        final VetoableChangeListener[] listeners = deserializedListenerSupport.getListeners();
-        assertEquals(VetoableChangeListener.class, listeners.getClass().getComponentType());
-        assertEquals(1, listeners.length);
-
-        //now verify that the mock still receives events; we can infer that the proxy was correctly reconstituted
-        final VetoableChangeListener listener = listeners[0];
-        final PropertyChangeEvent evt = new PropertyChangeEvent(new Date(), "Day", 7, 9);
-        listener.vetoableChange(evt);
-        EasyMock.replay(listener);
-        deserializedListenerSupport.fire().vetoableChange(evt);
-        EasyMock.verify(listener);
-
-        //remove listener and verify we get an empty array of listeners
-        deserializedListenerSupport.removeListener(listener);
-        assertEquals(0, deserializedListenerSupport.getListeners().length);
-    }
-
-    @Test
-    public void testSubclassInvocationHandling() throws PropertyVetoException {
-
-        final
-        EventListenerSupport<VetoableChangeListener> eventListenerSupport = new EventListenerSupport<VetoableChangeListener>(
-                VetoableChangeListener.class) {
-            private static final long serialVersionUID = 1L;
-
-            @Override
-            protected java.lang.reflect.InvocationHandler createInvocationHandler() {
-                return new ProxyInvocationHandler() {
-                    /**
-                     * {@inheritDoc}
-                     */
-                    @Override
-                    public Object invoke(final Object proxy, final Method method, final Object[] args)
-                            throws Throwable {
-                        return "vetoableChange".equals(method.getName())
-                                && "Hour".equals(((PropertyChangeEvent) args[0]).getPropertyName()) ? null
-                                : super.invoke(proxy, method, args);
-                    }
-                };
-            }
-        };
-
-        final VetoableChangeListener listener = EasyMock.createNiceMock(VetoableChangeListener.class);
-        eventListenerSupport.addListener(listener);
-        final Object source = new Date();
-        final PropertyChangeEvent ignore = new PropertyChangeEvent(source, "Hour", 5, 6);
-        final PropertyChangeEvent respond = new PropertyChangeEvent(source, "Day", 6, 7);
-        listener.vetoableChange(respond);
-        EasyMock.replay(listener);
-        eventListenerSupport.fire().vetoableChange(ignore);
-        eventListenerSupport.fire().vetoableChange(respond);
-        EasyMock.verify(listener);
-    }
-
-    private void addDeregisterListener(final EventListenerSupport<VetoableChangeListener> listenerSupport)
-    {
-        listenerSupport.addListener(new VetoableChangeListener()
-        {
-            @Override
-            public void vetoableChange(final PropertyChangeEvent e)
-            {
-                listenerSupport.removeListener(this);
-            }
-        });
-    }
-
-    private VetoableChangeListener createListener(final List<VetoableChangeListener> calledListeners)
-    {
-        return new VetoableChangeListener()
-        {
-            @Override
-            public void vetoableChange(final PropertyChangeEvent e)
-            {
-                calledListeners.add(this);
-            }
-        };
-    }
-}
diff --git a/lang/src/test/java/org/apache/commons/lang3/event/EventUtilsTest.java b/lang/src/test/java/org/apache/commons/lang3/event/EventUtilsTest.java
deleted file mode 100644
index 2178ea4..0000000
--- a/lang/src/test/java/org/apache/commons/lang3/event/EventUtilsTest.java
+++ /dev/null
@@ -1,281 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.commons.lang3.event;
-
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertFalse;
-import static org.junit.Assert.assertNotNull;
-import static org.junit.Assert.assertTrue;
-import static org.junit.Assert.fail;
-
-import java.beans.PropertyChangeEvent;
-import java.beans.PropertyChangeListener;
-import java.beans.VetoableChangeListener;
-import java.lang.reflect.Constructor;
-import java.lang.reflect.InvocationHandler;
-import java.lang.reflect.Method;
-import java.lang.reflect.Modifier;
-import java.lang.reflect.Proxy;
-import java.util.Date;
-import java.util.Map;
-import java.util.TreeMap;
-
-import javax.naming.event.ObjectChangeListener;
-
-import org.junit.Test;
-
-/**
- * @since 3.0
- * @version $Id$
- */
-public class EventUtilsTest 
-{
-
-    @Test
-    public void testConstructor() {
-        assertNotNull(new EventUtils());
-        final Constructor<?>[] cons = EventUtils.class.getDeclaredConstructors();
-        assertEquals(1, cons.length);
-        assertTrue(Modifier.isPublic(cons[0].getModifiers()));
-        assertTrue(Modifier.isPublic(EventUtils.class.getModifiers()));
-        assertFalse(Modifier.isFinal(EventUtils.class.getModifiers()));
-    }
-    
-    @Test
-    public void testAddEventListener()
-    {
-        final PropertyChangeSource src = new PropertyChangeSource();
-        final EventCountingInvociationHandler handler = new EventCountingInvociationHandler();
-        final PropertyChangeListener listener = handler.createListener(PropertyChangeListener.class);
-        assertEquals(0, handler.getEventCount("propertyChange"));
-        EventUtils.addEventListener(src, PropertyChangeListener.class, listener);
-        assertEquals(0, handler.getEventCount("propertyChange"));
-        src.setProperty("newValue");
-        assertEquals(1, handler.getEventCount("propertyChange"));
-    }
-
-    @Test
-    public void testAddEventListenerWithNoAddMethod()
-    {
-        final PropertyChangeSource src = new PropertyChangeSource();
-        final EventCountingInvociationHandler handler = new EventCountingInvociationHandler();
-        final ObjectChangeListener listener = handler.createListener(ObjectChangeListener.class);
-        try
-        {
-            EventUtils.addEventListener(src, ObjectChangeListener.class, listener);
-            fail("Should not be allowed to add a listener to an object that doesn't support it.");
-        }
-        catch (final IllegalArgumentException e)
-        {
-            assertEquals("Class " + src.getClass().getName() + " does not have a public add" + ObjectChangeListener.class.getSimpleName() + " method which takes a parameter of type " + ObjectChangeListener.class.getName() + ".", e.getMessage());
-        }
-    }
-
-    @Test
-    public void testAddEventListenerThrowsException()
-    {
-        final ExceptionEventSource src = new ExceptionEventSource();
-        try
-        {
-            EventUtils.addEventListener(src, PropertyChangeListener.class, new PropertyChangeListener()
-            {
-                @Override
-                public void propertyChange(final PropertyChangeEvent e)
-                {
-                    // Do nothing!
-                }
-            });
-            fail("Add method should have thrown an exception, so method should fail.");
-        }
-        catch (final RuntimeException e)
-        {
-
-        }
-    }
-
-    @Test
-    public void testAddEventListenerWithPrivateAddMethod()
-    {
-        final PropertyChangeSource src = new PropertyChangeSource();
-        final EventCountingInvociationHandler handler = new EventCountingInvociationHandler();
-        final VetoableChangeListener listener = handler.createListener(VetoableChangeListener.class);
-        try
-        {
-            EventUtils.addEventListener(src, VetoableChangeListener.class, listener);
-            fail("Should not be allowed to add a listener to an object that doesn't support it.");
-        }
-        catch (final IllegalArgumentException e)
-        {
-            assertEquals("Class " + src.getClass().getName() + " does not have a public add" + VetoableChangeListener.class.getSimpleName() + " method which takes a parameter of type " + VetoableChangeListener.class.getName() + ".", e.getMessage());
-        }
-    }
-
-    @Test
-    public void testBindEventsToMethod()
-    {
-        final PropertyChangeSource src = new PropertyChangeSource();
-        final EventCounter counter = new EventCounter();
-        EventUtils.bindEventsToMethod(counter, "eventOccurred", src, PropertyChangeListener.class);
-        assertEquals(0, counter.getCount());
-        src.setProperty("newValue");
-        assertEquals(1, counter.getCount());
-    }
-
-
-    @Test
-    public void testBindEventsToMethodWithEvent()
-    {
-        final PropertyChangeSource src = new PropertyChangeSource();
-        final EventCounterWithEvent counter = new EventCounterWithEvent();
-        EventUtils.bindEventsToMethod(counter, "eventOccurred", src, PropertyChangeListener.class);
-        assertEquals(0, counter.getCount());
-        src.setProperty("newValue");
-        assertEquals(1, counter.getCount());
-    }
-
-
-    @Test
-    public void testBindFilteredEventsToMethod()
-    {
-        final MultipleEventSource src = new MultipleEventSource();
-        final EventCounter counter = new EventCounter();
-        EventUtils.bindEventsToMethod(counter, "eventOccurred", src, MultipleEventListener.class, "event1");
-        assertEquals(0, counter.getCount());
-        src.listeners.fire().event1(new PropertyChangeEvent(new Date(), "Day", Integer.valueOf(0), Integer.valueOf(1)));
-        assertEquals(1, counter.getCount());
-        src.listeners.fire().event2(new PropertyChangeEvent(new Date(), "Day", Integer.valueOf(1), Integer.valueOf(2)));
-        assertEquals(1, counter.getCount());
-    }
-
-    public static interface MultipleEventListener
-    {
-        public void event1(PropertyChangeEvent e);
-
-        public void event2(PropertyChangeEvent e);
-    }
-
-    public static class EventCounter
-    {
-        private int count;
-
-        public void eventOccurred()
-        {
-            count++;
-        }
-
-        public int getCount()
-        {
-            return count;
-        }
-    }
-
-    public static class EventCounterWithEvent
-    {
-        private int count;
-
-        public void eventOccurred(final PropertyChangeEvent e)
-        {
-            count++;
-        }
-
-        public int getCount()
-        {
-            return count;
-        }
-    }
-
-
-    private static class EventCountingInvociationHandler implements InvocationHandler
-    {
-        private final Map<String, Integer> eventCounts = new TreeMap<String, Integer>();
-
-        public <L> L createListener(final Class<L> listenerType)
-        {
-            return listenerType.cast(Proxy.newProxyInstance(Thread.currentThread().getContextClassLoader(),
-                    new Class[]{listenerType},
-                    this));
-        }
-
-        public int getEventCount(final String eventName)
-        {
-            final Integer count = eventCounts.get(eventName);
-            return count == null ? 0 : count.intValue();
-        }
-
-        @Override
-        public Object invoke(final Object proxy, final Method method, final Object[] args) throws Throwable
-        {
-            final Integer count = eventCounts.get(method.getName());
-            if (count == null)
-            {
-                eventCounts.put(method.getName(), Integer.valueOf(1));
-            }
-            else
-            {
-                eventCounts.put(method.getName(), Integer.valueOf(count.intValue() + 1));
-            }
-            return null;
-        }
-    }
-
-    public static class MultipleEventSource
-    {
-        private final EventListenerSupport<MultipleEventListener> listeners = EventListenerSupport.create(MultipleEventListener.class);
-
-        public void addMultipleEventListener(final MultipleEventListener listener)
-        {
-            listeners.addListener(listener);
-        }
-    }
-
-    public static class ExceptionEventSource
-    {
-        public void addPropertyChangeListener(final PropertyChangeListener listener)
-        {
-            throw new RuntimeException();
-        }
-    }
-
-    public static class PropertyChangeSource
-    {
-        private final EventListenerSupport<PropertyChangeListener> listeners = EventListenerSupport.create(PropertyChangeListener.class);
-
-        private String property;
-
-        public void setProperty(final String property)
-        {
-            final String oldValue = this.property;
-            this.property = property;
-            listeners.fire().propertyChange(new PropertyChangeEvent(this, "property", oldValue, property));
-        }
-
-        protected void addVetoableChangeListener(final VetoableChangeListener listener)
-        {
-            // Do nothing!
-        }
-
-        public void addPropertyChangeListener(final PropertyChangeListener listener)
-        {
-            listeners.addListener(listener);
-        }
-
-        public void removePropertyChangeListener(final PropertyChangeListener listener)
-        {
-            listeners.removeListener(listener);
-        }
-    }
-}
diff --git a/lang/src/test/java/org/apache/commons/lang3/exception/AbstractExceptionContextTest.java b/lang/src/test/java/org/apache/commons/lang3/exception/AbstractExceptionContextTest.java
deleted file mode 100644
index f92b13d..0000000
--- a/lang/src/test/java/org/apache/commons/lang3/exception/AbstractExceptionContextTest.java
+++ /dev/null
@@ -1,184 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- * 
- *      http://www.apache.org/licenses/LICENSE-2.0
- * 
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.commons.lang3.exception;
-
-import org.junit.Test;
-import org.junit.Before;
-import static org.junit.Assert.*;
-import java.io.Serializable;
-import java.util.Arrays;
-import java.util.Collections;
-import java.util.Date;
-import java.util.List;
-import java.util.Set;
-
-import org.apache.commons.lang3.SerializationUtils;
-import org.apache.commons.lang3.tuple.Pair;
-
-
-/**
- * Abstract test of an ExceptionContext implementation.
- */
-public abstract class AbstractExceptionContextTest<T extends ExceptionContext & Serializable> {
-
-    protected static final String TEST_MESSAGE_2 = "This is monotonous";
-    protected static final String TEST_MESSAGE = "Test Message";
-    protected T exceptionContext;
-
-    protected static class ObjectWithFaultyToString {
-        @Override
-        public String toString() {
-            throw new RuntimeException("Crap");
-        }
-    }
-
-
-    @Before
-    public void setUp() throws Exception {
-        exceptionContext
-            .addContextValue("test1", null)
-            .addContextValue("test2", "some value")
-            .addContextValue("test Date", new Date())
-            .addContextValue("test Nbr", Integer.valueOf(5))
-            .addContextValue("test Poorly written obj", new ObjectWithFaultyToString());
-    }
-
-    @Test
-    public void testAddContextValue() {
-        final String message = exceptionContext.getFormattedExceptionMessage(TEST_MESSAGE);
-        assertTrue(message.indexOf(TEST_MESSAGE) >= 0);
-        assertTrue(message.indexOf("test1") >= 0);
-        assertTrue(message.indexOf("test2") >= 0);
-        assertTrue(message.indexOf("test Date") >= 0);
-        assertTrue(message.indexOf("test Nbr") >= 0);
-        assertTrue(message.indexOf("some value") >= 0);
-        assertTrue(message.indexOf("5") >= 0);
-
-        assertTrue(exceptionContext.getFirstContextValue("test1") == null);
-        assertTrue(exceptionContext.getFirstContextValue("test2").equals("some value"));
-
-        assertEquals(5, exceptionContext.getContextLabels().size());
-        assertTrue(exceptionContext.getContextLabels().contains("test1"));
-        assertTrue(exceptionContext.getContextLabels().contains("test2"));
-        assertTrue(exceptionContext.getContextLabels().contains("test Date"));
-        assertTrue(exceptionContext.getContextLabels().contains("test Nbr"));
-
-        exceptionContext.addContextValue("test2", "different value");
-        assertEquals(5, exceptionContext.getContextLabels().size());
-        assertTrue(exceptionContext.getContextLabels().contains("test2"));
-
-        final String contextMessage = exceptionContext.getFormattedExceptionMessage(null);
-        assertTrue(contextMessage.indexOf(TEST_MESSAGE) == -1);
-    }
-
-    @Test
-    public void testSetContextValue() {
-        exceptionContext.addContextValue("test2", "different value");
-        exceptionContext.setContextValue("test3", "3");
-
-        final String message = exceptionContext.getFormattedExceptionMessage(TEST_MESSAGE);
-        assertTrue(message.indexOf(TEST_MESSAGE) >= 0);
-        assertTrue(message.indexOf("test Poorly written obj") >= 0);
-        assertTrue(message.indexOf("Crap") >= 0);
-
-        assertTrue(exceptionContext.getFirstContextValue("crap") == null);
-        assertTrue(exceptionContext.getFirstContextValue("test Poorly written obj") instanceof ObjectWithFaultyToString);
-
-        assertEquals(7, exceptionContext.getContextEntries().size());
-        assertEquals(6, exceptionContext.getContextLabels().size());
-
-        assertTrue(exceptionContext.getContextLabels().contains("test Poorly written obj"));
-        assertTrue(!exceptionContext.getContextLabels().contains("crap"));
-
-        exceptionContext.setContextValue("test Poorly written obj", "replacement");
-
-        assertEquals(7, exceptionContext.getContextEntries().size());
-        assertEquals(6, exceptionContext.getContextLabels().size());
-
-        exceptionContext.setContextValue("test2", "another");
-
-        assertEquals(6, exceptionContext.getContextEntries().size());
-        assertEquals(6, exceptionContext.getContextLabels().size());
-
-        final String contextMessage = exceptionContext.getFormattedExceptionMessage(null);
-        assertTrue(contextMessage.indexOf(TEST_MESSAGE) == -1);
-    }
-
-    @Test
-    public void testGetFirstContextValue() {
-        exceptionContext.addContextValue("test2", "different value");
-
-        assertTrue(exceptionContext.getFirstContextValue("test1") == null);
-        assertTrue(exceptionContext.getFirstContextValue("test2").equals("some value"));
-        assertTrue(exceptionContext.getFirstContextValue("crap") == null);
-
-        exceptionContext.setContextValue("test2", "another");
-
-        assertTrue(exceptionContext.getFirstContextValue("test2").equals("another"));
-    }
-
-    @Test
-    public void testGetContextValues() {
-        exceptionContext.addContextValue("test2", "different value");
-
-        assertEquals(exceptionContext.getContextValues("test1"), Collections.singletonList(null));
-        assertEquals(exceptionContext.getContextValues("test2"), Arrays.asList("some value", "different value"));
-
-        exceptionContext.setContextValue("test2", "another");
-
-        assertTrue(exceptionContext.getFirstContextValue("test2").equals("another"));
-    }
-
-    @Test
-    public void testGetContextLabels() {
-        assertEquals(5, exceptionContext.getContextEntries().size());
-        
-        exceptionContext.addContextValue("test2", "different value");
-
-        final Set<String> labels = exceptionContext.getContextLabels();
-        assertEquals(6, exceptionContext.getContextEntries().size());
-        assertEquals(5, labels.size());
-        assertTrue(labels.contains("test1"));
-        assertTrue(labels.contains("test2"));
-        assertTrue(labels.contains("test Date"));
-        assertTrue(labels.contains("test Nbr"));
-    }
-
-    @Test
-    public void testGetContextEntries() {
-        assertEquals(5, exceptionContext.getContextEntries().size());
-        
-        exceptionContext.addContextValue("test2", "different value");
-
-        final List<Pair<String, Object>> entries = exceptionContext.getContextEntries();
-        assertEquals(6, entries.size());
-        assertEquals("test1", entries.get(0).getKey());
-        assertEquals("test2", entries.get(1).getKey());
-        assertEquals("test Date", entries.get(2).getKey());
-        assertEquals("test Nbr", entries.get(3).getKey());
-        assertEquals("test Poorly written obj", entries.get(4).getKey());
-        assertEquals("test2", entries.get(5).getKey());
-    }
-    
-    @Test
-    public void testJavaSerialization() {
-        exceptionContext.setContextValue("test Poorly written obj", "serializable replacement");
-        
-        final T clone = (T) SerializationUtils.deserialize(SerializationUtils.serialize(exceptionContext));
-        assertEquals(exceptionContext.getFormattedExceptionMessage(null), clone.getFormattedExceptionMessage(null));
-    }
-}
diff --git a/lang/src/test/java/org/apache/commons/lang3/exception/ContextedExceptionTest.java b/lang/src/test/java/org/apache/commons/lang3/exception/ContextedExceptionTest.java
deleted file mode 100644
index 48703a5..0000000
--- a/lang/src/test/java/org/apache/commons/lang3/exception/ContextedExceptionTest.java
+++ /dev/null
@@ -1,110 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- * 
- *      http://www.apache.org/licenses/LICENSE-2.0
- * 
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.commons.lang3.exception;
-
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertNull;
-import static org.junit.Assert.assertTrue;
-
-import java.util.Date;
-
-import org.apache.commons.lang3.StringUtils;
-import org.junit.Test;
-
-/**
- * JUnit tests for ContextedException.
- */
-public class ContextedExceptionTest extends AbstractExceptionContextTest<ContextedException> {
-    
-    @Override
-    public void setUp() throws Exception {
-        exceptionContext = new ContextedException(new Exception(TEST_MESSAGE));
-        super.setUp();
-    }
-
-    @Test
-    public void testContextedException() {
-        exceptionContext = new ContextedException();
-        final String message = exceptionContext.getMessage();
-        final String trace = ExceptionUtils.getStackTrace(exceptionContext);
-        assertTrue(trace.indexOf("ContextedException")>=0);
-        assertTrue(StringUtils.isEmpty(message));
-    }
-
-    @Test
-    public void testContextedExceptionString() {
-        exceptionContext = new ContextedException(TEST_MESSAGE);
-        assertEquals(TEST_MESSAGE, exceptionContext.getMessage());
-        
-        final String trace = ExceptionUtils.getStackTrace(exceptionContext);
-        assertTrue(trace.indexOf(TEST_MESSAGE)>=0);
-    }
-
-    @Test
-    public void testContextedExceptionThrowable() {
-        exceptionContext = new ContextedException(new Exception(TEST_MESSAGE));
-        final String message = exceptionContext.getMessage();
-        final String trace = ExceptionUtils.getStackTrace(exceptionContext);
-        assertTrue(trace.indexOf("ContextedException")>=0);
-        assertTrue(trace.indexOf(TEST_MESSAGE)>=0);
-        assertTrue(message.indexOf(TEST_MESSAGE)>=0);
-    }
-
-    @Test
-    public void testContextedExceptionStringThrowable() {
-        exceptionContext = new ContextedException(TEST_MESSAGE_2, new Exception(TEST_MESSAGE));
-        final String message = exceptionContext.getMessage();
-        final String trace = ExceptionUtils.getStackTrace(exceptionContext);
-        assertTrue(trace.indexOf("ContextedException")>=0);
-        assertTrue(trace.indexOf(TEST_MESSAGE)>=0);
-        assertTrue(trace.indexOf(TEST_MESSAGE_2)>=0);
-        assertTrue(message.indexOf(TEST_MESSAGE_2)>=0);
-    }
-    
-    @Test
-    public void testContextedExceptionStringThrowableContext() {
-        exceptionContext = new ContextedException(TEST_MESSAGE_2, new Exception(TEST_MESSAGE), new DefaultExceptionContext());
-        final String message = exceptionContext.getMessage();
-        final String trace = ExceptionUtils.getStackTrace(exceptionContext);
-        assertTrue(trace.indexOf("ContextedException")>=0);
-        assertTrue(trace.indexOf(TEST_MESSAGE)>=0);
-        assertTrue(trace.indexOf(TEST_MESSAGE_2)>=0);
-        assertTrue(message.indexOf(TEST_MESSAGE_2)>=0);
-    }
-
-    @Test
-    public void testNullExceptionPassing() {
-        exceptionContext = new ContextedException(TEST_MESSAGE_2, new Exception(TEST_MESSAGE), null)
-        .addContextValue("test1", null)
-        .addContextValue("test2", "some value")
-        .addContextValue("test Date", new Date())
-        .addContextValue("test Nbr", Integer.valueOf(5))
-        .addContextValue("test Poorly written obj", new ObjectWithFaultyToString());
-        
-        final String message = exceptionContext.getMessage();
-        assertTrue(message != null);
-    }
-
-    @Test
-    public void testRawMessage() {
-        assertEquals(Exception.class.getName() + ": " + TEST_MESSAGE, exceptionContext.getRawMessage());
-        exceptionContext = new ContextedException(TEST_MESSAGE_2, new Exception(TEST_MESSAGE), new DefaultExceptionContext());
-        assertEquals(TEST_MESSAGE_2, exceptionContext.getRawMessage());
-        exceptionContext = new ContextedException(null, new Exception(TEST_MESSAGE), new DefaultExceptionContext());
-        assertNull(exceptionContext.getRawMessage());
-    }
-}
diff --git a/lang/src/test/java/org/apache/commons/lang3/exception/ContextedRuntimeExceptionTest.java b/lang/src/test/java/org/apache/commons/lang3/exception/ContextedRuntimeExceptionTest.java
deleted file mode 100644
index 6f3b066..0000000
--- a/lang/src/test/java/org/apache/commons/lang3/exception/ContextedRuntimeExceptionTest.java
+++ /dev/null
@@ -1,114 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- * 
- *      http://www.apache.org/licenses/LICENSE-2.0
- * 
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.commons.lang3.exception;
-
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertNull;
-import static org.junit.Assert.assertTrue;
-
-import java.util.Date;
-
-import org.apache.commons.lang3.StringUtils;
-import org.junit.Before;
-import org.junit.Test;
-
-/**
- * JUnit tests for ContextedRuntimeException.
- */
-public class ContextedRuntimeExceptionTest extends AbstractExceptionContextTest<ContextedRuntimeException> {
-    
-    @Override
-    @Before
-    public void setUp() throws Exception {
-        exceptionContext = new ContextedRuntimeException(new Exception(TEST_MESSAGE));
-        super.setUp();
-    }
-
-    @Test
-    public void testContextedException() {
-        exceptionContext = new ContextedRuntimeException();
-        final String message = exceptionContext.getMessage();
-        final String trace = ExceptionUtils.getStackTrace(exceptionContext);
-        assertTrue(trace.indexOf("ContextedException")>=0);
-        assertTrue(StringUtils.isEmpty(message));
-    }
-
-    @Test
-    public void testContextedExceptionString() {
-        exceptionContext = new ContextedRuntimeException(TEST_MESSAGE);
-        assertEquals(TEST_MESSAGE, exceptionContext.getMessage());
-        
-        final String trace = ExceptionUtils.getStackTrace(exceptionContext);
-        assertTrue(trace.indexOf(TEST_MESSAGE)>=0);
-    }
-
-    @Test
-    public void testContextedExceptionThrowable() {
-        exceptionContext = new ContextedRuntimeException(new Exception(TEST_MESSAGE));
-        final String message = exceptionContext.getMessage();
-        final String trace = ExceptionUtils.getStackTrace(exceptionContext);
-        assertTrue(trace.indexOf("ContextedException")>=0);
-        assertTrue(trace.indexOf(TEST_MESSAGE)>=0);
-        assertTrue(message.indexOf(TEST_MESSAGE)>=0);
-    }
-
-    @Test
-    public void testContextedExceptionStringThrowable() {
-        exceptionContext = new ContextedRuntimeException(TEST_MESSAGE_2, new Exception(TEST_MESSAGE));
-        final String message = exceptionContext.getMessage();
-        final String trace = ExceptionUtils.getStackTrace(exceptionContext);
-        assertTrue(trace.indexOf("ContextedException")>=0);
-        assertTrue(trace.indexOf(TEST_MESSAGE)>=0);
-        assertTrue(trace.indexOf(TEST_MESSAGE_2)>=0);
-        assertTrue(message.indexOf(TEST_MESSAGE_2)>=0);
-    }
-    
-    @Test
-    public void testContextedExceptionStringThrowableContext() {
-        // Use an anonymous subclass to make sure users can provide custom implementations
-        exceptionContext = new ContextedRuntimeException(TEST_MESSAGE_2, new Exception(TEST_MESSAGE), 
-        new DefaultExceptionContext() {private static final long serialVersionUID = 1L;});
-        final String message = exceptionContext.getMessage();
-        final String trace = ExceptionUtils.getStackTrace(exceptionContext);
-        assertTrue(trace.indexOf("ContextedException")>=0);
-        assertTrue(trace.indexOf(TEST_MESSAGE)>=0);
-        assertTrue(trace.indexOf(TEST_MESSAGE_2)>=0);
-        assertTrue(message.indexOf(TEST_MESSAGE_2)>=0);
-    }
-
-    @Test
-    public void testNullExceptionPassing() {
-        exceptionContext = new ContextedRuntimeException(TEST_MESSAGE_2, new Exception(TEST_MESSAGE), null)
-        .addContextValue("test1", null)
-        .addContextValue("test2", "some value")
-        .addContextValue("test Date", new Date())
-        .addContextValue("test Nbr", Integer.valueOf(5))
-        .addContextValue("test Poorly written obj", new ObjectWithFaultyToString());
-        
-        final String message = exceptionContext.getMessage();
-        assertTrue(message != null);
-    }
-
-    @Test
-    public void testRawMessage() {
-        assertEquals(Exception.class.getName() + ": " + TEST_MESSAGE, exceptionContext.getRawMessage());
-        exceptionContext = new ContextedRuntimeException(TEST_MESSAGE_2, new Exception(TEST_MESSAGE), new DefaultExceptionContext());
-        assertEquals(TEST_MESSAGE_2, exceptionContext.getRawMessage());
-        exceptionContext = new ContextedRuntimeException(null, new Exception(TEST_MESSAGE), new DefaultExceptionContext());
-        assertNull(exceptionContext.getRawMessage());
-    }
-}
diff --git a/lang/src/test/java/org/apache/commons/lang3/exception/DefaultExceptionContextTest.java b/lang/src/test/java/org/apache/commons/lang3/exception/DefaultExceptionContextTest.java
deleted file mode 100644
index cbfd95f..0000000
--- a/lang/src/test/java/org/apache/commons/lang3/exception/DefaultExceptionContextTest.java
+++ /dev/null
@@ -1,41 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- * 
- *      http://www.apache.org/licenses/LICENSE-2.0
- * 
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.commons.lang3.exception;
-
-import org.junit.Before;
-import org.junit.Test;
-
-/**
- * JUnit tests for DefaultExceptionContext.
- *
- */
-public class DefaultExceptionContextTest extends AbstractExceptionContextTest<DefaultExceptionContext> {
-    
-    @Override
-    @Before
-    public void setUp() throws Exception {
-        exceptionContext = new DefaultExceptionContext();
-        super.setUp();
-    }
-    
-    @Test
-    public void testFormattedExceptionMessageNull() {
-        exceptionContext = new DefaultExceptionContext();
-        exceptionContext.getFormattedExceptionMessage(null);
-    }
-
-}
diff --git a/lang/src/test/java/org/apache/commons/lang3/exception/ExceptionUtilsTest.java b/lang/src/test/java/org/apache/commons/lang3/exception/ExceptionUtilsTest.java
deleted file mode 100644
index c8ef1b6..0000000
--- a/lang/src/test/java/org/apache/commons/lang3/exception/ExceptionUtilsTest.java
+++ /dev/null
@@ -1,538 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- * 
- *      http://www.apache.org/licenses/LICENSE-2.0
- * 
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.commons.lang3.exception;
-
-import org.junit.After;
-import org.junit.Test;
-import org.junit.Before;
-import static org.junit.Assert.*;
-import java.io.ByteArrayOutputStream;
-import java.io.PrintStream;
-import java.io.PrintWriter;
-import java.io.StringWriter;
-import java.lang.reflect.Constructor;
-import java.lang.reflect.Modifier;
-import java.util.List;
-
-/**
- * Tests {@link org.apache.commons.lang3.exception.ExceptionUtils}.
- * 
- * <h3>Notes</h3>
- * <p>
- * Make sure this exception code does not depend on Java 1.4 nested exceptions. SVN revision 38990 does not compile with
- * Java 1.3.1.
- * </p>
- * <ul>
- * <li>Compiled with Sun Java 1.3.1_15</li>
- * <li>Tested with Sun Java 1.3.1_15</li>
- * <li>Tested with Sun Java 1.4.2_12</li>
- * <li>Tested with Sun Java 1.5.0_08</li>
- * <li>All of the above on Windows XP SP2 + patches.</li>
- * </ul>
- * <p>
- * Gary Gregory; August 16, 2006.
- * </p>
- * 
- * @since 1.0
- */
-public class ExceptionUtilsTest {
-    
-    private NestableException nested;
-    private Throwable withCause;
-    private Throwable withoutCause;
-    private Throwable jdkNoCause;
-    private ExceptionWithCause cyclicCause;
-
-
-    @Before
-    public void setUp() {
-        withoutCause = createExceptionWithoutCause();
-        nested = new NestableException(withoutCause);
-        withCause = new ExceptionWithCause(nested);
-        jdkNoCause = new NullPointerException();
-        final ExceptionWithCause a = new ExceptionWithCause(null);
-        final ExceptionWithCause b = new ExceptionWithCause(a);
-        a.setCause(b);
-        cyclicCause = new ExceptionWithCause(a);
-    }
-
-
-    @After
-    public void tearDown() throws Exception {
-        withoutCause = null;
-        nested = null;
-        withCause = null;
-        jdkNoCause = null;
-        cyclicCause = null;
-    }
-
-    //-----------------------------------------------------------------------
-    private Throwable createExceptionWithoutCause() {
-        try {
-            throw new ExceptionWithoutCause();
-        } catch (final Throwable t) {
-            return t;
-        }
-    }
-
-    private Throwable createExceptionWithCause() {
-        try {
-            try {
-                throw new ExceptionWithCause(createExceptionWithoutCause());
-            } catch (final Throwable t) {
-                throw new ExceptionWithCause(t);
-            }
-        } catch (final Throwable t) {
-            return t;
-        }
-    }
-
-    //-----------------------------------------------------------------------
-    
-    @Test
-    public void testConstructor() {
-        assertNotNull(new ExceptionUtils());
-        final Constructor<?>[] cons = ExceptionUtils.class.getDeclaredConstructors();
-        assertEquals(1, cons.length);
-        assertTrue(Modifier.isPublic(cons[0].getModifiers()));
-        assertTrue(Modifier.isPublic(ExceptionUtils.class.getModifiers()));
-        assertFalse(Modifier.isFinal(ExceptionUtils.class.getModifiers()));
-    }
-    
-    //-----------------------------------------------------------------------
-    @SuppressWarnings("deprecation") // Specifically tests the deprecated methods
-    @Test
-    public void testGetCause_Throwable() {
-        assertSame(null, ExceptionUtils.getCause(null));
-        assertSame(null, ExceptionUtils.getCause(withoutCause));
-        assertSame(withoutCause, ExceptionUtils.getCause(nested));
-        assertSame(nested, ExceptionUtils.getCause(withCause));
-        assertSame(null, ExceptionUtils.getCause(jdkNoCause));
-        assertSame(cyclicCause.getCause(), ExceptionUtils.getCause(cyclicCause));
-        assertSame(((ExceptionWithCause) cyclicCause.getCause()).getCause(), ExceptionUtils.getCause(cyclicCause.getCause()));
-        assertSame(cyclicCause.getCause(), ExceptionUtils.getCause(((ExceptionWithCause) cyclicCause.getCause()).getCause()));
-    }
-
-    @SuppressWarnings("deprecation") // Specifically tests the deprecated methods
-    @Test
-    public void testGetCause_ThrowableArray() {
-        assertSame(null, ExceptionUtils.getCause(null, null));
-        assertSame(null, ExceptionUtils.getCause(null, new String[0]));
-
-        // not known type, so match on supplied method names
-        assertSame(nested, ExceptionUtils.getCause(withCause, null));  // default names
-        assertSame(null, ExceptionUtils.getCause(withCause, new String[0]));
-        assertSame(null, ExceptionUtils.getCause(withCause, new String[] {null}));
-        assertSame(nested, ExceptionUtils.getCause(withCause, new String[] {"getCause"}));
-        
-        // not known type, so match on supplied method names
-        assertSame(null, ExceptionUtils.getCause(withoutCause, null));
-        assertSame(null, ExceptionUtils.getCause(withoutCause, new String[0]));
-        assertSame(null, ExceptionUtils.getCause(withoutCause, new String[] {null}));
-        assertSame(null, ExceptionUtils.getCause(withoutCause, new String[] {"getCause"}));
-        assertSame(null, ExceptionUtils.getCause(withoutCause, new String[] {"getTargetException"}));
-    }
-
-    @Test
-    public void testGetRootCause_Throwable() {
-        assertSame(null, ExceptionUtils.getRootCause(null));
-        assertSame(null, ExceptionUtils.getRootCause(withoutCause));
-        assertSame(withoutCause, ExceptionUtils.getRootCause(nested));
-        assertSame(withoutCause, ExceptionUtils.getRootCause(withCause));
-        assertSame(null, ExceptionUtils.getRootCause(jdkNoCause));
-        assertSame(((ExceptionWithCause) cyclicCause.getCause()).getCause(), ExceptionUtils.getRootCause(cyclicCause));
-    }
-
-    //-----------------------------------------------------------------------
-    @Test
-    public void testGetThrowableCount_Throwable() {
-        assertEquals(0, ExceptionUtils.getThrowableCount(null));
-        assertEquals(1, ExceptionUtils.getThrowableCount(withoutCause));
-        assertEquals(2, ExceptionUtils.getThrowableCount(nested));
-        assertEquals(3, ExceptionUtils.getThrowableCount(withCause));
-        assertEquals(1, ExceptionUtils.getThrowableCount(jdkNoCause));
-        assertEquals(3, ExceptionUtils.getThrowableCount(cyclicCause));
-    }
-
-    //-----------------------------------------------------------------------
-    @Test
-    public void testGetThrowables_Throwable_null() {
-        assertEquals(0, ExceptionUtils.getThrowables(null).length);
-    }
-
-    @Test
-    public void testGetThrowables_Throwable_withoutCause() {
-        final Throwable[] throwables = ExceptionUtils.getThrowables(withoutCause);
-        assertEquals(1, throwables.length);
-        assertSame(withoutCause, throwables[0]);
-    }
-
-    @Test
-    public void testGetThrowables_Throwable_nested() {
-        final Throwable[] throwables = ExceptionUtils.getThrowables(nested);
-        assertEquals(2, throwables.length);
-        assertSame(nested, throwables[0]);
-        assertSame(withoutCause, throwables[1]);
-    }
-
-    @Test
-    public void testGetThrowables_Throwable_withCause() {
-        final Throwable[] throwables = ExceptionUtils.getThrowables(withCause);
-        assertEquals(3, throwables.length);
-        assertSame(withCause, throwables[0]);
-        assertSame(nested, throwables[1]);
-        assertSame(withoutCause, throwables[2]);
-    }
-
-    @Test
-    public void testGetThrowables_Throwable_jdkNoCause() {
-        final Throwable[] throwables = ExceptionUtils.getThrowables(jdkNoCause);
-        assertEquals(1, throwables.length);
-        assertSame(jdkNoCause, throwables[0]);
-    }
-
-    @Test
-    public void testGetThrowables_Throwable_recursiveCause() {
-        final Throwable[] throwables = ExceptionUtils.getThrowables(cyclicCause);
-        assertEquals(3, throwables.length);
-        assertSame(cyclicCause, throwables[0]);
-        assertSame(cyclicCause.getCause(), throwables[1]);
-        assertSame(((ExceptionWithCause) cyclicCause.getCause()).getCause(), throwables[2]);
-    }
-
-    //-----------------------------------------------------------------------
-    @Test
-    public void testGetThrowableList_Throwable_null() {
-        final List<?> throwables = ExceptionUtils.getThrowableList(null);
-        assertEquals(0, throwables.size());
-    }
-
-    @Test
-    public void testGetThrowableList_Throwable_withoutCause() {
-        final List<?> throwables = ExceptionUtils.getThrowableList(withoutCause);
-        assertEquals(1, throwables.size());
-        assertSame(withoutCause, throwables.get(0));
-    }
-
-    @Test
-    public void testGetThrowableList_Throwable_nested() {
-        final List<?> throwables = ExceptionUtils.getThrowableList(nested);
-        assertEquals(2, throwables.size());
-        assertSame(nested, throwables.get(0));
-        assertSame(withoutCause, throwables.get(1));
-    }
-
-    @Test
-    public void testGetThrowableList_Throwable_withCause() {
-        final List<?> throwables = ExceptionUtils.getThrowableList(withCause);
-        assertEquals(3, throwables.size());
-        assertSame(withCause, throwables.get(0));
-        assertSame(nested, throwables.get(1));
-        assertSame(withoutCause, throwables.get(2));
-    }
-
-    @Test
-    public void testGetThrowableList_Throwable_jdkNoCause() {
-        final List<?> throwables = ExceptionUtils.getThrowableList(jdkNoCause);
-        assertEquals(1, throwables.size());
-        assertSame(jdkNoCause, throwables.get(0));
-    }
-
-    @Test
-    public void testGetThrowableList_Throwable_recursiveCause() {
-        final List<?> throwables = ExceptionUtils.getThrowableList(cyclicCause);
-        assertEquals(3, throwables.size());
-        assertSame(cyclicCause, throwables.get(0));
-        assertSame(cyclicCause.getCause(), throwables.get(1));
-        assertSame(((ExceptionWithCause) cyclicCause.getCause()).getCause(), throwables.get(2));
-    }
-
-    //-----------------------------------------------------------------------
-    @Test
-    public void testIndexOf_ThrowableClass() {
-        assertEquals(-1, ExceptionUtils.indexOfThrowable(null, null));
-        assertEquals(-1, ExceptionUtils.indexOfThrowable(null, NestableException.class));
-        
-        assertEquals(-1, ExceptionUtils.indexOfThrowable(withoutCause, null));
-        assertEquals(-1, ExceptionUtils.indexOfThrowable(withoutCause, ExceptionWithCause.class));
-        assertEquals(-1, ExceptionUtils.indexOfThrowable(withoutCause, NestableException.class));
-        assertEquals(0, ExceptionUtils.indexOfThrowable(withoutCause, ExceptionWithoutCause.class));
-        
-        assertEquals(-1, ExceptionUtils.indexOfThrowable(nested, null));
-        assertEquals(-1, ExceptionUtils.indexOfThrowable(nested, ExceptionWithCause.class));
-        assertEquals(0, ExceptionUtils.indexOfThrowable(nested, NestableException.class));
-        assertEquals(1, ExceptionUtils.indexOfThrowable(nested, ExceptionWithoutCause.class));
-        
-        assertEquals(-1, ExceptionUtils.indexOfThrowable(withCause, null));
-        assertEquals(0, ExceptionUtils.indexOfThrowable(withCause, ExceptionWithCause.class));
-        assertEquals(1, ExceptionUtils.indexOfThrowable(withCause, NestableException.class));
-        assertEquals(2, ExceptionUtils.indexOfThrowable(withCause, ExceptionWithoutCause.class));
-        
-        assertEquals(-1, ExceptionUtils.indexOfThrowable(withCause, Exception.class));
-    }
-
-    @Test
-    public void testIndexOf_ThrowableClassInt() {
-        assertEquals(-1, ExceptionUtils.indexOfThrowable(null, null, 0));
-        assertEquals(-1, ExceptionUtils.indexOfThrowable(null, NestableException.class, 0));
-        
-        assertEquals(-1, ExceptionUtils.indexOfThrowable(withoutCause, null));
-        assertEquals(-1, ExceptionUtils.indexOfThrowable(withoutCause, ExceptionWithCause.class, 0));
-        assertEquals(-1, ExceptionUtils.indexOfThrowable(withoutCause, NestableException.class, 0));
-        assertEquals(0, ExceptionUtils.indexOfThrowable(withoutCause, ExceptionWithoutCause.class, 0));
-        
-        assertEquals(-1, ExceptionUtils.indexOfThrowable(nested, null, 0));
-        assertEquals(-1, ExceptionUtils.indexOfThrowable(nested, ExceptionWithCause.class, 0));
-        assertEquals(0, ExceptionUtils.indexOfThrowable(nested, NestableException.class, 0));
-        assertEquals(1, ExceptionUtils.indexOfThrowable(nested, ExceptionWithoutCause.class, 0));
-        
-        assertEquals(-1, ExceptionUtils.indexOfThrowable(withCause, null));
-        assertEquals(0, ExceptionUtils.indexOfThrowable(withCause, ExceptionWithCause.class, 0));
-        assertEquals(1, ExceptionUtils.indexOfThrowable(withCause, NestableException.class, 0));
-        assertEquals(2, ExceptionUtils.indexOfThrowable(withCause, ExceptionWithoutCause.class, 0));
-
-        assertEquals(0, ExceptionUtils.indexOfThrowable(withCause, ExceptionWithCause.class, -1));
-        assertEquals(0, ExceptionUtils.indexOfThrowable(withCause, ExceptionWithCause.class, 0));
-        assertEquals(-1, ExceptionUtils.indexOfThrowable(withCause, ExceptionWithCause.class, 1));
-        assertEquals(-1, ExceptionUtils.indexOfThrowable(withCause, ExceptionWithCause.class, 9));
-        
-        assertEquals(-1, ExceptionUtils.indexOfThrowable(withCause, Exception.class, 0));
-    }
-
-    //-----------------------------------------------------------------------
-    @Test
-    public void testIndexOfType_ThrowableClass() {
-        assertEquals(-1, ExceptionUtils.indexOfType(null, null));
-        assertEquals(-1, ExceptionUtils.indexOfType(null, NestableException.class));
-        
-        assertEquals(-1, ExceptionUtils.indexOfType(withoutCause, null));
-        assertEquals(-1, ExceptionUtils.indexOfType(withoutCause, ExceptionWithCause.class));
-        assertEquals(-1, ExceptionUtils.indexOfType(withoutCause, NestableException.class));
-        assertEquals(0, ExceptionUtils.indexOfType(withoutCause, ExceptionWithoutCause.class));
-        
-        assertEquals(-1, ExceptionUtils.indexOfType(nested, null));
-        assertEquals(-1, ExceptionUtils.indexOfType(nested, ExceptionWithCause.class));
-        assertEquals(0, ExceptionUtils.indexOfType(nested, NestableException.class));
-        assertEquals(1, ExceptionUtils.indexOfType(nested, ExceptionWithoutCause.class));
-        
-        assertEquals(-1, ExceptionUtils.indexOfType(withCause, null));
-        assertEquals(0, ExceptionUtils.indexOfType(withCause, ExceptionWithCause.class));
-        assertEquals(1, ExceptionUtils.indexOfType(withCause, NestableException.class));
-        assertEquals(2, ExceptionUtils.indexOfType(withCause, ExceptionWithoutCause.class));
-        
-        assertEquals(0, ExceptionUtils.indexOfType(withCause, Exception.class));
-    }
-
-    @Test
-    public void testIndexOfType_ThrowableClassInt() {
-        assertEquals(-1, ExceptionUtils.indexOfType(null, null, 0));
-        assertEquals(-1, ExceptionUtils.indexOfType(null, NestableException.class, 0));
-        
-        assertEquals(-1, ExceptionUtils.indexOfType(withoutCause, null));
-        assertEquals(-1, ExceptionUtils.indexOfType(withoutCause, ExceptionWithCause.class, 0));
-        assertEquals(-1, ExceptionUtils.indexOfType(withoutCause, NestableException.class, 0));
-        assertEquals(0, ExceptionUtils.indexOfType(withoutCause, ExceptionWithoutCause.class, 0));
-        
-        assertEquals(-1, ExceptionUtils.indexOfType(nested, null, 0));
-        assertEquals(-1, ExceptionUtils.indexOfType(nested, ExceptionWithCause.class, 0));
-        assertEquals(0, ExceptionUtils.indexOfType(nested, NestableException.class, 0));
-        assertEquals(1, ExceptionUtils.indexOfType(nested, ExceptionWithoutCause.class, 0));
-        
-        assertEquals(-1, ExceptionUtils.indexOfType(withCause, null));
-        assertEquals(0, ExceptionUtils.indexOfType(withCause, ExceptionWithCause.class, 0));
-        assertEquals(1, ExceptionUtils.indexOfType(withCause, NestableException.class, 0));
-        assertEquals(2, ExceptionUtils.indexOfType(withCause, ExceptionWithoutCause.class, 0));
-
-        assertEquals(0, ExceptionUtils.indexOfType(withCause, ExceptionWithCause.class, -1));
-        assertEquals(0, ExceptionUtils.indexOfType(withCause, ExceptionWithCause.class, 0));
-        assertEquals(-1, ExceptionUtils.indexOfType(withCause, ExceptionWithCause.class, 1));
-        assertEquals(-1, ExceptionUtils.indexOfType(withCause, ExceptionWithCause.class, 9));
-        
-        assertEquals(0, ExceptionUtils.indexOfType(withCause, Exception.class, 0));
-    }
-
-    //-----------------------------------------------------------------------
-    @Test
-    public void testPrintRootCauseStackTrace_Throwable() throws Exception {
-        ExceptionUtils.printRootCauseStackTrace(null);
-        // could pipe system.err to a known stream, but not much point as
-        // internally this method calls stram method anyway
-    }
-    
-    @Test
-    public void testPrintRootCauseStackTrace_ThrowableStream() throws Exception {
-        ByteArrayOutputStream out = new ByteArrayOutputStream(1024);
-        ExceptionUtils.printRootCauseStackTrace(null, (PrintStream) null);
-        ExceptionUtils.printRootCauseStackTrace(null, new PrintStream(out));
-        assertEquals(0, out.toString().length());
-        
-        out = new ByteArrayOutputStream(1024);
-        try {
-            ExceptionUtils.printRootCauseStackTrace(withCause, (PrintStream) null);
-            fail();
-        } catch (final IllegalArgumentException ex) {
-        }
-        
-        out = new ByteArrayOutputStream(1024);
-        final Throwable cause = createExceptionWithCause();
-        ExceptionUtils.printRootCauseStackTrace(cause, new PrintStream(out));
-        String stackTrace = out.toString();
-        assertTrue(stackTrace.indexOf(ExceptionUtils.WRAPPED_MARKER) != -1);
-        
-        out = new ByteArrayOutputStream(1024);
-        ExceptionUtils.printRootCauseStackTrace(withoutCause, new PrintStream(out));
-        stackTrace = out.toString();
-        assertTrue(stackTrace.indexOf(ExceptionUtils.WRAPPED_MARKER) == -1);
-    }
-
-    @Test
-    public void testPrintRootCauseStackTrace_ThrowableWriter() throws Exception {
-        StringWriter writer = new StringWriter(1024);
-        ExceptionUtils.printRootCauseStackTrace(null, (PrintWriter) null);
-        ExceptionUtils.printRootCauseStackTrace(null, new PrintWriter(writer));
-        assertEquals(0, writer.getBuffer().length());
-        
-        writer = new StringWriter(1024);
-        try {
-            ExceptionUtils.printRootCauseStackTrace(withCause, (PrintWriter) null);
-            fail();
-        } catch (final IllegalArgumentException ex) {
-        }
-        
-        writer = new StringWriter(1024);
-        final Throwable cause = createExceptionWithCause();
-        ExceptionUtils.printRootCauseStackTrace(cause, new PrintWriter(writer));
-        String stackTrace = writer.toString();
-        assertTrue(stackTrace.indexOf(ExceptionUtils.WRAPPED_MARKER) != -1);
-        
-        writer = new StringWriter(1024);
-        ExceptionUtils.printRootCauseStackTrace(withoutCause, new PrintWriter(writer));
-        stackTrace = writer.toString();
-        assertTrue(stackTrace.indexOf(ExceptionUtils.WRAPPED_MARKER) == -1);
-    }
-
-    //-----------------------------------------------------------------------
-    @Test
-    public void testGetRootCauseStackTrace_Throwable() throws Exception {
-        assertEquals(0, ExceptionUtils.getRootCauseStackTrace(null).length);
-        
-        final Throwable cause = createExceptionWithCause();
-        String[] stackTrace = ExceptionUtils.getRootCauseStackTrace(cause);
-        boolean match = false;
-        for (final String element : stackTrace) {
-            if (element.startsWith(ExceptionUtils.WRAPPED_MARKER)) {
-                match = true;
-                break;
-            }
-        }
-        assertTrue(match);
-        
-        stackTrace = ExceptionUtils.getRootCauseStackTrace(withoutCause);
-        match = false;
-        for (final String element : stackTrace) {
-            if (element.startsWith(ExceptionUtils.WRAPPED_MARKER)) {
-                match = true;
-                break;
-            }
-        }
-        assertFalse(match);
-    }
-
-    @Test(expected=IllegalArgumentException.class)
-    public void testRemoveCommonFrames_ListList() throws Exception {
-        ExceptionUtils.removeCommonFrames(null, null);
-    }
-
-    @Test
-    public void test_getMessage_Throwable() {
-        Throwable th = null;
-        assertEquals("", ExceptionUtils.getMessage(th));
-        
-        th = new IllegalArgumentException("Base");
-        assertEquals("IllegalArgumentException: Base", ExceptionUtils.getMessage(th));
-        
-        th = new ExceptionWithCause("Wrapper", th);
-        assertEquals("ExceptionUtilsTest.ExceptionWithCause: Wrapper", ExceptionUtils.getMessage(th));
-    }
-
-    @Test
-    public void test_getRootCauseMessage_Throwable() {
-        Throwable th = null;
-        assertEquals("", ExceptionUtils.getRootCauseMessage(th));
-        
-        th = new IllegalArgumentException("Base");
-        assertEquals("IllegalArgumentException: Base", ExceptionUtils.getRootCauseMessage(th));
-        
-        th = new ExceptionWithCause("Wrapper", th);
-        assertEquals("IllegalArgumentException: Base", ExceptionUtils.getRootCauseMessage(th));
-    }
-
-    //-----------------------------------------------------------------------
-    /**
-     * Provides a method with a well known chained/nested exception
-     * name which matches the full signature (e.g. has a return value
-     * of <code>Throwable</code>.
-     */
-    private static class ExceptionWithCause extends Exception {
-        private static final long serialVersionUID = 1L;
-
-        private Throwable cause;
-
-        public ExceptionWithCause(final String str, final Throwable cause) {
-            super(str);
-            setCause(cause);
-        }
-
-        public ExceptionWithCause(final Throwable cause) {
-            super();
-            setCause(cause);
-        }
-
-        @Override
-        public Throwable getCause() {
-            return cause;
-        }
-
-        public void setCause(final Throwable cause) {
-            this.cause = cause;
-        }
-    }
-
-    /**
-     * Provides a method with a well known chained/nested exception
-     * name which does not match the full signature (e.g. lacks a
-     * return value of <code>Throwable</code>.
-     */
-    private static class ExceptionWithoutCause extends Exception {
-        private static final long serialVersionUID = 1L;
-
-       @SuppressWarnings("unused")
-        public void getTargetException() {
-        }
-    }
-
-    // Temporary classes to allow the nested exception code to be removed 
-    // prior to a rewrite of this test class. 
-    private static class NestableException extends Exception { 
-        private static final long serialVersionUID = 1L;
-
-        @SuppressWarnings("unused")
-        public NestableException() { super(); }
-        public NestableException(final Throwable t) { super(t); }
-    }
-
-}
diff --git a/lang/src/test/java/org/apache/commons/lang3/math/FractionTest.java b/lang/src/test/java/org/apache/commons/lang3/math/FractionTest.java
deleted file mode 100644
index b1bca68..0000000
--- a/lang/src/test/java/org/apache/commons/lang3/math/FractionTest.java
+++ /dev/null
@@ -1,1369 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-package org.apache.commons.lang3.math;
-
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertFalse;
-import static org.junit.Assert.assertSame;
-import static org.junit.Assert.assertTrue;
-import static org.junit.Assert.fail;
-
-import org.junit.Test;
-
-/**
- * Test cases for the {@link Fraction} class
- *
- * @version $Id$
- */
-public class FractionTest  {
-    
-    private static final int SKIP = 500;  //53
-
-    //--------------------------------------------------------------------------
-    @Test
-    public void testConstants() {
-        assertEquals(0, Fraction.ZERO.getNumerator());
-        assertEquals(1, Fraction.ZERO.getDenominator());
-        
-        assertEquals(1, Fraction.ONE.getNumerator());
-        assertEquals(1, Fraction.ONE.getDenominator());
-        
-        assertEquals(1, Fraction.ONE_HALF.getNumerator());
-        assertEquals(2, Fraction.ONE_HALF.getDenominator());
-        
-        assertEquals(1, Fraction.ONE_THIRD.getNumerator());
-        assertEquals(3, Fraction.ONE_THIRD.getDenominator());
-        
-        assertEquals(2, Fraction.TWO_THIRDS.getNumerator());
-        assertEquals(3, Fraction.TWO_THIRDS.getDenominator());
-        
-        assertEquals(1, Fraction.ONE_QUARTER.getNumerator());
-        assertEquals(4, Fraction.ONE_QUARTER.getDenominator());
-        
-        assertEquals(2, Fraction.TWO_QUARTERS.getNumerator());
-        assertEquals(4, Fraction.TWO_QUARTERS.getDenominator());
-        
-        assertEquals(3, Fraction.THREE_QUARTERS.getNumerator());
-        assertEquals(4, Fraction.THREE_QUARTERS.getDenominator());
-        
-        assertEquals(1, Fraction.ONE_FIFTH.getNumerator());
-        assertEquals(5, Fraction.ONE_FIFTH.getDenominator());
-        
-        assertEquals(2, Fraction.TWO_FIFTHS.getNumerator());
-        assertEquals(5, Fraction.TWO_FIFTHS.getDenominator());
-        
-        assertEquals(3, Fraction.THREE_FIFTHS.getNumerator());
-        assertEquals(5, Fraction.THREE_FIFTHS.getDenominator());
-        
-        assertEquals(4, Fraction.FOUR_FIFTHS.getNumerator());
-        assertEquals(5, Fraction.FOUR_FIFTHS.getDenominator());
-    }
-
-    @Test
-    public void testFactory_int_int() {
-        Fraction f = null;
-        
-        // zero
-        f = Fraction.getFraction(0, 1);
-        assertEquals(0, f.getNumerator());
-        assertEquals(1, f.getDenominator());
-        
-        f = Fraction.getFraction(0, 2);
-        assertEquals(0, f.getNumerator());
-        assertEquals(2, f.getDenominator());
-        
-        // normal
-        f = Fraction.getFraction(1, 1);
-        assertEquals(1, f.getNumerator());
-        assertEquals(1, f.getDenominator());
-        
-        f = Fraction.getFraction(2, 1);
-        assertEquals(2, f.getNumerator());
-        assertEquals(1, f.getDenominator());
-        
-        f = Fraction.getFraction(23, 345);
-        assertEquals(23, f.getNumerator());
-        assertEquals(345, f.getDenominator());
-        
-        // improper
-        f = Fraction.getFraction(22, 7);
-        assertEquals(22, f.getNumerator());
-        assertEquals(7, f.getDenominator());
-        
-        // negatives
-        f = Fraction.getFraction(-6, 10);
-        assertEquals(-6, f.getNumerator());
-        assertEquals(10, f.getDenominator());
-        
-        f = Fraction.getFraction(6, -10);
-        assertEquals(-6, f.getNumerator());
-        assertEquals(10, f.getDenominator());
-        
-        f = Fraction.getFraction(-6, -10);
-        assertEquals(6, f.getNumerator());
-        assertEquals(10, f.getDenominator());
-        
-        // zero denominator
-        try {
-            f = Fraction.getFraction(1, 0);
-            fail("expecting ArithmeticException");
-        } catch (final ArithmeticException ex) {}
-        
-        try {
-            f = Fraction.getFraction(2, 0);
-            fail("expecting ArithmeticException");
-        } catch (final ArithmeticException ex) {}
-        
-        try {
-            f = Fraction.getFraction(-3, 0);
-            fail("expecting ArithmeticException");
-        } catch (final ArithmeticException ex) {}
-
-        // very large: can't represent as unsimplified fraction, although
-        try {
-            f = Fraction.getFraction(4, Integer.MIN_VALUE);
-            fail("expecting ArithmeticException");
-        } catch (final ArithmeticException ex) {}
-        try {
-            f = Fraction.getFraction(1, Integer.MIN_VALUE);
-            fail("expecting ArithmeticException");
-        } catch (final ArithmeticException ex) {}
-    }
-
-    @Test
-    public void testFactory_int_int_int() {
-        Fraction f = null;
-        
-        // zero
-        f = Fraction.getFraction(0, 0, 2);
-        assertEquals(0, f.getNumerator());
-        assertEquals(2, f.getDenominator());
-        
-        f = Fraction.getFraction(2, 0, 2);
-        assertEquals(4, f.getNumerator());
-        assertEquals(2, f.getDenominator());
-        
-        f = Fraction.getFraction(0, 1, 2);
-        assertEquals(1, f.getNumerator());
-        assertEquals(2, f.getDenominator());
-        
-        // normal
-        f = Fraction.getFraction(1, 1, 2);
-        assertEquals(3, f.getNumerator());
-        assertEquals(2, f.getDenominator());
-        
-        // negatives
-        try {
-            f = Fraction.getFraction(1, -6, -10);
-            fail("expecting ArithmeticException");
-        } catch (final ArithmeticException ex) {}
-
-        try {
-            f = Fraction.getFraction(1, -6, -10);
-            fail("expecting ArithmeticException");
-        } catch (final ArithmeticException ex) {}
-
-        try {
-            f = Fraction.getFraction(1, -6, -10);
-            fail("expecting ArithmeticException");
-        } catch (final ArithmeticException ex) {}
-        
-        // negative whole
-        f = Fraction.getFraction(-1, 6, 10);
-        assertEquals(-16, f.getNumerator());
-        assertEquals(10, f.getDenominator());
-        
-        try {
-            f = Fraction.getFraction(-1, -6, 10);
-            fail("expecting ArithmeticException");
-        } catch (final ArithmeticException ex) {}
-
-        try {
-            f = Fraction.getFraction(-1, 6, -10);
-            fail("expecting ArithmeticException");
-        } catch (final ArithmeticException ex) {}
-        
-        try {
-            f = Fraction.getFraction(-1, -6, -10);
-            fail("expecting ArithmeticException");
-        } catch (final ArithmeticException ex) {}
-        
-        // zero denominator
-        try {
-            f = Fraction.getFraction(0, 1, 0);
-            fail("expecting ArithmeticException");
-        } catch (final ArithmeticException ex) {}
-        
-        try {
-            f = Fraction.getFraction(1, 2, 0);
-            fail("expecting ArithmeticException");
-        } catch (final ArithmeticException ex) {}
-        
-        try {
-            f = Fraction.getFraction(-1, -3, 0);
-            fail("expecting ArithmeticException");
-        } catch (final ArithmeticException ex) {}
-        
-        try {
-            f = Fraction.getFraction(Integer.MAX_VALUE, 1, 2); 
-            fail("expecting ArithmeticException");
-        } catch (final ArithmeticException ex) {}
-        
-        try {
-            f = Fraction.getFraction(-Integer.MAX_VALUE, 1, 2);
-            fail("expecting ArithmeticException");
-        } catch (final ArithmeticException ex) {}
-
-        // very large
-        f = Fraction.getFraction(-1, 0, Integer.MAX_VALUE);
-        assertEquals(-Integer.MAX_VALUE, f.getNumerator());
-        assertEquals(Integer.MAX_VALUE, f.getDenominator());
-
-        try {
-            // negative denominators not allowed in this constructor.
-            f = Fraction.getFraction(0, 4, Integer.MIN_VALUE);
-            fail("expecting ArithmeticException");
-        } catch (final ArithmeticException ex) {}
-        try {
-            f = Fraction.getFraction(1, 1, Integer.MAX_VALUE);
-            fail("expecting ArithmeticException");
-        } catch (final ArithmeticException ex) {}
-        try {
-            f = Fraction.getFraction(-1, 2, Integer.MAX_VALUE);
-            fail("expecting ArithmeticException");
-        } catch (final ArithmeticException ex) {}
-    }
-    @Test
-    public void testReducedFactory_int_int() {
-        Fraction f = null;
-        
-        // zero
-        f = Fraction.getReducedFraction(0, 1);
-        assertEquals(0, f.getNumerator());
-        assertEquals(1, f.getDenominator());
-        
-        // normal
-        f = Fraction.getReducedFraction(1, 1);
-        assertEquals(1, f.getNumerator());
-        assertEquals(1, f.getDenominator());
-        
-        f = Fraction.getReducedFraction(2, 1);
-        assertEquals(2, f.getNumerator());
-        assertEquals(1, f.getDenominator());
-        
-        // improper
-        f = Fraction.getReducedFraction(22, 7);
-        assertEquals(22, f.getNumerator());
-        assertEquals(7, f.getDenominator());
-        
-        // negatives
-        f = Fraction.getReducedFraction(-6, 10);
-        assertEquals(-3, f.getNumerator());
-        assertEquals(5, f.getDenominator());
-        
-        f = Fraction.getReducedFraction(6, -10);
-        assertEquals(-3, f.getNumerator());
-        assertEquals(5, f.getDenominator());
-        
-        f = Fraction.getReducedFraction(-6, -10);
-        assertEquals(3, f.getNumerator());
-        assertEquals(5, f.getDenominator());
-        
-        // zero denominator
-        try {
-            f = Fraction.getReducedFraction(1, 0);
-            fail("expecting ArithmeticException");
-        } catch (final ArithmeticException ex) {}
-        
-        try {
-            f = Fraction.getReducedFraction(2, 0);
-            fail("expecting ArithmeticException");
-        } catch (final ArithmeticException ex) {}
-        
-        try {
-            f = Fraction.getReducedFraction(-3, 0);
-            fail("expecting ArithmeticException");
-        } catch (final ArithmeticException ex) {}
-
-        // reduced        
-        f = Fraction.getReducedFraction(0, 2);
-        assertEquals(0, f.getNumerator());
-        assertEquals(1, f.getDenominator());
-        
-        f = Fraction.getReducedFraction(2, 2);
-        assertEquals(1, f.getNumerator());
-        assertEquals(1, f.getDenominator());
-        
-        f = Fraction.getReducedFraction(2, 4);
-        assertEquals(1, f.getNumerator());
-        assertEquals(2, f.getDenominator());
-        
-        f = Fraction.getReducedFraction(15, 10);
-        assertEquals(3, f.getNumerator());
-        assertEquals(2, f.getDenominator());
-        
-        f = Fraction.getReducedFraction(121, 22);
-        assertEquals(11, f.getNumerator());
-        assertEquals(2, f.getDenominator());
-        
-        // Extreme values 
-        // OK, can reduce before negating
-        f = Fraction.getReducedFraction(-2, Integer.MIN_VALUE);
-        assertEquals(1, f.getNumerator());
-        assertEquals(-(Integer.MIN_VALUE / 2), f.getDenominator());
-        
-        // Can't reduce, negation will throw
-        try { 
-            f = Fraction.getReducedFraction(-7, Integer.MIN_VALUE);  
-            fail("Expecting ArithmeticException");
-        } catch (final ArithmeticException ex) {}      
-
-        // LANG-662
-        f = Fraction.getReducedFraction(Integer.MIN_VALUE, 2);
-        assertEquals(Integer.MIN_VALUE / 2, f.getNumerator());
-        assertEquals(1, f.getDenominator());
-    }
-
-    @Test
-    public void testFactory_double() {
-        Fraction f = null;
-        
-        try {
-            f = Fraction.getFraction(Double.NaN);
-            fail("expecting ArithmeticException");
-        } catch (final ArithmeticException ex) {}
-        
-        try {
-            f = Fraction.getFraction(Double.POSITIVE_INFINITY);
-            fail("expecting ArithmeticException");
-        } catch (final ArithmeticException ex) {}
-        
-        try {
-            f = Fraction.getFraction(Double.NEGATIVE_INFINITY);
-            fail("expecting ArithmeticException");
-        } catch (final ArithmeticException ex) {}
-        
-        try {
-            f = Fraction.getFraction((double) Integer.MAX_VALUE + 1);
-            fail("expecting ArithmeticException");
-        } catch (final ArithmeticException ex) {}
-        
-        // zero
-        f = Fraction.getFraction(0.0d);
-        assertEquals(0, f.getNumerator());
-        assertEquals(1, f.getDenominator());
-        
-        // one
-        f = Fraction.getFraction(1.0d);
-        assertEquals(1, f.getNumerator());
-        assertEquals(1, f.getDenominator());
-        
-        // one half
-        f = Fraction.getFraction(0.5d);
-        assertEquals(1, f.getNumerator());
-        assertEquals(2, f.getDenominator());
-        
-        // negative
-        f = Fraction.getFraction(-0.875d);
-        assertEquals(-7, f.getNumerator());
-        assertEquals(8, f.getDenominator());
-        
-        // over 1
-        f = Fraction.getFraction(1.25d);
-        assertEquals(5, f.getNumerator());
-        assertEquals(4, f.getDenominator());
-        
-        // two thirds
-        f = Fraction.getFraction(0.66666d);
-        assertEquals(2, f.getNumerator());
-        assertEquals(3, f.getDenominator());
-        
-        // small
-        f = Fraction.getFraction(1.0d/10001d);
-        assertEquals(0, f.getNumerator());
-        assertEquals(1, f.getDenominator());
-        
-        // normal
-        Fraction f2 = null;
-        for (int i = 1; i <= 100; i++) {  // denominator
-            for (int j = 1; j <= i; j++) {  // numerator
-                try {
-                    f = Fraction.getFraction((double) j / (double) i);
-                } catch (final ArithmeticException ex) {
-                    System.err.println(j + " " + i);
-                    throw ex;
-                }
-                f2 = Fraction.getReducedFraction(j, i);
-                assertEquals(f2.getNumerator(), f.getNumerator());
-                assertEquals(f2.getDenominator(), f.getDenominator());
-            }
-        }
-        // save time by skipping some tests!  (
-        for (int i = 1001; i <= 10000; i+=SKIP) {  // denominator
-            for (int j = 1; j <= i; j++) {  // numerator
-                try {
-                    f = Fraction.getFraction((double) j / (double) i);
-                } catch (final ArithmeticException ex) {
-                    System.err.println(j + " " + i);
-                    throw ex;
-                }
-                f2 = Fraction.getReducedFraction(j, i);
-                assertEquals(f2.getNumerator(), f.getNumerator());
-                assertEquals(f2.getDenominator(), f.getDenominator());
-            }
-        }
-    }
-
-    @Test(expected=IllegalArgumentException.class)
-    public void testFactory_String() {
-        Fraction.getFraction(null);
-    }
-    
-    
-    @Test
-    public void testFactory_String_double() {
-        Fraction f = null;
-        
-        f = Fraction.getFraction("0.0");
-        assertEquals(0, f.getNumerator());
-        assertEquals(1, f.getDenominator());
-        
-        f = Fraction.getFraction("0.2");
-        assertEquals(1, f.getNumerator());
-        assertEquals(5, f.getDenominator());
-        
-        f = Fraction.getFraction("0.5");
-        assertEquals(1, f.getNumerator());
-        assertEquals(2, f.getDenominator());
-        
-        f = Fraction.getFraction("0.66666");
-        assertEquals(2, f.getNumerator());
-        assertEquals(3, f.getDenominator());
-        
-        try {
-            f = Fraction.getFraction("2.3R");
-            fail("Expecting NumberFormatException");
-        } catch (final NumberFormatException ex) {}
-        
-        try {
-            f = Fraction.getFraction("2147483648"); // too big
-            fail("Expecting NumberFormatException");
-        } catch (final NumberFormatException ex) {}
-        
-        try {
-            f = Fraction.getFraction(".");
-            fail("Expecting NumberFormatException");
-        } catch (final NumberFormatException ex) {}
-    }
-
-    @Test
-    public void testFactory_String_proper() {
-        Fraction f = null;
-        
-        f = Fraction.getFraction("0 0/1");
-        assertEquals(0, f.getNumerator());
-        assertEquals(1, f.getDenominator());
-        
-        f = Fraction.getFraction("1 1/5");
-        assertEquals(6, f.getNumerator());
-        assertEquals(5, f.getDenominator());
-        
-        f = Fraction.getFraction("7 1/2");
-        assertEquals(15, f.getNumerator());
-        assertEquals(2, f.getDenominator());
-        
-        f = Fraction.getFraction("1 2/4");
-        assertEquals(6, f.getNumerator());
-        assertEquals(4, f.getDenominator());
-        
-        f = Fraction.getFraction("-7 1/2");
-        assertEquals(-15, f.getNumerator());
-        assertEquals(2, f.getDenominator());
-        
-        f = Fraction.getFraction("-1 2/4");
-        assertEquals(-6, f.getNumerator());
-        assertEquals(4, f.getDenominator());
-        
-        try {
-            f = Fraction.getFraction("2 3");
-            fail("expecting NumberFormatException");
-        } catch (final NumberFormatException ex) {}
-        
-        try {
-            f = Fraction.getFraction("a 3");
-            fail("expecting NumberFormatException");
-        } catch (final NumberFormatException ex) {}
-        
-        try {
-            f = Fraction.getFraction("2 b/4");
-            fail("expecting NumberFormatException");
-        } catch (final NumberFormatException ex) {}
-        
-        try {
-            f = Fraction.getFraction("2 ");
-            fail("expecting NumberFormatException");
-        } catch (final NumberFormatException ex) {}
-
-        try {
-            f = Fraction.getFraction(" 3");
-            fail("expecting NumberFormatException");
-        } catch (final NumberFormatException ex) {}
-        
-        try {
-            f = Fraction.getFraction(" ");
-            fail("expecting NumberFormatException");
-        } catch (final NumberFormatException ex) {}
-    }
-
-    @Test
-    public void testFactory_String_improper() {
-        Fraction f = null;
-        
-        f = Fraction.getFraction("0/1");
-        assertEquals(0, f.getNumerator());
-        assertEquals(1, f.getDenominator());
-        
-        f = Fraction.getFraction("1/5");
-        assertEquals(1, f.getNumerator());
-        assertEquals(5, f.getDenominator());
-        
-        f = Fraction.getFraction("1/2");
-        assertEquals(1, f.getNumerator());
-        assertEquals(2, f.getDenominator());
-        
-        f = Fraction.getFraction("2/3");
-        assertEquals(2, f.getNumerator());
-        assertEquals(3, f.getDenominator());
-        
-        f = Fraction.getFraction("7/3");
-        assertEquals(7, f.getNumerator());
-        assertEquals(3, f.getDenominator());
-        
-        f = Fraction.getFraction("2/4");
-        assertEquals(2, f.getNumerator());
-        assertEquals(4, f.getDenominator());
-        
-        try {
-            f = Fraction.getFraction("2/d");
-            fail("expecting NumberFormatException");
-        } catch (final NumberFormatException ex) {}
-        
-        try {
-            f = Fraction.getFraction("2e/3");
-            fail("expecting NumberFormatException");
-        } catch (final NumberFormatException ex) {}
-        
-        try {
-            f = Fraction.getFraction("2/");
-            fail("expecting NumberFormatException");
-        } catch (final NumberFormatException ex) {}
-        
-        try {
-            f = Fraction.getFraction("/");
-            fail("expecting NumberFormatException");
-        } catch (final NumberFormatException ex) {}
-    }
-
-    @Test
-    public void testGets() {
-        Fraction f = null;
-        
-        f = Fraction.getFraction(3, 5, 6);
-        assertEquals(23, f.getNumerator());
-        assertEquals(3, f.getProperWhole());
-        assertEquals(5, f.getProperNumerator());
-        assertEquals(6, f.getDenominator());
-        
-        f = Fraction.getFraction(-3, 5, 6);
-        assertEquals(-23, f.getNumerator());
-        assertEquals(-3, f.getProperWhole());
-        assertEquals(5, f.getProperNumerator());
-        assertEquals(6, f.getDenominator());
-
-        f = Fraction.getFraction(Integer.MIN_VALUE, 0, 1);
-        assertEquals(Integer.MIN_VALUE, f.getNumerator());
-        assertEquals(Integer.MIN_VALUE, f.getProperWhole());
-        assertEquals(0, f.getProperNumerator());
-        assertEquals(1, f.getDenominator());
-    }
-            
-    @Test
-    public void testConversions() {
-        Fraction f = null;
-        
-        f = Fraction.getFraction(3, 7, 8);
-        assertEquals(3, f.intValue());
-        assertEquals(3L, f.longValue());
-        assertEquals(3.875f, f.floatValue(), 0.00001f);
-        assertEquals(3.875d, f.doubleValue(), 0.00001d);
-    }
-    
-    @Test
-    public void testReduce() {
-        Fraction f = null;
-        
-        f = Fraction.getFraction(50, 75);
-        Fraction result = f.reduce();
-        assertEquals(2, result.getNumerator());
-        assertEquals(3, result.getDenominator());
-
-        f = Fraction.getFraction(-2, -3);
-        result = f.reduce();
-        assertEquals(2, result.getNumerator());
-        assertEquals(3, result.getDenominator());
-
-        f = Fraction.getFraction(2, -3);
-        result = f.reduce();
-        assertEquals(-2, result.getNumerator());
-        assertEquals(3, result.getDenominator());
-
-        f = Fraction.getFraction(-2, 3);
-        result = f.reduce();
-        assertEquals(-2, result.getNumerator());
-        assertEquals(3, result.getDenominator());
-        assertSame(f, result);
-
-        f = Fraction.getFraction(2, 3);
-        result = f.reduce();
-        assertEquals(2, result.getNumerator());
-        assertEquals(3, result.getDenominator());
-        assertSame(f, result);
-
-        f = Fraction.getFraction(0, 1);
-        result = f.reduce();
-        assertEquals(0, result.getNumerator());
-        assertEquals(1, result.getDenominator());
-        assertSame(f, result);
-
-        f = Fraction.getFraction(0, 100);
-        result = f.reduce();
-        assertEquals(0, result.getNumerator());
-        assertEquals(1, result.getDenominator());
-        assertSame(result, Fraction.ZERO);
-
-        f = Fraction.getFraction(Integer.MIN_VALUE, 2);
-        result = f.reduce();
-        assertEquals(Integer.MIN_VALUE / 2, result.getNumerator());
-        assertEquals(1, result.getDenominator());
-    }
-    
-    @Test
-    public void testInvert() {
-        Fraction f = null;
-        
-        f = Fraction.getFraction(50, 75);
-        f = f.invert();
-        assertEquals(75, f.getNumerator());
-        assertEquals(50, f.getDenominator());
-        
-        f = Fraction.getFraction(4, 3);
-        f = f.invert();
-        assertEquals(3, f.getNumerator());
-        assertEquals(4, f.getDenominator());
-        
-        f = Fraction.getFraction(-15, 47);
-        f = f.invert();
-        assertEquals(-47, f.getNumerator());
-        assertEquals(15, f.getDenominator());
-        
-        f = Fraction.getFraction(0, 3);
-        try {
-            f = f.invert();
-            fail("expecting ArithmeticException");
-        } catch (final ArithmeticException ex) {}
-
-        // large values
-        f = Fraction.getFraction(Integer.MIN_VALUE, 1);
-        try {
-            f = f.invert();
-            fail("expecting ArithmeticException");
-        } catch (final ArithmeticException ex) {}
-
-        f = Fraction.getFraction(Integer.MAX_VALUE, 1);
-        f = f.invert();
-        assertEquals(1, f.getNumerator());
-        assertEquals(Integer.MAX_VALUE, f.getDenominator());
-    }
-    
-    @Test
-    public void testNegate() {
-        Fraction f = null;
-        
-        f = Fraction.getFraction(50, 75);
-        f = f.negate();
-        assertEquals(-50, f.getNumerator());
-        assertEquals(75, f.getDenominator());
-        
-        f = Fraction.getFraction(-50, 75);
-        f = f.negate();
-        assertEquals(50, f.getNumerator());
-        assertEquals(75, f.getDenominator());
-
-        // large values
-        f = Fraction.getFraction(Integer.MAX_VALUE-1, Integer.MAX_VALUE);
-        f = f.negate();
-        assertEquals(Integer.MIN_VALUE+2, f.getNumerator());
-        assertEquals(Integer.MAX_VALUE, f.getDenominator());
-
-        f = Fraction.getFraction(Integer.MIN_VALUE, 1);
-        try {
-            f = f.negate();
-            fail("expecting ArithmeticException");
-        } catch (final ArithmeticException ex) {}
-    }
-    
-    @Test
-    public void testAbs() {
-        Fraction f = null;
-        
-        f = Fraction.getFraction(50, 75);
-        f = f.abs();
-        assertEquals(50, f.getNumerator());
-        assertEquals(75, f.getDenominator());
-        
-        f = Fraction.getFraction(-50, 75);
-        f = f.abs();
-        assertEquals(50, f.getNumerator());
-        assertEquals(75, f.getDenominator());
-
-        f = Fraction.getFraction(Integer.MAX_VALUE, 1);
-        f = f.abs();
-        assertEquals(Integer.MAX_VALUE, f.getNumerator());
-        assertEquals(1, f.getDenominator());
-
-        f = Fraction.getFraction(Integer.MAX_VALUE, -1);
-        f = f.abs();
-        assertEquals(Integer.MAX_VALUE, f.getNumerator());
-        assertEquals(1, f.getDenominator());
-
-        f = Fraction.getFraction(Integer.MIN_VALUE, 1);
-        try {
-            f = f.abs();
-            fail("expecting ArithmeticException");
-        } catch (final ArithmeticException ex) {}
-    }
-    
-    @Test
-    public void testPow() {
-        Fraction f = null;
-        
-        f = Fraction.getFraction(3, 5);
-        assertEquals(Fraction.ONE, f.pow(0));
-        
-        f = Fraction.getFraction(3, 5);
-        assertSame(f, f.pow(1));
-        assertEquals(f, f.pow(1));
-
-        f = Fraction.getFraction(3, 5);
-        f = f.pow(2);
-        assertEquals(9, f.getNumerator());
-        assertEquals(25, f.getDenominator());
-        
-        f = Fraction.getFraction(3, 5);
-        f = f.pow(3);
-        assertEquals(27, f.getNumerator());
-        assertEquals(125, f.getDenominator());
-        
-        f = Fraction.getFraction(3, 5);
-        f = f.pow(-1);
-        assertEquals(5, f.getNumerator());
-        assertEquals(3, f.getDenominator());
-        
-        f = Fraction.getFraction(3, 5);
-        f = f.pow(-2);
-        assertEquals(25, f.getNumerator());
-        assertEquals(9, f.getDenominator());
-        
-        // check unreduced fractions stay that way.
-        f = Fraction.getFraction(6, 10);
-        assertEquals(Fraction.ONE, f.pow(0));
-        
-        f = Fraction.getFraction(6, 10);
-        assertEquals(f, f.pow(1));
-        assertFalse(f.pow(1).equals(Fraction.getFraction(3,5)));
-
-        f = Fraction.getFraction(6, 10);
-        f = f.pow(2);
-        assertEquals(9, f.getNumerator());
-        assertEquals(25, f.getDenominator());
-        
-        f = Fraction.getFraction(6, 10);
-        f = f.pow(3);
-        assertEquals(27, f.getNumerator());
-        assertEquals(125, f.getDenominator());
-        
-        f = Fraction.getFraction(6, 10);
-        f = f.pow(-1);
-        assertEquals(10, f.getNumerator());
-        assertEquals(6, f.getDenominator());
-        
-        f = Fraction.getFraction(6, 10);
-        f = f.pow(-2);
-        assertEquals(25, f.getNumerator());
-        assertEquals(9, f.getDenominator());
-        
-        // zero to any positive power is still zero.
-        f = Fraction.getFraction(0, 1231);
-        f = f.pow(1);
-        assertTrue(0==f.compareTo(Fraction.ZERO));
-        assertEquals(0, f.getNumerator());
-        assertEquals(1231, f.getDenominator());
-        f = f.pow(2);
-        assertTrue(0==f.compareTo(Fraction.ZERO));
-        assertEquals(0, f.getNumerator());
-        assertEquals(1, f.getDenominator());
-
-        // zero to negative powers should throw an exception
-        try {
-            f = f.pow(-1);
-            fail("expecting ArithmeticException");
-        } catch (final ArithmeticException ex) {}
-        try {
-            f = f.pow(Integer.MIN_VALUE);
-            fail("expecting ArithmeticException");
-        } catch (final ArithmeticException ex) {}
-
-        // one to any power is still one.
-        f = Fraction.getFraction(1, 1);
-        f = f.pow(0);
-        assertEquals(f, Fraction.ONE);
-        f = f.pow(1);
-        assertEquals(f, Fraction.ONE);
-        f = f.pow(-1);
-        assertEquals(f, Fraction.ONE);
-        f = f.pow(Integer.MAX_VALUE);
-        assertEquals(f, Fraction.ONE);
-        f = f.pow(Integer.MIN_VALUE);
-        assertEquals(f, Fraction.ONE);
-
-        f = Fraction.getFraction(Integer.MAX_VALUE, 1);
-        try {
-            f = f.pow(2);
-            fail("expecting ArithmeticException");
-        } catch (final ArithmeticException ex) {}
-
-        // Numerator growing too negative during the pow operation.
-        f = Fraction.getFraction(Integer.MIN_VALUE, 1);
-        try {
-            f = f.pow(3);
-            fail("expecting ArithmeticException");
-        } catch (final ArithmeticException ex) {}
-
-        f = Fraction.getFraction(65536, 1);
-        try {
-            f = f.pow(2);
-            fail("expecting ArithmeticException");
-        } catch (final ArithmeticException ex) {}
-    }
-    
-    @Test
-    public void testAdd() {
-        Fraction f = null;
-        Fraction f1 = null;
-        Fraction f2 = null;
-        
-        f1 = Fraction.getFraction(3, 5);
-        f2 = Fraction.getFraction(1, 5);
-        f = f1.add(f2);
-        assertEquals(4, f.getNumerator());
-        assertEquals(5, f.getDenominator());
-        
-        f1 = Fraction.getFraction(3, 5);
-        f2 = Fraction.getFraction(2, 5);
-        f = f1.add(f2);
-        assertEquals(1, f.getNumerator());
-        assertEquals(1, f.getDenominator());
-        
-        f1 = Fraction.getFraction(3, 5);
-        f2 = Fraction.getFraction(3, 5);
-        f = f1.add(f2);
-        assertEquals(6, f.getNumerator());
-        assertEquals(5, f.getDenominator());
-        
-        f1 = Fraction.getFraction(3, 5);
-        f2 = Fraction.getFraction(-4, 5);
-        f = f1.add(f2);
-        assertEquals(-1, f.getNumerator());
-        assertEquals(5, f.getDenominator());
-        
-        f1 = Fraction.getFraction(Integer.MAX_VALUE - 1, 1);
-        f2 = Fraction.ONE;
-        f = f1.add(f2);
-        assertEquals(Integer.MAX_VALUE, f.getNumerator());
-        assertEquals(1, f.getDenominator());
-        
-        f1 = Fraction.getFraction(3, 5);
-        f2 = Fraction.getFraction(1, 2);
-        f = f1.add(f2);
-        assertEquals(11, f.getNumerator());
-        assertEquals(10, f.getDenominator());
-        
-        f1 = Fraction.getFraction(3, 8);
-        f2 = Fraction.getFraction(1, 6);
-        f = f1.add(f2);
-        assertEquals(13, f.getNumerator());
-        assertEquals(24, f.getDenominator());
-        
-        f1 = Fraction.getFraction(0, 5);
-        f2 = Fraction.getFraction(1, 5);
-        f = f1.add(f2);
-        assertSame(f2, f);
-        f = f2.add(f1);
-        assertSame(f2, f);
-        
-        f1 = Fraction.getFraction(-1, 13*13*2*2);
-        f2 = Fraction.getFraction(-2, 13*17*2);
-        f = f1.add(f2);
-        assertEquals(13*13*17*2*2, f.getDenominator());
-        assertEquals(-17 - 2*13*2, f.getNumerator());
-        
-        try {
-            f.add(null);
-            fail("expecting IllegalArgumentException");
-        } catch (final IllegalArgumentException ex) {}
-        
-        // if this fraction is added naively, it will overflow.
-        // check that it doesn't.
-        f1 = Fraction.getFraction(1,32768*3);
-        f2 = Fraction.getFraction(1,59049);
-        f = f1.add(f2);
-        assertEquals(52451, f.getNumerator());
-        assertEquals(1934917632, f.getDenominator());
-
-        f1 = Fraction.getFraction(Integer.MIN_VALUE, 3);
-        f2 = Fraction.ONE_THIRD;
-        f = f1.add(f2);
-        assertEquals(Integer.MIN_VALUE+1, f.getNumerator());
-        assertEquals(3, f.getDenominator());
-        
-        f1 = Fraction.getFraction(Integer.MAX_VALUE - 1, 1);
-        f2 = Fraction.ONE;
-        f = f1.add(f2);
-        assertEquals(Integer.MAX_VALUE, f.getNumerator());
-        assertEquals(1, f.getDenominator());
-        
-        try {
-            f = f.add(Fraction.ONE); // should overflow
-            fail("expecting ArithmeticException but got: " + f.toString());
-        } catch (final ArithmeticException ex) {}
-        
-        // denominator should not be a multiple of 2 or 3 to trigger overflow
-        f1 = Fraction.getFraction(Integer.MIN_VALUE, 5);
-        f2 = Fraction.getFraction(-1,5);
-        try {
-            f = f1.add(f2); // should overflow
-            fail("expecting ArithmeticException but got: " + f.toString());
-        } catch (final ArithmeticException ex) {}
-        
-        try {
-            f= Fraction.getFraction(-Integer.MAX_VALUE, 1);
-            f = f.add(f);
-            fail("expecting ArithmeticException");
-        } catch (final ArithmeticException ex) {}
-            
-        try {
-            f= Fraction.getFraction(-Integer.MAX_VALUE, 1);
-            f = f.add(f);
-            fail("expecting ArithmeticException");
-        } catch (final ArithmeticException ex) {}
-            
-        f1 = Fraction.getFraction(3,327680);
-        f2 = Fraction.getFraction(2,59049);
-        try {
-            f = f1.add(f2); // should overflow
-            fail("expecting ArithmeticException but got: " + f.toString());
-        } catch (final ArithmeticException ex) {}
-    }
-            
-    @Test
-    public void testSubtract() {
-        Fraction f = null;
-        Fraction f1 = null;
-        Fraction f2 = null;
-        
-        f1 = Fraction.getFraction(3, 5);
-        f2 = Fraction.getFraction(1, 5);
-        f = f1.subtract(f2);
-        assertEquals(2, f.getNumerator());
-        assertEquals(5, f.getDenominator());
-        
-        f1 = Fraction.getFraction(7, 5);
-        f2 = Fraction.getFraction(2, 5);
-        f = f1.subtract(f2);
-        assertEquals(1, f.getNumerator());
-        assertEquals(1, f.getDenominator());
-        
-        f1 = Fraction.getFraction(3, 5);
-        f2 = Fraction.getFraction(3, 5);
-        f = f1.subtract(f2);
-        assertEquals(0, f.getNumerator());
-        assertEquals(1, f.getDenominator());
-        
-        f1 = Fraction.getFraction(3, 5);
-        f2 = Fraction.getFraction(-4, 5);
-        f = f1.subtract(f2);
-        assertEquals(7, f.getNumerator());
-        assertEquals(5, f.getDenominator());
-        
-        f1 = Fraction.getFraction(0, 5);
-        f2 = Fraction.getFraction(4, 5);
-        f = f1.subtract(f2);
-        assertEquals(-4, f.getNumerator());
-        assertEquals(5, f.getDenominator());
-        
-        f1 = Fraction.getFraction(0, 5);
-        f2 = Fraction.getFraction(-4, 5);
-        f = f1.subtract(f2);
-        assertEquals(4, f.getNumerator());
-        assertEquals(5, f.getDenominator());
-        
-        f1 = Fraction.getFraction(3, 5);
-        f2 = Fraction.getFraction(1, 2);
-        f = f1.subtract(f2);
-        assertEquals(1, f.getNumerator());
-        assertEquals(10, f.getDenominator());
-        
-        f1 = Fraction.getFraction(0, 5);
-        f2 = Fraction.getFraction(1, 5);
-        f = f2.subtract(f1);
-        assertSame(f2, f);
-        
-        try {
-            f.subtract(null);
-            fail("expecting IllegalArgumentException");
-        } catch (final IllegalArgumentException ex) {}
-        
-        // if this fraction is subtracted naively, it will overflow.
-        // check that it doesn't.
-        f1 = Fraction.getFraction(1,32768*3);
-        f2 = Fraction.getFraction(1,59049);
-        f = f1.subtract(f2);
-        assertEquals(-13085, f.getNumerator());
-        assertEquals(1934917632, f.getDenominator());
-
-        f1 = Fraction.getFraction(Integer.MIN_VALUE, 3);
-        f2 = Fraction.ONE_THIRD.negate();
-        f = f1.subtract(f2);
-        assertEquals(Integer.MIN_VALUE+1, f.getNumerator());
-        assertEquals(3, f.getDenominator());
-        
-        f1 = Fraction.getFraction(Integer.MAX_VALUE, 1);
-        f2 = Fraction.ONE;
-        f = f1.subtract(f2);
-        assertEquals(Integer.MAX_VALUE-1, f.getNumerator());
-        assertEquals(1, f.getDenominator());
-
-        try {
-            f1 = Fraction.getFraction(1, Integer.MAX_VALUE);
-            f2 = Fraction.getFraction(1, Integer.MAX_VALUE - 1);
-            f = f1.subtract(f2);
-            fail("expecting ArithmeticException");  //should overflow
-        } catch (final ArithmeticException ex) {}
-            
-        // denominator should not be a multiple of 2 or 3 to trigger overflow
-        f1 = Fraction.getFraction(Integer.MIN_VALUE, 5);
-        f2 = Fraction.getFraction(1,5);
-        try {
-            f = f1.subtract(f2); // should overflow
-            fail("expecting ArithmeticException but got: " + f.toString());
-        } catch (final ArithmeticException ex) {}
-        
-        try {
-            f= Fraction.getFraction(Integer.MIN_VALUE, 1);
-            f = f.subtract(Fraction.ONE);
-            fail("expecting ArithmeticException");
-        } catch (final ArithmeticException ex) {}
-            
-        try {
-            f= Fraction.getFraction(Integer.MAX_VALUE, 1);
-            f = f.subtract(Fraction.ONE.negate());
-            fail("expecting ArithmeticException");
-        } catch (final ArithmeticException ex) {}
-            
-        f1 = Fraction.getFraction(3,327680);
-        f2 = Fraction.getFraction(2,59049);
-        try {
-            f = f1.subtract(f2); // should overflow
-            fail("expecting ArithmeticException but got: " + f.toString());
-        } catch (final ArithmeticException ex) {}
-    }
-            
-    @Test
-    public void testMultiply() {
-        Fraction f = null;
-        Fraction f1 = null;
-        Fraction f2 = null;
-        
-        f1 = Fraction.getFraction(3, 5);
-        f2 = Fraction.getFraction(2, 5);
-        f = f1.multiplyBy(f2);
-        assertEquals(6, f.getNumerator());
-        assertEquals(25, f.getDenominator());
-        
-        f1 = Fraction.getFraction(6, 10);
-        f2 = Fraction.getFraction(6, 10);
-        f = f1.multiplyBy(f2);
-        assertEquals(9, f.getNumerator());
-        assertEquals(25, f.getDenominator());
-        f = f.multiplyBy(f2);
-        assertEquals(27, f.getNumerator());
-        assertEquals(125, f.getDenominator());
-        
-        f1 = Fraction.getFraction(3, 5);
-        f2 = Fraction.getFraction(-2, 5);
-        f = f1.multiplyBy(f2);
-        assertEquals(-6, f.getNumerator());
-        assertEquals(25, f.getDenominator());
-        
-        f1 = Fraction.getFraction(-3, 5);
-        f2 = Fraction.getFraction(-2, 5);
-        f = f1.multiplyBy(f2);
-        assertEquals(6, f.getNumerator());
-        assertEquals(25, f.getDenominator());
-        
-        
-        f1 = Fraction.getFraction(0, 5);
-        f2 = Fraction.getFraction(2, 7);
-        f = f1.multiplyBy(f2);
-        assertSame(Fraction.ZERO, f);
-        
-        f1 = Fraction.getFraction(2, 7);
-        f2 = Fraction.ONE;
-        f = f1.multiplyBy(f2);
-        assertEquals(2, f.getNumerator());
-        assertEquals(7, f.getDenominator());
-        
-        f1 = Fraction.getFraction(Integer.MAX_VALUE, 1);
-        f2 = Fraction.getFraction(Integer.MIN_VALUE, Integer.MAX_VALUE);
-        f = f1.multiplyBy(f2);
-        assertEquals(Integer.MIN_VALUE, f.getNumerator());
-        assertEquals(1, f.getDenominator());
-
-        try {
-            f.multiplyBy(null);
-            fail("expecting IllegalArgumentException");
-        } catch (final IllegalArgumentException ex) {}
-        
-        try {
-            f1 = Fraction.getFraction(1, Integer.MAX_VALUE);
-            f = f1.multiplyBy(f1);  // should overflow
-            fail("expecting ArithmeticException");
-        } catch (final ArithmeticException ex) {}
-            
-        try {
-            f1 = Fraction.getFraction(1, -Integer.MAX_VALUE);
-            f = f1.multiplyBy(f1);  // should overflow
-            fail("expecting ArithmeticException");
-        } catch (final ArithmeticException ex) {}
-    }
-            
-    @Test
-    public void testDivide() {
-        Fraction f = null;
-        Fraction f1 = null;
-        Fraction f2 = null;
-        
-        f1 = Fraction.getFraction(3, 5);
-        f2 = Fraction.getFraction(2, 5);
-        f = f1.divideBy(f2);
-        assertEquals(3, f.getNumerator());
-        assertEquals(2, f.getDenominator());
-        
-        f1 = Fraction.getFraction(3, 5);
-        f2 = Fraction.ZERO;
-        try {
-            f = f1.divideBy(f2);
-            fail("expecting ArithmeticException");
-        } catch (final ArithmeticException ex) {}
-        
-        f1 = Fraction.getFraction(0, 5);
-        f2 = Fraction.getFraction(2, 7);
-        f = f1.divideBy(f2);
-        assertSame(Fraction.ZERO, f);
-        
-        f1 = Fraction.getFraction(2, 7);
-        f2 = Fraction.ONE;
-        f = f1.divideBy(f2);
-        assertEquals(2, f.getNumerator());
-        assertEquals(7, f.getDenominator());
-        
-        f1 = Fraction.getFraction(1, Integer.MAX_VALUE);
-        f = f1.divideBy(f1);  
-        assertEquals(1, f.getNumerator());
-        assertEquals(1, f.getDenominator());
-        
-        f1 = Fraction.getFraction(Integer.MIN_VALUE, Integer.MAX_VALUE);
-        f2 = Fraction.getFraction(1, Integer.MAX_VALUE);
-        f = f1.divideBy(f2);
-        assertEquals(Integer.MIN_VALUE, f.getNumerator());
-        assertEquals(1, f.getDenominator());
-
-        try {
-            f.divideBy(null);
-            fail("IllegalArgumentException");
-        } catch (final IllegalArgumentException ex) {}
-        
-        try {
-            f1 = Fraction.getFraction(1, Integer.MAX_VALUE);
-            f = f1.divideBy(f1.invert());  // should overflow
-            fail("expecting ArithmeticException");
-        } catch (final ArithmeticException ex) {}
-        try {
-            f1 = Fraction.getFraction(1, -Integer.MAX_VALUE);
-            f = f1.divideBy(f1.invert());  // should overflow
-            fail("expecting ArithmeticException");
-        } catch (final ArithmeticException ex) {}
-    }
-            
-    @Test
-    public void testEquals() {
-        Fraction f1 = null;
-        Fraction f2 = null;
-        
-        f1 = Fraction.getFraction(3, 5);
-        assertFalse(f1.equals(null));
-        assertFalse(f1.equals(new Object()));
-        assertFalse(f1.equals(Integer.valueOf(6)));
-        
-        f1 = Fraction.getFraction(3, 5);
-        f2 = Fraction.getFraction(2, 5);
-        assertFalse(f1.equals(f2));
-        assertTrue(f1.equals(f1));
-        assertTrue(f2.equals(f2));
-        
-        f2 = Fraction.getFraction(3, 5);
-        assertTrue(f1.equals(f2));
-        
-        f2 = Fraction.getFraction(6, 10);
-        assertFalse(f1.equals(f2));
-    }
-    
-    @Test
-    public void testHashCode() {
-        final Fraction f1 = Fraction.getFraction(3, 5);
-        Fraction f2 = Fraction.getFraction(3, 5);
-        
-        assertTrue(f1.hashCode() == f2.hashCode());
-        
-        f2 = Fraction.getFraction(2, 5);
-        assertTrue(f1.hashCode() != f2.hashCode());
-        
-        f2 = Fraction.getFraction(6, 10);
-        assertTrue(f1.hashCode() != f2.hashCode());
-    }
-    
-    @Test
-    public void testCompareTo() {
-        Fraction f1 = null;
-        Fraction f2 = null;
-        
-        f1 = Fraction.getFraction(3, 5);
-        assertTrue(f1.compareTo(f1) == 0);
-        
-        try {
-            f1.compareTo(null);
-            fail("expecting NullPointerException");
-        } catch (final NullPointerException ex) {}
-        
-        f2 = Fraction.getFraction(2, 5);
-        assertTrue(f1.compareTo(f2) > 0);
-        assertTrue(f2.compareTo(f2) == 0);
-        
-        f2 = Fraction.getFraction(4, 5);
-        assertTrue(f1.compareTo(f2) < 0);
-        assertTrue(f2.compareTo(f2) == 0);
-        
-        f2 = Fraction.getFraction(3, 5);
-        assertTrue(f1.compareTo(f2) == 0);
-        assertTrue(f2.compareTo(f2) == 0);
-        
-        f2 = Fraction.getFraction(6, 10);
-        assertTrue(f1.compareTo(f2) == 0);
-        assertTrue(f2.compareTo(f2) == 0);
-
-        f2 = Fraction.getFraction(-1, 1, Integer.MAX_VALUE);
-        assertTrue(f1.compareTo(f2) > 0);
-        assertTrue(f2.compareTo(f2) == 0);
-
-    }
-    
-    @Test
-    public void testToString() {
-        Fraction f = null;
-
-        f = Fraction.getFraction(3, 5);
-        final String str = f.toString();
-        assertEquals("3/5", str);
-        assertSame(str, f.toString());
-        
-        f = Fraction.getFraction(7, 5);
-        assertEquals("7/5", f.toString());        
-        
-        f = Fraction.getFraction(4, 2);
-        assertEquals("4/2", f.toString());        
-        
-        f = Fraction.getFraction(0, 2);
-        assertEquals("0/2", f.toString());        
-        
-        f = Fraction.getFraction(2, 2);
-        assertEquals("2/2", f.toString());        
-
-        f = Fraction.getFraction(Integer.MIN_VALUE, 0, 1);
-        assertEquals("-2147483648/1", f.toString());        
-
-        f = Fraction.getFraction(-1, 1, Integer.MAX_VALUE);
-        assertEquals("-2147483648/2147483647", f.toString());
-    }
-    
-    @Test
-    public void testToProperString() {
-        Fraction f = null;
-
-        f = Fraction.getFraction(3, 5);
-        final String str = f.toProperString();
-        assertEquals("3/5", str);
-        assertSame(str, f.toProperString());
-        
-        f = Fraction.getFraction(7, 5);
-        assertEquals("1 2/5", f.toProperString());        
-        
-        f = Fraction.getFraction(14, 10);
-        assertEquals("1 4/10", f.toProperString());        
-        
-        f = Fraction.getFraction(4, 2);
-        assertEquals("2", f.toProperString());        
-        
-        f = Fraction.getFraction(0, 2);
-        assertEquals("0", f.toProperString());        
-        
-        f = Fraction.getFraction(2, 2);
-        assertEquals("1", f.toProperString());        
-        
-        f = Fraction.getFraction(-7, 5);
-        assertEquals("-1 2/5", f.toProperString());        
-
-        f = Fraction.getFraction(Integer.MIN_VALUE, 0, 1);
-        assertEquals("-2147483648", f.toProperString());        
-
-        f = Fraction.getFraction(-1, 1, Integer.MAX_VALUE);
-        assertEquals("-1 1/2147483647", f.toProperString());
-
-        assertEquals("-1", Fraction.getFraction(-1).toProperString());
-    }
-}
diff --git a/lang/src/test/java/org/apache/commons/lang3/math/IEEE754rUtilsTest.java b/lang/src/test/java/org/apache/commons/lang3/math/IEEE754rUtilsTest.java
deleted file mode 100644
index c3dc66f..0000000
--- a/lang/src/test/java/org/apache/commons/lang3/math/IEEE754rUtilsTest.java
+++ /dev/null
@@ -1,107 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- * 
- *      http://www.apache.org/licenses/LICENSE-2.0
- * 
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.commons.lang3.math;
-
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertTrue;
-import static org.junit.Assert.fail;
-
-import org.junit.Test;
-
-/**
- * Unit tests {@link org.apache.commons.lang3.math.IEEE754rUtils}.
- *
- * @version $Id$
- */
-public class IEEE754rUtilsTest  {
-
-    @Test
-    public void testLang381() {
-        assertEquals(1.2, IEEE754rUtils.min(1.2, 2.5, Double.NaN), 0.01);
-        assertEquals(2.5, IEEE754rUtils.max(1.2, 2.5, Double.NaN), 0.01);
-        assertTrue(Double.isNaN(IEEE754rUtils.max(Double.NaN, Double.NaN, Double.NaN)));
-        assertEquals(1.2f, IEEE754rUtils.min(1.2f, 2.5f, Float.NaN), 0.01);
-        assertEquals(2.5f, IEEE754rUtils.max(1.2f, 2.5f, Float.NaN), 0.01);
-        assertTrue(Float.isNaN(IEEE754rUtils.max(Float.NaN, Float.NaN, Float.NaN)));
-
-        final double[] a = new double[] { 1.2, Double.NaN, 3.7, 27.0, 42.0, Double.NaN };
-        assertEquals(42.0, IEEE754rUtils.max(a), 0.01);
-        assertEquals(1.2, IEEE754rUtils.min(a), 0.01);
-
-        final double[] b = new double[] { Double.NaN, 1.2, Double.NaN, 3.7, 27.0, 42.0, Double.NaN };
-        assertEquals(42.0, IEEE754rUtils.max(b), 0.01);
-        assertEquals(1.2, IEEE754rUtils.min(b), 0.01);
-
-        final float[] aF = new float[] { 1.2f, Float.NaN, 3.7f, 27.0f, 42.0f, Float.NaN };
-        assertEquals(1.2f, IEEE754rUtils.min(aF), 0.01);
-        assertEquals(42.0f, IEEE754rUtils.max(aF), 0.01);
-
-        final float[] bF = new float[] { Float.NaN, 1.2f, Float.NaN, 3.7f, 27.0f, 42.0f, Float.NaN };
-        assertEquals(1.2f, IEEE754rUtils.min(bF), 0.01);
-        assertEquals(42.0f, IEEE754rUtils.max(bF), 0.01);
-    }
-
-    @Test
-    public void testEnforceExceptions() {
-        try {
-            IEEE754rUtils.min( (float[]) null);
-            fail("IllegalArgumentException expected for null input");
-        } catch(final IllegalArgumentException iae) { /* expected */ }
-
-        try {
-            IEEE754rUtils.min(new float[0]);
-            fail("IllegalArgumentException expected for empty input");
-        } catch(final IllegalArgumentException iae) { /* expected */ }
-
-        try {
-            IEEE754rUtils.max( (float[]) null);
-            fail("IllegalArgumentException expected for null input");
-        } catch(final IllegalArgumentException iae) { /* expected */ }
-
-        try {
-            IEEE754rUtils.max(new float[0]);
-            fail("IllegalArgumentException expected for empty input");
-        } catch(final IllegalArgumentException iae) { /* expected */ }
-
-        try {
-            IEEE754rUtils.min( (double[]) null);
-            fail("IllegalArgumentException expected for null input");
-        } catch(final IllegalArgumentException iae) { /* expected */ }
-
-        try {
-            IEEE754rUtils.min(new double[0]);
-            fail("IllegalArgumentException expected for empty input");
-        } catch(final IllegalArgumentException iae) { /* expected */ }
-
-        try {
-            IEEE754rUtils.max( (double[]) null);
-            fail("IllegalArgumentException expected for null input");
-        } catch(final IllegalArgumentException iae) { /* expected */ }
-
-        try {
-            IEEE754rUtils.max(new double[0]);
-            fail("IllegalArgumentException expected for empty input");
-        } catch(final IllegalArgumentException iae) { /* expected */ }
-
-    }
-
-    @Test
-    public void testConstructorExists() {
-        new IEEE754rUtils();
-    }
-    
-}
diff --git a/lang/src/test/java/org/apache/commons/lang3/math/NumberUtilsTest.java b/lang/src/test/java/org/apache/commons/lang3/math/NumberUtilsTest.java
deleted file mode 100644
index 132d71e..0000000
--- a/lang/src/test/java/org/apache/commons/lang3/math/NumberUtilsTest.java
+++ /dev/null
@@ -1,1405 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.commons.lang3.math;
-
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertFalse;
-import static org.junit.Assert.assertNotNull;
-import static org.junit.Assert.assertTrue;
-import static org.junit.Assert.fail;
-
-import java.lang.reflect.Constructor;
-import java.lang.reflect.Modifier;
-import java.math.BigDecimal;
-import java.math.BigInteger;
-
-import org.junit.Test;
-
-/**
- * Unit tests {@link org.apache.commons.lang3.math.NumberUtils}.
- *
- * @version $Id$
- */
-public class NumberUtilsTest {
-
-    //-----------------------------------------------------------------------
-    @Test
-    public void testConstructor() {
-        assertNotNull(new NumberUtils());
-        final Constructor<?>[] cons = NumberUtils.class.getDeclaredConstructors();
-        assertEquals(1, cons.length);
-        assertTrue(Modifier.isPublic(cons[0].getModifiers()));
-        assertTrue(Modifier.isPublic(NumberUtils.class.getModifiers()));
-        assertFalse(Modifier.isFinal(NumberUtils.class.getModifiers()));
-    }
-
-    //---------------------------------------------------------------------
-
-    /**
-     * Test for {@link NumberUtils#toInt(String)}.
-     */
-    @Test
-    public void testToIntString() {
-        assertTrue("toInt(String) 1 failed", NumberUtils.toInt("12345") == 12345);
-        assertTrue("toInt(String) 2 failed", NumberUtils.toInt("abc") == 0);
-        assertTrue("toInt(empty) failed", NumberUtils.toInt("") == 0);
-        assertTrue("toInt(null) failed", NumberUtils.toInt(null) == 0);
-    }
-
-    /**
-     * Test for {@link NumberUtils#toInt(String, int)}.
-     */
-    @Test
-    public void testToIntStringI() {
-        assertTrue("toInt(String,int) 1 failed", NumberUtils.toInt("12345", 5) == 12345);
-        assertTrue("toInt(String,int) 2 failed", NumberUtils.toInt("1234.5", 5) == 5);
-    }
-
-    /**
-     * Test for {@link NumberUtils#toLong(String)}.
-     */
-    @Test
-    public void testToLongString() {
-        assertTrue("toLong(String) 1 failed", NumberUtils.toLong("12345") == 12345l);
-        assertTrue("toLong(String) 2 failed", NumberUtils.toLong("abc") == 0l);
-        assertTrue("toLong(String) 3 failed", NumberUtils.toLong("1L") == 0l);
-        assertTrue("toLong(String) 4 failed", NumberUtils.toLong("1l") == 0l);
-        assertTrue("toLong(Long.MAX_VALUE) failed", NumberUtils.toLong(Long.MAX_VALUE+"") == Long.MAX_VALUE);
-        assertTrue("toLong(Long.MIN_VALUE) failed", NumberUtils.toLong(Long.MIN_VALUE+"") == Long.MIN_VALUE);
-        assertTrue("toLong(empty) failed", NumberUtils.toLong("") == 0l);
-        assertTrue("toLong(null) failed", NumberUtils.toLong(null) == 0l);
-    }
-
-    /**
-     * Test for {@link NumberUtils#toLong(String, long)}.
-     */
-    @Test
-    public void testToLongStringL() {
-        assertTrue("toLong(String,long) 1 failed", NumberUtils.toLong("12345", 5l) == 12345l);
-        assertTrue("toLong(String,long) 2 failed", NumberUtils.toLong("1234.5", 5l) == 5l);
-    }
-
-    /**
-     * Test for {@link NumberUtils#toFloat(String)}.
-     */
-    @Test
-    public void testToFloatString() {
-        assertTrue("toFloat(String) 1 failed", NumberUtils.toFloat("-1.2345") == -1.2345f);
-        assertTrue("toFloat(String) 2 failed", NumberUtils.toFloat("1.2345") == 1.2345f);
-        assertTrue("toFloat(String) 3 failed", NumberUtils.toFloat("abc") == 0.0f);
-        assertTrue("toFloat(Float.MAX_VALUE) failed", NumberUtils.toFloat(Float.MAX_VALUE+"") ==  Float.MAX_VALUE);
-        assertTrue("toFloat(Float.MIN_VALUE) failed", NumberUtils.toFloat(Float.MIN_VALUE+"") == Float.MIN_VALUE);
-        assertTrue("toFloat(empty) failed", NumberUtils.toFloat("") == 0.0f);
-        assertTrue("toFloat(null) failed", NumberUtils.toFloat(null) == 0.0f);
-    }
-
-    /**
-     * Test for {@link NumberUtils#toFloat(String, float)}.
-     */
-    @Test
-    public void testToFloatStringF() {
-        assertTrue("toFloat(String,int) 1 failed", NumberUtils.toFloat("1.2345", 5.1f) == 1.2345f);
-        assertTrue("toFloat(String,int) 2 failed", NumberUtils.toFloat("a", 5.0f) == 5.0f);
-    }
-    
-    /**
-     * Test for {(@link NumberUtils#createNumber(String)}
-     */
-    @Test
-    public void testStringCreateNumberEnsureNoPrecisionLoss(){
-        final String shouldBeFloat = "1.23";
-        final String shouldBeDouble = "3.40282354e+38";
-        final String shouldBeBigDecimal = "1.797693134862315759e+308";
-        
-        assertTrue(NumberUtils.createNumber(shouldBeFloat) instanceof Float);
-        assertTrue(NumberUtils.createNumber(shouldBeDouble) instanceof Double);
-        assertTrue(NumberUtils.createNumber(shouldBeBigDecimal) instanceof BigDecimal);
-    }
-    /**
-     * Test for {@link NumberUtils#toDouble(String)}.
-     */
-    @Test
-    public void testStringToDoubleString() {
-        assertTrue("toDouble(String) 1 failed", NumberUtils.toDouble("-1.2345") == -1.2345d);
-        assertTrue("toDouble(String) 2 failed", NumberUtils.toDouble("1.2345") == 1.2345d);
-        assertTrue("toDouble(String) 3 failed", NumberUtils.toDouble("abc") == 0.0d);
-        assertTrue("toDouble(Double.MAX_VALUE) failed", NumberUtils.toDouble(Double.MAX_VALUE+"") == Double.MAX_VALUE);
-        assertTrue("toDouble(Double.MIN_VALUE) failed", NumberUtils.toDouble(Double.MIN_VALUE+"") == Double.MIN_VALUE);
-        assertTrue("toDouble(empty) failed", NumberUtils.toDouble("") == 0.0d);
-        assertTrue("toDouble(null) failed", NumberUtils.toDouble(null) == 0.0d);
-    }
-
-    /**
-     * Test for {@link NumberUtils#toDouble(String, double)}.
-     */
-    @Test
-    public void testStringToDoubleStringD() {
-        assertTrue("toDouble(String,int) 1 failed", NumberUtils.toDouble("1.2345", 5.1d) == 1.2345d);
-        assertTrue("toDouble(String,int) 2 failed", NumberUtils.toDouble("a", 5.0d) == 5.0d);
-    }
-
-     /**
-     * Test for {@link NumberUtils#toByte(String)}.
-     */
-    @Test
-    public void testToByteString() {
-        assertTrue("toByte(String) 1 failed", NumberUtils.toByte("123") == 123);
-        assertTrue("toByte(String) 2 failed", NumberUtils.toByte("abc") == 0);
-        assertTrue("toByte(empty) failed", NumberUtils.toByte("") == 0);
-        assertTrue("toByte(null) failed", NumberUtils.toByte(null) == 0);
-    }
-
-    /**
-     * Test for {@link NumberUtils#toByte(String, byte)}.
-     */
-    @Test
-    public void testToByteStringI() {
-        assertTrue("toByte(String,byte) 1 failed", NumberUtils.toByte("123", (byte) 5) == 123);
-        assertTrue("toByte(String,byte) 2 failed", NumberUtils.toByte("12.3", (byte) 5) == 5);
-    }
-
-    /**
-     * Test for {@link NumberUtils#toShort(String)}.
-     */
-    @Test
-    public void testToShortString() {
-        assertTrue("toShort(String) 1 failed", NumberUtils.toShort("12345") == 12345);
-        assertTrue("toShort(String) 2 failed", NumberUtils.toShort("abc") == 0);
-        assertTrue("toShort(empty) failed", NumberUtils.toShort("") == 0);
-        assertTrue("toShort(null) failed", NumberUtils.toShort(null) == 0);
-    }
-
-    /**
-     * Test for {@link NumberUtils#toShort(String, short)}.
-     */
-    @Test
-    public void testToShortStringI() {
-        assertTrue("toShort(String,short) 1 failed", NumberUtils.toShort("12345", (short) 5) == 12345);
-        assertTrue("toShort(String,short) 2 failed", NumberUtils.toShort("1234.5", (short) 5) == 5);
-    }
-
-    @Test
-    public void testCreateNumber() {
-        // a lot of things can go wrong
-        assertEquals("createNumber(String) 1 failed", Float.valueOf("1234.5"), NumberUtils.createNumber("1234.5"));
-        assertEquals("createNumber(String) 2 failed", Integer.valueOf("12345"), NumberUtils.createNumber("12345"));
-        assertEquals("createNumber(String) 3 failed", Double.valueOf("1234.5"), NumberUtils.createNumber("1234.5D"));
-        assertEquals("createNumber(String) 3 failed", Double.valueOf("1234.5"), NumberUtils.createNumber("1234.5d"));
-        assertEquals("createNumber(String) 4 failed", Float.valueOf("1234.5"), NumberUtils.createNumber("1234.5F"));
-        assertEquals("createNumber(String) 4 failed", Float.valueOf("1234.5"), NumberUtils.createNumber("1234.5f"));
-        assertEquals("createNumber(String) 5 failed", Long.valueOf(Integer.MAX_VALUE + 1L), NumberUtils.createNumber(""
-            + (Integer.MAX_VALUE + 1L)));
-        assertEquals("createNumber(String) 6 failed", Long.valueOf(12345), NumberUtils.createNumber("12345L"));
-        assertEquals("createNumber(String) 6 failed", Long.valueOf(12345), NumberUtils.createNumber("12345l"));
-        assertEquals("createNumber(String) 7 failed", Float.valueOf("-1234.5"), NumberUtils.createNumber("-1234.5"));
-        assertEquals("createNumber(String) 8 failed", Integer.valueOf("-12345"), NumberUtils.createNumber("-12345"));
-        assertTrue("createNumber(String) 9a failed", 0xFADE == NumberUtils.createNumber("0xFADE").intValue());
-        assertTrue("createNumber(String) 9b failed", 0xFADE == NumberUtils.createNumber("0Xfade").intValue());
-        assertTrue("createNumber(String) 10a failed", -0xFADE == NumberUtils.createNumber("-0xFADE").intValue());
-        assertTrue("createNumber(String) 10b failed", -0xFADE == NumberUtils.createNumber("-0Xfade").intValue());
-        assertEquals("createNumber(String) 11 failed", Double.valueOf("1.1E200"), NumberUtils.createNumber("1.1E200"));
-        assertEquals("createNumber(String) 12 failed", Float.valueOf("1.1E20"), NumberUtils.createNumber("1.1E20"));
-        assertEquals("createNumber(String) 13 failed", Double.valueOf("-1.1E200"), NumberUtils.createNumber("-1.1E200"));
-        assertEquals("createNumber(String) 14 failed", Double.valueOf("1.1E-200"), NumberUtils.createNumber("1.1E-200"));
-        assertEquals("createNumber(null) failed", null, NumberUtils.createNumber(null));
-        assertEquals("createNumber(String) failed", new BigInteger("12345678901234567890"), NumberUtils
-                .createNumber("12345678901234567890L"));
-
-        assertEquals("createNumber(String) 15 failed", new BigDecimal("1.1E-700"), NumberUtils
-                    .createNumber("1.1E-700F"));
-
-        assertEquals("createNumber(String) 16 failed", Long.valueOf("10" + Integer.MAX_VALUE), NumberUtils
-                .createNumber("10" + Integer.MAX_VALUE + "L"));
-        assertEquals("createNumber(String) 17 failed", Long.valueOf("10" + Integer.MAX_VALUE), NumberUtils
-                .createNumber("10" + Integer.MAX_VALUE));
-        assertEquals("createNumber(String) 18 failed", new BigInteger("10" + Long.MAX_VALUE), NumberUtils
-                .createNumber("10" + Long.MAX_VALUE));
-
-        // LANG-521
-        assertEquals("createNumber(String) LANG-521 failed", Float.valueOf("2."), NumberUtils.createNumber("2."));
-
-        // LANG-638
-        assertFalse("createNumber(String) succeeded", checkCreateNumber("1eE"));
-
-        // LANG-693
-        assertEquals("createNumber(String) LANG-693 failed", Double.valueOf(Double.MAX_VALUE), NumberUtils
-                    .createNumber("" + Double.MAX_VALUE));
-
-        // LANG-822
-        // ensure that the underlying negative number would create a BigDecimal
-        final Number bigNum = NumberUtils.createNumber("-1.1E-700F");
-        assertNotNull(bigNum);
-        assertEquals(BigDecimal.class, bigNum.getClass());
-    }
-    
-    @Test
-    public void testLang1087(){
-        // no sign cases
-        assertEquals(Float.class, NumberUtils.createNumber("0.0").getClass());
-        assertEquals(Float.valueOf("0.0"), NumberUtils.createNumber("0.0"));
-        // explicit positive sign cases
-        assertEquals(Float.class, NumberUtils.createNumber("+0.0").getClass());
-        assertEquals(Float.valueOf("+0.0"), NumberUtils.createNumber("+0.0"));
-        // negative sign cases
-        assertEquals(Float.class, NumberUtils.createNumber("-0.0").getClass());
-        assertEquals(Float.valueOf("-0.0"), NumberUtils.createNumber("-0.0"));
-    }
-
-    @Test
-    public void TestLang747() {
-        assertEquals(Integer.valueOf(0x8000),      NumberUtils.createNumber("0x8000"));
-        assertEquals(Integer.valueOf(0x80000),     NumberUtils.createNumber("0x80000"));
-        assertEquals(Integer.valueOf(0x800000),    NumberUtils.createNumber("0x800000"));
-        assertEquals(Integer.valueOf(0x8000000),   NumberUtils.createNumber("0x8000000"));
-        assertEquals(Integer.valueOf(0x7FFFFFFF),  NumberUtils.createNumber("0x7FFFFFFF"));
-        assertEquals(Long.valueOf(0x80000000L),    NumberUtils.createNumber("0x80000000"));
-        assertEquals(Long.valueOf(0xFFFFFFFFL),    NumberUtils.createNumber("0xFFFFFFFF"));
-
-        // Leading zero tests
-        assertEquals(Integer.valueOf(0x8000000),   NumberUtils.createNumber("0x08000000"));
-        assertEquals(Integer.valueOf(0x7FFFFFFF),  NumberUtils.createNumber("0x007FFFFFFF"));
-        assertEquals(Long.valueOf(0x80000000L),    NumberUtils.createNumber("0x080000000"));
-        assertEquals(Long.valueOf(0xFFFFFFFFL),    NumberUtils.createNumber("0x00FFFFFFFF"));
-
-        assertEquals(Long.valueOf(0x800000000L),        NumberUtils.createNumber("0x800000000"));
-        assertEquals(Long.valueOf(0x8000000000L),       NumberUtils.createNumber("0x8000000000"));
-        assertEquals(Long.valueOf(0x80000000000L),      NumberUtils.createNumber("0x80000000000"));
-        assertEquals(Long.valueOf(0x800000000000L),     NumberUtils.createNumber("0x800000000000"));
-        assertEquals(Long.valueOf(0x8000000000000L),    NumberUtils.createNumber("0x8000000000000"));
-        assertEquals(Long.valueOf(0x80000000000000L),   NumberUtils.createNumber("0x80000000000000"));
-        assertEquals(Long.valueOf(0x800000000000000L),  NumberUtils.createNumber("0x800000000000000"));
-        assertEquals(Long.valueOf(0x7FFFFFFFFFFFFFFFL), NumberUtils.createNumber("0x7FFFFFFFFFFFFFFF"));
-        // N.B. Cannot use a hex constant such as 0x8000000000000000L here as that is interpreted as a negative long
-        assertEquals(new BigInteger("8000000000000000", 16), NumberUtils.createNumber("0x8000000000000000"));
-        assertEquals(new BigInteger("FFFFFFFFFFFFFFFF", 16), NumberUtils.createNumber("0xFFFFFFFFFFFFFFFF"));
-
-        // Leading zero tests
-        assertEquals(Long.valueOf(0x80000000000000L),   NumberUtils.createNumber("0x00080000000000000"));
-        assertEquals(Long.valueOf(0x800000000000000L),  NumberUtils.createNumber("0x0800000000000000"));
-        assertEquals(Long.valueOf(0x7FFFFFFFFFFFFFFFL), NumberUtils.createNumber("0x07FFFFFFFFFFFFFFF"));
-        // N.B. Cannot use a hex constant such as 0x8000000000000000L here as that is interpreted as a negative long
-        assertEquals(new BigInteger("8000000000000000", 16), NumberUtils.createNumber("0x00008000000000000000"));
-        assertEquals(new BigInteger("FFFFFFFFFFFFFFFF", 16), NumberUtils.createNumber("0x0FFFFFFFFFFFFFFFF"));
-    }
-
-    @Test(expected=NumberFormatException.class)
-    // Check that the code fails to create a valid number when preceded by -- rather than -
-    public void testCreateNumberFailure_1() {
-        NumberUtils.createNumber("--1.1E-700F");
-    }
-
-    @Test(expected=NumberFormatException.class)
-    // Check that the code fails to create a valid number when both e and E are present (with decimal)
-    public void testCreateNumberFailure_2() {
-        NumberUtils.createNumber("-1.1E+0-7e00");
-    }
-
-    @Test(expected=NumberFormatException.class)
-    // Check that the code fails to create a valid number when both e and E are present (no decimal)
-    public void testCreateNumberFailure_3() {
-        NumberUtils.createNumber("-11E+0-7e00");
-    }
-
-    @Test(expected=NumberFormatException.class)
-    // Check that the code fails to create a valid number when both e and E are present (no decimal)
-    public void testCreateNumberFailure_4() {
-        NumberUtils.createNumber("1eE+00001");
-    }
-
-    // Tests to show when magnitude causes switch to next Number type
-    // Will probably need to be adjusted if code is changed to check precision (LANG-693)
-    @Test
-    public void testCreateNumberMagnitude() {
-        // Test Float.MAX_VALUE, and same with +1 in final digit to check conversion changes to next Number type
-        assertEquals(Float.valueOf(Float.MAX_VALUE),  NumberUtils.createNumber("3.4028235e+38"));
-        assertEquals(Double.valueOf(3.4028236e+38),   NumberUtils.createNumber("3.4028236e+38"));
-
-        // Test Double.MAX_VALUE
-        assertEquals(Double.valueOf(Double.MAX_VALUE),          NumberUtils.createNumber("1.7976931348623157e+308"));
-        // Test with +2 in final digit (+1 does not cause roll-over to BigDecimal)
-        assertEquals(new BigDecimal("1.7976931348623159e+308"), NumberUtils.createNumber("1.7976931348623159e+308"));
-
-        assertEquals(Integer.valueOf(0x12345678), NumberUtils.createNumber("0x12345678"));
-        assertEquals(Long.valueOf(0x123456789L),  NumberUtils.createNumber("0x123456789"));
-
-        assertEquals(Long.valueOf(0x7fffffffffffffffL),      NumberUtils.createNumber("0x7fffffffffffffff"));
-        // Does not appear to be a way to create a literal BigInteger of this magnitude
-        assertEquals(new BigInteger("7fffffffffffffff0",16), NumberUtils.createNumber("0x7fffffffffffffff0"));
-
-        assertEquals(Long.valueOf(0x7fffffffffffffffL),      NumberUtils.createNumber("#7fffffffffffffff"));
-        assertEquals(new BigInteger("7fffffffffffffff0",16), NumberUtils.createNumber("#7fffffffffffffff0"));
-
-        assertEquals(Integer.valueOf(017777777777), NumberUtils.createNumber("017777777777")); // 31 bits
-        assertEquals(Long.valueOf(037777777777L),   NumberUtils.createNumber("037777777777")); // 32 bits
-
-        assertEquals(Long.valueOf(0777777777777777777777L),      NumberUtils.createNumber("0777777777777777777777")); // 63 bits
-        assertEquals(new BigInteger("1777777777777777777777",8), NumberUtils.createNumber("01777777777777777777777"));// 64 bits
-    }
-
-    @Test
-    public void testCreateFloat() {
-        assertEquals("createFloat(String) failed", Float.valueOf("1234.5"), NumberUtils.createFloat("1234.5"));
-        assertEquals("createFloat(null) failed", null, NumberUtils.createFloat(null));
-        this.testCreateFloatFailure("");
-        this.testCreateFloatFailure(" ");
-        this.testCreateFloatFailure("\b\t\n\f\r");
-        // Funky whitespaces
-        this.testCreateFloatFailure("\u00A0\uFEFF\u000B\u000C\u001C\u001D\u001E\u001F");
-    }
-
-    protected void testCreateFloatFailure(final String str) {
-        try {
-            final Float value = NumberUtils.createFloat(str);
-            fail("createFloat(\"" + str + "\") should have failed: " + value);
-        } catch (final NumberFormatException ex) {
-            // empty
-        }
-    }
-
-    @Test
-    public void testCreateDouble() {
-        assertEquals("createDouble(String) failed", Double.valueOf("1234.5"), NumberUtils.createDouble("1234.5"));
-        assertEquals("createDouble(null) failed", null, NumberUtils.createDouble(null));
-        this.testCreateDoubleFailure("");
-        this.testCreateDoubleFailure(" ");
-        this.testCreateDoubleFailure("\b\t\n\f\r");
-        // Funky whitespaces
-        this.testCreateDoubleFailure("\u00A0\uFEFF\u000B\u000C\u001C\u001D\u001E\u001F");
-    }
-
-    protected void testCreateDoubleFailure(final String str) {
-        try {
-            final Double value = NumberUtils.createDouble(str);
-            fail("createDouble(\"" + str + "\") should have failed: " + value);
-        } catch (final NumberFormatException ex) {
-            // empty
-        }
-    }
-
-    @Test
-    public void testCreateInteger() {
-        assertEquals("createInteger(String) failed", Integer.valueOf("12345"), NumberUtils.createInteger("12345"));
-        assertEquals("createInteger(null) failed", null, NumberUtils.createInteger(null));
-        this.testCreateIntegerFailure("");
-        this.testCreateIntegerFailure(" ");
-        this.testCreateIntegerFailure("\b\t\n\f\r");
-        // Funky whitespaces
-        this.testCreateIntegerFailure("\u00A0\uFEFF\u000B\u000C\u001C\u001D\u001E\u001F");
-    }
-
-    protected void testCreateIntegerFailure(final String str) {
-        try {
-            final Integer value = NumberUtils.createInteger(str);
-            fail("createInteger(\"" + str + "\") should have failed: " + value);
-        } catch (final NumberFormatException ex) {
-            // empty
-        }
-    }
-
-    @Test
-    public void testCreateLong() {
-        assertEquals("createLong(String) failed", Long.valueOf("12345"), NumberUtils.createLong("12345"));
-        assertEquals("createLong(null) failed", null, NumberUtils.createLong(null));
-        this.testCreateLongFailure("");
-        this.testCreateLongFailure(" ");
-        this.testCreateLongFailure("\b\t\n\f\r");
-        // Funky whitespaces
-        this.testCreateLongFailure("\u00A0\uFEFF\u000B\u000C\u001C\u001D\u001E\u001F");
-    }
-
-    protected void testCreateLongFailure(final String str) {
-        try {
-            final Long value = NumberUtils.createLong(str);
-            fail("createLong(\"" + str + "\") should have failed: " + value);
-        } catch (final NumberFormatException ex) {
-            // empty
-        }
-    }
-
-    @Test
-    public void testCreateBigInteger() {
-        assertEquals("createBigInteger(String) failed", new BigInteger("12345"), NumberUtils.createBigInteger("12345"));
-        assertEquals("createBigInteger(null) failed", null, NumberUtils.createBigInteger(null));
-        this.testCreateBigIntegerFailure("");
-        this.testCreateBigIntegerFailure(" ");
-        this.testCreateBigIntegerFailure("\b\t\n\f\r");
-        // Funky whitespaces
-        this.testCreateBigIntegerFailure("\u00A0\uFEFF\u000B\u000C\u001C\u001D\u001E\u001F");
-        assertEquals("createBigInteger(String) failed", new BigInteger("255"), NumberUtils.createBigInteger("0xff"));
-        assertEquals("createBigInteger(String) failed", new BigInteger("255"), NumberUtils.createBigInteger("0Xff"));
-        assertEquals("createBigInteger(String) failed", new BigInteger("255"), NumberUtils.createBigInteger("#ff"));
-        assertEquals("createBigInteger(String) failed", new BigInteger("-255"), NumberUtils.createBigInteger("-0xff"));
-        assertEquals("createBigInteger(String) failed", new BigInteger("255"), NumberUtils.createBigInteger("0377"));
-        assertEquals("createBigInteger(String) failed", new BigInteger("-255"), NumberUtils.createBigInteger("-0377"));
-        assertEquals("createBigInteger(String) failed", new BigInteger("-255"), NumberUtils.createBigInteger("-0377"));
-        assertEquals("createBigInteger(String) failed", new BigInteger("-0"), NumberUtils.createBigInteger("-0"));
-        assertEquals("createBigInteger(String) failed", new BigInteger("0"), NumberUtils.createBigInteger("0"));
-        testCreateBigIntegerFailure("#");
-        testCreateBigIntegerFailure("-#");
-        testCreateBigIntegerFailure("0x");
-        testCreateBigIntegerFailure("-0x");
-    }
-
-    protected void testCreateBigIntegerFailure(final String str) {
-        try {
-            final BigInteger value = NumberUtils.createBigInteger(str);
-            fail("createBigInteger(\"" + str + "\") should have failed: " + value);
-        } catch (final NumberFormatException ex) {
-            // empty
-        }
-    }
-
-    @Test
-    public void testCreateBigDecimal() {
-        assertEquals("createBigDecimal(String) failed", new BigDecimal("1234.5"), NumberUtils.createBigDecimal("1234.5"));
-        assertEquals("createBigDecimal(null) failed", null, NumberUtils.createBigDecimal(null));
-        this.testCreateBigDecimalFailure("");
-        this.testCreateBigDecimalFailure(" ");
-        this.testCreateBigDecimalFailure("\b\t\n\f\r");
-        // Funky whitespaces
-        this.testCreateBigDecimalFailure("\u00A0\uFEFF\u000B\u000C\u001C\u001D\u001E\u001F");
-        this.testCreateBigDecimalFailure("-"); // sign alone not valid
-        this.testCreateBigDecimalFailure("--"); // comment in NumberUtils suggests some implementations may incorrectly allow this
-        this.testCreateBigDecimalFailure("--0");
-        this.testCreateBigDecimalFailure("+"); // sign alone not valid
-        this.testCreateBigDecimalFailure("++"); // in case this was also allowed by some JVMs
-        this.testCreateBigDecimalFailure("++0");
-    }
-
-    protected void testCreateBigDecimalFailure(final String str) {
-        try {
-            final BigDecimal value = NumberUtils.createBigDecimal(str);
-            fail("createBigDecimal(\"" + str + "\") should have failed: " + value);
-        } catch (final NumberFormatException ex) {
-            // empty
-        }
-    }
-
-    // min/max tests
-    // ----------------------------------------------------------------------
-    @Test(expected = IllegalArgumentException.class)
-    public void testMinLong_nullArray() {
-        NumberUtils.min((long[]) null);
-    }
-
-    @Test(expected = IllegalArgumentException.class)
-    public void testMinLong_emptyArray() {
-        NumberUtils.min(new long[0]);
-    }
-
-    @Test
-    public void testMinLong() {
-        assertEquals(
-            "min(long[]) failed for array length 1",
-            5,
-            NumberUtils.min(new long[] { 5 }));
-
-        assertEquals(
-            "min(long[]) failed for array length 2",
-            6,
-            NumberUtils.min(new long[] { 6, 9 }));
-
-        assertEquals(-10, NumberUtils.min(new long[] { -10, -5, 0, 5, 10 }));
-        assertEquals(-10, NumberUtils.min(new long[] { -5, 0, -10, 5, 10 }));
-    }
-
-    @Test(expected = IllegalArgumentException.class)
-    public void testMinInt_nullArray() {
-        NumberUtils.min((int[]) null);
-    }
-
-    @Test(expected = IllegalArgumentException.class)
-    public void testMinInt_emptyArray() {
-        NumberUtils.min(new int[0]);
-    }
-
-    @Test
-    public void testMinInt() {
-        assertEquals(
-            "min(int[]) failed for array length 1",
-            5,
-            NumberUtils.min(new int[] { 5 }));
-
-        assertEquals(
-            "min(int[]) failed for array length 2",
-            6,
-            NumberUtils.min(new int[] { 6, 9 }));
-
-        assertEquals(-10, NumberUtils.min(new int[] { -10, -5, 0, 5, 10 }));
-        assertEquals(-10, NumberUtils.min(new int[] { -5, 0, -10, 5, 10 }));
-    }
-
-    @Test(expected = IllegalArgumentException.class)
-    public void testMinShort_nullArray() {
-        NumberUtils.min((short[]) null);
-    }
-
-    @Test(expected = IllegalArgumentException.class)
-    public void testMinShort_emptyArray() {
-        NumberUtils.min(new short[0]);
-    }
-
-    @Test
-    public void testMinShort() {
-        assertEquals(
-            "min(short[]) failed for array length 1",
-            5,
-            NumberUtils.min(new short[] { 5 }));
-
-        assertEquals(
-            "min(short[]) failed for array length 2",
-            6,
-            NumberUtils.min(new short[] { 6, 9 }));
-
-        assertEquals(-10, NumberUtils.min(new short[] { -10, -5, 0, 5, 10 }));
-        assertEquals(-10, NumberUtils.min(new short[] { -5, 0, -10, 5, 10 }));
-    }
-
-    @Test(expected = IllegalArgumentException.class)
-    public void testMinByte_nullArray() {
-        NumberUtils.min((byte[]) null);
-    }
-
-    @Test(expected = IllegalArgumentException.class)
-    public void testMinByte_emptyArray() {
-        NumberUtils.min(new byte[0]);
-    }
-
-    @Test
-    public void testMinByte() {
-        assertEquals(
-            "min(byte[]) failed for array length 1",
-            5,
-            NumberUtils.min(new byte[] { 5 }));
-
-        assertEquals(
-            "min(byte[]) failed for array length 2",
-            6,
-            NumberUtils.min(new byte[] { 6, 9 }));
-
-        assertEquals(-10, NumberUtils.min(new byte[] { -10, -5, 0, 5, 10 }));
-        assertEquals(-10, NumberUtils.min(new byte[] { -5, 0, -10, 5, 10 }));
-    }
-
-    @Test(expected = IllegalArgumentException.class)
-    public void testMinDouble_nullArray() {
-        NumberUtils.min((double[]) null);
-    }
-
-    @Test(expected = IllegalArgumentException.class)
-    public void testMinDouble_emptyArray() {
-        NumberUtils.min(new double[0]);
-    }
-
-    @Test
-    public void testMinDouble() {
-        assertEquals(
-            "min(double[]) failed for array length 1",
-            5.12,
-            NumberUtils.min(new double[] { 5.12 }),
-            0);
-
-        assertEquals(
-            "min(double[]) failed for array length 2",
-            6.23,
-            NumberUtils.min(new double[] { 6.23, 9.34 }),
-            0);
-
-        assertEquals(
-            "min(double[]) failed for array length 5",
-            -10.45,
-            NumberUtils.min(new double[] { -10.45, -5.56, 0, 5.67, 10.78 }),
-            0);
-        assertEquals(-10, NumberUtils.min(new double[] { -10, -5, 0, 5, 10 }), 0.0001);
-        assertEquals(-10, NumberUtils.min(new double[] { -5, 0, -10, 5, 10 }), 0.0001);
-    }
-
-    @Test(expected = IllegalArgumentException.class)
-    public void testMinFloat_nullArray() {
-        NumberUtils.min((float[]) null);
-    }
-
-    @Test(expected = IllegalArgumentException.class)
-    public void testMinFloat_emptyArray() {
-        NumberUtils.min(new float[0]);
-    }
-
-    @Test
-    public void testMinFloat() {
-        assertEquals(
-            "min(float[]) failed for array length 1",
-            5.9f,
-            NumberUtils.min(new float[] { 5.9f }),
-            0);
-
-        assertEquals(
-            "min(float[]) failed for array length 2",
-            6.8f,
-            NumberUtils.min(new float[] { 6.8f, 9.7f }),
-            0);
-
-        assertEquals(
-            "min(float[]) failed for array length 5",
-            -10.6f,
-            NumberUtils.min(new float[] { -10.6f, -5.5f, 0, 5.4f, 10.3f }),
-            0);
-        assertEquals(-10, NumberUtils.min(new float[] { -10, -5, 0, 5, 10 }), 0.0001f);
-        assertEquals(-10, NumberUtils.min(new float[] { -5, 0, -10, 5, 10 }), 0.0001f);
-    }
-
-    @Test(expected = IllegalArgumentException.class)
-    public void testMaxLong_nullArray() {
-        NumberUtils.max((long[]) null);
-    }
-
-    @Test(expected = IllegalArgumentException.class)
-    public void testMaxLong_emptyArray() {
-        NumberUtils.max(new long[0]);
-    }
-
-    @Test
-    public void testMaxLong() {
-        assertEquals(
-            "max(long[]) failed for array length 1",
-            5,
-            NumberUtils.max(new long[] { 5 }));
-
-        assertEquals(
-            "max(long[]) failed for array length 2",
-            9,
-            NumberUtils.max(new long[] { 6, 9 }));
-
-        assertEquals(
-            "max(long[]) failed for array length 5",
-            10,
-            NumberUtils.max(new long[] { -10, -5, 0, 5, 10 }));
-        assertEquals(10, NumberUtils.max(new long[] { -10, -5, 0, 5, 10 }));
-        assertEquals(10, NumberUtils.max(new long[] { -5, 0, 10, 5, -10 }));
-    }
-
-    @Test(expected = IllegalArgumentException.class)
-    public void testMaxInt_nullArray() {
-        NumberUtils.max((int[]) null);
-    }
-
-    @Test(expected = IllegalArgumentException.class)
-    public void testMaxInt_emptyArray() {
-        NumberUtils.max(new int[0]);
-    }
-
-    @Test
-    public void testMaxInt() {
-        assertEquals(
-            "max(int[]) failed for array length 1",
-            5,
-            NumberUtils.max(new int[] { 5 }));
-
-        assertEquals(
-            "max(int[]) failed for array length 2",
-            9,
-            NumberUtils.max(new int[] { 6, 9 }));
-
-        assertEquals(
-            "max(int[]) failed for array length 5",
-            10,
-            NumberUtils.max(new int[] { -10, -5, 0, 5, 10 }));
-        assertEquals(10, NumberUtils.max(new int[] { -10, -5, 0, 5, 10 }));
-        assertEquals(10, NumberUtils.max(new int[] { -5, 0, 10, 5, -10 }));
-    }
-
-    @Test(expected = IllegalArgumentException.class)
-    public void testMaxShort_nullArray() {
-        NumberUtils.max((short[]) null);
-    }
-
-    @Test(expected = IllegalArgumentException.class)
-    public void testMaxShort_emptyArray() {
-        NumberUtils.max(new short[0]);
-    }
-
-    @Test
-    public void testMaxShort() {
-        assertEquals(
-            "max(short[]) failed for array length 1",
-            5,
-            NumberUtils.max(new short[] { 5 }));
-
-        assertEquals(
-            "max(short[]) failed for array length 2",
-            9,
-            NumberUtils.max(new short[] { 6, 9 }));
-
-        assertEquals(
-            "max(short[]) failed for array length 5",
-            10,
-            NumberUtils.max(new short[] { -10, -5, 0, 5, 10 }));
-        assertEquals(10, NumberUtils.max(new short[] { -10, -5, 0, 5, 10 }));
-        assertEquals(10, NumberUtils.max(new short[] { -5, 0, 10, 5, -10 }));
-    }
-
-    @Test(expected = IllegalArgumentException.class)
-    public void testMaxByte_nullArray() {
-        NumberUtils.max((byte[]) null);
-    }
-
-    @Test(expected = IllegalArgumentException.class)
-    public void testMaxByte_emptyArray() {
-        NumberUtils.max(new byte[0]);
-    }
-
-    @Test
-    public void testMaxByte() {
-        assertEquals(
-            "max(byte[]) failed for array length 1",
-            5,
-            NumberUtils.max(new byte[] { 5 }));
-
-        assertEquals(
-            "max(byte[]) failed for array length 2",
-            9,
-            NumberUtils.max(new byte[] { 6, 9 }));
-
-        assertEquals(
-            "max(byte[]) failed for array length 5",
-            10,
-            NumberUtils.max(new byte[] { -10, -5, 0, 5, 10 }));
-        assertEquals(10, NumberUtils.max(new byte[] { -10, -5, 0, 5, 10 }));
-        assertEquals(10, NumberUtils.max(new byte[] { -5, 0, 10, 5, -10 }));
-    }
-
-    @Test(expected = IllegalArgumentException.class)
-    public void testMaxDouble_nullArray() {
-        NumberUtils.max((double[]) null);
-    }
-
-    @Test(expected = IllegalArgumentException.class)
-    public void testMaxDouble_emptyArray() {
-        NumberUtils.max(new double[0]);
-    }
-
-    @Test
-    public void testMaxDouble() {
-        final double[] d = null;
-        try {
-            NumberUtils.max(d);
-            fail("No exception was thrown for null input.");
-        } catch (final IllegalArgumentException ex) {}
-
-        try {
-            NumberUtils.max(new double[0]);
-            fail("No exception was thrown for empty input.");
-        } catch (final IllegalArgumentException ex) {}
-
-        assertEquals(
-            "max(double[]) failed for array length 1",
-            5.1f,
-            NumberUtils.max(new double[] { 5.1f }),
-            0);
-
-        assertEquals(
-            "max(double[]) failed for array length 2",
-            9.2f,
-            NumberUtils.max(new double[] { 6.3f, 9.2f }),
-            0);
-
-        assertEquals(
-            "max(double[]) failed for float length 5",
-            10.4f,
-            NumberUtils.max(new double[] { -10.5f, -5.6f, 0, 5.7f, 10.4f }),
-            0);
-        assertEquals(10, NumberUtils.max(new double[] { -10, -5, 0, 5, 10 }), 0.0001);
-        assertEquals(10, NumberUtils.max(new double[] { -5, 0, 10, 5, -10 }), 0.0001);
-    }
-
-    @Test(expected = IllegalArgumentException.class)
-    public void testMaxFloat_nullArray() {
-        NumberUtils.max((float[]) null);
-    }
-
-    @Test(expected = IllegalArgumentException.class)
-    public void testMaxFloat_emptyArray() {
-        NumberUtils.max(new float[0]);
-    }
-
-    @Test
-    public void testMaxFloat() {
-        assertEquals(
-            "max(float[]) failed for array length 1",
-            5.1f,
-            NumberUtils.max(new float[] { 5.1f }),
-            0);
-
-        assertEquals(
-            "max(float[]) failed for array length 2",
-            9.2f,
-            NumberUtils.max(new float[] { 6.3f, 9.2f }),
-            0);
-
-        assertEquals(
-            "max(float[]) failed for float length 5",
-            10.4f,
-            NumberUtils.max(new float[] { -10.5f, -5.6f, 0, 5.7f, 10.4f }),
-            0);
-        assertEquals(10, NumberUtils.max(new float[] { -10, -5, 0, 5, 10 }), 0.0001f);
-        assertEquals(10, NumberUtils.max(new float[] { -5, 0, 10, 5, -10 }), 0.0001f);
-    }
-
-    @Test
-    public void testMinimumLong() {
-        assertEquals("minimum(long,long,long) 1 failed", 12345L, NumberUtils.min(12345L, 12345L + 1L, 12345L + 2L));
-        assertEquals("minimum(long,long,long) 2 failed", 12345L, NumberUtils.min(12345L + 1L, 12345L, 12345 + 2L));
-        assertEquals("minimum(long,long,long) 3 failed", 12345L, NumberUtils.min(12345L + 1L, 12345L + 2L, 12345L));
-        assertEquals("minimum(long,long,long) 4 failed", 12345L, NumberUtils.min(12345L + 1L, 12345L, 12345L));
-        assertEquals("minimum(long,long,long) 5 failed", 12345L, NumberUtils.min(12345L, 12345L, 12345L));
-    }
-
-    @Test
-    public void testMinimumInt() {
-        assertEquals("minimum(int,int,int) 1 failed", 12345, NumberUtils.min(12345, 12345 + 1, 12345 + 2));
-        assertEquals("minimum(int,int,int) 2 failed", 12345, NumberUtils.min(12345 + 1, 12345, 12345 + 2));
-        assertEquals("minimum(int,int,int) 3 failed", 12345, NumberUtils.min(12345 + 1, 12345 + 2, 12345));
-        assertEquals("minimum(int,int,int) 4 failed", 12345, NumberUtils.min(12345 + 1, 12345, 12345));
-        assertEquals("minimum(int,int,int) 5 failed", 12345, NumberUtils.min(12345, 12345, 12345));
-    }
-
-    @Test
-    public void testMinimumShort() {
-        final short low = 1234;
-        final short mid = 1234 + 1;
-        final short high = 1234 + 2;
-        assertEquals("minimum(short,short,short) 1 failed", low, NumberUtils.min(low, mid, high));
-        assertEquals("minimum(short,short,short) 1 failed", low, NumberUtils.min(mid, low, high));
-        assertEquals("minimum(short,short,short) 1 failed", low, NumberUtils.min(mid, high, low));
-        assertEquals("minimum(short,short,short) 1 failed", low, NumberUtils.min(low, mid, low));
-    }
-
-    @Test
-    public void testMinimumByte() {
-        final byte low = 123;
-        final byte mid = 123 + 1;
-        final byte high = 123 + 2;
-        assertEquals("minimum(byte,byte,byte) 1 failed", low, NumberUtils.min(low, mid, high));
-        assertEquals("minimum(byte,byte,byte) 1 failed", low, NumberUtils.min(mid, low, high));
-        assertEquals("minimum(byte,byte,byte) 1 failed", low, NumberUtils.min(mid, high, low));
-        assertEquals("minimum(byte,byte,byte) 1 failed", low, NumberUtils.min(low, mid, low));
-    }
-
-    @Test
-    public void testMinimumDouble() {
-        final double low = 12.3;
-        final double mid = 12.3 + 1;
-        final double high = 12.3 + 2;
-        assertEquals(low, NumberUtils.min(low, mid, high), 0.0001);
-        assertEquals(low, NumberUtils.min(mid, low, high), 0.0001);
-        assertEquals(low, NumberUtils.min(mid, high, low), 0.0001);
-        assertEquals(low, NumberUtils.min(low, mid, low), 0.0001);
-        assertEquals(mid, NumberUtils.min(high, mid, high), 0.0001);
-    }
-
-    @Test
-    public void testMinimumFloat() {
-        final float low = 12.3f;
-        final float mid = 12.3f + 1;
-        final float high = 12.3f + 2;
-        assertEquals(low, NumberUtils.min(low, mid, high), 0.0001f);
-        assertEquals(low, NumberUtils.min(mid, low, high), 0.0001f);
-        assertEquals(low, NumberUtils.min(mid, high, low), 0.0001f);
-        assertEquals(low, NumberUtils.min(low, mid, low), 0.0001f);
-        assertEquals(mid, NumberUtils.min(high, mid, high), 0.0001f);
-    }
-
-    @Test
-    public void testMaximumLong() {
-        assertEquals("maximum(long,long,long) 1 failed", 12345L, NumberUtils.max(12345L, 12345L - 1L, 12345L - 2L));
-        assertEquals("maximum(long,long,long) 2 failed", 12345L, NumberUtils.max(12345L - 1L, 12345L, 12345L - 2L));
-        assertEquals("maximum(long,long,long) 3 failed", 12345L, NumberUtils.max(12345L - 1L, 12345L - 2L, 12345L));
-        assertEquals("maximum(long,long,long) 4 failed", 12345L, NumberUtils.max(12345L - 1L, 12345L, 12345L));
-        assertEquals("maximum(long,long,long) 5 failed", 12345L, NumberUtils.max(12345L, 12345L, 12345L));
-    }
-
-    @Test
-    public void testMaximumInt() {
-        assertEquals("maximum(int,int,int) 1 failed", 12345, NumberUtils.max(12345, 12345 - 1, 12345 - 2));
-        assertEquals("maximum(int,int,int) 2 failed", 12345, NumberUtils.max(12345 - 1, 12345, 12345 - 2));
-        assertEquals("maximum(int,int,int) 3 failed", 12345, NumberUtils.max(12345 - 1, 12345 - 2, 12345));
-        assertEquals("maximum(int,int,int) 4 failed", 12345, NumberUtils.max(12345 - 1, 12345, 12345));
-        assertEquals("maximum(int,int,int) 5 failed", 12345, NumberUtils.max(12345, 12345, 12345));
-    }
-
-    @Test
-    public void testMaximumShort() {
-        final short low = 1234;
-        final short mid = 1234 + 1;
-        final short high = 1234 + 2;
-        assertEquals("maximum(short,short,short) 1 failed", high, NumberUtils.max(low, mid, high));
-        assertEquals("maximum(short,short,short) 1 failed", high, NumberUtils.max(mid, low, high));
-        assertEquals("maximum(short,short,short) 1 failed", high, NumberUtils.max(mid, high, low));
-        assertEquals("maximum(short,short,short) 1 failed", high, NumberUtils.max(high, mid, high));
-    }
-
-    @Test
-    public void testMaximumByte() {
-        final byte low = 123;
-        final byte mid = 123 + 1;
-        final byte high = 123 + 2;
-        assertEquals("maximum(byte,byte,byte) 1 failed", high, NumberUtils.max(low, mid, high));
-        assertEquals("maximum(byte,byte,byte) 1 failed", high, NumberUtils.max(mid, low, high));
-        assertEquals("maximum(byte,byte,byte) 1 failed", high, NumberUtils.max(mid, high, low));
-        assertEquals("maximum(byte,byte,byte) 1 failed", high, NumberUtils.max(high, mid, high));
-    }
-
-    @Test
-    public void testMaximumDouble() {
-        final double low = 12.3;
-        final double mid = 12.3 + 1;
-        final double high = 12.3 + 2;
-        assertEquals(high, NumberUtils.max(low, mid, high), 0.0001);
-        assertEquals(high, NumberUtils.max(mid, low, high), 0.0001);
-        assertEquals(high, NumberUtils.max(mid, high, low), 0.0001);
-        assertEquals(mid, NumberUtils.max(low, mid, low), 0.0001);
-        assertEquals(high, NumberUtils.max(high, mid, high), 0.0001);
-    }
-
-    @Test
-    public void testMaximumFloat() {
-        final float low = 12.3f;
-        final float mid = 12.3f + 1;
-        final float high = 12.3f + 2;
-        assertEquals(high, NumberUtils.max(low, mid, high), 0.0001f);
-        assertEquals(high, NumberUtils.max(mid, low, high), 0.0001f);
-        assertEquals(high, NumberUtils.max(mid, high, low), 0.0001f);
-        assertEquals(mid, NumberUtils.max(low, mid, low), 0.0001f);
-        assertEquals(high, NumberUtils.max(high, mid, high), 0.0001f);
-    }
-
-    // Testing JDK against old Lang functionality
-    @Test
-    public void testCompareDouble() {
-        assertTrue(Double.compare(Double.NaN, Double.NaN) == 0);
-        assertTrue(Double.compare(Double.NaN, Double.POSITIVE_INFINITY) == +1);
-        assertTrue(Double.compare(Double.NaN, Double.MAX_VALUE) == +1);
-        assertTrue(Double.compare(Double.NaN, 1.2d) == +1);
-        assertTrue(Double.compare(Double.NaN, 0.0d) == +1);
-        assertTrue(Double.compare(Double.NaN, -0.0d) == +1);
-        assertTrue(Double.compare(Double.NaN, -1.2d) == +1);
-        assertTrue(Double.compare(Double.NaN, -Double.MAX_VALUE) == +1);
-        assertTrue(Double.compare(Double.NaN, Double.NEGATIVE_INFINITY) == +1);
-
-        assertTrue(Double.compare(Double.POSITIVE_INFINITY, Double.NaN) == -1);
-        assertTrue(Double.compare(Double.POSITIVE_INFINITY, Double.POSITIVE_INFINITY) == 0);
-        assertTrue(Double.compare(Double.POSITIVE_INFINITY, Double.MAX_VALUE) == +1);
-        assertTrue(Double.compare(Double.POSITIVE_INFINITY, 1.2d) == +1);
-        assertTrue(Double.compare(Double.POSITIVE_INFINITY, 0.0d) == +1);
-        assertTrue(Double.compare(Double.POSITIVE_INFINITY, -0.0d) == +1);
-        assertTrue(Double.compare(Double.POSITIVE_INFINITY, -1.2d) == +1);
-        assertTrue(Double.compare(Double.POSITIVE_INFINITY, -Double.MAX_VALUE) == +1);
-        assertTrue(Double.compare(Double.POSITIVE_INFINITY, Double.NEGATIVE_INFINITY) == +1);
-
-        assertTrue(Double.compare(Double.MAX_VALUE, Double.NaN) == -1);
-        assertTrue(Double.compare(Double.MAX_VALUE, Double.POSITIVE_INFINITY) == -1);
-        assertTrue(Double.compare(Double.MAX_VALUE, Double.MAX_VALUE) == 0);
-        assertTrue(Double.compare(Double.MAX_VALUE, 1.2d) == +1);
-        assertTrue(Double.compare(Double.MAX_VALUE, 0.0d) == +1);
-        assertTrue(Double.compare(Double.MAX_VALUE, -0.0d) == +1);
-        assertTrue(Double.compare(Double.MAX_VALUE, -1.2d) == +1);
-        assertTrue(Double.compare(Double.MAX_VALUE, -Double.MAX_VALUE) == +1);
-        assertTrue(Double.compare(Double.MAX_VALUE, Double.NEGATIVE_INFINITY) == +1);
-
-        assertTrue(Double.compare(1.2d, Double.NaN) == -1);
-        assertTrue(Double.compare(1.2d, Double.POSITIVE_INFINITY) == -1);
-        assertTrue(Double.compare(1.2d, Double.MAX_VALUE) == -1);
-        assertTrue(Double.compare(1.2d, 1.2d) == 0);
-        assertTrue(Double.compare(1.2d, 0.0d) == +1);
-        assertTrue(Double.compare(1.2d, -0.0d) == +1);
-        assertTrue(Double.compare(1.2d, -1.2d) == +1);
-        assertTrue(Double.compare(1.2d, -Double.MAX_VALUE) == +1);
-        assertTrue(Double.compare(1.2d, Double.NEGATIVE_INFINITY) == +1);
-
-        assertTrue(Double.compare(0.0d, Double.NaN) == -1);
-        assertTrue(Double.compare(0.0d, Double.POSITIVE_INFINITY) == -1);
-        assertTrue(Double.compare(0.0d, Double.MAX_VALUE) == -1);
-        assertTrue(Double.compare(0.0d, 1.2d) == -1);
-        assertTrue(Double.compare(0.0d, 0.0d) == 0);
-        assertTrue(Double.compare(0.0d, -0.0d) == +1);
-        assertTrue(Double.compare(0.0d, -1.2d) == +1);
-        assertTrue(Double.compare(0.0d, -Double.MAX_VALUE) == +1);
-        assertTrue(Double.compare(0.0d, Double.NEGATIVE_INFINITY) == +1);
-
-        assertTrue(Double.compare(-0.0d, Double.NaN) == -1);
-        assertTrue(Double.compare(-0.0d, Double.POSITIVE_INFINITY) == -1);
-        assertTrue(Double.compare(-0.0d, Double.MAX_VALUE) == -1);
-        assertTrue(Double.compare(-0.0d, 1.2d) == -1);
-        assertTrue(Double.compare(-0.0d, 0.0d) == -1);
-        assertTrue(Double.compare(-0.0d, -0.0d) == 0);
-        assertTrue(Double.compare(-0.0d, -1.2d) == +1);
-        assertTrue(Double.compare(-0.0d, -Double.MAX_VALUE) == +1);
-        assertTrue(Double.compare(-0.0d, Double.NEGATIVE_INFINITY) == +1);
-
-        assertTrue(Double.compare(-1.2d, Double.NaN) == -1);
-        assertTrue(Double.compare(-1.2d, Double.POSITIVE_INFINITY) == -1);
-        assertTrue(Double.compare(-1.2d, Double.MAX_VALUE) == -1);
-        assertTrue(Double.compare(-1.2d, 1.2d) == -1);
-        assertTrue(Double.compare(-1.2d, 0.0d) == -1);
-        assertTrue(Double.compare(-1.2d, -0.0d) == -1);
-        assertTrue(Double.compare(-1.2d, -1.2d) == 0);
-        assertTrue(Double.compare(-1.2d, -Double.MAX_VALUE) == +1);
-        assertTrue(Double.compare(-1.2d, Double.NEGATIVE_INFINITY) == +1);
-
-        assertTrue(Double.compare(-Double.MAX_VALUE, Double.NaN) == -1);
-        assertTrue(Double.compare(-Double.MAX_VALUE, Double.POSITIVE_INFINITY) == -1);
-        assertTrue(Double.compare(-Double.MAX_VALUE, Double.MAX_VALUE) == -1);
-        assertTrue(Double.compare(-Double.MAX_VALUE, 1.2d) == -1);
-        assertTrue(Double.compare(-Double.MAX_VALUE, 0.0d) == -1);
-        assertTrue(Double.compare(-Double.MAX_VALUE, -0.0d) == -1);
-        assertTrue(Double.compare(-Double.MAX_VALUE, -1.2d) == -1);
-        assertTrue(Double.compare(-Double.MAX_VALUE, -Double.MAX_VALUE) == 0);
-        assertTrue(Double.compare(-Double.MAX_VALUE, Double.NEGATIVE_INFINITY) == +1);
-
-        assertTrue(Double.compare(Double.NEGATIVE_INFINITY, Double.NaN) == -1);
-        assertTrue(Double.compare(Double.NEGATIVE_INFINITY, Double.POSITIVE_INFINITY) == -1);
-        assertTrue(Double.compare(Double.NEGATIVE_INFINITY, Double.MAX_VALUE) == -1);
-        assertTrue(Double.compare(Double.NEGATIVE_INFINITY, 1.2d) == -1);
-        assertTrue(Double.compare(Double.NEGATIVE_INFINITY, 0.0d) == -1);
-        assertTrue(Double.compare(Double.NEGATIVE_INFINITY, -0.0d) == -1);
-        assertTrue(Double.compare(Double.NEGATIVE_INFINITY, -1.2d) == -1);
-        assertTrue(Double.compare(Double.NEGATIVE_INFINITY, -Double.MAX_VALUE) == -1);
-        assertTrue(Double.compare(Double.NEGATIVE_INFINITY, Double.NEGATIVE_INFINITY) == 0);
-    }
-
-    @Test
-    public void testCompareFloat() {
-        assertTrue(Float.compare(Float.NaN, Float.NaN) == 0);
-        assertTrue(Float.compare(Float.NaN, Float.POSITIVE_INFINITY) == +1);
-        assertTrue(Float.compare(Float.NaN, Float.MAX_VALUE) == +1);
-        assertTrue(Float.compare(Float.NaN, 1.2f) == +1);
-        assertTrue(Float.compare(Float.NaN, 0.0f) == +1);
-        assertTrue(Float.compare(Float.NaN, -0.0f) == +1);
-        assertTrue(Float.compare(Float.NaN, -1.2f) == +1);
-        assertTrue(Float.compare(Float.NaN, -Float.MAX_VALUE) == +1);
-        assertTrue(Float.compare(Float.NaN, Float.NEGATIVE_INFINITY) == +1);
-
-        assertTrue(Float.compare(Float.POSITIVE_INFINITY, Float.NaN) == -1);
-        assertTrue(Float.compare(Float.POSITIVE_INFINITY, Float.POSITIVE_INFINITY) == 0);
-        assertTrue(Float.compare(Float.POSITIVE_INFINITY, Float.MAX_VALUE) == +1);
-        assertTrue(Float.compare(Float.POSITIVE_INFINITY, 1.2f) == +1);
-        assertTrue(Float.compare(Float.POSITIVE_INFINITY, 0.0f) == +1);
-        assertTrue(Float.compare(Float.POSITIVE_INFINITY, -0.0f) == +1);
-        assertTrue(Float.compare(Float.POSITIVE_INFINITY, -1.2f) == +1);
-        assertTrue(Float.compare(Float.POSITIVE_INFINITY, -Float.MAX_VALUE) == +1);
-        assertTrue(Float.compare(Float.POSITIVE_INFINITY, Float.NEGATIVE_INFINITY) == +1);
-
-        assertTrue(Float.compare(Float.MAX_VALUE, Float.NaN) == -1);
-        assertTrue(Float.compare(Float.MAX_VALUE, Float.POSITIVE_INFINITY) == -1);
-        assertTrue(Float.compare(Float.MAX_VALUE, Float.MAX_VALUE) == 0);
-        assertTrue(Float.compare(Float.MAX_VALUE, 1.2f) == +1);
-        assertTrue(Float.compare(Float.MAX_VALUE, 0.0f) == +1);
-        assertTrue(Float.compare(Float.MAX_VALUE, -0.0f) == +1);
-        assertTrue(Float.compare(Float.MAX_VALUE, -1.2f) == +1);
-        assertTrue(Float.compare(Float.MAX_VALUE, -Float.MAX_VALUE) == +1);
-        assertTrue(Float.compare(Float.MAX_VALUE, Float.NEGATIVE_INFINITY) == +1);
-
-        assertTrue(Float.compare(1.2f, Float.NaN) == -1);
-        assertTrue(Float.compare(1.2f, Float.POSITIVE_INFINITY) == -1);
-        assertTrue(Float.compare(1.2f, Float.MAX_VALUE) == -1);
-        assertTrue(Float.compare(1.2f, 1.2f) == 0);
-        assertTrue(Float.compare(1.2f, 0.0f) == +1);
-        assertTrue(Float.compare(1.2f, -0.0f) == +1);
-        assertTrue(Float.compare(1.2f, -1.2f) == +1);
-        assertTrue(Float.compare(1.2f, -Float.MAX_VALUE) == +1);
-        assertTrue(Float.compare(1.2f, Float.NEGATIVE_INFINITY) == +1);
-
-        assertTrue(Float.compare(0.0f, Float.NaN) == -1);
-        assertTrue(Float.compare(0.0f, Float.POSITIVE_INFINITY) == -1);
-        assertTrue(Float.compare(0.0f, Float.MAX_VALUE) == -1);
-        assertTrue(Float.compare(0.0f, 1.2f) == -1);
-        assertTrue(Float.compare(0.0f, 0.0f) == 0);
-        assertTrue(Float.compare(0.0f, -0.0f) == +1);
-        assertTrue(Float.compare(0.0f, -1.2f) == +1);
-        assertTrue(Float.compare(0.0f, -Float.MAX_VALUE) == +1);
-        assertTrue(Float.compare(0.0f, Float.NEGATIVE_INFINITY) == +1);
-
-        assertTrue(Float.compare(-0.0f, Float.NaN) == -1);
-        assertTrue(Float.compare(-0.0f, Float.POSITIVE_INFINITY) == -1);
-        assertTrue(Float.compare(-0.0f, Float.MAX_VALUE) == -1);
-        assertTrue(Float.compare(-0.0f, 1.2f) == -1);
-        assertTrue(Float.compare(-0.0f, 0.0f) == -1);
-        assertTrue(Float.compare(-0.0f, -0.0f) == 0);
-        assertTrue(Float.compare(-0.0f, -1.2f) == +1);
-        assertTrue(Float.compare(-0.0f, -Float.MAX_VALUE) == +1);
-        assertTrue(Float.compare(-0.0f, Float.NEGATIVE_INFINITY) == +1);
-
-        assertTrue(Float.compare(-1.2f, Float.NaN) == -1);
-        assertTrue(Float.compare(-1.2f, Float.POSITIVE_INFINITY) == -1);
-        assertTrue(Float.compare(-1.2f, Float.MAX_VALUE) == -1);
-        assertTrue(Float.compare(-1.2f, 1.2f) == -1);
-        assertTrue(Float.compare(-1.2f, 0.0f) == -1);
-        assertTrue(Float.compare(-1.2f, -0.0f) == -1);
-        assertTrue(Float.compare(-1.2f, -1.2f) == 0);
-        assertTrue(Float.compare(-1.2f, -Float.MAX_VALUE) == +1);
-        assertTrue(Float.compare(-1.2f, Float.NEGATIVE_INFINITY) == +1);
-
-        assertTrue(Float.compare(-Float.MAX_VALUE, Float.NaN) == -1);
-        assertTrue(Float.compare(-Float.MAX_VALUE, Float.POSITIVE_INFINITY) == -1);
-        assertTrue(Float.compare(-Float.MAX_VALUE, Float.MAX_VALUE) == -1);
-        assertTrue(Float.compare(-Float.MAX_VALUE, 1.2f) == -1);
-        assertTrue(Float.compare(-Float.MAX_VALUE, 0.0f) == -1);
-        assertTrue(Float.compare(-Float.MAX_VALUE, -0.0f) == -1);
-        assertTrue(Float.compare(-Float.MAX_VALUE, -1.2f) == -1);
-        assertTrue(Float.compare(-Float.MAX_VALUE, -Float.MAX_VALUE) == 0);
-        assertTrue(Float.compare(-Float.MAX_VALUE, Float.NEGATIVE_INFINITY) == +1);
-
-        assertTrue(Float.compare(Float.NEGATIVE_INFINITY, Float.NaN) == -1);
-        assertTrue(Float.compare(Float.NEGATIVE_INFINITY, Float.POSITIVE_INFINITY) == -1);
-        assertTrue(Float.compare(Float.NEGATIVE_INFINITY, Float.MAX_VALUE) == -1);
-        assertTrue(Float.compare(Float.NEGATIVE_INFINITY, 1.2f) == -1);
-        assertTrue(Float.compare(Float.NEGATIVE_INFINITY, 0.0f) == -1);
-        assertTrue(Float.compare(Float.NEGATIVE_INFINITY, -0.0f) == -1);
-        assertTrue(Float.compare(Float.NEGATIVE_INFINITY, -1.2f) == -1);
-        assertTrue(Float.compare(Float.NEGATIVE_INFINITY, -Float.MAX_VALUE) == -1);
-        assertTrue(Float.compare(Float.NEGATIVE_INFINITY, Float.NEGATIVE_INFINITY) == 0);
-    }
-
-    @Test
-    public void testIsDigits() {
-        assertFalse("isDigits(null) failed", NumberUtils.isDigits(null));
-        assertFalse("isDigits('') failed", NumberUtils.isDigits(""));
-        assertTrue("isDigits(String) failed", NumberUtils.isDigits("12345"));
-        assertFalse("isDigits(String) neg 1 failed", NumberUtils.isDigits("1234.5"));
-        assertFalse("isDigits(String) neg 3 failed", NumberUtils.isDigits("1ab"));
-        assertFalse("isDigits(String) neg 4 failed", NumberUtils.isDigits("abc"));
-    }
-
-    /**
-     * Tests isNumber(String) and tests that createNumber(String) returns
-     * a valid number iff isNumber(String) returns false.
-     */
-    @Test
-    public void testIsNumber() {
-        compareIsNumberWithCreateNumber("12345", true);
-        compareIsNumberWithCreateNumber("1234.5", true);
-        compareIsNumberWithCreateNumber(".12345", true);
-        compareIsNumberWithCreateNumber("1234E5", true);
-        compareIsNumberWithCreateNumber("1234E+5", true);
-        compareIsNumberWithCreateNumber("1234E-5", true);
-        compareIsNumberWithCreateNumber("123.4E5", true);
-        compareIsNumberWithCreateNumber("-1234", true);
-        compareIsNumberWithCreateNumber("-1234.5", true);
-        compareIsNumberWithCreateNumber("-.12345", true);
-        compareIsNumberWithCreateNumber("-1234E5", true);
-        compareIsNumberWithCreateNumber("0", true);
-        compareIsNumberWithCreateNumber("-0", true);
-        compareIsNumberWithCreateNumber("01234", true);
-        compareIsNumberWithCreateNumber("-01234", true);
-        compareIsNumberWithCreateNumber("-0xABC123", true);
-        compareIsNumberWithCreateNumber("-0x0", true);
-        compareIsNumberWithCreateNumber("123.4E21D", true);
-        compareIsNumberWithCreateNumber("-221.23F", true);
-        compareIsNumberWithCreateNumber("22338L", true);
-
-        compareIsNumberWithCreateNumber(null, false);
-        compareIsNumberWithCreateNumber("", false);
-        compareIsNumberWithCreateNumber(" ", false);
-        compareIsNumberWithCreateNumber("\r\n\t", false);
-        compareIsNumberWithCreateNumber("--2.3", false);
-        compareIsNumberWithCreateNumber(".12.3", false);
-        compareIsNumberWithCreateNumber("-123E", false);
-        compareIsNumberWithCreateNumber("-123E+-212", false);
-        compareIsNumberWithCreateNumber("-123E2.12", false);
-        compareIsNumberWithCreateNumber("0xGF", false);
-        compareIsNumberWithCreateNumber("0xFAE-1", false);
-        compareIsNumberWithCreateNumber(".", false);
-        compareIsNumberWithCreateNumber("-0ABC123", false);
-        compareIsNumberWithCreateNumber("123.4E-D", false);
-        compareIsNumberWithCreateNumber("123.4ED", false);
-        compareIsNumberWithCreateNumber("1234E5l", false);
-        compareIsNumberWithCreateNumber("11a", false);
-        compareIsNumberWithCreateNumber("1a", false);
-        compareIsNumberWithCreateNumber("a", false);
-        compareIsNumberWithCreateNumber("11g", false);
-        compareIsNumberWithCreateNumber("11z", false);
-        compareIsNumberWithCreateNumber("11def", false);
-        compareIsNumberWithCreateNumber("11d11", false);
-        compareIsNumberWithCreateNumber("11 11", false);
-        compareIsNumberWithCreateNumber(" 1111", false);
-        compareIsNumberWithCreateNumber("1111 ", false);
-
-        compareIsNumberWithCreateNumber("2.", true); // LANG-521
-        compareIsNumberWithCreateNumber("1.1L", false); // LANG-664
-    }
-
-    @Test
-    public void testLANG971() {
-        compareIsNumberWithCreateNumber("0085", false);
-        compareIsNumberWithCreateNumber("085", false);
-        compareIsNumberWithCreateNumber("08", false);
-        compareIsNumberWithCreateNumber("07", true);
-        compareIsNumberWithCreateNumber("00", true);
-    }
-
-    @Test
-    public void testLANG992() {
-        compareIsNumberWithCreateNumber("0.0", true);
-        compareIsNumberWithCreateNumber("0.4790", true);
-    }
-
-    @Test
-    public void testLANG972() {
-        compareIsNumberWithCreateNumber("0xABCD", true);
-        compareIsNumberWithCreateNumber("0XABCD", true);
-    }
-
-    private void compareIsNumberWithCreateNumber(final String val, final boolean expected) {
-        final boolean isValid = NumberUtils.isNumber(val);
-        final boolean canCreate = checkCreateNumber(val);
-        if (isValid == expected && canCreate == expected) {
-            return;
-        }
-        fail("Expecting "+ expected + " for isNumber/createNumber using \"" + val + "\" but got " + isValid + " and " + canCreate);
-    }
-    
-    @Test
-    public void testIsParsable() {
-        assertFalse( NumberUtils.isParsable(null) );
-        assertFalse( NumberUtils.isParsable("") );
-        assertFalse( NumberUtils.isParsable("0xC1AB") );
-        assertFalse( NumberUtils.isParsable("65CBA2") );
-        assertFalse( NumberUtils.isParsable("pendro") );
-        assertFalse( NumberUtils.isParsable("64,2") );
-        assertFalse( NumberUtils.isParsable("64.2.2") );
-        assertFalse( NumberUtils.isParsable("64.") );
-        assertFalse( NumberUtils.isParsable("64L") );
-        assertTrue( NumberUtils.isParsable("64.2") );
-        assertTrue( NumberUtils.isParsable("64") );
-        assertTrue( NumberUtils.isParsable("018") );
-        assertTrue( NumberUtils.isParsable(".18") );
-        assertTrue( NumberUtils.isParsable("-65") );
-        assertTrue( NumberUtils.isParsable("-018") );
-        assertTrue( NumberUtils.isParsable("-018.2") );
-        assertTrue( NumberUtils.isParsable("-.236") );
-    }
-
-    private boolean checkCreateNumber(final String val) {
-        try {
-            final Object obj = NumberUtils.createNumber(val);
-            if (obj == null) {
-                return false;
-            }
-            return true;
-        } catch (final NumberFormatException e) {
-            return false;
-       }
-    }
-
-    @SuppressWarnings("cast") // suppress instanceof warning check
-    @Test
-    public void testConstants() {
-        assertTrue(NumberUtils.LONG_ZERO instanceof Long);
-        assertTrue(NumberUtils.LONG_ONE instanceof Long);
-        assertTrue(NumberUtils.LONG_MINUS_ONE instanceof Long);
-        assertTrue(NumberUtils.INTEGER_ZERO instanceof Integer);
-        assertTrue(NumberUtils.INTEGER_ONE instanceof Integer);
-        assertTrue(NumberUtils.INTEGER_MINUS_ONE instanceof Integer);
-        assertTrue(NumberUtils.SHORT_ZERO instanceof Short);
-        assertTrue(NumberUtils.SHORT_ONE instanceof Short);
-        assertTrue(NumberUtils.SHORT_MINUS_ONE instanceof Short);
-        assertTrue(NumberUtils.BYTE_ZERO instanceof Byte);
-        assertTrue(NumberUtils.BYTE_ONE instanceof Byte);
-        assertTrue(NumberUtils.BYTE_MINUS_ONE instanceof Byte);
-        assertTrue(NumberUtils.DOUBLE_ZERO instanceof Double);
-        assertTrue(NumberUtils.DOUBLE_ONE instanceof Double);
-        assertTrue(NumberUtils.DOUBLE_MINUS_ONE instanceof Double);
-        assertTrue(NumberUtils.FLOAT_ZERO instanceof Float);
-        assertTrue(NumberUtils.FLOAT_ONE instanceof Float);
-        assertTrue(NumberUtils.FLOAT_MINUS_ONE instanceof Float);
-
-        assertTrue(NumberUtils.LONG_ZERO.longValue() == 0);
-        assertTrue(NumberUtils.LONG_ONE.longValue() == 1);
-        assertTrue(NumberUtils.LONG_MINUS_ONE.longValue() == -1);
-        assertTrue(NumberUtils.INTEGER_ZERO.intValue() == 0);
-        assertTrue(NumberUtils.INTEGER_ONE.intValue() == 1);
-        assertTrue(NumberUtils.INTEGER_MINUS_ONE.intValue() == -1);
-        assertTrue(NumberUtils.SHORT_ZERO.shortValue() == 0);
-        assertTrue(NumberUtils.SHORT_ONE.shortValue() == 1);
-        assertTrue(NumberUtils.SHORT_MINUS_ONE.shortValue() == -1);
-        assertTrue(NumberUtils.BYTE_ZERO.byteValue() == 0);
-        assertTrue(NumberUtils.BYTE_ONE.byteValue() == 1);
-        assertTrue(NumberUtils.BYTE_MINUS_ONE.byteValue() == -1);
-        assertTrue(NumberUtils.DOUBLE_ZERO.doubleValue() == 0.0d);
-        assertTrue(NumberUtils.DOUBLE_ONE.doubleValue() == 1.0d);
-        assertTrue(NumberUtils.DOUBLE_MINUS_ONE.doubleValue() == -1.0d);
-        assertTrue(NumberUtils.FLOAT_ZERO.floatValue() == 0.0f);
-        assertTrue(NumberUtils.FLOAT_ONE.floatValue() == 1.0f);
-        assertTrue(NumberUtils.FLOAT_MINUS_ONE.floatValue() == -1.0f);
-    }
-
-    @Test
-    public void testLang300() {
-        NumberUtils.createNumber("-1l");
-        NumberUtils.createNumber("01l");
-        NumberUtils.createNumber("1l");
-    }
-
-    @Test
-    public void testLang381() {
-        assertTrue(Double.isNaN(NumberUtils.min(1.2, 2.5, Double.NaN)));
-        assertTrue(Double.isNaN(NumberUtils.max(1.2, 2.5, Double.NaN)));
-        assertTrue(Float.isNaN(NumberUtils.min(1.2f, 2.5f, Float.NaN)));
-        assertTrue(Float.isNaN(NumberUtils.max(1.2f, 2.5f, Float.NaN)));
-
-        final double[] a = new double[] { 1.2, Double.NaN, 3.7, 27.0, 42.0, Double.NaN };
-        assertTrue(Double.isNaN(NumberUtils.max(a)));
-        assertTrue(Double.isNaN(NumberUtils.min(a)));
-
-        final double[] b = new double[] { Double.NaN, 1.2, Double.NaN, 3.7, 27.0, 42.0, Double.NaN };
-        assertTrue(Double.isNaN(NumberUtils.max(b)));
-        assertTrue(Double.isNaN(NumberUtils.min(b)));
-
-        final float[] aF = new float[] { 1.2f, Float.NaN, 3.7f, 27.0f, 42.0f, Float.NaN };
-        assertTrue(Float.isNaN(NumberUtils.max(aF)));
-
-        final float[] bF = new float[] { Float.NaN, 1.2f, Float.NaN, 3.7f, 27.0f, 42.0f, Float.NaN };
-        assertTrue(Float.isNaN(NumberUtils.max(bF)));
-    }
-
-    @Test
-    public void compareInt() {
-        assertTrue(NumberUtils.compare(-3, 0) < 0);
-        assertTrue(NumberUtils.compare(113, 113)==0);
-        assertTrue(NumberUtils.compare(213, 32) > 0);
-    }
-
-    @Test
-    public void compareLong() {
-        assertTrue(NumberUtils.compare(-3L, 0L) < 0);
-        assertTrue(NumberUtils.compare(113L, 113L)==0);
-        assertTrue(NumberUtils.compare(213L, 32L) > 0);
-    }
-
-    @Test
-    public void compareShort() {
-        assertTrue(NumberUtils.compare((short)-3, (short)0) < 0);
-        assertTrue(NumberUtils.compare((short)113, (short)113)==0);
-        assertTrue(NumberUtils.compare((short)213, (short)32) > 0);
-    }
-
-    @Test
-    public void compareByte() {
-        assertTrue(NumberUtils.compare((byte)-3, (byte)0) < 0);
-        assertTrue(NumberUtils.compare((byte)113, (byte)113)==0);
-        assertTrue(NumberUtils.compare((byte)123, (byte)32) > 0);
-    }
-}
diff --git a/lang/src/test/java/org/apache/commons/lang3/mutable/MutableBooleanTest.java b/lang/src/test/java/org/apache/commons/lang3/mutable/MutableBooleanTest.java
deleted file mode 100644
index 8e3e314..0000000
--- a/lang/src/test/java/org/apache/commons/lang3/mutable/MutableBooleanTest.java
+++ /dev/null
@@ -1,141 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- * 
- *      http://www.apache.org/licenses/LICENSE-2.0
- * 
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package org.apache.commons.lang3.mutable;
-
-import org.junit.Test;
-import static org.junit.Assert.*;
-
-/**
- * JUnit tests.
- * 
- * @since 2.2
- * @see MutableBoolean
- * @version $Id$
- */
-public class MutableBooleanTest {
-
-    @Test
-    public void testCompareTo() {
-        final MutableBoolean mutBool = new MutableBoolean(false);
-
-        assertEquals(0, mutBool.compareTo(new MutableBoolean(false)));
-        assertEquals(-1, mutBool.compareTo(new MutableBoolean(true)));
-        mutBool.setValue(true);
-        assertEquals(+1, mutBool.compareTo(new MutableBoolean(false)));
-        assertEquals(0, mutBool.compareTo(new MutableBoolean(true)));
-    }
-    
-    @Test(expected=NullPointerException.class)
-    public void testCompareToNull() {
-        final MutableBoolean mutBool = new MutableBoolean(false);
-        mutBool.compareTo(null);
-    }
-
-    // ----------------------------------------------------------------
-    @Test
-    public void testConstructors() {
-        assertFalse(new MutableBoolean().booleanValue());
-
-        assertTrue(new MutableBoolean(true).booleanValue());
-        assertFalse(new MutableBoolean(false).booleanValue());
-
-        assertTrue(new MutableBoolean(Boolean.TRUE).booleanValue());
-        assertFalse(new MutableBoolean(Boolean.FALSE).booleanValue());
-
-    }
-
-    @Test(expected=NullPointerException.class)
-    public void testConstructorNull() {
-        new MutableBoolean(null);
-    }
-
-    @Test
-    public void testEquals() {
-        final MutableBoolean mutBoolA = new MutableBoolean(false);
-        final MutableBoolean mutBoolB = new MutableBoolean(false);
-        final MutableBoolean mutBoolC = new MutableBoolean(true);
-
-        assertTrue(mutBoolA.equals(mutBoolA));
-        assertTrue(mutBoolA.equals(mutBoolB));
-        assertTrue(mutBoolB.equals(mutBoolA));
-        assertTrue(mutBoolB.equals(mutBoolB));
-        assertFalse(mutBoolA.equals(mutBoolC));
-        assertFalse(mutBoolB.equals(mutBoolC));
-        assertTrue(mutBoolC.equals(mutBoolC));
-        assertFalse(mutBoolA.equals(null));
-        assertFalse(mutBoolA.equals(Boolean.FALSE));
-        assertFalse(mutBoolA.equals("false"));
-    }
-
-    @Test
-    public void testGetSet() {
-        assertFalse(new MutableBoolean().booleanValue());
-        assertEquals(Boolean.FALSE, new MutableBoolean().getValue());
-        
-        final MutableBoolean mutBool = new MutableBoolean(false);
-        assertEquals(Boolean.FALSE, mutBool.toBoolean());
-        assertFalse(mutBool.booleanValue());
-        assertTrue(mutBool.isFalse());
-        assertFalse(mutBool.isTrue());
-
-        mutBool.setValue(Boolean.TRUE);
-        assertEquals(Boolean.TRUE, mutBool.toBoolean());
-        assertTrue(mutBool.booleanValue());
-        assertFalse(mutBool.isFalse());
-        assertTrue(mutBool.isTrue());
-
-        mutBool.setValue(false);
-        assertFalse(mutBool.booleanValue());
-
-        mutBool.setValue(true);
-        assertTrue(mutBool.booleanValue());
-
-        mutBool.setFalse();
-        assertFalse(mutBool.booleanValue());
-
-        mutBool.setTrue();
-        assertTrue(mutBool.booleanValue());
-
-    }
-
-    @Test(expected=NullPointerException.class)
-    public void testSetNull() {
-        final MutableBoolean mutBool = new MutableBoolean(false);
-        mutBool.setValue(null);
-    }
-
-    @Test
-    public void testHashCode() {
-        final MutableBoolean mutBoolA = new MutableBoolean(false);
-        final MutableBoolean mutBoolB = new MutableBoolean(false);
-        final MutableBoolean mutBoolC = new MutableBoolean(true);
-
-        assertEquals(mutBoolA.hashCode(), mutBoolA.hashCode());
-        assertEquals(mutBoolA.hashCode(), mutBoolB.hashCode());
-        assertFalse(mutBoolA.hashCode() == mutBoolC.hashCode());
-        assertEquals(mutBoolA.hashCode(), Boolean.FALSE.hashCode());
-        assertEquals(mutBoolC.hashCode(), Boolean.TRUE.hashCode());
-    }
-
-    @Test
-    public void testToString() {
-        assertEquals(Boolean.FALSE.toString(), new MutableBoolean(false).toString());
-        assertEquals(Boolean.TRUE.toString(), new MutableBoolean(true).toString());
-    }
-
-}
diff --git a/lang/src/test/java/org/apache/commons/lang3/mutable/MutableByteTest.java b/lang/src/test/java/org/apache/commons/lang3/mutable/MutableByteTest.java
deleted file mode 100644
index 12d3283..0000000
--- a/lang/src/test/java/org/apache/commons/lang3/mutable/MutableByteTest.java
+++ /dev/null
@@ -1,194 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- * 
- *      http://www.apache.org/licenses/LICENSE-2.0
- * 
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.commons.lang3.mutable;
-
-import org.junit.Test;
-import static org.junit.Assert.*;
-
-/**
- * JUnit tests.
- * 
- * @version $Id$
- * @see MutableByte
- */
-public class MutableByteTest {
-
-    // ----------------------------------------------------------------
-    @Test
-    public void testConstructors() {
-        assertEquals((byte) 0, new MutableByte().byteValue());
-        
-        assertEquals((byte) 1, new MutableByte((byte) 1).byteValue());
-        
-        assertEquals((byte) 2, new MutableByte(Byte.valueOf((byte) 2)).byteValue());
-        assertEquals((byte) 3, new MutableByte(new MutableByte((byte) 3)).byteValue());
-
-        assertEquals((byte) 2, new MutableByte("2").byteValue());
-
-    }
-
-    @Test(expected=NullPointerException.class)
-    public void testConstructorNull() {
-        new MutableByte((Number)null);
-    }
-
-    @Test
-    public void testGetSet() {
-        final MutableByte mutNum = new MutableByte((byte) 0);
-        assertEquals((byte) 0, new MutableByte().byteValue());
-        assertEquals(Byte.valueOf((byte) 0), new MutableByte().getValue());
-        
-        mutNum.setValue((byte) 1);
-        assertEquals((byte) 1, mutNum.byteValue());
-        assertEquals(Byte.valueOf((byte) 1), mutNum.getValue());
-        
-        mutNum.setValue(Byte.valueOf((byte) 2));
-        assertEquals((byte) 2, mutNum.byteValue());
-        assertEquals(Byte.valueOf((byte) 2), mutNum.getValue());
-        
-        mutNum.setValue(new MutableByte((byte) 3));
-        assertEquals((byte) 3, mutNum.byteValue());
-        assertEquals(Byte.valueOf((byte) 3), mutNum.getValue());
-    }
-
-    @Test(expected=NullPointerException.class)
-    public void testSetNull() {
-        final MutableByte mutNum = new MutableByte((byte) 0);
-        mutNum.setValue(null);
-    }
-
-    @Test
-    public void testEquals() {
-        final MutableByte mutNumA = new MutableByte((byte) 0);
-        final MutableByte mutNumB = new MutableByte((byte) 0);
-        final MutableByte mutNumC = new MutableByte((byte) 1);
-
-        assertTrue(mutNumA.equals(mutNumA));
-        assertTrue(mutNumA.equals(mutNumB));
-        assertTrue(mutNumB.equals(mutNumA));
-        assertTrue(mutNumB.equals(mutNumB));
-        assertFalse(mutNumA.equals(mutNumC));
-        assertFalse(mutNumB.equals(mutNumC));
-        assertTrue(mutNumC.equals(mutNumC));
-        assertFalse(mutNumA.equals(null));
-        assertFalse(mutNumA.equals(Byte.valueOf((byte) 0)));
-        assertFalse(mutNumA.equals("0"));
-    }
-
-    @Test
-    public void testHashCode() {
-        final MutableByte mutNumA = new MutableByte((byte) 0);
-        final MutableByte mutNumB = new MutableByte((byte) 0);
-        final MutableByte mutNumC = new MutableByte((byte) 1);
-
-        assertTrue(mutNumA.hashCode() == mutNumA.hashCode());
-        assertTrue(mutNumA.hashCode() == mutNumB.hashCode());
-        assertFalse(mutNumA.hashCode() == mutNumC.hashCode());
-        assertTrue(mutNumA.hashCode() == Byte.valueOf((byte) 0).hashCode());
-    }
-
-    @Test
-    public void testCompareTo() {
-        final MutableByte mutNum = new MutableByte((byte) 0);
-
-        assertEquals((byte) 0, mutNum.compareTo(new MutableByte((byte) 0)));
-        assertEquals((byte) +1, mutNum.compareTo(new MutableByte((byte) -1)));
-        assertEquals((byte) -1, mutNum.compareTo(new MutableByte((byte) 1)));
-    }
-
-    @Test(expected=NullPointerException.class)
-    public void testCompareToNull() {
-        final MutableByte mutNum = new MutableByte((byte) 0);
-        mutNum.compareTo(null);
-    }
-
-    @Test
-    public void testPrimitiveValues() {
-        final MutableByte mutNum = new MutableByte( (byte) 1 );
-        
-        assertEquals( 1.0F, mutNum.floatValue(), 0 );
-        assertEquals( 1.0, mutNum.doubleValue(), 0 );
-        assertEquals( (byte) 1, mutNum.byteValue() );
-        assertEquals( (short) 1, mutNum.shortValue() );
-        assertEquals( 1, mutNum.intValue() );
-        assertEquals( 1L, mutNum.longValue() );
-    }
-
-    @Test
-    public void testToByte() {
-        assertEquals(Byte.valueOf((byte) 0), new MutableByte((byte) 0).toByte());
-        assertEquals(Byte.valueOf((byte) 123), new MutableByte((byte) 123).toByte());
-    }
-
-    @Test
-    public void testIncrement() {
-        final MutableByte mutNum = new MutableByte((byte) 1);
-        mutNum.increment();
-        
-        assertEquals(2, mutNum.intValue());
-        assertEquals(2L, mutNum.longValue());
-    }
-
-    @Test
-    public void testDecrement() {
-        final MutableByte mutNum = new MutableByte((byte) 1);
-        mutNum.decrement();
-        
-        assertEquals(0, mutNum.intValue());
-        assertEquals(0L, mutNum.longValue());
-    }
-
-    @Test
-    public void testAddValuePrimitive() {
-        final MutableByte mutNum = new MutableByte((byte) 1);
-        mutNum.add((byte)1);
-        
-        assertEquals((byte) 2, mutNum.byteValue());
-    }
-
-    @Test
-    public void testAddValueObject() {
-        final MutableByte mutNum = new MutableByte((byte) 1);
-        mutNum.add(Integer.valueOf(1));
-        
-        assertEquals((byte) 2, mutNum.byteValue());
-    }
-
-    @Test
-    public void testSubtractValuePrimitive() {
-        final MutableByte mutNum = new MutableByte((byte) 1);
-        mutNum.subtract((byte) 1);
-        
-        assertEquals((byte) 0, mutNum.byteValue());
-    }
-
-    @Test
-    public void testSubtractValueObject() {
-        final MutableByte mutNum = new MutableByte((byte) 1);
-        mutNum.subtract(Integer.valueOf(1));
-        
-        assertEquals((byte) 0, mutNum.byteValue());
-    }
-
-    @Test
-    public void testToString() {
-        assertEquals("0", new MutableByte((byte) 0).toString());
-        assertEquals("10", new MutableByte((byte) 10).toString());
-        assertEquals("-123", new MutableByte((byte) -123).toString());
-    }
-
-}
diff --git a/lang/src/test/java/org/apache/commons/lang3/mutable/MutableDoubleTest.java b/lang/src/test/java/org/apache/commons/lang3/mutable/MutableDoubleTest.java
deleted file mode 100644
index 1518062..0000000
--- a/lang/src/test/java/org/apache/commons/lang3/mutable/MutableDoubleTest.java
+++ /dev/null
@@ -1,206 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- * 
- *      http://www.apache.org/licenses/LICENSE-2.0
- * 
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.commons.lang3.mutable;
-
-import org.junit.Test;
-import static org.junit.Assert.*;
-
-/**
- * JUnit tests.
- * 
- * @version $Id$
- * @see MutableDouble
- */
-public class MutableDoubleTest {
-
-    // ----------------------------------------------------------------
-    @Test
-    public void testConstructors() {
-        assertEquals(0d, new MutableDouble().doubleValue(), 0.0001d);
-        
-        assertEquals(1d, new MutableDouble(1d).doubleValue(), 0.0001d);
-        
-        assertEquals(2d, new MutableDouble(Double.valueOf(2d)).doubleValue(), 0.0001d);
-        assertEquals(3d, new MutableDouble(new MutableDouble(3d)).doubleValue(), 0.0001d);
-        
-        assertEquals(2d, new MutableDouble("2.0").doubleValue(), 0.0001d);
-
-    }
-
-    @Test(expected=NullPointerException.class)
-    public void testConstructorNull() {
-        new MutableDouble((Number)null);
-    }
-
-    @Test
-    public void testGetSet() {
-        final MutableDouble mutNum = new MutableDouble(0d);
-        assertEquals(0d, new MutableDouble().doubleValue(), 0.0001d);
-        assertEquals(Double.valueOf(0), new MutableDouble().getValue());
-        
-        mutNum.setValue(1);
-        assertEquals(1d, mutNum.doubleValue(), 0.0001d);
-        assertEquals(Double.valueOf(1d), mutNum.getValue());
-        
-        mutNum.setValue(Double.valueOf(2d));
-        assertEquals(2d, mutNum.doubleValue(), 0.0001d);
-        assertEquals(Double.valueOf(2d), mutNum.getValue());
-        
-        mutNum.setValue(new MutableDouble(3d));
-        assertEquals(3d, mutNum.doubleValue(), 0.0001d);
-        assertEquals(Double.valueOf(3d), mutNum.getValue());
-    }
-
-    @Test(expected=NullPointerException.class)
-    public void testSetNull() {
-        final MutableDouble mutNum = new MutableDouble(0d);
-        mutNum.setValue(null);
-    }
-
-    @Test
-    public void testNanInfinite() {
-        MutableDouble mutNum = new MutableDouble(Double.NaN);
-        assertTrue(mutNum.isNaN());
-        
-        mutNum = new MutableDouble(Double.POSITIVE_INFINITY);
-        assertTrue(mutNum.isInfinite());
-        
-        mutNum = new MutableDouble(Double.NEGATIVE_INFINITY);
-        assertTrue(mutNum.isInfinite());
-    }
-
-    @Test
-    public void testEquals() {
-        final MutableDouble mutNumA = new MutableDouble(0d);
-        final MutableDouble mutNumB = new MutableDouble(0d);
-        final MutableDouble mutNumC = new MutableDouble(1d);
-
-        assertTrue(mutNumA.equals(mutNumA));
-        assertTrue(mutNumA.equals(mutNumB));
-        assertTrue(mutNumB.equals(mutNumA));
-        assertTrue(mutNumB.equals(mutNumB));
-        assertFalse(mutNumA.equals(mutNumC));
-        assertFalse(mutNumB.equals(mutNumC));
-        assertTrue(mutNumC.equals(mutNumC));
-        assertFalse(mutNumA.equals(null));
-        assertFalse(mutNumA.equals(Double.valueOf(0d)));
-        assertFalse(mutNumA.equals("0"));
-    }
-
-    @Test
-    public void testHashCode() {
-        final MutableDouble mutNumA = new MutableDouble(0d);
-        final MutableDouble mutNumB = new MutableDouble(0d);
-        final MutableDouble mutNumC = new MutableDouble(1d);
-
-        assertTrue(mutNumA.hashCode() == mutNumA.hashCode());
-        assertTrue(mutNumA.hashCode() == mutNumB.hashCode());
-        assertFalse(mutNumA.hashCode() == mutNumC.hashCode());
-        assertTrue(mutNumA.hashCode() == Double.valueOf(0d).hashCode());
-    }
-
-    @Test
-    public void testCompareTo() {
-        final MutableDouble mutNum = new MutableDouble(0d);
-
-        assertEquals(0, mutNum.compareTo(new MutableDouble(0d)));
-        assertEquals(+1, mutNum.compareTo(new MutableDouble(-1d)));
-        assertEquals(-1, mutNum.compareTo(new MutableDouble(1d)));
-    }
-
-    @Test(expected=NullPointerException.class)
-    public void testCompareToNull() {
-        final MutableDouble mutNum = new MutableDouble(0d);
-        mutNum.compareTo(null);
-    }
-
-    @Test
-    public void testPrimitiveValues() {
-        final MutableDouble mutNum = new MutableDouble(1.7);
-        
-        assertEquals( 1.7F, mutNum.floatValue(), 0 );
-        assertEquals( 1.7, mutNum.doubleValue(), 0 );
-        assertEquals( (byte) 1, mutNum.byteValue() );
-        assertEquals( (short) 1, mutNum.shortValue() );
-        assertEquals( 1, mutNum.intValue() );
-        assertEquals( 1L, mutNum.longValue() );
-    }
-
-    @Test
-    public void testToDouble() {
-        assertEquals(Double.valueOf(0d), new MutableDouble(0d).toDouble());
-        assertEquals(Double.valueOf(12.3d), new MutableDouble(12.3d).toDouble());
-    }
-
-    @Test
-    public void testIncrement() {
-        final MutableDouble mutNum = new MutableDouble(1);
-        mutNum.increment();
-        
-        assertEquals(2, mutNum.intValue());
-        assertEquals(2L, mutNum.longValue());
-    }
-
-    @Test
-    public void testDecrement() {
-        final MutableDouble mutNum = new MutableDouble(1);
-        mutNum.decrement();
-        
-        assertEquals(0, mutNum.intValue());
-        assertEquals(0L, mutNum.longValue());
-    }
-
-    @Test
-    public void testAddValuePrimitive() {
-        final MutableDouble mutNum = new MutableDouble(1);
-        mutNum.add(1.1d);
-        
-        assertEquals(2.1d, mutNum.doubleValue(), 0.01d);
-    }
-
-    @Test
-    public void testAddValueObject() {
-        final MutableDouble mutNum = new MutableDouble(1);
-        mutNum.add(Double.valueOf(1.1d));
-        
-        assertEquals(2.1d, mutNum.doubleValue(), 0.01d);
-    }
-
-    @Test
-    public void testSubtractValuePrimitive() {
-        final MutableDouble mutNum = new MutableDouble(1);
-        mutNum.subtract(0.9d);
-        
-        assertEquals(0.1d, mutNum.doubleValue(), 0.01d);
-    }
-
-    @Test
-    public void testSubtractValueObject() {
-        final MutableDouble mutNum = new MutableDouble(1);
-        mutNum.subtract(Double.valueOf(0.9d));
-        
-        assertEquals(0.1d, mutNum.doubleValue(), 0.01d);
-    }
-
-    @Test
-    public void testToString() {
-        assertEquals("0.0", new MutableDouble(0d).toString());
-        assertEquals("10.0", new MutableDouble(10d).toString());
-        assertEquals("-123.0", new MutableDouble(-123d).toString());
-    }
-
-}
diff --git a/lang/src/test/java/org/apache/commons/lang3/mutable/MutableFloatTest.java b/lang/src/test/java/org/apache/commons/lang3/mutable/MutableFloatTest.java
deleted file mode 100644
index f4663b1..0000000
--- a/lang/src/test/java/org/apache/commons/lang3/mutable/MutableFloatTest.java
+++ /dev/null
@@ -1,206 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- * 
- *      http://www.apache.org/licenses/LICENSE-2.0
- * 
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.commons.lang3.mutable;
-
-import org.junit.Test;
-import static org.junit.Assert.*;
-
-/**
- * JUnit tests.
- * 
- * @version $Id$
- * @see MutableFloat
- */
-public class MutableFloatTest {
-
-    // ----------------------------------------------------------------
-    @Test
-    public void testConstructors() {
-        assertEquals(0f, new MutableFloat().floatValue(), 0.0001f);
-        
-        assertEquals(1f, new MutableFloat(1f).floatValue(), 0.0001f);
-        
-        assertEquals(2f, new MutableFloat(Float.valueOf(2f)).floatValue(), 0.0001f);
-        assertEquals(3f, new MutableFloat(new MutableFloat(3f)).floatValue(), 0.0001f);
-
-        assertEquals(2f, new MutableFloat("2.0").floatValue(), 0.0001f);
-
-    }
-
-    @Test(expected=NullPointerException.class)
-    public void testConstructorNull() {
-        new MutableFloat((Number)null);
-    }
-
-    @Test
-    public void testGetSet() {
-        final MutableFloat mutNum = new MutableFloat(0f);
-        assertEquals(0f, new MutableFloat().floatValue(), 0.0001f);
-        assertEquals(Float.valueOf(0), new MutableFloat().getValue());
-        
-        mutNum.setValue(1);
-        assertEquals(1f, mutNum.floatValue(), 0.0001f);
-        assertEquals(Float.valueOf(1f), mutNum.getValue());
-        
-        mutNum.setValue(Float.valueOf(2f));
-        assertEquals(2f, mutNum.floatValue(), 0.0001f);
-        assertEquals(Float.valueOf(2f), mutNum.getValue());
-        
-        mutNum.setValue(new MutableFloat(3f));
-        assertEquals(3f, mutNum.floatValue(), 0.0001f);
-        assertEquals(Float.valueOf(3f), mutNum.getValue());
-    }
-
-    @Test(expected=NullPointerException.class)
-    public void testSetNull() {
-        final MutableFloat mutNum = new MutableFloat(0f);
-        mutNum.setValue(null);
-    }
-
-    @Test
-    public void testNanInfinite() {
-        MutableFloat mutNum = new MutableFloat(Float.NaN);
-        assertTrue(mutNum.isNaN());
-        
-        mutNum = new MutableFloat(Float.POSITIVE_INFINITY);
-        assertTrue(mutNum.isInfinite());
-        
-        mutNum = new MutableFloat(Float.NEGATIVE_INFINITY);
-        assertTrue(mutNum.isInfinite());
-    }
-
-    @Test
-    public void testEquals() {
-        final MutableFloat mutNumA = new MutableFloat(0f);
-        final MutableFloat mutNumB = new MutableFloat(0f);
-        final MutableFloat mutNumC = new MutableFloat(1f);
-
-        assertTrue(mutNumA.equals(mutNumA));
-        assertTrue(mutNumA.equals(mutNumB));
-        assertTrue(mutNumB.equals(mutNumA));
-        assertTrue(mutNumB.equals(mutNumB));
-        assertFalse(mutNumA.equals(mutNumC));
-        assertFalse(mutNumB.equals(mutNumC));
-        assertTrue(mutNumC.equals(mutNumC));
-        assertFalse(mutNumA.equals(null));
-        assertFalse(mutNumA.equals(Float.valueOf(0f)));
-        assertFalse(mutNumA.equals("0"));
-    }
-
-    @Test
-    public void testHashCode() {
-        final MutableFloat mutNumA = new MutableFloat(0f);
-        final MutableFloat mutNumB = new MutableFloat(0f);
-        final MutableFloat mutNumC = new MutableFloat(1f);
-
-        assertTrue(mutNumA.hashCode() == mutNumA.hashCode());
-        assertTrue(mutNumA.hashCode() == mutNumB.hashCode());
-        assertFalse(mutNumA.hashCode() == mutNumC.hashCode());
-        assertTrue(mutNumA.hashCode() == Float.valueOf(0f).hashCode());
-    }
-
-    @Test
-    public void testCompareTo() {
-        final MutableFloat mutNum = new MutableFloat(0f);
-
-        assertEquals(0, mutNum.compareTo(new MutableFloat(0f)));
-        assertEquals(+1, mutNum.compareTo(new MutableFloat(-1f)));
-        assertEquals(-1, mutNum.compareTo(new MutableFloat(1f)));
-    }
-
-    @Test(expected=NullPointerException.class)
-    public void testCompareToNull() {
-        final MutableFloat mutNum = new MutableFloat(0f);
-        mutNum.compareTo(null);
-    }
-
-    @Test
-    public void testPrimitiveValues() {
-        final MutableFloat mutNum = new MutableFloat(1.7F);
-        
-        assertEquals( 1, mutNum.intValue() );
-        assertEquals( 1.7, mutNum.doubleValue(), 0.00001 );
-        assertEquals( (byte) 1, mutNum.byteValue() );
-        assertEquals( (short) 1, mutNum.shortValue() );
-        assertEquals( 1, mutNum.intValue() );
-        assertEquals( 1L, mutNum.longValue() );
-    }
-
-    @Test
-    public void testToFloat() {
-        assertEquals(Float.valueOf(0f), new MutableFloat(0f).toFloat());
-        assertEquals(Float.valueOf(12.3f), new MutableFloat(12.3f).toFloat());
-    }
-
-    @Test
-    public void testIncrement() {
-        final MutableFloat mutNum = new MutableFloat(1);
-        mutNum.increment();
-        
-        assertEquals(2, mutNum.intValue());
-        assertEquals(2L, mutNum.longValue());
-    }
-
-    @Test
-    public void testDecrement() {
-        final MutableFloat mutNum = new MutableFloat(1);
-        mutNum.decrement();
-        
-        assertEquals(0, mutNum.intValue());
-        assertEquals(0L, mutNum.longValue());
-    }
-
-    @Test
-    public void testAddValuePrimitive() {
-        final MutableFloat mutNum = new MutableFloat(1);
-        mutNum.add(1.1f);
-        
-        assertEquals(2.1f, mutNum.floatValue(), 0.01f);
-    }
-
-    @Test
-    public void testAddValueObject() {
-        final MutableFloat mutNum = new MutableFloat(1);
-        mutNum.add(Float.valueOf(1.1f));
-        
-        assertEquals(2.1f, mutNum.floatValue(), 0.01f);
-    }
-
-    @Test
-    public void testSubtractValuePrimitive() {
-        final MutableFloat mutNum = new MutableFloat(1);
-        mutNum.subtract(0.9f);
-        
-        assertEquals(0.1f, mutNum.floatValue(), 0.01f);
-    }
-
-    @Test
-    public void testSubtractValueObject() {
-        final MutableFloat mutNum = new MutableFloat(1);
-        mutNum.subtract(Float.valueOf(0.9f));
-        
-        assertEquals(0.1f, mutNum.floatValue(), 0.01f);
-    }
-
-    @Test
-    public void testToString() {
-        assertEquals("0.0", new MutableFloat(0f).toString());
-        assertEquals("10.0", new MutableFloat(10f).toString());
-        assertEquals("-123.0", new MutableFloat(-123f).toString());
-    }
-
-}
diff --git a/lang/src/test/java/org/apache/commons/lang3/mutable/MutableIntTest.java b/lang/src/test/java/org/apache/commons/lang3/mutable/MutableIntTest.java
deleted file mode 100644
index e68eede..0000000
--- a/lang/src/test/java/org/apache/commons/lang3/mutable/MutableIntTest.java
+++ /dev/null
@@ -1,204 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- * 
- *      http://www.apache.org/licenses/LICENSE-2.0
- * 
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.commons.lang3.mutable;
-
-import org.junit.Test;
-import static org.junit.Assert.*;
-
-/**
- * JUnit tests.
- * 
- * @version $Id$
- * @see MutableInt
- */
-public class MutableIntTest {
-
-    // ----------------------------------------------------------------
-    @Test
-    public void testConstructors() {
-        assertEquals(0, new MutableInt().intValue());
-        
-        assertEquals(1, new MutableInt(1).intValue());
-        
-        assertEquals(2, new MutableInt(Integer.valueOf(2)).intValue());
-        assertEquals(3, new MutableInt(new MutableLong(3)).intValue());
-
-        assertEquals(2, new MutableInt("2").intValue());
-
-    }
-
-    @Test(expected=NullPointerException.class)
-    public void testConstructorNull() {
-        new MutableInt((Number)null);
-    }
-
-    @Test
-    public void testGetSet() {
-        final MutableInt mutNum = new MutableInt(0);
-        assertEquals(0, new MutableInt().intValue());
-        assertEquals(Integer.valueOf(0), new MutableInt().getValue());
-        
-        mutNum.setValue(1);
-        assertEquals(1, mutNum.intValue());
-        assertEquals(Integer.valueOf(1), mutNum.getValue());
-        
-        mutNum.setValue(Integer.valueOf(2));
-        assertEquals(2, mutNum.intValue());
-        assertEquals(Integer.valueOf(2), mutNum.getValue());
-        
-        mutNum.setValue(new MutableLong(3));
-        assertEquals(3, mutNum.intValue());
-        assertEquals(Integer.valueOf(3), mutNum.getValue());
-    }
-
-    @Test(expected=NullPointerException.class)
-    public void testSetNull() {
-        final MutableInt mutNum = new MutableInt(0);
-        mutNum.setValue(null);
-    }
-
-    @Test
-    public void testEquals() {
-        this.testEquals(new MutableInt(0), new MutableInt(0), new MutableInt(1));
-        // Should Numbers be supported? GaryG July-21-2005.
-        //this.testEquals(mutNumA, Integer.valueOf(0), mutNumC);
-    }
-
-    /**
-     * @param numA must not be a 0 Integer; must not equal numC.
-     * @param numB must equal numA; must not equal numC.
-     * @param numC must not equal numA; must not equal numC.
-     */
-    void testEquals(final Number numA, final Number numB, final Number numC) {
-        assertTrue(numA.equals(numA));
-        assertTrue(numA.equals(numB));
-        assertTrue(numB.equals(numA));
-        assertTrue(numB.equals(numB));
-        assertFalse(numA.equals(numC));
-        assertFalse(numB.equals(numC));
-        assertTrue(numC.equals(numC));
-        assertFalse(numA.equals(null));
-        assertFalse(numA.equals(Integer.valueOf(0)));
-        assertFalse(numA.equals("0"));
-    }
-
-    @Test
-    public void testHashCode() {
-        final MutableInt mutNumA = new MutableInt(0);
-        final MutableInt mutNumB = new MutableInt(0);
-        final MutableInt mutNumC = new MutableInt(1);
-
-        assertTrue(mutNumA.hashCode() == mutNumA.hashCode());
-        assertTrue(mutNumA.hashCode() == mutNumB.hashCode());
-        assertFalse(mutNumA.hashCode() == mutNumC.hashCode());
-        assertTrue(mutNumA.hashCode() == Integer.valueOf(0).hashCode());
-    }
-
-    @Test
-    public void testCompareTo() {
-        final MutableInt mutNum = new MutableInt(0);
-
-        assertEquals(0, mutNum.compareTo(new MutableInt(0)));
-        assertEquals(+1, mutNum.compareTo(new MutableInt(-1)));
-        assertEquals(-1, mutNum.compareTo(new MutableInt(1)));
-    }
-
-    @Test(expected=NullPointerException.class)
-    public void testCompareToNull() {
-        final MutableInt mutNum = new MutableInt(0);
-        mutNum.compareTo(null);
-    }
-
-    @Test
-    public void testPrimitiveValues() {
-        final MutableInt mutNum = new MutableInt(1);
-        
-        assertEquals( (byte) 1, mutNum.byteValue() );
-        assertEquals( (short) 1, mutNum.shortValue() );
-        assertEquals( 1.0F, mutNum.floatValue(), 0 );
-        assertEquals( 1.0, mutNum.doubleValue(), 0 );
-        assertEquals( 1L, mutNum.longValue() );
-    }
-
-    @Test
-    public void testToInteger() {
-        assertEquals(Integer.valueOf(0), new MutableInt(0).toInteger());
-        assertEquals(Integer.valueOf(123), new MutableInt(123).toInteger());
-    }
-
-    @Test
-    public void testIncrement() {
-        final MutableInt mutNum = new MutableInt(1);
-        mutNum.increment();
-        
-        assertEquals(2, mutNum.intValue());
-        assertEquals(2L, mutNum.longValue());
-    }
-
-    @Test
-    public void testDecrement() {
-        final MutableInt mutNum = new MutableInt(1);
-        mutNum.decrement();
-        
-        assertEquals(0, mutNum.intValue());
-        assertEquals(0L, mutNum.longValue());
-    }
-
-    @Test
-    public void testAddValuePrimitive() {
-        final MutableInt mutNum = new MutableInt(1);
-        mutNum.add(1);
-        
-        assertEquals(2, mutNum.intValue());
-        assertEquals(2L, mutNum.longValue());
-    }
-
-    @Test
-    public void testAddValueObject() {
-        final MutableInt mutNum = new MutableInt(1);
-        mutNum.add(Integer.valueOf(1));
-        
-        assertEquals(2, mutNum.intValue());
-        assertEquals(2L, mutNum.longValue());
-    }
-
-    @Test
-    public void testSubtractValuePrimitive() {
-        final MutableInt mutNum = new MutableInt(1);
-        mutNum.subtract(1);
-        
-        assertEquals(0, mutNum.intValue());
-        assertEquals(0L, mutNum.longValue());
-    }
-
-    @Test
-    public void testSubtractValueObject() {
-        final MutableInt mutNum = new MutableInt(1);
-        mutNum.subtract(Integer.valueOf(1));
-        
-        assertEquals(0, mutNum.intValue());
-        assertEquals(0L, mutNum.longValue());
-    }
-
-    @Test
-    public void testToString() {
-        assertEquals("0", new MutableInt(0).toString());
-        assertEquals("10", new MutableInt(10).toString());
-        assertEquals("-123", new MutableInt(-123).toString());
-    }
-
-}
diff --git a/lang/src/test/java/org/apache/commons/lang3/mutable/MutableLongTest.java b/lang/src/test/java/org/apache/commons/lang3/mutable/MutableLongTest.java
deleted file mode 100644
index 350c7c0..0000000
--- a/lang/src/test/java/org/apache/commons/lang3/mutable/MutableLongTest.java
+++ /dev/null
@@ -1,198 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- * 
- *      http://www.apache.org/licenses/LICENSE-2.0
- * 
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.commons.lang3.mutable;
-
-import org.junit.Test;
-import static org.junit.Assert.*;
-
-/**
- * JUnit tests.
- * 
- * @version $Id$
- * @see MutableLong
- */
-public class MutableLongTest {
-
-    // ----------------------------------------------------------------
-    @Test
-    public void testConstructors() {
-        assertEquals(0, new MutableLong().longValue());
-        
-        assertEquals(1, new MutableLong(1).longValue());
-        
-        assertEquals(2, new MutableLong(Long.valueOf(2)).longValue());
-        assertEquals(3, new MutableLong(new MutableLong(3)).longValue());
-
-        assertEquals(2, new MutableLong("2").longValue());
-
-    }
-
-    @Test(expected=NullPointerException.class)
-    public void testConstructorNull() {
-        new MutableLong((Number)null);
-    }
-
-    @Test
-    public void testGetSet() {
-        final MutableLong mutNum = new MutableLong(0);
-        assertEquals(0, new MutableLong().longValue());
-        assertEquals(Long.valueOf(0), new MutableLong().getValue());
-        
-        mutNum.setValue(1);
-        assertEquals(1, mutNum.longValue());
-        assertEquals(Long.valueOf(1), mutNum.getValue());
-        
-        mutNum.setValue(Long.valueOf(2));
-        assertEquals(2, mutNum.longValue());
-        assertEquals(Long.valueOf(2), mutNum.getValue());
-        
-        mutNum.setValue(new MutableLong(3));
-        assertEquals(3, mutNum.longValue());
-        assertEquals(Long.valueOf(3), mutNum.getValue());
-    }
-
-    @Test(expected=NullPointerException.class)
-    public void testSetNull() {
-        final MutableLong mutNum = new MutableLong(0);
-        mutNum.setValue(null);
-    }
-
-    @Test
-    public void testEquals() {
-        final MutableLong mutNumA = new MutableLong(0);
-        final MutableLong mutNumB = new MutableLong(0);
-        final MutableLong mutNumC = new MutableLong(1);
-
-        assertTrue(mutNumA.equals(mutNumA));
-        assertTrue(mutNumA.equals(mutNumB));
-        assertTrue(mutNumB.equals(mutNumA));
-        assertTrue(mutNumB.equals(mutNumB));
-        assertFalse(mutNumA.equals(mutNumC));
-        assertFalse(mutNumB.equals(mutNumC));
-        assertTrue(mutNumC.equals(mutNumC));
-        assertFalse(mutNumA.equals(null));
-        assertFalse(mutNumA.equals(Long.valueOf(0)));
-        assertFalse(mutNumA.equals("0"));
-    }
-
-    @Test
-    public void testHashCode() {
-        final MutableLong mutNumA = new MutableLong(0);
-        final MutableLong mutNumB = new MutableLong(0);
-        final MutableLong mutNumC = new MutableLong(1);
-
-        assertTrue(mutNumA.hashCode() == mutNumA.hashCode());
-        assertTrue(mutNumA.hashCode() == mutNumB.hashCode());
-        assertFalse(mutNumA.hashCode() == mutNumC.hashCode());
-        assertTrue(mutNumA.hashCode() == Long.valueOf(0).hashCode());
-    }
-
-    @Test
-    public void testCompareTo() {
-        final MutableLong mutNum = new MutableLong(0);
-
-        assertEquals(0, mutNum.compareTo(new MutableLong(0)));
-        assertEquals(+1, mutNum.compareTo(new MutableLong(-1)));
-        assertEquals(-1, mutNum.compareTo(new MutableLong(1)));
-    }
-
-    @Test(expected=NullPointerException.class)
-    public void testCompareToNull() {
-        final MutableLong mutNum = new MutableLong(0);
-        mutNum.compareTo(null);
-    }
-
-    @Test
-    public void testPrimitiveValues() {
-        final MutableLong mutNum = new MutableLong(1L);
-
-        assertEquals( 1.0F, mutNum.floatValue(), 0 );
-        assertEquals( 1.0, mutNum.doubleValue(), 0 );
-        assertEquals( (byte) 1, mutNum.byteValue() );
-        assertEquals( (short) 1, mutNum.shortValue() );
-        assertEquals( 1, mutNum.intValue() );
-        assertEquals( 1L, mutNum.longValue() );
-    }
-
-    @Test
-    public void testToLong() {
-        assertEquals(Long.valueOf(0L), new MutableLong(0L).toLong());
-        assertEquals(Long.valueOf(123L), new MutableLong(123L).toLong());
-    }
-
-    @Test
-    public void testIncrement() {
-        final MutableLong mutNum = new MutableLong(1);
-        mutNum.increment();
-        
-        assertEquals(2, mutNum.intValue());
-        assertEquals(2L, mutNum.longValue());
-    }
-
-    @Test
-    public void testDecrement() {
-        final MutableLong mutNum = new MutableLong(1);
-        mutNum.decrement();
-        
-        assertEquals(0, mutNum.intValue());
-        assertEquals(0L, mutNum.longValue());
-    }
-
-    @Test
-    public void testAddValuePrimitive() {
-        final MutableLong mutNum = new MutableLong(1);
-        mutNum.add(1);
-        
-        assertEquals(2, mutNum.intValue());
-        assertEquals(2L, mutNum.longValue());
-    }
-
-    @Test
-    public void testAddValueObject() {
-        final MutableLong mutNum = new MutableLong(1);
-        mutNum.add(Long.valueOf(1));
-        
-        assertEquals(2, mutNum.intValue());
-        assertEquals(2L, mutNum.longValue());
-    }
-
-    @Test
-    public void testSubtractValuePrimitive() {
-        final MutableLong mutNum = new MutableLong(1);
-        mutNum.subtract(1);
-        
-        assertEquals(0, mutNum.intValue());
-        assertEquals(0L, mutNum.longValue());
-    }
-
-    @Test
-    public void testSubtractValueObject() {
-        final MutableLong mutNum = new MutableLong(1);
-        mutNum.subtract(Long.valueOf(1));
-        
-        assertEquals(0, mutNum.intValue());
-        assertEquals(0L, mutNum.longValue());
-    }
-
-    @Test
-    public void testToString() {
-        assertEquals("0", new MutableLong(0).toString());
-        assertEquals("10", new MutableLong(10).toString());
-        assertEquals("-123", new MutableLong(-123).toString());
-    }
-
-}
diff --git a/lang/src/test/java/org/apache/commons/lang3/mutable/MutableObjectTest.java b/lang/src/test/java/org/apache/commons/lang3/mutable/MutableObjectTest.java
deleted file mode 100644
index 07c3c1f..0000000
--- a/lang/src/test/java/org/apache/commons/lang3/mutable/MutableObjectTest.java
+++ /dev/null
@@ -1,97 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- * 
- *      http://www.apache.org/licenses/LICENSE-2.0
- * 
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.commons.lang3.mutable;
-
-import org.junit.Test;
-import static org.junit.Assert.*;
-
-/**
- * JUnit tests.
- * 
- * @version $Id$
- * @see MutableShort
- */
-public class MutableObjectTest {
-
-    // ----------------------------------------------------------------
-    @Test
-    public void testConstructors() {
-        assertEquals(null, new MutableObject<String>().getValue());
-        
-        final Integer i = Integer.valueOf(6);
-        assertSame(i, new MutableObject<Integer>(i).getValue());
-        assertSame("HI", new MutableObject<String>("HI").getValue());
-        assertSame(null, new MutableObject<Object>(null).getValue());
-    }
-
-    @Test
-    public void testGetSet() {
-        final MutableObject<String> mutNum = new MutableObject<String>();
-        assertEquals(null, new MutableObject<Object>().getValue());
-        
-        mutNum.setValue("HELLO");
-        assertSame("HELLO", mutNum.getValue());
-        
-        mutNum.setValue(null);
-        assertSame(null, mutNum.getValue());
-    }
-
-    @Test
-    public void testEquals() {
-        final MutableObject<String> mutNumA = new MutableObject<String>("ALPHA");
-        final MutableObject<String> mutNumB = new MutableObject<String>("ALPHA");
-        final MutableObject<String> mutNumC = new MutableObject<String>("BETA");
-        final MutableObject<String> mutNumD = new MutableObject<String>(null);
-
-        assertTrue(mutNumA.equals(mutNumA));
-        assertTrue(mutNumA.equals(mutNumB));
-        assertTrue(mutNumB.equals(mutNumA));
-        assertTrue(mutNumB.equals(mutNumB));
-        assertFalse(mutNumA.equals(mutNumC));
-        assertFalse(mutNumB.equals(mutNumC));
-        assertTrue(mutNumC.equals(mutNumC));
-        assertFalse(mutNumA.equals(mutNumD));
-        assertTrue(mutNumD.equals(mutNumD));
-        
-        assertFalse(mutNumA.equals(null));
-        assertFalse(mutNumA.equals(new Object()));
-        assertFalse(mutNumA.equals("0"));
-    }
-
-    @Test
-    public void testHashCode() {
-        final MutableObject<String> mutNumA = new MutableObject<String>("ALPHA");
-        final MutableObject<String> mutNumB = new MutableObject<String>("ALPHA");
-        final MutableObject<String> mutNumC = new MutableObject<String>("BETA");
-        final MutableObject<String> mutNumD = new MutableObject<String>(null);
-
-        assertTrue(mutNumA.hashCode() == mutNumA.hashCode());
-        assertTrue(mutNumA.hashCode() == mutNumB.hashCode());
-        assertFalse(mutNumA.hashCode() == mutNumC.hashCode());
-        assertFalse(mutNumA.hashCode() == mutNumD.hashCode());
-        assertTrue(mutNumA.hashCode() == "ALPHA".hashCode());
-        assertEquals(0, mutNumD.hashCode());
-    }
-
-    @Test
-    public void testToString() {
-        assertEquals("HI", new MutableObject<String>("HI").toString());
-        assertEquals("10.0", new MutableObject<Double>(Double.valueOf(10)).toString());
-        assertEquals("null", new MutableObject<Object>(null).toString());
-    }
-
-}
diff --git a/lang/src/test/java/org/apache/commons/lang3/mutable/MutableShortTest.java b/lang/src/test/java/org/apache/commons/lang3/mutable/MutableShortTest.java
deleted file mode 100644
index 8384542..0000000
--- a/lang/src/test/java/org/apache/commons/lang3/mutable/MutableShortTest.java
+++ /dev/null
@@ -1,189 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- * 
- *      http://www.apache.org/licenses/LICENSE-2.0
- * 
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.commons.lang3.mutable;
-
-import org.junit.Test;
-import static org.junit.Assert.*;
-
-/**
- * JUnit tests.
- * 
- * @version $Id$
- * @see MutableShort
- */
-public class MutableShortTest {
-
-    // ----------------------------------------------------------------
-    @Test
-    public void testConstructors() {
-        assertEquals((short) 0, new MutableShort().shortValue());
-        
-        assertEquals((short) 1, new MutableShort((short) 1).shortValue());
-        
-        assertEquals((short) 2, new MutableShort(Short.valueOf((short) 2)).shortValue());
-        assertEquals((short) 3, new MutableShort(new MutableShort((short) 3)).shortValue());
-
-        assertEquals((short) 2, new MutableShort("2").shortValue());
-
-        try {
-            new MutableShort((Number)null);
-            fail();
-        } catch (final NullPointerException ex) {}
-    }
-
-    @Test
-    public void testGetSet() {
-        final MutableShort mutNum = new MutableShort((short) 0);
-        assertEquals((short) 0, new MutableShort().shortValue());
-        assertEquals(Short.valueOf((short) 0), new MutableShort().getValue());
-        
-        mutNum.setValue((short) 1);
-        assertEquals((short) 1, mutNum.shortValue());
-        assertEquals(Short.valueOf((short) 1), mutNum.getValue());
-        
-        mutNum.setValue(Short.valueOf((short) 2));
-        assertEquals((short) 2, mutNum.shortValue());
-        assertEquals(Short.valueOf((short) 2), mutNum.getValue());
-        
-        mutNum.setValue(new MutableShort((short) 3));
-        assertEquals((short) 3, mutNum.shortValue());
-        assertEquals(Short.valueOf((short) 3), mutNum.getValue());
-        try {
-            mutNum.setValue(null);
-            fail();
-        } catch (final NullPointerException ex) {}
-    }
-
-    @Test
-    public void testEquals() {
-        final MutableShort mutNumA = new MutableShort((short) 0);
-        final MutableShort mutNumB = new MutableShort((short) 0);
-        final MutableShort mutNumC = new MutableShort((short) 1);
-
-        assertTrue(mutNumA.equals(mutNumA));
-        assertTrue(mutNumA.equals(mutNumB));
-        assertTrue(mutNumB.equals(mutNumA));
-        assertTrue(mutNumB.equals(mutNumB));
-        assertFalse(mutNumA.equals(mutNumC));
-        assertFalse(mutNumB.equals(mutNumC));
-        assertTrue(mutNumC.equals(mutNumC));
-        assertFalse(mutNumA.equals(null));
-        assertFalse(mutNumA.equals(Short.valueOf((short) 0)));
-        assertFalse(mutNumA.equals("0"));
-    }
-
-    @Test
-    public void testHashCode() {
-        final MutableShort mutNumA = new MutableShort((short) 0);
-        final MutableShort mutNumB = new MutableShort((short) 0);
-        final MutableShort mutNumC = new MutableShort((short) 1);
-
-        assertTrue(mutNumA.hashCode() == mutNumA.hashCode());
-        assertTrue(mutNumA.hashCode() == mutNumB.hashCode());
-        assertFalse(mutNumA.hashCode() == mutNumC.hashCode());
-        assertTrue(mutNumA.hashCode() == Short.valueOf((short) 0).hashCode());
-    }
-
-    @Test
-    public void testCompareTo() {
-        final MutableShort mutNum = new MutableShort((short) 0);
-
-        assertEquals((short) 0, mutNum.compareTo(new MutableShort((short) 0)));
-        assertEquals((short) +1, mutNum.compareTo(new MutableShort((short) -1)));
-        assertEquals((short) -1, mutNum.compareTo(new MutableShort((short) 1)));
-        try {
-            mutNum.compareTo(null);
-            fail();
-        } catch (final NullPointerException ex) {}
-    }
-
-    @Test
-    public void testPrimitiveValues() {
-        final MutableShort mutNum = new MutableShort( (short) 1 );
-        
-        assertEquals( 1.0F, mutNum.floatValue(), 0 );
-        assertEquals( 1.0, mutNum.doubleValue(), 0 );
-        assertEquals( (byte) 1, mutNum.byteValue() );
-        assertEquals( (short) 1, mutNum.shortValue() );
-        assertEquals( 1, mutNum.intValue() );
-        assertEquals( 1L, mutNum.longValue() );
-    }
-
-    @Test
-    public void testToShort() {
-        assertEquals(Short.valueOf((short) 0), new MutableShort((short) 0).toShort());
-        assertEquals(Short.valueOf((short) 123), new MutableShort((short) 123).toShort());
-    }
-
-    @Test
-    public void testIncrement() {
-        final MutableShort mutNum = new MutableShort((short) 1);
-        mutNum.increment();
-        
-        assertEquals(2, mutNum.intValue());
-        assertEquals(2L, mutNum.longValue());
-    }
-
-    @Test
-    public void testDecrement() {
-        final MutableShort mutNum = new MutableShort((short) 1);
-        mutNum.decrement();
-        
-        assertEquals(0, mutNum.intValue());
-        assertEquals(0L, mutNum.longValue());
-    }
-
-    @Test
-    public void testAddValuePrimitive() {
-        final MutableShort mutNum = new MutableShort((short) 1);
-        mutNum.add((short) 1);
-        
-        assertEquals((short) 2, mutNum.shortValue());
-    }
-
-    @Test
-    public void testAddValueObject() {
-        final MutableShort mutNum = new MutableShort((short) 1);
-        mutNum.add(Short.valueOf((short) 1));
-        
-        assertEquals((short) 2, mutNum.shortValue());
-    }
-
-    @Test
-    public void testSubtractValuePrimitive() {
-        final MutableShort mutNum = new MutableShort((short) 1);
-        mutNum.subtract((short) 1);
-        
-        assertEquals((short) 0, mutNum.shortValue());
-    }
-
-    @Test
-    public void testSubtractValueObject() {
-        final MutableShort mutNum = new MutableShort((short) 1);
-        mutNum.subtract(Short.valueOf((short) 1));
-        
-        assertEquals((short) 0, mutNum.shortValue());
-    }
-
-    @Test
-    public void testToString() {
-        assertEquals("0", new MutableShort((short) 0).toString());
-        assertEquals("10", new MutableShort((short) 10).toString());
-        assertEquals("-123", new MutableShort((short) -123).toString());
-    }
-
-}
diff --git a/lang/src/test/java/org/apache/commons/lang3/reflect/ConstructorUtilsTest.java b/lang/src/test/java/org/apache/commons/lang3/reflect/ConstructorUtilsTest.java
deleted file mode 100644
index ac58ba9..0000000
--- a/lang/src/test/java/org/apache/commons/lang3/reflect/ConstructorUtilsTest.java
+++ /dev/null
@@ -1,246 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.commons.lang3.reflect;
-
-import org.junit.Test;
-import org.junit.Before;
-
-import static org.junit.Assert.*;
-
-import java.lang.reflect.Constructor;
-import java.util.Arrays;
-import java.util.HashMap;
-import java.util.Map;
-
-import org.apache.commons.lang3.ArrayUtils;
-import org.apache.commons.lang3.math.NumberUtils;
-import org.apache.commons.lang3.mutable.MutableObject;
-
-/**
- * Unit tests ConstructorUtils
- * @version $Id$
- */
-public class ConstructorUtilsTest {
-    public static class TestBean {
-        private final String toString;
-
-        public TestBean() {
-            toString = "()";
-        }
-
-        public TestBean(final int i) {
-            toString = "(int)";
-        }
-
-        public TestBean(final Integer i) {
-            toString = "(Integer)";
-        }
-
-        public TestBean(final double d) {
-            toString = "(double)";
-        }
-
-        public TestBean(final String s) {
-            toString = "(String)";
-        }
-
-        public TestBean(final Object o) {
-            toString = "(Object)";
-        }
-
-        @Override
-        public String toString() {
-            return toString;
-        }
-    }
-
-    private static class PrivateClass {
-        @SuppressWarnings("unused")
-        public PrivateClass() {
-        }
-
-        @SuppressWarnings("unused")
-        public static class PublicInnerClass {
-            public PublicInnerClass() {
-            }
-        }
-    }
-
-    private final Map<Class<?>, Class<?>[]> classCache;
-
-    public ConstructorUtilsTest() {
-        classCache = new HashMap<Class<?>, Class<?>[]>();
-    }
-
-
-    @Before
-    public void setUp() throws Exception {
-        classCache.clear();
-    }
-
-    @Test
-    public void testConstructor() throws Exception {
-        assertNotNull(MethodUtils.class.newInstance());
-    }
-
-    @Test
-    public void testInvokeConstructor() throws Exception {
-        assertEquals("()", ConstructorUtils.invokeConstructor(TestBean.class,
-                (Object[]) ArrayUtils.EMPTY_CLASS_ARRAY).toString());
-        assertEquals("()", ConstructorUtils.invokeConstructor(TestBean.class,
-                (Object[]) null).toString());
-        assertEquals("()", ConstructorUtils.invokeConstructor(TestBean.class).toString());
-        assertEquals("(String)", ConstructorUtils.invokeConstructor(
-                TestBean.class, "").toString());
-        assertEquals("(Object)", ConstructorUtils.invokeConstructor(
-                TestBean.class, new Object()).toString());
-        assertEquals("(Object)", ConstructorUtils.invokeConstructor(
-                TestBean.class, Boolean.TRUE).toString());
-        assertEquals("(Integer)", ConstructorUtils.invokeConstructor(
-                TestBean.class, NumberUtils.INTEGER_ONE).toString());
-        assertEquals("(int)", ConstructorUtils.invokeConstructor(
-                TestBean.class, NumberUtils.BYTE_ONE).toString());
-        assertEquals("(double)", ConstructorUtils.invokeConstructor(
-                TestBean.class, NumberUtils.LONG_ONE).toString());
-        assertEquals("(double)", ConstructorUtils.invokeConstructor(
-                TestBean.class, NumberUtils.DOUBLE_ONE).toString());
-    }
-
-    @Test
-    public void testInvokeExactConstructor() throws Exception {
-        assertEquals("()", ConstructorUtils.invokeExactConstructor(
-                TestBean.class, (Object[]) ArrayUtils.EMPTY_CLASS_ARRAY).toString());
-        assertEquals("()", ConstructorUtils.invokeExactConstructor(
-                TestBean.class, (Object[]) null).toString());
-        assertEquals("(String)", ConstructorUtils.invokeExactConstructor(
-                TestBean.class, "").toString());
-        assertEquals("(Object)", ConstructorUtils.invokeExactConstructor(
-                TestBean.class, new Object()).toString());
-        assertEquals("(Integer)", ConstructorUtils.invokeExactConstructor(
-                TestBean.class, NumberUtils.INTEGER_ONE).toString());
-        assertEquals("(double)", ConstructorUtils.invokeExactConstructor(
-                TestBean.class, new Object[] { NumberUtils.DOUBLE_ONE },
-                new Class[] { Double.TYPE }).toString());
-
-        try {
-            ConstructorUtils.invokeExactConstructor(TestBean.class,
-                    NumberUtils.BYTE_ONE);
-            fail("should throw NoSuchMethodException");
-        } catch (final NoSuchMethodException e) {
-        }
-        try {
-            ConstructorUtils.invokeExactConstructor(TestBean.class,
-                    NumberUtils.LONG_ONE);
-            fail("should throw NoSuchMethodException");
-        } catch (final NoSuchMethodException e) {
-        }
-        try {
-            ConstructorUtils.invokeExactConstructor(TestBean.class,
-                    Boolean.TRUE);
-            fail("should throw NoSuchMethodException");
-        } catch (final NoSuchMethodException e) {
-        }
-    }
-
-    @Test
-    public void testGetAccessibleConstructor() throws Exception {
-        assertNotNull(ConstructorUtils.getAccessibleConstructor(Object.class
-                .getConstructor(ArrayUtils.EMPTY_CLASS_ARRAY)));
-        assertNull(ConstructorUtils.getAccessibleConstructor(PrivateClass.class
-                .getConstructor(ArrayUtils.EMPTY_CLASS_ARRAY)));
-        assertNull(ConstructorUtils.getAccessibleConstructor(PrivateClass.PublicInnerClass.class));
-    }
-
-    @Test
-    public void testGetAccessibleConstructorFromDescription() throws Exception {
-        assertNotNull(ConstructorUtils.getAccessibleConstructor(Object.class,
-                ArrayUtils.EMPTY_CLASS_ARRAY));
-        assertNull(ConstructorUtils.getAccessibleConstructor(
-                PrivateClass.class, ArrayUtils.EMPTY_CLASS_ARRAY));
-    }
-
-    @Test
-    public void testGetMatchingAccessibleMethod() throws Exception {
-        expectMatchingAccessibleConstructorParameterTypes(TestBean.class,
-                ArrayUtils.EMPTY_CLASS_ARRAY, ArrayUtils.EMPTY_CLASS_ARRAY);
-        expectMatchingAccessibleConstructorParameterTypes(TestBean.class, null,
-                ArrayUtils.EMPTY_CLASS_ARRAY);
-        expectMatchingAccessibleConstructorParameterTypes(TestBean.class,
-                singletonArray(String.class), singletonArray(String.class));
-        expectMatchingAccessibleConstructorParameterTypes(TestBean.class,
-                singletonArray(Object.class), singletonArray(Object.class));
-        expectMatchingAccessibleConstructorParameterTypes(TestBean.class,
-                singletonArray(Boolean.class), singletonArray(Object.class));
-        expectMatchingAccessibleConstructorParameterTypes(TestBean.class,
-                singletonArray(Byte.class), singletonArray(Integer.TYPE));
-        expectMatchingAccessibleConstructorParameterTypes(TestBean.class,
-                singletonArray(Byte.TYPE), singletonArray(Integer.TYPE));
-        expectMatchingAccessibleConstructorParameterTypes(TestBean.class,
-                singletonArray(Short.class), singletonArray(Integer.TYPE));
-        expectMatchingAccessibleConstructorParameterTypes(TestBean.class,
-                singletonArray(Short.TYPE), singletonArray(Integer.TYPE));
-        expectMatchingAccessibleConstructorParameterTypes(TestBean.class,
-                singletonArray(Character.class), singletonArray(Integer.TYPE));
-        expectMatchingAccessibleConstructorParameterTypes(TestBean.class,
-                singletonArray(Character.TYPE), singletonArray(Integer.TYPE));
-        expectMatchingAccessibleConstructorParameterTypes(TestBean.class,
-                singletonArray(Integer.class), singletonArray(Integer.class));
-        expectMatchingAccessibleConstructorParameterTypes(TestBean.class,
-                singletonArray(Integer.TYPE), singletonArray(Integer.TYPE));
-        expectMatchingAccessibleConstructorParameterTypes(TestBean.class,
-                singletonArray(Long.class), singletonArray(Double.TYPE));
-        expectMatchingAccessibleConstructorParameterTypes(TestBean.class,
-                singletonArray(Long.TYPE), singletonArray(Double.TYPE));
-        expectMatchingAccessibleConstructorParameterTypes(TestBean.class,
-                singletonArray(Float.class), singletonArray(Double.TYPE));
-        expectMatchingAccessibleConstructorParameterTypes(TestBean.class,
-                singletonArray(Float.TYPE), singletonArray(Double.TYPE));
-        expectMatchingAccessibleConstructorParameterTypes(TestBean.class,
-                singletonArray(Double.class), singletonArray(Double.TYPE));
-        expectMatchingAccessibleConstructorParameterTypes(TestBean.class,
-                singletonArray(Double.TYPE), singletonArray(Double.TYPE));
-    }
-
-    @Test
-    public void testNullArgument() {
-        expectMatchingAccessibleConstructorParameterTypes(MutableObject.class,
-                singletonArray(null), singletonArray(Object.class));
-    }
-
-    private void expectMatchingAccessibleConstructorParameterTypes(final Class<?> cls,
-            final Class<?>[] requestTypes, final Class<?>[] actualTypes) {
-        final Constructor<?> c = ConstructorUtils.getMatchingAccessibleConstructor(cls,
-                requestTypes);
-        assertTrue(toString(c.getParameterTypes()) + " not equals "
-                + toString(actualTypes), Arrays.equals(actualTypes, c
-                .getParameterTypes()));
-    }
-
-    private String toString(final Class<?>[] c) {
-        return Arrays.asList(c).toString();
-    }
-
-    private Class<?>[] singletonArray(final Class<?> c) {
-        Class<?>[] result = classCache.get(c);
-        if (result == null) {
-            result = new Class[] { c };
-            classCache.put(c, result);
-        }
-        return result;
-    }
-
-}
diff --git a/lang/src/test/java/org/apache/commons/lang3/reflect/FieldUtilsTest.java b/lang/src/test/java/org/apache/commons/lang3/reflect/FieldUtilsTest.java
deleted file mode 100644
index 36c232c..0000000
--- a/lang/src/test/java/org/apache/commons/lang3/reflect/FieldUtilsTest.java
+++ /dev/null
@@ -1,1357 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.commons.lang3.reflect;
-
-import org.apache.commons.lang3.ArrayUtils;
-import org.apache.commons.lang3.reflect.testbed.*;
-import org.junit.Before;
-import org.junit.Test;
-
-import java.lang.reflect.Constructor;
-import java.lang.reflect.Field;
-import java.lang.reflect.Modifier;
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.List;
-
-import static org.junit.Assert.*;
-import static org.junit.Assume.assumeNotNull;
-
-/**
- * Unit tests FieldUtils
- * 
- * @version $Id$
- */
-public class FieldUtilsTest {
-
-    static final Integer I0 = Integer.valueOf(0);
-    static final Integer I1 = Integer.valueOf(1);
-    static final Double D0 = Double.valueOf(0.0);
-    static final Double D1 = Double.valueOf(1.0);
-
-    @Annotated
-    private PublicChild publicChild;
-    private PubliclyShadowedChild publiclyShadowedChild;
-    @Annotated
-    private PrivatelyShadowedChild privatelyShadowedChild;
-    private final Class<? super PublicChild> parentClass = PublicChild.class.getSuperclass();
-
-    @Before
-    public void setUp() {
-        StaticContainer.reset();
-        publicChild = new PublicChild();
-        publiclyShadowedChild = new PubliclyShadowedChild();
-        privatelyShadowedChild = new PrivatelyShadowedChild();
-    }
-
-    @Test
-    public void testConstructor() {
-        assertNotNull(new FieldUtils());
-        final Constructor<?>[] cons = FieldUtils.class.getDeclaredConstructors();
-        assertEquals(1, cons.length);
-        assertTrue(Modifier.isPublic(cons[0].getModifiers()));
-        assertTrue(Modifier.isPublic(FieldUtils.class.getModifiers()));
-        assertFalse(Modifier.isFinal(FieldUtils.class.getModifiers()));
-    }
-
-    @Test
-    public void testGetField() {
-        assertEquals(Foo.class, FieldUtils.getField(PublicChild.class, "VALUE").getDeclaringClass());
-        assertEquals(parentClass, FieldUtils.getField(PublicChild.class, "s").getDeclaringClass());
-        assertNull(FieldUtils.getField(PublicChild.class, "b"));
-        assertNull(FieldUtils.getField(PublicChild.class, "i"));
-        assertNull(FieldUtils.getField(PublicChild.class, "d"));
-        assertEquals(Foo.class, FieldUtils.getField(PubliclyShadowedChild.class, "VALUE").getDeclaringClass());
-        assertEquals(PubliclyShadowedChild.class, FieldUtils.getField(PubliclyShadowedChild.class, "s").getDeclaringClass());
-        assertEquals(PubliclyShadowedChild.class, FieldUtils.getField(PubliclyShadowedChild.class, "b").getDeclaringClass());
-        assertEquals(PubliclyShadowedChild.class, FieldUtils.getField(PubliclyShadowedChild.class, "i").getDeclaringClass());
-        assertEquals(PubliclyShadowedChild.class, FieldUtils.getField(PubliclyShadowedChild.class, "d").getDeclaringClass());
-        assertEquals(Foo.class, FieldUtils.getField(PrivatelyShadowedChild.class, "VALUE").getDeclaringClass());
-        assertEquals(parentClass, FieldUtils.getField(PrivatelyShadowedChild.class, "s").getDeclaringClass());
-        assertNull(FieldUtils.getField(PrivatelyShadowedChild.class, "b"));
-        assertNull(FieldUtils.getField(PrivatelyShadowedChild.class, "i"));
-        assertNull(FieldUtils.getField(PrivatelyShadowedChild.class, "d"));
-    }
-
-    @Test(expected = IllegalArgumentException.class)
-    public void testGetFieldIllegalArgumentException1() {
-        FieldUtils.getField(null, "none");
-    }
-
-    @Test(expected = IllegalArgumentException.class)
-    public void testGetFieldIllegalArgumentException2() {
-        FieldUtils.getField(PublicChild.class, null);
-    }
-
-    @Test(expected = IllegalArgumentException.class)
-    public void testGetFieldIllegalArgumentException3() {
-        FieldUtils.getField(PublicChild.class, "");
-    }
-
-    @Test(expected = IllegalArgumentException.class)
-    public void testGetFieldIllegalArgumentException4() {
-        FieldUtils.getField(PublicChild.class, " ");
-    }
-
-    @Test
-    public void testGetFieldForceAccess() {
-        assertEquals(PublicChild.class, FieldUtils.getField(PublicChild.class, "VALUE", true).getDeclaringClass());
-        assertEquals(parentClass, FieldUtils.getField(PublicChild.class, "s", true).getDeclaringClass());
-        assertEquals(parentClass, FieldUtils.getField(PublicChild.class, "b", true).getDeclaringClass());
-        assertEquals(parentClass, FieldUtils.getField(PublicChild.class, "i", true).getDeclaringClass());
-        assertEquals(parentClass, FieldUtils.getField(PublicChild.class, "d", true).getDeclaringClass());
-        assertEquals(Foo.class, FieldUtils.getField(PubliclyShadowedChild.class, "VALUE", true).getDeclaringClass());
-        assertEquals(PubliclyShadowedChild.class, FieldUtils.getField(PubliclyShadowedChild.class, "s", true).getDeclaringClass());
-        assertEquals(PubliclyShadowedChild.class, FieldUtils.getField(PubliclyShadowedChild.class, "b", true).getDeclaringClass());
-        assertEquals(PubliclyShadowedChild.class, FieldUtils.getField(PubliclyShadowedChild.class, "i", true).getDeclaringClass());
-        assertEquals(PubliclyShadowedChild.class, FieldUtils.getField(PubliclyShadowedChild.class, "d", true).getDeclaringClass());
-        assertEquals(Foo.class, FieldUtils.getField(PrivatelyShadowedChild.class, "VALUE", true).getDeclaringClass());
-        assertEquals(PrivatelyShadowedChild.class, FieldUtils.getField(PrivatelyShadowedChild.class, "s", true).getDeclaringClass());
-        assertEquals(PrivatelyShadowedChild.class, FieldUtils.getField(PrivatelyShadowedChild.class, "b", true).getDeclaringClass());
-        assertEquals(PrivatelyShadowedChild.class, FieldUtils.getField(PrivatelyShadowedChild.class, "i", true).getDeclaringClass());
-        assertEquals(PrivatelyShadowedChild.class, FieldUtils.getField(PrivatelyShadowedChild.class, "d", true).getDeclaringClass());
-    }
-
-    @Test(expected = IllegalArgumentException.class)
-    public void testGetFieldForceAccessIllegalArgumentException1() {
-        FieldUtils.getField(null, "none", true);
-    }
-
-    @Test(expected = IllegalArgumentException.class)
-    public void testGetFieldForceAccessIllegalArgumentException2() {
-        FieldUtils.getField(PublicChild.class, null, true);
-    }
-
-    @Test(expected = IllegalArgumentException.class)
-    public void testGetFieldForceAccessIllegalArgumentException3() {
-        FieldUtils.getField(PublicChild.class, "", true);
-    }
-
-    @Test(expected = IllegalArgumentException.class)
-    public void testGetFieldForceAccessIllegalArgumentException4() {
-        FieldUtils.getField(PublicChild.class, " ", true);
-    }
-
-    @Test
-    public void testGetAllFields() {
-        assertArrayEquals(new Field[0], FieldUtils.getAllFields(Object.class));
-        final Field[] fieldsNumber = Number.class.getDeclaredFields();
-        assertArrayEquals(fieldsNumber, FieldUtils.getAllFields(Number.class));
-        final Field[] fieldsInteger = Integer.class.getDeclaredFields();
-        assertArrayEquals(ArrayUtils.addAll(fieldsInteger, fieldsNumber), FieldUtils.getAllFields(Integer.class));
-        assertEquals(5, FieldUtils.getAllFields(PublicChild.class).length);
-    }
-
-    @Test
-    public void testGetAllFieldsList() {
-        assertEquals(0, FieldUtils.getAllFieldsList(Object.class).size());
-        final List<Field> fieldsNumber = Arrays.asList(Number.class.getDeclaredFields());
-        assertEquals(fieldsNumber, FieldUtils.getAllFieldsList(Number.class));
-        final List<Field> fieldsInteger = Arrays.asList(Integer.class.getDeclaredFields());
-        final List<Field> allFieldsInteger = new ArrayList<Field>(fieldsInteger);
-        allFieldsInteger.addAll(fieldsNumber);
-        assertEquals(allFieldsInteger, FieldUtils.getAllFieldsList(Integer.class));
-        assertEquals(5, FieldUtils.getAllFieldsList(PublicChild.class).size());
-    }
-
-    @Test
-    public void testGetFieldsWithAnnotation() throws NoSuchFieldException {
-        assertArrayEquals(new Field[0], FieldUtils.getFieldsWithAnnotation(Object.class, Annotated.class));
-        final Field[] annotatedFields = new Field[]{
-                FieldUtilsTest.class.getDeclaredField("publicChild"),
-                FieldUtilsTest.class.getDeclaredField("privatelyShadowedChild")
-        };
-        assertArrayEquals(annotatedFields, FieldUtils.getFieldsWithAnnotation(FieldUtilsTest.class, Annotated.class));
-    }
-
-    @Test(expected = IllegalArgumentException.class)
-    public void testGetFieldsWithAnnotationIllegalArgumentException1() {
-        FieldUtils.getFieldsWithAnnotation(FieldUtilsTest.class, null);
-    }
-
-    @Test(expected = IllegalArgumentException.class)
-    public void testGetFieldsWithAnnotationIllegalArgumentException2() {
-        FieldUtils.getFieldsWithAnnotation(null, Annotated.class);
-    }
-
-    @Test(expected = IllegalArgumentException.class)
-    public void testGetFieldsWithAnnotationIllegalArgumentException3() {
-        FieldUtils.getFieldsWithAnnotation(null, null);
-    }
-
-    @Test
-    public void testGetFieldsListWithAnnotation() throws NoSuchFieldException {
-        assertEquals(0, FieldUtils.getFieldsListWithAnnotation(Object.class, Annotated.class).size());
-        final List<Field> annotatedFields = Arrays.asList(
-                FieldUtilsTest.class.getDeclaredField("publicChild"),
-                FieldUtilsTest.class.getDeclaredField("privatelyShadowedChild")
-        );
-        final List<Field> fieldUtilsTestAnnotatedFields = FieldUtils.getFieldsListWithAnnotation(FieldUtilsTest.class, Annotated.class);
-        assertEquals(annotatedFields.size(),fieldUtilsTestAnnotatedFields.size());
-        assertTrue(fieldUtilsTestAnnotatedFields.contains(annotatedFields.get(0)));
-        assertTrue(fieldUtilsTestAnnotatedFields.contains(annotatedFields.get(1)));
-    }
-
-    @Test(expected = IllegalArgumentException.class)
-    public void testGetFieldsListWithAnnotationIllegalArgumentException1() {
-        FieldUtils.getFieldsListWithAnnotation(FieldUtilsTest.class, null);
-    }
-
-    @Test(expected = IllegalArgumentException.class)
-    public void testGetFieldsListWithAnnotationIllegalArgumentException2() {
-        FieldUtils.getFieldsListWithAnnotation(null, Annotated.class);
-    }
-
-    @Test(expected = IllegalArgumentException.class)
-    public void testGetFieldsListWithAnnotationIllegalArgumentException3() {
-        FieldUtils.getFieldsListWithAnnotation(null, null);
-    }
-
-    @Test
-    public void testGetDeclaredField() {
-        assertNull(FieldUtils.getDeclaredField(PublicChild.class, "VALUE"));
-        assertNull(FieldUtils.getDeclaredField(PublicChild.class, "s"));
-        assertNull(FieldUtils.getDeclaredField(PublicChild.class, "b"));
-        assertNull(FieldUtils.getDeclaredField(PublicChild.class, "i"));
-        assertNull(FieldUtils.getDeclaredField(PublicChild.class, "d"));
-        assertNull(FieldUtils.getDeclaredField(PubliclyShadowedChild.class, "VALUE"));
-        assertEquals(PubliclyShadowedChild.class, FieldUtils.getDeclaredField(PubliclyShadowedChild.class, "s").getDeclaringClass());
-        assertEquals(PubliclyShadowedChild.class, FieldUtils.getDeclaredField(PubliclyShadowedChild.class, "b").getDeclaringClass());
-        assertEquals(PubliclyShadowedChild.class, FieldUtils.getDeclaredField(PubliclyShadowedChild.class, "i").getDeclaringClass());
-        assertEquals(PubliclyShadowedChild.class, FieldUtils.getDeclaredField(PubliclyShadowedChild.class, "d").getDeclaringClass());
-        assertNull(FieldUtils.getDeclaredField(PrivatelyShadowedChild.class, "VALUE"));
-        assertNull(FieldUtils.getDeclaredField(PrivatelyShadowedChild.class, "s"));
-        assertNull(FieldUtils.getDeclaredField(PrivatelyShadowedChild.class, "b"));
-        assertNull(FieldUtils.getDeclaredField(PrivatelyShadowedChild.class, "i"));
-        assertNull(FieldUtils.getDeclaredField(PrivatelyShadowedChild.class, "d"));
-    }
-
-    @Test(expected = IllegalArgumentException.class)
-    public void testGetDeclaredFieldAccessIllegalArgumentException1() {
-        FieldUtils.getDeclaredField(null, "none");
-    }
-
-    @Test(expected = IllegalArgumentException.class)
-    public void testGetDeclaredFieldAccessIllegalArgumentException2() {
-        FieldUtils.getDeclaredField(PublicChild.class, null);
-    }
-
-    @Test(expected = IllegalArgumentException.class)
-    public void testGetDeclaredFieldAccessIllegalArgumentException3() {
-        FieldUtils.getDeclaredField(PublicChild.class, "");
-    }
-
-    @Test(expected = IllegalArgumentException.class)
-    public void testGetDeclaredFieldAccessIllegalArgumentException4() {
-        FieldUtils.getDeclaredField(PublicChild.class, " ");
-    }
-
-    @Test
-    public void testGetDeclaredFieldForceAccess() {
-        assertEquals(PublicChild.class, FieldUtils.getDeclaredField(PublicChild.class, "VALUE", true).getDeclaringClass());
-        assertNull(FieldUtils.getDeclaredField(PublicChild.class, "s", true));
-        assertNull(FieldUtils.getDeclaredField(PublicChild.class, "b", true));
-        assertNull(FieldUtils.getDeclaredField(PublicChild.class, "i", true));
-        assertNull(FieldUtils.getDeclaredField(PublicChild.class, "d", true));
-        assertNull(FieldUtils.getDeclaredField(PubliclyShadowedChild.class, "VALUE", true));
-        assertEquals(PubliclyShadowedChild.class, FieldUtils.getDeclaredField(PubliclyShadowedChild.class, "s", true).getDeclaringClass());
-        assertEquals(PubliclyShadowedChild.class, FieldUtils.getDeclaredField(PubliclyShadowedChild.class, "b", true).getDeclaringClass());
-        assertEquals(PubliclyShadowedChild.class, FieldUtils.getDeclaredField(PubliclyShadowedChild.class, "i", true).getDeclaringClass());
-        assertEquals(PubliclyShadowedChild.class, FieldUtils.getDeclaredField(PubliclyShadowedChild.class, "d", true).getDeclaringClass());
-        assertNull(FieldUtils.getDeclaredField(PrivatelyShadowedChild.class, "VALUE", true));
-        assertEquals(PrivatelyShadowedChild.class, FieldUtils.getDeclaredField(PrivatelyShadowedChild.class, "s", true).getDeclaringClass());
-        assertEquals(PrivatelyShadowedChild.class, FieldUtils.getDeclaredField(PrivatelyShadowedChild.class, "b", true).getDeclaringClass());
-        assertEquals(PrivatelyShadowedChild.class, FieldUtils.getDeclaredField(PrivatelyShadowedChild.class, "i", true).getDeclaringClass());
-        assertEquals(PrivatelyShadowedChild.class, FieldUtils.getDeclaredField(PrivatelyShadowedChild.class, "d", true).getDeclaringClass());
-    }
-
-    @Test(expected = IllegalArgumentException.class)
-    public void testGetDeclaredFieldForceAccessIllegalArgumentException1() {
-        FieldUtils.getDeclaredField(null, "none", true);
-    }
-
-    @Test(expected = IllegalArgumentException.class)
-    public void testGetDeclaredFieldForceAccessIllegalArgumentException2() {
-        FieldUtils.getDeclaredField(PublicChild.class, null, true);
-    }
-
-    @Test(expected = IllegalArgumentException.class)
-    public void testGetDeclaredFieldForceAccessIllegalArgumentException3() {
-        FieldUtils.getDeclaredField(PublicChild.class, "", true);
-    }
-
-    @Test(expected = IllegalArgumentException.class)
-    public void testGetDeclaredFieldForceAccessIllegalArgumentException4() {
-        FieldUtils.getDeclaredField(PublicChild.class, " ", true);
-    }
-
-    @Test
-    public void testReadStaticField() throws Exception {
-        assertEquals(Foo.VALUE, FieldUtils.readStaticField(FieldUtils.getField(Foo.class, "VALUE")));
-    }
-
-    @Test(expected = IllegalArgumentException.class)
-    public void testReadStaticFieldIllegalArgumentException1() throws Exception {
-        FieldUtils.readStaticField(null);
-    }
-
-    @Test(expected = IllegalArgumentException.class)
-    public void testReadStaticFieldIllegalArgumentException2() throws Exception {
-        assertEquals(Foo.VALUE, FieldUtils.readStaticField(FieldUtils.getField(Foo.class, "VALUE")));
-        final Field nonStaticField = FieldUtils.getField(PublicChild.class, "s");
-        assumeNotNull(nonStaticField);
-        FieldUtils.readStaticField(nonStaticField);
-    }
-
-    @Test
-    public void testReadStaticFieldForceAccess() throws Exception {
-        assertEquals(Foo.VALUE, FieldUtils.readStaticField(FieldUtils.getField(Foo.class, "VALUE")));
-        assertEquals(Foo.VALUE, FieldUtils.readStaticField(FieldUtils.getField(PublicChild.class, "VALUE")));
-    }
-
-    @Test(expected = IllegalArgumentException.class)
-    public void testReadStaticFieldForceAccessIllegalArgumentException1() throws Exception {
-        FieldUtils.readStaticField(null, true);
-    }
-
-    @Test(expected = IllegalArgumentException.class)
-    public void testReadStaticFieldForceAccessIllegalArgumentException2() throws Exception {
-        final Field nonStaticField = FieldUtils.getField(PublicChild.class, "s", true);
-        assumeNotNull(nonStaticField);
-        FieldUtils.readStaticField(nonStaticField);
-    }
-
-    @Test
-    public void testReadNamedStaticField() throws Exception {
-        assertEquals(Foo.VALUE, FieldUtils.readStaticField(Foo.class, "VALUE"));
-        assertEquals(Foo.VALUE, FieldUtils.readStaticField(PubliclyShadowedChild.class, "VALUE"));
-        assertEquals(Foo.VALUE, FieldUtils.readStaticField(PrivatelyShadowedChild.class, "VALUE"));
-        assertEquals(Foo.VALUE, FieldUtils.readStaticField(PublicChild.class, "VALUE"));
-
-        try {
-            FieldUtils.readStaticField(null, "none");
-            fail("null class should cause an IllegalArgumentException");
-        } catch (final IllegalArgumentException e) {
-            // expected
-        }
-
-        try {
-            FieldUtils.readStaticField(Foo.class, null);
-            fail("null field name should cause an IllegalArgumentException");
-        } catch (final IllegalArgumentException e) {
-            // expected
-        }
-
-        try {
-            FieldUtils.readStaticField(Foo.class, "");
-            fail("empty field name should cause an IllegalArgumentException");
-        } catch (final IllegalArgumentException e) {
-            // expected
-        }
-
-        try {
-            FieldUtils.readStaticField(Foo.class, " ");
-            fail("blank field name should cause an IllegalArgumentException");
-        } catch (final IllegalArgumentException e) {
-            // expected
-        }
-
-        try {
-            FieldUtils.readStaticField(Foo.class, "does_not_exist");
-            fail("a field that doesn't exist should cause an IllegalArgumentException");
-        } catch (final IllegalArgumentException e) {
-            // expected
-        }
-
-        try {
-            FieldUtils.readStaticField(PublicChild.class, "s");
-            fail("non-static field should cause an IllegalArgumentException");
-        } catch (final IllegalArgumentException e) {
-            // expected
-        }
-    }
-
-    @Test
-    public void testReadNamedStaticFieldForceAccess() throws Exception {
-        assertEquals(Foo.VALUE, FieldUtils.readStaticField(Foo.class, "VALUE", true));
-        assertEquals(Foo.VALUE, FieldUtils.readStaticField(PubliclyShadowedChild.class, "VALUE", true));
-        assertEquals(Foo.VALUE, FieldUtils.readStaticField(PrivatelyShadowedChild.class, "VALUE", true));
-        assertEquals("child", FieldUtils.readStaticField(PublicChild.class, "VALUE", true));
-
-        try {
-            FieldUtils.readStaticField(null, "none", true);
-            fail("null class should cause an IllegalArgumentException");
-        } catch (final IllegalArgumentException e) {
-            // expected
-        }
-
-        try {
-            FieldUtils.readStaticField(Foo.class, null, true);
-            fail("null field name should cause an IllegalArgumentException");
-        } catch (final IllegalArgumentException e) {
-            // expected
-        }
-
-        try {
-            FieldUtils.readStaticField(Foo.class, "", true);
-            fail("empty field name should cause an IllegalArgumentException");
-        } catch (final IllegalArgumentException e) {
-            // expected
-        }
-
-        try {
-            FieldUtils.readStaticField(Foo.class, " ", true);
-            fail("blank field name should cause an IllegalArgumentException");
-        } catch (final IllegalArgumentException e) {
-            // expected
-        }
-
-        try {
-            FieldUtils.readStaticField(Foo.class, "does_not_exist", true);
-            fail("a field that doesn't exist should cause an IllegalArgumentException");
-        } catch (final IllegalArgumentException e) {
-            // expected
-        }
-
-        try {
-            FieldUtils.readStaticField(PublicChild.class, "s", false);
-            fail("non-static field should cause an IllegalArgumentException");
-        } catch (final IllegalArgumentException e) {
-            // expected
-        }
-    }
-
-    @Test
-    public void testReadDeclaredNamedStaticField() throws Exception {
-        assertEquals(Foo.VALUE, FieldUtils.readDeclaredStaticField(Foo.class, "VALUE"));
-        try {
-            FieldUtils.readDeclaredStaticField(PublicChild.class, "VALUE");
-            fail("expected IllegalArgumentException");
-        } catch (final IllegalArgumentException e) {
-            // pass
-        }
-        try {
-            FieldUtils.readDeclaredStaticField(PubliclyShadowedChild.class, "VALUE");
-            fail("expected IllegalArgumentException");
-        } catch (final IllegalArgumentException e) {
-            // pass
-        }
-        try {
-            FieldUtils.readDeclaredStaticField(PrivatelyShadowedChild.class, "VALUE");
-            fail("expected IllegalArgumentException");
-        } catch (final IllegalArgumentException e) {
-            // pass
-        }
-    }
-
-    @Test
-    public void testReadDeclaredNamedStaticFieldForceAccess() throws Exception {
-        assertEquals(Foo.VALUE, FieldUtils.readDeclaredStaticField(Foo.class, "VALUE", true));
-        assertEquals("child", FieldUtils.readDeclaredStaticField(PublicChild.class, "VALUE", true));
-        try {
-            FieldUtils.readDeclaredStaticField(PubliclyShadowedChild.class, "VALUE", true);
-            fail("expected IllegalArgumentException");
-        } catch (final IllegalArgumentException e) {
-            // pass
-        }
-        try {
-            FieldUtils.readDeclaredStaticField(PrivatelyShadowedChild.class, "VALUE", true);
-            fail("expected IllegalArgumentException");
-        } catch (final IllegalArgumentException e) {
-            // pass
-        }
-    }
-
-    @Test
-    public void testReadField() throws Exception {
-        final Field parentS = FieldUtils.getDeclaredField(parentClass, "s");
-        assertEquals("s", FieldUtils.readField(parentS, publicChild));
-        assertEquals("s", FieldUtils.readField(parentS, publiclyShadowedChild));
-        assertEquals("s", FieldUtils.readField(parentS, privatelyShadowedChild));
-        final Field parentB = FieldUtils.getDeclaredField(parentClass, "b", true);
-        assertEquals(Boolean.FALSE, FieldUtils.readField(parentB, publicChild));
-        assertEquals(Boolean.FALSE, FieldUtils.readField(parentB, publiclyShadowedChild));
-        assertEquals(Boolean.FALSE, FieldUtils.readField(parentB, privatelyShadowedChild));
-        final Field parentI = FieldUtils.getDeclaredField(parentClass, "i", true);
-        assertEquals(I0, FieldUtils.readField(parentI, publicChild));
-        assertEquals(I0, FieldUtils.readField(parentI, publiclyShadowedChild));
-        assertEquals(I0, FieldUtils.readField(parentI, privatelyShadowedChild));
-        final Field parentD = FieldUtils.getDeclaredField(parentClass, "d", true);
-        assertEquals(D0, FieldUtils.readField(parentD, publicChild));
-        assertEquals(D0, FieldUtils.readField(parentD, publiclyShadowedChild));
-        assertEquals(D0, FieldUtils.readField(parentD, privatelyShadowedChild));
-
-        try {
-            FieldUtils.readField(null, publicChild);
-            fail("a null field should cause an IllegalArgumentException");
-        } catch (final IllegalArgumentException e) {
-            // expected
-        }
-    }
-
-    @Test
-    public void testReadFieldForceAccess() throws Exception {
-        final Field parentS = FieldUtils.getDeclaredField(parentClass, "s");
-        parentS.setAccessible(false);
-        assertEquals("s", FieldUtils.readField(parentS, publicChild, true));
-        assertEquals("s", FieldUtils.readField(parentS, publiclyShadowedChild, true));
-        assertEquals("s", FieldUtils.readField(parentS, privatelyShadowedChild, true));
-        final Field parentB = FieldUtils.getDeclaredField(parentClass, "b", true);
-        parentB.setAccessible(false);
-        assertEquals(Boolean.FALSE, FieldUtils.readField(parentB, publicChild, true));
-        assertEquals(Boolean.FALSE, FieldUtils.readField(parentB, publiclyShadowedChild, true));
-        assertEquals(Boolean.FALSE, FieldUtils.readField(parentB, privatelyShadowedChild, true));
-        final Field parentI = FieldUtils.getDeclaredField(parentClass, "i", true);
-        parentI.setAccessible(false);
-        assertEquals(I0, FieldUtils.readField(parentI, publicChild, true));
-        assertEquals(I0, FieldUtils.readField(parentI, publiclyShadowedChild, true));
-        assertEquals(I0, FieldUtils.readField(parentI, privatelyShadowedChild, true));
-        final Field parentD = FieldUtils.getDeclaredField(parentClass, "d", true);
-        parentD.setAccessible(false);
-        assertEquals(D0, FieldUtils.readField(parentD, publicChild, true));
-        assertEquals(D0, FieldUtils.readField(parentD, publiclyShadowedChild, true));
-        assertEquals(D0, FieldUtils.readField(parentD, privatelyShadowedChild, true));
-
-        try {
-            FieldUtils.readField(null, publicChild, true);
-            fail("a null field should cause an IllegalArgumentException");
-        } catch (final IllegalArgumentException e) {
-            // expected
-        }
-    }
-
-    @Test
-    public void testReadNamedField() throws Exception {
-        assertEquals("s", FieldUtils.readField(publicChild, "s"));
-        assertEquals("ss", FieldUtils.readField(publiclyShadowedChild, "s"));
-        assertEquals("s", FieldUtils.readField(privatelyShadowedChild, "s"));
-
-        try {
-            FieldUtils.readField(publicChild, null);
-            fail("a null field name should cause an IllegalArgumentException");
-        } catch (final IllegalArgumentException e) {
-            // expected
-        }
-
-        try {
-            FieldUtils.readField(publicChild, "");
-            fail("an empty field name should cause an IllegalArgumentException");
-        } catch (final IllegalArgumentException e) {
-            // expected
-        }
-
-        try {
-            FieldUtils.readField(publicChild, " ");
-            fail("a blank field name should cause an IllegalArgumentException");
-        } catch (final IllegalArgumentException e) {
-            // expected
-        }
-
-        try {
-            FieldUtils.readField((Object) null, "none");
-            fail("a null target should cause an IllegalArgumentException");
-        } catch (final IllegalArgumentException e) {
-            // expected
-        }
-
-        try {
-            FieldUtils.readField(publicChild, "b");
-            fail("expected IllegalArgumentException");
-        } catch (final IllegalArgumentException e) {
-            // pass
-        }
-        assertEquals(Boolean.TRUE, FieldUtils.readField(publiclyShadowedChild, "b"));
-        try {
-            FieldUtils.readField(privatelyShadowedChild, "b");
-            fail("expected IllegalArgumentException");
-        } catch (final IllegalArgumentException e) {
-            // pass
-        }
-        try {
-            FieldUtils.readField(publicChild, "i");
-            fail("expected IllegalArgumentException");
-        } catch (final IllegalArgumentException e) {
-            // pass
-        }
-        assertEquals(I1, FieldUtils.readField(publiclyShadowedChild, "i"));
-        try {
-            FieldUtils.readField(privatelyShadowedChild, "i");
-            fail("expected IllegalArgumentException");
-        } catch (final IllegalArgumentException e) {
-            // pass
-        }
-        try {
-            FieldUtils.readField(publicChild, "d");
-            fail("expected IllegalArgumentException");
-        } catch (final IllegalArgumentException e) {
-            // pass
-        }
-        assertEquals(D1, FieldUtils.readField(publiclyShadowedChild, "d"));
-        try {
-            FieldUtils.readField(privatelyShadowedChild, "d");
-            fail("expected IllegalArgumentException");
-        } catch (final IllegalArgumentException e) {
-            // pass
-        }
-    }
-
-    @Test
-    public void testReadNamedFieldForceAccess() throws Exception {
-        assertEquals("s", FieldUtils.readField(publicChild, "s", true));
-        assertEquals("ss", FieldUtils.readField(publiclyShadowedChild, "s", true));
-        assertEquals("ss", FieldUtils.readField(privatelyShadowedChild, "s", true));
-        assertEquals(Boolean.FALSE, FieldUtils.readField(publicChild, "b", true));
-        assertEquals(Boolean.TRUE, FieldUtils.readField(publiclyShadowedChild, "b", true));
-        assertEquals(Boolean.TRUE, FieldUtils.readField(privatelyShadowedChild, "b", true));
-        assertEquals(I0, FieldUtils.readField(publicChild, "i", true));
-        assertEquals(I1, FieldUtils.readField(publiclyShadowedChild, "i", true));
-        assertEquals(I1, FieldUtils.readField(privatelyShadowedChild, "i", true));
-        assertEquals(D0, FieldUtils.readField(publicChild, "d", true));
-        assertEquals(D1, FieldUtils.readField(publiclyShadowedChild, "d", true));
-        assertEquals(D1, FieldUtils.readField(privatelyShadowedChild, "d", true));
-
-        try {
-            FieldUtils.readField(publicChild, null, true);
-            fail("a null field name should cause an IllegalArgumentException");
-        } catch (final IllegalArgumentException e) {
-            // expected
-        }
-
-        try {
-            FieldUtils.readField(publicChild, "", true);
-            fail("an empty field name should cause an IllegalArgumentException");
-        } catch (final IllegalArgumentException e) {
-            // expected
-        }
-
-        try {
-            FieldUtils.readField(publicChild, " ", true);
-            fail("a blank field name should cause an IllegalArgumentException");
-        } catch (final IllegalArgumentException e) {
-            // expected
-        }
-
-        try {
-            FieldUtils.readField((Object) null, "none", true);
-            fail("a null target should cause an IllegalArgumentException");
-        } catch (final IllegalArgumentException e) {
-            // expected
-        }
-    }
-
-    @Test
-    public void testReadDeclaredNamedField() throws Exception {
-        try {
-            FieldUtils.readDeclaredField(publicChild, null);
-            fail("a null field name should cause an IllegalArgumentException");
-        } catch (final IllegalArgumentException e) {
-            // expected
-        }
-
-        try {
-            FieldUtils.readDeclaredField(publicChild, "");
-            fail("an empty field name should cause an IllegalArgumentException");
-        } catch (final IllegalArgumentException e) {
-            // expected
-        }
-
-        try {
-            FieldUtils.readDeclaredField(publicChild, " ");
-            fail("a blank field name should cause an IllegalArgumentException");
-        } catch (final IllegalArgumentException e) {
-            // expected
-        }
-
-        try {
-            FieldUtils.readDeclaredField(null, "none");
-            fail("a null target should cause an IllegalArgumentException");
-        } catch (final IllegalArgumentException e) {
-            // expected
-        }
-
-        try {
-            FieldUtils.readDeclaredField(publicChild, "s");
-            fail("expected IllegalArgumentException");
-        } catch (final IllegalArgumentException e) {
-            // pass
-        }
-        assertEquals("ss", FieldUtils.readDeclaredField(publiclyShadowedChild, "s"));
-        try {
-            FieldUtils.readDeclaredField(privatelyShadowedChild, "s");
-            fail("expected IllegalArgumentException");
-        } catch (final IllegalArgumentException e) {
-            // pass
-        }
-        try {
-            FieldUtils.readDeclaredField(publicChild, "b");
-            fail("expected IllegalArgumentException");
-        } catch (final IllegalArgumentException e) {
-            // pass
-        }
-        assertEquals(Boolean.TRUE, FieldUtils.readDeclaredField(publiclyShadowedChild, "b"));
-        try {
-            FieldUtils.readDeclaredField(privatelyShadowedChild, "b");
-            fail("expected IllegalArgumentException");
-        } catch (final IllegalArgumentException e) {
-            // pass
-        }
-        try {
-            FieldUtils.readDeclaredField(publicChild, "i");
-            fail("expected IllegalArgumentException");
-        } catch (final IllegalArgumentException e) {
-            // pass
-        }
-        assertEquals(I1, FieldUtils.readDeclaredField(publiclyShadowedChild, "i"));
-        try {
-            FieldUtils.readDeclaredField(privatelyShadowedChild, "i");
-            fail("expected IllegalArgumentException");
-        } catch (final IllegalArgumentException e) {
-            // pass
-        }
-        try {
-            FieldUtils.readDeclaredField(publicChild, "d");
-            fail("expected IllegalArgumentException");
-        } catch (final IllegalArgumentException e) {
-            // pass
-        }
-        assertEquals(D1, FieldUtils.readDeclaredField(publiclyShadowedChild, "d"));
-        try {
-            FieldUtils.readDeclaredField(privatelyShadowedChild, "d");
-            fail("expected IllegalArgumentException");
-        } catch (final IllegalArgumentException e) {
-            // pass
-        }
-    }
-
-    @Test
-    public void testReadDeclaredNamedFieldForceAccess() throws Exception {
-        try {
-            FieldUtils.readDeclaredField(publicChild, null, true);
-            fail("a null field name should cause an IllegalArgumentException");
-        } catch (final IllegalArgumentException e) {
-            // expected
-        }
-
-        try {
-            FieldUtils.readDeclaredField(publicChild, "", true);
-            fail("an empty field name should cause an IllegalArgumentException");
-        } catch (final IllegalArgumentException e) {
-            // expected
-        }
-
-        try {
-            FieldUtils.readDeclaredField(publicChild, " ", true);
-            fail("a blank field name should cause an IllegalArgumentException");
-        } catch (final IllegalArgumentException e) {
-            // expected
-        }
-
-        try {
-            FieldUtils.readDeclaredField(null, "none", true);
-            fail("a null target should cause an IllegalArgumentException");
-        } catch (final IllegalArgumentException e) {
-            // expected
-        }
-
-        try {
-            FieldUtils.readDeclaredField(publicChild, "s", true);
-            fail("expected IllegalArgumentException");
-        } catch (final IllegalArgumentException e) {
-            // pass
-        }
-        assertEquals("ss", FieldUtils.readDeclaredField(publiclyShadowedChild, "s", true));
-        assertEquals("ss", FieldUtils.readDeclaredField(privatelyShadowedChild, "s", true));
-        try {
-            FieldUtils.readDeclaredField(publicChild, "b", true);
-            fail("expected IllegalArgumentException");
-        } catch (final IllegalArgumentException e) {
-            // pass
-        }
-        assertEquals(Boolean.TRUE, FieldUtils.readDeclaredField(publiclyShadowedChild, "b", true));
-        assertEquals(Boolean.TRUE, FieldUtils.readDeclaredField(privatelyShadowedChild, "b", true));
-        try {
-            FieldUtils.readDeclaredField(publicChild, "i", true);
-            fail("expected IllegalArgumentException");
-        } catch (final IllegalArgumentException e) {
-            // pass
-        }
-        assertEquals(I1, FieldUtils.readDeclaredField(publiclyShadowedChild, "i", true));
-        assertEquals(I1, FieldUtils.readDeclaredField(privatelyShadowedChild, "i", true));
-        try {
-            FieldUtils.readDeclaredField(publicChild, "d", true);
-            fail("expected IllegalArgumentException");
-        } catch (final IllegalArgumentException e) {
-            // pass
-        }
-        assertEquals(D1, FieldUtils.readDeclaredField(publiclyShadowedChild, "d", true));
-        assertEquals(D1, FieldUtils.readDeclaredField(privatelyShadowedChild, "d", true));
-    }
-
-    @Test
-    public void testWriteStaticField() throws Exception {
-        Field field = StaticContainer.class.getDeclaredField("mutablePublic");
-        FieldUtils.writeStaticField(field, "new");
-        assertEquals("new", StaticContainer.mutablePublic);
-        field = StaticContainer.class.getDeclaredField("mutableProtected");
-        try {
-            FieldUtils.writeStaticField(field, "new");
-            fail("Expected IllegalAccessException");
-        } catch (final IllegalAccessException e) {
-            // pass
-        }
-        field = StaticContainer.class.getDeclaredField("mutablePackage");
-        try {
-            FieldUtils.writeStaticField(field, "new");
-            fail("Expected IllegalAccessException");
-        } catch (final IllegalAccessException e) {
-            // pass
-        }
-        field = StaticContainer.class.getDeclaredField("mutablePrivate");
-        try {
-            FieldUtils.writeStaticField(field, "new");
-            fail("Expected IllegalAccessException");
-        } catch (final IllegalAccessException e) {
-            // pass
-        }
-        field = StaticContainer.class.getDeclaredField("IMMUTABLE_PUBLIC");
-        try {
-            FieldUtils.writeStaticField(field, "new");
-            fail("Expected IllegalAccessException");
-        } catch (final IllegalAccessException e) {
-            // pass
-        }
-        field = StaticContainer.class.getDeclaredField("IMMUTABLE_PROTECTED");
-        try {
-            FieldUtils.writeStaticField(field, "new");
-            fail("Expected IllegalAccessException");
-        } catch (final IllegalAccessException e) {
-            // pass
-        }
-        field = StaticContainer.class.getDeclaredField("IMMUTABLE_PACKAGE");
-        try {
-            FieldUtils.writeStaticField(field, "new");
-            fail("Expected IllegalAccessException");
-        } catch (final IllegalAccessException e) {
-            // pass
-        }
-        field = StaticContainer.class.getDeclaredField("IMMUTABLE_PRIVATE");
-        try {
-            FieldUtils.writeStaticField(field, "new");
-            fail("Expected IllegalAccessException");
-        } catch (final IllegalAccessException e) {
-            // pass
-        }
-    }
-
-    @Test
-    public void testWriteStaticFieldForceAccess() throws Exception {
-        Field field = StaticContainer.class.getDeclaredField("mutablePublic");
-        FieldUtils.writeStaticField(field, "new", true);
-        assertEquals("new", StaticContainer.mutablePublic);
-        field = StaticContainer.class.getDeclaredField("mutableProtected");
-        FieldUtils.writeStaticField(field, "new", true);
-        assertEquals("new", StaticContainer.getMutableProtected());
-        field = StaticContainer.class.getDeclaredField("mutablePackage");
-        FieldUtils.writeStaticField(field, "new", true);
-        assertEquals("new", StaticContainer.getMutablePackage());
-        field = StaticContainer.class.getDeclaredField("mutablePrivate");
-        FieldUtils.writeStaticField(field, "new", true);
-        assertEquals("new", StaticContainer.getMutablePrivate());
-        field = StaticContainer.class.getDeclaredField("IMMUTABLE_PUBLIC");
-        try {
-            FieldUtils.writeStaticField(field, "new", true);
-            fail("Expected IllegalAccessException");
-        } catch (final IllegalAccessException e) {
-            // pass
-        }
-        field = StaticContainer.class.getDeclaredField("IMMUTABLE_PROTECTED");
-        try {
-            FieldUtils.writeStaticField(field, "new", true);
-            fail("Expected IllegalAccessException");
-        } catch (final IllegalAccessException e) {
-            // pass
-        }
-        field = StaticContainer.class.getDeclaredField("IMMUTABLE_PACKAGE");
-        try {
-            FieldUtils.writeStaticField(field, "new", true);
-            fail("Expected IllegalAccessException");
-        } catch (final IllegalAccessException e) {
-            // pass
-        }
-        field = StaticContainer.class.getDeclaredField("IMMUTABLE_PRIVATE");
-        try {
-            FieldUtils.writeStaticField(field, "new", true);
-            fail("Expected IllegalAccessException");
-        } catch (final IllegalAccessException e) {
-            // pass
-        }
-    }
-
-    @Test
-    public void testWriteNamedStaticField() throws Exception {
-        FieldUtils.writeStaticField(StaticContainerChild.class, "mutablePublic", "new");
-        assertEquals("new", StaticContainer.mutablePublic);
-        try {
-            FieldUtils.writeStaticField(StaticContainerChild.class, "mutableProtected", "new");
-            fail("Expected IllegalArgumentException");
-        } catch (final IllegalArgumentException e) {
-            // pass
-        }
-        try {
-            FieldUtils.writeStaticField(StaticContainerChild.class, "mutablePackage", "new");
-            fail("Expected IllegalArgumentException");
-        } catch (final IllegalArgumentException e) {
-            // pass
-        }
-        try {
-            FieldUtils.writeStaticField(StaticContainerChild.class, "mutablePrivate", "new");
-            fail("Expected IllegalArgumentException");
-        } catch (final IllegalArgumentException e) {
-            // pass
-        }
-        try {
-            FieldUtils.writeStaticField(StaticContainerChild.class, "IMMUTABLE_PUBLIC", "new");
-            fail("Expected IllegalAccessException");
-        } catch (final IllegalAccessException e) {
-            // pass
-        }
-        try {
-            FieldUtils.writeStaticField(StaticContainerChild.class, "IMMUTABLE_PROTECTED", "new");
-            fail("Expected IllegalArgumentException");
-        } catch (final IllegalArgumentException e) {
-            // pass
-        }
-        try {
-            FieldUtils.writeStaticField(StaticContainerChild.class, "IMMUTABLE_PACKAGE", "new");
-            fail("Expected IllegalArgumentException");
-        } catch (final IllegalArgumentException e) {
-            // pass
-        }
-        try {
-            FieldUtils.writeStaticField(StaticContainerChild.class, "IMMUTABLE_PRIVATE", "new");
-            fail("Expected IllegalArgumentException");
-        } catch (final IllegalArgumentException e) {
-            // pass
-        }
-    }
-
-    @Test
-    public void testWriteNamedStaticFieldForceAccess() throws Exception {
-        FieldUtils.writeStaticField(StaticContainerChild.class, "mutablePublic", "new", true);
-        assertEquals("new", StaticContainer.mutablePublic);
-        FieldUtils.writeStaticField(StaticContainerChild.class, "mutableProtected", "new", true);
-        assertEquals("new", StaticContainer.getMutableProtected());
-        FieldUtils.writeStaticField(StaticContainerChild.class, "mutablePackage", "new", true);
-        assertEquals("new", StaticContainer.getMutablePackage());
-        FieldUtils.writeStaticField(StaticContainerChild.class, "mutablePrivate", "new", true);
-        assertEquals("new", StaticContainer.getMutablePrivate());
-        try {
-            FieldUtils.writeStaticField(StaticContainerChild.class, "IMMUTABLE_PUBLIC", "new", true);
-            fail("Expected IllegalAccessException");
-        } catch (final IllegalAccessException e) {
-            // pass
-        }
-        try {
-            FieldUtils.writeStaticField(StaticContainerChild.class, "IMMUTABLE_PROTECTED", "new", true);
-            fail("Expected IllegalAccessException");
-        } catch (final IllegalAccessException e) {
-            // pass
-        }
-        try {
-            FieldUtils.writeStaticField(StaticContainerChild.class, "IMMUTABLE_PACKAGE", "new", true);
-            fail("Expected IllegalAccessException");
-        } catch (final IllegalAccessException e) {
-            // pass
-        }
-        try {
-            FieldUtils.writeStaticField(StaticContainerChild.class, "IMMUTABLE_PRIVATE", "new", true);
-            fail("Expected IllegalAccessException");
-        } catch (final IllegalAccessException e) {
-            // pass
-        }
-    }
-
-    @Test
-    public void testWriteDeclaredNamedStaticField() throws Exception {
-        FieldUtils.writeStaticField(StaticContainer.class, "mutablePublic", "new");
-        assertEquals("new", StaticContainer.mutablePublic);
-        try {
-            FieldUtils.writeDeclaredStaticField(StaticContainer.class, "mutableProtected", "new");
-            fail("Expected IllegalArgumentException");
-        } catch (final IllegalArgumentException e) {
-            // pass
-        }
-        try {
-            FieldUtils.writeDeclaredStaticField(StaticContainer.class, "mutablePackage", "new");
-            fail("Expected IllegalArgumentException");
-        } catch (final IllegalArgumentException e) {
-            // pass
-        }
-        try {
-            FieldUtils.writeDeclaredStaticField(StaticContainer.class, "mutablePrivate", "new");
-            fail("Expected IllegalArgumentException");
-        } catch (final IllegalArgumentException e) {
-            // pass
-        }
-        try {
-            FieldUtils.writeDeclaredStaticField(StaticContainer.class, "IMMUTABLE_PUBLIC", "new");
-            fail("Expected IllegalAccessException");
-        } catch (final IllegalAccessException e) {
-            // pass
-        }
-        try {
-            FieldUtils.writeDeclaredStaticField(StaticContainer.class, "IMMUTABLE_PROTECTED", "new");
-            fail("Expected IllegalArgumentException");
-        } catch (final IllegalArgumentException e) {
-            // pass
-        }
-        try {
-            FieldUtils.writeDeclaredStaticField(StaticContainer.class, "IMMUTABLE_PACKAGE", "new");
-            fail("Expected IllegalArgumentException");
-        } catch (final IllegalArgumentException e) {
-            // pass
-        }
-        try {
-            FieldUtils.writeDeclaredStaticField(StaticContainer.class, "IMMUTABLE_PRIVATE", "new");
-            fail("Expected IllegalArgumentException");
-        } catch (final IllegalArgumentException e) {
-            // pass
-        }
-    }
-
-    @Test
-    public void testWriteDeclaredNamedStaticFieldForceAccess() throws Exception {
-        FieldUtils.writeDeclaredStaticField(StaticContainer.class, "mutablePublic", "new", true);
-        assertEquals("new", StaticContainer.mutablePublic);
-        FieldUtils.writeDeclaredStaticField(StaticContainer.class, "mutableProtected", "new", true);
-        assertEquals("new", StaticContainer.getMutableProtected());
-        FieldUtils.writeDeclaredStaticField(StaticContainer.class, "mutablePackage", "new", true);
-        assertEquals("new", StaticContainer.getMutablePackage());
-        FieldUtils.writeDeclaredStaticField(StaticContainer.class, "mutablePrivate", "new", true);
-        assertEquals("new", StaticContainer.getMutablePrivate());
-        try {
-            FieldUtils.writeDeclaredStaticField(StaticContainer.class, "IMMUTABLE_PUBLIC", "new", true);
-            fail("Expected IllegalAccessException");
-        } catch (final IllegalAccessException e) {
-            // pass
-        }
-        try {
-            FieldUtils.writeDeclaredStaticField(StaticContainer.class, "IMMUTABLE_PROTECTED", "new", true);
-            fail("Expected IllegalAccessException");
-        } catch (final IllegalAccessException e) {
-            // pass
-        }
-        try {
-            FieldUtils.writeDeclaredStaticField(StaticContainer.class, "IMMUTABLE_PACKAGE", "new", true);
-            fail("Expected IllegalAccessException");
-        } catch (final IllegalAccessException e) {
-            // pass
-        }
-        try {
-            FieldUtils.writeDeclaredStaticField(StaticContainer.class, "IMMUTABLE_PRIVATE", "new", true);
-            fail("Expected IllegalAccessException");
-        } catch (final IllegalAccessException e) {
-            // pass
-        }
-    }
-
-    @Test
-    public void testWriteField() throws Exception {
-        Field field = parentClass.getDeclaredField("s");
-        FieldUtils.writeField(field, publicChild, "S");
-        assertEquals("S", field.get(publicChild));
-        field = parentClass.getDeclaredField("b");
-        try {
-            FieldUtils.writeField(field, publicChild, Boolean.TRUE);
-            fail("Expected IllegalAccessException");
-        } catch (final IllegalAccessException e) {
-            // pass
-        }
-        field = parentClass.getDeclaredField("i");
-        try {
-            FieldUtils.writeField(field, publicChild, Integer.valueOf(Integer.MAX_VALUE));
-            fail("Expected IllegalAccessException");
-        } catch (final IllegalAccessException e) {
-            // pass
-        }
-        field = parentClass.getDeclaredField("d");
-        try {
-            FieldUtils.writeField(field, publicChild, Double.valueOf(Double.MAX_VALUE));
-            fail("Expected IllegalAccessException");
-        } catch (final IllegalAccessException e) {
-            // pass
-        }
-    }
-
-    @Test
-    public void testWriteFieldForceAccess() throws Exception {
-        Field field = parentClass.getDeclaredField("s");
-        FieldUtils.writeField(field, publicChild, "S", true);
-        assertEquals("S", field.get(publicChild));
-        field = parentClass.getDeclaredField("b");
-        FieldUtils.writeField(field, publicChild, Boolean.TRUE, true);
-        assertEquals(Boolean.TRUE, field.get(publicChild));
-        field = parentClass.getDeclaredField("i");
-        FieldUtils.writeField(field, publicChild, Integer.valueOf(Integer.MAX_VALUE), true);
-        assertEquals(Integer.valueOf(Integer.MAX_VALUE), field.get(publicChild));
-        field = parentClass.getDeclaredField("d");
-        FieldUtils.writeField(field, publicChild, Double.valueOf(Double.MAX_VALUE), true);
-        assertEquals(Double.valueOf(Double.MAX_VALUE), field.get(publicChild));
-    }
-
-    @Test
-    public void testWriteNamedField() throws Exception {
-        FieldUtils.writeField(publicChild, "s", "S");
-        assertEquals("S", FieldUtils.readField(publicChild, "s"));
-        try {
-            FieldUtils.writeField(publicChild, "b", Boolean.TRUE);
-            fail("Expected IllegalArgumentException");
-        } catch (final IllegalArgumentException e) {
-            // pass
-        }
-        try {
-            FieldUtils.writeField(publicChild, "i", Integer.valueOf(1));
-            fail("Expected IllegalArgumentException");
-        } catch (final IllegalArgumentException e) {
-            // pass
-        }
-        try {
-            FieldUtils.writeField(publicChild, "d", Double.valueOf(1.0));
-            fail("Expected IllegalArgumentException");
-        } catch (final IllegalArgumentException e) {
-            // pass
-        }
-
-        FieldUtils.writeField(publiclyShadowedChild, "s", "S");
-        assertEquals("S", FieldUtils.readField(publiclyShadowedChild, "s"));
-        FieldUtils.writeField(publiclyShadowedChild, "b", Boolean.FALSE);
-        assertEquals(Boolean.FALSE, FieldUtils.readField(publiclyShadowedChild, "b"));
-        FieldUtils.writeField(publiclyShadowedChild, "i", Integer.valueOf(0));
-        assertEquals(Integer.valueOf(0), FieldUtils.readField(publiclyShadowedChild, "i"));
-        FieldUtils.writeField(publiclyShadowedChild, "d", Double.valueOf(0.0));
-        assertEquals(Double.valueOf(0.0), FieldUtils.readField(publiclyShadowedChild, "d"));
-
-        FieldUtils.writeField(privatelyShadowedChild, "s", "S");
-        assertEquals("S", FieldUtils.readField(privatelyShadowedChild, "s"));
-        try {
-            FieldUtils.writeField(privatelyShadowedChild, "b", Boolean.TRUE);
-            fail("Expected IllegalArgumentException");
-        } catch (final IllegalArgumentException e) {
-            // pass
-        }
-        try {
-            FieldUtils.writeField(privatelyShadowedChild, "i", Integer.valueOf(1));
-            fail("Expected IllegalArgumentException");
-        } catch (final IllegalArgumentException e) {
-            // pass
-        }
-        try {
-            FieldUtils.writeField(privatelyShadowedChild, "d", Double.valueOf(1.0));
-            fail("Expected IllegalArgumentException");
-        } catch (final IllegalArgumentException e) {
-            // pass
-        }
-    }
-
-    @Test
-    public void testWriteNamedFieldForceAccess() throws Exception {
-        FieldUtils.writeField(publicChild, "s", "S", true);
-        assertEquals("S", FieldUtils.readField(publicChild, "s", true));
-        FieldUtils.writeField(publicChild, "b", Boolean.TRUE, true);
-        assertEquals(Boolean.TRUE, FieldUtils.readField(publicChild, "b", true));
-        FieldUtils.writeField(publicChild, "i", Integer.valueOf(1), true);
-        assertEquals(Integer.valueOf(1), FieldUtils.readField(publicChild, "i", true));
-        FieldUtils.writeField(publicChild, "d", Double.valueOf(1.0), true);
-        assertEquals(Double.valueOf(1.0), FieldUtils.readField(publicChild, "d", true));
-
-        FieldUtils.writeField(publiclyShadowedChild, "s", "S", true);
-        assertEquals("S", FieldUtils.readField(publiclyShadowedChild, "s", true));
-        FieldUtils.writeField(publiclyShadowedChild, "b", Boolean.FALSE, true);
-        assertEquals(Boolean.FALSE, FieldUtils.readField(publiclyShadowedChild, "b", true));
-        FieldUtils.writeField(publiclyShadowedChild, "i", Integer.valueOf(0), true);
-        assertEquals(Integer.valueOf(0), FieldUtils.readField(publiclyShadowedChild, "i", true));
-        FieldUtils.writeField(publiclyShadowedChild, "d", Double.valueOf(0.0), true);
-        assertEquals(Double.valueOf(0.0), FieldUtils.readField(publiclyShadowedChild, "d", true));
-
-        FieldUtils.writeField(privatelyShadowedChild, "s", "S", true);
-        assertEquals("S", FieldUtils.readField(privatelyShadowedChild, "s", true));
-        FieldUtils.writeField(privatelyShadowedChild, "b", Boolean.FALSE, true);
-        assertEquals(Boolean.FALSE, FieldUtils.readField(privatelyShadowedChild, "b", true));
-        FieldUtils.writeField(privatelyShadowedChild, "i", Integer.valueOf(0), true);
-        assertEquals(Integer.valueOf(0), FieldUtils.readField(privatelyShadowedChild, "i", true));
-        FieldUtils.writeField(privatelyShadowedChild, "d", Double.valueOf(0.0), true);
-        assertEquals(Double.valueOf(0.0), FieldUtils.readField(privatelyShadowedChild, "d", true));
-    }
-
-    @Test
-    public void testWriteDeclaredNamedField() throws Exception {
-        try {
-            FieldUtils.writeDeclaredField(publicChild, "s", "S");
-            fail("Expected IllegalArgumentException");
-        } catch (final IllegalArgumentException e) {
-            // pass
-        }
-        try {
-            FieldUtils.writeDeclaredField(publicChild, "b", Boolean.TRUE);
-            fail("Expected IllegalArgumentException");
-        } catch (final IllegalArgumentException e) {
-            // pass
-        }
-        try {
-            FieldUtils.writeDeclaredField(publicChild, "i", Integer.valueOf(1));
-            fail("Expected IllegalArgumentException");
-        } catch (final IllegalArgumentException e) {
-            // pass
-        }
-        try {
-            FieldUtils.writeDeclaredField(publicChild, "d", Double.valueOf(1.0));
-            fail("Expected IllegalArgumentException");
-        } catch (final IllegalArgumentException e) {
-            // pass
-        }
-
-        FieldUtils.writeDeclaredField(publiclyShadowedChild, "s", "S");
-        assertEquals("S", FieldUtils.readDeclaredField(publiclyShadowedChild, "s"));
-        FieldUtils.writeDeclaredField(publiclyShadowedChild, "b", Boolean.FALSE);
-        assertEquals(Boolean.FALSE, FieldUtils.readDeclaredField(publiclyShadowedChild, "b"));
-        FieldUtils.writeDeclaredField(publiclyShadowedChild, "i", Integer.valueOf(0));
-        assertEquals(Integer.valueOf(0), FieldUtils.readDeclaredField(publiclyShadowedChild, "i"));
-        FieldUtils.writeDeclaredField(publiclyShadowedChild, "d", Double.valueOf(0.0));
-        assertEquals(Double.valueOf(0.0), FieldUtils.readDeclaredField(publiclyShadowedChild, "d"));
-
-        try {
-            FieldUtils.writeDeclaredField(privatelyShadowedChild, "s", "S");
-            fail("Expected IllegalArgumentException");
-        } catch (final IllegalArgumentException e) {
-            // pass
-        }
-        try {
-            FieldUtils.writeDeclaredField(privatelyShadowedChild, "b", Boolean.TRUE);
-            fail("Expected IllegalArgumentException");
-        } catch (final IllegalArgumentException e) {
-            // pass
-        }
-        try {
-            FieldUtils.writeDeclaredField(privatelyShadowedChild, "i", Integer.valueOf(1));
-            fail("Expected IllegalArgumentException");
-        } catch (final IllegalArgumentException e) {
-            // pass
-        }
-        try {
-            FieldUtils.writeDeclaredField(privatelyShadowedChild, "d", Double.valueOf(1.0));
-            fail("Expected IllegalArgumentException");
-        } catch (final IllegalArgumentException e) {
-            // pass
-        }
-    }
-
-    @Test
-    public void testWriteDeclaredNamedFieldForceAccess() throws Exception {
-        try {
-            FieldUtils.writeDeclaredField(publicChild, "s", "S", true);
-            fail("Expected IllegalArgumentException");
-        } catch (final IllegalArgumentException e) {
-            // pass
-        }
-        try {
-            FieldUtils.writeDeclaredField(publicChild, "b", Boolean.TRUE, true);
-            fail("Expected IllegalArgumentException");
-        } catch (final IllegalArgumentException e) {
-            // pass
-        }
-        try {
-            FieldUtils.writeDeclaredField(publicChild, "i", Integer.valueOf(1), true);
-            fail("Expected IllegalArgumentException");
-        } catch (final IllegalArgumentException e) {
-            // pass
-        }
-        try {
-            FieldUtils.writeDeclaredField(publicChild, "d", Double.valueOf(1.0), true);
-            fail("Expected IllegalArgumentException");
-        } catch (final IllegalArgumentException e) {
-            // pass
-        }
-
-        FieldUtils.writeDeclaredField(publiclyShadowedChild, "s", "S", true);
-        assertEquals("S", FieldUtils.readDeclaredField(publiclyShadowedChild, "s", true));
-        FieldUtils.writeDeclaredField(publiclyShadowedChild, "b", Boolean.FALSE, true);
-        assertEquals(Boolean.FALSE, FieldUtils.readDeclaredField(publiclyShadowedChild, "b", true));
-        FieldUtils.writeDeclaredField(publiclyShadowedChild, "i", Integer.valueOf(0), true);
-        assertEquals(Integer.valueOf(0), FieldUtils.readDeclaredField(publiclyShadowedChild, "i", true));
-        FieldUtils.writeDeclaredField(publiclyShadowedChild, "d", Double.valueOf(0.0), true);
-        assertEquals(Double.valueOf(0.0), FieldUtils.readDeclaredField(publiclyShadowedChild, "d", true));
-
-        FieldUtils.writeDeclaredField(privatelyShadowedChild, "s", "S", true);
-        assertEquals("S", FieldUtils.readDeclaredField(privatelyShadowedChild, "s", true));
-        FieldUtils.writeDeclaredField(privatelyShadowedChild, "b", Boolean.FALSE, true);
-        assertEquals(Boolean.FALSE, FieldUtils.readDeclaredField(privatelyShadowedChild, "b", true));
-        FieldUtils.writeDeclaredField(privatelyShadowedChild, "i", Integer.valueOf(0), true);
-        assertEquals(Integer.valueOf(0), FieldUtils.readDeclaredField(privatelyShadowedChild, "i", true));
-        FieldUtils.writeDeclaredField(privatelyShadowedChild, "d", Double.valueOf(0.0), true);
-        assertEquals(Double.valueOf(0.0), FieldUtils.readDeclaredField(privatelyShadowedChild, "d", true));
-    }
-
-    @Test(expected = IllegalArgumentException.class)
-    public void testAmbig() {
-        FieldUtils.getField(Ambig.class, "VALUE");
-    }
-
-    @Test
-    public void testRemoveFinalModifier() throws Exception {
-        final Field field = StaticContainer.class.getDeclaredField("IMMUTABLE_PRIVATE_2");
-        assertFalse(field.isAccessible());
-        assertTrue(Modifier.isFinal(field.getModifiers()));
-        FieldUtils.removeFinalModifier(field);
-        // The field is no longer final
-        assertFalse(Modifier.isFinal(field.getModifiers()));
-        assertFalse(field.isAccessible());
-    }
-    
-    @Test
-    public void testRemoveFinalModifierWithAccess() throws Exception {
-        final Field field = StaticContainer.class.getDeclaredField("IMMUTABLE_PRIVATE_2");
-        assertFalse(field.isAccessible());
-        assertTrue(Modifier.isFinal(field.getModifiers()));
-        FieldUtils.removeFinalModifier(field, true);
-        // The field is no longer final
-        assertFalse(Modifier.isFinal(field.getModifiers()));
-        assertFalse(field.isAccessible());
-    }
-
-    @Test
-    public void testRemoveFinalModifierWithoutAccess() throws Exception {
-        final Field field = StaticContainer.class.getDeclaredField("IMMUTABLE_PRIVATE_2");
-        assertFalse(field.isAccessible());
-        assertTrue(Modifier.isFinal(field.getModifiers()));
-        FieldUtils.removeFinalModifier(field, false);
-        // The field is STILL final because we did not force access
-        assertTrue(Modifier.isFinal(field.getModifiers()));
-        assertFalse(field.isAccessible());
-    }
-
-    @Test
-    public void testRemoveFinalModifierAccessNotNeeded() throws Exception {
-        final Field field = StaticContainer.class.getDeclaredField("IMMUTABLE_PACKAGE");
-        assertFalse(field.isAccessible());
-        assertTrue(Modifier.isFinal(field.getModifiers()));
-        FieldUtils.removeFinalModifier(field, false);
-        // The field is no longer final AND we did not need to force access
-        assertTrue(Modifier.isFinal(field.getModifiers()));
-        assertFalse(field.isAccessible());
-    }
-
-}
diff --git a/lang/src/test/java/org/apache/commons/lang3/reflect/InheritanceUtilsTest.java b/lang/src/test/java/org/apache/commons/lang3/reflect/InheritanceUtilsTest.java
deleted file mode 100644
index efa5871..0000000
--- a/lang/src/test/java/org/apache/commons/lang3/reflect/InheritanceUtilsTest.java
+++ /dev/null
@@ -1,79 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.commons.lang3.reflect;
-
-import org.apache.commons.lang3.reflect.testbed.AnotherChild;
-import org.apache.commons.lang3.reflect.testbed.AnotherParent;
-import org.apache.commons.lang3.reflect.testbed.Grandchild;
-import org.junit.Test;
-
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertNotNull;
-
-/**
- * Unit tests InheritanceUtils
- */
-public class InheritanceUtilsTest {
-
-    @Test
-    public void testConstructor() throws Exception {
-        assertNotNull(InheritanceUtils.class.newInstance());
-    }
-
-    @Test
-    public void testDistanceGreaterThanZero() {
-        assertEquals(1, InheritanceUtils.distance(AnotherChild.class, AnotherParent.class));
-        assertEquals(1, InheritanceUtils.distance(Grandchild.class, AnotherChild.class));
-        assertEquals(2, InheritanceUtils.distance(Grandchild.class, AnotherParent.class));
-        assertEquals(3, InheritanceUtils.distance(Grandchild.class, Object.class));
-    }
-
-    @Test
-    public void testDistanceEqual() {
-        assertEquals(0, InheritanceUtils.distance(AnotherChild.class, AnotherChild.class));
-    }
-
-    @Test
-    public void testDistanceEqualObject() {
-        assertEquals(0, InheritanceUtils.distance(Object.class, Object.class));
-    }
-
-    @Test
-    public void testDistanceNullChild() {
-        assertEquals(-1, InheritanceUtils.distance(null, Object.class));
-    }
-
-    @Test
-    public void testDistanceNullParent() {
-        assertEquals(-1, InheritanceUtils.distance(Object.class, null));
-    }
-
-    @Test
-    public void testDistanceNullParentNullChild() {
-        assertEquals(-1, InheritanceUtils.distance(null, null));
-    }
-
-    @Test
-    public void testDistanceDisjoint() {
-        assertEquals(-1, InheritanceUtils.distance(Boolean.class, String.class));
-    }
-
-    @Test
-    public void testDistanceReverseParentChild() {
-        assertEquals(-1, InheritanceUtils.distance(Object.class, Grandchild.class));
-    }
-}
diff --git a/lang/src/test/java/org/apache/commons/lang3/reflect/MethodUtilsTest.java b/lang/src/test/java/org/apache/commons/lang3/reflect/MethodUtilsTest.java
deleted file mode 100644
index b056c14..0000000
--- a/lang/src/test/java/org/apache/commons/lang3/reflect/MethodUtilsTest.java
+++ /dev/null
@@ -1,537 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.commons.lang3.reflect;
-
-import static org.hamcrest.Matchers.hasItemInArray;
-import static org.hamcrest.Matchers.hasItems;
-import static org.junit.Assert.assertArrayEquals;
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertFalse;
-import static org.junit.Assert.assertNotNull;
-import static org.junit.Assert.assertNotSame;
-import static org.junit.Assert.assertNull;
-import static org.junit.Assert.assertSame;
-import static org.junit.Assert.assertThat;
-import static org.junit.Assert.assertTrue;
-import static org.junit.Assert.fail;
-
-import java.lang.reflect.Method;
-import java.lang.reflect.Type;
-import java.util.Arrays;
-import java.util.HashMap;
-import java.util.Iterator;
-import java.util.List;
-import java.util.Map;
-
-import org.apache.commons.lang3.ArrayUtils;
-import org.apache.commons.lang3.math.NumberUtils;
-import org.apache.commons.lang3.mutable.Mutable;
-import org.apache.commons.lang3.mutable.MutableObject;
-import org.apache.commons.lang3.ClassUtils.Interfaces;
-import org.apache.commons.lang3.reflect.testbed.Annotated;
-import org.apache.commons.lang3.reflect.testbed.GenericConsumer;
-import org.apache.commons.lang3.reflect.testbed.GenericParent;
-import org.apache.commons.lang3.reflect.testbed.StringParameterizedChild;
-import org.junit.Before;
-import org.junit.Test;
-
-/**
- * Unit tests MethodUtils
- * @version $Id$
- */
-public class MethodUtilsTest {
-  
-    private static interface PrivateInterface {}
-    
-    static class TestBeanWithInterfaces implements PrivateInterface {
-        public String foo() {
-            return "foo()";
-        }
-    }
-    
-    public static class TestBean {
-
-        public static String bar() {
-            return "bar()";
-        }
-
-        public static String bar(final int i) {
-            return "bar(int)";
-        }
-
-        public static String bar(final Integer i) {
-            return "bar(Integer)";
-        }
-
-        public static String bar(final double d) {
-            return "bar(double)";
-        }
-
-        public static String bar(final String s) {
-            return "bar(String)";
-        }
-
-        public static String bar(final Object o) {
-            return "bar(Object)";
-        }
-        
-        public static void oneParameterStatic(final String s) {
-            // empty
-        }
-
-        @SuppressWarnings("unused")
-        private void privateStuff() {
-        }
-
-
-        public String foo() {
-            return "foo()";
-        }
-
-        public String foo(final int i) {
-            return "foo(int)";
-        }
-
-        public String foo(final Integer i) {
-            return "foo(Integer)";
-        }
-
-        public String foo(final double d) {
-            return "foo(double)";
-        }
-
-        public String foo(final String s) {
-            return "foo(String)";
-        }
-
-        public String foo(final Object o) {
-            return "foo(Object)";
-        }
-        
-        public void oneParameter(final String s) {
-            // empty
-        }
-    }
-
-    private static class TestMutable implements Mutable<Object> {
-        @Override
-        public Object getValue() {
-            return null;
-        }
-
-        @Override
-        public void setValue(final Object value) {
-        }
-    }
-
-    private TestBean testBean;
-    private final Map<Class<?>, Class<?>[]> classCache = new HashMap<Class<?>, Class<?>[]>();
-
-    @Before
-    public void setUp() throws Exception {
-        testBean = new TestBean();
-        classCache.clear();
-    }
-
-    @Test
-    public void testConstructor() throws Exception {
-        assertNotNull(MethodUtils.class.newInstance());
-    }
-
-    @Test
-    public void testInvokeMethod() throws Exception {
-        assertEquals("foo()", MethodUtils.invokeMethod(testBean, "foo",
-                (Object[]) ArrayUtils.EMPTY_CLASS_ARRAY));
-        assertEquals("foo()", MethodUtils.invokeMethod(testBean, "foo"));
-        assertEquals("foo()", MethodUtils.invokeMethod(testBean, "foo",
-                (Object[]) null));
-        assertEquals("foo()", MethodUtils.invokeMethod(testBean, "foo", 
-                (Object[]) null, (Class<?>[]) null));
-        assertEquals("foo(String)", MethodUtils.invokeMethod(testBean, "foo",
-                ""));
-        assertEquals("foo(Object)", MethodUtils.invokeMethod(testBean, "foo",
-                new Object()));
-        assertEquals("foo(Object)", MethodUtils.invokeMethod(testBean, "foo",
-                Boolean.TRUE));
-        assertEquals("foo(Integer)", MethodUtils.invokeMethod(testBean, "foo",
-                NumberUtils.INTEGER_ONE));
-        assertEquals("foo(int)", MethodUtils.invokeMethod(testBean, "foo",
-                NumberUtils.BYTE_ONE));
-        assertEquals("foo(double)", MethodUtils.invokeMethod(testBean, "foo",
-                NumberUtils.LONG_ONE));
-        assertEquals("foo(double)", MethodUtils.invokeMethod(testBean, "foo",
-                NumberUtils.DOUBLE_ONE));
-    }
-
-    @Test
-    public void testInvokeExactMethod() throws Exception {
-        assertEquals("foo()", MethodUtils.invokeExactMethod(testBean, "foo",
-                (Object[]) ArrayUtils.EMPTY_CLASS_ARRAY));
-        assertEquals("foo()", MethodUtils.invokeExactMethod(testBean, "foo"));
-        assertEquals("foo()", MethodUtils.invokeExactMethod(testBean, "foo",
-                (Object[]) null));
-        assertEquals("foo()", MethodUtils.invokeExactMethod(testBean, "foo", 
-                (Object[]) null, (Class<?>[]) null));
-        assertEquals("foo(String)", MethodUtils.invokeExactMethod(testBean,
-                "foo", ""));
-        assertEquals("foo(Object)", MethodUtils.invokeExactMethod(testBean,
-                "foo", new Object()));
-        assertEquals("foo(Integer)", MethodUtils.invokeExactMethod(testBean,
-                "foo", NumberUtils.INTEGER_ONE));
-        assertEquals("foo(double)", MethodUtils.invokeExactMethod(testBean,
-                "foo", new Object[] { NumberUtils.DOUBLE_ONE },
-                new Class[] { Double.TYPE }));
-
-        try {
-            MethodUtils
-                    .invokeExactMethod(testBean, "foo", NumberUtils.BYTE_ONE);
-            fail("should throw NoSuchMethodException");
-        } catch (final NoSuchMethodException e) {
-        }
-        try {
-            MethodUtils
-                    .invokeExactMethod(testBean, "foo", NumberUtils.LONG_ONE);
-            fail("should throw NoSuchMethodException");
-        } catch (final NoSuchMethodException e) {
-        }
-        try {
-            MethodUtils.invokeExactMethod(testBean, "foo", Boolean.TRUE);
-            fail("should throw NoSuchMethodException");
-        } catch (final NoSuchMethodException e) {
-        }
-    }
-
-    @Test
-    public void testInvokeStaticMethod() throws Exception {
-        assertEquals("bar()", MethodUtils.invokeStaticMethod(TestBean.class,
-                "bar", (Object[]) ArrayUtils.EMPTY_CLASS_ARRAY));
-        assertEquals("bar()", MethodUtils.invokeStaticMethod(TestBean.class,
-                "bar", (Object[]) null));
-        assertEquals("bar()", MethodUtils.invokeStaticMethod(TestBean.class,
-                "bar", (Object[]) null, (Class<?>[]) null));
-        assertEquals("bar(String)", MethodUtils.invokeStaticMethod(
-                TestBean.class, "bar", ""));
-        assertEquals("bar(Object)", MethodUtils.invokeStaticMethod(
-                TestBean.class, "bar", new Object()));
-        assertEquals("bar(Object)", MethodUtils.invokeStaticMethod(
-                TestBean.class, "bar", Boolean.TRUE));
-        assertEquals("bar(Integer)", MethodUtils.invokeStaticMethod(
-                TestBean.class, "bar", NumberUtils.INTEGER_ONE));
-        assertEquals("bar(int)", MethodUtils.invokeStaticMethod(TestBean.class,
-                "bar", NumberUtils.BYTE_ONE));
-        assertEquals("bar(double)", MethodUtils.invokeStaticMethod(
-                TestBean.class, "bar", NumberUtils.LONG_ONE));
-        assertEquals("bar(double)", MethodUtils.invokeStaticMethod(
-                TestBean.class, "bar", NumberUtils.DOUBLE_ONE));
-        
-        try {
-            MethodUtils.invokeStaticMethod(TestBean.class, "does_not_exist");
-            fail("should throw NoSuchMethodException");
-        } catch (final NoSuchMethodException e) {
-        }
-    }
-
-    @Test
-    public void testInvokeExactStaticMethod() throws Exception {
-        assertEquals("bar()", MethodUtils.invokeExactStaticMethod(TestBean.class,
-                "bar", (Object[]) ArrayUtils.EMPTY_CLASS_ARRAY));
-        assertEquals("bar()", MethodUtils.invokeExactStaticMethod(TestBean.class,
-                "bar", (Object[]) null));
-        assertEquals("bar()", MethodUtils.invokeExactStaticMethod(TestBean.class,
-                "bar", (Object[]) null, (Class<?>[]) null));
-        assertEquals("bar(String)", MethodUtils.invokeExactStaticMethod(
-                TestBean.class, "bar", ""));
-        assertEquals("bar(Object)", MethodUtils.invokeExactStaticMethod(
-                TestBean.class, "bar", new Object()));
-        assertEquals("bar(Integer)", MethodUtils.invokeExactStaticMethod(
-                TestBean.class, "bar", NumberUtils.INTEGER_ONE));
-        assertEquals("bar(double)", MethodUtils.invokeExactStaticMethod(
-                TestBean.class, "bar", new Object[] { NumberUtils.DOUBLE_ONE },
-                new Class[] { Double.TYPE }));
-
-        try {
-            MethodUtils.invokeExactStaticMethod(TestBean.class, "bar",
-                    NumberUtils.BYTE_ONE);
-            fail("should throw NoSuchMethodException");
-        } catch (final NoSuchMethodException e) {
-        }
-        try {
-            MethodUtils.invokeExactStaticMethod(TestBean.class, "bar",
-                    NumberUtils.LONG_ONE);
-            fail("should throw NoSuchMethodException");
-        } catch (final NoSuchMethodException e) {
-        }
-        try {
-            MethodUtils.invokeExactStaticMethod(TestBean.class, "bar",
-                    Boolean.TRUE);
-            fail("should throw NoSuchMethodException");
-        } catch (final NoSuchMethodException e) {
-        }
-    }
-
-    @Test
-    public void testGetAccessibleInterfaceMethod() throws Exception {
-        final Class<?>[][] p = { ArrayUtils.EMPTY_CLASS_ARRAY, null };
-        for (final Class<?>[] element : p) {
-            final Method method = TestMutable.class.getMethod("getValue", element);
-            final Method accessibleMethod = MethodUtils.getAccessibleMethod(method);
-            assertNotSame(accessibleMethod, method);
-            assertSame(Mutable.class, accessibleMethod.getDeclaringClass());
-        }
-    }
-    
-    @Test
-    public void testGetAccessibleMethodPrivateInterface() throws Exception {
-        final Method expected = TestBeanWithInterfaces.class.getMethod("foo");
-        assertNotNull(expected);
-        final Method actual = MethodUtils.getAccessibleMethod(TestBeanWithInterfaces.class, "foo");
-        assertNull(actual);
-    }
-
-    @Test
-    public void testGetAccessibleInterfaceMethodFromDescription()
-            throws Exception {
-        final Class<?>[][] p = { ArrayUtils.EMPTY_CLASS_ARRAY, null };
-        for (final Class<?>[] element : p) {
-            final Method accessibleMethod = MethodUtils.getAccessibleMethod(
-                    TestMutable.class, "getValue", element);
-            assertSame(Mutable.class, accessibleMethod.getDeclaringClass());
-        }
-    }
-
-    @Test
-    public void testGetAccessiblePublicMethod() throws Exception {
-        assertSame(MutableObject.class, MethodUtils.getAccessibleMethod(
-                MutableObject.class.getMethod("getValue",
-                        ArrayUtils.EMPTY_CLASS_ARRAY)).getDeclaringClass());
-    }
-
-    @Test
-    public void testGetAccessiblePublicMethodFromDescription() throws Exception {
-        assertSame(MutableObject.class, MethodUtils.getAccessibleMethod(
-                MutableObject.class, "getValue", ArrayUtils.EMPTY_CLASS_ARRAY)
-                .getDeclaringClass());
-    }
-    
-    @Test
-   public void testGetAccessibleMethodInaccessible() throws Exception {
-        final Method expected = TestBean.class.getDeclaredMethod("privateStuff");
-        final Method actual = MethodUtils.getAccessibleMethod(expected);
-        assertNull(actual);
-    }
-
-    @Test
-   public void testGetMatchingAccessibleMethod() throws Exception {
-        expectMatchingAccessibleMethodParameterTypes(TestBean.class, "foo",
-                ArrayUtils.EMPTY_CLASS_ARRAY, ArrayUtils.EMPTY_CLASS_ARRAY);
-        expectMatchingAccessibleMethodParameterTypes(TestBean.class, "foo",
-                null, ArrayUtils.EMPTY_CLASS_ARRAY);
-        expectMatchingAccessibleMethodParameterTypes(TestBean.class, "foo",
-                singletonArray(String.class), singletonArray(String.class));
-        expectMatchingAccessibleMethodParameterTypes(TestBean.class, "foo",
-                singletonArray(Object.class), singletonArray(Object.class));
-        expectMatchingAccessibleMethodParameterTypes(TestBean.class, "foo",
-                singletonArray(Boolean.class), singletonArray(Object.class));
-        expectMatchingAccessibleMethodParameterTypes(TestBean.class, "foo",
-                singletonArray(Byte.class), singletonArray(Integer.TYPE));
-        expectMatchingAccessibleMethodParameterTypes(TestBean.class, "foo",
-                singletonArray(Byte.TYPE), singletonArray(Integer.TYPE));
-        expectMatchingAccessibleMethodParameterTypes(TestBean.class, "foo",
-                singletonArray(Short.class), singletonArray(Integer.TYPE));
-        expectMatchingAccessibleMethodParameterTypes(TestBean.class, "foo",
-                singletonArray(Short.TYPE), singletonArray(Integer.TYPE));
-        expectMatchingAccessibleMethodParameterTypes(TestBean.class, "foo",
-                singletonArray(Character.class), singletonArray(Integer.TYPE));
-        expectMatchingAccessibleMethodParameterTypes(TestBean.class, "foo",
-                singletonArray(Character.TYPE), singletonArray(Integer.TYPE));
-        expectMatchingAccessibleMethodParameterTypes(TestBean.class, "foo",
-                singletonArray(Integer.class), singletonArray(Integer.class));
-        expectMatchingAccessibleMethodParameterTypes(TestBean.class, "foo",
-                singletonArray(Integer.TYPE), singletonArray(Integer.TYPE));
-        expectMatchingAccessibleMethodParameterTypes(TestBean.class, "foo",
-                singletonArray(Long.class), singletonArray(Double.TYPE));
-        expectMatchingAccessibleMethodParameterTypes(TestBean.class, "foo",
-                singletonArray(Long.TYPE), singletonArray(Double.TYPE));
-        expectMatchingAccessibleMethodParameterTypes(TestBean.class, "foo",
-                singletonArray(Float.class), singletonArray(Double.TYPE));
-        expectMatchingAccessibleMethodParameterTypes(TestBean.class, "foo",
-                singletonArray(Float.TYPE), singletonArray(Double.TYPE));
-        expectMatchingAccessibleMethodParameterTypes(TestBean.class, "foo",
-                singletonArray(Double.class), singletonArray(Double.TYPE));
-        expectMatchingAccessibleMethodParameterTypes(TestBean.class, "foo",
-                singletonArray(Double.TYPE), singletonArray(Double.TYPE));
-        expectMatchingAccessibleMethodParameterTypes(TestBean.class, "foo",
-                singletonArray(Double.TYPE), singletonArray(Double.TYPE));
-        expectMatchingAccessibleMethodParameterTypes(InheritanceBean.class, "testOne",
-                singletonArray(ParentObject.class), singletonArray(ParentObject.class));
-        expectMatchingAccessibleMethodParameterTypes(InheritanceBean.class, "testOne",
-                singletonArray(ChildObject.class), singletonArray(ParentObject.class));
-        expectMatchingAccessibleMethodParameterTypes(InheritanceBean.class, "testTwo",
-                singletonArray(ParentObject.class), singletonArray(GrandParentObject.class));
-        expectMatchingAccessibleMethodParameterTypes(InheritanceBean.class, "testTwo",
-                singletonArray(ChildObject.class), singletonArray(ChildInterface.class));
-    }
-
-    @Test
-    public void testNullArgument() {
-        expectMatchingAccessibleMethodParameterTypes(TestBean.class, "oneParameter",
-                singletonArray(null), singletonArray(String.class));
-    }
-
-    @Test
-    public void testGetOverrideHierarchyIncludingInterfaces() {
-        final Method method = MethodUtils.getAccessibleMethod(StringParameterizedChild.class, "consume", String.class);
-        final Iterator<MethodDescriptor> expected =
-            Arrays.asList(new MethodDescriptor(StringParameterizedChild.class, "consume", String.class),
-                new MethodDescriptor(GenericParent.class, "consume", GenericParent.class.getTypeParameters()[0]),
-                new MethodDescriptor(GenericConsumer.class, "consume", GenericConsumer.class.getTypeParameters()[0]))
-                .iterator();
-        for (final Method m : MethodUtils.getOverrideHierarchy(method, Interfaces.INCLUDE)) {
-            assertTrue(expected.hasNext());
-            final MethodDescriptor md = expected.next();
-            assertEquals(md.declaringClass, m.getDeclaringClass());
-            assertEquals(md.name, m.getName());
-            assertEquals(md.parameterTypes.length, m.getParameterTypes().length);
-            for (int i = 0; i < md.parameterTypes.length; i++) {
-                assertTrue(TypeUtils.equals(md.parameterTypes[i], m.getGenericParameterTypes()[i]));
-            }
-        }
-        assertFalse(expected.hasNext());
-    }
-
-    @Test
-    public void testGetOverrideHierarchyExcludingInterfaces() {
-        final Method method = MethodUtils.getAccessibleMethod(StringParameterizedChild.class, "consume", String.class);
-        final Iterator<MethodDescriptor> expected =
-            Arrays.asList(new MethodDescriptor(StringParameterizedChild.class, "consume", String.class),
-                new MethodDescriptor(GenericParent.class, "consume", GenericParent.class.getTypeParameters()[0]))
-                .iterator();
-        for (final Method m : MethodUtils.getOverrideHierarchy(method, Interfaces.EXCLUDE)) {
-            assertTrue(expected.hasNext());
-            final MethodDescriptor md = expected.next();
-            assertEquals(md.declaringClass, m.getDeclaringClass());
-            assertEquals(md.name, m.getName());
-            assertEquals(md.parameterTypes.length, m.getParameterTypes().length);
-            for (int i = 0; i < md.parameterTypes.length; i++) {
-                assertTrue(TypeUtils.equals(md.parameterTypes[i], m.getGenericParameterTypes()[i]));
-            }
-        }
-        assertFalse(expected.hasNext());
-    }
-
-    @Test
-    @Annotated
-    public void testGetMethodsWithAnnotation() throws NoSuchMethodException {
-        assertArrayEquals(new Method[0], MethodUtils.getMethodsWithAnnotation(Object.class, Annotated.class));
-
-        Method[] methodsWithAnnotation = MethodUtils.getMethodsWithAnnotation(MethodUtilsTest.class, Annotated.class);
-        assertEquals(2, methodsWithAnnotation.length);
-        assertThat(methodsWithAnnotation, hasItemInArray(MethodUtilsTest.class.getMethod("testGetMethodsWithAnnotation")));
-        assertThat(methodsWithAnnotation, hasItemInArray(MethodUtilsTest.class.getMethod("testGetMethodsListWithAnnotation")));
-    }
-
-    @Test(expected = IllegalArgumentException.class)
-    public void testGetMethodsWithAnnotationIllegalArgumentException1() {
-        MethodUtils.getMethodsWithAnnotation(FieldUtilsTest.class, null);
-    }
-
-    @Test(expected = IllegalArgumentException.class)
-    public void testGetMethodsWithAnnotationIllegalArgumentException2() {
-        MethodUtils.getMethodsWithAnnotation(null, Annotated.class);
-    }
-
-    @Test(expected = IllegalArgumentException.class)
-    public void testGetMethodsWithAnnotationIllegalArgumentException3() {
-        MethodUtils.getMethodsWithAnnotation(null, null);
-    }
-
-    @Test
-    @Annotated
-    public void testGetMethodsListWithAnnotation() throws NoSuchMethodException {
-        assertEquals(0, MethodUtils.getMethodsListWithAnnotation(Object.class, Annotated.class).size());
-
-        final List<Method> methodWithAnnotation = MethodUtils.getMethodsListWithAnnotation(MethodUtilsTest.class, Annotated.class);
-        assertEquals(2, methodWithAnnotation.size());
-        assertThat(methodWithAnnotation, hasItems(
-                MethodUtilsTest.class.getMethod("testGetMethodsWithAnnotation"),
-                MethodUtilsTest.class.getMethod("testGetMethodsListWithAnnotation")
-        ));
-    }
-
-    @Test(expected = IllegalArgumentException.class)
-    public void testGetMethodsListWithAnnotationIllegalArgumentException1() {
-        MethodUtils.getMethodsListWithAnnotation(FieldUtilsTest.class, null);
-    }
-
-    @Test(expected = IllegalArgumentException.class)
-    public void testGetMethodsListWithAnnotationIllegalArgumentException2() {
-        MethodUtils.getMethodsListWithAnnotation(null, Annotated.class);
-    }
-
-    @Test(expected = IllegalArgumentException.class)
-    public void testGetMethodsListWithAnnotationIllegalArgumentException3() {
-        MethodUtils.getMethodsListWithAnnotation(null, null);
-    }
-    
-    private void expectMatchingAccessibleMethodParameterTypes(final Class<?> cls,
-            final String methodName, final Class<?>[] requestTypes, final Class<?>[] actualTypes) {
-        final Method m = MethodUtils.getMatchingAccessibleMethod(cls, methodName,
-                requestTypes);
-        assertTrue(toString(m.getParameterTypes()) + " not equals "
-                + toString(actualTypes), Arrays.equals(actualTypes, m
-                .getParameterTypes()));
-    }
-
-    private String toString(final Class<?>[] c) {
-        return Arrays.asList(c).toString();
-    }
-
-    private Class<?>[] singletonArray(final Class<?> c) {
-        Class<?>[] result = classCache.get(c);
-        if (result == null) {
-            result = new Class[] { c };
-            classCache.put(c, result);
-        }
-        return result;
-    }
-
-    public static class InheritanceBean {
-        public void testOne(final Object obj) {}
-        public void testOne(final GrandParentObject obj) {}
-        public void testOne(final ParentObject obj) {}
-        public void testTwo(final Object obj) {}
-        public void testTwo(final GrandParentObject obj) {}
-        public void testTwo(final ChildInterface obj) {}
-    }
-    
-    interface ChildInterface {}    
-    public static class GrandParentObject {}
-    public static class ParentObject extends GrandParentObject {}
-    public static class ChildObject extends ParentObject implements ChildInterface {}
-
-    private static class MethodDescriptor {
-        final Class<?> declaringClass;
-        final String name;
-        final Type[] parameterTypes;
-
-        MethodDescriptor(final Class<?> declaringClass, final String name, final Type... parameterTypes) {
-            this.declaringClass = declaringClass;
-            this.name = name;
-            this.parameterTypes = parameterTypes;
-        }
-    }
-}
diff --git a/lang/src/test/java/org/apache/commons/lang3/reflect/TypeLiteralTest.java b/lang/src/test/java/org/apache/commons/lang3/reflect/TypeLiteralTest.java
deleted file mode 100644
index 287fb49..0000000
--- a/lang/src/test/java/org/apache/commons/lang3/reflect/TypeLiteralTest.java
+++ /dev/null
@@ -1,56 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.commons.lang3.reflect;
-
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertNotEquals;
-import static org.junit.Assert.assertTrue;
-
-import java.util.List;
-
-import org.junit.Test;
-
-public class TypeLiteralTest {
-
-    @Test
-    public void testBasic() {
-        assertTrue(TypeUtils.equals(String.class, new TypeLiteral<String>() {}.value));
-        assertTrue(TypeUtils.equals(TypeUtils.parameterize(List.class, String.class),
-            new TypeLiteral<List<String>>() {}.value));
-    }
-
-    @Test
-    public void testTyped() {
-        final Typed<String> stringType = new TypeLiteral<String>() {};
-        assertTrue(TypeUtils.equals(String.class, stringType.getType()));
-        final Typed<List<String>> listOfStringType = new TypeLiteral<List<String>>() {};
-        assertTrue(TypeUtils.equals(TypeUtils.parameterize(List.class, String.class), listOfStringType.getType()));
-    }
-
-    @Test
-    public void testEquals() {
-        assertEquals(new TypeLiteral<String>() {}, new TypeLiteral<String>() {});
-        assertEquals(new TypeLiteral<List<String>>() {}, new TypeLiteral<List<String>>() {});
-        assertNotEquals(new TypeLiteral<String>() {}, new TypeLiteral<List<String>>() {});
-    }
-
-    @SuppressWarnings("rawtypes")
-    @Test(expected = NullPointerException.class)
-    public void testRaw() {
-        new TypeLiteral() {};
-    }
-}
diff --git a/lang/src/test/java/org/apache/commons/lang3/reflect/TypeUtilsTest.java b/lang/src/test/java/org/apache/commons/lang3/reflect/TypeUtilsTest.java
deleted file mode 100644
index 60c8b48..0000000
--- a/lang/src/test/java/org/apache/commons/lang3/reflect/TypeUtilsTest.java
+++ /dev/null
@@ -1,814 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.commons.lang3.reflect;
-
-import java.io.Serializable;
-import java.lang.reflect.Field;
-import java.lang.reflect.GenericArrayType;
-import java.lang.reflect.Method;
-import java.lang.reflect.ParameterizedType;
-import java.lang.reflect.Type;
-import java.lang.reflect.TypeVariable;
-import java.lang.reflect.WildcardType;
-import java.net.URI;
-import java.util.Arrays;
-import java.util.Collection;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-import java.util.TreeSet;
-
-import org.apache.commons.lang3.StringEscapeUtils;
-import org.apache.commons.lang3.reflect.testbed.Foo;
-import org.apache.commons.lang3.reflect.testbed.GenericParent;
-import org.apache.commons.lang3.reflect.testbed.GenericTypeHolder;
-import org.apache.commons.lang3.reflect.testbed.StringParameterizedChild;
-import org.junit.Assert;
-import org.junit.Test;
-
-/**
- * Test TypeUtils
- * @version $Id$
- */
-@SuppressWarnings({ "unchecked", "unused" , "rawtypes" })
-//raw types, where used, are used purposely
-public class TypeUtilsTest<B> {
-
-    public interface This<K, V> {
-    }
-
-    public class That<K, V> implements This<K, V> {
-    }
-
-    public interface And<K, V> extends This<Number, Number> {
-    }
-
-    public class The<K, V> extends That<Number, Number> implements And<String, String> {
-    }
-
-    public class Other<T> implements This<String, T> {
-    }
-
-    public class Thing<Q> extends Other<B> {
-    }
-
-    public class Tester implements This<String, B> {
-    }
-
-    public This<String, String> dis;
-
-    public That<String, String> dat;
-
-    public The<String, String> da;
-
-    public Other<String> uhder;
-
-    public Thing ding;
-
-    public TypeUtilsTest<String>.Tester tester;
-
-    public Tester tester2;
-
-    public TypeUtilsTest<String>.That<String, String> dat2;
-
-    public TypeUtilsTest<Number>.That<String, String> dat3;
-
-    public Comparable<? extends Integer>[] intWildcardComparable;
-
-    public static Comparable<String> stringComparable;
-
-    public static Comparable<URI> uriComparable;
-
-    public static Comparable<Integer> intComparable;
-
-    public static Comparable<Long> longComparable;
-
-    public static URI uri;
-
-    public void dummyMethod(final List list0, final List<Object> list1, final List<?> list2,
-            final List<? super Object> list3, final List<String> list4, final List<? extends String> list5,
-            final List<? super String> list6, final List[] list7, final List<Object>[] list8, final List<?>[] list9,
-            final List<? super Object>[] list10, final List<String>[] list11, final List<? extends String>[] list12,
-            final List<? super String>[] list13) {
-    }
-
-    @SuppressWarnings("boxing") // deliberately used here
-    @Test
-    public void testIsAssignable() throws SecurityException, NoSuchMethodException,
-            NoSuchFieldException {
-        List list0 = null;
-        List<Object> list1 = null;
-        List<?> list2 = null;
-        List<? super Object> list3 = null;
-        List<String> list4 = null;
-        List<? extends String> list5 = null;
-        List<? super String> list6 = null;
-        List[] list7 = null;
-        List<Object>[] list8 = null;
-        List<?>[] list9 = null;
-        List<? super Object>[] list10 = null;
-        List<String>[] list11 = null;
-        List<? extends String>[] list12 = null;
-        List<? super String>[] list13;
-        final Class<?> clazz = getClass();
-        final Method method = clazz.getMethod("dummyMethod", List.class, List.class, List.class,
-                List.class, List.class, List.class, List.class, List[].class, List[].class,
-                List[].class, List[].class, List[].class, List[].class, List[].class);
-        final Type[] types = method.getGenericParameterTypes();
-//        list0 = list0;
-        delegateBooleanAssertion(types, 0, 0, true);
-        list1 = list0;
-        delegateBooleanAssertion(types, 0, 1, true);
-        list0 = list1;
-        delegateBooleanAssertion(types, 1, 0, true);
-        list2 = list0;
-        delegateBooleanAssertion(types, 0, 2, true);
-        list0 = list2;
-        delegateBooleanAssertion(types, 2, 0, true);
-        list3 = list0;
-        delegateBooleanAssertion(types, 0, 3, true);
-        list0 = list3;
-        delegateBooleanAssertion(types, 3, 0, true);
-        list4 = list0;
-        delegateBooleanAssertion(types, 0, 4, true);
-        list0 = list4;
-        delegateBooleanAssertion(types, 4, 0, true);
-        list5 = list0;
-        delegateBooleanAssertion(types, 0, 5, true);
-        list0 = list5;
-        delegateBooleanAssertion(types, 5, 0, true);
-        list6 = list0;
-        delegateBooleanAssertion(types, 0, 6, true);
-        list0 = list6;
-        delegateBooleanAssertion(types, 6, 0, true);
-//        list1 = list1;
-        delegateBooleanAssertion(types, 1, 1, true);
-        list2 = list1;
-        delegateBooleanAssertion(types, 1, 2, true);
-        list1 = (List<Object>) list2;
-        delegateBooleanAssertion(types, 2, 1, false);
-        list3 = list1;
-        delegateBooleanAssertion(types, 1, 3, true);
-        list1 = (List<Object>) list3;
-        delegateBooleanAssertion(types, 3, 1, false);
-        // list4 = list1;
-        delegateBooleanAssertion(types, 1, 4, false);
-        // list1 = list4;
-        delegateBooleanAssertion(types, 4, 1, false);
-        // list5 = list1;
-        delegateBooleanAssertion(types, 1, 5, false);
-        // list1 = list5;
-        delegateBooleanAssertion(types, 5, 1, false);
-        list6 = list1;
-        delegateBooleanAssertion(types, 1, 6, true);
-        list1 = (List<Object>) list6;
-        delegateBooleanAssertion(types, 6, 1, false);
-//        list2 = list2;
-        delegateBooleanAssertion(types, 2, 2, true);
-        list2 = list3;
-        delegateBooleanAssertion(types, 2, 3, false);
-        list2 = list4;
-        delegateBooleanAssertion(types, 3, 2, true);
-        list3 = (List<? super Object>) list2;
-        delegateBooleanAssertion(types, 2, 4, false);
-        list2 = list5;
-        delegateBooleanAssertion(types, 4, 2, true);
-        list4 = (List<String>) list2;
-        delegateBooleanAssertion(types, 2, 5, false);
-        list2 = list6;
-        delegateBooleanAssertion(types, 5, 2, true);
-        list5 = (List<? extends String>) list2;
-        delegateBooleanAssertion(types, 2, 6, false);
-//        list3 = list3;
-        delegateBooleanAssertion(types, 6, 2, true);
-        list6 = (List<? super String>) list2;
-        delegateBooleanAssertion(types, 3, 3, true);
-        // list4 = list3;
-        delegateBooleanAssertion(types, 3, 4, false);
-        // list3 = list4;
-        delegateBooleanAssertion(types, 4, 3, false);
-        // list5 = list3;
-        delegateBooleanAssertion(types, 3, 5, false);
-        // list3 = list5;
-        delegateBooleanAssertion(types, 5, 3, false);
-        list6 = list3;
-        delegateBooleanAssertion(types, 3, 6, true);
-        list3 = (List<? super Object>) list6;
-        delegateBooleanAssertion(types, 6, 3, false);
-//        list4 = list4;
-        delegateBooleanAssertion(types, 4, 4, true);
-        list5 = list4;
-        delegateBooleanAssertion(types, 4, 5, true);
-        list4 = (List<String>) list5;
-        delegateBooleanAssertion(types, 5, 4, false);
-        list6 = list4;
-        delegateBooleanAssertion(types, 4, 6, true);
-        list4 = (List<String>) list6;
-        delegateBooleanAssertion(types, 6, 4, false);
-//        list5 = list5;
-        delegateBooleanAssertion(types, 5, 5, true);
-        list6 = (List<? super String>) list5;
-        delegateBooleanAssertion(types, 5, 6, false);
-        list5 = (List<? extends String>) list6;
-        delegateBooleanAssertion(types, 6, 5, false);
-//        list6 = list6;
-        delegateBooleanAssertion(types, 6, 6, true);
-
-//        list7 = list7;
-        delegateBooleanAssertion(types, 7, 7, true);
-        list8 = list7;
-        delegateBooleanAssertion(types, 7, 8, true);
-        list7 = list8;
-        delegateBooleanAssertion(types, 8, 7, true);
-        list9 = list7;
-        delegateBooleanAssertion(types, 7, 9, true);
-        list7 = list9;
-        delegateBooleanAssertion(types, 9, 7, true);
-        list10 = list7;
-        delegateBooleanAssertion(types, 7, 10, true);
-        list7 = list10;
-        delegateBooleanAssertion(types, 10, 7, true);
-        list11 = list7;
-        delegateBooleanAssertion(types, 7, 11, true);
-        list7 = list11;
-        delegateBooleanAssertion(types, 11, 7, true);
-        list12 = list7;
-        delegateBooleanAssertion(types, 7, 12, true);
-        list7 = list12;
-        delegateBooleanAssertion(types, 12, 7, true);
-        list13 = list7;
-        delegateBooleanAssertion(types, 7, 13, true);
-        list7 = list13;
-        delegateBooleanAssertion(types, 13, 7, true);
-//        list8 = list8;
-        delegateBooleanAssertion(types, 8, 8, true);
-        list9 = list8;
-        delegateBooleanAssertion(types, 8, 9, true);
-        list8 = (List<Object>[]) list9;
-        delegateBooleanAssertion(types, 9, 8, false);
-        list10 = list8;
-        delegateBooleanAssertion(types, 8, 10, true);
-        list8 = (List<Object>[]) list10; // NOTE cast is required by Sun Java, but not by Eclipse
-        delegateBooleanAssertion(types, 10, 8, false);
-        // list11 = list8;
-        delegateBooleanAssertion(types, 8, 11, false);
-        // list8 = list11;
-        delegateBooleanAssertion(types, 11, 8, false);
-        // list12 = list8;
-        delegateBooleanAssertion(types, 8, 12, false);
-        // list8 = list12;
-        delegateBooleanAssertion(types, 12, 8, false);
-        list13 = list8;
-        delegateBooleanAssertion(types, 8, 13, true);
-        list8 = (List<Object>[]) list13;
-        delegateBooleanAssertion(types, 13, 8, false);
-//        list9 = list9;
-        delegateBooleanAssertion(types, 9, 9, true);
-        list10 = (List<? super Object>[]) list9;
-        delegateBooleanAssertion(types, 9, 10, false);
-        list9 = list10;
-        delegateBooleanAssertion(types, 10, 9, true);
-        list11 = (List<String>[]) list9;
-        delegateBooleanAssertion(types, 9, 11, false);
-        list9 = list11;
-        delegateBooleanAssertion(types, 11, 9, true);
-        list12 = (List<? extends String>[]) list9;
-        delegateBooleanAssertion(types, 9, 12, false);
-        list9 = list12;
-        delegateBooleanAssertion(types, 12, 9, true);
-        list13 = (List<? super String>[]) list9;
-        delegateBooleanAssertion(types, 9, 13, false);
-        list9 = list13;
-        delegateBooleanAssertion(types, 13, 9, true);
-//        list10 = list10;
-        delegateBooleanAssertion(types, 10, 10, true);
-        // list11 = list10;
-        delegateBooleanAssertion(types, 10, 11, false);
-        // list10 = list11;
-        delegateBooleanAssertion(types, 11, 10, false);
-        // list12 = list10;
-        delegateBooleanAssertion(types, 10, 12, false);
-        // list10 = list12;
-        delegateBooleanAssertion(types, 12, 10, false);
-        list13 = list10;
-        delegateBooleanAssertion(types, 10, 13, true);
-        list10 = (List<? super Object>[]) list13;
-        delegateBooleanAssertion(types, 13, 10, false);
-//        list11 = list11;
-        delegateBooleanAssertion(types, 11, 11, true);
-        list12 = list11;
-        delegateBooleanAssertion(types, 11, 12, true);
-        list11 = (List<String>[]) list12;
-        delegateBooleanAssertion(types, 12, 11, false);
-        list13 = list11;
-        delegateBooleanAssertion(types, 11, 13, true);
-        list11 = (List<String>[]) list13;
-        delegateBooleanAssertion(types, 13, 11, false);
-//        list12 = list12;
-        delegateBooleanAssertion(types, 12, 12, true);
-        list13 = (List<? super String>[]) list12;
-        delegateBooleanAssertion(types, 12, 13, false);
-        list12 = (List<? extends String>[]) list13;
-        delegateBooleanAssertion(types, 13, 12, false);
-//        list13 = list13;
-        delegateBooleanAssertion(types, 13, 13, true);
-        final Type disType = getClass().getField("dis").getGenericType();
-        // Reporter.log( ( ( ParameterizedType ) disType
-        // ).getOwnerType().getClass().toString() );
-        final Type datType = getClass().getField("dat").getGenericType();
-        final Type daType = getClass().getField("da").getGenericType();
-        final Type uhderType = getClass().getField("uhder").getGenericType();
-        final Type dingType = getClass().getField("ding").getGenericType();
-        final Type testerType = getClass().getField("tester").getGenericType();
-        final Type tester2Type = getClass().getField("tester2").getGenericType();
-        final Type dat2Type = getClass().getField("dat2").getGenericType();
-        final Type dat3Type = getClass().getField("dat3").getGenericType();
-        dis = dat;
-        Assert.assertTrue(TypeUtils.isAssignable(datType, disType));
-        // dis = da;
-        Assert.assertFalse(TypeUtils.isAssignable(daType, disType));
-        dis = uhder;
-        Assert.assertTrue(TypeUtils.isAssignable(uhderType, disType));
-        dis = ding;
-        Assert.assertFalse(String.format("type %s not assignable to %s!", dingType, disType),
-                TypeUtils.isAssignable(dingType, disType));
-        dis = tester;
-        Assert.assertTrue(TypeUtils.isAssignable(testerType, disType));
-        // dis = tester2;
-        Assert.assertFalse(TypeUtils.isAssignable(tester2Type, disType));
-        // dat = dat2;
-        Assert.assertFalse(TypeUtils.isAssignable(dat2Type, datType));
-        // dat2 = dat;
-        Assert.assertFalse(TypeUtils.isAssignable(datType, dat2Type));
-        // dat = dat3;
-        Assert.assertFalse(TypeUtils.isAssignable(dat3Type, datType));
-        final char ch = 0;
-        final boolean bo = false;
-        final byte by = 0;
-        final short sh = 0;
-        int in = 0;
-        long lo = 0;
-        final float fl = 0;
-        double du = 0;
-        du = ch;
-        Assert.assertTrue(TypeUtils.isAssignable(char.class, double.class));
-        du = by;
-        Assert.assertTrue(TypeUtils.isAssignable(byte.class, double.class));
-        du = sh;
-        Assert.assertTrue(TypeUtils.isAssignable(short.class, double.class));
-        du = in;
-        Assert.assertTrue(TypeUtils.isAssignable(int.class, double.class));
-        du = lo;
-        Assert.assertTrue(TypeUtils.isAssignable(long.class, double.class));
-        du = fl;
-        Assert.assertTrue(TypeUtils.isAssignable(float.class, double.class));
-        lo = in;
-        Assert.assertTrue(TypeUtils.isAssignable(int.class, long.class));
-        lo = Integer.valueOf(0);
-        Assert.assertTrue(TypeUtils.isAssignable(Integer.class, long.class));
-        // Long lngW = 1;
-        Assert.assertFalse(TypeUtils.isAssignable(int.class, Long.class));
-        // lngW = Integer.valueOf( 0 );
-        Assert.assertFalse(TypeUtils.isAssignable(Integer.class, Long.class));
-        in = Integer.valueOf(0);
-        Assert.assertTrue(TypeUtils.isAssignable(Integer.class, int.class));
-        final Integer inte = in;
-        Assert.assertTrue(TypeUtils.isAssignable(int.class, Integer.class));
-        Assert.assertTrue(TypeUtils.isAssignable(int.class, Number.class));
-        Assert.assertTrue(TypeUtils.isAssignable(int.class, Object.class));
-        final Type intComparableType = getClass().getField("intComparable").getGenericType();
-        intComparable = 1;
-        Assert.assertTrue(TypeUtils.isAssignable(int.class, intComparableType));
-        Assert.assertTrue(TypeUtils.isAssignable(int.class, Comparable.class));
-        final Serializable ser = 1;
-        Assert.assertTrue(TypeUtils.isAssignable(int.class, Serializable.class));
-        final Type longComparableType = getClass().getField("longComparable").getGenericType();
-        // longComparable = 1;
-        Assert.assertFalse(TypeUtils.isAssignable(int.class, longComparableType));
-        // longComparable = Integer.valueOf( 0 );
-        Assert.assertFalse(TypeUtils.isAssignable(Integer.class, longComparableType));
-        // int[] ia;
-        // long[] la = ia;
-        Assert.assertFalse(TypeUtils.isAssignable(int[].class, long[].class));
-        final Integer[] ia = null;
-        final Type caType = getClass().getField("intWildcardComparable").getGenericType();
-        intWildcardComparable = ia;
-        Assert.assertTrue(TypeUtils.isAssignable(Integer[].class, caType));
-        // int[] ina = ia;
-        Assert.assertFalse(TypeUtils.isAssignable(Integer[].class, int[].class));
-        final int[] ina = null;
-        Object[] oa;
-        // oa = ina;
-        Assert.assertFalse(TypeUtils.isAssignable(int[].class, Object[].class));
-        oa = new Integer[0];
-        Assert.assertTrue(TypeUtils.isAssignable(Integer[].class, Object[].class));
-        final Type bClassType = AClass.class.getField("bClass").getGenericType();
-        final Type cClassType = AClass.class.getField("cClass").getGenericType();
-        final Type dClassType = AClass.class.getField("dClass").getGenericType();
-        final Type eClassType = AClass.class.getField("eClass").getGenericType();
-        final Type fClassType = AClass.class.getField("fClass").getGenericType();
-        final AClass aClass = new AClass(new AAClass<String>());
-        aClass.bClass = aClass.cClass;
-        Assert.assertTrue(TypeUtils.isAssignable(cClassType, bClassType));
-        aClass.bClass = aClass.dClass;
-        Assert.assertTrue(TypeUtils.isAssignable(dClassType, bClassType));
-        aClass.bClass = aClass.eClass;
-        Assert.assertTrue(TypeUtils.isAssignable(eClassType, bClassType));
-        aClass.bClass = aClass.fClass;
-        Assert.assertTrue(TypeUtils.isAssignable(fClassType, bClassType));
-        aClass.cClass = aClass.dClass;
-        Assert.assertTrue(TypeUtils.isAssignable(dClassType, cClassType));
-        aClass.cClass = aClass.eClass;
-        Assert.assertTrue(TypeUtils.isAssignable(eClassType, cClassType));
-        aClass.cClass = aClass.fClass;
-        Assert.assertTrue(TypeUtils.isAssignable(fClassType, cClassType));
-        aClass.dClass = aClass.eClass;
-        Assert.assertTrue(TypeUtils.isAssignable(eClassType, dClassType));
-        aClass.dClass = aClass.fClass;
-        Assert.assertTrue(TypeUtils.isAssignable(fClassType, dClassType));
-        aClass.eClass = aClass.fClass;
-        Assert.assertTrue(TypeUtils.isAssignable(fClassType, eClassType));
-    }
-
-    public void delegateBooleanAssertion(final Type[] types, final int i2, final int i1, final boolean expected) {
-        final Type type1 = types[i1];
-        final Type type2 = types[i2];
-        final boolean isAssignable = TypeUtils.isAssignable(type2, type1);
-
-        if (expected) {
-            Assert.assertTrue("[" + i1 + ", " + i2 + "]: From "
-                    + StringEscapeUtils.escapeHtml4(String.valueOf(type2)) + " to "
-                    + StringEscapeUtils.escapeHtml4(String.valueOf(type1)), isAssignable);
-        } else {
-            Assert.assertFalse("[" + i1 + ", " + i2 + "]: From "
-                    + StringEscapeUtils.escapeHtml4(String.valueOf(type2)) + " to "
-                    + StringEscapeUtils.escapeHtml4(String.valueOf(type1)), isAssignable);
-        }
-    }
-
-    @SuppressWarnings("boxing") // boxing is deliberate here
-    @Test
-    public void testIsInstance() throws SecurityException, NoSuchFieldException {
-        final Type intComparableType = getClass().getField("intComparable").getGenericType();
-        final Type uriComparableType = getClass().getField("uriComparable").getGenericType();
-        intComparable = 1;
-        Assert.assertTrue(TypeUtils.isInstance(1, intComparableType));
-        // uriComparable = 1;
-        Assert.assertFalse(TypeUtils.isInstance(1, uriComparableType));
-    }
-
-    @Test
-    public void testGetTypeArguments() {
-        Map<TypeVariable<?>, Type> typeVarAssigns;
-        TypeVariable<?> treeSetTypeVar;
-        Type typeArg;
-
-        typeVarAssigns = TypeUtils.getTypeArguments(Integer.class, Comparable.class);
-        treeSetTypeVar = Comparable.class.getTypeParameters()[0];
-        Assert.assertTrue("Type var assigns for Comparable from Integer: " + typeVarAssigns,
-                typeVarAssigns.containsKey(treeSetTypeVar));
-        typeArg = typeVarAssigns.get(treeSetTypeVar);
-        Assert.assertEquals("Type argument of Comparable from Integer: " + typeArg, Integer.class,
-                typeVarAssigns.get(treeSetTypeVar));
-
-        typeVarAssigns = TypeUtils.getTypeArguments(int.class, Comparable.class);
-        treeSetTypeVar = Comparable.class.getTypeParameters()[0];
-        Assert.assertTrue("Type var assigns for Comparable from int: " + typeVarAssigns,
-                typeVarAssigns.containsKey(treeSetTypeVar));
-        typeArg = typeVarAssigns.get(treeSetTypeVar);
-        Assert.assertEquals("Type argument of Comparable from int: " + typeArg, Integer.class,
-                typeVarAssigns.get(treeSetTypeVar));
-
-        final Collection<Integer> col = Arrays.asList(new Integer[0]);
-        typeVarAssigns = TypeUtils.getTypeArguments(List.class, Collection.class);
-        treeSetTypeVar = Comparable.class.getTypeParameters()[0];
-        Assert.assertFalse("Type var assigns for Collection from List: " + typeVarAssigns,
-                typeVarAssigns.containsKey(treeSetTypeVar));
-
-        typeVarAssigns = TypeUtils.getTypeArguments(AAAClass.BBBClass.class, AAClass.BBClass.class);
-        Assert.assertTrue(typeVarAssigns.size() == 2);
-        Assert.assertEquals(String.class, typeVarAssigns.get(AAClass.class.getTypeParameters()[0]));
-        Assert.assertEquals(String.class, typeVarAssigns.get(AAClass.BBClass.class.getTypeParameters()[0]));
-
-        typeVarAssigns = TypeUtils.getTypeArguments(Other.class, This.class);
-        Assert.assertEquals(2, typeVarAssigns.size());
-        Assert.assertEquals(String.class, typeVarAssigns.get(This.class.getTypeParameters()[0]));
-        Assert.assertEquals(Other.class.getTypeParameters()[0], typeVarAssigns.get(This.class.getTypeParameters()[1]));
-
-        typeVarAssigns = TypeUtils.getTypeArguments(And.class, This.class);
-        Assert.assertEquals(2, typeVarAssigns.size());
-        Assert.assertEquals(Number.class, typeVarAssigns.get(This.class.getTypeParameters()[0]));
-        Assert.assertEquals(Number.class, typeVarAssigns.get(This.class.getTypeParameters()[1]));
-
-        typeVarAssigns = TypeUtils.getTypeArguments(Thing.class, Other.class);
-        Assert.assertEquals(2, typeVarAssigns.size());
-        Assert.assertEquals(getClass().getTypeParameters()[0], typeVarAssigns.get(getClass().getTypeParameters()[0]));
-        Assert.assertEquals(getClass().getTypeParameters()[0], typeVarAssigns.get(Other.class.getTypeParameters()[0]));
-    }
-
-    @Test
-    public void testTypesSatisfyVariables() throws SecurityException, NoSuchFieldException,
-            NoSuchMethodException {
-        final Map<TypeVariable<?>, Type> typeVarAssigns = new HashMap<TypeVariable<?>, Type>();
-        final Integer max = TypeUtilsTest.<Integer> stub();
-        typeVarAssigns.put(getClass().getMethod("stub").getTypeParameters()[0], Integer.class);
-        Assert.assertTrue(TypeUtils.typesSatisfyVariables(typeVarAssigns));
-        typeVarAssigns.clear();
-        typeVarAssigns.put(getClass().getMethod("stub2").getTypeParameters()[0], Integer.class);
-        Assert.assertTrue(TypeUtils.typesSatisfyVariables(typeVarAssigns));
-        typeVarAssigns.clear();
-        typeVarAssigns.put(getClass().getMethod("stub3").getTypeParameters()[0], Integer.class);
-        Assert.assertTrue(TypeUtils.typesSatisfyVariables(typeVarAssigns));
-    }
-
-    @Test
-    public void testDetermineTypeVariableAssignments() throws SecurityException,
-            NoSuchFieldException, NoSuchMethodException {
-        final ParameterizedType iterableType = (ParameterizedType) getClass().getField("iterable")
-                .getGenericType();
-        final Map<TypeVariable<?>, Type> typeVarAssigns = TypeUtils.determineTypeArguments(TreeSet.class,
-                iterableType);
-        final TypeVariable<?> treeSetTypeVar = TreeSet.class.getTypeParameters()[0];
-        Assert.assertTrue(typeVarAssigns.containsKey(treeSetTypeVar));
-        Assert.assertEquals(iterableType.getActualTypeArguments()[0], typeVarAssigns
-                .get(treeSetTypeVar));
-    }
-
-    @Test
-    public void testGetRawType() throws SecurityException, NoSuchFieldException {
-        final Type stringParentFieldType = GenericTypeHolder.class.getDeclaredField("stringParent")
-                .getGenericType();
-        final Type integerParentFieldType = GenericTypeHolder.class.getDeclaredField("integerParent")
-                .getGenericType();
-        final Type foosFieldType = GenericTypeHolder.class.getDeclaredField("foos").getGenericType();
-        final Type genericParentT = GenericParent.class.getTypeParameters()[0];
-        Assert.assertEquals(GenericParent.class, TypeUtils.getRawType(stringParentFieldType, null));
-        Assert
-                .assertEquals(GenericParent.class, TypeUtils.getRawType(integerParentFieldType,
-                        null));
-        Assert.assertEquals(List.class, TypeUtils.getRawType(foosFieldType, null));
-        Assert.assertEquals(String.class, TypeUtils.getRawType(genericParentT,
-                StringParameterizedChild.class));
-        Assert.assertEquals(String.class, TypeUtils.getRawType(genericParentT,
-                stringParentFieldType));
-        Assert.assertEquals(Foo.class, TypeUtils.getRawType(Iterable.class.getTypeParameters()[0],
-                foosFieldType));
-        Assert.assertEquals(Foo.class, TypeUtils.getRawType(List.class.getTypeParameters()[0],
-                foosFieldType));
-        Assert.assertNull(TypeUtils.getRawType(genericParentT, GenericParent.class));
-        Assert.assertEquals(GenericParent[].class, TypeUtils.getRawType(GenericTypeHolder.class
-                .getDeclaredField("barParents").getGenericType(), null));
-    }
-
-    @Test
-    public void testIsArrayTypeClasses() {
-        Assert.assertTrue(TypeUtils.isArrayType(boolean[].class));
-        Assert.assertTrue(TypeUtils.isArrayType(byte[].class));
-        Assert.assertTrue(TypeUtils.isArrayType(short[].class));
-        Assert.assertTrue(TypeUtils.isArrayType(int[].class));
-        Assert.assertTrue(TypeUtils.isArrayType(char[].class));
-        Assert.assertTrue(TypeUtils.isArrayType(long[].class));
-        Assert.assertTrue(TypeUtils.isArrayType(float[].class));
-        Assert.assertTrue(TypeUtils.isArrayType(double[].class));
-        Assert.assertTrue(TypeUtils.isArrayType(Object[].class));
-        Assert.assertTrue(TypeUtils.isArrayType(String[].class));
-
-        Assert.assertFalse(TypeUtils.isArrayType(boolean.class));
-        Assert.assertFalse(TypeUtils.isArrayType(byte.class));
-        Assert.assertFalse(TypeUtils.isArrayType(short.class));
-        Assert.assertFalse(TypeUtils.isArrayType(int.class));
-        Assert.assertFalse(TypeUtils.isArrayType(char.class));
-        Assert.assertFalse(TypeUtils.isArrayType(long.class));
-        Assert.assertFalse(TypeUtils.isArrayType(float.class));
-        Assert.assertFalse(TypeUtils.isArrayType(double.class));
-        Assert.assertFalse(TypeUtils.isArrayType(Object.class));
-        Assert.assertFalse(TypeUtils.isArrayType(String.class));
-    }
-
-    @Test
-    public void testIsArrayGenericTypes() throws Exception {
-        final Method method = getClass().getMethod("dummyMethod", List.class, List.class, List.class,
-                List.class, List.class, List.class, List.class, List[].class, List[].class,
-                List[].class, List[].class, List[].class, List[].class, List[].class);
-
-        final Type[] types = method.getGenericParameterTypes();
-
-        Assert.assertFalse(TypeUtils.isArrayType(types[0]));
-        Assert.assertFalse(TypeUtils.isArrayType(types[1]));
-        Assert.assertFalse(TypeUtils.isArrayType(types[2]));
-        Assert.assertFalse(TypeUtils.isArrayType(types[3]));
-        Assert.assertFalse(TypeUtils.isArrayType(types[4]));
-        Assert.assertFalse(TypeUtils.isArrayType(types[5]));
-        Assert.assertFalse(TypeUtils.isArrayType(types[6]));
-        Assert.assertTrue(TypeUtils.isArrayType(types[7]));
-        Assert.assertTrue(TypeUtils.isArrayType(types[8]));
-        Assert.assertTrue(TypeUtils.isArrayType(types[9]));
-        Assert.assertTrue(TypeUtils.isArrayType(types[10]));
-        Assert.assertTrue(TypeUtils.isArrayType(types[11]));
-        Assert.assertTrue(TypeUtils.isArrayType(types[12]));
-        Assert.assertTrue(TypeUtils.isArrayType(types[13]));
-    }
-
-    @Test
-    public void testGetPrimitiveArrayComponentType() throws Exception {
-        Assert.assertEquals(boolean.class, TypeUtils.getArrayComponentType(boolean[].class));
-        Assert.assertEquals(byte.class, TypeUtils.getArrayComponentType(byte[].class));
-        Assert.assertEquals(short.class, TypeUtils.getArrayComponentType(short[].class));
-        Assert.assertEquals(int.class, TypeUtils.getArrayComponentType(int[].class));
-        Assert.assertEquals(char.class, TypeUtils.getArrayComponentType(char[].class));
-        Assert.assertEquals(long.class, TypeUtils.getArrayComponentType(long[].class));
-        Assert.assertEquals(float.class, TypeUtils.getArrayComponentType(float[].class));
-        Assert.assertEquals(double.class, TypeUtils.getArrayComponentType(double[].class));
-
-        Assert.assertNull(TypeUtils.getArrayComponentType(boolean.class));
-        Assert.assertNull(TypeUtils.getArrayComponentType(byte.class));
-        Assert.assertNull(TypeUtils.getArrayComponentType(short.class));
-        Assert.assertNull(TypeUtils.getArrayComponentType(int.class));
-        Assert.assertNull(TypeUtils.getArrayComponentType(char.class));
-        Assert.assertNull(TypeUtils.getArrayComponentType(long.class));
-        Assert.assertNull(TypeUtils.getArrayComponentType(float.class));
-        Assert.assertNull(TypeUtils.getArrayComponentType(double.class));
-    }
-
-    @Test
-    public void testGetArrayComponentType() throws Exception {
-        final Method method = getClass().getMethod("dummyMethod", List.class, List.class, List.class,
-                List.class, List.class, List.class, List.class, List[].class, List[].class,
-                List[].class, List[].class, List[].class, List[].class, List[].class);
-
-        final Type[] types = method.getGenericParameterTypes();
-
-        Assert.assertNull(TypeUtils.getArrayComponentType(types[0]));
-        Assert.assertNull(TypeUtils.getArrayComponentType(types[1]));
-        Assert.assertNull(TypeUtils.getArrayComponentType(types[2]));
-        Assert.assertNull(TypeUtils.getArrayComponentType(types[3]));
-        Assert.assertNull(TypeUtils.getArrayComponentType(types[4]));
-        Assert.assertNull(TypeUtils.getArrayComponentType(types[5]));
-        Assert.assertNull(TypeUtils.getArrayComponentType(types[6]));
-        Assert.assertEquals(types[0], TypeUtils.getArrayComponentType(types[7]));
-        Assert.assertEquals(types[1], TypeUtils.getArrayComponentType(types[8]));
-        Assert.assertEquals(types[2], TypeUtils.getArrayComponentType(types[9]));
-        Assert.assertEquals(types[3], TypeUtils.getArrayComponentType(types[10]));
-        Assert.assertEquals(types[4], TypeUtils.getArrayComponentType(types[11]));
-        Assert.assertEquals(types[5], TypeUtils.getArrayComponentType(types[12]));
-        Assert.assertEquals(types[6], TypeUtils.getArrayComponentType(types[13]));
-    }
-
-    @Test
-    public void testLang820() throws Exception {
-        final Type[] typeArray = {String.class, String.class};
-        final Type[] expectedArray = {String.class};
-        Assert.assertArrayEquals(expectedArray, TypeUtils.normalizeUpperBounds(typeArray));
-    }
-
-    @Test
-    public void testParameterize() throws Exception {
-        final ParameterizedType stringComparableType = TypeUtils.parameterize(Comparable.class, String.class);
-        Assert.assertTrue(TypeUtils.equals(getClass().getField("stringComparable").getGenericType(),
-            stringComparableType));
-        Assert.assertEquals("java.lang.Comparable<java.lang.String>", stringComparableType.toString());
-    }
-    
-    @Test
-    public void testParameterizeWithOwner() throws Exception {
-        final Type owner = TypeUtils.parameterize(TypeUtilsTest.class, String.class);
-        final ParameterizedType dat2Type = TypeUtils.parameterizeWithOwner(owner, That.class, String.class, String.class);
-        Assert.assertTrue(TypeUtils.equals(getClass().getField("dat2").getGenericType(), dat2Type));
-    }
-    
-    @Test
-    public void testWildcardType() throws Exception {
-        final WildcardType simpleWildcard = TypeUtils.wildcardType().withUpperBounds(String.class).build();
-        final Field cClass = AClass.class.getField("cClass");
-        Assert.assertTrue(TypeUtils.equals(((ParameterizedType) cClass.getGenericType()).getActualTypeArguments()[0],
-            simpleWildcard));
-        Assert.assertEquals(String.format("? extends %s", String.class.getName()), TypeUtils.toString(simpleWildcard));
-        Assert.assertEquals(String.format("? extends %s", String.class.getName()), simpleWildcard.toString());
-    }
-
-    @Test
-    public void testUnboundedWildcardType() {
-        final WildcardType unbounded = TypeUtils.wildcardType().withLowerBounds((Type) null).withUpperBounds().build();
-        Assert.assertTrue(TypeUtils.equals(TypeUtils.WILDCARD_ALL, unbounded));
-        Assert.assertArrayEquals(new Type[] { Object.class }, TypeUtils.getImplicitUpperBounds(unbounded));
-        Assert.assertArrayEquals(new Type[] { null }, TypeUtils.getImplicitLowerBounds(unbounded));
-        Assert.assertEquals("?", TypeUtils.toString(unbounded));
-        Assert.assertEquals("?", unbounded.toString());
-    }
-
-    @Test
-    public void testLowerBoundedWildcardType() {
-       final WildcardType lowerBounded = TypeUtils.wildcardType().withLowerBounds(java.sql.Date.class).build();
-       Assert.assertEquals(String.format("? super %s", java.sql.Date.class.getName()), TypeUtils.toString(lowerBounded));
-       Assert.assertEquals(String.format("? super %s", java.sql.Date.class.getName()), lowerBounded.toString());
-
-       final TypeVariable<Class<Iterable>> iterableT0 = Iterable.class.getTypeParameters()[0];
-       final WildcardType lowerTypeVariable = TypeUtils.wildcardType().withLowerBounds(iterableT0).build();
-       Assert.assertEquals(String.format("? super %s", iterableT0.getName()), TypeUtils.toString(lowerTypeVariable));
-       Assert.assertEquals(String.format("? super %s", iterableT0.getName()), lowerTypeVariable.toString());
-    }
-
-    @Test
-    public void testGenericArrayType() throws Exception {
-        final Type expected = getClass().getField("intWildcardComparable").getGenericType();
-        final GenericArrayType actual =
-            TypeUtils.genericArrayType(TypeUtils.parameterize(Comparable.class, TypeUtils.wildcardType()
-                .withUpperBounds(Integer.class).build()));
-        Assert.assertTrue(TypeUtils.equals(expected, actual));
-        Assert.assertEquals("java.lang.Comparable<? extends java.lang.Integer>[]", actual.toString());
-    }
-
-    @Test
-    public void testToLongString() {
-        Assert.assertEquals(getClass().getName() + ":B", TypeUtils.toLongString(getClass().getTypeParameters()[0]));
-    }
-
-    @Test
-    public void testWrap() {
-        final Type t = getClass().getTypeParameters()[0];
-        Assert.assertTrue(TypeUtils.equals(t, TypeUtils.wrap(t).getType()));
-
-        Assert.assertEquals(String.class, TypeUtils.wrap(String.class).getType());
-    }
-
-    public Iterable<? extends Map<Integer, ? extends Collection<?>>> iterable;
-
-    public static <G extends Comparable<G>> G stub() {
-        return null;
-    }
-
-    public static <G extends Comparable<? super G>> G stub2() {
-        return null;
-    }
-
-    public static <T extends Comparable<? extends T>> T stub3() {
-        return null;
-    }
-}
-
-class AAClass<T> {
-
-    public class BBClass<S> {
-    }
-}
-
-class AAAClass extends AAClass<String> {
-    public class BBBClass extends BBClass<String> {
-    }
-}
-
-@SuppressWarnings("rawtypes")
-//raw types, where used, are used purposely
-class AClass extends AAClass<String>.BBClass<Number> {
-
-    public AClass(final AAClass<String> enclosingInstance) {
-        enclosingInstance.super();
-    }
-
-    public class BClass<T> {
-    }
-
-    public class CClass<T> extends BClass {
-    }
-
-    public class DClass<T> extends CClass<T> {
-    }
-
-    public class EClass<T> extends DClass {
-    }
-
-    public class FClass extends EClass<String> {
-    }
-
-    public class GClass<T extends BClass<? extends T> & AInterface<AInterface<? super T>>> {
-    }
-
-    public BClass<Number> bClass;
-
-    public CClass<? extends String> cClass;
-
-    public DClass<String> dClass;
-
-    public EClass<String> eClass;
-
-    public FClass fClass;
-
-    public GClass gClass;
-
-    public interface AInterface<T> {
-    }
-}
diff --git a/lang/src/test/java/org/apache/commons/lang3/reflect/testbed/Ambig.java b/lang/src/test/java/org/apache/commons/lang3/reflect/testbed/Ambig.java
deleted file mode 100644
index a2c2b61..0000000
--- a/lang/src/test/java/org/apache/commons/lang3/reflect/testbed/Ambig.java
+++ /dev/null
@@ -1,27 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.commons.lang3.reflect.testbed;
-
-/**
- * @version $Id$
- */
-public class Ambig implements Foo, Bar {
-
-    @Override
-    public void doIt() {
-    }
-}
diff --git a/lang/src/test/java/org/apache/commons/lang3/reflect/testbed/Annotated.java b/lang/src/test/java/org/apache/commons/lang3/reflect/testbed/Annotated.java
deleted file mode 100644
index 5cc9868..0000000
--- a/lang/src/test/java/org/apache/commons/lang3/reflect/testbed/Annotated.java
+++ /dev/null
@@ -1,28 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package org.apache.commons.lang3.reflect.testbed;
-
-import java.lang.annotation.ElementType;
-import java.lang.annotation.Retention;
-import java.lang.annotation.RetentionPolicy;
-import java.lang.annotation.Target;
-
-@Retention(RetentionPolicy.RUNTIME)
-@Target({ElementType.FIELD, ElementType.METHOD})
-public @interface Annotated {
-}
diff --git a/lang/src/test/java/org/apache/commons/lang3/reflect/testbed/AnotherChild.java b/lang/src/test/java/org/apache/commons/lang3/reflect/testbed/AnotherChild.java
deleted file mode 100644
index 590d418..0000000
--- a/lang/src/test/java/org/apache/commons/lang3/reflect/testbed/AnotherChild.java
+++ /dev/null
@@ -1,23 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.commons.lang3.reflect.testbed;
-
-/**
- *
- */
-public class AnotherChild extends AnotherParent {
-}
diff --git a/lang/src/test/java/org/apache/commons/lang3/reflect/testbed/AnotherParent.java b/lang/src/test/java/org/apache/commons/lang3/reflect/testbed/AnotherParent.java
deleted file mode 100644
index 795e46a..0000000
--- a/lang/src/test/java/org/apache/commons/lang3/reflect/testbed/AnotherParent.java
+++ /dev/null
@@ -1,23 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.commons.lang3.reflect.testbed;
-
-/**
- *
- */
-public class AnotherParent {
-}
diff --git a/lang/src/test/java/org/apache/commons/lang3/reflect/testbed/Bar.java b/lang/src/test/java/org/apache/commons/lang3/reflect/testbed/Bar.java
deleted file mode 100644
index ab0bf70..0000000
--- a/lang/src/test/java/org/apache/commons/lang3/reflect/testbed/Bar.java
+++ /dev/null
@@ -1,26 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.commons.lang3.reflect.testbed;
-
-/**
- * @version $Id$
- */
-public interface Bar {
-    public static final String VALUE = "bar";
-
-    void doIt();
-}
diff --git a/lang/src/test/java/org/apache/commons/lang3/reflect/testbed/Foo.java b/lang/src/test/java/org/apache/commons/lang3/reflect/testbed/Foo.java
deleted file mode 100644
index f31756c..0000000
--- a/lang/src/test/java/org/apache/commons/lang3/reflect/testbed/Foo.java
+++ /dev/null
@@ -1,26 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.commons.lang3.reflect.testbed;
-
-/**
- * @version $Id$
- */
-public interface Foo {
-    public static final String VALUE = "foo";
-
-    void doIt();
-}
diff --git a/lang/src/test/java/org/apache/commons/lang3/reflect/testbed/GenericConsumer.java b/lang/src/test/java/org/apache/commons/lang3/reflect/testbed/GenericConsumer.java
deleted file mode 100644
index 02fe80e..0000000
--- a/lang/src/test/java/org/apache/commons/lang3/reflect/testbed/GenericConsumer.java
+++ /dev/null
@@ -1,21 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.commons.lang3.reflect.testbed;
-
-public interface GenericConsumer<T> {
-    void consume(T t);
-}
diff --git a/lang/src/test/java/org/apache/commons/lang3/reflect/testbed/GenericParent.java b/lang/src/test/java/org/apache/commons/lang3/reflect/testbed/GenericParent.java
deleted file mode 100644
index 3f482d9..0000000
--- a/lang/src/test/java/org/apache/commons/lang3/reflect/testbed/GenericParent.java
+++ /dev/null
@@ -1,29 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.commons.lang3.reflect.testbed;
-
-/**
- * Class declaring a parameter variable.
- * @version $Id$
- */
-public class GenericParent<T> implements GenericConsumer<T> {
-
-    @Override
-    public void consume(final T t) {
-    }
-
-}
diff --git a/lang/src/test/java/org/apache/commons/lang3/reflect/testbed/GenericTypeHolder.java b/lang/src/test/java/org/apache/commons/lang3/reflect/testbed/GenericTypeHolder.java
deleted file mode 100644
index f69d754..0000000
--- a/lang/src/test/java/org/apache/commons/lang3/reflect/testbed/GenericTypeHolder.java
+++ /dev/null
@@ -1,30 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.commons.lang3.reflect.testbed;
-
-import java.util.List;
-
-/**
- * Holds generic testbed types.
- * @version $Id$
- */
-public class GenericTypeHolder {
-    public GenericParent<String> stringParent;
-    public GenericParent<Integer> integerParent;
-    public List<Foo> foos;
-    public GenericParent<Bar>[] barParents;
-}
diff --git a/lang/src/test/java/org/apache/commons/lang3/reflect/testbed/Grandchild.java b/lang/src/test/java/org/apache/commons/lang3/reflect/testbed/Grandchild.java
deleted file mode 100644
index 06b9c61..0000000
--- a/lang/src/test/java/org/apache/commons/lang3/reflect/testbed/Grandchild.java
+++ /dev/null
@@ -1,23 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.commons.lang3.reflect.testbed;
-
-/**
- *
- */
-public class Grandchild extends AnotherChild {
-}
diff --git a/lang/src/test/java/org/apache/commons/lang3/reflect/testbed/Parent.java b/lang/src/test/java/org/apache/commons/lang3/reflect/testbed/Parent.java
deleted file mode 100644
index 9a95990..0000000
--- a/lang/src/test/java/org/apache/commons/lang3/reflect/testbed/Parent.java
+++ /dev/null
@@ -1,32 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.commons.lang3.reflect.testbed;
-
-/**
- * @version $Id$
- */
-class Parent implements Foo {
-    public String s = "s";
-    protected boolean b = false;
-    int i = 0;
-    @SuppressWarnings("unused")
-    private final double d = 0.0;
-
-    @Override
-    public void doIt() {
-    }
-}
diff --git a/lang/src/test/java/org/apache/commons/lang3/reflect/testbed/PrivatelyShadowedChild.java b/lang/src/test/java/org/apache/commons/lang3/reflect/testbed/PrivatelyShadowedChild.java
deleted file mode 100644
index eec45d2..0000000
--- a/lang/src/test/java/org/apache/commons/lang3/reflect/testbed/PrivatelyShadowedChild.java
+++ /dev/null
@@ -1,28 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.commons.lang3.reflect.testbed;
-
-/**
- * @version $Id$
- */
-@SuppressWarnings({ "unused" }) // deliberate re-use of variable names
-public class PrivatelyShadowedChild extends Parent {
-    private final String s = "ss";
-    private final boolean b = true;
-    private final int i = 1;
-    private final double d = 1.0;
-}
diff --git a/lang/src/test/java/org/apache/commons/lang3/reflect/testbed/PublicChild.java b/lang/src/test/java/org/apache/commons/lang3/reflect/testbed/PublicChild.java
deleted file mode 100644
index 359d9ae..0000000
--- a/lang/src/test/java/org/apache/commons/lang3/reflect/testbed/PublicChild.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.commons.lang3.reflect.testbed;
-
-/**
- * @version $Id$
- */
-public class PublicChild extends Parent {
-    static final String VALUE = "child";
-}
diff --git a/lang/src/test/java/org/apache/commons/lang3/reflect/testbed/PubliclyShadowedChild.java b/lang/src/test/java/org/apache/commons/lang3/reflect/testbed/PubliclyShadowedChild.java
deleted file mode 100644
index 5347bb9..0000000
--- a/lang/src/test/java/org/apache/commons/lang3/reflect/testbed/PubliclyShadowedChild.java
+++ /dev/null
@@ -1,27 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.commons.lang3.reflect.testbed;
-
-/**
- * @version $Id$
- */
-public class PubliclyShadowedChild extends Parent {
-    public String s = "ss";
-    public boolean b = true;
-    public int i = 1;
-    public double d = 1.0;
-}
diff --git a/lang/src/test/java/org/apache/commons/lang3/reflect/testbed/StaticContainer.java b/lang/src/test/java/org/apache/commons/lang3/reflect/testbed/StaticContainer.java
deleted file mode 100644
index d227f7b..0000000
--- a/lang/src/test/java/org/apache/commons/lang3/reflect/testbed/StaticContainer.java
+++ /dev/null
@@ -1,59 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.commons.lang3.reflect.testbed;
-
-/**
- * @version $Id$
- */
-public class StaticContainer {
-    public static final Object IMMUTABLE_PUBLIC = "public";
-    protected static final Object IMMUTABLE_PROTECTED = "protected";
-    static final Object IMMUTABLE_PACKAGE = "";
-    @SuppressWarnings("unused")
-    private static final Object IMMUTABLE_PRIVATE = "private";
-
-    /**
-     * This final modifier of this field is meant to be removed by a test.
-     * Using this field may produce unpredictable results.
-     */
-    @SuppressWarnings("unused")
-    private static final Object IMMUTABLE_PRIVATE_2 = "private";
-
-    public static Object mutablePublic;
-    protected static Object mutableProtected;
-    static Object mutablePackage;
-    private static Object mutablePrivate;
-
-    public static void reset() {
-        mutablePublic = null;
-        mutableProtected = null;
-        mutablePackage = null;
-        mutablePrivate = null;
-    }
-
-    public static Object getMutableProtected() {
-        return mutableProtected;
-    }
-
-    public static Object getMutablePackage() {
-        return mutablePackage;
-    }
-
-    public static Object getMutablePrivate() {
-        return mutablePrivate;
-    }
-}
diff --git a/lang/src/test/java/org/apache/commons/lang3/reflect/testbed/StaticContainerChild.java b/lang/src/test/java/org/apache/commons/lang3/reflect/testbed/StaticContainerChild.java
deleted file mode 100644
index 34ebb0b..0000000
--- a/lang/src/test/java/org/apache/commons/lang3/reflect/testbed/StaticContainerChild.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.commons.lang3.reflect.testbed;
-
-/**
- * @version $Id$
- */
-public class StaticContainerChild extends StaticContainer {
-
-}
diff --git a/lang/src/test/java/org/apache/commons/lang3/reflect/testbed/StringParameterizedChild.java b/lang/src/test/java/org/apache/commons/lang3/reflect/testbed/StringParameterizedChild.java
deleted file mode 100644
index feed918..0000000
--- a/lang/src/test/java/org/apache/commons/lang3/reflect/testbed/StringParameterizedChild.java
+++ /dev/null
@@ -1,28 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.commons.lang3.reflect.testbed;
-
-/**
- * {@link GenericParent} subclass that explicitly specifies &lt;T&gt; as {@link String}.
- * @version $Id$
- */
-public class StringParameterizedChild extends GenericParent<String> {
-    @Override
-    public void consume(final String t) {
-        super.consume(t);
-    }
-}
diff --git a/lang/src/test/java/org/apache/commons/lang3/text/CompositeFormatTest.java b/lang/src/test/java/org/apache/commons/lang3/text/CompositeFormatTest.java
deleted file mode 100644
index e49ec41..0000000
--- a/lang/src/test/java/org/apache/commons/lang3/text/CompositeFormatTest.java
+++ /dev/null
@@ -1,85 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- * 
- *      http://www.apache.org/licenses/LICENSE-2.0
- * 
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package org.apache.commons.lang3.text;
-
-import org.junit.Test;
-import static org.junit.Assert.*;
-import java.text.FieldPosition;
-import java.text.Format;
-import java.text.ParsePosition;
-import java.text.SimpleDateFormat;
-import java.util.Locale;
-
-/**
- * Unit tests for {@link org.apache.commons.lang3.text.CompositeFormat}.
- */
-public class CompositeFormatTest {
-
-    /**
-     * Ensures that the parse/format separation is correctly maintained. 
-     */
-    @Test
-    public void testCompositeFormat() {
-
-        final Format parser = new Format() {
-            private static final long serialVersionUID = 1L;
-
-            @Override
-            public StringBuffer format(final Object obj, final StringBuffer toAppendTo, final FieldPosition pos) {
-                throw new UnsupportedOperationException("Not implemented");
-            }
-
-            @Override
-            public Object parseObject(final String source, final ParsePosition pos) {
-                return null;    // do nothing
-            }
-        };
-
-        final Format formatter = new Format() {
-            private static final long serialVersionUID = 1L;
-
-            @Override
-            public StringBuffer format(final Object obj, final StringBuffer toAppendTo, final FieldPosition pos) {
-                return null;    // do nothing
-            }
-
-            @Override
-            public Object parseObject(final String source, final ParsePosition pos) {
-                throw new UnsupportedOperationException("Not implemented");
-            }
-        };
-
-        final CompositeFormat composite = new CompositeFormat(parser, formatter);
-
-        composite.parseObject("", null);
-        composite.format(new Object(), new StringBuffer(), null);
-        assertEquals( "Parser get method incorrectly implemented", parser, composite.getParser() );
-        assertEquals( "Formatter get method incorrectly implemented", formatter, composite.getFormatter() );
-    }
-
-    @Test
-    public void testUsage() throws Exception {
-        final Format f1 = new SimpleDateFormat("MMddyyyy", Locale.ENGLISH);
-        final Format f2 = new SimpleDateFormat("MMMM d, yyyy", Locale.ENGLISH);
-        final CompositeFormat c = new CompositeFormat(f1, f2);
-        final String testString = "January 3, 2005";
-        assertEquals(testString, c.format(c.parseObject("01032005")));
-        assertEquals(testString, c.reformat("01032005"));
-    }
-
-}
diff --git a/lang/src/test/java/org/apache/commons/lang3/text/ExtendedMessageFormatTest.java b/lang/src/test/java/org/apache/commons/lang3/text/ExtendedMessageFormatTest.java
deleted file mode 100644
index 926019e..0000000
--- a/lang/src/test/java/org/apache/commons/lang3/text/ExtendedMessageFormatTest.java
+++ /dev/null
@@ -1,485 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- * 
- *      http://www.apache.org/licenses/LICENSE-2.0
- * 
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.commons.lang3.text;
-
-import org.junit.Test;
-import org.junit.Before;
-import static org.junit.Assert.*;
-import static org.apache.commons.lang3.JavaVersion.JAVA_1_4;
-
-import java.text.ChoiceFormat;
-import java.text.DateFormat;
-import java.text.FieldPosition;
-import java.text.Format;
-import java.text.MessageFormat;
-import java.text.NumberFormat;
-import java.text.ParsePosition;
-import java.util.Arrays;
-import java.util.Calendar;
-import java.util.Collections;
-import java.util.HashMap;
-import java.util.HashSet;
-import java.util.Locale;
-import java.util.Map;
-
-import org.apache.commons.lang3.SystemUtils;
-
-/**
- * Test case for {@link ExtendedMessageFormat}.
- *
- * @since 2.4
- * @version $Id$
- */
-public class ExtendedMessageFormatTest {
-
-    private final Map<String, FormatFactory> registry = new HashMap<String, FormatFactory>();
-
-    @Before
-    public void setUp() throws Exception {
-        registry.put("lower", new LowerCaseFormatFactory());
-        registry.put("upper", new UpperCaseFormatFactory());
-    }
-
-    /**
-     * Test extended formats.
-     */
-    @Test
-    public void testExtendedFormats() {
-        final String pattern = "Lower: {0,lower} Upper: {1,upper}";
-        final ExtendedMessageFormat emf = new ExtendedMessageFormat(pattern, registry);
-        assertPatternsEqual("TOPATTERN", pattern, emf.toPattern());
-        assertEquals("Lower: foo Upper: BAR", emf.format(new Object[] {"foo", "bar"}));
-        assertEquals("Lower: foo Upper: BAR", emf.format(new Object[] {"Foo", "Bar"}));
-        assertEquals("Lower: foo Upper: BAR", emf.format(new Object[] {"FOO", "BAR"}));
-        assertEquals("Lower: foo Upper: BAR", emf.format(new Object[] {"FOO", "bar"}));
-        assertEquals("Lower: foo Upper: BAR", emf.format(new Object[] {"foo", "BAR"}));
-    }
-
-    /**
-     * Test Bug LANG-477 - out of memory error with escaped quote
-     */
-    @Test
-    public void testEscapedQuote_LANG_477() {
-        final String pattern = "it''s a {0,lower} 'test'!";
-        final ExtendedMessageFormat emf = new ExtendedMessageFormat(pattern, registry);
-        assertEquals("it's a dummy test!", emf.format(new Object[] {"DUMMY"}));
-    }
-
-    /**
-     * Test Bug LANG-917 - IndexOutOfBoundsException and/or infinite loop when using a choice pattern
-     */
-    @Test
-    public void testEmbeddedPatternInChoice() {
-        final String pattern = "Hi {0,lower}, got {1,choice,0#none|1#one|1<{1,number}}, {2,upper}!";
-        final ExtendedMessageFormat emf = new ExtendedMessageFormat(pattern, registry);
-        assertEquals(emf.format(new Object[] {"there", 3, "great"}), "Hi there, got 3, GREAT!");
-    }
-
-    /**
-     * Test Bug LANG-948 - Exception while using ExtendedMessageFormat and escaping braces
-     */
-    @Test
-    public void testEscapedBraces_LANG_948() {
-        // message without placeholder because braces are escaped by quotes 
-        final String pattern = "Message without placeholders '{}'";
-        final ExtendedMessageFormat emf = new ExtendedMessageFormat(pattern, registry);
-        assertEquals("Message without placeholders {}", emf.format(new Object[] {"DUMMY"}));
-
-        // message with placeholder because quotes are escaped by quotes 
-        final String pattern2 = "Message with placeholder ''{0}''";
-        final ExtendedMessageFormat emf2 = new ExtendedMessageFormat(pattern2, registry);
-        assertEquals("Message with placeholder 'DUMMY'", emf2.format(new Object[] {"DUMMY"}));
-    }
-
-    /**
-     * Test extended and built in formats.
-     */
-    @Test
-    public void testExtendedAndBuiltInFormats() {
-        final Calendar cal = Calendar.getInstance();
-        cal.set(2007, Calendar.JANUARY, 23, 18, 33, 05);
-        final Object[] args = new Object[] {"John Doe", cal.getTime(), Double.valueOf("12345.67")};
-        final String builtinsPattern = "DOB: {1,date,short} Salary: {2,number,currency}";
-        final String extendedPattern = "Name: {0,upper} ";
-        final String pattern = extendedPattern + builtinsPattern;
-
-        final HashSet<Locale> testLocales = new HashSet<Locale>();
-        testLocales.addAll(Arrays.asList(DateFormat.getAvailableLocales()));
-        testLocales.retainAll(Arrays.asList(NumberFormat.getAvailableLocales()));
-        testLocales.add(null);
-
-        for (final Locale locale : testLocales) {
-            final MessageFormat builtins = createMessageFormat(builtinsPattern, locale);
-            final String expectedPattern = extendedPattern + builtins.toPattern();
-            DateFormat df = null;
-            NumberFormat nf = null;
-            ExtendedMessageFormat emf = null;
-            if (locale == null) {
-                df = DateFormat.getDateInstance(DateFormat.SHORT);
-                nf = NumberFormat.getCurrencyInstance();
-                emf = new ExtendedMessageFormat(pattern, registry);
-            } else {
-                df = DateFormat.getDateInstance(DateFormat.SHORT, locale);
-                nf = NumberFormat.getCurrencyInstance(locale);
-                emf = new ExtendedMessageFormat(pattern, locale, registry);
-            }
-            final StringBuilder expected = new StringBuilder();
-            expected.append("Name: ");
-            expected.append(args[0].toString().toUpperCase());
-            expected.append(" DOB: ");
-            expected.append(df.format(args[1]));
-            expected.append(" Salary: ");
-            expected.append(nf.format(args[2]));
-            assertPatternsEqual("pattern comparison for locale " + locale, expectedPattern, emf.toPattern());
-            assertEquals(String.valueOf(locale), expected.toString(), emf.format(args));
-        }
-    }
-
-//    /**
-//     * Test extended formats with choice format.
-//     *
-//     * NOTE: FAILING - currently sub-formats not supported
-//     */
-//    public void testExtendedWithChoiceFormat() {
-//        String pattern = "Choice: {0,choice,1.0#{1,lower}|2.0#{1,upper}}";
-//        ExtendedMessageFormat emf = new ExtendedMessageFormat(pattern, registry);
-//        assertPatterns(null, pattern, emf.toPattern());
-//        try {
-//            assertEquals("one", emf.format(new Object[] {Integer.valueOf(1), "ONE"}));
-//            assertEquals("TWO", emf.format(new Object[] {Integer.valueOf(2), "two"}));
-//        } catch (IllegalArgumentException e) {
-//            // currently sub-formats not supported
-//        }
-//    }
-
-//    /**
-//     * Test mixed extended and built-in formats with choice format.
-//     *
-//     * NOTE: FAILING - currently sub-formats not supported
-//     */
-//    public void testExtendedAndBuiltInWithChoiceFormat() {
-//        String pattern = "Choice: {0,choice,1.0#{0} {1,lower} {2,number}|2.0#{0} {1,upper} {2,number,currency}}";
-//        Object[] lowArgs  = new Object[] {Integer.valueOf(1), "Low",  Double.valueOf("1234.56")};
-//        Object[] highArgs = new Object[] {Integer.valueOf(2), "High", Double.valueOf("9876.54")};
-//        Locale[] availableLocales = ChoiceFormat.getAvailableLocales();
-//        Locale[] testLocales = new Locale[availableLocales.length + 1];
-//        testLocales[0] = null;
-//        System.arraycopy(availableLocales, 0, testLocales, 1, availableLocales.length);
-//        for (int i = 0; i < testLocales.length; i++) {
-//            NumberFormat nf = null;
-//            NumberFormat cf = null;
-//            ExtendedMessageFormat emf = null;
-//            if (testLocales[i] == null) {
-//                nf = NumberFormat.getNumberInstance();
-//                cf = NumberFormat.getCurrencyInstance();
-//                emf = new ExtendedMessageFormat(pattern, registry);
-//            } else {
-//                nf = NumberFormat.getNumberInstance(testLocales[i]);
-//                cf = NumberFormat.getCurrencyInstance(testLocales[i]);
-//                emf = new ExtendedMessageFormat(pattern, testLocales[i], registry);
-//            }
-//            assertPatterns(null, pattern, emf.toPattern());
-//            try {
-//                String lowExpected = lowArgs[0] + " low "    + nf.format(lowArgs[2]);
-//                String highExpected = highArgs[0] + " HIGH "  + cf.format(highArgs[2]);
-//                assertEquals(lowExpected,  emf.format(lowArgs));
-//                assertEquals(highExpected, emf.format(highArgs));
-//            } catch (IllegalArgumentException e) {
-//                // currently sub-formats not supported
-//            }
-//        }
-//    }
-
-    /**
-     * Test the built in choice format.
-     */
-    @Test
-    public void testBuiltInChoiceFormat() {
-        final Object[] values = new Number[] {Integer.valueOf(1), Double.valueOf("2.2"), Double.valueOf("1234.5")};
-        String choicePattern = null;
-        final Locale[] availableLocales = ChoiceFormat.getAvailableLocales();
-
-        choicePattern = "{0,choice,1#One|2#Two|3#Many {0,number}}";
-        for (final Object value : values) {
-            checkBuiltInFormat(value + ": " + choicePattern, new Object[] {value}, availableLocales);
-        }
-
-        choicePattern = "{0,choice,1#''One''|2#\"Two\"|3#''{Many}'' {0,number}}";
-        for (final Object value : values) {
-            checkBuiltInFormat(value + ": " + choicePattern, new Object[] {value}, availableLocales);
-        }
-    }
-
-    /**
-     * Test the built in date/time formats
-     */
-    @Test
-    public void testBuiltInDateTimeFormat() {
-        final Calendar cal = Calendar.getInstance();
-        cal.set(2007, Calendar.JANUARY, 23, 18, 33, 05);
-        final Object[] args = new Object[] {cal.getTime()};
-        final Locale[] availableLocales = DateFormat.getAvailableLocales();
-
-        checkBuiltInFormat("1: {0,date,short}",    args, availableLocales);
-        checkBuiltInFormat("2: {0,date,medium}",   args, availableLocales);
-        checkBuiltInFormat("3: {0,date,long}",     args, availableLocales);
-        checkBuiltInFormat("4: {0,date,full}",     args, availableLocales);
-        checkBuiltInFormat("5: {0,date,d MMM yy}", args, availableLocales);
-        checkBuiltInFormat("6: {0,time,short}",    args, availableLocales);
-        checkBuiltInFormat("7: {0,time,medium}",   args, availableLocales);
-        checkBuiltInFormat("8: {0,time,long}",     args, availableLocales);
-        checkBuiltInFormat("9: {0,time,full}",     args, availableLocales);
-        checkBuiltInFormat("10: {0,time,HH:mm}",   args, availableLocales);
-        checkBuiltInFormat("11: {0,date}",         args, availableLocales);
-        checkBuiltInFormat("12: {0,time}",         args, availableLocales);
-    }
-
-    @Test
-    public void testOverriddenBuiltinFormat() {
-        final Calendar cal = Calendar.getInstance();
-        cal.set(2007, Calendar.JANUARY, 23);
-        final Object[] args = new Object[] {cal.getTime()};
-        final Locale[] availableLocales = DateFormat.getAvailableLocales();
-        final Map<String, ? extends FormatFactory> dateRegistry = Collections.singletonMap("date", new OverrideShortDateFormatFactory());
-
-        //check the non-overridden builtins:
-        checkBuiltInFormat("1: {0,date}", dateRegistry,          args, availableLocales);
-        checkBuiltInFormat("2: {0,date,medium}", dateRegistry,   args, availableLocales);
-        checkBuiltInFormat("3: {0,date,long}", dateRegistry,     args, availableLocales);
-        checkBuiltInFormat("4: {0,date,full}", dateRegistry,     args, availableLocales);
-        checkBuiltInFormat("5: {0,date,d MMM yy}", dateRegistry, args, availableLocales);
-
-        //check the overridden format:
-        for (int i = -1; i < availableLocales.length; i++) {
-            final Locale locale = i < 0 ? null : availableLocales[i];
-            final MessageFormat dateDefault = createMessageFormat("{0,date}", locale);
-            final String pattern = "{0,date,short}";
-            final ExtendedMessageFormat dateShort = new ExtendedMessageFormat(pattern, locale, dateRegistry);
-            assertEquals("overridden date,short format", dateDefault.format(args), dateShort.format(args));
-            assertEquals("overridden date,short pattern", pattern, dateShort.toPattern());
-        }
-    }
-
-    /**
-     * Test the built in number formats.
-     */
-    @Test
-    public void testBuiltInNumberFormat() {
-        final Object[] args = new Object[] {Double.valueOf("6543.21")};
-        final Locale[] availableLocales = NumberFormat.getAvailableLocales();
-        checkBuiltInFormat("1: {0,number}",            args, availableLocales);
-        checkBuiltInFormat("2: {0,number,integer}",    args, availableLocales);
-        checkBuiltInFormat("3: {0,number,currency}",   args, availableLocales);
-        checkBuiltInFormat("4: {0,number,percent}",    args, availableLocales);
-        checkBuiltInFormat("5: {0,number,00000.000}",  args, availableLocales);
-    }
-
-    /**
-     * Test equals() and hashcode.
-     */
-    @Test
-    public void testEqualsHashcode() {
-        final Map<String, ? extends FormatFactory> fmtRegistry = Collections.singletonMap("testfmt", new LowerCaseFormatFactory());
-        final Map<String, ? extends FormatFactory> otherRegitry = Collections.singletonMap("testfmt", new UpperCaseFormatFactory());
-
-        final String pattern = "Pattern: {0,testfmt}";
-        final ExtendedMessageFormat emf = new ExtendedMessageFormat(pattern, Locale.US, fmtRegistry);
-
-        ExtendedMessageFormat other = null;
-
-        // Same object
-        assertTrue("same, equals()",   emf.equals(emf));
-        assertTrue("same, hashcode()", emf.hashCode() == emf.hashCode());
-
-        // Equal Object
-        other = new ExtendedMessageFormat(pattern, Locale.US, fmtRegistry);
-        assertTrue("equal, equals()",   emf.equals(other));
-        assertTrue("equal, hashcode()", emf.hashCode() == other.hashCode());
-
-        // Different Class
-        other = new OtherExtendedMessageFormat(pattern, Locale.US, fmtRegistry);
-        assertFalse("class, equals()",  emf.equals(other));
-        assertTrue("class, hashcode()", emf.hashCode() == other.hashCode()); // same hashcode
-        
-        // Different pattern
-        other = new ExtendedMessageFormat("X" + pattern, Locale.US, fmtRegistry);
-        assertFalse("pattern, equals()",   emf.equals(other));
-        assertFalse("pattern, hashcode()", emf.hashCode() == other.hashCode());
-
-        // Different registry
-        other = new ExtendedMessageFormat(pattern, Locale.US, otherRegitry);
-        assertFalse("registry, equals()",   emf.equals(other));
-        assertFalse("registry, hashcode()", emf.hashCode() == other.hashCode());
-
-        // Different Locale
-        other = new ExtendedMessageFormat(pattern, Locale.FRANCE, fmtRegistry);
-        assertFalse("locale, equals()",  emf.equals(other));
-        assertTrue("locale, hashcode()", emf.hashCode() == other.hashCode()); // same hashcode
-    }
-
-    /**
-     * Test a built in format for the specified Locales, plus <code>null</code> Locale.
-     * @param pattern MessageFormat pattern
-     * @param args MessageFormat arguments
-     * @param locales to test
-     */
-    private void checkBuiltInFormat(final String pattern, final Object[] args, final Locale[] locales) {
-        checkBuiltInFormat(pattern, null, args, locales);
-    }
-
-    /**
-     * Test a built in format for the specified Locales, plus <code>null</code> Locale.
-     * @param pattern MessageFormat pattern
-     * @param fmtRegistry FormatFactory registry to use
-     * @param args MessageFormat arguments
-     * @param locales to test
-     */
-    private void checkBuiltInFormat(final String pattern, final Map<String, ?> fmtRegistry, final Object[] args, final Locale[] locales) {
-        checkBuiltInFormat(pattern, fmtRegistry, args, (Locale) null);
-        for (final Locale locale : locales) {
-            checkBuiltInFormat(pattern, fmtRegistry, args, locale);
-        }
-    }
-
-    /**
-     * Create an ExtendedMessageFormat for the specified pattern and locale and check the
-     * formated output matches the expected result for the parameters.
-     * @param pattern string
-     * @param registryUnused map (currently unused)
-     * @param args Object[]
-     * @param locale Locale
-     */
-    private void checkBuiltInFormat(final String pattern, final Map<String, ?> registryUnused, final Object[] args, final Locale locale) {
-        final StringBuilder buffer = new StringBuilder();
-        buffer.append("Pattern=[");
-        buffer.append(pattern);
-        buffer.append("], locale=[");
-        buffer.append(locale);
-        buffer.append("]");
-        final MessageFormat mf = createMessageFormat(pattern, locale);
-        // System.out.println(buffer + ", result=[" + mf.format(args) +"]");
-        ExtendedMessageFormat emf = null;
-        if (locale == null) {
-            emf = new ExtendedMessageFormat(pattern);
-        } else {
-            emf = new ExtendedMessageFormat(pattern, locale);
-        }
-        assertEquals("format "    + buffer.toString(), mf.format(args), emf.format(args));
-        assertPatternsEqual("toPattern " + buffer.toString(), mf.toPattern(),  emf.toPattern());
-    }
-
-    //can't trust what MessageFormat does with toPattern() pre 1.4:
-    private void assertPatternsEqual(final String message, final String expected, final String actual) {
-        if (SystemUtils.isJavaVersionAtLeast(JAVA_1_4)) {
-            assertEquals(message, expected, actual);
-        }
-    }
-
-    /**
-     * Replace MessageFormat(String, Locale) constructor (not available until JDK 1.4).
-     * @param pattern string
-     * @param locale Locale
-     * @return MessageFormat
-     */
-    private MessageFormat createMessageFormat(final String pattern, final Locale locale) {
-        final MessageFormat result = new MessageFormat(pattern);
-        if (locale != null) {
-            result.setLocale(locale);
-            result.applyPattern(pattern);
-        }
-        return result;
-    }
-
-    // ------------------------ Test Formats ------------------------
-
-    /**
-     * {@link Format} implementation which converts to lower case.
-     */
-    private static class LowerCaseFormat extends Format {
-        private static final long serialVersionUID = 1L;
-
-        @Override
-        public StringBuffer format(final Object obj, final StringBuffer toAppendTo, final FieldPosition pos) {
-            return toAppendTo.append(((String)obj).toLowerCase());
-        }
-        @Override
-        public Object parseObject(final String source, final ParsePosition pos) {throw new UnsupportedOperationException();}
-    }
-
-    /**
-     * {@link Format} implementation which converts to upper case.
-     */
-    private static class UpperCaseFormat extends Format {
-        private static final long serialVersionUID = 1L;
-
-        @Override
-        public StringBuffer format(final Object obj, final StringBuffer toAppendTo, final FieldPosition pos) {
-            return toAppendTo.append(((String)obj).toUpperCase());
-        }
-        @Override
-        public Object parseObject(final String source, final ParsePosition pos) {throw new UnsupportedOperationException();}
-    }
-
-
-    // ------------------------ Test Format Factories ---------------
-    /**
-     * {@link FormatFactory} implementation for lower case format.
-     */
-    private static class LowerCaseFormatFactory implements FormatFactory {
-        private static final Format LOWER_INSTANCE = new LowerCaseFormat();
-        @Override
-        public Format getFormat(final String name, final String arguments, final Locale locale) {
-            return LOWER_INSTANCE;
-        }
-    }
-    /**
-     * {@link FormatFactory} implementation for upper case format.
-     */
-    private static class UpperCaseFormatFactory implements FormatFactory {
-        private static final Format UPPER_INSTANCE = new UpperCaseFormat();
-        @Override
-        public Format getFormat(final String name, final String arguments, final Locale locale) {
-            return UPPER_INSTANCE;
-        }
-    }
-    /**
-     * {@link FormatFactory} implementation to override date format "short" to "default".
-     */
-    private static class OverrideShortDateFormatFactory implements FormatFactory {
-        @Override
-        public Format getFormat(final String name, final String arguments, final Locale locale) {
-            return !"short".equals(arguments) ? null
-                    : locale == null ? DateFormat
-                            .getDateInstance(DateFormat.DEFAULT) : DateFormat
-                            .getDateInstance(DateFormat.DEFAULT, locale);
-        }
-    }
-
-    /**
-     * Alternative ExtendedMessageFormat impl.
-     */
-    private static class OtherExtendedMessageFormat extends ExtendedMessageFormat {
-        private static final long serialVersionUID = 1L;
-
-        public OtherExtendedMessageFormat(final String pattern, final Locale locale,
-                final Map<String, ? extends FormatFactory> registry) {
-            super(pattern, locale, registry);
-        }
-        
-    }
-
-}
diff --git a/lang/src/test/java/org/apache/commons/lang3/text/FormattableUtilsTest.java b/lang/src/test/java/org/apache/commons/lang3/text/FormattableUtilsTest.java
deleted file mode 100644
index bb84742..0000000
--- a/lang/src/test/java/org/apache/commons/lang3/text/FormattableUtilsTest.java
+++ /dev/null
@@ -1,117 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.commons.lang3.text;
-
-import static java.util.FormattableFlags.LEFT_JUSTIFY;
-import static org.junit.Assert.assertEquals;
-
-import java.util.Formatter;
-
-import org.junit.Test;
-
-/**
- * Unit tests {@link FormattableUtils}.
- *
- * @version $Id$
- */
-public class FormattableUtilsTest {
-
-    @Test
-    public void testDefaultAppend() {
-        assertEquals("foo", FormattableUtils.append("foo", new Formatter(), 0, -1, -1).toString());
-        assertEquals("fo", FormattableUtils.append("foo", new Formatter(), 0, -1, 2).toString());
-        assertEquals(" foo", FormattableUtils.append("foo", new Formatter(), 0, 4, -1).toString());
-        assertEquals("   foo", FormattableUtils.append("foo", new Formatter(), 0, 6, -1).toString());
-        assertEquals(" fo", FormattableUtils.append("foo", new Formatter(), 0, 3, 2).toString());
-        assertEquals("   fo", FormattableUtils.append("foo", new Formatter(), 0, 5, 2).toString());
-        assertEquals("foo ", FormattableUtils.append("foo", new Formatter(), LEFT_JUSTIFY, 4, -1).toString());
-        assertEquals("foo   ", FormattableUtils.append("foo", new Formatter(), LEFT_JUSTIFY, 6, -1).toString());
-        assertEquals("fo ", FormattableUtils.append("foo", new Formatter(), LEFT_JUSTIFY, 3, 2).toString());
-        assertEquals("fo   ", FormattableUtils.append("foo", new Formatter(), LEFT_JUSTIFY, 5, 2).toString());
-    }
-
-    @Test
-    public void testAlternatePadCharacter() {
-        final char pad='_';
-        assertEquals("foo", FormattableUtils.append("foo", new Formatter(), 0, -1, -1, pad).toString());
-        assertEquals("fo", FormattableUtils.append("foo", new Formatter(), 0, -1, 2, pad).toString());
-        assertEquals("_foo", FormattableUtils.append("foo", new Formatter(), 0, 4, -1, pad).toString());
-        assertEquals("___foo", FormattableUtils.append("foo", new Formatter(), 0, 6, -1, pad).toString());
-        assertEquals("_fo", FormattableUtils.append("foo", new Formatter(), 0, 3, 2, pad).toString());
-        assertEquals("___fo", FormattableUtils.append("foo", new Formatter(), 0, 5, 2, pad).toString());
-        assertEquals("foo_", FormattableUtils.append("foo", new Formatter(), LEFT_JUSTIFY, 4, -1, pad).toString());
-        assertEquals("foo___", FormattableUtils.append("foo", new Formatter(), LEFT_JUSTIFY, 6, -1, pad).toString());
-        assertEquals("fo_", FormattableUtils.append("foo", new Formatter(), LEFT_JUSTIFY, 3, 2, pad).toString());
-        assertEquals("fo___", FormattableUtils.append("foo", new Formatter(), LEFT_JUSTIFY, 5, 2, pad).toString());
-    }
-
-    @Test
-    public void testEllipsis() {
-        assertEquals("foo", FormattableUtils.append("foo", new Formatter(), 0, -1, -1, "*").toString());
-        assertEquals("f*", FormattableUtils.append("foo", new Formatter(), 0, -1, 2, "*").toString());
-        assertEquals(" foo", FormattableUtils.append("foo", new Formatter(), 0, 4, -1, "*").toString());
-        assertEquals("   foo", FormattableUtils.append("foo", new Formatter(), 0, 6, -1, "*").toString());
-        assertEquals(" f*", FormattableUtils.append("foo", new Formatter(), 0, 3, 2, "*").toString());
-        assertEquals("   f*", FormattableUtils.append("foo", new Formatter(), 0, 5, 2, "*").toString());
-        assertEquals("foo ", FormattableUtils.append("foo", new Formatter(), LEFT_JUSTIFY, 4, -1, "*").toString());
-        assertEquals("foo   ", FormattableUtils.append("foo", new Formatter(), LEFT_JUSTIFY, 6, -1, "*").toString());
-        assertEquals("f* ", FormattableUtils.append("foo", new Formatter(), LEFT_JUSTIFY, 3, 2, "*").toString());
-        assertEquals("f*   ", FormattableUtils.append("foo", new Formatter(), LEFT_JUSTIFY, 5, 2, "*").toString());
-
-        assertEquals("foo", FormattableUtils.append("foo", new Formatter(), 0, -1, -1, "+*").toString());
-        assertEquals("+*", FormattableUtils.append("foo", new Formatter(), 0, -1, 2, "+*").toString());
-        assertEquals(" foo", FormattableUtils.append("foo", new Formatter(), 0, 4, -1, "+*").toString());
-        assertEquals("   foo", FormattableUtils.append("foo", new Formatter(), 0, 6, -1, "+*").toString());
-        assertEquals(" +*", FormattableUtils.append("foo", new Formatter(), 0, 3, 2, "+*").toString());
-        assertEquals("   +*", FormattableUtils.append("foo", new Formatter(), 0, 5, 2, "+*").toString());
-        assertEquals("foo ", FormattableUtils.append("foo", new Formatter(), LEFT_JUSTIFY, 4, -1, "+*").toString());
-        assertEquals("foo   ", FormattableUtils.append("foo", new Formatter(), LEFT_JUSTIFY, 6, -1, "+*").toString());
-        assertEquals("+* ", FormattableUtils.append("foo", new Formatter(), LEFT_JUSTIFY, 3, 2, "+*").toString());
-        assertEquals("+*   ", FormattableUtils.append("foo", new Formatter(), LEFT_JUSTIFY, 5, 2, "+*").toString());
-    }
-
-    @Test(expected=IllegalArgumentException.class)
-    public void testIllegalEllipsis() {
-        FormattableUtils.append("foo", new Formatter(), 0, -1, 1, "xx");
-    }
-
-    @Test
-    public void testAlternatePadCharAndEllipsis() {
-        assertEquals("foo", FormattableUtils.append("foo", new Formatter(), 0, -1, -1, '_', "*").toString());
-        assertEquals("f*", FormattableUtils.append("foo", new Formatter(), 0, -1, 2, '_', "*").toString());
-        assertEquals("_foo", FormattableUtils.append("foo", new Formatter(), 0, 4, -1, '_', "*").toString());
-        assertEquals("___foo", FormattableUtils.append("foo", new Formatter(), 0, 6, -1, '_', "*").toString());
-        assertEquals("_f*", FormattableUtils.append("foo", new Formatter(), 0, 3, 2, '_', "*").toString());
-        assertEquals("___f*", FormattableUtils.append("foo", new Formatter(), 0, 5, 2, '_', "*").toString());
-        assertEquals("foo_", FormattableUtils.append("foo", new Formatter(), LEFT_JUSTIFY, 4, -1, '_', "*").toString());
-        assertEquals("foo___", FormattableUtils.append("foo", new Formatter(), LEFT_JUSTIFY, 6, -1, '_', "*").toString());
-        assertEquals("f*_", FormattableUtils.append("foo", new Formatter(), LEFT_JUSTIFY, 3, 2, '_', "*").toString());
-        assertEquals("f*___", FormattableUtils.append("foo", new Formatter(), LEFT_JUSTIFY, 5, 2, '_', "*").toString());
-
-        assertEquals("foo", FormattableUtils.append("foo", new Formatter(), 0, -1, -1, '_', "+*").toString());
-        assertEquals("+*", FormattableUtils.append("foo", new Formatter(), 0, -1, 2, '_', "+*").toString());
-        assertEquals("_foo", FormattableUtils.append("foo", new Formatter(), 0, 4, -1, '_', "+*").toString());
-        assertEquals("___foo", FormattableUtils.append("foo", new Formatter(), 0, 6, -1, '_', "+*").toString());
-        assertEquals("_+*", FormattableUtils.append("foo", new Formatter(), 0, 3, 2, '_', "+*").toString());
-        assertEquals("___+*", FormattableUtils.append("foo", new Formatter(), 0, 5, 2, '_', "+*").toString());
-        assertEquals("foo_", FormattableUtils.append("foo", new Formatter(), LEFT_JUSTIFY, 4, -1, '_', "+*").toString());
-        assertEquals("foo___", FormattableUtils.append("foo", new Formatter(), LEFT_JUSTIFY, 6, -1, '_', "+*").toString());
-        assertEquals("+*_", FormattableUtils.append("foo", new Formatter(), LEFT_JUSTIFY, 3, 2, '_', "+*").toString());
-        assertEquals("+*___", FormattableUtils.append("foo", new Formatter(), LEFT_JUSTIFY, 5, 2, '_', "+*").toString());
-    }
-
-}
diff --git a/lang/src/test/java/org/apache/commons/lang3/text/StrBuilderAppendInsertTest.java b/lang/src/test/java/org/apache/commons/lang3/text/StrBuilderAppendInsertTest.java
deleted file mode 100644
index 3d0ed4b..0000000
--- a/lang/src/test/java/org/apache/commons/lang3/text/StrBuilderAppendInsertTest.java
+++ /dev/null
@@ -1,1609 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- * 
- *      http://www.apache.org/licenses/LICENSE-2.0
- * 
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package org.apache.commons.lang3.text;
-
-import org.junit.Test;
-import static org.junit.Assert.*;
-
-import java.text.DecimalFormatSymbols;
-import java.util.Arrays;
-import java.util.Collection;
-import java.util.Collections;
-import java.util.Iterator;
-
-import org.apache.commons.lang3.SystemUtils;
-
-/**
- * Unit tests for {@link org.apache.commons.lang3.text.StrBuilder}.
- *
- * @version $Id$
- */
-public class StrBuilderAppendInsertTest {
-
-    /** The system line separator. */
-    private static final String SEP = SystemUtils.LINE_SEPARATOR;
-
-    /** Test subclass of Object, with a toString method. */
-    private static final Object FOO = new Object() {
-        @Override
-        public String toString() {
-            return "foo";
-        }
-    };
-
-    //-----------------------------------------------------------------------
-    @Test
-    public void testAppendNewLine() {
-        StrBuilder sb = new StrBuilder("---");
-        sb.appendNewLine().append("+++");
-        assertEquals("---" + SEP + "+++", sb.toString());
-        
-        sb = new StrBuilder("---");
-        sb.setNewLineText("#").appendNewLine().setNewLineText(null).appendNewLine();
-        assertEquals("---#" + SEP, sb.toString());
-    }
-
-    //-----------------------------------------------------------------------
-    @Test
-    public void testAppendWithNullText() {
-        final StrBuilder sb = new StrBuilder();
-        sb.setNullText("NULL");
-        assertEquals("", sb.toString());
-
-        sb.appendNull();
-        assertEquals("NULL", sb.toString());
-
-        sb.append((Object) null);
-        assertEquals("NULLNULL", sb.toString());
-
-        sb.append(FOO);
-        assertEquals("NULLNULLfoo", sb.toString());
-
-        sb.append((String) null);
-        assertEquals("NULLNULLfooNULL", sb.toString());
-
-        sb.append("");
-        assertEquals("NULLNULLfooNULL", sb.toString());
-
-        sb.append("bar");
-        assertEquals("NULLNULLfooNULLbar", sb.toString());
-
-        sb.append((StringBuffer) null);
-        assertEquals("NULLNULLfooNULLbarNULL", sb.toString());
-
-        sb.append(new StringBuffer("baz"));
-        assertEquals("NULLNULLfooNULLbarNULLbaz", sb.toString());
-    }
-
-    //-----------------------------------------------------------------------
-    @Test
-    public void testAppend_Object() {
-        final StrBuilder sb = new StrBuilder();
-        sb.appendNull();
-        assertEquals("", sb.toString());
-
-        sb.append((Object) null);
-        assertEquals("", sb.toString());
-
-        sb.append(FOO);
-        assertEquals("foo", sb.toString());
-
-        sb.append((StringBuffer) null);
-        assertEquals("foo", sb.toString());
-
-        sb.append(new StringBuffer("baz"));
-        assertEquals("foobaz", sb.toString());
-
-        sb.append(new StrBuilder("yes"));
-        assertEquals("foobazyes", sb.toString());
-
-        sb.append((CharSequence) "Seq");
-        assertEquals("foobazyesSeq", sb.toString());
-
-        sb.append(new StringBuilder("bld")); // Check it supports StringBuilder
-        assertEquals("foobazyesSeqbld", sb.toString());
-    }
-    
-    //-----------------------------------------------------------------------
-    @Test
-    public void testAppend_StringBuilder() {
-        StrBuilder sb = new StrBuilder();
-        sb.setNullText("NULL").append((String) null);
-        assertEquals("NULL", sb.toString());
-
-        sb = new StrBuilder();
-        sb.append(new StringBuilder("foo"));
-        assertEquals("foo", sb.toString());
-
-        sb.append(new StringBuilder(""));
-        assertEquals("foo", sb.toString());
-
-        sb.append(new StringBuilder("bar"));
-        assertEquals("foobar", sb.toString());
-    }
-
-    //-----------------------------------------------------------------------
-    @Test
-    public void testAppend_String() {
-        StrBuilder sb = new StrBuilder();
-        sb.setNullText("NULL").append((String) null);
-        assertEquals("NULL", sb.toString());
-
-        sb = new StrBuilder();
-        sb.append("foo");
-        assertEquals("foo", sb.toString());
-
-        sb.append("");
-        assertEquals("foo", sb.toString());
-
-        sb.append("bar");
-        assertEquals("foobar", sb.toString());
-    }
-
-    //-----------------------------------------------------------------------
-    @Test
-    public void testAppend_String_int_int() {
-        StrBuilder sb = new StrBuilder();
-        sb.setNullText("NULL").append((String) null, 0, 1);
-        assertEquals("NULL", sb.toString());
-
-        sb = new StrBuilder();
-        sb.append("foo", 0, 3);
-        assertEquals("foo", sb.toString());
-
-        try {
-            sb.append("bar", -1, 1);
-            fail("append(char[], -1,) expected IndexOutOfBoundsException");
-        } catch (final IndexOutOfBoundsException e) {
-            // expected
-        }
-
-        try {
-            sb.append("bar", 3, 1);
-            fail("append(char[], 3,) expected IndexOutOfBoundsException");
-        } catch (final IndexOutOfBoundsException e) {
-            // expected
-        }
-
-        try {
-            sb.append("bar", 1, -1);
-            fail("append(char[],, -1) expected IndexOutOfBoundsException");
-        } catch (final IndexOutOfBoundsException e) {
-            // expected
-        }
-
-        try {
-            sb.append("bar", 1, 3);
-            fail("append(char[], 1, 3) expected IndexOutOfBoundsException");
-        } catch (final IndexOutOfBoundsException e) {
-            // expected
-        }
-
-        try {
-            sb.append("bar", -1, 3);
-            fail("append(char[], -1, 3) expected IndexOutOfBoundsException");
-        } catch (final IndexOutOfBoundsException e) {
-            // expected
-        }
-
-        try {
-            sb.append("bar", 4, 0);
-            fail("append(char[], 4, 0) expected IndexOutOfBoundsException");
-        } catch (final IndexOutOfBoundsException e) {
-            // expected
-        }
-
-        sb.append("bar", 3, 0);
-        assertEquals("foo", sb.toString());
-
-        sb.append("abcbardef", 3, 3);
-        assertEquals("foobar", sb.toString());
-
-        sb.append( (CharSequence)"abcbardef", 4, 3);
-        assertEquals("foobarard", sb.toString());
-    }
-    
-    //-----------------------------------------------------------------------
-    @Test
-    public void testAppend_StringBuilder_int_int() {
-        StrBuilder sb = new StrBuilder();
-        sb.setNullText("NULL").append((String) null, 0, 1);
-        assertEquals("NULL", sb.toString());
-
-        sb = new StrBuilder();
-        sb.append(new StringBuilder("foo"), 0, 3);
-        assertEquals("foo", sb.toString());
-
-        try {
-            sb.append(new StringBuilder("bar"), -1, 1);
-            fail("append(StringBuilder, -1,) expected IndexOutOfBoundsException");
-        } catch (final IndexOutOfBoundsException e) {
-            // expected
-        }
-
-        try {
-            sb.append(new StringBuilder("bar"), 3, 1);
-            fail("append(StringBuilder, 3,) expected IndexOutOfBoundsException");
-        } catch (final IndexOutOfBoundsException e) {
-            // expected
-        }
-
-        try {
-            sb.append(new StringBuilder("bar"), 1, -1);
-            fail("append(StringBuilder,, -1) expected IndexOutOfBoundsException");
-        } catch (final IndexOutOfBoundsException e) {
-            // expected
-        }
-
-        try {
-            sb.append(new StringBuilder("bar"), 1, 3);
-            fail("append(StringBuilder, 1, 3) expected IndexOutOfBoundsException");
-        } catch (final IndexOutOfBoundsException e) {
-            // expected
-        }
-
-        try {
-            sb.append(new StringBuilder("bar"), -1, 3);
-            fail("append(StringBuilder, -1, 3) expected IndexOutOfBoundsException");
-        } catch (final IndexOutOfBoundsException e) {
-            // expected
-        }
-
-        try {
-            sb.append(new StringBuilder("bar"), 4, 0);
-            fail("append(StringBuilder, 4, 0) expected IndexOutOfBoundsException");
-        } catch (final IndexOutOfBoundsException e) {
-            // expected
-        }
-
-        sb.append(new StringBuilder("bar"), 3, 0);
-        assertEquals("foo", sb.toString());
-
-        sb.append(new StringBuilder("abcbardef"), 3, 3);
-        assertEquals("foobar", sb.toString());
-
-        sb.append( new StringBuilder("abcbardef"), 4, 3);
-        assertEquals("foobarard", sb.toString());
-    }
-
-    //-----------------------------------------------------------------------
-    @Test
-    public void testAppend_StringBuffer() {
-        StrBuilder sb = new StrBuilder();
-        sb.setNullText("NULL").append((StringBuffer) null);
-        assertEquals("NULL", sb.toString());
-
-        sb = new StrBuilder();
-        sb.append(new StringBuffer("foo"));
-        assertEquals("foo", sb.toString());
-
-        sb.append(new StringBuffer(""));
-        assertEquals("foo", sb.toString());
-
-        sb.append(new StringBuffer("bar"));
-        assertEquals("foobar", sb.toString());
-    }
-
-    //-----------------------------------------------------------------------
-    @Test
-    public void testAppend_StringBuffer_int_int() {
-        StrBuilder sb = new StrBuilder();
-        sb.setNullText("NULL").append((StringBuffer) null, 0, 1);
-        assertEquals("NULL", sb.toString());
-
-        sb = new StrBuilder();
-        sb.append(new StringBuffer("foo"), 0, 3);
-        assertEquals("foo", sb.toString());
-
-        try {
-            sb.append(new StringBuffer("bar"), -1, 1);
-            fail("append(char[], -1,) expected IndexOutOfBoundsException");
-        } catch (final IndexOutOfBoundsException e) {
-            // expected
-        }
-
-        try {
-            sb.append(new StringBuffer("bar"), 3, 1);
-            fail("append(char[], 3,) expected IndexOutOfBoundsException");
-        } catch (final IndexOutOfBoundsException e) {
-            // expected
-        }
-
-        try {
-            sb.append(new StringBuffer("bar"), 1, -1);
-            fail("append(char[],, -1) expected IndexOutOfBoundsException");
-        } catch (final IndexOutOfBoundsException e) {
-            // expected
-        }
-
-        try {
-            sb.append(new StringBuffer("bar"), 1, 3);
-            fail("append(char[], 1, 3) expected IndexOutOfBoundsException");
-        } catch (final IndexOutOfBoundsException e) {
-            // expected
-        }
-
-        try {
-            sb.append(new StringBuffer("bar"), -1, 3);
-            fail("append(char[], -1, 3) expected IndexOutOfBoundsException");
-        } catch (final IndexOutOfBoundsException e) {
-            // expected
-        }
-
-        try {
-            sb.append(new StringBuffer("bar"), 4, 0);
-            fail("append(char[], 4, 0) expected IndexOutOfBoundsException");
-        } catch (final IndexOutOfBoundsException e) {
-            // expected
-        }
-
-        sb.append(new StringBuffer("bar"), 3, 0);
-        assertEquals("foo", sb.toString());
-
-        sb.append(new StringBuffer("abcbardef"), 3, 3);
-        assertEquals("foobar", sb.toString());
-    }
-
-    //-----------------------------------------------------------------------
-    @Test
-    public void testAppend_StrBuilder() {
-        StrBuilder sb = new StrBuilder();
-        sb.setNullText("NULL").append((StrBuilder) null);
-        assertEquals("NULL", sb.toString());
-
-        sb = new StrBuilder();
-        sb.append(new StrBuilder("foo"));
-        assertEquals("foo", sb.toString());
-
-        sb.append(new StrBuilder(""));
-        assertEquals("foo", sb.toString());
-
-        sb.append(new StrBuilder("bar"));
-        assertEquals("foobar", sb.toString());
-    }
-
-    //-----------------------------------------------------------------------
-    @Test
-    public void testAppend_StrBuilder_int_int() {
-        StrBuilder sb = new StrBuilder();
-        sb.setNullText("NULL").append((StrBuilder) null, 0, 1);
-        assertEquals("NULL", sb.toString());
-
-        sb = new StrBuilder();
-        sb.append(new StrBuilder("foo"), 0, 3);
-        assertEquals("foo", sb.toString());
-
-        try {
-            sb.append(new StrBuilder("bar"), -1, 1);
-            fail("append(char[], -1,) expected IndexOutOfBoundsException");
-        } catch (final IndexOutOfBoundsException e) {
-            // expected
-        }
-
-        try {
-            sb.append(new StrBuilder("bar"), 3, 1);
-            fail("append(char[], 3,) expected IndexOutOfBoundsException");
-        } catch (final IndexOutOfBoundsException e) {
-            // expected
-        }
-
-        try {
-            sb.append(new StrBuilder("bar"), 1, -1);
-            fail("append(char[],, -1) expected IndexOutOfBoundsException");
-        } catch (final IndexOutOfBoundsException e) {
-            // expected
-        }
-
-        try {
-            sb.append(new StrBuilder("bar"), 1, 3);
-            fail("append(char[], 1, 3) expected IndexOutOfBoundsException");
-        } catch (final IndexOutOfBoundsException e) {
-            // expected
-        }
-
-        try {
-            sb.append(new StrBuilder("bar"), -1, 3);
-            fail("append(char[], -1, 3) expected IndexOutOfBoundsException");
-        } catch (final IndexOutOfBoundsException e) {
-            // expected
-        }
-
-        try {
-            sb.append(new StrBuilder("bar"), 4, 0);
-            fail("append(char[], 4, 0) expected IndexOutOfBoundsException");
-        } catch (final IndexOutOfBoundsException e) {
-            // expected
-        }
-
-        sb.append(new StrBuilder("bar"), 3, 0);
-        assertEquals("foo", sb.toString());
-
-        sb.append(new StrBuilder("abcbardef"), 3, 3);
-        assertEquals("foobar", sb.toString());
-    }
-
-    //-----------------------------------------------------------------------
-    @Test
-    public void testAppend_CharArray() {
-        StrBuilder sb = new StrBuilder();
-        sb.setNullText("NULL").append((char[]) null);
-        assertEquals("NULL", sb.toString());
-
-        sb = new StrBuilder();
-        sb.append(new char[0]);
-        assertEquals("", sb.toString());
-
-        sb.append(new char[]{'f', 'o', 'o'});
-        assertEquals("foo", sb.toString());
-    }
-
-    //-----------------------------------------------------------------------
-    @Test
-    public void testAppend_CharArray_int_int() {
-        StrBuilder sb = new StrBuilder();
-        sb.setNullText("NULL").append((char[]) null, 0, 1);
-        assertEquals("NULL", sb.toString());
-
-        sb = new StrBuilder();
-        sb.append(new char[]{'f', 'o', 'o'}, 0, 3);
-        assertEquals("foo", sb.toString());
-
-        try {
-            sb.append(new char[]{'b', 'a', 'r'}, -1, 1);
-            fail("append(char[], -1,) expected IndexOutOfBoundsException");
-        } catch (final IndexOutOfBoundsException e) {
-            // expected
-        }
-
-        try {
-            sb.append(new char[]{'b', 'a', 'r'}, 3, 1);
-            fail("append(char[], 3,) expected IndexOutOfBoundsException");
-        } catch (final IndexOutOfBoundsException e) {
-            // expected
-        }
-
-        try {
-            sb.append(new char[]{'b', 'a', 'r'}, 1, -1);
-            fail("append(char[],, -1) expected IndexOutOfBoundsException");
-        } catch (final IndexOutOfBoundsException e) {
-            // expected
-        }
-
-        try {
-            sb.append(new char[]{'b', 'a', 'r'}, 1, 3);
-            fail("append(char[], 1, 3) expected IndexOutOfBoundsException");
-        } catch (final IndexOutOfBoundsException e) {
-            // expected
-        }
-
-        try {
-            sb.append(new char[]{'b', 'a', 'r'}, -1, 3);
-            fail("append(char[], -1, 3) expected IndexOutOfBoundsException");
-        } catch (final IndexOutOfBoundsException e) {
-            // expected
-        }
-
-        try {
-            sb.append(new char[]{'b', 'a', 'r'}, 4, 0);
-            fail("append(char[], 4, 0) expected IndexOutOfBoundsException");
-        } catch (final IndexOutOfBoundsException e) {
-            // expected
-        }
-
-        sb.append(new char[]{'b', 'a', 'r'}, 3, 0);
-        assertEquals("foo", sb.toString());
-
-        sb.append(new char[]{'a', 'b', 'c', 'b', 'a', 'r', 'd', 'e', 'f'}, 3, 3);
-        assertEquals("foobar", sb.toString());
-    }
-
-    //-----------------------------------------------------------------------
-    @Test
-    public void testAppend_Boolean() {
-        final StrBuilder sb = new StrBuilder();
-        sb.append(true);
-        assertEquals("true", sb.toString());
-
-        sb.append(false);
-        assertEquals("truefalse", sb.toString());
-
-        sb.append('!');
-        assertEquals("truefalse!", sb.toString());
-    }
-
-    //-----------------------------------------------------------------------
-    @Test
-    public void testAppend_PrimitiveNumber() {
-        final StrBuilder sb = new StrBuilder();
-        sb.append(0);
-        assertEquals("0", sb.toString());
-
-        sb.append(1L);
-        assertEquals("01", sb.toString());
-
-        sb.append(2.3f);
-        assertEquals("012.3", sb.toString());
-
-        sb.append(4.5d);
-        assertEquals("012.34.5", sb.toString());
-    }
-
-    //-----------------------------------------------------------------------
-    @Test
-    public void testAppendln_FormattedString() {
-        final int[] count = new int[2];
-        final StrBuilder sb = new StrBuilder() {
-            private static final long serialVersionUID = 1L;
-
-            @Override
-            public StrBuilder append(final String str) {
-                count[0]++;
-                return super.append(str);
-            }
-            @Override
-            public StrBuilder appendNewLine() {
-                count[1]++;
-                return super.appendNewLine();
-            }
-        };
-        sb.appendln("Hello %s", "Alice");
-        assertEquals("Hello Alice" + SEP, sb.toString());
-        assertEquals(2, count[0]);  // appendNewLine() calls append(String)
-        assertEquals(1, count[1]);
-    }
-
-    //-----------------------------------------------------------------------
-    @Test
-    public void testAppendln_Object() {
-        final StrBuilder sb = new StrBuilder();
-        sb.appendln((Object) null);
-        assertEquals("" + SEP, sb.toString());
-
-        sb.appendln(FOO);
-        assertEquals(SEP + "foo" + SEP, sb.toString());
-
-        sb.appendln(Integer.valueOf(6));
-        assertEquals(SEP + "foo" + SEP + "6" + SEP, sb.toString());
-    }
-
-    //-----------------------------------------------------------------------
-    @Test
-    public void testAppendln_String() {
-        final int[] count = new int[2];
-        final StrBuilder sb = new StrBuilder() {
-            private static final long serialVersionUID = 1L;
-
-            @Override
-            public StrBuilder append(final String str) {
-                count[0]++;
-                return super.append(str);
-            }
-            @Override
-            public StrBuilder appendNewLine() {
-                count[1]++;
-                return super.appendNewLine();
-            }
-        };
-        sb.appendln("foo");
-        assertEquals("foo" + SEP, sb.toString());
-        assertEquals(2, count[0]);  // appendNewLine() calls append(String)
-        assertEquals(1, count[1]);
-    }
-
-    //-----------------------------------------------------------------------
-    @Test
-    public void testAppendln_String_int_int() {
-        final int[] count = new int[2];
-        final StrBuilder sb = new StrBuilder() {
-            private static final long serialVersionUID = 1L;
-
-            @Override
-            public StrBuilder append(final String str, final int startIndex, final int length) {
-                count[0]++;
-                return super.append(str, startIndex, length);
-            }
-            @Override
-            public StrBuilder appendNewLine() {
-                count[1]++;
-                return super.appendNewLine();
-            }
-        };
-        sb.appendln("foo", 0, 3);
-        assertEquals("foo" + SEP, sb.toString());
-        assertEquals(1, count[0]);
-        assertEquals(1, count[1]);
-    }
-
-    //-----------------------------------------------------------------------
-    @Test
-    public void testAppendln_StringBuffer() {
-        final int[] count = new int[2];
-        final StrBuilder sb = new StrBuilder() {
-            private static final long serialVersionUID = 1L;
-
-            @Override
-            public StrBuilder append(final StringBuffer str) {
-                count[0]++;
-                return super.append(str);
-            }
-            @Override
-            public StrBuilder appendNewLine() {
-                count[1]++;
-                return super.appendNewLine();
-            }
-        };
-        sb.appendln(new StringBuffer("foo"));
-        assertEquals("foo" + SEP, sb.toString());
-        assertEquals(1, count[0]);
-        assertEquals(1, count[1]);
-    }
-
-    //-----------------------------------------------------------------------
-    @Test
-    public void testAppendln_StringBuilder() {
-        final int[] count = new int[2];
-        final StrBuilder sb = new StrBuilder() {
-            private static final long serialVersionUID = 1L;
-
-            @Override
-            public StrBuilder append(final StringBuilder str) {
-                count[0]++;
-                return super.append(str);
-            }
-            @Override
-            public StrBuilder appendNewLine() {
-                count[1]++;
-                return super.appendNewLine();
-            }
-        };
-        sb.appendln(new StringBuilder("foo"));
-        assertEquals("foo" + SEP, sb.toString());
-        assertEquals(1, count[0]);
-        assertEquals(1, count[1]);
-    }
-
-    //-----------------------------------------------------------------------
-    @Test
-    public void testAppendln_StringBuffer_int_int() {
-        final int[] count = new int[2];
-        final StrBuilder sb = new StrBuilder() {
-            private static final long serialVersionUID = 1L;
-
-            @Override
-            public StrBuilder append(final StringBuffer str, final int startIndex, final int length) {
-                count[0]++;
-                return super.append(str, startIndex, length);
-            }
-            @Override
-            public StrBuilder appendNewLine() {
-                count[1]++;
-                return super.appendNewLine();
-            }
-        };
-        sb.appendln(new StringBuffer("foo"), 0, 3);
-        assertEquals("foo" + SEP, sb.toString());
-        assertEquals(1, count[0]);
-        assertEquals(1, count[1]);
-    }
-
-    //-----------------------------------------------------------------------
-    @Test
-    public void testAppendln_StringBuilder_int_int() {
-        final int[] count = new int[2];
-        final StrBuilder sb = new StrBuilder() {
-            private static final long serialVersionUID = 1L;
-
-            @Override
-            public StrBuilder append(final StringBuilder str, final int startIndex, final int length) {
-                count[0]++;
-                return super.append(str, startIndex, length);
-            }
-            @Override
-            public StrBuilder appendNewLine() {
-                count[1]++;
-                return super.appendNewLine();
-            }
-        };
-        sb.appendln(new StringBuilder("foo"), 0, 3);
-        assertEquals("foo" + SEP, sb.toString());
-        assertEquals(1, count[0]);
-        assertEquals(1, count[1]);
-    }
-
-    //-----------------------------------------------------------------------
-    @Test
-    public void testAppendln_StrBuilder() {
-        final int[] count = new int[2];
-        final StrBuilder sb = new StrBuilder() {
-            private static final long serialVersionUID = 1L;
-
-            @Override
-            public StrBuilder append(final StrBuilder str) {
-                count[0]++;
-                return super.append(str);
-            }
-            @Override
-            public StrBuilder appendNewLine() {
-                count[1]++;
-                return super.appendNewLine();
-            }
-        };
-        sb.appendln(new StrBuilder("foo"));
-        assertEquals("foo" + SEP, sb.toString());
-        assertEquals(1, count[0]);
-        assertEquals(1, count[1]);
-    }
-
-    //-----------------------------------------------------------------------
-    @Test
-    public void testAppendln_StrBuilder_int_int() {
-        final int[] count = new int[2];
-        final StrBuilder sb = new StrBuilder() {
-            private static final long serialVersionUID = 1L;
-
-            @Override
-            public StrBuilder append(final StrBuilder str, final int startIndex, final int length) {
-                count[0]++;
-                return super.append(str, startIndex, length);
-            }
-            @Override
-            public StrBuilder appendNewLine() {
-                count[1]++;
-                return super.appendNewLine();
-            }
-        };
-        sb.appendln(new StrBuilder("foo"), 0, 3);
-        assertEquals("foo" + SEP, sb.toString());
-        assertEquals(1, count[0]);
-        assertEquals(1, count[1]);
-    }
-
-    //-----------------------------------------------------------------------
-    @Test
-    public void testAppendln_CharArray() {
-        final int[] count = new int[2];
-        final StrBuilder sb = new StrBuilder() {
-            private static final long serialVersionUID = 1L;
-
-            @Override
-            public StrBuilder append(final char[] str) {
-                count[0]++;
-                return super.append(str);
-            }
-            @Override
-            public StrBuilder appendNewLine() {
-                count[1]++;
-                return super.appendNewLine();
-            }
-        };
-        sb.appendln("foo".toCharArray());
-        assertEquals("foo" + SEP, sb.toString());
-        assertEquals(1, count[0]);
-        assertEquals(1, count[1]);
-    }
-
-    //-----------------------------------------------------------------------
-    @Test
-    public void testAppendln_CharArray_int_int() {
-        final int[] count = new int[2];
-        final StrBuilder sb = new StrBuilder() {
-            private static final long serialVersionUID = 1L;
-
-            @Override
-            public StrBuilder append(final char[] str, final int startIndex, final int length) {
-                count[0]++;
-                return super.append(str, startIndex, length);
-            }
-            @Override
-            public StrBuilder appendNewLine() {
-                count[1]++;
-                return super.appendNewLine();
-            }
-        };
-        sb.appendln("foo".toCharArray(), 0, 3);
-        assertEquals("foo" + SEP, sb.toString());
-        assertEquals(1, count[0]);
-        assertEquals(1, count[1]);
-    }
-
-    //-----------------------------------------------------------------------
-    @Test
-    public void testAppendln_Boolean() {
-        final StrBuilder sb = new StrBuilder();
-        sb.appendln(true);
-        assertEquals("true" + SEP, sb.toString());
-        
-        sb.clear();
-        sb.appendln(false);
-        assertEquals("false" + SEP, sb.toString());
-    }
-
-    //-----------------------------------------------------------------------
-    @Test
-    public void testAppendln_PrimitiveNumber() {
-        final StrBuilder sb = new StrBuilder();
-        sb.appendln(0);
-        assertEquals("0" + SEP, sb.toString());
-        
-        sb.clear();
-        sb.appendln(1L);
-        assertEquals("1" + SEP, sb.toString());
-        
-        sb.clear();
-        sb.appendln(2.3f);
-        assertEquals("2.3" + SEP, sb.toString());
-        
-        sb.clear();
-        sb.appendln(4.5d);
-        assertEquals("4.5" + SEP, sb.toString());
-    }
-
-    //-----------------------------------------------------------------------
-    @Test
-    public void testAppendPadding() {
-        final StrBuilder sb = new StrBuilder();
-        sb.append("foo");
-        assertEquals("foo", sb.toString());
-
-        sb.appendPadding(-1, '-');
-        assertEquals("foo", sb.toString());
-
-        sb.appendPadding(0, '-');
-        assertEquals("foo", sb.toString());
-
-        sb.appendPadding(1, '-');
-        assertEquals("foo-", sb.toString());
-
-        sb.appendPadding(16, '-');
-        assertEquals(20, sb.length());
-        //            12345678901234567890
-        assertEquals("foo-----------------", sb.toString());
-    }
-
-    //-----------------------------------------------------------------------
-    @Test
-    public void testAppendFixedWidthPadLeft() {
-        final StrBuilder sb = new StrBuilder();
-        sb.appendFixedWidthPadLeft("foo", -1, '-');
-        assertEquals("", sb.toString());
-
-        sb.clear();
-        sb.appendFixedWidthPadLeft("foo", 0, '-');
-        assertEquals("", sb.toString());
-
-        sb.clear();
-        sb.appendFixedWidthPadLeft("foo", 1, '-');
-        assertEquals("o", sb.toString());
-
-        sb.clear();
-        sb.appendFixedWidthPadLeft("foo", 2, '-');
-        assertEquals("oo", sb.toString());
-
-        sb.clear();
-        sb.appendFixedWidthPadLeft("foo", 3, '-');
-        assertEquals("foo", sb.toString());
-
-        sb.clear();
-        sb.appendFixedWidthPadLeft("foo", 4, '-');
-        assertEquals("-foo", sb.toString());
-
-        sb.clear();
-        sb.appendFixedWidthPadLeft("foo", 10, '-');
-        assertEquals(10, sb.length());
-        //            1234567890
-        assertEquals("-------foo", sb.toString());
-
-        sb.clear();
-        sb.setNullText("null");
-        sb.appendFixedWidthPadLeft(null, 5, '-');
-        assertEquals("-null", sb.toString());
-    }
-
-    //-----------------------------------------------------------------------
-    @Test
-    public void testAppendFixedWidthPadLeft_int() {
-        final StrBuilder sb = new StrBuilder();
-        sb.appendFixedWidthPadLeft(123, -1, '-');
-        assertEquals("", sb.toString());
-
-        sb.clear();
-        sb.appendFixedWidthPadLeft(123, 0, '-');
-        assertEquals("", sb.toString());
-
-        sb.clear();
-        sb.appendFixedWidthPadLeft(123, 1, '-');
-        assertEquals("3", sb.toString());
-
-        sb.clear();
-        sb.appendFixedWidthPadLeft(123, 2, '-');
-        assertEquals("23", sb.toString());
-
-        sb.clear();
-        sb.appendFixedWidthPadLeft(123, 3, '-');
-        assertEquals("123", sb.toString());
-
-        sb.clear();
-        sb.appendFixedWidthPadLeft(123, 4, '-');
-        assertEquals("-123", sb.toString());
-
-        sb.clear();
-        sb.appendFixedWidthPadLeft(123, 10, '-');
-        assertEquals(10, sb.length());
-        //            1234567890
-        assertEquals("-------123", sb.toString());
-    }
-
-    //-----------------------------------------------------------------------
-    @Test
-    public void testAppendFixedWidthPadRight() {
-        final StrBuilder sb = new StrBuilder();
-        sb.appendFixedWidthPadRight("foo", -1, '-');
-        assertEquals("", sb.toString());
-
-        sb.clear();
-        sb.appendFixedWidthPadRight("foo", 0, '-');
-        assertEquals("", sb.toString());
-
-        sb.clear();
-        sb.appendFixedWidthPadRight("foo", 1, '-');
-        assertEquals("f", sb.toString());
-
-        sb.clear();
-        sb.appendFixedWidthPadRight("foo", 2, '-');
-        assertEquals("fo", sb.toString());
-
-        sb.clear();
-        sb.appendFixedWidthPadRight("foo", 3, '-');
-        assertEquals("foo", sb.toString());
-
-        sb.clear();
-        sb.appendFixedWidthPadRight("foo", 4, '-');
-        assertEquals("foo-", sb.toString());
-
-        sb.clear();
-        sb.appendFixedWidthPadRight("foo", 10, '-');
-        assertEquals(10, sb.length());
-        //            1234567890
-        assertEquals("foo-------", sb.toString());
-
-        sb.clear();
-        sb.setNullText("null");
-        sb.appendFixedWidthPadRight(null, 5, '-');
-        assertEquals("null-", sb.toString());
-    }
-
-    // See: http://issues.apache.org/jira/browse/LANG-299
-    @Test
-    public void testLang299() {
-        final StrBuilder sb = new StrBuilder(1);
-        sb.appendFixedWidthPadRight("foo", 1, '-');
-        assertEquals("f", sb.toString());
-    }
-
-    //-----------------------------------------------------------------------
-    @Test
-    public void testAppendFixedWidthPadRight_int() {
-        final StrBuilder sb = new StrBuilder();
-        sb.appendFixedWidthPadRight(123, -1, '-');
-        assertEquals("", sb.toString());
-
-        sb.clear();
-        sb.appendFixedWidthPadRight(123, 0, '-');
-        assertEquals("", sb.toString());
-
-        sb.clear();
-        sb.appendFixedWidthPadRight(123, 1, '-');
-        assertEquals("1", sb.toString());
-
-        sb.clear();
-        sb.appendFixedWidthPadRight(123, 2, '-');
-        assertEquals("12", sb.toString());
-
-        sb.clear();
-        sb.appendFixedWidthPadRight(123, 3, '-');
-        assertEquals("123", sb.toString());
-
-        sb.clear();
-        sb.appendFixedWidthPadRight(123, 4, '-');
-        assertEquals("123-", sb.toString());
-
-        sb.clear();
-        sb.appendFixedWidthPadRight(123, 10, '-');
-        assertEquals(10, sb.length());
-        //            1234567890
-        assertEquals("123-------", sb.toString());
-    }
-
-    //-----------------------------------------------------------------------
-    @Test
-    public void testAppend_FormattedString() {
-        StrBuilder sb;
-
-        sb = new StrBuilder();
-        sb.append("Hi", (Object[]) null);
-        assertEquals("Hi", sb.toString());
-
-        sb = new StrBuilder();
-        sb.append("Hi", "Alice");
-        assertEquals("Hi", sb.toString());
-
-        sb = new StrBuilder();
-        sb.append("Hi %s", "Alice");
-        assertEquals("Hi Alice", sb.toString());
-
-        sb = new StrBuilder();
-        sb.append("Hi %s %,d", "Alice", 5000);
-        // group separator depends on system locale
-        final char groupingSeparator = DecimalFormatSymbols.getInstance().getGroupingSeparator();
-        final String expected = "Hi Alice 5" + groupingSeparator + "000";
-        assertEquals(expected, sb.toString());
-    }
-
-    //-----------------------------------------------------------------------
-    @Test
-    public void testAppendAll_Array() {
-        final StrBuilder sb = new StrBuilder();
-        sb.appendAll((Object[]) null);
-        assertEquals("", sb.toString());
-
-        sb.clear();
-        sb.appendAll(new Object[0]);
-        assertEquals("", sb.toString());
-
-        sb.clear();
-        sb.appendAll(new Object[]{"foo", "bar", "baz"});
-        assertEquals("foobarbaz", sb.toString());
-
-        sb.clear();
-        sb.appendAll("foo", "bar", "baz");
-        assertEquals("foobarbaz", sb.toString());
-    }
-
-    //-----------------------------------------------------------------------
-    @Test
-    public void testAppendAll_Collection() {
-        final StrBuilder sb = new StrBuilder();
-        sb.appendAll((Collection<?>) null);
-        assertEquals("", sb.toString());
-
-        sb.clear();
-        sb.appendAll(Collections.EMPTY_LIST);
-        assertEquals("", sb.toString());
-
-        sb.clear();
-        sb.appendAll(Arrays.asList(new Object[]{"foo", "bar", "baz"}));
-        assertEquals("foobarbaz", sb.toString());
-    }
-
-    //-----------------------------------------------------------------------
-    @Test
-    public void testAppendAll_Iterator() {
-        final StrBuilder sb = new StrBuilder();
-        sb.appendAll((Iterator<?>) null);
-        assertEquals("", sb.toString());
-
-        sb.clear();
-        sb.appendAll(Collections.EMPTY_LIST.iterator());
-        assertEquals("", sb.toString());
-
-        sb.clear();
-        sb.appendAll(Arrays.asList(new Object[]{"foo", "bar", "baz"}).iterator());
-        assertEquals("foobarbaz", sb.toString());
-    }
-
-    //-----------------------------------------------------------------------
-    @Test
-    public void testAppendWithSeparators_Array() {
-        final StrBuilder sb = new StrBuilder();
-        sb.appendWithSeparators((Object[]) null, ",");
-        assertEquals("", sb.toString());
-
-        sb.clear();
-        sb.appendWithSeparators(new Object[0], ",");
-        assertEquals("", sb.toString());
-
-        sb.clear();
-        sb.appendWithSeparators(new Object[]{"foo", "bar", "baz"}, ",");
-        assertEquals("foo,bar,baz", sb.toString());
-
-        sb.clear();
-        sb.appendWithSeparators(new Object[]{"foo", "bar", "baz"}, null);
-        assertEquals("foobarbaz", sb.toString());
-
-        sb.clear();
-        sb.appendWithSeparators(new Object[]{"foo", null, "baz"}, ",");
-        assertEquals("foo,,baz", sb.toString());
-    }
-
-    //-----------------------------------------------------------------------
-    @Test
-    public void testAppendWithSeparators_Collection() {
-        final StrBuilder sb = new StrBuilder();
-        sb.appendWithSeparators((Collection<?>) null, ",");
-        assertEquals("", sb.toString());
-
-        sb.clear();
-        sb.appendWithSeparators(Collections.EMPTY_LIST, ",");
-        assertEquals("", sb.toString());
-
-        sb.clear();
-        sb.appendWithSeparators(Arrays.asList(new Object[]{"foo", "bar", "baz"}), ",");
-        assertEquals("foo,bar,baz", sb.toString());
-
-        sb.clear();
-        sb.appendWithSeparators(Arrays.asList(new Object[]{"foo", "bar", "baz"}), null);
-        assertEquals("foobarbaz", sb.toString());
-
-        sb.clear();
-        sb.appendWithSeparators(Arrays.asList(new Object[]{"foo", null, "baz"}), ",");
-        assertEquals("foo,,baz", sb.toString());
-    }
-
-    //-----------------------------------------------------------------------
-    @Test
-    public void testAppendWithSeparators_Iterator() {
-        final StrBuilder sb = new StrBuilder();
-        sb.appendWithSeparators((Iterator<?>) null, ",");
-        assertEquals("", sb.toString());
-
-        sb.clear();
-        sb.appendWithSeparators(Collections.EMPTY_LIST.iterator(), ",");
-        assertEquals("", sb.toString());
-
-        sb.clear();
-        sb.appendWithSeparators(Arrays.asList(new Object[]{"foo", "bar", "baz"}).iterator(), ",");
-        assertEquals("foo,bar,baz", sb.toString());
-
-        sb.clear();
-        sb.appendWithSeparators(Arrays.asList(new Object[]{"foo", "bar", "baz"}).iterator(), null);
-        assertEquals("foobarbaz", sb.toString());
-
-        sb.clear();
-        sb.appendWithSeparators(Arrays.asList(new Object[]{"foo", null, "baz"}).iterator(), ",");
-        assertEquals("foo,,baz", sb.toString());
-    }
-
-    //-----------------------------------------------------------------------
-    @Test
-    public void testAppendWithSeparatorsWithNullText() {
-        final StrBuilder sb = new StrBuilder();
-        sb.setNullText("null");
-        sb.appendWithSeparators(new Object[]{"foo", null, "baz"}, ",");
-        assertEquals("foo,null,baz", sb.toString());
-
-        sb.clear();
-        sb.appendWithSeparators(Arrays.asList(new Object[]{"foo", null, "baz"}), ",");
-        assertEquals("foo,null,baz", sb.toString());
-    }
-
-    //-----------------------------------------------------------------------
-    @Test
-    public void testAppendSeparator_String() {
-        final StrBuilder sb = new StrBuilder();
-        sb.appendSeparator(",");  // no effect
-        assertEquals("", sb.toString());
-        sb.append("foo");
-        assertEquals("foo", sb.toString());
-        sb.appendSeparator(",");
-        assertEquals("foo,", sb.toString());
-    }
-    
-    //-----------------------------------------------------------------------
-    @Test
-    public void testAppendSeparator_String_String() {
-        final StrBuilder sb = new StrBuilder();
-        final String startSeparator = "order by ";
-        final String standardSeparator = ",";
-        final String foo = "foo";
-        sb.appendSeparator(null, null);
-        assertEquals("", sb.toString());
-        sb.appendSeparator(standardSeparator, null);
-        assertEquals("", sb.toString());
-        sb.appendSeparator(standardSeparator, startSeparator); 
-        assertEquals(startSeparator, sb.toString());
-        sb.appendSeparator(null, null); 
-        assertEquals(startSeparator, sb.toString());
-        sb.appendSeparator(null, startSeparator); 
-        assertEquals(startSeparator, sb.toString());
-        sb.append(foo);
-        assertEquals(startSeparator + foo, sb.toString());
-        sb.appendSeparator(standardSeparator, startSeparator);
-        assertEquals(startSeparator + foo + standardSeparator, sb.toString());
-    }
-
-    //-----------------------------------------------------------------------
-    @Test
-    public void testAppendSeparator_char() {
-        final StrBuilder sb = new StrBuilder();
-        sb.appendSeparator(',');  // no effect
-        assertEquals("", sb.toString());
-        sb.append("foo");
-        assertEquals("foo", sb.toString());
-        sb.appendSeparator(',');
-        assertEquals("foo,", sb.toString());
-    }
-    @Test
-    public void testAppendSeparator_char_char() {
-        final StrBuilder sb = new StrBuilder();
-        final char startSeparator = ':';
-        final char standardSeparator = ',';
-        final String foo = "foo";
-        sb.appendSeparator(standardSeparator, startSeparator);  // no effect
-        assertEquals(String.valueOf(startSeparator), sb.toString());
-        sb.append(foo);
-        assertEquals(String.valueOf(startSeparator) + foo, sb.toString());
-        sb.appendSeparator(standardSeparator, startSeparator);
-        assertEquals(String.valueOf(startSeparator) + foo + standardSeparator, sb.toString());
-    }
-
-    //-----------------------------------------------------------------------
-    @Test
-    public void testAppendSeparator_String_int() {
-        final StrBuilder sb = new StrBuilder();
-        sb.appendSeparator(",", 0);  // no effect
-        assertEquals("", sb.toString());
-        sb.append("foo");
-        assertEquals("foo", sb.toString());
-        sb.appendSeparator(",", 1);
-        assertEquals("foo,", sb.toString());
-        
-        sb.appendSeparator(",", -1);  // no effect
-        assertEquals("foo,", sb.toString());
-    }
-
-    //-----------------------------------------------------------------------
-    @Test
-    public void testAppendSeparator_char_int() {
-        final StrBuilder sb = new StrBuilder();
-        sb.appendSeparator(',', 0);  // no effect
-        assertEquals("", sb.toString());
-        sb.append("foo");
-        assertEquals("foo", sb.toString());
-        sb.appendSeparator(',', 1);
-        assertEquals("foo,", sb.toString());
-        
-        sb.appendSeparator(',', -1);  // no effect
-        assertEquals("foo,", sb.toString());
-    }
-
-    //-----------------------------------------------------------------------
-    @Test
-    public void testInsert() {
-
-        final StrBuilder sb = new StrBuilder();
-        sb.append("barbaz");
-        assertEquals("barbaz", sb.toString());
-
-        try {
-            sb.insert(-1, FOO);
-            fail("insert(-1, Object) expected StringIndexOutOfBoundsException");
-        } catch (final IndexOutOfBoundsException e) {
-            // expected
-        }
-
-        try {
-            sb.insert(7, FOO);
-            fail("insert(7, Object) expected StringIndexOutOfBoundsException");
-        } catch (final IndexOutOfBoundsException e) {
-            // expected
-        }
-
-        sb.insert(0, (Object) null);
-        assertEquals("barbaz", sb.toString());
-
-        sb.insert(0, FOO);
-        assertEquals("foobarbaz", sb.toString());
-
-        sb.clear();
-        sb.append("barbaz");
-        assertEquals("barbaz", sb.toString());
-
-        try {
-            sb.insert(-1, "foo");
-            fail("insert(-1, String) expected StringIndexOutOfBoundsException");
-        } catch (final IndexOutOfBoundsException e) {
-            // expected
-        }
-
-        try {
-            sb.insert(7, "foo");
-            fail("insert(7, String) expected StringIndexOutOfBoundsException");
-        } catch (final IndexOutOfBoundsException e) {
-            // expected
-        }
-
-        sb.insert(0, (String) null);
-        assertEquals("barbaz", sb.toString());
-
-        sb.insert(0, "foo");
-        assertEquals("foobarbaz", sb.toString());
-
-        sb.clear();
-        sb.append("barbaz");
-        assertEquals("barbaz", sb.toString());
-
-        try {
-            sb.insert(-1, new char[]{'f', 'o', 'o'});
-            fail("insert(-1, char[]) expected StringIndexOutOfBoundsException");
-        } catch (final IndexOutOfBoundsException e) {
-            // expected
-        }
-
-        try {
-            sb.insert(7, new char[]{'f', 'o', 'o'});
-            fail("insert(7, char[]) expected StringIndexOutOfBoundsException");
-        } catch (final IndexOutOfBoundsException e) {
-            // expected
-        }
-
-        sb.insert(0, (char[]) null);
-        assertEquals("barbaz", sb.toString());
-
-        sb.insert(0, new char[0]);
-        assertEquals("barbaz", sb.toString());
-
-        sb.insert(0, new char[]{'f', 'o', 'o'});
-        assertEquals("foobarbaz", sb.toString());
-
-        sb.clear();
-        sb.append("barbaz");
-        assertEquals("barbaz", sb.toString());
-
-        try {
-            sb.insert(-1, new char[]{'a', 'b', 'c', 'f', 'o', 'o', 'd', 'e', 'f'}, 3, 3);
-            fail("insert(-1, char[], 3, 3) expected StringIndexOutOfBoundsException");
-        } catch (final IndexOutOfBoundsException e) {
-            // expected
-        }
-
-        try {
-            sb.insert(7, new char[]{'a', 'b', 'c', 'f', 'o', 'o', 'd', 'e', 'f'}, 3, 3);
-            fail("insert(7, char[], 3, 3) expected StringIndexOutOfBoundsException");
-        } catch (final IndexOutOfBoundsException e) {
-            // expected
-        }
-
-        sb.insert(0, (char[]) null, 0, 0);
-        assertEquals("barbaz", sb.toString());
-
-        sb.insert(0, new char[0], 0, 0);
-        assertEquals("barbaz", sb.toString());
-
-        try {
-            sb.insert(0, new char[]{'a', 'b', 'c', 'f', 'o', 'o', 'd', 'e', 'f'}, -1, 3);
-            fail("insert(0, char[], -1, 3) expected StringIndexOutOfBoundsException");
-        } catch (final IndexOutOfBoundsException e) {
-            // expected
-        }
-
-        try {
-            sb.insert(0, new char[]{'a', 'b', 'c', 'f', 'o', 'o', 'd', 'e', 'f'}, 10, 3);
-            fail("insert(0, char[], 10, 3) expected StringIndexOutOfBoundsException");
-        } catch (final IndexOutOfBoundsException e) {
-            // expected
-        }
-
-        try {
-            sb.insert(0, new char[]{'a', 'b', 'c', 'f', 'o', 'o', 'd', 'e', 'f'}, 0, -1);
-            fail("insert(0, char[], 0, -1) expected StringIndexOutOfBoundsException");
-        } catch (final IndexOutOfBoundsException e) {
-            // expected
-        }
-
-        try {
-            sb.insert(0, new char[]{'a', 'b', 'c', 'f', 'o', 'o', 'd', 'e', 'f'}, 0, 10);
-            fail("insert(0, char[], 0, 10) expected StringIndexOutOfBoundsException");
-        } catch (final IndexOutOfBoundsException e) {
-            // expected
-        }
-
-        sb.insert(0, new char[]{'a', 'b', 'c', 'f', 'o', 'o', 'd', 'e', 'f'}, 0, 0);
-        assertEquals("barbaz", sb.toString());
-
-        sb.insert(0, new char[]{'a', 'b', 'c', 'f', 'o', 'o', 'd', 'e', 'f'}, 3, 3);
-        assertEquals("foobarbaz", sb.toString());
-
-        sb.clear();
-        sb.append("barbaz");
-        assertEquals("barbaz", sb.toString());
-
-        try {
-            sb.insert(-1, true);
-            fail("insert(-1, boolean) expected StringIndexOutOfBoundsException");
-        } catch (final IndexOutOfBoundsException e) {
-            // expected
-        }
-
-        try {
-            sb.insert(7, true);
-            fail("insert(7, boolean) expected StringIndexOutOfBoundsException");
-        } catch (final IndexOutOfBoundsException e) {
-            // expected
-        }
-
-        sb.insert(0, true);
-        assertEquals("truebarbaz", sb.toString());
-
-        sb.insert(0, false);
-        assertEquals("falsetruebarbaz", sb.toString());
-
-        sb.clear();
-        sb.append("barbaz");
-        assertEquals("barbaz", sb.toString());
-
-        try {
-            sb.insert(-1, '!');
-            fail("insert(-1, char) expected StringIndexOutOfBoundsException");
-        } catch (final IndexOutOfBoundsException e) {
-            // expected
-        }
-
-        try {
-            sb.insert(7, '!');
-            fail("insert(7, char) expected StringIndexOutOfBoundsException");
-        } catch (final IndexOutOfBoundsException e) {
-            // expected
-        }
-
-        sb.insert(0, '!');
-        assertEquals("!barbaz", sb.toString());
-
-        sb.clear();
-        sb.append("barbaz");
-        assertEquals("barbaz", sb.toString());
-
-        try {
-            sb.insert(-1, 0);
-            fail("insert(-1, int) expected StringIndexOutOfBoundsException");
-        } catch (final IndexOutOfBoundsException e) {
-            // expected
-        }
-
-        try {
-            sb.insert(7, 0);
-            fail("insert(7, int) expected StringIndexOutOfBoundsException");
-        } catch (final IndexOutOfBoundsException e) {
-            // expected
-        }
-
-        sb.insert(0, '0');
-        assertEquals("0barbaz", sb.toString());
-
-        sb.clear();
-        sb.append("barbaz");
-        assertEquals("barbaz", sb.toString());
-
-        try {
-            sb.insert(-1, 1L);
-            fail("insert(-1, long) expected StringIndexOutOfBoundsException");
-        } catch (final IndexOutOfBoundsException e) {
-            // expected
-        }
-
-        try {
-            sb.insert(7, 1L);
-            fail("insert(7, long) expected StringIndexOutOfBoundsException");
-        } catch (final IndexOutOfBoundsException e) {
-            // expected
-        }
-
-        sb.insert(0, 1L);
-        assertEquals("1barbaz", sb.toString());
-
-        sb.clear();
-        sb.append("barbaz");
-        assertEquals("barbaz", sb.toString());
-
-        try {
-            sb.insert(-1, 2.3F);
-            fail("insert(-1, float) expected StringIndexOutOfBoundsException");
-        } catch (final IndexOutOfBoundsException e) {
-            // expected
-        }
-
-        try {
-            sb.insert(7, 2.3F);
-            fail("insert(7, float) expected StringIndexOutOfBoundsException");
-        } catch (final IndexOutOfBoundsException e) {
-            // expected
-        }
-
-        sb.insert(0, 2.3F);
-        assertEquals("2.3barbaz", sb.toString());
-
-        sb.clear();
-        sb.append("barbaz");
-        assertEquals("barbaz", sb.toString());
-
-        try {
-            sb.insert(-1, 4.5D);
-            fail("insert(-1, double) expected StringIndexOutOfBoundsException");
-        } catch (final IndexOutOfBoundsException e) {
-            // expected
-        }
-
-        try {
-            sb.insert(7, 4.5D);
-            fail("insert(7, double) expected StringIndexOutOfBoundsException");
-        } catch (final IndexOutOfBoundsException e) {
-            // expected
-        }
-
-        sb.insert(0, 4.5D);
-        assertEquals("4.5barbaz", sb.toString());
-    }
-
-    //-----------------------------------------------------------------------
-    @Test
-    public void testInsertWithNullText() {
-        final StrBuilder sb = new StrBuilder();
-        sb.setNullText("null");
-        sb.append("barbaz");
-        assertEquals("barbaz", sb.toString());
-
-        try {
-            sb.insert(-1, FOO);
-            fail("insert(-1, Object) expected StringIndexOutOfBoundsException");
-        } catch (final IndexOutOfBoundsException e) {
-            // expected
-        }
-
-        try {
-            sb.insert(7, FOO);
-            fail("insert(7, Object) expected StringIndexOutOfBoundsException");
-        } catch (final IndexOutOfBoundsException e) {
-            // expected
-        }
-
-        sb.insert(0, (Object) null);
-        assertEquals("nullbarbaz", sb.toString());
-
-        sb.insert(0, FOO);
-        assertEquals("foonullbarbaz", sb.toString());
-
-        sb.clear();
-        sb.append("barbaz");
-        assertEquals("barbaz", sb.toString());
-
-        try {
-            sb.insert(-1, "foo");
-            fail("insert(-1, String) expected StringIndexOutOfBoundsException");
-        } catch (final IndexOutOfBoundsException e) {
-            // expected
-        }
-
-        try {
-            sb.insert(7, "foo");
-            fail("insert(7, String) expected StringIndexOutOfBoundsException");
-        } catch (final IndexOutOfBoundsException e) {
-            // expected
-        }
-
-        sb.insert(0, (String) null);
-        assertEquals("nullbarbaz", sb.toString());
-
-        sb.insert(0, "foo");
-        assertEquals("foonullbarbaz", sb.toString());
-
-        sb.insert(0, (char[]) null);
-        assertEquals("nullfoonullbarbaz", sb.toString());
-
-        sb.insert(0, (char[]) null, 0, 0);
-        assertEquals("nullnullfoonullbarbaz", sb.toString());
-    }
-}
diff --git a/lang/src/test/java/org/apache/commons/lang3/text/StrBuilderTest.java b/lang/src/test/java/org/apache/commons/lang3/text/StrBuilderTest.java
deleted file mode 100644
index 2da4cf1..0000000
--- a/lang/src/test/java/org/apache/commons/lang3/text/StrBuilderTest.java
+++ /dev/null
@@ -1,2000 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- * 
- *      http://www.apache.org/licenses/LICENSE-2.0
- * 
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package org.apache.commons.lang3.text;
-
-import org.junit.Test;
-import static org.junit.Assert.*;
-
-import java.io.IOException;
-import java.io.Reader;
-import java.io.StringReader;
-import java.io.StringWriter;
-import java.io.Writer;
-import java.nio.CharBuffer;
-import java.util.Arrays;
-
-import org.apache.commons.lang3.ArrayUtils;
-
-/**
- * Unit tests for {@link org.apache.commons.lang3.text.StrBuilder}.
- * 
- * @version $Id$
- */
-public class StrBuilderTest {
-
-    //-----------------------------------------------------------------------
-    @Test
-    public void testConstructors() {
-        final StrBuilder sb0 = new StrBuilder();
-        assertEquals(32, sb0.capacity());
-        assertEquals(0, sb0.length());
-        assertEquals(0, sb0.size());
-
-        final StrBuilder sb1 = new StrBuilder(32);
-        assertEquals(32, sb1.capacity());
-        assertEquals(0, sb1.length());
-        assertEquals(0, sb1.size());
-
-        final StrBuilder sb2 = new StrBuilder(0);
-        assertEquals(32, sb2.capacity());
-        assertEquals(0, sb2.length());
-        assertEquals(0, sb2.size());
-
-        final StrBuilder sb3 = new StrBuilder(-1);
-        assertEquals(32, sb3.capacity());
-        assertEquals(0, sb3.length());
-        assertEquals(0, sb3.size());
-
-        final StrBuilder sb4 = new StrBuilder(1);
-        assertEquals(1, sb4.capacity());
-        assertEquals(0, sb4.length());
-        assertEquals(0, sb4.size());
-
-        final StrBuilder sb5 = new StrBuilder((String) null);
-        assertEquals(32, sb5.capacity());
-        assertEquals(0, sb5.length());
-        assertEquals(0, sb5.size());
-
-        final StrBuilder sb6 = new StrBuilder("");
-        assertEquals(32, sb6.capacity());
-        assertEquals(0, sb6.length());
-        assertEquals(0, sb6.size());
-
-        final StrBuilder sb7 = new StrBuilder("foo");
-        assertEquals(35, sb7.capacity());
-        assertEquals(3, sb7.length());
-        assertEquals(3, sb7.size());
-    }
-
-    //-----------------------------------------------------------------------
-    @Test
-    public void testChaining() {
-        final StrBuilder sb = new StrBuilder();
-        assertSame(sb, sb.setNewLineText(null));
-        assertSame(sb, sb.setNullText(null));
-        assertSame(sb, sb.setLength(1));
-        assertSame(sb, sb.setCharAt(0, 'a'));
-        assertSame(sb, sb.ensureCapacity(0));
-        assertSame(sb, sb.minimizeCapacity());
-        assertSame(sb, sb.clear());
-        assertSame(sb, sb.reverse());
-        assertSame(sb, sb.trim());
-    }
-
-    //-----------------------------------------------------------------------
-    @Test
-    public void testReadFromReader() throws Exception {
-        String s = "";
-        for (int i = 0; i < 100; ++i) {
-            final StrBuilder sb = new StrBuilder();
-            final int len = sb.readFrom(new StringReader(s));
-
-            assertEquals(s.length(), len);
-            assertEquals(s, sb.toString());
-
-            s += Integer.toString(i);
-        }
-    }
-
-    @Test
-    public void testReadFromReaderAppendsToEnd() throws Exception {
-        final StrBuilder sb = new StrBuilder("Test");
-        sb.readFrom(new StringReader(" 123"));
-        assertEquals("Test 123", sb.toString());
-    }
-
-    @Test
-    public void testReadFromCharBuffer() throws Exception {
-        String s = "";
-        for (int i = 0; i < 100; ++i) {
-            final StrBuilder sb = new StrBuilder();
-            final int len = sb.readFrom(CharBuffer.wrap(s));
-
-            assertEquals(s.length(), len);
-            assertEquals(s, sb.toString());
-
-            s += Integer.toString(i);
-        }
-    }
-
-    @Test
-    public void testReadFromCharBufferAppendsToEnd() throws Exception {
-        final StrBuilder sb = new StrBuilder("Test");
-        sb.readFrom(CharBuffer.wrap(" 123"));
-        assertEquals("Test 123", sb.toString());
-    }
-
-    @Test
-    public void testReadFromReadable() throws Exception {
-        String s = "";
-        for (int i = 0; i < 100; ++i) {
-            final StrBuilder sb = new StrBuilder();
-            final int len = sb.readFrom(new MockReadable(s));
-
-            assertEquals(s.length(), len);
-            assertEquals(s, sb.toString());
-
-            s += Integer.toString(i);
-        }
-    }
-
-    @Test
-    public void testReadFromReadableAppendsToEnd() throws Exception {
-        final StrBuilder sb = new StrBuilder("Test");
-        sb.readFrom(new MockReadable(" 123"));
-        assertEquals("Test 123", sb.toString());
-    }
-
-    private static class MockReadable implements Readable {
-
-        private final CharBuffer src;
-
-        public MockReadable(final String src) {
-            this.src = CharBuffer.wrap(src);
-        }
-
-        @Override
-        public int read(final CharBuffer cb) throws IOException {
-            return src.read(cb);
-        }
-    }
-
-    //-----------------------------------------------------------------------
-    @Test
-    public void testGetSetNewLineText() {
-        final StrBuilder sb = new StrBuilder();
-        assertEquals(null, sb.getNewLineText());
-
-        sb.setNewLineText("#");
-        assertEquals("#", sb.getNewLineText());
-
-        sb.setNewLineText("");
-        assertEquals("", sb.getNewLineText());
-
-        sb.setNewLineText((String) null);
-        assertEquals(null, sb.getNewLineText());
-    }
-
-    //-----------------------------------------------------------------------
-    @Test
-    public void testGetSetNullText() {
-        final StrBuilder sb = new StrBuilder();
-        assertEquals(null, sb.getNullText());
-
-        sb.setNullText("null");
-        assertEquals("null", sb.getNullText());
-
-        sb.setNullText("");
-        assertEquals(null, sb.getNullText());
-
-        sb.setNullText("NULL");
-        assertEquals("NULL", sb.getNullText());
-
-        sb.setNullText((String) null);
-        assertEquals(null, sb.getNullText());
-    }
-
-    //-----------------------------------------------------------------------
-    @Test
-    public void testCapacityAndLength() {
-        final StrBuilder sb = new StrBuilder();
-        assertEquals(32, sb.capacity());
-        assertEquals(0, sb.length());
-        assertEquals(0, sb.size());
-        assertTrue(sb.isEmpty());
-
-        sb.minimizeCapacity();
-        assertEquals(0, sb.capacity());
-        assertEquals(0, sb.length());
-        assertEquals(0, sb.size());
-        assertTrue(sb.isEmpty());
-
-        sb.ensureCapacity(32);
-        assertTrue(sb.capacity() >= 32);
-        assertEquals(0, sb.length());
-        assertEquals(0, sb.size());
-        assertTrue(sb.isEmpty());
-
-        sb.append("foo");
-        assertTrue(sb.capacity() >= 32);
-        assertEquals(3, sb.length());
-        assertEquals(3, sb.size());
-        assertTrue(sb.isEmpty() == false);
-
-        sb.clear();
-        assertTrue(sb.capacity() >= 32);
-        assertEquals(0, sb.length());
-        assertEquals(0, sb.size());
-        assertTrue(sb.isEmpty());
-
-        sb.append("123456789012345678901234567890123");
-        assertTrue(sb.capacity() > 32);
-        assertEquals(33, sb.length());
-        assertEquals(33, sb.size());
-        assertTrue(sb.isEmpty() == false);
-
-        sb.ensureCapacity(16);
-        assertTrue(sb.capacity() > 16);
-        assertEquals(33, sb.length());
-        assertEquals(33, sb.size());
-        assertTrue(sb.isEmpty() == false);
-
-        sb.minimizeCapacity();
-        assertEquals(33, sb.capacity());
-        assertEquals(33, sb.length());
-        assertEquals(33, sb.size());
-        assertTrue(sb.isEmpty() == false);
-
-        try {
-            sb.setLength(-1);
-            fail("setLength(-1) expected StringIndexOutOfBoundsException");
-        } catch (final IndexOutOfBoundsException e) {
-            // expected
-        }
-
-        sb.setLength(33);
-        assertEquals(33, sb.capacity());
-        assertEquals(33, sb.length());
-        assertEquals(33, sb.size());
-        assertTrue(sb.isEmpty() == false);
-
-        sb.setLength(16);
-        assertTrue(sb.capacity() >= 16);
-        assertEquals(16, sb.length());
-        assertEquals(16, sb.size());
-        assertEquals("1234567890123456", sb.toString());
-        assertTrue(sb.isEmpty() == false);
-
-        sb.setLength(32);
-        assertTrue(sb.capacity() >= 32);
-        assertEquals(32, sb.length());
-        assertEquals(32, sb.size());
-        assertEquals("1234567890123456\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0", sb.toString());
-        assertTrue(sb.isEmpty() == false);
-
-        sb.setLength(0);
-        assertTrue(sb.capacity() >= 32);
-        assertEquals(0, sb.length());
-        assertEquals(0, sb.size());
-        assertTrue(sb.isEmpty());
-    }
-
-    //-----------------------------------------------------------------------
-    @Test
-    public void testLength() {
-        final StrBuilder sb = new StrBuilder();
-        assertEquals(0, sb.length());
-        
-        sb.append("Hello");
-        assertEquals(5, sb.length());
-    }
-
-    @Test
-    public void testSetLength() {
-        final StrBuilder sb = new StrBuilder();
-        sb.append("Hello");
-        sb.setLength(2);  // shorten
-        assertEquals("He", sb.toString());
-        sb.setLength(2);  // no change
-        assertEquals("He", sb.toString());
-        sb.setLength(3);  // lengthen
-        assertEquals("He\0", sb.toString());
-
-        try {
-            sb.setLength(-1);
-            fail("setLength(-1) expected StringIndexOutOfBoundsException");
-        } catch (final IndexOutOfBoundsException e) {
-            // expected
-        }
-    }
-
-    //-----------------------------------------------------------------------
-    @Test
-    public void testCapacity() {
-        final StrBuilder sb = new StrBuilder();
-        assertEquals(sb.buffer.length, sb.capacity());
-        
-        sb.append("HelloWorldHelloWorldHelloWorldHelloWorld");
-        assertEquals(sb.buffer.length, sb.capacity());
-    }
-
-    @Test
-    public void testEnsureCapacity() {
-        final StrBuilder sb = new StrBuilder();
-        sb.ensureCapacity(2);
-        assertTrue(sb.capacity() >= 2);
-        
-        sb.ensureCapacity(-1);
-        assertTrue(sb.capacity() >= 0);
-        
-        sb.append("HelloWorld");
-        sb.ensureCapacity(40);
-        assertTrue(sb.capacity() >= 40);
-    }
-
-    @Test
-    public void testMinimizeCapacity() {
-        final StrBuilder sb = new StrBuilder();
-        sb.minimizeCapacity();
-        assertEquals(0, sb.capacity());
-        
-        sb.append("HelloWorld");
-        sb.minimizeCapacity();
-        assertEquals(10, sb.capacity());
-    }
-
-    //-----------------------------------------------------------------------
-    @Test
-    public void testSize() {
-        final StrBuilder sb = new StrBuilder();
-        assertEquals(0, sb.size());
-        
-        sb.append("Hello");
-        assertEquals(5, sb.size());
-    }
-
-    @Test
-    public void testIsEmpty() {
-        final StrBuilder sb = new StrBuilder();
-        assertTrue(sb.isEmpty());
-        
-        sb.append("Hello");
-        assertFalse(sb.isEmpty());
-        
-        sb.clear();
-        assertTrue(sb.isEmpty());
-    }
-
-    @Test
-    public void testClear() {
-        final StrBuilder sb = new StrBuilder();
-        sb.append("Hello");
-        sb.clear();
-        assertEquals(0, sb.length());
-        assertTrue(sb.buffer.length >= 5);
-    }
-
-    //-----------------------------------------------------------------------
-    @Test
-    public void testCharAt() {
-        final StrBuilder sb = new StrBuilder();
-        try {
-            sb.charAt(0);
-            fail("charAt(0) expected IndexOutOfBoundsException");
-        } catch (final IndexOutOfBoundsException e) {
-            // expected
-        }
-        try {
-            sb.charAt(-1);
-            fail("charAt(-1) expected IndexOutOfBoundsException");
-        } catch (final IndexOutOfBoundsException e) {
-            // expected
-        }
-        sb.append("foo");
-        assertEquals('f', sb.charAt(0));
-        assertEquals('o', sb.charAt(1));
-        assertEquals('o', sb.charAt(2));
-        try {
-            sb.charAt(-1);
-            fail("charAt(-1) expected IndexOutOfBoundsException");
-        } catch (final IndexOutOfBoundsException e) {
-            // expected
-        }
-        try {
-            sb.charAt(3);
-            fail("charAt(3) expected IndexOutOfBoundsException");
-        } catch (final IndexOutOfBoundsException e) {
-            // expected
-        }
-    }
-
-    //-----------------------------------------------------------------------
-    @Test
-    public void testSetCharAt() {
-        final StrBuilder sb = new StrBuilder();
-        try {
-            sb.setCharAt(0, 'f');
-            fail("setCharAt(0,) expected IndexOutOfBoundsException");
-        } catch (final IndexOutOfBoundsException e) {
-            // expected
-        }
-        try {
-            sb.setCharAt(-1, 'f');
-            fail("setCharAt(-1,) expected IndexOutOfBoundsException");
-        } catch (final IndexOutOfBoundsException e) {
-            // expected
-        }
-        sb.append("foo");
-        sb.setCharAt(0, 'b');
-        sb.setCharAt(1, 'a');
-        sb.setCharAt(2, 'r');
-        try {
-            sb.setCharAt(3, '!');
-            fail("setCharAt(3,) expected IndexOutOfBoundsException");
-        } catch (final IndexOutOfBoundsException e) {
-            // expected
-        }
-        assertEquals("bar", sb.toString());
-    }
-
-    //-----------------------------------------------------------------------
-    @Test
-    public void testDeleteCharAt() {
-        final StrBuilder sb = new StrBuilder("abc");
-        sb.deleteCharAt(0);
-        assertEquals("bc", sb.toString()); 
-        
-        try {
-            sb.deleteCharAt(1000);
-            fail("Expected IndexOutOfBoundsException");
-        } catch (final IndexOutOfBoundsException e) {}
-    }
-
-    //-----------------------------------------------------------------------
-    @Test
-    public void testToCharArray() {
-        final StrBuilder sb = new StrBuilder();
-        assertEquals(ArrayUtils.EMPTY_CHAR_ARRAY, sb.toCharArray());
-
-        char[] a = sb.toCharArray();
-        assertNotNull("toCharArray() result is null", a);
-        assertEquals("toCharArray() result is too large", 0, a.length);
-
-        sb.append("junit");
-        a = sb.toCharArray();
-        assertEquals("toCharArray() result incorrect length", 5, a.length);
-        assertTrue("toCharArray() result does not match", Arrays.equals("junit".toCharArray(), a));
-    }
-
-    @Test
-    public void testToCharArrayIntInt() {
-        final StrBuilder sb = new StrBuilder();
-        assertEquals(ArrayUtils.EMPTY_CHAR_ARRAY, sb.toCharArray(0, 0));
-
-        sb.append("junit");
-        char[] a = sb.toCharArray(0, 20); // too large test
-        assertEquals("toCharArray(int,int) result incorrect length", 5, a.length);
-        assertTrue("toCharArray(int,int) result does not match", Arrays.equals("junit".toCharArray(), a));
-
-        a = sb.toCharArray(0, 4);
-        assertEquals("toCharArray(int,int) result incorrect length", 4, a.length);
-        assertTrue("toCharArray(int,int) result does not match", Arrays.equals("juni".toCharArray(), a));
-
-        a = sb.toCharArray(0, 4);
-        assertEquals("toCharArray(int,int) result incorrect length", 4, a.length);
-        assertTrue("toCharArray(int,int) result does not match", Arrays.equals("juni".toCharArray(), a));
-
-        a = sb.toCharArray(0, 1);
-        assertNotNull("toCharArray(int,int) result is null", a);
-
-        try {
-            sb.toCharArray(-1, 5);
-            fail("no string index out of bound on -1");
-        } catch (final IndexOutOfBoundsException e) {
-        }
-
-        try {
-            sb.toCharArray(6, 5);
-            fail("no string index out of bound on -1");
-        } catch (final IndexOutOfBoundsException e) {
-        }
-    }
-
-    @Test
-    public void testGetChars ( ) {
-        final StrBuilder sb = new StrBuilder();
-        
-        char[] input = new char[10];
-        char[] a = sb.getChars(input);
-        assertSame (input, a);
-        assertTrue(Arrays.equals(new char[10], a));
-        
-        sb.append("junit");
-        a = sb.getChars(input);
-        assertSame(input, a);
-        assertTrue(Arrays.equals(new char[] {'j','u','n','i','t',0,0,0,0,0},a));
-        
-        a = sb.getChars(null);
-        assertNotSame(input,a);
-        assertEquals(5,a.length);
-        assertTrue(Arrays.equals("junit".toCharArray(),a));
-        
-        input = new char[5];
-        a = sb.getChars(input);
-        assertSame(input, a);
-        
-        input = new char[4];
-        a = sb.getChars(input);
-        assertNotSame(input, a);
-    }
-
-    @Test
-    public void testGetCharsIntIntCharArrayInt( ) {
-        final StrBuilder sb = new StrBuilder();
-               
-        sb.append("junit");
-        char[] a = new char[5];
-        sb.getChars(0,5,a,0);
-        assertTrue(Arrays.equals(new char[] {'j','u','n','i','t'},a));
-        
-        a = new char[5];
-        sb.getChars(0,2,a,3);
-        assertTrue(Arrays.equals(new char[] {0,0,0,'j','u'},a));
-        
-        try {
-            sb.getChars(-1,0,a,0);
-            fail("no exception");
-        }
-        catch (final IndexOutOfBoundsException e) {
-        }
-        
-        try {
-            sb.getChars(0,-1,a,0);
-            fail("no exception");
-        }
-        catch (final IndexOutOfBoundsException e) {
-        }
-        
-        try {
-            sb.getChars(0,20,a,0);
-            fail("no exception");
-        }
-        catch (final IndexOutOfBoundsException e) {
-        }
-        
-        try {
-            sb.getChars(4,2,a,0);
-            fail("no exception");
-        }
-        catch (final IndexOutOfBoundsException e) {
-        }
-    }
-
-    //-----------------------------------------------------------------------
-    @Test
-    public void testDeleteIntInt() {
-        StrBuilder sb = new StrBuilder("abc");
-        sb.delete(0, 1);
-        assertEquals("bc", sb.toString()); 
-        sb.delete(1, 2);
-        assertEquals("b", sb.toString());
-        sb.delete(0, 1);
-        assertEquals("", sb.toString()); 
-        sb.delete(0, 1000);
-        assertEquals("", sb.toString()); 
-        
-        try {
-            sb.delete(1, 2);
-            fail("Expected IndexOutOfBoundsException");
-        } catch (final IndexOutOfBoundsException e) {}
-        try {
-            sb.delete(-1, 1);
-            fail("Expected IndexOutOfBoundsException");
-        } catch (final IndexOutOfBoundsException e) {}
-        
-        sb = new StrBuilder("anything");
-        try {
-            sb.delete(2, 1);
-            fail("Expected IndexOutOfBoundsException");
-        } catch (final IndexOutOfBoundsException e) {}
-    }
-
-    //-----------------------------------------------------------------------
-    @Test
-    public void testDeleteAll_char() {
-        StrBuilder sb = new StrBuilder("abcbccba");
-        sb.deleteAll('X');
-        assertEquals("abcbccba", sb.toString());
-        sb.deleteAll('a');
-        assertEquals("bcbccb", sb.toString());
-        sb.deleteAll('c');
-        assertEquals("bbb", sb.toString());
-        sb.deleteAll('b');
-        assertEquals("", sb.toString());
-
-        sb = new StrBuilder("");
-        sb.deleteAll('b');
-        assertEquals("", sb.toString());
-    }
-
-    @Test
-    public void testDeleteFirst_char() {
-        StrBuilder sb = new StrBuilder("abcba");
-        sb.deleteFirst('X');
-        assertEquals("abcba", sb.toString());
-        sb.deleteFirst('a');
-        assertEquals("bcba", sb.toString());
-        sb.deleteFirst('c');
-        assertEquals("bba", sb.toString());
-        sb.deleteFirst('b');
-        assertEquals("ba", sb.toString());
-
-        sb = new StrBuilder("");
-        sb.deleteFirst('b');
-        assertEquals("", sb.toString());
-    }
-
-    // -----------------------------------------------------------------------
-    @Test
-    public void testDeleteAll_String() {
-        StrBuilder sb = new StrBuilder("abcbccba");
-        sb.deleteAll((String) null);
-        assertEquals("abcbccba", sb.toString());
-        sb.deleteAll("");
-        assertEquals("abcbccba", sb.toString());
-        
-        sb.deleteAll("X");
-        assertEquals("abcbccba", sb.toString());
-        sb.deleteAll("a");
-        assertEquals("bcbccb", sb.toString());
-        sb.deleteAll("c");
-        assertEquals("bbb", sb.toString());
-        sb.deleteAll("b");
-        assertEquals("", sb.toString());
-
-        sb = new StrBuilder("abcbccba");
-        sb.deleteAll("bc");
-        assertEquals("acba", sb.toString());
-
-        sb = new StrBuilder("");
-        sb.deleteAll("bc");
-        assertEquals("", sb.toString());
-    }
-
-    @Test
-    public void testDeleteFirst_String() {
-        StrBuilder sb = new StrBuilder("abcbccba");
-        sb.deleteFirst((String) null);
-        assertEquals("abcbccba", sb.toString());
-        sb.deleteFirst("");
-        assertEquals("abcbccba", sb.toString());
-
-        sb.deleteFirst("X");
-        assertEquals("abcbccba", sb.toString());
-        sb.deleteFirst("a");
-        assertEquals("bcbccba", sb.toString());
-        sb.deleteFirst("c");
-        assertEquals("bbccba", sb.toString());
-        sb.deleteFirst("b");
-        assertEquals("bccba", sb.toString());
-
-        sb = new StrBuilder("abcbccba");
-        sb.deleteFirst("bc");
-        assertEquals("abccba", sb.toString());
-
-        sb = new StrBuilder("");
-        sb.deleteFirst("bc");
-        assertEquals("", sb.toString());
-    }
-
-    // -----------------------------------------------------------------------
-    @Test
-    public void testDeleteAll_StrMatcher() {
-        StrBuilder sb = new StrBuilder("A0xA1A2yA3");
-        sb.deleteAll((StrMatcher) null);
-        assertEquals("A0xA1A2yA3", sb.toString());
-        sb.deleteAll(A_NUMBER_MATCHER);
-        assertEquals("xy", sb.toString());
-
-        sb = new StrBuilder("Ax1");
-        sb.deleteAll(A_NUMBER_MATCHER);
-        assertEquals("Ax1", sb.toString());
-
-        sb = new StrBuilder("");
-        sb.deleteAll(A_NUMBER_MATCHER);
-        assertEquals("", sb.toString());
-    }
-
-    @Test
-    public void testDeleteFirst_StrMatcher() {
-        StrBuilder sb = new StrBuilder("A0xA1A2yA3");
-        sb.deleteFirst((StrMatcher) null);
-        assertEquals("A0xA1A2yA3", sb.toString());
-        sb.deleteFirst(A_NUMBER_MATCHER);
-        assertEquals("xA1A2yA3", sb.toString());
-
-        sb = new StrBuilder("Ax1");
-        sb.deleteFirst(A_NUMBER_MATCHER);
-        assertEquals("Ax1", sb.toString());
-
-        sb = new StrBuilder("");
-        sb.deleteFirst(A_NUMBER_MATCHER);
-        assertEquals("", sb.toString());
-    }
-
-    // -----------------------------------------------------------------------
-    @Test
-    public void testReplace_int_int_String() {
-        StrBuilder sb = new StrBuilder("abc");
-        sb.replace(0, 1, "d");
-        assertEquals("dbc", sb.toString());
-        sb.replace(0, 1, "aaa");
-        assertEquals("aaabc", sb.toString());
-        sb.replace(0, 3, "");
-        assertEquals("bc", sb.toString());
-        sb.replace(1, 2, (String) null);
-        assertEquals("b", sb.toString());
-        sb.replace(1, 1000, "text");
-        assertEquals("btext", sb.toString());
-        sb.replace(0, 1000, "text");
-        assertEquals("text", sb.toString());
-        
-        sb = new StrBuilder("atext");
-        sb.replace(1, 1, "ny");
-        assertEquals("anytext", sb.toString());
-        try {
-            sb.replace(2, 1, "anything");
-            fail("Expected IndexOutOfBoundsException");
-        } catch (final IndexOutOfBoundsException e) {}
-        
-        sb = new StrBuilder();
-        try {
-            sb.replace(1, 2, "anything");
-            fail("Expected IndexOutOfBoundsException");
-        } catch (final IndexOutOfBoundsException e) {}
-        try {
-            sb.replace(-1, 1, "anything");
-            fail("Expected IndexOutOfBoundsException");
-        } catch (final IndexOutOfBoundsException e) {}
-    }
-
-    //-----------------------------------------------------------------------
-    @Test
-    public void testReplaceAll_char_char() {
-        final StrBuilder sb = new StrBuilder("abcbccba");
-        sb.replaceAll('x', 'y');
-        assertEquals("abcbccba", sb.toString());
-        sb.replaceAll('a', 'd');
-        assertEquals("dbcbccbd", sb.toString());
-        sb.replaceAll('b', 'e');
-        assertEquals("dececced", sb.toString());
-        sb.replaceAll('c', 'f');
-        assertEquals("defeffed", sb.toString());
-        sb.replaceAll('d', 'd');
-        assertEquals("defeffed", sb.toString());
-    }
-
-    //-----------------------------------------------------------------------
-    @Test
-    public void testReplaceFirst_char_char() {
-        final StrBuilder sb = new StrBuilder("abcbccba");
-        sb.replaceFirst('x', 'y');
-        assertEquals("abcbccba", sb.toString());
-        sb.replaceFirst('a', 'd');
-        assertEquals("dbcbccba", sb.toString());
-        sb.replaceFirst('b', 'e');
-        assertEquals("decbccba", sb.toString());
-        sb.replaceFirst('c', 'f');
-        assertEquals("defbccba", sb.toString());
-        sb.replaceFirst('d', 'd');
-        assertEquals("defbccba", sb.toString());
-    }
-
-    //-----------------------------------------------------------------------
-    @Test
-    public void testReplaceAll_String_String() {
-        StrBuilder sb = new StrBuilder("abcbccba");
-        sb.replaceAll((String) null, null);
-        assertEquals("abcbccba", sb.toString());
-        sb.replaceAll((String) null, "anything");
-        assertEquals("abcbccba", sb.toString());
-        sb.replaceAll("", null);
-        assertEquals("abcbccba", sb.toString());
-        sb.replaceAll("", "anything");
-        assertEquals("abcbccba", sb.toString());
-        
-        sb.replaceAll("x", "y");
-        assertEquals("abcbccba", sb.toString());
-        sb.replaceAll("a", "d");
-        assertEquals("dbcbccbd", sb.toString());
-        sb.replaceAll("d", null);
-        assertEquals("bcbccb", sb.toString());
-        sb.replaceAll("cb", "-");
-        assertEquals("b-c-", sb.toString());
-        
-        sb = new StrBuilder("abcba");
-        sb.replaceAll("b", "xbx");
-        assertEquals("axbxcxbxa", sb.toString());
-        
-        sb = new StrBuilder("bb");
-        sb.replaceAll("b", "xbx");
-        assertEquals("xbxxbx", sb.toString());
-    }
-
-    @Test
-    public void testReplaceFirst_String_String() {
-        StrBuilder sb = new StrBuilder("abcbccba");
-        sb.replaceFirst((String) null, null);
-        assertEquals("abcbccba", sb.toString());
-        sb.replaceFirst((String) null, "anything");
-        assertEquals("abcbccba", sb.toString());
-        sb.replaceFirst("", null);
-        assertEquals("abcbccba", sb.toString());
-        sb.replaceFirst("", "anything");
-        assertEquals("abcbccba", sb.toString());
-        
-        sb.replaceFirst("x", "y");
-        assertEquals("abcbccba", sb.toString());
-        sb.replaceFirst("a", "d");
-        assertEquals("dbcbccba", sb.toString());
-        sb.replaceFirst("d", null);
-        assertEquals("bcbccba", sb.toString());
-        sb.replaceFirst("cb", "-");
-        assertEquals("b-ccba", sb.toString());
-        
-        sb = new StrBuilder("abcba");
-        sb.replaceFirst("b", "xbx");
-        assertEquals("axbxcba", sb.toString());
-        
-        sb = new StrBuilder("bb");
-        sb.replaceFirst("b", "xbx");
-        assertEquals("xbxb", sb.toString());
-    }
-
-    //-----------------------------------------------------------------------
-    @Test
-    public void testReplaceAll_StrMatcher_String() {
-        StrBuilder sb = new StrBuilder("abcbccba");
-        sb.replaceAll((StrMatcher) null, null);
-        assertEquals("abcbccba", sb.toString());
-        sb.replaceAll((StrMatcher) null, "anything");
-        assertEquals("abcbccba", sb.toString());
-        sb.replaceAll(StrMatcher.noneMatcher(), null);
-        assertEquals("abcbccba", sb.toString());
-        sb.replaceAll(StrMatcher.noneMatcher(), "anything");
-        assertEquals("abcbccba", sb.toString());
-        
-        sb.replaceAll(StrMatcher.charMatcher('x'), "y");
-        assertEquals("abcbccba", sb.toString());
-        sb.replaceAll(StrMatcher.charMatcher('a'), "d");
-        assertEquals("dbcbccbd", sb.toString());
-        sb.replaceAll(StrMatcher.charMatcher('d'), null);
-        assertEquals("bcbccb", sb.toString());
-        sb.replaceAll(StrMatcher.stringMatcher("cb"), "-");
-        assertEquals("b-c-", sb.toString());
-        
-        sb = new StrBuilder("abcba");
-        sb.replaceAll(StrMatcher.charMatcher('b'), "xbx");
-        assertEquals("axbxcxbxa", sb.toString());
-        
-        sb = new StrBuilder("bb");
-        sb.replaceAll(StrMatcher.charMatcher('b'), "xbx");
-        assertEquals("xbxxbx", sb.toString());
-        
-        sb = new StrBuilder("A1-A2A3-A4");
-        sb.replaceAll(A_NUMBER_MATCHER, "***");
-        assertEquals("***-******-***", sb.toString());
-    }
-
-    @Test
-    public void testReplaceFirst_StrMatcher_String() {
-        StrBuilder sb = new StrBuilder("abcbccba");
-        sb.replaceFirst((StrMatcher) null, null);
-        assertEquals("abcbccba", sb.toString());
-        sb.replaceFirst((StrMatcher) null, "anything");
-        assertEquals("abcbccba", sb.toString());
-        sb.replaceFirst(StrMatcher.noneMatcher(), null);
-        assertEquals("abcbccba", sb.toString());
-        sb.replaceFirst(StrMatcher.noneMatcher(), "anything");
-        assertEquals("abcbccba", sb.toString());
-        
-        sb.replaceFirst(StrMatcher.charMatcher('x'), "y");
-        assertEquals("abcbccba", sb.toString());
-        sb.replaceFirst(StrMatcher.charMatcher('a'), "d");
-        assertEquals("dbcbccba", sb.toString());
-        sb.replaceFirst(StrMatcher.charMatcher('d'), null);
-        assertEquals("bcbccba", sb.toString());
-        sb.replaceFirst(StrMatcher.stringMatcher("cb"), "-");
-        assertEquals("b-ccba", sb.toString());
-        
-        sb = new StrBuilder("abcba");
-        sb.replaceFirst(StrMatcher.charMatcher('b'), "xbx");
-        assertEquals("axbxcba", sb.toString());
-        
-        sb = new StrBuilder("bb");
-        sb.replaceFirst(StrMatcher.charMatcher('b'), "xbx");
-        assertEquals("xbxb", sb.toString());
-        
-        sb = new StrBuilder("A1-A2A3-A4");
-        sb.replaceFirst(A_NUMBER_MATCHER, "***");
-        assertEquals("***-A2A3-A4", sb.toString());
-    }
-
-    //-----------------------------------------------------------------------
-    @Test
-    public void testReplace_StrMatcher_String_int_int_int_VaryMatcher() {
-        StrBuilder sb = new StrBuilder("abcbccba");
-        sb.replace((StrMatcher) null, "x", 0, sb.length(), -1);
-        assertEquals("abcbccba", sb.toString());
-        
-        sb.replace(StrMatcher.charMatcher('a'), "x", 0, sb.length(), -1);
-        assertEquals("xbcbccbx", sb.toString());
-        
-        sb.replace(StrMatcher.stringMatcher("cb"), "x", 0, sb.length(), -1);
-        assertEquals("xbxcxx", sb.toString());
-        
-        sb = new StrBuilder("A1-A2A3-A4");
-        sb.replace(A_NUMBER_MATCHER, "***", 0, sb.length(), -1);
-        assertEquals("***-******-***", sb.toString());
-        
-        sb = new StrBuilder();
-        sb.replace(A_NUMBER_MATCHER, "***", 0, sb.length(), -1);
-        assertEquals("", sb.toString());
-    }
-
-    @Test
-    public void testReplace_StrMatcher_String_int_int_int_VaryReplace() {
-        StrBuilder sb = new StrBuilder("abcbccba");
-        sb.replace(StrMatcher.stringMatcher("cb"), "cb", 0, sb.length(), -1);
-        assertEquals("abcbccba", sb.toString());
-        
-        sb = new StrBuilder("abcbccba");
-        sb.replace(StrMatcher.stringMatcher("cb"), "-", 0, sb.length(), -1);
-        assertEquals("ab-c-a", sb.toString());
-        
-        sb = new StrBuilder("abcbccba");
-        sb.replace(StrMatcher.stringMatcher("cb"), "+++", 0, sb.length(), -1);
-        assertEquals("ab+++c+++a", sb.toString());
-        
-        sb = new StrBuilder("abcbccba");
-        sb.replace(StrMatcher.stringMatcher("cb"), "", 0, sb.length(), -1);
-        assertEquals("abca", sb.toString());
-        
-        sb = new StrBuilder("abcbccba");
-        sb.replace(StrMatcher.stringMatcher("cb"), null, 0, sb.length(), -1);
-        assertEquals("abca", sb.toString());
-    }
-
-    @Test
-    public void testReplace_StrMatcher_String_int_int_int_VaryStartIndex() {
-        StrBuilder sb = new StrBuilder("aaxaaaayaa");
-        sb.replace(StrMatcher.stringMatcher("aa"), "-", 0, sb.length(), -1);
-        assertEquals("-x--y-", sb.toString());
-        
-        sb = new StrBuilder("aaxaaaayaa");
-        sb.replace(StrMatcher.stringMatcher("aa"), "-", 1, sb.length(), -1);
-        assertEquals("aax--y-", sb.toString());
-        
-        sb = new StrBuilder("aaxaaaayaa");
-        sb.replace(StrMatcher.stringMatcher("aa"), "-", 2, sb.length(), -1);
-        assertEquals("aax--y-", sb.toString());
-        
-        sb = new StrBuilder("aaxaaaayaa");
-        sb.replace(StrMatcher.stringMatcher("aa"), "-", 3, sb.length(), -1);
-        assertEquals("aax--y-", sb.toString());
-        
-        sb = new StrBuilder("aaxaaaayaa");
-        sb.replace(StrMatcher.stringMatcher("aa"), "-", 4, sb.length(), -1);
-        assertEquals("aaxa-ay-", sb.toString());
-        
-        sb = new StrBuilder("aaxaaaayaa");
-        sb.replace(StrMatcher.stringMatcher("aa"), "-", 5, sb.length(), -1);
-        assertEquals("aaxaa-y-", sb.toString());
-        
-        sb = new StrBuilder("aaxaaaayaa");
-        sb.replace(StrMatcher.stringMatcher("aa"), "-", 6, sb.length(), -1);
-        assertEquals("aaxaaaay-", sb.toString());
-        
-        sb = new StrBuilder("aaxaaaayaa");
-        sb.replace(StrMatcher.stringMatcher("aa"), "-", 7, sb.length(), -1);
-        assertEquals("aaxaaaay-", sb.toString());
-        
-        sb = new StrBuilder("aaxaaaayaa");
-        sb.replace(StrMatcher.stringMatcher("aa"), "-", 8, sb.length(), -1);
-        assertEquals("aaxaaaay-", sb.toString());
-        
-        sb = new StrBuilder("aaxaaaayaa");
-        sb.replace(StrMatcher.stringMatcher("aa"), "-", 9, sb.length(), -1);
-        assertEquals("aaxaaaayaa", sb.toString());
-        
-        sb = new StrBuilder("aaxaaaayaa");
-        sb.replace(StrMatcher.stringMatcher("aa"), "-", 10, sb.length(), -1);
-        assertEquals("aaxaaaayaa", sb.toString());
-        
-        sb = new StrBuilder("aaxaaaayaa");
-        try {
-            sb.replace(StrMatcher.stringMatcher("aa"), "-", 11, sb.length(), -1);
-            fail();
-        } catch (final IndexOutOfBoundsException ex) {}
-        assertEquals("aaxaaaayaa", sb.toString());
-        
-        sb = new StrBuilder("aaxaaaayaa");
-        try {
-            sb.replace(StrMatcher.stringMatcher("aa"), "-", -1, sb.length(), -1);
-            fail();
-        } catch (final IndexOutOfBoundsException ex) {}
-        assertEquals("aaxaaaayaa", sb.toString());
-    }
-
-    @Test
-    public void testReplace_StrMatcher_String_int_int_int_VaryEndIndex() {
-        StrBuilder sb = new StrBuilder("aaxaaaayaa");
-        sb.replace(StrMatcher.stringMatcher("aa"), "-", 0, 0, -1);
-        assertEquals("aaxaaaayaa", sb.toString());
-        
-        sb = new StrBuilder("aaxaaaayaa");
-        sb.replace(StrMatcher.stringMatcher("aa"), "-", 0, 2, -1);
-        assertEquals("-xaaaayaa", sb.toString());
-        
-        sb = new StrBuilder("aaxaaaayaa");
-        sb.replace(StrMatcher.stringMatcher("aa"), "-", 0, 3, -1);
-        assertEquals("-xaaaayaa", sb.toString());
-        
-        sb = new StrBuilder("aaxaaaayaa");
-        sb.replace(StrMatcher.stringMatcher("aa"), "-", 0, 4, -1);
-        assertEquals("-xaaaayaa", sb.toString());
-        
-        sb = new StrBuilder("aaxaaaayaa");
-        sb.replace(StrMatcher.stringMatcher("aa"), "-", 0, 5, -1);
-        assertEquals("-x-aayaa", sb.toString());
-        
-        sb = new StrBuilder("aaxaaaayaa");
-        sb.replace(StrMatcher.stringMatcher("aa"), "-", 0, 6, -1);
-        assertEquals("-x-aayaa", sb.toString());
-        
-        sb = new StrBuilder("aaxaaaayaa");
-        sb.replace(StrMatcher.stringMatcher("aa"), "-", 0, 7, -1);
-        assertEquals("-x--yaa", sb.toString());
-        
-        sb = new StrBuilder("aaxaaaayaa");
-        sb.replace(StrMatcher.stringMatcher("aa"), "-", 0, 8, -1);
-        assertEquals("-x--yaa", sb.toString());
-        
-        sb = new StrBuilder("aaxaaaayaa");
-        sb.replace(StrMatcher.stringMatcher("aa"), "-", 0, 9, -1);
-        assertEquals("-x--yaa", sb.toString());
-        
-        sb = new StrBuilder("aaxaaaayaa");
-        sb.replace(StrMatcher.stringMatcher("aa"), "-", 0, 10, -1);
-        assertEquals("-x--y-", sb.toString());
-        
-        sb = new StrBuilder("aaxaaaayaa");
-        sb.replace(StrMatcher.stringMatcher("aa"), "-", 0, 1000, -1);
-        assertEquals("-x--y-", sb.toString());
-        
-        sb = new StrBuilder("aaxaaaayaa");
-        try {
-            sb.replace(StrMatcher.stringMatcher("aa"), "-", 2, 1, -1);
-            fail();
-        } catch (final IndexOutOfBoundsException ex) {}
-        assertEquals("aaxaaaayaa", sb.toString());
-    }
-
-    @Test
-    public void testReplace_StrMatcher_String_int_int_int_VaryCount() {
-        StrBuilder sb = new StrBuilder("aaxaaaayaa");
-        sb.replace(StrMatcher.stringMatcher("aa"), "-", 0, 10, -1);
-        assertEquals("-x--y-", sb.toString());
-        
-        sb = new StrBuilder("aaxaaaayaa");
-        sb.replace(StrMatcher.stringMatcher("aa"), "-", 0, 10, 0);
-        assertEquals("aaxaaaayaa", sb.toString());
-        
-        sb = new StrBuilder("aaxaaaayaa");
-        sb.replace(StrMatcher.stringMatcher("aa"), "-", 0, 10, 1);
-        assertEquals("-xaaaayaa", sb.toString());
-        
-        sb = new StrBuilder("aaxaaaayaa");
-        sb.replace(StrMatcher.stringMatcher("aa"), "-", 0, 10, 2);
-        assertEquals("-x-aayaa", sb.toString());
-        
-        sb = new StrBuilder("aaxaaaayaa");
-        sb.replace(StrMatcher.stringMatcher("aa"), "-", 0, 10, 3);
-        assertEquals("-x--yaa", sb.toString());
-        
-        sb = new StrBuilder("aaxaaaayaa");
-        sb.replace(StrMatcher.stringMatcher("aa"), "-", 0, 10, 4);
-        assertEquals("-x--y-", sb.toString());
-        
-        sb = new StrBuilder("aaxaaaayaa");
-        sb.replace(StrMatcher.stringMatcher("aa"), "-", 0, 10, 5);
-        assertEquals("-x--y-", sb.toString());
-    }
-
-    //-----------------------------------------------------------------------
-    @Test
-    public void testReverse() {
-        final StrBuilder sb = new StrBuilder();
-        assertEquals("", sb.reverse().toString());
-        
-        sb.clear().append(true);
-        assertEquals("eurt", sb.reverse().toString());
-        assertEquals("true", sb.reverse().toString());
-    }
-
-    //-----------------------------------------------------------------------
-    @Test
-    public void testTrim() {
-        final StrBuilder sb = new StrBuilder();
-        assertEquals("", sb.reverse().toString());
-        
-        sb.clear().append(" \u0000 ");
-        assertEquals("", sb.trim().toString());
-        
-        sb.clear().append(" \u0000 a b c");
-        assertEquals("a b c", sb.trim().toString());
-        
-        sb.clear().append("a b c \u0000 ");
-        assertEquals("a b c", sb.trim().toString());
-        
-        sb.clear().append(" \u0000 a b c \u0000 ");
-        assertEquals("a b c", sb.trim().toString());
-        
-        sb.clear().append("a b c");
-        assertEquals("a b c", sb.trim().toString());
-    }
-
-    //-----------------------------------------------------------------------
-    @Test
-    public void testStartsWith() {
-        final StrBuilder sb = new StrBuilder();
-        assertFalse(sb.startsWith("a"));
-        assertFalse(sb.startsWith(null));
-        assertTrue(sb.startsWith(""));
-        sb.append("abc");
-        assertTrue(sb.startsWith("a"));
-        assertTrue(sb.startsWith("ab"));
-        assertTrue(sb.startsWith("abc"));
-        assertFalse(sb.startsWith("cba"));
-    }
-
-    @Test
-    public void testEndsWith() {
-        final StrBuilder sb = new StrBuilder();
-        assertFalse(sb.endsWith("a"));
-        assertFalse(sb.endsWith("c"));
-        assertTrue(sb.endsWith(""));
-        assertFalse(sb.endsWith(null));
-        sb.append("abc");
-        assertTrue(sb.endsWith("c"));
-        assertTrue(sb.endsWith("bc"));
-        assertTrue(sb.endsWith("abc"));
-        assertFalse(sb.endsWith("cba"));
-        assertFalse(sb.endsWith("abcd"));
-        assertFalse(sb.endsWith(" abc"));
-        assertFalse(sb.endsWith("abc "));
-    }
-
-    //-----------------------------------------------------------------------
-    @Test
-    public void testSubSequenceIntInt() {
-       final StrBuilder sb = new StrBuilder ("hello goodbye");
-       // Start index is negative
-       try {
-            sb.subSequence(-1, 5);
-            fail();
-        } catch (final IndexOutOfBoundsException e) {}
-        
-        // End index is negative
-       try {
-            sb.subSequence(2, -1);
-            fail();
-        } catch (final IndexOutOfBoundsException e) {}
-        
-        // End index greater than length()
-        try {
-            sb.subSequence(2, sb.length() + 1);
-            fail();
-        } catch (final IndexOutOfBoundsException e) {}
-        
-        // Start index greater then end index
-        try {
-            sb.subSequence(3, 2);
-            fail();
-        } catch (final IndexOutOfBoundsException e) {}
-        
-        // Normal cases
-        assertEquals ("hello", sb.subSequence(0, 5));
-        assertEquals ("hello goodbye".subSequence(0, 6), sb.subSequence(0, 6));
-        assertEquals ("goodbye", sb.subSequence(6, 13));
-        assertEquals ("hello goodbye".subSequence(6,13), sb.subSequence(6, 13));
-    }
-
-    @Test
-    public void testSubstringInt() {
-        final StrBuilder sb = new StrBuilder ("hello goodbye");
-        assertEquals ("goodbye", sb.substring(6));
-        assertEquals ("hello goodbye".substring(6), sb.substring(6));
-        assertEquals ("hello goodbye", sb.substring(0));
-        assertEquals ("hello goodbye".substring(0), sb.substring(0));
-        try {
-            sb.substring(-1);
-            fail ();
-        } catch (final IndexOutOfBoundsException e) {}
-        
-        try {
-            sb.substring(15);
-            fail ();
-        } catch (final IndexOutOfBoundsException e) {}
-    
-    }
-    
-    @Test
-    public void testSubstringIntInt() {
-        final StrBuilder sb = new StrBuilder ("hello goodbye");
-        assertEquals ("hello", sb.substring(0, 5));
-        assertEquals ("hello goodbye".substring(0, 6), sb.substring(0, 6));
-        
-        assertEquals ("goodbye", sb.substring(6, 13));
-        assertEquals ("hello goodbye".substring(6,13), sb.substring(6, 13));
-        
-        assertEquals ("goodbye", sb.substring(6, 20));
-        
-        try {
-            sb.substring(-1, 5);
-            fail();
-        } catch (final IndexOutOfBoundsException e) {}
-        
-        try {
-            sb.substring(15, 20);
-            fail();
-        } catch (final IndexOutOfBoundsException e) {}
-    }
-
-    // -----------------------------------------------------------------------
-    @Test
-    public void testMidString() {
-        final StrBuilder sb = new StrBuilder("hello goodbye hello");
-        assertEquals("goodbye", sb.midString(6, 7));
-        assertEquals("hello", sb.midString(0, 5));
-        assertEquals("hello", sb.midString(-5, 5));
-        assertEquals("", sb.midString(0, -1));
-        assertEquals("", sb.midString(20, 2));
-        assertEquals("hello", sb.midString(14, 22));
-    }
-
-    @Test
-    public void testRightString() {
-        final StrBuilder sb = new StrBuilder("left right");
-        assertEquals("right", sb.rightString(5));
-        assertEquals("", sb.rightString(0));
-        assertEquals("", sb.rightString(-5));
-        assertEquals("left right", sb.rightString(15));
-    }
-
-    @Test
-    public void testLeftString() {
-        final StrBuilder sb = new StrBuilder("left right");
-        assertEquals("left", sb.leftString(4));
-        assertEquals("", sb.leftString(0));
-        assertEquals("", sb.leftString(-5));
-        assertEquals("left right", sb.leftString(15));
-    }
-
-    // -----------------------------------------------------------------------
-    @Test
-    public void testContains_char() {
-        final StrBuilder sb = new StrBuilder("abcdefghijklmnopqrstuvwxyz");
-        assertTrue(sb.contains('a'));
-        assertTrue(sb.contains('o'));
-        assertTrue(sb.contains('z'));
-        assertFalse(sb.contains('1'));
-    }
-
-    @Test
-    public void testContains_String() {
-        final StrBuilder sb = new StrBuilder("abcdefghijklmnopqrstuvwxyz");
-        assertTrue(sb.contains("a"));
-        assertTrue(sb.contains("pq"));
-        assertTrue(sb.contains("z"));
-        assertFalse(sb.contains("zyx"));
-        assertFalse(sb.contains((String) null));
-    }
-
-    @Test
-    public void testContains_StrMatcher() {
-        StrBuilder sb = new StrBuilder("abcdefghijklmnopqrstuvwxyz");
-        assertTrue(sb.contains(StrMatcher.charMatcher('a')));
-        assertTrue(sb.contains(StrMatcher.stringMatcher("pq")));
-        assertTrue(sb.contains(StrMatcher.charMatcher('z')));
-        assertFalse(sb.contains(StrMatcher.stringMatcher("zy")));
-        assertFalse(sb.contains((StrMatcher) null));
-
-        sb = new StrBuilder();
-        assertFalse(sb.contains(A_NUMBER_MATCHER));
-        sb.append("B A1 C");
-        assertTrue(sb.contains(A_NUMBER_MATCHER));
-    }
-
-    // -----------------------------------------------------------------------
-    @Test
-    public void testIndexOf_char() {
-        final StrBuilder sb = new StrBuilder("abab");
-        assertEquals(0, sb.indexOf('a'));
-        
-        // should work like String#indexOf
-        assertEquals("abab".indexOf('a'), sb.indexOf('a'));
-
-        assertEquals(1, sb.indexOf('b'));
-        assertEquals("abab".indexOf('b'), sb.indexOf('b'));
-
-        assertEquals(-1, sb.indexOf('z'));
-    }
-
-    @Test
-    public void testIndexOf_char_int() {
-        StrBuilder sb = new StrBuilder("abab");
-        assertEquals(0, sb.indexOf('a', -1));
-        assertEquals(0, sb.indexOf('a', 0));
-        assertEquals(2, sb.indexOf('a', 1));
-        assertEquals(-1, sb.indexOf('a', 4));
-        assertEquals(-1, sb.indexOf('a', 5));
-
-        // should work like String#indexOf
-        assertEquals("abab".indexOf('a', 1), sb.indexOf('a', 1));
-
-        assertEquals(3, sb.indexOf('b', 2));
-        assertEquals("abab".indexOf('b', 2), sb.indexOf('b', 2));
-
-        assertEquals(-1, sb.indexOf('z', 2));
-
-        sb = new StrBuilder("xyzabc");
-        assertEquals(2, sb.indexOf('z', 0));
-        assertEquals(-1, sb.indexOf('z', 3));
-    }
-
-    @Test
-    public void testLastIndexOf_char() {
-        final StrBuilder sb = new StrBuilder("abab");
-        
-        assertEquals (2, sb.lastIndexOf('a'));
-        //should work like String#lastIndexOf
-        assertEquals ("abab".lastIndexOf('a'), sb.lastIndexOf('a'));
-        
-        assertEquals(3, sb.lastIndexOf('b'));
-        assertEquals ("abab".lastIndexOf('b'), sb.lastIndexOf('b'));
-        
-        assertEquals (-1, sb.lastIndexOf('z'));
-    }
-
-    @Test
-    public void testLastIndexOf_char_int() {
-        StrBuilder sb = new StrBuilder("abab");
-        assertEquals(-1, sb.lastIndexOf('a', -1));
-        assertEquals(0, sb.lastIndexOf('a', 0));
-        assertEquals(0, sb.lastIndexOf('a', 1));
-
-        // should work like String#lastIndexOf
-        assertEquals("abab".lastIndexOf('a', 1), sb.lastIndexOf('a', 1));
-
-        assertEquals(1, sb.lastIndexOf('b', 2));
-        assertEquals("abab".lastIndexOf('b', 2), sb.lastIndexOf('b', 2));
-
-        assertEquals(-1, sb.lastIndexOf('z', 2));
-
-        sb = new StrBuilder("xyzabc");
-        assertEquals(2, sb.lastIndexOf('z', sb.length()));
-        assertEquals(-1, sb.lastIndexOf('z', 1));
-    }
-
-    // -----------------------------------------------------------------------
-    @Test
-    public void testIndexOf_String() {
-        final StrBuilder sb = new StrBuilder("abab");
-        
-        assertEquals(0, sb.indexOf("a"));
-        //should work like String#indexOf
-        assertEquals("abab".indexOf("a"), sb.indexOf("a"));
-        
-        assertEquals(0, sb.indexOf("ab"));
-        //should work like String#indexOf
-        assertEquals("abab".indexOf("ab"), sb.indexOf("ab"));
-        
-        assertEquals(1, sb.indexOf("b"));
-        assertEquals("abab".indexOf("b"), sb.indexOf("b"));
-        
-        assertEquals(1, sb.indexOf("ba"));
-        assertEquals("abab".indexOf("ba"), sb.indexOf("ba"));
-        
-        assertEquals(-1, sb.indexOf("z"));
-        
-        assertEquals(-1, sb.indexOf((String) null));
-    }
-
-    @Test
-    public void testIndexOf_String_int() {
-        StrBuilder sb = new StrBuilder("abab");
-        assertEquals(0, sb.indexOf("a", -1));
-        assertEquals(0, sb.indexOf("a", 0));
-        assertEquals(2, sb.indexOf("a", 1));
-        assertEquals(2, sb.indexOf("a", 2));
-        assertEquals(-1, sb.indexOf("a", 3));
-        assertEquals(-1, sb.indexOf("a", 4));
-        assertEquals(-1, sb.indexOf("a", 5));
-        
-        assertEquals(-1, sb.indexOf("abcdef", 0));
-        assertEquals(0, sb.indexOf("", 0));
-        assertEquals(1, sb.indexOf("", 1));
-        
-        //should work like String#indexOf
-        assertEquals ("abab".indexOf("a", 1), sb.indexOf("a", 1));
-        
-        assertEquals(2, sb.indexOf("ab", 1));
-        //should work like String#indexOf
-        assertEquals("abab".indexOf("ab", 1), sb.indexOf("ab", 1));
-        
-        assertEquals(3, sb.indexOf("b", 2));
-        assertEquals("abab".indexOf("b", 2), sb.indexOf("b", 2));
-        
-        assertEquals(1, sb.indexOf("ba", 1));
-        assertEquals("abab".indexOf("ba", 2), sb.indexOf("ba", 2));
-        
-        assertEquals(-1, sb.indexOf("z", 2));
-        
-        sb = new StrBuilder("xyzabc");
-        assertEquals(2, sb.indexOf("za", 0));
-        assertEquals(-1, sb.indexOf("za", 3));
-        
-        assertEquals(-1, sb.indexOf((String) null, 2));
-    }
-
-    @Test
-    public void testLastIndexOf_String() {
-        final StrBuilder sb = new StrBuilder("abab");
-        
-        assertEquals(2, sb.lastIndexOf("a"));
-        //should work like String#lastIndexOf
-        assertEquals("abab".lastIndexOf("a"), sb.lastIndexOf("a"));
-        
-        assertEquals(2, sb.lastIndexOf("ab"));
-        //should work like String#lastIndexOf
-        assertEquals("abab".lastIndexOf("ab"), sb.lastIndexOf("ab"));
-        
-        assertEquals(3, sb.lastIndexOf("b"));
-        assertEquals("abab".lastIndexOf("b"), sb.lastIndexOf("b"));
-        
-        assertEquals(1, sb.lastIndexOf("ba"));
-        assertEquals("abab".lastIndexOf("ba"), sb.lastIndexOf("ba"));
-        
-        assertEquals(-1, sb.lastIndexOf("z"));
-        
-        assertEquals(-1, sb.lastIndexOf((String) null));
-    }
-
-    @Test
-    public void testLastIndexOf_String_int() {
-        StrBuilder sb = new StrBuilder("abab");
-        assertEquals(-1, sb.lastIndexOf("a", -1));
-        assertEquals(0, sb.lastIndexOf("a", 0));
-        assertEquals(0, sb.lastIndexOf("a", 1));
-        assertEquals(2, sb.lastIndexOf("a", 2));
-        assertEquals(2, sb.lastIndexOf("a", 3));
-        assertEquals(2, sb.lastIndexOf("a", 4));
-        assertEquals(2, sb.lastIndexOf("a", 5));
-        
-        assertEquals(-1, sb.lastIndexOf("abcdef", 3));
-        assertEquals("abab".lastIndexOf("", 3), sb.lastIndexOf("", 3));
-        assertEquals("abab".lastIndexOf("", 1), sb.lastIndexOf("", 1));
-        
-        //should work like String#lastIndexOf
-        assertEquals("abab".lastIndexOf("a", 1), sb.lastIndexOf("a", 1));
-        
-        assertEquals(0, sb.lastIndexOf("ab", 1));
-        //should work like String#lastIndexOf
-        assertEquals("abab".lastIndexOf("ab", 1), sb.lastIndexOf("ab", 1));
-        
-        assertEquals(1, sb.lastIndexOf("b", 2));
-        assertEquals("abab".lastIndexOf("b", 2), sb.lastIndexOf("b", 2));
-        
-        assertEquals(1, sb.lastIndexOf("ba", 2));
-        assertEquals("abab".lastIndexOf("ba", 2), sb.lastIndexOf("ba", 2));
-        
-        assertEquals(-1, sb.lastIndexOf("z", 2));
-        
-        sb = new StrBuilder("xyzabc");
-        assertEquals(2, sb.lastIndexOf("za", sb.length()));
-        assertEquals(-1, sb.lastIndexOf("za", 1));
-        
-        assertEquals(-1, sb.lastIndexOf((String) null, 2));
-    }
-
-    // -----------------------------------------------------------------------
-    @Test
-    public void testIndexOf_StrMatcher() {
-        final StrBuilder sb = new StrBuilder();
-        assertEquals(-1, sb.indexOf((StrMatcher) null));
-        assertEquals(-1, sb.indexOf(StrMatcher.charMatcher('a')));
-        
-        sb.append("ab bd");
-        assertEquals(0, sb.indexOf(StrMatcher.charMatcher('a')));
-        assertEquals(1, sb.indexOf(StrMatcher.charMatcher('b')));
-        assertEquals(2, sb.indexOf(StrMatcher.spaceMatcher()));
-        assertEquals(4, sb.indexOf(StrMatcher.charMatcher('d')));
-        assertEquals(-1, sb.indexOf(StrMatcher.noneMatcher()));
-        assertEquals(-1, sb.indexOf((StrMatcher) null));
-        
-        sb.append(" A1 junction");
-        assertEquals(6, sb.indexOf(A_NUMBER_MATCHER));
-    }
-
-    @Test
-    public void testIndexOf_StrMatcher_int() {
-        final StrBuilder sb = new StrBuilder();
-        assertEquals(-1, sb.indexOf((StrMatcher) null, 2));
-        assertEquals(-1, sb.indexOf(StrMatcher.charMatcher('a'), 2));
-        assertEquals(-1, sb.indexOf(StrMatcher.charMatcher('a'), 0));
-        
-        sb.append("ab bd");
-        assertEquals(0, sb.indexOf(StrMatcher.charMatcher('a'), -2));
-        assertEquals(0, sb.indexOf(StrMatcher.charMatcher('a'), 0));
-        assertEquals(-1, sb.indexOf(StrMatcher.charMatcher('a'), 2));
-        assertEquals(-1, sb.indexOf(StrMatcher.charMatcher('a'), 20));
-        
-        assertEquals(1, sb.indexOf(StrMatcher.charMatcher('b'), -1));
-        assertEquals(1, sb.indexOf(StrMatcher.charMatcher('b'), 0));
-        assertEquals(1, sb.indexOf(StrMatcher.charMatcher('b'), 1));
-        assertEquals(3, sb.indexOf(StrMatcher.charMatcher('b'), 2));
-        assertEquals(3, sb.indexOf(StrMatcher.charMatcher('b'), 3));
-        assertEquals(-1, sb.indexOf(StrMatcher.charMatcher('b'), 4));
-        assertEquals(-1, sb.indexOf(StrMatcher.charMatcher('b'), 5));
-        assertEquals(-1, sb.indexOf(StrMatcher.charMatcher('b'), 6));
-        
-        assertEquals(2, sb.indexOf(StrMatcher.spaceMatcher(), -2));
-        assertEquals(2, sb.indexOf(StrMatcher.spaceMatcher(), 0));
-        assertEquals(2, sb.indexOf(StrMatcher.spaceMatcher(), 2));
-        assertEquals(-1, sb.indexOf(StrMatcher.spaceMatcher(), 4));
-        assertEquals(-1, sb.indexOf(StrMatcher.spaceMatcher(), 20));
-        
-        assertEquals(-1, sb.indexOf(StrMatcher.noneMatcher(), 0));
-        assertEquals(-1, sb.indexOf((StrMatcher) null, 0));
-        
-        sb.append(" A1 junction with A2");
-        assertEquals(6, sb.indexOf(A_NUMBER_MATCHER, 5));
-        assertEquals(6, sb.indexOf(A_NUMBER_MATCHER, 6));
-        assertEquals(23, sb.indexOf(A_NUMBER_MATCHER, 7));
-        assertEquals(23, sb.indexOf(A_NUMBER_MATCHER, 22));
-        assertEquals(23, sb.indexOf(A_NUMBER_MATCHER, 23));
-        assertEquals(-1, sb.indexOf(A_NUMBER_MATCHER, 24));
-    }
-
-    @Test
-    public void testLastIndexOf_StrMatcher() {
-        final StrBuilder sb = new StrBuilder();
-        assertEquals(-1, sb.lastIndexOf((StrMatcher) null));
-        assertEquals(-1, sb.lastIndexOf(StrMatcher.charMatcher('a')));
-        
-        sb.append("ab bd");
-        assertEquals(0, sb.lastIndexOf(StrMatcher.charMatcher('a')));
-        assertEquals(3, sb.lastIndexOf(StrMatcher.charMatcher('b')));
-        assertEquals(2, sb.lastIndexOf(StrMatcher.spaceMatcher()));
-        assertEquals(4, sb.lastIndexOf(StrMatcher.charMatcher('d')));
-        assertEquals(-1, sb.lastIndexOf(StrMatcher.noneMatcher()));
-        assertEquals(-1, sb.lastIndexOf((StrMatcher) null));
-        
-        sb.append(" A1 junction");
-        assertEquals(6, sb.lastIndexOf(A_NUMBER_MATCHER));
-    }
-
-    @Test
-    public void testLastIndexOf_StrMatcher_int() {
-        final StrBuilder sb = new StrBuilder();
-        assertEquals(-1, sb.lastIndexOf((StrMatcher) null, 2));
-        assertEquals(-1, sb.lastIndexOf(StrMatcher.charMatcher('a'), 2));
-        assertEquals(-1, sb.lastIndexOf(StrMatcher.charMatcher('a'), 0));
-        assertEquals(-1, sb.lastIndexOf(StrMatcher.charMatcher('a'), -1));
-        
-        sb.append("ab bd");
-        assertEquals(-1, sb.lastIndexOf(StrMatcher.charMatcher('a'), -2));
-        assertEquals(0, sb.lastIndexOf(StrMatcher.charMatcher('a'), 0));
-        assertEquals(0, sb.lastIndexOf(StrMatcher.charMatcher('a'), 2));
-        assertEquals(0, sb.lastIndexOf(StrMatcher.charMatcher('a'), 20));
-        
-        assertEquals(-1, sb.lastIndexOf(StrMatcher.charMatcher('b'), -1));
-        assertEquals(-1, sb.lastIndexOf(StrMatcher.charMatcher('b'), 0));
-        assertEquals(1, sb.lastIndexOf(StrMatcher.charMatcher('b'), 1));
-        assertEquals(1, sb.lastIndexOf(StrMatcher.charMatcher('b'), 2));
-        assertEquals(3, sb.lastIndexOf(StrMatcher.charMatcher('b'), 3));
-        assertEquals(3, sb.lastIndexOf(StrMatcher.charMatcher('b'), 4));
-        assertEquals(3, sb.lastIndexOf(StrMatcher.charMatcher('b'), 5));
-        assertEquals(3, sb.lastIndexOf(StrMatcher.charMatcher('b'), 6));
-        
-        assertEquals(-1, sb.lastIndexOf(StrMatcher.spaceMatcher(), -2));
-        assertEquals(-1, sb.lastIndexOf(StrMatcher.spaceMatcher(), 0));
-        assertEquals(2, sb.lastIndexOf(StrMatcher.spaceMatcher(), 2));
-        assertEquals(2, sb.lastIndexOf(StrMatcher.spaceMatcher(), 4));
-        assertEquals(2, sb.lastIndexOf(StrMatcher.spaceMatcher(), 20));
-        
-        assertEquals(-1, sb.lastIndexOf(StrMatcher.noneMatcher(), 0));
-        assertEquals(-1, sb.lastIndexOf((StrMatcher) null, 0));
-        
-        sb.append(" A1 junction with A2");
-        assertEquals(-1, sb.lastIndexOf(A_NUMBER_MATCHER, 5));
-        assertEquals(-1, sb.lastIndexOf(A_NUMBER_MATCHER, 6)); // A matches, 1 is outside bounds
-        assertEquals(6, sb.lastIndexOf(A_NUMBER_MATCHER, 7));
-        assertEquals(6, sb.lastIndexOf(A_NUMBER_MATCHER, 22));
-        assertEquals(6, sb.lastIndexOf(A_NUMBER_MATCHER, 23)); // A matches, 2 is outside bounds
-        assertEquals(23, sb.lastIndexOf(A_NUMBER_MATCHER, 24));
-    }
-
-    static final StrMatcher A_NUMBER_MATCHER = new StrMatcher() {
-        @Override
-        public int isMatch(final char[] buffer, int pos, final int bufferStart, final int bufferEnd) {
-            if (buffer[pos] == 'A') {
-                pos++;
-                if (pos < bufferEnd && buffer[pos] >= '0' && buffer[pos] <= '9') {
-                    return 2;
-                }
-            }
-            return 0;
-        }
-    };
-
-    //-----------------------------------------------------------------------
-    @Test
-    public void testAsTokenizer() throws Exception {
-        // from Javadoc
-        final StrBuilder b = new StrBuilder();
-        b.append("a b ");
-        final StrTokenizer t = b.asTokenizer();
-        
-        final String[] tokens1 = t.getTokenArray();
-        assertEquals(2, tokens1.length);
-        assertEquals("a", tokens1[0]);
-        assertEquals("b", tokens1[1]);
-        assertEquals(2, t.size());
-        
-        b.append("c d ");
-        final String[] tokens2 = t.getTokenArray();
-        assertEquals(2, tokens2.length);
-        assertEquals("a", tokens2[0]);
-        assertEquals("b", tokens2[1]);
-        assertEquals(2, t.size());
-        assertEquals("a", t.next());
-        assertEquals("b", t.next());
-        
-        t.reset();
-        final String[] tokens3 = t.getTokenArray();
-        assertEquals(4, tokens3.length);
-        assertEquals("a", tokens3[0]);
-        assertEquals("b", tokens3[1]);
-        assertEquals("c", tokens3[2]);
-        assertEquals("d", tokens3[3]);
-        assertEquals(4, t.size());
-        assertEquals("a", t.next());
-        assertEquals("b", t.next());
-        assertEquals("c", t.next());
-        assertEquals("d", t.next());
-        
-        assertEquals("a b c d ", t.getContent());
-    }
-
-    // -----------------------------------------------------------------------
-    @Test
-    public void testAsReader() throws Exception {
-        final StrBuilder sb = new StrBuilder("some text");
-        Reader reader = sb.asReader();
-        assertTrue(reader.ready());
-        final char[] buf = new char[40];
-        assertEquals(9, reader.read(buf));
-        assertEquals("some text", new String(buf, 0, 9));
-        
-        assertEquals(-1, reader.read());
-        assertFalse(reader.ready());
-        assertEquals(0, reader.skip(2));
-        assertEquals(0, reader.skip(-1));
-        
-        assertTrue(reader.markSupported());
-        reader = sb.asReader();
-        assertEquals('s', reader.read());
-        reader.mark(-1);
-        char[] array = new char[3];
-        assertEquals(3, reader.read(array, 0, 3));
-        assertEquals('o', array[0]);
-        assertEquals('m', array[1]);
-        assertEquals('e', array[2]);
-        reader.reset();
-        assertEquals(1, reader.read(array, 1, 1));
-        assertEquals('o', array[0]);
-        assertEquals('o', array[1]);
-        assertEquals('e', array[2]);
-        assertEquals(2, reader.skip(2));
-        assertEquals(' ', reader.read());
-        
-        assertTrue(reader.ready());
-        reader.close();
-        assertTrue(reader.ready());
-        
-        reader = sb.asReader();
-        array = new char[3];
-        try {
-            reader.read(array, -1, 0);
-            fail();
-        } catch (final IndexOutOfBoundsException ex) {}
-        try {
-            reader.read(array, 0, -1);
-            fail();
-        } catch (final IndexOutOfBoundsException ex) {}
-        try {
-            reader.read(array, 100, 1);
-            fail();
-        } catch (final IndexOutOfBoundsException ex) {}
-        try {
-            reader.read(array, 0, 100);
-            fail();
-        } catch (final IndexOutOfBoundsException ex) {}
-        try {
-            reader.read(array, Integer.MAX_VALUE, Integer.MAX_VALUE);
-            fail();
-        } catch (final IndexOutOfBoundsException ex) {}
-        
-        assertEquals(0, reader.read(array, 0, 0));
-        assertEquals(0, array[0]);
-        assertEquals(0, array[1]);
-        assertEquals(0, array[2]);
-        
-        reader.skip(9);
-        assertEquals(-1, reader.read(array, 0, 1));
-        
-        reader.reset();
-        array = new char[30];
-        assertEquals(9, reader.read(array, 0, 30));
-    }
-
-    //-----------------------------------------------------------------------
-    @Test
-    public void testAsWriter() throws Exception {
-        final StrBuilder sb = new StrBuilder("base");
-        final Writer writer = sb.asWriter();
-        
-        writer.write('l');
-        assertEquals("basel", sb.toString());
-        
-        writer.write(new char[] {'i', 'n'});
-        assertEquals("baselin", sb.toString());
-        
-        writer.write(new char[] {'n', 'e', 'r'}, 1, 2);
-        assertEquals("baseliner", sb.toString());
-        
-        writer.write(" rout");
-        assertEquals("baseliner rout", sb.toString());
-        
-        writer.write("ping that server", 1, 3);
-        assertEquals("baseliner routing", sb.toString());
-        
-        writer.flush();  // no effect
-        assertEquals("baseliner routing", sb.toString());
-        
-        writer.close();  // no effect
-        assertEquals("baseliner routing", sb.toString());
-        
-        writer.write(" hi");  // works after close
-        assertEquals("baseliner routing hi", sb.toString());
-        
-        sb.setLength(4);  // mix and match
-        writer.write('d');
-        assertEquals("based", sb.toString());
-    }
-
-    //-----------------------------------------------------------------------
-    @Test
-    public void testEqualsIgnoreCase() {
-        final StrBuilder sb1 = new StrBuilder();
-        final StrBuilder sb2 = new StrBuilder();
-        assertTrue(sb1.equalsIgnoreCase(sb1));
-        assertTrue(sb1.equalsIgnoreCase(sb2));
-        assertTrue(sb2.equalsIgnoreCase(sb2));
-        
-        sb1.append("abc");
-        assertFalse(sb1.equalsIgnoreCase(sb2));
-        
-        sb2.append("ABC");
-        assertTrue(sb1.equalsIgnoreCase(sb2));
-        
-        sb2.clear().append("abc");
-        assertTrue(sb1.equalsIgnoreCase(sb2));
-        assertTrue(sb1.equalsIgnoreCase(sb1));
-        assertTrue(sb2.equalsIgnoreCase(sb2));
-        
-        sb2.clear().append("aBc");
-        assertTrue(sb1.equalsIgnoreCase(sb2));
-    }
-
-    //-----------------------------------------------------------------------
-    @Test
-    public void testEquals() {
-        final StrBuilder sb1 = new StrBuilder();
-        final StrBuilder sb2 = new StrBuilder();
-        assertTrue(sb1.equals(sb2));
-        assertTrue(sb1.equals(sb1));
-        assertTrue(sb2.equals(sb2));
-        assertTrue(sb1.equals((Object) sb2));
-        
-        sb1.append("abc");
-        assertFalse(sb1.equals(sb2));
-        assertFalse(sb1.equals((Object) sb2));
-        
-        sb2.append("ABC");
-        assertFalse(sb1.equals(sb2));
-        assertFalse(sb1.equals((Object) sb2));
-        
-        sb2.clear().append("abc");
-        assertTrue(sb1.equals(sb2));
-        assertTrue(sb1.equals((Object) sb2));
-        
-        assertFalse(sb1.equals(Integer.valueOf(1)));
-        assertFalse(sb1.equals("abc"));
-    }
-
-    //-----------------------------------------------------------------------
-    @Test
-    public void testHashCode() {
-        final StrBuilder sb = new StrBuilder();
-        final int hc1a = sb.hashCode();
-        final int hc1b = sb.hashCode();
-        assertEquals(0, hc1a);
-        assertEquals(hc1a, hc1b);
-        
-        sb.append("abc");
-        final int hc2a = sb.hashCode();
-        final int hc2b = sb.hashCode();
-        assertTrue(hc2a != 0);
-        assertEquals(hc2a, hc2b);
-    }
-
-    //-----------------------------------------------------------------------
-    @Test
-    public void testToString() {
-        final StrBuilder sb = new StrBuilder("abc");
-        assertEquals("abc", sb.toString());
-    }
-
-    //-----------------------------------------------------------------------
-    @Test
-    public void testToStringBuffer() {
-        final StrBuilder sb = new StrBuilder();
-        assertEquals(new StringBuffer().toString(), sb.toStringBuffer().toString());
-        
-        sb.append("junit");
-        assertEquals(new StringBuffer("junit").toString(), sb.toStringBuffer().toString());
-    }
-
-    //-----------------------------------------------------------------------
-    @Test
-    public void testToStringBuilder() {
-        final StrBuilder sb = new StrBuilder();
-        assertEquals(new StringBuilder().toString(), sb.toStringBuilder().toString());
-        
-        sb.append("junit");
-        assertEquals(new StringBuilder("junit").toString(), sb.toStringBuilder().toString());
-    }
-
-    //-----------------------------------------------------------------------
-    @Test
-    public void testLang294() {
-        final StrBuilder sb = new StrBuilder("\n%BLAH%\nDo more stuff\neven more stuff\n%BLAH%\n");
-        sb.deleteAll("\n%BLAH%");
-        assertEquals("\nDo more stuff\neven more stuff\n", sb.toString()); 
-    }
-
-    @Test
-    public void testIndexOfLang294() {
-        final StrBuilder sb = new StrBuilder("onetwothree");
-        sb.deleteFirst("three");
-        assertEquals(-1, sb.indexOf("three"));
-    }
-
-    //-----------------------------------------------------------------------
-    @Test
-    public void testLang295() {
-        final StrBuilder sb = new StrBuilder("onetwothree");
-        sb.deleteFirst("three");
-        assertFalse( "The contains(char) method is looking beyond the end of the string", sb.contains('h'));
-        assertEquals( "The indexOf(char) method is looking beyond the end of the string", -1, sb.indexOf('h'));
-    }
-
-    //-----------------------------------------------------------------------
-    @Test
-    public void testLang412Right() {
-        final StrBuilder sb = new StrBuilder();
-        sb.appendFixedWidthPadRight(null, 10, '*');
-        assertEquals( "Failed to invoke appendFixedWidthPadRight correctly", "**********", sb.toString());
-    }
-
-    @Test
-    public void testLang412Left() {
-        final StrBuilder sb = new StrBuilder();
-        sb.appendFixedWidthPadLeft(null, 10, '*');
-        assertEquals( "Failed to invoke appendFixedWidthPadLeft correctly", "**********", sb.toString());
-    }
-
-    @Test
-    public void testAsBuilder() {
-        final StrBuilder sb = new StrBuilder().appendAll("Lorem", " ", "ipsum", " ", "dolor");
-        assertEquals(sb.toString(), sb.build());
-    }
-
-    //-----------------------------------------------------------------------
-    @Test
-    public void testAppendCharBuffer() {
-        final StrBuilder sb1 = new StrBuilder();
-        final CharBuffer buf = CharBuffer.allocate(10);
-        buf.append("0123456789");
-        buf.flip();
-        sb1.append(buf);
-        assertEquals("0123456789", sb1.toString());
-
-        final StrBuilder sb2 = new StrBuilder();
-        sb2.append(buf, 1, 8);
-        assertEquals("12345678", sb2.toString());
-    }
-
-    //-----------------------------------------------------------------------
-    @Test
-    public void testAppendToWriter() throws Exception {
-        final StrBuilder sb = new StrBuilder("1234567890");
-        final StringWriter writer = new StringWriter();
-        writer.append("Test ");
-
-        sb.appendTo(writer);
-
-        assertEquals("Test 1234567890", writer.toString());
-    }
-
-    @Test
-    public void testAppendToStringBuilder() throws Exception {
-        final StrBuilder sb = new StrBuilder("1234567890");
-        final StringBuilder builder = new StringBuilder("Test ");
-
-        sb.appendTo(builder);
-
-        assertEquals("Test 1234567890", builder.toString());
-    }
-
-    @Test
-    public void testAppendToStringBuffer() throws Exception {
-        final StrBuilder sb = new StrBuilder("1234567890");
-        final StringBuffer buffer = new StringBuffer("Test ");
-
-        sb.appendTo(buffer);
-
-        assertEquals("Test 1234567890", buffer.toString());
-    }
-
-    @Test
-    public void testAppendToCharBuffer() throws Exception {
-        final StrBuilder sb = new StrBuilder("1234567890");
-        final String text = "Test ";
-        final CharBuffer buffer = CharBuffer.allocate(sb.size() + text.length());
-        buffer.put(text);
-
-        sb.appendTo(buffer);
-
-        buffer.flip();
-        assertEquals("Test 1234567890", buffer.toString());
-    }
-}
diff --git a/lang/src/test/java/org/apache/commons/lang3/text/StrLookupTest.java b/lang/src/test/java/org/apache/commons/lang3/text/StrLookupTest.java
deleted file mode 100644
index 0f55738..0000000
--- a/lang/src/test/java/org/apache/commons/lang3/text/StrLookupTest.java
+++ /dev/null
@@ -1,92 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- * 
- *      http://www.apache.org/licenses/LICENSE-2.0
- * 
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package org.apache.commons.lang3.text;
-
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.fail;
-
-import java.util.HashMap;
-import java.util.Map;
-
-import org.junit.Test;
-
-/**
- * Test class for StrLookup.
- *
- * @version $Id$
- */
-public class StrLookupTest  {
-
-    //-----------------------------------------------------------------------
-    @Test
-    public void testNoneLookup() {
-        assertEquals(null, StrLookup.noneLookup().lookup(null));
-        assertEquals(null, StrLookup.noneLookup().lookup(""));
-        assertEquals(null, StrLookup.noneLookup().lookup("any"));
-    }
-
-    @Test
-    public void testSystemProperiesLookup() {
-        assertEquals(System.getProperty("os.name"), StrLookup.systemPropertiesLookup().lookup("os.name"));
-        assertEquals(null, StrLookup.systemPropertiesLookup().lookup(""));
-        assertEquals(null, StrLookup.systemPropertiesLookup().lookup("other"));
-        try {
-            StrLookup.systemPropertiesLookup().lookup(null);
-            fail();
-        } catch (final NullPointerException ex) {
-            // expected
-        }
-    }
-
-    @Test
-    public void testSystemPropertiesLookupNotSingleton() {
-        final String osName = "os.name";
-        final String originalOsName = System.getProperty(osName);
-
-        StrLookup<String> properties1 = StrLookup.systemPropertiesLookup();
-        assertEquals(originalOsName, properties1.lookup(osName));
-
-        final String differentOsName = "HAL-9000";
-        System.setProperty(osName, differentOsName);
-        StrLookup<String> properties2 = StrLookup.systemPropertiesLookup();
-
-        assertEquals(originalOsName, properties1.lookup(osName));
-        assertEquals(differentOsName, properties2.lookup(osName));
-    }
-
-    @Test
-    public void testMapLookup() {
-        final Map<String, Object> map = new HashMap<String, Object>();
-        map.put("key", "value");
-        map.put("number", Integer.valueOf(2));
-        assertEquals("value", StrLookup.mapLookup(map).lookup("key"));
-        assertEquals("2", StrLookup.mapLookup(map).lookup("number"));
-        assertEquals(null, StrLookup.mapLookup(map).lookup(null));
-        assertEquals(null, StrLookup.mapLookup(map).lookup(""));
-        assertEquals(null, StrLookup.mapLookup(map).lookup("other"));
-    }
-
-    @Test
-    public void testMapLookup_nullMap() {
-        final Map<String, ?> map = null;
-        assertEquals(null, StrLookup.mapLookup(map).lookup(null));
-        assertEquals(null, StrLookup.mapLookup(map).lookup(""));
-        assertEquals(null, StrLookup.mapLookup(map).lookup("any"));
-    }
-
-}
diff --git a/lang/src/test/java/org/apache/commons/lang3/text/StrMatcherTest.java b/lang/src/test/java/org/apache/commons/lang3/text/StrMatcherTest.java
deleted file mode 100644
index 89bc3a7..0000000
--- a/lang/src/test/java/org/apache/commons/lang3/text/StrMatcherTest.java
+++ /dev/null
@@ -1,217 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- * 
- *      http://www.apache.org/licenses/LICENSE-2.0
- * 
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package org.apache.commons.lang3.text;
-
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertSame;
-import static org.junit.Assert.assertTrue;
-
-import org.junit.Test;
-
-/**
- * Unit tests for {@link org.apache.commons.lang3.text.StrMatcher}.
- *
- * @version $Id$
- */
-public class StrMatcherTest  {
-
-    private static final char[] BUFFER1 = "0,1\t2 3\n\r\f\u0000'\"".toCharArray();
-
-    private static final char[] BUFFER2 = "abcdef".toCharArray();
-
-
-    //-----------------------------------------------------------------------
-    @Test
-    public void testCommaMatcher() {
-        final StrMatcher matcher = StrMatcher.commaMatcher();
-        assertSame(matcher, StrMatcher.commaMatcher());
-        assertEquals(0, matcher.isMatch(BUFFER1, 0));
-        assertEquals(1, matcher.isMatch(BUFFER1, 1));
-        assertEquals(0, matcher.isMatch(BUFFER1, 2));
-    }
-
-    //-----------------------------------------------------------------------
-    @Test
-    public void testTabMatcher() {
-        final StrMatcher matcher = StrMatcher.tabMatcher();
-        assertSame(matcher, StrMatcher.tabMatcher());
-        assertEquals(0, matcher.isMatch(BUFFER1, 2));
-        assertEquals(1, matcher.isMatch(BUFFER1, 3));
-        assertEquals(0, matcher.isMatch(BUFFER1, 4));
-    }
-
-    //-----------------------------------------------------------------------
-    @Test
-    public void testSpaceMatcher() {
-        final StrMatcher matcher = StrMatcher.spaceMatcher();
-        assertSame(matcher, StrMatcher.spaceMatcher());
-        assertEquals(0, matcher.isMatch(BUFFER1, 4));
-        assertEquals(1, matcher.isMatch(BUFFER1, 5));
-        assertEquals(0, matcher.isMatch(BUFFER1, 6));
-    }
-
-    //-----------------------------------------------------------------------
-    @Test
-    public void testSplitMatcher() {
-        final StrMatcher matcher = StrMatcher.splitMatcher();
-        assertSame(matcher, StrMatcher.splitMatcher());
-        assertEquals(0, matcher.isMatch(BUFFER1, 2));
-        assertEquals(1, matcher.isMatch(BUFFER1, 3));
-        assertEquals(0, matcher.isMatch(BUFFER1, 4));
-        assertEquals(1, matcher.isMatch(BUFFER1, 5));
-        assertEquals(0, matcher.isMatch(BUFFER1, 6));
-        assertEquals(1, matcher.isMatch(BUFFER1, 7));
-        assertEquals(1, matcher.isMatch(BUFFER1, 8));
-        assertEquals(1, matcher.isMatch(BUFFER1, 9));
-        assertEquals(0, matcher.isMatch(BUFFER1, 10));
-    }
-
-    //-----------------------------------------------------------------------
-    @Test
-    public void testTrimMatcher() {
-        final StrMatcher matcher = StrMatcher.trimMatcher();
-        assertSame(matcher, StrMatcher.trimMatcher());
-        assertEquals(0, matcher.isMatch(BUFFER1, 2));
-        assertEquals(1, matcher.isMatch(BUFFER1, 3));
-        assertEquals(0, matcher.isMatch(BUFFER1, 4));
-        assertEquals(1, matcher.isMatch(BUFFER1, 5));
-        assertEquals(0, matcher.isMatch(BUFFER1, 6));
-        assertEquals(1, matcher.isMatch(BUFFER1, 7));
-        assertEquals(1, matcher.isMatch(BUFFER1, 8));
-        assertEquals(1, matcher.isMatch(BUFFER1, 9));
-        assertEquals(1, matcher.isMatch(BUFFER1, 10));
-    }
-
-    //-----------------------------------------------------------------------
-    @Test
-    public void testSingleQuoteMatcher() {
-        final StrMatcher matcher = StrMatcher.singleQuoteMatcher();
-        assertSame(matcher, StrMatcher.singleQuoteMatcher());
-        assertEquals(0, matcher.isMatch(BUFFER1, 10));
-        assertEquals(1, matcher.isMatch(BUFFER1, 11));
-        assertEquals(0, matcher.isMatch(BUFFER1, 12));
-    }
-
-    //-----------------------------------------------------------------------
-    @Test
-    public void testDoubleQuoteMatcher() {
-        final StrMatcher matcher = StrMatcher.doubleQuoteMatcher();
-        assertSame(matcher, StrMatcher.doubleQuoteMatcher());
-        assertEquals(0, matcher.isMatch(BUFFER1, 11));
-        assertEquals(1, matcher.isMatch(BUFFER1, 12));
-    }
-
-    //-----------------------------------------------------------------------
-    @Test
-    public void testQuoteMatcher() {
-        final StrMatcher matcher = StrMatcher.quoteMatcher();
-        assertSame(matcher, StrMatcher.quoteMatcher());
-        assertEquals(0, matcher.isMatch(BUFFER1, 10));
-        assertEquals(1, matcher.isMatch(BUFFER1, 11));
-        assertEquals(1, matcher.isMatch(BUFFER1, 12));
-    }
-
-    //-----------------------------------------------------------------------
-    @Test
-    public void testNoneMatcher() {
-        final StrMatcher matcher = StrMatcher.noneMatcher();
-        assertSame(matcher, StrMatcher.noneMatcher());
-        assertEquals(0, matcher.isMatch(BUFFER1, 0));
-        assertEquals(0, matcher.isMatch(BUFFER1, 1));
-        assertEquals(0, matcher.isMatch(BUFFER1, 2));
-        assertEquals(0, matcher.isMatch(BUFFER1, 3));
-        assertEquals(0, matcher.isMatch(BUFFER1, 4));
-        assertEquals(0, matcher.isMatch(BUFFER1, 5));
-        assertEquals(0, matcher.isMatch(BUFFER1, 6));
-        assertEquals(0, matcher.isMatch(BUFFER1, 7));
-        assertEquals(0, matcher.isMatch(BUFFER1, 8));
-        assertEquals(0, matcher.isMatch(BUFFER1, 9));
-        assertEquals(0, matcher.isMatch(BUFFER1, 10));
-        assertEquals(0, matcher.isMatch(BUFFER1, 11));
-        assertEquals(0, matcher.isMatch(BUFFER1, 12));
-    }
-
-    //-----------------------------------------------------------------------
-    @Test
-    public void testCharMatcher_char() {
-        final StrMatcher matcher = StrMatcher.charMatcher('c');
-        assertEquals(0, matcher.isMatch(BUFFER2, 0));
-        assertEquals(0, matcher.isMatch(BUFFER2, 1));
-        assertEquals(1, matcher.isMatch(BUFFER2, 2));
-        assertEquals(0, matcher.isMatch(BUFFER2, 3));
-        assertEquals(0, matcher.isMatch(BUFFER2, 4));
-        assertEquals(0, matcher.isMatch(BUFFER2, 5));
-    }
-
-    //-----------------------------------------------------------------------
-    @Test
-    public void testCharSetMatcher_String() {
-        final StrMatcher matcher = StrMatcher.charSetMatcher("ace");
-        assertEquals(1, matcher.isMatch(BUFFER2, 0));
-        assertEquals(0, matcher.isMatch(BUFFER2, 1));
-        assertEquals(1, matcher.isMatch(BUFFER2, 2));
-        assertEquals(0, matcher.isMatch(BUFFER2, 3));
-        assertEquals(1, matcher.isMatch(BUFFER2, 4));
-        assertEquals(0, matcher.isMatch(BUFFER2, 5));
-        assertSame(StrMatcher.noneMatcher(), StrMatcher.charSetMatcher(""));
-        assertSame(StrMatcher.noneMatcher(), StrMatcher.charSetMatcher((String) null));
-        assertTrue(StrMatcher.charSetMatcher("a") instanceof StrMatcher.CharMatcher);
-    }
-
-    //-----------------------------------------------------------------------
-    @Test
-    public void testCharSetMatcher_charArray() {
-        final StrMatcher matcher = StrMatcher.charSetMatcher("ace".toCharArray());
-        assertEquals(1, matcher.isMatch(BUFFER2, 0));
-        assertEquals(0, matcher.isMatch(BUFFER2, 1));
-        assertEquals(1, matcher.isMatch(BUFFER2, 2));
-        assertEquals(0, matcher.isMatch(BUFFER2, 3));
-        assertEquals(1, matcher.isMatch(BUFFER2, 4));
-        assertEquals(0, matcher.isMatch(BUFFER2, 5));
-        assertSame(StrMatcher.noneMatcher(), StrMatcher.charSetMatcher(new char[0]));
-        assertSame(StrMatcher.noneMatcher(), StrMatcher.charSetMatcher((char[]) null));
-        assertTrue(StrMatcher.charSetMatcher("a".toCharArray()) instanceof StrMatcher.CharMatcher);
-    }
-
-    //-----------------------------------------------------------------------
-    @Test
-    public void testStringMatcher_String() {
-        final StrMatcher matcher = StrMatcher.stringMatcher("bc");
-        assertEquals(0, matcher.isMatch(BUFFER2, 0));
-        assertEquals(2, matcher.isMatch(BUFFER2, 1));
-        assertEquals(0, matcher.isMatch(BUFFER2, 2));
-        assertEquals(0, matcher.isMatch(BUFFER2, 3));
-        assertEquals(0, matcher.isMatch(BUFFER2, 4));
-        assertEquals(0, matcher.isMatch(BUFFER2, 5));
-        assertSame(StrMatcher.noneMatcher(), StrMatcher.stringMatcher(""));
-        assertSame(StrMatcher.noneMatcher(), StrMatcher.stringMatcher((String) null));
-    }
-
-    //-----------------------------------------------------------------------
-    @Test
-    public void testMatcherIndices() {
-        // remember that the API contract is tight for the isMatch() method
-        // all the onus is on the caller, so invalid inputs are not
-        // the concern of StrMatcher, and are not bugs
-        final StrMatcher matcher = StrMatcher.stringMatcher("bc");
-        assertEquals(2, matcher.isMatch(BUFFER2, 1, 1, BUFFER2.length));
-        assertEquals(2, matcher.isMatch(BUFFER2, 1, 0, 3));
-        assertEquals(0, matcher.isMatch(BUFFER2, 1, 0, 2));
-    }
-
-}
diff --git a/lang/src/test/java/org/apache/commons/lang3/text/StrSubstitutorTest.java b/lang/src/test/java/org/apache/commons/lang3/text/StrSubstitutorTest.java
deleted file mode 100644
index 89ee7b4..0000000
--- a/lang/src/test/java/org/apache/commons/lang3/text/StrSubstitutorTest.java
+++ /dev/null
@@ -1,727 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package org.apache.commons.lang3.text;
-
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertFalse;
-import static org.junit.Assert.assertNull;
-import static org.junit.Assert.assertSame;
-import static org.junit.Assert.assertTrue;
-import static org.junit.Assert.fail;
-
-import java.util.HashMap;
-import java.util.Map;
-import java.util.Properties;
-
-import org.apache.commons.lang3.mutable.MutableObject;
-import org.junit.After;
-import org.junit.Before;
-import org.junit.Test;
-
-/**
- * Test class for StrSubstitutor.
- *
- * @version $Id$
- */
-public class StrSubstitutorTest {
-
-    private Map<String, String> values;
-
-    @Before
-    public void setUp() throws Exception {
-        values = new HashMap<String, String>();
-        values.put("animal", "quick brown fox");
-        values.put("target", "lazy dog");
-    }
-
-    @After
-    public void tearDown() throws Exception {
-        values = null;
-    }
-
-    //-----------------------------------------------------------------------
-    /**
-     * Tests simple key replace.
-     */
-    @Test
-    public void testReplaceSimple() {
-        doTestReplace("The quick brown fox jumps over the lazy dog.", "The ${animal} jumps over the ${target}.", true);
-    }
-
-    /**
-     * Tests simple key replace.
-     */
-    @Test
-    public void testReplaceSolo() {
-        doTestReplace("quick brown fox", "${animal}", false);
-    }
-
-    /**
-     * Tests replace with no variables.
-     */
-    @Test
-    public void testReplaceNoVariables() {
-        doTestNoReplace("The balloon arrived.");
-    }
-
-    /**
-     * Tests replace with null.
-     */
-    @Test
-    public void testReplaceNull() {
-        doTestNoReplace(null);
-    }
-
-    /**
-     * Tests replace with null.
-     */
-    @Test
-    public void testReplaceEmpty() {
-        doTestNoReplace("");
-    }
-
-    /**
-     * Tests key replace changing map after initialization (not recommended).
-     */
-    @Test
-    public void testReplaceChangedMap() {
-        final StrSubstitutor sub = new StrSubstitutor(values);
-        values.put("target", "moon");
-        assertEquals("The quick brown fox jumps over the moon.", sub.replace("The ${animal} jumps over the ${target}."));
-    }
-
-    /**
-     * Tests unknown key replace.
-     */
-    @Test
-    public void testReplaceUnknownKey() {
-        doTestReplace("The ${person} jumps over the lazy dog.", "The ${person} jumps over the ${target}.", true);
-        doTestReplace("The ${person} jumps over the lazy dog. 1234567890.", "The ${person} jumps over the ${target}. ${undefined.number:-1234567890}.", true);
-    }
-
-    /**
-     * Tests adjacent keys.
-     */
-    @Test
-    public void testReplaceAdjacentAtStart() {
-        values.put("code", "GBP");
-        values.put("amount", "12.50");
-        final StrSubstitutor sub = new StrSubstitutor(values);
-        assertEquals("GBP12.50 charged", sub.replace("${code}${amount} charged"));
-    }
-
-    /**
-     * Tests adjacent keys.
-     */
-    @Test
-    public void testReplaceAdjacentAtEnd() {
-        values.put("code", "GBP");
-        values.put("amount", "12.50");
-        final StrSubstitutor sub = new StrSubstitutor(values);
-        assertEquals("Amount is GBP12.50", sub.replace("Amount is ${code}${amount}"));
-    }
-
-    /**
-     * Tests simple recursive replace.
-     */
-    @Test
-    public void testReplaceRecursive() {
-        values.put("animal", "${critter}");
-        values.put("target", "${pet}");
-        values.put("pet", "${petCharacteristic} dog");
-        values.put("petCharacteristic", "lazy");
-        values.put("critter", "${critterSpeed} ${critterColor} ${critterType}");
-        values.put("critterSpeed", "quick");
-        values.put("critterColor", "brown");
-        values.put("critterType", "fox");
-        doTestReplace("The quick brown fox jumps over the lazy dog.", "The ${animal} jumps over the ${target}.", true);
-
-        values.put("pet", "${petCharacteristicUnknown:-lazy} dog");
-        doTestReplace("The quick brown fox jumps over the lazy dog.", "The ${animal} jumps over the ${target}.", true);
-    }
-
-    /**
-     * Tests escaping.
-     */
-    @Test
-    public void testReplaceEscaping() {
-        doTestReplace("The ${animal} jumps over the lazy dog.", "The $${animal} jumps over the ${target}.", true);
-    }
-
-    /**
-     * Tests escaping.
-     */
-    @Test
-    public void testReplaceSoloEscaping() {
-        doTestReplace("${animal}", "$${animal}", false);
-    }
-
-    /**
-     * Tests complex escaping.
-     */
-    @Test
-    public void testReplaceComplexEscaping() {
-        doTestReplace("The ${quick brown fox} jumps over the lazy dog.", "The $${${animal}} jumps over the ${target}.", true);
-        doTestReplace("The ${quick brown fox} jumps over the lazy dog. ${1234567890}.", "The $${${animal}} jumps over the ${target}. $${${undefined.number:-1234567890}}.", true);
-    }
-
-    /**
-     * Tests when no prefix or suffix.
-     */
-    @Test
-    public void testReplaceNoPrefixNoSuffix() {
-        doTestReplace("The animal jumps over the lazy dog.", "The animal jumps over the ${target}.", true);
-    }
-
-    /**
-     * Tests when no incomplete prefix.
-     */
-    @Test
-    public void testReplaceIncompletePrefix() {
-        doTestReplace("The {animal} jumps over the lazy dog.", "The {animal} jumps over the ${target}.", true);
-    }
-
-    /**
-     * Tests when prefix but no suffix.
-     */
-    @Test
-    public void testReplacePrefixNoSuffix() {
-        doTestReplace("The ${animal jumps over the ${target} lazy dog.", "The ${animal jumps over the ${target} ${target}.", true);
-    }
-
-    /**
-     * Tests when suffix but no prefix.
-     */
-    @Test
-    public void testReplaceNoPrefixSuffix() {
-        doTestReplace("The animal} jumps over the lazy dog.", "The animal} jumps over the ${target}.", true);
-    }
-
-    /**
-     * Tests when no variable name.
-     */
-    @Test
-    public void testReplaceEmptyKeys() {
-        doTestReplace("The ${} jumps over the lazy dog.", "The ${} jumps over the ${target}.", true);
-        doTestReplace("The animal jumps over the lazy dog.", "The ${:-animal} jumps over the ${target}.", true);
-    }
-
-    /**
-     * Tests replace creates output same as input.
-     */
-    @Test
-    public void testReplaceToIdentical() {
-        values.put("animal", "$${${thing}}");
-        values.put("thing", "animal");
-        doTestReplace("The ${animal} jumps.", "The ${animal} jumps.", true);
-    }
-
-    /**
-     * Tests a cyclic replace operation.
-     * The cycle should be detected and cause an exception to be thrown.
-     */
-    @Test
-    public void testCyclicReplacement() {
-        final Map<String, String> map = new HashMap<String, String>();
-        map.put("animal", "${critter}");
-        map.put("target", "${pet}");
-        map.put("pet", "${petCharacteristic} dog");
-        map.put("petCharacteristic", "lazy");
-        map.put("critter", "${critterSpeed} ${critterColor} ${critterType}");
-        map.put("critterSpeed", "quick");
-        map.put("critterColor", "brown");
-        map.put("critterType", "${animal}");
-        StrSubstitutor sub = new StrSubstitutor(map);
-        try {
-            sub.replace("The ${animal} jumps over the ${target}.");
-            fail("Cyclic replacement was not detected!");
-        } catch (final IllegalStateException ex) {
-            // expected
-        }
-
-        // also check even when default value is set.
-        map.put("critterType", "${animal:-fox}");
-        sub = new StrSubstitutor(map);
-        try {
-            sub.replace("The ${animal} jumps over the ${target}.");
-            fail("Cyclic replacement was not detected!");
-        } catch (final IllegalStateException ex) {
-            // expected
-        }
-    }
-
-    /**
-     * Tests interpolation with weird boundary patterns.
-     */
-    @Test
-    public void testReplaceWeirdPattens() {
-        doTestNoReplace("");
-        doTestNoReplace("${}");
-        doTestNoReplace("${ }");
-        doTestNoReplace("${\t}");
-        doTestNoReplace("${\n}");
-        doTestNoReplace("${\b}");
-        doTestNoReplace("${");
-        doTestNoReplace("$}");
-        doTestNoReplace("}");
-        doTestNoReplace("${}$");
-        doTestNoReplace("${${");
-        doTestNoReplace("${${}}");
-        doTestNoReplace("${$${}}");
-        doTestNoReplace("${$$${}}");
-        doTestNoReplace("${$$${$}}");
-        doTestNoReplace("${${}}");
-        doTestNoReplace("${${ }}");
-    }
-
-    /**
-     * Tests simple key replace.
-     */
-    @Test
-    public void testReplacePartialString_noReplace() {
-        final StrSubstitutor sub = new StrSubstitutor();
-        assertEquals("${animal} jumps", sub.replace("The ${animal} jumps over the ${target}.", 4, 15));
-    }
-
-    /**
-     * Tests whether a variable can be replaced in a variable name.
-     */
-    @Test
-    public void testReplaceInVariable() {
-        values.put("animal.1", "fox");
-        values.put("animal.2", "mouse");
-        values.put("species", "2");
-        final StrSubstitutor sub = new StrSubstitutor(values);
-        sub.setEnableSubstitutionInVariables(true);
-        assertEquals(
-                "Wrong result (1)",
-                "The mouse jumps over the lazy dog.",
-                sub.replace("The ${animal.${species}} jumps over the ${target}."));
-        values.put("species", "1");
-        assertEquals(
-                "Wrong result (2)",
-                "The fox jumps over the lazy dog.",
-                sub.replace("The ${animal.${species}} jumps over the ${target}."));
-        assertEquals(
-                "Wrong result (3)",
-                "The fox jumps over the lazy dog.",
-                sub.replace("The ${unknown.animal.${unknown.species:-1}:-fox} jumps over the ${unknow.target:-lazy dog}."));
-    }
-
-    /**
-     * Tests whether substitution in variable names is disabled per default.
-     */
-    @Test
-    public void testReplaceInVariableDisabled() {
-        values.put("animal.1", "fox");
-        values.put("animal.2", "mouse");
-        values.put("species", "2");
-        final StrSubstitutor sub = new StrSubstitutor(values);
-        assertEquals(
-                "Wrong result (1)",
-                "The ${animal.${species}} jumps over the lazy dog.",
-                sub.replace("The ${animal.${species}} jumps over the ${target}."));
-        assertEquals(
-                "Wrong result (2)",
-                "The ${animal.${species:-1}} jumps over the lazy dog.",
-                sub.replace("The ${animal.${species:-1}} jumps over the ${target}."));
-    }
-
-    /**
-     * Tests complex and recursive substitution in variable names.
-     */
-    @Test
-    public void testReplaceInVariableRecursive() {
-        values.put("animal.2", "brown fox");
-        values.put("animal.1", "white mouse");
-        values.put("color", "white");
-        values.put("species.white", "1");
-        values.put("species.brown", "2");
-        final StrSubstitutor sub = new StrSubstitutor(values);
-        sub.setEnableSubstitutionInVariables(true);
-        assertEquals(
-                "Wrong result (1)",
-                "The white mouse jumps over the lazy dog.",
-                sub.replace("The ${animal.${species.${color}}} jumps over the ${target}."));
-        assertEquals(
-                "Wrong result (2)",
-                "The brown fox jumps over the lazy dog.",
-                sub.replace("The ${animal.${species.${unknownColor:-brown}}} jumps over the ${target}."));
-    }
-
-    @Test
-    public void testDefaultValueDelimiters() {
-        final Map<String, String> map = new HashMap<String, String>();
-        map.put("animal", "fox");
-        map.put("target", "dog");
-
-        StrSubstitutor sub = new StrSubstitutor(map, "${", "}", '$');
-        assertEquals("The fox jumps over the lazy dog. 1234567890.",
-                sub.replace("The ${animal} jumps over the lazy ${target}. ${undefined.number:-1234567890}."));
-
-        sub = new StrSubstitutor(map, "${", "}", '$', "?:");
-        assertEquals("The fox jumps over the lazy dog. 1234567890.",
-                sub.replace("The ${animal} jumps over the lazy ${target}. ${undefined.number?:1234567890}."));
-
-        sub = new StrSubstitutor(map, "${", "}", '$', "||");
-        assertEquals("The fox jumps over the lazy dog. 1234567890.",
-                sub.replace("The ${animal} jumps over the lazy ${target}. ${undefined.number||1234567890}."));
-
-        sub = new StrSubstitutor(map, "${", "}", '$', "!");
-        assertEquals("The fox jumps over the lazy dog. 1234567890.",
-                sub.replace("The ${animal} jumps over the lazy ${target}. ${undefined.number!1234567890}."));
-
-        sub = new StrSubstitutor(map, "${", "}", '$', "");
-        sub.setValueDelimiterMatcher(null);
-        assertEquals("The fox jumps over the lazy dog. ${undefined.number!1234567890}.",
-                sub.replace("The ${animal} jumps over the lazy ${target}. ${undefined.number!1234567890}."));
-
-        sub = new StrSubstitutor(map, "${", "}", '$');
-        sub.setValueDelimiterMatcher(null);
-        assertEquals("The fox jumps over the lazy dog. ${undefined.number!1234567890}.",
-                sub.replace("The ${animal} jumps over the lazy ${target}. ${undefined.number!1234567890}."));
-    }
-
-    //-----------------------------------------------------------------------
-    /**
-     * Tests protected.
-     */
-    @Test
-    public void testResolveVariable() {
-        final StrBuilder builder = new StrBuilder("Hi ${name}!");
-        final Map<String, String> map = new HashMap<String, String>();
-        map.put("name", "commons");
-        final StrSubstitutor sub = new StrSubstitutor(map) {
-            @Override
-            protected String resolveVariable(final String variableName, final StrBuilder buf, final int startPos, final int endPos) {
-                assertEquals("name", variableName);
-                assertSame(builder, buf);
-                assertEquals(3, startPos);
-                assertEquals(10, endPos);
-                return "jakarta";
-            }
-        };
-        sub.replaceIn(builder);
-        assertEquals("Hi jakarta!", builder.toString());
-    }
-
-    //-----------------------------------------------------------------------
-    /**
-     * Tests constructor.
-     */
-    @Test
-    public void testConstructorNoArgs() {
-        final StrSubstitutor sub = new StrSubstitutor();
-        assertEquals("Hi ${name}", sub.replace("Hi ${name}"));
-    }
-
-    /**
-     * Tests constructor.
-     */
-    @Test
-    public void testConstructorMapPrefixSuffix() {
-        final Map<String, String> map = new HashMap<String, String>();
-        map.put("name", "commons");
-        final StrSubstitutor sub = new StrSubstitutor(map, "<", ">");
-        assertEquals("Hi < commons", sub.replace("Hi $< <name>"));
-    }
-
-    /**
-     * Tests constructor.
-     */
-    @Test
-    public void testConstructorMapFull() {
-        final Map<String, String> map = new HashMap<String, String>();
-        map.put("name", "commons");
-        StrSubstitutor sub = new StrSubstitutor(map, "<", ">", '!');
-        assertEquals("Hi < commons", sub.replace("Hi !< <name>"));
-        sub = new StrSubstitutor(map, "<", ">", '!', "||");
-        assertEquals("Hi < commons", sub.replace("Hi !< <name2||commons>"));
-    }
-
-    //-----------------------------------------------------------------------
-    /**
-     * Tests get set.
-     */
-    @Test
-    public void testGetSetEscape() {
-        final StrSubstitutor sub = new StrSubstitutor();
-        assertEquals('$', sub.getEscapeChar());
-        sub.setEscapeChar('<');
-        assertEquals('<', sub.getEscapeChar());
-    }
-
-    /**
-     * Tests get set.
-     */
-    @Test
-    public void testGetSetPrefix() {
-        final StrSubstitutor sub = new StrSubstitutor();
-        assertTrue(sub.getVariablePrefixMatcher() instanceof StrMatcher.StringMatcher);
-        sub.setVariablePrefix('<');
-        assertTrue(sub.getVariablePrefixMatcher() instanceof StrMatcher.CharMatcher);
-
-        sub.setVariablePrefix("<<");
-        assertTrue(sub.getVariablePrefixMatcher() instanceof StrMatcher.StringMatcher);
-        try {
-            sub.setVariablePrefix((String) null);
-            fail();
-        } catch (final IllegalArgumentException ex) {
-            // expected
-        }
-        assertTrue(sub.getVariablePrefixMatcher() instanceof StrMatcher.StringMatcher);
-
-        final StrMatcher matcher = StrMatcher.commaMatcher();
-        sub.setVariablePrefixMatcher(matcher);
-        assertSame(matcher, sub.getVariablePrefixMatcher());
-        try {
-            sub.setVariablePrefixMatcher((StrMatcher) null);
-            fail();
-        } catch (final IllegalArgumentException ex) {
-            // expected
-        }
-        assertSame(matcher, sub.getVariablePrefixMatcher());
-    }
-
-    /**
-     * Tests get set.
-     */
-    @Test
-    public void testGetSetSuffix() {
-        final StrSubstitutor sub = new StrSubstitutor();
-        assertTrue(sub.getVariableSuffixMatcher() instanceof StrMatcher.StringMatcher);
-        sub.setVariableSuffix('<');
-        assertTrue(sub.getVariableSuffixMatcher() instanceof StrMatcher.CharMatcher);
-
-        sub.setVariableSuffix("<<");
-        assertTrue(sub.getVariableSuffixMatcher() instanceof StrMatcher.StringMatcher);
-        try {
-            sub.setVariableSuffix((String) null);
-            fail();
-        } catch (final IllegalArgumentException ex) {
-            // expected
-        }
-        assertTrue(sub.getVariableSuffixMatcher() instanceof StrMatcher.StringMatcher);
-
-        final StrMatcher matcher = StrMatcher.commaMatcher();
-        sub.setVariableSuffixMatcher(matcher);
-        assertSame(matcher, sub.getVariableSuffixMatcher());
-        try {
-            sub.setVariableSuffixMatcher((StrMatcher) null);
-            fail();
-        } catch (final IllegalArgumentException ex) {
-            // expected
-        }
-        assertSame(matcher, sub.getVariableSuffixMatcher());
-    }
-
-    /**
-     * Tests get set.
-     */
-    @Test
-    public void testGetSetValueDelimiter() {
-        final StrSubstitutor sub = new StrSubstitutor();
-        assertTrue(sub.getValueDelimiterMatcher() instanceof StrMatcher.StringMatcher);
-        sub.setValueDelimiter(':');
-        assertTrue(sub.getValueDelimiterMatcher() instanceof StrMatcher.CharMatcher);
-
-        sub.setValueDelimiter("||");
-        assertTrue(sub.getValueDelimiterMatcher() instanceof StrMatcher.StringMatcher);
-        sub.setValueDelimiter((String) null);
-        assertNull(sub.getValueDelimiterMatcher());
-
-        final StrMatcher matcher = StrMatcher.commaMatcher();
-        sub.setValueDelimiterMatcher(matcher);
-        assertSame(matcher, sub.getValueDelimiterMatcher());
-        sub.setValueDelimiterMatcher((StrMatcher) null);
-        assertNull(sub.getValueDelimiterMatcher());
-    }
-
-    //-----------------------------------------------------------------------
-    /**
-     * Tests static.
-     */
-    @Test
-    public void testStaticReplace() {
-        final Map<String, String> map = new HashMap<String, String>();
-        map.put("name", "commons");
-        assertEquals("Hi commons!", StrSubstitutor.replace("Hi ${name}!", map));
-    }
-
-    /**
-     * Tests static.
-     */
-    @Test
-    public void testStaticReplacePrefixSuffix() {
-        final Map<String, String> map = new HashMap<String, String>();
-        map.put("name", "commons");
-        assertEquals("Hi commons!", StrSubstitutor.replace("Hi <name>!", map, "<", ">"));
-    }
-
-    /**
-     * Tests interpolation with system properties.
-     */
-    @Test
-    public void testStaticReplaceSystemProperties() {
-        final StrBuilder buf = new StrBuilder();
-        buf.append("Hi ").append(System.getProperty("user.name"));
-        buf.append(", you are working with ");
-        buf.append(System.getProperty("os.name"));
-        buf.append(", your home directory is ");
-        buf.append(System.getProperty("user.home")).append('.');
-        assertEquals(buf.toString(), StrSubstitutor.replaceSystemProperties("Hi ${user.name}, you are "
-            + "working with ${os.name}, your home "
-            + "directory is ${user.home}."));
-    }
-
-    /**
-     * Test for LANG-1055: StrSubstitutor.replaceSystemProperties does not work consistently
-     */
-    @Test
-    public void testLANG1055() {
-        System.setProperty("test_key",  "test_value");
-
-        String expected = StrSubstitutor.replace("test_key=${test_key}", System.getProperties());
-        String actual = StrSubstitutor.replaceSystemProperties("test_key=${test_key}");
-        assertEquals(expected, actual);
-    }
-
-    /**
-     * Test the replace of a properties object
-     */
-    @Test
-    public void testSubstituteDefaultProperties(){
-        final String org = "${doesnotwork}";
-        System.setProperty("doesnotwork", "It works!");
-
-        // create a new Properties object with the System.getProperties as default
-        final Properties props = new Properties(System.getProperties());
-
-        assertEquals("It works!", StrSubstitutor.replace(org, props));
-    }
-
-    @Test
-    public void testSamePrefixAndSuffix() {
-        final Map<String, String> map = new HashMap<String, String>();
-        map.put("greeting", "Hello");
-        map.put(" there ", "XXX");
-        map.put("name", "commons");
-        assertEquals("Hi commons!", StrSubstitutor.replace("Hi @name@!", map, "@", "@"));
-        assertEquals("Hello there commons!", StrSubstitutor.replace("@greeting@ there @name@!", map, "@", "@"));
-    }
-
-    //-----------------------------------------------------------------------
-    private void doTestReplace(final String expectedResult, final String replaceTemplate, final boolean substring) {
-        final String expectedShortResult = expectedResult.substring(1, expectedResult.length() - 1);
-        final StrSubstitutor sub = new StrSubstitutor(values);
-
-        // replace using String
-        assertEquals(expectedResult, sub.replace(replaceTemplate));
-        if (substring) {
-            assertEquals(expectedShortResult, sub.replace(replaceTemplate, 1, replaceTemplate.length() - 2));
-        }
-
-        // replace using char[]
-        final char[] chars = replaceTemplate.toCharArray();
-        assertEquals(expectedResult, sub.replace(chars));
-        if (substring) {
-            assertEquals(expectedShortResult, sub.replace(chars, 1, chars.length - 2));
-        }
-
-        // replace using StringBuffer
-        StringBuffer buf = new StringBuffer(replaceTemplate);
-        assertEquals(expectedResult, sub.replace(buf));
-        if (substring) {
-            assertEquals(expectedShortResult, sub.replace(buf, 1, buf.length() - 2));
-        }
-
-        // replace using StringBuilder
-        StringBuilder builder = new StringBuilder(replaceTemplate);
-        assertEquals(expectedResult, sub.replace(builder));
-        if (substring) {
-            assertEquals(expectedShortResult, sub.replace(builder, 1, builder.length() - 2));
-        }
-
-        // replace using StrBuilder
-        StrBuilder bld = new StrBuilder(replaceTemplate);
-        assertEquals(expectedResult, sub.replace(bld));
-        if (substring) {
-            assertEquals(expectedShortResult, sub.replace(bld, 1, bld.length() - 2));
-        }
-
-        // replace using object
-        final MutableObject<String> obj = new MutableObject<String>(replaceTemplate);  // toString returns template
-        assertEquals(expectedResult, sub.replace(obj));
-
-        // replace in StringBuffer
-        buf = new StringBuffer(replaceTemplate);
-        assertTrue(sub.replaceIn(buf));
-        assertEquals(expectedResult, buf.toString());
-        if (substring) {
-            buf = new StringBuffer(replaceTemplate);
-            assertTrue(sub.replaceIn(buf, 1, buf.length() - 2));
-            assertEquals(expectedResult, buf.toString());  // expect full result as remainder is untouched
-        }
-
-        // replace in StringBuilder
-        builder = new StringBuilder(replaceTemplate);
-        assertTrue(sub.replaceIn(builder));
-        assertEquals(expectedResult, builder.toString());
-        if (substring) {
-            builder = new StringBuilder(replaceTemplate);
-            assertTrue(sub.replaceIn(builder, 1, builder.length() - 2));
-            assertEquals(expectedResult, builder.toString());  // expect full result as remainder is untouched
-        }
-
-        // replace in StrBuilder
-        bld = new StrBuilder(replaceTemplate);
-        assertTrue(sub.replaceIn(bld));
-        assertEquals(expectedResult, bld.toString());
-        if (substring) {
-            bld = new StrBuilder(replaceTemplate);
-            assertTrue(sub.replaceIn(bld, 1, bld.length() - 2));
-            assertEquals(expectedResult, bld.toString());  // expect full result as remainder is untouched
-        }
-    }
-
-    private void doTestNoReplace(final String replaceTemplate) {
-        final StrSubstitutor sub = new StrSubstitutor(values);
-
-        if (replaceTemplate == null) {
-            assertEquals(null, sub.replace((String) null));
-            assertEquals(null, sub.replace((String) null, 0, 100));
-            assertEquals(null, sub.replace((char[]) null));
-            assertEquals(null, sub.replace((char[]) null, 0, 100));
-            assertEquals(null, sub.replace((StringBuffer) null));
-            assertEquals(null, sub.replace((StringBuffer) null, 0, 100));
-            assertEquals(null, sub.replace((StrBuilder) null));
-            assertEquals(null, sub.replace((StrBuilder) null, 0, 100));
-            assertEquals(null, sub.replace((Object) null));
-            assertFalse(sub.replaceIn((StringBuffer) null));
-            assertFalse(sub.replaceIn((StringBuffer) null, 0, 100));
-            assertFalse(sub.replaceIn((StrBuilder) null));
-            assertFalse(sub.replaceIn((StrBuilder) null, 0, 100));
-        } else {
-            assertEquals(replaceTemplate, sub.replace(replaceTemplate));
-            final StrBuilder bld = new StrBuilder(replaceTemplate);
-            assertFalse(sub.replaceIn(bld));
-            assertEquals(replaceTemplate, bld.toString());
-        }
-    }
-
-}
diff --git a/lang/src/test/java/org/apache/commons/lang3/text/StrTokenizerTest.java b/lang/src/test/java/org/apache/commons/lang3/text/StrTokenizerTest.java
deleted file mode 100644
index 8941fa9..0000000
--- a/lang/src/test/java/org/apache/commons/lang3/text/StrTokenizerTest.java
+++ /dev/null
@@ -1,880 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- * 
- *      http://www.apache.org/licenses/LICENSE-2.0
- * 
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package org.apache.commons.lang3.text;
-
-import org.junit.Test;
-
-import static org.junit.Assert.*;
-
-import java.util.Arrays;
-import java.util.Collections;
-import java.util.List;
-import java.util.NoSuchElementException;
-
-import org.apache.commons.lang3.ArrayUtils;
-
-/**
- * Unit test for Tokenizer.
- * 
- */
-public class StrTokenizerTest {
-
-    private static final String CSV_SIMPLE_FIXTURE = "A,b,c";
-
-    private static final String TSV_SIMPLE_FIXTURE = "A\tb\tc";
-
-    private void checkClone(final StrTokenizer tokenizer) {
-        assertFalse(StrTokenizer.getCSVInstance() == tokenizer);
-        assertFalse(StrTokenizer.getTSVInstance() == tokenizer);
-    }
-
-    // -----------------------------------------------------------------------
-    @Test
-    public void test1() {
-
-        final String input = "a;b;c;\"d;\"\"e\";f; ; ;  ";
-        final StrTokenizer tok = new StrTokenizer(input);
-        tok.setDelimiterChar(';');
-        tok.setQuoteChar('"');
-        tok.setIgnoredMatcher(StrMatcher.trimMatcher());
-        tok.setIgnoreEmptyTokens(false);
-        final String tokens[] = tok.getTokenArray();
-
-        final String expected[] = new String[]{"a", "b", "c", "d;\"e", "f", "", "", "",};
-
-        assertEquals(ArrayUtils.toString(tokens), expected.length, tokens.length);
-        for (int i = 0; i < expected.length; i++) {
-            assertEquals("token[" + i + "] was '" + tokens[i] + "' but was expected to be '" + expected[i] + "'",
-                    expected[i], tokens[i]);
-        }
-
-    }
-
-    @Test
-    public void test2() {
-
-        final String input = "a;b;c ;\"d;\"\"e\";f; ; ;";
-        final StrTokenizer tok = new StrTokenizer(input);
-        tok.setDelimiterChar(';');
-        tok.setQuoteChar('"');
-        tok.setIgnoredMatcher(StrMatcher.noneMatcher());
-        tok.setIgnoreEmptyTokens(false);
-        final String tokens[] = tok.getTokenArray();
-
-        final String expected[] = new String[]{"a", "b", "c ", "d;\"e", "f", " ", " ", "",};
-
-        assertEquals(ArrayUtils.toString(tokens), expected.length, tokens.length);
-        for (int i = 0; i < expected.length; i++) {
-            assertEquals("token[" + i + "] was '" + tokens[i] + "' but was expected to be '" + expected[i] + "'",
-                    expected[i], tokens[i]);
-        }
-
-    }
-
-    @Test
-    public void test3() {
-
-        final String input = "a;b; c;\"d;\"\"e\";f; ; ;";
-        final StrTokenizer tok = new StrTokenizer(input);
-        tok.setDelimiterChar(';');
-        tok.setQuoteChar('"');
-        tok.setIgnoredMatcher(StrMatcher.noneMatcher());
-        tok.setIgnoreEmptyTokens(false);
-        final String tokens[] = tok.getTokenArray();
-
-        final String expected[] = new String[]{"a", "b", " c", "d;\"e", "f", " ", " ", "",};
-
-        assertEquals(ArrayUtils.toString(tokens), expected.length, tokens.length);
-        for (int i = 0; i < expected.length; i++) {
-            assertEquals("token[" + i + "] was '" + tokens[i] + "' but was expected to be '" + expected[i] + "'",
-                    expected[i], tokens[i]);
-        }
-
-    }
-
-    @Test
-    public void test4() {
-
-        final String input = "a;b; c;\"d;\"\"e\";f; ; ;";
-        final StrTokenizer tok = new StrTokenizer(input);
-        tok.setDelimiterChar(';');
-        tok.setQuoteChar('"');
-        tok.setIgnoredMatcher(StrMatcher.trimMatcher());
-        tok.setIgnoreEmptyTokens(true);
-        final String tokens[] = tok.getTokenArray();
-
-        final String expected[] = new String[]{"a", "b", "c", "d;\"e", "f",};
-
-        assertEquals(ArrayUtils.toString(tokens), expected.length, tokens.length);
-        for (int i = 0; i < expected.length; i++) {
-            assertEquals("token[" + i + "] was '" + tokens[i] + "' but was expected to be '" + expected[i] + "'",
-                    expected[i], tokens[i]);
-        }
-
-    }
-
-    @Test
-    public void test5() {
-
-        final String input = "a;b; c;\"d;\"\"e\";f; ; ;";
-        final StrTokenizer tok = new StrTokenizer(input);
-        tok.setDelimiterChar(';');
-        tok.setQuoteChar('"');
-        tok.setIgnoredMatcher(StrMatcher.trimMatcher());
-        tok.setIgnoreEmptyTokens(false);
-        tok.setEmptyTokenAsNull(true);
-        final String tokens[] = tok.getTokenArray();
-
-        final String expected[] = new String[]{"a", "b", "c", "d;\"e", "f", null, null, null,};
-
-        assertEquals(ArrayUtils.toString(tokens), expected.length, tokens.length);
-        for (int i = 0; i < expected.length; i++) {
-            assertEquals("token[" + i + "] was '" + tokens[i] + "' but was expected to be '" + expected[i] + "'",
-                    expected[i], tokens[i]);
-        }
-
-    }
-
-    @Test
-    public void test6() {
-
-        final String input = "a;b; c;\"d;\"\"e\";f; ; ;";
-        final StrTokenizer tok = new StrTokenizer(input);
-        tok.setDelimiterChar(';');
-        tok.setQuoteChar('"');
-        tok.setIgnoredMatcher(StrMatcher.trimMatcher());
-        tok.setIgnoreEmptyTokens(false);
-        // tok.setTreatingEmptyAsNull(true);
-        final String tokens[] = tok.getTokenArray();
-
-        final String expected[] = new String[]{"a", "b", " c", "d;\"e", "f", null, null, null,};
-
-        int nextCount = 0;
-        while (tok.hasNext()) {
-            tok.next();
-            nextCount++;
-        }
-
-        int prevCount = 0;
-        while (tok.hasPrevious()) {
-            tok.previous();
-            prevCount++;
-        }
-
-        assertEquals(ArrayUtils.toString(tokens), expected.length, tokens.length);
-
-        assertTrue("could not cycle through entire token list" + " using the 'hasNext' and 'next' methods",
-                nextCount == expected.length);
-
-        assertTrue("could not cycle through entire token list" + " using the 'hasPrevious' and 'previous' methods",
-                prevCount == expected.length);
-
-    }
-
-    @Test
-    public void test7() {
-
-        final String input = "a   b c \"d e\" f ";
-        final StrTokenizer tok = new StrTokenizer(input);
-        tok.setDelimiterMatcher(StrMatcher.spaceMatcher());
-        tok.setQuoteMatcher(StrMatcher.doubleQuoteMatcher());
-        tok.setIgnoredMatcher(StrMatcher.noneMatcher());
-        tok.setIgnoreEmptyTokens(false);
-        final String tokens[] = tok.getTokenArray();
-
-        final String expected[] = new String[]{"a", "", "", "b", "c", "d e", "f", "",};
-
-        assertEquals(ArrayUtils.toString(tokens), expected.length, tokens.length);
-        for (int i = 0; i < expected.length; i++) {
-            assertEquals("token[" + i + "] was '" + tokens[i] + "' but was expected to be '" + expected[i] + "'",
-                    expected[i], tokens[i]);
-        }
-
-    }
-
-    @Test
-    public void test8() {
-
-        final String input = "a   b c \"d e\" f ";
-        final StrTokenizer tok = new StrTokenizer(input);
-        tok.setDelimiterMatcher(StrMatcher.spaceMatcher());
-        tok.setQuoteMatcher(StrMatcher.doubleQuoteMatcher());
-        tok.setIgnoredMatcher(StrMatcher.noneMatcher());
-        tok.setIgnoreEmptyTokens(true);
-        final String tokens[] = tok.getTokenArray();
-
-        final String expected[] = new String[]{"a", "b", "c", "d e", "f",};
-
-        assertEquals(ArrayUtils.toString(tokens), expected.length, tokens.length);
-        for (int i = 0; i < expected.length; i++) {
-            assertEquals("token[" + i + "] was '" + tokens[i] + "' but was expected to be '" + expected[i] + "'",
-                    expected[i], tokens[i]);
-        }
-
-    }
-
-    @Test
-    public void testBasic1() {
-        final String input = "a  b c";
-        final StrTokenizer tok = new StrTokenizer(input);
-        assertEquals("a", tok.next());
-        assertEquals("b", tok.next());
-        assertEquals("c", tok.next());
-        assertFalse(tok.hasNext());
-    }
-
-    @Test
-    public void testBasic2() {
-        final String input = "a \nb\fc";
-        final StrTokenizer tok = new StrTokenizer(input);
-        assertEquals("a", tok.next());
-        assertEquals("b", tok.next());
-        assertEquals("c", tok.next());
-        assertFalse(tok.hasNext());
-    }
-
-    @Test
-    public void testBasic3() {
-        final String input = "a \nb\u0001\fc";
-        final StrTokenizer tok = new StrTokenizer(input);
-        assertEquals("a", tok.next());
-        assertEquals("b\u0001", tok.next());
-        assertEquals("c", tok.next());
-        assertFalse(tok.hasNext());
-    }
-
-    @Test
-    public void testBasic4() {
-        final String input = "a \"b\" c";
-        final StrTokenizer tok = new StrTokenizer(input);
-        assertEquals("a", tok.next());
-        assertEquals("\"b\"", tok.next());
-        assertEquals("c", tok.next());
-        assertFalse(tok.hasNext());
-    }
-
-    @Test
-    public void testBasic5() {
-        final String input = "a:b':c";
-        final StrTokenizer tok = new StrTokenizer(input, ':', '\'');
-        assertEquals("a", tok.next());
-        assertEquals("b'", tok.next());
-        assertEquals("c", tok.next());
-        assertFalse(tok.hasNext());
-    }
-
-    @Test
-    public void testBasicDelim1() {
-        final String input = "a:b:c";
-        final StrTokenizer tok = new StrTokenizer(input, ':');
-        assertEquals("a", tok.next());
-        assertEquals("b", tok.next());
-        assertEquals("c", tok.next());
-        assertFalse(tok.hasNext());
-    }
-
-    @Test
-    public void testBasicDelim2() {
-        final String input = "a:b:c";
-        final StrTokenizer tok = new StrTokenizer(input, ',');
-        assertEquals("a:b:c", tok.next());
-        assertFalse(tok.hasNext());
-    }
-
-    @Test
-    public void testBasicEmpty1() {
-        final String input = "a  b c";
-        final StrTokenizer tok = new StrTokenizer(input);
-        tok.setIgnoreEmptyTokens(false);
-        assertEquals("a", tok.next());
-        assertEquals("", tok.next());
-        assertEquals("b", tok.next());
-        assertEquals("c", tok.next());
-        assertFalse(tok.hasNext());
-    }
-
-    @Test
-    public void testBasicEmpty2() {
-        final String input = "a  b c";
-        final StrTokenizer tok = new StrTokenizer(input);
-        tok.setIgnoreEmptyTokens(false);
-        tok.setEmptyTokenAsNull(true);
-        assertEquals("a", tok.next());
-        assertEquals(null, tok.next());
-        assertEquals("b", tok.next());
-        assertEquals("c", tok.next());
-        assertFalse(tok.hasNext());
-    }
-
-    @Test
-    public void testBasicQuoted1() {
-        final String input = "a 'b' c";
-        final StrTokenizer tok = new StrTokenizer(input, ' ', '\'');
-        assertEquals("a", tok.next());
-        assertEquals("b", tok.next());
-        assertEquals("c", tok.next());
-        assertFalse(tok.hasNext());
-    }
-
-    @Test
-    public void testBasicQuoted2() {
-        final String input = "a:'b':";
-        final StrTokenizer tok = new StrTokenizer(input, ':', '\'');
-        tok.setIgnoreEmptyTokens(false);
-        tok.setEmptyTokenAsNull(true);
-        assertEquals("a", tok.next());
-        assertEquals("b", tok.next());
-        assertEquals(null, tok.next());
-        assertFalse(tok.hasNext());
-    }
-
-    @Test
-    public void testBasicQuoted3() {
-        final String input = "a:'b''c'";
-        final StrTokenizer tok = new StrTokenizer(input, ':', '\'');
-        tok.setIgnoreEmptyTokens(false);
-        tok.setEmptyTokenAsNull(true);
-        assertEquals("a", tok.next());
-        assertEquals("b'c", tok.next());
-        assertFalse(tok.hasNext());
-    }
-
-    @Test
-    public void testBasicQuoted4() {
-        final String input = "a: 'b' 'c' :d";
-        final StrTokenizer tok = new StrTokenizer(input, ':', '\'');
-        tok.setTrimmerMatcher(StrMatcher.trimMatcher());
-        tok.setIgnoreEmptyTokens(false);
-        tok.setEmptyTokenAsNull(true);
-        assertEquals("a", tok.next());
-        assertEquals("b c", tok.next());
-        assertEquals("d", tok.next());
-        assertFalse(tok.hasNext());
-    }
-
-    @Test
-    public void testBasicQuoted5() {
-        final String input = "a: 'b'x'c' :d";
-        final StrTokenizer tok = new StrTokenizer(input, ':', '\'');
-        tok.setTrimmerMatcher(StrMatcher.trimMatcher());
-        tok.setIgnoreEmptyTokens(false);
-        tok.setEmptyTokenAsNull(true);
-        assertEquals("a", tok.next());
-        assertEquals("bxc", tok.next());
-        assertEquals("d", tok.next());
-        assertFalse(tok.hasNext());
-    }
-
-    @Test
-    public void testBasicQuoted6() {
-        final String input = "a:'b'\"c':d";
-        final StrTokenizer tok = new StrTokenizer(input, ':');
-        tok.setQuoteMatcher(StrMatcher.quoteMatcher());
-        assertEquals("a", tok.next());
-        assertEquals("b\"c:d", tok.next());
-        assertFalse(tok.hasNext());
-    }
-
-    @Test
-    public void testBasicQuoted7() {
-        final String input = "a:\"There's a reason here\":b";
-        final StrTokenizer tok = new StrTokenizer(input, ':');
-        tok.setQuoteMatcher(StrMatcher.quoteMatcher());
-        assertEquals("a", tok.next());
-        assertEquals("There's a reason here", tok.next());
-        assertEquals("b", tok.next());
-        assertFalse(tok.hasNext());
-    }
-
-    @Test
-    public void testBasicQuotedTrimmed1() {
-        final String input = "a: 'b' :";
-        final StrTokenizer tok = new StrTokenizer(input, ':', '\'');
-        tok.setTrimmerMatcher(StrMatcher.trimMatcher());
-        tok.setIgnoreEmptyTokens(false);
-        tok.setEmptyTokenAsNull(true);
-        assertEquals("a", tok.next());
-        assertEquals("b", tok.next());
-        assertEquals(null, tok.next());
-        assertFalse(tok.hasNext());
-    }
-
-    @Test
-    public void testBasicTrimmed1() {
-        final String input = "a: b :  ";
-        final StrTokenizer tok = new StrTokenizer(input, ':');
-        tok.setTrimmerMatcher(StrMatcher.trimMatcher());
-        tok.setIgnoreEmptyTokens(false);
-        tok.setEmptyTokenAsNull(true);
-        assertEquals("a", tok.next());
-        assertEquals("b", tok.next());
-        assertEquals(null, tok.next());
-        assertFalse(tok.hasNext());
-    }
-
-    @Test
-    public void testBasicTrimmed2() {
-        final String input = "a:  b  :";
-        final StrTokenizer tok = new StrTokenizer(input, ':');
-        tok.setTrimmerMatcher(StrMatcher.stringMatcher("  "));
-        tok.setIgnoreEmptyTokens(false);
-        tok.setEmptyTokenAsNull(true);
-        assertEquals("a", tok.next());
-        assertEquals("b", tok.next());
-        assertEquals(null, tok.next());
-        assertFalse(tok.hasNext());
-    }
-
-    @Test
-    public void testBasicIgnoreTrimmed1() {
-        final String input = "a: bIGNOREc : ";
-        final StrTokenizer tok = new StrTokenizer(input, ':');
-        tok.setIgnoredMatcher(StrMatcher.stringMatcher("IGNORE"));
-        tok.setTrimmerMatcher(StrMatcher.trimMatcher());
-        tok.setIgnoreEmptyTokens(false);
-        tok.setEmptyTokenAsNull(true);
-        assertEquals("a", tok.next());
-        assertEquals("bc", tok.next());
-        assertEquals(null, tok.next());
-        assertFalse(tok.hasNext());
-    }
-
-    @Test
-    public void testBasicIgnoreTrimmed2() {
-        final String input = "IGNOREaIGNORE: IGNORE bIGNOREc IGNORE : IGNORE ";
-        final StrTokenizer tok = new StrTokenizer(input, ':');
-        tok.setIgnoredMatcher(StrMatcher.stringMatcher("IGNORE"));
-        tok.setTrimmerMatcher(StrMatcher.trimMatcher());
-        tok.setIgnoreEmptyTokens(false);
-        tok.setEmptyTokenAsNull(true);
-        assertEquals("a", tok.next());
-        assertEquals("bc", tok.next());
-        assertEquals(null, tok.next());
-        assertFalse(tok.hasNext());
-    }
-
-    @Test
-    public void testBasicIgnoreTrimmed3() {
-        final String input = "IGNOREaIGNORE: IGNORE bIGNOREc IGNORE : IGNORE ";
-        final StrTokenizer tok = new StrTokenizer(input, ':');
-        tok.setIgnoredMatcher(StrMatcher.stringMatcher("IGNORE"));
-        tok.setIgnoreEmptyTokens(false);
-        tok.setEmptyTokenAsNull(true);
-        assertEquals("a", tok.next());
-        assertEquals("  bc  ", tok.next());
-        assertEquals("  ", tok.next());
-        assertFalse(tok.hasNext());
-    }
-
-    @Test
-    public void testBasicIgnoreTrimmed4() {
-        final String input = "IGNOREaIGNORE: IGNORE 'bIGNOREc'IGNORE'd' IGNORE : IGNORE ";
-        final StrTokenizer tok = new StrTokenizer(input, ':', '\'');
-        tok.setIgnoredMatcher(StrMatcher.stringMatcher("IGNORE"));
-        tok.setTrimmerMatcher(StrMatcher.trimMatcher());
-        tok.setIgnoreEmptyTokens(false);
-        tok.setEmptyTokenAsNull(true);
-        assertEquals("a", tok.next());
-        assertEquals("bIGNOREcd", tok.next());
-        assertEquals(null, tok.next());
-        assertFalse(tok.hasNext());
-    }
-
-    //-----------------------------------------------------------------------
-    @Test
-    public void testListArray() {
-        final String input = "a  b c";
-        final StrTokenizer tok = new StrTokenizer(input);
-        final String[] array = tok.getTokenArray();
-        final List<?> list = tok.getTokenList();
-        
-        assertEquals(Arrays.asList(array), list);
-        assertEquals(3, list.size());
-    }
-
-    //-----------------------------------------------------------------------
-    private void testCSV(final String data) {
-        this.testXSVAbc(StrTokenizer.getCSVInstance(data));
-        this.testXSVAbc(StrTokenizer.getCSVInstance(data.toCharArray()));
-    }
-
-    @Test
-    public void testCSVEmpty() {
-        this.testEmpty(StrTokenizer.getCSVInstance());
-        this.testEmpty(StrTokenizer.getCSVInstance(""));
-    }
-
-    @Test
-    public void testCSVSimple() {
-        this.testCSV(CSV_SIMPLE_FIXTURE);
-    }
-
-    @Test
-    public void testCSVSimpleNeedsTrim() {
-        this.testCSV("   " + CSV_SIMPLE_FIXTURE);
-        this.testCSV("   \n\t  " + CSV_SIMPLE_FIXTURE);
-        this.testCSV("   \n  " + CSV_SIMPLE_FIXTURE + "\n\n\r");
-    }
-
-    void testEmpty(final StrTokenizer tokenizer) {
-        this.checkClone(tokenizer);
-        assertFalse(tokenizer.hasNext());
-        assertFalse(tokenizer.hasPrevious());
-        assertEquals(null, tokenizer.nextToken());
-        assertEquals(0, tokenizer.size());
-        try {
-            tokenizer.next();
-            fail();
-        } catch (final NoSuchElementException ex) {}
-    }
-
-    @Test
-    public void testGetContent() {
-        final String input = "a   b c \"d e\" f ";
-        StrTokenizer tok = new StrTokenizer(input);
-        assertEquals(input, tok.getContent());
-
-        tok = new StrTokenizer(input.toCharArray());
-        assertEquals(input, tok.getContent());
-        
-        tok = new StrTokenizer();
-        assertEquals(null, tok.getContent());
-    }
-
-    //-----------------------------------------------------------------------
-    @Test
-    public void testChaining() {
-        final StrTokenizer tok = new StrTokenizer();
-        assertEquals(tok, tok.reset());
-        assertEquals(tok, tok.reset(""));
-        assertEquals(tok, tok.reset(new char[0]));
-        assertEquals(tok, tok.setDelimiterChar(' '));
-        assertEquals(tok, tok.setDelimiterString(" "));
-        assertEquals(tok, tok.setDelimiterMatcher(null));
-        assertEquals(tok, tok.setQuoteChar(' '));
-        assertEquals(tok, tok.setQuoteMatcher(null));
-        assertEquals(tok, tok.setIgnoredChar(' '));
-        assertEquals(tok, tok.setIgnoredMatcher(null));
-        assertEquals(tok, tok.setTrimmerMatcher(null));
-        assertEquals(tok, tok.setEmptyTokenAsNull(false));
-        assertEquals(tok, tok.setIgnoreEmptyTokens(false));
-    }
-
-    /**
-     * Tests that the {@link StrTokenizer#clone()} clone method catches {@link CloneNotSupportedException} and returns
-     * <code>null</code>.
-     */
-    @Test
-    public void testCloneNotSupportedException() {
-        final Object notCloned = new StrTokenizer() {
-            @Override
-            Object cloneReset() throws CloneNotSupportedException {
-                throw new CloneNotSupportedException("test");
-            }
-        }.clone();
-        assertNull(notCloned);
-    }
-
-    @Test
-    public void testCloneNull() {
-        final StrTokenizer tokenizer = new StrTokenizer((char[]) null);
-        // Start sanity check
-        assertEquals(null, tokenizer.nextToken());
-        tokenizer.reset();
-        assertEquals(null, tokenizer.nextToken());
-        // End sanity check
-        final StrTokenizer clonedTokenizer = (StrTokenizer) tokenizer.clone();
-        tokenizer.reset();
-        assertEquals(null, tokenizer.nextToken());
-        assertEquals(null, clonedTokenizer.nextToken());
-    }
-
-    @Test
-    public void testCloneReset() {
-        final char[] input = new char[]{'a'};
-        final StrTokenizer tokenizer = new StrTokenizer(input);
-        // Start sanity check
-        assertEquals("a", tokenizer.nextToken());
-        tokenizer.reset(input);
-        assertEquals("a", tokenizer.nextToken());
-        // End sanity check
-        final StrTokenizer clonedTokenizer = (StrTokenizer) tokenizer.clone();
-        input[0] = 'b';
-        tokenizer.reset(input);
-        assertEquals("b", tokenizer.nextToken());
-        assertEquals("a", clonedTokenizer.nextToken());
-    }
-  
-    // -----------------------------------------------------------------------
-    @Test
-    public void testConstructor_String() {
-        StrTokenizer tok = new StrTokenizer("a b");
-        assertEquals("a", tok.next());
-        assertEquals("b", tok.next());
-        assertFalse(tok.hasNext());
-        
-        tok = new StrTokenizer("");
-        assertFalse(tok.hasNext());
-        
-        tok = new StrTokenizer((String) null);
-        assertFalse(tok.hasNext());
-    }
-
-    //-----------------------------------------------------------------------
-    @Test
-    public void testConstructor_String_char() {
-        StrTokenizer tok = new StrTokenizer("a b", ' ');
-        assertEquals(1, tok.getDelimiterMatcher().isMatch(" ".toCharArray(), 0, 0, 1));
-        assertEquals("a", tok.next());
-        assertEquals("b", tok.next());
-        assertFalse(tok.hasNext());
-        
-        tok = new StrTokenizer("", ' ');
-        assertFalse(tok.hasNext());
-        
-        tok = new StrTokenizer((String) null, ' ');
-        assertFalse(tok.hasNext());
-    }
-
-    //-----------------------------------------------------------------------
-    @Test
-    public void testConstructor_String_char_char() {
-        StrTokenizer tok = new StrTokenizer("a b", ' ', '"');
-        assertEquals(1, tok.getDelimiterMatcher().isMatch(" ".toCharArray(), 0, 0, 1));
-        assertEquals(1, tok.getQuoteMatcher().isMatch("\"".toCharArray(), 0, 0, 1));
-        assertEquals("a", tok.next());
-        assertEquals("b", tok.next());
-        assertFalse(tok.hasNext());
-        
-        tok = new StrTokenizer("", ' ', '"');
-        assertFalse(tok.hasNext());
-        
-        tok = new StrTokenizer((String) null, ' ', '"');
-        assertFalse(tok.hasNext());
-    }
-
-    //-----------------------------------------------------------------------
-    @Test
-    public void testConstructor_charArray() {
-        StrTokenizer tok = new StrTokenizer("a b".toCharArray());
-        assertEquals("a", tok.next());
-        assertEquals("b", tok.next());
-        assertFalse(tok.hasNext());
-        
-        tok = new StrTokenizer(new char[0]);
-        assertFalse(tok.hasNext());
-        
-        tok = new StrTokenizer((char[]) null);
-        assertFalse(tok.hasNext());
-    }
-
-    //-----------------------------------------------------------------------
-    @Test
-    public void testConstructor_charArray_char() {
-        StrTokenizer tok = new StrTokenizer("a b".toCharArray(), ' ');
-        assertEquals(1, tok.getDelimiterMatcher().isMatch(" ".toCharArray(), 0, 0, 1));
-        assertEquals("a", tok.next());
-        assertEquals("b", tok.next());
-        assertFalse(tok.hasNext());
-        
-        tok = new StrTokenizer(new char[0], ' ');
-        assertFalse(tok.hasNext());
-        
-        tok = new StrTokenizer((char[]) null, ' ');
-        assertFalse(tok.hasNext());
-    }
-
-    //-----------------------------------------------------------------------
-    @Test
-    public void testConstructor_charArray_char_char() {
-        StrTokenizer tok = new StrTokenizer("a b".toCharArray(), ' ', '"');
-        assertEquals(1, tok.getDelimiterMatcher().isMatch(" ".toCharArray(), 0, 0, 1));
-        assertEquals(1, tok.getQuoteMatcher().isMatch("\"".toCharArray(), 0, 0, 1));
-        assertEquals("a", tok.next());
-        assertEquals("b", tok.next());
-        assertFalse(tok.hasNext());
-        
-        tok = new StrTokenizer(new char[0], ' ', '"');
-        assertFalse(tok.hasNext());
-        
-        tok = new StrTokenizer((char[]) null, ' ', '"');
-        assertFalse(tok.hasNext());
-    }
-
-    //-----------------------------------------------------------------------
-    @Test
-    public void testReset() {
-        final StrTokenizer tok = new StrTokenizer("a b c");
-        assertEquals("a", tok.next());
-        assertEquals("b", tok.next());
-        assertEquals("c", tok.next());
-        assertFalse(tok.hasNext());
-        
-        tok.reset();
-        assertEquals("a", tok.next());
-        assertEquals("b", tok.next());
-        assertEquals("c", tok.next());
-        assertFalse(tok.hasNext());
-    }
-
-    //-----------------------------------------------------------------------
-    @Test
-    public void testReset_String() {
-        final StrTokenizer tok = new StrTokenizer("x x x");
-        tok.reset("d e");
-        assertEquals("d", tok.next());
-        assertEquals("e", tok.next());
-        assertFalse(tok.hasNext());
-        
-        tok.reset((String) null);
-        assertFalse(tok.hasNext());
-    }
-
-    //-----------------------------------------------------------------------
-    @Test
-    public void testReset_charArray() {
-        final StrTokenizer tok = new StrTokenizer("x x x");
-        
-        final char[] array = new char[] {'a', 'b', 'c'};
-        tok.reset(array);
-        assertEquals("abc", tok.next());
-        assertFalse(tok.hasNext());
-        
-        tok.reset((char[]) null);
-        assertFalse(tok.hasNext());
-    }
-
-    //-----------------------------------------------------------------------
-    @Test
-    public void testTSV() {
-        this.testXSVAbc(StrTokenizer.getTSVInstance(TSV_SIMPLE_FIXTURE));
-        this.testXSVAbc(StrTokenizer.getTSVInstance(TSV_SIMPLE_FIXTURE.toCharArray()));
-    }
-
-    @Test
-    public void testTSVEmpty() {
-        this.testEmpty(StrTokenizer.getCSVInstance());
-        this.testEmpty(StrTokenizer.getCSVInstance(""));
-    }
-
-    void testXSVAbc(final StrTokenizer tokenizer) {
-        this.checkClone(tokenizer);
-        assertEquals(-1, tokenizer.previousIndex());
-        assertEquals(0, tokenizer.nextIndex());
-        assertEquals(null, tokenizer.previousToken());
-        assertEquals("A", tokenizer.nextToken());
-        assertEquals(1, tokenizer.nextIndex());
-        assertEquals("b", tokenizer.nextToken());
-        assertEquals(2, tokenizer.nextIndex());
-        assertEquals("c", tokenizer.nextToken());
-        assertEquals(3, tokenizer.nextIndex());
-        assertEquals(null, tokenizer.nextToken());
-        assertEquals(3, tokenizer.nextIndex());
-        assertEquals("c", tokenizer.previousToken());
-        assertEquals(2, tokenizer.nextIndex());
-        assertEquals("b", tokenizer.previousToken());
-        assertEquals(1, tokenizer.nextIndex());
-        assertEquals("A", tokenizer.previousToken());
-        assertEquals(0, tokenizer.nextIndex());
-        assertEquals(null, tokenizer.previousToken());
-        assertEquals(0, tokenizer.nextIndex());
-        assertEquals(-1, tokenizer.previousIndex());
-        assertEquals(3, tokenizer.size());
-    }
-
-    @Test
-    public void testIteration() {
-        final StrTokenizer tkn = new StrTokenizer("a b c");
-        assertFalse(tkn.hasPrevious());
-        try {
-            tkn.previous();
-            fail();
-        } catch (final NoSuchElementException ex) {}
-        assertTrue(tkn.hasNext());
-        
-        assertEquals("a", tkn.next());
-        try {
-            tkn.remove();
-            fail();
-        } catch (final UnsupportedOperationException ex) {}
-        try {
-            tkn.set("x");
-            fail();
-        } catch (final UnsupportedOperationException ex) {}
-        try {
-            tkn.add("y");
-            fail();
-        } catch (final UnsupportedOperationException ex) {}
-        assertTrue(tkn.hasPrevious());
-        assertTrue(tkn.hasNext());
-        
-        assertEquals("b", tkn.next());
-        assertTrue(tkn.hasPrevious());
-        assertTrue(tkn.hasNext());
-        
-        assertEquals("c", tkn.next());
-        assertTrue(tkn.hasPrevious());
-        assertFalse(tkn.hasNext());
-        
-        try {
-            tkn.next();
-            fail();
-        } catch (final NoSuchElementException ex) {}
-        assertTrue(tkn.hasPrevious());
-        assertFalse(tkn.hasNext());
-    }
-
-    //-----------------------------------------------------------------------
-    @Test
-    public void testTokenizeSubclassInputChange() {
-        final StrTokenizer tkn = new StrTokenizer("a b c d e") {
-            @Override
-            protected List<String> tokenize(final char[] chars, final int offset, final int count) {
-                return super.tokenize("w x y z".toCharArray(), 2, 5);
-            }
-        };
-        assertEquals("x", tkn.next());
-        assertEquals("y", tkn.next());
-    }
-
-    //-----------------------------------------------------------------------
-    @Test
-    public void testTokenizeSubclassOutputChange() {
-        final StrTokenizer tkn = new StrTokenizer("a b c") {
-            @Override
-            protected List<String> tokenize(final char[] chars, final int offset, final int count) {
-                final List<String> list = super.tokenize(chars, offset, count);
-                Collections.reverse(list);
-                return list;
-            }
-        };
-        assertEquals("c", tkn.next());
-        assertEquals("b", tkn.next());
-        assertEquals("a", tkn.next());
-    }
-
-    //-----------------------------------------------------------------------
-    @Test
-    public void testToString() {
-        final StrTokenizer tkn = new StrTokenizer("a b c d e");
-        assertEquals("StrTokenizer[not tokenized yet]", tkn.toString());
-        tkn.next();
-        assertEquals("StrTokenizer[a, b, c, d, e]", tkn.toString());
-    }
-
-}
diff --git a/lang/src/test/java/org/apache/commons/lang3/text/WordUtilsTest.java b/lang/src/test/java/org/apache/commons/lang3/text/WordUtilsTest.java
deleted file mode 100644
index 6be8ded..0000000
--- a/lang/src/test/java/org/apache/commons/lang3/text/WordUtilsTest.java
+++ /dev/null
@@ -1,372 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- * 
- *      http://www.apache.org/licenses/LICENSE-2.0
- * 
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.commons.lang3.text;
-
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertFalse;
-import static org.junit.Assert.assertNotNull;
-import static org.junit.Assert.assertTrue;
-
-import java.lang.reflect.Constructor;
-import java.lang.reflect.Modifier;
-
-import org.junit.Test;
-
-/**
- * Unit tests for WordUtils class.
- * 
- * @version $Id$
- */
-public class WordUtilsTest {
-
-    //-----------------------------------------------------------------------
-    @Test
-    public void testConstructor() {
-        assertNotNull(new WordUtils());
-        final Constructor<?>[] cons = WordUtils.class.getDeclaredConstructors();
-        assertEquals(1, cons.length);
-        assertTrue(Modifier.isPublic(cons[0].getModifiers()));
-        assertTrue(Modifier.isPublic(WordUtils.class.getModifiers()));
-        assertFalse(Modifier.isFinal(WordUtils.class.getModifiers()));
-    }
-    
-    //-----------------------------------------------------------------------
-    @Test
-    public void testWrap_StringInt() {
-        assertEquals(null, WordUtils.wrap(null, 20));
-        assertEquals(null, WordUtils.wrap(null, -1));
-        
-        assertEquals("", WordUtils.wrap("", 20));
-        assertEquals("", WordUtils.wrap("", -1));
-        
-        // normal
-        final String systemNewLine = System.getProperty("line.separator");
-        String input = "Here is one line of text that is going to be wrapped after 20 columns.";
-        String expected = "Here is one line of" + systemNewLine + "text that is going" 
-            + systemNewLine + "to be wrapped after" + systemNewLine + "20 columns.";
-        assertEquals(expected, WordUtils.wrap(input, 20));
-        
-        // long word at end
-        input = "Click here to jump to the commons website - http://commons.apache.org";
-        expected = "Click here to jump" + systemNewLine + "to the commons" + systemNewLine 
-            + "website -" + systemNewLine + "http://commons.apache.org";
-        assertEquals(expected, WordUtils.wrap(input, 20));
-        
-        // long word in middle
-        input = "Click here, http://commons.apache.org, to jump to the commons website";
-        expected = "Click here," + systemNewLine + "http://commons.apache.org," + systemNewLine 
-            + "to jump to the" + systemNewLine + "commons website";
-        assertEquals(expected, WordUtils.wrap(input, 20));
-
-        // leading spaces on a new line are stripped
-        // trailing spaces are not stripped
-        input = "word1             word2                        word3";
-        expected = "word1  " + systemNewLine + "word2  " + systemNewLine + "word3";
-        assertEquals(expected, WordUtils.wrap(input, 7));
-    }
-    
-    @Test
-    public void testWrap_StringIntStringBoolean() {
-        assertEquals(null, WordUtils.wrap(null, 20, "\n", false));
-        assertEquals(null, WordUtils.wrap(null, 20, "\n", true));
-        assertEquals(null, WordUtils.wrap(null, 20, null, true));
-        assertEquals(null, WordUtils.wrap(null, 20, null, false));
-        assertEquals(null, WordUtils.wrap(null, -1, null, true));
-        assertEquals(null, WordUtils.wrap(null, -1, null, false));
-        
-        assertEquals("", WordUtils.wrap("", 20, "\n", false));
-        assertEquals("", WordUtils.wrap("", 20, "\n", true));
-        assertEquals("", WordUtils.wrap("", 20, null, false));
-        assertEquals("", WordUtils.wrap("", 20, null, true));
-        assertEquals("", WordUtils.wrap("", -1, null, false));
-        assertEquals("", WordUtils.wrap("", -1, null, true));
-        
-        // normal
-        String input = "Here is one line of text that is going to be wrapped after 20 columns.";
-        String expected = "Here is one line of\ntext that is going\nto be wrapped after\n20 columns.";
-        assertEquals(expected, WordUtils.wrap(input, 20, "\n", false));
-        assertEquals(expected, WordUtils.wrap(input, 20, "\n", true));
-
-        // unusual newline char
-        input = "Here is one line of text that is going to be wrapped after 20 columns.";
-        expected = "Here is one line of<br />text that is going<br />to be wrapped after<br />20 columns.";
-        assertEquals(expected, WordUtils.wrap(input, 20, "<br />", false));
-        assertEquals(expected, WordUtils.wrap(input, 20, "<br />", true));
-
-        // short line length
-        input = "Here is one line";
-        expected = "Here\nis one\nline";
-        assertEquals(expected, WordUtils.wrap(input, 6, "\n", false));
-        expected = "Here\nis\none\nline";
-        assertEquals(expected, WordUtils.wrap(input, 2, "\n", false));
-        assertEquals(expected, WordUtils.wrap(input, -1, "\n", false));
-
-        // system newline char
-        final String systemNewLine = System.getProperty("line.separator");
-        input = "Here is one line of text that is going to be wrapped after 20 columns.";
-        expected = "Here is one line of" + systemNewLine + "text that is going" + systemNewLine 
-            + "to be wrapped after" + systemNewLine + "20 columns.";
-        assertEquals(expected, WordUtils.wrap(input, 20, null, false));
-        assertEquals(expected, WordUtils.wrap(input, 20, null, true));
-
-        // with extra spaces
-        input = " Here:  is  one  line  of  text  that  is  going  to  be  wrapped  after  20  columns.";
-        expected = "Here:  is  one  line\nof  text  that  is \ngoing  to  be \nwrapped  after  20 \ncolumns.";
-        assertEquals(expected, WordUtils.wrap(input, 20, "\n", false));
-        assertEquals(expected, WordUtils.wrap(input, 20, "\n", true));
-        
-        // with tab
-        input = "Here is\tone line of text that is going to be wrapped after 20 columns.";
-        expected = "Here is\tone line of\ntext that is going\nto be wrapped after\n20 columns.";
-        assertEquals(expected, WordUtils.wrap(input, 20, "\n", false));
-        assertEquals(expected, WordUtils.wrap(input, 20, "\n", true));
-        
-        // with tab at wrapColumn
-        input = "Here is one line of\ttext that is going to be wrapped after 20 columns.";
-        expected = "Here is one line\nof\ttext that is\ngoing to be wrapped\nafter 20 columns.";
-        assertEquals(expected, WordUtils.wrap(input, 20, "\n", false));
-        assertEquals(expected, WordUtils.wrap(input, 20, "\n", true));
-        
-        // difference because of long word
-        input = "Click here to jump to the commons website - http://commons.apache.org";
-        expected = "Click here to jump\nto the commons\nwebsite -\nhttp://commons.apache.org";
-        assertEquals(expected, WordUtils.wrap(input, 20, "\n", false));
-        expected = "Click here to jump\nto the commons\nwebsite -\nhttp://commons.apach\ne.org";
-        assertEquals(expected, WordUtils.wrap(input, 20, "\n", true));
-        
-        // difference because of long word in middle
-        input = "Click here, http://commons.apache.org, to jump to the commons website";
-        expected = "Click here,\nhttp://commons.apache.org,\nto jump to the\ncommons website";
-        assertEquals(expected, WordUtils.wrap(input, 20, "\n", false));
-        expected = "Click here,\nhttp://commons.apach\ne.org, to jump to\nthe commons website";
-        assertEquals(expected, WordUtils.wrap(input, 20, "\n", true));
-    }
-    
-    //-----------------------------------------------------------------------
-    @Test
-    public void testCapitalize_String() {
-        assertEquals(null, WordUtils.capitalize(null));
-        assertEquals("", WordUtils.capitalize(""));
-        assertEquals("  ", WordUtils.capitalize("  "));
-        
-        assertEquals("I", WordUtils.capitalize("I") );
-        assertEquals("I", WordUtils.capitalize("i") );
-        assertEquals("I Am Here 123", WordUtils.capitalize("i am here 123") );
-        assertEquals("I Am Here 123", WordUtils.capitalize("I Am Here 123") );
-        assertEquals("I Am HERE 123", WordUtils.capitalize("i am HERE 123") );
-        assertEquals("I AM HERE 123", WordUtils.capitalize("I AM HERE 123") );
-    }
-    
-    @Test
-    public void testCapitalizeWithDelimiters_String() {
-        assertEquals(null, WordUtils.capitalize(null, null));
-        assertEquals("", WordUtils.capitalize("", new char[0]));
-        assertEquals("  ", WordUtils.capitalize("  ", new char[0]));
-        
-        char[] chars = new char[] { '-', '+', ' ', '@' };
-        assertEquals("I", WordUtils.capitalize("I", chars) );
-        assertEquals("I", WordUtils.capitalize("i", chars) );
-        assertEquals("I-Am Here+123", WordUtils.capitalize("i-am here+123", chars) );
-        assertEquals("I Am+Here-123", WordUtils.capitalize("I Am+Here-123", chars) );
-        assertEquals("I+Am-HERE 123", WordUtils.capitalize("i+am-HERE 123", chars) );
-        assertEquals("I-AM HERE+123", WordUtils.capitalize("I-AM HERE+123", chars) );
-        chars = new char[] {'.'};
-        assertEquals("I aM.Fine", WordUtils.capitalize("i aM.fine", chars) );
-        assertEquals("I Am.fine", WordUtils.capitalize("i am.fine", null) );
-    }
-
-    @Test
-    public void testCapitalizeFully_String() {
-        assertEquals(null, WordUtils.capitalizeFully(null));
-        assertEquals("", WordUtils.capitalizeFully(""));
-        assertEquals("  ", WordUtils.capitalizeFully("  "));
-        
-        assertEquals("I", WordUtils.capitalizeFully("I") );
-        assertEquals("I", WordUtils.capitalizeFully("i") );
-        assertEquals("I Am Here 123", WordUtils.capitalizeFully("i am here 123") );
-        assertEquals("I Am Here 123", WordUtils.capitalizeFully("I Am Here 123") );
-        assertEquals("I Am Here 123", WordUtils.capitalizeFully("i am HERE 123") );
-        assertEquals("I Am Here 123", WordUtils.capitalizeFully("I AM HERE 123") );
-    }
-    
-    @Test
-    public void testCapitalizeFullyWithDelimiters_String() {
-        assertEquals(null, WordUtils.capitalizeFully(null, null));
-        assertEquals("", WordUtils.capitalizeFully("", new char[0]));
-        assertEquals("  ", WordUtils.capitalizeFully("  ", new char[0]));
-        
-        char[] chars = new char[] { '-', '+', ' ', '@' };
-        assertEquals("I", WordUtils.capitalizeFully("I", chars) );
-        assertEquals("I", WordUtils.capitalizeFully("i", chars) );
-        assertEquals("I-Am Here+123", WordUtils.capitalizeFully("i-am here+123", chars) );
-        assertEquals("I Am+Here-123", WordUtils.capitalizeFully("I Am+Here-123", chars) );
-        assertEquals("I+Am-Here 123", WordUtils.capitalizeFully("i+am-HERE 123", chars) );
-        assertEquals("I-Am Here+123", WordUtils.capitalizeFully("I-AM HERE+123", chars) );
-        chars = new char[] {'.'};
-        assertEquals("I am.Fine", WordUtils.capitalizeFully("i aM.fine", chars) );
-        assertEquals("I Am.fine", WordUtils.capitalizeFully("i am.fine", null) );
-    }
-
-    @Test
-    public void testUncapitalize_String() {
-        assertEquals(null, WordUtils.uncapitalize(null));
-        assertEquals("", WordUtils.uncapitalize(""));
-        assertEquals("  ", WordUtils.uncapitalize("  "));
-        
-        assertEquals("i", WordUtils.uncapitalize("I") );
-        assertEquals("i", WordUtils.uncapitalize("i") );
-        assertEquals("i am here 123", WordUtils.uncapitalize("i am here 123") );
-        assertEquals("i am here 123", WordUtils.uncapitalize("I Am Here 123") );
-        assertEquals("i am hERE 123", WordUtils.uncapitalize("i am HERE 123") );
-        assertEquals("i aM hERE 123", WordUtils.uncapitalize("I AM HERE 123") );
-    }
-    
-    @Test
-    public void testUncapitalizeWithDelimiters_String() {
-        assertEquals(null, WordUtils.uncapitalize(null, null));
-        assertEquals("", WordUtils.uncapitalize("", new char[0]));
-        assertEquals("  ", WordUtils.uncapitalize("  ", new char[0]));
-        
-        char[] chars = new char[] { '-', '+', ' ', '@' };
-        assertEquals("i", WordUtils.uncapitalize("I", chars) );
-        assertEquals("i", WordUtils.uncapitalize("i", chars) );
-        assertEquals("i am-here+123", WordUtils.uncapitalize("i am-here+123", chars) );
-        assertEquals("i+am here-123", WordUtils.uncapitalize("I+Am Here-123", chars) );
-        assertEquals("i-am+hERE 123", WordUtils.uncapitalize("i-am+HERE 123", chars) );
-        assertEquals("i aM-hERE+123", WordUtils.uncapitalize("I AM-HERE+123", chars) );
-        chars = new char[] {'.'};
-        assertEquals("i AM.fINE", WordUtils.uncapitalize("I AM.FINE", chars) );
-        assertEquals("i aM.FINE", WordUtils.uncapitalize("I AM.FINE", null) );
-    }
-
-    //-----------------------------------------------------------------------
-    @Test
-    public void testInitials_String() {
-        assertEquals(null, WordUtils.initials(null));
-        assertEquals("", WordUtils.initials(""));
-        assertEquals("", WordUtils.initials("  "));
-
-        assertEquals("I", WordUtils.initials("I"));
-        assertEquals("i", WordUtils.initials("i"));
-        assertEquals("BJL", WordUtils.initials("Ben John Lee"));
-        assertEquals("BJ", WordUtils.initials("Ben J.Lee"));
-        assertEquals("BJ.L", WordUtils.initials(" Ben   John  . Lee"));
-        assertEquals("iah1", WordUtils.initials("i am here 123"));
-    }
-
-    // -----------------------------------------------------------------------
-    @Test
-    public void testInitials_String_charArray() {
-        char[] array = null;
-        assertEquals(null, WordUtils.initials(null, array));
-        assertEquals("", WordUtils.initials("", array));
-        assertEquals("", WordUtils.initials("  ", array));
-        assertEquals("I", WordUtils.initials("I", array));
-        assertEquals("i", WordUtils.initials("i", array));
-        assertEquals("S", WordUtils.initials("SJC", array));
-        assertEquals("BJL", WordUtils.initials("Ben John Lee", array));
-        assertEquals("BJ", WordUtils.initials("Ben J.Lee", array));
-        assertEquals("BJ.L", WordUtils.initials(" Ben   John  . Lee", array));
-        assertEquals("KO", WordUtils.initials("Kay O'Murphy", array));
-        assertEquals("iah1", WordUtils.initials("i am here 123", array));
-        
-        array = new char[0];
-        assertEquals(null, WordUtils.initials(null, array));
-        assertEquals("", WordUtils.initials("", array));
-        assertEquals("", WordUtils.initials("  ", array));
-        assertEquals("", WordUtils.initials("I", array));
-        assertEquals("", WordUtils.initials("i", array));
-        assertEquals("", WordUtils.initials("SJC", array));
-        assertEquals("", WordUtils.initials("Ben John Lee", array));
-        assertEquals("", WordUtils.initials("Ben J.Lee", array));
-        assertEquals("", WordUtils.initials(" Ben   John  . Lee", array));
-        assertEquals("", WordUtils.initials("Kay O'Murphy", array));
-        assertEquals("", WordUtils.initials("i am here 123", array));
-        
-        array = " ".toCharArray();
-        assertEquals(null, WordUtils.initials(null, array));
-        assertEquals("", WordUtils.initials("", array));
-        assertEquals("", WordUtils.initials("  ", array));
-        assertEquals("I", WordUtils.initials("I", array));
-        assertEquals("i", WordUtils.initials("i", array));
-        assertEquals("S", WordUtils.initials("SJC", array));
-        assertEquals("BJL", WordUtils.initials("Ben John Lee", array));
-        assertEquals("BJ", WordUtils.initials("Ben J.Lee", array));
-        assertEquals("BJ.L", WordUtils.initials(" Ben   John  . Lee", array));
-        assertEquals("KO", WordUtils.initials("Kay O'Murphy", array));
-        assertEquals("iah1", WordUtils.initials("i am here 123", array));
-        
-        array = " .".toCharArray();
-        assertEquals(null, WordUtils.initials(null, array));
-        assertEquals("", WordUtils.initials("", array));
-        assertEquals("", WordUtils.initials("  ", array));
-        assertEquals("I", WordUtils.initials("I", array));
-        assertEquals("i", WordUtils.initials("i", array));
-        assertEquals("S", WordUtils.initials("SJC", array));
-        assertEquals("BJL", WordUtils.initials("Ben John Lee", array));
-        assertEquals("BJL", WordUtils.initials("Ben J.Lee", array));
-        assertEquals("BJL", WordUtils.initials(" Ben   John  . Lee", array));
-        assertEquals("KO", WordUtils.initials("Kay O'Murphy", array));
-        assertEquals("iah1", WordUtils.initials("i am here 123", array));
-        
-        array = " .'".toCharArray();
-        assertEquals(null, WordUtils.initials(null, array));
-        assertEquals("", WordUtils.initials("", array));
-        assertEquals("", WordUtils.initials("  ", array));
-        assertEquals("I", WordUtils.initials("I", array));
-        assertEquals("i", WordUtils.initials("i", array));
-        assertEquals("S", WordUtils.initials("SJC", array));
-        assertEquals("BJL", WordUtils.initials("Ben John Lee", array));
-        assertEquals("BJL", WordUtils.initials("Ben J.Lee", array));
-        assertEquals("BJL", WordUtils.initials(" Ben   John  . Lee", array));
-        assertEquals("KOM", WordUtils.initials("Kay O'Murphy", array));
-        assertEquals("iah1", WordUtils.initials("i am here 123", array));
-        
-        array = "SIJo1".toCharArray();
-        assertEquals(null, WordUtils.initials(null, array));
-        assertEquals("", WordUtils.initials("", array));
-        assertEquals(" ", WordUtils.initials("  ", array));
-        assertEquals("", WordUtils.initials("I", array));
-        assertEquals("i", WordUtils.initials("i", array));
-        assertEquals("C", WordUtils.initials("SJC", array));
-        assertEquals("Bh", WordUtils.initials("Ben John Lee", array));
-        assertEquals("B.", WordUtils.initials("Ben J.Lee", array));
-        assertEquals(" h", WordUtils.initials(" Ben   John  . Lee", array));
-        assertEquals("K", WordUtils.initials("Kay O'Murphy", array));
-        assertEquals("i2", WordUtils.initials("i am here 123", array));
-    }
-
-    // -----------------------------------------------------------------------
-    @Test
-    public void testSwapCase_String() {
-        assertEquals(null, WordUtils.swapCase(null));
-        assertEquals("", WordUtils.swapCase(""));
-        assertEquals("  ", WordUtils.swapCase("  "));
-        
-        assertEquals("i", WordUtils.swapCase("I") );
-        assertEquals("I", WordUtils.swapCase("i") );
-        assertEquals("I AM HERE 123", WordUtils.swapCase("i am here 123") );
-        assertEquals("i aM hERE 123", WordUtils.swapCase("I Am Here 123") );
-        assertEquals("I AM here 123", WordUtils.swapCase("i am HERE 123") );
-        assertEquals("i am here 123", WordUtils.swapCase("I AM HERE 123") );
-
-        final String test = "This String contains a TitleCase character: \u01C8";
-        final String expect = "tHIS sTRING CONTAINS A tITLEcASE CHARACTER: \u01C9";
-        assertEquals(expect, WordUtils.swapCase(test));
-    }
-
-}
diff --git a/lang/src/test/java/org/apache/commons/lang3/text/translate/EntityArraysTest.java b/lang/src/test/java/org/apache/commons/lang3/text/translate/EntityArraysTest.java
deleted file mode 100644
index 8d3b3fc..0000000
--- a/lang/src/test/java/org/apache/commons/lang3/text/translate/EntityArraysTest.java
+++ /dev/null
@@ -1,73 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- * 
- *      http://www.apache.org/licenses/LICENSE-2.0
- * 
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package org.apache.commons.lang3.text.translate;
-
-import static org.junit.Assert.assertTrue;
-
-import java.util.HashSet;
-import java.util.Set;
-
-import org.junit.Test;
-
-/**
- * Unit tests for {@link org.apache.commons.lang3.text.translate.EntityArrays}.
- * @version $Id$
- */
-public class EntityArraysTest  {
-
-    @Test
-    public void testConstructorExists() {
-        new EntityArrays();
-    }
-    
-    // LANG-659 - check arrays for duplicate entries
-    @Test
-    public void testHTML40_EXTENDED_ESCAPE(){
-        final Set<String> col0 = new HashSet<String>();
-        final Set<String> col1 = new HashSet<String>();
-        final String [][] sa = EntityArrays.HTML40_EXTENDED_ESCAPE();
-        for(int i =0; i <sa.length; i++){
-            assertTrue("Already added entry 0: "+i+" "+sa[i][0],col0.add(sa[i][0]));
-            assertTrue("Already added entry 1: "+i+" "+sa[i][1],col1.add(sa[i][1]));
-        }
-    }
-    
-   // LANG-658 - check arrays for duplicate entries
-    @Test
-    public void testISO8859_1_ESCAPE(){
-        final Set<String> col0 = new HashSet<String>();
-        final Set<String> col1 = new HashSet<String>();
-        final String [][] sa = EntityArrays.ISO8859_1_ESCAPE();
-        boolean success = true;
-        for(int i =0; i <sa.length; i++){
-            final boolean add0 = col0.add(sa[i][0]);
-            final boolean add1 = col1.add(sa[i][1]);
-            if (!add0) { 
-                success = false;
-                System.out.println("Already added entry 0: "+i+" "+sa[i][0]+" "+sa[i][1]);
-            }
-            if (!add1) {
-                success = false;
-                System.out.println("Already added entry 1: "+i+" "+sa[i][0]+" "+sa[i][1]);
-            }
-        }
-        assertTrue("One or more errors detected",success);
-    }
-    
-    
-}
diff --git a/lang/src/test/java/org/apache/commons/lang3/text/translate/LookupTranslatorTest.java b/lang/src/test/java/org/apache/commons/lang3/text/translate/LookupTranslatorTest.java
deleted file mode 100644
index 67419f8..0000000
--- a/lang/src/test/java/org/apache/commons/lang3/text/translate/LookupTranslatorTest.java
+++ /dev/null
@@ -1,52 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- * 
- *      http://www.apache.org/licenses/LICENSE-2.0
- * 
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package org.apache.commons.lang3.text.translate;
-
-import static org.junit.Assert.assertEquals;
-
-import java.io.IOException;
-import java.io.StringWriter;
-
-import org.junit.Test;
-
-/**
- * Unit tests for {@link org.apache.commons.lang3.text.translate.LookupTranslator}.
- * @version $Id$
- */
-public class LookupTranslatorTest  {
-
-    @Test
-    public void testBasicLookup() throws IOException {
-        final LookupTranslator lt = new LookupTranslator(new CharSequence[][] { { "one", "two" } });
-        final StringWriter out = new StringWriter();
-        final int result = lt.translate("one", 0, out);
-        assertEquals("Incorrect codepoint consumption", 3, result);
-        assertEquals("Incorrect value", "two", out.toString());
-    }
-
-    // Tests: https://issues.apache.org/jira/browse/LANG-882
-    @Test
-    public void testLang882() throws IOException {
-        final LookupTranslator lt = new LookupTranslator(new CharSequence[][] { { new StringBuffer("one"), new StringBuffer("two") } });
-        final StringWriter out = new StringWriter();
-        final int result = lt.translate(new StringBuffer("one"), 0, out);
-        assertEquals("Incorrect codepoint consumption", 3, result);
-        assertEquals("Incorrect value", "two", out.toString());
-    }
-
-}
diff --git a/lang/src/test/java/org/apache/commons/lang3/text/translate/NumericEntityEscaperTest.java b/lang/src/test/java/org/apache/commons/lang3/text/translate/NumericEntityEscaperTest.java
deleted file mode 100644
index 816d8a8..0000000
--- a/lang/src/test/java/org/apache/commons/lang3/text/translate/NumericEntityEscaperTest.java
+++ /dev/null
@@ -1,69 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- * 
- *      http://www.apache.org/licenses/LICENSE-2.0
- * 
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package org.apache.commons.lang3.text.translate;
-
-import static org.junit.Assert.assertEquals;
-
-import org.junit.Test;
-
-/**
- * Unit tests for {@link org.apache.commons.lang3.text.translate.NumericEntityEscaper}.
- * @version $Id$
- */
-public class NumericEntityEscaperTest  {
-
-    @Test
-    public void testBelow() {
-        final NumericEntityEscaper nee = NumericEntityEscaper.below('F');
-
-        final String input = "ADFGZ";
-        final String result = nee.translate(input);
-        assertEquals("Failed to escape numeric entities via the below method", "&#65;&#68;FGZ", result);
-    }
-
-    @Test
-    public void testBetween() {
-        final NumericEntityEscaper nee = NumericEntityEscaper.between('F', 'L');
-
-        final String input = "ADFGZ";
-        final String result = nee.translate(input);
-        assertEquals("Failed to escape numeric entities via the between method", "AD&#70;&#71;Z", result);
-    }
-
-    @Test
-    public void testAbove() {
-        final NumericEntityEscaper nee = NumericEntityEscaper.above('F');
-
-        final String input = "ADFGZ";
-        final String result = nee.translate(input);
-        assertEquals("Failed to escape numeric entities via the above method", "ADF&#71;&#90;", result);
-    }
-
-    // See LANG-617
-    @Test
-    public void testSupplementary() {
-        final NumericEntityEscaper nee = new NumericEntityEscaper();
-        final String input = "\uD803\uDC22";
-        final String expected = "&#68642;";
-
-        final String result = nee.translate(input);
-        assertEquals("Failed to escape numeric entities supplementary characters", expected, result);
-
-    }
-
-}
diff --git a/lang/src/test/java/org/apache/commons/lang3/text/translate/NumericEntityUnescaperTest.java b/lang/src/test/java/org/apache/commons/lang3/text/translate/NumericEntityUnescaperTest.java
deleted file mode 100644
index 4087cb9..0000000
--- a/lang/src/test/java/org/apache/commons/lang3/text/translate/NumericEntityUnescaperTest.java
+++ /dev/null
@@ -1,81 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- * 
- *      http://www.apache.org/licenses/LICENSE-2.0
- * 
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package org.apache.commons.lang3.text.translate;
-
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.fail;
-
-import org.junit.Test;
-
-/**
- * Unit tests for {@link org.apache.commons.lang3.text.translate.NumericEntityUnescaper}.
- * @version $Id$
- */
-public class NumericEntityUnescaperTest  {
-
-    @Test
-    public void testSupplementaryUnescaping() {
-        final NumericEntityUnescaper neu = new NumericEntityUnescaper();
-        final String input = "&#68642;";
-        final String expected = "\uD803\uDC22";
-
-        final String result = neu.translate(input);
-        assertEquals("Failed to unescape numeric entities supplementary characters", expected, result);
-    }
-
-    @Test
-    public void testOutOfBounds() {
-        final NumericEntityUnescaper neu = new NumericEntityUnescaper();
-
-        assertEquals("Failed to ignore when last character is &", "Test &", neu.translate("Test &"));
-        assertEquals("Failed to ignore when last character is &", "Test &#", neu.translate("Test &#"));
-        assertEquals("Failed to ignore when last character is &", "Test &#x", neu.translate("Test &#x"));
-        assertEquals("Failed to ignore when last character is &", "Test &#X", neu.translate("Test &#X"));
-    }
-
-    @Test
-    public void testUnfinishedEntity() {
-        // parse it
-        NumericEntityUnescaper neu = new NumericEntityUnescaper(NumericEntityUnescaper.OPTION.semiColonOptional);
-        String input = "Test &#x30 not test";
-        String expected = "Test \u0030 not test";
-
-        String result = neu.translate(input);
-        assertEquals("Failed to support unfinished entities (i.e. missing semi-colon)", expected, result);
-
-        // ignore it
-        neu = new NumericEntityUnescaper();
-        input = "Test &#x30 not test";
-        expected = input;
-
-        result = neu.translate(input);
-        assertEquals("Failed to ignore unfinished entities (i.e. missing semi-colon)", expected, result);
-
-        // fail it
-        neu = new NumericEntityUnescaper(NumericEntityUnescaper.OPTION.errorIfNoSemiColon);
-        input = "Test &#x30 not test";
-
-        try {
-            result = neu.translate(input);
-            fail("IllegalArgumentException expected");
-        } catch(final IllegalArgumentException iae) {
-            // expected
-        }
-    }
-
-}
diff --git a/lang/src/test/java/org/apache/commons/lang3/text/translate/OctalUnescaperTest.java b/lang/src/test/java/org/apache/commons/lang3/text/translate/OctalUnescaperTest.java
deleted file mode 100644
index b100fee..0000000
--- a/lang/src/test/java/org/apache/commons/lang3/text/translate/OctalUnescaperTest.java
+++ /dev/null
@@ -1,82 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- * 
- *      http://www.apache.org/licenses/LICENSE-2.0
- * 
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package org.apache.commons.lang3.text.translate;
-
-import org.junit.Test;
-import static org.junit.Assert.*;
-
-/**
- * Unit tests for {@link org.apache.commons.lang3.text.translate.OctalUnescaper}.
- * @version $Id: OctalUnescaperTest.java 979392 2010-07-26 18:09:52Z mbenson $
- */
-public class OctalUnescaperTest {
-
-    @Test
-    public void testBetween() {
-        final OctalUnescaper oue = new OctalUnescaper();   //.between("1", "377");
-
-        String input = "\\45";
-        String result = oue.translate(input);
-        assertEquals("Failed to unescape octal characters via the between method", "\45", result);
-
-        input = "\\377";
-        result = oue.translate(input);
-        assertEquals("Failed to unescape octal characters via the between method", "\377", result);
-
-        input = "\\377 and";
-        result = oue.translate(input);
-        assertEquals("Failed to unescape octal characters via the between method", "\377 and", result);
-
-        input = "\\378 and";
-        result = oue.translate(input);
-        assertEquals("Failed to unescape octal characters via the between method", "\37" + "8 and", result);
-
-        input = "\\378";
-        result = oue.translate(input);
-        assertEquals("Failed to unescape octal characters via the between method", "\37" + "8", result);
-
-        input = "\\1";
-        result = oue.translate(input);
-        assertEquals("Failed to unescape octal characters via the between method", "\1", result);
-
-        input = "\\036";
-        result = oue.translate(input);
-        assertEquals("Failed to unescape octal characters via the between method", "\036", result);
-
-        input = "\\0365";
-        result = oue.translate(input);
-        assertEquals("Failed to unescape octal characters via the between method", "\036" + "5", result);
-
-        input = "\\003";
-        result = oue.translate(input);
-        assertEquals("Failed to unescape octal characters via the between method", "\003", result);
-
-        input = "\\0003";
-        result = oue.translate(input);
-        assertEquals("Failed to unescape octal characters via the between method", "\000" + "3", result);
-
-        input = "\\279";
-        result = oue.translate(input);
-        assertEquals("Failed to unescape octal characters via the between method", "\279", result);
-
-        input = "\\999";
-        result = oue.translate(input);
-        assertEquals("Failed to ignore an out of range octal character via the between method", "\\999", result);
-    }
-
-}
diff --git a/lang/src/test/java/org/apache/commons/lang3/text/translate/UnicodeEscaperTest.java b/lang/src/test/java/org/apache/commons/lang3/text/translate/UnicodeEscaperTest.java
deleted file mode 100644
index 61f2a0c..0000000
--- a/lang/src/test/java/org/apache/commons/lang3/text/translate/UnicodeEscaperTest.java
+++ /dev/null
@@ -1,56 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- * 
- *      http://www.apache.org/licenses/LICENSE-2.0
- * 
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package org.apache.commons.lang3.text.translate;
-
-import static org.junit.Assert.assertEquals;
-
-import org.junit.Test;
-
-/**
- * Unit tests for {@link org.apache.commons.lang3.text.translate.UnicodeEscaper}.
- * @version $Id$
- */
-public class UnicodeEscaperTest  {
-
-    @Test
-    public void testBelow() {
-        final UnicodeEscaper ue = UnicodeEscaper.below('F');
-
-        final String input = "ADFGZ";
-        final String result = ue.translate(input);
-        assertEquals("Failed to escape Unicode characters via the below method", "\\u0041\\u0044FGZ", result);
-    }
-
-    @Test
-    public void testBetween() {
-        final UnicodeEscaper ue = UnicodeEscaper.between('F', 'L');
-
-        final String input = "ADFGZ";
-        final String result = ue.translate(input);
-        assertEquals("Failed to escape Unicode characters via the between method", "AD\\u0046\\u0047Z", result);
-    }
-
-    @Test
-    public void testAbove() {
-        final UnicodeEscaper ue = UnicodeEscaper.above('F');
-
-        final String input = "ADFGZ";
-        final String result = ue.translate(input);
-        assertEquals("Failed to escape Unicode characters via the above method", "ADF\\u0047\\u005A", result);
-    }
-}
diff --git a/lang/src/test/java/org/apache/commons/lang3/text/translate/UnicodeUnescaperTest.java b/lang/src/test/java/org/apache/commons/lang3/text/translate/UnicodeUnescaperTest.java
deleted file mode 100644
index f003011..0000000
--- a/lang/src/test/java/org/apache/commons/lang3/text/translate/UnicodeUnescaperTest.java
+++ /dev/null
@@ -1,61 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- * 
- *      http://www.apache.org/licenses/LICENSE-2.0
- * 
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package org.apache.commons.lang3.text.translate;
-
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.fail;
-
-import org.junit.Test;
-
-/**
- * Unit tests for {@link org.apache.commons.lang3.text.translate.UnicodeEscaper}.
- * @version $Id$
- */
-public class UnicodeUnescaperTest {
-
-    // Requested in LANG-507
-    @Test
-    public void testUPlus() {
-        final UnicodeUnescaper uu = new UnicodeUnescaper();
-
-        final String input = "\\u+0047";
-        assertEquals("Failed to unescape Unicode characters with 'u+' notation", "G", uu.translate(input));
-    }
-
-    @Test
-    public void testUuuuu() {
-        final UnicodeUnescaper uu = new UnicodeUnescaper();
-
-        final String input = "\\uuuuuuuu0047";
-        final String result = uu.translate(input);
-        assertEquals("Failed to unescape Unicode characters with many 'u' characters", "G", result);
-    }
-
-    @Test
-    public void testLessThanFour() {
-        final UnicodeUnescaper uu = new UnicodeUnescaper();
-
-        final String input = "\\0047\\u006";
-        try {
-            uu.translate(input);
-            fail("A lack of digits in a Unicode escape sequence failed to throw an exception");
-        } catch(final IllegalArgumentException iae) {
-            // expected
-        }
-    }
-}
diff --git a/lang/src/test/java/org/apache/commons/lang3/text/translate/UnicodeUnpairedSurrogateRemoverTest.java b/lang/src/test/java/org/apache/commons/lang3/text/translate/UnicodeUnpairedSurrogateRemoverTest.java
deleted file mode 100644
index 08e1b1e..0000000
--- a/lang/src/test/java/org/apache/commons/lang3/text/translate/UnicodeUnpairedSurrogateRemoverTest.java
+++ /dev/null
@@ -1,48 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- * 
- *      http://www.apache.org/licenses/LICENSE-2.0
- * 
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.commons.lang3.text.translate;
-
-import static org.junit.Assert.*;
-
-import java.io.CharArrayWriter;
-import java.io.IOException;
-import org.junit.Test;
-
-/**
- * Unit tests for {@link org.apache.commons.lang3.text.translate.UnicodeUnpairedSurrogateRemover}.
- *
- * @version $Id$
- */
-public class UnicodeUnpairedSurrogateRemoverTest {
-    final UnicodeUnpairedSurrogateRemover subject = new UnicodeUnpairedSurrogateRemover();
-    final CharArrayWriter writer = new CharArrayWriter(); // nothing is ever written to it
-    
-    @Test
-    public void testValidCharacters() throws IOException {
-        assertEquals(false, subject.translate(0xd7ff, writer));
-        assertEquals(false, subject.translate(0xe000, writer));
-        assertEquals(0, writer.size());
-    }
-    
-    @Test
-    public void testInvalidCharacters() throws IOException {
-        assertEquals(true, subject.translate(0xd800, writer));
-        assertEquals(true, subject.translate(0xdfff, writer));
-        assertEquals(0, writer.size());
-    }
-}
-
diff --git a/lang/src/test/java/org/apache/commons/lang3/time/DateFormatUtilsTest.java b/lang/src/test/java/org/apache/commons/lang3/time/DateFormatUtilsTest.java
deleted file mode 100644
index 3b0d11f..0000000
--- a/lang/src/test/java/org/apache/commons/lang3/time/DateFormatUtilsTest.java
+++ /dev/null
@@ -1,268 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- * 
- *      http://www.apache.org/licenses/LICENSE-2.0
- * 
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.commons.lang3.time;
-
-import org.junit.Test;
-
-import static org.junit.Assert.*;
-
-import java.lang.reflect.Constructor;
-import java.lang.reflect.Modifier;
-import java.util.Calendar;
-import java.util.Date;
-import java.util.Locale;
-import java.util.TimeZone;
-
-/**
- * TestCase for DateFormatUtils.
- *
- */
-public class DateFormatUtilsTest {
-
-    //-----------------------------------------------------------------------
-    @Test
-    public void testConstructor() {
-        assertNotNull(new DateFormatUtils());
-        final Constructor<?>[] cons = DateFormatUtils.class.getDeclaredConstructors();
-        assertEquals(1, cons.length);
-        assertTrue(Modifier.isPublic(cons[0].getModifiers()));
-        assertTrue(Modifier.isPublic(DateFormatUtils.class.getModifiers()));
-        assertFalse(Modifier.isFinal(DateFormatUtils.class.getModifiers()));
-    }
-    
-    //-----------------------------------------------------------------------
-    @Test
-    public void testFormat() {
-        final Calendar c = Calendar.getInstance(TimeZone.getTimeZone("UTC"));
-        c.set(2005,0,1,12,0,0);
-        c.setTimeZone(TimeZone.getDefault());
-        final StringBuilder buffer = new StringBuilder ();
-        final int year = c.get(Calendar.YEAR);
-        final int month = c.get(Calendar.MONTH) + 1;
-        final int day = c.get(Calendar.DAY_OF_MONTH);
-        final int hour = c.get(Calendar.HOUR_OF_DAY);
-        buffer.append (year);
-        buffer.append(month);
-        buffer.append(day);
-        buffer.append(hour);
-        assertEquals(buffer.toString(), DateFormatUtils.format(c.getTime(), "yyyyMdH"));
-        
-        assertEquals(buffer.toString(), DateFormatUtils.format(c.getTime().getTime(), "yyyyMdH"));
-        
-        assertEquals(buffer.toString(), DateFormatUtils.format(c.getTime(), "yyyyMdH", Locale.US));
-        
-        assertEquals(buffer.toString(), DateFormatUtils.format(c.getTime().getTime(), "yyyyMdH", Locale.US));
-    }
-    
-    //-----------------------------------------------------------------------
-    @Test
-    public void testFormatCalendar() {
-        final Calendar c = Calendar.getInstance(TimeZone.getTimeZone("UTC"));
-        c.set(2005,0,1,12,0,0);
-        c.setTimeZone(TimeZone.getDefault());
-        final StringBuilder buffer = new StringBuilder ();
-        final int year = c.get(Calendar.YEAR);
-        final int month = c.get(Calendar.MONTH) + 1;
-        final int day = c.get(Calendar.DAY_OF_MONTH);
-        final int hour = c.get(Calendar.HOUR_OF_DAY);
-        buffer.append (year);
-        buffer.append(month);
-        buffer.append(day);
-        buffer.append(hour);
-        assertEquals(buffer.toString(), DateFormatUtils.format(c, "yyyyMdH"));
-        
-        assertEquals(buffer.toString(), DateFormatUtils.format(c.getTime(), "yyyyMdH"));
-        
-        assertEquals(buffer.toString(), DateFormatUtils.format(c, "yyyyMdH", Locale.US));
-        
-        assertEquals(buffer.toString(), DateFormatUtils.format(c.getTime(), "yyyyMdH", Locale.US));
-    }
-    
-    @Test
-    public void testFormatUTC() {
-        final Calendar c = Calendar.getInstance(TimeZone.getTimeZone("UTC"));
-        c.set(2005,0,1,12,0,0);
-        assertEquals ("2005-01-01T12:00:00", DateFormatUtils.formatUTC(c.getTime(), DateFormatUtils.ISO_DATETIME_FORMAT.getPattern()));
-        
-        assertEquals ("2005-01-01T12:00:00", DateFormatUtils.formatUTC(c.getTime().getTime(), DateFormatUtils.ISO_DATETIME_FORMAT.getPattern()));
-        
-        assertEquals ("2005-01-01T12:00:00", DateFormatUtils.formatUTC(c.getTime(), DateFormatUtils.ISO_DATETIME_FORMAT.getPattern(), Locale.US));
-        
-        assertEquals ("2005-01-01T12:00:00", DateFormatUtils.formatUTC(c.getTime().getTime(), DateFormatUtils.ISO_DATETIME_FORMAT.getPattern(), Locale.US));
-    }
-    
-    @Test
-    public void testDateTimeISO() throws Exception {
-        final TimeZone timeZone = TimeZone.getTimeZone("GMT-3");
-        final Calendar cal = Calendar.getInstance(timeZone);
-        cal.set(2002,1,23,9,11,12);
-        String text = DateFormatUtils.format(cal.getTime(), 
-                        DateFormatUtils.ISO_DATETIME_FORMAT.getPattern(), timeZone);
-        assertEquals("2002-02-23T09:11:12", text);
-        text = DateFormatUtils.format(cal.getTime().getTime(), 
-                      DateFormatUtils.ISO_DATETIME_FORMAT.getPattern(), timeZone);
-        assertEquals("2002-02-23T09:11:12", text);
-        text = DateFormatUtils.ISO_DATETIME_FORMAT.format(cal);
-        assertEquals("2002-02-23T09:11:12", text);
-        
-        text = DateFormatUtils.format(cal.getTime(), 
-                      DateFormatUtils.ISO_DATETIME_TIME_ZONE_FORMAT.getPattern(), timeZone);
-        assertEquals("2002-02-23T09:11:12-03:00", text);
-        text = DateFormatUtils.format(cal.getTime().getTime(), 
-                      DateFormatUtils.ISO_DATETIME_TIME_ZONE_FORMAT.getPattern(), timeZone);
-        assertEquals("2002-02-23T09:11:12-03:00", text);
-        text = DateFormatUtils.ISO_DATETIME_TIME_ZONE_FORMAT.format(cal);
-        assertEquals("2002-02-23T09:11:12-03:00", text);
-        
-        Calendar utcCal = Calendar.getInstance(TimeZone.getTimeZone("UTC"));
-        utcCal.set(2002, 1, 23, 9, 11, 12);
-        utcCal.set(Calendar.MILLISECOND, 0);
-        text = DateFormatUtils.ISO_DATETIME_TIME_ZONE_FORMAT.format(utcCal);
-        assertEquals("2002-02-23T09:11:12Z", text);
-        Date date = DateFormatUtils.ISO_DATETIME_TIME_ZONE_FORMAT.parse(text);
-        assertEquals(utcCal.getTime(), date);
-    }
-
-    @Test
-    public void testDateISO(){
-        final TimeZone timeZone = TimeZone.getTimeZone("GMT-3");
-        final Calendar cal = Calendar.getInstance(timeZone);
-        cal.set(2002,1,23,10,11,12);
-        String text = DateFormatUtils.format(cal.getTime(), 
-                        DateFormatUtils.ISO_DATE_FORMAT.getPattern(), timeZone);
-        assertEquals("2002-02-23", text);
-        text = DateFormatUtils.format(cal.getTime().getTime(), 
-                        DateFormatUtils.ISO_DATE_FORMAT.getPattern(), timeZone);
-        assertEquals("2002-02-23", text);
-        text = DateFormatUtils.ISO_DATE_FORMAT.format(cal);
-        assertEquals("2002-02-23", text);
-        
-        text = DateFormatUtils.format(cal.getTime(), 
-                      DateFormatUtils.ISO_DATE_TIME_ZONE_FORMAT.getPattern(), timeZone);
-        assertEquals("2002-02-23-03:00", text);
-        text = DateFormatUtils.format(cal.getTime().getTime(), 
-                      DateFormatUtils.ISO_DATE_TIME_ZONE_FORMAT.getPattern(), timeZone);
-        assertEquals("2002-02-23-03:00", text);
-        text = DateFormatUtils.ISO_DATE_TIME_ZONE_FORMAT.format(cal);
-        assertEquals("2002-02-23-03:00", text);
-    }
-
-    @Test
-    public void testTimeISO(){
-        final TimeZone timeZone = TimeZone.getTimeZone("GMT-3");
-        final Calendar cal = Calendar.getInstance(timeZone);
-        cal.set(2002,1,23,10,11,12);
-        String text = DateFormatUtils.format(cal.getTime(), 
-                        DateFormatUtils.ISO_TIME_FORMAT.getPattern(), timeZone);
-        assertEquals("T10:11:12", text);
-        text = DateFormatUtils.format(cal.getTime().getTime(), 
-                        DateFormatUtils.ISO_TIME_FORMAT.getPattern(), timeZone);
-        assertEquals("T10:11:12", text);
-        text = DateFormatUtils.ISO_TIME_FORMAT.format(cal);
-        assertEquals("T10:11:12", text);
-        
-        text = DateFormatUtils.format(cal.getTime(), 
-                      DateFormatUtils.ISO_TIME_TIME_ZONE_FORMAT.getPattern(), timeZone);
-        assertEquals("T10:11:12-03:00", text);
-        text = DateFormatUtils.format(cal.getTime().getTime(), 
-                      DateFormatUtils.ISO_TIME_TIME_ZONE_FORMAT.getPattern(), timeZone);
-        assertEquals("T10:11:12-03:00", text);
-        text = DateFormatUtils.ISO_TIME_TIME_ZONE_FORMAT.format(cal);
-        assertEquals("T10:11:12-03:00", text);
-    }
-
-    @Test
-    public void testTimeNoTISO(){
-        final TimeZone timeZone = TimeZone.getTimeZone("GMT-3");
-        final Calendar cal = Calendar.getInstance(timeZone);
-        cal.set(2002,1,23,10,11,12);
-        String text = DateFormatUtils.format(cal.getTime(), 
-                        DateFormatUtils.ISO_TIME_NO_T_FORMAT.getPattern(), timeZone);
-        assertEquals("10:11:12", text);
-        text = DateFormatUtils.format(cal.getTime().getTime(), 
-                        DateFormatUtils.ISO_TIME_NO_T_FORMAT.getPattern(), timeZone);
-        assertEquals("10:11:12", text);
-        text = DateFormatUtils.ISO_TIME_NO_T_FORMAT.format(cal);
-        assertEquals("10:11:12", text);
-        
-        text = DateFormatUtils.format(cal.getTime(), 
-                      DateFormatUtils.ISO_TIME_NO_T_TIME_ZONE_FORMAT.getPattern(), timeZone);
-        assertEquals("10:11:12-03:00", text);
-        text = DateFormatUtils.format(cal.getTime().getTime(), 
-                      DateFormatUtils.ISO_TIME_NO_T_TIME_ZONE_FORMAT.getPattern(), timeZone);
-        assertEquals("10:11:12-03:00", text);
-        text = DateFormatUtils.ISO_TIME_NO_T_TIME_ZONE_FORMAT.format(cal);
-        assertEquals("10:11:12-03:00", text);
-    }
-
-    @Test
-    public void testSMTP(){
-        final TimeZone timeZone = TimeZone.getTimeZone("GMT-3");
-        final Calendar cal = Calendar.getInstance(timeZone);
-        cal.set(2003,5,8,10,11,12);
-        String text = DateFormatUtils.format(cal.getTime(), 
-                        DateFormatUtils.SMTP_DATETIME_FORMAT.getPattern(), timeZone,
-                        DateFormatUtils.SMTP_DATETIME_FORMAT.getLocale());
-        assertEquals("Sun, 08 Jun 2003 10:11:12 -0300", text);
-        text = DateFormatUtils.format(cal.getTime().getTime(), 
-                        DateFormatUtils.SMTP_DATETIME_FORMAT.getPattern(), timeZone,
-                        DateFormatUtils.SMTP_DATETIME_FORMAT.getLocale());
-        assertEquals("Sun, 08 Jun 2003 10:11:12 -0300", text);
-        text = DateFormatUtils.SMTP_DATETIME_FORMAT.format(cal);
-        assertEquals("Sun, 08 Jun 2003 10:11:12 -0300", text);
-        
-        // format UTC
-        text = DateFormatUtils.formatUTC(cal.getTime().getTime(), 
-                        DateFormatUtils.SMTP_DATETIME_FORMAT.getPattern(),
-                        DateFormatUtils.SMTP_DATETIME_FORMAT.getLocale());
-        assertEquals("Sun, 08 Jun 2003 13:11:12 +0000", text);
-    }
-
-    /*
-    public void testLang312() {
-        String pattern = "dd/MM/yyyy";
-        String expected = "19/04/1948";
-        TimeZone timeZone = TimeZone.getTimeZone("CET");
-        Locale locale = Locale.GERMANY;
-
-        // show Calendar is good
-        Calendar cal = Calendar.getInstance(timeZone, locale);
-        cal.set(1948, 3, 19);
-        assertEquals(expected, DateFormatUtils.format( cal.getTime(), pattern, timeZone, locale ) );
-
-        Date date = new Date(48, 3, 19);
-
-        // test JDK
-        java.text.SimpleDateFormat sdf = new java.text.SimpleDateFormat(pattern, locale);
-        sdf.setTimeZone(timeZone);
-// There's nothing we can do if the JDK fails, so just going to pring a warning in this case
-//        assertEquals(expected, sdf.format( date ) );
-        if( ! expected.equals( sdf.format( date ) ) ) {
-            System.out.println("WARNING: JDK test failed - testLang312()");
-        }
-
-        // test Commons
-        assertEquals(expected, DateFormatUtils.format( date, pattern, timeZone, locale ) );
-    }
-    */
-
-    @Test
-    public void testLANG1000() throws Exception {
-        String date = "2013-11-18T12:48:05Z";
-        DateFormatUtils.ISO_DATETIME_TIME_ZONE_FORMAT.parse(date);
-    }
-}
diff --git a/lang/src/test/java/org/apache/commons/lang3/time/DateUtilsFragmentTest.java b/lang/src/test/java/org/apache/commons/lang3/time/DateUtilsFragmentTest.java
deleted file mode 100644
index 5f013df..0000000
--- a/lang/src/test/java/org/apache/commons/lang3/time/DateUtilsFragmentTest.java
+++ /dev/null
@@ -1,592 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- * 
- *      http://www.apache.org/licenses/LICENSE-2.0
- * 
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.commons.lang3.time;
-
-import org.junit.Test;
-import org.junit.Before;
-import static org.junit.Assert.*;
-import java.util.Calendar;
-import java.util.Date;
-
-public class DateUtilsFragmentTest {
-
-    private static final int months = 7;   // second final prime before 12
-    private static final int days = 23;    // second final prime before 31 (and valid)
-    private static final int hours = 19;   // second final prime before 24
-    private static final int minutes = 53; // second final prime before 60
-    private static final int seconds = 47; // third final prime before 60
-    private static final int millis = 991; // second final prime before 1000
-
-    private Date aDate;
-    private Calendar aCalendar;
-
-
-    @Before
-    public void setUp() {
-        aCalendar = Calendar.getInstance();
-        aCalendar.set(2005, months, days, hours, minutes, seconds);
-        aCalendar.set(Calendar.MILLISECOND, millis);
-        aDate = aCalendar.getTime();
-    }
-    
-    @Test
-    public void testNullDate() {
-        try {
-            DateUtils.getFragmentInMilliseconds((Date) null, Calendar.MILLISECOND);
-            fail();
-        } catch(final IllegalArgumentException iae) {}
-
-        try {
-            DateUtils.getFragmentInSeconds((Date) null, Calendar.MILLISECOND);
-            fail();
-        } catch(final IllegalArgumentException iae) {}
-
-        try {
-            DateUtils.getFragmentInMinutes((Date) null, Calendar.MILLISECOND);
-            fail();
-        } catch(final IllegalArgumentException iae) {}
-
-        try {
-            DateUtils.getFragmentInHours((Date) null, Calendar.MILLISECOND);
-            fail();
-        } catch(final IllegalArgumentException iae) {}
-
-        try {
-            DateUtils.getFragmentInDays((Date) null, Calendar.MILLISECOND);
-            fail();
-        } catch(final IllegalArgumentException iae) {}
-    }
-
-    @Test
-    public void testNullCalendar() {
-        try {
-            DateUtils.getFragmentInMilliseconds((Calendar) null, Calendar.MILLISECOND);
-            fail();
-        } catch(final IllegalArgumentException iae) {}
-
-        try {
-            DateUtils.getFragmentInSeconds((Calendar) null, Calendar.MILLISECOND);
-            fail();
-        } catch(final IllegalArgumentException iae) {}
-
-        try {
-            DateUtils.getFragmentInMinutes((Calendar) null, Calendar.MILLISECOND);
-            fail();
-        } catch(final IllegalArgumentException iae) {}
-
-        try {
-            DateUtils.getFragmentInHours((Calendar) null, Calendar.MILLISECOND);
-            fail();
-        } catch(final IllegalArgumentException iae) {}
-
-        try {
-            DateUtils.getFragmentInDays((Calendar) null, Calendar.MILLISECOND);
-            fail();
-        } catch(final IllegalArgumentException iae) {}
-    }
-    
-    @Test
-    public void testInvalidFragmentWithDate() {
-        try {
-            DateUtils.getFragmentInMilliseconds(aDate, 0);
-            fail();
-        } catch(final IllegalArgumentException iae) {}
-
-        try {
-            DateUtils.getFragmentInSeconds(aDate, 0);
-            fail();
-        } catch(final IllegalArgumentException iae) {}
-
-        try {
-            DateUtils.getFragmentInMinutes(aDate, 0);
-            fail();
-        } catch(final IllegalArgumentException iae) {}
-
-        try {
-            DateUtils.getFragmentInHours(aDate, 0);
-            fail();
-        } catch(final IllegalArgumentException iae) {}
-
-        try {
-            DateUtils.getFragmentInDays(aDate, 0);
-            fail();
-        } catch(final IllegalArgumentException iae) {}
-    }
-
-    @Test
-    public void testInvalidFragmentWithCalendar() {
-        try {
-            DateUtils.getFragmentInMilliseconds(aCalendar, 0);
-            fail();
-        } catch(final IllegalArgumentException iae) {}
-
-        try {
-            DateUtils.getFragmentInSeconds(aCalendar, 0);
-            fail();
-        } catch(final IllegalArgumentException iae) {}
-
-        try {
-            DateUtils.getFragmentInMinutes(aCalendar, 0);
-            fail();
-        } catch(final IllegalArgumentException iae) {}
-
-        try {
-            DateUtils.getFragmentInHours(aCalendar, 0);
-            fail();
-        } catch(final IllegalArgumentException iae) {}
-
-        try {
-            DateUtils.getFragmentInDays(aCalendar, 0);
-            fail();
-        } catch(final IllegalArgumentException iae) {}
-    }
-
-    @Test
-    public void testMillisecondFragmentInLargerUnitWithDate() {
-        assertEquals(0, DateUtils.getFragmentInMilliseconds(aDate, Calendar.MILLISECOND));
-        assertEquals(0, DateUtils.getFragmentInSeconds(aDate, Calendar.MILLISECOND));
-        assertEquals(0, DateUtils.getFragmentInMinutes(aDate, Calendar.MILLISECOND));
-        assertEquals(0, DateUtils.getFragmentInHours(aDate, Calendar.MILLISECOND));
-        assertEquals(0, DateUtils.getFragmentInDays(aDate, Calendar.MILLISECOND));
-    }
-
-    @Test
-    public void testMillisecondFragmentInLargerUnitWithCalendar() {
-        assertEquals(0, DateUtils.getFragmentInMilliseconds(aCalendar, Calendar.MILLISECOND));
-        assertEquals(0, DateUtils.getFragmentInSeconds(aCalendar, Calendar.MILLISECOND));
-        assertEquals(0, DateUtils.getFragmentInMinutes(aCalendar, Calendar.MILLISECOND));
-        assertEquals(0, DateUtils.getFragmentInHours(aCalendar, Calendar.MILLISECOND));
-        assertEquals(0, DateUtils.getFragmentInDays(aCalendar, Calendar.MILLISECOND));
-    }
-    
-    @Test
-    public void testSecondFragmentInLargerUnitWithDate() {
-        assertEquals(0, DateUtils.getFragmentInSeconds(aDate, Calendar.SECOND));
-        assertEquals(0, DateUtils.getFragmentInMinutes(aDate, Calendar.SECOND));
-        assertEquals(0, DateUtils.getFragmentInHours(aDate, Calendar.SECOND));
-        assertEquals(0, DateUtils.getFragmentInDays(aDate, Calendar.SECOND));
-    }
-
-    @Test
-    public void testSecondFragmentInLargerUnitWithCalendar() {
-        assertEquals(0, DateUtils.getFragmentInSeconds(aCalendar, Calendar.SECOND));
-        assertEquals(0, DateUtils.getFragmentInMinutes(aCalendar, Calendar.SECOND));
-        assertEquals(0, DateUtils.getFragmentInHours(aCalendar, Calendar.SECOND));
-        assertEquals(0, DateUtils.getFragmentInDays(aCalendar, Calendar.SECOND));
-    }
-    
-    @Test
-    public void testMinuteFragmentInLargerUnitWithDate() {
-        assertEquals(0, DateUtils.getFragmentInMinutes(aDate, Calendar.MINUTE));
-        assertEquals(0, DateUtils.getFragmentInHours(aDate, Calendar.MINUTE));
-        assertEquals(0, DateUtils.getFragmentInDays(aDate, Calendar.MINUTE));
-    }
-
-    @Test
-    public void testMinuteFragmentInLargerUnitWithCalendar() {
-        assertEquals(0, DateUtils.getFragmentInMinutes(aCalendar, Calendar.MINUTE));
-        assertEquals(0, DateUtils.getFragmentInHours(aCalendar, Calendar.MINUTE));
-        assertEquals(0, DateUtils.getFragmentInDays(aCalendar, Calendar.MINUTE));
-    }
-
-    @Test
-    public void testHourOfDayFragmentInLargerUnitWithDate() {
-        assertEquals(0, DateUtils.getFragmentInHours(aDate, Calendar.HOUR_OF_DAY));
-        assertEquals(0, DateUtils.getFragmentInDays(aDate, Calendar.HOUR_OF_DAY));
-    }
-
-    @Test
-    public void testHourOfDayFragmentInLargerUnitWithCalendar() {
-        assertEquals(0, DateUtils.getFragmentInHours(aCalendar, Calendar.HOUR_OF_DAY));
-        assertEquals(0, DateUtils.getFragmentInDays(aCalendar, Calendar.HOUR_OF_DAY));
-    }
-
-    @Test
-    public void testDayOfYearFragmentInLargerUnitWithDate() {
-        assertEquals(0, DateUtils.getFragmentInDays(aDate, Calendar.DAY_OF_YEAR));
-    }
-
-    @Test
-    public void testDayOfYearFragmentInLargerUnitWithCalendar() {
-        assertEquals(0, DateUtils.getFragmentInDays(aCalendar, Calendar.DAY_OF_YEAR));
-    }
-
-    @Test
-    public void testDateFragmentInLargerUnitWithDate() {
-        assertEquals(0, DateUtils.getFragmentInDays(aDate, Calendar.DATE));
-    }
-
-    @Test
-    public void testDateFragmentInLargerUnitWithCalendar() {
-        assertEquals(0, DateUtils.getFragmentInDays(aCalendar, Calendar.DATE));
-    }
-
-    //Calendar.SECOND as useful fragment
-    
-    @Test
-    public void testMillisecondsOfSecondWithDate() {
-        final long testResult = DateUtils.getFragmentInMilliseconds(aDate, Calendar.SECOND);
-        assertEquals(millis, testResult);
-    }
-
-    @Test
-    public void testMillisecondsOfSecondWithCalendar() {
-        final long testResult = DateUtils.getFragmentInMilliseconds(aCalendar, Calendar.SECOND);
-        assertEquals(millis, testResult);
-        assertEquals(aCalendar.get(Calendar.MILLISECOND), testResult);
-    }
-
-    //Calendar.MINUTE as useful fragment
-
-    @Test
-    public void testMillisecondsOfMinuteWithDate() {
-        final long testResult = DateUtils.getFragmentInMilliseconds(aDate, Calendar.MINUTE);
-        assertEquals(millis + (seconds * DateUtils.MILLIS_PER_SECOND), testResult);
-    }
-
-    @Test
-    public void testMillisecondsOfMinuteWithCalender() {
-        final long testResult = DateUtils.getFragmentInMilliseconds(aCalendar, Calendar.MINUTE);
-        assertEquals(millis + (seconds * DateUtils.MILLIS_PER_SECOND), testResult);
-    }
-
-    @Test
-    public void testSecondsofMinuteWithDate() {
-        final long testResult = DateUtils.getFragmentInSeconds(aDate, Calendar.MINUTE);
-        assertEquals(seconds, testResult);
-    }
-
-    @Test
-    public void testSecondsofMinuteWithCalendar() {
-        final long testResult = DateUtils.getFragmentInSeconds(aCalendar, Calendar.MINUTE);
-        assertEquals(seconds, testResult);
-        assertEquals(aCalendar.get(Calendar.SECOND), testResult);
-    }
-
-    //Calendar.HOUR_OF_DAY as useful fragment
-    
-    @Test
-    public void testMillisecondsOfHourWithDate() {
-        final long testResult = DateUtils.getFragmentInMilliseconds(aDate, Calendar.HOUR_OF_DAY);
-        assertEquals(millis + (seconds * DateUtils.MILLIS_PER_SECOND) + (minutes * DateUtils.MILLIS_PER_MINUTE), testResult);
-    }
-    
-    @Test
-    public void testMillisecondsOfHourWithCalendar() {
-        final long testResult = DateUtils.getFragmentInMilliseconds(aCalendar, Calendar.HOUR_OF_DAY);
-        assertEquals(millis + (seconds * DateUtils.MILLIS_PER_SECOND) + (minutes * DateUtils.MILLIS_PER_MINUTE), testResult);
-    }
-
-    @Test
-    public void testSecondsofHourWithDate() {
-        final long testResult = DateUtils.getFragmentInSeconds(aDate, Calendar.HOUR_OF_DAY);
-        assertEquals(
-                seconds
-                        + (minutes
-                                * DateUtils.MILLIS_PER_MINUTE / DateUtils.MILLIS_PER_SECOND),
-                testResult);
-    }
-
-    @Test
-    public void testSecondsofHourWithCalendar() {
-        final long testResult = DateUtils.getFragmentInSeconds(aCalendar, Calendar.HOUR_OF_DAY);
-        assertEquals(
-                seconds
-                        + (minutes
-                                * DateUtils.MILLIS_PER_MINUTE / DateUtils.MILLIS_PER_SECOND),
-                testResult);
-    }
-
-    @Test
-    public void testMinutesOfHourWithDate() {
-        final long testResult = DateUtils.getFragmentInMinutes(aDate, Calendar.HOUR_OF_DAY);
-        assertEquals(minutes, testResult);
-    }
-
-    @Test
-    public void testMinutesOfHourWithCalendar() {
-        final long testResult = DateUtils.getFragmentInMinutes(aCalendar, Calendar.HOUR_OF_DAY);
-        assertEquals(minutes, testResult);
-    }
-
-    //Calendar.DATE and Calendar.DAY_OF_YEAR as useful fragment
-    @Test
-    public void testMillisecondsOfDayWithDate() {
-        long testresult = DateUtils.getFragmentInMilliseconds(aDate, Calendar.DATE);
-        final long expectedValue = millis + (seconds * DateUtils.MILLIS_PER_SECOND) + (minutes * DateUtils.MILLIS_PER_MINUTE) + (hours * DateUtils.MILLIS_PER_HOUR); 
-        assertEquals(expectedValue, testresult);
-        testresult = DateUtils.getFragmentInMilliseconds(aDate, Calendar.DAY_OF_YEAR);
-        assertEquals(expectedValue, testresult);
-    }
-    
-    @Test
-    public void testMillisecondsOfDayWithCalendar() {
-        long testresult = DateUtils.getFragmentInMilliseconds(aCalendar, Calendar.DATE);
-        final long expectedValue = millis + (seconds * DateUtils.MILLIS_PER_SECOND) + (minutes * DateUtils.MILLIS_PER_MINUTE) + (hours * DateUtils.MILLIS_PER_HOUR); 
-        assertEquals(expectedValue, testresult);
-        testresult = DateUtils.getFragmentInMilliseconds(aCalendar, Calendar.DAY_OF_YEAR);
-        assertEquals(expectedValue, testresult);
-    }
-
-    @Test
-    public void testSecondsOfDayWithDate() {
-        long testresult = DateUtils.getFragmentInSeconds(aDate, Calendar.DATE);
-        final long expectedValue = seconds + ((minutes * DateUtils.MILLIS_PER_MINUTE) + (hours * DateUtils.MILLIS_PER_HOUR))/ DateUtils.MILLIS_PER_SECOND;
-        assertEquals(expectedValue, testresult);
-        testresult = DateUtils.getFragmentInSeconds(aDate, Calendar.DAY_OF_YEAR);
-        assertEquals(expectedValue, testresult);
-    }
-
-    @Test
-    public void testSecondsOfDayWithCalendar() {
-        long testresult = DateUtils.getFragmentInSeconds(aCalendar, Calendar.DATE);
-        final long expectedValue = seconds + ((minutes * DateUtils.MILLIS_PER_MINUTE) + (hours * DateUtils.MILLIS_PER_HOUR))/ DateUtils.MILLIS_PER_SECOND;
-        assertEquals(expectedValue, testresult);
-        testresult = DateUtils.getFragmentInSeconds(aCalendar, Calendar.DAY_OF_YEAR);
-        assertEquals(expectedValue, testresult);
-    }
-
-    @Test
-    public void testMinutesOfDayWithDate() {
-        long testResult = DateUtils.getFragmentInMinutes(aDate, Calendar.DATE);
-        final long expectedValue = minutes + ((hours * DateUtils.MILLIS_PER_HOUR))/ DateUtils.MILLIS_PER_MINUTE; 
-        assertEquals(expectedValue,testResult);
-        testResult = DateUtils.getFragmentInMinutes(aDate, Calendar.DAY_OF_YEAR);
-        assertEquals(expectedValue,testResult);
-    }
-
-    @Test
-    public void testMinutesOfDayWithCalendar() {
-        long testResult = DateUtils.getFragmentInMinutes(aCalendar, Calendar.DATE);
-        final long expectedValue = minutes + ((hours * DateUtils.MILLIS_PER_HOUR))/ DateUtils.MILLIS_PER_MINUTE; 
-        assertEquals(expectedValue, testResult);
-        testResult = DateUtils.getFragmentInMinutes(aCalendar, Calendar.DAY_OF_YEAR);
-        assertEquals(expectedValue, testResult);
-    }
-    
-    @Test
-    public void testHoursOfDayWithDate() {
-        long testResult = DateUtils.getFragmentInHours(aDate, Calendar.DATE);
-        final long expectedValue = hours; 
-        assertEquals(expectedValue,testResult);
-        testResult = DateUtils.getFragmentInHours(aDate, Calendar.DAY_OF_YEAR);
-        assertEquals(expectedValue,testResult);
-    }
-
-    @Test
-    public void testHoursOfDayWithCalendar() {
-        long testResult = DateUtils.getFragmentInHours(aCalendar, Calendar.DATE);
-        final long expectedValue = hours; 
-        assertEquals(expectedValue, testResult);
-        testResult = DateUtils.getFragmentInHours(aCalendar, Calendar.DAY_OF_YEAR);
-        assertEquals(expectedValue, testResult);
-    }
-    
-    
-    //Calendar.MONTH as useful fragment
-    @Test
-    public void testMillisecondsOfMonthWithDate() {
-        final long testResult = DateUtils.getFragmentInMilliseconds(aDate, Calendar.MONTH);
-        assertEquals(millis + (seconds * DateUtils.MILLIS_PER_SECOND) + (minutes * DateUtils.MILLIS_PER_MINUTE)
-                                + (hours * DateUtils.MILLIS_PER_HOUR) + ((days - 1) * DateUtils.MILLIS_PER_DAY),
-                testResult);
-    }
-
-    @Test
-    public void testMillisecondsOfMonthWithCalendar() {
-        final long testResult = DateUtils.getFragmentInMilliseconds(aCalendar, Calendar.MONTH);
-        assertEquals(millis + (seconds * DateUtils.MILLIS_PER_SECOND) + (minutes * DateUtils.MILLIS_PER_MINUTE)
-                + (hours * DateUtils.MILLIS_PER_HOUR) + ((days - 1) * DateUtils.MILLIS_PER_DAY),
-testResult);
-    }
-    
-    @Test
-    public void testSecondsOfMonthWithDate() {
-        final long testResult = DateUtils.getFragmentInSeconds(aDate, Calendar.MONTH);
-        assertEquals(
-                seconds
-                        + ((minutes * DateUtils.MILLIS_PER_MINUTE)
-                                + (hours * DateUtils.MILLIS_PER_HOUR) + ((days - 1) * DateUtils.MILLIS_PER_DAY))
-                        / DateUtils.MILLIS_PER_SECOND,
-                testResult);
-    }
-
-    @Test
-    public void testSecondsOfMonthWithCalendar() {
-        final long testResult = DateUtils.getFragmentInSeconds(aCalendar, Calendar.MONTH);
-        assertEquals(
-                seconds
-                        + ((minutes * DateUtils.MILLIS_PER_MINUTE)
-                                + (hours * DateUtils.MILLIS_PER_HOUR) + ((days - 1) * DateUtils.MILLIS_PER_DAY))
-                        / DateUtils.MILLIS_PER_SECOND,
-                testResult);
-    }
-
-    @Test
-    public void testMinutesOfMonthWithDate() {
-        final long testResult = DateUtils.getFragmentInMinutes(aDate, Calendar.MONTH);
-        assertEquals(minutes
-                                + ((hours * DateUtils.MILLIS_PER_HOUR) + ((days - 1) * DateUtils.MILLIS_PER_DAY))
-                        / DateUtils.MILLIS_PER_MINUTE,
-                testResult);
-    }
-
-    @Test
-    public void testMinutesOfMonthWithCalendar() {
-        final long testResult = DateUtils.getFragmentInMinutes(aCalendar, Calendar.MONTH);
-        assertEquals( minutes  +((hours * DateUtils.MILLIS_PER_HOUR) + ((days - 1) * DateUtils.MILLIS_PER_DAY))
-                        / DateUtils.MILLIS_PER_MINUTE,
-                testResult);
-    }
-
-    @Test
-    public void testHoursOfMonthWithDate() {
-        final long testResult = DateUtils.getFragmentInHours(aDate, Calendar.MONTH);
-        assertEquals(hours + (((days - 1) * DateUtils.MILLIS_PER_DAY))
-                        / DateUtils.MILLIS_PER_HOUR,
-                testResult);
-    }
-
-    @Test
-    public void testHoursOfMonthWithCalendar() {
-        final long testResult = DateUtils.getFragmentInHours(aCalendar, Calendar.MONTH);
-        assertEquals( hours +(((days - 1) * DateUtils.MILLIS_PER_DAY))
-                        / DateUtils.MILLIS_PER_HOUR,
-                testResult);
-    }
-    
-    //Calendar.YEAR as useful fragment
-    @Test
-    public void testMillisecondsOfYearWithDate() {
-        final long testResult = DateUtils.getFragmentInMilliseconds(aDate, Calendar.YEAR);
-        final Calendar cal = Calendar.getInstance();
-        cal.setTime(aDate);
-        assertEquals(millis + (seconds * DateUtils.MILLIS_PER_SECOND) + (minutes * DateUtils.MILLIS_PER_MINUTE)
-                                + (hours * DateUtils.MILLIS_PER_HOUR) + ((cal.get(Calendar.DAY_OF_YEAR) - 1)* DateUtils.MILLIS_PER_DAY),
-                testResult);
-    }
-
-    @Test
-    public void testMillisecondsOfYearWithCalendar() {
-        final long testResult = DateUtils.getFragmentInMilliseconds(aCalendar, Calendar.YEAR);
-        assertEquals(millis + (seconds * DateUtils.MILLIS_PER_SECOND) + (minutes * DateUtils.MILLIS_PER_MINUTE)
-                + (hours * DateUtils.MILLIS_PER_HOUR) + ((aCalendar.get(Calendar.DAY_OF_YEAR) - 1) * DateUtils.MILLIS_PER_DAY),
-testResult);
-    }
-    
-    @Test
-    public void testSecondsOfYearWithDate() {
-        final long testResult = DateUtils.getFragmentInSeconds(aDate, Calendar.YEAR);
-        final Calendar cal = Calendar.getInstance();
-        cal.setTime(aDate);
-        assertEquals(
-                seconds
-                        + ((minutes * DateUtils.MILLIS_PER_MINUTE)
-                                + (hours * DateUtils.MILLIS_PER_HOUR) + ((cal.get(Calendar.DAY_OF_YEAR) - 1) * DateUtils.MILLIS_PER_DAY))
-                        / DateUtils.MILLIS_PER_SECOND,
-                testResult);
-    }
-
-    @Test
-    public void testSecondsOfYearWithCalendar() {
-        final long testResult = DateUtils.getFragmentInSeconds(aCalendar, Calendar.YEAR);
-        assertEquals(
-                seconds
-                        + ((minutes * DateUtils.MILLIS_PER_MINUTE)
-                                + (hours * DateUtils.MILLIS_PER_HOUR) + ((aCalendar.get(Calendar.DAY_OF_YEAR) - 1) * DateUtils.MILLIS_PER_DAY))
-                        / DateUtils.MILLIS_PER_SECOND,
-                testResult);
-    }
-
-    @Test
-    public void testMinutesOfYearWithDate() {
-        final long testResult = DateUtils.getFragmentInMinutes(aDate, Calendar.YEAR);
-        final Calendar cal = Calendar.getInstance();
-        cal.setTime(aDate);
-        assertEquals(minutes
-                                + ((hours * DateUtils.MILLIS_PER_HOUR) + ((cal.get(Calendar.DAY_OF_YEAR) - 1) * DateUtils.MILLIS_PER_DAY))
-                        / DateUtils.MILLIS_PER_MINUTE,
-                testResult);
-    }
-
-    @Test
-    public void testMinutesOfYearWithCalendar() {
-        final long testResult = DateUtils.getFragmentInMinutes(aCalendar, Calendar.YEAR);
-        assertEquals( minutes  +((hours * DateUtils.MILLIS_PER_HOUR) + ((aCalendar.get(Calendar.DAY_OF_YEAR) - 1) * DateUtils.MILLIS_PER_DAY))
-                        / DateUtils.MILLIS_PER_MINUTE,
-                testResult);
-    }
-
-    @Test
-    public void testMinutesOfYearWithWrongOffsetBugWithCalendar() {
-        final Calendar c = Calendar.getInstance();
-        c.set(Calendar.MONTH, Calendar.JANUARY);
-        c.set(Calendar.DAY_OF_YEAR, 1);
-        c.set(Calendar.HOUR_OF_DAY, 0);
-        c.set(Calendar.MINUTE, 0);
-        c.set(Calendar.SECOND, 0);
-        c.set(Calendar.MILLISECOND, 0);
-        final long testResult = DateUtils.getFragmentInMinutes(c, Calendar.YEAR);
-        assertEquals( 0, testResult);
-    }
-
-    @Test
-    public void testHoursOfYearWithDate() {
-        final long testResult = DateUtils.getFragmentInHours(aDate, Calendar.YEAR);
-        final Calendar cal = Calendar.getInstance();
-        cal.setTime(aDate);
-        assertEquals(hours + (((cal.get(Calendar.DAY_OF_YEAR) - 1) * DateUtils.MILLIS_PER_DAY))
-                        / DateUtils.MILLIS_PER_HOUR,
-                testResult);
-    }
-
-    @Test
-    public void testHoursOfYearWithCalendar() {
-        final long testResult = DateUtils.getFragmentInHours(aCalendar, Calendar.YEAR);
-        assertEquals( hours +(((aCalendar.get(Calendar.DAY_OF_YEAR) - 1) * DateUtils.MILLIS_PER_DAY))
-                        / DateUtils.MILLIS_PER_HOUR,
-                testResult);
-    }
-    
-    @Test
-    public void testDaysOfMonthWithCalendar() throws Exception {
-        final long testResult = DateUtils.getFragmentInDays(aCalendar, Calendar.MONTH);
-        assertEquals(days, testResult);
-    }
-    
-    @Test
-    public void testDaysOfMonthWithDate() throws Exception {
-        final long testResult = DateUtils.getFragmentInDays(aDate, Calendar.MONTH);
-        final Calendar cal = Calendar.getInstance();
-        cal.setTime(aDate);
-        assertEquals(cal.get(Calendar.DAY_OF_MONTH), testResult);
-    }    
-    
-    @Test
-    public void testDaysOfYearWithCalendar() throws Exception {
-        final long testResult = DateUtils.getFragmentInDays(aCalendar, Calendar.YEAR);
-        assertEquals(aCalendar.get(Calendar.DAY_OF_YEAR), testResult);
-    }
-    
-    @Test
-    public void testDaysOfYearWithDate() throws Exception {
-        final long testResult = DateUtils.getFragmentInDays(aDate, Calendar.YEAR);
-        final Calendar cal = Calendar.getInstance();
-        cal.setTime(aDate);
-        assertEquals(cal.get(Calendar.DAY_OF_YEAR), testResult);
-    }
-}
diff --git a/lang/src/test/java/org/apache/commons/lang3/time/DateUtilsRoundingTest.java b/lang/src/test/java/org/apache/commons/lang3/time/DateUtilsRoundingTest.java
deleted file mode 100644
index 29de105..0000000
--- a/lang/src/test/java/org/apache/commons/lang3/time/DateUtilsRoundingTest.java
+++ /dev/null
@@ -1,727 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- * 
- *      http://www.apache.org/licenses/LICENSE-2.0
- * 
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.commons.lang3.time;
-
-import org.junit.Test;
-import org.junit.Before;
-import static org.junit.Assert.*;
-import java.text.DateFormat;
-import java.text.SimpleDateFormat;
-import java.util.Calendar;
-import java.util.Date;
-import java.util.Locale;
-
-/**
- * These Unit-tests will check all possible extremes when using some rounding-methods of DateUtils.
- * The extremes are tested at the switch-point in milliseconds
- * 
- * According to the implementation SEMI_MONTH will either round/truncate to the 1st or 16th
- * When rounding Calendar.MONTH it depends on the number of days within that month.
- * A month with 28 days will be rounded up from the 15th
- * A month with 29 or 30 days will be rounded up from the 16th
- * A month with 31 days will be rounded up from the 17th
- * 
- * @since 3.0
- * @version $Id$
- */
-public class DateUtilsRoundingTest {
-
-    DateFormat dateTimeParser;
-    
-    Date januaryOneDate;
-    Date targetYearDate;
-    //No targetMonths, these must be tested for every type of month(28-31 days)
-    Date targetDateDate, targetDayOfMonthDate, targetAmDate, targetPmDate;
-    Date targetHourOfDayDate, targetHourDate;
-    Date targetMinuteDate;
-    Date targetSecondDate;
-    Date targetMilliSecondDate;
-
-    Calendar januaryOneCalendar;
-    FastDateFormat fdf = DateFormatUtils.ISO_DATETIME_FORMAT;
-
-
-    @Before
-    public void setUp() throws Exception {
-
-        dateTimeParser = new SimpleDateFormat("MMM dd, yyyy H:mm:ss.SSS", Locale.ENGLISH);
-        
-        targetYearDate = dateTimeParser.parse("January 1, 2007 0:00:00.000");
-        targetDateDate = targetDayOfMonthDate = dateTimeParser.parse("June 1, 2008 0:00:00.000");
-        targetAmDate =  dateTimeParser.parse("June 1, 2008 0:00:00.000");
-        targetPmDate = dateTimeParser.parse("June 1, 2008 12:00:00.000");
-        targetHourDate = dateTimeParser.parse("June 1, 2008 8:00:00.000");
-        targetHourOfDayDate = dateTimeParser.parse("June 1, 2008 8:00:00.000");
-        targetMinuteDate =  dateTimeParser.parse("June 1, 2008 8:15:00.000");
-        targetSecondDate =  dateTimeParser.parse("June 1, 2008 8:15:14.000");
-        targetMilliSecondDate =  dateTimeParser.parse("June 1, 2008 8:15:14.231");
-        
-        januaryOneDate = dateTimeParser.parse("January 1, 2008 0:00:00.000");
-        januaryOneCalendar = Calendar.getInstance();
-        januaryOneCalendar.setTime(januaryOneDate);
-    }
-
-    /**
-     * Tests DateUtils.round()-method with Calendar.Year
-     * 
-     * @throws Exception so we don't have to catch it
-     * @since 3.0
-     */
-    @Test
-    public void testRoundYear() throws Exception {
-        final int calendarField = Calendar.YEAR;
-        final Date roundedUpDate = dateTimeParser.parse("January 1, 2008 0:00:00.000");
-        final Date roundedDownDate = targetYearDate;
-        final Date lastRoundedDownDate = dateTimeParser.parse("June 30, 2007 23:59:59.999");
-        baseRoundTest(roundedUpDate, roundedDownDate, lastRoundedDownDate,  calendarField);
-    }
-    
-    /**
-     * Tests DateUtils.round()-method with Calendar.MONTH
-     * Includes rounding months with 28, 29, 30 and 31 days
-     * Includes rounding to January 1
-     * 
-     * @throws Exception so we don't have to catch it
-     * @since 3.0
-     */
-    @Test
-    public void testRoundMonth() throws Exception {
-        final int calendarField = Calendar.MONTH;
-        Date roundedUpDate, roundedDownDate, lastRoundedDownDate;
-        Date minDate, maxDate;
-        
-        //month with 28 days
-        roundedUpDate = dateTimeParser.parse("March 1, 2007 0:00:00.000");
-        roundedDownDate = dateTimeParser.parse("February 1, 2007 0:00:00.000");
-        lastRoundedDownDate = dateTimeParser.parse("February 14, 2007 23:59:59.999");
-        baseRoundTest(roundedUpDate, roundedDownDate, lastRoundedDownDate,  calendarField);
-
-        //month with 29 days
-        roundedUpDate = dateTimeParser.parse("March 1, 2008 0:00:00.000");
-        roundedDownDate = dateTimeParser.parse("February 1, 2008 0:00:00.000");
-        lastRoundedDownDate = dateTimeParser.parse("February 15, 2008 23:59:59.999");
-        baseRoundTest(roundedUpDate, roundedDownDate, lastRoundedDownDate,  calendarField);
-        
-        //month with 30 days
-        roundedUpDate = dateTimeParser.parse("May 1, 2008 0:00:00.000");
-        roundedDownDate = dateTimeParser.parse("April 1, 2008 0:00:00.000");
-        lastRoundedDownDate = dateTimeParser.parse("April 15, 2008 23:59:59.999");
-        baseRoundTest(roundedUpDate, roundedDownDate, lastRoundedDownDate,  calendarField);
-        
-        //month with 31 days
-        roundedUpDate = dateTimeParser.parse("June 1, 2008 0:00:00.000");
-        roundedDownDate = dateTimeParser.parse("May 1, 2008 0:00:00.000");
-        lastRoundedDownDate = dateTimeParser.parse("May 16, 2008 23:59:59.999");
-        baseRoundTest(roundedUpDate, roundedDownDate, lastRoundedDownDate,  calendarField);
-        
-        //round to January 1
-        minDate = dateTimeParser.parse("December 17, 2007 00:00:00.000");
-        maxDate = dateTimeParser.parse("January 16, 2008 23:59:59.999");
-        roundToJanuaryFirst(minDate, maxDate, calendarField);
-    }
-    
-    /**
-     * Tests DateUtils.round()-method with DateUtils.SEMI_MONTH
-     * Includes rounding months with 28, 29, 30 and 31 days, each with first and second half 
-     * Includes rounding to January 1
-     *      
-     * @throws Exception so we don't have to catch it
-     * @since 3.0
-     */
-    @Test
-    public void testRoundSemiMonth() throws Exception {
-        final int calendarField = DateUtils.SEMI_MONTH;
-        Date roundedUpDate, roundedDownDate, lastRoundedDownDate;
-        Date minDate, maxDate;
-        
-        //month with 28 days (1)
-        roundedUpDate = dateTimeParser.parse("February 16, 2007 0:00:00.000");
-        roundedDownDate = dateTimeParser.parse("February 1, 2007 0:00:00.000");
-        lastRoundedDownDate = dateTimeParser.parse("February 8, 2007 23:59:59.999");
-        baseRoundTest(roundedUpDate, roundedDownDate, lastRoundedDownDate,  calendarField);
-
-        //month with 28 days (2)
-        roundedUpDate = dateTimeParser.parse("March 1, 2007 0:00:00.000");
-        roundedDownDate = dateTimeParser.parse("February 16, 2007 0:00:00.000");
-        lastRoundedDownDate = dateTimeParser.parse("February 23, 2007 23:59:59.999");
-        baseRoundTest(roundedUpDate, roundedDownDate, lastRoundedDownDate,  calendarField);
-
-        //month with 29 days (1)
-        roundedUpDate = dateTimeParser.parse("February 16, 2008 0:00:00.000");
-        roundedDownDate = dateTimeParser.parse("February 1, 2008 0:00:00.000");
-        lastRoundedDownDate = dateTimeParser.parse("February 8, 2008 23:59:59.999");
-        baseRoundTest(roundedUpDate, roundedDownDate, lastRoundedDownDate,  calendarField);
-        
-        //month with 29 days (2)
-        roundedUpDate = dateTimeParser.parse("March 1, 2008 0:00:00.000");
-        roundedDownDate = dateTimeParser.parse("February 16, 2008 0:00:00.000");
-        lastRoundedDownDate = dateTimeParser.parse("February 23, 2008 23:59:59.999");
-        baseRoundTest(roundedUpDate, roundedDownDate, lastRoundedDownDate,  calendarField);
-
-        //month with 30 days (1)
-        roundedUpDate = dateTimeParser.parse("April 16, 2008 0:00:00.000");
-        roundedDownDate = dateTimeParser.parse("April 1, 2008 0:00:00.000");
-        lastRoundedDownDate = dateTimeParser.parse("April 8, 2008 23:59:59.999");
-        baseRoundTest(roundedUpDate, roundedDownDate, lastRoundedDownDate,  calendarField);
-
-        //month with 30 days (2)
-        roundedUpDate = dateTimeParser.parse("May 1, 2008 0:00:00.000");
-        roundedDownDate = dateTimeParser.parse("April 16, 2008 0:00:00.000");
-        lastRoundedDownDate = dateTimeParser.parse("April 23, 2008 23:59:59.999");
-        baseRoundTest(roundedUpDate, roundedDownDate, lastRoundedDownDate,  calendarField);
-        
-        //month with 31 days (1)
-        roundedUpDate = dateTimeParser.parse("May 16, 2008 0:00:00.000");
-        roundedDownDate = dateTimeParser.parse("May 1, 2008 0:00:00.000");
-        lastRoundedDownDate = dateTimeParser.parse("May 8, 2008 23:59:59.999");
-        baseRoundTest(roundedUpDate, roundedDownDate, lastRoundedDownDate,  calendarField);
-
-        //month with 31 days (2)
-        roundedUpDate = dateTimeParser.parse("June 1, 2008 0:00:00.000");
-        roundedDownDate = dateTimeParser.parse("May 16, 2008 0:00:00.000");
-        lastRoundedDownDate = dateTimeParser.parse("May 23, 2008 23:59:59.999");
-        baseRoundTest(roundedUpDate, roundedDownDate, lastRoundedDownDate,  calendarField);
-        
-        //round to January 1
-        minDate = dateTimeParser.parse("December 24, 2007 00:00:00.000");
-        maxDate = dateTimeParser.parse("January 8, 2008 23:59:59.999");
-        roundToJanuaryFirst(minDate, maxDate, calendarField);
-    }
-    
-    /**
-     * Tests DateUtils.round()-method with Calendar.DATE
-     * Includes rounding the extremes of one day 
-     * Includes rounding to January 1
-     * 
-     * @throws Exception so we don't have to catch it
-     * @since 3.0
-     */
-    @Test
-    public void testRoundDate() throws Exception {
-        final int calendarField = Calendar.DATE;
-        Date roundedUpDate, roundedDownDate, lastRoundedDownDate;
-        Date minDate, maxDate;
-
-        roundedUpDate = dateTimeParser.parse("June 2, 2008 0:00:00.000");
-        roundedDownDate = targetDateDate;
-        lastRoundedDownDate = dateTimeParser.parse("June 1, 2008 11:59:59.999");
-        baseRoundTest(roundedUpDate, roundedDownDate, lastRoundedDownDate,  calendarField);
-        
-        //round to January 1
-        minDate = dateTimeParser.parse("December 31, 2007 12:00:00.000");
-        maxDate = dateTimeParser.parse("January 1, 2008 11:59:59.999");
-        roundToJanuaryFirst(minDate, maxDate, calendarField);
-    }
-    
-    /**
-     * Tests DateUtils.round()-method with Calendar.DAY_OF_MONTH
-     * Includes rounding the extremes of one day 
-     * Includes rounding to January 1
-     * 
-     * @throws Exception so we don't have to catch it
-     * @since 3.0
-     */
-    @Test
-    public void testRoundDayOfMonth() throws Exception {
-        final int calendarField = Calendar.DAY_OF_MONTH;
-        Date roundedUpDate, roundedDownDate, lastRoundedDownDate;
-        Date minDate, maxDate;
-
-        roundedUpDate = dateTimeParser.parse("June 2, 2008 0:00:00.000");
-        roundedDownDate = targetDayOfMonthDate;
-        lastRoundedDownDate = dateTimeParser.parse("June 1, 2008 11:59:59.999");
-        baseRoundTest(roundedUpDate, roundedDownDate, lastRoundedDownDate,  calendarField);
-        
-        //round to January 1
-        minDate = dateTimeParser.parse("December 31, 2007 12:00:00.000");
-        maxDate = dateTimeParser.parse("January 1, 2008 11:59:59.999");
-        roundToJanuaryFirst(minDate, maxDate, calendarField);
-    }
-    
-    /**
-     * Tests DateUtils.round()-method with Calendar.AM_PM
-     * Includes rounding the extremes of both AM and PM of one day 
-     * Includes rounding to January 1
-     * 
-     * @throws Exception so we don't have to catch it
-     * @since 3.0
-     */
-    @Test
-    public void testRoundAmPm() throws Exception {
-        final int calendarField = Calendar.AM_PM;
-        Date roundedUpDate, roundedDownDate, lastRoundedDownDate;
-        Date minDate, maxDate;
-
-        //AM
-        roundedUpDate = dateTimeParser.parse("June 1, 2008 12:00:00.000");
-        roundedDownDate = targetAmDate;
-        lastRoundedDownDate = dateTimeParser.parse("June 1, 2008 5:59:59.999");
-        baseRoundTest(roundedUpDate, roundedDownDate, lastRoundedDownDate,  calendarField);
-
-        //PM
-        roundedUpDate = dateTimeParser.parse("June 2, 2008 0:00:00.000");
-        roundedDownDate = targetPmDate;
-        lastRoundedDownDate = dateTimeParser.parse("June 1, 2008 17:59:59.999");
-        baseRoundTest(roundedUpDate, roundedDownDate, lastRoundedDownDate,  calendarField);
-
-        //round to January 1
-        minDate = dateTimeParser.parse("December 31, 2007 18:00:00.000");
-        maxDate = dateTimeParser.parse("January 1, 2008 5:59:59.999");
-        roundToJanuaryFirst(minDate, maxDate, calendarField);
-    }
-    
-    /**
-     * Tests DateUtils.round()-method with Calendar.HOUR_OF_DAY
-     * Includes rounding the extremes of one hour 
-     * Includes rounding to January 1
-     * 
-     * @throws Exception so we don't have to catch it
-     * @since 3.0
-     */
-    @Test
-    public void testRoundHourOfDay() throws Exception {
-        final int calendarField = Calendar.HOUR_OF_DAY;
-        Date roundedUpDate, roundedDownDate, lastRoundedDownDate;
-        Date minDate, maxDate;
-
-        roundedUpDate = dateTimeParser.parse("June 1, 2008 9:00:00.000");
-        roundedDownDate = targetHourOfDayDate;
-        lastRoundedDownDate = dateTimeParser.parse("June 1, 2008 8:29:59.999");
-        baseRoundTest(roundedUpDate, roundedDownDate, lastRoundedDownDate,  calendarField);
-        
-        //round to January 1
-        minDate = dateTimeParser.parse("December 31, 2007 23:30:00.000");
-        maxDate = dateTimeParser.parse("January 1, 2008 0:29:59.999");
-        roundToJanuaryFirst(minDate, maxDate, calendarField);
-    }
-    
-    /**
-     * Tests DateUtils.round()-method with Calendar.HOUR
-     * Includes rounding the extremes of one hour 
-     * Includes rounding to January 1
-     * 
-     * @throws Exception so we don't have to catch it
-     * @since 3.0
-     */
-    @Test
-    public void testRoundHour() throws Exception {
-        final int calendarField = Calendar.HOUR;
-        Date roundedUpDate, roundedDownDate, lastRoundedDownDate;
-        Date minDate, maxDate;
-
-        roundedUpDate = dateTimeParser.parse("June 1, 2008 9:00:00.000");
-        roundedDownDate = targetHourDate;
-        lastRoundedDownDate = dateTimeParser.parse("June 1, 2008 8:29:59.999");
-        baseRoundTest(roundedUpDate, roundedDownDate, lastRoundedDownDate,  calendarField);
-        
-        //round to January 1
-        minDate = dateTimeParser.parse("December 31, 2007 23:30:00.000");
-        maxDate = dateTimeParser.parse("January 1, 2008 0:29:59.999");
-        roundToJanuaryFirst(minDate, maxDate, calendarField);
-    }
-    
-    /**
-     * Tests DateUtils.round()-method with Calendar.MINUTE
-     * Includes rounding the extremes of one minute 
-     * Includes rounding to January 1
-     * 
-     * @throws Exception so we don't have to catch it
-     * @since 3.0
-     */
-    @Test
-    public void testRoundMinute() throws Exception {
-        final int calendarField = Calendar.MINUTE;
-        Date roundedUpDate, roundedDownDate, lastRoundedDownDate;
-        Date minDate, maxDate;
-
-        roundedUpDate = dateTimeParser.parse("June 1, 2008 8:16:00.000");
-        roundedDownDate = targetMinuteDate;
-        lastRoundedDownDate = dateTimeParser.parse("June 1, 2008 8:15:29.999");
-        baseRoundTest(roundedUpDate, roundedDownDate, lastRoundedDownDate,  calendarField);
-        
-        //round to January 1
-        minDate = dateTimeParser.parse("December 31, 2007 23:59:30.000");
-        maxDate = dateTimeParser.parse("January 1, 2008 0:00:29.999");
-        roundToJanuaryFirst(minDate, maxDate, calendarField);
-    }
-    
-    /**
-     * Tests DateUtils.round()-method with Calendar.SECOND
-     * Includes rounding the extremes of one second 
-     * Includes rounding to January 1
-     * 
-     * @throws Exception so we don't have to catch it
-     * @since 3.0
-     */
-    @Test
-    public void testRoundSecond() throws Exception {
-        final int calendarField = Calendar.SECOND;
-        Date roundedUpDate, roundedDownDate, lastRoundedDownDate;
-        Date minDate, maxDate;
-
-        roundedUpDate = dateTimeParser.parse("June 1, 2008 8:15:15.000");
-        roundedDownDate = targetSecondDate;
-        lastRoundedDownDate = dateTimeParser.parse("June 1, 2008 8:15:14.499");
-        baseRoundTest(roundedUpDate, roundedDownDate, lastRoundedDownDate,  calendarField);
-        
-        //round to January 1
-        minDate = dateTimeParser.parse("December 31, 2007 23:59:59.500");
-        maxDate = dateTimeParser.parse("January 1, 2008 0:00:00.499");
-        roundToJanuaryFirst(minDate, maxDate, calendarField);
-    }
-    
-    /**
-     * Tests DateUtils.round()-method with Calendar.MILLISECOND
-     * Includes rounding the extremes of one second 
-     * Includes rounding to January 1
-     * 
-     * @throws Exception so we don't have to catch it
-     * @since 3.0
-     */
-    @Test
-    public void testRoundMilliSecond() throws Exception {
-        final int calendarField = Calendar.MILLISECOND;
-        Date roundedUpDate, roundedDownDate, lastRoundedDownDate;
-        Date minDate, maxDate;
-
-        roundedDownDate = lastRoundedDownDate = targetMilliSecondDate;
-        roundedUpDate = dateTimeParser.parse("June 1, 2008 8:15:14.232");
-        baseRoundTest(roundedUpDate, roundedDownDate, lastRoundedDownDate,  calendarField);
-        
-        //round to January 1
-        minDate = maxDate = januaryOneDate;
-        roundToJanuaryFirst(minDate, maxDate, calendarField);
-    }
-    
-    /**
-     * Test DateUtils.truncate()-method with Calendar.YEAR
-     * 
-     * @throws Exception so we don't have to catch it
-     * @since 3.0
-     */
-    @Test
-    public void testTruncateYear() throws Exception {
-        final int calendarField = Calendar.YEAR;
-        final Date lastTruncateDate = dateTimeParser.parse("December 31, 2007 23:59:59.999");
-        baseTruncateTest(targetYearDate, lastTruncateDate, calendarField);
-    }
-
-    /**
-     * Test DateUtils.truncate()-method with Calendar.MONTH
-     * 
-     * @throws Exception so we don't have to catch it
-     * @since 3.0
-     */
-    @Test
-    public void testTruncateMonth() throws Exception {
-        final int calendarField = Calendar.MONTH;
-        final Date truncatedDate = dateTimeParser.parse("March 1, 2008 0:00:00.000");
-        final Date lastTruncateDate = dateTimeParser.parse("March 31, 2008 23:59:59.999");
-        baseTruncateTest(truncatedDate, lastTruncateDate, calendarField);
-    }
-
-    /**
-     * Test DateUtils.truncate()-method with DateUtils.SEMI_MONTH
-     * Includes truncating months with 28, 29, 30 and 31 days, each with first and second half
-     * 
-     * @throws Exception so we don't have to catch it
-     * @since 3.0
-     */
-    @Test
-    public void testTruncateSemiMonth() throws Exception {
-        final int calendarField = DateUtils.SEMI_MONTH;
-        Date truncatedDate, lastTruncateDate;
-        
-        //month with 28 days (1)
-        truncatedDate = dateTimeParser.parse("February 1, 2007 0:00:00.000");
-        lastTruncateDate = dateTimeParser.parse("February 15, 2007 23:59:59.999");
-        baseTruncateTest(truncatedDate, lastTruncateDate, calendarField);
-
-        //month with 28 days (2)
-        truncatedDate = dateTimeParser.parse("February 16, 2007 0:00:00.000");
-        lastTruncateDate = dateTimeParser.parse("February 28, 2007 23:59:59.999");
-        baseTruncateTest(truncatedDate, lastTruncateDate, calendarField);
-
-        //month with 29 days (1)
-        truncatedDate = dateTimeParser.parse("February 1, 2008 0:00:00.000");
-        lastTruncateDate = dateTimeParser.parse("February 15, 2008 23:59:59.999");
-        baseTruncateTest(truncatedDate, lastTruncateDate, calendarField);
-
-        //month with 29 days (2)
-        truncatedDate = dateTimeParser.parse("February 16, 2008 0:00:00.000");
-        lastTruncateDate = dateTimeParser.parse("February 29, 2008 23:59:59.999");
-        baseTruncateTest(truncatedDate, lastTruncateDate, calendarField);
-
-        //month with 30 days (1)
-        truncatedDate = dateTimeParser.parse("April 1, 2008 0:00:00.000");
-        lastTruncateDate = dateTimeParser.parse("April 15, 2008 23:59:59.999");
-        baseTruncateTest(truncatedDate, lastTruncateDate, calendarField);
-
-        //month with 30 days (2)
-        truncatedDate = dateTimeParser.parse("April 16, 2008 0:00:00.000");
-        lastTruncateDate = dateTimeParser.parse("April 30, 2008 23:59:59.999");
-        baseTruncateTest(truncatedDate, lastTruncateDate, calendarField);
-        
-        //month with 31 days (1)
-        truncatedDate = dateTimeParser.parse("March 1, 2008 0:00:00.000");
-        lastTruncateDate = dateTimeParser.parse("March 15, 2008 23:59:59.999");
-        baseTruncateTest(truncatedDate, lastTruncateDate, calendarField);
-
-        //month with 31 days (2)
-        truncatedDate = dateTimeParser.parse("March 16, 2008 0:00:00.000");
-        lastTruncateDate = dateTimeParser.parse("March 31, 2008 23:59:59.999");
-        baseTruncateTest(truncatedDate, lastTruncateDate, calendarField);
-
-    }
-
-    /**
-     * Test DateUtils.truncate()-method with Calendar.DATE
-     * 
-     * @throws Exception so we don't have to catch it
-     * @since 3.0
-     */
-    @Test
-    public void testTruncateDate() throws Exception {
-        final int calendarField = Calendar.DATE;
-        final Date lastTruncateDate = dateTimeParser.parse("June 1, 2008 23:59:59.999");
-        baseTruncateTest(targetDateDate, lastTruncateDate, calendarField);
-    }
-    
-    /**
-     * Test DateUtils.truncate()-method with Calendar.DAY_OF_MONTH
-     * 
-     * @throws Exception so we don't have to catch it
-     * @since 3.0
-     */
-    @Test
-    public void testTruncateDayOfMonth() throws Exception {
-        final int calendarField = Calendar.DAY_OF_MONTH;
-        final Date lastTruncateDate = dateTimeParser.parse("June 1, 2008 23:59:59.999");
-        baseTruncateTest(targetDayOfMonthDate, lastTruncateDate, calendarField);
-    }
-    
-    /**
-     * Test DateUtils.truncate()-method with Calendar.AM_PM
-     * Includes truncating the extremes of both AM and PM of one day 
-     * 
-     * @throws Exception so we don't have to catch it
-     * @since 3.0
-     */
-    @Test
-    public void testTruncateAmPm() throws Exception {
-        final int calendarField = Calendar.AM_PM;
-        
-        //AM
-        Date lastTruncateDate = dateTimeParser.parse("June 1, 2008 11:59:59.999");
-        baseTruncateTest(targetAmDate, lastTruncateDate, calendarField);
-
-        //PM
-        lastTruncateDate = dateTimeParser.parse("June 1, 2008 23:59:59.999");
-        baseTruncateTest(targetPmDate, lastTruncateDate, calendarField);
-    }
-    
-    /**
-     * Test DateUtils.truncate()-method with Calendar.HOUR
-     * 
-     * @throws Exception so we don't have to catch it
-     * @since 3.0
-     */
-    @Test
-    public void testTruncateHour() throws Exception {
-        final int calendarField = Calendar.HOUR;
-        final Date lastTruncateDate = dateTimeParser.parse("June 1, 2008 8:59:59.999");
-        baseTruncateTest(targetHourDate, lastTruncateDate, calendarField);
-    }
-    
-    /**
-     * Test DateUtils.truncate()-method with Calendar.HOUR_OF_DAY
-     * 
-     * @throws Exception so we don't have to catch it
-     * @since 3.0
-     */
-    @Test
-    public void testTruncateHourOfDay() throws Exception {
-        final int calendarField = Calendar.HOUR_OF_DAY;
-        final Date lastTruncateDate = dateTimeParser.parse("June 1, 2008 8:59:59.999");
-        baseTruncateTest(targetHourOfDayDate, lastTruncateDate, calendarField);
-    }
-    
-    /**
-     * Test DateUtils.truncate()-method with Calendar.MINUTE
-     * 
-     * @throws Exception so we don't have to catch it
-     * @since 3.0
-     */
-    @Test
-    public void testTruncateMinute() throws Exception {
-        final int calendarField = Calendar.MINUTE;
-        final Date lastTruncateDate = dateTimeParser.parse("June 1, 2008 8:15:59.999");
-        baseTruncateTest(targetMinuteDate, lastTruncateDate, calendarField);
-    }
-    
-    /**
-     * Test DateUtils.truncate()-method with Calendar.SECOND
-     * 
-     * @throws Exception so we don't have to catch it
-     * @since 3.0
-     */
-    @Test
-    public void testTruncateSecond() throws Exception {
-        final int calendarField = Calendar.SECOND;
-        final Date lastTruncateDate = dateTimeParser.parse("June 1, 2008 8:15:14.999");
-        baseTruncateTest(targetSecondDate, lastTruncateDate, calendarField);
-    }
-    
-    /**
-     * Test DateUtils.truncate()-method with Calendar.SECOND
-     * 
-     * @throws Exception so we don't have to catch it
-     * @since 3.0
-     */
-    @Test
-    public void testTruncateMilliSecond() throws Exception {
-        final int calendarField = Calendar.MILLISECOND;
-        baseTruncateTest(targetMilliSecondDate, targetMilliSecondDate, calendarField);
-    }
-        
-    /**
-     * When using this basetest all extremes are tested.<br> 
-     * It will test the Date, Calendar and Object-implementation<br>
-     * lastRoundDownDate should round down to roundedDownDate<br>
-     * lastRoundDownDate + 1 millisecond should round up to roundedUpDate
-     * 
-     * @param roundedUpDate the next rounded date after <strong>roundedDownDate</strong> when using <strong>calendarField</strong>
-     * @param roundedDownDate the result if <strong>lastRoundDownDate</strong> was rounded with <strong>calendarField</strong>
-     * @param lastRoundDownDate rounding this value with <strong>calendarField</strong> will result in <strong>roundedDownDate</strong>
-     * @param calendarField a Calendar.field value
-     * @since 3.0
-     */
-    protected void baseRoundTest(final Date roundedUpDate, final Date roundedDownDate, final Date lastRoundDownDate, final int calendarField) {
-        final Date firstRoundUpDate = DateUtils.addMilliseconds(lastRoundDownDate, 1);
-        
-        //Date-comparison
-        assertEquals(roundedDownDate, DateUtils.round(roundedDownDate, calendarField));
-        assertEquals(roundedUpDate, DateUtils.round(roundedUpDate, calendarField));
-        assertEquals(roundedDownDate, DateUtils.round(lastRoundDownDate, calendarField));
-        assertEquals(roundedUpDate, DateUtils.round(firstRoundUpDate, calendarField));
-        
-        //Calendar-initiations
-        Calendar roundedUpCalendar, roundedDownCalendar, lastRoundDownCalendar, firstRoundUpCalendar; 
-        roundedDownCalendar = Calendar.getInstance();
-        roundedUpCalendar = Calendar.getInstance();
-        lastRoundDownCalendar = Calendar.getInstance();
-        firstRoundUpCalendar = Calendar.getInstance();
-        roundedDownCalendar.setTime(roundedDownDate);
-        roundedUpCalendar.setTime(roundedUpDate);
-        lastRoundDownCalendar.setTime(lastRoundDownDate);
-        firstRoundUpCalendar.setTime(firstRoundUpDate);
-
-        //Calendar-comparison
-        assertEquals(roundedDownCalendar, DateUtils.round(roundedDownCalendar, calendarField));
-        assertEquals(roundedUpCalendar, DateUtils.round(roundedUpCalendar, calendarField));
-        assertEquals(roundedDownCalendar, DateUtils.round(lastRoundDownCalendar, calendarField));
-        assertEquals(roundedUpCalendar, DateUtils.round(firstRoundUpCalendar, calendarField));
-
-        //Object-comparison
-        assertEquals(roundedDownDate, DateUtils.round((Object) roundedDownDate, calendarField));
-        assertEquals(roundedUpDate, DateUtils.round((Object) roundedUpDate, calendarField));
-        assertEquals(roundedDownDate, DateUtils.round((Object) lastRoundDownDate, calendarField));
-        assertEquals(roundedUpDate, DateUtils.round((Object) firstRoundUpDate, calendarField));
-        assertEquals(roundedDownDate, DateUtils.round((Object) roundedDownCalendar, calendarField));
-        assertEquals(roundedUpDate, DateUtils.round((Object) roundedUpCalendar, calendarField));
-        assertEquals(roundedDownDate, DateUtils.round((Object) lastRoundDownDate, calendarField));
-        assertEquals(roundedUpDate, DateUtils.round((Object) firstRoundUpDate, calendarField));
-    }
-    
-    /**
-     * When using this basetest all extremes are tested.<br> 
-     * It will test the Date, Calendar and Object-implementation<br>
-     * lastTruncateDate should round down to truncatedDate<br>
-     * lastTruncateDate + 1 millisecond should never round down to truncatedDate
-     * 
-     * @param truncatedDate expected Date when <strong>lastTruncateDate</strong> is truncated with <strong>calendarField</strong>
-     * @param lastTruncateDate the last possible Date which will truncate to <strong>truncatedDate</strong> with <strong>calendarField</strong>
-     * @param calendarField a Calendar.field value
-     * @since 3.0
-     */
-    protected void baseTruncateTest(final Date truncatedDate, final Date lastTruncateDate, final int calendarField) {
-        final Date nextTruncateDate = DateUtils.addMilliseconds(lastTruncateDate, 1);
-        
-        //Date-comparison
-        assertEquals("Truncating "+ fdf.format(truncatedDate) +" as Date with CalendarField-value "+ calendarField +" must return itself", truncatedDate, DateUtils.truncate(truncatedDate, calendarField));
-        assertEquals(truncatedDate, DateUtils.truncate(lastTruncateDate, calendarField));
-        assertFalse(fdf.format(lastTruncateDate) +" is not an extreme when truncating as Date with CalendarField-value "+ calendarField, truncatedDate.equals(DateUtils.truncate(nextTruncateDate, calendarField)));
-        
-        //Calendar-initiations
-        Calendar truncatedCalendar, lastTruncateCalendar, nextTruncateCalendar; 
-        truncatedCalendar = Calendar.getInstance();
-        lastTruncateCalendar = Calendar.getInstance();
-        nextTruncateCalendar = Calendar.getInstance();
-        truncatedCalendar.setTime(truncatedDate);
-        lastTruncateCalendar.setTime(lastTruncateDate);
-        nextTruncateCalendar.setTime(nextTruncateDate);
-
-        //Calendar-comparison
-        assertEquals("Truncating "+ fdf.format(truncatedCalendar) +" as Calendar with CalendarField-value "+ calendarField +" must return itself", truncatedCalendar, DateUtils.truncate(truncatedCalendar, calendarField));
-        assertEquals(truncatedCalendar, DateUtils.truncate(lastTruncateCalendar, calendarField));
-        assertFalse(fdf.format(lastTruncateCalendar) +" is not an extreme when truncating as Calendar with CalendarField-value "+ calendarField, truncatedCalendar.equals(DateUtils.truncate(nextTruncateCalendar, calendarField)));
-
-        //Object-comparison
-        assertEquals("Truncating "+ fdf.format(truncatedDate) +" as Date cast to Object with CalendarField-value "+ calendarField +" must return itself as Date", truncatedDate, DateUtils.truncate((Object) truncatedDate, calendarField));
-        assertEquals(truncatedDate, DateUtils.truncate((Object) lastTruncateDate, calendarField));
-        assertFalse(fdf.format(lastTruncateDate) +" is not an extreme when truncating as Date cast to Object with CalendarField-value "+ calendarField, truncatedDate.equals(DateUtils.truncate((Object) nextTruncateDate, calendarField)));
-        assertEquals("Truncating "+ fdf.format(truncatedCalendar) +" as Calendar cast to Object with CalendarField-value "+ calendarField +" must return itself as Date", truncatedDate, DateUtils.truncate((Object) truncatedCalendar, calendarField));
-        assertEquals(truncatedDate, DateUtils.truncate((Object) lastTruncateCalendar, calendarField));
-        assertFalse(fdf.format(lastTruncateCalendar) +" is not an extreme when truncating as Calendar cast to Object with CalendarField-value "+ calendarField, truncatedDate.equals(DateUtils.truncate((Object) nextTruncateCalendar, calendarField)));
-    }
-    
-    /**
-     * 
-     * Any January 1 could be considered as the ultimate extreme.
-     * Instead of comparing the results if the input has a difference of 1 millisecond we check the output to be exactly January first. 
-     * 
-     * @param minDate the lower bound
-     * @param maxDate the upper bound
-     * @param calendarField a Calendar.field value
-     * @since 3.0
-     */
-    protected void roundToJanuaryFirst(final Date minDate, final Date maxDate, final int calendarField) {
-        assertEquals("Rounding "+ fdf.format(januaryOneDate) +" as Date with CalendarField-value "+ calendarField +" must return itself", januaryOneDate, DateUtils.round(januaryOneDate, calendarField));
-        assertEquals(januaryOneDate, DateUtils.round(minDate, calendarField));
-        assertEquals(januaryOneDate, DateUtils.round(maxDate, calendarField));
-        
-        final Calendar minCalendar = Calendar.getInstance();
-        minCalendar.setTime(minDate);
-        final Calendar maxCalendar = Calendar.getInstance();
-        maxCalendar.setTime(maxDate);
-        assertEquals("Rounding "+ fdf.format(januaryOneCalendar) +" as Date with CalendarField-value "+ calendarField +" must return itself", januaryOneCalendar, DateUtils.round(januaryOneCalendar, calendarField));
-        assertEquals(januaryOneCalendar, DateUtils.round(minCalendar, calendarField));
-        assertEquals(januaryOneCalendar, DateUtils.round(maxCalendar, calendarField));
-
-        final Date toPrevRoundDate = DateUtils.addMilliseconds(minDate, -1);
-        final Date toNextRoundDate = DateUtils.addMilliseconds(maxDate, 1);
-        assertFalse(fdf.format(minDate) +" is not an lower-extreme when rounding as Date with CalendarField-value "+ calendarField, januaryOneDate.equals(DateUtils.round(toPrevRoundDate, calendarField)));
-        assertFalse(fdf.format(maxDate) +" is not an upper-extreme when rounding as Date with CalendarField-value "+ calendarField, januaryOneDate.equals(DateUtils.round(toNextRoundDate, calendarField)));
-        
-        final Calendar toPrevRoundCalendar = Calendar.getInstance();
-        toPrevRoundCalendar.setTime(toPrevRoundDate);
-        final Calendar toNextRoundCalendar = Calendar.getInstance();
-        toNextRoundCalendar.setTime(toNextRoundDate);
-        assertFalse(fdf.format(minCalendar) +" is not an lower-extreme when rounding as Date with CalendarField-value "+ calendarField, januaryOneDate.equals(DateUtils.round(toPrevRoundDate, calendarField)));
-        assertFalse(fdf.format(maxCalendar) +" is not an upper-extreme when rounding as Date with CalendarField-value "+ calendarField, januaryOneDate.equals(DateUtils.round(toNextRoundDate, calendarField)));
-    }
-}
diff --git a/lang/src/test/java/org/apache/commons/lang3/time/DateUtilsTest.java b/lang/src/test/java/org/apache/commons/lang3/time/DateUtilsTest.java
deleted file mode 100644
index 7ef0b8a..0000000
--- a/lang/src/test/java/org/apache/commons/lang3/time/DateUtilsTest.java
+++ /dev/null
@@ -1,1711 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- * 
- *      http://www.apache.org/licenses/LICENSE-2.0
- * 
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.commons.lang3.time;
-
-import static org.apache.commons.lang3.JavaVersion.JAVA_1_4;
-
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertFalse;
-import static org.junit.Assert.assertNotNull;
-import static org.junit.Assert.assertNotSame;
-import static org.junit.Assert.assertTrue;
-import static org.junit.Assert.fail;
-
-import java.lang.reflect.Constructor;
-import java.lang.reflect.Modifier;
-import java.text.DateFormat;
-import java.text.ParseException;
-import java.text.SimpleDateFormat;
-import java.util.Calendar;
-import java.util.Date;
-import java.util.GregorianCalendar;
-import java.util.Iterator;
-import java.util.Locale;
-import java.util.NoSuchElementException;
-import java.util.TimeZone;
-
-import junit.framework.AssertionFailedError;
-
-import org.apache.commons.lang3.SystemUtils;
-
-import org.junit.Before;
-import org.junit.Test;
-
-/**
- * Unit tests {@link org.apache.commons.lang3.time.DateUtils}.
- *
- */
-public class DateUtilsTest {
-
-    private static final long MILLIS_TEST;
-    static {
-        final GregorianCalendar cal = new GregorianCalendar(2000, 6, 5, 4, 3, 2);
-        cal.set(Calendar.MILLISECOND, 1);
-        MILLIS_TEST = cal.getTime().getTime();
-        System.out.println("DateUtilsTest: Default Locale="+Locale.getDefault());
-    }
-
-    DateFormat dateParser = null;
-    DateFormat dateTimeParser = null;
-    DateFormat timeZoneDateParser = null;
-    Date dateAmPm1 = null;
-    Date dateAmPm2 = null;
-    Date dateAmPm3 = null;
-    Date dateAmPm4 = null;
-    Date date0 = null;
-    Date date1 = null;
-    Date date2 = null;
-    Date date3 = null;
-    Date date4 = null;
-    Date date5 = null;
-    Date date6 = null;
-    Date date7 = null;
-    Date date8 = null;
-    Calendar calAmPm1 = null;
-    Calendar calAmPm2 = null;
-    Calendar calAmPm3 = null;
-    Calendar calAmPm4 = null;
-    Calendar cal1 = null;
-    Calendar cal2 = null;
-    Calendar cal3 = null;
-    Calendar cal4 = null;
-    Calendar cal5 = null;
-    Calendar cal6 = null;
-    Calendar cal7 = null;
-    Calendar cal8 = null;
-    TimeZone zone = null;
-    TimeZone defaultZone = null;
-
-
-    @Before
-    public void setUp() throws Exception {
-
-
-        dateParser = new SimpleDateFormat("MMM dd, yyyy", Locale.ENGLISH);
-        dateTimeParser = new SimpleDateFormat("MMM dd, yyyy H:mm:ss.SSS", Locale.ENGLISH);
-
-        dateAmPm1 = dateTimeParser.parse("February 3, 2002 01:10:00.000");
-        dateAmPm2 = dateTimeParser.parse("February 3, 2002 11:10:00.000");
-        dateAmPm3 = dateTimeParser.parse("February 3, 2002 13:10:00.000");
-        dateAmPm4 = dateTimeParser.parse("February 3, 2002 19:10:00.000");
-        date0 = dateTimeParser.parse("February 3, 2002 12:34:56.789");
-        date1 = dateTimeParser.parse("February 12, 2002 12:34:56.789");
-        date2 = dateTimeParser.parse("November 18, 2001 1:23:11.321");
-        defaultZone = TimeZone.getDefault();
-        zone = TimeZone.getTimeZone("MET");
-        TimeZone.setDefault(zone);
-        dateTimeParser.setTimeZone(zone);
-        date3 = dateTimeParser.parse("March 30, 2003 05:30:45.000");
-        date4 = dateTimeParser.parse("March 30, 2003 01:10:00.000");
-        date5 = dateTimeParser.parse("March 30, 2003 01:40:00.000");
-        date6 = dateTimeParser.parse("March 30, 2003 02:10:00.000");
-        date7 = dateTimeParser.parse("March 30, 2003 02:40:00.000");
-        date8 = dateTimeParser.parse("October 26, 2003 05:30:45.000");
-        dateTimeParser.setTimeZone(defaultZone);
-        TimeZone.setDefault(defaultZone);
-        calAmPm1 = Calendar.getInstance();
-        calAmPm1.setTime(dateAmPm1);
-        calAmPm2 = Calendar.getInstance();
-        calAmPm2.setTime(dateAmPm2);
-        calAmPm3 = Calendar.getInstance();
-        calAmPm3.setTime(dateAmPm3);
-        calAmPm4 = Calendar.getInstance();
-        calAmPm4.setTime(dateAmPm4);
-        cal1 = Calendar.getInstance();
-        cal1.setTime(date1);
-        cal2 = Calendar.getInstance();
-        cal2.setTime(date2);
-        TimeZone.setDefault(zone);
-        cal3 = Calendar.getInstance();
-        cal3.setTime(date3);
-        cal4 = Calendar.getInstance();
-        cal4.setTime(date4);
-        cal5 = Calendar.getInstance();
-        cal5.setTime(date5);
-        cal6 = Calendar.getInstance();
-        cal6.setTime(date6);
-        cal7 = Calendar.getInstance();
-        cal7.setTime(date7);
-        cal8 = Calendar.getInstance();
-        cal8.setTime(date8);
-        TimeZone.setDefault(defaultZone);
-    }
-
-    //-----------------------------------------------------------------------
-    @Test
-    public void testConstructor() {
-        assertNotNull(new DateUtils());
-        final Constructor<?>[] cons = DateUtils.class.getDeclaredConstructors();
-        assertEquals(1, cons.length);
-        assertTrue(Modifier.isPublic(cons[0].getModifiers()));
-        assertTrue(Modifier.isPublic(DateUtils.class.getModifiers()));
-        assertFalse(Modifier.isFinal(DateUtils.class.getModifiers()));
-    }
-    
-    //-----------------------------------------------------------------------
-    @Test
-    public void testIsSameDay_Date() {
-        Date datea = new GregorianCalendar(2004, 6, 9, 13, 45).getTime();
-        Date dateb = new GregorianCalendar(2004, 6, 9, 13, 45).getTime();
-        assertTrue(DateUtils.isSameDay(datea, dateb));
-        dateb = new GregorianCalendar(2004, 6, 10, 13, 45).getTime();
-        assertFalse(DateUtils.isSameDay(datea, dateb));
-        datea = new GregorianCalendar(2004, 6, 10, 13, 45).getTime();
-        assertTrue(DateUtils.isSameDay(datea, dateb));
-        dateb = new GregorianCalendar(2005, 6, 10, 13, 45).getTime();
-        assertFalse(DateUtils.isSameDay(datea, dateb));
-        try {
-            DateUtils.isSameDay((Date) null, (Date) null);
-            fail();
-        } catch (final IllegalArgumentException ex) {}
-    }
-    
-    //-----------------------------------------------------------------------
-    @Test
-    public void testIsSameDay_Cal() {
-        final GregorianCalendar cala = new GregorianCalendar(2004, 6, 9, 13, 45);
-        final GregorianCalendar calb = new GregorianCalendar(2004, 6, 9, 13, 45);
-        assertTrue(DateUtils.isSameDay(cala, calb));
-        calb.add(Calendar.DAY_OF_YEAR, 1);
-        assertFalse(DateUtils.isSameDay(cala, calb));
-        cala.add(Calendar.DAY_OF_YEAR, 1);
-        assertTrue(DateUtils.isSameDay(cala, calb));
-        calb.add(Calendar.YEAR, 1);
-        assertFalse(DateUtils.isSameDay(cala, calb));
-        try {
-            DateUtils.isSameDay((Calendar) null, (Calendar) null);
-            fail();
-        } catch (final IllegalArgumentException ex) {}
-    }
-    
-    //-----------------------------------------------------------------------
-    @Test
-    public void testIsSameInstant_Date() {
-        Date datea = new GregorianCalendar(2004, 6, 9, 13, 45).getTime();
-        Date dateb = new GregorianCalendar(2004, 6, 9, 13, 45).getTime();
-        assertTrue(DateUtils.isSameInstant(datea, dateb));
-        dateb = new GregorianCalendar(2004, 6, 10, 13, 45).getTime();
-        assertFalse(DateUtils.isSameInstant(datea, dateb));
-        datea = new GregorianCalendar(2004, 6, 10, 13, 45).getTime();
-        assertTrue(DateUtils.isSameInstant(datea, dateb));
-        dateb = new GregorianCalendar(2005, 6, 10, 13, 45).getTime();
-        assertFalse(DateUtils.isSameInstant(datea, dateb));
-        try {
-            DateUtils.isSameInstant((Date) null, (Date) null);
-            fail();
-        } catch (final IllegalArgumentException ex) {}
-    }
-    
-    //-----------------------------------------------------------------------
-    @Test
-    public void testIsSameInstant_Cal() {
-        final GregorianCalendar cala = new GregorianCalendar(TimeZone.getTimeZone("GMT+1"));
-        final GregorianCalendar calb = new GregorianCalendar(TimeZone.getTimeZone("GMT-1"));
-        cala.set(2004, 6, 9, 13, 45, 0);
-        cala.set(Calendar.MILLISECOND, 0);
-        calb.set(2004, 6, 9, 13, 45, 0);
-        calb.set(Calendar.MILLISECOND, 0);
-        assertFalse(DateUtils.isSameInstant(cala, calb));
-        
-        calb.set(2004, 6, 9, 11, 45, 0);
-        assertTrue(DateUtils.isSameInstant(cala, calb));
-        try {
-            DateUtils.isSameInstant((Calendar) null, (Calendar) null);
-            fail();
-        } catch (final IllegalArgumentException ex) {}
-    }
-    
-    //-----------------------------------------------------------------------
-    @Test
-    public void testIsSameLocalTime_Cal() {
-        final GregorianCalendar cala = new GregorianCalendar(TimeZone.getTimeZone("GMT+1"));
-        final GregorianCalendar calb = new GregorianCalendar(TimeZone.getTimeZone("GMT-1"));
-        cala.set(2004, 6, 9, 13, 45, 0);
-        cala.set(Calendar.MILLISECOND, 0);
-        calb.set(2004, 6, 9, 13, 45, 0);
-        calb.set(Calendar.MILLISECOND, 0);
-        assertTrue(DateUtils.isSameLocalTime(cala, calb));
-
-        final Calendar calc = Calendar.getInstance();
-        final Calendar cald = Calendar.getInstance();
-        calc.set(2004, 6, 9, 4,  0, 0);
-        cald.set(2004, 6, 9, 16, 0, 0);
-        calc.set(Calendar.MILLISECOND, 0);
-        cald.set(Calendar.MILLISECOND, 0);
-        assertFalse("LANG-677", DateUtils.isSameLocalTime(calc, cald));
-        
-        calb.set(2004, 6, 9, 11, 45, 0);
-        assertFalse(DateUtils.isSameLocalTime(cala, calb));
-        try {
-            DateUtils.isSameLocalTime((Calendar) null, (Calendar) null);
-            fail();
-        } catch (final IllegalArgumentException ex) {}
-    }
-    
-    //-----------------------------------------------------------------------
-    @Test
-    public void testParseDate() throws Exception {
-        final GregorianCalendar cal = new GregorianCalendar(1972, 11, 3);
-        String dateStr = "1972-12-03";
-        final String[] parsers = new String[] {"yyyy'-'DDD", "yyyy'-'MM'-'dd", "yyyyMMdd"};
-        Date date = DateUtils.parseDate(dateStr, parsers);
-        assertEquals(cal.getTime(), date);
-        
-        dateStr = "1972-338";
-        date = DateUtils.parseDate(dateStr, parsers);
-        assertEquals(cal.getTime(), date);
-        
-        dateStr = "19721203";
-        date = DateUtils.parseDate(dateStr, parsers);
-        assertEquals(cal.getTime(), date);
-        
-        try {
-            DateUtils.parseDate("PURPLE", parsers);
-            fail();
-        } catch (final ParseException ex) {}
-        try {
-            DateUtils.parseDate("197212AB", parsers);
-            fail();
-        } catch (final ParseException ex) {}
-        try {
-            DateUtils.parseDate(null, parsers);
-            fail();
-        } catch (final IllegalArgumentException ex) {}
-        try {
-            DateUtils.parseDate(dateStr, (String[]) null);
-            fail();
-        } catch (final IllegalArgumentException ex) {}
-        try {
-            DateUtils.parseDate(dateStr, new String[0]);
-            fail();
-        } catch (final ParseException ex) {}
-    }
-    // LANG-486
-    @Test
-    public void testParseDateWithLeniency() throws Exception {
-        final GregorianCalendar cal = new GregorianCalendar(1998, 6, 30);
-        final String dateStr = "02 942, 1996";
-        final String[] parsers = new String[] {"MM DDD, yyyy"};
-        
-        Date date = DateUtils.parseDate(dateStr, parsers);
-        assertEquals(cal.getTime(), date);
-        
-        try {
-            date = DateUtils.parseDateStrictly(dateStr, parsers);
-            fail();
-        } catch (final ParseException ex) {}
-    }
-
-    //-----------------------------------------------------------------------
-    @Test
-    public void testAddYears() throws Exception {
-        final Date base = new Date(MILLIS_TEST);
-        Date result = DateUtils.addYears(base, 0);
-        assertNotSame(base, result);
-        assertDate(base, 2000, 6, 5, 4, 3, 2, 1);
-        assertDate(result, 2000, 6, 5, 4, 3, 2, 1);
-        
-        result = DateUtils.addYears(base, 1);
-        assertNotSame(base, result);
-        assertDate(base, 2000, 6, 5, 4, 3, 2, 1);
-        assertDate(result, 2001, 6, 5, 4, 3, 2, 1);
-        
-        result = DateUtils.addYears(base, -1);
-        assertNotSame(base, result);
-        assertDate(base, 2000, 6, 5, 4, 3, 2, 1);
-        assertDate(result, 1999, 6, 5, 4, 3, 2, 1);
-    }
-
-    //-----------------------------------------------------------------------
-    @Test
-    public void testAddMonths() throws Exception {
-        final Date base = new Date(MILLIS_TEST);
-        Date result = DateUtils.addMonths(base, 0);
-        assertNotSame(base, result);
-        assertDate(base, 2000, 6, 5, 4, 3, 2, 1);
-        assertDate(result, 2000, 6, 5, 4, 3, 2, 1);
-        
-        result = DateUtils.addMonths(base, 1);
-        assertNotSame(base, result);
-        assertDate(base, 2000, 6, 5, 4, 3, 2, 1);
-        assertDate(result, 2000, 7, 5, 4, 3, 2, 1);
-        
-        result = DateUtils.addMonths(base, -1);
-        assertNotSame(base, result);
-        assertDate(base, 2000, 6, 5, 4, 3, 2, 1);
-        assertDate(result, 2000, 5, 5, 4, 3, 2, 1);
-    }
-
-    //-----------------------------------------------------------------------
-    @Test
-    public void testAddWeeks() throws Exception {
-        final Date base = new Date(MILLIS_TEST);
-        Date result = DateUtils.addWeeks(base, 0);
-        assertNotSame(base, result);
-        assertDate(base, 2000, 6, 5, 4, 3, 2, 1);
-        assertDate(result, 2000, 6, 5, 4, 3, 2, 1);
-        
-        result = DateUtils.addWeeks(base, 1);
-        assertNotSame(base, result);
-        assertDate(base, 2000, 6, 5, 4, 3, 2, 1);
-        assertDate(result, 2000, 6, 12, 4, 3, 2, 1);
-        
-        result = DateUtils.addWeeks(base, -1);
-        assertNotSame(base, result);
-        assertDate(base, 2000, 6, 5, 4, 3, 2, 1);      // july
-        assertDate(result, 2000, 5, 28, 4, 3, 2, 1);   // june
-    }
-
-    //-----------------------------------------------------------------------
-    @Test
-    public void testAddDays() throws Exception {
-        final Date base = new Date(MILLIS_TEST);
-        Date result = DateUtils.addDays(base, 0);
-        assertNotSame(base, result);
-        assertDate(base, 2000, 6, 5, 4, 3, 2, 1);
-        assertDate(result, 2000, 6, 5, 4, 3, 2, 1);
-        
-        result = DateUtils.addDays(base, 1);
-        assertNotSame(base, result);
-        assertDate(base, 2000, 6, 5, 4, 3, 2, 1);
-        assertDate(result, 2000, 6, 6, 4, 3, 2, 1);
-        
-        result = DateUtils.addDays(base, -1);
-        assertNotSame(base, result);
-        assertDate(base, 2000, 6, 5, 4, 3, 2, 1);
-        assertDate(result, 2000, 6, 4, 4, 3, 2, 1);
-    }
-
-    //-----------------------------------------------------------------------
-    @Test
-    public void testAddHours() throws Exception {
-        final Date base = new Date(MILLIS_TEST);
-        Date result = DateUtils.addHours(base, 0);
-        assertNotSame(base, result);
-        assertDate(base, 2000, 6, 5, 4, 3, 2, 1);
-        assertDate(result, 2000, 6, 5, 4, 3, 2, 1);
-        
-        result = DateUtils.addHours(base, 1);
-        assertNotSame(base, result);
-        assertDate(base, 2000, 6, 5, 4, 3, 2, 1);
-        assertDate(result, 2000, 6, 5, 5, 3, 2, 1);
-        
-        result = DateUtils.addHours(base, -1);
-        assertNotSame(base, result);
-        assertDate(base, 2000, 6, 5, 4, 3, 2, 1);
-        assertDate(result, 2000, 6, 5, 3, 3, 2, 1);
-    }
-
-    //-----------------------------------------------------------------------
-    @Test
-    public void testAddMinutes() throws Exception {
-        final Date base = new Date(MILLIS_TEST);
-        Date result = DateUtils.addMinutes(base, 0);
-        assertNotSame(base, result);
-        assertDate(base, 2000, 6, 5, 4, 3, 2, 1);
-        assertDate(result, 2000, 6, 5, 4, 3, 2, 1);
-        
-        result = DateUtils.addMinutes(base, 1);
-        assertNotSame(base, result);
-        assertDate(base, 2000, 6, 5, 4, 3, 2, 1);
-        assertDate(result, 2000, 6, 5, 4, 4, 2, 1);
-        
-        result = DateUtils.addMinutes(base, -1);
-        assertNotSame(base, result);
-        assertDate(base, 2000, 6, 5, 4, 3, 2, 1);
-        assertDate(result, 2000, 6, 5, 4, 2, 2, 1);
-    }
-
-    //-----------------------------------------------------------------------
-    @Test
-    public void testAddSeconds() throws Exception {
-        final Date base = new Date(MILLIS_TEST);
-        Date result = DateUtils.addSeconds(base, 0);
-        assertNotSame(base, result);
-        assertDate(base, 2000, 6, 5, 4, 3, 2, 1);
-        assertDate(result, 2000, 6, 5, 4, 3, 2, 1);
-        
-        result = DateUtils.addSeconds(base, 1);
-        assertNotSame(base, result);
-        assertDate(base, 2000, 6, 5, 4, 3, 2, 1);
-        assertDate(result, 2000, 6, 5, 4, 3, 3, 1);
-        
-        result = DateUtils.addSeconds(base, -1);
-        assertNotSame(base, result);
-        assertDate(base, 2000, 6, 5, 4, 3, 2, 1);
-        assertDate(result, 2000, 6, 5, 4, 3, 1, 1);
-    }
-
-    //-----------------------------------------------------------------------
-    @Test
-    public void testAddMilliseconds() throws Exception {
-        final Date base = new Date(MILLIS_TEST);
-        Date result = DateUtils.addMilliseconds(base, 0);
-        assertNotSame(base, result);
-        assertDate(base, 2000, 6, 5, 4, 3, 2, 1);
-        assertDate(result, 2000, 6, 5, 4, 3, 2, 1);
-        
-        result = DateUtils.addMilliseconds(base, 1);
-        assertNotSame(base, result);
-        assertDate(base, 2000, 6, 5, 4, 3, 2, 1);
-        assertDate(result, 2000, 6, 5, 4, 3, 2, 2);
-        
-        result = DateUtils.addMilliseconds(base, -1);
-        assertNotSame(base, result);
-        assertDate(base, 2000, 6, 5, 4, 3, 2, 1);
-        assertDate(result, 2000, 6, 5, 4, 3, 2, 0);
-    }
-
-    // -----------------------------------------------------------------------
-    @Test
-    public void testSetYears() throws Exception {
-        final Date base = new Date(MILLIS_TEST);
-        Date result = DateUtils.setYears(base, 2000);
-        assertNotSame(base, result);
-        assertDate(base, 2000, 6, 5, 4, 3, 2, 1);
-        assertDate(result, 2000, 6, 5, 4, 3, 2, 1);
-
-        result = DateUtils.setYears(base, 2008);
-        assertNotSame(base, result);
-        assertDate(base, 2000, 6, 5, 4, 3, 2, 1);
-        assertDate(result, 2008, 6, 5, 4, 3, 2, 1);
-
-        result = DateUtils.setYears(base, 2005);
-        assertNotSame(base, result);
-        assertDate(base, 2000, 6, 5, 4, 3, 2, 1);
-        assertDate(result, 2005, 6, 5, 4, 3, 2, 1);
-    }
-
-    // -----------------------------------------------------------------------
-    @Test
-    public void testSetMonths() throws Exception {
-        final Date base = new Date(MILLIS_TEST);
-        Date result = DateUtils.setMonths(base, 5);
-        assertNotSame(base, result);
-        assertDate(base, 2000, 6, 5, 4, 3, 2, 1);
-        assertDate(result, 2000, 5, 5, 4, 3, 2, 1);
-
-        result = DateUtils.setMonths(base, 1);
-        assertNotSame(base, result);
-        assertDate(base, 2000, 6, 5, 4, 3, 2, 1);
-        assertDate(result, 2000, 1, 5, 4, 3, 2, 1);
-
-        try {
-            result = DateUtils.setMonths(base, 12);
-            fail("DateUtils.setMonths did not throw an expected IllegalArgumentException.");
-        } catch (final IllegalArgumentException e) {
-
-        }
-    }
-
-    // -----------------------------------------------------------------------
-    @Test
-    public void testSetDays() throws Exception {
-        final Date base = new Date(MILLIS_TEST);
-        Date result = DateUtils.setDays(base, 1);
-        assertNotSame(base, result);
-        assertDate(base, 2000, 6, 5, 4, 3, 2, 1);
-        assertDate(result, 2000, 6, 1, 4, 3, 2, 1);
-
-        result = DateUtils.setDays(base, 29);
-        assertNotSame(base, result);
-        assertDate(base, 2000, 6, 5, 4, 3, 2, 1);
-        assertDate(result, 2000, 6, 29, 4, 3, 2, 1);
-
-        try {
-            result = DateUtils.setDays(base, 32);
-            fail("DateUtils.setDays did not throw an expected IllegalArgumentException.");
-        } catch (final IllegalArgumentException e) {
-
-        }
-    }
-
-    // -----------------------------------------------------------------------
-    @Test
-    public void testSetHours() throws Exception {
-        final Date base = new Date(MILLIS_TEST);
-        Date result = DateUtils.setHours(base, 0);
-        assertNotSame(base, result);
-        assertDate(base, 2000, 6, 5, 4, 3, 2, 1);
-        assertDate(result, 2000, 6, 5, 0, 3, 2, 1);
-
-        result = DateUtils.setHours(base, 23);
-        assertNotSame(base, result);
-        assertDate(base, 2000, 6, 5, 4, 3, 2, 1);
-        assertDate(result, 2000, 6, 5, 23, 3, 2, 1);
-
-        try {
-            result = DateUtils.setHours(base, 24);
-            fail("DateUtils.setHours did not throw an expected IllegalArgumentException.");
-        } catch (final IllegalArgumentException e) {
-
-        }
-    }
-
-    // -----------------------------------------------------------------------
-    @Test
-    public void testSetMinutes() throws Exception {
-        final Date base = new Date(MILLIS_TEST);
-        Date result = DateUtils.setMinutes(base, 0);
-        assertNotSame(base, result);
-        assertDate(base, 2000, 6, 5, 4, 3, 2, 1);
-        assertDate(result, 2000, 6, 5, 4, 0, 2, 1);
-
-        result = DateUtils.setMinutes(base, 59);
-        assertNotSame(base, result);
-        assertDate(base, 2000, 6, 5, 4, 3, 2, 1);
-        assertDate(result, 2000, 6, 5, 4, 59, 2, 1);
-
-        try {
-            result = DateUtils.setMinutes(base, 60);
-            fail("DateUtils.setMinutes did not throw an expected IllegalArgumentException.");
-        } catch (final IllegalArgumentException e) {
-
-        }
-    }
-
-    // -----------------------------------------------------------------------
-    @Test
-    public void testSetSeconds() throws Exception {
-        final Date base = new Date(MILLIS_TEST);
-        Date result = DateUtils.setSeconds(base, 0);
-        assertNotSame(base, result);
-        assertDate(base, 2000, 6, 5, 4, 3, 2, 1);
-        assertDate(result, 2000, 6, 5, 4, 3, 0, 1);
-
-        result = DateUtils.setSeconds(base, 59);
-        assertNotSame(base, result);
-        assertDate(base, 2000, 6, 5, 4, 3, 2, 1);
-        assertDate(result, 2000, 6, 5, 4, 3, 59, 1);
-
-        try {
-            result = DateUtils.setSeconds(base, 60);
-            fail("DateUtils.setSeconds did not throw an expected IllegalArgumentException.");
-        } catch (final IllegalArgumentException e) {
-
-        }
-    }
-
-    // -----------------------------------------------------------------------
-    @Test
-    public void testSetMilliseconds() throws Exception {
-        final Date base = new Date(MILLIS_TEST);
-        Date result = DateUtils.setMilliseconds(base, 0);
-        assertNotSame(base, result);
-        assertDate(base, 2000, 6, 5, 4, 3, 2, 1);
-        assertDate(result, 2000, 6, 5, 4, 3, 2, 0);
-
-        result = DateUtils.setMilliseconds(base, 999);
-        assertNotSame(base, result);
-        assertDate(base, 2000, 6, 5, 4, 3, 2, 1);
-        assertDate(result, 2000, 6, 5, 4, 3, 2, 999);
-
-        try {
-            result = DateUtils.setMilliseconds(base, 1000);
-            fail("DateUtils.setMilliseconds did not throw an expected IllegalArgumentException.");
-        } catch (final IllegalArgumentException e) {
-
-        }
-    }
-
-    //-----------------------------------------------------------------------
-    private void assertDate(final Date date, final int year, final int month, final int day, final int hour, final int min, final int sec, final int mil) throws Exception {
-        final GregorianCalendar cal = new GregorianCalendar();
-        cal.setTime(date);
-        assertEquals(year, cal.get(Calendar.YEAR));
-        assertEquals(month, cal.get(Calendar.MONTH));
-        assertEquals(day, cal.get(Calendar.DAY_OF_MONTH));
-        assertEquals(hour, cal.get(Calendar.HOUR_OF_DAY));
-        assertEquals(min, cal.get(Calendar.MINUTE));
-        assertEquals(sec, cal.get(Calendar.SECOND));
-        assertEquals(mil, cal.get(Calendar.MILLISECOND));
-    }
-
-    //-----------------------------------------------------------------------
-    @Test
-    public void testToCalendar() {
-        assertEquals("Failed to convert to a Calendar and back", date1, DateUtils.toCalendar(date1).getTime());
-        try {
-            DateUtils.toCalendar(null);
-            fail("Expected NullPointerException to be thrown");
-        } catch(final NullPointerException npe) {
-            // expected
-        }
-    }
-
-    //-----------------------------------------------------------------------
-    /**
-     * Tests various values with the round method
-     *
-     * @throws java.lang.Exception so we don't have to catch it
-     */
-    @Test
-    public void testRound() throws Exception {
-        // tests for public static Date round(Date date, int field)
-        assertEquals("round year-1 failed",
-                dateParser.parse("January 1, 2002"),
-                DateUtils.round(date1, Calendar.YEAR));
-        assertEquals("round year-2 failed",
-                dateParser.parse("January 1, 2002"),
-                DateUtils.round(date2, Calendar.YEAR));
-        assertEquals("round month-1 failed",
-                dateParser.parse("February 1, 2002"),
-                DateUtils.round(date1, Calendar.MONTH));
-        assertEquals("round month-2 failed",
-                dateParser.parse("December 1, 2001"),
-                DateUtils.round(date2, Calendar.MONTH));
-        assertEquals("round semimonth-0 failed",
-                dateParser.parse("February 1, 2002"),
-                DateUtils.round(date0, DateUtils.SEMI_MONTH));
-        assertEquals("round semimonth-1 failed",
-                dateParser.parse("February 16, 2002"),
-                DateUtils.round(date1, DateUtils.SEMI_MONTH));
-        assertEquals("round semimonth-2 failed",
-                dateParser.parse("November 16, 2001"),
-                DateUtils.round(date2, DateUtils.SEMI_MONTH));
-        
-        
-        assertEquals("round date-1 failed",
-                dateParser.parse("February 13, 2002"),
-                DateUtils.round(date1, Calendar.DATE));
-        assertEquals("round date-2 failed",
-                dateParser.parse("November 18, 2001"),
-                DateUtils.round(date2, Calendar.DATE));
-        assertEquals("round hour-1 failed",
-                dateTimeParser.parse("February 12, 2002 13:00:00.000"),
-                DateUtils.round(date1, Calendar.HOUR));
-        assertEquals("round hour-2 failed",
-                dateTimeParser.parse("November 18, 2001 1:00:00.000"),
-                DateUtils.round(date2, Calendar.HOUR));
-        assertEquals("round minute-1 failed",
-                dateTimeParser.parse("February 12, 2002 12:35:00.000"),
-                DateUtils.round(date1, Calendar.MINUTE));
-        assertEquals("round minute-2 failed",
-                dateTimeParser.parse("November 18, 2001 1:23:00.000"),
-                DateUtils.round(date2, Calendar.MINUTE));
-        assertEquals("round second-1 failed",
-                dateTimeParser.parse("February 12, 2002 12:34:57.000"),
-                DateUtils.round(date1, Calendar.SECOND));
-        assertEquals("round second-2 failed",
-                dateTimeParser.parse("November 18, 2001 1:23:11.000"),
-                DateUtils.round(date2, Calendar.SECOND));
-        assertEquals("round ampm-1 failed",
-                dateTimeParser.parse("February 3, 2002 00:00:00.000"),
-                DateUtils.round(dateAmPm1, Calendar.AM_PM));
-        assertEquals("round ampm-2 failed",
-                dateTimeParser.parse("February 3, 2002 12:00:00.000"),
-                DateUtils.round(dateAmPm2, Calendar.AM_PM));
-        assertEquals("round ampm-3 failed",
-                dateTimeParser.parse("February 3, 2002 12:00:00.000"),
-                DateUtils.round(dateAmPm3, Calendar.AM_PM));
-        assertEquals("round ampm-4 failed",
-                dateTimeParser.parse("February 4, 2002 00:00:00.000"),
-                DateUtils.round(dateAmPm4, Calendar.AM_PM));
-
-        // tests for public static Date round(Object date, int field)
-        assertEquals("round year-1 failed",
-                dateParser.parse("January 1, 2002"),
-                DateUtils.round((Object) date1, Calendar.YEAR));
-        assertEquals("round year-2 failed",
-                dateParser.parse("January 1, 2002"),
-                DateUtils.round((Object) date2, Calendar.YEAR));
-        assertEquals("round month-1 failed",
-                dateParser.parse("February 1, 2002"),
-                DateUtils.round((Object) date1, Calendar.MONTH));
-        assertEquals("round month-2 failed",
-                dateParser.parse("December 1, 2001"),
-                DateUtils.round((Object) date2, Calendar.MONTH));
-        assertEquals("round semimonth-1 failed",
-                dateParser.parse("February 16, 2002"),
-                DateUtils.round((Object) date1, DateUtils.SEMI_MONTH));
-        assertEquals("round semimonth-2 failed",
-                dateParser.parse("November 16, 2001"),
-                DateUtils.round((Object) date2, DateUtils.SEMI_MONTH));
-        assertEquals("round date-1 failed",
-                dateParser.parse("February 13, 2002"),
-                DateUtils.round((Object) date1, Calendar.DATE));
-        assertEquals("round date-2 failed",
-                dateParser.parse("November 18, 2001"),
-                DateUtils.round((Object) date2, Calendar.DATE));
-        assertEquals("round hour-1 failed",
-                dateTimeParser.parse("February 12, 2002 13:00:00.000"),
-                DateUtils.round((Object) date1, Calendar.HOUR));
-        assertEquals("round hour-2 failed",
-                dateTimeParser.parse("November 18, 2001 1:00:00.000"),
-                DateUtils.round((Object) date2, Calendar.HOUR));
-        assertEquals("round minute-1 failed",
-                dateTimeParser.parse("February 12, 2002 12:35:00.000"),
-                DateUtils.round((Object) date1, Calendar.MINUTE));
-        assertEquals("round minute-2 failed",
-                dateTimeParser.parse("November 18, 2001 1:23:00.000"),
-                DateUtils.round((Object) date2, Calendar.MINUTE));
-        assertEquals("round second-1 failed",
-                dateTimeParser.parse("February 12, 2002 12:34:57.000"),
-                DateUtils.round((Object) date1, Calendar.SECOND));
-        assertEquals("round second-2 failed",
-                dateTimeParser.parse("November 18, 2001 1:23:11.000"),
-                DateUtils.round((Object) date2, Calendar.SECOND));
-        assertEquals("round calendar second-1 failed",
-                dateTimeParser.parse("February 12, 2002 12:34:57.000"),
-                DateUtils.round((Object) cal1, Calendar.SECOND));
-        assertEquals("round calendar second-2 failed",
-                dateTimeParser.parse("November 18, 2001 1:23:11.000"),
-                DateUtils.round((Object) cal2, Calendar.SECOND));
-        assertEquals("round ampm-1 failed",
-                dateTimeParser.parse("February 3, 2002 00:00:00.000"),
-                DateUtils.round((Object) dateAmPm1, Calendar.AM_PM));
-        assertEquals("round ampm-2 failed",
-                dateTimeParser.parse("February 3, 2002 12:00:00.000"),
-                DateUtils.round((Object) dateAmPm2, Calendar.AM_PM));
-        assertEquals("round ampm-3 failed",
-                dateTimeParser.parse("February 3, 2002 12:00:00.000"),
-                DateUtils.round((Object) dateAmPm3, Calendar.AM_PM));
-        assertEquals("round ampm-4 failed",
-                dateTimeParser.parse("February 4, 2002 00:00:00.000"),
-                DateUtils.round((Object) dateAmPm4, Calendar.AM_PM));
-
-        try {
-            DateUtils.round((Date) null, Calendar.SECOND);
-            fail();
-        } catch (final IllegalArgumentException ex) {}
-        try {
-            DateUtils.round((Calendar) null, Calendar.SECOND);
-            fail();
-        } catch (final IllegalArgumentException ex) {}
-        try {
-            DateUtils.round((Object) null, Calendar.SECOND);
-            fail();
-        } catch (final IllegalArgumentException ex) {}
-        try {
-            DateUtils.round("", Calendar.SECOND);
-            fail();
-        } catch (final ClassCastException ex) {}
-        try {
-            DateUtils.round(date1, -9999);
-            fail();
-        } catch(final IllegalArgumentException ex) {}
-
-        assertEquals("round ampm-1 failed",
-                dateTimeParser.parse("February 3, 2002 00:00:00.000"),
-                DateUtils.round((Object) calAmPm1, Calendar.AM_PM));
-        assertEquals("round ampm-2 failed",
-                dateTimeParser.parse("February 3, 2002 12:00:00.000"),
-                DateUtils.round((Object) calAmPm2, Calendar.AM_PM));
-        assertEquals("round ampm-3 failed",
-                dateTimeParser.parse("February 3, 2002 12:00:00.000"),
-                DateUtils.round((Object) calAmPm3, Calendar.AM_PM));
-        assertEquals("round ampm-4 failed",
-                dateTimeParser.parse("February 4, 2002 00:00:00.000"),
-                DateUtils.round((Object) calAmPm4, Calendar.AM_PM));
-        
-        // Fix for http://issues.apache.org/bugzilla/show_bug.cgi?id=25560 / LANG-13
-        // Test rounding across the beginning of daylight saving time
-        TimeZone.setDefault(zone);
-        dateTimeParser.setTimeZone(zone);
-        assertEquals("round MET date across DST change-over",
-                dateTimeParser.parse("March 30, 2003 00:00:00.000"),
-                DateUtils.round(date4, Calendar.DATE));
-        assertEquals("round MET date across DST change-over",
-                dateTimeParser.parse("March 30, 2003 00:00:00.000"),
-                DateUtils.round((Object) cal4, Calendar.DATE));
-        assertEquals("round MET date across DST change-over",
-                dateTimeParser.parse("March 30, 2003 00:00:00.000"),
-                DateUtils.round(date5, Calendar.DATE));
-        assertEquals("round MET date across DST change-over",
-                dateTimeParser.parse("March 30, 2003 00:00:00.000"),
-                DateUtils.round((Object) cal5, Calendar.DATE));
-        assertEquals("round MET date across DST change-over",
-                dateTimeParser.parse("March 30, 2003 00:00:00.000"),
-                DateUtils.round(date6, Calendar.DATE));
-        assertEquals("round MET date across DST change-over",
-                dateTimeParser.parse("March 30, 2003 00:00:00.000"),
-                DateUtils.round((Object) cal6, Calendar.DATE));
-        assertEquals("round MET date across DST change-over",
-                dateTimeParser.parse("March 30, 2003 00:00:00.000"),
-                DateUtils.round(date7, Calendar.DATE));
-        assertEquals("round MET date across DST change-over",
-                dateTimeParser.parse("March 30, 2003 00:00:00.000"),
-                DateUtils.round((Object) cal7, Calendar.DATE));
-        
-        assertEquals("round MET date across DST change-over",
-                dateTimeParser.parse("March 30, 2003 01:00:00.000"),
-                DateUtils.round(date4, Calendar.HOUR_OF_DAY));
-        assertEquals("round MET date across DST change-over",
-                dateTimeParser.parse("March 30, 2003 01:00:00.000"),
-                DateUtils.round((Object) cal4, Calendar.HOUR_OF_DAY));
-        if (SystemUtils.isJavaVersionAtLeast(JAVA_1_4)) {
-            assertEquals("round MET date across DST change-over",
-                    dateTimeParser.parse("March 30, 2003 03:00:00.000"),
-                    DateUtils.round(date5, Calendar.HOUR_OF_DAY));
-            assertEquals("round MET date across DST change-over",
-                    dateTimeParser.parse("March 30, 2003 03:00:00.000"),
-                    DateUtils.round((Object) cal5, Calendar.HOUR_OF_DAY));
-            assertEquals("round MET date across DST change-over",
-                    dateTimeParser.parse("March 30, 2003 03:00:00.000"),
-                    DateUtils.round(date6, Calendar.HOUR_OF_DAY));
-            assertEquals("round MET date across DST change-over",
-                    dateTimeParser.parse("March 30, 2003 03:00:00.000"),
-                    DateUtils.round((Object) cal6, Calendar.HOUR_OF_DAY));
-            assertEquals("round MET date across DST change-over",
-                    dateTimeParser.parse("March 30, 2003 04:00:00.000"),
-                    DateUtils.round(date7, Calendar.HOUR_OF_DAY));
-            assertEquals("round MET date across DST change-over",
-                    dateTimeParser.parse("March 30, 2003 04:00:00.000"),
-                    DateUtils.round((Object) cal7, Calendar.HOUR_OF_DAY));
-        } else {
-            this.warn("WARNING: Some date rounding tests not run since the current version is " + SystemUtils.JAVA_SPECIFICATION_VERSION);
-        }
-        TimeZone.setDefault(defaultZone);
-        dateTimeParser.setTimeZone(defaultZone);
-    }
-
-    /**
-     * Tests the Changes Made by LANG-346 to the DateUtils.modify() private method invoked
-     * by DateUtils.round().
-     *
-     * @throws java.lang.Exception so we don't have to catch it
-     */
-    @Test
-    public void testRoundLang346() throws Exception
-    {
-        TimeZone.setDefault(defaultZone);
-        dateTimeParser.setTimeZone(defaultZone);
-        final Calendar testCalendar = Calendar.getInstance();
-        testCalendar.set(2007, 6, 2, 8, 8, 50);
-        Date date = testCalendar.getTime();
-        assertEquals("Minute Round Up Failed",
-                     dateTimeParser.parse("July 2, 2007 08:09:00.000"),
-                     DateUtils.round(date, Calendar.MINUTE));
-
-        testCalendar.set(2007, 6, 2, 8, 8, 20);
-        date = testCalendar.getTime();
-        assertEquals("Minute No Round Failed",
-                     dateTimeParser.parse("July 2, 2007 08:08:00.000"),
-                     DateUtils.round(date, Calendar.MINUTE));
-
-        testCalendar.set(2007, 6, 2, 8, 8, 50);
-        testCalendar.set(Calendar.MILLISECOND, 600);
-        date = testCalendar.getTime();
-
-        assertEquals("Second Round Up with 600 Milli Seconds Failed",
-                     dateTimeParser.parse("July 2, 2007 08:08:51.000"),
-                     DateUtils.round(date, Calendar.SECOND));
-
-        testCalendar.set(2007, 6, 2, 8, 8, 50);
-        testCalendar.set(Calendar.MILLISECOND, 200);
-        date = testCalendar.getTime();
-        assertEquals("Second Round Down with 200 Milli Seconds Failed",
-                     dateTimeParser.parse("July 2, 2007 08:08:50.000"),
-                     DateUtils.round(date, Calendar.SECOND));
-
-        testCalendar.set(2007, 6, 2, 8, 8, 20);
-        testCalendar.set(Calendar.MILLISECOND, 600);
-        date = testCalendar.getTime();
-        assertEquals("Second Round Up with 200 Milli Seconds Failed",
-                     dateTimeParser.parse("July 2, 2007 08:08:21.000"),
-                     DateUtils.round(date, Calendar.SECOND));
-
-        testCalendar.set(2007, 6, 2, 8, 8, 20);
-        testCalendar.set(Calendar.MILLISECOND, 200);
-        date = testCalendar.getTime();
-        assertEquals("Second Round Down with 200 Milli Seconds Failed",
-                     dateTimeParser.parse("July 2, 2007 08:08:20.000"),
-                     DateUtils.round(date, Calendar.SECOND));
-
-        testCalendar.set(2007, 6, 2, 8, 8, 50);
-        date = testCalendar.getTime();
-        assertEquals("Hour Round Down Failed",
-                     dateTimeParser.parse("July 2, 2007 08:00:00.000"),
-                     DateUtils.round(date, Calendar.HOUR));
-
-        testCalendar.set(2007, 6, 2, 8, 31, 50);
-        date = testCalendar.getTime();
-        assertEquals("Hour Round Up Failed",
-                     dateTimeParser.parse("July 2, 2007 09:00:00.000"),
-                     DateUtils.round(date, Calendar.HOUR));
-    }
-
-    /**
-     * Tests various values with the trunc method
-     *
-     * @throws java.lang.Exception so we don't have to catch it
-     */
-    @Test
-    public void testTruncate() throws Exception {
-        // tests public static Date truncate(Date date, int field)
-        assertEquals("truncate year-1 failed",
-                dateParser.parse("January 1, 2002"),
-                DateUtils.truncate(date1, Calendar.YEAR));
-        assertEquals("truncate year-2 failed",
-                dateParser.parse("January 1, 2001"),
-                DateUtils.truncate(date2, Calendar.YEAR));
-        assertEquals("truncate month-1 failed",
-                dateParser.parse("February 1, 2002"),
-                DateUtils.truncate(date1, Calendar.MONTH));
-        assertEquals("truncate month-2 failed",
-                dateParser.parse("November 1, 2001"),
-                DateUtils.truncate(date2, Calendar.MONTH));
-        assertEquals("truncate semimonth-1 failed",
-                dateParser.parse("February 1, 2002"),
-                DateUtils.truncate(date1, DateUtils.SEMI_MONTH));
-        assertEquals("truncate semimonth-2 failed",
-                dateParser.parse("November 16, 2001"),
-                DateUtils.truncate(date2, DateUtils.SEMI_MONTH));
-        assertEquals("truncate date-1 failed",
-                dateParser.parse("February 12, 2002"),
-                DateUtils.truncate(date1, Calendar.DATE));
-        assertEquals("truncate date-2 failed",
-                dateParser.parse("November 18, 2001"),
-                DateUtils.truncate(date2, Calendar.DATE));
-        assertEquals("truncate hour-1 failed",
-                dateTimeParser.parse("February 12, 2002 12:00:00.000"),
-                DateUtils.truncate(date1, Calendar.HOUR));
-        assertEquals("truncate hour-2 failed",
-                dateTimeParser.parse("November 18, 2001 1:00:00.000"),
-                DateUtils.truncate(date2, Calendar.HOUR));
-        assertEquals("truncate minute-1 failed",
-                dateTimeParser.parse("February 12, 2002 12:34:00.000"),
-                DateUtils.truncate(date1, Calendar.MINUTE));
-        assertEquals("truncate minute-2 failed",
-                dateTimeParser.parse("November 18, 2001 1:23:00.000"),
-                DateUtils.truncate(date2, Calendar.MINUTE));
-        assertEquals("truncate second-1 failed",
-                dateTimeParser.parse("February 12, 2002 12:34:56.000"),
-                DateUtils.truncate(date1, Calendar.SECOND));
-        assertEquals("truncate second-2 failed",
-                dateTimeParser.parse("November 18, 2001 1:23:11.000"),
-                DateUtils.truncate(date2, Calendar.SECOND));
-        assertEquals("truncate ampm-1 failed",
-                dateTimeParser.parse("February 3, 2002 00:00:00.000"),
-                DateUtils.truncate(dateAmPm1, Calendar.AM_PM));
-        assertEquals("truncate ampm-2 failed",
-                dateTimeParser.parse("February 3, 2002 00:00:00.000"),
-                DateUtils.truncate(dateAmPm2, Calendar.AM_PM));
-        assertEquals("truncate ampm-3 failed",
-                dateTimeParser.parse("February 3, 2002 12:00:00.000"),
-                DateUtils.truncate(dateAmPm3, Calendar.AM_PM));
-        assertEquals("truncate ampm-4 failed",
-                dateTimeParser.parse("February 3, 2002 12:00:00.000"),
-                DateUtils.truncate(dateAmPm4, Calendar.AM_PM));
-
-        // tests public static Date truncate(Object date, int field)
-        assertEquals("truncate year-1 failed",
-                dateParser.parse("January 1, 2002"),
-                DateUtils.truncate((Object) date1, Calendar.YEAR));
-        assertEquals("truncate year-2 failed",
-                dateParser.parse("January 1, 2001"),
-                DateUtils.truncate((Object) date2, Calendar.YEAR));
-        assertEquals("truncate month-1 failed",
-                dateParser.parse("February 1, 2002"),
-                DateUtils.truncate((Object) date1, Calendar.MONTH));
-        assertEquals("truncate month-2 failed",
-                dateParser.parse("November 1, 2001"),
-                DateUtils.truncate((Object) date2, Calendar.MONTH));
-        assertEquals("truncate semimonth-1 failed",
-                dateParser.parse("February 1, 2002"),
-                DateUtils.truncate((Object) date1, DateUtils.SEMI_MONTH));
-        assertEquals("truncate semimonth-2 failed",
-                dateParser.parse("November 16, 2001"),
-                DateUtils.truncate((Object) date2, DateUtils.SEMI_MONTH));
-        assertEquals("truncate date-1 failed",
-                dateParser.parse("February 12, 2002"),
-                DateUtils.truncate((Object) date1, Calendar.DATE));
-        assertEquals("truncate date-2 failed",
-                dateParser.parse("November 18, 2001"),
-                DateUtils.truncate((Object) date2, Calendar.DATE));
-        assertEquals("truncate hour-1 failed",
-                dateTimeParser.parse("February 12, 2002 12:00:00.000"),
-                DateUtils.truncate((Object) date1, Calendar.HOUR));
-        assertEquals("truncate hour-2 failed",
-                dateTimeParser.parse("November 18, 2001 1:00:00.000"),
-                DateUtils.truncate((Object) date2, Calendar.HOUR));
-        assertEquals("truncate minute-1 failed",
-                dateTimeParser.parse("February 12, 2002 12:34:00.000"),
-                DateUtils.truncate((Object) date1, Calendar.MINUTE));
-        assertEquals("truncate minute-2 failed",
-                dateTimeParser.parse("November 18, 2001 1:23:00.000"),
-                DateUtils.truncate((Object) date2, Calendar.MINUTE));
-        assertEquals("truncate second-1 failed",
-                dateTimeParser.parse("February 12, 2002 12:34:56.000"),
-                DateUtils.truncate((Object) date1, Calendar.SECOND));
-        assertEquals("truncate second-2 failed",
-                dateTimeParser.parse("November 18, 2001 1:23:11.000"),
-                DateUtils.truncate((Object) date2, Calendar.SECOND));
-        assertEquals("truncate ampm-1 failed",
-                dateTimeParser.parse("February 3, 2002 00:00:00.000"),
-                DateUtils.truncate((Object) dateAmPm1, Calendar.AM_PM));
-        assertEquals("truncate ampm-2 failed",
-                dateTimeParser.parse("February 3, 2002 00:00:00.000"),
-                DateUtils.truncate((Object) dateAmPm2, Calendar.AM_PM));
-        assertEquals("truncate ampm-3 failed",
-                dateTimeParser.parse("February 3, 2002 12:00:00.000"),
-                DateUtils.truncate((Object) dateAmPm3, Calendar.AM_PM));
-        assertEquals("truncate ampm-4 failed",
-                dateTimeParser.parse("February 3, 2002 12:00:00.000"),
-                DateUtils.truncate((Object) dateAmPm4, Calendar.AM_PM));
-        
-        assertEquals("truncate calendar second-1 failed",
-                dateTimeParser.parse("February 12, 2002 12:34:56.000"),
-                DateUtils.truncate((Object) cal1, Calendar.SECOND));
-        assertEquals("truncate calendar second-2 failed",
-                dateTimeParser.parse("November 18, 2001 1:23:11.000"),
-                DateUtils.truncate((Object) cal2, Calendar.SECOND));
-        
-        assertEquals("truncate ampm-1 failed",
-                dateTimeParser.parse("February 3, 2002 00:00:00.000"),
-                DateUtils.truncate((Object) calAmPm1, Calendar.AM_PM));
-        assertEquals("truncate ampm-2 failed",
-                dateTimeParser.parse("February 3, 2002 00:00:00.000"),
-                DateUtils.truncate((Object) calAmPm2, Calendar.AM_PM));
-        assertEquals("truncate ampm-3 failed",
-                dateTimeParser.parse("February 3, 2002 12:00:00.000"),
-                DateUtils.truncate((Object) calAmPm3, Calendar.AM_PM));
-        assertEquals("truncate ampm-4 failed",
-                dateTimeParser.parse("February 3, 2002 12:00:00.000"),
-                DateUtils.truncate((Object) calAmPm4, Calendar.AM_PM));
-        
-        try {
-            DateUtils.truncate((Date) null, Calendar.SECOND);
-            fail();
-        } catch (final IllegalArgumentException ex) {}
-        try {
-            DateUtils.truncate((Calendar) null, Calendar.SECOND);
-            fail();
-        } catch (final IllegalArgumentException ex) {}
-        try {
-            DateUtils.truncate((Object) null, Calendar.SECOND);
-            fail();
-        } catch (final IllegalArgumentException ex) {}
-        try {
-            DateUtils.truncate("", Calendar.SECOND);
-            fail();
-        } catch (final ClassCastException ex) {}
-
-        // Fix for http://issues.apache.org/bugzilla/show_bug.cgi?id=25560
-        // Test truncate across beginning of daylight saving time
-        TimeZone.setDefault(zone);
-        dateTimeParser.setTimeZone(zone);
-        assertEquals("truncate MET date across DST change-over",
-                dateTimeParser.parse("March 30, 2003 00:00:00.000"),
-                DateUtils.truncate(date3, Calendar.DATE));
-        assertEquals("truncate MET date across DST change-over",
-                dateTimeParser.parse("March 30, 2003 00:00:00.000"),
-                DateUtils.truncate((Object) cal3, Calendar.DATE));
-        // Test truncate across end of daylight saving time
-        assertEquals("truncate MET date across DST change-over",
-                dateTimeParser.parse("October 26, 2003 00:00:00.000"),
-                DateUtils.truncate(date8, Calendar.DATE));
-        assertEquals("truncate MET date across DST change-over",
-                dateTimeParser.parse("October 26, 2003 00:00:00.000"),
-                DateUtils.truncate((Object) cal8, Calendar.DATE));
-        TimeZone.setDefault(defaultZone);
-        dateTimeParser.setTimeZone(defaultZone);
-        
-        // Bug 31395, large dates
-        final Date endOfTime = new Date(Long.MAX_VALUE); // fyi: Sun Aug 17 07:12:55 CET 292278994 -- 807 millis
-        final GregorianCalendar endCal = new GregorianCalendar();
-        endCal.setTime(endOfTime);
-        try {
-            DateUtils.truncate(endCal, Calendar.DATE);
-            fail();
-        } catch (final ArithmeticException ex) {}
-        endCal.set(Calendar.YEAR, 280000001);
-        try {
-            DateUtils.truncate(endCal, Calendar.DATE);
-            fail();
-        } catch (final ArithmeticException ex) {}
-        endCal.set(Calendar.YEAR, 280000000);
-        final Calendar cal = DateUtils.truncate(endCal, Calendar.DATE);
-        assertEquals(0, cal.get(Calendar.HOUR));
-    }
-
-    /**
-     * Tests for LANG-59
-     *
-     * @throws java.lang.Exception so we don't have to catch it
-     *
-     * see http://issues.apache.org/jira/browse/LANG-59
-     */
-    @Test
-    public void testTruncateLang59() throws Exception {
-        if (!SystemUtils.isJavaVersionAtLeast(JAVA_1_4)) {
-            this.warn("WARNING: Test for LANG-59 not run since the current version is " + SystemUtils.JAVA_SPECIFICATION_VERSION);
-            return;
-        }
-
-        // Set TimeZone to Mountain Time
-        final TimeZone MST_MDT = TimeZone.getTimeZone("MST7MDT");
-        TimeZone.setDefault(MST_MDT);
-        final DateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSS z");
-        format.setTimeZone(MST_MDT);
-
-        final Date oct31_01MDT = new Date(1099206000000L); 
-
-        final Date oct31MDT             = new Date(oct31_01MDT.getTime()       - 3600000L); // - 1 hour
-        final Date oct31_01_02MDT       = new Date(oct31_01MDT.getTime()       + 120000L);  // + 2 minutes
-        final Date oct31_01_02_03MDT    = new Date(oct31_01_02MDT.getTime()    + 3000L);    // + 3 seconds
-        final Date oct31_01_02_03_04MDT = new Date(oct31_01_02_03MDT.getTime() + 4L);       // + 4 milliseconds
-
-        assertEquals("Check 00:00:00.000", "2004-10-31 00:00:00.000 MDT", format.format(oct31MDT));
-        assertEquals("Check 01:00:00.000", "2004-10-31 01:00:00.000 MDT", format.format(oct31_01MDT));
-        assertEquals("Check 01:02:00.000", "2004-10-31 01:02:00.000 MDT", format.format(oct31_01_02MDT));
-        assertEquals("Check 01:02:03.000", "2004-10-31 01:02:03.000 MDT", format.format(oct31_01_02_03MDT));
-        assertEquals("Check 01:02:03.004", "2004-10-31 01:02:03.004 MDT", format.format(oct31_01_02_03_04MDT));
-
-        // ------- Demonstrate Problem -------
-        final Calendar gval = Calendar.getInstance();
-        gval.setTime(new Date(oct31_01MDT.getTime()));
-        gval.set(Calendar.MINUTE, gval.get(Calendar.MINUTE)); // set minutes to the same value
-        assertEquals("Demonstrate Problem", gval.getTime().getTime(), oct31_01MDT.getTime() + 3600000L);
-
-        // ---------- Test Truncate ----------
-        assertEquals("Truncate Calendar.MILLISECOND",
-                oct31_01_02_03_04MDT, DateUtils.truncate(oct31_01_02_03_04MDT, Calendar.MILLISECOND));
-
-        assertEquals("Truncate Calendar.SECOND",
-                   oct31_01_02_03MDT, DateUtils.truncate(oct31_01_02_03_04MDT, Calendar.SECOND));
-
-        assertEquals("Truncate Calendar.MINUTE",
-                      oct31_01_02MDT, DateUtils.truncate(oct31_01_02_03_04MDT, Calendar.MINUTE));
-
-        assertEquals("Truncate Calendar.HOUR_OF_DAY",
-                         oct31_01MDT, DateUtils.truncate(oct31_01_02_03_04MDT, Calendar.HOUR_OF_DAY));
-
-        assertEquals("Truncate Calendar.HOUR",
-                         oct31_01MDT, DateUtils.truncate(oct31_01_02_03_04MDT, Calendar.HOUR));
-
-        assertEquals("Truncate Calendar.DATE",
-                            oct31MDT, DateUtils.truncate(oct31_01_02_03_04MDT, Calendar.DATE));
-
-
-        // ---------- Test Round (down) ----------
-        assertEquals("Round Calendar.MILLISECOND",
-                oct31_01_02_03_04MDT, DateUtils.round(oct31_01_02_03_04MDT, Calendar.MILLISECOND));
-
-        assertEquals("Round Calendar.SECOND",
-                   oct31_01_02_03MDT, DateUtils.round(oct31_01_02_03_04MDT, Calendar.SECOND));
-
-        assertEquals("Round Calendar.MINUTE",
-                      oct31_01_02MDT, DateUtils.round(oct31_01_02_03_04MDT, Calendar.MINUTE));
-
-        assertEquals("Round Calendar.HOUR_OF_DAY",
-                         oct31_01MDT, DateUtils.round(oct31_01_02_03_04MDT, Calendar.HOUR_OF_DAY));
-
-        assertEquals("Round Calendar.HOUR",
-                         oct31_01MDT, DateUtils.round(oct31_01_02_03_04MDT, Calendar.HOUR));
-
-        assertEquals("Round Calendar.DATE",
-                            oct31MDT, DateUtils.round(oct31_01_02_03_04MDT, Calendar.DATE));
-
-        // restore default time zone
-        TimeZone.setDefault(defaultZone);
-    }
-
-    // http://issues.apache.org/jira/browse/LANG-530
-    @Test
-    public void testLang530() throws ParseException {
-        final Date d = new Date();
-        final String isoDateStr = DateFormatUtils.ISO_DATETIME_TIME_ZONE_FORMAT.format(d);
-        final Date d2 = DateUtils.parseDate(isoDateStr, new String[] { DateFormatUtils.ISO_DATETIME_TIME_ZONE_FORMAT.getPattern() });
-        // the format loses milliseconds so have to reintroduce them
-        assertEquals("Date not equal to itself ISO formatted and parsed", d.getTime(), d2.getTime() + d.getTime() % 1000); 
-    }
-    
-    /**
-     * Tests various values with the ceiling method
-     *
-     * @throws java.lang.Exception so we don't have to catch it
-     */
-    @Test
-    public void testCeil() throws Exception {
-        // test javadoc
-        assertEquals("ceiling javadoc-1 failed",
-                dateTimeParser.parse("March 28, 2002 14:00:00.000"),
-                DateUtils.ceiling(
-                    dateTimeParser.parse("March 28, 2002 13:45:01.231"),
-                Calendar.HOUR));
-        assertEquals("ceiling javadoc-2 failed",
-                dateTimeParser.parse("April 1, 2002 00:00:00.000"),
-                DateUtils.ceiling(
-                    dateTimeParser.parse("March 28, 2002 13:45:01.231"),
-                Calendar.MONTH));
-
-        // tests public static Date ceiling(Date date, int field)
-        assertEquals("ceiling year-1 failed",
-                dateParser.parse("January 1, 2003"),
-                DateUtils.ceiling(date1, Calendar.YEAR));
-        assertEquals("ceiling year-2 failed",
-                dateParser.parse("January 1, 2002"),
-                DateUtils.ceiling(date2, Calendar.YEAR));
-        assertEquals("ceiling month-1 failed",
-                dateParser.parse("March 1, 2002"),
-                DateUtils.ceiling(date1, Calendar.MONTH));
-        assertEquals("ceiling month-2 failed",
-                dateParser.parse("December 1, 2001"),
-                DateUtils.ceiling(date2, Calendar.MONTH));
-        assertEquals("ceiling semimonth-1 failed",
-                dateParser.parse("February 16, 2002"),
-                DateUtils.ceiling(date1, DateUtils.SEMI_MONTH));
-        assertEquals("ceiling semimonth-2 failed",
-                dateParser.parse("December 1, 2001"),
-                DateUtils.ceiling(date2, DateUtils.SEMI_MONTH));
-        assertEquals("ceiling date-1 failed",
-                dateParser.parse("February 13, 2002"),
-                DateUtils.ceiling(date1, Calendar.DATE));
-        assertEquals("ceiling date-2 failed",
-                dateParser.parse("November 19, 2001"),
-                DateUtils.ceiling(date2, Calendar.DATE));
-        assertEquals("ceiling hour-1 failed",
-                dateTimeParser.parse("February 12, 2002 13:00:00.000"),
-                DateUtils.ceiling(date1, Calendar.HOUR));
-        assertEquals("ceiling hour-2 failed",
-                dateTimeParser.parse("November 18, 2001 2:00:00.000"),
-                DateUtils.ceiling(date2, Calendar.HOUR));
-        assertEquals("ceiling minute-1 failed",
-                dateTimeParser.parse("February 12, 2002 12:35:00.000"),
-                DateUtils.ceiling(date1, Calendar.MINUTE));
-        assertEquals("ceiling minute-2 failed",
-                dateTimeParser.parse("November 18, 2001 1:24:00.000"),
-                DateUtils.ceiling(date2, Calendar.MINUTE));
-        assertEquals("ceiling second-1 failed",
-                dateTimeParser.parse("February 12, 2002 12:34:57.000"),
-                DateUtils.ceiling(date1, Calendar.SECOND));
-        assertEquals("ceiling second-2 failed",
-                dateTimeParser.parse("November 18, 2001 1:23:12.000"),
-                DateUtils.ceiling(date2, Calendar.SECOND));
-        assertEquals("ceiling ampm-1 failed",
-                dateTimeParser.parse("February 3, 2002 12:00:00.000"),
-                DateUtils.ceiling(dateAmPm1, Calendar.AM_PM));
-        assertEquals("ceiling ampm-2 failed",
-                dateTimeParser.parse("February 3, 2002 12:00:00.000"),
-                DateUtils.ceiling(dateAmPm2, Calendar.AM_PM));
-        assertEquals("ceiling ampm-3 failed",
-                dateTimeParser.parse("February 4, 2002 00:00:00.000"),
-                DateUtils.ceiling(dateAmPm3, Calendar.AM_PM));
-        assertEquals("ceiling ampm-4 failed",
-                dateTimeParser.parse("February 4, 2002 00:00:00.000"),
-                DateUtils.ceiling(dateAmPm4, Calendar.AM_PM));
-        
-     // tests public static Date ceiling(Object date, int field)
-        assertEquals("ceiling year-1 failed",
-                dateParser.parse("January 1, 2003"),
-                DateUtils.ceiling((Object) date1, Calendar.YEAR));
-        assertEquals("ceiling year-2 failed",
-                dateParser.parse("January 1, 2002"),
-                DateUtils.ceiling((Object) date2, Calendar.YEAR));
-        assertEquals("ceiling month-1 failed",
-                dateParser.parse("March 1, 2002"),
-                DateUtils.ceiling((Object) date1, Calendar.MONTH));
-        assertEquals("ceiling month-2 failed",
-                dateParser.parse("December 1, 2001"),
-                DateUtils.ceiling((Object) date2, Calendar.MONTH));
-        assertEquals("ceiling semimonth-1 failed",
-                dateParser.parse("February 16, 2002"),
-                DateUtils.ceiling((Object) date1, DateUtils.SEMI_MONTH));
-        assertEquals("ceiling semimonth-2 failed",
-                dateParser.parse("December 1, 2001"),
-                DateUtils.ceiling((Object) date2, DateUtils.SEMI_MONTH));
-        assertEquals("ceiling date-1 failed",
-                dateParser.parse("February 13, 2002"),
-                DateUtils.ceiling((Object) date1, Calendar.DATE));
-        assertEquals("ceiling date-2 failed",
-                dateParser.parse("November 19, 2001"),
-                DateUtils.ceiling((Object) date2, Calendar.DATE));
-        assertEquals("ceiling hour-1 failed",
-                dateTimeParser.parse("February 12, 2002 13:00:00.000"),
-                DateUtils.ceiling((Object) date1, Calendar.HOUR));
-        assertEquals("ceiling hour-2 failed",
-                dateTimeParser.parse("November 18, 2001 2:00:00.000"),
-                DateUtils.ceiling((Object) date2, Calendar.HOUR));
-        assertEquals("ceiling minute-1 failed",
-                dateTimeParser.parse("February 12, 2002 12:35:00.000"),
-                DateUtils.ceiling((Object) date1, Calendar.MINUTE));
-        assertEquals("ceiling minute-2 failed",
-                dateTimeParser.parse("November 18, 2001 1:24:00.000"),
-                DateUtils.ceiling((Object) date2, Calendar.MINUTE));
-        assertEquals("ceiling second-1 failed",
-                dateTimeParser.parse("February 12, 2002 12:34:57.000"),
-                DateUtils.ceiling((Object) date1, Calendar.SECOND));
-        assertEquals("ceiling second-2 failed",
-                dateTimeParser.parse("November 18, 2001 1:23:12.000"),
-                DateUtils.ceiling((Object) date2, Calendar.SECOND));
-        assertEquals("ceiling ampm-1 failed",
-                dateTimeParser.parse("February 3, 2002 12:00:00.000"),
-                DateUtils.ceiling((Object) dateAmPm1, Calendar.AM_PM));
-        assertEquals("ceiling ampm-2 failed",
-                dateTimeParser.parse("February 3, 2002 12:00:00.000"),
-                DateUtils.ceiling((Object) dateAmPm2, Calendar.AM_PM));
-        assertEquals("ceiling ampm-3 failed",
-                dateTimeParser.parse("February 4, 2002 00:00:00.000"),
-                DateUtils.ceiling((Object) dateAmPm3, Calendar.AM_PM));
-        assertEquals("ceiling ampm-4 failed",
-                dateTimeParser.parse("February 4, 2002 00:00:00.000"),
-                DateUtils.ceiling((Object) dateAmPm4, Calendar.AM_PM));
-        
-        assertEquals("ceiling calendar second-1 failed",
-                dateTimeParser.parse("February 12, 2002 12:34:57.000"),
-                DateUtils.ceiling((Object) cal1, Calendar.SECOND));
-        assertEquals("ceiling calendar second-2 failed",
-                dateTimeParser.parse("November 18, 2001 1:23:12.000"),
-                DateUtils.ceiling((Object) cal2, Calendar.SECOND));
-        
-        assertEquals("ceiling ampm-1 failed",
-                dateTimeParser.parse("February 3, 2002 12:00:00.000"),
-                DateUtils.ceiling((Object) calAmPm1, Calendar.AM_PM));
-        assertEquals("ceiling ampm-2 failed",
-                dateTimeParser.parse("February 3, 2002 12:00:00.000"),
-                DateUtils.ceiling((Object) calAmPm2, Calendar.AM_PM));
-        assertEquals("ceiling ampm-3 failed",
-                dateTimeParser.parse("February 4, 2002 00:00:00.000"),
-                DateUtils.ceiling((Object) calAmPm3, Calendar.AM_PM));
-        assertEquals("ceiling ampm-4 failed",
-                dateTimeParser.parse("February 4, 2002 00:00:00.000"),
-                DateUtils.ceiling((Object) calAmPm4, Calendar.AM_PM));
-
-        try {
-            DateUtils.ceiling((Date) null, Calendar.SECOND);
-            fail();
-        } catch (final IllegalArgumentException ex) {}
-        try {
-            DateUtils.ceiling((Calendar) null, Calendar.SECOND);
-            fail();
-        } catch (final IllegalArgumentException ex) {}
-        try {
-            DateUtils.ceiling((Object) null, Calendar.SECOND);
-            fail();
-        } catch (final IllegalArgumentException ex) {}
-        try {
-            DateUtils.ceiling("", Calendar.SECOND);
-            fail();
-        } catch (final ClassCastException ex) {}
-        try {
-            DateUtils.ceiling(date1, -9999);
-            fail();
-        } catch(final IllegalArgumentException ex) {}
-
-        
-        // Fix for http://issues.apache.org/bugzilla/show_bug.cgi?id=25560
-        // Test ceiling across the beginning of daylight saving time
-        TimeZone.setDefault(zone);
-        dateTimeParser.setTimeZone(zone);
-
-        assertEquals("ceiling MET date across DST change-over",
-                dateTimeParser.parse("March 31, 2003 00:00:00.000"),
-                DateUtils.ceiling(date4, Calendar.DATE));
-        assertEquals("ceiling MET date across DST change-over",
-                dateTimeParser.parse("March 31, 2003 00:00:00.000"),
-                DateUtils.ceiling((Object) cal4, Calendar.DATE));
-        assertEquals("ceiling MET date across DST change-over",
-                dateTimeParser.parse("March 31, 2003 00:00:00.000"),
-                DateUtils.ceiling(date5, Calendar.DATE));
-        assertEquals("ceiling MET date across DST change-over",
-                dateTimeParser.parse("March 31, 2003 00:00:00.000"),
-                DateUtils.ceiling((Object) cal5, Calendar.DATE));
-        assertEquals("ceiling MET date across DST change-over",
-                dateTimeParser.parse("March 31, 2003 00:00:00.000"),
-                DateUtils.ceiling(date6, Calendar.DATE));
-        assertEquals("ceiling MET date across DST change-over",
-                dateTimeParser.parse("March 31, 2003 00:00:00.000"),
-                DateUtils.ceiling((Object) cal6, Calendar.DATE));
-        assertEquals("ceiling MET date across DST change-over",
-                dateTimeParser.parse("March 31, 2003 00:00:00.000"),
-                DateUtils.ceiling(date7, Calendar.DATE));
-        assertEquals("ceiling MET date across DST change-over",
-                dateTimeParser.parse("March 31, 2003 00:00:00.000"),
-                DateUtils.ceiling((Object) cal7, Calendar.DATE));
-        
-        assertEquals("ceiling MET date across DST change-over",
-                dateTimeParser.parse("March 30, 2003 03:00:00.000"),
-                DateUtils.ceiling(date4, Calendar.HOUR_OF_DAY));
-        assertEquals("ceiling MET date across DST change-over",
-                dateTimeParser.parse("March 30, 2003 03:00:00.000"),
-                DateUtils.ceiling((Object) cal4, Calendar.HOUR_OF_DAY));
-        if (SystemUtils.isJavaVersionAtLeast(JAVA_1_4)) {
-            assertEquals("ceiling MET date across DST change-over",
-                    dateTimeParser.parse("March 30, 2003 03:00:00.000"),
-                    DateUtils.ceiling(date5, Calendar.HOUR_OF_DAY));
-            assertEquals("ceiling MET date across DST change-over",
-                    dateTimeParser.parse("March 30, 2003 03:00:00.000"),
-                    DateUtils.ceiling((Object) cal5, Calendar.HOUR_OF_DAY));
-            assertEquals("ceiling MET date across DST change-over",
-                    dateTimeParser.parse("March 30, 2003 04:00:00.000"),
-                    DateUtils.ceiling(date6, Calendar.HOUR_OF_DAY));
-            assertEquals("ceiling MET date across DST change-over",
-                    dateTimeParser.parse("March 30, 2003 04:00:00.000"),
-                    DateUtils.ceiling((Object) cal6, Calendar.HOUR_OF_DAY));
-            assertEquals("ceiling MET date across DST change-over",
-                    dateTimeParser.parse("March 30, 2003 04:00:00.000"),
-                    DateUtils.ceiling(date7, Calendar.HOUR_OF_DAY));
-            assertEquals("ceiling MET date across DST change-over",
-                    dateTimeParser.parse("March 30, 2003 04:00:00.000"),
-                    DateUtils.ceiling((Object) cal7, Calendar.HOUR_OF_DAY));
-        } else {
-            this.warn("WARNING: Some date ceiling tests not run since the current version is " + SystemUtils.JAVA_SPECIFICATION_VERSION);
-        }
-        TimeZone.setDefault(defaultZone);
-        dateTimeParser.setTimeZone(defaultZone);
-        
-     // Bug 31395, large dates
-        final Date endOfTime = new Date(Long.MAX_VALUE); // fyi: Sun Aug 17 07:12:55 CET 292278994 -- 807 millis
-        final GregorianCalendar endCal = new GregorianCalendar();
-        endCal.setTime(endOfTime);
-        try {
-            DateUtils.ceiling(endCal, Calendar.DATE);
-            fail();
-        } catch (final ArithmeticException ex) {}
-        endCal.set(Calendar.YEAR, 280000001);
-        try {
-            DateUtils.ceiling(endCal, Calendar.DATE);
-            fail();
-        } catch (final ArithmeticException ex) {}
-        endCal.set(Calendar.YEAR, 280000000);
-        final Calendar cal = DateUtils.ceiling(endCal, Calendar.DATE);
-        assertEquals(0, cal.get(Calendar.HOUR));
-    }
-
-    /**
-     * Tests the iterator exceptions
-     *
-     * @throws java.lang.Exception so we don't have to catch it
-     */
-    @Test
-    public void testIteratorEx() throws Exception {
-        try {
-            DateUtils.iterator(Calendar.getInstance(), -9999);
-        } catch (final IllegalArgumentException ex) {}
-        try {
-            DateUtils.iterator((Date) null, DateUtils.RANGE_WEEK_CENTER);
-            fail();
-        } catch (final IllegalArgumentException ex) {}
-        try {
-            DateUtils.iterator((Calendar) null, DateUtils.RANGE_WEEK_CENTER);
-            fail();
-        } catch (final IllegalArgumentException ex) {}
-        try {
-            DateUtils.iterator((Object) null, DateUtils.RANGE_WEEK_CENTER);
-            fail();
-        } catch (final IllegalArgumentException ex) {}
-        try {
-            DateUtils.iterator("", DateUtils.RANGE_WEEK_CENTER);
-            fail();
-        } catch (final ClassCastException ex) {}
-    }
-
-    /**
-     * Tests the calendar iterator for week ranges
-     *
-     * @throws java.lang.Exception so we don't have to catch it
-     */
-    @Test
-    public void testWeekIterator() throws Exception {
-        final Calendar now = Calendar.getInstance();
-        for (int i = 0; i< 7; i++) {
-            final Calendar today = DateUtils.truncate(now, Calendar.DATE);
-            final Calendar sunday = DateUtils.truncate(now, Calendar.DATE);
-            sunday.add(Calendar.DATE, 1 - sunday.get(Calendar.DAY_OF_WEEK));
-            final Calendar monday = DateUtils.truncate(now, Calendar.DATE);
-            if (monday.get(Calendar.DAY_OF_WEEK) == 1) {
-                //This is sunday... roll back 6 days
-                monday.add(Calendar.DATE, -6);
-            } else {
-                monday.add(Calendar.DATE, 2 - monday.get(Calendar.DAY_OF_WEEK));
-            }
-            final Calendar centered = DateUtils.truncate(now, Calendar.DATE);
-            centered.add(Calendar.DATE, -3);
-            
-            Iterator<?> it = DateUtils.iterator(now, DateUtils.RANGE_WEEK_SUNDAY);
-            assertWeekIterator(it, sunday);
-            it = DateUtils.iterator(now, DateUtils.RANGE_WEEK_MONDAY);
-            assertWeekIterator(it, monday);
-            it = DateUtils.iterator(now, DateUtils.RANGE_WEEK_RELATIVE);
-            assertWeekIterator(it, today);
-            it = DateUtils.iterator(now, DateUtils.RANGE_WEEK_CENTER);
-            assertWeekIterator(it, centered);
-            
-            it = DateUtils.iterator((Object) now, DateUtils.RANGE_WEEK_CENTER);
-            assertWeekIterator(it, centered);
-            it = DateUtils.iterator((Object) now.getTime(), DateUtils.RANGE_WEEK_CENTER);
-            assertWeekIterator(it, centered);
-            try {
-                it.next();
-                fail();
-            } catch (final NoSuchElementException ex) {}
-            it = DateUtils.iterator(now, DateUtils.RANGE_WEEK_CENTER);
-            it.next();
-            try {
-                it.remove();
-            } catch( final UnsupportedOperationException ex) {}
-            
-            now.add(Calendar.DATE,1);
-        }
-    }
-            
-    /**
-     * Tests the calendar iterator for month-based ranges
-     *
-     * @throws java.lang.Exception so we don't have to catch it
-     */
-    @Test
-    public void testMonthIterator() throws Exception {
-        Iterator<?> it = DateUtils.iterator(date1, DateUtils.RANGE_MONTH_SUNDAY);
-        assertWeekIterator(it,
-                dateParser.parse("January 27, 2002"),
-                dateParser.parse("March 2, 2002"));
-
-        it = DateUtils.iterator(date1, DateUtils.RANGE_MONTH_MONDAY);
-        assertWeekIterator(it,
-                dateParser.parse("January 28, 2002"),
-                dateParser.parse("March 3, 2002"));
-
-        it = DateUtils.iterator(date2, DateUtils.RANGE_MONTH_SUNDAY);
-        assertWeekIterator(it,
-                dateParser.parse("October 28, 2001"),
-                dateParser.parse("December 1, 2001"));
-
-        it = DateUtils.iterator(date2, DateUtils.RANGE_MONTH_MONDAY);
-        assertWeekIterator(it,
-                dateParser.parse("October 29, 2001"),
-                dateParser.parse("December 2, 2001"));
-    }
-
-    @Test
-    public void testLANG799_EN_OK() throws ParseException {
-        final Locale dflt = Locale.getDefault();
-        Locale.setDefault(Locale.ENGLISH);
-        try {
-            DateUtils.parseDate("Wed, 09 Apr 2008 23:55:38 GMT", "EEE, dd MMM yyyy HH:mm:ss zzz");
-            DateUtils.parseDateStrictly("Wed, 09 Apr 2008 23:55:38 GMT", "EEE, dd MMM yyyy HH:mm:ss zzz");
-        } finally {
-            Locale.setDefault(dflt);            
-        }
-    }
-
-    // Parse German date with English Locale
-    @Test(expected=ParseException.class)
-    public void testLANG799_EN_FAIL() throws ParseException {
-        final Locale dflt = Locale.getDefault();
-        Locale.setDefault(Locale.ENGLISH);
-        try {
-            DateUtils.parseDate("Mi, 09 Apr 2008 23:55:38 GMT", "EEE, dd MMM yyyy HH:mm:ss zzz");
-        } finally {
-            Locale.setDefault(dflt);            
-        }
-    }
-
-    @Test
-    public void testLANG799_DE_OK() throws ParseException {
-        final Locale dflt = Locale.getDefault();
-        Locale.setDefault(Locale.GERMAN);
-        try {
-            DateUtils.parseDate("Mi, 09 Apr 2008 23:55:38 GMT", "EEE, dd MMM yyyy HH:mm:ss zzz");
-            DateUtils.parseDateStrictly("Mi, 09 Apr 2008 23:55:38 GMT", "EEE, dd MMM yyyy HH:mm:ss zzz");
-        } finally {
-            Locale.setDefault(dflt);            
-        }
-    }
-
-    // Parse English date with German Locale
-    @Test(expected=ParseException.class)
-    public void testLANG799_DE_FAIL() throws ParseException {
-        final Locale dflt = Locale.getDefault();
-        Locale.setDefault(Locale.GERMAN);
-        try {
-            DateUtils.parseDate("Wed, 09 Apr 2008 23:55:38 GMT", "EEE, dd MMM yyyy HH:mm:ss zzz");
-        } finally {
-            Locale.setDefault(dflt);            
-        }
-    }
-    
-    // Parse German date with English Locale, specifying German Locale override
-    @Test
-    public void testLANG799_EN_WITH_DE_LOCALE() throws ParseException {
-        final Locale dflt = Locale.getDefault();
-        Locale.setDefault(Locale.ENGLISH);
-        try {
-            DateUtils.parseDate("Mi, 09 Apr 2008 23:55:38 GMT", Locale.GERMAN, "EEE, dd MMM yyyy HH:mm:ss zzz");
-        } finally {
-            Locale.setDefault(dflt);            
-        }
-    }
-    
-    /**
-     * This checks that this is a 7 element iterator of Calendar objects
-     * that are dates (no time), and exactly 1 day spaced after each other.
-     */
-    private static void assertWeekIterator(final Iterator<?> it, final Calendar start) {
-        final Calendar end = (Calendar) start.clone();
-        end.add(Calendar.DATE, 6);
-
-        assertWeekIterator(it, start, end);
-    }
-
-    /**
-     * Convenience method for when working with Date objects
-     */
-    private static void assertWeekIterator(final Iterator<?> it, final Date start, final Date end) {
-        final Calendar calStart = Calendar.getInstance();
-        calStart.setTime(start);
-        final Calendar calEnd = Calendar.getInstance();
-        calEnd.setTime(end);
-
-        assertWeekIterator(it, calStart, calEnd);
-    }
-
-    /**
-     * This checks that this is a 7 divisble iterator of Calendar objects
-     * that are dates (no time), and exactly 1 day spaced after each other
-     * (in addition to the proper start and stop dates)
-     */
-    private static void assertWeekIterator(final Iterator<?> it, final Calendar start, final Calendar end) {
-        Calendar cal = (Calendar) it.next();
-        assertCalendarsEquals("", start, cal, 0);
-        Calendar last = null;
-        int count = 1;
-        while (it.hasNext()) {
-            //Check this is just a date (no time component)
-            assertCalendarsEquals("", cal, DateUtils.truncate(cal, Calendar.DATE), 0);
-
-            last = cal;
-            cal = (Calendar) it.next();
-            count++;
-
-            //Check that this is one day more than the last date
-            last.add(Calendar.DATE, 1);
-            assertCalendarsEquals("", last, cal, 0);
-        }
-        if (count % 7 != 0) {
-            throw new AssertionFailedError("There were " + count + " days in this iterator");
-        }
-        assertCalendarsEquals("", end, cal, 0);
-    }
-
-    /**
-     * Used to check that Calendar objects are close enough
-     * delta is in milliseconds
-     */
-    private static void assertCalendarsEquals(final String message, final Calendar cal1, final Calendar cal2, final long delta) {
-        if (Math.abs(cal1.getTime().getTime() - cal2.getTime().getTime()) > delta) {
-            throw new AssertionFailedError(
-                    message + " expected " + cal1.getTime() + " but got " + cal2.getTime());
-        }
-    }
-
-    void warn(final String msg) {
-        System.err.println(msg);
-    }
-}
-
diff --git a/lang/src/test/java/org/apache/commons/lang3/time/DurationFormatUtilsTest.java b/lang/src/test/java/org/apache/commons/lang3/time/DurationFormatUtilsTest.java
deleted file mode 100644
index 1e83e41..0000000
--- a/lang/src/test/java/org/apache/commons/lang3/time/DurationFormatUtilsTest.java
+++ /dev/null
@@ -1,631 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- * 
- *      http://www.apache.org/licenses/LICENSE-2.0
- * 
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package org.apache.commons.lang3.time;
-
-import static org.junit.Assert.assertArrayEquals;
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertFalse;
-import static org.junit.Assert.assertNotNull;
-import static org.junit.Assert.assertTrue;
-
-import java.lang.reflect.Constructor;
-import java.lang.reflect.Modifier;
-import java.util.Calendar;
-import java.util.TimeZone;
-
-import org.junit.Test;
-
-/**
- * TestCase for DurationFormatUtils.
- * 
- */
-public class DurationFormatUtilsTest {
-
-    // -----------------------------------------------------------------------
-    @Test
-    public void testConstructor() {
-        assertNotNull(new DurationFormatUtils());
-        final Constructor<?>[] cons = DurationFormatUtils.class.getDeclaredConstructors();
-        assertEquals(1, cons.length);
-        assertTrue(Modifier.isPublic(cons[0].getModifiers()));
-        assertTrue(Modifier.isPublic(DurationFormatUtils.class.getModifiers()));
-        assertFalse(Modifier.isFinal(DurationFormatUtils.class.getModifiers()));
-    }
-
-    // -----------------------------------------------------------------------
-    @Test
-    public void testFormatDurationWords() {
-        String text = null;
-
-        text = DurationFormatUtils.formatDurationWords(50 * 1000, true, false);
-        assertEquals("50 seconds", text);
-        text = DurationFormatUtils.formatDurationWords(65 * 1000, true, false);
-        assertEquals("1 minute 5 seconds", text);
-        text = DurationFormatUtils.formatDurationWords(120 * 1000, true, false);
-        assertEquals("2 minutes 0 seconds", text);
-        text = DurationFormatUtils.formatDurationWords(121 * 1000, true, false);
-        assertEquals("2 minutes 1 second", text);
-        text = DurationFormatUtils.formatDurationWords(72 * 60 * 1000, true, false);
-        assertEquals("1 hour 12 minutes 0 seconds", text);
-        text = DurationFormatUtils.formatDurationWords(24 * 60 * 60 * 1000, true, false);
-        assertEquals("1 day 0 hours 0 minutes 0 seconds", text);
-
-        text = DurationFormatUtils.formatDurationWords(50 * 1000, true, true);
-        assertEquals("50 seconds", text);
-        text = DurationFormatUtils.formatDurationWords(65 * 1000, true, true);
-        assertEquals("1 minute 5 seconds", text);
-        text = DurationFormatUtils.formatDurationWords(120 * 1000, true, true);
-        assertEquals("2 minutes", text);
-        text = DurationFormatUtils.formatDurationWords(121 * 1000, true, true);
-        assertEquals("2 minutes 1 second", text);
-        text = DurationFormatUtils.formatDurationWords(72 * 60 * 1000, true, true);
-        assertEquals("1 hour 12 minutes", text);
-        text = DurationFormatUtils.formatDurationWords(24 * 60 * 60 * 1000, true, true);
-        assertEquals("1 day", text);
-
-        text = DurationFormatUtils.formatDurationWords(50 * 1000, false, true);
-        assertEquals("0 days 0 hours 0 minutes 50 seconds", text);
-        text = DurationFormatUtils.formatDurationWords(65 * 1000, false, true);
-        assertEquals("0 days 0 hours 1 minute 5 seconds", text);
-        text = DurationFormatUtils.formatDurationWords(120 * 1000, false, true);
-        assertEquals("0 days 0 hours 2 minutes", text);
-        text = DurationFormatUtils.formatDurationWords(121 * 1000, false, true);
-        assertEquals("0 days 0 hours 2 minutes 1 second", text);
-        text = DurationFormatUtils.formatDurationWords(72 * 60 * 1000, false, true);
-        assertEquals("0 days 1 hour 12 minutes", text);
-        text = DurationFormatUtils.formatDurationWords(24 * 60 * 60 * 1000, false, true);
-        assertEquals("1 day", text);
-
-        text = DurationFormatUtils.formatDurationWords(50 * 1000, false, false);
-        assertEquals("0 days 0 hours 0 minutes 50 seconds", text);
-        text = DurationFormatUtils.formatDurationWords(65 * 1000, false, false);
-        assertEquals("0 days 0 hours 1 minute 5 seconds", text);
-        text = DurationFormatUtils.formatDurationWords(120 * 1000, false, false);
-        assertEquals("0 days 0 hours 2 minutes 0 seconds", text);
-        text = DurationFormatUtils.formatDurationWords(121 * 1000, false, false);
-        assertEquals("0 days 0 hours 2 minutes 1 second", text);
-        text = DurationFormatUtils.formatDurationWords(72 * 60 * 1000, false, false);
-        assertEquals("0 days 1 hour 12 minutes 0 seconds", text);
-        text = DurationFormatUtils.formatDurationWords(24 * 60 * 60 * 1000 + 72 * 60 * 1000, false, false);
-        assertEquals("1 day 1 hour 12 minutes 0 seconds", text);
-        text = DurationFormatUtils.formatDurationWords(2 * 24 * 60 * 60 * 1000 + 72 * 60 * 1000, false, false);
-        assertEquals("2 days 1 hour 12 minutes 0 seconds", text);
-        for (int i = 2; i < 31; i++) {
-            text = DurationFormatUtils.formatDurationWords(i * 24 * 60 * 60 * 1000L, false, false);
-            assertEquals(i + " days 0 hours 0 minutes 0 seconds", text);
-        }
-    }
-
-    /**
-     * Tests that "1 &lt;unit&gt;s" gets converted to "1 &lt;unit&gt;" but that "11 &lt;unit&gt;s" is left alone.
-     */
-    @Test
-    public void testFormatDurationPluralWords() {
-        final long oneSecond = 1000;
-        final long oneMinute = oneSecond * 60;
-        final long oneHour = oneMinute * 60;
-        final long oneDay = oneHour * 24;
-        String text = null;
-
-        text = DurationFormatUtils.formatDurationWords(oneSecond, false, false);
-        assertEquals("0 days 0 hours 0 minutes 1 second", text);
-        text = DurationFormatUtils.formatDurationWords(oneSecond * 2, false, false);
-        assertEquals("0 days 0 hours 0 minutes 2 seconds", text);
-        text = DurationFormatUtils.formatDurationWords(oneSecond * 11, false, false);
-        assertEquals("0 days 0 hours 0 minutes 11 seconds", text);
-
-        text = DurationFormatUtils.formatDurationWords(oneMinute, false, false);
-        assertEquals("0 days 0 hours 1 minute 0 seconds", text);
-        text = DurationFormatUtils.formatDurationWords(oneMinute * 2, false, false);
-        assertEquals("0 days 0 hours 2 minutes 0 seconds", text);
-        text = DurationFormatUtils.formatDurationWords(oneMinute * 11, false, false);
-        assertEquals("0 days 0 hours 11 minutes 0 seconds", text);
-        text = DurationFormatUtils.formatDurationWords(oneMinute + oneSecond, false, false);
-        assertEquals("0 days 0 hours 1 minute 1 second", text);
-
-        text = DurationFormatUtils.formatDurationWords(oneHour, false, false);
-        assertEquals("0 days 1 hour 0 minutes 0 seconds", text);
-        text = DurationFormatUtils.formatDurationWords(oneHour * 2, false, false);
-        assertEquals("0 days 2 hours 0 minutes 0 seconds", text);
-        text = DurationFormatUtils.formatDurationWords(oneHour * 11, false, false);
-        assertEquals("0 days 11 hours 0 minutes 0 seconds", text);
-        text = DurationFormatUtils.formatDurationWords(oneHour + oneMinute + oneSecond, false, false);
-        assertEquals("0 days 1 hour 1 minute 1 second", text);
-
-        text = DurationFormatUtils.formatDurationWords(oneDay, false, false);
-        assertEquals("1 day 0 hours 0 minutes 0 seconds", text);
-        text = DurationFormatUtils.formatDurationWords(oneDay * 2, false, false);
-        assertEquals("2 days 0 hours 0 minutes 0 seconds", text);
-        text = DurationFormatUtils.formatDurationWords(oneDay * 11, false, false);
-        assertEquals("11 days 0 hours 0 minutes 0 seconds", text);
-        text = DurationFormatUtils.formatDurationWords(oneDay + oneHour + oneMinute + oneSecond, false, false);
-        assertEquals("1 day 1 hour 1 minute 1 second", text);
-    }
-
-    @Test(expected = IllegalArgumentException.class)
-    public void testFormatNegativeDurationWords() throws Exception {
-        DurationFormatUtils.formatDurationWords(-5000, true, true);
-    }
-
-    @Test
-    public void testFormatDurationHMS() {
-        long time = 0;
-        assertEquals("00:00:00.000", DurationFormatUtils.formatDurationHMS(time));
-
-        time = 1;
-        assertEquals("00:00:00.001", DurationFormatUtils.formatDurationHMS(time));
-
-        time = 15;
-        assertEquals("00:00:00.015", DurationFormatUtils.formatDurationHMS(time));
-
-        time = 165;
-        assertEquals("00:00:00.165", DurationFormatUtils.formatDurationHMS(time));
-
-        time = 1675;
-        assertEquals("00:00:01.675", DurationFormatUtils.formatDurationHMS(time));
-
-        time = 13465;
-        assertEquals("00:00:13.465", DurationFormatUtils.formatDurationHMS(time));
-
-        time = 72789;
-        assertEquals("00:01:12.789", DurationFormatUtils.formatDurationHMS(time));
-
-        time = 12789 + 32 * 60000;
-        assertEquals("00:32:12.789", DurationFormatUtils.formatDurationHMS(time));
-
-        time = 12789 + 62 * 60000;
-        assertEquals("01:02:12.789", DurationFormatUtils.formatDurationHMS(time));
-    }
-
-    @Test(expected = IllegalArgumentException.class)
-    public void testFormatNegativeDurationHMS() throws Exception {
-        DurationFormatUtils.formatDurationHMS(-5000);
-    }
-
-    @Test
-    public void testFormatDurationISO() {
-        assertEquals("P0Y0M0DT0H0M0.000S", DurationFormatUtils.formatDurationISO(0L));
-        assertEquals("P0Y0M0DT0H0M0.001S", DurationFormatUtils.formatDurationISO(1L));
-        assertEquals("P0Y0M0DT0H0M0.010S", DurationFormatUtils.formatDurationISO(10L));
-        assertEquals("P0Y0M0DT0H0M0.100S", DurationFormatUtils.formatDurationISO(100L));
-        assertEquals("P0Y0M0DT0H1M15.321S", DurationFormatUtils.formatDurationISO(75321L));
-    }
-
-    @Test(expected = IllegalArgumentException.class)
-    public void testFormatNegativeDurationISO() throws Exception {
-        DurationFormatUtils.formatDurationISO(-5000);
-    }
-
-    @Test
-    public void testFormatDuration() {
-        long duration = 0;
-        assertEquals("0", DurationFormatUtils.formatDuration(duration, "y"));
-        assertEquals("0", DurationFormatUtils.formatDuration(duration, "M"));
-        assertEquals("0", DurationFormatUtils.formatDuration(duration, "d"));
-        assertEquals("0", DurationFormatUtils.formatDuration(duration, "H"));
-        assertEquals("0", DurationFormatUtils.formatDuration(duration, "m"));
-        assertEquals("0", DurationFormatUtils.formatDuration(duration, "s"));
-        assertEquals("0", DurationFormatUtils.formatDuration(duration, "S"));
-        assertEquals("0000", DurationFormatUtils.formatDuration(duration, "SSSS"));
-        assertEquals("0000", DurationFormatUtils.formatDuration(duration, "yyyy"));
-        assertEquals("0000", DurationFormatUtils.formatDuration(duration, "yyMM"));
-
-        duration = 60 * 1000;
-        assertEquals("0", DurationFormatUtils.formatDuration(duration, "y"));
-        assertEquals("0", DurationFormatUtils.formatDuration(duration, "M"));
-        assertEquals("0", DurationFormatUtils.formatDuration(duration, "d"));
-        assertEquals("0", DurationFormatUtils.formatDuration(duration, "H"));
-        assertEquals("1", DurationFormatUtils.formatDuration(duration, "m"));
-        assertEquals("60", DurationFormatUtils.formatDuration(duration, "s"));
-        assertEquals("60000", DurationFormatUtils.formatDuration(duration, "S"));
-        assertEquals("01:00", DurationFormatUtils.formatDuration(duration, "mm:ss"));
-
-        final Calendar base = Calendar.getInstance();
-        base.set(2000, 0, 1, 0, 0, 0);
-        base.set(Calendar.MILLISECOND, 0);
-
-        final Calendar cal = Calendar.getInstance();
-        cal.set(2003, 1, 1, 0, 0, 0);
-        cal.set(Calendar.MILLISECOND, 0);
-        duration = cal.getTime().getTime() - base.getTime().getTime(); // duration from 2000-01-01 to cal
-        // don't use 1970 in test as time zones were less reliable in 1970 than now
-        // remember that duration formatting ignores time zones, working on strict hour lengths
-        final int days = 366 + 365 + 365 + 31;
-        assertEquals("0 0 " + days, DurationFormatUtils.formatDuration(duration, "y M d"));
-    }
-
-    @Test(expected = IllegalArgumentException.class)
-    public void testFormatNegativeDuration() throws Exception {
-        DurationFormatUtils.formatDuration(-5000, "S", true);
-    }
-
-    @Test
-    public void testFormatPeriodISO() {
-        final TimeZone timeZone = TimeZone.getTimeZone("GMT-3");
-        final Calendar base = Calendar.getInstance(timeZone);
-        base.set(1970, 0, 1, 0, 0, 0);
-        base.set(Calendar.MILLISECOND, 0);
-
-        final Calendar cal = Calendar.getInstance(timeZone);
-        cal.set(2002, 1, 23, 9, 11, 12);
-        cal.set(Calendar.MILLISECOND, 1);
-        String text;
-        // repeat a test from testDateTimeISO to compare extended and not extended.
-        text = DateFormatUtils.ISO_DATETIME_TIME_ZONE_FORMAT.format(cal);
-        assertEquals("2002-02-23T09:11:12-03:00", text);
-        // test fixture is the same as above, but now with extended format.
-        text = DurationFormatUtils.formatPeriod(base.getTime().getTime(), cal.getTime().getTime(),
-                DurationFormatUtils.ISO_EXTENDED_FORMAT_PATTERN, false, timeZone);
-        assertEquals("P32Y1M22DT9H11M12.001S", text);
-        // test fixture from example in http://www.w3.org/TR/xmlschema-2/#duration
-        cal.set(1971, 1, 3, 10, 30, 0);
-        cal.set(Calendar.MILLISECOND, 0);
-        text = DurationFormatUtils.formatPeriod(base.getTime().getTime(), cal.getTime().getTime(),
-                DurationFormatUtils.ISO_EXTENDED_FORMAT_PATTERN, false, timeZone);
-        assertEquals("P1Y1M2DT10H30M0.000S", text);
-        // want a way to say 'don't print the seconds in format()' or other fields for that matter:
-        // assertEquals("P1Y2M3DT10H30M", text);
-    }
-
-    @Test(expected = IllegalArgumentException.class)
-    public void testFormatPeriodISOStartGreaterEnd() throws Exception {
-        DurationFormatUtils.formatPeriodISO(5000, 2000);
-    }
-
-    @Test
-    public void testFormatPeriodISOMethod() {
-        assertEquals("P0Y0M0DT0H0M0.000S", DurationFormatUtils.formatPeriodISO(0L, 0L));
-        assertEquals("P0Y0M0DT0H0M1.000S", DurationFormatUtils.formatPeriodISO(0L, 1000L));
-        assertEquals("P0Y0M0DT0H1M1.000S", DurationFormatUtils.formatPeriodISO(0L, 61000L));
-    }
-
-    @Test
-    public void testFormatPeriod() {
-        final Calendar cal1970 = Calendar.getInstance();
-        cal1970.set(1970, 0, 1, 0, 0, 0);
-        cal1970.set(Calendar.MILLISECOND, 0);
-        final long time1970 = cal1970.getTime().getTime();
-
-        assertEquals("0", DurationFormatUtils.formatPeriod(time1970, time1970, "y"));
-        assertEquals("0", DurationFormatUtils.formatPeriod(time1970, time1970, "M"));
-        assertEquals("0", DurationFormatUtils.formatPeriod(time1970, time1970, "d"));
-        assertEquals("0", DurationFormatUtils.formatPeriod(time1970, time1970, "H"));
-        assertEquals("0", DurationFormatUtils.formatPeriod(time1970, time1970, "m"));
-        assertEquals("0", DurationFormatUtils.formatPeriod(time1970, time1970, "s"));
-        assertEquals("0", DurationFormatUtils.formatPeriod(time1970, time1970, "S"));
-        assertEquals("0000", DurationFormatUtils.formatPeriod(time1970, time1970, "SSSS"));
-        assertEquals("0000", DurationFormatUtils.formatPeriod(time1970, time1970, "yyyy"));
-        assertEquals("0000", DurationFormatUtils.formatPeriod(time1970, time1970, "yyMM"));
-
-        long time = time1970 + 60 * 1000;
-        assertEquals("0", DurationFormatUtils.formatPeriod(time1970, time, "y"));
-        assertEquals("0", DurationFormatUtils.formatPeriod(time1970, time, "M"));
-        assertEquals("0", DurationFormatUtils.formatPeriod(time1970, time, "d"));
-        assertEquals("0", DurationFormatUtils.formatPeriod(time1970, time, "H"));
-        assertEquals("1", DurationFormatUtils.formatPeriod(time1970, time, "m"));
-        assertEquals("60", DurationFormatUtils.formatPeriod(time1970, time, "s"));
-        assertEquals("60000", DurationFormatUtils.formatPeriod(time1970, time, "S"));
-        assertEquals("01:00", DurationFormatUtils.formatPeriod(time1970, time, "mm:ss"));
-
-        final Calendar cal = Calendar.getInstance();
-        cal.set(1973, 6, 1, 0, 0, 0);
-        cal.set(Calendar.MILLISECOND, 0);
-        time = cal.getTime().getTime();
-        assertEquals("36", DurationFormatUtils.formatPeriod(time1970, time, "yM"));
-        assertEquals("3 years 6 months", DurationFormatUtils.formatPeriod(time1970, time, "y' years 'M' months'"));
-        assertEquals("03/06", DurationFormatUtils.formatPeriod(time1970, time, "yy/MM"));
-
-        cal.set(1973, 10, 1, 0, 0, 0);
-        cal.set(Calendar.MILLISECOND, 0);
-        time = cal.getTime().getTime();
-        assertEquals("310", DurationFormatUtils.formatPeriod(time1970, time, "yM"));
-        assertEquals("3 years 10 months", DurationFormatUtils.formatPeriod(time1970, time, "y' years 'M' months'"));
-        assertEquals("03/10", DurationFormatUtils.formatPeriod(time1970, time, "yy/MM"));
-
-        cal.set(1974, 0, 1, 0, 0, 0);
-        cal.set(Calendar.MILLISECOND, 0);
-        time = cal.getTime().getTime();
-        assertEquals("40", DurationFormatUtils.formatPeriod(time1970, time, "yM"));
-        assertEquals("4 years 0 months", DurationFormatUtils.formatPeriod(time1970, time, "y' years 'M' months'"));
-        assertEquals("04/00", DurationFormatUtils.formatPeriod(time1970, time, "yy/MM"));
-        assertEquals("48", DurationFormatUtils.formatPeriod(time1970, time, "M"));
-        assertEquals("48", DurationFormatUtils.formatPeriod(time1970, time, "MM"));
-        assertEquals("048", DurationFormatUtils.formatPeriod(time1970, time, "MMM"));
-    }
-
-    @Test(expected = IllegalArgumentException.class)
-    public void testFormatPeriodeStartGreaterEnd() throws Exception {
-        DurationFormatUtils.formatPeriod(5000, 2500, "yy/MM");
-    }
-
-    @Test
-    public void testLexx() {
-        // tests each constant
-        assertArrayEquals(new DurationFormatUtils.Token[]{
-            new DurationFormatUtils.Token(DurationFormatUtils.y, 1),
-            new DurationFormatUtils.Token(DurationFormatUtils.M, 1),
-            new DurationFormatUtils.Token(DurationFormatUtils.d, 1),
-            new DurationFormatUtils.Token(DurationFormatUtils.H, 1),
-            new DurationFormatUtils.Token(DurationFormatUtils.m, 1),
-            new DurationFormatUtils.Token(DurationFormatUtils.s, 1),
-            new DurationFormatUtils.Token(DurationFormatUtils.S, 1)}, DurationFormatUtils.lexx("yMdHmsS"));
-
-        // tests the ISO 8601-like
-        assertArrayEquals(new DurationFormatUtils.Token[]{
-            new DurationFormatUtils.Token(DurationFormatUtils.H, 2),
-            new DurationFormatUtils.Token(new StringBuilder(":"), 1),
-            new DurationFormatUtils.Token(DurationFormatUtils.m, 2),
-            new DurationFormatUtils.Token(new StringBuilder(":"), 1),
-            new DurationFormatUtils.Token(DurationFormatUtils.s, 2),
-            new DurationFormatUtils.Token(new StringBuilder("."), 1),
-            new DurationFormatUtils.Token(DurationFormatUtils.S, 3)}, DurationFormatUtils.lexx("HH:mm:ss.SSS"));
-
-        // test the iso extended format
-        assertArrayEquals(new DurationFormatUtils.Token[]{
-            new DurationFormatUtils.Token(new StringBuilder("P"), 1),
-            new DurationFormatUtils.Token(DurationFormatUtils.y, 4),
-            new DurationFormatUtils.Token(new StringBuilder("Y"), 1),
-            new DurationFormatUtils.Token(DurationFormatUtils.M, 1),
-            new DurationFormatUtils.Token(new StringBuilder("M"), 1),
-            new DurationFormatUtils.Token(DurationFormatUtils.d, 1),
-            new DurationFormatUtils.Token(new StringBuilder("DT"), 1),
-            new DurationFormatUtils.Token(DurationFormatUtils.H, 1),
-            new DurationFormatUtils.Token(new StringBuilder("H"), 1),
-            new DurationFormatUtils.Token(DurationFormatUtils.m, 1),
-            new DurationFormatUtils.Token(new StringBuilder("M"), 1),
-            new DurationFormatUtils.Token(DurationFormatUtils.s, 1),
-            new DurationFormatUtils.Token(new StringBuilder("."), 1),
-            new DurationFormatUtils.Token(DurationFormatUtils.S, 3),
-            new DurationFormatUtils.Token(new StringBuilder("S"), 1)}, DurationFormatUtils
-                .lexx(DurationFormatUtils.ISO_EXTENDED_FORMAT_PATTERN));
-
-        // test failures in equals
-        final DurationFormatUtils.Token token = new DurationFormatUtils.Token(DurationFormatUtils.y, 4);
-        assertFalse("Token equal to non-Token class. ", token.equals(new Object()));
-        assertFalse("Token equal to Token with wrong value class. ", token.equals(new DurationFormatUtils.Token(
-                new Object())));
-        assertFalse("Token equal to Token with different count. ", token.equals(new DurationFormatUtils.Token(
-                DurationFormatUtils.y, 1)));
-        final DurationFormatUtils.Token numToken = new DurationFormatUtils.Token(Integer.valueOf(1), 4);
-        assertTrue("Token with Number value not equal to itself. ", numToken.equals(numToken));
-    }
-
-
-    // http://issues.apache.org/bugzilla/show_bug.cgi?id=38401
-    @Test
-    public void testBugzilla38401() {
-        assertEqualDuration( "0000/00/30 16:00:00 000", new int[] { 2006, 0, 26, 18, 47, 34 }, 
-                             new int[] { 2006, 1, 26, 10, 47, 34 }, "yyyy/MM/dd HH:mm:ss SSS");
-    }
-
-    // https://issues.apache.org/jira/browse/LANG-281
-    @Test
-    public void testJiraLang281() {
-        assertEqualDuration( "09", new int[] { 2005, 11, 31, 0, 0, 0 }, 
-                             new int[] { 2006, 9, 6, 0, 0, 0 }, "MM");
-    }
-
-    @Test
-    public void testLANG815() {
-        final Calendar calendar = Calendar.getInstance();
-        calendar.set(2012, 6, 30, 0, 0, 0);
-        final long startMillis = calendar.getTimeInMillis();
-
-        calendar.set(2012, 8, 8);
-        final long endMillis = calendar.getTimeInMillis();
-
-        assertEquals("1 9", DurationFormatUtils.formatPeriod(startMillis, endMillis, "M d"));
-    }
-
-    // Testing the under a day range in DurationFormatUtils.formatPeriod
-    @Test
-    public void testLowDurations() {
-        for(int hr=0; hr < 24; hr++) {
-            for(int min=0; min < 60; min++) {
-                for(int sec=0; sec < 60; sec++) {
-                    assertEqualDuration( hr + ":" + min + ":" + sec, 
-                                         new int[] { 2000, 0, 1, 0, 0, 0, 0 },
-                                         new int[] { 2000, 0, 1, hr, min, sec },
-                                         "H:m:s"
-                                       );
-                }
-            }
-        }
-    }
-
-    // Attempting to test edge cases in DurationFormatUtils.formatPeriod
-    @Test
-    public void testEdgeDurations() {
-        // This test case must use a time zone without DST
-        TimeZone.setDefault(TimeZone.getTimeZone("UTC"));
-        assertEqualDuration( "01", new int[] { 2006, 0, 15, 0, 0, 0 }, 
-                             new int[] { 2006, 2, 10, 0, 0, 0 }, "MM");
-        assertEqualDuration( "12", new int[] { 2005, 0, 15, 0, 0, 0 }, 
-                             new int[] { 2006, 0, 15, 0, 0, 0 }, "MM");
-        assertEqualDuration( "12", new int[] { 2005, 0, 15, 0, 0, 0 }, 
-                             new int[] { 2006, 0, 16, 0, 0, 0 }, "MM");
-        assertEqualDuration( "11", new int[] { 2005, 0, 15, 0, 0, 0 }, 
-                             new int[] { 2006, 0, 14, 0, 0, 0 }, "MM");
-        
-        assertEqualDuration( "01 26", new int[] { 2006, 0, 15, 0, 0, 0 },
-                             new int[] { 2006, 2, 10, 0, 0, 0 }, "MM dd");
-        assertEqualDuration( "54", new int[] { 2006, 0, 15, 0, 0, 0 },
-                             new int[] { 2006, 2, 10, 0, 0, 0 }, "dd"); 
-        
-        assertEqualDuration( "09 12", new int[] { 2006, 1, 20, 0, 0, 0 },
-                             new int[] { 2006, 11, 4, 0, 0, 0 }, "MM dd");
-        assertEqualDuration( "287", new int[] { 2006, 1, 20, 0, 0, 0 },
-                             new int[] { 2006, 11, 4, 0, 0, 0 }, "dd"); 
-
-        assertEqualDuration( "11 30", new int[] { 2006, 0, 2, 0, 0, 0 },
-                             new int[] { 2007, 0, 1, 0, 0, 0 }, "MM dd"); 
-        assertEqualDuration( "364", new int[] { 2006, 0, 2, 0, 0, 0 },
-                             new int[] { 2007, 0, 1, 0, 0, 0 }, "dd"); 
-
-        assertEqualDuration( "12 00", new int[] { 2006, 0, 1, 0, 0, 0 },
-                             new int[] { 2007, 0, 1, 0, 0, 0 }, "MM dd"); 
-        assertEqualDuration( "365", new int[] { 2006, 0, 1, 0, 0, 0 },
-                             new int[] { 2007, 0, 1, 0, 0, 0 }, "dd"); 
-    
-        assertEqualDuration( "31", new int[] { 2006, 0, 1, 0, 0, 0 },
-                new int[] { 2006, 1, 1, 0, 0, 0 }, "dd"); 
-        
-        assertEqualDuration( "92", new int[] { 2005, 9, 1, 0, 0, 0 },
-                new int[] { 2006, 0, 1, 0, 0, 0 }, "dd"); 
-        assertEqualDuration( "77", new int[] { 2005, 9, 16, 0, 0, 0 },
-                new int[] { 2006, 0, 1, 0, 0, 0 }, "dd"); 
-
-        // test month larger in start than end
-        assertEqualDuration( "136", new int[] { 2005, 9, 16, 0, 0, 0 },
-                new int[] { 2006, 2, 1, 0, 0, 0 }, "dd"); 
-        // test when start in leap year
-        assertEqualDuration( "136", new int[] { 2004, 9, 16, 0, 0, 0 },
-                new int[] { 2005, 2, 1, 0, 0, 0 }, "dd"); 
-        // test when end in leap year
-        assertEqualDuration( "137", new int[] { 2003, 9, 16, 0, 0, 0 },
-                new int[] { 2004, 2, 1, 0, 0, 0 }, "dd");         
-        // test when end in leap year but less than end of feb
-        assertEqualDuration( "135", new int[] { 2003, 9, 16, 0, 0, 0 },
-                new int[] { 2004, 1, 28, 0, 0, 0 }, "dd"); 
-
-        assertEqualDuration( "364", new int[] { 2007, 0, 2, 0, 0, 0 },
-                new int[] { 2008, 0, 1, 0, 0, 0 }, "dd"); 
-        assertEqualDuration( "729", new int[] { 2006, 0, 2, 0, 0, 0 },
-                new int[] { 2008, 0, 1, 0, 0, 0 }, "dd"); 
-
-        assertEqualDuration( "365", new int[] { 2007, 2, 2, 0, 0, 0 },
-                new int[] { 2008, 2, 1, 0, 0, 0 }, "dd"); 
-        assertEqualDuration( "333", new int[] { 2007, 1, 2, 0, 0, 0 },
-                new int[] { 2008, 0, 1, 0, 0, 0 }, "dd"); 
-
-        assertEqualDuration( "28", new int[] { 2008, 1, 2, 0, 0, 0 },
-                new int[] { 2008, 2, 1, 0, 0, 0 }, "dd"); 
-        assertEqualDuration( "393", new int[] { 2007, 1, 2, 0, 0, 0 },
-                new int[] { 2008, 2, 1, 0, 0, 0 }, "dd"); 
-
-        assertEqualDuration( "369", new int[] { 2004, 0, 29, 0, 0, 0 },
-                new int[] { 2005, 1, 1, 0, 0, 0 }, "dd"); 
-
-        assertEqualDuration( "338", new int[] { 2004, 1, 29, 0, 0, 0 },
-                new int[] { 2005, 1, 1, 0, 0, 0 }, "dd"); 
-
-        assertEqualDuration( "28", new int[] { 2004, 2, 8, 0, 0, 0 },
-                new int[] { 2004, 3, 5, 0, 0, 0 }, "dd"); 
-
-        assertEqualDuration( "48", new int[] { 1992, 1, 29, 0, 0, 0 },
-                new int[] { 1996, 1, 29, 0, 0, 0 }, "M"); 
-        
-        
-        // this seems odd - and will fail if I throw it in as a brute force 
-        // below as it expects the answer to be 12. It's a tricky edge case
-        assertEqualDuration( "11", new int[] { 1996, 1, 29, 0, 0, 0 },
-                new int[] { 1997, 1, 28, 0, 0, 0 }, "M"); 
-        // again - this seems odd
-        assertEqualDuration( "11 28", new int[] { 1996, 1, 29, 0, 0, 0 },
-                new int[] { 1997, 1, 28, 0, 0, 0 }, "M d"); 
-        
-    }
-
-    @Test
-    public void testLANG984() { // Long durations
-        assertEquals("0", DurationFormatUtils.formatDuration(0, "S"));
-        assertEquals(Integer.toString(Integer.MAX_VALUE), DurationFormatUtils.formatDuration(Integer.MAX_VALUE, "S"));
-        long maxIntPlus=Integer.MAX_VALUE;
-        maxIntPlus++;
-        assertEquals(Long.toString(maxIntPlus), DurationFormatUtils.formatDuration(maxIntPlus, "S"));
-        assertEquals(Long.toString(Long.MAX_VALUE), DurationFormatUtils.formatDuration(Long.MAX_VALUE, "S"));
-    }
-
-    @Test
-    public void testLANG982() { // More than 3 millisecond digits following a second
-        assertEquals("61.999", DurationFormatUtils.formatDuration(61999, "s.S"));
-        assertEquals("1 1999", DurationFormatUtils.formatDuration(61999, "m S"));
-        assertEquals("61.999", DurationFormatUtils.formatDuration(61999, "s.SSS"));
-        assertEquals("1 1999", DurationFormatUtils.formatDuration(61999, "m SSS"));
-        assertEquals("61.0999", DurationFormatUtils.formatDuration(61999, "s.SSSS"));
-        assertEquals("1 1999", DurationFormatUtils.formatDuration(61999, "m SSSS"));
-        assertEquals("61.00999", DurationFormatUtils.formatDuration(61999, "s.SSSSS"));
-        assertEquals("1 01999", DurationFormatUtils.formatDuration(61999, "m SSSSS"));
-    }
-
-    @Test
-    public void testDurationsByBruteForce() {
-        bruteForce(2006, 0, 1, "d", Calendar.DAY_OF_MONTH);
-        bruteForce(2006, 0, 2, "d", Calendar.DAY_OF_MONTH);
-        bruteForce(2007, 1, 2, "d", Calendar.DAY_OF_MONTH);
-        bruteForce(2004, 1, 29, "d", Calendar.DAY_OF_MONTH);
-        bruteForce(1996, 1, 29, "d", Calendar.DAY_OF_MONTH);
-
-        bruteForce(1969, 1, 28, "M", Calendar.MONTH);  // tests for 48 years
-        //bruteForce(1996, 1, 29, "M", Calendar.MONTH);  // this will fail
-    }
-
-    @Test(expected=IllegalArgumentException.class)
-    public void testLANG981() { // unmatched quote char in lexx
-        DurationFormatUtils.lexx("'yMdHms''S");
-    }
-
-    private static final int FOUR_YEARS = 365 * 3 + 366;
-    
-    // Takes a minute to run, so generally turned off
-//    public void testBrutally() {
-//        Calendar c = Calendar.getInstance();
-//        c.set(2004, 0, 1, 0, 0, 0);
-//        for (int i=0; i < FOUR_YEARS; i++) {
-//            bruteForce(c.get(Calendar.YEAR), c.get(Calendar.MONTH), c.get(Calendar.DAY_OF_MONTH), "d", Calendar.DAY_OF_MONTH );
-//            c.add(Calendar.DAY_OF_MONTH, 1);
-//        }
-//    }        
-    
-    private void bruteForce(final int year, final int month, final int day, final String format, final int calendarType) {
-        final String msg = year + "-" + month + "-" + day + " to ";
-        final Calendar c = Calendar.getInstance();
-        c.set(year, month, day, 0, 0, 0);
-        final int[] array1 = new int[] { year, month, day, 0, 0, 0 };
-        final int[] array2 = new int[] { year, month, day, 0, 0, 0 };
-        for (int i=0; i < FOUR_YEARS; i++) {
-            array2[0] = c.get(Calendar.YEAR);
-            array2[1] = c.get(Calendar.MONTH);
-            array2[2] = c.get(Calendar.DAY_OF_MONTH);
-            final String tmpMsg = msg + array2[0] + "-" + array2[1] + "-" + array2[2] + " at ";
-            assertEqualDuration( tmpMsg + i, Integer.toString(i), array1, array2, format );
-            c.add(calendarType, 1);
-        }
-    }
-
-    private void assertEqualDuration(final String expected, final int[] start, final int[] end, final String format) {
-        assertEqualDuration(null, expected, start, end, format);
-    }
-    private void assertEqualDuration(final String message, final String expected, final int[] start, final int[] end, final String format) {
-        final Calendar cal1 = Calendar.getInstance();
-        cal1.set(start[0], start[1], start[2], start[3], start[4], start[5]);
-        cal1.set(Calendar.MILLISECOND, 0);
-        final Calendar cal2 = Calendar.getInstance();
-        cal2.set(end[0], end[1], end[2], end[3], end[4], end[5]);
-        cal2.set(Calendar.MILLISECOND, 0);
-        final long milli1 = cal1.getTime().getTime();
-        final long milli2 = cal2.getTime().getTime();
-        final String result = DurationFormatUtils.formatPeriod(milli1, milli2, format);
-        if (message == null) {
-            assertEquals(expected, result);
-        } else {
-            assertEquals(message, expected, result);
-        }
-    }
-
-}
diff --git a/lang/src/test/java/org/apache/commons/lang3/time/FastDateFormatTest.java b/lang/src/test/java/org/apache/commons/lang3/time/FastDateFormatTest.java
deleted file mode 100644
index fe110e9..0000000
--- a/lang/src/test/java/org/apache/commons/lang3/time/FastDateFormatTest.java
+++ /dev/null
@@ -1,325 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.commons.lang3.time;
-
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertFalse;
-import static org.junit.Assert.assertSame;
-import static org.junit.Assert.assertTrue;
-import static org.junit.Assert.fail;
-
-import java.text.Format;
-import java.text.ParseException;
-import java.text.SimpleDateFormat;
-import java.util.Date;
-import java.util.Locale;
-import java.util.TimeZone;
-import java.util.concurrent.ExecutorService;
-import java.util.concurrent.Executors;
-import java.util.concurrent.TimeUnit;
-import java.util.concurrent.atomic.AtomicInteger;
-import java.util.concurrent.atomic.AtomicLong;
-
-import org.junit.Test;
-
-/**
- * Unit tests {@link org.apache.commons.lang3.time.FastDateFormat}.
- *
- * @since 2.0
- * @version $Id$
- */
-public class FastDateFormatTest {
-
-    /*
-     * Only the cache methods need to be tested here.  
-     * The print methods are tested by {@link FastDateFormat_PrinterTest}
-     * and the parse methods are tested by {@link FastDateFormat_ParserTest}
-     */
-    @Test
-    public void test_getInstance() {
-        final FastDateFormat format1 = FastDateFormat.getInstance();
-        final FastDateFormat format2 = FastDateFormat.getInstance();
-        assertSame(format1, format2);
-    }
-
-    @Test
-    public void test_getInstance_String() {
-        final FastDateFormat format1 = FastDateFormat.getInstance("MM/DD/yyyy");
-        final FastDateFormat format2 = FastDateFormat.getInstance("MM-DD-yyyy");
-        final FastDateFormat format3 = FastDateFormat.getInstance("MM-DD-yyyy");
-
-        assertTrue(format1 != format2); // -- junit 3.8 version -- assertFalse(format1 == format2);
-        assertSame(format2, format3);
-        assertEquals("MM/DD/yyyy", format1.getPattern());
-        assertEquals(TimeZone.getDefault(), format1.getTimeZone());
-        assertEquals(TimeZone.getDefault(), format2.getTimeZone());
-    }
-
-    @Test
-    public void test_getInstance_String_TimeZone() {
-        final Locale realDefaultLocale = Locale.getDefault();
-        final TimeZone realDefaultZone = TimeZone.getDefault();
-        try {
-            Locale.setDefault(Locale.US);
-            TimeZone.setDefault(TimeZone.getTimeZone("America/New_York"));
-
-            final FastDateFormat format1 = FastDateFormat.getInstance("MM/DD/yyyy",
-                    TimeZone.getTimeZone("Atlantic/Reykjavik"));
-            final FastDateFormat format2 = FastDateFormat.getInstance("MM/DD/yyyy");
-            final FastDateFormat format3 = FastDateFormat.getInstance("MM/DD/yyyy", TimeZone.getDefault());
-            final FastDateFormat format4 = FastDateFormat.getInstance("MM/DD/yyyy", TimeZone.getDefault());
-            final FastDateFormat format5 = FastDateFormat.getInstance("MM-DD-yyyy", TimeZone.getDefault());
-            final FastDateFormat format6 = FastDateFormat.getInstance("MM-DD-yyyy");
-
-            assertTrue(format1 != format2); // -- junit 3.8 version -- assertFalse(format1 == format2);
-            assertEquals(TimeZone.getTimeZone("Atlantic/Reykjavik"), format1.getTimeZone());
-            assertEquals(TimeZone.getDefault(), format2.getTimeZone());
-            assertSame(format3, format4);
-            assertTrue(format3 != format5); // -- junit 3.8 version -- assertFalse(format3 == format5);
-            assertTrue(format4 != format6); // -- junit 3.8 version -- assertFalse(format3 == format5);
-
-        } finally {
-            Locale.setDefault(realDefaultLocale);
-            TimeZone.setDefault(realDefaultZone);
-        }
-    }
-
-    @Test
-    public void test_getInstance_String_Locale() {
-        final Locale realDefaultLocale = Locale.getDefault();
-        try {
-            Locale.setDefault(Locale.US);
-            final FastDateFormat format1 = FastDateFormat.getInstance("MM/DD/yyyy", Locale.GERMANY);
-            final FastDateFormat format2 = FastDateFormat.getInstance("MM/DD/yyyy");
-            final FastDateFormat format3 = FastDateFormat.getInstance("MM/DD/yyyy", Locale.GERMANY);
-
-            assertTrue(format1 != format2); // -- junit 3.8 version -- assertFalse(format1 == format2);
-            assertSame(format1, format3);
-            assertEquals(Locale.GERMANY, format1.getLocale());
-
-        } finally {
-            Locale.setDefault(realDefaultLocale);
-        }
-    }
-
-    @Test
-    public void test_changeDefault_Locale_DateInstance() {
-        final Locale realDefaultLocale = Locale.getDefault();
-        try {
-            Locale.setDefault(Locale.US);
-            final FastDateFormat format1 = FastDateFormat.getDateInstance(FastDateFormat.FULL, Locale.GERMANY);
-            final FastDateFormat format2 = FastDateFormat.getDateInstance(FastDateFormat.FULL);
-            Locale.setDefault(Locale.GERMANY);
-            final FastDateFormat format3 = FastDateFormat.getDateInstance(FastDateFormat.FULL);
-
-            assertSame(Locale.GERMANY, format1.getLocale());
-            assertSame(Locale.US, format2.getLocale());
-            assertSame(Locale.GERMANY, format3.getLocale());
-            assertTrue(format1 != format2); // -- junit 3.8 version -- assertFalse(format1 == format2);
-            assertTrue(format2 != format3);
-
-        } finally {
-            Locale.setDefault(realDefaultLocale);
-        }
-    }
-
-    @Test
-    public void test_changeDefault_Locale_DateTimeInstance() {
-        final Locale realDefaultLocale = Locale.getDefault();
-        try {
-            Locale.setDefault(Locale.US);
-            final FastDateFormat format1 = FastDateFormat.getDateTimeInstance(FastDateFormat.FULL, FastDateFormat.FULL, Locale.GERMANY);
-            final FastDateFormat format2 = FastDateFormat.getDateTimeInstance(FastDateFormat.FULL, FastDateFormat.FULL);
-            Locale.setDefault(Locale.GERMANY);
-            final FastDateFormat format3 = FastDateFormat.getDateTimeInstance(FastDateFormat.FULL, FastDateFormat.FULL);
-
-            assertSame(Locale.GERMANY, format1.getLocale());
-            assertSame(Locale.US, format2.getLocale());
-            assertSame(Locale.GERMANY, format3.getLocale());
-            assertTrue(format1 != format2); // -- junit 3.8 version -- assertFalse(format1 == format2);
-            assertTrue(format2 != format3);
-
-        } finally {
-            Locale.setDefault(realDefaultLocale);
-        }
-    }
-
-    @Test
-    public void test_getInstance_String_TimeZone_Locale() {
-        final Locale realDefaultLocale = Locale.getDefault();
-        final TimeZone realDefaultZone = TimeZone.getDefault();
-        try {
-            Locale.setDefault(Locale.US);
-            TimeZone.setDefault(TimeZone.getTimeZone("America/New_York"));
-
-            final FastDateFormat format1 = FastDateFormat.getInstance("MM/DD/yyyy",
-                    TimeZone.getTimeZone("Atlantic/Reykjavik"), Locale.GERMANY);
-            final FastDateFormat format2 = FastDateFormat.getInstance("MM/DD/yyyy", Locale.GERMANY);
-            final FastDateFormat format3 = FastDateFormat.getInstance("MM/DD/yyyy",
-                    TimeZone.getDefault(), Locale.GERMANY);
-
-            assertTrue(format1 != format2); // -- junit 3.8 version -- assertNotSame(format1, format2);
-            assertEquals(TimeZone.getTimeZone("Atlantic/Reykjavik"), format1.getTimeZone());
-            assertEquals(TimeZone.getDefault(), format2.getTimeZone());
-            assertEquals(TimeZone.getDefault(), format3.getTimeZone());
-            assertEquals(Locale.GERMANY, format1.getLocale());
-            assertEquals(Locale.GERMANY, format2.getLocale());
-            assertEquals(Locale.GERMANY, format3.getLocale());
-
-        } finally {
-            Locale.setDefault(realDefaultLocale);
-            TimeZone.setDefault(realDefaultZone);
-        }
-    }       
-
-    @Test
-    public void testCheckDefaults() {
-        final FastDateFormat format = FastDateFormat.getInstance();
-        final FastDateFormat medium = FastDateFormat.getDateTimeInstance(FastDateFormat.SHORT, FastDateFormat.SHORT);
-        assertEquals(medium, format);
-        
-        final SimpleDateFormat sdf = new SimpleDateFormat();
-        assertEquals(sdf.toPattern(), format.getPattern());
-        
-        assertEquals(Locale.getDefault(), format.getLocale());
-        assertEquals(TimeZone.getDefault(), format.getTimeZone());
-    }
-
-    @Test
-    public void testCheckDifferingStyles() {
-        final FastDateFormat shortShort = FastDateFormat.getDateTimeInstance(FastDateFormat.SHORT, FastDateFormat.SHORT, Locale.US);
-        final FastDateFormat shortLong = FastDateFormat.getDateTimeInstance(FastDateFormat.SHORT, FastDateFormat.LONG, Locale.US);
-        final FastDateFormat longShort = FastDateFormat.getDateTimeInstance(FastDateFormat.LONG, FastDateFormat.SHORT, Locale.US);
-        final FastDateFormat longLong = FastDateFormat.getDateTimeInstance(FastDateFormat.LONG, FastDateFormat.LONG, Locale.US);
-        
-        assertFalse(shortShort.equals(shortLong));
-        assertFalse(shortShort.equals(longShort));
-        assertFalse(shortShort.equals(longLong));
-        assertFalse(shortLong.equals(longShort));
-        assertFalse(shortLong.equals(longLong));
-        assertFalse(longShort.equals(longLong));
-    }
-
-    @Test
-    public void testDateDefaults() {
-        assertEquals(FastDateFormat.getDateInstance(FastDateFormat.LONG, Locale.CANADA), 
-                FastDateFormat.getDateInstance(FastDateFormat.LONG, TimeZone.getDefault(), Locale.CANADA));
-        
-        assertEquals(FastDateFormat.getDateInstance(FastDateFormat.LONG, TimeZone.getTimeZone("America/New_York")), 
-                FastDateFormat.getDateInstance(FastDateFormat.LONG, TimeZone.getTimeZone("America/New_York"), Locale.getDefault()));
-
-        assertEquals(FastDateFormat.getDateInstance(FastDateFormat.LONG), 
-                FastDateFormat.getDateInstance(FastDateFormat.LONG, TimeZone.getDefault(), Locale.getDefault()));
-    }
-
-    @Test
-    public void testTimeDefaults() {
-        assertEquals(FastDateFormat.getTimeInstance(FastDateFormat.LONG, Locale.CANADA),
-                FastDateFormat.getTimeInstance(FastDateFormat.LONG, TimeZone.getDefault(), Locale.CANADA));
-
-        assertEquals(FastDateFormat.getTimeInstance(FastDateFormat.LONG, TimeZone.getTimeZone("America/New_York")),
-                FastDateFormat.getTimeInstance(FastDateFormat.LONG, TimeZone.getTimeZone("America/New_York"), Locale.getDefault()));
-
-        assertEquals(FastDateFormat.getTimeInstance(FastDateFormat.LONG),
-                FastDateFormat.getTimeInstance(FastDateFormat.LONG, TimeZone.getDefault(), Locale.getDefault()));
-    }
-
-    @Test
-    public void testTimeDateDefaults() {
-        assertEquals(FastDateFormat.getDateTimeInstance(FastDateFormat.LONG, FastDateFormat.MEDIUM, Locale.CANADA),
-                FastDateFormat.getDateTimeInstance(FastDateFormat.LONG, FastDateFormat.MEDIUM, TimeZone.getDefault(), Locale.CANADA));
-
-        assertEquals(FastDateFormat.getDateTimeInstance(FastDateFormat.LONG, FastDateFormat.MEDIUM, TimeZone.getTimeZone("America/New_York")),
-                FastDateFormat.getDateTimeInstance(FastDateFormat.LONG, FastDateFormat.MEDIUM, TimeZone.getTimeZone("America/New_York"), Locale.getDefault()));
-
-        assertEquals(FastDateFormat.getDateTimeInstance(FastDateFormat.LONG, FastDateFormat.MEDIUM),
-                FastDateFormat.getDateTimeInstance(FastDateFormat.LONG, FastDateFormat.MEDIUM, TimeZone.getDefault(), Locale.getDefault()));
-    }
-
-    /**
-     * According to LANG-954 (https://issues.apache.org/jira/browse/LANG-954) this is broken in Android 2.1.
-     */
-    @Test
-    public void testLang954() {
-        final String pattern = "yyyy-MM-dd'T'";
-        FastDateFormat.getInstance(pattern);
-    }
-
-    @Test
-    public void testParseSync() throws InterruptedException {
-        final String pattern = "yyyy-MM-dd'T'HH:mm:ss.SSS Z";
-        final FastDateFormat formatter= FastDateFormat.getInstance(pattern);
-        
-        final long sdfTime= measureTime(formatter, new SimpleDateFormat(pattern) {
-                        private static final long serialVersionUID = 1L;  // because SimpleDateFormat is serializable
-
-                        @Override
-                        public Object parseObject(final String formattedDate) throws ParseException {
-                            synchronized(this) {
-                                return super.parse(formattedDate);
-                            }
-                        }
-        });
-        
-        final long fdfTime= measureTime(formatter, FastDateFormat.getInstance(pattern));
-        
-        final String times= ">>FastDateFormatTest: FastDateParser:"+fdfTime+"  SimpleDateFormat:"+sdfTime;
-        System.out.println(times);
-    }
-
-    final static private int NTHREADS= 10;
-    final static private int NROUNDS= 10000;
-    
-    private long measureTime(final Format formatter, final Format parser) throws InterruptedException {
-        final ExecutorService pool = Executors.newFixedThreadPool(NTHREADS);
-        final AtomicInteger failures= new AtomicInteger(0);
-        final AtomicLong totalElapsed= new AtomicLong(0);
-        
-        for(int i= 0; i<NTHREADS; ++i) {
-            pool.submit(new Runnable() {
-                @Override
-                public void run() {
-                    for(int j= 0; j<NROUNDS; ++j) {
-                        try {
-                            final Date date= new Date();
-                            final String formattedDate= formatter.format(date);
-                            final long start= System.currentTimeMillis();        
-                            final Object pd= parser.parseObject(formattedDate);
-                            totalElapsed.addAndGet(System.currentTimeMillis()-start);
-                            if(!date.equals(pd)) {
-                                failures.incrementAndGet();
-                            }
-                        } catch (final Exception e) {
-                            failures.incrementAndGet();
-                            e.printStackTrace();
-                        }
-                    }
-                }
-            });
-        }
-        pool.shutdown();
-        // depending on the performance of the machine used to run the parsing,
-        // the tests can run for a while. It should however complete within
-        // 30 seconds. Might need increase on very slow machines.
-        if(!pool.awaitTermination(30, TimeUnit.SECONDS)) {
-            pool.shutdownNow();
-            fail("did not complete tasks");
-        }
-        assertEquals(0, failures.get());
-        return totalElapsed.get();
-    }
-}
diff --git a/lang/src/test/java/org/apache/commons/lang3/time/FastDateFormat_ParserTest.java b/lang/src/test/java/org/apache/commons/lang3/time/FastDateFormat_ParserTest.java
deleted file mode 100644
index bdbff2f..0000000
--- a/lang/src/test/java/org/apache/commons/lang3/time/FastDateFormat_ParserTest.java
+++ /dev/null
@@ -1,33 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.commons.lang3.time;
-
-import java.util.Locale;
-import java.util.TimeZone;
-
-/**
- * Unit tests for the parse methods of FastDateFormat
- *
- * @since 3.2
- */
-public class FastDateFormat_ParserTest extends FastDateParserTest {
-
-    @Override
-    protected DateParser getInstance(final String format, final TimeZone timeZone, final Locale locale) {
-        return FastDateFormat.getInstance(format, timeZone, locale);
-    }
-}
diff --git a/lang/src/test/java/org/apache/commons/lang3/time/FastDateFormat_PrinterTest.java b/lang/src/test/java/org/apache/commons/lang3/time/FastDateFormat_PrinterTest.java
deleted file mode 100644
index 6ab4e22..0000000
--- a/lang/src/test/java/org/apache/commons/lang3/time/FastDateFormat_PrinterTest.java
+++ /dev/null
@@ -1,33 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.commons.lang3.time;
-
-import java.util.Locale;
-import java.util.TimeZone;
-
-/**
- * Unit tests for the print methods of FastDateFormat
- *
- * @since 3.2
- */
-public class FastDateFormat_PrinterTest extends FastDatePrinterTest {
-
-    @Override
-    protected DatePrinter getInstance(final String format, final TimeZone timeZone, final Locale locale) {
-        return FastDateFormat.getInstance(format, timeZone, locale);
-    }
-}
diff --git a/lang/src/test/java/org/apache/commons/lang3/time/FastDateParserSDFTest.java b/lang/src/test/java/org/apache/commons/lang3/time/FastDateParserSDFTest.java
deleted file mode 100644
index bdf5e27..0000000
--- a/lang/src/test/java/org/apache/commons/lang3/time/FastDateParserSDFTest.java
+++ /dev/null
@@ -1,233 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.commons.lang3.time;
-
-import static org.junit.Assert.*;
-
-import java.text.ParseException;
-import java.text.ParsePosition;
-import java.text.SimpleDateFormat;
-import java.util.Arrays;
-import java.util.Collection;
-import java.util.Date;
-import java.util.Locale;
-import java.util.TimeZone;
-
-import org.junit.Ignore;
-import org.junit.Test;
-import org.junit.runner.RunWith;
-import org.junit.runners.Parameterized;
-import org.junit.runners.Parameterized.Parameters;
-
-/**
- * Compare FastDateParser with SimpleDateFormat 
- */
-@RunWith(Parameterized.class)
-public class FastDateParserSDFTest {
-
-    @Parameters(name= "{index}: {0} {1} {2}")
-    public static Collection<Object[]> data() {
-        return Arrays.asList(new Object [][]{
-                // General Time zone tests
-                {"z yyyy", "GMT 2010",       Locale.UK, true}, // no offset specified, but this is allowed as a TimeZone name
-                {"z yyyy", "GMT-123 2010",   Locale.UK, false},
-                {"z yyyy", "GMT-1234 2010",  Locale.UK, false},
-                {"z yyyy", "GMT-12:34 2010", Locale.UK, true},
-                {"z yyyy", "GMT-1:23 2010",  Locale.UK, true},
-                // RFC 822 tests
-                {"z yyyy", "-1234 2010",     Locale.UK, true},
-                {"z yyyy", "-12:34 2010",    Locale.UK, false},
-                {"z yyyy", "-123 2010",      Locale.UK, false},
-                // year tests
-                { "MM/dd/yyyy", "01/11/12",  Locale.UK, true},
-                { "MM/dd/yy", "01/11/12",    Locale.UK, true},
-
-                // LANG-1089
-                { "HH", "00",    Locale.UK, true}, // Hour in day (0-23)
-                { "KK", "00",    Locale.UK, true}, // Hour in am/pm (0-11)
-                { "hh", "00",    Locale.UK, true}, // Hour in am/pm (1-12), i.e. midday/midnight is 12, not 0
-                { "kk", "00",    Locale.UK, true}, // Hour in day (1-24), i.e. midnight is 24, not 0
-
-                { "HH", "01",    Locale.UK, true}, // Hour in day (0-23)
-                { "KK", "01",    Locale.UK, true}, // Hour in am/pm (0-11)
-                { "hh", "01",    Locale.UK, true}, // Hour in am/pm (1-12), i.e. midday/midnight is 12, not 0
-                { "kk", "01",    Locale.UK, true}, // Hour in day (1-24), i.e. midnight is 24, not 0
-
-                { "HH", "11",    Locale.UK, true}, // Hour in day (0-23)
-                { "KK", "11",    Locale.UK, true}, // Hour in am/pm (0-11)
-                { "hh", "11",    Locale.UK, true}, // Hour in am/pm (1-12), i.e. midday/midnight is 12, not 0
-                { "kk", "11",    Locale.UK, true}, // Hour in day (1-24), i.e. midnight is 24, not 0
-
-                { "HH", "12",    Locale.UK, true}, // Hour in day (0-23)
-                { "KK", "12",    Locale.UK, true}, // Hour in am/pm (0-11)
-                { "hh", "12",    Locale.UK, true}, // Hour in am/pm (1-12), i.e. midday/midnight is 12, not 0
-                { "kk", "12",    Locale.UK, true}, // Hour in day (1-24), i.e. midnight is 24, not 0
-
-                { "HH", "13",    Locale.UK, true}, // Hour in day (0-23)
-                { "KK", "13",    Locale.UK, true}, // Hour in am/pm (0-11)
-                { "hh", "13",    Locale.UK, true}, // Hour in am/pm (1-12), i.e. midday/midnight is 12, not 0
-                { "kk", "13",    Locale.UK, true}, // Hour in day (1-24), i.e. midnight is 24, not 0
-
-                { "HH", "23",    Locale.UK, true}, // Hour in day (0-23)
-                { "KK", "23",    Locale.UK, true}, // Hour in am/pm (0-11)
-                { "hh", "23",    Locale.UK, true}, // Hour in am/pm (1-12), i.e. midday/midnight is 12, not 0
-                { "kk", "23",    Locale.UK, true}, // Hour in day (1-24), i.e. midnight is 24, not 0
-
-                { "HH", "24",    Locale.UK, true}, // Hour in day (0-23)
-                { "KK", "24",    Locale.UK, true}, // Hour in am/pm (0-11)
-                { "hh", "24",    Locale.UK, true}, // Hour in am/pm (1-12), i.e. midday/midnight is 12, not 0
-                { "kk", "24",    Locale.UK, true}, // Hour in day (1-24), i.e. midnight is 24, not 0
-
-                { "HH", "25",    Locale.UK, true}, // Hour in day (0-23)
-                { "KK", "25",    Locale.UK, true}, // Hour in am/pm (0-11)
-                { "hh", "25",    Locale.UK, true}, // Hour in am/pm (1-12), i.e. midday/midnight is 12, not 0
-                { "kk", "25",    Locale.UK, true}, // Hour in day (1-24), i.e. midnight is 24, not 0
-
-                { "HH", "48",    Locale.UK, true}, // Hour in day (0-23)
-                { "KK", "48",    Locale.UK, true}, // Hour in am/pm (0-11)
-                { "hh", "48",    Locale.UK, true}, // Hour in am/pm (1-12), i.e. midday/midnight is 12, not 0
-                { "kk", "48",    Locale.UK, true}, // Hour in day (1-24), i.e. midnight is 24, not 0
-                });
-    }
-
-    private final String format;
-    private final String input;
-    private final Locale locale;
-    private final boolean valid;
-    private final TimeZone timeZone = TimeZone.getDefault();
-
-    public FastDateParserSDFTest(String format, String input, Locale locale, boolean valid) {
-        this.format = format;
-        this.input = input;
-        this.locale = locale;
-        this.valid = valid;
-    }
-
-    @Test
-    public void testOriginal() throws Exception {
-        checkParse(input);
-    }
-
-    @Test
-    public void testOriginalPP() throws Exception {
-        checkParsePosition(input);
-    }
-
-    @Test
-    public void testUpperCase() throws Exception {
-        checkParse(input.toUpperCase(locale));
-    }
-
-    @Test
-    public void testUpperCasePP() throws Exception {
-        checkParsePosition(input.toUpperCase(locale));
-    }
-
-    @Test
-    @Ignore // not currently supported
-    public void testLowerCase() throws Exception {
-        checkParse(input.toLowerCase(locale));
-    }
-
-    @Test
-    @Ignore // not currently supported
-    public void testLowerCasePP() throws Exception {
-        checkParsePosition(input.toLowerCase(locale));
-    }
-
-    private void checkParse(final String formattedDate) throws ParseException {
-        final SimpleDateFormat sdf = new SimpleDateFormat(format, locale);
-        sdf.setTimeZone(timeZone);
-        final DateParser fdf = new FastDateParser(format, timeZone, locale);
-        Date expectedTime=null;
-        Class<?> sdfE = null;
-        try {
-            expectedTime = sdf.parse(formattedDate);
-            if (!valid) {
-                // Error in test data
-                throw new RuntimeException("Test data error: expected SDF parse to fail, but got " + expectedTime);
-            }
-        } catch (ParseException e) {
-            if (valid) {
-                // Error in test data
-                throw new RuntimeException("Test data error: expected SDF parse to succeed, but got " + e);
-            }
-            sdfE = e.getClass();
-        }
-        Date actualTime = null;
-        Class<?> fdfE = null;
-        try {
-            actualTime = fdf.parse(formattedDate);
-            if (!valid) {
-                // failure in test
-                fail("Expected FDP parse to fail, but got " + actualTime);
-            }
-        } catch (ParseException e) {
-            if (valid) {
-                // failure in test
-                fail("Expected FDP parse to succeed, but got " + e);
-            }
-            fdfE = e.getClass();
-        }
-        if (valid) {
-            assertEquals(locale.toString()+" "+formattedDate +"\n",expectedTime, actualTime);            
-        } else {
-            assertEquals(locale.toString()+" "+formattedDate + " expected same Exception ", sdfE, fdfE);            
-        }
-    }
-    private void checkParsePosition(final String formattedDate) throws ParseException {
-        final SimpleDateFormat sdf = new SimpleDateFormat(format, locale);
-        sdf.setTimeZone(timeZone);
-        final DateParser fdf = new FastDateParser(format, timeZone, locale);
-
-        ParsePosition sdfP = new ParsePosition(0);
-        Date expectedTime = sdf.parse(formattedDate, sdfP);
-        if (valid) {
-            assertEquals("Expected SDF error index -1 ", -1, sdfP.getErrorIndex());
-            final int endIndex = sdfP.getIndex();
-            final int length = formattedDate.length();
-            if (endIndex != length) {
-                // Error in test data
-                throw new RuntimeException("Test data error: expected SDF parse to consume entire string; endindex " + endIndex + " != " + length);                
-            }
-        } else {
-            final int errorIndex = sdfP.getErrorIndex();
-            if (errorIndex == -1) {
-                throw new RuntimeException("Test data error: expected SDF parse to fail, but got " + expectedTime);                
-            }
-        }
-
-        final ParsePosition fdfP = new ParsePosition(0);
-        Date actualTime = fdf.parse(formattedDate, fdfP);
-        final int fdferrorIndex = fdfP.getErrorIndex();
-        if (valid) {
-            assertEquals("Expected FDF error index -1 ", -1, fdferrorIndex);
-            final int endIndex = fdfP.getIndex();
-            final int length = formattedDate.length();
-            assertEquals("Expected FDF to parse full string " + fdfP, length, endIndex);
-            assertEquals(locale.toString()+" "+formattedDate +"\n",expectedTime, actualTime);            
-        } else {
-            final int endIndex = fdfP.getIndex();
-            if (endIndex != -0) {
-                fail("Expected FDF parse to fail, but got " + fdfP);                
-            }
-            if (fdferrorIndex != -1) {
-                assertEquals("FDF error index should match SDF index (if it is set)", sdfP.getErrorIndex(), fdferrorIndex);
-            }
-        }        
-    }
-}
diff --git a/lang/src/test/java/org/apache/commons/lang3/time/FastDateParserTest.java b/lang/src/test/java/org/apache/commons/lang3/time/FastDateParserTest.java
deleted file mode 100644
index 1760a92..0000000
--- a/lang/src/test/java/org/apache/commons/lang3/time/FastDateParserTest.java
+++ /dev/null
@@ -1,619 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional inparserion regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.commons.lang3.time;
-
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertFalse;
-import static org.junit.Assert.assertTrue;
-
-import java.io.Serializable;
-import java.text.ParseException;
-import java.text.SimpleDateFormat;
-import java.util.Calendar;
-import java.util.Date;
-import java.util.GregorianCalendar;
-import java.util.HashMap;
-import java.util.Locale;
-import java.util.Map;
-import java.util.TimeZone;
-
-import org.apache.commons.lang3.SerializationUtils;
-import org.junit.Assert;
-import org.junit.Test;
-
-/**
- * Unit tests {@link org.apache.commons.lang3.time.FastDateParser}.
- *
- * @version $Id$
- * @since 3.2
- */
-public class FastDateParserTest {
-    private static final String SHORT_FORMAT_NOERA = "y/M/d/h/a/m/s/E/Z";
-    private static final String LONG_FORMAT_NOERA = "yyyy/MMMM/dddd/hhhh/mmmm/ss/aaaa/EEEE/ZZZZ";
-    private static final String SHORT_FORMAT = "G/" + SHORT_FORMAT_NOERA;
-    private static final String LONG_FORMAT = "GGGG/" + LONG_FORMAT_NOERA;
-
-    private static final String yMdHmsSZ = "yyyy-MM-dd'T'HH:mm:ss.SSS Z";
-    private static final String DMY_DOT = "dd.MM.yyyy";
-    private static final String YMD_SLASH = "yyyy/MM/dd";
-    private static final String MDY_DASH = "MM-DD-yyyy";
-    private static final String MDY_SLASH = "MM/DD/yyyy";
-
-    private static final TimeZone REYKJAVIK = TimeZone.getTimeZone("Atlantic/Reykjavik");
-    private static final TimeZone NEW_YORK = TimeZone.getTimeZone("America/New_York");
-    private static final TimeZone GMT = TimeZone.getTimeZone("GMT");
-    private static final TimeZone INDIA = TimeZone.getTimeZone("Asia/Calcutta");
-
-    private static final Locale SWEDEN = new Locale("sv", "SE");
-
-    DateParser getInstance(final String format) {
-        return getInstance(format, TimeZone.getDefault(), Locale.getDefault());
-    }
-
-    private DateParser getDateInstance(final int dateStyle, final Locale locale) {
-        return getInstance(FormatCache.getPatternForStyle(Integer.valueOf(dateStyle), null, locale), TimeZone.getDefault(), Locale.getDefault());
-    }
-
-    private DateParser getInstance(final String format, final Locale locale) {
-        return getInstance(format, TimeZone.getDefault(), locale);
-    }
-
-    private DateParser getInstance(final String format, final TimeZone timeZone) {
-        return getInstance(format, timeZone, Locale.getDefault());
-    }
-
-    /**
-     * Override this method in derived tests to change the construction of instances
-     *
-     * @param format the format string to use
-     * @param timeZone the time zone to use
-     * @param locale the locale to use
-     *
-     * @return the DateParser instance to use for testing
-     */
-    protected DateParser getInstance(final String format, final TimeZone timeZone, final Locale locale) {
-        return new FastDateParser(format, timeZone, locale, null);
-    }
-
-    @Test
-    public void test_Equality_Hash() {
-        final DateParser[] parsers= {
-            getInstance(yMdHmsSZ, NEW_YORK, Locale.US),
-            getInstance(DMY_DOT, NEW_YORK, Locale.US),
-            getInstance(YMD_SLASH, NEW_YORK, Locale.US),
-            getInstance(MDY_DASH, NEW_YORK, Locale.US),
-            getInstance(MDY_SLASH, NEW_YORK, Locale.US),
-            getInstance(MDY_SLASH, REYKJAVIK, Locale.US),
-            getInstance(MDY_SLASH, REYKJAVIK, SWEDEN)
-        };
-
-        final Map<DateParser,Integer> map= new HashMap<DateParser,Integer>();
-        int i= 0;
-        for(final DateParser parser:parsers) {
-            map.put(parser, Integer.valueOf(i++));
-        }
-
-        i= 0;
-        for(final DateParser parser:parsers) {
-            assertEquals(i++, map.get(parser).intValue());
-        }
-    }
-
-    @Test
-    public void testParseZone() throws ParseException {
-        final Calendar cal= Calendar.getInstance(NEW_YORK, Locale.US);
-        cal.clear();
-        cal.set(2003, 6, 10, 16, 33, 20);
-
-        final DateParser fdf = getInstance(yMdHmsSZ, NEW_YORK, Locale.US);
-
-        assertEquals(cal.getTime(), fdf.parse("2003-07-10T15:33:20.000 -0500"));
-        assertEquals(cal.getTime(), fdf.parse("2003-07-10T15:33:20.000 GMT-05:00"));
-        assertEquals(cal.getTime(), fdf.parse("2003-07-10T16:33:20.000 Eastern Daylight Time"));
-        assertEquals(cal.getTime(), fdf.parse("2003-07-10T16:33:20.000 EDT"));
-
-        cal.setTimeZone(TimeZone.getTimeZone("GMT-3"));
-        cal.set(2003, 1, 10, 9, 0, 0);
-
-        assertEquals(cal.getTime(), fdf.parse("2003-02-10T09:00:00.000 -0300"));
-
-        cal.setTimeZone(TimeZone.getTimeZone("GMT+5"));
-        cal.set(2003, 1, 10, 15, 5, 6);
-
-        assertEquals(cal.getTime(), fdf.parse("2003-02-10T15:05:06.000 +0500"));
-    }
-
-    @Test
-    public void testParseLongShort() throws ParseException {
-        final Calendar cal= Calendar.getInstance(NEW_YORK, Locale.US);
-        cal.clear();
-        cal.set(2003, 1, 10, 15, 33, 20);
-        cal.set(Calendar.MILLISECOND, 989);
-        cal.setTimeZone(NEW_YORK);
-
-        DateParser fdf = getInstance("yyyy GGGG MMMM dddd aaaa EEEE HHHH mmmm ssss SSSS ZZZZ", NEW_YORK, Locale.US);
-
-        assertEquals(cal.getTime(), fdf.parse("2003 AD February 0010 PM Monday 0015 0033 0020 0989 GMT-05:00"));
-        cal.set(Calendar.ERA, GregorianCalendar.BC);
-
-        final Date parse = fdf.parse("2003 BC February 0010 PM Saturday 0015 0033 0020 0989 GMT-05:00");
-                assertEquals(cal.getTime(), parse);
-
-        fdf = getInstance("y G M d a E H m s S Z", NEW_YORK, Locale.US);
-        assertEquals(cal.getTime(), fdf.parse("03 BC 2 10 PM Sat 15 33 20 989 -0500"));
-
-        cal.set(Calendar.ERA, GregorianCalendar.AD);
-        assertEquals(cal.getTime(), fdf.parse("03 AD 2 10 PM Saturday 15 33 20 989 -0500"));
-    }
-
-    @Test
-    public void testAmPm() throws ParseException {
-        final Calendar cal= Calendar.getInstance(NEW_YORK, Locale.US);
-        cal.clear();
-
-        final DateParser h = getInstance("yyyy-MM-dd hh a mm:ss", NEW_YORK, Locale.US);
-        final DateParser K = getInstance("yyyy-MM-dd KK a mm:ss", NEW_YORK, Locale.US);
-        final DateParser k = getInstance("yyyy-MM-dd kk:mm:ss", NEW_YORK, Locale.US);
-        final DateParser H = getInstance("yyyy-MM-dd HH:mm:ss", NEW_YORK, Locale.US);
-
-        cal.set(2010, 7, 1, 0, 33, 20);
-        assertEquals(cal.getTime(), h.parse("2010-08-01 12 AM 33:20"));
-        assertEquals(cal.getTime(), K.parse("2010-08-01 0 AM 33:20"));
-        assertEquals(cal.getTime(), k.parse("2010-08-01 00:33:20"));
-        assertEquals(cal.getTime(), H.parse("2010-08-01 00:33:20"));
-
-        cal.set(2010, 7, 1, 3, 33, 20);
-        assertEquals(cal.getTime(), h.parse("2010-08-01 3 AM 33:20"));
-        assertEquals(cal.getTime(), K.parse("2010-08-01 3 AM 33:20"));
-        assertEquals(cal.getTime(), k.parse("2010-08-01 03:33:20"));
-        assertEquals(cal.getTime(), H.parse("2010-08-01 03:33:20"));
-
-        cal.set(2010, 7, 1, 15, 33, 20);
-        assertEquals(cal.getTime(), h.parse("2010-08-01 3 PM 33:20"));
-        assertEquals(cal.getTime(), K.parse("2010-08-01 3 PM 33:20"));
-        assertEquals(cal.getTime(), k.parse("2010-08-01 15:33:20"));
-        assertEquals(cal.getTime(), H.parse("2010-08-01 15:33:20"));
-
-        cal.set(2010, 7, 1, 12, 33, 20);
-        assertEquals(cal.getTime(), h.parse("2010-08-01 12 PM 33:20"));
-        assertEquals(cal.getTime(), K.parse("2010-08-01 0 PM 33:20"));
-        assertEquals(cal.getTime(), k.parse("2010-08-01 12:33:20"));
-        assertEquals(cal.getTime(), H.parse("2010-08-01 12:33:20"));
-    }
-
-    private Calendar getEraStart(int year, final TimeZone zone, final Locale locale) {
-        final Calendar cal = Calendar.getInstance(zone, locale);
-        cal.clear();
-
-        // http://docs.oracle.com/javase/6/docs/technotes/guides/intl/calendar.doc.html
-        if (locale.equals(FastDateParser.JAPANESE_IMPERIAL)) {
-            if(year < 1868) {
-                cal.set(Calendar.ERA, 0);
-                cal.set(Calendar.YEAR, 1868-year);
-            }
-        }
-        else {
-            if (year < 0) {
-                cal.set(Calendar.ERA, GregorianCalendar.BC);
-                year= -year;
-            }
-            cal.set(Calendar.YEAR, year/100 * 100);
-        }
-        return cal;
-    }
-
-    private void validateSdfFormatFdpParseEquality(final String format, final Locale locale, final TimeZone tz, final DateParser fdp, final Date in, final int year, final Date cs) throws ParseException {
-        final SimpleDateFormat sdf = new SimpleDateFormat(format, locale);
-        if (format.equals(SHORT_FORMAT)) {
-            sdf.set2DigitYearStart( cs );
-        }
-        final String fmt = sdf.format(in);
-        try {
-            final Date out = fdp.parse(fmt);
-            assertEquals(locale.toString()+" "+in+" "+ format+ " "+tz.getID(), in, out);
-        } catch (final ParseException pe) {
-            if (year >= 1868 || !locale.getCountry().equals("JP")) {// LANG-978
-                throw pe;
-            }
-        }
-    }
-
-    @Test
-    // Check that all Locales can parse the formats we use
-    public void testParses() throws Exception {
-        for(final String format : new String[]{LONG_FORMAT, SHORT_FORMAT}) {
-            for(final Locale locale : Locale.getAvailableLocales()) {
-                for(final TimeZone tz :  new TimeZone[]{NEW_YORK, REYKJAVIK, GMT}) {
-                     for(final int year : new int[]{2003, 1940, 1868, 1867, 1, -1, -1940}) {
-                        final Calendar cal= getEraStart(year, tz, locale);
-                        final Date centuryStart= cal.getTime();
-
-                        cal.set(Calendar.MONTH, 1);
-                        cal.set(Calendar.DAY_OF_MONTH, 10);
-                        final Date in= cal.getTime();
-
-                        final FastDateParser fdp= new FastDateParser(format, tz, locale, centuryStart);
-                        validateSdfFormatFdpParseEquality(format, locale, tz, fdp, in, year, centuryStart);
-                    }
-                }
-            }
-        }
-    }
-
-    @Test
-    public void testLocales_Long_AD() throws Exception {
-        testLocales(LONG_FORMAT, false);
-    }
-
-    @Test
-    public void testLocales_Long_BC() throws Exception {
-        testLocales(LONG_FORMAT, true);
-    }
-
-    @Test
-    public void testLocales_Short_AD() throws Exception {
-        testLocales(SHORT_FORMAT, false);
-    }
-
-    @Test
-    public void testLocales_Short_BC() throws Exception {
-        testLocales(SHORT_FORMAT, true);
-    }
-
-    @Test
-    public void testLocales_LongNoEra_AD() throws Exception {
-        testLocales(LONG_FORMAT_NOERA, false);
-    }
-
-    @Test
-    public void testLocales_LongNoEra_BC() throws Exception {
-        testLocales(LONG_FORMAT_NOERA, true);
-    }
-
-    @Test
-    public void testLocales_ShortNoEra_AD() throws Exception {
-        testLocales(SHORT_FORMAT_NOERA, false);
-    }
-
-    @Test
-    public void testLocales_ShortNoEra_BC() throws Exception {
-        testLocales(SHORT_FORMAT_NOERA, true);
-    }
-
-    private void testLocales(final String format, final boolean eraBC) throws Exception {
-
-        final Calendar cal= Calendar.getInstance(GMT);
-        cal.clear();
-        cal.set(2003, 1, 10);
-        if (eraBC) {
-            cal.set(Calendar.ERA, GregorianCalendar.BC);
-        }
-        for(final Locale locale : Locale.getAvailableLocales()) {
-            // ja_JP_JP cannot handle dates before 1868 properly
-            if (eraBC && locale.equals(FastDateParser.JAPANESE_IMPERIAL)) {
-                continue;
-            }
-            final SimpleDateFormat sdf = new SimpleDateFormat(format, locale);
-            final DateParser fdf = getInstance(format, locale);
-
-            try {
-                checkParse(locale, cal, sdf, fdf);
-            } catch(final ParseException ex) {
-                Assert.fail("Locale "+locale+ " failed with "+format+" era "+(eraBC?"BC":"AD")+"\n" + trimMessage(ex.toString()));
-            }
-        }
-    }
-
-    private String trimMessage(final String msg) {
-        if (msg.length() < 100) {
-            return msg;
-        }
-        final int gmt = msg.indexOf("(GMT");
-        if (gmt > 0) {
-            return msg.substring(0, gmt+4)+"...)";
-        }
-        return msg.substring(0, 100)+"...";
-    }
-
-    private void checkParse(final Locale locale, final Calendar cal, final SimpleDateFormat sdf, final DateParser fdf) throws ParseException {
-        final String formattedDate= sdf.format(cal.getTime());
-        checkParse(locale, sdf, fdf, formattedDate);
-        checkParse(locale, sdf, fdf, formattedDate.toLowerCase(locale));
-        checkParse(locale, sdf, fdf, formattedDate.toUpperCase(locale));
-    }
-
-    private void checkParse(final Locale locale, final SimpleDateFormat sdf, final DateParser fdf, final String formattedDate) throws ParseException {
-        final Date expectedTime = sdf.parse(formattedDate);
-        final Date actualTime = fdf.parse(formattedDate);
-        assertEquals(locale.toString()+" "+formattedDate +"\n",expectedTime, actualTime);
-    }
-
-    @Test
-    public void testParseNumerics() throws ParseException {
-        final Calendar cal= Calendar.getInstance(NEW_YORK, Locale.US);
-        cal.clear();
-        cal.set(2003, 1, 10, 15, 33, 20);
-        cal.set(Calendar.MILLISECOND, 989);
-
-        final DateParser fdf = getInstance("yyyyMMddHHmmssSSS", NEW_YORK, Locale.US);
-        assertEquals(cal.getTime(), fdf.parse("20030210153320989"));
-    }
-
-    @Test
-    public void testQuotes() throws ParseException {
-        final Calendar cal= Calendar.getInstance(NEW_YORK, Locale.US);
-        cal.clear();
-        cal.set(2003, 1, 10, 15, 33, 20);
-        cal.set(Calendar.MILLISECOND, 989);
-
-        final DateParser fdf = getInstance("''yyyyMMdd'A''B'HHmmssSSS''", NEW_YORK, Locale.US);
-        assertEquals(cal.getTime(), fdf.parse("'20030210A'B153320989'"));
-    }
-
-    @Test
-    public void testSpecialCharacters() throws Exception {
-        testSdfAndFdp("q" ,"", true); // bad pattern character (at present)
-        testSdfAndFdp("Q" ,"", true); // bad pattern character
-        testSdfAndFdp("$" ,"$", false); // OK
-        testSdfAndFdp("?.d" ,"?.12", false); // OK
-        testSdfAndFdp("''yyyyMMdd'A''B'HHmmssSSS''", "'20030210A'B153320989'", false); // OK
-        testSdfAndFdp("''''yyyyMMdd'A''B'HHmmssSSS''", "''20030210A'B153320989'", false); // OK
-        testSdfAndFdp("'$\\Ed'" ,"$\\Ed", false); // OK
-        
-        // quoted charaters are case sensitive
-        testSdfAndFdp("'QED'", "QED", false);
-        testSdfAndFdp("'QED'", "qed", true);
-        // case sensitive after insensitive Month field
-        testSdfAndFdp("yyyy-MM-dd 'QED'", "2003-02-10 QED", false);
-        testSdfAndFdp("yyyy-MM-dd 'QED'", "2003-02-10 qed", true);
-    }
-    
-    @Test
-    public void testLANG_832() throws Exception {
-        testSdfAndFdp("'d'd" ,"d3", false); // OK
-        testSdfAndFdp("'d'd'","d3", true); // should fail (unterminated quote)
-    }
-
-    @Test
-    public void testLANG_831() throws Exception {
-        testSdfAndFdp("M E","3  Tue", true);
-    }
-
-    private void testSdfAndFdp(final String format, final String date, final boolean shouldFail)
-            throws Exception {
-        Date dfdp = null;
-        Date dsdf = null;
-        Throwable f = null;
-        Throwable s = null;
-
-        try {
-            final SimpleDateFormat sdf = new SimpleDateFormat(format, Locale.US);
-            sdf.setTimeZone(NEW_YORK);
-            dsdf = sdf.parse(date);
-            if (shouldFail) {
-                Assert.fail("Expected SDF failure, but got " + dsdf + " for ["+format+","+date+"]");
-            }
-        } catch (final Exception e) {
-            s = e;
-            if (!shouldFail) {
-                throw e;
-            }
-        }
-
-        try {
-            final DateParser fdp = getInstance(format, NEW_YORK, Locale.US);
-            dfdp = fdp.parse(date);
-            if (shouldFail) {
-                Assert.fail("Expected FDF failure, but got " + dfdp + " for ["+format+","+date+"] using "+((FastDateParser)fdp).getParsePattern());
-            }
-        } catch (final Exception e) {
-            f = e;
-            if (!shouldFail) {
-                throw e;
-            }
-        }
-        // SDF and FDF should produce equivalent results
-        assertTrue("Should both or neither throw Exceptions", (f==null)==(s==null));
-        assertEquals("Parsed dates should be equal", dsdf, dfdp);
-    }
-
-    @Test
-    public void testDayOf() throws ParseException {
-        final Calendar cal= Calendar.getInstance(NEW_YORK, Locale.US);
-        cal.clear();
-        cal.set(2003, 1, 10);
-
-        final DateParser fdf = getInstance("W w F D y", NEW_YORK, Locale.US);
-        assertEquals(cal.getTime(), fdf.parse("3 7 2 41 03"));
-    }
-
-    /**
-     * Test case for {@link FastDateParser#FastDateParser(String, TimeZone, Locale)}.
-     * @throws ParseException so we don't have to catch it
-     */
-    @Test
-    public void testShortDateStyleWithLocales() throws ParseException {
-        DateParser fdf = getDateInstance(FastDateFormat.SHORT, Locale.US);
-        final Calendar cal = Calendar.getInstance();
-        cal.clear();
-
-        cal.set(2004, 1, 3);
-        assertEquals(cal.getTime(), fdf.parse("2/3/04"));
-
-        fdf = getDateInstance(FastDateFormat.SHORT, SWEDEN);
-        assertEquals(cal.getTime(), fdf.parse("2004-02-03"));
-    }
-
-    /**
-     * Tests that pre-1000AD years get padded with yyyy
-     * @throws ParseException so we don't have to catch it
-     */
-    @Test
-    public void testLowYearPadding() throws ParseException {
-        final DateParser parser = getInstance(YMD_SLASH);
-        final Calendar cal = Calendar.getInstance();
-        cal.clear();
-
-        cal.set(1,0,1);
-        assertEquals(cal.getTime(), parser.parse("0001/01/01"));
-        cal.set(10,0,1);
-        assertEquals(cal.getTime(), parser.parse("0010/01/01"));
-        cal.set(100,0,1);
-        assertEquals(cal.getTime(), parser.parse("0100/01/01"));
-        cal.set(999,0,1);
-        assertEquals(cal.getTime(), parser.parse("0999/01/01"));
-    }
-
-    @Test
-    public void testMilleniumBug() throws ParseException {
-        final DateParser parser = getInstance(DMY_DOT);
-        final Calendar cal = Calendar.getInstance();
-        cal.clear();
-
-        cal.set(1000,0,1);
-        assertEquals(cal.getTime(), parser.parse("01.01.1000"));
-    }
-
-    @Test
-    public void testLang303() throws ParseException {
-        DateParser parser = getInstance(YMD_SLASH);
-        final Calendar cal = Calendar.getInstance();
-        cal.set(2004, 11, 31);
-
-        final Date date = parser.parse("2004/11/31");
-
-        parser = SerializationUtils.deserialize(SerializationUtils.serialize((Serializable) parser));
-        assertEquals(date, parser.parse("2004/11/31"));
-    }
-
-    @Test
-    public void testLang538() throws ParseException {
-        final DateParser parser = getInstance("yyyy-MM-dd'T'HH:mm:ss.SSS'Z'", GMT);
-
-        final Calendar cal = Calendar.getInstance(TimeZone.getTimeZone("GMT-8"));
-        cal.clear();
-        cal.set(2009, 9, 16, 8, 42, 16);
-
-        assertEquals(cal.getTime(), parser.parse("2009-10-16T16:42:16.000Z"));
-    }
-
-    @Test
-    public void testEquals() {
-        final DateParser parser1= getInstance(YMD_SLASH);
-        final DateParser parser2= getInstance(YMD_SLASH);
-
-        assertEquals(parser1, parser2);
-        assertEquals(parser1.hashCode(), parser2.hashCode());
-
-        assertFalse(parser1.equals(new Object()));
-    }
-
-    @Test
-    public void testToStringContainsName() {
-        final DateParser parser= getInstance(YMD_SLASH);
-        assertTrue(parser.toString().startsWith("FastDate"));
-    }
-
-    @Test
-    public void testPatternMatches() {
-        final DateParser parser= getInstance(yMdHmsSZ);
-        assertEquals(yMdHmsSZ, parser.getPattern());
-    }
-
-    @Test
-    public void testLocaleMatches() {
-        final DateParser parser= getInstance(yMdHmsSZ, SWEDEN);
-        assertEquals(SWEDEN, parser.getLocale());
-    }
-
-    @Test
-    public void testTimeZoneMatches() {
-        final DateParser parser= getInstance(yMdHmsSZ, REYKJAVIK);
-        assertEquals(REYKJAVIK, parser.getTimeZone());
-    }
-    
-    @Test
-    public void testLang996() throws ParseException {
-        final Calendar expected = Calendar.getInstance(NEW_YORK, Locale.US);
-        expected.clear();
-        expected.set(2014, 4, 14);
-
-        final DateParser fdp = getInstance("ddMMMyyyy", NEW_YORK, Locale.US);        
-        assertEquals(expected.getTime(), fdp.parse("14may2014"));
-        assertEquals(expected.getTime(), fdp.parse("14MAY2014"));
-        assertEquals(expected.getTime(), fdp.parse("14May2014"));
-    }
-    
-    @Test(expected = IllegalArgumentException.class)
-    public void test1806Argument() {
-        getInstance("XXXX");
-    }
-
-    private static Calendar initializeCalendar(TimeZone tz) {
-        Calendar cal = Calendar.getInstance(tz);
-        cal.set(Calendar.YEAR, 2001);
-        cal.set(Calendar.MONTH, 1); // not daylight savings
-        cal.set(Calendar.DAY_OF_MONTH, 4);
-        cal.set(Calendar.HOUR_OF_DAY, 12);
-        cal.set(Calendar.MINUTE, 8);
-        cal.set(Calendar.SECOND, 56);
-        cal.set(Calendar.MILLISECOND, 235);
-        return cal;
-    }
-
-    private static enum Expected1806 {
-        India(INDIA, "+05", "+0530", "+05:30", true), 
-        Greenwich(GMT, "Z", "Z", "Z", false), 
-        NewYork(NEW_YORK, "-05", "-0500", "-05:00", false);
-
-        private Expected1806(TimeZone zone, String one, String two, String three, boolean hasHalfHourOffset) {
-            this.zone = zone;
-            this.one = one;
-            this.two = two;
-            this.three = three;
-            this.offset = hasHalfHourOffset ?30*60*1000 :0;
-        }
-
-        final TimeZone zone;
-        final String one;
-        final String two;
-        final String three;
-        final long offset;
-    }
-    
-    @Test
-    public void test1806() throws ParseException {
-        String formatStub = "yyyy-MM-dd'T'HH:mm:ss.SSS";
-        String dateStub = "2001-02-04T12:08:56.235";
-        
-        for (Expected1806 trial : Expected1806.values()) {
-            Calendar cal = initializeCalendar(trial.zone);
-
-            String message = trial.zone.getDisplayName()+";";
-            
-            DateParser parser = getInstance(formatStub+"X", trial.zone);
-            assertEquals(message+trial.one, cal.getTime().getTime(), parser.parse(dateStub+trial.one).getTime()-trial.offset);
-
-            parser = getInstance(formatStub+"XX", trial.zone);
-            assertEquals(message+trial.two, cal.getTime(), parser.parse(dateStub+trial.two));
-
-            parser = getInstance(formatStub+"XXX", trial.zone);
-            assertEquals(message+trial.three, cal.getTime(), parser.parse(dateStub+trial.three));
-        }
-    }
-
-}
diff --git a/lang/src/test/java/org/apache/commons/lang3/time/FastDatePrinterTest.java b/lang/src/test/java/org/apache/commons/lang3/time/FastDatePrinterTest.java
deleted file mode 100644
index d72d7fb..0000000
--- a/lang/src/test/java/org/apache/commons/lang3/time/FastDatePrinterTest.java
+++ /dev/null
@@ -1,340 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.commons.lang3.time;
-
-import static org.junit.Assert.*;
-
-import java.io.Serializable;
-import java.text.ParseException;
-import java.text.SimpleDateFormat;
-import java.util.Calendar;
-import java.util.Date;
-import java.util.GregorianCalendar;
-import java.util.Locale;
-import java.util.TimeZone;
-
-import org.apache.commons.lang3.SerializationUtils;
-import org.junit.Test;
-
-/**
- * Unit tests {@link org.apache.commons.lang3.time.FastDatePrinter}.
- *
- * @version $Id$
- * @since 3.0
- */
-public class FastDatePrinterTest {
-    
-    private static final String YYYY_MM_DD = "yyyy/MM/dd";
-    private static final TimeZone NEW_YORK = TimeZone.getTimeZone("America/New_York");
-    private static final TimeZone GMT = TimeZone.getTimeZone("GMT");
-    private static final TimeZone INDIA = TimeZone.getTimeZone("Asia/Calcutta");
-    private static final Locale SWEDEN = new Locale("sv", "SE");
-
-        DatePrinter getInstance(final String format) {
-        return getInstance(format, TimeZone.getDefault(), Locale.getDefault());
-    }
-
-    private DatePrinter getDateInstance(final int dateStyle, final Locale locale) {
-        return getInstance(FormatCache.getPatternForStyle(Integer.valueOf(dateStyle), null, locale), TimeZone.getDefault(), Locale.getDefault());
-    }
-
-    private DatePrinter getInstance(final String format, final Locale locale) {
-        return getInstance(format, TimeZone.getDefault(), locale);
-    }
-
-    private DatePrinter getInstance(final String format, final TimeZone timeZone) {
-        return getInstance(format, timeZone, Locale.getDefault());
-    }
-
-    /**
-     * Override this method in derived tests to change the construction of instances
-     * @param format the format string to use
-     * @param timeZone the time zone to use
-     * @param locale the locale to use
-     * @return the DatePrinter to use for testing
-     */
-    protected DatePrinter getInstance(final String format, final TimeZone timeZone, final Locale locale) {
-        return new FastDatePrinter(format, timeZone, locale);
-    }
-
-    @Test
-    public void testFormat() {
-        final Locale realDefaultLocale = Locale.getDefault();
-        final TimeZone realDefaultZone = TimeZone.getDefault();
-        try {
-            Locale.setDefault(Locale.US);
-            TimeZone.setDefault(NEW_YORK);
-
-            final GregorianCalendar cal1 = new GregorianCalendar(2003, 0, 10, 15, 33, 20);
-            final GregorianCalendar cal2 = new GregorianCalendar(2003, 6, 10, 9, 00, 00);
-            final Date date1 = cal1.getTime();
-            final Date date2 = cal2.getTime();
-            final long millis1 = date1.getTime();
-            final long millis2 = date2.getTime();
-
-            DatePrinter fdf = getInstance("yyyy-MM-dd'T'HH:mm:ss");
-            SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss");
-            assertEquals(sdf.format(date1), fdf.format(date1));
-            assertEquals("2003-01-10T15:33:20", fdf.format(date1));
-            assertEquals("2003-01-10T15:33:20", fdf.format(cal1));
-            assertEquals("2003-01-10T15:33:20", fdf.format(millis1));
-            assertEquals("2003-07-10T09:00:00", fdf.format(date2));
-            assertEquals("2003-07-10T09:00:00", fdf.format(cal2));
-            assertEquals("2003-07-10T09:00:00", fdf.format(millis2));
-
-            fdf = getInstance("Z");
-            assertEquals("-0500", fdf.format(date1));
-            assertEquals("-0500", fdf.format(cal1));
-            assertEquals("-0500", fdf.format(millis1));
-
-            assertEquals("-0400", fdf.format(date2));
-            assertEquals("-0400", fdf.format(cal2));
-            assertEquals("-0400", fdf.format(millis2));
-
-            fdf = getInstance("ZZ");
-            assertEquals("-05:00", fdf.format(date1));
-            assertEquals("-05:00", fdf.format(cal1));
-            assertEquals("-05:00", fdf.format(millis1));
-
-            assertEquals("-04:00", fdf.format(date2));
-            assertEquals("-04:00", fdf.format(cal2));
-            assertEquals("-04:00", fdf.format(millis2));
-
-            final String pattern = "GGGG GGG GG G yyyy yyy yy y MMMM MMM MM M" +
-                " dddd ddd dd d DDDD DDD DD D EEEE EEE EE E aaaa aaa aa a zzzz zzz zz z";
-            fdf = getInstance(pattern);
-            sdf = new SimpleDateFormat(pattern);
-            // SDF bug fix starting with Java 7
-            assertEquals(sdf.format(date1).replaceAll("2003 03 03 03", "2003 2003 03 2003"), fdf.format(date1));
-            assertEquals(sdf.format(date2).replaceAll("2003 03 03 03", "2003 2003 03 2003"), fdf.format(date2));
-        } finally {
-            Locale.setDefault(realDefaultLocale);
-            TimeZone.setDefault(realDefaultZone);
-        }
-    }
-
-    /**
-     * Test case for {@link FastDateParser#FastDateParser(String, TimeZone, Locale)}.
-     */
-    @Test
-    public void testShortDateStyleWithLocales() {
-        final Locale usLocale = Locale.US;
-        final Locale swedishLocale = new Locale("sv", "SE");
-        final Calendar cal = Calendar.getInstance();
-        cal.set(2004, 1, 3);
-        DatePrinter fdf = getDateInstance(FastDateFormat.SHORT, usLocale);
-        assertEquals("2/3/04", fdf.format(cal));
-
-        fdf = getDateInstance(FastDateFormat.SHORT, swedishLocale);
-        assertEquals("2004-02-03", fdf.format(cal));
-
-    }
-
-    /**
-     * Tests that pre-1000AD years get padded with yyyy
-     */
-    @Test
-    public void testLowYearPadding() {
-        final Calendar cal = Calendar.getInstance();
-        final DatePrinter format = getInstance(YYYY_MM_DD);
-
-        cal.set(1,0,1);
-        assertEquals("0001/01/01", format.format(cal));
-        cal.set(10,0,1);
-        assertEquals("0010/01/01", format.format(cal));
-        cal.set(100,0,1);
-        assertEquals("0100/01/01", format.format(cal));
-        cal.set(999,0,1);
-        assertEquals("0999/01/01", format.format(cal));
-    }
-    /**
-     * Show Bug #39410 is solved
-     */
-    @Test
-    public void testMilleniumBug() {
-        final Calendar cal = Calendar.getInstance();
-        final DatePrinter format = getInstance("dd.MM.yyyy");
-
-        cal.set(1000,0,1);
-        assertEquals("01.01.1000", format.format(cal));
-    }
-
-    /**
-     * testLowYearPadding showed that the date was buggy
-     * This test confirms it, getting 366 back as a date
-     */
-    @Test
-    public void testSimpleDate() {
-        final Calendar cal = Calendar.getInstance();
-        final DatePrinter format = getInstance(YYYY_MM_DD);
-
-        cal.set(2004,11,31);
-        assertEquals("2004/12/31", format.format(cal));
-        cal.set(999,11,31);
-        assertEquals("0999/12/31", format.format(cal));
-        cal.set(1,2,2);
-        assertEquals("0001/03/02", format.format(cal));
-    }
-
-    @Test
-    public void testLang303() {
-        final Calendar cal = Calendar.getInstance();
-        cal.set(2004, 11, 31);
-
-        DatePrinter format = getInstance(YYYY_MM_DD);
-        final String output = format.format(cal);
-
-        format = SerializationUtils.deserialize(SerializationUtils.serialize((Serializable) format));
-        assertEquals(output, format.format(cal));
-    }
-
-    @Test
-    public void testLang538() {
-        // more commonly constructed with: cal = new GregorianCalendar(2009, 9, 16, 8, 42, 16)
-        // for the unit test to work in any time zone, constructing with GMT-8 rather than default locale time zone
-        final GregorianCalendar cal = new GregorianCalendar(TimeZone.getTimeZone("GMT-8"));
-        cal.clear();
-        cal.set(2009, 9, 16, 8, 42, 16);
-
-        final DatePrinter format = getInstance("yyyy-MM-dd'T'HH:mm:ss.SSS'Z'", TimeZone.getTimeZone("GMT"));
-        assertEquals("dateTime", "2009-10-16T16:42:16.000Z", format.format(cal.getTime()));
-        assertEquals("dateTime", "2009-10-16T08:42:16.000Z", format.format(cal));
-    }
-
-    @Test
-    public void testLang645() {
-        final Locale locale = new Locale("sv", "SE");
-
-        final Calendar cal = Calendar.getInstance();
-        cal.set(2010, 0, 1, 12, 0, 0);
-        final Date d = cal.getTime();
-
-        final DatePrinter fdf = getInstance("EEEE', week 'ww", locale);
-
-        assertEquals("fredag, week 53", fdf.format(d));
-    }
-    
-    @Test
-    public void testEquals() {
-        final DatePrinter printer1= getInstance(YYYY_MM_DD);
-        final DatePrinter printer2= getInstance(YYYY_MM_DD);
-
-        assertEquals(printer1, printer2);
-        assertEquals(printer1.hashCode(), printer2.hashCode());        
-
-        assertFalse(printer1.equals(new Object()));
-    }
-    
-    @Test
-    public void testToStringContainsName() {
-        final DatePrinter printer= getInstance(YYYY_MM_DD);
-        assertTrue(printer.toString().startsWith("FastDate"));
-    }
-    
-    @Test
-    public void testPatternMatches() {
-        final DatePrinter printer= getInstance(YYYY_MM_DD);
-        assertEquals(YYYY_MM_DD, printer.getPattern());
-    }
-    
-    @Test
-    public void testLocaleMatches() {
-        final DatePrinter printer= getInstance(YYYY_MM_DD, SWEDEN);
-        assertEquals(SWEDEN, printer.getLocale());
-    }
-    
-    @Test
-    public void testTimeZoneMatches() {
-        final DatePrinter printer= getInstance(YYYY_MM_DD, NEW_YORK);
-        assertEquals(NEW_YORK, printer.getTimeZone());
-    }
-
-    @Test
-    public void testTimeZoneAsZ() throws Exception {
-        Calendar c = Calendar.getInstance(TimeZone.getTimeZone("UTC"));
-        FastDateFormat noColonFormat = FastDateFormat.getInstance("Z");
-        assertEquals("+0000", noColonFormat.format(c));
-        
-        FastDateFormat isoFormat = FastDateFormat.getInstance("ZZ");
-        assertEquals("Z", isoFormat.format(c));
-        
-        FastDateFormat colonFormat = FastDateFormat.getInstance("ZZZ");
-        assertEquals("+00:00", colonFormat.format(c));
-    }
-
-    private static Calendar initializeCalendar(TimeZone tz) {
-        Calendar cal = Calendar.getInstance(tz);
-        cal.set(Calendar.YEAR, 2001);
-        cal.set(Calendar.MONTH, 1); // not daylight savings
-        cal.set(Calendar.DAY_OF_MONTH, 4);
-        cal.set(Calendar.HOUR_OF_DAY, 12);
-        cal.set(Calendar.MINUTE, 8);
-        cal.set(Calendar.SECOND, 56);
-        cal.set(Calendar.MILLISECOND, 235);
-        return cal;
-    }
-
-    @Test(expected = IllegalArgumentException.class)
-    public void test1806Argument() {
-        getInstance("XXXX");
-    }
-
-    private static enum Expected1806 {
-        India(INDIA, "+05", "+0530", "+05:30"), Greenwich(GMT, "Z", "Z", "Z"), NewYork(
-                NEW_YORK, "-05", "-0500", "-05:00");
-
-        private Expected1806(TimeZone zone, String one, String two, String three) {
-            this.zone = zone;
-            this.one = one;
-            this.two = two;
-            this.three = three;
-        }
-
-        final TimeZone zone;
-        final String one;
-        final String two;
-        final String three;
-    }
-
-    @Test
-    public void test1806() throws ParseException {
-        for (Expected1806 trial : Expected1806.values()) {
-            Calendar cal = initializeCalendar(trial.zone);
-
-            DatePrinter printer = getInstance("X", trial.zone);
-            assertEquals(trial.one, printer.format(cal));
-
-            printer = getInstance("XX", trial.zone);
-            assertEquals(trial.two, printer.format(cal));
-
-            printer = getInstance("XXX", trial.zone);
-            assertEquals(trial.three, printer.format(cal));
-        }
-    }
-    
-    @Test
-    public void testLang1103() throws ParseException {
-        Calendar cal = Calendar.getInstance(SWEDEN);
-        cal.set(Calendar.DAY_OF_MONTH, 2);
-
-        assertEquals("2", getInstance("d", SWEDEN).format(cal));
-        assertEquals("02", getInstance("dd", SWEDEN).format(cal));
-        assertEquals("002", getInstance("ddd", SWEDEN).format(cal));
-        assertEquals("0002", getInstance("dddd", SWEDEN).format(cal));
-        assertEquals("00002", getInstance("ddddd", SWEDEN).format(cal));
-    }
-}
diff --git a/lang/src/test/java/org/apache/commons/lang3/time/FastDatePrinterTimeZonesTest.java b/lang/src/test/java/org/apache/commons/lang3/time/FastDatePrinterTimeZonesTest.java
deleted file mode 100644
index 34ff2f5..0000000
--- a/lang/src/test/java/org/apache/commons/lang3/time/FastDatePrinterTimeZonesTest.java
+++ /dev/null
@@ -1,64 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.commons.lang3.time;
-
-import static org.junit.Assert.assertEquals;
-
-import java.text.SimpleDateFormat;
-import java.util.ArrayList;
-import java.util.Calendar;
-import java.util.Collection;
-import java.util.List;
-import java.util.TimeZone;
-
-import org.junit.Test;
-import org.junit.runner.RunWith;
-import org.junit.runners.Parameterized;
-
-@RunWith(Parameterized.class)
-public class FastDatePrinterTimeZonesTest {
-
-    private static final String PATTERN = "h:mma z";
-
-    @Parameterized.Parameters
-    public static Collection<TimeZone> data() {
-        final String[] zoneIds = TimeZone.getAvailableIDs();
-        List<TimeZone> timeZones = new ArrayList<TimeZone>();
-        for (String zoneId : zoneIds) {
-            timeZones.add(TimeZone.getTimeZone(zoneId));
-        }
-        return timeZones;
-    }
-
-    private TimeZone timeZone;
-
-    public FastDatePrinterTimeZonesTest(TimeZone timeZone) {
-        this.timeZone = timeZone;
-    }
-
-    @Test
-    public void testCalendarTimezoneRespected() {
-        final Calendar cal = Calendar.getInstance(timeZone);
-
-        final SimpleDateFormat sdf = new SimpleDateFormat(PATTERN);
-        sdf.setTimeZone(timeZone);
-        final String expectedValue = sdf.format(cal.getTime());
-        final String actualValue = FastDateFormat.getInstance(PATTERN).format(cal);
-        assertEquals(expectedValue, actualValue);
-    }
-
-}
diff --git a/lang/src/test/java/org/apache/commons/lang3/time/StopWatchTest.java b/lang/src/test/java/org/apache/commons/lang3/time/StopWatchTest.java
deleted file mode 100644
index 3e464cb..0000000
--- a/lang/src/test/java/org/apache/commons/lang3/time/StopWatchTest.java
+++ /dev/null
@@ -1,251 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- * 
- *      http://www.apache.org/licenses/LICENSE-2.0
- * 
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.commons.lang3.time;
-
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertTrue;
-import static org.junit.Assert.assertFalse;
-import static org.junit.Assert.fail;
-import org.junit.Assert;
-
-import org.junit.Test;
-
-/**
- * TestCase for StopWatch.
- *
- * @version $Id$
- */
-public class StopWatchTest  {
-
-    //-----------------------------------------------------------------------
-    @Test
-    public void testStopWatchSimple(){
-        final StopWatch watch = new StopWatch();
-        watch.start();
-            try {Thread.sleep(550);} catch (final InterruptedException ex) {}
-        watch.stop();
-        final long time = watch.getTime();
-        assertEquals(time, watch.getTime());
-        
-        assertTrue(time >= 500);
-        assertTrue(time < 700);
-        
-        watch.reset();
-        assertEquals(0, watch.getTime());
-    }
-    
-    @Test
-    public void testStopWatchSimpleGet(){
-        final StopWatch watch = new StopWatch();
-        assertEquals(0, watch.getTime());
-        assertEquals("00:00:00.000", watch.toString());
-        
-        watch.start();
-            try {Thread.sleep(500);} catch (final InterruptedException ex) {}
-        assertTrue(watch.getTime() < 2000);
-    }
-    
-    @Test
-    public void testStopWatchSplit(){
-        final StopWatch watch = new StopWatch();
-        watch.start();
-            try {Thread.sleep(550);} catch (final InterruptedException ex) {}
-        watch.split();
-        final long splitTime = watch.getSplitTime();
-        final String splitStr = watch.toSplitString();
-            try {Thread.sleep(550);} catch (final InterruptedException ex) {}
-        watch.unsplit();
-            try {Thread.sleep(550);} catch (final InterruptedException ex) {}
-        watch.stop();
-        final long totalTime = watch.getTime();
-
-        assertEquals("Formatted split string not the correct length", 
-                     splitStr.length(), 12);
-        assertTrue(splitTime >= 500);
-        assertTrue(splitTime < 700);
-        assertTrue(totalTime >= 1500);
-        assertTrue(totalTime < 1900);
-    }
-    
-    @Test
-    public void testStopWatchSuspend(){
-        final StopWatch watch = new StopWatch();
-        watch.start();
-            try {Thread.sleep(550);} catch (final InterruptedException ex) {}
-        watch.suspend();
-        final long suspendTime = watch.getTime();
-            try {Thread.sleep(550);} catch (final InterruptedException ex) {}
-        watch.resume();
-            try {Thread.sleep(550);} catch (final InterruptedException ex) {}
-        watch.stop();
-        final long totalTime = watch.getTime();
-        
-        assertTrue(suspendTime >= 500);
-        assertTrue(suspendTime < 700);
-        assertTrue(totalTime >= 1000);
-        assertTrue(totalTime < 1300);
-    }
-
-    @Test
-    public void testLang315() {
-        final StopWatch watch = new StopWatch();
-        watch.start();
-            try {Thread.sleep(200);} catch (final InterruptedException ex) {}
-        watch.suspend();
-        final long suspendTime = watch.getTime();
-            try {Thread.sleep(200);} catch (final InterruptedException ex) {}
-        watch.stop();
-        final long totalTime = watch.getTime();
-        assertTrue( suspendTime == totalTime );
-    }
-
-    // test bad states
-    @Test
-    public void testBadStates() {
-        final StopWatch watch = new StopWatch();
-        try {
-            watch.stop();
-            fail("Calling stop on an unstarted StopWatch should throw an exception. ");
-        } catch(final IllegalStateException ise) {
-            // expected
-        }
-
-        try {
-            watch.stop();
-            fail("Calling stop on an unstarted StopWatch should throw an exception. ");
-        } catch(final IllegalStateException ise) {
-            // expected
-        }
-
-        try {
-            watch.suspend();
-            fail("Calling suspend on an unstarted StopWatch should throw an exception. ");
-        } catch(final IllegalStateException ise) {
-            // expected
-        }
-
-        try {
-            watch.split();
-            fail("Calling split on a non-running StopWatch should throw an exception. ");
-        } catch(final IllegalStateException ise) {
-            // expected
-        }
-
-        try {
-            watch.unsplit();
-            fail("Calling unsplit on an unsplit StopWatch should throw an exception. ");
-        } catch(final IllegalStateException ise) {
-            // expected
-        }
-
-        try {
-            watch.resume();
-            fail("Calling resume on an unsuspended StopWatch should throw an exception. ");
-        } catch(final IllegalStateException ise) {
-            // expected
-        }
-
-        watch.start();
-
-        try {
-            watch.start();
-            fail("Calling start on a started StopWatch should throw an exception. ");
-        } catch(final IllegalStateException ise) {
-            // expected
-        }
-
-        try {
-            watch.unsplit();
-            fail("Calling unsplit on an unsplit StopWatch should throw an exception. ");
-        } catch(final IllegalStateException ise) {
-            // expected
-        }
-
-        try {
-            watch.getSplitTime();
-            fail("Calling getSplitTime on an unsplit StopWatch should throw an exception. ");
-        } catch(final IllegalStateException ise) {
-            // expected
-        }
-
-        try {
-            watch.resume();
-            fail("Calling resume on an unsuspended StopWatch should throw an exception. ");
-        } catch(final IllegalStateException ise) {
-            // expected
-        }
-
-        watch.stop();
-
-        try {
-            watch.start();
-            fail("Calling start on a stopped StopWatch should throw an exception as it needs to be reset. ");
-        } catch(final IllegalStateException ise) {
-            // expected
-        }
-    }
-
-    @Test
-    public void testGetStartTime() {
-        final long beforeStopWatch = System.currentTimeMillis();
-        final StopWatch watch = new StopWatch();
-        try {
-            watch.getStartTime();
-            fail("Calling getStartTime on an unstarted StopWatch should throw an exception");
-        } catch (final IllegalStateException expected) {
-            // expected
-        }
-        watch.start();
-        try {
-            watch.getStartTime();
-            Assert.assertTrue(watch.getStartTime() >= beforeStopWatch);
-        } catch (final IllegalStateException ex) {
-            fail("Start time should be available: " + ex.getMessage());
-        }
-        watch.reset();
-        try {
-            watch.getStartTime();
-            fail("Calling getStartTime on a reset, but unstarted StopWatch should throw an exception");
-        } catch (final IllegalStateException expected) {
-            // expected
-        }
-    }
-
-    @Test
-    public void testBooleanStates() {
-        final StopWatch watch = new StopWatch();
-        assertFalse(watch.isStarted());
-        assertFalse(watch.isSuspended());
-        assertTrue(watch.isStopped());
-
-        watch.start();
-        assertTrue(watch.isStarted());
-        assertFalse(watch.isSuspended());
-        assertFalse(watch.isStopped());
-
-        watch.suspend();
-        assertTrue(watch.isStarted());
-        assertTrue(watch.isSuspended());
-        assertFalse(watch.isStopped());
-
-        watch.stop();
-        assertFalse(watch.isStarted());
-        assertFalse(watch.isSuspended());
-        assertTrue(watch.isStopped());
-    }
-
-}
diff --git a/lang/src/test/java/org/apache/commons/lang3/tuple/ImmutablePairTest.java b/lang/src/test/java/org/apache/commons/lang3/tuple/ImmutablePairTest.java
deleted file mode 100644
index 0166104..0000000
--- a/lang/src/test/java/org/apache/commons/lang3/tuple/ImmutablePairTest.java
+++ /dev/null
@@ -1,101 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.commons.lang3.tuple;
-
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertFalse;
-import static org.junit.Assert.assertNull;
-import static org.junit.Assert.assertTrue;
-
-import java.io.ByteArrayInputStream;
-import java.io.ByteArrayOutputStream;
-import java.io.ObjectInputStream;
-import java.io.ObjectOutputStream;
-
-import org.junit.Test;
-
-/**
- * Test the Pair class.
- * @version $Id$
- */
-public class ImmutablePairTest {
-
-    @Test
-    public void testBasic() throws Exception {
-        final ImmutablePair<Integer, String> pair = new ImmutablePair<Integer, String>(0, "foo");
-        assertEquals(0, pair.left.intValue());
-        assertEquals(0, pair.getLeft().intValue());
-        assertEquals("foo", pair.right);
-        assertEquals("foo", pair.getRight());
-        final ImmutablePair<Object, String> pair2 = new ImmutablePair<Object, String>(null, "bar");
-        assertNull(pair2.left);
-        assertNull(pair2.getLeft());
-        assertEquals("bar", pair2.right);
-        assertEquals("bar", pair2.getRight());
-    }
-
-    @Test
-    public void testPairOf() throws Exception {
-        final ImmutablePair<Integer, String> pair = ImmutablePair.of(0, "foo");
-        assertEquals(0, pair.left.intValue());
-        assertEquals(0, pair.getLeft().intValue());
-        assertEquals("foo", pair.right);
-        assertEquals("foo", pair.getRight());
-        final ImmutablePair<Object, String> pair2 = ImmutablePair.of(null, "bar");
-        assertNull(pair2.left);
-        assertNull(pair2.getLeft());
-        assertEquals("bar", pair2.right);
-        assertEquals("bar", pair2.getRight());
-    }
-
-    @Test
-    public void testEquals() throws Exception {
-        assertEquals(ImmutablePair.of(null, "foo"), ImmutablePair.of(null, "foo"));
-        assertFalse(ImmutablePair.of("foo", 0).equals(ImmutablePair.of("foo", null)));
-        assertFalse(ImmutablePair.of("foo", "bar").equals(ImmutablePair.of("xyz", "bar")));
-
-        final ImmutablePair<String, String> p = ImmutablePair.of("foo", "bar");
-        assertTrue(p.equals(p));
-        assertFalse(p.equals(new Object()));
-    }
-
-    @Test
-    public void testHashCode() throws Exception {
-        assertEquals(ImmutablePair.of(null, "foo").hashCode(), ImmutablePair.of(null, "foo").hashCode());
-    }
-
-    @Test
-    public void testToString() throws Exception {
-        assertEquals("(null,null)", ImmutablePair.of(null, null).toString());
-        assertEquals("(null,two)", ImmutablePair.of(null, "two").toString());
-        assertEquals("(one,null)", ImmutablePair.of("one", null).toString());
-        assertEquals("(one,two)", ImmutablePair.of("one", "two").toString());
-    }
-
-    @Test
-    @SuppressWarnings("unchecked")
-    public void testSerialization() throws Exception {
-        final ImmutablePair<Integer, String> origPair = ImmutablePair.of(0, "foo");
-        final ByteArrayOutputStream baos = new ByteArrayOutputStream();
-        final ObjectOutputStream out = new ObjectOutputStream(baos);
-        out.writeObject(origPair);
-        final ImmutablePair<Integer, String> deserializedPair = (ImmutablePair<Integer, String>) new ObjectInputStream(
-                new ByteArrayInputStream(baos.toByteArray())).readObject();
-        assertEquals(origPair, deserializedPair);
-        assertEquals(origPair.hashCode(), deserializedPair.hashCode());
-    }
-}
diff --git a/lang/src/test/java/org/apache/commons/lang3/tuple/ImmutableTripleTest.java b/lang/src/test/java/org/apache/commons/lang3/tuple/ImmutableTripleTest.java
deleted file mode 100644
index a6e7cf3..0000000
--- a/lang/src/test/java/org/apache/commons/lang3/tuple/ImmutableTripleTest.java
+++ /dev/null
@@ -1,113 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.commons.lang3.tuple;
-
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertFalse;
-import static org.junit.Assert.assertNull;
-import static org.junit.Assert.assertTrue;
-
-import java.io.ByteArrayInputStream;
-import java.io.ByteArrayOutputStream;
-import java.io.ObjectInputStream;
-import java.io.ObjectOutputStream;
-
-import org.junit.Test;
-
-/**
- * Test the Triple class.
- * @version $Id$
- */
-public class ImmutableTripleTest {
-
-    @Test
-    public void testBasic() throws Exception {
-        final ImmutableTriple<Integer, String, Boolean> triple = new ImmutableTriple<Integer, String, Boolean>(0, "foo", Boolean.TRUE);
-        assertEquals(0, triple.left.intValue());
-        assertEquals(0, triple.getLeft().intValue());
-        assertEquals("foo", triple.middle);
-        assertEquals("foo", triple.getMiddle());
-        assertEquals(Boolean.TRUE, triple.right);
-        assertEquals(Boolean.TRUE, triple.getRight());
-        final ImmutableTriple<Object, String, Integer> triple2 = new ImmutableTriple<Object, String, Integer>(null, "bar", 42);
-        assertNull(triple2.left);
-        assertNull(triple2.getLeft());
-        assertEquals("bar", triple2.middle);
-        assertEquals("bar", triple2.getMiddle());
-        assertEquals(new Integer(42), triple2.right);
-        assertEquals(new Integer(42), triple2.getRight());
-    }
-
-    @Test
-    public void testTripleOf() throws Exception {
-        final ImmutableTriple<Integer, String, Boolean> triple = ImmutableTriple.of(0, "foo", Boolean.FALSE);
-        assertEquals(0, triple.left.intValue());
-        assertEquals(0, triple.getLeft().intValue());
-        assertEquals("foo", triple.middle);
-        assertEquals("foo", triple.getMiddle());
-        assertEquals(Boolean.FALSE, triple.right);
-        assertEquals(Boolean.FALSE, triple.getRight());
-        final ImmutableTriple<Object, String, Boolean> triple2 = ImmutableTriple.of(null, "bar", Boolean.TRUE);
-        assertNull(triple2.left);
-        assertNull(triple2.getLeft());
-        assertEquals("bar", triple2.middle);
-        assertEquals("bar", triple2.getMiddle());
-        assertEquals(Boolean.TRUE, triple2.right);
-        assertEquals(Boolean.TRUE, triple2.getRight());
-    }
-
-    @Test
-    public void testEquals() throws Exception {
-        assertEquals(ImmutableTriple.of(null, "foo", 42), ImmutableTriple.of(null, "foo", 42));
-        assertFalse(ImmutableTriple.of("foo", 0, Boolean.TRUE).equals(ImmutableTriple.of("foo", null, null)));
-        assertFalse(ImmutableTriple.of("foo", "bar", "baz").equals(ImmutableTriple.of("xyz", "bar", "blo")));
-
-        final ImmutableTriple<String, String, String> p = ImmutableTriple.of("foo", "bar", "baz");
-        assertTrue(p.equals(p));
-        assertFalse(p.equals(new Object()));
-    }
-
-    @Test
-    public void testHashCode() throws Exception {
-        assertEquals(ImmutableTriple.of(null, "foo", Boolean.TRUE).hashCode(), ImmutableTriple.of(null, "foo", Boolean.TRUE).hashCode());
-    }
-
-    @Test
-    public void testToString() throws Exception {
-        assertEquals("(null,null,null)", ImmutableTriple.of(null, null, null).toString());
-        assertEquals("(null,two,null)", ImmutableTriple.of(null, "two", null).toString());
-        assertEquals("(one,null,null)", ImmutableTriple.of("one", null, null).toString());
-        assertEquals("(one,two,null)", ImmutableTriple.of("one", "two", null).toString());
-        assertEquals("(null,two,three)", ImmutableTriple.of(null, "two", "three").toString());
-        assertEquals("(one,null,three)", ImmutableTriple.of("one", null, "three").toString());
-        assertEquals("(one,two,three)", MutableTriple.of("one", "two", "three").toString());
-    }
-
-    @Test
-    @SuppressWarnings("unchecked")
-    public void testSerialization() throws Exception {
-        final ImmutableTriple<Integer, String, Boolean> origTriple = ImmutableTriple.of(0, "foo", Boolean.TRUE);
-        final ByteArrayOutputStream baos = new ByteArrayOutputStream();
-        final ObjectOutputStream out = new ObjectOutputStream(baos);
-        out.writeObject(origTriple);
-        final ImmutableTriple<Integer, String, Boolean> deserializedTriple = (ImmutableTriple<Integer, String, Boolean>) new ObjectInputStream(
-                new ByteArrayInputStream(baos.toByteArray())).readObject();
-        assertEquals(origTriple, deserializedTriple);
-        assertEquals(origTriple.hashCode(), deserializedTriple.hashCode());
-    }
-}
-
diff --git a/lang/src/test/java/org/apache/commons/lang3/tuple/MutablePairTest.java b/lang/src/test/java/org/apache/commons/lang3/tuple/MutablePairTest.java
deleted file mode 100644
index 0b64004..0000000
--- a/lang/src/test/java/org/apache/commons/lang3/tuple/MutablePairTest.java
+++ /dev/null
@@ -1,109 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.commons.lang3.tuple;
-
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertFalse;
-import static org.junit.Assert.assertNull;
-import static org.junit.Assert.assertTrue;
-
-import java.io.ByteArrayInputStream;
-import java.io.ByteArrayOutputStream;
-import java.io.ObjectInputStream;
-import java.io.ObjectOutputStream;
-
-import org.junit.Test;
-
-/**
- * Test the MutablePair class.
- * @version $Id$
- */
-public class MutablePairTest {
-
-    @Test
-    public void testBasic() throws Exception {
-        final MutablePair<Integer, String> pair = new MutablePair<Integer, String>(0, "foo");
-        assertEquals(0, pair.getLeft().intValue());
-        assertEquals("foo", pair.getRight());
-        final MutablePair<Object, String> pair2 = new MutablePair<Object, String>(null, "bar");
-        assertNull(pair2.getLeft());
-        assertEquals("bar", pair2.getRight());
-    }
-
-    @Test
-    public void testDefault() throws Exception {
-        final MutablePair<Integer, String> pair = new MutablePair<Integer, String>();
-        assertNull(pair.getLeft());
-        assertNull(pair.getRight());
-    }
-    
-    @Test
-    public void testMutate() throws Exception {
-        final MutablePair<Integer, String> pair = new MutablePair<Integer, String>(0, "foo");
-        pair.setLeft(42);
-        pair.setRight("bar");
-        assertEquals(42, pair.getLeft().intValue());
-        assertEquals("bar", pair.getRight());
-    }
-
-    @Test
-    public void testPairOf() throws Exception {
-        final MutablePair<Integer, String> pair = MutablePair.of(0, "foo");
-        assertEquals(0, pair.getLeft().intValue());
-        assertEquals("foo", pair.getRight());
-        final MutablePair<Object, String> pair2 = MutablePair.of(null, "bar");
-        assertNull(pair2.getLeft());
-        assertEquals("bar", pair2.getRight());
-    }
-
-    @Test
-    public void testEquals() throws Exception {
-        assertEquals(MutablePair.of(null, "foo"), MutablePair.of(null, "foo"));
-        assertFalse(MutablePair.of("foo", 0).equals(MutablePair.of("foo", null)));
-        assertFalse(MutablePair.of("foo", "bar").equals(MutablePair.of("xyz", "bar")));
-
-        final MutablePair<String, String> p = MutablePair.of("foo", "bar");
-        assertTrue(p.equals(p));
-        assertFalse(p.equals(new Object()));
-    }
-
-    @Test
-    public void testHashCode() throws Exception {
-        assertEquals(MutablePair.of(null, "foo").hashCode(), MutablePair.of(null, "foo").hashCode());
-    }
-
-    @Test
-    public void testToString() throws Exception {
-        assertEquals("(null,null)", MutablePair.of(null, null).toString());
-        assertEquals("(null,two)", MutablePair.of(null, "two").toString());
-        assertEquals("(one,null)", MutablePair.of("one", null).toString());
-        assertEquals("(one,two)", MutablePair.of("one", "two").toString());
-    }
-
-    @Test
-    @SuppressWarnings("unchecked")
-    public void testSerialization() throws Exception {
-        final MutablePair<Integer, String> origPair = MutablePair.of(0, "foo");
-        final ByteArrayOutputStream baos = new ByteArrayOutputStream();
-        final ObjectOutputStream out = new ObjectOutputStream(baos);
-        out.writeObject(origPair);
-        final MutablePair<Integer, String> deserializedPair = (MutablePair<Integer, String>) new ObjectInputStream(
-                new ByteArrayInputStream(baos.toByteArray())).readObject();
-        assertEquals(origPair, deserializedPair);
-        assertEquals(origPair.hashCode(), deserializedPair.hashCode());
-    }
-}
diff --git a/lang/src/test/java/org/apache/commons/lang3/tuple/MutableTripleTest.java b/lang/src/test/java/org/apache/commons/lang3/tuple/MutableTripleTest.java
deleted file mode 100644
index 210a955..0000000
--- a/lang/src/test/java/org/apache/commons/lang3/tuple/MutableTripleTest.java
+++ /dev/null
@@ -1,121 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.commons.lang3.tuple;
-
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertFalse;
-import static org.junit.Assert.assertNull;
-import static org.junit.Assert.assertTrue;
-
-import java.io.ByteArrayInputStream;
-import java.io.ByteArrayOutputStream;
-import java.io.ObjectInputStream;
-import java.io.ObjectOutputStream;
-
-import org.junit.Test;
-
-/**
- * Test the MutableTriple class.
- * @version $Id$
- */
-public class MutableTripleTest {
-
-    @Test
-    public void testBasic() throws Exception {
-        final MutableTriple<Integer, String, Boolean> triple = new MutableTriple<Integer, String, Boolean>(0, "foo", Boolean.FALSE);
-        assertEquals(0, triple.getLeft().intValue());
-        assertEquals("foo", triple.getMiddle());
-        assertEquals(Boolean.FALSE, triple.getRight());
-        final MutableTriple<Object, String, String> triple2 = new MutableTriple<Object, String, String>(null, "bar", "hello");
-        assertNull(triple2.getLeft());
-        assertEquals("bar", triple2.getMiddle());
-        assertEquals("hello", triple2.getRight());
-    }
-
-    @Test
-    public void testDefault() throws Exception {
-        final MutableTriple<Integer, String, Boolean> triple = new MutableTriple<Integer, String, Boolean>();
-        assertNull(triple.getLeft());
-        assertNull(triple.getMiddle());
-        assertNull(triple.getRight());
-    }
-    
-    @Test
-    public void testMutate() throws Exception {
-        final MutableTriple<Integer, String, Boolean> triple = new MutableTriple<Integer, String, Boolean>(0, "foo", Boolean.TRUE);
-        triple.setLeft(42);
-        triple.setMiddle("bar");
-        triple.setRight(Boolean.FALSE);
-        assertEquals(42, triple.getLeft().intValue());
-        assertEquals("bar", triple.getMiddle());
-        assertEquals(Boolean.FALSE, triple.getRight());
-    }
-
-    @Test
-    public void testTripleOf() throws Exception {
-        final MutableTriple<Integer, String, Boolean> triple = MutableTriple.of(0, "foo", Boolean.TRUE);
-        assertEquals(0, triple.getLeft().intValue());
-        assertEquals("foo", triple.getMiddle());
-        assertEquals(Boolean.TRUE, triple.getRight());
-        final MutableTriple<Object, String, String> triple2 = MutableTriple.of(null, "bar", "hello");
-        assertNull(triple2.getLeft());
-        assertEquals("bar", triple2.getMiddle());
-        assertEquals("hello", triple2.getRight());
-    }
-
-    @Test
-    public void testEquals() throws Exception {
-        assertEquals(MutableTriple.of(null, "foo", "baz"), MutableTriple.of(null, "foo", "baz"));
-        assertFalse(MutableTriple.of("foo", 0, Boolean.TRUE).equals(MutableTriple.of("foo", null, Boolean.TRUE)));
-        assertFalse(MutableTriple.of("foo", "bar", "baz").equals(MutableTriple.of("xyz", "bar", "baz")));
-        assertFalse(MutableTriple.of("foo", "bar", "baz").equals(MutableTriple.of("foo", "bar", "blo")));
-
-        final MutableTriple<String, String, String> p = MutableTriple.of("foo", "bar", "baz");
-        assertTrue(p.equals(p));
-        assertFalse(p.equals(new Object()));
-    }
-
-    @Test
-    public void testHashCode() throws Exception {
-        assertEquals(MutableTriple.of(null, "foo", "baz").hashCode(), MutableTriple.of(null, "foo", "baz").hashCode());
-    }
-
-    @Test
-    public void testToString() throws Exception {
-        assertEquals("(null,null,null)", MutableTriple.of(null, null, null).toString());
-        assertEquals("(null,two,null)", MutableTriple.of(null, "two", null).toString());
-        assertEquals("(one,null,null)", MutableTriple.of("one", null, null).toString());
-        assertEquals("(one,two,null)", MutableTriple.of("one", "two", null).toString());
-        assertEquals("(null,two,three)", MutableTriple.of(null, "two", "three").toString());
-        assertEquals("(one,null,three)", MutableTriple.of("one", null, "three").toString());
-        assertEquals("(one,two,three)", MutableTriple.of("one", "two", "three").toString());
-    }
-
-    @Test
-    @SuppressWarnings("unchecked")
-    public void testSerialization() throws Exception {
-        final MutableTriple<Integer, String, Boolean> origTriple = MutableTriple.of(0, "foo", Boolean.TRUE);
-        final ByteArrayOutputStream baos = new ByteArrayOutputStream();
-        final ObjectOutputStream out = new ObjectOutputStream(baos);
-        out.writeObject(origTriple);
-        final MutableTriple<Integer, String, Boolean> deserializedTriple = (MutableTriple<Integer, String, Boolean>) new ObjectInputStream(
-                new ByteArrayInputStream(baos.toByteArray())).readObject();
-        assertEquals(origTriple, deserializedTriple);
-        assertEquals(origTriple.hashCode(), deserializedTriple.hashCode());
-    }
-}
-
diff --git a/lang/src/test/java/org/apache/commons/lang3/tuple/PairTest.java b/lang/src/test/java/org/apache/commons/lang3/tuple/PairTest.java
deleted file mode 100644
index 365f2ab..0000000
--- a/lang/src/test/java/org/apache/commons/lang3/tuple/PairTest.java
+++ /dev/null
@@ -1,121 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.commons.lang3.tuple;
-
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertFalse;
-import static org.junit.Assert.assertNull;
-import static org.junit.Assert.assertTrue;
-
-import java.util.Calendar;
-import java.util.HashMap;
-import java.util.HashSet;
-import java.util.Map.Entry;
-
-import org.junit.Test;
-
-/**
- * Test the Pair class.
- * 
- * @version $Id$
- */
-public class PairTest {
-
-    @Test
-    public void testPairOf() throws Exception {
-        final Pair<Integer, String> pair = Pair.of(0, "foo");
-        assertTrue(pair instanceof ImmutablePair<?, ?>);
-        assertEquals(0, ((ImmutablePair<Integer, String>) pair).left.intValue());
-        assertEquals("foo", ((ImmutablePair<Integer, String>) pair).right);
-        final Pair<Object, String> pair2 = Pair.of(null, "bar");
-        assertTrue(pair2 instanceof ImmutablePair<?, ?>);
-        assertNull(((ImmutablePair<Object, String>) pair2).left);
-        assertEquals("bar", ((ImmutablePair<Object, String>) pair2).right);
-    }
-
-    @Test
-    public void testCompatibilityBetweenPairs() throws Exception {
-        final Pair<Integer, String> pair = ImmutablePair.of(0, "foo");
-        final Pair<Integer, String> pair2 = MutablePair.of(0, "foo");
-        assertEquals(pair, pair2);
-        assertEquals(pair.hashCode(), pair2.hashCode());
-        final HashSet<Pair<Integer, String>> set = new HashSet<Pair<Integer, String>>();
-        set.add(pair);
-        assertTrue(set.contains(pair2));
-
-        pair2.setValue("bar");
-        assertFalse(pair.equals(pair2));
-        assertFalse(pair.hashCode() == pair2.hashCode());
-    }
-
-    @Test
-    public void testMapEntry() throws Exception {
-        final Pair<Integer, String> pair = ImmutablePair.of(0, "foo");
-        final HashMap<Integer, String> map = new HashMap<Integer, String>();
-        map.put(0, "foo");
-        final Entry<Integer, String> entry = map.entrySet().iterator().next();
-        assertEquals(pair, entry);
-        assertEquals(pair.hashCode(), entry.hashCode());
-    }
-
-    @Test
-    public void testComparable1() throws Exception {
-        final Pair<String, String> pair1 = Pair.of("A", "D");
-        final Pair<String, String> pair2 = Pair.of("B", "C");
-        assertTrue(pair1.compareTo(pair1) == 0);
-        assertTrue(pair1.compareTo(pair2) < 0);
-        assertTrue(pair2.compareTo(pair2) == 0);
-        assertTrue(pair2.compareTo(pair1) > 0);
-    }
-
-    @Test
-    public void testComparable2() throws Exception {
-        final Pair<String, String> pair1 = Pair.of("A", "C");
-        final Pair<String, String> pair2 = Pair.of("A", "D");
-        assertTrue(pair1.compareTo(pair1) == 0);
-        assertTrue(pair1.compareTo(pair2) < 0);
-        assertTrue(pair2.compareTo(pair2) == 0);
-        assertTrue(pair2.compareTo(pair1) > 0);
-    }
-
-    @Test
-    public void testToString() throws Exception {
-        final Pair<String, String> pair = Pair.of("Key", "Value");
-        assertEquals("(Key,Value)", pair.toString());
-    }
-
-    @Test
-    public void testToStringCustom() throws Exception {
-        final Calendar date = Calendar.getInstance();
-        date.set(2011, Calendar.APRIL, 25);
-        final Pair<String, Calendar> pair = Pair.of("DOB", date);
-        assertEquals("Test created on " + "04-25-2011", pair.toString("Test created on %2$tm-%2$td-%2$tY"));
-    }
-
-    @Test
-    public void testFormattable_simple() throws Exception {
-        final Pair<String, String> pair = Pair.of("Key", "Value");
-        assertEquals("(Key,Value)", String.format("%1$s", pair));
-    }
-
-    @Test
-    public void testFormattable_padded() throws Exception {
-        final Pair<String, String> pair = Pair.of("Key", "Value");
-        assertEquals("         (Key,Value)", String.format("%1$20s", pair));
-    }
-
-}
diff --git a/lang/src/test/java/org/apache/commons/lang3/tuple/TripleTest.java b/lang/src/test/java/org/apache/commons/lang3/tuple/TripleTest.java
deleted file mode 100644
index d9cff33..0000000
--- a/lang/src/test/java/org/apache/commons/lang3/tuple/TripleTest.java
+++ /dev/null
@@ -1,127 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.commons.lang3.tuple;
-
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertNull;
-import static org.junit.Assert.assertTrue;
-
-import java.util.Calendar;
-import java.util.HashSet;
-
-import org.junit.Test;
-
-/**
- * Test the Triple class.
- *
- * @version $Id$
- */
-public class TripleTest {
-
-    @Test
-    public void testTripleOf() throws Exception {
-        final Triple<Integer, String, Boolean> triple = Triple.of(0, "foo", Boolean.TRUE);
-        assertTrue(triple instanceof ImmutableTriple<?, ?, ?>);
-        assertEquals(0, ((ImmutableTriple<Integer, String, Boolean>) triple).left.intValue());
-        assertEquals("foo", ((ImmutableTriple<Integer, String, Boolean>) triple).middle);
-        assertEquals(Boolean.TRUE, ((ImmutableTriple<Integer, String, Boolean>) triple).right);
-        final Triple<Object, String, Long> triple2 = Triple.of(null, "bar", Long.valueOf(200L));
-        assertTrue(triple2 instanceof ImmutableTriple<?, ?, ?>);
-        assertNull(((ImmutableTriple<Object, String, Long>) triple2).left);
-        assertEquals("bar", ((ImmutableTriple<Object, String, Long>) triple2).middle);
-        assertEquals(new Long(200L), ((ImmutableTriple<Object, String, Long>) triple2).right);
-    }
-
-    @Test
-    public void testCompatibilityBetweenTriples() throws Exception {
-        final Triple<Integer, String, Boolean> triple = ImmutableTriple.of(0, "foo", Boolean.TRUE);
-        final Triple<Integer, String, Boolean> triple2 = MutableTriple.of(0, "foo", Boolean.TRUE);
-        assertEquals(triple, triple2);
-        assertEquals(triple.hashCode(), triple2.hashCode());
-        final HashSet<Triple<Integer, String, Boolean>> set = new HashSet<Triple<Integer, String, Boolean>>();
-        set.add(triple);
-        assertTrue(set.contains(triple2));
-    }
-
-    @Test
-    public void testComparable1() throws Exception {
-        final Triple<String, String, String> triple1 = Triple.of("A", "D", "A");
-        final Triple<String, String, String> triple2 = Triple.of("B", "C", "A");
-        assertTrue(triple1.compareTo(triple1) == 0);
-        assertTrue(triple1.compareTo(triple2) < 0);
-        assertTrue(triple2.compareTo(triple2) == 0);
-        assertTrue(triple2.compareTo(triple1) > 0);
-    }
-
-    @Test
-    public void testComparable2() throws Exception {
-        final Triple<String, String, String> triple1 = Triple.of("A", "C", "B");
-        final Triple<String, String, String> triple2 = Triple.of("A", "D", "B");
-        assertTrue(triple1.compareTo(triple1) == 0);
-        assertTrue(triple1.compareTo(triple2) < 0);
-        assertTrue(triple2.compareTo(triple2) == 0);
-        assertTrue(triple2.compareTo(triple1) > 0);
-    }
-
-    @Test
-    public void testComparable3() throws Exception {
-        final Triple<String, String, String> triple1 = Triple.of("A", "A", "D");
-        final Triple<String, String, String> triple2 = Triple.of("A", "B", "C");
-        assertTrue(triple1.compareTo(triple1) == 0);
-        assertTrue(triple1.compareTo(triple2) < 0);
-        assertTrue(triple2.compareTo(triple2) == 0);
-        assertTrue(triple2.compareTo(triple1) > 0);
-    }
-
-    @Test
-    public void testComparable4() throws Exception {
-        final Triple<String, String, String> triple1 = Triple.of("B", "A", "C");
-        final Triple<String, String, String> triple2 = Triple.of("B", "A", "D");
-        assertTrue(triple1.compareTo(triple1) == 0);
-        assertTrue(triple1.compareTo(triple2) < 0);
-        assertTrue(triple2.compareTo(triple2) == 0);
-        assertTrue(triple2.compareTo(triple1) > 0);
-    }
-
-    @Test
-    public void testToString() throws Exception {
-        final Triple<String, String, String> triple = Triple.of("Key", "Something", "Value");
-        assertEquals("(Key,Something,Value)", triple.toString());
-    }
-
-    @Test
-    public void testToStringCustom() throws Exception {
-        final Calendar date = Calendar.getInstance();
-        date.set(2011, Calendar.APRIL, 25);
-        final Triple<String, String, Calendar> triple = Triple.of("DOB", "string", date);
-        assertEquals("Test created on " + "04-25-2011", triple.toString("Test created on %3$tm-%3$td-%3$tY"));
-    }
-
-    @Test
-    public void testFormattable_simple() throws Exception {
-        final Triple<String, String, String> triple = Triple.of("Key", "Something", "Value");
-        assertEquals("(Key,Something,Value)", String.format("%1$s", triple));
-    }
-
-    @Test
-    public void testFormattable_padded() throws Exception {
-        final Triple<String, String, String> triple = Triple.of("Key", "Something", "Value");
-        assertEquals("         (Key,Something,Value)", String.format("%1$30s", triple));
-    }
-
-}
-
diff --git a/lang/src/test/resources/java.policy b/lang/src/test/resources/java.policy
deleted file mode 100644
index f3b2a30..0000000
--- a/lang/src/test/resources/java.policy
+++ /dev/null
@@ -1,377 +0,0 @@
-//

-// Licensed to the Apache Software Foundation (ASF) under one or more

-// contributor license agreements.  See the NOTICE file distributed with

-// this work for additional information regarding copyright ownership.

-// The ASF licenses this file to You under the Apache License, Version 2.0

-// (the "License"); you may not use this file except in compliance with

-// the License.  You may obtain a copy of the License at

-//

-//     http://www.apache.org/licenses/LICENSE-2.0

-//

-// Unless required by applicable law or agreed to in writing, software

-// distributed under the License is distributed on an "AS IS" BASIS,

-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.

-// See the License for the specific language governing permissions and

-// limitations under the License.

-//

-

-//

-// $Id$

-//

-// Allows unit tests to run with a Java Security Manager

-//

-// Tested from Eclipse 3.7 with the CLI:

-//

-// -Djava.security.manager -Djava.security.policy=file:src/test/resources/java.policy

-//

-// Tested from Maven 3.0.3 with the Surfire 2.8.1 configuration:

-//

-// <argLine>-Djava.security.manager -Djava.security.policy=${basedir}/src/test/resources/java.policy</argLine>

-//

-// This policy file documents why each permission is granted by listing exceptions in comments.

-//

-// This policy file grants permission as narrowly as possible.

-//

- 

-grant { 

-

-// Found using Eclipse 3.7

-// java.security.AccessControlException: access denied (java.io.FilePermission C:\Users\ggregory\AppData\Local\Temp\testNames8413758989552151476.txt read)

-//	at java.security.AccessControlContext.checkPermission(AccessControlContext.java:264)

-//	at java.security.AccessController.checkPermission(AccessController.java:427)

-//	at java.lang.SecurityManager.checkPermission(SecurityManager.java:532)

-//	at java.lang.SecurityManager.checkRead(SecurityManager.java:871)

-//	at java.io.FileInputStream.<init>(FileInputStream.java:100)

-//	at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.readTestNames(RemoteTestRunner.java:336)

-//	at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.defaultInit(RemoteTestRunner.java:251)

-//	at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.init(RemoteTestRunner.java:212)

-//	at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:196)

-

-  permission java.io.FilePermission "${java.io.tmpdir}/-", "read";

-

-

-// Found using Eclipse 3.7

-// java.security.AccessControlException: access denied (java.net.SocketPermission 127.0.0.1:58691 connect,resolve)

-//	at java.security.AccessControlContext.checkPermission(AccessControlContext.java:264)

-//	at java.security.AccessController.checkPermission(AccessController.java:427)

-//	at java.lang.SecurityManager.checkPermission(SecurityManager.java:532)

-//	at java.lang.SecurityManager.checkConnect(SecurityManager.java:1034)

-//	at java.net.Socket.connect(Socket.java:518)

-//	at java.net.Socket.connect(Socket.java:474)

-//	at java.net.Socket.<init>(Socket.java:371)

-//	at java.net.Socket.<init>(Socket.java:184)

-//	at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.connect(RemoteTestRunner.java:570)

-//	at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:381)

-//	at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:197)

-

-  permission java.net.SocketPermission "localhost", "connect,resolve";

-

-

-// All others found using Surefire 2.8.1

-// java.security.AccessControlException: access denied (java.io.FilePermission C:\svn\org\apache\commons\trunks-proper\lang\target\surefire\surefire795889196143891944tmp read)

-//   at java.security.AccessControlContext.checkPermission(AccessControlContext.java:374)

-//   at java.security.AccessController.checkPermission(AccessController.java:546)

-//   at java.lang.SecurityManager.checkPermission(SecurityManager.java:532)

-//   at java.lang.SecurityManager.checkRead(SecurityManager.java:871)

-//   at java.io.FileInputStream.<init>(FileInputStream.java:100)

-//   at org.apache.maven.surefire.booter.SystemPropertyManager.loadProperties(SystemPropertyManager.java:62)

-//   at org.apache.maven.surefire.booter.SystemPropertyManager.setSystemProperties(SystemPropertyManager.java:69)

-//   at org.apache.maven.surefire.booter.ForkedBooter.main(ForkedBooter.java:56)

-

-  permission java.io.FilePermission "target/surefire/*", "read";

-

-

-// java.security.AccessControlException: access denied (java.util.PropertyPermission user.dir write)

-//   at java.security.AccessControlContext.checkPermission(AccessControlContext.java:374)

-//   at java.security.AccessController.checkPermission(AccessController.java:546)

-//   at java.lang.SecurityManager.checkPermission(SecurityManager.java:532)

-//   at java.lang.System.setProperty(System.java:725)

-//   at org.apache.maven.surefire.booter.PropertiesWrapper.setAsSystemProperties(PropertiesWrapper.java:60)

-//   at org.apache.maven.surefire.booter.SystemPropertyManager.setSystemProperties(SystemPropertyManager.java:70)

-//   at org.apache.maven.surefire.booter.ForkedBooter.main(ForkedBooter.java:56)

-

-  permission java.util.PropertyPermission "user.dir", "write";

-

-

-// Found using Surefire 2.8.1

-// java.security.AccessControlException: access denied (java.util.PropertyPermission localRepository write)

-//   at java.security.AccessControlContext.checkPermission(AccessControlContext.java:374)

-//   at java.security.AccessController.checkPermission(AccessController.java:546)

-//   at java.lang.SecurityManager.checkPermission(SecurityManager.java:532)

-//   at java.lang.System.setProperty(System.java:725)

-//   at org.apache.maven.surefire.booter.PropertiesWrapper.setAsSystemProperties(PropertiesWrapper.java:60)

-//   at org.apache.maven.surefire.booter.SystemPropertyManager.setSystemProperties(SystemPropertyManager.java:70)

-//   at org.apache.maven.surefire.booter.ForkedBooter.main(ForkedBooter.java:56)

-

-  permission java.util.PropertyPermission "localRepository", "write";

-

-

-// java.security.AccessControlException: access denied (java.util.PropertyPermission basedir write)

-//   at java.security.AccessControlContext.checkPermission(AccessControlContext.java:374)

-//   at java.security.AccessController.checkPermission(AccessController.java:546)

-//   at java.lang.SecurityManager.checkPermission(SecurityManager.java:532)

-//   at java.lang.System.setProperty(System.java:725)

-//   at org.apache.maven.surefire.booter.PropertiesWrapper.setAsSystemProperties(PropertiesWrapper.java:60)

-//   at org.apache.maven.surefire.booter.SystemPropertyManager.setSystemProperties(SystemPropertyManager.java:70)

-//   at org.apache.maven.surefire.booter.ForkedBooter.main(ForkedBooter.java:56)

-

-  permission java.util.PropertyPermission "basedir", "write";

-

-

-// java.security.AccessControlException: access denied (java.util.PropertyPermission surefire.test.class.path write)

-//            at java.security.AccessControlContext.checkPermission(AccessControlContext.java:374)

-//            at java.security.AccessController.checkPermission(AccessController.java:546)

-//            at java.lang.SecurityManager.checkPermission(SecurityManager.java:532)

-//            at java.lang.System.setProperty(System.java:725)

-//            at org.apache.maven.surefire.booter.Classpath.writeToSystemProperty(Classpath.java:112)

-//            at org.apache.maven.surefire.booter.SurefireStarter.writeSurefireTestClasspathProperty(SurefireStarter.java:118)

-//            at org.apache.maven.surefire.booter.SurefireStarter.createInProcessTestClassLoader(SurefireStarter.java:98)

-//            at org.apache.maven.surefire.booter.SurefireStarter.runSuitesInProcess(SurefireStarter.java:85)

-//            at org.apache.maven.surefire.booter.ForkedBooter.main(ForkedBooter.java:69)}

-

-// java.lang.reflect.UndeclaredThrowableException

-//    at $Proxy0.invoke(Unknown Source)

-//    at org.apache.maven.surefire.booter.SurefireStarter.invokeProvider(SurefireStarter.java:150)

-//    at org.apache.maven.surefire.booter.SurefireStarter.runSuitesInProcess(SurefireStarter.java:91)

-//    at org.apache.maven.surefire.booter.ForkedBooter.main(ForkedBooter.java:69)

-//Caused by: java.lang.reflect.InvocationTargetException

-//    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)

-//    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)

-//    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)

-//    at java.lang.reflect.Method.invoke(Method.java:597)

-//    at org.apache.maven.surefire.booter.ProviderFactory$ClassLoaderProxy.invoke(ProviderFactory.java:103)

-//    ... 4 more

-//Caused by: java.security.AccessControlException: access denied (java.util.PropertyPermission surefire.junit4.upgradecheck read)

-//    at java.security.AccessControlContext.checkPermission(AccessControlContext.java:374)

-//    at java.security.AccessController.checkPermission(AccessController.java:546)

-//    at java.lang.SecurityManager.checkPermission(SecurityManager.java:532)

-//    at java.lang.SecurityManager.checkPropertyAccess(SecurityManager.java:1285)

-//    at java.lang.System.getProperty(System.java:650)

-//    at org.apache.maven.surefire.junit4.JUnit4Provider.isJunit4UpgradeCheck(JUnit4Provider.java:193)

-//    at org.apache.maven.surefire.junit4.JUnit4Provider.upgradeCheck(JUnit4Provider.java:174)

-//    at org.apache.maven.surefire.junit4.JUnit4Provider.invoke(JUnit4Provider.java:91)

-

-  permission java.util.PropertyPermission "*", "write, read";

-

-

-//    java.security.AccessControlException: access denied (java.util.PropertyPermission java.class.path read)

-//            at java.security.AccessControlContext.checkPermission(AccessControlContext.java:374)

-//            at java.security.AccessController.checkPermission(AccessController.java:546)

-//            at java.lang.SecurityManager.checkPermission(SecurityManager.java:532)

-//            at java.lang.SecurityManager.checkPropertyAccess(SecurityManager.java:1285)

-//            at java.lang.System.getProperty(System.java:650)

-//            at org.apache.maven.surefire.booter.SurefireStarter.createInProcessTestClassLoader(SurefireStarter.java:105)

-//            at org.apache.maven.surefire.booter.SurefireStarter.runSuitesInProcess(SurefireStarter.java:85)

-//            at org.apache.maven.surefire.booter.ForkedBooter.main(ForkedBooter.java:69)

-//

-

-//    java.security.AccessControlException: access denied (java.util.PropertyPermission java.class.path write)

-//            at java.security.AccessControlContext.checkPermission(AccessControlContext.java:374)

-//            at java.security.AccessController.checkPermission(AccessController.java:546)

-//            at java.lang.SecurityManager.checkPermission(SecurityManager.java:532)

-//            at java.lang.System.setProperty(System.java:725)

-//            at org.apache.maven.surefire.booter.Classpath.writeToSystemProperty(Classpath.java:112)

-//            at org.apache.maven.surefire.booter.SurefireStarter.createInProcessTestClassLoader(SurefireStarter.java:106)

-//            at org.apache.maven.surefire.booter.SurefireStarter.runSuitesInProcess(SurefireStarter.java:85)

-//            at org.apache.maven.surefire.booter.ForkedBooter.main(ForkedBooter.java:69)

-

-  permission java.util.PropertyPermission "java.class.path", "read, write";

-

-

-//    java.security.AccessControlException: access denied (java.io.FilePermission C:\Users\ggregory\.m2\repository\org\apache\maven\surefire\surefire-junit4\2.8.1\surefire-junit4-2.8.1.jar read)

-//            at java.security.AccessControlContext.checkPermission(AccessControlContext.java:374)

-//            at java.security.AccessController.checkPermission(AccessController.java:546)

-//            at java.lang.SecurityManager.checkPermission(SecurityManager.java:532)

-//            at java.lang.SecurityManager.checkRead(SecurityManager.java:871)

-//            at java.io.File.isDirectory(File.java:752)

-//            at java.io.File.toURL(File.java:623)

-//            at org.apache.maven.surefire.util.UrlUtils.getURL(UrlUtils.java:67)

-//            at org.apache.maven.surefire.booter.Classpath.getAsUrlList(Classpath.java:100)

-//            at org.apache.maven.surefire.booter.ClasspathConfiguration.createClassLoader(ClasspathConfiguration.java:151)

-//            at org.apache.maven.surefire.booter.ClasspathConfiguration.createClassLoaderSEE(ClasspathConfiguration.java:139)

-//            at org.apache.maven.surefire.booter.ClasspathConfiguration.createSurefireClassLoader(ClasspathConfiguration.java:131)

-//            at org.apache.maven.surefire.booter.SurefireStarter.runSuitesInProcess(SurefireStarter.java:89)

-//            at org.apache.maven.surefire.booter.ForkedBooter.main(ForkedBooter.java:69)

-

-  permission java.io.FilePermission "${user.home}/.m2/repository/org/apache/maven/surefire/surefire-junit4/2.8.1/surefire-junit4-2.8.1.jar", "read";

-  permission java.io.FilePermission "${user.home}/.m2/repository/org/apache/maven/surefire/surefire-junit4/2.9/surefire-junit4-2.9.jar", "read";

-

-

-//    java.security.AccessControlException: access denied (java.io.FilePermission C:\Users\ggregory\.m2\repository\org\apache\maven\surefire\surefire-api\2.8.1\surefire-api-2.8.1.jar read)

-//at java.security.AccessControlContext.checkPermission(AccessControlContext.java:374)

-//at java.security.AccessController.checkPermission(AccessController.java:546)

-//at java.lang.SecurityManager.checkPermission(SecurityManager.java:532)

-//at java.lang.SecurityManager.checkRead(SecurityManager.java:871)

-//at java.io.File.isDirectory(File.java:752)

-//at java.io.File.toURL(File.java:623)

-//at org.apache.maven.surefire.util.UrlUtils.getURL(UrlUtils.java:67)

-//at org.apache.maven.surefire.booter.Classpath.getAsUrlList(Classpath.java:100)

-//at org.apache.maven.surefire.booter.ClasspathConfiguration.createClassLoader(ClasspathConfiguration.java:151)

-//at org.apache.maven.surefire.booter.ClasspathConfiguration.createClassLoaderSEE(ClasspathConfiguration.java:139)

-//at org.apache.maven.surefire.booter.ClasspathConfiguration.createSurefireClassLoader(ClasspathConfiguration.java:131)

-//at org.apache.maven.surefire.booter.SurefireStarter.runSuitesInProcess(SurefireStarter.java:89)

-//at org.apache.maven.surefire.booter.ForkedBooter.main(ForkedBooter.java:69)

-

-  permission java.io.FilePermission "${user.home}/.m2/repository/org/apache/maven/surefire/surefire-api/2.8.1/surefire-api-2.8.1.jar", "read";

-  permission java.io.FilePermission "${user.home}/.m2/repository/org/apache/maven/surefire/surefire-api/2.9/surefire-api-2.9.jar", "read";

-

-

-//    java.security.AccessControlException: access denied (java.lang.RuntimePermission createClassLoader)

-//at java.security.AccessControlContext.checkPermission(AccessControlContext.java:374)

-//at java.security.AccessController.checkPermission(AccessController.java:546)

-//at java.lang.SecurityManager.checkPermission(SecurityManager.java:532)

-//at java.lang.SecurityManager.checkCreateClassLoader(SecurityManager.java:594)

-//at java.lang.ClassLoader.checkCreateClassLoader(ClassLoader.java:178)

-//at java.lang.ClassLoader.<init>(ClassLoader.java:207)

-//at java.security.SecureClassLoader.<init>(SecureClassLoader.java:70)

-//at java.net.URLClassLoader.<init>(URLClassLoader.java:84)

-//at org.apache.maven.surefire.booter.IsolatedClassLoader.<init>(IsolatedClassLoader.java:43)

-//at org.apache.maven.surefire.booter.ClasspathConfiguration.createClassLoader(ClasspathConfiguration.java:152)

-//at org.apache.maven.surefire.booter.ClasspathConfiguration.createClassLoaderSEE(ClasspathConfiguration.java:139)

-//at org.apache.maven.surefire.booter.ClasspathConfiguration.createSurefireClassLoader(ClasspathConfiguration.java:131)

-//at org.apache.maven.surefire.booter.SurefireStarter.runSuitesInProcess(SurefireStarter.java:89)

-//at org.apache.maven.surefire.booter.ForkedBooter.main(ForkedBooter.java:69)

-

-  permission java.lang.RuntimePermission "createClassLoader";

-

-//    java.security.AccessControlException: access denied (java.lang.RuntimePermission setContextClassLoader)

-//at java.security.AccessControlContext.checkPermission(AccessControlContext.java:374)

-//at java.security.AccessController.checkPermission(AccessController.java:546)

-//at java.lang.SecurityManager.checkPermission(SecurityManager.java:532)

-//at java.lang.Thread.setContextClassLoader(Thread.java:1394)

-//at org.apache.maven.surefire.booter.ProviderFactory.createProvider(ProviderFactory.java:61)

-//at org.apache.maven.surefire.booter.SurefireStarter.invokeProvider(SurefireStarter.java:146)

-//at org.apache.maven.surefire.booter.SurefireStarter.runSuitesInProcess(SurefireStarter.java:91)

-//at org.apache.maven.surefire.booter.ForkedBooter.main(ForkedBooter.java:69)

-

-  permission java.lang.RuntimePermission "setContextClassLoader";

-  

-//    java.security.AccessControlException: access denied (java.lang.RuntimePermission setIO)

-//            at java.security.AccessControlContext.checkPermission(AccessControlContext.java:374)

-//            at java.security.AccessController.checkPermission(AccessController.java:546)

-//            at java.lang.SecurityManager.checkPermission(SecurityManager.java:532)

-//            at java.lang.System.checkIO(System.java:225)

-//            at java.lang.System.setOut(System.java:147)

-//            at org.apache.maven.surefire.booter.SurefireStarter.invokeProvider(SurefireStarter.java:162)

-//            at org.apache.maven.surefire.booter.SurefireStarter.runSuitesInProcess(SurefireStarter.java:91)

-//            at org.apache.maven.surefire.booter.ForkedBooter.main(ForkedBooter.java:69)

-  

-  permission java.lang.RuntimePermission "setIO";

-

-  

-//    java.lang.reflect.UndeclaredThrowableException

-//    at $Proxy0.invoke(Unknown Source)

-//    at org.apache.maven.surefire.booter.SurefireStarter.invokeProvider(SurefireStarter.java:150)

-//    at org.apache.maven.surefire.booter.SurefireStarter.runSuitesInProcess(SurefireStarter.java:91)

-//    at org.apache.maven.surefire.booter.ForkedBooter.main(ForkedBooter.java:69)

-//Caused by: java.lang.reflect.InvocationTargetException

-//    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)

-//    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)

-//    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)

-//    at java.lang.reflect.Method.invoke(Method.java:597)

-//    at org.apache.maven.surefire.booter.ProviderFactory$ClassLoaderProxy.invoke(ProviderFactory.java:103)

-//    ... 4 more

-//Caused by: java.security.AccessControlException: access denied (java.io.FilePermission C:\svn\org\apache\commons\trunks-proper\lang\target\test-classes read)

-//    at java.security.AccessControlContext.checkPermission(AccessControlContext.java:374)

-//    at java.security.AccessController.checkPermission(AccessController.java:546)

-//    at java.lang.SecurityManager.checkPermission(SecurityManager.java:532)

-//    at java.lang.SecurityManager.checkRead(SecurityManager.java:871)

-//    at java.io.File.exists(File.java:731)

-//    at org.apache.maven.surefire.util.DefaultDirectoryScanner.collectTests(DefaultDirectoryScanner.java:118)

-//    at org.apache.maven.surefire.util.DefaultDirectoryScanner.locateTestClasses(DefaultDirectoryScanner.java:71)

-//    at org.apache.maven.surefire.junit4.JUnit4Provider.scanClassPath(JUnit4Provider.java:168)

-//    at org.apache.maven.surefire.junit4.JUnit4Provider.invoke(JUnit4Provider.java:88)

-//    ... 9 more

-  

-  permission java.io.FilePermission "${user.dir}/target/test-classes", "read";

-  permission java.io.FilePermission "${user.dir}/target/test-classes/-", "read";

-

-

-//    java.lang.reflect.UndeclaredThrowableException

-//    at $Proxy0.invoke(Unknown Source)

-//    at org.apache.maven.surefire.booter.SurefireStarter.invokeProvider(SurefireStarter.java:150)

-//    at org.apache.maven.surefire.booter.SurefireStarter.runSuitesInProcess(SurefireStarter.java:91)

-//    at org.apache.maven.surefire.booter.ForkedBooter.main(ForkedBooter.java:69)

-//Caused by: java.lang.reflect.InvocationTargetException

-//    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)

-//    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)

-//    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)

-//    at java.lang.reflect.Method.invoke(Method.java:597)

-//    at org.apache.maven.surefire.booter.ProviderFactory$ClassLoaderProxy.invoke(ProviderFactory.java:103)

-//    ... 4 more

-//Caused by: java.security.AccessControlException: access denied (java.lang.RuntimePermission accessDeclaredMembers)

-//    at java.security.AccessControlContext.checkPermission(AccessControlContext.java:374)

-//    at java.security.AccessController.checkPermission(AccessController.java:546)

-//    at java.lang.SecurityManager.checkPermission(SecurityManager.java:532)

-//    at java.lang.SecurityManager.checkMemberAccess(SecurityManager.java:1662)

-//    at java.lang.Class.checkMemberAccess(Class.java:2157)

-//    at java.lang.Class.getDeclaredMethods(Class.java:1790)

-//    at org.apache.maven.surefire.common.junit4.JUnit4TestChecker.checkforTestAnnotatedMethod(JUnit4TestChecker.java:83)

-//    at org.apache.maven.surefire.common.junit4.JUnit4TestChecker.isValidJUnit4Test(JUnit4TestChecker.java:72)

-//    at org.apache.maven.surefire.common.junit4.JUnit4TestChecker.accept(JUnit4TestChecker.java:52)

-//    at org.apache.maven.surefire.util.DefaultDirectoryScanner.locateTestClasses(DefaultDirectoryScanner.java:80)

-//    at org.apache.maven.surefire.junit4.JUnit4Provider.scanClassPath(JUnit4Provider.java:168)

-//    at org.apache.maven.surefire.junit4.JUnit4Provider.invoke(JUnit4Provider.java:88)

-

-  permission java.lang.RuntimePermission "accessDeclaredMembers";

-

-

-// java.lang.reflect.UndeclaredThrowableException

-//    at $Proxy0.invoke(Unknown Source)

-//Running org.apache.commons.lang3.AnnotationUtilsTest

-//    at org.apache.maven.surefire.booter.SurefireStarter.invokeProvider(SurefireStarter.java:150)

-//    at org.apache.maven.surefire.booter.SurefireStarter.runSuitesInProcess(SurefireStarter.java:91)

-//    at org.apache.maven.surefire.booter.ForkedBooter.main(ForkedBooter.java:69)

-//Caused by: java.lang.reflect.InvocationTargetException

-//    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)

-//    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)

-//    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)

-//    at java.lang.reflect.Method.invoke(Method.java:597)

-//    at org.apache.maven.surefire.booter.ProviderFactory$ClassLoaderProxy.invoke(ProviderFactory.java:103)

-//    ... 4 more

-//Caused by: java.security.AccessControlException: access denied (java.io.FilePermission C:\svn\org\apache\commons\trunks-proper\lang\target\surefire-reports read)

-//    at java.security.AccessControlContext.checkPermission(AccessControlContext.java:374)

-//    at java.security.AccessController.checkPermission(AccessController.java:546)

-//    at java.lang.SecurityManager.checkPermission(SecurityManager.java:532)

-//    at java.lang.SecurityManager.checkRead(SecurityManager.java:871)

-//    at java.io.File.exists(File.java:731)

-//    at java.io.File.mkdirs(File.java:1181)

-//    at org.apache.maven.surefire.report.AbstractFileReporter.testSetStarting(AbstractFileReporter.java:59)

-//    at org.apache.maven.surefire.report.MulticastingReporter.testSetStarting(MulticastingReporter.java:45)

-//    at org.apache.maven.surefire.report.TestSetRunListener.testSetStarting(TestSetRunListener.java:131)

-//    at org.apache.maven.surefire.junit4.JUnit4Provider.executeTestSet(JUnit4Provider.java:115)

-//    at org.apache.maven.surefire.junit4.JUnit4Provider.invoke(JUnit4Provider.java:101)

-

-//    java.lang.reflect.UndeclaredThrowableException

-//    at $Proxy0.invoke(Unknown Source)

-//Running org.apache.commons.lang3.AnnotationUtilsTest

-//    at org.apache.maven.surefire.booter.SurefireStarter.invokeProvider(SurefireStarter.java:150)

-//    at org.apache.maven.surefire.booter.SurefireStarter.runSuitesInProcess(SurefireStarter.java:91)

-//    at org.apache.maven.surefire.booter.ForkedBooter.main(ForkedBooter.java:69)

-//Caused by: java.lang.reflect.InvocationTargetException

-//    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)

-//    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)

-//    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)

-//    at java.lang.reflect.Method.invoke(Method.java:597)

-//    at org.apache.maven.surefire.booter.ProviderFactory$ClassLoaderProxy.invoke(ProviderFactory.java:103)

-//    ... 4 more

-//Caused by: java.security.AccessControlException: access denied (java.io.FilePermission C:\svn\org\apache\commons\trunks-proper\lang\target\surefire-reports write)

-//    at java.security.AccessControlContext.checkPermission(AccessControlContext.java:374)

-//    at java.security.AccessController.checkPermission(AccessController.java:546)

-//    at java.lang.SecurityManager.checkPermission(SecurityManager.java:532)

-//    at java.lang.SecurityManager.checkWrite(SecurityManager.java:962)

-//    at java.io.File.mkdir(File.java:1155)

-//    at java.io.File.mkdirs(File.java:1184)

-//    at org.apache.maven.surefire.report.AbstractFileReporter.testSetStarting(AbstractFileReporter.java:59)

-//    at org.apache.maven.surefire.report.MulticastingReporter.testSetStarting(MulticastingReporter.java:45)

-//    at org.apache.maven.surefire.report.TestSetRunListener.testSetStarting(TestSetRunListener.java:131)

-//    at org.apache.maven.surefire.junit4.JUnit4Provider.executeTestSet(JUnit4Provider.java:115)

-//    at org.apache.maven.surefire.junit4.JUnit4Provider.invoke(JUnit4Provider.java:101)

-//    ... 9 more  

-

-  permission java.io.FilePermission "target/surefire-reports", "read, write";

-  permission java.io.FilePermission "target/surefire-reports/*", "read, write";

-

-};

-

-

diff --git a/lang/src/test/resources/lang-708-input.txt b/lang/src/test/resources/lang-708-input.txt
deleted file mode 100644
index 4e75f67..0000000
--- a/lang/src/test/resources/lang-708-input.txt
+++ /dev/null
@@ -1 +0,0 @@
-[{"geonameFeatureClass":"L","values":{"eu":"Mundua","ro":"Pamânt","it":"Globo","ca":"el món","tr":"Yeryüzü","no":"Jorden","hu":"Föld","lv":"Zeme","de":"Welt","el":"Υδρόγειος","fi":"Maa","la":"Terra","fr":"Monde","eo":"Mondo","en":"World","ru":"Земля","es":"el planeta","nl":"Aarde"},"geonameFeatureCode":"AREA","_id":32,"name":"","auto":true,"type":"GEO","geonameId":6295630,"valueCode":""},{"geonameFeatureClass":"L","values":{"ro":"Europa","zh":"欧洲","ca":"Europa","vi":"Châu Âu","tr":"Avrupa","no":"Europa","hu":"Európa","lv":"Eiropa","hi":"यूरोप","lt":"Europa","bs":"Evropa","ga":"an Eoraip","th":"ยุโรป","id":"Eropa","de":"Europa","fi":"Eurooppa","fr":"Europe","sv":"Europa","bg":"Европа","da":"Europa","eu":"Europa","is":"Evrópa","it":"Europa","cy":"Ewrop","ar":"أوروبا","se":"Eurohpá","he":"אירופה","cs":"Evropa","el":"Ευρώπη","nb":"Europa","pl":"Europa","la":"Europa","pt":"Europa","eo":"Eŭropo","en":"Europe","ru":"Европа","es":"Europa","ja":"ヨーロッパ","nl":"Europa"},"geonameFeatureCode":"CONT","_id":33,"name":"","auto":true,"type":"GEO","geonameId":6255148,"valueCode":""},{"geonameFeatureClass":"A","values":{"no":"Spania","nn":"Spania","fy":"Spanje","gd":"An Spàinn","ga":"An Spáinn","oc":"Espanha","arc":"ܐܣܦܢܝܐ","fi":"Espanja","fr":"Espagne","fo":"Spania","udm":"Испания","os":"Испани","he":"ספרד","gn":"Epaña","gl":"España","gv":"Yn Spaainey","pl":"Hiszpania","gu":"સ્પેઇન","lo":"ສະເປນ","ln":"Espania","vi":"Tây Ban Nha","dz":"Spain","pms":"Spagna","lv":"Spānija","lt":"Ispanija","vo":"Spanyän","de":"Spanien","mg":"Espaina","fur":"Spagne","mk":"Шпанија","ml":"സ്പെയ്ന്\u200D","ceb":"Espanya","mi":"Pāniora","uk":"Іспанія","eu":"Espainia","mr":"स्पेन","ug":"ئىسپانىيە","mt":"Spanja","ms":"Sepanyol","ur":"سپین","fa":"اسپانیا","ty":"Paniora","new":"स्पेन","na":"Pain","el":"Ισπανία","nb":"Spania","ne":"स्पेन","vls":"Spanje","eo":"Hispanio","en":"Kingdom of Spain","et":"Hispaania","es":"la Madre Patria","nl":"Spanje","vec":"Spagna","to":"Sepeni","ca":"Espanya","tl":"Espanya","tr":"İspanya","tg":"Испониё","haw":"Sepania","bs":"Španija","br":"Spagn","th":"ประเทศสเปน","bn":"স্পেন","bo":"སི་པན།","ta":"ஸ்பெயின்","sv":"Spanien","bg":"Испания","ka":"ესპანეთი","st":"Spain","sw":"Hispania","be":"Іспанія","kw":"Spayn","sl":"Španija","sk":"Španielsko","da":"Spanien","ang":"Spēonland","nds":"Spanien","ks":"Spēna","so":"Isbeyn","ku":"Spanya","sr":"Шпанија","sq":"Spanja","ko":"에스파냐","sc":"Ispagna","cy":"Sbaen","se":"Espánjja","sh":"Španija","cv":"Испани","km":"អេស្ប៉ាញ","cs":"Španělsko","li":"Spanje","co":"Spagna","default":"Spain","jbo":"sangu'e","la":"Hesperia","ru":"Испания","lb":"Spuenien","sco":"Spain","tet":"España","scn":"Spagna","hr":"Španjolska","zh":"西班牙","ro":"Spania","rm":"Spagna","ht":"Espay","hu":"Spanyolország","ast":"España","hi":"स्पेन","hsb":"Španiska","nah":"Caxtillān","war":"Espanya","lad":"Espanya","id":"Spanyol","ia":"Espania","nrm":"Espangne","hy":"Իսպանիա","qu":"Ispaña","ilo":"Espania","az":"İspaniya","is":"Spánn","it":"Spagna","tpi":"Spen","ar":"أسبانيا","io":"Hispania","pam":"Espanya","frp":"Èspagne","am":"እስፓንያ","an":"España","csb":"Szpańskô","pt":"Espanha","ja":"スペイン","ps":"اسپانيا","yi":"שפאניע","af":"Spanje"},"geonameFeatureCode":"PCLI","_id":260,"name":"","auto":true,"type":"GEO","geonameId":2510769,"valueCode":""},{"geonameFeatureClass":"A","values":{"ca":"Andalusia","tr":"Endülüs","krc":"Андалусия","no":"Andalucía","fy":"Andalûsje","bs":"Andaluzija","br":"Andalouzia","ext":"Andaluzia","ga":"An Andalúis","th":"แคว้นอันดาลูซีอา","bn":"আন্দালুসিয়া","oc":"Andalosia","ka":"ანდალუსია","sv":"Andalusien","fr":"Andalousie","bg":"Андалусия","glk":"آندالوسیا","be":"Андалусія","kw":"Andalousi","sk":"Andalúzia","os":"Андалуси","da":"Andalusien","sr":"Андалузија","ku":"Endulus","ko":"안달루시아 지방","he":"אנדלוסיה","sh":"Andaluzija","arz":"اندلوسيا","cs":"Andalusie","default":"Andalusia","stq":"Andalusien","la":"Vandalitia","pl":"Andaluzja","ru":"Андалусия","lb":"Andalusien","tet":"Andaluzia","got":"𐍅𐌰𐌽𐌳𐌰𐌻𐌹𐍄𐌾𐌰","hr":"Andaluzija","zh":"安達魯西亞","ro":"Andaluzia","hu":"Andalúzia","pms":"Andalusìa","lv":"Andalūzija","lt":"Andalūzija","nah":"Andalucia","lad":"Andaluziya","de":"Andalusien","als":"Andalusien","qu":"Andalusiya","hy":"Անդալուզիա","eu":"Andaluzia","is":"Andalúsía","uk":"Андалусія","az":"Andalusiya","mr":"आंदालुसिया","ug":"Andalusiye","fa":"اندلس","ar":"أندلوسيا","rmy":"Andalusiya","io":"Andaluzia","el":"Ανδαλουσία","frp":"Andalosie","pt":"Andaluzia","eo":"Andaluzio","en":"Andalusia","et":"Andaluusia","es":"Andalucía","ja":"アンダルシア州","nl":"Andalusië","af":"Andalusië","vec":"Andalusìa"},"geonameFeatureCode":"ADM1","_id":261,"name":"","auto":true,"type":"GEO","geonameId":2593109,"valueCode":""},{"geonameFeatureClass":"A","values":{"de":"Granada","default":"Province of Granada","fr":"Grenade","en":"Province of Granada","es":"Provincia de Granada","ja":"グラナダ"},"geonameFeatureCode":"ADM2","_id":262,"name":"","auto":true,"type":"GEO","geonameId":2517115,"valueCode":""},{"geonameFeatureClass":"A","values":{"default":"Monachil"},"geonameFeatureCode":"ADM3","_id":263,"name":"","auto":true,"type":"GEO","geonameId":6357744,"valueCode":""},{"geonameFeatureClass":"P","values":{"default":"Sierra Nevada"},"geonameFeatureCode":"PPL","_id":264,"name":"","auto":true,"type":"GEO","geonameId":6544329,"valueCode":""}]
\ No newline at end of file
diff --git a/pom.xml b/pom.xml
index 240364c..f5cb532 100644
--- a/pom.xml
+++ b/pom.xml
@@ -45,9 +45,9 @@
   </issueManagement>
 
   <scm>
-    <connection>scm:svn:http://svn.apache.org/repos/asf/commons/proper/lang/trunk</connection>
-    <developerConnection>scm:svn:https://svn.apache.org/repos/asf/commons/proper/lang/trunk</developerConnection>
-    <url>http://svn.apache.org/viewvc/commons/proper/lang/trunk</url>
+    <connection>scm:svn:http://svn.apache.org/repos/asf/commons/proper/lang/tags/LANG_3_4_RC1</connection>
+    <developerConnection>scm:svn:https://svn.apache.org/repos/asf/commons/proper/lang/tags/LANG_3_4_RC1</developerConnection>
+    <url>http://svn.apache.org/viewvc/commons/proper/lang/tags/LANG_3_4_RC1</url>
   </scm>
 
   <developers>