You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@commons.apache.org by gg...@apache.org on 2019/12/25 03:32:56 UTC

[commons-vfs] 06/20: Local changes

This is an automated email from the ASF dual-hosted git repository.

ggregory pushed a commit to annotated tag japicmp-base-0.1.0
in repository https://gitbox.apache.org/repos/asf/commons-vfs.git

commit aeb5540b1be5b3ba367702754db8f08297883a34
Author: siom79 <ma...@googlemail.com>
AuthorDate: Thu May 22 23:32:08 2014 +0200

    Local changes
---
 .gitignore                                         |  16 +-
 LICENSE                                            | 382 ++++++++++-----------
 README.md~                                         | 109 ++++++
 japicmp-testbase/japicmp-test-v1/pom.xml           |  20 +-
 .../src/main/java/japicmp/test/Modifier.java       |  24 +-
 .../src/main/java/japicmp/test/Removed.java        |   8 +-
 .../src/main/java/japicmp/test/Unchanged.java      |  16 +-
 .../java/japicmp/test/packageOne/PackageOne.java   |   8 +-
 .../java/japicmp/test/packageTwo/PackageTwo.java   |   8 +-
 japicmp-testbase/japicmp-test-v2/pom.xml           |  20 +-
 .../src/main/java/japicmp/test/Added.java          |   8 +-
 .../src/main/java/japicmp/test/Modifier.java       |  24 +-
 .../src/main/java/japicmp/test/Unchanged.java      |  16 +-
 .../java/japicmp/test/packageOne/PackageOne.java   |   8 +-
 .../java/japicmp/test/packageTwo/PackageTwo.java   |   8 +-
 japicmp-testbase/japicmp-test/pom.xml              | 144 ++++----
 .../src/test/java/japicmp/test/BasicTest.java      |  72 ++--
 .../src/test/java/japicmp/test/ModifierTest.java   |  88 ++---
 .../test/java/japicmp/test/PackageFilterTest.java  | 192 +++++------
 .../src/test/java/japicmp/test/util/Helper.java    |  64 ++--
 japicmp-testbase/pom.xml                           |  34 +-
 japicmp/pom.xml                                    | 140 ++++----
 japicmp/src/main/java/japicmp/JApiCmp.java         | 200 +++++------
 japicmp/src/main/java/japicmp/cli/CliParser.java   | 238 ++++++-------
 .../src/main/java/japicmp/cmp/ClassComparator.java | 154 ++++-----
 .../main/java/japicmp/cmp/ClassesComparator.java   | 130 +++----
 .../java/japicmp/cmp/JarArchiveComparator.java     | 222 ++++++------
 .../japicmp/cmp/JarArchiveComparatorOptions.java   |  58 ++--
 japicmp/src/main/java/japicmp/config/Options.java  | 130 +++----
 .../main/java/japicmp/config/PackageFilter.java    |  36 +-
 .../java/japicmp/exception/JApiCmpException.java   |  44 +--
 .../main/java/japicmp/model/AccessModifier.java    |  30 +-
 .../main/java/japicmp/model/JApiChangeStatus.java  |  10 +-
 japicmp/src/main/java/japicmp/model/JApiClass.java | 206 +++++------
 .../src/main/java/japicmp/model/JApiMethod.java    | 162 ++++-----
 .../src/main/java/japicmp/model/JApiParameter.java |  32 +-
 .../java/japicmp/output/OutputTransformer.java     | 110 +++---
 .../output/stdout/StdoutOutputGenerator.java       | 142 ++++----
 .../japicmp/output/xml/XmlOutputGenerator.java     |  48 +--
 .../japicmp/output/xml/model/JApiCmpXmlRoot.java   |  86 ++---
 .../src/main/java/japicmp/util/ModifierHelper.java |  58 ++--
 .../main/java/japicmp/util/SignatureParser.java    | 206 +++++------
 .../java/japicmp/util/StringArrayEnumeration.java  |  54 +--
 japicmp/src/main/resources/log4j.properties        |  14 +-
 .../src/test/java/japicmp/cli/CliParserTest.java   |  80 ++---
 .../test/java/japicmp/cmp/PackageFilterTest.java   |  90 ++---
 .../test/java/japicmp/util/ModifierHelperTest.java |  82 ++---
 .../java/japicmp/util/SignatureParserTest.java     | 198 +++++------
 .../japicmp/util/StringArrayEnumerationTest.java   |  74 ++--
 pom.xml                                            | 320 ++++++++---------
 structure101.java.hsp                              | 281 +++++++++++++++
 51 files changed, 2647 insertions(+), 2257 deletions(-)

diff --git a/.gitignore b/.gitignore
index e2e9750..069d52e 100644
--- a/.gitignore
+++ b/.gitignore
@@ -1,8 +1,8 @@
-target
-.idea
-httpclient*.jar
-*.iml
-test.xml
-output.xml
-japicmp/guava-10.0.1.jar
-japicmp/guava-14.0.1.jar
+target
+.idea
+httpclient*.jar
+*.iml
+test.xml
+output.xml
+japicmp/guava-10.0.1.jar
+japicmp/guava-14.0.1.jar
diff --git a/LICENSE b/LICENSE
index 37ec93a..805e0da 100644
--- a/LICENSE
+++ b/LICENSE
@@ -1,191 +1,191 @@
-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:
-
-You must give any other recipients of the Work or Derivative Works a copy of
-this License; and
-You must cause any modified files to carry prominent notices stating that You
-changed the files; and
-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
-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.
+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:
+
+You must give any other recipients of the Work or Derivative Works a copy of
+this License; and
+You must cause any modified files to carry prominent notices stating that You
+changed the files; and
+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
+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/README.md~ b/README.md~
new file mode 100644
index 0000000..422f899
--- /dev/null
+++ b/README.md~
@@ -0,0 +1,109 @@
+japicmp
+=======
+
+japicmp is a tool to compare two versions of a jar archive:
+
+    java -jar japicmp-0.0.2.jar -n new-version.jar -o old-version.jar
+
+It can also be used as a library:
+
+	JarArchiveComparator jarArchiveComparator = new JarArchiveComparator();
+    List<JApiClass> jApiClasses = jarArchiveComparator.compare(oldArchive, newArchive);
+
+##Motivation##
+
+Every time you make a new release of a library or a product, you have to tell your clients or customers what
+has changed in comparison to the last release. Without the appropriate tooling, this task is tedious and error-prone.
+This tool/library helps you to determine the differences between the java class files that are contained in the two
+jar archives.
+In contrast to other libraries/tools, this library does not use the Java Reflection API to compute
+the differences, as the usage of the Reflection API makes it necessary to include all classes the jar archive under
+investigation depends on are available on the classpath. To prevent the inclusion of all dependent libraries, which
+can be a lot of work for bigger applications, this library makes use of the [javassist](http://www.csg.ci.i.u-tokyo.ac.jp/~chiba/javassist/)
+library to inspect the class files. This way you only have to provide the two jar archives on the command line, that's it.
+
+##Features##
+
+* Comparison of two jar archives without the need to add all of their dependencies to the classpath.
+* Differences are printed on the command line in a simple diff format.
+* Differences can optionally be printed to an xml file. This can be transformed to an HTML file using XSLT.
+* Per default only public classes and class members are compared. If necessary, the access modifier of the classes and class members to be
+  compared can be set to package, protected or private.
+* Per default classes from all packages are compared. If necessary, certain packages can be excluded or only specific packages can be included.
+
+##Usage##
+
+The tool has a set of CLI parameters that are described in the following:
+
+    -h                        Prints this help.
+    -o <pathToOldVersionJar>  Provides the path to the old version of the jar.
+    -n <pathToNewVersionJar>  Provides the path to the new version of the jar.
+    -x <pathToXmlOutputFile>  Provides the path to the xml output file. If not given, stdout is used.
+    -a <accessModifier>       Sets the access modifier level (public, package, protected, private), which should be used.
+    -i <packagesToInclude>    Comma separated list of package names to include, * can be used as wildcard.
+    -e <packagesToExclude>    Comma separated list of package names to exclude, * can be used as wildcard.
+    -m                        Outputs only modified classes/methods. If not given, all classes and methods are printed.
+	
+###Example###
+
+In the following you see the beginning of the xml output file after having computed the differences between the versions 4.0.1 and 4.2.3 of httpclient:
+
+    <?xml version="1.0" encoding="UTF-8" standalone="yes"?>
+    <japicmp newJar="D:\Programmierung\japicmp\github\japicmp\japicmp\httpclient-4.2.3.jar" oldJar="D:\Programmierung\japicmp\github\japicmp\japicmp\httpclient-4.0.1.jar">
+        <class accessModifierNew="n.a." accessModifierOld="PUBLIC" changeStatus="REMOVED" fullyQualifiedName="org.apache.http.annotation.GuardedBy" type="ANNOTATION">
+            <method accessModifierNew="n.a." accessModifierOld="PUBLIC" changeStatus="REMOVED" name="value" returnType="java.lang.String"/>
+        </class>
+        <class accessModifierNew="n.a." accessModifierOld="PUBLIC" changeStatus="REMOVED" fullyQualifiedName="org.apache.http.annotation.Immutable" type="ANNOTATION"/>
+        <class accessModifierNew="n.a." accessModifierOld="PUBLIC" changeStatus="REMOVED" fullyQualifiedName="org.apache.http.annotation.NotThreadSafe" type="ANNOTATION"/>
+        <class accessModifierNew="n.a." accessModifierOld="PUBLIC" changeStatus="REMOVED" fullyQualifiedName="org.apache.http.annotation.ThreadSafe" type="ANNOTATION"/>
+        <class accessModifierNew="PUBLIC" accessModifierOld="PUBLIC" changeStatus="UNCHANGED" fullyQualifiedName="org.apache.http.auth.AUTH" type="CLASS"/>
+        <class accessModifierNew="PUBLIC" accessModifierOld="PUBLIC" changeStatus="UNCHANGED" fullyQualifiedName="org.apache.http.auth.AuthenticationException" type="CLASS"/>
+        <class accessModifierNew="PUBLIC" accessModifierOld="n.a." changeStatus="NEW" fullyQualifiedName="org.apache.http.auth.AuthOption" type="CLASS">
+            <method accessModifierNew="PUBLIC" accessModifierOld="n.a." changeStatus="NEW" name="getAuthScheme" returnType="org.apache.http.auth.AuthScheme"/>
+            <method accessModifierNew="PUBLIC" accessModifierOld="n.a." changeStatus="NEW" name="getCredentials" returnType="org.apache.http.auth.Credentials"/>
+            <method accessModifierNew="PUBLIC" accessModifierOld="n.a." changeStatus="NEW" name="toString" returnType="java.lang.String"/>
+        </class>
+        <class accessModifierNew="PUBLIC" accessModifierOld="n.a." changeStatus="NEW" fullyQualifiedName="org.apache.http.auth.AuthProtocolState" type="ENUM">
+            <method accessModifierNew="PUBLIC" accessModifierOld="n.a." changeStatus="NEW" name="valueOf" returnType="org.apache.http.auth.AuthProtocolState">
+                <parameter type="java.lang.String"/>
+            </method>
+            <method accessModifierNew="PUBLIC" accessModifierOld="n.a." changeStatus="NEW" name="values" returnType="org.apache.http.auth.AuthProtocolState[]"/>
+        </class>
+		...
+
+The differences between the two Java APIs are also printed on the command line for a quick overview:
+
+    --- REMOVED ANNOTATION org.apache.http.annotation.GuardedBy
+        --- REMOVED METHOD value()
+    --- REMOVED ANNOTATION org.apache.http.annotation.Immutable
+    --- REMOVED ANNOTATION org.apache.http.annotation.NotThreadSafe
+    --- REMOVED ANNOTATION org.apache.http.annotation.ThreadSafe
+    === UNCHANGED CLASS org.apache.http.auth.AUTH
+    === UNCHANGED CLASS org.apache.http.auth.AuthenticationException
+    +++ NEW CLASS org.apache.http.auth.AuthOption
+        +++ NEW METHOD getAuthScheme()
+        +++ NEW METHOD getCredentials()
+        +++ NEW METHOD toString()
+    +++ NEW ENUM org.apache.http.auth.AuthProtocolState
+        +++ NEW METHOD valueOf(java.lang.String)
+        +++ NEW METHOD values()
+
+##Downloads##
+
+The following releases are available:
+
+* [Version 0.0.2](https://github.com/siom79/japicmp/releases/tag/japicmp-base-0.0.2)
+    * Changes:
+        * [Command-line option to filter packages](https://github.com/siom79/japicmp/issues/1)
+        * [CLI option for comparing public, package, protected or private classes/class members](https://github.com/siom79/japicmp/issues/2)
+        * ["No differences" output when comparing the same file](https://github.com/siom79/japicmp/issues/4)
+        * [Giving a non-jar file as argument should not output "Comparing..."](https://github.com/siom79/japicmp/issues/5)
+* [Version 0.0.1](http://repository-siom79.forge.cloudbees.com/release/japicmp/japicmp/0.0.1/japicmp-0.0.1.jar)
+
+The latest snapshot version can be downloaded here: [japicmp-SNAPSHOT](http://repository-siom79.forge.cloudbees.com/snapshot/japicmp/japicmp/)
+
+##Development##
+
+* [Jenkins build server](https://siom79.ci.cloudbees.com/job/japicmp)
+* [Maven snapshot repository](https://repository-siom79.forge.cloudbees.com/snapshot)
+* [Maven release repository](https://repository-siom79.forge.cloudbees.com/release)
diff --git a/japicmp-testbase/japicmp-test-v1/pom.xml b/japicmp-testbase/japicmp-test-v1/pom.xml
index e0cab16..029fe36 100644
--- a/japicmp-testbase/japicmp-test-v1/pom.xml
+++ b/japicmp-testbase/japicmp-test-v1/pom.xml
@@ -1,11 +1,11 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
-    <modelVersion>4.0.0</modelVersion>
-    <parent>
-        <groupId>japicmp</groupId>
-        <artifactId>japicmp-testbase</artifactId>
-        <version>0.0.3-SNAPSHOT</version>
-    </parent>
-
-    <artifactId>japicmp-test-v1</artifactId>
+<?xml version="1.0" encoding="UTF-8"?>
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+    <modelVersion>4.0.0</modelVersion>
+    <parent>
+        <groupId>japicmp</groupId>
+        <artifactId>japicmp-testbase</artifactId>
+        <version>0.0.3-SNAPSHOT</version>
+    </parent>
+
+    <artifactId>japicmp-test-v1</artifactId>
 </project>
\ No newline at end of file
diff --git a/japicmp-testbase/japicmp-test-v1/src/main/java/japicmp/test/Modifier.java b/japicmp-testbase/japicmp-test-v1/src/main/java/japicmp/test/Modifier.java
index b53a7bf..0bd10f4 100644
--- a/japicmp-testbase/japicmp-test-v1/src/main/java/japicmp/test/Modifier.java
+++ b/japicmp-testbase/japicmp-test-v1/src/main/java/japicmp/test/Modifier.java
@@ -1,12 +1,12 @@
-package japicmp.test;
-
-public class Modifier {
-
-    public void publicToPrivateMethod() {
-
-    }
-
-    public static class ModifierPublicToProtected {
-
-    }
-}
+package japicmp.test;
+
+public class Modifier {
+
+    public void publicToPrivateMethod() {
+
+    }
+
+    public static class ModifierPublicToProtected {
+
+    }
+}
diff --git a/japicmp-testbase/japicmp-test-v1/src/main/java/japicmp/test/Removed.java b/japicmp-testbase/japicmp-test-v1/src/main/java/japicmp/test/Removed.java
index 6ddead3..9ddd8da 100644
--- a/japicmp-testbase/japicmp-test-v1/src/main/java/japicmp/test/Removed.java
+++ b/japicmp-testbase/japicmp-test-v1/src/main/java/japicmp/test/Removed.java
@@ -1,4 +1,4 @@
-package japicmp.test;
-
-public class Removed {
-}
+package japicmp.test;
+
+public class Removed {
+}
diff --git a/japicmp-testbase/japicmp-test-v1/src/main/java/japicmp/test/Unchanged.java b/japicmp-testbase/japicmp-test-v1/src/main/java/japicmp/test/Unchanged.java
index d499de8..86d69a9 100644
--- a/japicmp-testbase/japicmp-test-v1/src/main/java/japicmp/test/Unchanged.java
+++ b/japicmp-testbase/japicmp-test-v1/src/main/java/japicmp/test/Unchanged.java
@@ -1,8 +1,8 @@
-package japicmp.test;
-
-public class Unchanged {
-
-    public void unchangedMethod(String str) {
-        System.out.println(str);
-    }
-}
+package japicmp.test;
+
+public class Unchanged {
+
+    public void unchangedMethod(String str) {
+        System.out.println(str);
+    }
+}
diff --git a/japicmp-testbase/japicmp-test-v1/src/main/java/japicmp/test/packageOne/PackageOne.java b/japicmp-testbase/japicmp-test-v1/src/main/java/japicmp/test/packageOne/PackageOne.java
index de59dc7..94e4eb3 100644
--- a/japicmp-testbase/japicmp-test-v1/src/main/java/japicmp/test/packageOne/PackageOne.java
+++ b/japicmp-testbase/japicmp-test-v1/src/main/java/japicmp/test/packageOne/PackageOne.java
@@ -1,4 +1,4 @@
-package japicmp.test.packageOne;
-
-public class PackageOne {
-}
+package japicmp.test.packageOne;
+
+public class PackageOne {
+}
diff --git a/japicmp-testbase/japicmp-test-v1/src/main/java/japicmp/test/packageTwo/PackageTwo.java b/japicmp-testbase/japicmp-test-v1/src/main/java/japicmp/test/packageTwo/PackageTwo.java
index 1ac7fef..372f19b 100644
--- a/japicmp-testbase/japicmp-test-v1/src/main/java/japicmp/test/packageTwo/PackageTwo.java
+++ b/japicmp-testbase/japicmp-test-v1/src/main/java/japicmp/test/packageTwo/PackageTwo.java
@@ -1,4 +1,4 @@
-package japicmp.test.packageTwo;
-
-public class PackageTwo {
-}
+package japicmp.test.packageTwo;
+
+public class PackageTwo {
+}
diff --git a/japicmp-testbase/japicmp-test-v2/pom.xml b/japicmp-testbase/japicmp-test-v2/pom.xml
index 6e22b3c..c1c68f4 100644
--- a/japicmp-testbase/japicmp-test-v2/pom.xml
+++ b/japicmp-testbase/japicmp-test-v2/pom.xml
@@ -1,11 +1,11 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
-    <modelVersion>4.0.0</modelVersion>
-    <parent>
-        <groupId>japicmp</groupId>
-        <artifactId>japicmp-testbase</artifactId>
-        <version>0.0.3-SNAPSHOT</version>
-    </parent>
-
-    <artifactId>japicmp-test-v2</artifactId>
+<?xml version="1.0" encoding="UTF-8"?>
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+    <modelVersion>4.0.0</modelVersion>
+    <parent>
+        <groupId>japicmp</groupId>
+        <artifactId>japicmp-testbase</artifactId>
+        <version>0.0.3-SNAPSHOT</version>
+    </parent>
+
+    <artifactId>japicmp-test-v2</artifactId>
 </project>
\ No newline at end of file
diff --git a/japicmp-testbase/japicmp-test-v2/src/main/java/japicmp/test/Added.java b/japicmp-testbase/japicmp-test-v2/src/main/java/japicmp/test/Added.java
index 7c0398c..6f72a8f 100644
--- a/japicmp-testbase/japicmp-test-v2/src/main/java/japicmp/test/Added.java
+++ b/japicmp-testbase/japicmp-test-v2/src/main/java/japicmp/test/Added.java
@@ -1,4 +1,4 @@
-package japicmp.test;
-
-public class Added {
-}
+package japicmp.test;
+
+public class Added {
+}
diff --git a/japicmp-testbase/japicmp-test-v2/src/main/java/japicmp/test/Modifier.java b/japicmp-testbase/japicmp-test-v2/src/main/java/japicmp/test/Modifier.java
index 65bf223..81b11d8 100644
--- a/japicmp-testbase/japicmp-test-v2/src/main/java/japicmp/test/Modifier.java
+++ b/japicmp-testbase/japicmp-test-v2/src/main/java/japicmp/test/Modifier.java
@@ -1,12 +1,12 @@
-package japicmp.test;
-
-public class Modifier {
-
-    private void publicToPrivateMethod() {
-
-    }
-
-    private static class ModifierPublicToProtected {
-
-    }
-}
+package japicmp.test;
+
+public class Modifier {
+
+    private void publicToPrivateMethod() {
+
+    }
+
+    private static class ModifierPublicToProtected {
+
+    }
+}
diff --git a/japicmp-testbase/japicmp-test-v2/src/main/java/japicmp/test/Unchanged.java b/japicmp-testbase/japicmp-test-v2/src/main/java/japicmp/test/Unchanged.java
index d499de8..86d69a9 100644
--- a/japicmp-testbase/japicmp-test-v2/src/main/java/japicmp/test/Unchanged.java
+++ b/japicmp-testbase/japicmp-test-v2/src/main/java/japicmp/test/Unchanged.java
@@ -1,8 +1,8 @@
-package japicmp.test;
-
-public class Unchanged {
-
-    public void unchangedMethod(String str) {
-        System.out.println(str);
-    }
-}
+package japicmp.test;
+
+public class Unchanged {
+
+    public void unchangedMethod(String str) {
+        System.out.println(str);
+    }
+}
diff --git a/japicmp-testbase/japicmp-test-v2/src/main/java/japicmp/test/packageOne/PackageOne.java b/japicmp-testbase/japicmp-test-v2/src/main/java/japicmp/test/packageOne/PackageOne.java
index de59dc7..94e4eb3 100644
--- a/japicmp-testbase/japicmp-test-v2/src/main/java/japicmp/test/packageOne/PackageOne.java
+++ b/japicmp-testbase/japicmp-test-v2/src/main/java/japicmp/test/packageOne/PackageOne.java
@@ -1,4 +1,4 @@
-package japicmp.test.packageOne;
-
-public class PackageOne {
-}
+package japicmp.test.packageOne;
+
+public class PackageOne {
+}
diff --git a/japicmp-testbase/japicmp-test-v2/src/main/java/japicmp/test/packageTwo/PackageTwo.java b/japicmp-testbase/japicmp-test-v2/src/main/java/japicmp/test/packageTwo/PackageTwo.java
index 1ac7fef..372f19b 100644
--- a/japicmp-testbase/japicmp-test-v2/src/main/java/japicmp/test/packageTwo/PackageTwo.java
+++ b/japicmp-testbase/japicmp-test-v2/src/main/java/japicmp/test/packageTwo/PackageTwo.java
@@ -1,4 +1,4 @@
-package japicmp.test.packageTwo;
-
-public class PackageTwo {
-}
+package japicmp.test.packageTwo;
+
+public class PackageTwo {
+}
diff --git a/japicmp-testbase/japicmp-test/pom.xml b/japicmp-testbase/japicmp-test/pom.xml
index dcde855..6272d52 100644
--- a/japicmp-testbase/japicmp-test/pom.xml
+++ b/japicmp-testbase/japicmp-test/pom.xml
@@ -1,73 +1,73 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
-    <modelVersion>4.0.0</modelVersion>
-    <parent>
-        <groupId>japicmp</groupId>
-        <artifactId>japicmp-testbase</artifactId>
-        <version>0.0.3-SNAPSHOT</version>
-    </parent>
-
-    <artifactId>japicmp-test</artifactId>
-
-    <dependencies>
-        <dependency>
-            <groupId>japicmp</groupId>
-            <artifactId>japicmp</artifactId>
-            <version>${project.version}</version>
-            <scope>test</scope>
-        </dependency>
-        <dependency>
-            <groupId>japicmp</groupId>
-            <artifactId>japicmp-test-v1</artifactId>
-            <version>${project.version}</version>
-        </dependency>
-        <dependency>
-            <groupId>japicmp</groupId>
-            <artifactId>japicmp-test-v2</artifactId>
-            <version>${project.version}</version>
-        </dependency>
-    </dependencies>
-
-    <build>
-        <plugins>
-            <plugin>
-                <groupId>org.apache.maven.plugins</groupId>
-                <artifactId>maven-dependency-plugin</artifactId>
-                <version>2.8</version>
-                <executions>
-                    <execution>
-                        <id>copy</id>
-                        <phase>process-test-resources</phase>
-                        <goals>
-                            <goal>copy</goal>
-                        </goals>
-                        <configuration>
-                            <artifactItems>
-                                <artifactItem>
-                                    <groupId>japicmp</groupId>
-                                    <artifactId>japicmp-test-v1</artifactId>
-                                    <version>${project.version}</version>
-                                    <overWrite>true</overWrite>
-                                    <outputDirectory>${project.build.directory}</outputDirectory>
-                                    <destFileName>japicmp-test-v1.jar</destFileName>
-                                </artifactItem>
-                                <artifactItem>
-                                    <groupId>japicmp</groupId>
-                                    <artifactId>japicmp-test-v2</artifactId>
-                                    <version>${project.version}</version>
-                                    <overWrite>true</overWrite>
-                                    <outputDirectory>${project.build.directory}</outputDirectory>
-                                    <destFileName>japicmp-test-v2.jar</destFileName>
-                                </artifactItem>
-                            </artifactItems>
-                        </configuration>
-                    </execution>
-                </executions>
-            </plugin>
-            <plugin>
-                <groupId>org.codehaus.mojo</groupId>
-                <artifactId>cobertura-maven-plugin</artifactId>
-            </plugin>
-        </plugins>
-    </build>
+<?xml version="1.0" encoding="UTF-8"?>
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+    <modelVersion>4.0.0</modelVersion>
+    <parent>
+        <groupId>japicmp</groupId>
+        <artifactId>japicmp-testbase</artifactId>
+        <version>0.0.3-SNAPSHOT</version>
+    </parent>
+
+    <artifactId>japicmp-test</artifactId>
+
+    <dependencies>
+        <dependency>
+            <groupId>japicmp</groupId>
+            <artifactId>japicmp</artifactId>
+            <version>${project.version}</version>
+            <scope>test</scope>
+        </dependency>
+        <dependency>
+            <groupId>japicmp</groupId>
+            <artifactId>japicmp-test-v1</artifactId>
+            <version>${project.version}</version>
+        </dependency>
+        <dependency>
+            <groupId>japicmp</groupId>
+            <artifactId>japicmp-test-v2</artifactId>
+            <version>${project.version}</version>
+        </dependency>
+    </dependencies>
+
+    <build>
+        <plugins>
+            <plugin>
+                <groupId>org.apache.maven.plugins</groupId>
+                <artifactId>maven-dependency-plugin</artifactId>
+                <version>2.8</version>
+                <executions>
+                    <execution>
+                        <id>copy</id>
+                        <phase>process-test-resources</phase>
+                        <goals>
+                            <goal>copy</goal>
+                        </goals>
+                        <configuration>
+                            <artifactItems>
+                                <artifactItem>
+                                    <groupId>japicmp</groupId>
+                                    <artifactId>japicmp-test-v1</artifactId>
+                                    <version>${project.version}</version>
+                                    <overWrite>true</overWrite>
+                                    <outputDirectory>${project.build.directory}</outputDirectory>
+                                    <destFileName>japicmp-test-v1.jar</destFileName>
+                                </artifactItem>
+                                <artifactItem>
+                                    <groupId>japicmp</groupId>
+                                    <artifactId>japicmp-test-v2</artifactId>
+                                    <version>${project.version}</version>
+                                    <overWrite>true</overWrite>
+                                    <outputDirectory>${project.build.directory}</outputDirectory>
+                                    <destFileName>japicmp-test-v2.jar</destFileName>
+                                </artifactItem>
+                            </artifactItems>
+                        </configuration>
+                    </execution>
+                </executions>
+            </plugin>
+            <plugin>
+                <groupId>org.codehaus.mojo</groupId>
+                <artifactId>cobertura-maven-plugin</artifactId>
+            </plugin>
+        </plugins>
+    </build>
 </project>
\ No newline at end of file
diff --git a/japicmp-testbase/japicmp-test/src/test/java/japicmp/test/BasicTest.java b/japicmp-testbase/japicmp-test/src/test/java/japicmp/test/BasicTest.java
index 11d69a3..36b056e 100644
--- a/japicmp-testbase/japicmp-test/src/test/java/japicmp/test/BasicTest.java
+++ b/japicmp-testbase/japicmp-test/src/test/java/japicmp/test/BasicTest.java
@@ -1,36 +1,36 @@
-package japicmp.test;
-
-import japicmp.cmp.JarArchiveComparator;
-import japicmp.cmp.JarArchiveComparatorOptions;
-import japicmp.model.JApiChangeStatus;
-import japicmp.model.JApiClass;
-import org.junit.Test;
-
-import java.util.List;
-
-import static japicmp.test.util.Helper.getArchive;
-import static japicmp.test.util.Helper.getJApiClass;
-import static japicmp.test.util.Helper.getJApiMethod;
-import static org.hamcrest.CoreMatchers.is;
-import static org.hamcrest.CoreMatchers.notNullValue;
-import static org.junit.Assert.assertThat;
-
-public class BasicTest {
-
-    @Test
-    public void test() {
-        JarArchiveComparator jarArchiveComparator = new JarArchiveComparator(new JarArchiveComparatorOptions());
-        List<JApiClass> jApiClasses = jarArchiveComparator.compare(getArchive("japicmp-test-v1.jar"), getArchive("japicmp-test-v2.jar"));
-        assertThat(jApiClasses.size(), is(7));
-        JApiClass jApiClassRemoved = getJApiClass(jApiClasses, Removed.class.getName());
-        JApiClass jApiClassAdded = getJApiClass(jApiClasses, Added.class.getName());
-        JApiClass jApiClassUnchanged = getJApiClass(jApiClasses, Unchanged.class.getName());
-        assertThat(jApiClassRemoved, is(notNullValue()));
-        assertThat(jApiClassAdded, is(notNullValue()));
-        assertThat(jApiClassUnchanged, is(notNullValue()));
-        assertThat(jApiClassRemoved.getChangeStatus(), is(JApiChangeStatus.REMOVED));
-        assertThat(jApiClassAdded.getChangeStatus(), is(JApiChangeStatus.NEW));
-        assertThat(jApiClassUnchanged.getChangeStatus(), is(JApiChangeStatus.UNCHANGED));
-        assertThat(getJApiMethod(jApiClassUnchanged.getMethods(), "unchangedMethod"), is(notNullValue()));
-    }
-}
+package japicmp.test;
+
+import japicmp.cmp.JarArchiveComparator;
+import japicmp.cmp.JarArchiveComparatorOptions;
+import japicmp.model.JApiChangeStatus;
+import japicmp.model.JApiClass;
+import org.junit.Test;
+
+import java.util.List;
+
+import static japicmp.test.util.Helper.getArchive;
+import static japicmp.test.util.Helper.getJApiClass;
+import static japicmp.test.util.Helper.getJApiMethod;
+import static org.hamcrest.CoreMatchers.is;
+import static org.hamcrest.CoreMatchers.notNullValue;
+import static org.junit.Assert.assertThat;
+
+public class BasicTest {
+
+    @Test
+    public void test() {
+        JarArchiveComparator jarArchiveComparator = new JarArchiveComparator(new JarArchiveComparatorOptions());
+        List<JApiClass> jApiClasses = jarArchiveComparator.compare(getArchive("japicmp-test-v1.jar"), getArchive("japicmp-test-v2.jar"));
+        assertThat(jApiClasses.size(), is(7));
+        JApiClass jApiClassRemoved = getJApiClass(jApiClasses, Removed.class.getName());
+        JApiClass jApiClassAdded = getJApiClass(jApiClasses, Added.class.getName());
+        JApiClass jApiClassUnchanged = getJApiClass(jApiClasses, Unchanged.class.getName());
+        assertThat(jApiClassRemoved, is(notNullValue()));
+        assertThat(jApiClassAdded, is(notNullValue()));
+        assertThat(jApiClassUnchanged, is(notNullValue()));
+        assertThat(jApiClassRemoved.getChangeStatus(), is(JApiChangeStatus.REMOVED));
+        assertThat(jApiClassAdded.getChangeStatus(), is(JApiChangeStatus.NEW));
+        assertThat(jApiClassUnchanged.getChangeStatus(), is(JApiChangeStatus.UNCHANGED));
+        assertThat(getJApiMethod(jApiClassUnchanged.getMethods(), "unchangedMethod"), is(notNullValue()));
+    }
+}
diff --git a/japicmp-testbase/japicmp-test/src/test/java/japicmp/test/ModifierTest.java b/japicmp-testbase/japicmp-test/src/test/java/japicmp/test/ModifierTest.java
index 2cd6a5e..339cc7b 100644
--- a/japicmp-testbase/japicmp-test/src/test/java/japicmp/test/ModifierTest.java
+++ b/japicmp-testbase/japicmp-test/src/test/java/japicmp/test/ModifierTest.java
@@ -1,44 +1,44 @@
-package japicmp.test;
-
-import japicmp.model.AccessModifier;
-import japicmp.cmp.JarArchiveComparator;
-import japicmp.cmp.JarArchiveComparatorOptions;
-import japicmp.model.JApiChangeStatus;
-import japicmp.model.JApiClass;
-import japicmp.test.util.Helper;
-import org.junit.Test;
-
-import java.util.List;
-
-import static japicmp.test.util.Helper.getArchive;
-import static japicmp.test.util.Helper.getJApiClass;
-import static org.hamcrest.CoreMatchers.is;
-import static org.hamcrest.CoreMatchers.notNullValue;
-import static org.junit.Assert.assertThat;
-
-public class ModifierTest {
-
-    @Test
-    public void testOptionPublicModifier() {
-        JarArchiveComparatorOptions options = new JarArchiveComparatorOptions();
-        options.setModifierLevel(AccessModifier.PUBLIC);
-        JarArchiveComparator jarArchiveComparator = new JarArchiveComparator(options);
-        List<JApiClass> jApiClasses = jarArchiveComparator.compare(getArchive("japicmp-test-v1.jar"), getArchive("japicmp-test-v2.jar"));
-        JApiClass modifierInnerClass = getJApiClass(jApiClasses, Modifier.ModifierPublicToProtected.class.getName());
-        JApiClass modifierClass = getJApiClass(jApiClasses, Modifier.class.getName());
-        assertThat(modifierInnerClass.getChangeStatus(), is(JApiChangeStatus.REMOVED));
-        assertThat(Helper.getJApiMethod(modifierClass.getMethods(), "publicToPrivateMethod").getChangeStatus(), is(JApiChangeStatus.REMOVED));
-    }
-
-    @Test
-    public void testOptionPrivateModifier() {
-        JarArchiveComparatorOptions options = new JarArchiveComparatorOptions();
-        options.setModifierLevel(AccessModifier.PRIVATE);
-        JarArchiveComparator jarArchiveComparator = new JarArchiveComparator(options);
-        List<JApiClass> jApiClasses = jarArchiveComparator.compare(getArchive("japicmp-test-v1.jar"), getArchive("japicmp-test-v2.jar"));
-        JApiClass modifierInnerClass = getJApiClass(jApiClasses, Modifier.ModifierPublicToProtected.class.getName());
-        JApiClass modifierClass = getJApiClass(jApiClasses, Modifier.class.getName());
-        assertThat(modifierInnerClass.getChangeStatus(), is(JApiChangeStatus.UNCHANGED));
-        assertThat(Helper.getJApiMethod(modifierClass.getMethods(), "publicToPrivateMethod").getChangeStatus(), is(JApiChangeStatus.UNCHANGED));
-    }
-}
+package japicmp.test;
+
+import japicmp.model.AccessModifier;
+import japicmp.cmp.JarArchiveComparator;
+import japicmp.cmp.JarArchiveComparatorOptions;
+import japicmp.model.JApiChangeStatus;
+import japicmp.model.JApiClass;
+import japicmp.test.util.Helper;
+import org.junit.Test;
+
+import java.util.List;
+
+import static japicmp.test.util.Helper.getArchive;
+import static japicmp.test.util.Helper.getJApiClass;
+import static org.hamcrest.CoreMatchers.is;
+import static org.hamcrest.CoreMatchers.notNullValue;
+import static org.junit.Assert.assertThat;
+
+public class ModifierTest {
+
+    @Test
+    public void testOptionPublicModifier() {
+        JarArchiveComparatorOptions options = new JarArchiveComparatorOptions();
+        options.setModifierLevel(AccessModifier.PUBLIC);
+        JarArchiveComparator jarArchiveComparator = new JarArchiveComparator(options);
+        List<JApiClass> jApiClasses = jarArchiveComparator.compare(getArchive("japicmp-test-v1.jar"), getArchive("japicmp-test-v2.jar"));
+        JApiClass modifierInnerClass = getJApiClass(jApiClasses, Modifier.ModifierPublicToProtected.class.getName());
+        JApiClass modifierClass = getJApiClass(jApiClasses, Modifier.class.getName());
+        assertThat(modifierInnerClass.getChangeStatus(), is(JApiChangeStatus.REMOVED));
+        assertThat(Helper.getJApiMethod(modifierClass.getMethods(), "publicToPrivateMethod").getChangeStatus(), is(JApiChangeStatus.REMOVED));
+    }
+
+    @Test
+    public void testOptionPrivateModifier() {
+        JarArchiveComparatorOptions options = new JarArchiveComparatorOptions();
+        options.setModifierLevel(AccessModifier.PRIVATE);
+        JarArchiveComparator jarArchiveComparator = new JarArchiveComparator(options);
+        List<JApiClass> jApiClasses = jarArchiveComparator.compare(getArchive("japicmp-test-v1.jar"), getArchive("japicmp-test-v2.jar"));
+        JApiClass modifierInnerClass = getJApiClass(jApiClasses, Modifier.ModifierPublicToProtected.class.getName());
+        JApiClass modifierClass = getJApiClass(jApiClasses, Modifier.class.getName());
+        assertThat(modifierInnerClass.getChangeStatus(), is(JApiChangeStatus.UNCHANGED));
+        assertThat(Helper.getJApiMethod(modifierClass.getMethods(), "publicToPrivateMethod").getChangeStatus(), is(JApiChangeStatus.UNCHANGED));
+    }
+}
diff --git a/japicmp-testbase/japicmp-test/src/test/java/japicmp/test/PackageFilterTest.java b/japicmp-testbase/japicmp-test/src/test/java/japicmp/test/PackageFilterTest.java
index f86f856..875f94d 100644
--- a/japicmp-testbase/japicmp-test/src/test/java/japicmp/test/PackageFilterTest.java
+++ b/japicmp-testbase/japicmp-test/src/test/java/japicmp/test/PackageFilterTest.java
@@ -1,96 +1,96 @@
-package japicmp.test;
-
-import japicmp.cmp.JarArchiveComparator;
-import japicmp.cmp.JarArchiveComparatorOptions;
-import japicmp.config.PackageFilter;
-import japicmp.model.JApiClass;
-import japicmp.test.packageOne.PackageOne;
-import japicmp.test.packageTwo.PackageTwo;
-import org.junit.Test;
-
-import java.util.List;
-
-import static japicmp.test.util.Helper.getArchive;
-import static japicmp.test.util.Helper.getJApiClass;
-import static org.hamcrest.CoreMatchers.is;
-import static org.hamcrest.CoreMatchers.notNullValue;
-import static org.junit.Assert.assertThat;
-
-public class PackageFilterTest {
-
-    @Test
-    public void onlyIncludeOnePackage() {
-        JarArchiveComparatorOptions options = new JarArchiveComparatorOptions();
-        options.getPackagesInclude().add(new PackageFilter("japicmp.test.packageOne"));
-        JarArchiveComparator jarArchiveComparator = new JarArchiveComparator(options);
-        List<JApiClass> jApiClasses = jarArchiveComparator.compare(getArchive("japicmp-test-v1.jar"), getArchive("japicmp-test-v2.jar"));
-        getJApiClass(jApiClasses, PackageOne.class.getName());
-        assertThat(jApiClasses.size(), is(1));
-    }
-
-    @Test
-    public void onlyIncludeTwoPackages() {
-        JarArchiveComparatorOptions options = new JarArchiveComparatorOptions();
-        options.getPackagesInclude().add(new PackageFilter("japicmp.test.packageOne"));
-        options.getPackagesInclude().add(new PackageFilter("japicmp.test.packageTwo"));
-        JarArchiveComparator jarArchiveComparator = new JarArchiveComparator(options);
-        List<JApiClass> jApiClasses = jarArchiveComparator.compare(getArchive("japicmp-test-v1.jar"), getArchive("japicmp-test-v2.jar"));
-        getJApiClass(jApiClasses, PackageOne.class.getName());
-        getJApiClass(jApiClasses, PackageTwo.class.getName());
-        assertThat(jApiClasses.size(), is(2));
-    }
-
-    @Test
-    public void onlyExcludeOnePackage() {
-        JarArchiveComparatorOptions options = new JarArchiveComparatorOptions();
-        options.getPackagesExclude().add(new PackageFilter("japicmp.test.packageOne"));
-        JarArchiveComparator jarArchiveComparator = new JarArchiveComparator(options);
-        final List<JApiClass> jApiClasses = jarArchiveComparator.compare(getArchive("japicmp-test-v1.jar"), getArchive("japicmp-test-v2.jar"));
-        assertThatExceptionIsThrown(new Callback() {
-            public void callback() {
-                getJApiClass(jApiClasses, PackageOne.class.getName());
-            }
-        });
-    }
-
-    @Test
-    public void excludePackageJapicmpTest() {
-        JarArchiveComparatorOptions options = new JarArchiveComparatorOptions();
-        options.getPackagesExclude().add(new PackageFilter("japicmp.test"));
-        JarArchiveComparator jarArchiveComparator = new JarArchiveComparator(options);
-        final List<JApiClass> jApiClasses = jarArchiveComparator.compare(getArchive("japicmp-test-v1.jar"), getArchive("japicmp-test-v2.jar"));
-        assertThat(jApiClasses.size(), is(0));
-    }
-
-    @Test
-    public void includePackageJapicmpTest() {
-        JarArchiveComparatorOptions options = new JarArchiveComparatorOptions();
-        options.getPackagesInclude().add(new PackageFilter("japicmp.test"));
-        JarArchiveComparator jarArchiveComparator = new JarArchiveComparator(options);
-        final List<JApiClass> jApiClasses = jarArchiveComparator.compare(getArchive("japicmp-test-v1.jar"), getArchive("japicmp-test-v2.jar"));
-        assertThat(getJApiClass(jApiClasses, PackageOne.class.getName()), is(notNullValue()));
-    }
-
-    @Test
-    public void includePackageOneWithWildcard() {
-        JarArchiveComparatorOptions options = new JarArchiveComparatorOptions();
-        options.getPackagesInclude().add(new PackageFilter("japicmp.*.packageOne"));
-        JarArchiveComparator jarArchiveComparator = new JarArchiveComparator(options);
-        final List<JApiClass> jApiClasses = jarArchiveComparator.compare(getArchive("japicmp-test-v1.jar"), getArchive("japicmp-test-v2.jar"));
-        assertThat(getJApiClass(jApiClasses, PackageOne.class.getName()), is(notNullValue()));
-    }
-
-    private interface Callback {
-        void callback();
-    }
-
-    private void assertThatExceptionIsThrown(Callback callback) {
-        boolean exception = false;
-        try {
-            callback.callback();
-        } catch (Exception e) {
-            exception = true;
-        }
-        assertThat(exception, is(true));
-    }
-}
+package japicmp.test;
+
+import japicmp.cmp.JarArchiveComparator;
+import japicmp.cmp.JarArchiveComparatorOptions;
+import japicmp.config.PackageFilter;
+import japicmp.model.JApiClass;
+import japicmp.test.packageOne.PackageOne;
+import japicmp.test.packageTwo.PackageTwo;
+import org.junit.Test;
+
+import java.util.List;
+
+import static japicmp.test.util.Helper.getArchive;
+import static japicmp.test.util.Helper.getJApiClass;
+import static org.hamcrest.CoreMatchers.is;
+import static org.hamcrest.CoreMatchers.notNullValue;
+import static org.junit.Assert.assertThat;
+
+public class PackageFilterTest {
+
+    @Test
+    public void onlyIncludeOnePackage() {
+        JarArchiveComparatorOptions options = new JarArchiveComparatorOptions();
+        options.getPackagesInclude().add(new PackageFilter("japicmp.test.packageOne"));
+        JarArchiveComparator jarArchiveComparator = new JarArchiveComparator(options);
+        List<JApiClass> jApiClasses = jarArchiveComparator.compare(getArchive("japicmp-test-v1.jar"), getArchive("japicmp-test-v2.jar"));
+        getJApiClass(jApiClasses, PackageOne.class.getName());
+        assertThat(jApiClasses.size(), is(1));
+    }
+
+    @Test
+    public void onlyIncludeTwoPackages() {
+        JarArchiveComparatorOptions options = new JarArchiveComparatorOptions();
+        options.getPackagesInclude().add(new PackageFilter("japicmp.test.packageOne"));
+        options.getPackagesInclude().add(new PackageFilter("japicmp.test.packageTwo"));
+        JarArchiveComparator jarArchiveComparator = new JarArchiveComparator(options);
+        List<JApiClass> jApiClasses = jarArchiveComparator.compare(getArchive("japicmp-test-v1.jar"), getArchive("japicmp-test-v2.jar"));
+        getJApiClass(jApiClasses, PackageOne.class.getName());
+        getJApiClass(jApiClasses, PackageTwo.class.getName());
+        assertThat(jApiClasses.size(), is(2));
+    }
+
+    @Test
+    public void onlyExcludeOnePackage() {
+        JarArchiveComparatorOptions options = new JarArchiveComparatorOptions();
+        options.getPackagesExclude().add(new PackageFilter("japicmp.test.packageOne"));
+        JarArchiveComparator jarArchiveComparator = new JarArchiveComparator(options);
+        final List<JApiClass> jApiClasses = jarArchiveComparator.compare(getArchive("japicmp-test-v1.jar"), getArchive("japicmp-test-v2.jar"));
+        assertThatExceptionIsThrown(new Callback() {
+            public void callback() {
+                getJApiClass(jApiClasses, PackageOne.class.getName());
+            }
+        });
+    }
+
+    @Test
+    public void excludePackageJapicmpTest() {
+        JarArchiveComparatorOptions options = new JarArchiveComparatorOptions();
+        options.getPackagesExclude().add(new PackageFilter("japicmp.test"));
+        JarArchiveComparator jarArchiveComparator = new JarArchiveComparator(options);
+        final List<JApiClass> jApiClasses = jarArchiveComparator.compare(getArchive("japicmp-test-v1.jar"), getArchive("japicmp-test-v2.jar"));
+        assertThat(jApiClasses.size(), is(0));
+    }
+
+    @Test
+    public void includePackageJapicmpTest() {
+        JarArchiveComparatorOptions options = new JarArchiveComparatorOptions();
+        options.getPackagesInclude().add(new PackageFilter("japicmp.test"));
+        JarArchiveComparator jarArchiveComparator = new JarArchiveComparator(options);
+        final List<JApiClass> jApiClasses = jarArchiveComparator.compare(getArchive("japicmp-test-v1.jar"), getArchive("japicmp-test-v2.jar"));
+        assertThat(getJApiClass(jApiClasses, PackageOne.class.getName()), is(notNullValue()));
+    }
+
+    @Test
+    public void includePackageOneWithWildcard() {
+        JarArchiveComparatorOptions options = new JarArchiveComparatorOptions();
+        options.getPackagesInclude().add(new PackageFilter("japicmp.*.packageOne"));
+        JarArchiveComparator jarArchiveComparator = new JarArchiveComparator(options);
+        final List<JApiClass> jApiClasses = jarArchiveComparator.compare(getArchive("japicmp-test-v1.jar"), getArchive("japicmp-test-v2.jar"));
+        assertThat(getJApiClass(jApiClasses, PackageOne.class.getName()), is(notNullValue()));
+    }
+
+    private interface Callback {
+        void callback();
+    }
+
+    private void assertThatExceptionIsThrown(Callback callback) {
+        boolean exception = false;
+        try {
+            callback.callback();
+        } catch (Exception e) {
+            exception = true;
+        }
+        assertThat(exception, is(true));
+    }
+}
diff --git a/japicmp-testbase/japicmp-test/src/test/java/japicmp/test/util/Helper.java b/japicmp-testbase/japicmp-test/src/test/java/japicmp/test/util/Helper.java
index c98da86..8206dd7 100644
--- a/japicmp-testbase/japicmp-test/src/test/java/japicmp/test/util/Helper.java
+++ b/japicmp-testbase/japicmp-test/src/test/java/japicmp/test/util/Helper.java
@@ -1,32 +1,32 @@
-package japicmp.test.util;
-
-import japicmp.model.JApiClass;
-import japicmp.model.JApiMethod;
-
-import java.io.File;
-import java.util.List;
-
-public class Helper {
-
-    public static File getArchive(String filename) {
-        return new File("target" + File.separator + filename);
-    }
-
-    public static JApiClass getJApiClass(List<JApiClass> jApiClasses, String fqn) {
-        for (JApiClass jApiClass : jApiClasses) {
-            if (jApiClass.getFullyQualifiedName().equals(fqn)) {
-                return jApiClass;
-            }
-        }
-        throw new IllegalArgumentException("No class found with name " + fqn + ".");
-    }
-
-    public static JApiMethod getJApiMethod(List<JApiMethod> jApiMethods, String name) {
-        for(JApiMethod jApiMethod : jApiMethods) {
-            if(jApiMethod.getName().equals(name)) {
-                return jApiMethod;
-            }
-        }
-        throw new IllegalArgumentException("No method found with name " + name + ".");
-    }
-}
+package japicmp.test.util;
+
+import japicmp.model.JApiClass;
+import japicmp.model.JApiMethod;
+
+import java.io.File;
+import java.util.List;
+
+public class Helper {
+
+    public static File getArchive(String filename) {
+        return new File("target" + File.separator + filename);
+    }
+
+    public static JApiClass getJApiClass(List<JApiClass> jApiClasses, String fqn) {
+        for (JApiClass jApiClass : jApiClasses) {
+            if (jApiClass.getFullyQualifiedName().equals(fqn)) {
+                return jApiClass;
+            }
+        }
+        throw new IllegalArgumentException("No class found with name " + fqn + ".");
+    }
+
+    public static JApiMethod getJApiMethod(List<JApiMethod> jApiMethods, String name) {
+        for(JApiMethod jApiMethod : jApiMethods) {
+            if(jApiMethod.getName().equals(name)) {
+                return jApiMethod;
+            }
+        }
+        throw new IllegalArgumentException("No method found with name " + name + ".");
+    }
+}
diff --git a/japicmp-testbase/pom.xml b/japicmp-testbase/pom.xml
index f983041..3ade9b0 100644
--- a/japicmp-testbase/pom.xml
+++ b/japicmp-testbase/pom.xml
@@ -1,18 +1,18 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
-    <modelVersion>4.0.0</modelVersion>
-    <parent>
-        <groupId>japicmp</groupId>
-        <artifactId>japicmp-base</artifactId>
-        <version>0.0.3-SNAPSHOT</version>
-    </parent>
-
-    <artifactId>japicmp-testbase</artifactId>
-	<packaging>pom</packaging>
-
-    <modules>
-		<module>japicmp-test-v1</module>
-		<module>japicmp-test-v2</module>
-		<module>japicmp-test</module>
-	</modules>
+<?xml version="1.0" encoding="UTF-8"?>
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+    <modelVersion>4.0.0</modelVersion>
+    <parent>
+        <groupId>japicmp</groupId>
+        <artifactId>japicmp-base</artifactId>
+        <version>0.0.3-SNAPSHOT</version>
+    </parent>
+
+    <artifactId>japicmp-testbase</artifactId>
+	<packaging>pom</packaging>
+
+    <modules>
+		<module>japicmp-test-v1</module>
+		<module>japicmp-test-v2</module>
+		<module>japicmp-test</module>
+	</modules>
 </project>
\ No newline at end of file
diff --git a/japicmp/pom.xml b/japicmp/pom.xml
index 35c8867..0d78636 100644
--- a/japicmp/pom.xml
+++ b/japicmp/pom.xml
@@ -1,71 +1,71 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
-    <modelVersion>4.0.0</modelVersion>
-    <parent>
-        <groupId>japicmp</groupId>
-        <artifactId>japicmp-base</artifactId>
-        <version>0.0.3-SNAPSHOT</version>
-    </parent>
-
-    <artifactId>japicmp</artifactId>
-
-    <dependencies>
-        <dependency>
-            <groupId>javassist</groupId>
-            <artifactId>javassist</artifactId>
-            <version>3.12.1.GA</version>
-        </dependency>
-        <dependency>
-            <groupId>log4j</groupId>
-            <artifactId>log4j</artifactId>
-            <version>1.2.17</version>
-        </dependency>
-        <dependency>
-            <groupId>com.google.guava</groupId>
-            <artifactId>guava</artifactId>
-            <version>14.0.1</version>
-        </dependency>
-    </dependencies>
-
-    <build>
-        <plugins>
-            <plugin>
-                <groupId>org.codehaus.mojo</groupId>
-                <artifactId>cobertura-maven-plugin</artifactId>
-            </plugin>
-            <plugin>
-                <artifactId>maven-assembly-plugin</artifactId>
-                <configuration>
-                    <archive>
-                        <manifest>
-                            <mainClass>japicmp.JApiCmp</mainClass>
-                        </manifest>
-                    </archive>
-                    <descriptorRefs>
-                        <descriptorRef>jar-with-dependencies</descriptorRef>
-                    </descriptorRefs>
-                    <finalName>${project.artifactId}-${project.version}</finalName>
-                    <appendAssemblyId>false</appendAssemblyId>
-                </configuration>
-                <executions>
-                    <execution>
-                        <id>make-assembly</id>
-                        <phase>package</phase>
-                        <goals>
-                            <goal>single</goal>
-                        </goals>
-                    </execution>
-                </executions>
-            </plugin>
-            <plugin>
-                <groupId>org.codehaus.mojo</groupId>
-                <artifactId>findbugs-maven-plugin</artifactId>
-                <version>2.5.2</version>
-                <configuration>
-                    <xmlOutput>true</xmlOutput>
-                    <xmlOutputDirectory>target/site</xmlOutputDirectory>
-                </configuration>
-            </plugin>
-        </plugins>
-    </build>
+<?xml version="1.0" encoding="UTF-8"?>
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+    <modelVersion>4.0.0</modelVersion>
+    <parent>
+        <groupId>japicmp</groupId>
+        <artifactId>japicmp-base</artifactId>
+        <version>0.0.3-SNAPSHOT</version>
+    </parent>
+
+    <artifactId>japicmp</artifactId>
+
+    <dependencies>
+        <dependency>
+            <groupId>javassist</groupId>
+            <artifactId>javassist</artifactId>
+            <version>3.12.1.GA</version>
+        </dependency>
+        <dependency>
+            <groupId>log4j</groupId>
+            <artifactId>log4j</artifactId>
+            <version>1.2.17</version>
+        </dependency>
+        <dependency>
+            <groupId>com.google.guava</groupId>
+            <artifactId>guava</artifactId>
+            <version>14.0.1</version>
+        </dependency>
+    </dependencies>
+
+    <build>
+        <plugins>
+            <plugin>
+                <groupId>org.codehaus.mojo</groupId>
+                <artifactId>cobertura-maven-plugin</artifactId>
+            </plugin>
+            <plugin>
+                <artifactId>maven-assembly-plugin</artifactId>
+                <configuration>
+                    <archive>
+                        <manifest>
+                            <mainClass>japicmp.JApiCmp</mainClass>
+                        </manifest>
+                    </archive>
+                    <descriptorRefs>
+                        <descriptorRef>jar-with-dependencies</descriptorRef>
+                    </descriptorRefs>
+                    <finalName>${project.artifactId}-${project.version}</finalName>
+                    <appendAssemblyId>false</appendAssemblyId>
+                </configuration>
+                <executions>
+                    <execution>
+                        <id>make-assembly</id>
+                        <phase>package</phase>
+                        <goals>
+                            <goal>single</goal>
+                        </goals>
+                    </execution>
+                </executions>
+            </plugin>
+            <plugin>
+                <groupId>org.codehaus.mojo</groupId>
+                <artifactId>findbugs-maven-plugin</artifactId>
+                <version>2.5.2</version>
+                <configuration>
+                    <xmlOutput>true</xmlOutput>
+                    <xmlOutputDirectory>target/site</xmlOutputDirectory>
+                </configuration>
+            </plugin>
+        </plugins>
+    </build>
 </project>
\ No newline at end of file
diff --git a/japicmp/src/main/java/japicmp/JApiCmp.java b/japicmp/src/main/java/japicmp/JApiCmp.java
index bcb684d..cf940eb 100644
--- a/japicmp/src/main/java/japicmp/JApiCmp.java
+++ b/japicmp/src/main/java/japicmp/JApiCmp.java
@@ -1,100 +1,100 @@
-package japicmp;
-
-import japicmp.cli.CliParser;
-import japicmp.cmp.JarArchiveComparator;
-import japicmp.cmp.JarArchiveComparatorOptions;
-import japicmp.config.Options;
-import japicmp.exception.JApiCmpException;
-import japicmp.model.JApiClass;
-import japicmp.output.OutputTransformer;
-import japicmp.output.stdout.StdoutOutputGenerator;
-import japicmp.output.xml.XmlOutputGenerator;
-
-import java.io.File;
-import java.io.IOException;
-import java.util.List;
-import java.util.jar.JarFile;
-
-public class JApiCmp {
-
-    public static void main(String[] args) {
-        try {
-            JApiCmp app = new JApiCmp();
-            app.run(args);
-        } catch (JApiCmpException e) {
-            if (e.getReason() != JApiCmpException.Reason.NormalTermination) {
-                System.err.println(e.getMessage());
-                System.exit(-1);
-            }
-        } catch (Exception e) {
-            System.err.println(String.format("Execution of %s failed: %s", JApiCmp.class.getSimpleName(), e.getMessage()));
-            System.exit(-2);
-        }
-    }
-
-    private void run(String[] args) {
-        Options options = parseCliOptions(args);
-        File oldArchive = new File(options.getOldArchive());
-        File newArchive = new File(options.getNewArchive());
-        verifyFiles(oldArchive, newArchive);
-        JarArchiveComparatorOptions comparatorOptions = new JarArchiveComparatorOptions();
-        copyOptions(options, comparatorOptions);
-        JarArchiveComparator jarArchiveComparator = new JarArchiveComparator(comparatorOptions);
-        List<JApiClass> jApiClasses = jarArchiveComparator.compare(oldArchive, newArchive);
-        generateOutput(options, oldArchive, newArchive, jApiClasses);
-    }
-
-    private void copyOptions(Options options, JarArchiveComparatorOptions comparatorOptions) {
-        comparatorOptions.setModifierLevel(options.getAccessModifier());
-        comparatorOptions.getPackagesInclude().addAll(options.getPackagesInclude());
-        comparatorOptions.getPackagesExclude().addAll(options.getPackagesExclude());
-    }
-
-    private void generateOutput(Options options, File oldArchive, File newArchive, List<JApiClass> jApiClasses) {
-        OutputTransformer.sortClassesAndMethods(jApiClasses);
-        if (options.getXmlOutputFile().isPresent()) {
-            XmlOutputGenerator xmlGenerator = new XmlOutputGenerator();
-            xmlGenerator.generate(oldArchive, newArchive, jApiClasses, options);
-        }
-        StdoutOutputGenerator stdoutOutputGenerator = new StdoutOutputGenerator();
-        String output = stdoutOutputGenerator.generate(oldArchive, newArchive, jApiClasses, options);
-        System.out.println(output);
-    }
-
-    private Options parseCliOptions(String[] args) {
-        try {
-            CliParser cliParser = new CliParser();
-            return cliParser.parse(args);
-        } catch (IllegalArgumentException e) {
-            throw new JApiCmpException(JApiCmpException.Reason.IllegalArgument, e.getMessage());
-        } catch (Exception e) {
-            throw new JApiCmpException(JApiCmpException.Reason.IllegalArgument, "Failed to parse command line options: " + e.getMessage());
-        }
-    }
-
-    private void verifyFiles(File oldArchive, File newArchive) {
-        if (!oldArchive.exists()) {
-            String msg = String.format("File '%s' does not exist.", oldArchive.getAbsolutePath());
-            throw new JApiCmpException(JApiCmpException.Reason.IllegalArgument, msg);
-        }
-        if (!newArchive.exists()) {
-            String msg = String.format("File '%s' does not exist.", newArchive.getAbsolutePath());
-            throw new JApiCmpException(JApiCmpException.Reason.IllegalArgument, msg);
-        }
-        if(oldArchive.equals(newArchive)) {
-            String msg = String.format("Files '%s' and '%s' are the same.", oldArchive.getAbsolutePath(), newArchive.getAbsolutePath());
-            throw new JApiCmpException(JApiCmpException.Reason.IllegalArgument, msg);
-        }
-        verifyJarArchive(oldArchive);
-        verifyJarArchive(newArchive);
-    }
-
-    private void verifyJarArchive(File file) {
-        try {
-            new JarFile(file);
-        } catch (IOException e) {
-            String msg = String.format("File '%s' could not be opened as a jar file: %s", file.getAbsolutePath(), e.getMessage());
-            throw new JApiCmpException(JApiCmpException.Reason.IllegalArgument, msg);
-        }
-    }
-}
+package japicmp;
+
+import japicmp.cli.CliParser;
+import japicmp.cmp.JarArchiveComparator;
+import japicmp.cmp.JarArchiveComparatorOptions;
+import japicmp.config.Options;
+import japicmp.exception.JApiCmpException;
+import japicmp.model.JApiClass;
+import japicmp.output.OutputTransformer;
+import japicmp.output.stdout.StdoutOutputGenerator;
+import japicmp.output.xml.XmlOutputGenerator;
+
+import java.io.File;
+import java.io.IOException;
+import java.util.List;
+import java.util.jar.JarFile;
+
+public class JApiCmp {
+
+    public static void main(String[] args) {
+        try {
+            JApiCmp app = new JApiCmp();
+            app.run(args);
+        } catch (JApiCmpException e) {
+            if (e.getReason() != JApiCmpException.Reason.NormalTermination) {
+                System.err.println(e.getMessage());
+                System.exit(-1);
+            }
+        } catch (Exception e) {
+            System.err.println(String.format("Execution of %s failed: %s", JApiCmp.class.getSimpleName(), e.getMessage()));
+            System.exit(-2);
+        }
+    }
+
+    private void run(String[] args) {
+        Options options = parseCliOptions(args);
+        File oldArchive = new File(options.getOldArchive());
+        File newArchive = new File(options.getNewArchive());
+        verifyFiles(oldArchive, newArchive);
+        JarArchiveComparatorOptions comparatorOptions = new JarArchiveComparatorOptions();
+        copyOptions(options, comparatorOptions);
+        JarArchiveComparator jarArchiveComparator = new JarArchiveComparator(comparatorOptions);
+        List<JApiClass> jApiClasses = jarArchiveComparator.compare(oldArchive, newArchive);
+        generateOutput(options, oldArchive, newArchive, jApiClasses);
+    }
+
+    private void copyOptions(Options options, JarArchiveComparatorOptions comparatorOptions) {
+        comparatorOptions.setModifierLevel(options.getAccessModifier());
+        comparatorOptions.getPackagesInclude().addAll(options.getPackagesInclude());
+        comparatorOptions.getPackagesExclude().addAll(options.getPackagesExclude());
+    }
+
+    private void generateOutput(Options options, File oldArchive, File newArchive, List<JApiClass> jApiClasses) {
+        OutputTransformer.sortClassesAndMethods(jApiClasses);
+        if (options.getXmlOutputFile().isPresent()) {
+            XmlOutputGenerator xmlGenerator = new XmlOutputGenerator();
+            xmlGenerator.generate(oldArchive, newArchive, jApiClasses, options);
+        }
+        StdoutOutputGenerator stdoutOutputGenerator = new StdoutOutputGenerator();
+        String output = stdoutOutputGenerator.generate(oldArchive, newArchive, jApiClasses, options);
+        System.out.println(output);
+    }
+
+    private Options parseCliOptions(String[] args) {
+        try {
+            CliParser cliParser = new CliParser();
+            return cliParser.parse(args);
+        } catch (IllegalArgumentException e) {
+            throw new JApiCmpException(JApiCmpException.Reason.IllegalArgument, e.getMessage());
+        } catch (Exception e) {
+            throw new JApiCmpException(JApiCmpException.Reason.IllegalArgument, "Failed to parse command line options: " + e.getMessage());
+        }
+    }
+
+    private void verifyFiles(File oldArchive, File newArchive) {
+        if (!oldArchive.exists()) {
+            String msg = String.format("File '%s' does not exist.", oldArchive.getAbsolutePath());
+            throw new JApiCmpException(JApiCmpException.Reason.IllegalArgument, msg);
+        }
+        if (!newArchive.exists()) {
+            String msg = String.format("File '%s' does not exist.", newArchive.getAbsolutePath());
+            throw new JApiCmpException(JApiCmpException.Reason.IllegalArgument, msg);
+        }
+        if(oldArchive.equals(newArchive)) {
+            String msg = String.format("Files '%s' and '%s' are the same.", oldArchive.getAbsolutePath(), newArchive.getAbsolutePath());
+            throw new JApiCmpException(JApiCmpException.Reason.IllegalArgument, msg);
+        }
+        verifyJarArchive(oldArchive);
+        verifyJarArchive(newArchive);
+    }
+
+    private void verifyJarArchive(File file) {
+        try {
+            new JarFile(file);
+        } catch (IOException e) {
+            String msg = String.format("File '%s' could not be opened as a jar file: %s", file.getAbsolutePath(), e.getMessage());
+            throw new JApiCmpException(JApiCmpException.Reason.IllegalArgument, msg);
+        }
+    }
+}
diff --git a/japicmp/src/main/java/japicmp/cli/CliParser.java b/japicmp/src/main/java/japicmp/cli/CliParser.java
index 17c9889..e5f87e3 100644
--- a/japicmp/src/main/java/japicmp/cli/CliParser.java
+++ b/japicmp/src/main/java/japicmp/cli/CliParser.java
@@ -1,119 +1,119 @@
-package japicmp.cli;
-
-import com.google.common.base.Optional;
-import japicmp.model.AccessModifier;
-import japicmp.config.PackageFilter;
-import japicmp.config.Options;
-import japicmp.exception.JApiCmpException;
-import japicmp.util.StringArrayEnumeration;
-
-public class CliParser {
-
-    public Options parse(String[] args) throws IllegalArgumentException {
-        Options options = new Options();
-        StringArrayEnumeration sae = new StringArrayEnumeration(args);
-        while (sae.hasMoreElements()) {
-            String arg = sae.nextElement();
-            if ("-n".equals(arg)) {
-                String newArchive = getOptionWithArgument("-n", sae);
-                options.setNewArchive(newArchive);
-            }
-            if ("-o".equals(arg)) {
-                String oldArchive = getOptionWithArgument("-o", sae);
-                options.setOldArchive(oldArchive);
-            }
-            if ("-x".equals(arg)) {
-                String xmlOutputFile = getOptionWithArgument("-x", sae);
-                options.setXmlOutputFile(Optional.of(xmlOutputFile));
-            }
-            if ("-m".equals(arg)) {
-                options.setOutputOnlyModifications(true);
-            }
-            if ("-a".equals(arg)) {
-                String accessModifierArg = getOptionWithArgument("-a", sae);
-                try {
-                    AccessModifier accessModifier = AccessModifier.valueOf(accessModifierArg.toUpperCase());
-                    options.setAccessModifier(accessModifier);
-                } catch (IllegalArgumentException e) {
-                    throw new IllegalArgumentException(String.format("Invalid value for option -a: %s. Possible values are: %s.", accessModifierArg, listOfAccessModifiers()));
-                }
-            }
-            if ("-i".equals(arg)) {
-                String packagesIncludeArg = getOptionWithArgument("-i", sae);
-                String[] parts = packagesIncludeArg.split(",");
-                for (String part : parts) {
-                    part = part.trim();
-                    try {
-                        options.getPackagesInclude().add(new PackageFilter(part));
-                    } catch (Exception e) {
-                        throw new IllegalArgumentException(String.format("Wrong syntax for include option '%s': %s", part, e.getMessage()));
-                    }
-                }
-            }
-            if ("-e".equals(arg)) {
-                String packagesExcludeArg = getOptionWithArgument("-e", sae);
-                String[] parts = packagesExcludeArg.split(",");
-                for (String part : parts) {
-                    part = part.trim();
-                    try {
-                        options.getPackagesInclude().add(new PackageFilter(part));
-                    } catch (Exception e) {
-                        throw new IllegalArgumentException(String.format("Wrong syntax for exclude option '%s': %s", part, e.getMessage()));
-                    }
-                }
-            }
-            if ("-h".equals(arg)) {
-                printHelp();
-            }
-        }
-        checkForMandatoryOptions(options);
-        return options;
-    }
-
-    private void printHelp() {
-        System.out.println("Available parameters:");
-        System.out.println("-h                        Prints this help.");
-        System.out.println("-o <pathToOldVersionJar>  Provides the path to the old version of the jar.");
-        System.out.println("-n <pathToNewVersionJar>  Provides the path to the new version of the jar.");
-        System.out.println("-x <pathToXmlOutputFile>  Provides the path to the xml output file. If not given, stdout is used.");
-        System.out.println("-a <accessModifier>       Sets the access modifier level (public, package, protected, private), which should be used.");
-        System.out.println("-i <packagesToInclude>    Comma separated list of package names to include, * can be used as wildcard.");
-        System.out.println("-e <packagesToExclude>    Comma separated list of package names to exclude, * can be used as wildcard.");
-        System.out.println("-m                        Outputs only modified classes/methods. If not given, all classes and methods are printed.");
-        throw new JApiCmpException(JApiCmpException.Reason.NormalTermination);
-    }
-
-    private void checkForMandatoryOptions(Options options) {
-        if (options.getOldArchive() == null || options.getOldArchive().length() == 0) {
-            throw new IllegalArgumentException("Missing option for old version: -o <pathToOldVersionJar>");
-        }
-        if (options.getNewArchive() == null || options.getNewArchive().length() == 0) {
-            throw new IllegalArgumentException("Missing option for new version: -n <pathToNewVersionJar>");
-        }
-    }
-
-    private String getOptionWithArgument(String option, StringArrayEnumeration sae) {
-        if (sae.hasMoreElements()) {
-            String value = sae.nextElement();
-            if (value.startsWith("-")) {
-                throw new IllegalArgumentException(String.format("Missing argument for option %s.", option));
-            }
-            return value;
-        } else {
-            throw new IllegalArgumentException(String.format("Missing argument for option %s.", option));
-        }
-    }
-
-    private String listOfAccessModifiers() {
-        StringBuilder sb = new StringBuilder();
-        int i = 0;
-        for (AccessModifier am : AccessModifier.values()) {
-            if (i > 0) {
-                sb.append(",");
-            }
-            sb.append(am.toString());
-            i++;
-        }
-        return sb.toString();
-    }
-}
+package japicmp.cli;
+
+import com.google.common.base.Optional;
+import japicmp.model.AccessModifier;
+import japicmp.config.PackageFilter;
+import japicmp.config.Options;
+import japicmp.exception.JApiCmpException;
+import japicmp.util.StringArrayEnumeration;
+
+public class CliParser {
+
+    public Options parse(String[] args) throws IllegalArgumentException {
+        Options options = new Options();
+        StringArrayEnumeration sae = new StringArrayEnumeration(args);
+        while (sae.hasMoreElements()) {
+            String arg = sae.nextElement();
+            if ("-n".equals(arg)) {
+                String newArchive = getOptionWithArgument("-n", sae);
+                options.setNewArchive(newArchive);
+            }
+            if ("-o".equals(arg)) {
+                String oldArchive = getOptionWithArgument("-o", sae);
+                options.setOldArchive(oldArchive);
+            }
+            if ("-x".equals(arg)) {
+                String xmlOutputFile = getOptionWithArgument("-x", sae);
+                options.setXmlOutputFile(Optional.of(xmlOutputFile));
+            }
+            if ("-m".equals(arg)) {
+                options.setOutputOnlyModifications(true);
+            }
+            if ("-a".equals(arg)) {
+                String accessModifierArg = getOptionWithArgument("-a", sae);
+                try {
+                    AccessModifier accessModifier = AccessModifier.valueOf(accessModifierArg.toUpperCase());
+                    options.setAccessModifier(accessModifier);
+                } catch (IllegalArgumentException e) {
+                    throw new IllegalArgumentException(String.format("Invalid value for option -a: %s. Possible values are: %s.", accessModifierArg, listOfAccessModifiers()));
+                }
+            }
+            if ("-i".equals(arg)) {
+                String packagesIncludeArg = getOptionWithArgument("-i", sae);
+                String[] parts = packagesIncludeArg.split(",");
+                for (String part : parts) {
+                    part = part.trim();
+                    try {
+                        options.getPackagesInclude().add(new PackageFilter(part));
+                    } catch (Exception e) {
+                        throw new IllegalArgumentException(String.format("Wrong syntax for include option '%s': %s", part, e.getMessage()));
+                    }
+                }
+            }
+            if ("-e".equals(arg)) {
+                String packagesExcludeArg = getOptionWithArgument("-e", sae);
+                String[] parts = packagesExcludeArg.split(",");
+                for (String part : parts) {
+                    part = part.trim();
+                    try {
+                        options.getPackagesInclude().add(new PackageFilter(part));
+                    } catch (Exception e) {
+                        throw new IllegalArgumentException(String.format("Wrong syntax for exclude option '%s': %s", part, e.getMessage()));
+                    }
+                }
+            }
+            if ("-h".equals(arg)) {
+                printHelp();
+            }
+        }
+        checkForMandatoryOptions(options);
+        return options;
+    }
+
+    private void printHelp() {
+        System.out.println("Available parameters:");
+        System.out.println("-h                        Prints this help.");
+        System.out.println("-o <pathToOldVersionJar>  Provides the path to the old version of the jar.");
+        System.out.println("-n <pathToNewVersionJar>  Provides the path to the new version of the jar.");
+        System.out.println("-x <pathToXmlOutputFile>  Provides the path to the xml output file. If not given, stdout is used.");
+        System.out.println("-a <accessModifier>       Sets the access modifier level (public, package, protected, private), which should be used.");
+        System.out.println("-i <packagesToInclude>    Comma separated list of package names to include, * can be used as wildcard.");
+        System.out.println("-e <packagesToExclude>    Comma separated list of package names to exclude, * can be used as wildcard.");
+        System.out.println("-m                        Outputs only modified classes/methods. If not given, all classes and methods are printed.");
+        throw new JApiCmpException(JApiCmpException.Reason.NormalTermination);
+    }
+
+    private void checkForMandatoryOptions(Options options) {
+        if (options.getOldArchive() == null || options.getOldArchive().length() == 0) {
+            throw new IllegalArgumentException("Missing option for old version: -o <pathToOldVersionJar>");
+        }
+        if (options.getNewArchive() == null || options.getNewArchive().length() == 0) {
+            throw new IllegalArgumentException("Missing option for new version: -n <pathToNewVersionJar>");
+        }
+    }
+
+    private String getOptionWithArgument(String option, StringArrayEnumeration sae) {
+        if (sae.hasMoreElements()) {
+            String value = sae.nextElement();
+            if (value.startsWith("-")) {
+                throw new IllegalArgumentException(String.format("Missing argument for option %s.", option));
+            }
+            return value;
+        } else {
+            throw new IllegalArgumentException(String.format("Missing argument for option %s.", option));
+        }
+    }
+
+    private String listOfAccessModifiers() {
+        StringBuilder sb = new StringBuilder();
+        int i = 0;
+        for (AccessModifier am : AccessModifier.values()) {
+            if (i > 0) {
+                sb.append(",");
+            }
+            sb.append(am.toString());
+            i++;
+        }
+        return sb.toString();
+    }
+}
diff --git a/japicmp/src/main/java/japicmp/cmp/ClassComparator.java b/japicmp/src/main/java/japicmp/cmp/ClassComparator.java
index b600b13..6e8693d 100644
--- a/japicmp/src/main/java/japicmp/cmp/ClassComparator.java
+++ b/japicmp/src/main/java/japicmp/cmp/ClassComparator.java
@@ -1,77 +1,77 @@
-package japicmp.cmp;
-
-import com.google.common.base.Optional;
-import japicmp.model.*;
-import japicmp.util.ModifierHelper;
-import japicmp.util.SignatureParser;
-import javassist.CtClass;
-import javassist.CtMethod;
-
-import java.util.HashMap;
-import java.util.Map;
-
-public class ClassComparator {
-    private final JarArchiveComparatorOptions options;
-
-    public ClassComparator(JarArchiveComparatorOptions options) {
-        this.options = options;
-    }
-
-    public void compare(JApiClass jApiClass) {
-        Map<String, CtMethod> oldMethodsMap = createMethodMap(jApiClass.getOldClass());
-        Map<String, CtMethod> newMethodsMap = createMethodMap(jApiClass.getNewClass());
-        sortMethodsIntoLists(oldMethodsMap, newMethodsMap, jApiClass);
-    }
-
-    private void sortMethodsIntoLists(Map<String, CtMethod> oldMethodsMap, Map<String, CtMethod> newMethodsMap, JApiClass jApiClass) {
-        SignatureParser signatureParser = new SignatureParser();
-        for (CtMethod ctMethod : oldMethodsMap.values()) {
-            String longName = ctMethod.getLongName();
-            signatureParser.parse(ctMethod.getSignature());
-            CtMethod foundMethod = newMethodsMap.get(longName);
-            if (foundMethod == null) {
-                JApiMethod jApiMethod = new JApiMethod(ctMethod.getName(), JApiChangeStatus.REMOVED, Optional.of(ctMethod), Optional.<CtMethod>absent(), signatureParser.getReturnType(), Optional.of(ModifierHelper.translateToModifierLevel(ctMethod.getModifiers())), Optional.<AccessModifier>absent());
-                addParametersToMethod(signatureParser, jApiMethod);
-                jApiClass.addMethod(jApiMethod);
-                if(jApiClass.getChangeStatus() == JApiChangeStatus.UNCHANGED) {
-                    jApiClass.setChangeStatus(JApiChangeStatus.MODIFIED);
-                }
-            } else {
-                JApiMethod jApiMethod = new JApiMethod(ctMethod.getName(), JApiChangeStatus.UNCHANGED, Optional.of(ctMethod), Optional.of(foundMethod), signatureParser.getReturnType(), Optional.of(ModifierHelper.translateToModifierLevel(ctMethod.getModifiers())), Optional.of(ModifierHelper.translateToModifierLevel(foundMethod.getModifiers())));
-                addParametersToMethod(signatureParser, jApiMethod);
-                jApiClass.addMethod(jApiMethod);
-            }
-        }
-        for (CtMethod ctMethod : newMethodsMap.values()) {
-            String longName = ctMethod.getLongName();
-            signatureParser.parse(ctMethod.getSignature());
-            CtMethod foundMethod = oldMethodsMap.get(longName);
-            if (foundMethod == null) {
-                JApiMethod jApiMethod = new JApiMethod(ctMethod.getName(), JApiChangeStatus.NEW, Optional.<CtMethod>absent(), Optional.of(ctMethod), signatureParser.getReturnType(), Optional.<AccessModifier>absent(), Optional.of(ModifierHelper.translateToModifierLevel(ctMethod.getModifiers())));
-                addParametersToMethod(signatureParser, jApiMethod);
-                jApiClass.addMethod(jApiMethod);
-                if(jApiClass.getChangeStatus() == JApiChangeStatus.UNCHANGED) {
-                    jApiClass.setChangeStatus(JApiChangeStatus.MODIFIED);
-                }
-            }
-        }
-    }
-
-    private void addParametersToMethod(SignatureParser signatureParser, JApiMethod jApiMethod) {
-        for (String param : signatureParser.getParameters()) {
-            jApiMethod.addParameter(new JApiParameter(param));
-        }
-    }
-
-    private Map<String, CtMethod> createMethodMap(Optional<CtClass> ctClass) {
-        Map<String, CtMethod> methods = new HashMap<String, CtMethod>();
-        if (ctClass.isPresent()) {
-            for (CtMethod ctMethod : ctClass.get().getDeclaredMethods()) {
-                if(ModifierHelper.matchesModifierLevel(ctMethod.getModifiers(), options.getModifierLevel())) {
-                    methods.put(ctMethod.getLongName(), ctMethod);
-                }
-            }
-        }
-        return methods;
-    }
-}
+package japicmp.cmp;
+
+import com.google.common.base.Optional;
+import japicmp.model.*;
+import japicmp.util.ModifierHelper;
+import japicmp.util.SignatureParser;
+import javassist.CtClass;
+import javassist.CtMethod;
+
+import java.util.HashMap;
+import java.util.Map;
+
+public class ClassComparator {
+    private final JarArchiveComparatorOptions options;
+
+    public ClassComparator(JarArchiveComparatorOptions options) {
+        this.options = options;
+    }
+
+    public void compare(JApiClass jApiClass) {
+        Map<String, CtMethod> oldMethodsMap = createMethodMap(jApiClass.getOldClass());
+        Map<String, CtMethod> newMethodsMap = createMethodMap(jApiClass.getNewClass());
+        sortMethodsIntoLists(oldMethodsMap, newMethodsMap, jApiClass);
+    }
+
+    private void sortMethodsIntoLists(Map<String, CtMethod> oldMethodsMap, Map<String, CtMethod> newMethodsMap, JApiClass jApiClass) {
+        SignatureParser signatureParser = new SignatureParser();
+        for (CtMethod ctMethod : oldMethodsMap.values()) {
+            String longName = ctMethod.getLongName();
+            signatureParser.parse(ctMethod.getSignature());
+            CtMethod foundMethod = newMethodsMap.get(longName);
+            if (foundMethod == null) {
+                JApiMethod jApiMethod = new JApiMethod(ctMethod.getName(), JApiChangeStatus.REMOVED, Optional.of(ctMethod), Optional.<CtMethod>absent(), signatureParser.getReturnType(), Optional.of(ModifierHelper.translateToModifierLevel(ctMethod.getModifiers())), Optional.<AccessModifier>absent());
+                addParametersToMethod(signatureParser, jApiMethod);
+                jApiClass.addMethod(jApiMethod);
+                if(jApiClass.getChangeStatus() == JApiChangeStatus.UNCHANGED) {
+                    jApiClass.setChangeStatus(JApiChangeStatus.MODIFIED);
+                }
+            } else {
+                JApiMethod jApiMethod = new JApiMethod(ctMethod.getName(), JApiChangeStatus.UNCHANGED, Optional.of(ctMethod), Optional.of(foundMethod), signatureParser.getReturnType(), Optional.of(ModifierHelper.translateToModifierLevel(ctMethod.getModifiers())), Optional.of(ModifierHelper.translateToModifierLevel(foundMethod.getModifiers())));
+                addParametersToMethod(signatureParser, jApiMethod);
+                jApiClass.addMethod(jApiMethod);
+            }
+        }
+        for (CtMethod ctMethod : newMethodsMap.values()) {
+            String longName = ctMethod.getLongName();
+            signatureParser.parse(ctMethod.getSignature());
+            CtMethod foundMethod = oldMethodsMap.get(longName);
+            if (foundMethod == null) {
+                JApiMethod jApiMethod = new JApiMethod(ctMethod.getName(), JApiChangeStatus.NEW, Optional.<CtMethod>absent(), Optional.of(ctMethod), signatureParser.getReturnType(), Optional.<AccessModifier>absent(), Optional.of(ModifierHelper.translateToModifierLevel(ctMethod.getModifiers())));
+                addParametersToMethod(signatureParser, jApiMethod);
+                jApiClass.addMethod(jApiMethod);
+                if(jApiClass.getChangeStatus() == JApiChangeStatus.UNCHANGED) {
+                    jApiClass.setChangeStatus(JApiChangeStatus.MODIFIED);
+                }
+            }
+        }
+    }
+
+    private void addParametersToMethod(SignatureParser signatureParser, JApiMethod jApiMethod) {
+        for (String param : signatureParser.getParameters()) {
+            jApiMethod.addParameter(new JApiParameter(param));
+        }
+    }
+
+    private Map<String, CtMethod> createMethodMap(Optional<CtClass> ctClass) {
+        Map<String, CtMethod> methods = new HashMap<String, CtMethod>();
+        if (ctClass.isPresent()) {
+            for (CtMethod ctMethod : ctClass.get().getDeclaredMethods()) {
+                if(ModifierHelper.matchesModifierLevel(ctMethod.getModifiers(), options.getModifierLevel())) {
+                    methods.put(ctMethod.getLongName(), ctMethod);
+                }
+            }
+        }
+        return methods;
+    }
+}
diff --git a/japicmp/src/main/java/japicmp/cmp/ClassesComparator.java b/japicmp/src/main/java/japicmp/cmp/ClassesComparator.java
index bae4f86..188078f 100644
--- a/japicmp/src/main/java/japicmp/cmp/ClassesComparator.java
+++ b/japicmp/src/main/java/japicmp/cmp/ClassesComparator.java
@@ -1,65 +1,65 @@
-package japicmp.cmp;
-
-import com.google.common.base.Optional;
-import japicmp.model.AccessModifier;
-import japicmp.model.JApiChangeStatus;
-import japicmp.model.JApiClass;
-import japicmp.util.ModifierHelper;
-import javassist.CtClass;
-
-import java.util.HashMap;
-import java.util.LinkedList;
-import java.util.List;
-import java.util.Map;
-
-public class ClassesComparator {
-    private List<JApiClass> classes = new LinkedList<JApiClass>();
-
-    public void compare(List<CtClass> oldClassesArg, List<CtClass> newClassesArg) {
-        classes = new LinkedList<JApiClass>();
-        Map<String, CtClass> oldClassesMap = createClassMap(oldClassesArg);
-        Map<String, CtClass> newClassesMap = createClassMap(newClassesArg);
-        sortIntoLists(oldClassesMap, newClassesMap);
-    }
-
-    private void sortIntoLists(Map<String, CtClass> oldClassesMap, Map<String, CtClass> newClassesMap) {
-        for(CtClass ctClass : oldClassesMap.values()) {
-            CtClass foundClass = newClassesMap.get(ctClass.getName());
-            if(foundClass == null) {
-                classes.add(new JApiClass(ctClass.getName(), Optional.<CtClass>of(ctClass), Optional.<CtClass>absent(), JApiChangeStatus.REMOVED, getType(ctClass), Optional.of(ModifierHelper.translateToModifierLevel(ctClass.getModifiers())), Optional.<AccessModifier>absent()));
-            } else {
-                classes.add(new JApiClass(ctClass.getName(), Optional.<CtClass>of(ctClass), Optional.<CtClass>of(foundClass), JApiChangeStatus.UNCHANGED, getType(ctClass), Optional.of(ModifierHelper.translateToModifierLevel(ctClass.getModifiers())), Optional.of(ModifierHelper.translateToModifierLevel(foundClass.getModifiers()))));
-            }
-        }
-        for(CtClass ctClass : newClassesMap.values()) {
-            CtClass foundClass = oldClassesMap.get(ctClass.getName());
-            if(foundClass == null) {
-                classes.add(new JApiClass(ctClass.getName(), Optional.<CtClass>absent(), Optional.<CtClass>of(ctClass), JApiChangeStatus.NEW, getType(ctClass), Optional.<AccessModifier>absent(), Optional.of(ModifierHelper.translateToModifierLevel(ctClass.getModifiers()))));
-            }
-        }
-    }
-
-    private JApiClass.Type getType(CtClass ctClass) {
-        if(ctClass.isAnnotation()) {
-            return JApiClass.Type.ANNOTATION;
-        } else if(ctClass.isEnum()) {
-            return JApiClass.Type.ENUM;
-        } else if(ctClass.isInterface()) {
-            return JApiClass.Type.INTERFACE;
-        } else {
-            return JApiClass.Type.CLASS;
-        }
-    }
-
-    private Map<String, CtClass> createClassMap(List<CtClass> oldClassesArg) {
-        Map<String, CtClass> oldClassesMap = new HashMap<String, CtClass>();
-        for(CtClass ctClass : oldClassesArg) {
-            oldClassesMap.put(ctClass.getName(), ctClass);
-        }
-        return oldClassesMap;
-    }
-
-    public List<JApiClass> getClasses() {
-        return classes;
-    }
-}
+package japicmp.cmp;
+
+import com.google.common.base.Optional;
+import japicmp.model.AccessModifier;
+import japicmp.model.JApiChangeStatus;
+import japicmp.model.JApiClass;
+import japicmp.util.ModifierHelper;
+import javassist.CtClass;
+
+import java.util.HashMap;
+import java.util.LinkedList;
+import java.util.List;
+import java.util.Map;
+
+public class ClassesComparator {
+    private List<JApiClass> classes = new LinkedList<JApiClass>();
+
+    public void compare(List<CtClass> oldClassesArg, List<CtClass> newClassesArg) {
+        classes = new LinkedList<JApiClass>();
+        Map<String, CtClass> oldClassesMap = createClassMap(oldClassesArg);
+        Map<String, CtClass> newClassesMap = createClassMap(newClassesArg);
+        sortIntoLists(oldClassesMap, newClassesMap);
+    }
+
+    private void sortIntoLists(Map<String, CtClass> oldClassesMap, Map<String, CtClass> newClassesMap) {
+        for(CtClass ctClass : oldClassesMap.values()) {
+            CtClass foundClass = newClassesMap.get(ctClass.getName());
+            if(foundClass == null) {
+                classes.add(new JApiClass(ctClass.getName(), Optional.<CtClass>of(ctClass), Optional.<CtClass>absent(), JApiChangeStatus.REMOVED, getType(ctClass), Optional.of(ModifierHelper.translateToModifierLevel(ctClass.getModifiers())), Optional.<AccessModifier>absent()));
+            } else {
+                classes.add(new JApiClass(ctClass.getName(), Optional.<CtClass>of(ctClass), Optional.<CtClass>of(foundClass), JApiChangeStatus.UNCHANGED, getType(ctClass), Optional.of(ModifierHelper.translateToModifierLevel(ctClass.getModifiers())), Optional.of(ModifierHelper.translateToModifierLevel(foundClass.getModifiers()))));
+            }
+        }
+        for(CtClass ctClass : newClassesMap.values()) {
+            CtClass foundClass = oldClassesMap.get(ctClass.getName());
+            if(foundClass == null) {
+                classes.add(new JApiClass(ctClass.getName(), Optional.<CtClass>absent(), Optional.<CtClass>of(ctClass), JApiChangeStatus.NEW, getType(ctClass), Optional.<AccessModifier>absent(), Optional.of(ModifierHelper.translateToModifierLevel(ctClass.getModifiers()))));
+            }
+        }
+    }
+
+    private JApiClass.Type getType(CtClass ctClass) {
+        if(ctClass.isAnnotation()) {
+            return JApiClass.Type.ANNOTATION;
+        } else if(ctClass.isEnum()) {
+            return JApiClass.Type.ENUM;
+        } else if(ctClass.isInterface()) {
+            return JApiClass.Type.INTERFACE;
+        } else {
+            return JApiClass.Type.CLASS;
+        }
+    }
+
+    private Map<String, CtClass> createClassMap(List<CtClass> oldClassesArg) {
+        Map<String, CtClass> oldClassesMap = new HashMap<String, CtClass>();
+        for(CtClass ctClass : oldClassesArg) {
+            oldClassesMap.put(ctClass.getName(), ctClass);
+        }
+        return oldClassesMap;
+    }
+
+    public List<JApiClass> getClasses() {
+        return classes;
+    }
+}
diff --git a/japicmp/src/main/java/japicmp/cmp/JarArchiveComparator.java b/japicmp/src/main/java/japicmp/cmp/JarArchiveComparator.java
index 1ac2478..0149b75 100644
--- a/japicmp/src/main/java/japicmp/cmp/JarArchiveComparator.java
+++ b/japicmp/src/main/java/japicmp/cmp/JarArchiveComparator.java
@@ -1,111 +1,111 @@
-package japicmp.cmp;
-
-import japicmp.config.PackageFilter;
-import japicmp.model.JApiClass;
-import japicmp.util.ModifierHelper;
-import javassist.ClassPool;
-import javassist.CtClass;
-import org.apache.log4j.Logger;
-
-import java.io.File;
-import java.util.Enumeration;
-import java.util.LinkedList;
-import java.util.List;
-import java.util.jar.JarEntry;
-import java.util.jar.JarFile;
-
-public class JarArchiveComparator {
-    private static final Logger logger = Logger.getLogger(JarArchiveComparator.class);
-    private JarArchiveComparatorOptions options;
-
-    public JarArchiveComparator(JarArchiveComparatorOptions options) {
-        this.options = options;
-    }
-
-    public List<JApiClass> compare(File oldArchive, File newArchive) {
-        ClassPool classPool = new ClassPool();
-        try {
-            ClassesComparator classesComparator = compareClassLists(oldArchive, newArchive, classPool, options);
-            List<JApiClass> classList = classesComparator.getClasses();
-            compareClasses(classList);
-            return classList;
-        } catch (Exception e) {
-            System.err.println(String.format("Processing jar files '%s' and '%s' failed: %s.", oldArchive.getAbsolutePath(), newArchive.getAbsolutePath(), e.getMessage()));
-            return new LinkedList<JApiClass>();
-        }
-    }
-
-    private void compareClasses(List<JApiClass> classList) {
-        for (JApiClass jApiClass : classList) {
-            ClassComparator classComparator = new ClassComparator(options);
-            classComparator.compare(jApiClass);
-        }
-    }
-
-    private ClassesComparator compareClassLists(File oldArchive, File newArchive, ClassPool classPool, JarArchiveComparatorOptions options) throws Exception {
-        List<CtClass> oldClasses = createListOfCtClasses(oldArchive, classPool, options);
-        List<CtClass> newClasses = createListOfCtClasses(newArchive, classPool, options);
-        ClassesComparator classesComparator = new ClassesComparator();
-        classesComparator.compare(oldClasses, newClasses);
-        if (logger.isDebugEnabled()) {
-            for (JApiClass jApiClass : classesComparator.getClasses()) {
-                logger.debug(jApiClass);
-            }
-        }
-        return classesComparator;
-    }
-
-    private List<CtClass> createListOfCtClasses(File archive, ClassPool classPool, JarArchiveComparatorOptions options) throws Exception {
-        List<CtClass> classes = new LinkedList<CtClass>();
-        JarFile oldJar = null;
-        try {
-            oldJar = new JarFile(archive);
-            Enumeration<JarEntry> entryEnumeration = oldJar.entries();
-            while (entryEnumeration.hasMoreElements()) {
-                JarEntry jarEntry = entryEnumeration.nextElement();
-                String name = jarEntry.getName();
-                if (name.endsWith(".class")) {
-                    CtClass ctClass = null;
-                    try {
-                        ctClass = classPool.makeClass(oldJar.getInputStream(jarEntry));
-                    } catch (Exception e) {
-                        logger.error(String.format("Failed to load file from jar '%s' as class file: %s.", name, e.getMessage()));
-                        throw e;
-                    }
-                    if (ModifierHelper.matchesModifierLevel(ctClass.getModifiers(), options.getModifierLevel()) && packageMatches(options, ctClass)) {
-                        classes.add(ctClass);
-                    }
-                    if (logger.isDebugEnabled()) {
-                        logger.debug(String.format("Adding class '%s' with jar name '%s' to list.", ctClass.getName(), name));
-                    }
-                } else {
-                    logger.debug(String.format("Skipping file '%s' because filename does not end with '.class'.", name));
-                }
-            }
-        } finally {
-            if (oldJar != null) {
-                oldJar.close();
-            }
-        }
-        return classes;
-    }
-
-    private boolean packageMatches(JarArchiveComparatorOptions options, CtClass ctClass) {
-        String packageName = ctClass.getPackageName();
-        for (PackageFilter packageFilter : options.getPackagesInclude()) {
-            if (packageFilter.matches(packageName)) {
-                return true;
-            }
-        }
-        for (PackageFilter packageFilter : options.getPackagesExclude()) {
-            if (packageFilter.matches(packageName)) {
-                return false;
-            }
-        }
-        int noInclude = options.getPackagesInclude().size();
-        if (noInclude > 0) {
-            return false;
-        }
-        return true;
-    }
-}
+package japicmp.cmp;
+
+import japicmp.config.PackageFilter;
+import japicmp.model.JApiClass;
+import japicmp.util.ModifierHelper;
+import javassist.ClassPool;
+import javassist.CtClass;
+import org.apache.log4j.Logger;
+
+import java.io.File;
+import java.util.Enumeration;
+import java.util.LinkedList;
+import java.util.List;
+import java.util.jar.JarEntry;
+import java.util.jar.JarFile;
+
+public class JarArchiveComparator {
+    private static final Logger logger = Logger.getLogger(JarArchiveComparator.class);
+    private JarArchiveComparatorOptions options;
+
+    public JarArchiveComparator(JarArchiveComparatorOptions options) {
+        this.options = options;
+    }
+
+    public List<JApiClass> compare(File oldArchive, File newArchive) {
+        ClassPool classPool = new ClassPool();
+        try {
+            ClassesComparator classesComparator = compareClassLists(oldArchive, newArchive, classPool, options);
+            List<JApiClass> classList = classesComparator.getClasses();
+            compareClasses(classList);
+            return classList;
+        } catch (Exception e) {
+            System.err.println(String.format("Processing jar files '%s' and '%s' failed: %s.", oldArchive.getAbsolutePath(), newArchive.getAbsolutePath(), e.getMessage()));
+            return new LinkedList<JApiClass>();
+        }
+    }
+
+    private void compareClasses(List<JApiClass> classList) {
+        for (JApiClass jApiClass : classList) {
+            ClassComparator classComparator = new ClassComparator(options);
+            classComparator.compare(jApiClass);
+        }
+    }
+
+    private ClassesComparator compareClassLists(File oldArchive, File newArchive, ClassPool classPool, JarArchiveComparatorOptions options) throws Exception {
+        List<CtClass> oldClasses = createListOfCtClasses(oldArchive, classPool, options);
+        List<CtClass> newClasses = createListOfCtClasses(newArchive, classPool, options);
+        ClassesComparator classesComparator = new ClassesComparator();
+        classesComparator.compare(oldClasses, newClasses);
+        if (logger.isDebugEnabled()) {
+            for (JApiClass jApiClass : classesComparator.getClasses()) {
+                logger.debug(jApiClass);
+            }
+        }
+        return classesComparator;
+    }
+
+    private List<CtClass> createListOfCtClasses(File archive, ClassPool classPool, JarArchiveComparatorOptions options) throws Exception {
+        List<CtClass> classes = new LinkedList<CtClass>();
+        JarFile oldJar = null;
+        try {
+            oldJar = new JarFile(archive);
+            Enumeration<JarEntry> entryEnumeration = oldJar.entries();
+            while (entryEnumeration.hasMoreElements()) {
+                JarEntry jarEntry = entryEnumeration.nextElement();
+                String name = jarEntry.getName();
+                if (name.endsWith(".class")) {
+                    CtClass ctClass = null;
+                    try {
+                        ctClass = classPool.makeClass(oldJar.getInputStream(jarEntry));
+                    } catch (Exception e) {
+                        logger.error(String.format("Failed to load file from jar '%s' as class file: %s.", name, e.getMessage()));
+                        throw e;
+                    }
+                    if (ModifierHelper.matchesModifierLevel(ctClass.getModifiers(), options.getModifierLevel()) && packageMatches(options, ctClass)) {
+                        classes.add(ctClass);
+                    }
+                    if (logger.isDebugEnabled()) {
+                        logger.debug(String.format("Adding class '%s' with jar name '%s' to list.", ctClass.getName(), name));
+                    }
+                } else {
+                    logger.debug(String.format("Skipping file '%s' because filename does not end with '.class'.", name));
+                }
+            }
+        } finally {
+            if (oldJar != null) {
+                oldJar.close();
+            }
+        }
+        return classes;
+    }
+
+    private boolean packageMatches(JarArchiveComparatorOptions options, CtClass ctClass) {
+        String packageName = ctClass.getPackageName();
+        for (PackageFilter packageFilter : options.getPackagesInclude()) {
+            if (packageFilter.matches(packageName)) {
+                return true;
+            }
+        }
+        for (PackageFilter packageFilter : options.getPackagesExclude()) {
+            if (packageFilter.matches(packageName)) {
+                return false;
+            }
+        }
+        int noInclude = options.getPackagesInclude().size();
+        if (noInclude > 0) {
+            return false;
+        }
+        return true;
+    }
+}
diff --git a/japicmp/src/main/java/japicmp/cmp/JarArchiveComparatorOptions.java b/japicmp/src/main/java/japicmp/cmp/JarArchiveComparatorOptions.java
index ff69634..e1d656a 100644
--- a/japicmp/src/main/java/japicmp/cmp/JarArchiveComparatorOptions.java
+++ b/japicmp/src/main/java/japicmp/cmp/JarArchiveComparatorOptions.java
@@ -1,29 +1,29 @@
-package japicmp.cmp;
-
-import japicmp.config.PackageFilter;
-import japicmp.model.AccessModifier;
-
-import java.util.LinkedList;
-import java.util.List;
-
-public class JarArchiveComparatorOptions {
-    private List<PackageFilter> packagesInclude = new LinkedList<PackageFilter>();
-    private List<PackageFilter> packagesExclude = new LinkedList<PackageFilter>();
-    private AccessModifier modifierLevel = AccessModifier.PUBLIC;
-
-    public List<PackageFilter> getPackagesExclude() {
-        return packagesExclude;
-    }
-
-    public List<PackageFilter> getPackagesInclude() {
-        return packagesInclude;
-    }
-
-    public AccessModifier getModifierLevel() {
-        return modifierLevel;
-    }
-
-    public void setModifierLevel(AccessModifier modifierLevel) {
-        this.modifierLevel = modifierLevel;
-    }
-}
+package japicmp.cmp;
+
+import japicmp.config.PackageFilter;
+import japicmp.model.AccessModifier;
+
+import java.util.LinkedList;
+import java.util.List;
+
+public class JarArchiveComparatorOptions {
+    private List<PackageFilter> packagesInclude = new LinkedList<PackageFilter>();
+    private List<PackageFilter> packagesExclude = new LinkedList<PackageFilter>();
+    private AccessModifier modifierLevel = AccessModifier.PUBLIC;
+
+    public List<PackageFilter> getPackagesExclude() {
+        return packagesExclude;
+    }
+
+    public List<PackageFilter> getPackagesInclude() {
+        return packagesInclude;
+    }
+
+    public AccessModifier getModifierLevel() {
+        return modifierLevel;
+    }
+
+    public void setModifierLevel(AccessModifier modifierLevel) {
+        this.modifierLevel = modifierLevel;
+    }
+}
diff --git a/japicmp/src/main/java/japicmp/config/Options.java b/japicmp/src/main/java/japicmp/config/Options.java
index 09414e6..8cfc975 100644
--- a/japicmp/src/main/java/japicmp/config/Options.java
+++ b/japicmp/src/main/java/japicmp/config/Options.java
@@ -1,65 +1,65 @@
-package japicmp.config;
-
-import com.google.common.base.Optional;
-import japicmp.model.AccessModifier;
-
-import java.util.LinkedList;
-import java.util.List;
-
-public class Options {
-    private String oldArchive;
-    private String newArchive;
-    private boolean outputOnlyModifications = false;
-    private Optional<String> xmlOutputFile = Optional.<String>absent();
-    private AccessModifier accessModifier = AccessModifier.PUBLIC;
-    private List<PackageFilter> packagesInclude = new LinkedList<PackageFilter>();
-    private List<PackageFilter> packagesExclude = new LinkedList<PackageFilter>();
-
-    public String getNewArchive() {
-        return newArchive;
-    }
-
-    public void setNewArchive(String newArchive) {
-        this.newArchive = newArchive;
-    }
-
-    public String getOldArchive() {
-        return oldArchive;
-    }
-
-    public void setOldArchive(String oldArchive) {
-        this.oldArchive = oldArchive;
-    }
-
-    public boolean isOutputOnlyModifications() {
-        return outputOnlyModifications;
-    }
-
-    public void setOutputOnlyModifications(boolean outputOnlyModifications) {
-        this.outputOnlyModifications = outputOnlyModifications;
-    }
-
-    public Optional<String> getXmlOutputFile() {
-        return xmlOutputFile;
-    }
-
-    public void setXmlOutputFile(Optional<String> xmlOutputFile) {
-        this.xmlOutputFile = xmlOutputFile;
-    }
-
-    public void setAccessModifier(AccessModifier accessModifier) {
-        this.accessModifier = accessModifier;
-    }
-
-    public AccessModifier getAccessModifier() {
-        return accessModifier;
-    }
-
-    public List<PackageFilter> getPackagesInclude() {
-        return packagesInclude;
-    }
-
-    public List<PackageFilter> getPackagesExclude() {
-        return packagesExclude;
-    }
-}
+package japicmp.config;
+
+import com.google.common.base.Optional;
+import japicmp.model.AccessModifier;
+
+import java.util.LinkedList;
+import java.util.List;
+
+public class Options {
+    private String oldArchive;
+    private String newArchive;
+    private boolean outputOnlyModifications = false;
+    private Optional<String> xmlOutputFile = Optional.<String>absent();
+    private AccessModifier accessModifier = AccessModifier.PUBLIC;
+    private List<PackageFilter> packagesInclude = new LinkedList<PackageFilter>();
+    private List<PackageFilter> packagesExclude = new LinkedList<PackageFilter>();
+
+    public String getNewArchive() {
+        return newArchive;
+    }
+
+    public void setNewArchive(String newArchive) {
+        this.newArchive = newArchive;
+    }
+
+    public String getOldArchive() {
+        return oldArchive;
+    }
+
+    public void setOldArchive(String oldArchive) {
+        this.oldArchive = oldArchive;
+    }
+
+    public boolean isOutputOnlyModifications() {
+        return outputOnlyModifications;
+    }
+
+    public void setOutputOnlyModifications(boolean outputOnlyModifications) {
+        this.outputOnlyModifications = outputOnlyModifications;
+    }
+
+    public Optional<String> getXmlOutputFile() {
+        return xmlOutputFile;
+    }
+
+    public void setXmlOutputFile(Optional<String> xmlOutputFile) {
+        this.xmlOutputFile = xmlOutputFile;
+    }
+
+    public void setAccessModifier(AccessModifier accessModifier) {
+        this.accessModifier = accessModifier;
+    }
+
+    public AccessModifier getAccessModifier() {
+        return accessModifier;
+    }
+
+    public List<PackageFilter> getPackagesInclude() {
+        return packagesInclude;
+    }
+
+    public List<PackageFilter> getPackagesExclude() {
+        return packagesExclude;
+    }
+}
diff --git a/japicmp/src/main/java/japicmp/config/PackageFilter.java b/japicmp/src/main/java/japicmp/config/PackageFilter.java
index add49b2..63e39d3 100644
--- a/japicmp/src/main/java/japicmp/config/PackageFilter.java
+++ b/japicmp/src/main/java/japicmp/config/PackageFilter.java
@@ -1,18 +1,18 @@
-package japicmp.config;
-
-import java.util.regex.Pattern;
-
-public class PackageFilter {
-    private final Pattern pattern;
-
-    public PackageFilter(String packageName) {
-        String regEx = packageName.replace(".", "\\.");
-        regEx = regEx.replace("*", ".*");
-        regEx = regEx + "(\\.[^\\.]+)*";
-        pattern = Pattern.compile(regEx);
-    }
-
-    public boolean matches(String str) {
-        return pattern.matcher(str).matches();
-    }
-}
+package japicmp.config;
+
+import java.util.regex.Pattern;
+
+public class PackageFilter {
+    private final Pattern pattern;
+
+    public PackageFilter(String packageName) {
+        String regEx = packageName.replace(".", "\\.");
+        regEx = regEx.replace("*", ".*");
+        regEx = regEx + "(\\.[^\\.]+)*";
+        pattern = Pattern.compile(regEx);
+    }
+
+    public boolean matches(String str) {
+        return pattern.matcher(str).matches();
+    }
+}
diff --git a/japicmp/src/main/java/japicmp/exception/JApiCmpException.java b/japicmp/src/main/java/japicmp/exception/JApiCmpException.java
index 4bc8ae8..4041608 100644
--- a/japicmp/src/main/java/japicmp/exception/JApiCmpException.java
+++ b/japicmp/src/main/java/japicmp/exception/JApiCmpException.java
@@ -1,22 +1,22 @@
-package japicmp.exception;
-
-public class JApiCmpException extends RuntimeException {
-    private final Reason reason;
-
-    public JApiCmpException(Reason reason) {
-        this.reason = reason;
-    }
-
-    public enum Reason {
-        IllegalArgument, NormalTermination
-    }
-
-    public JApiCmpException(Reason reason, String msg) {
-        super(msg);
-        this.reason = reason;
-    }
-
-    public Reason getReason() {
-        return reason;
-    }
-}
+package japicmp.exception;
+
+public class JApiCmpException extends RuntimeException {
+    private final Reason reason;
+
+    public JApiCmpException(Reason reason) {
+        this.reason = reason;
+    }
+
+    public enum Reason {
+        IllegalArgument, NormalTermination
+    }
+
+    public JApiCmpException(Reason reason, String msg) {
+        super(msg);
+        this.reason = reason;
+    }
+
+    public Reason getReason() {
+        return reason;
+    }
+}
diff --git a/japicmp/src/main/java/japicmp/model/AccessModifier.java b/japicmp/src/main/java/japicmp/model/AccessModifier.java
index 0e7fc64..d9422f2 100644
--- a/japicmp/src/main/java/japicmp/model/AccessModifier.java
+++ b/japicmp/src/main/java/japicmp/model/AccessModifier.java
@@ -1,15 +1,15 @@
-package japicmp.model;
-
-public enum AccessModifier {
-    PUBLIC(3), PACKAGE(2), PROTECTED(1), PRIVATE(0);
-
-    private int level;
-
-    AccessModifier(int level) {
-        this.level = level;
-    }
-
-    public int getLevel() {
-        return level;
-    }
-}
+package japicmp.model;
+
+public enum AccessModifier {
+    PUBLIC(3), PACKAGE(2), PROTECTED(1), PRIVATE(0);
+
+    private int level;
+
+    AccessModifier(int level) {
+        this.level = level;
+    }
+
+    public int getLevel() {
+        return level;
+    }
+}
diff --git a/japicmp/src/main/java/japicmp/model/JApiChangeStatus.java b/japicmp/src/main/java/japicmp/model/JApiChangeStatus.java
index 8222e7c..7d031db 100644
--- a/japicmp/src/main/java/japicmp/model/JApiChangeStatus.java
+++ b/japicmp/src/main/java/japicmp/model/JApiChangeStatus.java
@@ -1,5 +1,5 @@
-package japicmp.model;
-
-public enum JApiChangeStatus {
-    NEW, REMOVED, UNCHANGED, MODIFIED;
-}
+package japicmp.model;
+
+public enum JApiChangeStatus {
+    NEW, REMOVED, UNCHANGED, MODIFIED;
+}
diff --git a/japicmp/src/main/java/japicmp/model/JApiClass.java b/japicmp/src/main/java/japicmp/model/JApiClass.java
index 46c2eaf..2554a55 100644
--- a/japicmp/src/main/java/japicmp/model/JApiClass.java
+++ b/japicmp/src/main/java/japicmp/model/JApiClass.java
@@ -1,103 +1,103 @@
-package japicmp.model;
-
-import com.google.common.base.Optional;
-import javassist.CtClass;
-
-import javax.xml.bind.annotation.XmlAttribute;
-import javax.xml.bind.annotation.XmlElement;
-import javax.xml.bind.annotation.XmlTransient;
-import java.util.LinkedList;
-import java.util.List;
-
-public class JApiClass {
-    private final String fullyQualifiedName;
-    private final Optional<CtClass> oldClass;
-    private final Optional<CtClass> newClass;
-    private List<JApiMethod> methods = new LinkedList<JApiMethod>();
-    private JApiChangeStatus changeStatus;
-    private final Type type;
-    private Optional<AccessModifier> accessModifierOld;
-    private Optional<AccessModifier> accessModifierNew;
-
-    public enum Type {
-        ANNOTATION, INTERFACE, CLASS, ENUM
-    }
-
-    public JApiClass(String fullyQualifiedName, Optional<CtClass> oldClass, Optional<CtClass> newClass, JApiChangeStatus changeStatus, Type type, Optional<AccessModifier> oldModifierLevel, Optional<AccessModifier> newModifierLevel) {
-        this.changeStatus = changeStatus;
-        this.fullyQualifiedName = fullyQualifiedName;
-        this.newClass = newClass;
-        this.oldClass = oldClass;
-        this.type = type;
-        this.accessModifierOld = oldModifierLevel;
-        this.accessModifierNew = newModifierLevel;
-    }
-
-    public void addMethod(JApiMethod jApiMethod) {
-        methods.add(jApiMethod);
-    }
-
-    @XmlAttribute
-    public JApiChangeStatus getChangeStatus() {
-        return changeStatus;
-    }
-
-    @XmlAttribute
-    public String getFullyQualifiedName() {
-        return fullyQualifiedName;
-    }
-
-    @XmlTransient
-    public Optional<CtClass> getNewClass() {
-        return newClass;
-    }
-
-    @XmlTransient
-    public Optional<CtClass> getOldClass() {
-        return oldClass;
-    }
-
-    public void setChangeStatus(JApiChangeStatus changeStatus) {
-        this.changeStatus = changeStatus;
-    }
-
-    @XmlElement(name = "method")
-    public List<JApiMethod> getMethods() {
-        return methods;
-    }
-
-    public void setMethods(List<JApiMethod> methods) {
-        this.methods = methods;
-    }
-
-    @XmlAttribute
-    public Type getType() {
-        return type;
-    }
-
-    @XmlAttribute(name = "accessModifierNew")
-    public String getAccessModifierNew() {
-        if(this.accessModifierNew.isPresent()) {
-            return this.accessModifierNew.get().toString();
-        }
-        return "n.a.";
-    }
-
-    @XmlAttribute(name = "accessModifierOld")
-    public String getAccessModifierOld() {
-        if(this.accessModifierOld.isPresent()) {
-            return this.accessModifierOld.get().toString();
-        }
-        return "n.a.";
-    }
-
-    @Override
-    public String toString() {
-        return "JApiClass{" +
-                "changeStatus=" + changeStatus +
-                ", fullyQualifiedName='" + fullyQualifiedName + '\'' +
-                ", oldClass=" + oldClass +
-                ", newClass=" + newClass +
-                '}';
-    }
-}
+package japicmp.model;
+
+import com.google.common.base.Optional;
+import javassist.CtClass;
+
+import javax.xml.bind.annotation.XmlAttribute;
+import javax.xml.bind.annotation.XmlElement;
+import javax.xml.bind.annotation.XmlTransient;
+import java.util.LinkedList;
+import java.util.List;
+
+public class JApiClass {
+    private final String fullyQualifiedName;
+    private final Optional<CtClass> oldClass;
+    private final Optional<CtClass> newClass;
+    private List<JApiMethod> methods = new LinkedList<JApiMethod>();
+    private JApiChangeStatus changeStatus;
+    private final Type type;
+    private Optional<AccessModifier> accessModifierOld;
+    private Optional<AccessModifier> accessModifierNew;
+
+    public enum Type {
+        ANNOTATION, INTERFACE, CLASS, ENUM
+    }
+
+    public JApiClass(String fullyQualifiedName, Optional<CtClass> oldClass, Optional<CtClass> newClass, JApiChangeStatus changeStatus, Type type, Optional<AccessModifier> oldModifierLevel, Optional<AccessModifier> newModifierLevel) {
+        this.changeStatus = changeStatus;
+        this.fullyQualifiedName = fullyQualifiedName;
+        this.newClass = newClass;
+        this.oldClass = oldClass;
+        this.type = type;
+        this.accessModifierOld = oldModifierLevel;
+        this.accessModifierNew = newModifierLevel;
+    }
+
+    public void addMethod(JApiMethod jApiMethod) {
+        methods.add(jApiMethod);
+    }
+
+    @XmlAttribute
+    public JApiChangeStatus getChangeStatus() {
+        return changeStatus;
+    }
+
+    @XmlAttribute
+    public String getFullyQualifiedName() {
+        return fullyQualifiedName;
+    }
+
+    @XmlTransient
+    public Optional<CtClass> getNewClass() {
+        return newClass;
+    }
+
+    @XmlTransient
+    public Optional<CtClass> getOldClass() {
+        return oldClass;
+    }
+
+    public void setChangeStatus(JApiChangeStatus changeStatus) {
+        this.changeStatus = changeStatus;
+    }
+
+    @XmlElement(name = "method")
+    public List<JApiMethod> getMethods() {
+        return methods;
+    }
+
+    public void setMethods(List<JApiMethod> methods) {
+        this.methods = methods;
+    }
+
+    @XmlAttribute
+    public Type getType() {
+        return type;
+    }
+
+    @XmlAttribute(name = "accessModifierNew")
+    public String getAccessModifierNew() {
+        if(this.accessModifierNew.isPresent()) {
+            return this.accessModifierNew.get().toString();
+        }
+        return "n.a.";
+    }
+
+    @XmlAttribute(name = "accessModifierOld")
+    public String getAccessModifierOld() {
+        if(this.accessModifierOld.isPresent()) {
+            return this.accessModifierOld.get().toString();
+        }
+        return "n.a.";
+    }
+
+    @Override
+    public String toString() {
+        return "JApiClass{" +
+                "changeStatus=" + changeStatus +
+                ", fullyQualifiedName='" + fullyQualifiedName + '\'' +
+                ", oldClass=" + oldClass +
+                ", newClass=" + newClass +
+                '}';
+    }
+}
diff --git a/japicmp/src/main/java/japicmp/model/JApiMethod.java b/japicmp/src/main/java/japicmp/model/JApiMethod.java
index eff5662..9b87b69 100644
--- a/japicmp/src/main/java/japicmp/model/JApiMethod.java
+++ b/japicmp/src/main/java/japicmp/model/JApiMethod.java
@@ -1,81 +1,81 @@
-package japicmp.model;
-
-import com.google.common.base.Optional;
-import javassist.CtMethod;
-
-import javax.xml.bind.annotation.XmlAttribute;
-import javax.xml.bind.annotation.XmlElement;
-import javax.xml.bind.annotation.XmlTransient;
-import java.util.LinkedList;
-import java.util.List;
-
-public class JApiMethod {
-    private final String name;
-    private final JApiChangeStatus changeStatus;
-    private final Optional<CtMethod> oldMethod;
-    private final Optional<CtMethod> newMethod;
-    private final String returnType;
-    private Optional<AccessModifier> accessModifierOld;
-    private Optional<AccessModifier> accessModifierNew;
-    private final List<JApiParameter> parameters = new LinkedList<JApiParameter>();
-
-    public JApiMethod(String name, JApiChangeStatus changeStatus, Optional<CtMethod> oldClass, Optional<CtMethod> newClass, String returnType, Optional<AccessModifier> oldModifierLevel, Optional<AccessModifier> newModifierLevel) {
-        this.name = name;
-        this.changeStatus = changeStatus;
-        this.oldMethod = oldClass;
-        this.newMethod = newClass;
-        this.returnType = returnType;
-        this.accessModifierOld = oldModifierLevel;
-        this.accessModifierNew = newModifierLevel;
-    }
-
-    @XmlAttribute
-    public JApiChangeStatus getChangeStatus() {
-        return changeStatus;
-    }
-
-    @XmlAttribute
-    public String getName() {
-        return name;
-    }
-
-    @XmlTransient
-    public Optional<CtMethod> getNewMethod() {
-        return newMethod;
-    }
-
-    @XmlTransient
-    public Optional<CtMethod> getOldMethod() {
-        return oldMethod;
-    }
-
-    @XmlAttribute
-    public String getReturnType() {
-        return returnType;
-    }
-
-    @XmlElement(name = "parameter")
-    public List<JApiParameter> getParameters() {
-        return parameters;
-    }
-
-    public void addParameter(JApiParameter jApiParameter) {
-        parameters.add(jApiParameter);
-    }
-
-    @XmlAttribute(name = "accessModifierNew")
-    public String getAccessModifierNew() {
-        if(this.accessModifierNew.isPresent()) {
-            return this.accessModifierNew.get().toString();
-        }
-        return "n.a.";
-    }
-
-    @XmlAttribute(name = "accessModifierOld")
-    public String getAccessModifierOld() {
-        if(this.accessModifierOld.isPresent()) {
-            return this.accessModifierOld.get().toString();
-        }
-        return "n.a.";
-    }
-}
+package japicmp.model;
+
+import com.google.common.base.Optional;
+import javassist.CtMethod;
+
+import javax.xml.bind.annotation.XmlAttribute;
+import javax.xml.bind.annotation.XmlElement;
+import javax.xml.bind.annotation.XmlTransient;
+import java.util.LinkedList;
+import java.util.List;
+
+public class JApiMethod {
+    private final String name;
+    private final JApiChangeStatus changeStatus;
+    private final Optional<CtMethod> oldMethod;
+    private final Optional<CtMethod> newMethod;
+    private final String returnType;
+    private Optional<AccessModifier> accessModifierOld;
+    private Optional<AccessModifier> accessModifierNew;
+    private final List<JApiParameter> parameters = new LinkedList<JApiParameter>();
+
+    public JApiMethod(String name, JApiChangeStatus changeStatus, Optional<CtMethod> oldClass, Optional<CtMethod> newClass, String returnType, Optional<AccessModifier> oldModifierLevel, Optional<AccessModifier> newModifierLevel) {
+        this.name = name;
+        this.changeStatus = changeStatus;
+        this.oldMethod = oldClass;
+        this.newMethod = newClass;
+        this.returnType = returnType;
+        this.accessModifierOld = oldModifierLevel;
+        this.accessModifierNew = newModifierLevel;
+    }
+
+    @XmlAttribute
+    public JApiChangeStatus getChangeStatus() {
+        return changeStatus;
+    }
+
+    @XmlAttribute
+    public String getName() {
+        return name;
+    }
+
+    @XmlTransient
+    public Optional<CtMethod> getNewMethod() {
+        return newMethod;
+    }
+
+    @XmlTransient
+    public Optional<CtMethod> getOldMethod() {
+        return oldMethod;
+    }
+
+    @XmlAttribute
+    public String getReturnType() {
+        return returnType;
+    }
+
+    @XmlElement(name = "parameter")
+    public List<JApiParameter> getParameters() {
+        return parameters;
+    }
+
+    public void addParameter(JApiParameter jApiParameter) {
+        parameters.add(jApiParameter);
+    }
+
+    @XmlAttribute(name = "accessModifierNew")
+    public String getAccessModifierNew() {
+        if(this.accessModifierNew.isPresent()) {
+            return this.accessModifierNew.get().toString();
+        }
+        return "n.a.";
+    }
+
+    @XmlAttribute(name = "accessModifierOld")
+    public String getAccessModifierOld() {
+        if(this.accessModifierOld.isPresent()) {
+            return this.accessModifierOld.get().toString();
+        }
+        return "n.a.";
+    }
+}
diff --git a/japicmp/src/main/java/japicmp/model/JApiParameter.java b/japicmp/src/main/java/japicmp/model/JApiParameter.java
index 56f2a81..81f6914 100644
--- a/japicmp/src/main/java/japicmp/model/JApiParameter.java
+++ b/japicmp/src/main/java/japicmp/model/JApiParameter.java
@@ -1,16 +1,16 @@
-package japicmp.model;
-
-import javax.xml.bind.annotation.XmlAttribute;
-
-public class JApiParameter {
-    private final String type;
-
-    public JApiParameter(String type) {
-        this.type = type;
-    }
-
-    @XmlAttribute
-    public String getType() {
-        return type;
-    }
-}
+package japicmp.model;
+
+import javax.xml.bind.annotation.XmlAttribute;
+
+public class JApiParameter {
+    private final String type;
+
+    public JApiParameter(String type) {
+        this.type = type;
+    }
+
+    @XmlAttribute
+    public String getType() {
+        return type;
+    }
+}
diff --git a/japicmp/src/main/java/japicmp/output/OutputTransformer.java b/japicmp/src/main/java/japicmp/output/OutputTransformer.java
index 5b31b27..06d3c26 100644
--- a/japicmp/src/main/java/japicmp/output/OutputTransformer.java
+++ b/japicmp/src/main/java/japicmp/output/OutputTransformer.java
@@ -1,55 +1,55 @@
-package japicmp.output;
-
-import japicmp.model.JApiChangeStatus;
-import japicmp.model.JApiClass;
-import japicmp.model.JApiMethod;
-
-import java.util.Collections;
-import java.util.Comparator;
-import java.util.LinkedList;
-import java.util.List;
-
-public class OutputTransformer {
-
-    private OutputTransformer() {
-
-    }
-
-    public static void removeUnchanged(List<JApiClass> jApiClasses) {
-        List<JApiClass> classesToRemove = new LinkedList<JApiClass>();
-        for (JApiClass jApiClass : jApiClasses) {
-            if (jApiClass.getChangeStatus() == JApiChangeStatus.UNCHANGED) {
-                classesToRemove.add(jApiClass);
-            } else {
-                List<JApiMethod> methodsToRemove = new LinkedList<JApiMethod>();
-                List<JApiMethod> methods = jApiClass.getMethods();
-                for (JApiMethod jApiMethod : methods) {
-                    if (jApiMethod.getChangeStatus() == JApiChangeStatus.UNCHANGED) {
-                        methodsToRemove.add(jApiMethod);
-                    }
-                }
-                for (JApiMethod jApiMethod : methodsToRemove) {
-                    methods.remove(jApiMethod);
-                }
-            }
-        }
-        for (JApiClass jApiClass : classesToRemove) {
-            jApiClasses.remove(jApiClass);
-        }
-    }
-
-    public static void sortClassesAndMethods(List<JApiClass> jApiClasses) {
-        Collections.sort(jApiClasses, new Comparator<JApiClass>() {
-            public int compare(JApiClass o1, JApiClass o2) {
-                return o1.getFullyQualifiedName().compareToIgnoreCase(o2.getFullyQualifiedName());
-            }
-        });
-        for(JApiClass jApiClass : jApiClasses) {
-            Collections.sort(jApiClass.getMethods(), new Comparator<JApiMethod>() {
-                public int compare(JApiMethod o1, JApiMethod o2) {
-                    return o1.getName().compareToIgnoreCase(o2.getName());
-                }
-            });
-        }
-    }
-}
+package japicmp.output;
+
+import japicmp.model.JApiChangeStatus;
+import japicmp.model.JApiClass;
+import japicmp.model.JApiMethod;
+
+import java.util.Collections;
+import java.util.Comparator;
+import java.util.LinkedList;
+import java.util.List;
+
+public class OutputTransformer {
+
+    private OutputTransformer() {
+
+    }
+
+    public static void removeUnchanged(List<JApiClass> jApiClasses) {
+        List<JApiClass> classesToRemove = new LinkedList<JApiClass>();
+        for (JApiClass jApiClass : jApiClasses) {
+            if (jApiClass.getChangeStatus() == JApiChangeStatus.UNCHANGED) {
+                classesToRemove.add(jApiClass);
+            } else {
+                List<JApiMethod> methodsToRemove = new LinkedList<JApiMethod>();
+                List<JApiMethod> methods = jApiClass.getMethods();
+                for (JApiMethod jApiMethod : methods) {
+                    if (jApiMethod.getChangeStatus() == JApiChangeStatus.UNCHANGED) {
+                        methodsToRemove.add(jApiMethod);
+                    }
+                }
+                for (JApiMethod jApiMethod : methodsToRemove) {
+                    methods.remove(jApiMethod);
+                }
+            }
+        }
+        for (JApiClass jApiClass : classesToRemove) {
+            jApiClasses.remove(jApiClass);
+        }
+    }
+
+    public static void sortClassesAndMethods(List<JApiClass> jApiClasses) {
+        Collections.sort(jApiClasses, new Comparator<JApiClass>() {
+            public int compare(JApiClass o1, JApiClass o2) {
+                return o1.getFullyQualifiedName().compareToIgnoreCase(o2.getFullyQualifiedName());
+            }
+        });
+        for(JApiClass jApiClass : jApiClasses) {
+            Collections.sort(jApiClass.getMethods(), new Comparator<JApiMethod>() {
+                public int compare(JApiMethod o1, JApiMethod o2) {
+                    return o1.getName().compareToIgnoreCase(o2.getName());
+                }
+            });
+        }
+    }
+}
diff --git a/japicmp/src/main/java/japicmp/output/stdout/StdoutOutputGenerator.java b/japicmp/src/main/java/japicmp/output/stdout/StdoutOutputGenerator.java
index b981804..253ee9a 100644
--- a/japicmp/src/main/java/japicmp/output/stdout/StdoutOutputGenerator.java
+++ b/japicmp/src/main/java/japicmp/output/stdout/StdoutOutputGenerator.java
@@ -1,71 +1,71 @@
-package japicmp.output.stdout;
-
-import japicmp.config.Options;
-import japicmp.model.JApiChangeStatus;
-import japicmp.model.JApiClass;
-import japicmp.model.JApiMethod;
-import japicmp.model.JApiParameter;
-import japicmp.output.OutputTransformer;
-
-import java.io.File;
-import java.util.List;
-
-public class StdoutOutputGenerator {
-
-    public String generate(File oldArchive, File newArchive, List<JApiClass> jApiClasses, Options options) {
-        if (options.isOutputOnlyModifications()) {
-            OutputTransformer.removeUnchanged(jApiClasses);
-        }
-        StringBuilder sb = new StringBuilder();
-        sb.append(String.format("Comparing %s with %s:%n", oldArchive.getAbsolutePath(), newArchive.getAbsolutePath()));
-        for (JApiClass jApiClass : jApiClasses) {
-            processClass(sb, jApiClass);
-            processMethods(sb, jApiClass);
-        }
-        return sb.toString();
-    }
-
-    private void processMethods(StringBuilder sb, JApiClass jApiClass) {
-        List<JApiMethod> methods = jApiClass.getMethods();
-        for (JApiMethod jApiMethod : methods) {
-            if (jApiMethod.getChangeStatus() == JApiChangeStatus.UNCHANGED) {
-                appendMethod(sb, "===", jApiMethod);
-            } else if (jApiMethod.getChangeStatus() == JApiChangeStatus.NEW) {
-                appendMethod(sb, "+++", jApiMethod);
-            } else if (jApiMethod.getChangeStatus() == JApiChangeStatus.REMOVED) {
-                appendMethod(sb, "---", jApiMethod);
-            } else if (jApiMethod.getChangeStatus() == JApiChangeStatus.MODIFIED) {
-                appendMethod(sb, "***", jApiMethod);
-            }
-        }
-    }
-
-    private void processClass(StringBuilder sb, JApiClass jApiClass) {
-        if (jApiClass.getChangeStatus() == JApiChangeStatus.UNCHANGED) {
-            appendClass(sb, "===", jApiClass);
-        } else if (jApiClass.getChangeStatus() == JApiChangeStatus.NEW) {
-            appendClass(sb, "+++", jApiClass);
-        } else if (jApiClass.getChangeStatus() == JApiChangeStatus.REMOVED) {
-            appendClass(sb, "---", jApiClass);
-        } else if (jApiClass.getChangeStatus() == JApiChangeStatus.MODIFIED) {
-            appendClass(sb, "***", jApiClass);
-        }
-    }
-
-    private void appendMethod(StringBuilder sb, String signs, JApiMethod jApiMethod) {
-        sb.append("\t" + signs + " " + jApiMethod.getChangeStatus() + " METHOD " + jApiMethod.getName() + "(");
-        int paramCount = 0;
-        for (JApiParameter jApiParameter : jApiMethod.getParameters()) {
-            if (paramCount > 0) {
-                sb.append(", ");
-            }
-            sb.append(jApiParameter.getType());
-            paramCount++;
-        }
-        sb.append(")\n");
-    }
-
-    private void appendClass(StringBuilder sb, String signs, JApiClass jApiClass) {
-        sb.append(signs + " " + jApiClass.getChangeStatus() + " " + jApiClass.getType() + " " + jApiClass.getFullyQualifiedName() + "\n");
-    }
-}
+package japicmp.output.stdout;
+
+import japicmp.config.Options;
+import japicmp.model.JApiChangeStatus;
+import japicmp.model.JApiClass;
+import japicmp.model.JApiMethod;
+import japicmp.model.JApiParameter;
+import japicmp.output.OutputTransformer;
+
+import java.io.File;
+import java.util.List;
+
+public class StdoutOutputGenerator {
+
+    public String generate(File oldArchive, File newArchive, List<JApiClass> jApiClasses, Options options) {
+        if (options.isOutputOnlyModifications()) {
+            OutputTransformer.removeUnchanged(jApiClasses);
+        }
+        StringBuilder sb = new StringBuilder();
+        sb.append(String.format("Comparing %s with %s:%n", oldArchive.getAbsolutePath(), newArchive.getAbsolutePath()));
+        for (JApiClass jApiClass : jApiClasses) {
+            processClass(sb, jApiClass);
+            processMethods(sb, jApiClass);
+        }
+        return sb.toString();
+    }
+
+    private void processMethods(StringBuilder sb, JApiClass jApiClass) {
+        List<JApiMethod> methods = jApiClass.getMethods();
+        for (JApiMethod jApiMethod : methods) {
+            if (jApiMethod.getChangeStatus() == JApiChangeStatus.UNCHANGED) {
+                appendMethod(sb, "===", jApiMethod);
+            } else if (jApiMethod.getChangeStatus() == JApiChangeStatus.NEW) {
+                appendMethod(sb, "+++", jApiMethod);
+            } else if (jApiMethod.getChangeStatus() == JApiChangeStatus.REMOVED) {
+                appendMethod(sb, "---", jApiMethod);
+            } else if (jApiMethod.getChangeStatus() == JApiChangeStatus.MODIFIED) {
+                appendMethod(sb, "***", jApiMethod);
+            }
+        }
+    }
+
+    private void processClass(StringBuilder sb, JApiClass jApiClass) {
+        if (jApiClass.getChangeStatus() == JApiChangeStatus.UNCHANGED) {
+            appendClass(sb, "===", jApiClass);
+        } else if (jApiClass.getChangeStatus() == JApiChangeStatus.NEW) {
+            appendClass(sb, "+++", jApiClass);
+        } else if (jApiClass.getChangeStatus() == JApiChangeStatus.REMOVED) {
+            appendClass(sb, "---", jApiClass);
+        } else if (jApiClass.getChangeStatus() == JApiChangeStatus.MODIFIED) {
+            appendClass(sb, "***", jApiClass);
+        }
+    }
+
+    private void appendMethod(StringBuilder sb, String signs, JApiMethod jApiMethod) {
+        sb.append("\t" + signs + " " + jApiMethod.getChangeStatus() + " METHOD " + jApiMethod.getName() + "(");
+        int paramCount = 0;
+        for (JApiParameter jApiParameter : jApiMethod.getParameters()) {
+            if (paramCount > 0) {
+                sb.append(", ");
+            }
+            sb.append(jApiParameter.getType());
+            paramCount++;
+        }
+        sb.append(")\n");
+    }
+
+    private void appendClass(StringBuilder sb, String signs, JApiClass jApiClass) {
+        sb.append(signs + " " + jApiClass.getChangeStatus() + " " + jApiClass.getType() + " " + jApiClass.getFullyQualifiedName() + "\n");
+    }
+}
diff --git a/japicmp/src/main/java/japicmp/output/xml/XmlOutputGenerator.java b/japicmp/src/main/java/japicmp/output/xml/XmlOutputGenerator.java
index 939c6cb..de5b85d 100644
--- a/japicmp/src/main/java/japicmp/output/xml/XmlOutputGenerator.java
+++ b/japicmp/src/main/java/japicmp/output/xml/XmlOutputGenerator.java
@@ -1,24 +1,24 @@
-package japicmp.output.xml;
-
-import japicmp.config.Options;
-import japicmp.model.JApiClass;
-import japicmp.output.OutputTransformer;
-import japicmp.output.xml.model.JApiCmpXmlRoot;
-
-import javax.xml.bind.JAXB;
-import java.io.File;
-import java.util.List;
-
-public class XmlOutputGenerator {
-
-    public void generate(File oldArchive, File newArchive, List<JApiClass> jApiClasses, Options options) {
-        JApiCmpXmlRoot jApiCmpXmlRoot = new JApiCmpXmlRoot();
-        jApiCmpXmlRoot.setOldJar(oldArchive.getAbsolutePath());
-        jApiCmpXmlRoot.setNewJar(newArchive.getAbsolutePath());
-        jApiCmpXmlRoot.setClasses(jApiClasses);
-        if (options.isOutputOnlyModifications()) {
-            OutputTransformer.removeUnchanged(jApiClasses);
-        }
-        JAXB.marshal(jApiCmpXmlRoot, new File(options.getXmlOutputFile().get()));
-    }
-}
+package japicmp.output.xml;
+
+import japicmp.config.Options;
+import japicmp.model.JApiClass;
+import japicmp.output.OutputTransformer;
+import japicmp.output.xml.model.JApiCmpXmlRoot;
+
+import javax.xml.bind.JAXB;
+import java.io.File;
+import java.util.List;
+
+public class XmlOutputGenerator {
+
+    public void generate(File oldArchive, File newArchive, List<JApiClass> jApiClasses, Options options) {
+        JApiCmpXmlRoot jApiCmpXmlRoot = new JApiCmpXmlRoot();
+        jApiCmpXmlRoot.setOldJar(oldArchive.getAbsolutePath());
+        jApiCmpXmlRoot.setNewJar(newArchive.getAbsolutePath());
+        jApiCmpXmlRoot.setClasses(jApiClasses);
+        if (options.isOutputOnlyModifications()) {
+            OutputTransformer.removeUnchanged(jApiClasses);
+        }
+        JAXB.marshal(jApiCmpXmlRoot, new File(options.getXmlOutputFile().get()));
+    }
+}
diff --git a/japicmp/src/main/java/japicmp/output/xml/model/JApiCmpXmlRoot.java b/japicmp/src/main/java/japicmp/output/xml/model/JApiCmpXmlRoot.java
index 77beafe..17319c9 100644
--- a/japicmp/src/main/java/japicmp/output/xml/model/JApiCmpXmlRoot.java
+++ b/japicmp/src/main/java/japicmp/output/xml/model/JApiCmpXmlRoot.java
@@ -1,43 +1,43 @@
-package japicmp.output.xml.model;
-
-import japicmp.model.JApiClass;
-
-import javax.xml.bind.annotation.XmlAttribute;
-import javax.xml.bind.annotation.XmlElement;
-import javax.xml.bind.annotation.XmlRootElement;
-import java.util.LinkedList;
-import java.util.List;
-
-@XmlRootElement(name = "japicmp")
-public class JApiCmpXmlRoot {
-    private String oldJar = "";
-    private String newJar = "";
-    private List<JApiClass> classes = new LinkedList<JApiClass>();
-
-    @XmlElement(name = "class")
-    public List<JApiClass> getClasses() {
-        return classes;
-    }
-
-    public void setClasses(List<JApiClass> classes) {
-        this.classes = classes;
-    }
-
-    @XmlAttribute
-    public String getNewJar() {
-        return newJar;
-    }
-
-    public void setNewJar(String newJar) {
-        this.newJar = newJar;
-    }
-
-    @XmlAttribute
-    public String getOldJar() {
-        return oldJar;
-    }
-
-    public void setOldJar(String oldJar) {
-        this.oldJar = oldJar;
-    }
-}
+package japicmp.output.xml.model;
+
+import japicmp.model.JApiClass;
+
+import javax.xml.bind.annotation.XmlAttribute;
+import javax.xml.bind.annotation.XmlElement;
+import javax.xml.bind.annotation.XmlRootElement;
+import java.util.LinkedList;
+import java.util.List;
+
+@XmlRootElement(name = "japicmp")
+public class JApiCmpXmlRoot {
+    private String oldJar = "";
+    private String newJar = "";
+    private List<JApiClass> classes = new LinkedList<JApiClass>();
+
+    @XmlElement(name = "class")
+    public List<JApiClass> getClasses() {
+        return classes;
+    }
+
+    public void setClasses(List<JApiClass> classes) {
+        this.classes = classes;
+    }
+
+    @XmlAttribute
+    public String getNewJar() {
+        return newJar;
+    }
+
+    public void setNewJar(String newJar) {
+        this.newJar = newJar;
+    }
+
+    @XmlAttribute
+    public String getOldJar() {
+        return oldJar;
+    }
+
+    public void setOldJar(String oldJar) {
+        this.oldJar = oldJar;
+    }
+}
diff --git a/japicmp/src/main/java/japicmp/util/ModifierHelper.java b/japicmp/src/main/java/japicmp/util/ModifierHelper.java
index d3f8e66..c23a01e 100644
--- a/japicmp/src/main/java/japicmp/util/ModifierHelper.java
+++ b/japicmp/src/main/java/japicmp/util/ModifierHelper.java
@@ -1,29 +1,29 @@
-package japicmp.util;
-
-import japicmp.model.AccessModifier;
-
-import java.lang.reflect.Modifier;
-
-public class ModifierHelper {
-
-    private ModifierHelper() {
-
-    }
-
-    public static boolean matchesModifierLevel(int modifierOfElement, AccessModifier modifierLevel) {
-        AccessModifier modifierLevelOfElement = translateToModifierLevel(modifierOfElement);
-        return (modifierLevelOfElement.getLevel() >= modifierLevel.getLevel());
-    }
-
-    public static AccessModifier translateToModifierLevel(int modifier) {
-        if(Modifier.isPublic(modifier)) {
-            return AccessModifier.PUBLIC;
-        } else if(Modifier.isProtected(modifier)) {
-            return AccessModifier.PROTECTED;
-        } else if(Modifier.isPrivate(modifier)) {
-            return AccessModifier.PRIVATE;
-        } else {
-            return AccessModifier.PACKAGE;
-        }
-    }
-}
+package japicmp.util;
+
+import japicmp.model.AccessModifier;
+
+import java.lang.reflect.Modifier;
+
+public class ModifierHelper {
+
+    private ModifierHelper() {
+
+    }
+
+    public static boolean matchesModifierLevel(int modifierOfElement, AccessModifier modifierLevel) {
+        AccessModifier modifierLevelOfElement = translateToModifierLevel(modifierOfElement);
+        return (modifierLevelOfElement.getLevel() >= modifierLevel.getLevel());
+    }
+
+    public static AccessModifier translateToModifierLevel(int modifier) {
+        if(Modifier.isPublic(modifier)) {
+            return AccessModifier.PUBLIC;
+        } else if(Modifier.isProtected(modifier)) {
+            return AccessModifier.PROTECTED;
+        } else if(Modifier.isPrivate(modifier)) {
+            return AccessModifier.PRIVATE;
+        } else {
+            return AccessModifier.PACKAGE;
+        }
+    }
+}
diff --git a/japicmp/src/main/java/japicmp/util/SignatureParser.java b/japicmp/src/main/java/japicmp/util/SignatureParser.java
index 9d4d96d..8ed253e 100644
--- a/japicmp/src/main/java/japicmp/util/SignatureParser.java
+++ b/japicmp/src/main/java/japicmp/util/SignatureParser.java
@@ -1,103 +1,103 @@
-package japicmp.util;
-
-import java.util.LinkedList;
-import java.util.List;
-
-public class SignatureParser {
-    private List<String> parameters = new LinkedList<String>();
-    private String returnType = "void";
-
-    public void parse(String signature) {
-        int parenthesisCloseIndex = signature.indexOf(')');
-        if(parenthesisCloseIndex > -1) {
-            parseParameters(signature, parenthesisCloseIndex);
-            parseReturnValue(signature, parenthesisCloseIndex);
-        }
-    }
-
-    private void parseReturnValue(String signature, int parenthesisCloseIndex) {
-        String retValPart = signature.substring(parenthesisCloseIndex+1);
-        List<String> retValTypes = parseTypes(retValPart);
-        returnType = retValTypes.get(0);
-    }
-
-    private void parseParameters(String signature, int parenthesisCloseIndex) {
-        String paramPart = signature.substring(1, parenthesisCloseIndex);
-        List<String> paramTypes = parseTypes(paramPart);
-        parameters.clear();
-        parameters.addAll(paramTypes);
-    }
-
-    private List<String> parseTypes(String paramPart) {
-        List<String> types = new LinkedList<String>();
-        boolean arrayNotation = false;
-        for(int i=0; i<paramPart.length(); i++) {
-            char c = paramPart.charAt(i);
-            String type = "void";
-            switch(c) {
-                case 'Z':
-                    type = "boolean";
-                    break;
-                case 'B':
-                    type = "byte";
-                    break;
-                case 'C':
-                    type = "char";
-                    break;
-                case 'S':
-                    type = "short";
-                    break;
-                case 'I':
-                    type = "int";
-                    break;
-                case 'J':
-                    type = "long";
-                    break;
-                case 'F':
-                    type = "float";
-                    break;
-                case 'D':
-                    type = "double";
-                    break;
-                case 'V':
-                    type = "void";
-                    break;
-                case '[':
-                    arrayNotation = true;
-                    continue;
-                case 'L':
-                    StringBuilder fqn = new StringBuilder();
-                    i++;
-                    while(i<paramPart.length()) {
-                        c = paramPart.charAt(i);
-                        if(c == ';') {
-                            break;
-                        } else if(c == '/') {
-                            fqn.append('.');
-                        } else {
-                            fqn.append(c);
-                        }
-                        i++;
-                    }
-                    type = fqn.toString();
-                    break;
-                default:
-                    throw new IllegalStateException("Unknown type signature: '"+c+"'");
-            }
-            if(arrayNotation) {
-                type += "[]";
-                arrayNotation = false;
-            }
-            types.add(type);
-        }
-        return types;
-    }
-
-    public List<String> getParameters() {
-        return parameters;
-    }
-
-    public String getReturnType() {
-        return returnType;
-    }
-}
+package japicmp.util;
+
+import java.util.LinkedList;
+import java.util.List;
+
+public class SignatureParser {
+    private List<String> parameters = new LinkedList<String>();
+    private String returnType = "void";
+
+    public void parse(String signature) {
+        int parenthesisCloseIndex = signature.indexOf(')');
+        if(parenthesisCloseIndex > -1) {
+            parseParameters(signature, parenthesisCloseIndex);
+            parseReturnValue(signature, parenthesisCloseIndex);
+        }
+    }
+
+    private void parseReturnValue(String signature, int parenthesisCloseIndex) {
+        String retValPart = signature.substring(parenthesisCloseIndex+1);
+        List<String> retValTypes = parseTypes(retValPart);
+        returnType = retValTypes.get(0);
+    }
+
+    private void parseParameters(String signature, int parenthesisCloseIndex) {
+        String paramPart = signature.substring(1, parenthesisCloseIndex);
+        List<String> paramTypes = parseTypes(paramPart);
+        parameters.clear();
+        parameters.addAll(paramTypes);
+    }
+
+    private List<String> parseTypes(String paramPart) {
+        List<String> types = new LinkedList<String>();
+        boolean arrayNotation = false;
+        for(int i=0; i<paramPart.length(); i++) {
+            char c = paramPart.charAt(i);
+            String type = "void";
+            switch(c) {
+                case 'Z':
+                    type = "boolean";
+                    break;
+                case 'B':
+                    type = "byte";
+                    break;
+                case 'C':
+                    type = "char";
+                    break;
+                case 'S':
+                    type = "short";
+                    break;
+                case 'I':
+                    type = "int";
+                    break;
+                case 'J':
+                    type = "long";
+                    break;
+                case 'F':
+                    type = "float";
+                    break;
+                case 'D':
+                    type = "double";
+                    break;
+                case 'V':
+                    type = "void";
+                    break;
+                case '[':
+                    arrayNotation = true;
+                    continue;
+                case 'L':
+                    StringBuilder fqn = new StringBuilder();
+                    i++;
+                    while(i<paramPart.length()) {
+                        c = paramPart.charAt(i);
+                        if(c == ';') {
+                            break;
+                        } else if(c == '/') {
+                            fqn.append('.');
+                        } else {
+                            fqn.append(c);
+                        }
+                        i++;
+                    }
+                    type = fqn.toString();
+                    break;
+                default:
+                    throw new IllegalStateException("Unknown type signature: '"+c+"'");
+            }
+            if(arrayNotation) {
+                type += "[]";
+                arrayNotation = false;
+            }
+            types.add(type);
+        }
+        return types;
+    }
+
+    public List<String> getParameters() {
+        return parameters;
+    }
+
+    public String getReturnType() {
+        return returnType;
+    }
+}
diff --git a/japicmp/src/main/java/japicmp/util/StringArrayEnumeration.java b/japicmp/src/main/java/japicmp/util/StringArrayEnumeration.java
index 19d84fd..0c476db 100644
--- a/japicmp/src/main/java/japicmp/util/StringArrayEnumeration.java
+++ b/japicmp/src/main/java/japicmp/util/StringArrayEnumeration.java
@@ -1,27 +1,27 @@
-package japicmp.util;
-
-import java.util.Arrays;
-import java.util.Enumeration;
-import java.util.NoSuchElementException;
-
-public class StringArrayEnumeration implements Enumeration<String> {
-    private final String[] array;
-    private int pos = 0;
-
-    public StringArrayEnumeration(String[] array) {
-        this.array = new String[array.length];
-        System.arraycopy(array, 0, this.array, 0, array.length);
-    }
-
-    public boolean hasMoreElements() {
-        return pos < array.length;
-    }
-
-    public String nextElement() {
-        if(hasMoreElements()) {
-            return array[pos++];
-        } else {
-            throw new NoSuchElementException();
-        }
-    }
-}
+package japicmp.util;
+
+import java.util.Arrays;
+import java.util.Enumeration;
+import java.util.NoSuchElementException;
+
+public class StringArrayEnumeration implements Enumeration<String> {
+    private final String[] array;
+    private int pos = 0;
+
+    public StringArrayEnumeration(String[] array) {
+        this.array = new String[array.length];
+        System.arraycopy(array, 0, this.array, 0, array.length);
+    }
+
+    public boolean hasMoreElements() {
+        return pos < array.length;
+    }
+
+    public String nextElement() {
+        if(hasMoreElements()) {
+            return array[pos++];
+        } else {
+            throw new NoSuchElementException();
+        }
+    }
+}
diff --git a/japicmp/src/main/resources/log4j.properties b/japicmp/src/main/resources/log4j.properties
index 393e087..d95e8fd 100644
--- a/japicmp/src/main/resources/log4j.properties
+++ b/japicmp/src/main/resources/log4j.properties
@@ -1,8 +1,8 @@
-# Root logger option
-log4j.rootLogger=INFO, stdout
-
-# Direct log messages to stdout
-log4j.appender.stdout=org.apache.log4j.ConsoleAppender
-log4j.appender.stdout.Target=System.out
-log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
+# Root logger option
+log4j.rootLogger=INFO, stdout
+
+# Direct log messages to stdout
+log4j.appender.stdout=org.apache.log4j.ConsoleAppender
+log4j.appender.stdout.Target=System.out
+log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
 log4j.appender.stdout.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss} %-5p %c{1}:%L - %m%n
\ No newline at end of file
diff --git a/japicmp/src/test/java/japicmp/cli/CliParserTest.java b/japicmp/src/test/java/japicmp/cli/CliParserTest.java
index 8dafe7f..2b2a12c 100644
--- a/japicmp/src/test/java/japicmp/cli/CliParserTest.java
+++ b/japicmp/src/test/java/japicmp/cli/CliParserTest.java
@@ -1,40 +1,40 @@
-package japicmp.cli;
-
-import japicmp.config.Options;
-import org.junit.Before;
-import org.junit.Test;
-
-import static org.hamcrest.CoreMatchers.is;
-import static org.junit.Assert.assertThat;
-
-public class CliParserTest {
-    private CliParser subject;
-
-    @Before
-    public void before() {
-        subject = new CliParser();
-    }
-
-    @Test
-    public void testAllOptions() {
-        Options options = subject.parse(new String[]{"-n", "npath", "-o", "opath", "-m", "-x", "xpath"});
-        assertThat(options.getXmlOutputFile().get(), is("xpath"));
-        assertThat(options.getNewArchive(), is("npath"));
-        assertThat(options.getOldArchive(), is("opath"));
-        assertThat(options.isOutputOnlyModifications(), is(true));
-    }
-
-    @Test(expected = IllegalArgumentException.class)
-    public void testMissingArgumentForN() {
-        subject.parse(new String[]{"-n", "-o", "opath"});
-    }
-
-    @Test
-    public void testOnlyNAndO() {
-        Options options = subject.parse(new String[]{"-n", "npath", "-o", "opath",});
-        assertThat(options.getXmlOutputFile().isPresent(), is(false));
-        assertThat(options.getNewArchive(), is("npath"));
-        assertThat(options.getOldArchive(), is("opath"));
-        assertThat(options.isOutputOnlyModifications(), is(false));
-    }
-}
+package japicmp.cli;
+
+import japicmp.config.Options;
+import org.junit.Before;
+import org.junit.Test;
+
+import static org.hamcrest.CoreMatchers.is;
+import static org.junit.Assert.assertThat;
+
+public class CliParserTest {
+    private CliParser subject;
+
+    @Before
+    public void before() {
+        subject = new CliParser();
+    }
+
+    @Test
+    public void testAllOptions() {
+        Options options = subject.parse(new String[]{"-n", "npath", "-o", "opath", "-m", "-x", "xpath"});
+        assertThat(options.getXmlOutputFile().get(), is("xpath"));
+        assertThat(options.getNewArchive(), is("npath"));
+        assertThat(options.getOldArchive(), is("opath"));
+        assertThat(options.isOutputOnlyModifications(), is(true));
+    }
+
+    @Test(expected = IllegalArgumentException.class)
+    public void testMissingArgumentForN() {
+        subject.parse(new String[]{"-n", "-o", "opath"});
+    }
+
+    @Test
+    public void testOnlyNAndO() {
+        Options options = subject.parse(new String[]{"-n", "npath", "-o", "opath",});
+        assertThat(options.getXmlOutputFile().isPresent(), is(false));
+        assertThat(options.getNewArchive(), is("npath"));
+        assertThat(options.getOldArchive(), is("opath"));
+        assertThat(options.isOutputOnlyModifications(), is(false));
+    }
+}
diff --git a/japicmp/src/test/java/japicmp/cmp/PackageFilterTest.java b/japicmp/src/test/java/japicmp/cmp/PackageFilterTest.java
index 916bcb2..f40812f 100644
--- a/japicmp/src/test/java/japicmp/cmp/PackageFilterTest.java
+++ b/japicmp/src/test/java/japicmp/cmp/PackageFilterTest.java
@@ -1,45 +1,45 @@
-package japicmp.cmp;
-
-import japicmp.config.PackageFilter;
-import org.junit.Test;
-
-import static org.hamcrest.CoreMatchers.is;
-import static org.junit.Assert.assertThat;
-
-public class PackageFilterTest {
-
-    @Test
-    public void testWithoutWildcard() {
-        PackageFilter pf = new PackageFilter("de.test.package");
-        assertThat(pf.matches("de.test.package"), is(true));
-        assertThat(pf.matches("de.test.package.packageOne"), is(true));
-        assertThat(pf.matches("de.test.package."), is(false));
-        assertThat(pf.matches("de.test.packag"), is(false));
-        assertThat(pf.matches("de.test"), is(false));
-    }
-
-    @Test
-    public void testWithWildcardAfterDot() {
-        PackageFilter pf = new PackageFilter("de.test.package.*");
-        assertThat(pf.matches("de.test.package"), is(false));
-        assertThat(pf.matches("de.test.package.packageOne"), is(true));
-        assertThat(pf.matches("de.test.package.packageOne.p2"), is(true));
-    }
-
-    @Test
-    public void testWithWildcardWithoutDot() {
-        PackageFilter pf = new PackageFilter("de.test.package*");
-        assertThat(pf.matches("de.test.package"), is(true));
-        assertThat(pf.matches("de.test.package.packageOne"), is(true));
-        assertThat(pf.matches("de.test.package.packageOne.p2"), is(true));
-    }
-
-    @Test
-    public void testWithWildcardAndFollowingPackagename() {
-        PackageFilter pf = new PackageFilter("de.test.package.*.test");
-        assertThat(pf.matches("de.test.package"), is(false));
-        assertThat(pf.matches("de.test.package.p.test"), is(true));
-        assertThat(pf.matches("de.test.package.packageOne.test"), is(true));
-        assertThat(pf.matches("de.test.package.packageOne.test2"), is(false));
-    }
-}
+package japicmp.cmp;
+
+import japicmp.config.PackageFilter;
+import org.junit.Test;
+
+import static org.hamcrest.CoreMatchers.is;
+import static org.junit.Assert.assertThat;
+
+public class PackageFilterTest {
+
+    @Test
+    public void testWithoutWildcard() {
+        PackageFilter pf = new PackageFilter("de.test.package");
+        assertThat(pf.matches("de.test.package"), is(true));
+        assertThat(pf.matches("de.test.package.packageOne"), is(true));
+        assertThat(pf.matches("de.test.package."), is(false));
+        assertThat(pf.matches("de.test.packag"), is(false));
+        assertThat(pf.matches("de.test"), is(false));
+    }
+
+    @Test
+    public void testWithWildcardAfterDot() {
+        PackageFilter pf = new PackageFilter("de.test.package.*");
+        assertThat(pf.matches("de.test.package"), is(false));
+        assertThat(pf.matches("de.test.package.packageOne"), is(true));
+        assertThat(pf.matches("de.test.package.packageOne.p2"), is(true));
+    }
+
+    @Test
+    public void testWithWildcardWithoutDot() {
+        PackageFilter pf = new PackageFilter("de.test.package*");
+        assertThat(pf.matches("de.test.package"), is(true));
+        assertThat(pf.matches("de.test.package.packageOne"), is(true));
+        assertThat(pf.matches("de.test.package.packageOne.p2"), is(true));
+    }
+
+    @Test
+    public void testWithWildcardAndFollowingPackagename() {
+        PackageFilter pf = new PackageFilter("de.test.package.*.test");
+        assertThat(pf.matches("de.test.package"), is(false));
+        assertThat(pf.matches("de.test.package.p.test"), is(true));
+        assertThat(pf.matches("de.test.package.packageOne.test"), is(true));
+        assertThat(pf.matches("de.test.package.packageOne.test2"), is(false));
+    }
+}
diff --git a/japicmp/src/test/java/japicmp/util/ModifierHelperTest.java b/japicmp/src/test/java/japicmp/util/ModifierHelperTest.java
index 6f666a2..fdff3cd 100644
--- a/japicmp/src/test/java/japicmp/util/ModifierHelperTest.java
+++ b/japicmp/src/test/java/japicmp/util/ModifierHelperTest.java
@@ -1,41 +1,41 @@
-package japicmp.util;
-
-import japicmp.model.AccessModifier;
-import javassist.Modifier;
-import org.junit.Test;
-
-import static org.hamcrest.CoreMatchers.is;
-import static org.junit.Assert.assertThat;
-
-public class ModifierHelperTest {
-
-    @Test
-    public void publicToPublic() {
-        assertThat(ModifierHelper.matchesModifierLevel(Modifier.setPublic(0), AccessModifier.PUBLIC), is(true));
-    }
-
-    @Test
-    public void publicToProtected() {
-        assertThat(ModifierHelper.matchesModifierLevel(Modifier.setPublic(0), AccessModifier.PROTECTED), is(true));
-    }
-
-    @Test
-    public void publicToPrivate() {
-        assertThat(ModifierHelper.matchesModifierLevel(Modifier.setPublic(0), AccessModifier.PRIVATE), is(true));
-    }
-
-    @Test
-    public void privateToPublic() {
-        assertThat(ModifierHelper.matchesModifierLevel(Modifier.setPrivate(0), AccessModifier.PUBLIC), is(false));
-    }
-
-    @Test
-    public void privateToProtected() {
-        assertThat(ModifierHelper.matchesModifierLevel(Modifier.setPrivate(0), AccessModifier.PROTECTED), is(false));
-    }
-
-    @Test
-    public void privateToPrivate() {
-        assertThat(ModifierHelper.matchesModifierLevel(Modifier.setPrivate(0), AccessModifier.PRIVATE), is(true));
-    }
-}
+package japicmp.util;
+
+import japicmp.model.AccessModifier;
+import javassist.Modifier;
+import org.junit.Test;
+
+import static org.hamcrest.CoreMatchers.is;
+import static org.junit.Assert.assertThat;
+
+public class ModifierHelperTest {
+
+    @Test
+    public void publicToPublic() {
+        assertThat(ModifierHelper.matchesModifierLevel(Modifier.setPublic(0), AccessModifier.PUBLIC), is(true));
+    }
+
+    @Test
+    public void publicToProtected() {
+        assertThat(ModifierHelper.matchesModifierLevel(Modifier.setPublic(0), AccessModifier.PROTECTED), is(true));
+    }
+
+    @Test
+    public void publicToPrivate() {
+        assertThat(ModifierHelper.matchesModifierLevel(Modifier.setPublic(0), AccessModifier.PRIVATE), is(true));
+    }
+
+    @Test
+    public void privateToPublic() {
+        assertThat(ModifierHelper.matchesModifierLevel(Modifier.setPrivate(0), AccessModifier.PUBLIC), is(false));
+    }
+
+    @Test
+    public void privateToProtected() {
+        assertThat(ModifierHelper.matchesModifierLevel(Modifier.setPrivate(0), AccessModifier.PROTECTED), is(false));
+    }
+
+    @Test
+    public void privateToPrivate() {
+        assertThat(ModifierHelper.matchesModifierLevel(Modifier.setPrivate(0), AccessModifier.PRIVATE), is(true));
+    }
+}
diff --git a/japicmp/src/test/java/japicmp/util/SignatureParserTest.java b/japicmp/src/test/java/japicmp/util/SignatureParserTest.java
index 183fd8a..74e923e 100644
--- a/japicmp/src/test/java/japicmp/util/SignatureParserTest.java
+++ b/japicmp/src/test/java/japicmp/util/SignatureParserTest.java
@@ -1,99 +1,99 @@
-package japicmp.util;
-
-import org.junit.Before;
-import org.junit.Ignore;
-import org.junit.Test;
-
-import static org.hamcrest.CoreMatchers.containsString;
-import static org.hamcrest.CoreMatchers.hasItem;
-import static org.hamcrest.CoreMatchers.is;
-import static org.junit.Assert.assertThat;
-
-public class SignatureParserTest {
-    private SignatureParser subject;
-
-    @Before
-    public void before() throws Exception {
-        subject = new SignatureParser();
-    }
-
-    @Test
-    public void testNoParamsReturnsVoid() {
-        subject.parse("()V");
-        assertThat(subject.getReturnType(), is("void"));
-        assertThat(subject.getParameters().size(), is(0));
-    }
-
-    @Test
-    public void testTwoReferenceParamsReturnsReference() {
-        subject.parse("(Lorg/apache/http/conn/routing/HttpRoute;Ljava/lang/Object;)Lorg/apache/http/conn/ManagedClientConnection;");
-        assertThat(subject.getReturnType(), is("org.apache.http.conn.ManagedClientConnection"));
-        assertThat(subject.getParameters().size(), is(2));
-        assertThat(subject.getParameters(), hasItem("org.apache.http.conn.routing.HttpRoute"));
-        assertThat(subject.getParameters(), hasItem("java.lang.Object"));
-    }
-
-    @Test
-    public void testOneReferenceOnePrimParamsReturnsVoid() {
-        subject.parse("(JLjava/util/concurrent/TimeUnit;)V");
-        assertThat(subject.getReturnType(), is("void"));
-        assertThat(subject.getParameters().size(), is(2));
-        assertThat(subject.getParameters(), hasItem("long"));
-        assertThat(subject.getParameters(), hasItem("java.util.concurrent.TimeUnit"));
-    }
-
-    @Test
-    public void testArrayTwoPrimParamsReturnsVoid() {
-        subject.parse("([BII)V");
-        assertThat(subject.getReturnType(), is("void"));
-        assertThat(subject.getParameters().size(), is(3));
-        assertThat(subject.getParameters(), hasItem("byte[]"));
-        assertThat(subject.getParameters(), hasItem("int"));
-    }
-
-    @Test
-    public void testArrayPrimParamReturnsVoid() {
-        subject.parse("([B)V");
-        assertThat(subject.getReturnType(), is("void"));
-        assertThat(subject.getParameters().size(), is(1));
-        assertThat(subject.getParameters(), hasItem("byte[]"));
-    }
-
-    @Test
-    public void testArrayRefParamReturnsVoid() {
-        subject.parse("([Lorg/apache/http/cookie/Cookie;)V");
-        assertThat(subject.getReturnType(), is("void"));
-        assertThat(subject.getParameters().size(), is(1));
-        assertThat(subject.getParameters(), hasItem("org.apache.http.cookie.Cookie[]"));
-    }
-
-    @Test
-    public void testOneReferenceParamsReturnsVoid() {
-        subject.parse("(Lorg/apache/http/impl/conn/tsccm/BasicPoolEntry;)V");
-        assertThat(subject.getReturnType(), is("void"));
-        assertThat(subject.getParameters().size(), is(1));
-        assertThat(subject.getParameters(), hasItem("org.apache.http.impl.conn.tsccm.BasicPoolEntry"));
-    }
-
-    @Test
-    public void testOneReferenceParamsReturnsOneReference() {
-        subject.parse("(Ljava/util/List;)Ljava/util/List;");
-        assertThat(subject.getReturnType(), is("java.util.List"));
-        assertThat(subject.getParameters().size(), is(1));
-        assertThat(subject.getParameters(), hasItem("java.util.List"));
-    }
-
-    @Test
-    public void testNoParamsReturnsReference() {
-        subject.parse("()Lorg/apache/http/conn/scheme/SchemeRegistry;");
-        assertThat(subject.getReturnType(), is("org.apache.http.conn.scheme.SchemeRegistry"));
-        assertThat(subject.getParameters().size(), is(0));
-    }
-
-    @Test
-    public void testNoParamsReturnsI() {
-        subject.parse("()I");
-        assertThat(subject.getReturnType(), is("int"));
-        assertThat(subject.getParameters().size(), is(0));
-    }
-}
+package japicmp.util;
+
+import org.junit.Before;
+import org.junit.Ignore;
+import org.junit.Test;
+
+import static org.hamcrest.CoreMatchers.containsString;
+import static org.hamcrest.CoreMatchers.hasItem;
+import static org.hamcrest.CoreMatchers.is;
+import static org.junit.Assert.assertThat;
+
+public class SignatureParserTest {
+    private SignatureParser subject;
+
+    @Before
+    public void before() throws Exception {
+        subject = new SignatureParser();
+    }
+
+    @Test
+    public void testNoParamsReturnsVoid() {
+        subject.parse("()V");
+        assertThat(subject.getReturnType(), is("void"));
+        assertThat(subject.getParameters().size(), is(0));
+    }
+
+    @Test
+    public void testTwoReferenceParamsReturnsReference() {
+        subject.parse("(Lorg/apache/http/conn/routing/HttpRoute;Ljava/lang/Object;)Lorg/apache/http/conn/ManagedClientConnection;");
+        assertThat(subject.getReturnType(), is("org.apache.http.conn.ManagedClientConnection"));
+        assertThat(subject.getParameters().size(), is(2));
+        assertThat(subject.getParameters(), hasItem("org.apache.http.conn.routing.HttpRoute"));
+        assertThat(subject.getParameters(), hasItem("java.lang.Object"));
+    }
+
+    @Test
+    public void testOneReferenceOnePrimParamsReturnsVoid() {
+        subject.parse("(JLjava/util/concurrent/TimeUnit;)V");
+        assertThat(subject.getReturnType(), is("void"));
+        assertThat(subject.getParameters().size(), is(2));
+        assertThat(subject.getParameters(), hasItem("long"));
+        assertThat(subject.getParameters(), hasItem("java.util.concurrent.TimeUnit"));
+    }
+
+    @Test
+    public void testArrayTwoPrimParamsReturnsVoid() {
+        subject.parse("([BII)V");
+        assertThat(subject.getReturnType(), is("void"));
+        assertThat(subject.getParameters().size(), is(3));
+        assertThat(subject.getParameters(), hasItem("byte[]"));
+        assertThat(subject.getParameters(), hasItem("int"));
+    }
+
+    @Test
+    public void testArrayPrimParamReturnsVoid() {
+        subject.parse("([B)V");
+        assertThat(subject.getReturnType(), is("void"));
+        assertThat(subject.getParameters().size(), is(1));
+        assertThat(subject.getParameters(), hasItem("byte[]"));
+    }
+
+    @Test
+    public void testArrayRefParamReturnsVoid() {
+        subject.parse("([Lorg/apache/http/cookie/Cookie;)V");
+        assertThat(subject.getReturnType(), is("void"));
+        assertThat(subject.getParameters().size(), is(1));
+        assertThat(subject.getParameters(), hasItem("org.apache.http.cookie.Cookie[]"));
+    }
+
+    @Test
+    public void testOneReferenceParamsReturnsVoid() {
+        subject.parse("(Lorg/apache/http/impl/conn/tsccm/BasicPoolEntry;)V");
+        assertThat(subject.getReturnType(), is("void"));
+        assertThat(subject.getParameters().size(), is(1));
+        assertThat(subject.getParameters(), hasItem("org.apache.http.impl.conn.tsccm.BasicPoolEntry"));
+    }
+
+    @Test
+    public void testOneReferenceParamsReturnsOneReference() {
+        subject.parse("(Ljava/util/List;)Ljava/util/List;");
+        assertThat(subject.getReturnType(), is("java.util.List"));
+        assertThat(subject.getParameters().size(), is(1));
+        assertThat(subject.getParameters(), hasItem("java.util.List"));
+    }
+
+    @Test
+    public void testNoParamsReturnsReference() {
+        subject.parse("()Lorg/apache/http/conn/scheme/SchemeRegistry;");
+        assertThat(subject.getReturnType(), is("org.apache.http.conn.scheme.SchemeRegistry"));
+        assertThat(subject.getParameters().size(), is(0));
+    }
+
+    @Test
+    public void testNoParamsReturnsI() {
+        subject.parse("()I");
+        assertThat(subject.getReturnType(), is("int"));
+        assertThat(subject.getParameters().size(), is(0));
+    }
+}
diff --git a/japicmp/src/test/java/japicmp/util/StringArrayEnumerationTest.java b/japicmp/src/test/java/japicmp/util/StringArrayEnumerationTest.java
index 853d71e..df6035c 100644
--- a/japicmp/src/test/java/japicmp/util/StringArrayEnumerationTest.java
+++ b/japicmp/src/test/java/japicmp/util/StringArrayEnumerationTest.java
@@ -1,37 +1,37 @@
-package japicmp.util;
-
-import org.junit.Before;
-import org.junit.Test;
-
-import java.util.NoSuchElementException;
-
-import static org.hamcrest.CoreMatchers.is;
-import static org.junit.Assert.assertThat;
-
-public class StringArrayEnumerationTest {
-
-    @Test(expected = NoSuchElementException.class)
-    public void testEmptyArray() {
-        StringArrayEnumeration sae = new StringArrayEnumeration(new String[]{});
-        assertThat(sae.hasMoreElements(), is(false));
-        sae.nextElement();
-    }
-
-    @Test
-    public void testOneElementArray() {
-        StringArrayEnumeration sae = new StringArrayEnumeration(new String[]{"1"});
-        assertThat(sae.hasMoreElements(), is(true));
-        assertThat(sae.nextElement(), is("1"));
-        assertThat(sae.hasMoreElements(), is(false));
-    }
-
-    @Test
-    public void testTwoElementsArray() {
-        StringArrayEnumeration sae = new StringArrayEnumeration(new String[]{"1","2"});
-        assertThat(sae.hasMoreElements(), is(true));
-        assertThat(sae.nextElement(), is("1"));
-        assertThat(sae.hasMoreElements(), is(true));
-        assertThat(sae.nextElement(), is("2"));
-        assertThat(sae.hasMoreElements(), is(false));
-    }
-}
+package japicmp.util;
+
+import org.junit.Before;
+import org.junit.Test;
+
+import java.util.NoSuchElementException;
+
+import static org.hamcrest.CoreMatchers.is;
+import static org.junit.Assert.assertThat;
+
+public class StringArrayEnumerationTest {
+
+    @Test(expected = NoSuchElementException.class)
+    public void testEmptyArray() {
+        StringArrayEnumeration sae = new StringArrayEnumeration(new String[]{});
+        assertThat(sae.hasMoreElements(), is(false));
+        sae.nextElement();
+    }
+
+    @Test
+    public void testOneElementArray() {
+        StringArrayEnumeration sae = new StringArrayEnumeration(new String[]{"1"});
+        assertThat(sae.hasMoreElements(), is(true));
+        assertThat(sae.nextElement(), is("1"));
+        assertThat(sae.hasMoreElements(), is(false));
+    }
+
+    @Test
+    public void testTwoElementsArray() {
+        StringArrayEnumeration sae = new StringArrayEnumeration(new String[]{"1","2"});
+        assertThat(sae.hasMoreElements(), is(true));
+        assertThat(sae.nextElement(), is("1"));
+        assertThat(sae.hasMoreElements(), is(true));
+        assertThat(sae.nextElement(), is("2"));
+        assertThat(sae.hasMoreElements(), is(false));
+    }
+}
diff --git a/pom.xml b/pom.xml
index d7b722c..9406c2b 100644
--- a/pom.xml
+++ b/pom.xml
@@ -1,161 +1,161 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
-    <modelVersion>4.0.0</modelVersion>
-
-    <groupId>japicmp</groupId>
-    <artifactId>japicmp-base</artifactId>
-    <version>0.0.3-SNAPSHOT</version>
-    <packaging>pom</packaging>
-
-    <properties>
-        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
-        <github.account>siom79</github.account>
-        <cloudbees.account>siom79</cloudbees.account>
-    </properties>
-
-    <modules>
-        <module>japicmp</module>
-        <module>japicmp-testbase</module>
-    </modules>
-
-    <dependencies>
-        <dependency>
-            <groupId>junit</groupId>
-            <artifactId>junit</artifactId>
-            <version>4.11</version>
-            <scope>test</scope>
-        </dependency>
-    </dependencies>
-
-    <build>
-        <plugins>
-            <plugin>
-                <groupId>org.apache.maven.plugins</groupId>
-                <artifactId>maven-compiler-plugin</artifactId>
-                <version>3.1</version>
-                <configuration>
-                    <source>1.5</source>
-                    <target>1.5</target>
-                </configuration>
-            </plugin>
-            <plugin>
-                <groupId>org.apache.maven.plugins</groupId>
-                <artifactId>maven-release-plugin</artifactId>
-                <version>2.4.1</version>
-            </plugin>
-            <plugin>
-                <groupId>org.apache.maven.plugins</groupId>
-                <artifactId>maven-javadoc-plugin</artifactId>
-                <version>2.9.1</version>
-                <executions>
-                    <execution>
-                        <id>attach-javadocs</id>
-                        <goals>
-                            <goal>jar</goal>
-                        </goals>
-                    </execution>
-                </executions>
-            </plugin>
-            <plugin>
-                <groupId>org.apache.maven.plugins</groupId>
-                <artifactId>maven-source-plugin</artifactId>
-                <version>2.2.1</version>
-                <executions>
-                    <execution>
-                        <id>attach-sources</id>
-                        <goals>
-                            <goal>jar-no-fork</goal>
-                        </goals>
-                    </execution>
-                </executions>
-            </plugin>
-            <plugin>
-                <!-- explicitly define maven-deploy-plugin after other to force exec order -->
-                <groupId>org.apache.maven.plugins</groupId>
-                <artifactId>maven-deploy-plugin</artifactId>
-                <version>2.7</version>
-                <executions>
-                    <execution>
-                        <id>deploy</id>
-                        <phase>deploy</phase>
-                        <goals>
-                            <goal>deploy</goal>
-                        </goals>
-                    </execution>
-                </executions>
-            </plugin>
-        </plugins>
-        <extensions>
-            <extension>
-                <groupId>org.apache.maven.wagon</groupId>
-                <artifactId>wagon-webdav-jackrabbit</artifactId>
-                <version>1.0-beta-7</version>
-            </extension>
-        </extensions>
-        <pluginManagement>
-            <plugins>
-                <plugin>
-                    <groupId>org.codehaus.mojo</groupId>
-                    <artifactId>cobertura-maven-plugin</artifactId>
-                    <version>2.5.2</version>
-                    <configuration>
-                        <formats>
-                            <format>html</format>
-                            <format>xml</format>
-                        </formats>
-                    </configuration>
-                    <executions>
-                        <execution>
-                            <phase>verify</phase>
-                            <goals>
-                                <goal>clean</goal>
-                                <goal>cobertura</goal>
-                            </goals>
-                        </execution>
-                    </executions>
-                </plugin>
-            </plugins>
-        </pluginManagement>
-    </build>
-
-    <scm>
-        <connection>scm:git:git://github.com/${github.account}/${project.groupId}.git</connection>
-        <developerConnection>scm:git:git@github.com:${github.account}/${project.groupId}.git</developerConnection>
-        <url>http://github.com/${github.account}/${project.groupId}/tree/master/</url>
-        <tag>HEAD</tag>
-    </scm>
-
-    <distributionManagement>
-        <repository>
-            <id>cloudbees-public-release</id>
-            <url>dav:https://repository-${cloudbees.account}.forge.cloudbees.com/release</url>
-        </repository>
-        <snapshotRepository>
-            <id>cloudbees-public-snapshot</id>
-            <url>dav:https://repository-${cloudbees.account}.forge.cloudbees.com/snapshot</url>
-        </snapshotRepository>
-    </distributionManagement>
-
-    <repositories>
-        <repository>
-            <id>cloudbees-public-snapshot</id>
-            <url>https://repository-${cloudbees.account}.forge.cloudbees.com/public-snapshot</url>
-            <releases>
-                <enabled>false</enabled>
-            </releases>
-            <snapshots>
-                <enabled>true</enabled>
-            </snapshots>
-        </repository>
-        <repository>
-            <id>cloudbees-public-release</id>
-            <url>https://repository-${cloudbees.account}.forge.cloudbees.com/public-release</url>
-            <releases>
-                <enabled>true</enabled>
-            </releases>
-            <snapshots>
-                <enabled>false</enabled>
-            </snapshots>
-        </repository>
-    </repositories>
+<?xml version="1.0" encoding="UTF-8"?>
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+    <modelVersion>4.0.0</modelVersion>
+
+    <groupId>japicmp</groupId>
+    <artifactId>japicmp-base</artifactId>
+    <version>0.0.3-SNAPSHOT</version>
+    <packaging>pom</packaging>
+
+    <properties>
+        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
+        <github.account>siom79</github.account>
+        <cloudbees.account>siom79</cloudbees.account>
+    </properties>
+
+    <modules>
+        <module>japicmp</module>
+        <module>japicmp-testbase</module>
+    </modules>
+
+    <dependencies>
+        <dependency>
+            <groupId>junit</groupId>
+            <artifactId>junit</artifactId>
+            <version>4.11</version>
+            <scope>test</scope>
+        </dependency>
+    </dependencies>
+
+    <build>
+        <plugins>
+            <plugin>
+                <groupId>org.apache.maven.plugins</groupId>
+                <artifactId>maven-compiler-plugin</artifactId>
+                <version>3.1</version>
+                <configuration>
+                    <source>1.5</source>
+                    <target>1.5</target>
+                </configuration>
+            </plugin>
+            <plugin>
+                <groupId>org.apache.maven.plugins</groupId>
+                <artifactId>maven-release-plugin</artifactId>
+                <version>2.4.1</version>
+            </plugin>
+            <plugin>
+                <groupId>org.apache.maven.plugins</groupId>
+                <artifactId>maven-javadoc-plugin</artifactId>
+                <version>2.9.1</version>
+                <executions>
+                    <execution>
+                        <id>attach-javadocs</id>
+                        <goals>
+                            <goal>jar</goal>
+                        </goals>
+                    </execution>
+                </executions>
+            </plugin>
+            <plugin>
+                <groupId>org.apache.maven.plugins</groupId>
+                <artifactId>maven-source-plugin</artifactId>
+                <version>2.2.1</version>
+                <executions>
+                    <execution>
+                        <id>attach-sources</id>
+                        <goals>
+                            <goal>jar-no-fork</goal>
+                        </goals>
+                    </execution>
+                </executions>
+            </plugin>
+            <plugin>
+                <!-- explicitly define maven-deploy-plugin after other to force exec order -->
+                <groupId>org.apache.maven.plugins</groupId>
+                <artifactId>maven-deploy-plugin</artifactId>
+                <version>2.7</version>
+                <executions>
+                    <execution>
+                        <id>deploy</id>
+                        <phase>deploy</phase>
+                        <goals>
+                            <goal>deploy</goal>
+                        </goals>
+                    </execution>
+                </executions>
+            </plugin>
+        </plugins>
+        <extensions>
+            <extension>
+                <groupId>org.apache.maven.wagon</groupId>
+                <artifactId>wagon-webdav-jackrabbit</artifactId>
+                <version>1.0-beta-7</version>
+            </extension>
+        </extensions>
+        <pluginManagement>
+            <plugins>
+                <plugin>
+                    <groupId>org.codehaus.mojo</groupId>
+                    <artifactId>cobertura-maven-plugin</artifactId>
+                    <version>2.5.2</version>
+                    <configuration>
+                        <formats>
+                            <format>html</format>
+                            <format>xml</format>
+                        </formats>
+                    </configuration>
+                    <executions>
+                        <execution>
+                            <phase>verify</phase>
+                            <goals>
+                                <goal>clean</goal>
+                                <goal>cobertura</goal>
+                            </goals>
+                        </execution>
+                    </executions>
+                </plugin>
+            </plugins>
+        </pluginManagement>
+    </build>
+
+    <scm>
+        <connection>scm:git:git://github.com/${github.account}/${project.groupId}.git</connection>
+        <developerConnection>scm:git:git@github.com:${github.account}/${project.groupId}.git</developerConnection>
+        <url>http://github.com/${github.account}/${project.groupId}/tree/master/</url>
+        <tag>HEAD</tag>
+    </scm>
+
+    <distributionManagement>
+        <repository>
+            <id>cloudbees-public-release</id>
+            <url>dav:https://repository-${cloudbees.account}.forge.cloudbees.com/release</url>
+        </repository>
+        <snapshotRepository>
+            <id>cloudbees-public-snapshot</id>
+            <url>dav:https://repository-${cloudbees.account}.forge.cloudbees.com/snapshot</url>
+        </snapshotRepository>
+    </distributionManagement>
+
+    <repositories>
+        <repository>
+            <id>cloudbees-public-snapshot</id>
+            <url>https://repository-${cloudbees.account}.forge.cloudbees.com/public-snapshot</url>
+            <releases>
+                <enabled>false</enabled>
+            </releases>
+            <snapshots>
+                <enabled>true</enabled>
+            </snapshots>
+        </repository>
+        <repository>
+            <id>cloudbees-public-release</id>
+            <url>https://repository-${cloudbees.account}.forge.cloudbees.com/public-release</url>
+            <releases>
+                <enabled>true</enabled>
+            </releases>
+            <snapshots>
+                <enabled>false</enabled>
+            </snapshots>
+        </repository>
+    </repositories>
 </project>
\ No newline at end of file
diff --git a/structure101.java.hsp b/structure101.java.hsp
new file mode 100644
index 0000000..a6615d5
--- /dev/null
+++ b/structure101.java.hsp
@@ -0,0 +1,281 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<local-project language="java" version="4.0.5155" xml-version="3" flavor="j2se">
+  <property name="hide-externals" value="true" />
+  <property name="show-needs-to-compile" value="false" />
+  <property name="detail-mode" value="true" />
+  <property name="include-injected-dependency" value="true" />
+  <property name="project-type" value="maven" />
+  <property name="action-set-mod" value="10" />
+  <property name="hide-deprecated" value="false" />
+  <property name="parse-archive-in-archive" value="false" />
+  <classpath relativeto="D:\Programmierung\japicmp\github\japicmp">
+    <classpathentry kind="lib" path="japicmp-testbase\japicmp-test-v1\target\japicmp-test-v1-0.0.3-SNAPSHOT.jar" />
+    <classpathentry kind="lib" path="japicmp-testbase\japicmp-test\target\japicmp-test-0.0.3-SNAPSHOT.jar" />
+    <classpathentry kind="lib" path="japicmp\target\japicmp-0.0.3-SNAPSHOT.jar" />
+    <classpathentry kind="lib" path="japicmp-testbase\japicmp-test-v2\target\japicmp-test-v2-0.0.3-SNAPSHOT.jar" />
+  </classpath>
+  <pom-root-files>
+    <pom path="D:\Programmierung\japicmp\github\japicmp\pom.xml" />
+  </pom-root-files>
+  <transformations>
+    <transformation in="*" out="{jar}.*" />
+  </transformations>
+  <restructuring>
+    <set version="3" name="Model 1" hiview="Codemap" active="true" todo="false" list="0">
+      <hide>
+        <item-fqn fqn="japicmp-base.japicmp.japicmp.javassist" type="package">
+          <node name="japicmp-base" type="pom" />
+          <node name="japicmp" type="pom" />
+          <node name="japicmp" type="jar" />
+          <node name="javassist" type="package" />
+        </item-fqn>
+      </hide>
+      <hide>
+        <item-fqn fqn="japicmp-base.japicmp.japicmp.org" type="package">
+          <node name="japicmp-base" type="pom" />
+          <node name="japicmp" type="pom" />
+          <node name="japicmp" type="jar" />
+          <node name="org" type="package" />
+        </item-fqn>
+      </hide>
+      <hide>
+        <item-fqn fqn="japicmp-base.japicmp.japicmp.com" type="package">
+          <node name="japicmp-base" type="pom" />
+          <node name="japicmp" type="pom" />
+          <node name="japicmp" type="jar" />
+          <node name="com" type="package" />
+        </item-fqn>
+      </hide>
+    </set>
+  </restructuring>
+  <sourcepaths>
+    <pathentry type="file" path="D:\Programmierung\japicmp\github\japicmp\japicmp-testbase\japicmp-test-v1\src\main\java" />
+    <pathentry type="file" path="D:\Programmierung\japicmp\github\japicmp\japicmp\src\main\java" />
+    <pathentry type="file" path="D:\Programmierung\japicmp\github\japicmp\japicmp-testbase\japicmp-test-v2\src\main\java" />
+  </sourcepaths>
+  <grid-set sep="." version="4.0.5155">
+    <grid name="Diagram 2" enforce="true" locked="true" strict="false">
+      <row>
+        <cell name="japicmp" pattern="japicmp-base.japicmp.*" vexpanded="true" visibility="public" drill="false">
+          <grid>
+            <row>
+              <cell name="japicmp" pattern="japicmp-base.japicmp.japicmp.*" vexpanded="true" visibility="public" drill="false">
+                <grid>
+                  <row>
+                    <cell name="japicmp" pattern="japicmp-base.japicmp.japicmp.japicmp.*" vexpanded="true" visibility="public" drill="false">
+                      <grid>
+                        <row>
+                          <cell name="japicmp" pattern="japicmp-base.japicmp.japicmp.japicmp.?" vexpanded="true" visibility="public" drill="false">
+                            <grid>
+                              <row>
+                                <cell name="JApiCmp" pattern="japicmp-base.japicmp.japicmp.japicmp.JApiCmp" vexpanded="false" visibility="public" drill="false" />
+                              </row>
+                            </grid>
+                          </cell>
+                        </row>
+                        <row>
+                          <cell name="cli" pattern="japicmp-base.japicmp.japicmp.japicmp.cli.?" vexpanded="true" visibility="public" drill="false">
+                            <grid>
+                              <row>
+                                <cell name="CliParser" pattern="japicmp-base.japicmp.japicmp.japicmp.cli.CliParser" vexpanded="false" visibility="public" drill="false" />
+                              </row>
+                            </grid>
+                          </cell>
+                          <cell name="output" pattern="japicmp-base.japicmp.japicmp.japicmp.output.*" vexpanded="true" visibility="public" drill="false">
+                            <grid>
+                              <row>
+                                <cell name="stdout" pattern="japicmp-base.japicmp.japicmp.japicmp.output.stdout.?" vexpanded="true" visibility="public" drill="false">
+                                  <grid>
+                                    <row>
+                                      <cell name="StdoutOutputGenerator" pattern="japicmp-base.japicmp.japicmp.japicmp.output.stdout.StdoutOutputGenerator" vexpanded="false" visibility="public" drill="false" />
+                                    </row>
+                                  </grid>
+                                </cell>
+                                <cell name="xml" pattern="japicmp-base.japicmp.japicmp.japicmp.output.xml.*" vexpanded="true" visibility="public" drill="false">
+                                  <grid>
+                                    <row>
+                                      <cell name="xml" pattern="japicmp-base.japicmp.japicmp.japicmp.output.xml.?" vexpanded="true" visibility="public" drill="false">
+                                        <grid>
+                                          <row>
+                                            <cell name="XmlOutputGenerator" pattern="japicmp-base.japicmp.japicmp.japicmp.output.xml.XmlOutputGenerator" vexpanded="false" visibility="public" drill="false" />
+                                          </row>
+                                        </grid>
+                                      </cell>
+                                    </row>
+                                    <row>
+                                      <cell name="model" pattern="japicmp-base.japicmp.japicmp.japicmp.output.xml.model.?" vexpanded="true" visibility="public" drill="false">
+                                        <grid>
+                                          <row>
+                                            <cell name="JApiCmpXmlRoot" pattern="japicmp-base.japicmp.japicmp.japicmp.output.xml.model.JApiCmpXmlRoot" vexpanded="false" visibility="public" drill="false" />
+                                          </row>
+                                        </grid>
+                                      </cell>
+                                    </row>
+                                  </grid>
+                                </cell>
+                              </row>
+                              <row>
+                                <cell name="output" pattern="japicmp-base.japicmp.japicmp.japicmp.output.?" vexpanded="true" visibility="public" drill="false">
+                                  <grid>
+                                    <row>
+                                      <cell name="OutputTransformer" pattern="japicmp-base.japicmp.japicmp.japicmp.output.OutputTransformer" vexpanded="false" visibility="public" drill="false" />
+                                    </row>
+                                  </grid>
+                                </cell>
+                              </row>
+                            </grid>
+                          </cell>
+                        </row>
+                        <row>
+                          <cell name="config" pattern="japicmp-base.japicmp.japicmp.japicmp.config.?" vexpanded="true" visibility="public" drill="false">
+                            <grid>
+                              <row>
+                                <cell name="Options" pattern="japicmp-base.japicmp.japicmp.japicmp.config.Options" vexpanded="false" visibility="public" drill="false" />
+                              </row>
+                            </grid>
+                          </cell>
+                        </row>
+                        <row>
+                          <cell name="cmp" pattern="japicmp-base.japicmp.japicmp.japicmp.cmp.?" vexpanded="true" visibility="public" drill="false">
+                            <grid>
+                              <row>
+                                <cell name="JarArchiveComparator" pattern="japicmp-base.japicmp.japicmp.japicmp.cmp.JarArchiveComparator" vexpanded="false" visibility="public" drill="false" />
+                              </row>
+                              <row>
+                                <cell name="ClassComparator" pattern="japicmp-base.japicmp.japicmp.japicmp.cmp.ClassComparator" vexpanded="false" visibility="public" drill="false" />
+                              </row>
+                              <row>
+                                <cell name="ClassesComparator" pattern="japicmp-base.japicmp.japicmp.japicmp.cmp.ClassesComparator" vexpanded="false" visibility="public" drill="false" />
+                                <cell name="JarArchiveComparatorOptions" pattern="japicmp-base.japicmp.japicmp.japicmp.cmp.JarArchiveComparatorOptions" vexpanded="false" visibility="public" drill="false" />
+                              </row>
+                              <row>
+                                <cell name="AccessModifier" pattern="japicmp-base.japicmp.japicmp.japicmp.cmp.AccessModifier" vexpanded="false" visibility="public" drill="false" />
+                                <cell name="PackageFilter" pattern="japicmp-base.japicmp.japicmp.japicmp.config.PackageFilter" vexpanded="false" visibility="public" drill="false" />
+                              </row>
+                            </grid>
+                          </cell>
+                        </row>
+                        <row>
+                          <cell name="exception" pattern="japicmp-base.japicmp.japicmp.japicmp.exception.?" vexpanded="true" visibility="public" drill="false">
+                            <grid>
+                              <row>
+                                <cell name="JApiCmpException" pattern="japicmp-base.japicmp.japicmp.japicmp.exception.JApiCmpException" vexpanded="false" visibility="public" drill="false" />
+                              </row>
+                            </grid>
+                          </cell>
+                          <cell name="model" pattern="japicmp-base.japicmp.japicmp.japicmp.model.?" vexpanded="true" visibility="public" drill="false">
+                            <grid>
+                              <row>
+                                <cell name="JApiClass" pattern="japicmp-base.japicmp.japicmp.japicmp.model.JApiClass" vexpanded="false" visibility="public" drill="false" />
+                              </row>
+                              <row>
+                                <cell name="JApiMethod" pattern="japicmp-base.japicmp.japicmp.japicmp.model.JApiMethod" vexpanded="false" visibility="public" drill="false" />
+                              </row>
+                              <row>
+                                <cell name="JApiChangeStatus" pattern="japicmp-base.japicmp.japicmp.japicmp.model.JApiChangeStatus" vexpanded="false" visibility="public" drill="false" />
+                                <cell name="JApiParameter" pattern="japicmp-base.japicmp.japicmp.japicmp.model.JApiParameter" vexpanded="false" visibility="public" drill="false" />
+                              </row>
+                            </grid>
+                          </cell>
+                          <cell name="util" pattern="japicmp-base.japicmp.japicmp.japicmp.util.?" vexpanded="true" visibility="public" drill="false">
+                            <grid>
+                              <row>
+                                <cell name="ModifierHelper" pattern="japicmp-base.japicmp.japicmp.japicmp.util.ModifierHelper" vexpanded="false" visibility="public" drill="false" />
+                                <cell name="SignatureParser" pattern="japicmp-base.japicmp.japicmp.japicmp.util.SignatureParser" vexpanded="false" visibility="public" drill="false" />
+                                <cell name="StringArrayEnumeration" pattern="japicmp-base.japicmp.japicmp.japicmp.util.StringArrayEnumeration" vexpanded="false" visibility="public" drill="false" />
+                              </row>
+                            </grid>
+                          </cell>
+                        </row>
+                      </grid>
+                    </cell>
+                  </row>
+                </grid>
+              </cell>
+            </row>
+          </grid>
+        </cell>
+        <cell name="japicmp-testbase" pattern="japicmp-base.japicmp-testbase.*" vexpanded="true" visibility="public" drill="false">
+          <grid>
+            <row>
+              <cell name="japicmp-test-v1" pattern="japicmp-base.japicmp-testbase.japicmp-test-v1.*" vexpanded="true" visibility="public" drill="false">
+                <grid>
+                  <row>
+                    <cell name="japicmp-test-v1" pattern="japicmp-base.japicmp-testbase.japicmp-test-v1.japicmp-test-v1.*" vexpanded="true" visibility="public" drill="false">
+                      <grid>
+                        <row>
+                          <cell name="japicmp" pattern="japicmp-base.japicmp-testbase.japicmp-test-v1.japicmp-test-v1.japicmp.*" vexpanded="true" visibility="public" drill="false">
+                            <grid>
+                              <row>
+                                <cell name="test" pattern="japicmp-base.japicmp-testbase.japicmp-test-v1.japicmp-test-v1.japicmp.test.*" vexpanded="true" visibility="public" drill="false">
+                                  <grid>
+                                    <row>
+                                      <cell name="test" pattern="japicmp-base.japicmp-testbase.japicmp-test-v1.japicmp-test-v1.japicmp.test.?" vexpanded="true" visibility="public" drill="false">
+                                        <grid>
+                                          <row>
+                                            <cell name="Modifier" pattern="japicmp-base.japicmp-testbase.japicmp-test-v1.japicmp-test-v1.japicmp.test.Modifier" vexpanded="false" visibility="public" drill="false" />
+                                            <cell name="Removed" pattern="japicmp-base.japicmp-testbase.japicmp-test-v1.japicmp-test-v1.japicmp.test.Removed" vexpanded="false" visibility="public" drill="false" />
+                                            <cell name="Unchanged" pattern="japicmp-base.japicmp-testbase.japicmp-test-v1.japicmp-test-v1.japicmp.test.Unchanged" vexpanded="false" visibility="public" drill="false" />
+                                          </row>
+                                        </grid>
+                                      </cell>
+                                      <cell name="packageOne" pattern="japicmp-base.japicmp-testbase.japicmp-test-v1.japicmp-test-v1.japicmp.test.packageOne.?" vexpanded="true" visibility="public" drill="false">
+                                        <grid>
+                                          <row>
+                                            <cell name="PackageOne" pattern="japicmp-base.japicmp-testbase.japicmp-test-v1.japicmp-test-v1.japicmp.test.packageOne.PackageOne" vexpanded="false" visibility="public" drill="false" />
+                                          </row>
+                                        </grid>
+                                      </cell>
+                                      <cell name="packageTwo" pattern="japicmp-base.japicmp-testbase.japicmp-test-v1.japicmp-test-v1.japicmp.test.packageTwo.?" vexpanded="true" visibility="public" drill="false">
+                                        <grid>
+                                          <row>
+                                            <cell name="PackageTwo" pattern="japicmp-base.japicmp-testbase.japicmp-test-v1.japicmp-test-v1.japicmp.test.packageTwo.PackageTwo" vexpanded="false" visibility="public" drill="false" />
+                                          </row>
+                                        </grid>
+                                      </cell>
+                                    </row>
+                                  </grid>
+                                </cell>
+                              </row>
+                            </grid>
+                          </cell>
+                        </row>
+                      </grid>
+                    </cell>
+                  </row>
+                </grid>
+              </cell>
+              <cell name="japicmp-test-v2" pattern="japicmp-base.japicmp-testbase.japicmp-test-v2.*" vexpanded="true" visibility="public" drill="false">
+                <grid>
+                  <row>
+                    <cell name="japicmp-test-v2" pattern="japicmp-base.japicmp-testbase.japicmp-test-v2.japicmp-test-v2.*" vexpanded="true" visibility="public" drill="false">
+                      <grid>
+                        <row>
+                          <cell name="japicmp" pattern="japicmp-base.japicmp-testbase.japicmp-test-v2.japicmp-test-v2.japicmp.*" vexpanded="true" visibility="public" drill="false">
+                            <grid>
+                              <row>
+                                <cell name="test" pattern="japicmp-base.japicmp-testbase.japicmp-test-v2.japicmp-test-v2.japicmp.test.?" vexpanded="true" visibility="public" drill="false">
+                                  <grid>
+                                    <row>
+                                      <cell name="Added" pattern="japicmp-base.japicmp-testbase.japicmp-test-v2.japicmp-test-v2.japicmp.test.Added" vexpanded="false" visibility="public" drill="false" />
+                                    </row>
+                                  </grid>
+                                </cell>
+                              </row>
+                            </grid>
+                          </cell>
+                        </row>
+                      </grid>
+                    </cell>
+                  </row>
+                </grid>
+              </cell>
+            </row>
+          </grid>
+        </cell>
+      </row>
+      <description>Top-level breakout (depth=2147483647)</description>
+    </grid>
+  </grid-set>
+</local-project>
+