You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@any23.apache.org by le...@apache.org on 2019/10/01 03:22:39 UTC

[any23-server] 01/01: ANY23-448 Move service and plugins out of core

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

lewismc pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/any23-server.git

commit 26892ff76c8bc6c888d1dc8c5da326bf25d21051
Author: Lewis John McGibbney <le...@gmail.com>
AuthorDate: Mon Sep 30 20:22:24 2019 -0700

    ANY23-448 Move service and plugins out of core
---
 .gitignore                                         |   1 +
 CONTRIBUTING.md                                    | 129 ++++
 LICENSE.md                                         | 271 +++++++
 NOTICE.txt                                         |  27 +
 README.md                                          |  48 ++
 RELEASE-NOTES.txt                                  | 677 ++++++++++++++++++
 pom.xml                                            | 795 +++++++++++++++++++++
 src/main/assembly/LICENSE-server-embedded.txt      | 426 +++++++++++
 src/main/assembly/LICENSE-with-deps.txt            | 426 +++++++++++
 src/main/assembly/LICENSE-without-deps.txt         | 233 ++++++
 src/main/assembly/NOTICE-server-embedded.txt       |  29 +
 src/main/assembly/NOTICE-with-deps.txt             |  21 +
 src/main/assembly/NOTICE-without-deps.txt          |  12 +
 src/main/assembly/README.txt                       | 113 +++
 src/main/assembly/prepare-war-legals.xml           |  48 ++
 src/main/assembly/server-embedded.xml              |  86 +++
 src/main/assembly/with-deps.xml                    |  60 ++
 src/main/assembly/without-deps.xml                 |  53 ++
 src/main/bin/any23server                           |  90 +++
 src/main/bin/any23server.bat                       | 105 +++
 .../org/apache/any23/servlet/RedirectServlet.java  |  95 +++
 .../java/org/apache/any23/servlet/Servlet.java     | 332 +++++++++
 .../org/apache/any23/servlet/WebResponder.java     | 376 ++++++++++
 .../any23/servlet/conneg/Any23Negotiator.java      |  53 ++
 .../servlet/conneg/ContentTypeNegotiator.java      | 230 ++++++
 .../any23/servlet/conneg/MediaRangeSpec.java       | 267 +++++++
 .../apache/any23/servlet/conneg/package-info.java  |  21 +
 .../org/apache/any23/servlet/package-info.java     |  22 +
 src/main/resources/form.html                       | 460 ++++++++++++
 src/main/webapp/WEB-INF/web.xml                    |  43 ++
 src/main/webapp/resources/css/bootstrap.min.css    |   9 +
 .../webapp/resources/images/logo-any23-214x97.png  | Bin 0 -> 20194 bytes
 .../webapp/resources/images/logo-apache-90x30.png  | Bin 0 -> 6323 bytes
 src/main/webapp/resources/js/bootstrap-modal.js    | 222 ++++++
 src/main/webapp/resources/js/jquery-1.7.2.min.js   |   4 +
 .../java/org/apache/any23/servlet/ServletTest.java | 525 ++++++++++++++
 src/test/resources/log4j.properties                |  34 +
 .../apache/any23/servlet/missing-og-namespace.html |  30 +
 38 files changed, 6373 insertions(+)

diff --git a/.gitignore b/.gitignore
new file mode 100644
index 0000000..eb5a316
--- /dev/null
+++ b/.gitignore
@@ -0,0 +1 @@
+target
diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md
new file mode 100644
index 0000000..dc7a517
--- /dev/null
+++ b/CONTRIBUTING.md
@@ -0,0 +1,129 @@
+Contributing to Apache Any23 
+============================
+
+Summary
+-------
+This document covers how to contribute to the Any23 project. Any23 uses github PRs to manage code contributions and project manages source code development through the [Any23 JIRA instance](https://issues.apache.org/jira/browse/ANY23). 
+These instructions assume you have a GitHub.com account, so if you don't have one you will have to create one. Your proposed code changes will be published to your own fork of the Any23 project and you will submit a Pull Request for your changes to be added.
+
+_Lets get started!!!_
+
+Bug fixes
+---------
+
+It's very important that we can easily track bug fix commits, so their hashes should remain the same in all branches. 
+Therefore, a pull request (PR) that fixes a bug, should be sent against a release branch. 
+This can be either the "current release" or the "previous release", depending on which ones are maintained. 
+Since the goal is a stable master, bug fixes should be "merged forward" to the next branch in order: "previous release" -> "current release" -> master (in other words: old to new)
+
+Developing new features
+-----------------------
+
+Development should be done in a feature branch, branched off of master. 
+Send a PR(steps below) to get it into master (2x LGTM applies). 
+PR will only be merged when master is open, will be held otherwise until master is open again. 
+No back porting / cherry-picking features to existing branches!
+
+Fork the code 
+-------------
+
+In your browser, navigate to: [https://github.com/apache/any23](https://github.com/apache/any23)
+
+Fork whichever repository you wish to contribute to by clicking on the 'Fork' button on the top right hand side. The fork will happen and you will be taken to your own fork of the repository.  Copy the Git repository URL by clicking on the clipboard next to the URL on the right hand side of the page under '**HTTPS** clone URL'.  You will paste this URL when doing the following `git clone` command.
+
+On your computer, follow these steps to setup a local repository for working on ACS:
+
+``` bash
+$ git clone https://github.com/YOUR_ACCOUNT/any23.git
+$ cd any23
+$ git remote add upstream https://github.com/apache/any23.git
+$ git checkout master
+$ git fetch upstream
+$ git rebase upstream/master
+```
+
+Making changes
+--------------
+
+It is important that you create a new branch to make changes on and that you do not change the `master` branch (other than to rebase in changes from `upstream/master`).  In this example we will assume you will be making your changes to a branch called `ANY23-XXX`.  This `ANY23-XXX` is named after the issue you have created within the [Any23 JIRA instance](https://issues.apache.org/jira/browse/ANY23). Therefore `ANY23-XXX` will be created on your local repository and will be pushed to you [...]
+
+It is best practice to create a new branch each time you want to contribute to the project and only track the changes for that pull request in this branch.
+
+``` bash
+$ git checkout -b ANY23-XXX
+   (make your changes)
+$ git status
+$ git add .
+$ git commit -a -m "ANY23-XXX Descriptive title of ANY23-XXX"
+```
+
+> The `-b` specifies that you want to create a new branch called `ANY23-XXX`.  You only specify `-b` the first time you checkout because you are creating a new branch.  Once the `ANY23-XXX` branch exists, you can later switch to it with only `git checkout ANY23-XXX`.
+> Note that the commit message comprises the JIRA issue number and title... this makes explicit reference between Github and JIRA for improved project management.
+
+
+Rebase `ANY23-XXX` to include updates from `upstream/master`
+------------------------------------------------------------
+
+It is important that you maintain an up-to-date `master` branch in your local repository.  This is done by rebasing in the code changes from `upstream/master` (the official Any23 project repository) into your local repository.  You will want to do this before you start working on a feature as well as right before you submit your changes as a pull request.  We recommend you do this process periodically while you work to make sure you are working off the most recent project code.
+
+This process will do the following:
+
+1. Checkout your local `master` branch
+2. Synchronize your local `master` branch with the `upstream/master` so you have all the latest changes from the project
+3. Rebase the latest project code into your `ANY23-XXX` branch so it is up-to-date with the upstream code
+
+``` bash
+$ git checkout master
+$ git fetch upstream
+$ git rebase upstream/master
+$ git checkout ANY23-XXX
+$ git rebase master
+```
+
+> Now your `ANY23-XXX` branch is up-to-date with all the code in `upstream/master`.
+
+
+Make a GitHub Pull Request to contribute your changes
+-----------------------------------------------------
+
+When you are happy with your changes and you are ready to contribute them, you will create a Pull Request on GitHub to do so. This is done by pushing your local changes to your forked repository (default remote name is `origin`) and then initiating a pull request on GitHub.
+
+Please include JIRA id, detailed information about the bug/feature, what all tests are executed, how the reviewer can test this feature etc. Incase of UI PRs, a screenshot is preferred.
+
+> **IMPORTANT:** Make sure you have rebased your `ANY23-XXX` branch to include the latest code from `upstream/master` _before_ you do this.
+
+``` bash
+$ git push origin master
+$ git push origin ANY23-XXX
+```
+
+Now that the `ANY23-XXX` branch has been pushed to your GitHub repository, you can initiate the pull request.  
+
+To initiate the pull request, do the following:
+
+1. In your browser, navigate to your forked repository: [https://github.com/YOUR_ACCOUNT/any23](https://github.com/YOUR_ACCOUNT/any23).
+2. Click the new button called '**Compare & pull request**' that showed up just above the main area in your forked repository
+3. Validate the pull request will be into the upstream `master` and will be from your `ANY23-XXX` branch
+4. Enter a detailed description of the work you have done and then click '**Send pull request**'
+
+If you are requested to make modifications to your proposed changes, make the changes locally on your `ANY23-XXX` branch, re-push the `ANY23-XXX` branch to your fork.  The existing pull request should automatically pick up the change and update accordingly.
+
+
+Cleaning up after a successful pull request
+-------------------------------------------
+
+Once the `ANY23-XXX` branch has been committed into the `upstream/master` branch, your local `ANY23-XXX` branch and the `origin/ANY23-XXX` branch are no longer needed.  If you want to make additional changes, restart the process with a new branch.
+
+> **IMPORTANT:** Make sure that your changes are in `upstream/master` before you delete your `ANY23-XXX` and `origin/ANY23-XXX` branches!
+
+You can delete these deprecated branches with the following:
+
+``` bash
+$ git checkout master
+$ git branch -D ANY23-XXX
+$ git push origin :ANY23-XXX
+```
+
+Release Principles
+------------------
+See the [HowTo Release Apache Any23](http://any23.apache.org/release-howto.html) guide.
\ No newline at end of file
diff --git a/LICENSE.md b/LICENSE.md
new file mode 100644
index 0000000..ac9bdec
--- /dev/null
+++ b/LICENSE.md
@@ -0,0 +1,271 @@
+
+                                 Apache License
+                           Version 2.0, January 2004
+                        http://www.apache.org/licenses/
+
+   TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
+
+   1. Definitions.
+
+      "License" shall mean the terms and conditions for use, reproduction,
+      and distribution as defined by Sections 1 through 9 of this document.
+
+      "Licensor" shall mean the copyright owner or entity authorized by
+      the copyright owner that is granting the License.
+
+      "Legal Entity" shall mean the union of the acting entity and all
+      other entities that control, are controlled by, or are under common
+      control with that entity. For the purposes of this definition,
+      "control" means (i) the power, direct or indirect, to cause the
+      direction or management of such entity, whether by contract or
+      otherwise, or (ii) ownership of fifty percent (50%) or more of the
+      outstanding shares, or (iii) beneficial ownership of such entity.
+
+      "You" (or "Your") shall mean an individual or Legal Entity
+      exercising permissions granted by this License.
+
+      "Source" form shall mean the preferred form for making modifications,
+      including but not limited to software source code, documentation
+      source, and configuration files.
+
+      "Object" form shall mean any form resulting from mechanical
+      transformation or translation of a Source form, including but
+      not limited to compiled object code, generated documentation,
+      and conversions to other media types.
+
+      "Work" shall mean the work of authorship, whether in Source or
+      Object form, made available under the License, as indicated by a
+      copyright notice that is included in or attached to the work
+      (an example is provided in the Appendix below).
+
+      "Derivative Works" shall mean any work, whether in Source or Object
+      form, that is based on (or derived from) the Work and for which the
+      editorial revisions, annotations, elaborations, or other modifications
+      represent, as a whole, an original work of authorship. For the purposes
+      of this License, Derivative Works shall not include works that remain
+      separable from, or merely link (or bind by name) to the interfaces of,
+      the Work and Derivative Works thereof.
+
+      "Contribution" shall mean any work of authorship, including
+      the original version of the Work and any modifications or additions
+      to that Work or Derivative Works thereof, that is intentionally
+      submitted to Licensor for inclusion in the Work by the copyright owner
+      or by an individual or Legal Entity authorized to submit on behalf of
+      the copyright owner. For the purposes of this definition, "submitted"
+      means any form of electronic, verbal, or written communication sent
+      to the Licensor or its representatives, including but not limited to
+      communication on electronic mailing lists, source code control systems,
+      and issue tracking systems that are managed by, or on behalf of, the
+      Licensor for the purpose of discussing and improving the Work, but
+      excluding communication that is conspicuously marked or otherwise
+      designated in writing by the copyright owner as "Not a Contribution."
+
+      "Contributor" shall mean Licensor and any individual or Legal Entity
+      on behalf of whom a Contribution has been received by Licensor and
+      subsequently incorporated within the Work.
+
+   2. Grant of Copyright License. Subject to the terms and conditions of
+      this License, each Contributor hereby grants to You a perpetual,
+      worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+      copyright license to reproduce, prepare Derivative Works of,
+      publicly display, publicly perform, sublicense, and distribute the
+      Work and such Derivative Works in Source or Object form.
+
+   3. Grant of Patent License. Subject to the terms and conditions of
+      this License, each Contributor hereby grants to You a perpetual,
+      worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+      (except as stated in this section) patent license to make, have made,
+      use, offer to sell, sell, import, and otherwise transfer the Work,
+      where such license applies only to those patent claims licensable
+      by such Contributor that are necessarily infringed by their
+      Contribution(s) alone or by combination of their Contribution(s)
+      with the Work to which such Contribution(s) was submitted. If You
+      institute patent litigation against any entity (including a
+      cross-claim or counterclaim in a lawsuit) alleging that the Work
+      or a Contribution incorporated within the Work constitutes direct
+      or contributory patent infringement, then any patent licenses
+      granted to You under this License for that Work shall terminate
+      as of the date such litigation is filed.
+
+   4. Redistribution. You may reproduce and distribute copies of the
+      Work or Derivative Works thereof in any medium, with or without
+      modifications, and in Source or Object form, provided that You
+      meet the following conditions:
+
+      (a) You must give any other recipients of the Work or
+          Derivative Works a copy of this License; and
+
+      (b) You must cause any modified files to carry prominent notices
+          stating that You changed the files; and
+
+      (c) You must retain, in the Source form of any Derivative Works
+          that You distribute, all copyright, patent, trademark, and
+          attribution notices from the Source form of the Work,
+          excluding those notices that do not pertain to any part of
+          the Derivative Works; and
+
+      (d) If the Work includes a "NOTICE" text file as part of its
+          distribution, then any Derivative Works that You distribute must
+          include a readable copy of the attribution notices contained
+          within such NOTICE file, excluding those notices that do not
+          pertain to any part of the Derivative Works, in at least one
+          of the following places: within a NOTICE text file distributed
+          as part of the Derivative Works; within the Source form or
+          documentation, if provided along with the Derivative Works; or,
+          within a display generated by the Derivative Works, if and
+          wherever such third-party notices normally appear. The contents
+          of the NOTICE file are for informational purposes only and
+          do not modify the License. You may add Your own attribution
+          notices within Derivative Works that You distribute, alongside
+          or as an addendum to the NOTICE text from the Work, provided
+          that such additional attribution notices cannot be construed
+          as modifying the License.
+
+      You may add Your own copyright statement to Your modifications and
+      may provide additional or different license terms and conditions
+      for use, reproduction, or distribution of Your modifications, or
+      for any such Derivative Works as a whole, provided Your use,
+      reproduction, and distribution of the Work otherwise complies with
+      the conditions stated in this License.
+
+   5. Submission of Contributions. Unless You explicitly state otherwise,
+      any Contribution intentionally submitted for inclusion in the Work
+      by You to the Licensor shall be under the terms and conditions of
+      this License, without any additional terms or conditions.
+      Notwithstanding the above, nothing herein shall supersede or modify
+      the terms of any separate license agreement you may have executed
+      with Licensor regarding such Contributions.
+
+   6. Trademarks. This License does not grant permission to use the trade
+      names, trademarks, service marks, or product names of the Licensor,
+      except as required for reasonable and customary use in describing the
+      origin of the Work and reproducing the content of the NOTICE file.
+
+   7. Disclaimer of Warranty. Unless required by applicable law or
+      agreed to in writing, Licensor provides the Work (and each
+      Contributor provides its Contributions) on an "AS IS" BASIS,
+      WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
+      implied, including, without limitation, any warranties or conditions
+      of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
+      PARTICULAR PURPOSE. You are solely responsible for determining the
+      appropriateness of using or redistributing the Work and assume any
+      risks associated with Your exercise of permissions under this License.
+
+   8. Limitation of Liability. In no event and under no legal theory,
+      whether in tort (including negligence), contract, or otherwise,
+      unless required by applicable law (such as deliberate and grossly
+      negligent acts) or agreed to in writing, shall any Contributor be
+      liable to You for damages, including any direct, indirect, special,
+      incidental, or consequential damages of any character arising as a
+      result of this License or out of the use or inability to use the
+      Work (including but not limited to damages for loss of goodwill,
+      work stoppage, computer failure or malfunction, or any and all
+      other commercial damages or losses), even if such Contributor
+      has been advised of the possibility of such damages.
+
+   9. Accepting Warranty or Additional Liability. While redistributing
+      the Work or Derivative Works thereof, You may choose to offer,
+      and charge a fee for, acceptance of support, warranty, indemnity,
+      or other liability obligations and/or rights consistent with this
+      License. However, in accepting such obligations, You may act only
+      on Your own behalf and on Your sole responsibility, not on behalf
+      of any other Contributor, and only if You agree to indemnify,
+      defend, and hold each Contributor harmless for any liability
+      incurred by, or claims asserted against, such Contributor by reason
+      of your accepting any such warranty or additional liability.
+
+   END OF TERMS AND CONDITIONS
+
+   APPENDIX: How to apply the Apache License to your work.
+
+      To apply the Apache License to your work, attach the following
+      boilerplate notice, with the fields enclosed by brackets "[]"
+      replaced with your own identifying information. (Don't include
+      the brackets!)  The text should be enclosed in the appropriate
+      comment syntax for the file format. We also recommend that a
+      file or class name and description of purpose be included on the
+      same "printed page" as the copyright notice for easier
+      identification within third-party archives.
+
+   Copyright [yyyy] [name of copyright owner]
+
+   Licensed under the Apache License, Version 2.0 (the "License");
+   you may not use this file except in compliance with the License.
+   You may obtain a copy of the License at
+
+       http://www.apache.org/licenses/LICENSE-2.0
+
+   Unless required by applicable law or agreed to in writing, software
+   distributed under the License is distributed on an "AS IS" BASIS,
+   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+   See the License for the specific language governing permissions and
+   limitations under the License.
+   
+----------------------------------------------------------------------------------
+
+The following files contain code from the jQuery Foundation (http://jquery.com)
+
+./service/src/main/resources/form.html
+./service/src/main/webapp/resources/js/bootstrap-modal.js
+./service/src/main/webapp/resources/js/jquery-1.7.2.min.js
+./plugins/html-scraper/target/test-classes/org/apache/any23/plugin/htmlscraper/html-scraper-extractor-test.html
+./test-resources/src/test/resources/application/xhtml/blank-file-header.xhtml
+./test-resources/src/test/resources/microformats/hcard/infinite-loop.html
+./test-resources/src/test/resources/microformats/hcard/linkedin-michelemostarda.html
+./test-resources/src/test/resources/html/rdfa/drupal-test-frontpage.html
+./test-resources/src/test/resources/html/rdfa/drupal-test-frontpage.html
+
+    Copyright 2013 jQuery Foundation and other contributors
+    http://jquery.com/
+
+    Permission is hereby granted, free of charge, to any person obtaining
+    a copy of this software and associated documentation files (the
+    "Software"), to deal in the Software without restriction, including
+    without limitation the rights to use, copy, modify, merge, publish,
+    distribute, sublicense, and/or sell copies of the Software, and to
+    permit persons to whom the Software is furnished to do so, subject to
+    the following conditions:
+
+    The above copyright notice and this permission notice shall be
+    included in all copies or substantial portions of the Software.
+
+    THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+    EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+    MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+    NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+    LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+    OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+    WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+    
+----------------------------------------------------------------------------------------
+
+This software contains inclusions of source from Eclipse RDF4J which is licensed
+under the Eclipse Distribution License (a BSD-style license) 
+
+   Copyright (c) 2007, Eclipse Foundation, Inc. and its licensors.
+   Copyright Aduna (http://www.aduna-software.com/) 2001-2013
+
+   All rights reserved.
+
+   Redistribution and use in source and binary forms, with or without
+   modification, are permitted provided that the following conditions are met:
+
+   * Redistributions of source code must retain the above copyright notice, this
+     list of conditions and the following disclaimer.
+   * Redistributions in binary form must reproduce the above copyright notice,
+     this list of conditions and the following disclaimer in the documentation
+     and/or other materials provided with the distribution.
+   * Neither the name of the Eclipse Foundation, Inc. nor the names of its
+     contributors may be used to endorse or promote products derived from this
+     software without specific prior written permission.
+
+   THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
+   ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+   WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+   DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR
+   ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+   (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+   LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+   ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+   (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+   SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
diff --git a/NOTICE.txt b/NOTICE.txt
new file mode 100644
index 0000000..ebabe12
--- /dev/null
+++ b/NOTICE.txt
@@ -0,0 +1,27 @@
+Apache Any23
+Copyright 2011-2019 The Apache Software Foundation
+Copyright 2008-2011 Digital Enterprise Research Institute (DERI)
+
+This product includes software developed by
+The Apache Software Foundation (http://www.apache.org/).
+
+This product includes software developed by the jQuery 
+Foundation (http://jquery.org/) under an MIT license.
+
+This product includes software developed by Eclipse RDF4J
+(http://rdf4j.org/) under the Eclipse Distribution License v1.0.
+
+This product includes software developed by Andrey Somov
+(https://bitbucket.org/asomov/snakeyaml) under the Apache License
+v2.0
+
+This product includes software developed by The University of 
+Washington (UW), Professor Oren Etzioni, Professor Mausam,
+Michael Schmitz, (Developers) Open IE 4 Software
+(C) 2011-2012, University of Washington.  All rights reserved.
+US patent number 7,877,343 and 12/970,155 patent pending
+(https://github.com/allenai/openie-standalone) under the Open IE 4 
+Software License Agreement
+
+This product includes software developed by Hans Brende
+(https://github.com/HansBrende/f8) under an MIT license.
diff --git a/README.md b/README.md
new file mode 100644
index 0000000..61ccabe
--- /dev/null
+++ b/README.md
@@ -0,0 +1,48 @@
+# Any23 Web Server
+
+This is the root dir of the Any23 Web-Server module.
+
+Apache Any23 provides a Web-Service that can be used to extract RDF from Web documents.
+
+## Generate Web-Server Packaging
+
+Execute 'mvn package' from this directory.
+
+```
+$ mvn package
+```
+From this directory it generates roughly the following...
+```
+.
+├── pom.xml
+├── README.txt
+├── src
+│   ├── main
+│   │   ├── assembly
+│   │   ├── bin
+│   │   ├── java
+│   │   ├── resources
+│   │   └── webapp
+│   └── test
+│       ├── java
+│       └── resources
+└── target
+    ├── any23-service-${version}.war
+    ├── any23-service-${version}-without-deps.war
+    ├── apache-any23-service-${version}-bin-server-embedded.tar.gz <<<
+    ├── apache-any23-service-${version}-bin-server-embedded.zip <<<
+    ├── apache-any23-service-${version}-bin.tar.gz <<<
+    ├── apache-any23-service-${version}-bin-without-deps.tar.gz <<<
+    ├── apache-any23-service-${version}-bin-without-deps.zip <<<
+    ├── apache-any23-service-${version}-bin.zip <<<
+    ├── archive-tmp
+    ├── classes
+    ├── generated-sources
+    ├── maven-archiver
+    ├── maven-shared-archive-resources
+    ├── surefire
+    ├── surefire-reports
+    └── test-classes
+```
+
+Specific README's for each of the artifacts can be found in either ./target/*.tar.gz || ./target/*.zip (annotated above with '<<<'), where much more detailed information sources can be located.
diff --git a/RELEASE-NOTES.txt b/RELEASE-NOTES.txt
new file mode 100644
index 0000000..44c4c4a
--- /dev/null
+++ b/RELEASE-NOTES.txt
@@ -0,0 +1,677 @@
+             Apache Any23 2.3
+              Release Notes
+           10/02/2019 (dd/mm/yyy)
+
+Sub-task
+
+    [ANY23-184] - Update Javadoc in o.a.a.extractor.microdata.*
+    [ANY23-356] - Update dependencies
+    [ANY23-357] - Resolve mockito deprecation warnings
+    [ANY23-358] - Resolve junit.framework deprecation warnings & RDFa11Parser deprecation warnings
+    [ANY23-359] - Resolve org.apache.commons.io.IOUtils deprecation warning
+    [ANY23-360] - Resolve Xerces deprecation warnings
+    [ANY23-361] - Resolve Tika deprecation warning
+    [ANY23-362] - Resolve rdf4j deprecation warnings
+    [ANY23-363] - Update httpclient/httpcore to version 4.5.6/4.4.10
+    [ANY23-364] - Resolve POI deprecation warnings
+    [ANY23-365] - Resolve additional warnings
+    [ANY23-366] - Resolve additional warnings in build
+    [ANY23-369] - Resolve overlapping classes
+    [ANY23-388] - It should be possible to configure the NTriplesWriter to use unicode points
+    [ANY23-404] - Make MicrodataExtractor compliant with default registry
+    [ANY23-405] - Parse microdata property values correctly
+    [ANY23-407] - Allow microdata itemids to be created from relative URLs
+    [ANY23-408] - Use document IRI as default namespace in microdata strict mode
+    [ANY23-409] - Allow multiple microdata itemtype values
+    [ANY23-410] - Fix microdata itemrefs
+
+Bug
+
+    [ANY23-13] - Verify why the maven-changelog-plugin doesn't work properly
+    [ANY23-16] - Property URI generation for Microdata/schema.org
+    [ANY23-17] - problem detecting media type for turtle content with comment at the top
+    [ANY23-55] - any23 is not following the redirection
+    [ANY23-67] - Microdata extraction using obsolete RDF conversion scheme
+    [ANY23-154] - Not able to extract microdata in few test cases
+    [ANY23-167] - Microdata itemscope properties incorrectly attached
+    [ANY23-169] - Incorrect interpretation of relative and absolute paths with Microdata
+    [ANY23-188] - NPE when ICBMExtractor#getDescription()#getExtractorLabel() called
+    [ANY23-237] - Fix RDFa test 0087: stylesheet reserved word is stripped out
+    [ANY23-245] - Infinite loop on some malformed markup
+    [ANY23-322] - Any23 embedded service is broken
+    [ANY23-329] - master branch broken with pom.xml any23 version
+    [ANY23-331] - Tool service implementations declared in wrong module?
+    [ANY23-334] - SingleDocumentExtraction.createExtractionContext() uses UUID as defaultLanguage
+    [ANY23-336] - Parsing json-ld content takes prohibitively long time
+    [ANY23-337] - BenchmarkTripleHandler does not report accurate extraction interval times
+    [ANY23-338] - Json-ld comment parsing fails in rare cases
+    [ANY23-339] - Microdata extractor can sometime merge two different itemscopes into one
+    [ANY23-340] - Any23 extraction does not pass Nutch plugin test
+    [ANY23-344] - MicrodataExtractor not resolving urls correctly
+    [ANY23-345] - MicrodataExtractorTest has a duplicated test
+    [ANY23-346] - rdf4j versions 2.3.0, 2.3.1 contain a regression: we need to switch back to version 2.2.4
+    [ANY23-347] - RDFParseException: the prefix "pw" is not bound
+    [ANY23-348] - IllegalArgumentException in MicrodataExtractor
+    [ANY23-349] - MicrodataExtractor errors for links that are telephone numbers
+    [ANY23-350] - RDFParseException: "icon" must be followed by ' = ' character
+    [ANY23-351] - NullPointerException in HCardExtractor
+    [ANY23-353] - RDFParseException: datatype rdf:langString requires a language tag
+    [ANY23-367] - latest.stable.released property is never used and out of date
+    [ANY23-368] - Jenkins builds are failing after running out of disk space
+    [ANY23-372] - LGPL-licensed transitive dependency
+    [ANY23-373] - Web page /install.html: software version variable was not decoded.
+    [ANY23-376] - IllegalArgumentException: invalid property name ''
+    [ANY23-377] - Microdata extractor replaces empty strings with "Null"
+    [ANY23-378] - JsonParseException caused by trailing commas in JSON-LD
+    [ANY23-379] - RDFa SAXParseException: invalid XML character
+    [ANY23-380] - RDFa SAXParseException: attribute was already specified
+    [ANY23-381] - JsonParseException: Illegal unquoted character
+    [ANY23-382] - Distinguish between fatal and recoverable json-ld parsing errors
+    [ANY23-383] - JsonParseException: Unexpected character 0x2028
+    [ANY23-386] - Item's properties are in the wrong item since the 2.2
+    [ANY23-387] - Possible OutOfMemoryError with bad deeply nested HTML
+    [ANY23-389] - RDFa extraction breaks when base element uses relative href
+    [ANY23-391] - ICAL vocab uses class "vcalendar" instead of "Vcalendar"
+    [ANY23-392] - Lunching maven-jetty-plugin: Problem accessing /apache-any23-service/resources/form.html
+    [ANY23-395] - any23.org 500 Internal Server Error
+    [ANY23-406] - Cannot suppress Tika warnings
+    [ANY23-411] - Use Content-Type to help determine encoding
+    [ANY23-415] - NTriplesExtractor tries all text/plain files, causing numerous fatal issues
+    [ANY23-416] - NTriplesExtractor does not recognize "application/n-triples" mimetype
+    [ANY23-420] - Handle Json+ld extraction failure
+    [ANY23-425] - iCal, jCal, xCal extractors aren't listed in META-INF/services
+
+New Feature
+
+    [ANY23-81] - Interactive web service
+
+Improvement
+
+    [ANY23-38] - Use a single logging tool: slf4j
+    [ANY23-190] - any23.org homepage busted on IE11
+    [ANY23-212] - Improve naming convention for service output files
+    [ANY23-215] - Forward slashes in URL's should not be escaped in RDF output
+    [ANY23-231] - Make JSON Reporting output pretty print
+    [ANY23-240] - Option to process html tags as spaces in Microdata
+    [ANY23-323] - Update Eclipse RDF4J version to 2.3
+    [ANY23-332] - Plugin-specific properties shouldn't be declared in default-configuration.properties
+    [ANY23-341] - Remove dependency on defunct commons-httpclient 3.1
+    [ANY23-343] - Upgrade to jsonld-java v 0.12.0
+    [ANY23-352] - Update to rdf4j version 2.3.2
+    [ANY23-354] - Clean up dependencies
+    [ANY23-355] - Deprecate RDFa11Parser since Rio implementations are used instead
+    [ANY23-374] - Invalid nested item takes out everything
+    [ANY23-385] - Improve charset detection for (x)html documents
+    [ANY23-390] - Implement ICal, JCal, XCal extractors
+    [ANY23-393] - Any23 master to build under JDK 10.X
+    [ANY23-394] - JSON-LD Extractions Flag Errors in Google's Structured Data Tooling
+    [ANY23-396] - Overhaul WriterFactory API
+    [ANY23-399] - Upgrade Apache parent POM to version 21
+    [ANY23-401] - Upgrade to Tika 1.19.1
+    [ANY23-402] - Deprecate JSONWriter, JSONWriterFactory
+    [ANY23-403] - Upgrade to RDF4J 2.4.0
+    [ANY23-414] - Support reverse itemprops in microdata
+    [ANY23-418] - Take another look at encoding detection
+    [ANY23-419] - Add J2EE depednencies such that service runs under JDK11
+    [ANY23-424] - Update dependencies
+
+Test
+
+    [ANY23-422] - Error message when any23 cli tool used
+
+Task
+
+    [ANY23-333] - Augment use of Any23PluginManager in How to Register a Plugin documentation
+    [ANY23-423] - Update POM for the move to gitbox.
+
+             Apache Any23 2.2
+              Release Notes
+              25/01/2018 (dd/mm/yyy)
+
+Sub-task
+
+    [ANY23-155] - Test failure: testRunOnHTTPResource(org.apache.any23.cli.MicrodataParserTest)
+    [ANY23-267] - Entire extractions fail due to "The element type 'meta' must be terminated by the matching end-tag </meta>"
+    [ANY23-268] - Entire extraction task fails due to "Element type "t.length" must be followed by either attribute specifications, ">" or "/>"
+
+Bug
+
+    [ANY23-12] - character are wrongly encoded in rdfxml output
+    [ANY23-131] - Nested Microdata are not extracted
+    [ANY23-140] - Revise Any23 tests to remove fetching of web content
+    [ANY23-166] - Parsing crashes with attributes that don't use quotes
+    [ANY23-201] - Service Regularly Times Out on DBPedia Queries
+    [ANY23-227] - not extracting opengraph rdfa
+    [ANY23-228] - Invalid URI
+    [ANY23-230] - any23.org redirects to single slash URI
+    [ANY23-256] - MicrodataParserTest failing locally but not on Jenkins
+    [ANY23-260] - Get Any23 listed as an Application capable of using DBPedia
+    [ANY23-266] - Fix Issues with Failing WebService Examples
+    [ANY23-271] - Address "...The entity "raquo" was referenced, but not declared" SAXParseException
+    [ANY23-273] - The content of elements must consist of well-formed character data or markup - no bogus comments
+    [ANY23-303] - JsonLdError: loading remote context failed: http://schema.org/
+    [ANY23-306] - Absent binaries for version 2.0
+    [ANY23-312] - Triple sub-pred-null should not be added into outcome. Change traversing method.
+    [ANY23-314] - Service fails to return extraction in case of extraction error
+    [ANY23-316] - Yaml parser does not halndle intentional null value
+    [ANY23-317] - Any23 fails when dealing with JavaScript
+    [ANY23-318] - ExtractionException handling in BaseRDFExtractor.java kills entire extraction
+    [ANY23-326] - parsing unclosed meta and input tags fails
+
+New Feature
+
+    [ANY23-8] - Write a separate tool for RDFa/microformat detection tool usable in crawlers
+    [ANY23-233] - Add local extraction cache to Any23 service
+
+Improvement
+
+    [ANY23-106] - Gracefully shut down Any23 service
+    [ANY23-213] - Implement JSOn reporting for the Any23 service
+    [ANY23-214] - ë (e-umlaut or diaeresis) not decoded in RDF output
+    [ANY23-249] - Update all W3C and other Standards Compliance within Any23
+    [ANY23-280] - Refactor ContentExtractor to improve extraction flexibility
+    [ANY23-291] - JSON-LD should be looked up in entire HTML document, not just in <head>
+    [ANY23-298] - Revisit the OGP.java vocabulary and update it
+    [ANY23-309] - "Scraper" misspelled as "Scarper" on Downloads webpage
+    [ANY23-319] - Upgrade jsonld-java dependency to 0.11.1
+    [ANY23-324] - Replace net.sourceforge.nekohtml with jsoup
+    [ANY23-325] - Any23 incompatible with http://rdfa.info/test-suite/#
+
+Test
+
+    [ANY23-320] - Address @Ignore tests in Any23
+
+Wish
+
+    [ANY23-210] - Address 1.0 Release Review Discrepancies
+
+Task
+
+    [ANY23-40] - Complete Documentation for Plugin Management system
+
+
+			 Apache Any23 2.1
+			  Release Notes
+		      14/09/2017 (dd/mm/yyy)
+
+Bug
+
+    [ANY23-244] - Broken Links on Web-Site
+    [ANY23-282] - Replacement for all Sindice namespaces and URI's
+    [ANY23-304] - Add extractor for OpenIE
+    [ANY23-305] - Missing appender in command line tool
+    [ANY23-308] - Adding option "-d" to yaml file parsing gives error
+    [ANY23-310] - Rover displays wrong statistical values
+
+Improvement
+
+    [ANY23-206] - Overhaul Any23 site documentation
+    [ANY23-301] - Forward all logs into STDERR stream
+
+New Feature
+
+    [ANY23-257] - Support OWL as an input format
+
+Task
+
+    [ANY23-283] - access to analysis.apache.org
+
+			 Apache Any23 2.0
+			  Release Notes
+		      03/02/2017 (dd/mm/yyy)
+Sub-task
+
+    [ANY23-243] - Overhaul and update README.txt
+
+Bug
+
+    [ANY23-79] - No execute permissions in command line tool
+    [ANY23-92] - NQuadsParser does not require whitespace between elements
+    [ANY23-99] - NQuadsWriter should force ASCII in OutputStream constructor
+    [ANY23-153] - Automatically Generate EARL reports for Any23 RDF Parsers
+    [ANY23-176] - DOC: Apache Any23 Installation Guide
+    [ANY23-200] - Build revision is not correctly defined
+    [ANY23-219] - rover is does not work with -f nquads option
+    [ANY23-235] - NQuads links broken on Supported Formats Page
+    [ANY23-236] - Port Any23 site to Apache CMS
+    [ANY23-248] - NTriplesWriter on hadoop : issue with MIME type/Upgrade sesame dependencies to 2.7.14
+    [ANY23-252] - JSON-LD format MIME type is not detected
+    [ANY23-253] - JSON-LD cannot be processed by Rover
+    [ANY23-255] - apache-any23-quads dependency should not be <scope> test in core pom.xml
+    [ANY23-265] - ThreadSafety issue in ItemPropValue
+    [ANY23-272] - Service fails to start with any23server.bat
+    [ANY23-277] - Any23 master branch will not build to to build due to lacking maven-assembly-plugin
+    [ANY23-279] - Fix EmbeddedJSONLDExtractor ExtractorDescription getDescription() implementation
+    [ANY23-296] - Tar complains about groupid value being too big
+    [ANY23-302] - rover JSON output is not valid
+
+Improvement
+
+    [ANY23-80] - Split out command line tools into a separate module
+    [ANY23-163] - VocabPrinter tool broken with No writer factory available for RDF format N-Quads (mimeTypes=text/x-nquads; ext=nq)
+    [ANY23-185] - Add missing <meta> element attributes to HTMLMetaExtractor
+    [ANY23-207] - Implement Microformats2
+    [ANY23-246] - Add Open Graph Protocol and Facebook prefixes to popular.prefixes
+    [ANY23-247] - FIX Attribute name "itemscope" associated with an element type "html" must be followed by the ' = ' character.
+    [ANY23-250] - Upgrade to Tika 1.7
+    [ANY23-261] - Tiny typo in Data Extraction documentation source example
+    [ANY23-263] - Upgrade to Tika 1.14
+    [ANY23-274] - Change any23.microdata.ns.default configuration value to http://schema.org
+    [ANY23-276] - Upgrade sesame dependencies to RDF4J
+    [ANY23-278] - Upgrade all Maven plugin versions in parent pom.xml
+    [ANY23-293] - Package log4j configuration with core appassembler
+    [ANY23-297] - Any23 doesn't build under JDK1.8
+    [ANY23-299] - Missing YAML to RDF parser
+    [ANY23-300] - Ignore NetBeans configuration files
+
+Task
+
+    [ANY23-141] - Upgrade OpenRDF Sesame to 2.7.0
+    [ANY23-242] - Address issues with 1.1 #1 RC
+
+Wish
+
+    [ANY23-19] - Abstract away any specific RDF APIs
+    [ANY23-226] - Extract JSON-LD embedded in HTML
+
+                         Apache Any23 1.1
+                          Release Notes
+                      15/10/2014 (dd/mm/yyyy)
+Bug
+
+    [ANY23-205] - Remove xrefs from Any23 site and replave with Git(hub) links
+    [ANY23-220] - Run crawler plugin on Apache Any23 site
+    [ANY23-234] - No writer factory available for RDF format N-Quads (mimeTypes=text/x-nquads; ext=nq)
+
+Improvement
+
+    [ANY23-157] - Update Any23 site to accommodate move to Git.
+    [ANY23-197] - Extract embedded json-ld from html documents
+    [ANY23-204] - fix url encoding problem : PR#3
+    [ANY23-209] - Bug in site generation
+    [ANY23-221] - Enable JSON-LD as an input format for the WebService at any23.org
+    [ANY23-238] - Fix generation of BNode name for microdata when 'itemid' is given without a value.
+
+New Feature
+
+    [ANY23-7] - Performance test suite
+    [ANY23-160] - [SECURITY] Frame injection vulnerability in published Javadoc
+
+Task
+
+    [ANY23-222] - Push 1.1-SNAPSHOT artifacts to the Any23 website
+                           
+
+                           Apache Any23 1.0
+                             Release Notes
+                         09/05/2014 (dd/mm/yyyy)
+
+Sub-task
+
+    [ANY23-148] - Programmes Ontology
+
+Bug
+
+    [ANY23-100] - Issue with RDFa extractor while processing nested properties
+    [ANY23-135] - Any23 RDFa Extractor ignores multiple prefix and property statements
+    [ANY23-136] - Some RDFa tests have incorrect expected results
+    [ANY23-168] - RDFa properties in <meta> elements not picked up
+    [ANY23-170] - Dependency error org.apache.commons:commons-csv:1.0-SNAPSHOT-rev1148315
+    [ANY23-172] - Fix minor issues with Any23 0.9.0 RC
+    [ANY23-173] - Please delete old releases from mirroring system
+    [ANY23-174] - Incorrect RDFa extractions
+    [ANY23-203] - Update version revisions from 0.9.1 to 1.0
+
+Improvement
+
+    [ANY23-65] - Update to RDFa extraction stylesheet
+    [ANY23-128] - html-rdfa11 extractor fails on mailto: anchors
+    [ANY23-130] - Improve aesthetics of the output format when straying from default java.io.PrintStream
+    [ANY23-137] - RDFa parser implementation proposal
+    [ANY23-179] - Improve Javadoc and throwing of IllegalArgumentException in Any23#createDocumentSource
+    [ANY23-180] - Create an Apache hosted jail running an Any23 service instance
+    [ANY23-181] - Upgrade NekoHTML to 1.9.20
+
+New Feature
+
+    [ANY23-134] - Create o.a.a.extractor.tika Parser and Extractor implementations
+    [ANY23-177] - Add support for JSON-LD
+
+Task
+
+    [ANY23-162] - Add package.java for all LKIFCore classes
+
+                           Apache Any23 0.9.0
+                             Release Notes
+                         28/10/2013 (dd/mm/yyyy)
+
+Sub-task
+
+    [ANY23-142] - LKIF-Core Vocabulary
+    [ANY23-143] - LRICore Vocabulary
+
+Bug
+
+    [ANY23-111] - Any23 raises an unmanaged exception from the Microdata parser
+    [ANY23-115] - Empty spans seem to break ANY23
+    [ANY23-161] - Fix service file generation
+    [ANY23-165] - "Invalid content" error if TITLE precedes encoding declaration in the document
+    [ANY23-171] - form.html not in correct location in service.
+
+Improvement
+
+    [ANY23-47] - Migrate basic-crawler classes to org.apache.nutch
+    [ANY23-164] - office-scraper ExcelExtractorFactory.java to accept application/x-tika-ooxml and application/x-tika-msoffice formats
+
+New Feature
+
+    [ANY23-120] - Split CLI tools out into a new module
+
+Task
+
+    [ANY23-122] - Cleanup Distribution Mirrors
+
+                           Apache Any23 0.8.0
+                             Release Notes
+                         01/05/2013 (dd/mm/yyyy)
+                         
+Sub-task
+
+    [ANY23-109] - Missing tika-config.xml in o.a.a.mime
+    [ANY23-110] - DOAP Vocabulary
+
+Bug
+
+    [ANY23-44] - error when parsing a document from http://www.afdsi.org/docs/test/html/RDFa/_food-stream_.htm
+    [ANY23-78] - Download page links are broken
+    [ANY23-108] - Broken schema.org microdata extraction
+    [ANY23-112] - Fix incubation disclaimer
+    [ANY23-113] - Remove dependencies from parent pom.xml file
+    [ANY23-116] - Empty values are skipped when reading tab separated CSV.
+    [ANY23-156] - Add logging dependencies to plugins and service
+
+Improvement
+
+    [ANY23-2] - Add support for hreview-aggregate microformat.
+    [ANY23-26] - Upgrade dependency to Apache Tika 1.2
+    [ANY23-46] - Update Any23 web service
+    [ANY23-83] - Remove hardcoded formats throughout Any23 to make it useful as a library
+    [ANY23-101] - Use RDFFormat.NQUADS in nquads module
+    [ANY23-139] - Simplify site deploy plugging the maven-scm-publish-plugin
+    [ANY23-144] - Implement comprehensive naming of o.a.a.api.vocab classes
+
+New Feature
+
+    [ANY23-4] - Integrate W3C's RDFa test suite and pass all tests
+    [ANY23-85] - Split NQuads out into its own module
+    [ANY23-96] - Add user agent string to basic-crawler
+    [ANY23-117] - Split Mime type detection out into its own module
+    [ANY23-118] - Split Encoding detection out into its own module
+
+Task
+
+    [ANY23-41] - Write basic-crawler plugin documentation
+    [ANY23-125] - Drop the Incubating DISCLAIMER
+                         
+
+                             Apache Any23 0.7.0-incubating
+                              Release Notes
+                              25/06/2012
+
+Sub-task
+
+    [ANY23-25] - Update all Maven POM's in trunk
+    [ANY23-31] - Move any23 site documentation out of trunk and into its own SVN directory
+    [ANY23-53] - Bad Web Service documentation
+
+Bug
+
+    [ANY23-14] - Add support for Extractor sub results
+    [ANY23-20] - The Any23 PluginManager fails handing resource paths containing spaces.
+    [ANY23-34] - Plugin Integration Test Fails
+    [ANY23-37] - LGPL'ed components cannot be included in distribution packages
+    [ANY23-42] - Fix issue in RDFa11Parser.java is not resolving relative URIs correctly
+    [ANY23-49] - N3/NQ parsers ignoring stopAtFirstError flag
+    [ANY23-58] - HCardExtractor infinite loop and memory exhaustion
+    [ANY23-62] - ExtractionResultImpl loses all issues generated by sub extractions
+    [ANY23-73] - The ToolRunner CLI driver -p (--plugins-dir) option doesn't work because parsed after the Tool list loading
+    [ANY23-77] - Facing a infinite loop problem in version 0.6.1 - Verify
+    [ANY23-78] - Download page links are broken
+    [ANY23-87] - Bogus arguement in o.a.a.cli.CrawlerTest
+    [ANY23-88] - any23 script -v or --version option doesn't display actual version
+    [ANY23-94] - The Microdata CLI tool doesn't work anymore
+    [ANY23-95] - Activate the IgnoreAccidentalRDFa filter for the Any23 Service instance
+    [ANY23-97] - The test suite was not running all tests, minor regressions occurred
+
+Improvement
+
+    [ANY23-18] - Add a new extractor for RDFa using java-rdfa
+    [ANY23-28] - Document munging of Any23 history to CHANGES.txt
+    [ANY23-32] - replace hardcoded bash script with generated via appassembler
+    [ANY23-33] - Replace proprietary SUN imports from Any23 classes.
+    [ANY23-45] - Improve issue verification support in Extractor tests
+    [ANY23-50] - Simplify plugin loading avoiding the classpath scanning
+    [ANY23-56] - Change repo-ext to Any23 SVN mirrior repo.
+    [ANY23-63] - The Any23 web service doesn't return the Issue Report generated by activated Extractors, hiding major metadata issues
+    [ANY23-64] - Improve CLI uage aesthetics
+    [ANY23-70] - Establish searchable list archives
+    [ANY23-71] - improve the current CLI engine
+    [ANY23-74] - Disable domain triple generation in default configuration
+    [ANY23-75] - Improve runtime of the Microdata extractor on documents with many relations.
+    [ANY23-76] - Improve runtime of the Microformat extractor on documents with many relations.
+    [ANY23-82] - Don't use explicit reference to Log4j classes
+    [ANY23-86] - Better logging in SiteCrawlerTest
+
+New Feature
+
+    [ANY23-9] - Prepare a dedicated homepage for Any23
+    [ANY23-29] - Migrate code base to ASF infrastructure
+    [ANY23-57] - Create Any23 History documentation and add to site
+    [ANY23-59] - Create KEYS file for Any23
+    [ANY23-68] - Create Powered By documentation/page
+    [ANY23-102] - Any23 DOAP file
+
+Task
+
+    [ANY23-21] - Migrate all packages and classes to ORG.APACHE.ANY23
+    [ANY23-27] - Import revisions r1547 to r1607 from Google Code SVN to ASF SVN
+    [ANY23-36] - Merge GCode specific CHANGES.txt report in main changes.xml
+    [ANY23-39] - Write Down Overall Architecture Document to help new developers maintaining the Any23 core
+    [ANY23-48] - Update Documentation (Site + READMEs) to reflect changes in shell script usage
+    [ANY23-52] - Remove non ASF logos from Any23 Service page
+    [ANY23-66] - Fix Javadoc
+
+==========================================================================
+
+                             Apache Any23 0.6.1
+                              Release Notes
+
+Fixes
+
+ * Improved MIMEType detection for CSV input. [172, 176]
+
+==========================================================================
+
+                             Apache Any23 0.6.0
+                              Release Notes
+
+Fixes
+
+ * Fixed several bugs. [151, 153, 154, 155, 156, 164, 168]
+ * Removed unused Apache Any23 dependencies. [162]
+ * Introduced parent POM dependencyManagement. [163]
+ * Minor code refactoring. [142]
+ * Updated project documentation. [161]
+
+Enhancements
+
+ * Added support for Microdata [114, 141, 144, 145, 152, 157]
+ * Added RDFa 1.1 support for new prefix specification. [143]
+ * Added CSV Extractor (RDFizer). [150, 165]
+ * Added HTML/META Extractor. [148, 149]
+ * Improved Configuration programmatic management. [147]
+ * Added several flags to control metadata triples generation. [146]
+ * Improved nesting relationship explicitation in Microformat extractors. [80]
+ * Major Extractor interface refactoring. [160, 167]
+ * Improved TagSoup Extractor based error reporting. [159]
+ * Added command-line tool to print out the Apache Any23 declared vocabularies. [114]
+
+==========================================================================
+
+                              Apache Any23 0.6.0-M2
+                                Release Notes
+
+The release 0.6.0-M2 introduces major fixes on M1 milestone
+[154, 155, 156] and improves Configuration [147] and Microdata
+ error management[157].
+
+==========================================================================
+
+                             Apache Any23 0.6.0-M1
+                               Release Notes
+
+The release 0.6.0-M1 is an early preview of the
+Microdata support. [114]
+
+==========================================================================
+
+                             Apache Any23 0.5.0
+                              Release Notes
+
+Fixes
+
+ * Fixed wrong conversion of a generic XML file to RDF. [131]
+ * Fixed usage of 'base' tag when resolving relative URIs
+   in RDFa. [75]
+ * Fixed error parsing Turtle data. [87]
+ * Fixed issue with escaping in NQuads parser. [126]
+ * Fixed XML DTD validation attempt. [95]
+ * Fixed concurrent modification exception in
+   ExtractionContentBlocker filter. [86]
+ * Fixed mime type detection of direct input when source
+   contains blank chars. [83, 90]
+ * Fixed reporting when producing no triples. [79]
+ * Fixed any23-service packaging, added profile for excluding
+   embedded dependencies. [113]
+
+Enhancements
+
+ * Improved extraction report: added list of 
+   activated extractors. [89]
+ * Improved extraction of HTML link element. [133]
+ * Added XPath HTML extractor. [124]
+ * Added HRecipe Microformat extractor. [103]
+ * Added plugin support for Apache Any23. [111]
+ * Implemented HTML Scraper Plugin. [123]
+ * Upgraded to Sesame 2.4.0. [136]
+ * Upgraded to Jetty 8.0.0 [138]
+ * Upgraded maven-site-plugin. [85]
+ * Added flags to exclude metadata triples [134]
+ * Added removal of CSS related triples. [135]
+ * Improved overall documentation. [130]
+ * Overall POM refactoring. [125]
+
+==========================================================================
+
+                             Apache Any23 0.4.0 
+                              Release Notes
+
+* The any23-service module has been separated from the any23-core module,
+  the Ant build system has been dropped. [Issue 44]
+* Added support for HTML metadata (RDFa / Microformats) validation
+  and correction (validator). [Issue 77]
+* Added flag to disable the nesting relationship property 
+  enrichment. [Issue 67]
+* Improved coverage of Microformats tests. [Issue 65]
+* Improved documentation. [Issue 44]
+* Various code consolidation. [Issues 68, 69, 70, 71, 72, 73, 74, 77]
+
+==========================================================================
+
+	                         Apache Any23 0.3.0 
+                              Release Notes
+
+* Added detection and enrichment of nested microformats. [Issue #61]
+* Added detection and support of N-Quads as input and output format. [Issue #7]
+* General Improvements in RDFa extraction. [Issue #12, Issue #14]
+* Added support of Turtle embedded in HTML script tag. [Issue #62]
+* Improvement in encoding support. [Issue #43]
+* Improvement in Core API. [Issue #27]
+* Improved support for Species Microformat. [Issue #63]
+* General Code prettification.
+
+==========================================================================
+
+	                         Apache Any23 0.2.2 
+                              Release Notes
+
+* Fixed dependency management on Maven. A second level dependency of Xerces
+  introduced a conflict on the java.xml.transform API causing wrong XSLT 
+  transformations within RDFa extractor.
+
+==========================================================================
+
+	                         Apache Any23 0.2.1 
+                              Release Notes
+
+* Major applyFix on Tika configuration management. This applyFix solves the 
+  auto detection of the main Semantic Web related formats.
+
+==========================================================================
+
+                            Apache Any23 0.2
+                             Release Notes
+
+============
+Introduction
+============
+
+This release features a redesigned API and incorporating enhancements and
+bug fixes that have accumulated since the 0.1 release.
+Apart  from  some  new  or changed dependencies on the underlying libraries,
+this  version  comes  with an improved unit test coverage and other features
+like the automatic charset encoding detection and an improved documentation.
+Maven build system has been introduced.
+
+
+==================================
+Summary of major changes since 0.1
+==================================
+
+* Redesigned Java API
+    - Input from string, stream, file, or URI
+    - Allow choosing which extractors to use
+    - Report origin of triples (document/extractor) to client processors
+    - Various processors/serializers for extracted triples
+* Added flexible command-line tool for easy testing
+* Vastly improved website and documentation
+* Media type and encoding detection via Apache Tika
+* Switched RDF library from Jena to Sesame
+* Added Maven build
+* Better RDF extraction from Microformats
+* Extractors now come with an example file to document typical in- and output
+* Major refactoring
+* Lots and lots of bugfixes
+
+=================
+Supported formats
+=================
+
+* RDF/XML
+* Notation3 and Turtle
+* N-Triples
+* RDFa
+
+Various microformats, see http://sindice.com/developers/microformat on Sindice Microformats support.
+
+===================
+Dependency Upgrade
+===================
+
+CyberNeko Html parser has been upgraded to 1.9.14.
+
+Apache Tika 0.3 has been replaced with 0.6, with the
+new  support  for  the automatic encoding detection.
+
+EOF
+
diff --git a/pom.xml b/pom.xml
new file mode 100644
index 0000000..386eeb3
--- /dev/null
+++ b/pom.xml
@@ -0,0 +1,795 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+  Licensed to the Apache Software Foundation (ASF) under one or more
+  contributor license agreements.  See the NOTICE file distributed with
+  this work for additional information regarding copyright ownership.
+  The ASF licenses this file to You under the Apache License, Version 2.0
+  (the "License"); you may not use this file except in compliance with
+  the License.  You may obtain a copy of the License at
+
+   http://www.apache.org/licenses/LICENSE-2.0
+
+  Unless required by applicable law or agreed to in writing, software
+  distributed under the License is distributed on an "AS IS" BASIS,
+  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+  See the License for the specific language governing permissions and
+  limitations under the License.
+-->
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
+  <modelVersion>4.0.0</modelVersion>
+
+  <parent>
+    <groupId>org.apache</groupId>
+    <artifactId>apache</artifactId>
+    <version>21</version>
+  </parent>
+
+  <groupId>org.apache.any23</groupId>
+  <artifactId>apache-any23-service</artifactId>
+  <packaging>war</packaging>
+  <version>2.4-SNAPSHOT</version>
+
+  <name>Apache Any23 :: Service</name>
+  <description>Any23 Frontend and REST Service implementation.</description>
+
+  <properties>
+    <!-- the following property is used in the bash script as well, don't remove it! -->
+    <jetty.runner.version>9.4.20.v20190813</jetty.runner.version>
+    <output.directory>${project.build.directory}/${project.artifactId}-${project.version}/WEB-INF/lib/apache-any23-openie</output.directory>
+  <!-- General properties. -->
+    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
+    <project.build.resourceEncoding>UTF-8</project.build.resourceEncoding>
+    <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
+
+    <javac.src.version>1.8</javac.src.version>
+    <javac.target.version>1.8</javac.target.version>
+
+    <maven.build.timestamp.format>yyyy-MM-dd HH:mm:ssZ</maven.build.timestamp.format>
+    <implementation.build>${scmBranch}@r${buildNumber}</implementation.build>
+    <implementation.build.tstamp>${maven.build.timestamp}</implementation.build.tstamp>
+
+    <httpclient.version>4.5.10</httpclient.version>
+    <httpcore.version>4.4.12</httpcore.version>
+    <owlapi.version>5.1.11</owlapi.version>
+    <poi.version>4.1.0</poi.version>
+    <rdf4j.version>3.0.0</rdf4j.version>
+    <semargl.version>0.7</semargl.version>
+    <slf4j.logger.version>1.7.28</slf4j.logger.version>
+    <tika.version>1.22</tika.version>
+    <openie_2.11.version>4.2.6</openie_2.11.version>
+    <openregex.version>1.1.1</openregex.version>
+    <jackson.version>2.9.10</jackson.version>
+
+    <!-- Overridden in profiles to add JDK specific arguments to surefire -->
+    <surefire-extra-args />
+
+    <!-- Used to track API changes based on Semantic Versioning
+         NOTE: velocity does.not.allow.dot.notation, so justUseCamelCase -->
+    <latestStableRelease>2.3</latestStableRelease>
+
+    <!-- Google Analytics id for website -->
+    <form.tracker.id>UA-59636188-1</form.tracker.id>
+
+    <!-- Maven Plugin Versions -->
+    <maven-javadoc-plugin.version>3.1.1</maven-javadoc-plugin.version>
+    <maven-clean-plugin.version>3.1.0</maven-clean-plugin.version>
+    <maven-deploy-plugin.version>3.0.0-M1</maven-deploy-plugin.version>
+    <maven-install-plugin.version>3.0.0-M1</maven-install-plugin.version>
+    <maven-resources-plugin.version>3.1.0</maven-resources-plugin.version>
+    <maven-assembly-plugin.version>3.1.1</maven-assembly-plugin.version>
+    <appassembler-maven-plugin.version>2.1.0</appassembler-maven-plugin.version>
+    <maven-release-plugin.version>2.5.3</maven-release-plugin.version>
+    <buildnumber-maven-plugin.version>1.4</buildnumber-maven-plugin.version>
+    <maven-compiler-plugin.version>3.8.1</maven-compiler-plugin.version>
+    <maven-jar-plugin.version>3.1.2</maven-jar-plugin.version>
+    <maven-surefire-plugin.version>3.0.0-M3</maven-surefire-plugin.version>
+    <jacoco-maven-plugin.version>0.8.4</jacoco-maven-plugin.version>
+    <maven-site-plugin.version>3.7.1</maven-site-plugin.version>
+    <maven-changes-plugin.version>2.12.1</maven-changes-plugin.version>
+    <maven-project-info-reports-plugin.version>3.0.0</maven-project-info-reports-plugin.version>
+    <maven-jxr-plugin.version>3.0.0</maven-jxr-plugin.version>
+    <maven-checkstyle-plugin.version>3.1.0</maven-checkstyle-plugin.version>
+    <apache-rat-plugin.version>0.13</apache-rat-plugin.version>
+    <maven-source-plugin.version>3.0.1</maven-source-plugin.version>
+    <maven-gpg-plugin.version>1.6</maven-gpg-plugin.version>
+    <maven-war-plugin.version>3.2.3</maven-war-plugin.version>
+    <maven-invoker-plugin.version>3.2.1</maven-invoker-plugin.version>
+    <maven-checkstyle-plugin.version>3.1.12.2</maven-checkstyle-plugin.version>
+
+    <!--
+     | Any23 website has to be stored in SVN
+    -->
+    <site.deploymentBaseUrl>scm:svn:https://svn.apache.org/repos/asf/any23/site</site.deploymentBaseUrl>
+    <site.filePath>${project.basedir}/any23-site/</site.filePath>
+    <site.urlDeployment>file://${site.filePath}</site.urlDeployment>
+    <site.scmPubCheckoutDirectory>${site.filePath}</site.scmPubCheckoutDirectory>
+    <assembly.skip>false</assembly.skip>
+  </properties>
+
+  <repositories>
+    <repository>
+      <snapshots>
+        <enabled>false</enabled>
+      </snapshots>
+      <id>bintray-allenai-maven</id>
+      <name>bintray</name>
+      <url>http://allenai.bintray.com/maven</url>
+    </repository>
+  </repositories>
+  <pluginRepositories>
+    <pluginRepository>
+      <snapshots>
+        <enabled>false</enabled>
+      </snapshots>
+      <id>bintray-allenai-maven</id>
+      <name>bintray-plugins</name>
+      <url>http://allenai.bintray.com/maven</url>
+    </pluginRepository>
+  </pluginRepositories>
+
+  <developers>
+    <developer>
+      <id>hansbrende</id>
+      <name>Hans Brende</name>
+      <email>hansbrende[at]apache[dot]org</email>
+      <roles>
+        <role>Committer</role>
+        <role>PMC Member</role>
+      </roles>
+    </developer>
+    <developer>
+      <id>band</id>
+      <name>Bill Anderson</name>
+      <email>band[at]apache[dot]org</email>
+      <roles>
+        <role>Committer</role>
+        <role>PMC Member</role>
+      </roles>
+    </developer>
+    <developer>
+      <id>ansell</id>
+      <name>Peter Ansell</name>
+      <email>ansell[at]apache[dot]org</email>
+      <roles>
+        <role>Committer</role>
+        <role>PMC Member</role>
+      </roles>
+    </developer>
+    <developer>
+      <id>dpalmisano</id>
+      <name>Davide Palmisano</name>
+      <email>dpalmisano[at]apache[dot]org</email>
+      <roles>
+        <role>Committer</role>
+        <role>PMC Member</role>
+      </roles>
+    </developer>
+    <developer>
+      <id>giovanni</id>
+      <name>Giovanni Tummarello</name>
+      <email>giovanni[at]apache[dot]org</email>
+      <roles>
+        <role>Committer</role>
+        <role>PMC Member</role>
+      </roles>
+    </developer>
+    <developer>
+      <id>lewismc</id>
+      <name>Lewis John McGibbney</name>
+      <email>lewismc[at]apache[dot]org</email>
+      <roles>
+        <role>Committer</role>
+        <role>PMC Member</role>
+      </roles>
+    </developer>
+    <developer>
+      <id>mattmann</id>
+      <name>Chris Mattmann</name>
+      <email>mattmann[at]apache[dot]org</email>
+      <roles>
+        <role>Champion</role>
+        <role>Committer</role>
+        <role>PMC Member</role>
+        <role>Mentor</role>
+      </roles>
+    </developer>
+    <developer>
+      <id>mostarda</id>
+      <name>Michele Mostarda</name>
+      <email>mostarda[at]apache[dot]org</email>
+      <roles>
+        <role>Committer</role>
+        <role>PMC Member</role>
+      </roles>
+    </developer>
+    <developer>
+      <id>niq</id>
+      <name>Nick Kew</name>
+      <email>niq[at]apache[dot]org</email>
+      <roles>
+        <role>Committer</role>
+        <role>PMC Member</role>
+        <role>Mentor</role>
+      </roles>
+    </developer>
+    <developer>
+      <id>pramirez</id>
+      <name>Paul Michael Ramirez</name>
+      <email>pramirez[at]apache[dot]org</email>
+      <roles>
+        <role>Committer</role>
+        <role>PMC Member</role>
+        <role>Mentor</role>
+      </roles>
+    </developer>
+    <developer>
+      <id>reto</id>
+      <name>Reto Bachmann-Gmür</name>
+      <email>reto[at]apache[dot]org</email>
+      <roles>
+        <role>Committer</role>
+        <role>PMC Member</role>
+      </roles>
+    </developer>
+    <developer>
+      <id>simonetripodi</id>
+      <name>Simone Tripodi</name>
+      <email>simonetripodi[at]apache[dot]org</email>
+      <roles>
+        <role>Committer</role>
+        <role>PMC Member</role>
+        <role>Mentor</role>
+      </roles>
+    </developer>
+    <developer>
+      <id>szydan</id>
+      <name>Szymon Danielczyk</name>
+      <email>szydan[at]apache[dot]org</email>
+      <roles>
+        <role>Committer</role>
+        <role>PMC Member</role>
+      </roles>
+    </developer>
+    <developer>
+      <id>tommaso</id>
+      <name>Tommaso Teofili</name>
+      <email>tommaso[at]apache[dot]org</email>
+      <roles>
+        <role>Committer</role>
+        <role>PMC Member</role>
+        <role>Mentor</role>
+      </roles>
+    </developer>
+  </developers>
+
+  <mailingLists>
+    <mailingList>
+      <name>Dev Mailing List</name>
+      <post>dev[at]any23[dot]apache[dot]org</post>
+      <subscribe>dev-subscribe[at]any23[dot]apache[dot]org</subscribe>
+      <unsubscribe>dev-unsubscribe[at]any23[dot]apache[dot]org</unsubscribe>
+      <archive>http://mail-archives.apache.org/mod_mbox/any23-dev/</archive>
+      <otherArchives>
+        <otherArchive>http://any23-dev.markmail.org/</otherArchive>
+      </otherArchives>
+    </mailingList>
+
+    <mailingList>
+      <name>User Mailing List</name>
+      <post>user[at]any23[dot]apache[dot]org</post>
+      <subscribe>user-subscribe[at]any23[dot]apache[dot]org</subscribe>
+      <unsubscribe>user-unsubscribe[at]any23[dot]apache[dot]org</unsubscribe>
+      <archive>http://mail-archives.apache.org/mod_mbox/any23-user/</archive>
+      <otherArchives>
+        <otherArchive>http://any23-user.markmail.org/</otherArchive>
+      </otherArchives>
+    </mailingList>
+
+    <mailingList>
+      <name>Commits Mailing List</name>
+      <post>commits[at]any23[dot]apache[dot]org</post>
+      <subscribe>commits-subscribe[at]any23[dot]apache[dot]org</subscribe>
+      <unsubscribe>commits-unsubscribe[at]any23[dot]apache[dot]org</unsubscribe>
+      <archive>http://mail-archives.apache.org/mod_mbox/any23-commits/</archive>
+      <otherArchives>
+        <otherArchive>http://any23-commits.markmail.org/</otherArchive>
+      </otherArchives>
+    </mailingList>
+  </mailingLists>
+
+  <scm>
+    <developerConnection>scm:git:https://gitbox.apache.org/repos/asf/any23-server.git</developerConnection>
+    <connection>scm:git:http://gitbox.apache.org/repos/asf/any23-server.git</connection>
+    <url>https://gitbox.apache.org/repos/asf/any23-server.git</url>
+    <tag>HEAD</tag>
+  </scm>
+  <issueManagement>
+    <system>JIRA</system>
+    <url>https://issues.apache.org/jira/browse/ANY23</url>
+  </issueManagement>
+  <ciManagement>
+    <system>Jenkins</system>
+    <url>https://builds.apache.org/job/Any23-server/</url>
+  </ciManagement>
+
+  <dependencies>
+    <!-- Any23 Modules -->
+    <dependency>
+      <groupId>org.apache.any23</groupId>
+      <artifactId>apache-any23-core</artifactId>
+      <version>${project.version}</version>
+    </dependency>
+    <dependency>
+      <groupId>org.apache.any23.plugins</groupId>
+      <artifactId>apache-any23-openie</artifactId>
+      <version>${project.version}</version>
+      <scope>provided</scope>
+    </dependency>
+    <dependency>
+      <groupId>org.allenai.openie</groupId>
+      <artifactId>openie_2.11</artifactId>
+      <version>${openie_2.11.version}</version>
+      <scope>provided</scope>
+      <exclusions>
+        <exclusion>
+          <groupId>ch.qos.logback</groupId>
+          <artifactId>logback-classic</artifactId>
+        </exclusion>
+        <exclusion>
+          <groupId>ch.qos.logback</groupId>
+          <artifactId>logback-core</artifactId>
+        </exclusion>
+      </exclusions>
+    </dependency>
+    <dependency>
+      <groupId>org.allenai.openie</groupId>
+      <artifactId>openie_2.11</artifactId>
+      <version>${openie_2.11.version}</version>
+      <scope>provided</scope>
+      <type>pom</type>
+      <exclusions>
+        <exclusion>
+          <groupId>ch.qos.logback</groupId>
+          <artifactId>logback-classic</artifactId>
+        </exclusion>
+        <exclusion>
+          <groupId>ch.qos.logback</groupId>
+          <artifactId>logback-core</artifactId>
+        </exclusion>
+      </exclusions>
+    </dependency>
+    <dependency>
+      <groupId>edu.washington.cs.knowitall</groupId>
+      <artifactId>openregex</artifactId>
+      <version>${openregex.version}</version>
+      <scope>provided</scope>
+    </dependency>
+
+    <!-- BEGIN: Java EE APIs -->
+    <dependency>
+      <groupId>javax.xml.ws</groupId>
+      <artifactId>jaxws-api</artifactId>
+      <version>2.3.1</version>
+    </dependency>
+
+    <!-- BEGIN: Jetty Dependencies -->
+    <dependency>
+      <groupId>org.eclipse.jetty</groupId>
+      <artifactId>jetty-runner</artifactId>
+      <version>${jetty.runner.version}</version>
+      <scope>provided</scope>
+      <optional>true</optional>
+    </dependency>
+    <!-- BEGIN: Test Dependencies -->
+    <dependency>
+      <groupId>org.eclipse.jetty</groupId>
+      <artifactId>jetty-servlet</artifactId>
+      <version>${jetty.runner.version}</version>
+      <scope>test</scope>
+      <classifier>tests</classifier>
+    </dependency>
+    <dependency>
+      <groupId>org.eclipse.jetty</groupId>
+      <artifactId>jetty-http</artifactId>
+      <version>${jetty.runner.version}</version>
+      <scope>test</scope>
+      <classifier>tests</classifier>
+    </dependency>
+    <!-- END:   Jetty Dependencies -->
+    <dependency>
+      <groupId>junit</groupId>
+      <artifactId>junit</artifactId>
+      <version>4.12</version>
+      <scope>test</scope>
+    </dependency>
+    <dependency>
+      <groupId>org.slf4j</groupId>
+      <artifactId>slf4j-log4j12</artifactId>
+      <version>${slf4j.logger.version}</version>
+      <scope>test</scope>
+    </dependency>
+    <!-- END: Test Dependencies -->
+
+  </dependencies>
+
+  <build>
+    <pluginManagement>
+      <plugins>
+        <plugin>
+          <groupId>org.apache.maven.plugins</groupId>
+          <artifactId>maven-clean-plugin</artifactId>
+          <version>${maven-clean-plugin.version}</version>
+        </plugin>
+
+        <plugin>
+          <groupId>org.apache.maven.plugins</groupId>
+          <artifactId>maven-war-plugin</artifactId>
+          <version>${maven-war-plugin.version}</version>
+        </plugin>
+
+        <plugin>
+          <groupId>org.apache.maven.plugins</groupId>
+          <artifactId>maven-invoker-plugin</artifactId>
+          <version>${maven-invoker-plugin.version}</version>
+        </plugin>
+
+        <plugin>
+          <groupId>org.apache.maven.plugins</groupId>
+          <artifactId>maven-deploy-plugin</artifactId>
+          <version>${maven-deploy-plugin.version}</version>
+          <inherited>true</inherited>
+          <configuration>
+            <updateReleaseInfo>true</updateReleaseInfo>
+          </configuration>
+        </plugin>
+
+        <plugin>
+          <groupId>org.apache.maven.plugins</groupId>
+          <artifactId>maven-install-plugin</artifactId>
+          <version>${maven-install-plugin.version}</version>
+        </plugin>
+
+        <plugin>
+          <groupId>org.apache.maven.plugins</groupId>
+          <artifactId>maven-resources-plugin</artifactId>
+          <version>${maven-resources-plugin.version}</version>
+        </plugin>
+
+        <plugin>
+          <groupId>org.codehaus.mojo</groupId>
+          <artifactId>appassembler-maven-plugin</artifactId>
+          <version>${appassembler-maven-plugin.version}</version>
+          <configuration>
+            <repositoryLayout>flat</repositoryLayout>
+            <repositoryName>lib</repositoryName>
+            <extraJvmArguments>-Xms500m -Xmx500m -XX:PermSize=128m -XX:-UseGCOverheadLimit</extraJvmArguments>
+          </configuration>
+        </plugin>
+
+        <plugin>
+          <groupId>org.apache.maven.plugins</groupId>
+          <artifactId>maven-release-plugin</artifactId>
+          <version>${maven-release-plugin.version}</version>
+          <configuration>
+            <preparationGoals>install</preparationGoals>
+            <mavenExecutorId>forked-path</mavenExecutorId>
+            <useReleaseProfile>false</useReleaseProfile>
+            <autoVersionSubmodules>false</autoVersionSubmodules>
+            <tagNameFormat>any23-@{project.version}</tagNameFormat>
+            <arguments>-Dany23.online.test.disabled=true -Prelease,apache</arguments>
+          </configuration>
+          <dependencies>
+            <dependency>
+              <groupId>org.apache.maven.scm</groupId>
+              <artifactId>maven-scm-provider-gitexe</artifactId>
+              <version>1.9</version>
+            </dependency>
+          </dependencies>
+        </plugin>
+
+        <plugin>
+          <groupId>org.apache.maven.plugins</groupId>
+          <artifactId>maven-enforcer-plugin</artifactId>
+          <version>3.0.0-M2</version>
+          <executions>
+            <execution>
+              <id>enforce-maven</id>
+              <goals>
+                <goal>enforce</goal>
+              </goals>
+              <configuration>
+                <rules>
+                  <requireMavenVersion>
+                    <version>3.5.0</version>
+                  </requireMavenVersion>
+                </rules>    
+              </configuration>
+            </execution>
+          </executions>
+        </plugin>
+
+        <plugin>
+          <groupId>org.apache.maven.plugins</groupId>
+          <artifactId>maven-assembly-plugin</artifactId>
+          <version>${maven-assembly-plugin.version}</version>
+          <executions>
+            <execution>
+              <id>assembly</id>
+              <phase>package</phase>
+              <goals>
+                <goal>single</goal>
+              </goals>
+            </execution>
+          </executions>
+          <configuration>
+            <attach>true</attach>
+            <skipAssembly>${assembly.skip}</skipAssembly>
+            <tarLongFileMode>posix</tarLongFileMode>
+          </configuration>
+        </plugin>
+
+      </plugins>
+    </pluginManagement>
+
+    <plugins>
+
+      <plugin>
+        <groupId>org.eclipse.jetty</groupId>
+        <artifactId>jetty-maven-plugin</artifactId>
+        <version>${jetty.runner.version}</version>
+        <configuration>
+          <webAppConfig>
+              <baseResource implementation="org.eclipse.jetty.util.resource.ResourceCollection">
+                  <resourcesAsCSV>src/main</resourcesAsCSV>
+              </baseResource>
+            <contextPath>/${project.artifactId}</contextPath>
+          </webAppConfig>
+        </configuration>
+      </plugin>
+
+      <plugin>
+        <groupId>org.apache.maven.plugins</groupId>
+        <artifactId>maven-war-plugin</artifactId>
+        <configuration>
+          <webResources>
+            <resource>
+              <directory>${basedir}/src/main/resources/</directory>
+              <targetPath>/resources</targetPath>
+              <filtering>true</filtering>
+            </resource>
+          </webResources>
+        </configuration>
+        <executions>
+          <execution>
+            <id>self-contained-war</id>
+            <phase>package</phase>
+            <goals>
+              <goal>war</goal>
+            </goals>
+            <configuration>
+              <webResources>
+                <resource>
+                  <directory>${project.build.directory}/war-legals/with-deps/</directory>
+                  <targetPath>/META-INF</targetPath>
+                </resource>
+              </webResources>
+            </configuration>
+          </execution>
+          <execution>
+            <id>war-without-deps</id>
+            <phase>package</phase>
+            <goals>
+              <goal>war</goal>
+            </goals>
+            <configuration>
+              <classifier>without-deps</classifier>
+              <packagingExcludes>WEB-INF/lib/*.jar</packagingExcludes>
+              <archive>
+                <manifest>
+                  <addClasspath>true</addClasspath>
+                  <classpathPrefix>lib/</classpathPrefix>
+                </manifest>
+              </archive>
+              <webResources>
+                <resource>
+                  <directory>${project.build.directory}/war-legals/without-deps/</directory>
+                  <targetPath>/META-INF</targetPath>
+                </resource>
+              </webResources>
+            </configuration>
+          </execution>
+        </executions>
+      </plugin>
+
+      <!-- Generates the distribution package -->
+      <plugin>
+        <groupId>org.apache.maven.plugins</groupId>
+        <artifactId>maven-assembly-plugin</artifactId>
+        <executions>
+          <execution>
+            <id>prepare-package</id>
+            <phase>prepare-package</phase>
+            <goals>
+              <goal>single</goal>
+            </goals>
+            <configuration>
+              <attach>false</attach>
+              <finalName>war-legals</finalName>
+              <appendAssemblyId>false</appendAssemblyId>
+              <descriptors>
+                <descriptor>${basedir}/src/main/assembly/prepare-war-legals.xml</descriptor>
+              </descriptors>
+            </configuration>
+          </execution>
+        </executions>
+        <configuration>
+          <descriptors>
+            <descriptor>${basedir}/src/main/assembly/with-deps.xml</descriptor>
+            <descriptor>${basedir}/src/main/assembly/without-deps.xml</descriptor>
+            <descriptor>${basedir}/src/main/assembly/server-embedded.xml</descriptor>
+          </descriptors>
+        </configuration>
+      </plugin>
+
+      <!-- Used to provide dynamic OpenIE toggling within service -->
+      <plugin>
+        <groupId>org.apache.maven.plugins</groupId>
+        <artifactId>maven-dependency-plugin</artifactId>
+        <executions>
+          <execution>
+            <id>copy</id>
+            <phase>prepare-package</phase>
+            <goals>
+              <goal>copy-dependencies</goal>
+            </goals>
+            <configuration>
+              <includeScope>provided</includeScope>
+              <outputDirectory>${output.directory}</outputDirectory>
+            </configuration>
+          </execution>
+        </executions>
+      </plugin>
+
+      <!-- Javadoc plugin. -->
+      <plugin>
+        <groupId>org.apache.maven.plugins</groupId>
+        <artifactId>maven-javadoc-plugin</artifactId>
+        <version>${maven-javadoc-plugin.version}</version>
+        <configuration>
+          <!--
+           | Apple's JVM sometimes requires more memory
+          -->
+          <additionalJOption>-J-Xmx1024m</additionalJOption>
+          <source>8</source>
+        </configuration>
+      </plugin>
+
+      <!-- Drop inherited behavior (i.e. don't put any more default LICENSE and NOTICE files in all artifacts) -->
+      <plugin>
+        <groupId>org.apache.maven.plugins</groupId>
+        <artifactId>maven-remote-resources-plugin</artifactId>
+        <executions>
+          <execution>
+            <goals>
+              <goal>process</goal>
+            </goals>
+            <phase>none</phase>
+          </execution>
+        </executions>
+      </plugin>
+
+      <plugin>
+        <groupId>org.codehaus.mojo</groupId>
+        <artifactId>buildnumber-maven-plugin</artifactId>
+        <version>${buildnumber-maven-plugin.version}</version>
+        <executions>
+          <execution>
+            <phase>validate</phase>
+            <goals>
+              <goal>create</goal>
+            </goals>
+          </execution>
+        </executions>
+        <configuration>
+          <doCheck>false</doCheck>
+          <doUpdate>false</doUpdate>
+          <!-- Use committed revision so it does not change every time svn update is run -->
+          <useLastCommittedRevision>true</useLastCommittedRevision>
+          <!-- default revision number if unavailable -->
+          <revisionOnScmFailure>??????</revisionOnScmFailure>
+        </configuration>
+      </plugin>
+
+      <!-- Compiler configuration. -->
+      <plugin>
+        <groupId>org.apache.maven.plugins</groupId>
+        <artifactId>maven-compiler-plugin</artifactId>
+        <version>${maven-compiler-plugin.version}</version>
+        <configuration>
+          <source>${javac.src.version}</source>
+          <target>${javac.target.version}</target>
+        </configuration>
+      </plugin>
+
+      <plugin>
+        <artifactId>maven-jar-plugin</artifactId>
+        <version>${maven-jar-plugin.version}</version>
+        <configuration>
+          <archive>
+            <manifest>
+              <addDefaultImplementationEntries>true</addDefaultImplementationEntries>
+              <addDefaultSpecificationEntries>true</addDefaultSpecificationEntries>
+            </manifest>
+            <manifestEntries>
+              <Implementation-Build>${implementation.build}</Implementation-Build>
+              <Implementation-Build-Date>${maven.build.timestamp}</Implementation-Build-Date>
+              <X-Compile-Source-JDK>${javac.src.version}</X-Compile-Source-JDK>
+              <X-Compile-Target-JDK>${javac.target.version}</X-Compile-Target-JDK>
+            </manifestEntries>
+          </archive>
+        </configuration>
+      </plugin>
+
+      <!-- Test runner configuration. -->
+      <plugin>
+        <groupId>org.apache.maven.plugins</groupId>
+        <artifactId>maven-surefire-plugin</artifactId>
+        <version>${maven-surefire-plugin.version}</version>
+        <configuration>
+          <!--
+            Declaring default file encoding: UTF-8
+            Enabling assertions.
+           -->
+          <argLine>-Dfile.encoding=UTF-8 -ea ${surefire-extra-args}</argLine>
+          <includes>
+            <include>**/*Test.java</include>
+            <include>**/*TestCase.java</include>
+          </includes>
+          <classpathDependencyExcludes>
+            <classpathDependencyExclude>org.apache.any23.plugins:apache-any23-openie</classpathDependencyExclude>
+          </classpathDependencyExcludes>
+        </configuration>
+      </plugin>
+
+      <!-- Test coverage plugin. -->
+      <plugin>
+        <groupId>org.jacoco</groupId>
+        <artifactId>jacoco-maven-plugin</artifactId>
+        <version>${jacoco-maven-plugin.version}</version>
+        <executions>
+          <execution>
+            <id>prepare-agent</id>
+            <goals>
+              <goal>prepare-agent</goal>
+            </goals>
+          </execution>
+        </executions>
+      </plugin>
+
+      <plugin>
+        <groupId>com.github.spotbugs</groupId>
+        <artifactId>spotbugs-maven-plugin</artifactId>
+        <version>${maven-checkstyle-plugin.version}</version>
+      </plugin>
+    </plugins>
+  </build>
+
+  <profiles>
+    <profile>
+      <id>release</id>
+      <build>
+        <resources>
+          <resource>
+            <directory>${basedir}/../</directory>
+            <targetPath>${project.build.directory}/apidocs/META-INF</targetPath>
+            <includes>
+              <include>LICENSE.txt</include>
+              <include>NOTICE.txt</include>
+            </includes>
+          </resource>
+        </resources>
+      </build>
+    </profile>
+  </profiles>
+
+</project>
diff --git a/src/main/assembly/LICENSE-server-embedded.txt b/src/main/assembly/LICENSE-server-embedded.txt
new file mode 100644
index 0000000..ada5751
--- /dev/null
+++ b/src/main/assembly/LICENSE-server-embedded.txt
@@ -0,0 +1,426 @@
+
+                                 Apache License
+                           Version 2.0, January 2004
+                        http://www.apache.org/licenses/
+
+   TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
+
+   1. Definitions.
+
+      "License" shall mean the terms and conditions for use, reproduction,
+      and distribution as defined by Sections 1 through 9 of this document.
+
+      "Licensor" shall mean the copyright owner or entity authorized by
+      the copyright owner that is granting the License.
+
+      "Legal Entity" shall mean the union of the acting entity and all
+      other entities that control, are controlled by, or are under common
+      control with that entity. For the purposes of this definition,
+      "control" means (i) the power, direct or indirect, to cause the
+      direction or management of such entity, whether by contract or
+      otherwise, or (ii) ownership of fifty percent (50%) or more of the
+      outstanding shares, or (iii) beneficial ownership of such entity.
+
+      "You" (or "Your") shall mean an individual or Legal Entity
+      exercising permissions granted by this License.
+
+      "Source" form shall mean the preferred form for making modifications,
+      including but not limited to software source code, documentation
+      source, and configuration files.
+
+      "Object" form shall mean any form resulting from mechanical
+      transformation or translation of a Source form, including but
+      not limited to compiled object code, generated documentation,
+      and conversions to other media types.
+
+      "Work" shall mean the work of authorship, whether in Source or
+      Object form, made available under the License, as indicated by a
+      copyright notice that is included in or attached to the work
+      (an example is provided in the Appendix below).
+
+      "Derivative Works" shall mean any work, whether in Source or Object
+      form, that is based on (or derived from) the Work and for which the
+      editorial revisions, annotations, elaborations, or other modifications
+      represent, as a whole, an original work of authorship. For the purposes
+      of this License, Derivative Works shall not include works that remain
+      separable from, or merely link (or bind by name) to the interfaces of,
+      the Work and Derivative Works thereof.
+
+      "Contribution" shall mean any work of authorship, including
+      the original version of the Work and any modifications or additions
+      to that Work or Derivative Works thereof, that is intentionally
+      submitted to Licensor for inclusion in the Work by the copyright owner
+      or by an individual or Legal Entity authorized to submit on behalf of
+      the copyright owner. For the purposes of this definition, "submitted"
+      means any form of electronic, verbal, or written communication sent
+      to the Licensor or its representatives, including but not limited to
+      communication on electronic mailing lists, source code control systems,
+      and issue tracking systems that are managed by, or on behalf of, the
+      Licensor for the purpose of discussing and improving the Work, but
+      excluding communication that is conspicuously marked or otherwise
+      designated in writing by the copyright owner as "Not a Contribution."
+
+      "Contributor" shall mean Licensor and any individual or Legal Entity
+      on behalf of whom a Contribution has been received by Licensor and
+      subsequently incorporated within the Work.
+
+   2. Grant of Copyright License. Subject to the terms and conditions of
+      this License, each Contributor hereby grants to You a perpetual,
+      worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+      copyright license to reproduce, prepare Derivative Works of,
+      publicly display, publicly perform, sublicense, and distribute the
+      Work and such Derivative Works in Source or Object form.
+
+   3. Grant of Patent License. Subject to the terms and conditions of
+      this License, each Contributor hereby grants to You a perpetual,
+      worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+      (except as stated in this section) patent license to make, have made,
+      use, offer to sell, sell, import, and otherwise transfer the Work,
+      where such license applies only to those patent claims licensable
+      by such Contributor that are necessarily infringed by their
+      Contribution(s) alone or by combination of their Contribution(s)
+      with the Work to which such Contribution(s) was submitted. If You
+      institute patent litigation against any entity (including a
+      cross-claim or counterclaim in a lawsuit) alleging that the Work
+      or a Contribution incorporated within the Work constitutes direct
+      or contributory patent infringement, then any patent licenses
+      granted to You under this License for that Work shall terminate
+      as of the date such litigation is filed.
+
+   4. Redistribution. You may reproduce and distribute copies of the
+      Work or Derivative Works thereof in any medium, with or without
+      modifications, and in Source or Object form, provided that You
+      meet the following conditions:
+
+      (a) You must give any other recipients of the Work or
+          Derivative Works a copy of this License; and
+
+      (b) You must cause any modified files to carry prominent notices
+          stating that You changed the files; and
+
+      (c) You must retain, in the Source form of any Derivative Works
+          that You distribute, all copyright, patent, trademark, and
+          attribution notices from the Source form of the Work,
+          excluding those notices that do not pertain to any part of
+          the Derivative Works; and
+
+      (d) If the Work includes a "NOTICE" text file as part of its
+          distribution, then any Derivative Works that You distribute must
+          include a readable copy of the attribution notices contained
+          within such NOTICE file, excluding those notices that do not
+          pertain to any part of the Derivative Works, in at least one
+          of the following places: within a NOTICE text file distributed
+          as part of the Derivative Works; within the Source form or
+          documentation, if provided along with the Derivative Works; or,
+          within a display generated by the Derivative Works, if and
+          wherever such third-party notices normally appear. The contents
+          of the NOTICE file are for informational purposes only and
+          do not modify the License. You may add Your own attribution
+          notices within Derivative Works that You distribute, alongside
+          or as an addendum to the NOTICE text from the Work, provided
+          that such additional attribution notices cannot be construed
+          as modifying the License.
+
+      You may add Your own copyright statement to Your modifications and
+      may provide additional or different license terms and conditions
+      for use, reproduction, or distribution of Your modifications, or
+      for any such Derivative Works as a whole, provided Your use,
+      reproduction, and distribution of the Work otherwise complies with
+      the conditions stated in this License.
+
+   5. Submission of Contributions. Unless You explicitly state otherwise,
+      any Contribution intentionally submitted for inclusion in the Work
+      by You to the Licensor shall be under the terms and conditions of
+      this License, without any additional terms or conditions.
+      Notwithstanding the above, nothing herein shall supersede or modify
+      the terms of any separate license agreement you may have executed
+      with Licensor regarding such Contributions.
+
+   6. Trademarks. This License does not grant permission to use the trade
+      names, trademarks, service marks, or product names of the Licensor,
+      except as required for reasonable and customary use in describing the
+      origin of the Work and reproducing the content of the NOTICE file.
+
+   7. Disclaimer of Warranty. Unless required by applicable law or
+      agreed to in writing, Licensor provides the Work (and each
+      Contributor provides its Contributions) on an "AS IS" BASIS,
+      WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
+      implied, including, without limitation, any warranties or conditions
+      of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
+      PARTICULAR PURPOSE. You are solely responsible for determining the
+      appropriateness of using or redistributing the Work and assume any
+      risks associated with Your exercise of permissions under this License.
+
+   8. Limitation of Liability. In no event and under no legal theory,
+      whether in tort (including negligence), contract, or otherwise,
+      unless required by applicable law (such as deliberate and grossly
+      negligent acts) or agreed to in writing, shall any Contributor be
+      liable to You for damages, including any direct, indirect, special,
+      incidental, or consequential damages of any character arising as a
+      result of this License or out of the use or inability to use the
+      Work (including but not limited to damages for loss of goodwill,
+      work stoppage, computer failure or malfunction, or any and all
+      other commercial damages or losses), even if such Contributor
+      has been advised of the possibility of such damages.
+
+   9. Accepting Warranty or Additional Liability. While redistributing
+      the Work or Derivative Works thereof, You may choose to offer,
+      and charge a fee for, acceptance of support, warranty, indemnity,
+      or other liability obligations and/or rights consistent with this
+      License. However, in accepting such obligations, You may act only
+      on Your own behalf and on Your sole responsibility, not on behalf
+      of any other Contributor, and only if You agree to indemnify,
+      defend, and hold each Contributor harmless for any liability
+      incurred by, or claims asserted against, such Contributor by reason
+      of your accepting any such warranty or additional liability.
+
+   END OF TERMS AND CONDITIONS
+
+   APPENDIX: How to apply the Apache License to your work.
+
+      To apply the Apache License to your work, attach the following
+      boilerplate notice, with the fields enclosed by brackets "[]"
+      replaced with your own identifying information. (Don't include
+      the brackets!)  The text should be enclosed in the appropriate
+      comment syntax for the file format. We also recommend that a
+      file or class name and description of purpose be included on the
+      same "printed page" as the copyright notice for easier
+      identification within third-party archives.
+
+   Copyright [yyyy] [name of copyright owner]
+
+   Licensed under the Apache License, Version 2.0 (the "License");
+   you may not use this file except in compliance with the License.
+   You may obtain a copy of the License at
+
+       http://www.apache.org/licenses/LICENSE-2.0
+
+   Unless required by applicable law or agreed to in writing, software
+   distributed under the License is distributed on an "AS IS" BASIS,
+   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+   See the License for the specific language governing permissions and
+   limitations under the License.
+
+APACHE ANY23 DEPENDENCIES:
+
+The Apache Any23 distribution packages include a number of dependencies with
+separate copyright notices and license terms. Your use of the binaries for these
+dependencies is subject to the terms and conditions of the following licenses.
+
+For the jQuery component (http://jquery.com/)
+Copyright (c) 2012 John Resig, http://jquery.com/
+
+Permission is hereby granted, free of charge, to any person obtaining
+a copy of this software and associated documentation files (the
+"Software"), to deal in the Software without restriction, including
+without limitation the rights to use, copy, modify, merge, publish,
+distribute, sublicense, and/or sell copies of the Software, and to
+permit persons to whom the Software is furnished to do so, subject to
+the following conditions:
+
+The above copyright notice and this permission notice shall be
+included in all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+
+For the Twitter Bootstrap components (http://twitter.github.com/bootstrap/)
+This is licensed under the The Apache Software License, Version 2.0, see above
+
+For the Eclipse RDF4J components licensed under the Eclipse Distribution 
+License (a BSD-style license) 
+
+   Copyright (c) 2007, Eclipse Foundation, Inc. and its licensors.
+   Copyright Aduna (http://www.aduna-software.com/) 2001-2013
+
+   All rights reserved.
+
+   Redistribution and use in source and binary forms, with or without
+   modification, are permitted provided that the following conditions are met:
+
+   * Redistributions of source code must retain the above copyright notice, this
+     list of conditions and the following disclaimer.
+   * Redistributions in binary form must reproduce the above copyright notice,
+     this list of conditions and the following disclaimer in the documentation
+     and/or other materials provided with the distribution.
+   * Neither the name of the Eclipse Foundation, Inc. nor the names of its
+     contributors may be used to endorse or promote products derived from this
+     software without specific prior written permission.
+
+   THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
+   ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+   WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+   DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR
+   ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+   (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+   LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+   ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+   (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+   SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+For the Jetty Web Container (http://mortbay.com/)
+This is licensed under the Apache License v2.0, see above
+
+For the TagSoup component (http://home.ccil.org/~cowan/XML/tagsoup/)
+This is licensed under the The Apache Software License, Version 2.0, see above
+
+For the Apache Commons HttpClient component (http://hc.apache.org/httpclient-3.x/)
+This is licensed under the The Apache Software License, Version 2.0, see above
+
+For the Apache PDFBox component (http://incubator.apache.org/pdfbox/)
+This is licensed under the The Apache Software License, Version 2.0, see above
+
+For the Apache POI component (http://poi.apache.org/)
+This is licensed under the The Apache Software License, Version 2.0, see above
+
+For the Apache Tika core component (http://lucene.apache.org/tika/)
+This is licensed under the The Apache Software License, Version 2.0, see above
+
+For the Apache Commons Codec component (http://commons.apache.org/codec/)
+This is licensed under the The Apache Software License, Version 2.0, see above
+
+For the Apache Commons CLI component (http://commons.apache.org/cli/)
+This is licensed under the The Apache Software License, Version 2.0, see above
+
+For the Apache Commons CSV (Sandbox) component (http://commons.apache.org/sandbox/csv/)
+This is licensed under the The Apache Software License, Version 2.0, see above
+
+For the Apache Commons Compress component (http://commons.apache.org/compress/)
+This is licensed under the The Apache Software License, Version 2.0, see above
+
+For the Apache Commons Lang component (http://commons.apache.org/lang/)
+This is licensed under the The Apache Software License, Version 2.0, see above
+
+For the Apache FontBox component (http://www.apache.org/fontbox/)
+This is licensed under the The Apache Software License, Version 2.0, see above
+
+For the Apache Jempbox component (http://www.apache.org/jempbox/)
+This is licensed under the The Apache Software License, Version 2.0, see above
+
+For the Apache Log4j component (http://logging.apache.org/log4j/docs/)
+This is licensed under the The Apache Software License, Version 2.0, see above
+
+For the Apache Commons Logging component (http://commons.apache.org/logging/)
+This is licensed under the The Apache Software License, Version 2.0, see above
+
+For the Neko HTML component (http://nekohtml.sourceforge.net/)
+This is licensed under the The Apache Software License, Version 2.0, see above
+
+For the STAX API 1.0 component (http://geronimo.apache.org/specs/geronimo-stax-api_1.0_spec)
+This is licensed under the The Apache Software License, Version 2.0, see above
+
+For the Apache XML Commons External components component (http://xml.apache.org/commons/components/external/)
+This is licensed under the The Apache Software License, Version 2.0, see above
+
+For the Apache Xerces2 Java Parser component (http://xerces.apache.org/xerces2-j)
+This is licensed under the The Apache Software License, Version 2.0, see above
+Portions of this software were originally based on the following:
+- software copyright (c) 1999, IBM Corporation., http://www.ibm.com.
+- software copyright (c) 1999, Sun Microsystems., http://www.sun.com.
+- voluntary contributions made by Paul Eng on behalf of the
+  Apache Software Foundation that were originally developed at
+  iClick, Inc., software copyright (c) 1999.
+
+For the Apache XmlBeans component (http://xmlbeans.apache.org)
+This is licensed under the The Apache Software License, Version 2.0, see above
+
+For the ASM component (http://asm.ow2.org/)
+Copyright (c) 2000-2011 INRIA, France Telecom
+All rights reserved.
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions
+are met:
+
+1. Redistributions of source code must retain the above copyright
+   notice, this list of conditions and the following disclaimer.
+
+2. Redistributions in binary form must reproduce the above copyright
+   notice, this list of conditions and the following disclaimer in the
+   documentation and/or other materials provided with the distribution.
+
+3. Neither the name of the copyright holders nor the names of its
+   contributors may be used to endorse or promote products derived from
+   this software without specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
+LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
+THE POSSIBILITY OF SUCH DAMAGE.
+
+For the SLF4J components (http://www.slf4j.org)
+Copyright (c) 2004-2011 QOS.ch
+ All rights reserved.
+
+ Permission is hereby granted, free  of charge, to any person obtaining
+ a  copy  of this  software  and  associated  documentation files  (the
+ "Software"), to  deal in  the Software without  restriction, including
+ without limitation  the rights to  use, copy, modify,  merge, publish,
+ distribute,  sublicense, and/or sell  copies of  the Software,  and to
+ permit persons to whom the Software  is furnished to do so, subject to
+ the following conditions:
+
+ The  above  copyright  notice  and  this permission  notice  shall  be
+ included in all copies or substantial portions of the Software.
+
+ THE  SOFTWARE IS  PROVIDED  "AS  IS", WITHOUT  WARRANTY  OF ANY  KIND,
+ EXPRESS OR  IMPLIED, INCLUDING  BUT NOT LIMITED  TO THE  WARRANTIES OF
+ MERCHANTABILITY,    FITNESS    FOR    A   PARTICULAR    PURPOSE    AND
+ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+ LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+ OF CONTRACT, TORT OR OTHERWISE,  ARISING FROM, OUT OF OR IN CONNECTION
+ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+
+For the dom4j component (http://dom4j.org)
+Copyright 2001-2010 (C) MetaStuff, Ltd. All Rights Reserved.
+
+Redistribution and use of this software and associated documentation
+("Software"), with or without modification, are permitted provided
+that the following conditions are met:
+
+1. Redistributions of source code must retain copyright
+   statements and notices.  Redistributions must also contain a
+   copy of this document.
+ 
+2. Redistributions in binary form must reproduce the
+   above copyright notice, this list of conditions and the
+   following disclaimer in the documentation and/or other
+   materials provided with the distribution.
+ 
+3. The name "DOM4J" must not be used to endorse or promote
+   products derived from this Software without prior written
+   permission of MetaStuff, Ltd.  For written permission,
+   please contact dom4j-info@metastuff.com.
+ 
+4. Products derived from this Software may not be called "DOM4J"
+   nor may "DOM4J" appear in their names without prior written
+   permission of MetaStuff, Ltd. DOM4J is a registered
+   trademark of MetaStuff, Ltd.
+ 
+5. Due credit should be given to the DOM4J Project - 
+   http://dom4j.sourceforge.net
+ 
+THIS SOFTWARE IS PROVIDED BY METASTUFF, LTD. AND CONTRIBUTORS
+``AS IS'' AND ANY EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT
+NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL
+METASTUFF, LTD. OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
+INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
+STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
+OF THE POSSIBILITY OF SUCH DAMAGE.
diff --git a/src/main/assembly/LICENSE-with-deps.txt b/src/main/assembly/LICENSE-with-deps.txt
new file mode 100644
index 0000000..c480f37
--- /dev/null
+++ b/src/main/assembly/LICENSE-with-deps.txt
@@ -0,0 +1,426 @@
+
+                                 Apache License
+                           Version 2.0, January 2004
+                        http://www.apache.org/licenses/
+
+   TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
+
+   1. Definitions.
+
+      "License" shall mean the terms and conditions for use, reproduction,
+      and distribution as defined by Sections 1 through 9 of this document.
+
+      "Licensor" shall mean the copyright owner or entity authorized by
+      the copyright owner that is granting the License.
+
+      "Legal Entity" shall mean the union of the acting entity and all
+      other entities that control, are controlled by, or are under common
+      control with that entity. For the purposes of this definition,
+      "control" means (i) the power, direct or indirect, to cause the
+      direction or management of such entity, whether by contract or
+      otherwise, or (ii) ownership of fifty percent (50%) or more of the
+      outstanding shares, or (iii) beneficial ownership of such entity.
+
+      "You" (or "Your") shall mean an individual or Legal Entity
+      exercising permissions granted by this License.
+
+      "Source" form shall mean the preferred form for making modifications,
+      including but not limited to software source code, documentation
+      source, and configuration files.
+
+      "Object" form shall mean any form resulting from mechanical
+      transformation or translation of a Source form, including but
+      not limited to compiled object code, generated documentation,
+      and conversions to other media types.
+
+      "Work" shall mean the work of authorship, whether in Source or
+      Object form, made available under the License, as indicated by a
+      copyright notice that is included in or attached to the work
+      (an example is provided in the Appendix below).
+
+      "Derivative Works" shall mean any work, whether in Source or Object
+      form, that is based on (or derived from) the Work and for which the
+      editorial revisions, annotations, elaborations, or other modifications
+      represent, as a whole, an original work of authorship. For the purposes
+      of this License, Derivative Works shall not include works that remain
+      separable from, or merely link (or bind by name) to the interfaces of,
+      the Work and Derivative Works thereof.
+
+      "Contribution" shall mean any work of authorship, including
+      the original version of the Work and any modifications or additions
+      to that Work or Derivative Works thereof, that is intentionally
+      submitted to Licensor for inclusion in the Work by the copyright owner
+      or by an individual or Legal Entity authorized to submit on behalf of
+      the copyright owner. For the purposes of this definition, "submitted"
+      means any form of electronic, verbal, or written communication sent
+      to the Licensor or its representatives, including but not limited to
+      communication on electronic mailing lists, source code control systems,
+      and issue tracking systems that are managed by, or on behalf of, the
+      Licensor for the purpose of discussing and improving the Work, but
+      excluding communication that is conspicuously marked or otherwise
+      designated in writing by the copyright owner as "Not a Contribution."
+
+      "Contributor" shall mean Licensor and any individual or Legal Entity
+      on behalf of whom a Contribution has been received by Licensor and
+      subsequently incorporated within the Work.
+
+   2. Grant of Copyright License. Subject to the terms and conditions of
+      this License, each Contributor hereby grants to You a perpetual,
+      worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+      copyright license to reproduce, prepare Derivative Works of,
+      publicly display, publicly perform, sublicense, and distribute the
+      Work and such Derivative Works in Source or Object form.
+
+   3. Grant of Patent License. Subject to the terms and conditions of
+      this License, each Contributor hereby grants to You a perpetual,
+      worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+      (except as stated in this section) patent license to make, have made,
+      use, offer to sell, sell, import, and otherwise transfer the Work,
+      where such license applies only to those patent claims licensable
+      by such Contributor that are necessarily infringed by their
+      Contribution(s) alone or by combination of their Contribution(s)
+      with the Work to which such Contribution(s) was submitted. If You
+      institute patent litigation against any entity (including a
+      cross-claim or counterclaim in a lawsuit) alleging that the Work
+      or a Contribution incorporated within the Work constitutes direct
+      or contributory patent infringement, then any patent licenses
+      granted to You under this License for that Work shall terminate
+      as of the date such litigation is filed.
+
+   4. Redistribution. You may reproduce and distribute copies of the
+      Work or Derivative Works thereof in any medium, with or without
+      modifications, and in Source or Object form, provided that You
+      meet the following conditions:
+
+      (a) You must give any other recipients of the Work or
+          Derivative Works a copy of this License; and
+
+      (b) You must cause any modified files to carry prominent notices
+          stating that You changed the files; and
+
+      (c) You must retain, in the Source form of any Derivative Works
+          that You distribute, all copyright, patent, trademark, and
+          attribution notices from the Source form of the Work,
+          excluding those notices that do not pertain to any part of
+          the Derivative Works; and
+
+      (d) If the Work includes a "NOTICE" text file as part of its
+          distribution, then any Derivative Works that You distribute must
+          include a readable copy of the attribution notices contained
+          within such NOTICE file, excluding those notices that do not
+          pertain to any part of the Derivative Works, in at least one
+          of the following places: within a NOTICE text file distributed
+          as part of the Derivative Works; within the Source form or
+          documentation, if provided along with the Derivative Works; or,
+          within a display generated by the Derivative Works, if and
+          wherever such third-party notices normally appear. The contents
+          of the NOTICE file are for informational purposes only and
+          do not modify the License. You may add Your own attribution
+          notices within Derivative Works that You distribute, alongside
+          or as an addendum to the NOTICE text from the Work, provided
+          that such additional attribution notices cannot be construed
+          as modifying the License.
+
+      You may add Your own copyright statement to Your modifications and
+      may provide additional or different license terms and conditions
+      for use, reproduction, or distribution of Your modifications, or
+      for any such Derivative Works as a whole, provided Your use,
+      reproduction, and distribution of the Work otherwise complies with
+      the conditions stated in this License.
+
+   5. Submission of Contributions. Unless You explicitly state otherwise,
+      any Contribution intentionally submitted for inclusion in the Work
+      by You to the Licensor shall be under the terms and conditions of
+      this License, without any additional terms or conditions.
+      Notwithstanding the above, nothing herein shall supersede or modify
+      the terms of any separate license agreement you may have executed
+      with Licensor regarding such Contributions.
+
+   6. Trademarks. This License does not grant permission to use the trade
+      names, trademarks, service marks, or product names of the Licensor,
+      except as required for reasonable and customary use in describing the
+      origin of the Work and reproducing the content of the NOTICE file.
+
+   7. Disclaimer of Warranty. Unless required by applicable law or
+      agreed to in writing, Licensor provides the Work (and each
+      Contributor provides its Contributions) on an "AS IS" BASIS,
+      WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
+      implied, including, without limitation, any warranties or conditions
+      of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
+      PARTICULAR PURPOSE. You are solely responsible for determining the
+      appropriateness of using or redistributing the Work and assume any
+      risks associated with Your exercise of permissions under this License.
+
+   8. Limitation of Liability. In no event and under no legal theory,
+      whether in tort (including negligence), contract, or otherwise,
+      unless required by applicable law (such as deliberate and grossly
+      negligent acts) or agreed to in writing, shall any Contributor be
+      liable to You for damages, including any direct, indirect, special,
+      incidental, or consequential damages of any character arising as a
+      result of this License or out of the use or inability to use the
+      Work (including but not limited to damages for loss of goodwill,
+      work stoppage, computer failure or malfunction, or any and all
+      other commercial damages or losses), even if such Contributor
+      has been advised of the possibility of such damages.
+
+   9. Accepting Warranty or Additional Liability. While redistributing
+      the Work or Derivative Works thereof, You may choose to offer,
+      and charge a fee for, acceptance of support, warranty, indemnity,
+      or other liability obligations and/or rights consistent with this
+      License. However, in accepting such obligations, You may act only
+      on Your own behalf and on Your sole responsibility, not on behalf
+      of any other Contributor, and only if You agree to indemnify,
+      defend, and hold each Contributor harmless for any liability
+      incurred by, or claims asserted against, such Contributor by reason
+      of your accepting any such warranty or additional liability.
+
+   END OF TERMS AND CONDITIONS
+
+   APPENDIX: How to apply the Apache License to your work.
+
+      To apply the Apache License to your work, attach the following
+      boilerplate notice, with the fields enclosed by brackets "[]"
+      replaced with your own identifying information. (Don't include
+      the brackets!)  The text should be enclosed in the appropriate
+      comment syntax for the file format. We also recommend that a
+      file or class name and description of purpose be included on the
+      same "printed page" as the copyright notice for easier
+      identification within third-party archives.
+
+   Copyright [yyyy] [name of copyright owner]
+
+   Licensed under the Apache License, Version 2.0 (the "License");
+   you may not use this file except in compliance with the License.
+   You may obtain a copy of the License at
+
+       http://www.apache.org/licenses/LICENSE-2.0
+
+   Unless required by applicable law or agreed to in writing, software
+   distributed under the License is distributed on an "AS IS" BASIS,
+   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+   See the License for the specific language governing permissions and
+   limitations under the License.
+
+APACHE ANY23 DEPENDENCIES:
+
+The Apache Any23 distribution packages include a number of dependencies with
+separate copyright notices and license terms. Your use of the binaries for these
+dependencies is subject to the terms and conditions of the following licenses.
+
+For the jQuery component (http://jquery.com/)
+Copyright (c) 2012 John Resig, http://jquery.com/
+
+Permission is hereby granted, free of charge, to any person obtaining
+a copy of this software and associated documentation files (the
+"Software"), to deal in the Software without restriction, including
+without limitation the rights to use, copy, modify, merge, publish,
+distribute, sublicense, and/or sell copies of the Software, and to
+permit persons to whom the Software is furnished to do so, subject to
+the following conditions:
+
+The above copyright notice and this permission notice shall be
+included in all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+
+For the Twitter Bootstrap component (http://twitter.github.com/bootstrap/)
+This is licensed under the The Apache Software License, Version 2.0, see above
+
+For the simplePopup components (http://www.phpixel.fr/simple-popup/)
+TO BE DEFINED
+
+For the Eclipse RDF4J components licensed under the Eclipse Distribution 
+License (a BSD-style license) 
+
+   Copyright (c) 2007, Eclipse Foundation, Inc. and its licensors.
+   Copyright Aduna (http://www.aduna-software.com/) 2001-2013
+
+   All rights reserved.
+
+   Redistribution and use in source and binary forms, with or without
+   modification, are permitted provided that the following conditions are met:
+
+   * Redistributions of source code must retain the above copyright notice, this
+     list of conditions and the following disclaimer.
+   * Redistributions in binary form must reproduce the above copyright notice,
+     this list of conditions and the following disclaimer in the documentation
+     and/or other materials provided with the distribution.
+   * Neither the name of the Eclipse Foundation, Inc. nor the names of its
+     contributors may be used to endorse or promote products derived from this
+     software without specific prior written permission.
+
+   THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
+   ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+   WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+   DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR
+   ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+   (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+   LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+   ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+   (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+   SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+For the TagSoup component (http://home.ccil.org/~cowan/XML/tagsoup/)
+This is licensed under the The Apache Software License, Version 2.0, see above
+
+For the Apache Commons HttpClient component (http://hc.apache.org/httpclient-3.x/)
+This is licensed under the The Apache Software License, Version 2.0, see above
+
+For the Apache PDFBox component (http://incubator.apache.org/pdfbox/)
+This is licensed under the The Apache Software License, Version 2.0, see above
+
+For the Apache POI component (http://poi.apache.org/)
+This is licensed under the The Apache Software License, Version 2.0, see above
+
+For the Apache Tika core component (http://lucene.apache.org/tika/)
+This is licensed under the The Apache Software License, Version 2.0, see above
+
+For the Apache Commons Codec component (http://commons.apache.org/codec/)
+This is licensed under the The Apache Software License, Version 2.0, see above
+
+For the Apache Commons CLI component (http://commons.apache.org/cli/)
+This is licensed under the The Apache Software License, Version 2.0, see above
+
+For the Apache Commons CSV (Sandbox) component (http://commons.apache.org/sandbox/csv/)
+This is licensed under the The Apache Software License, Version 2.0, see above
+
+For the Apache Commons Compress component (http://commons.apache.org/compress/)
+This is licensed under the The Apache Software License, Version 2.0, see above
+
+For the Apache Commons Lang component (http://commons.apache.org/lang/)
+This is licensed under the The Apache Software License, Version 2.0, see above
+
+For the Apache FontBox component (http://www.apache.org/fontbox/)
+This is licensed under the The Apache Software License, Version 2.0, see above
+
+For the Apache Jempbox component (http://www.apache.org/jempbox/)
+This is licensed under the The Apache Software License, Version 2.0, see above
+
+For the Apache Log4j component (http://logging.apache.org/log4j/docs/)
+This is licensed under the The Apache Software License, Version 2.0, see above
+
+For the Apache Commons Logging component (http://commons.apache.org/logging/)
+This is licensed under the The Apache Software License, Version 2.0, see above
+
+For the Neko HTML component (http://nekohtml.sourceforge.net/)
+This is licensed under the The Apache Software License, Version 2.0, see above
+
+For the STAX API 1.0 component (http://geronimo.apache.org/specs/geronimo-stax-api_1.0_spec)
+This is licensed under the The Apache Software License, Version 2.0, see above
+
+For the Apache XML Commons External components component (http://xml.apache.org/commons/components/external/)
+This is licensed under the The Apache Software License, Version 2.0, see above
+
+For the Apache Xerces2 Java Parser component (http://xerces.apache.org/xerces2-j)
+This is licensed under the The Apache Software License, Version 2.0, see above
+Portions of this software were originally based on the following:
+- software copyright (c) 1999, IBM Corporation., http://www.ibm.com.
+- software copyright (c) 1999, Sun Microsystems., http://www.sun.com.
+- voluntary contributions made by Paul Eng on behalf of the
+  Apache Software Foundation that were originally developed at
+  iClick, Inc., software copyright (c) 1999.
+
+For the Apache XmlBeans component (http://xmlbeans.apache.org)
+This is licensed under the The Apache Software License, Version 2.0, see above
+
+For the ASM component (http://asm.ow2.org/)
+Copyright (c) 2000-2011 INRIA, France Telecom
+All rights reserved.
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions
+are met:
+
+1. Redistributions of source code must retain the above copyright
+   notice, this list of conditions and the following disclaimer.
+
+2. Redistributions in binary form must reproduce the above copyright
+   notice, this list of conditions and the following disclaimer in the
+   documentation and/or other materials provided with the distribution.
+
+3. Neither the name of the copyright holders nor the names of its
+   contributors may be used to endorse or promote products derived from
+   this software without specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
+LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
+THE POSSIBILITY OF SUCH DAMAGE.
+
+For the SLF4J components (http://www.slf4j.org)
+Copyright (c) 2004-2011 QOS.ch
+ All rights reserved.
+
+ Permission is hereby granted, free  of charge, to any person obtaining
+ a  copy  of this  software  and  associated  documentation files  (the
+ "Software"), to  deal in  the Software without  restriction, including
+ without limitation  the rights to  use, copy, modify,  merge, publish,
+ distribute,  sublicense, and/or sell  copies of  the Software,  and to
+ permit persons to whom the Software  is furnished to do so, subject to
+ the following conditions:
+
+ The  above  copyright  notice  and  this permission  notice  shall  be
+ included in all copies or substantial portions of the Software.
+
+ THE  SOFTWARE IS  PROVIDED  "AS  IS", WITHOUT  WARRANTY  OF ANY  KIND,
+ EXPRESS OR  IMPLIED, INCLUDING  BUT NOT LIMITED  TO THE  WARRANTIES OF
+ MERCHANTABILITY,    FITNESS    FOR    A   PARTICULAR    PURPOSE    AND
+ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+ LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+ OF CONTRACT, TORT OR OTHERWISE,  ARISING FROM, OUT OF OR IN CONNECTION
+ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+
+For the dom4j component (http://dom4j.org)
+Copyright 2001-2010 (C) MetaStuff, Ltd. All Rights Reserved.
+
+Redistribution and use of this software and associated documentation
+("Software"), with or without modification, are permitted provided
+that the following conditions are met:
+
+1. Redistributions of source code must retain copyright
+   statements and notices.  Redistributions must also contain a
+   copy of this document.
+ 
+2. Redistributions in binary form must reproduce the
+   above copyright notice, this list of conditions and the
+   following disclaimer in the documentation and/or other
+   materials provided with the distribution.
+ 
+3. The name "DOM4J" must not be used to endorse or promote
+   products derived from this Software without prior written
+   permission of MetaStuff, Ltd.  For written permission,
+   please contact dom4j-info@metastuff.com.
+ 
+4. Products derived from this Software may not be called "DOM4J"
+   nor may "DOM4J" appear in their names without prior written
+   permission of MetaStuff, Ltd. DOM4J is a registered
+   trademark of MetaStuff, Ltd.
+ 
+5. Due credit should be given to the DOM4J Project - 
+   http://dom4j.sourceforge.net
+ 
+THIS SOFTWARE IS PROVIDED BY METASTUFF, LTD. AND CONTRIBUTORS
+``AS IS'' AND ANY EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT
+NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL
+METASTUFF, LTD. OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
+INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
+STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
+OF THE POSSIBILITY OF SUCH DAMAGE.
diff --git a/src/main/assembly/LICENSE-without-deps.txt b/src/main/assembly/LICENSE-without-deps.txt
new file mode 100644
index 0000000..1c75f93
--- /dev/null
+++ b/src/main/assembly/LICENSE-without-deps.txt
@@ -0,0 +1,233 @@
+
+                                 Apache License
+                           Version 2.0, January 2004
+                        http://www.apache.org/licenses/
+
+   TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
+
+   1. Definitions.
+
+      "License" shall mean the terms and conditions for use, reproduction,
+      and distribution as defined by Sections 1 through 9 of this document.
+
+      "Licensor" shall mean the copyright owner or entity authorized by
+      the copyright owner that is granting the License.
+
+      "Legal Entity" shall mean the union of the acting entity and all
+      other entities that control, are controlled by, or are under common
+      control with that entity. For the purposes of this definition,
+      "control" means (i) the power, direct or indirect, to cause the
+      direction or management of such entity, whether by contract or
+      otherwise, or (ii) ownership of fifty percent (50%) or more of the
+      outstanding shares, or (iii) beneficial ownership of such entity.
+
+      "You" (or "Your") shall mean an individual or Legal Entity
+      exercising permissions granted by this License.
+
+      "Source" form shall mean the preferred form for making modifications,
+      including but not limited to software source code, documentation
+      source, and configuration files.
+
+      "Object" form shall mean any form resulting from mechanical
+      transformation or translation of a Source form, including but
+      not limited to compiled object code, generated documentation,
+      and conversions to other media types.
+
+      "Work" shall mean the work of authorship, whether in Source or
+      Object form, made available under the License, as indicated by a
+      copyright notice that is included in or attached to the work
+      (an example is provided in the Appendix below).
+
+      "Derivative Works" shall mean any work, whether in Source or Object
+      form, that is based on (or derived from) the Work and for which the
+      editorial revisions, annotations, elaborations, or other modifications
+      represent, as a whole, an original work of authorship. For the purposes
+      of this License, Derivative Works shall not include works that remain
+      separable from, or merely link (or bind by name) to the interfaces of,
+      the Work and Derivative Works thereof.
+
+      "Contribution" shall mean any work of authorship, including
+      the original version of the Work and any modifications or additions
+      to that Work or Derivative Works thereof, that is intentionally
+      submitted to Licensor for inclusion in the Work by the copyright owner
+      or by an individual or Legal Entity authorized to submit on behalf of
+      the copyright owner. For the purposes of this definition, "submitted"
+      means any form of electronic, verbal, or written communication sent
+      to the Licensor or its representatives, including but not limited to
+      communication on electronic mailing lists, source code control systems,
+      and issue tracking systems that are managed by, or on behalf of, the
+      Licensor for the purpose of discussing and improving the Work, but
+      excluding communication that is conspicuously marked or otherwise
+      designated in writing by the copyright owner as "Not a Contribution."
+
+      "Contributor" shall mean Licensor and any individual or Legal Entity
+      on behalf of whom a Contribution has been received by Licensor and
+      subsequently incorporated within the Work.
+
+   2. Grant of Copyright License. Subject to the terms and conditions of
+      this License, each Contributor hereby grants to You a perpetual,
+      worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+      copyright license to reproduce, prepare Derivative Works of,
+      publicly display, publicly perform, sublicense, and distribute the
+      Work and such Derivative Works in Source or Object form.
+
+   3. Grant of Patent License. Subject to the terms and conditions of
+      this License, each Contributor hereby grants to You a perpetual,
+      worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+      (except as stated in this section) patent license to make, have made,
+      use, offer to sell, sell, import, and otherwise transfer the Work,
+      where such license applies only to those patent claims licensable
+      by such Contributor that are necessarily infringed by their
+      Contribution(s) alone or by combination of their Contribution(s)
+      with the Work to which such Contribution(s) was submitted. If You
+      institute patent litigation against any entity (including a
+      cross-claim or counterclaim in a lawsuit) alleging that the Work
+      or a Contribution incorporated within the Work constitutes direct
+      or contributory patent infringement, then any patent licenses
+      granted to You under this License for that Work shall terminate
+      as of the date such litigation is filed.
+
+   4. Redistribution. You may reproduce and distribute copies of the
+      Work or Derivative Works thereof in any medium, with or without
+      modifications, and in Source or Object form, provided that You
+      meet the following conditions:
+
+      (a) You must give any other recipients of the Work or
+          Derivative Works a copy of this License; and
+
+      (b) You must cause any modified files to carry prominent notices
+          stating that You changed the files; and
+
+      (c) You must retain, in the Source form of any Derivative Works
+          that You distribute, all copyright, patent, trademark, and
+          attribution notices from the Source form of the Work,
+          excluding those notices that do not pertain to any part of
+          the Derivative Works; and
+
+      (d) If the Work includes a "NOTICE" text file as part of its
+          distribution, then any Derivative Works that You distribute must
+          include a readable copy of the attribution notices contained
+          within such NOTICE file, excluding those notices that do not
+          pertain to any part of the Derivative Works, in at least one
+          of the following places: within a NOTICE text file distributed
+          as part of the Derivative Works; within the Source form or
+          documentation, if provided along with the Derivative Works; or,
+          within a display generated by the Derivative Works, if and
+          wherever such third-party notices normally appear. The contents
+          of the NOTICE file are for informational purposes only and
+          do not modify the License. You may add Your own attribution
+          notices within Derivative Works that You distribute, alongside
+          or as an addendum to the NOTICE text from the Work, provided
+          that such additional attribution notices cannot be construed
+          as modifying the License.
+
+      You may add Your own copyright statement to Your modifications and
+      may provide additional or different license terms and conditions
+      for use, reproduction, or distribution of Your modifications, or
+      for any such Derivative Works as a whole, provided Your use,
+      reproduction, and distribution of the Work otherwise complies with
+      the conditions stated in this License.
+
+   5. Submission of Contributions. Unless You explicitly state otherwise,
+      any Contribution intentionally submitted for inclusion in the Work
+      by You to the Licensor shall be under the terms and conditions of
+      this License, without any additional terms or conditions.
+      Notwithstanding the above, nothing herein shall supersede or modify
+      the terms of any separate license agreement you may have executed
+      with Licensor regarding such Contributions.
+
+   6. Trademarks. This License does not grant permission to use the trade
+      names, trademarks, service marks, or product names of the Licensor,
+      except as required for reasonable and customary use in describing the
+      origin of the Work and reproducing the content of the NOTICE file.
+
+   7. Disclaimer of Warranty. Unless required by applicable law or
+      agreed to in writing, Licensor provides the Work (and each
+      Contributor provides its Contributions) on an "AS IS" BASIS,
+      WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
+      implied, including, without limitation, any warranties or conditions
+      of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
+      PARTICULAR PURPOSE. You are solely responsible for determining the
+      appropriateness of using or redistributing the Work and assume any
+      risks associated with Your exercise of permissions under this License.
+
+   8. Limitation of Liability. In no event and under no legal theory,
+      whether in tort (including negligence), contract, or otherwise,
+      unless required by applicable law (such as deliberate and grossly
+      negligent acts) or agreed to in writing, shall any Contributor be
+      liable to You for damages, including any direct, indirect, special,
+      incidental, or consequential damages of any character arising as a
+      result of this License or out of the use or inability to use the
+      Work (including but not limited to damages for loss of goodwill,
+      work stoppage, computer failure or malfunction, or any and all
+      other commercial damages or losses), even if such Contributor
+      has been advised of the possibility of such damages.
+
+   9. Accepting Warranty or Additional Liability. While redistributing
+      the Work or Derivative Works thereof, You may choose to offer,
+      and charge a fee for, acceptance of support, warranty, indemnity,
+      or other liability obligations and/or rights consistent with this
+      License. However, in accepting such obligations, You may act only
+      on Your own behalf and on Your sole responsibility, not on behalf
+      of any other Contributor, and only if You agree to indemnify,
+      defend, and hold each Contributor harmless for any liability
+      incurred by, or claims asserted against, such Contributor by reason
+      of your accepting any such warranty or additional liability.
+
+   END OF TERMS AND CONDITIONS
+
+   APPENDIX: How to apply the Apache License to your work.
+
+      To apply the Apache License to your work, attach the following
+      boilerplate notice, with the fields enclosed by brackets "[]"
+      replaced with your own identifying information. (Don't include
+      the brackets!)  The text should be enclosed in the appropriate
+      comment syntax for the file format. We also recommend that a
+      file or class name and description of purpose be included on the
+      same "printed page" as the copyright notice for easier
+      identification within third-party archives.
+
+   Copyright [yyyy] [name of copyright owner]
+
+   Licensed under the Apache License, Version 2.0 (the "License");
+   you may not use this file except in compliance with the License.
+   You may obtain a copy of the License at
+
+       http://www.apache.org/licenses/LICENSE-2.0
+
+   Unless required by applicable law or agreed to in writing, software
+   distributed under the License is distributed on an "AS IS" BASIS,
+   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+   See the License for the specific language governing permissions and
+   limitations under the License.
+
+APACHE ANY23 DEPENDENCIES:
+
+The Apache Any23 distribution packages include a number of dependencies with
+separate copyright notices and license terms. Your use of the binaries for these
+dependencies is subject to the terms and conditions of the following licenses.
+
+For the jQuery component (http://jquery.com/)
+Copyright (c) 2012 John Resig, http://jquery.com/
+
+Permission is hereby granted, free of charge, to any person obtaining
+a copy of this software and associated documentation files (the
+"Software"), to deal in the Software without restriction, including
+without limitation the rights to use, copy, modify, merge, publish,
+distribute, sublicense, and/or sell copies of the Software, and to
+permit persons to whom the Software is furnished to do so, subject to
+the following conditions:
+
+The above copyright notice and this permission notice shall be
+included in all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+
+For the Twitter Bootstrap components (http://twitter.github.com/bootstrap/)
+This is licensed under the The Apache Software License, Version 2.0, see above
diff --git a/src/main/assembly/NOTICE-server-embedded.txt b/src/main/assembly/NOTICE-server-embedded.txt
new file mode 100644
index 0000000..7566350
--- /dev/null
+++ b/src/main/assembly/NOTICE-server-embedded.txt
@@ -0,0 +1,29 @@
+Apache Any23
+Copyright 2011-2018 The Apache Software Foundation
+Copyright 2008-2011 Digital Enterprise Research Institute (DERI)
+
+This product includes software developed by
+The Apache Software Foundation (http://www.apache.org/).
+
+Jetty Web Container
+Copyright 1995-2012 Mort Bay Consulting Pty Ltd.
+
+The Jetty Web Container includes:
+UnixCrypt.java
+Copyright 1996 Aki Yoshida,
+modified April 2001  by Iris Van den Broeke, Daniel Deville.
+
+This product includes software developed by
+Aduna Software (http://www.aduna-software.org/)
+
+This product includes software developed by
+MetaStuff, Ltd. (http://dom4j.org)
+
+ASM - Copyright (c) 2000-2011 INRIA, France Telecom
+All rights reserved. (http://asm.ow2.org/)
+
+This product includes software developed by
+jQuery Foundation (http://jquery.org/)
+
+This product includes software developed by
+Twitter, Inc (http://twitter.github.com/bootstrap/)
diff --git a/src/main/assembly/NOTICE-with-deps.txt b/src/main/assembly/NOTICE-with-deps.txt
new file mode 100644
index 0000000..7ecdddd
--- /dev/null
+++ b/src/main/assembly/NOTICE-with-deps.txt
@@ -0,0 +1,21 @@
+Apache Any23
+Copyright 2011-2018 The Apache Software Foundation
+Copyright 2008-2011 Digital Enterprise Research Institute (DERI)
+
+This product includes software developed by
+The Apache Software Foundation (http://www.apache.org/).
+
+This product includes software developed by
+Aduna Software (http://www.aduna-software.org/)
+
+This product includes software developed by
+MetaStuff, Ltd. (http://dom4j.org)
+
+ASM - Copyright (c) 2000-2011 INRIA, France Telecom
+All rights reserved. (http://asm.ow2.org/)
+
+This product includes software developed by
+jQuery Foundation (http://jquery.org/)
+
+This product includes software developed by
+Twitter, Inc (http://twitter.github.com/bootstrap/)
diff --git a/src/main/assembly/NOTICE-without-deps.txt b/src/main/assembly/NOTICE-without-deps.txt
new file mode 100644
index 0000000..e2af4e5
--- /dev/null
+++ b/src/main/assembly/NOTICE-without-deps.txt
@@ -0,0 +1,12 @@
+Apache Any23
+Copyright 2011-2018 The Apache Software Foundation
+Copyright 2008-2011 Digital Enterprise Research Institute (DERI)
+
+This product includes software developed by
+The Apache Software Foundation (http://www.apache.org/).
+
+This product includes software developed by
+jQuery Foundation (http://jquery.org/)
+
+This product includes software developed by
+Twitter, Inc (http://twitter.github.com/bootstrap/)
diff --git a/src/main/assembly/README.txt b/src/main/assembly/README.txt
new file mode 100644
index 0000000..0a54677
--- /dev/null
+++ b/src/main/assembly/README.txt
@@ -0,0 +1,113 @@
+  Licensed to the Apache Software Foundation (ASF) under one or more
+  contributor license agreements.  See the NOTICE file distributed with
+  this work for additional information regarding copyright ownership.
+  The ASF licenses this file to You under the Apache License, Version 2.0
+  (the "License"); you may not use this file except in compliance with
+  the License.  You may obtain a copy of the License at
+
+   http://www.apache.org/licenses/LICENSE-2.0
+
+  Unless required by applicable law or agreed to in writing, software
+  distributed under the License is distributed on an "AS IS" BASIS,
+  WITHOUT 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 Any23 Service ${project.version} (${implementation.build.tstamp})
+
+  What is it?
+  -----------
+
+  ${project.description}
+
+  Documentation
+  -------------
+
+  The most up-to-date documentation can be found at ${project.parent.url}.
+
+  Release Notes
+  -------------
+
+  The full list of changes can be found at ${project.parent.url}/service.html.
+
+  System Requirements
+  -------------------
+
+  JDK:
+    ${javac.target.version} or above. (see http://www.oracle.com/technetwork/java/)
+  Memory:
+    No minimum requirement.
+  Disk:
+    No minimum requirement.
+  Operating System:
+    No minimum requirement. On Windows, Windows NT and above or Cygwin is required for
+    the startup scripts. Tested on Windows XP, Fedora Core and Mac OS X.
+
+  Installing Apache Any23 Service
+  ----------------
+
+** Windows 2000/XP
+
+  1) Unzip the distribution archive, i.e. apache-${project.build.finalName}-bin.zip to the directory you wish to
+        install Apache Any23 ${project.version}.
+        These instructions assume you chose C:\Program Files\Apache Software Foundation.
+        The subdirectory apache-${project.build.finalName} will be created from the archive.
+
+  2) Add the ANY23_HOME environment variable by opening up the system properties (WinKey + Pause),
+        selecting the "Advanced" tab, and the "Environment Variables" button, then adding the ANY23_HOME
+        variable in the user variables with the value
+        C:\Program Files\Apache Software Foundation\apache-${project.build.finalName}.
+
+  3) In the same dialog, add the ANY23 environment variable in the user variables with the value %ANY23_HOME%\bin.
+
+  4) Optional: In the same dialog, add the EXTRA_JVM_ARGUMENTS environment variable in the user variables to specify
+        JVM properties, e.g. the value -Xms256m -Xmx512m. This environment variable can be used to supply extra options.
+        By default, it is set to: -Xms500m -Xmx500m -XX:-UseGCOverheadLimit
+
+  5) In the same dialog, update/create the Path environment variable in the user variables and prepend the value
+        %ANY23% to add Apache Any23 available in the command line.
+
+  6) In the same dialog, make sure that JAVA_HOME exists in your user variables or in the system variables and it is
+        set to the location of your JDK, e.g. C:\Program Files\Java\jdk1.5.0_02 and that %JAVA_HOME%\bin is in your Path
+        environment variable.
+
+  7) Open a new command prompt (Winkey + R then type cmd) and run any23server to launch the service.
+
+** Unix-based Operating Systems (Linux, Solaris and Mac OS X)
+
+  1) Extract the distribution archive, i.e. apache-${project.build.finalName}-bin.tar.gz to the directory you wish to
+        install Apache Any23 ${project.version}.
+        These instructions assume you chose /usr/local/apache-any23.
+        The subdirectory apache-${project.build.finalName} will be created from the archive.
+
+  2) In a command terminal, add the ANY23_HOME environment variable, e.g.
+        export ANY23_HOME=/usr/local/apache-any23/apache-${project.build.finalName}.
+
+  3) Add the ANY23 environment variable, e.g. export ANY23=$ANY23_HOME/bin.
+
+  4) Optional: Add the EXTRA_JVM_ARGUMENTS environment variable to specify JVM properties, e.g.
+        export EXTRA_JVM_ARGUMENTS="-Xms256m -Xmx512m".
+        This environment variable can be used to supply extra options.
+
+  5) Add ANY23 environment variable to your path, e.g. export PATH=$ANY23:$PATH.
+
+  6) Make sure that JAVA_HOME is set to the location of your JDK, e.g.
+        export JAVA_HOME=/usr/java/jdk1.5.0_02 and that $JAVA_HOME/bin is in your PATH environment variable.
+
+  7) Run any23server to launch the service.
+
+  Licensing
+  ---------
+
+  Please see the file called LICENSE.TXT
+
+  Apache Any23 URLS
+  ----------
+
+  Home Page:          ${project.parent.url}/
+  Downloads:          ${project.parent.url}/download.html
+  Release Notes:      ${project.parent.url}/changes-report.html
+  Mailing Lists:      ${project.parent.url}/mail-lists.html
+  Source Code:        ${project.parent.scm.url}
+  Issue Tracking:     ${project.issueManagement.url}
+  Available Plugins:  ${project.parent.url}/plugins.html
diff --git a/src/main/assembly/prepare-war-legals.xml b/src/main/assembly/prepare-war-legals.xml
new file mode 100644
index 0000000..ddaaf23
--- /dev/null
+++ b/src/main/assembly/prepare-war-legals.xml
@@ -0,0 +1,48 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+  Licensed to the Apache Software Foundation (ASF) under one or more
+  contributor license agreements.  See the NOTICE file distributed with
+  this work for additional information regarding copyright ownership.
+  The ASF licenses this file to You under the Apache License, Version 2.0
+  (the "License"); you may not use this file except in compliance with
+  the License.  You may obtain a copy of the License at
+
+   http://www.apache.org/licenses/LICENSE-2.0
+
+  Unless required by applicable law or agreed to in writing, software
+  distributed under the License is distributed on an "AS IS" BASIS,
+  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+  See the License for the specific language governing permissions and
+  limitations under the License.
+-->
+<assembly xmlns="http://maven.apache.org/plugins/maven-assembly-plugin/assembly/1.1.1" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+  xsi:schemaLocation="http://maven.apache.org/plugins/maven-assembly-plugin/assembly/1.1.1 http://maven.apache.org/xsd/assembly-1.1.1.xsd">
+
+  <id>prepare-war-legals</id>
+  <formats>
+    <format>dir</format>
+  </formats>
+  <includeBaseDirectory>false</includeBaseDirectory>
+
+  <files>
+    <file>
+      <source>${basedir}/src/main/assembly/LICENSE-with-deps.txt</source>
+      <destName>LICENSE.txt</destName>
+      <outputDirectory>/with-deps</outputDirectory>
+      <fileMode>666</fileMode>
+    </file>
+    <file>
+      <source>${basedir}/src/main/assembly/NOTICE-with-deps.txt</source>
+      <destName>NOTICE.txt</destName>
+      <outputDirectory>/with-deps</outputDirectory>
+      <fileMode>666</fileMode>
+    </file>
+    <file>
+      <source>${basedir}/src/main/assembly/LICENSE-without-deps.txt</source>
+      <destName>LICENSE.txt</destName>
+      <outputDirectory>/without-deps</outputDirectory>
+      <fileMode>666</fileMode>
+    </file>
+  </files>
+
+</assembly>
diff --git a/src/main/assembly/server-embedded.xml b/src/main/assembly/server-embedded.xml
new file mode 100644
index 0000000..4a867a8
--- /dev/null
+++ b/src/main/assembly/server-embedded.xml
@@ -0,0 +1,86 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+  Licensed to the Apache Software Foundation (ASF) under one or more
+  contributor license agreements.  See the NOTICE file distributed with
+  this work for additional information regarding copyright ownership.
+  The ASF licenses this file to You under the Apache License, Version 2.0
+  (the "License"); you may not use this file except in compliance with
+  the License.  You may obtain a copy of the License at
+
+   http://www.apache.org/licenses/LICENSE-2.0
+
+  Unless required by applicable law or agreed to in writing, software
+  distributed under the License is distributed on an "AS IS" BASIS,
+  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+  See the License for the specific language governing permissions and
+  limitations under the License.
+-->
+<assembly xmlns="http://maven.apache.org/plugins/maven-assembly-plugin/assembly/1.1.1" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+  xsi:schemaLocation="http://maven.apache.org/plugins/maven-assembly-plugin/assembly/1.1.1 http://maven.apache.org/xsd/assembly-1.1.1.xsd">
+
+  <id>server-embedded</id>
+  <formats>
+    <format>tar.gz</format>
+    <format>zip</format>
+  </formats>
+  <includeBaseDirectory>true</includeBaseDirectory>
+  <baseDirectory>${project.build.finalName}-server-embedded</baseDirectory>
+
+  <files>
+    <file>
+      <source>${basedir}/src/main/assembly/README.txt</source>
+      <filtered>true</filtered>
+      <outputDirectory/>
+      <fileMode>666</fileMode>
+    </file>
+    <file>
+      <source>${basedir}/src/main/assembly/LICENSE-server-embedded.txt</source>
+      <destName>LICENSE.txt</destName>
+      <outputDirectory/>
+      <fileMode>666</fileMode>
+    </file>
+    <file>
+      <source>${basedir}/src/main/assembly/NOTICE-server-embedded.txt</source>
+      <destName>NOTICE.txt</destName>
+      <outputDirectory/>
+      <fileMode>666</fileMode>
+    </file>
+    <file>
+      <source>${basedir}/RELEASE-NOTES.txt</source>
+      <outputDirectory/>
+      <fileMode>666</fileMode>
+    </file>
+  </files>
+
+  <fileSets>
+    <!--
+     | shell scripts
+    -->
+    <fileSet>
+      <directory>${basedir}/src/main/bin/</directory>
+      <outputDirectory>/bin</outputDirectory>
+      <fileMode>755</fileMode>
+      <filtered>true</filtered>
+    </fileSet>
+  </fileSets>
+
+  <dependencySets>
+    <dependencySet>
+      <useProjectArtifact>true</useProjectArtifact>
+      <outputDirectory>/lib</outputDirectory>
+      <includes>
+        <include>${project.groupId}:${project.artifactId}</include>
+      </includes>
+    </dependencySet>
+
+    <dependencySet>
+      <useProjectArtifact>true</useProjectArtifact>
+      <outputDirectory>/lib</outputDirectory>
+      <scope>provided</scope>
+      <includes>
+        <include>org.eclipse.jetty:jetty-runner</include>
+      </includes>
+    </dependencySet>
+  </dependencySets>
+
+</assembly>
diff --git a/src/main/assembly/with-deps.xml b/src/main/assembly/with-deps.xml
new file mode 100644
index 0000000..667defc
--- /dev/null
+++ b/src/main/assembly/with-deps.xml
@@ -0,0 +1,60 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+  Licensed to the Apache Software Foundation (ASF) under one or more
+  contributor license agreements.  See the NOTICE file distributed with
+  this work for additional information regarding copyright ownership.
+  The ASF licenses this file to You under the Apache License, Version 2.0
+  (the "License"); you may not use this file except in compliance with
+  the License.  You may obtain a copy of the License at
+
+   http://www.apache.org/licenses/LICENSE-2.0
+
+  Unless required by applicable law or agreed to in writing, software
+  distributed under the License is distributed on an "AS IS" BASIS,
+  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+  See the License for the specific language governing permissions and
+  limitations under the License.
+-->
+<assembly xmlns="http://maven.apache.org/plugins/maven-assembly-plugin/assembly/1.1.1" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+  xsi:schemaLocation="http://maven.apache.org/plugins/maven-assembly-plugin/assembly/1.1.1 http://maven.apache.org/xsd/assembly-1.1.1.xsd">
+
+  <id>with-deps</id>
+  <formats>
+    <format>tar.gz</format>
+    <format>zip</format>
+  </formats>
+  <includeBaseDirectory>true</includeBaseDirectory>
+  <baseDirectory>${project.build.finalName}-with-deps</baseDirectory>
+
+  <files>
+    <!-- with-deps -->
+    <file>
+      <source>${basedir}/src/main/assembly/LICENSE-with-deps.txt</source>
+      <destName>LICENSE.txt</destName>
+      <outputDirectory>/</outputDirectory>
+      <fileMode>666</fileMode>
+    </file>
+    <file>
+      <source>${basedir}/src/main/assembly/NOTICE-with-deps.txt</source>
+      <destName>NOTICE.txt</destName>
+      <outputDirectory>/</outputDirectory>
+      <fileMode>666</fileMode>
+    </file>
+    <file>
+      <source>${basedir}/RELEASE-NOTES.txt</source>
+      <outputDirectory>/</outputDirectory>
+      <fileMode>666</fileMode>
+    </file>
+  </files>
+
+  <dependencySets>
+    <dependencySet>
+      <useProjectArtifact>true</useProjectArtifact>
+      <outputDirectory>/lib</outputDirectory>
+      <includes>
+        <include>${project.groupId}:${project.artifactId}</include>
+      </includes>
+    </dependencySet>
+  </dependencySets>
+
+</assembly>
diff --git a/src/main/assembly/without-deps.xml b/src/main/assembly/without-deps.xml
new file mode 100644
index 0000000..4592004
--- /dev/null
+++ b/src/main/assembly/without-deps.xml
@@ -0,0 +1,53 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+  Licensed to the Apache Software Foundation (ASF) under one or more
+  contributor license agreements.  See the NOTICE file distributed with
+  this work for additional information regarding copyright ownership.
+  The ASF licenses this file to You under the Apache License, Version 2.0
+  (the "License"); you may not use this file except in compliance with
+  the License.  You may obtain a copy of the License at
+
+   http://www.apache.org/licenses/LICENSE-2.0
+
+  Unless required by applicable law or agreed to in writing, software
+  distributed under the License is distributed on an "AS IS" BASIS,
+  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+  See the License for the specific language governing permissions and
+  limitations under the License.
+-->
+<assembly xmlns="http://maven.apache.org/plugins/maven-assembly-plugin/assembly/1.1.1" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+  xsi:schemaLocation="http://maven.apache.org/plugins/maven-assembly-plugin/assembly/1.1.1 http://maven.apache.org/xsd/assembly-1.1.1.xsd">
+
+  <id>without-deps</id>
+  <formats>
+    <format>tar.gz</format>
+    <format>zip</format>
+  </formats>
+  <includeBaseDirectory>true</includeBaseDirectory>
+  <baseDirectory>${project.build.finalName}-without-deps</baseDirectory>
+
+  <files>
+    <!-- without-deps -->
+    <file>
+      <source>${basedir}/src/main/assembly/LICENSE-without-deps.txt</source>
+      <destName>LICENSE.txt</destName>
+      <outputDirectory>/</outputDirectory>
+      <fileMode>666</fileMode>
+    </file>
+    <file>
+      <source>${basedir}/src/main/assembly/NOTICE-without-deps.txt</source>
+      <destName>NOTICE.txt</destName>
+      <outputDirectory>/</outputDirectory>
+      <fileMode>666</fileMode>
+    </file>
+    <file>
+      <source>${basedir}/RELEASE-NOTES.txt</source>
+      <fileMode>666</fileMode>
+    </file>
+    <file>
+      <source>${project.build.directory}/${project.build.finalName}-without-deps.${project.packaging}</source>
+      <outputDirectory>/lib</outputDirectory>
+    </file>
+  </files>
+
+</assembly>
diff --git a/src/main/bin/any23server b/src/main/bin/any23server
new file mode 100755
index 0000000..eb15488
--- /dev/null
+++ b/src/main/bin/any23server
@@ -0,0 +1,90 @@
+#!/bin/sh
+# ----------------------------------------------------------------------------
+# Licensed to the Apache Software Foundation (ASF) under one or more
+# contributor license agreements. See the NOTICE file distributed with
+# this work for additional information regarding copyright ownership.
+# The ASF licenses this file to You under the Apache License, Version 2.0
+# (the "License"); you may not use this file except in compliance with
+# the License.  You may obtain a copy of the License at
+
+#  http://www.apache.org/licenses/LICENSE-2.0
+
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+# ----------------------------------------------------------------------------
+
+BASEDIR=`dirname $0`/..
+BASEDIR=`(cd "$BASEDIR"; pwd)`
+
+# OS specific support.  $var _must_ be set to either true or false.
+cygwin=false;
+darwin=false;
+case "`uname`" in
+  CYGWIN*) cygwin=true ;;
+  Darwin*) darwin=true
+           if [ -z "$JAVA_VERSION" ] ; then
+             JAVA_VERSION="CurrentJDK"
+           else
+             echo "Using Java version: $JAVA_VERSION"
+           fi
+           if [ -z "$JAVA_HOME" ] ; then
+             JAVA_HOME=/System/Library/Frameworks/JavaVM.framework/Versions/${JAVA_VERSION}/Home
+           fi
+           ;;
+esac
+
+if [ -z "$JAVA_HOME" ] ; then
+  if [ -r /etc/gentoo-release ] ; then
+    JAVA_HOME=`java-config --jre-home`
+  fi
+fi
+
+# For Cygwin, ensure paths are in UNIX format before anything is touched
+if $cygwin ; then
+  [ -n "$JAVA_HOME" ] && JAVA_HOME=`cygpath --unix "$JAVA_HOME"`
+  [ -n "$CLASSPATH" ] && CLASSPATH=`cygpath --path --unix "$CLASSPATH"`
+fi
+
+# If a specific java binary isn't specified search for the standard 'java' binary
+if [ -z "$JAVACMD" ] ; then
+  if [ -n "$JAVA_HOME"  ] ; then
+    if [ -x "$JAVA_HOME/jre/sh/java" ] ; then
+      # IBM's JDK on AIX uses strange locations for the executables
+      JAVACMD="$JAVA_HOME/jre/sh/java"
+    else
+      JAVACMD="$JAVA_HOME/bin/java"
+    fi
+  else
+    JAVACMD=`which java`
+  fi
+fi
+
+if [ ! -x "$JAVACMD" ] ; then
+  echo "Error: JAVA_HOME is not defined correctly."
+  echo "  We cannot execute $JAVACMD"
+  exit 1
+fi
+
+if [ -z "$REPO" ]
+then
+  REPO="$BASEDIR"/lib
+fi
+
+EXTRA_JVM_ARGUMENTS="-Xms500m -Xmx500m -XX:-UseGCOverheadLimit"
+
+# For Cygwin, switch paths to Windows format before running java
+if $cygwin; then
+  [ -n "$CLASSPATH" ] && CLASSPATH=`cygpath --path --windows "$CLASSPATH"`
+  [ -n "$JAVA_HOME" ] && JAVA_HOME=`cygpath --path --windows "$JAVA_HOME"`
+  [ -n "$HOME" ] && HOME=`cygpath --path --windows "$HOME"`
+  [ -n "$BASEDIR" ] && BASEDIR=`cygpath --path --windows "$BASEDIR"`
+  [ -n "$REPO" ] && REPO=`cygpath --path --windows "$REPO"`
+fi
+
+exec "$JAVACMD" $JAVA_OPTS \
+  $EXTRA_JVM_ARGUMENTS \
+  -jar "$REPO"/jetty-runner-${jetty.runner.version}.jar \
+  --path /${project.artifactId} "$REPO"/${project.build.finalName}.${project.packaging}
diff --git a/src/main/bin/any23server.bat b/src/main/bin/any23server.bat
new file mode 100644
index 0000000..7362704
--- /dev/null
+++ b/src/main/bin/any23server.bat
@@ -0,0 +1,105 @@
+@REM ----------------------------------------------------------------------------
+@REM Licensed to the Apache Software Foundation (ASF) under one or more
+@REM contributor license agreements. See the NOTICE file distributed with
+@REM this work for additional information regarding copyright ownership.
+@REM The ASF licenses this file to You under the Apache License, Version 2.0
+@REM (the "License"); you may not use this file except in compliance with
+@REM the License.  You may obtain a copy of the License at
+
+@REM  http://www.apache.org/licenses/LICENSE-2.0
+
+@REM Unless required by applicable law or agreed to in writing, software
+@REM distributed under the License is distributed on an "AS IS" BASIS,
+@REM WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+@REM See the License for the specific language governing permissions and
+@REM limitations under the License.
+@REM ----------------------------------------------------------------------------
+@REM
+
+@echo off
+
+set ERROR_CODE=0
+
+:init
+@REM Decide how to startup depending on the version of windows
+
+@REM -- Win98ME
+if NOT "%OS%"=="Windows_NT" goto Win9xArg
+
+@REM set local scope for the variables with windows NT shell
+if "%OS%"=="Windows_NT" @setlocal
+
+@REM -- 4NT shell
+if "%eval[2+2]" == "4" goto 4NTArgs
+
+@REM -- Regular WinNT shell
+set CMD_LINE_ARGS=%*
+goto WinNTGetScriptDir
+
+@REM The 4NT Shell from jp software
+:4NTArgs
+set CMD_LINE_ARGS=%$
+goto WinNTGetScriptDir
+
+:Win9xArg
+@REM Slurp the command line arguments.  This loop allows for an unlimited number
+@REM of arguments (up to the command line limit, anyway).
+set CMD_LINE_ARGS=
+:Win9xApp
+if %1a==a goto Win9xGetScriptDir
+set CMD_LINE_ARGS=%CMD_LINE_ARGS% %1
+shift
+goto Win9xApp
+
+:Win9xGetScriptDir
+set SAVEDIR=%CD%
+%0\
+cd %0\..\.. 
+set BASEDIR=%CD%
+cd %SAVEDIR%
+set SAVE_DIR=
+goto repoSetup
+
+:WinNTGetScriptDir
+set BASEDIR=%~dp0\..
+
+:repoSetup
+
+
+if "%JAVACMD%"=="" set JAVACMD=java
+
+if "%REPO%"=="" set REPO=%BASEDIR%\lib
+
+set EXTRA_JVM_ARGUMENTS=-Xms500m -Xmx500m -XX:-UseGCOverheadLimit
+goto endInit
+
+@REM Reaching here means variables are defined and arguments have been captured
+:endInit
+
+%JAVACMD% %JAVA_OPTS% %EXTRA_JVM_ARGUMENTS% -jar "%REPO%"/jetty-runner-${jetty.runner.version}.jar --path /${project.artifactId} "%REPO%"/${project.build.finalName}.${project.packaging}
+if ERRORLEVEL 1 goto error
+goto end
+
+:error
+if "%OS%"=="Windows_NT" @endlocal
+set ERROR_CODE=1
+
+:end
+@REM set local scope for the variables with windows NT shell
+if "%OS%"=="Windows_NT" goto endNT
+
+@REM For old DOS remove the set variables from ENV - we assume they were not set
+@REM before we started - at least we don't leave any baggage around
+set CMD_LINE_ARGS=
+goto postExec
+
+:endNT
+@endlocal
+
+:postExec
+
+if "%FORCE_EXIT_ON_ERROR%" == "on" (
+  if %ERROR_CODE% NEQ 0 exit %ERROR_CODE%
+)
+
+exit /B %ERROR_CODE%
diff --git a/src/main/java/org/apache/any23/servlet/RedirectServlet.java b/src/main/java/org/apache/any23/servlet/RedirectServlet.java
new file mode 100644
index 0000000..ea87e00
--- /dev/null
+++ b/src/main/java/org/apache/any23/servlet/RedirectServlet.java
@@ -0,0 +1,95 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *  http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.any23.servlet;
+
+import javax.servlet.RequestDispatcher;
+import javax.servlet.ServletException;
+import javax.servlet.http.HttpServlet;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import java.io.IOException;
+
+/**
+ * This servlet contains the logic to perform the correct redirects
+ * when <i>Any23</i> is used as a all-in-one web application.
+ * 
+ * @author Davide Palmisano ( palmisano@fbk.eu )
+ */
+public class RedirectServlet extends HttpServlet {
+
+    private static final Logger LOG = LoggerFactory.getLogger(RedirectServlet.class);
+
+    /**
+   * 
+   */
+  private static final long serialVersionUID = 1L;
+
+    @Override
+    protected void doPost(HttpServletRequest request, HttpServletResponse response)
+    throws ServletException, IOException {
+        try {
+            doGet(request, response);
+        } catch (ServletException | IOException e) {
+            LOG.error("Error executing GET request.", e);
+        }
+    }
+
+    @Override
+    protected void doGet(HttpServletRequest request, HttpServletResponse response)
+    throws ServletException, IOException {
+        // Show /resources/form.html for GET requests to the app's root
+        final String pathInfo = request.getPathInfo();
+        final String queryString = request.getQueryString();
+
+        if ("/".equals(pathInfo) && queryString == null) {
+            RequestDispatcher dispatcher = getServletContext().getRequestDispatcher("/resources/form.html");
+            try {
+                dispatcher.forward(request, response);
+            } catch (ServletException | IOException e) {
+                LOG.error("Error in request dispatcher forwarding.", e);
+            }
+            return;
+        }
+        // forward requests to /resources/* to the default servlet, this is
+        // where we can put static files
+        if (pathInfo.startsWith("/resources/")) {
+            RequestDispatcher dispatcher = getServletContext().getNamedDispatcher("default");
+            try {
+              dispatcher.forward(request, response);
+            } catch (ServletException | IOException e) {
+                LOG.error("Error in named request dispatcher forwarding.", e);
+            }
+            return;
+        }
+
+        try {
+            response.sendRedirect(
+                  request.getContextPath() + "/any23" +
+                          request.getPathInfo() +
+                          (queryString == null ? "" : "?" + queryString)
+            );
+        } catch (IOException e) {
+            LOG.error("Error in sending HttpServletResponse Redirect.", e);
+        }
+        
+    }
+}
diff --git a/src/main/java/org/apache/any23/servlet/Servlet.java b/src/main/java/org/apache/any23/servlet/Servlet.java
new file mode 100644
index 0000000..ad7c1ed
--- /dev/null
+++ b/src/main/java/org/apache/any23/servlet/Servlet.java
@@ -0,0 +1,332 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *  http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.any23.servlet;
+
+import org.apache.any23.configuration.DefaultConfiguration;
+import org.apache.any23.extractor.ExtractionParameters;
+import org.apache.any23.extractor.ExtractorRegistry;
+import org.apache.any23.extractor.ExtractorRegistryImpl;
+import org.apache.any23.http.HTTPClient;
+import org.apache.any23.plugin.Any23PluginManager;
+import org.apache.any23.servlet.conneg.Any23Negotiator;
+import org.apache.any23.servlet.conneg.MediaRangeSpec;
+import org.apache.any23.source.ByteArrayDocumentSource;
+import org.apache.any23.source.DocumentSource;
+import org.apache.any23.source.HTTPDocumentSource;
+import org.apache.any23.source.StringDocumentSource;
+import org.eclipse.rdf4j.rio.RDFFormat;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import javax.servlet.ServletException;
+import javax.servlet.http.HttpServlet;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+
+import java.io.File;
+import java.io.IOException;
+import java.net.URI;
+import java.net.URISyntaxException;
+import java.util.regex.Pattern;
+
+import static org.apache.any23.extractor.ExtractionParameters.ValidationMode;
+
+/**
+ * A <i>Servlet</i> that fetches a client-specified <i>IRI</i>,
+ * RDFizes the content, and returns it in a format chosen by the client.
+ *
+ * @author Gabriele Renzi
+ * @author Richard Cyganiak (richard@cyganiak.de)
+ */
+public class Servlet extends HttpServlet {
+
+    private static final Logger LOG = LoggerFactory.getLogger(Servlet.class);
+
+    public static final String DEFAULT_BASE_IRI = "http://any23.org/tmp/";
+
+    private static final long serialVersionUID = 8207685628715421336L;
+
+    private static final Pattern schemeAndSingleSlashRegex =
+            Pattern.compile("^[a-zA-Z][a-zA-Z0-9.+-]*:/[^/]");
+
+    // RFC 3986: scheme = ALPHA *( ALPHA / DIGIT / "+" / "-" / "." )
+    private static final Pattern schemeRegex =
+            Pattern.compile("^[a-zA-Z][a-zA-Z0-9.+-]*:");
+
+    @Override
+    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws IOException, ServletException {
+        final WebResponder responder = new WebResponder(this, resp);
+        final String format = getFormatFromRequestOrNegotiation(req);
+        final boolean report = isReport(req);
+        final boolean annotate = isAnnotated(req);
+        final boolean openie = isOpenIE(req);
+        if (format == null) {
+            try {
+                responder.sendError(406, "Client accept header does not include a supported output format", report);
+                return;
+            } catch (IOException e) {
+                LOG.error("Unable to send error for null request format.", e);
+            }
+        }
+        final String uri = getInputIRIFromRequest(req);
+        if (uri == null) {
+            try {
+                responder.sendError(404, "Missing IRI in GET request. Try /format/http://example.com/myfile", report);
+                return;
+            } catch (Exception e) {
+                LOG.error("Unable to send error for null request IRI.", e);
+            }
+        }
+        if (openie) {
+            Any23PluginManager pManager = Any23PluginManager.getInstance();
+            //Dynamically adding Jar's to the Classpath via the following logic
+            //is absolutely dependant on the 'apache-any23-openie' directory being
+            //present within the webapp /lib directory. This is specified within 
+            //the maven-dependency-plugin.
+            File webappClasspath = new File(getClass().getClassLoader().getResource("").getPath());
+            File openIEJarPath = new File(webappClasspath.getParentFile().getPath() + "/lib/apache-any23-openie");
+            boolean loadedJars = pManager.loadJARDir(openIEJarPath);
+            if (loadedJars) {
+                ExtractorRegistry r = ExtractorRegistryImpl.getInstance();
+                try {
+                    pManager.getExtractors().forEachRemaining(r::register);
+                } catch (IOException e) {
+                    LOG.error("Error during dynamic classloading of JARs from OpenIE runtime directory {}", openIEJarPath.toString(), e);
+                }
+                LOG.info("Successful dynamic classloading of JARs from OpenIE runtime directory {}", openIEJarPath.toString());
+            }
+        }
+        final ExtractionParameters eps = getExtractionParameters(req);
+        try {
+            responder.runExtraction(createHTTPDocumentSource(responder, uri, report), eps, format, report, annotate);
+        } catch (IOException e) {
+            LOG.error("Unable to run extraction on HTTPDocumentSource.", e);
+        }
+    }
+
+    @Override
+    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws IOException {
+        final WebResponder responder = new WebResponder(this, resp);
+        final boolean report = isReport(req);
+        final boolean annotate = isAnnotated(req);
+        final boolean openie = isOpenIE(req);
+        if (req.getContentType() == null) {
+            responder.sendError(400, "Invalid POST request, no Content-Type for the message body specified", report);
+            return;
+        }
+        final String uri = getInputIRIFromRequest(req);
+        final String format = getFormatFromRequestOrNegotiation(req);
+        if (format == null) {
+            responder.sendError(406, "Client accept header does not include a supported output format", report);
+            return;
+        }
+        if (openie) {
+          Any23PluginManager pManager = Any23PluginManager.getInstance();
+          pManager.loadJARDir(new File(getClass().getResource("apache-any23-openie").getPath()));
+        }
+        final ExtractionParameters eps = getExtractionParameters(req);
+        if ("application/x-www-form-urlencoded".equals(getContentTypeHeader(req))) {
+            if (uri != null) {
+                log("Attempting conversion to '" + format + "' from IRI <" + uri + ">");
+                responder.runExtraction(createHTTPDocumentSource(responder, uri, report), eps, format, report, annotate);
+                return;
+            }
+            if (req.getParameter("body") == null) {
+                responder.sendError(400, "Invalid POST request, parameter 'uri' or 'body' required", report);
+                return;
+            }
+            String type = null;
+            if (req.getParameter("type") != null && !"".equals(req.getParameter("type"))) {
+                type = req.getParameter("type");
+            }
+            log("Attempting conversion to '" + format + "' from body parameter");
+            responder.runExtraction(
+                    new StringDocumentSource(req.getParameter("body"), Servlet.DEFAULT_BASE_IRI, type),
+                    eps,
+                    format,
+                    report, annotate
+            );
+            return;
+        }
+        log("Attempting conversion to '" + format + "' from POST body");
+        responder.runExtraction(
+                new ByteArrayDocumentSource(
+                        req.getInputStream(),
+                        Servlet.DEFAULT_BASE_IRI,
+                        getContentTypeHeader(req)
+                ),
+                eps,
+                format,
+                report, annotate
+        );
+    }
+
+    private String getFormatFromRequestOrNegotiation(HttpServletRequest request) {
+        String fromRequest = getFormatFromRequest(request);
+        if (fromRequest != null && !"".equals(fromRequest) && !"best".equals(fromRequest)) {
+            return fromRequest;
+        }
+        MediaRangeSpec result = Any23Negotiator.getNegotiator().getBestMatch(request.getHeader("Accept"));
+        if (result == null) {
+            return null;
+        } else if (RDFFormat.N3.hasMIMEType(result.getMediaType())) {
+            return "n3";
+        } else if (RDFFormat.NQUADS.hasMIMEType(result.getMediaType())) {
+            return "nq";
+        } else if (RDFFormat.RDFXML.hasMIMEType(result.getMediaType())) {
+            return "rdf";
+        } else if (RDFFormat.NTRIPLES.hasMIMEType(result.getMediaType())) {
+            return "nt";
+        } else if (RDFFormat.JSONLD.hasMIMEType(result.getMediaType())) {
+            return "ld+json";
+        } else {
+            return "turtle"; // shouldn't happen however default is turtle
+        }
+    }
+
+    private String getFormatFromRequest(HttpServletRequest request) {
+        if (request.getPathInfo() == null)
+            return "best";
+        String[] args = request.getPathInfo().split("/", 3);
+        if (args.length < 2 || "".equals(args[1])) {
+            if (request.getParameter("format") == null) {
+                return "best";
+            } else {
+                return request.getParameter("format");
+            }
+        }
+        return args[1];
+    }
+
+    private String getInputIRIFromRequest(HttpServletRequest request) {
+        if (request.getPathInfo() == null)
+            return null;
+        String[] args = request.getPathInfo().split("/", 3);
+        if (args.length < 3) {
+            if (request.getParameter("uri") != null) {
+                return request.getParameter("uri").trim();
+            }
+            if (request.getParameter("url") != null) {
+                return request.getParameter("url").trim();
+            }
+            return null;
+        }
+        String uri = args[2];
+        if (request.getQueryString() != null) {
+            uri = uri + "?" + request.getQueryString();
+        }
+        if (!hasScheme(uri)) {
+            uri = "http://" + uri;
+        } else if (hasOnlySingleSlashAfterScheme(uri)) {
+            // This is to work around an issue where Tomcat 6.0.18 is
+            // too smart for us. Tomcat normalizes double-slashes in
+            // the path, and thus turns "http://" into "http:/" if it
+            // occurs in the path. So we restore the double slash.
+            uri = uri.replaceFirst(":/", "://");
+        }
+        return uri.trim();
+    }
+
+
+    private boolean hasScheme(String uri) {
+        return schemeRegex.matcher(uri).find();
+    }
+
+    private boolean hasOnlySingleSlashAfterScheme(String uri) {
+        return schemeAndSingleSlashRegex.matcher(uri).find();
+    }
+
+    private String getContentTypeHeader(HttpServletRequest req) {
+        String cType = "Content-Type";
+        if (req.getHeader(cType) == null)
+            return null;
+        if ("".equals(req.getHeader(cType)))
+            return null;
+        String contentType = req.getHeader(cType);
+        // strip off parameters such as ";charset=UTF-8"
+        int index = contentType.indexOf(';');
+        if (index == -1)
+            return contentType;
+        return contentType.substring(0, index);
+    }
+
+    private DocumentSource createHTTPDocumentSource(WebResponder responder, String uri, boolean report)
+            throws IOException {
+        try {
+            if (!isValidIRI(uri)) {
+                throw new URISyntaxException(uri, "@@@");
+            }
+            return createHTTPDocumentSource(responder.getRunner().getHTTPClient(), uri);
+        } catch (URISyntaxException ex) {
+            LOG.error("Invalid IRI detected", ex);
+            responder.sendError(400, "Invalid input IRI " + uri, report);
+            return null;
+        }
+    }
+
+    protected DocumentSource createHTTPDocumentSource(HTTPClient httpClient, String uri)
+            throws IOException, URISyntaxException {
+        return new HTTPDocumentSource(httpClient, uri);
+    }
+
+    private boolean isValidIRI(String s) {
+        try {
+            URI uri = new URI(s);
+            if (!"http".equals(uri.getScheme()) && !"https".equals(uri.getScheme())) {
+                return false;
+            }
+        } catch (Exception e) {
+            return false;
+        }
+        return true;
+    }
+
+    private ValidationMode getValidationMode(HttpServletRequest request) {
+        final String parameter = "validation-mode";
+        final String validationMode = request.getParameter(parameter);
+        if (validationMode == null)
+            return ValidationMode.NONE;
+        if ("none".equalsIgnoreCase(validationMode))
+            return ValidationMode.NONE;
+        if ("validate".equalsIgnoreCase(validationMode))
+            return ValidationMode.VALIDATE;
+        if ("validate-fix".equalsIgnoreCase(validationMode))
+            return ValidationMode.VALIDATE_AND_FIX;
+        throw new IllegalArgumentException(
+                String.format("Invalid value '%s' for '%s' parameter.", validationMode, parameter)
+        );
+    }
+
+    private ExtractionParameters getExtractionParameters(HttpServletRequest request) {
+        final ValidationMode mode = getValidationMode(request);
+        return new ExtractionParameters(DefaultConfiguration.singleton(), mode);
+    }
+
+    private boolean isReport(HttpServletRequest request) {
+        return request.getParameter("report") != null;
+    }
+
+    private boolean isAnnotated(HttpServletRequest request) {
+        return request.getParameter("annotate") != null;
+    }
+
+    private boolean isOpenIE(HttpServletRequest request) {
+      return request.getParameter("openie") != null;
+  }
+
+}
\ No newline at end of file
diff --git a/src/main/java/org/apache/any23/servlet/WebResponder.java b/src/main/java/org/apache/any23/servlet/WebResponder.java
new file mode 100644
index 0000000..9640b17
--- /dev/null
+++ b/src/main/java/org/apache/any23/servlet/WebResponder.java
@@ -0,0 +1,376 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *  http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.any23.servlet;
+
+import java.io.ByteArrayOutputStream;
+import java.io.IOException;
+import java.io.PrintStream;
+import java.nio.charset.Charset;
+import java.security.cert.CertificateException;
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.List;
+import java.util.stream.Collectors;
+import javax.servlet.ServletOutputStream;
+import javax.servlet.http.HttpServletResponse;
+import org.apache.any23.Any23;
+import org.apache.any23.ExtractionReport;
+import org.apache.any23.configuration.Settings;
+import org.apache.any23.extractor.ExtractionException;
+import org.apache.any23.extractor.ExtractionParameters;
+import org.apache.any23.extractor.Extractor;
+import org.apache.any23.extractor.IssueReport;
+import org.apache.any23.filter.IgnoreAccidentalRDFa;
+import org.apache.any23.filter.IgnoreTitlesOfEmptyDocuments;
+import org.apache.any23.source.DocumentSource;
+import org.apache.any23.validator.SerializationException;
+import org.apache.any23.validator.XMLValidationReportSerializer;
+import org.apache.any23.writer.CompositeTripleHandler;
+import org.apache.any23.writer.CountingTripleHandler;
+import org.apache.any23.writer.FormatWriter;
+import org.apache.any23.writer.TripleWriterFactory;
+import org.apache.any23.writer.ReportingTripleHandler;
+import org.apache.any23.writer.TripleHandler;
+import org.apache.any23.writer.TripleHandlerException;
+import org.apache.any23.writer.WriterFactory;
+import org.apache.any23.writer.WriterFactoryRegistry;
+
+/**
+ * This class is responsible for building the {@link Servlet}
+ * web response.
+ */
+class WebResponder {
+
+    private static final WriterFactoryRegistry writerRegistry = WriterFactoryRegistry.getInstance();
+
+    /**
+     * Library facade.
+     */
+    private final Any23 runner;
+
+    /**
+     * Servlet for which building the response.
+     */
+    private Servlet any23servlet;
+
+    /**
+     * Servlet response object.
+     */
+    private HttpServletResponse response;
+
+    /**
+     * RDF triple writer.
+     */
+    private TripleHandler rdfWriter = null;
+
+    /**
+     * Error and statistics reporter.
+     */
+    private ReportingTripleHandler reporter = null;
+
+    /**
+     * Type of expected output.
+     */
+    private String outputMediaType = null;
+
+    /**
+     * The output stream.
+     */
+    private ByteArrayOutputStream byteOutStream = new ByteArrayOutputStream();
+
+    public WebResponder(Servlet any23servlet, HttpServletResponse response) {
+        this.any23servlet = any23servlet;
+        this.response = response;
+        this.runner = new Any23();
+        runner.setHTTPUserAgent("Apache Any23 Servlet http://any23.org/");
+    }
+
+    protected Any23 getRunner() {
+        return runner;
+    }
+
+    public void runExtraction(
+            DocumentSource in,
+            ExtractionParameters eps,
+            String format,
+            boolean report, boolean annotate
+    ) throws IOException {
+        if (in == null)
+          return;
+        if (!initRdfWriter(format, report, annotate))
+          return;
+        ExtractionReport er = null;
+        try {
+            er = runner.extract(eps, in, rdfWriter);
+            rdfWriter.close();
+            if (! er.hasMatchingExtractors() ) {
+                sendError(
+                        415,
+                        "No suitable extractor found for this media type",
+                        null,
+                        er,
+                        report
+                );
+                return;
+            }
+        } catch (IOException ioe) {
+            // IO Error.
+            if (ioe.getCause() instanceof CertificateException) {
+                final String errMsg = "Could not fetch input, IO Error.";
+                any23servlet.log(errMsg, ioe.getCause());
+                sendError(502, errMsg, ioe, null, report);
+                return;
+            }
+            any23servlet.log("Could not fetch input", ioe);
+            sendError(502, "Could not fetch input.", ioe, null, report);
+            return;
+        } catch (ExtractionException e) {
+            if (rdfWriter != null) {
+                try {
+                    rdfWriter.close();
+                } catch (TripleHandlerException the) {
+                    throw new RuntimeException("Error while closing TripleHandler", the);
+                }
+            }
+
+            // Extraction error. Although there is a critical error we still wish 
+            // to return accurate, partial extraction results to the user
+            String extractionError = "Failed to fully parse input. The extraction result, at the bottom "
+                    + "of this response, if any, will contain extractions only up until the extraction error.";
+            any23servlet.log(extractionError, e);
+            sendError(502, extractionError, e, er, report);
+            return;
+        } catch (Exception e) {
+            any23servlet.log("Internal error", e);
+            sendError(500, "Internal error.", e, null, report);
+            return;
+        }
+
+        /* *** No triples found. *** */
+        any23servlet.log("Extraction complete, " + reporter.getTotalTriples() + " triples");
+
+        // Regular response.
+        response.setContentType(outputMediaType);
+        response.setStatus(200);
+        // Set the output encoding equals to the input one.
+        final String charsetEncoding = er.getEncoding();
+        if (Charset.isSupported(charsetEncoding)) {
+            response.setCharacterEncoding(er.getEncoding());
+        } else {
+            response.setCharacterEncoding("UTF-8");
+        }
+
+        final ServletOutputStream sos = response.getOutputStream();
+        final byte[] data = byteOutStream.toByteArray();
+        if(report) {
+            final PrintStream ps = new PrintStream(sos);
+            try {
+                printHeader(ps);
+                printResponse(reporter, er, data, ps);
+            } catch (Exception e) {
+                throw new RuntimeException("An error occurred while serializing the output response.", e);
+            } finally {
+                ps.close();
+            }
+        } else {
+            sos.write(data);
+        }
+    }
+
+    public void sendError(int code, String msg, boolean report) throws IOException {
+        sendError(code, msg, null, null, report);
+    }
+    
+    private void printHeader(PrintStream ps) {
+        ps.println("<?xml version=\"1.0\" encoding=\"UTF-8\" ?>");
+    }
+
+    private void printResponse(ReportingTripleHandler rth, ExtractionReport er, byte[] data, PrintStream ps) {
+        ps.println("<response>");
+        printExtractors(rth, ps);
+        printReport(null, null, er, ps);
+        printData(data, ps);
+        ps.println("</response>");
+    }
+
+    private void printExtractors(ReportingTripleHandler rth, PrintStream ps) {
+        ps.println("<extractors>");
+        for (String extractor : rth.getExtractorNames()) {
+            ps.print("<extractor>");
+            ps.print(extractor);
+            ps.println("</extractor>");
+        }
+        ps.println("</extractors>");
+    }
+    
+    private void printIssueReport(ExtractionReport er, PrintStream ps) {
+        ps.println("<issueReport>");
+        for(Extractor<?> extractor : er.getMatchingExtractors()) {
+            final String name = extractor.getDescription().getExtractorName();
+            final Collection<IssueReport.Issue> extractorIssues = er.getExtractorIssues(name);
+            if(extractorIssues.isEmpty())
+                continue;
+            ps.println( String.format("<extractorIssues extractor=\"%s\">", name));
+            for(IssueReport.Issue issue : er.getExtractorIssues(name)) {
+                ps.println(
+                        String.format(
+                                "<issue level=\"%s\" row=\"%d\" col=\"%d\">%s</issue>",
+                                issue.getLevel().toString(),
+                                issue.getRow(),
+                                issue.getCol(),
+                                issue.getMessage()
+                        )
+                );
+            }
+            ps.println("</extractorIssues>");
+        }
+        ps.println("</issueReport>");
+
+    }
+
+    private void printReport(String msg, Throwable e, ExtractionReport er, PrintStream ps) {
+        XMLValidationReportSerializer reportSerializer = new XMLValidationReportSerializer();
+        ps.println("<report>");
+
+        // Human readable error message.
+        if(msg != null) {
+            ps.printf("<message>%s</message>%n", msg);
+        } else {
+            ps.print("<message/>\n");
+        }
+
+        // Error stack trace.
+        if(e != null) {
+            ps.println("<error>");
+            ps.println("<![CDATA[");
+            e.printStackTrace(ps);
+            ps.println("]]>");
+            ps.println("</error>");
+        } else {
+            ps.println("<error/>");
+        }
+
+        // Issue Report.
+        printIssueReport(er, ps);
+
+        // Validation report.
+        try {
+            reportSerializer.serialize(er.getValidationReport(), ps);
+        } catch (SerializationException se) {
+            ps.println("An error occurred while serializing error.");
+            se.printStackTrace(ps);
+        }
+        ps.println("</report>");
+    }
+
+    private void printData(byte[] data, PrintStream ps) {
+        ps.println("<data>");
+        ps.println("<![CDATA[");
+        try {
+            ps.write(data);
+        } catch (IOException ioe) {
+            ps.println("An error occurred while serializing data.");
+            ioe.printStackTrace(ps);
+        }
+        ps.println("]]>");
+        ps.println("</data>");
+    }
+
+    private void sendError(int code, String msg, Exception e, ExtractionReport er, boolean report)
+    throws IOException {
+        response.setStatus(code);
+        response.setContentType("text/plain");
+        final ServletOutputStream sos = response.getOutputStream();
+        final PrintStream ps = new PrintStream(sos);
+        final byte[] data = byteOutStream.toByteArray();
+        if (report) {
+            try {
+                printHeader(ps);
+                printReport(msg, e, er, ps);
+            } finally {
+                ps.close();
+            }
+        } else {
+            ps.println(msg);
+            if (e != null) {
+                ps.println("================================================================");
+                e.printStackTrace(ps);
+                ps.println("================================================================");
+                printData(data, ps);
+            }
+        }
+    }
+
+    private boolean initRdfWriter(String format, boolean report, boolean annotate) throws IOException {
+        final WriterFactory factory = getFormatWriter(format);
+        if (!(factory instanceof TripleWriterFactory)) {
+            sendError(
+                    400,
+                    "Invalid format '" + format + "', try one of: "
+                            + writerRegistry.getWriters().stream()
+                            .filter(f -> f instanceof TripleWriterFactory)
+                            .map(WriterFactory::getIdentifier).collect(Collectors.toList()),
+                    null,
+                    null,
+                    report
+            );
+            return false;
+        }
+        TripleHandler fw = ((TripleWriterFactory) factory).getTripleWriter(byteOutStream, Settings.of());
+        if (fw instanceof FormatWriter) {
+            ((FormatWriter)fw).setAnnotated(annotate);
+        }
+        outputMediaType = ((TripleWriterFactory) factory).getTripleFormat().getMimeType();
+        List<TripleHandler> tripleHandlers = new ArrayList<>();
+        tripleHandlers.add(new IgnoreAccidentalRDFa(fw));
+        tripleHandlers.add(new CountingTripleHandler());
+        rdfWriter = new CompositeTripleHandler(tripleHandlers);
+        reporter = new ReportingTripleHandler(rdfWriter);
+        rdfWriter = new IgnoreAccidentalRDFa(
+            new IgnoreTitlesOfEmptyDocuments(reporter),
+            true    // suppress stylesheet triples.
+        );
+        return true;
+    }
+
+    private WriterFactory getFormatWriter(String format) throws IOException {
+        final String finalFormat;
+        // FIXME: Remove this hardcoded set
+        if ("rdf".equals(format) || "xml".equals(format) || "rdfxml".equals(format)) {
+            finalFormat = "rdfxml";
+        } else if ("turtle".equals(format) || "ttl".equals(format)) {
+            finalFormat = "turtle";
+        } else if ("n3".equals(format)) {
+            finalFormat = "turtle";
+        } else if ("n-triples".equals(format) || "ntriples".equals(format) || "nt".equals(format)) {
+            finalFormat = "ntriples";
+        } else if("nquads".equals(format) || "n-quads".equals(format) || "nq".equals(format)) {
+            finalFormat = "nquads";
+        } else if("trix".equals(format)) {
+            finalFormat = "trix";
+        } else if("json".equals(format)) {
+            finalFormat = "json";
+        } else if("jsonld".equals(format)){
+            finalFormat = "jsonld";        
+        } else {
+            return null;
+        }
+        return writerRegistry.getWriterByIdentifier(finalFormat);
+    }
+
+}
diff --git a/src/main/java/org/apache/any23/servlet/conneg/Any23Negotiator.java b/src/main/java/org/apache/any23/servlet/conneg/Any23Negotiator.java
new file mode 100644
index 0000000..9692722
--- /dev/null
+++ b/src/main/java/org/apache/any23/servlet/conneg/Any23Negotiator.java
@@ -0,0 +1,53 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *  http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.any23.servlet.conneg;
+
+/**
+ * Defines a {@link ContentTypeNegotiator} for <i>Any23</i>.
+ */
+public class Any23Negotiator {
+
+    private final static ContentTypeNegotiator any23negotiator;
+
+    static {
+        any23negotiator = new ContentTypeNegotiator();
+        any23negotiator.setDefaultAccept("text/turtle");
+
+        any23negotiator.addVariant("application/rdf+xml;q=0.95"     )
+                .addAliasMediaType("application/xml;q=0.4"          )
+                .addAliasMediaType("text/xml;q=0.4"                 );
+
+        any23negotiator.addVariant("text/rdf+n3;charset=utf-8;q=0.9")
+                .addAliasMediaType("text/n3;q=0.9"                  )
+                .addAliasMediaType("application/n3;q=0.9"           );
+
+        any23negotiator.addVariant("text/rdf+nq;charset=utf-8;q=0.9")
+                .addAliasMediaType("text/nq;q=0.9"                  )
+                .addAliasMediaType("application/nq;q=0.9"           );
+
+        any23negotiator.addVariant("text/turtle"                    )
+                .addAliasMediaType("application/x-turtle"           )
+                .addAliasMediaType("application/turtle"             );
+
+        any23negotiator.addVariant("text/plain;q=0.5");
+    }
+
+    public static ContentTypeNegotiator getNegotiator() {
+        return any23negotiator;
+    }
+}
diff --git a/src/main/java/org/apache/any23/servlet/conneg/ContentTypeNegotiator.java b/src/main/java/org/apache/any23/servlet/conneg/ContentTypeNegotiator.java
new file mode 100644
index 0000000..8546f96
--- /dev/null
+++ b/src/main/java/org/apache/any23/servlet/conneg/ContentTypeNegotiator.java
@@ -0,0 +1,230 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *  http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.any23.servlet.conneg;
+
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.Collections;
+import java.util.Iterator;
+import java.util.List;
+import java.util.regex.Pattern;
+
+/**
+ * This class defines a negotiator for content types based on scoring.
+ */
+public class ContentTypeNegotiator {
+
+    private List<VariantSpec> variantSpecs = new ArrayList<>();
+
+    private List<MediaRangeSpec> defaultAcceptRanges = Collections.singletonList(MediaRangeSpec.parseRange("*/*"));
+    
+    private Collection<AcceptHeaderOverride> userAgentOverrides = new ArrayList<>();
+
+    protected ContentTypeNegotiator(){}
+
+    /**
+     * Returns the {@link MediaRangeSpec}
+     * associated to the given <i>accept</i> type.
+     * 
+     * @param accept a provided <i>accept</i> type
+     * @return a {@link MediaRangeSpec} associated to the accept parameter
+     */
+    public MediaRangeSpec getBestMatch(String accept) {
+        return getBestMatch(accept, null);
+    }
+
+    /**
+     * Returns the {@link MediaRangeSpec}
+     * associated to the given <i>accept</i> type and <i>userAgent</i>.
+     *
+     * @param accept a provided <i>accept</i> type
+     * @param userAgent use agent associated with the request
+     * @return the {@link MediaRangeSpec}
+     * associated to the given <i>accept</i> type and <i>userAgent</i>.
+     */
+    public MediaRangeSpec getBestMatch(String accept, String userAgent) {
+        if (userAgent == null) {
+            userAgent = "";
+        }
+        Iterator<AcceptHeaderOverride> it = userAgentOverrides.iterator();
+        String overriddenAccept = accept;
+        while (it.hasNext()) {
+            AcceptHeaderOverride override = it.next();
+            if (override.matches(accept, userAgent)) {
+                overriddenAccept = override.getReplacement();
+            }
+        }
+        return new Negotiation(toAcceptRanges(overriddenAccept)).negotiate();
+    }
+
+    protected VariantSpec addVariant(String mediaType) {
+        VariantSpec result = new VariantSpec(mediaType);
+        variantSpecs.add(result);
+        return result;
+    }
+
+    /**
+     * Sets an Accept header to be used as the default if a client does
+     * not send an Accept header, or if the Accept header cannot be parsed.
+     * Defaults to "* / *".
+     * @param accept a default <i>accept</i> type
+     */
+    protected void setDefaultAccept(String accept) {
+        this.defaultAcceptRanges = MediaRangeSpec.parseAccept(accept);
+    }
+
+    /**
+     * Overrides the Accept header for certain user agents. This can be
+     * used to implement special-case handling for user agents that send
+     * faulty Accept headers.
+     *
+     * @param userAgentString      A pattern to be matched against the User-Agent header;
+     *                             <code>null</code> means regardless of User-Agent
+     * @param originalAcceptHeader Only override the Accept header if the user agent
+     *                             sends this header; <code>null</code> means always override
+     * @param newAcceptHeader      The Accept header to be used instead
+     */
+    protected void addUserAgentOverride(
+         Pattern userAgentString,
+         String originalAcceptHeader,
+         String newAcceptHeader
+    ) {
+        this.userAgentOverrides.add(
+            new AcceptHeaderOverride(userAgentString, originalAcceptHeader, newAcceptHeader)
+        );
+    }
+
+    private List<MediaRangeSpec> toAcceptRanges(String accept) {
+        if (accept == null) {
+            return defaultAcceptRanges;
+        }
+        List<MediaRangeSpec> result = MediaRangeSpec.parseAccept(accept);
+        if (result.isEmpty()) {
+            return defaultAcceptRanges;
+        }
+        return result;
+    }
+
+    protected class VariantSpec {
+
+        private MediaRangeSpec type;
+        private List<MediaRangeSpec> aliases = new ArrayList<>();
+        private boolean isDefault = false;
+
+        public VariantSpec(String mediaType) {
+            type = MediaRangeSpec.parseType(mediaType);
+        }
+
+        public VariantSpec addAliasMediaType(String mediaType) {
+            aliases.add(MediaRangeSpec.parseType(mediaType));
+            return this;
+        }
+
+        public void makeDefault() {
+            isDefault = true;
+        }
+
+        public MediaRangeSpec getMediaType() {
+            return type;
+        }
+
+        public boolean isDefault() {
+            return isDefault;
+        }
+
+        public List<MediaRangeSpec> getAliases() {
+            return aliases;
+        }
+    }
+
+    private class Negotiation {
+
+        private final List<MediaRangeSpec> ranges;
+        private MediaRangeSpec bestMatchingVariant = null;
+        private MediaRangeSpec bestDefaultVariant = null;
+        private double bestMatchingQuality = 0;
+        private double bestDefaultQuality = 0;
+
+        Negotiation(List<MediaRangeSpec> ranges) {
+            this.ranges = ranges;
+        }
+
+        MediaRangeSpec negotiate() {
+            Iterator<VariantSpec> it = variantSpecs.iterator();
+            while (it.hasNext()) {
+                VariantSpec variant = it.next();
+                if (variant.isDefault) {
+                    evaluateDefaultVariant(variant.getMediaType());
+                }
+                evaluateVariant(variant.getMediaType());
+                Iterator<MediaRangeSpec> aliasIt = variant.getAliases().iterator();
+                while (aliasIt.hasNext()) {
+                    MediaRangeSpec alias = aliasIt.next();
+                    evaluateVariantAlias(alias, variant.getMediaType());
+                }
+            }
+            return (bestMatchingVariant == null) ? bestDefaultVariant : bestMatchingVariant;
+        }
+
+        private void evaluateVariantAlias(MediaRangeSpec variant, MediaRangeSpec isAliasFor) {
+            if (variant.getBestMatch(ranges) == null)
+              return;
+            double q = variant.getBestMatch(ranges).getQuality();
+            if (q * variant.getQuality() > bestMatchingQuality) {
+                bestMatchingVariant = isAliasFor;
+                bestMatchingQuality = q * variant.getQuality();
+            }
+        }
+
+        private void evaluateVariant(MediaRangeSpec variant) {
+            evaluateVariantAlias(variant, variant);
+        }
+
+        private void evaluateDefaultVariant(MediaRangeSpec variant) {
+            if (variant.getQuality() > bestDefaultQuality) {
+                bestDefaultVariant = variant;
+                bestDefaultQuality = 0.00001 * variant.getQuality();
+            }
+        }
+        
+    }
+
+    private class AcceptHeaderOverride {
+
+        private Pattern userAgentPattern;
+        private String original;
+        private String replacement;
+
+        AcceptHeaderOverride(Pattern userAgentPattern, String original, String replacement) {
+            this.userAgentPattern = userAgentPattern;
+            this.original = original;
+            this.replacement = replacement;
+        }
+
+        boolean matches(String acceptHeader, String userAgentHeader) {
+            return (userAgentPattern == null
+                    || userAgentPattern.matcher(userAgentHeader).find())
+                    && (original == null || original.equals(acceptHeader));
+        }
+
+        String getReplacement() {
+            return replacement;
+        }
+    }
+    
+}
\ No newline at end of file
diff --git a/src/main/java/org/apache/any23/servlet/conneg/MediaRangeSpec.java b/src/main/java/org/apache/any23/servlet/conneg/MediaRangeSpec.java
new file mode 100644
index 0000000..f4923fc
--- /dev/null
+++ b/src/main/java/org/apache/any23/servlet/conneg/MediaRangeSpec.java
@@ -0,0 +1,267 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *  http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.any23.servlet.conneg;
+
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.Iterator;
+import java.util.List;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+
+/**
+ * This class implements the <i>HTTP header media-range specification</i>.
+ * See <a href="http://www.ietf.org/rfc/rfc2616.txt">RFC 2616 section 14.1</a>. 
+ */
+public class MediaRangeSpec {
+
+    private static final Pattern tokenPattern;
+
+    private static final Pattern parameterPattern;
+
+
+    private static final Pattern mediaRangePattern;
+
+    private static final Pattern qValuePattern;
+
+    private final String type;
+
+    private final String subtype;
+
+    private final List<String> parameterNames;
+
+    private final List<String> parameterValues;
+
+    private final String mediaType;
+    
+    private final double quality;
+    
+    static {
+
+        // See RFC 2616, section 2.2
+        String token = "[\\x20-\\x7E&&[^()<>@,;:\\\"/\\[\\]?={} ]]+";
+        String quotedString = "\"((?:[\\x20-\\x7E\\n\\r\\t&&[^\"\\\\]]|\\\\[\\x00-\\x7F])*)\"";
+
+        // See RFC 2616, section 3.6
+        String parameter = ";\\s*(?!q\\s*=)(" + token + ")=(?:(" + token + ")|" + quotedString + ")";
+
+        // See RFC 2616, section 3.9
+        String qualityValue = "(?:0(?:\\.\\d{0,3})?|1(?:\\.0{0,3})?)";
+
+        // See RFC 2616, sections 14.1
+        String quality = ";\\s*q\\s*=\\s*([^;,]*)";
+
+        // See RFC 2616, section 3.7
+        String regex = "(" + token     + ")/(" + token + ")" +
+                "((?:\\s*" + parameter + ")*)" +
+                "(?:\\s*"  + quality   + ")?" +
+                "((?:\\s*" + parameter + ")*)";
+
+        tokenPattern      = Pattern.compile(token);
+        parameterPattern  = Pattern.compile(parameter);
+        mediaRangePattern = Pattern.compile(regex);
+        qValuePattern     = Pattern.compile(qualityValue);
+    }
+
+    /**
+     * Parses a media type from a string such as <code>text/html;charset=utf-8;q=0.9</code>.
+     * @param mediaType input string from which to extract mediaType
+     * @return {@link org.apache.any23.servlet.conneg.MediaRangeSpec}
+     */
+    public static MediaRangeSpec parseType(String mediaType) {
+        MediaRangeSpec m = parseRange(mediaType);
+        if (m == null || m.isWildcardType() || m.isWildcardSubtype()) {
+            return null;
+        }
+        return m;
+    }
+
+    /**
+     * Parses a media range from a string such as <code>text/*;charset=utf-8;q=0.9</code>.
+     * Unlike simple media types, media ranges may include wildcards.
+     * @param mediaRange input string from which to extract media range
+     * @return {@link org.apache.any23.servlet.conneg.MediaRangeSpec}
+     */
+    public static MediaRangeSpec parseRange(String mediaRange) {
+        Matcher m = mediaRangePattern.matcher(mediaRange);
+        if (!m.matches()) {
+            return null;
+        }
+        String type = m.group(1).toLowerCase();
+        String subtype = m.group(2).toLowerCase();
+        String unparsedParameters = m.group(3);
+        String qValue = m.group(7);
+        m = parameterPattern.matcher(unparsedParameters);
+        if ("*".equals(type) && !"*".equals(subtype)) {
+            return null;
+        }
+        List<String> parameterNames = new ArrayList<>();
+        List<String> parameterValues = new ArrayList<>();
+        while (m.find()) {
+            String name = m.group(1).toLowerCase();
+            String value = (m.group(3) == null) ? m.group(2) : unescape(m.group(3));
+            parameterNames.add(name);
+            parameterValues.add(value);
+        }
+        double quality = 1.0;
+        if (qValue != null && qValuePattern.matcher(qValue).matches()) {
+            try {
+                quality = Double.parseDouble(qValue);
+            } catch (NumberFormatException ex) {
+                // quality stays at default value
+            }
+        }
+        return new MediaRangeSpec(type, subtype, parameterNames, parameterValues, quality);
+    }
+
+    /**
+     * Parses an HTTP Accept header into a List of MediaRangeSpecs
+     *
+     * @param s an HTTP accept header.
+     * @return A List of MediaRangeSpecs
+     */
+    public static List<MediaRangeSpec> parseAccept(String s) {
+        List<MediaRangeSpec> result = new ArrayList<>();
+        Matcher m = mediaRangePattern.matcher(s);
+        while (m.find()) {
+            result.add(parseRange(m.group()));
+        }
+        return result;
+    }
+
+    private static String unescape(String s) {
+        return s.replaceAll("\\\\(.)", "$1");
+    }
+
+    private static String escape(String s) {
+        return s.replaceAll("[\\\\\"]", "\\\\$0");
+    }
+
+    private MediaRangeSpec(
+            String type,
+            String subtype,
+            List<String> parameterNames, List<String> parameterValues,
+            double quality
+    ) {
+        this.type = type;
+        this.subtype = subtype;
+        this.parameterNames = Collections.unmodifiableList(parameterNames);
+        this.parameterValues = parameterValues;
+        this.mediaType = buildMediaType();
+        this.quality = quality;
+    }
+
+    private String buildMediaType() {
+        StringBuffer result = new StringBuffer();
+        result.append(type);
+        result.append("/");
+        result.append(subtype);
+        for (int i = 0; i < parameterNames.size(); i++) {
+            result.append(";");
+            result.append(parameterNames.get(i));
+            result.append("=");
+            String value = parameterValues.get(i);
+            if (tokenPattern.matcher(value).matches()) {
+                result.append(value);
+            } else {
+                result.append("\"");
+                result.append(escape(value));
+                result.append("\"");
+            }
+        }
+        return result.toString();
+    }
+
+    public String getType() {
+        return type;
+    }
+
+    public String getSubtype() {
+        return subtype;
+    }
+
+    public String getMediaType() {
+        return mediaType;
+    }
+
+    public List<String> getParameterNames() {
+        return parameterNames;
+    }
+
+    public String getParameter(String parameterName) {
+        for (int i = 0; i < parameterNames.size(); i++) {
+            if (parameterNames.get(i).equalsIgnoreCase(parameterName)) {
+                return parameterValues.get(i);
+            }
+        }
+        return null;
+    }
+
+    public boolean isWildcardType() {
+        return "*".equals(type);
+    }
+
+    public boolean isWildcardSubtype() {
+        return !isWildcardType() && "*".equals(subtype);
+    }
+
+    public double getQuality() {
+        return quality;
+    }
+
+    public int getPrecedence(MediaRangeSpec range) {
+        if (range.isWildcardType())
+          return 1;
+        if (!range.type.equals(type))
+          return 0;
+        if (range.isWildcardSubtype())
+          return 2;
+        if (!range.subtype.equals(subtype))
+          return 0;
+        if (range.getParameterNames().isEmpty())
+          return 3;
+        int result = 3;
+        for (int i = 0; i < range.getParameterNames().size(); i++) {
+            String name  = range.getParameterNames().get(i);
+            String value = range.getParameter(name);
+            if (!value.equals(getParameter(name)))
+              return 0;
+            result++;
+        }
+        return result;
+    }
+
+    public MediaRangeSpec getBestMatch(List<MediaRangeSpec> mediaRanges) {
+        MediaRangeSpec result = null;
+        int bestPrecedence = 0;
+        Iterator<MediaRangeSpec> it = mediaRanges.iterator();
+        while (it.hasNext()) {
+            MediaRangeSpec range = it.next();
+            if (getPrecedence(range) > bestPrecedence) {
+                bestPrecedence = getPrecedence(range);
+                result = range;
+            }
+        }
+        return result;
+    }
+
+    @Override
+    public String toString() {
+        return mediaType + ";q=" + quality;
+    }
+}
\ No newline at end of file
diff --git a/src/main/java/org/apache/any23/servlet/conneg/package-info.java b/src/main/java/org/apache/any23/servlet/conneg/package-info.java
new file mode 100644
index 0000000..dda60a0
--- /dev/null
+++ b/src/main/java/org/apache/any23/servlet/conneg/package-info.java
@@ -0,0 +1,21 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *  http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/**
+ * This package provides the <i>Any23</i> content type negotiator.
+ */
+package org.apache.any23.servlet.conneg;
\ No newline at end of file
diff --git a/src/main/java/org/apache/any23/servlet/package-info.java b/src/main/java/org/apache/any23/servlet/package-info.java
new file mode 100644
index 0000000..8d13bb6
--- /dev/null
+++ b/src/main/java/org/apache/any23/servlet/package-info.java
@@ -0,0 +1,22 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *  http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/**
+ * The package defines a servlet exposing <i>Any23</i>
+ * as a <i>REST</i> Service.
+ */
+package org.apache.any23.servlet;
\ No newline at end of file
diff --git a/src/main/resources/form.html b/src/main/resources/form.html
new file mode 100644
index 0000000..7cac3e4
--- /dev/null
+++ b/src/main/resources/form.html
@@ -0,0 +1,460 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML+RDFa 1.0//EN" "http://www.w3.org/MarkUp/DTD/xhtml-rdfa-1.dtd">
+<!--
+  Licensed to the Apache Software Foundation (ASF) under one or more
+  contributor license agreements.  See the NOTICE file distributed with
+  this work for additional information regarding copyright ownership.
+  The ASF licenses this file to You under the Apache License, Version 2.0
+  (the "License"); you may not use this file except in compliance with
+  the License.  You may obtain a copy of the License at
+
+   http://www.apache.org/licenses/LICENSE-2.0
+
+  Unless required by applicable law or agreed to in writing, software
+  distributed under the License is distributed on an "AS IS" BASIS,
+  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+  See the License for the specific language governing permissions and
+  limitations under the License.
+-->
+<html xmlns:lang="en"
+    xmlns:xhtml="http://www.w3.org/1999/xhtml"
+    xmlns:dc="http://purl.org/dc/elements/1.1/">
+  <head>
+    <title>Apache Any23: Anything To Triples - Service ${project.version} (${implementation.build.tstamp})</title>
+    <link rel="stylesheet" type="text/css" href="resources/css/bootstrap.min.css" />
+    <script type="text/javascript" src="resources/js/jquery-1.7.2.min.js"></script>
+    <script type="text/javascript" src="resources/js/bootstrap-modal.js"></script>
+    <script type="application/javascript">
+jQuery( document ).ready( function($)
+{
+    $.each( $( '.app-base-uri' ), function()
+    {
+        $( this ).text( document.location );
+    });
+
+    $( '#app-path' ).text( document.location.pathname );
+    $( '#app-host' ).text( document.location.host );
+} );
+
+function showModal( id )
+{
+    $( id ).modal( 'show' );
+}
+    </script>
+  </head>
+  <body>
+  <div class="container">
+    <a href="http://any23.apache.org/" title="Apache Any23 Dev Site" target="_blank">
+        <img
+            alt="Apache Any23 Dev Site"
+            src="resources/images/logo-any23-214x97.png"
+            width="90"
+        /></a>
+      <a href="http://www.apache.org/" title="Apache Software Foundation" target="_blank">
+        <img
+            alt="Apache Software Foundation"
+            src="resources/images/logo-apache-90x30.png"
+            width="90"
+        /></a>
+
+    <h1>Apache Any23 - Anything To Triples - Live Service Demo</h1>
+    <p>Parses Microformats, RDFa, Microdata, RDF/XML, Turtle, N-Triples, JSON-LD and NQuads.</p>
+    <p>Download and install Any23: visit the <a href="http://any23.apache.org/" target="_blank">Developers Site</a> and the <a href="http://any23.apache.org/getting-started.html" target="_blank">Documentation</a>.
+    <hr />
+    <h2>Convert document at IRI</h2>
+    <form class="well form-horizontal" method="get" action="any23/">
+      <label>Pick an output format and enter the IRI of a web document:</label>
+
+      <div class="control-group">
+        <label class="control-label app-base-uri" for="format">http://.../</label>
+        <div class="controls">
+            <select id="format" name="format">
+            <option value="best" selected="selected">best</option>
+            <option value="turtle">turtle</option>
+            <option value="ntriples">ntriples</option>
+            <option value="rdfxml">rdfxml</option>
+            <option value="nquads">nquads</option>
+            <option value="trix">trix</option>
+            <option value="json">json</option>
+            <option value="jsonld">json-ld</option>
+          </select>/<input type="text" size="50" name="uri" value="http://twitter.com/cygri" />
+        </div>
+      </div>
+      <div class="control-group">
+        <label class="control-label" for="url-openie-get">OpenIE</label>
+          <div class="controls">
+           <label class="checkbox">
+             <input id="url-openie-get" type="checkbox" name="openie">
+             <a href="javascript:showModal( '#sPopup-openie' );">[?]</a>
+          </label>
+        </div>
+      </div>
+      <div class="control-group">
+        <label class="control-label" for="url-validation-get">Validation</label>
+        <div class="controls">
+          <select id="url-validation-get" name="validation-mode" onclick="if(document.getElementById('url-validation-get').value.indexOf('validate') == 0) { document.getElementById('url-report-get').checked = true; }">
+          <option value="none">none</option>
+          <option value="validate">validate</option>
+          <option value="validate-fix">validate+fix</option>
+        </select>
+          <a href="javascript:showModal( '#sPopup-fix' );">[?]</a>
+        </div>
+      </div>
+      <div class="control-group">
+        <label class="control-label" for="url-report">Report</label>
+          <div class="controls">
+           <label class="checkbox">
+             <input id="url-report-get" type="checkbox" name="report">
+             <a href="javascript:showModal( '#sPopup-report' );">[?]</a>
+          </label>
+        </div>
+      </div>
+      <div class="control-group">
+        <label class="control-label" for="url-annotate-get">Annotate</label>
+          <div class="controls">
+           <label class="checkbox">
+             <input id="url-annotate-get" type="checkbox" name="annotate">
+             <a href="javascript:showModal( '#sPopup-annotate' );">[?]</a>
+          </label>
+        </div>
+      </div>
+    <div class="form-actions">
+      <button type="submit" class="btn btn-primary">Convert</button>
+      <button type="reset" class="btn">Cancel</button>
+    </div>
+    </form>
+    <hr />
+
+    <h2>Convert copy&amp;pasted document</h2>
+    <form class="well form-horizontal" method="post" action="any23/">
+      <div class="control-group">
+        <label class="control-label" for="type">Input format</label>
+        <div class="controls">
+            <select id="type" name="type">
+            <option value="">auto-detect</option>
+            <option value="text/html">HTML with Microformats, RDFa (text/html)</option>
+            <option value="application/xhtml+xml">XHTML with Microformats, RDFa, Microdata (application/xhtml+xml)</option>
+            <option value="text/turtle">Turtle (text/turtle)</option>
+            <option value="text/nt">N-Triples (text/nt)</option>
+            <option value="text/nq">N-Quads (text/nq)</option>
+            <option value="application/trix">TriX (application/trix)</option>
+            <option value="application/rdf+xml">RDF/XML (application/rdf+xml)</option>
+            <option value="text/csv">CSV (text/csv)</option>
+            <option value="application/ld+json">JSON-LD (application/ld+json)</option>
+          </select>
+        </div>
+      </div>
+      <div class="control-group">
+        <label class="control-label" for="out-format">Output format</label>
+        <div class="controls">
+            <select id="out-format" name="format">
+            <option value="best" selected="selected">best (content-negotiated)</option>
+            <option value="turtle">turtle</option>
+            <option value="ntriples">ntriples</option>
+            <option value="rdfxml">rdfxml</option>
+            <option value="nquads">nquads</option>
+            <option value="trix">trix</option>
+            <option value="json">json</option>
+            <option value="jsonld">json-ld</option>
+          </select>
+        </div>
+      </div>
+      <div class="control-group">
+        <label class="control-label" for="openie-on-post">OpenIE</label>
+          <div class="controls">
+           <label class="checkbox">
+             <input id="url-openie-post" type="checkbox" name="openie">
+             <a href="javascript:showModal( '#sPopup-openie' );">[?]</a>
+          </label>
+        </div>
+      </div>
+      <div class="control-group">
+        <label class="control-label" for="url-validation-post">Validation</label>
+        <div class="controls">
+          <select id="url-validation-post" name="validation-mode" onclick="if(document.getElementById('url-validation-post').value.indexOf('validate') == 0) { document.getElementById('url-report-post').checked = true; }">
+            <option value="none">none</option>
+            <option value="validate">validate</option>
+            <option value="validate-fix">validate+fix</option>
+          </select>
+          <a href="javascript:showModal( '#sPopup-fix' );">[?]</a>
+        </div>
+      </div>
+      <div class="control-group">
+        <label class="control-label" for="url-report">Report</label>
+          <div class="controls">
+           <label class="checkbox">
+             <input id="url-report-post" type="checkbox" name="report">
+             <a href="javascript:showModal( '#sPopup-report' );">[?]</a>
+          </label>
+        </div>
+      </div>
+      <div class="control-group">
+        <label class="control-label" for="url-annotate-post">Annotate</label>
+          <div class="controls">
+           <label class="checkbox">
+             <input id="url-annotate-post" type="checkbox" name="annotate">
+             <a href="javascript:showModal( '#sPopup-annotate' );">[?]</a>
+          </label>
+        </div>
+      </div>
+
+        <textarea class="span11" name="body" rows="12">@prefix foaf: &lt;http://xmlns.com/foaf/0.1/&gt; .
+
+[] a foaf:Person;
+    foaf:name "John X. Foobar";
+    foaf:mbox_sha1sum "cef817456278b70cee8e5a1611539ef9d928810e";
+    .</textarea>
+      
+    <div class="form-actions">
+      <button type="submit" class="btn btn-primary">Convert</button>
+      <button type="reset" class="btn">Cancel</button>
+    </div>
+
+    </form>
+    <hr />
+
+    <h2>API quick reference</h2>
+    <h3>Examples</h3>
+    <ul>
+      <li><code><a href="best/twitter.com/cygri"><span class="app-base-uri">http://.../</span>best/twitter.com/cygri</a></code></li>
+      <li><code><a href="rdfxml/http://data.gov"><span class="app-base-uri">http://.../</span>rdfxml/http://data.gov</a></code></li>
+      <li><code><a href="ttl/http://www.w3.org/People/Berners-Lee/card"><span class="app-base-uri">http://.../</span>ttl/http://www.w3.org/People/Berners-Lee/card</a></code></li>
+      <li><code><a href="?uri=http://dbpedia.org/resource/Berlin"><span class="app-base-uri">http://.../</span>?uri=http://dbpedia.org/resource/Berlin</a></code></li>
+      <li><code><a href="?format=nt&uri=http://dbpedia.org/resource/Berlin"><span class="app-base-uri">http://.../</span>?format=nt&uri=http://dbpedia.org/resource/Berlin</a></code></li>
+    </ul>
+    <h3>Compact API</h3>
+    <p>HTTP GET requests can be made
+      to IRIs of the shape</p>
+    <pre><span class="app-base-uri">http://.../</span><em>format</em>/<em>input-uri</em></pre>
+    <p>The response is the input document converted to the desired output format.</p>
+
+    <h3>Form-style GET API</h3>
+    <p>HTTP GET requests can be made to
+      the IRI
+      <code class="app-base-uri">http://.../</code> with the following
+      query parameters:
+    </p>
+    <table class="table">
+      <tr><th>uri</th><td>IRI of an input document.</td></tr>
+      <tr><th>format</th><td>Desired output format, defaults to <code>best</code>.</td></tr>
+      <tr><th>validation-mode</th><td>The validation level to be applied on the input. Possible values:<br/>
+          <code>none</code> (no validation applied);<br/>
+          <code>validate</code>(apply validation and produce validation report if <code>annotate</code> flag is enabled);<br/>
+          <code>validate+fix</code>(apply validation, try to fix detection issues and produce validation report if <code>annotate</code> flag is enabled).</td>
+      </tr>
+      <tr><th>annotate</th><td>If specified the output RDF will contain extractor specific scope comments.<br/>Possible values: <code>on</code>/<code>off</code></td></tr>
+      <tr><th>report</th><td>If specified will produce a full XML report containing extraction and validation issues other than produced metadata.<br/>Possible values: <code>on</code>/<code>off</code></td></tr>
+      <tr><th>openie</th><td>If specified the <a href="https://github.com/allenai/openie-standalone" target="_blank">
+      Open Information Extraction (Open IE) system</a> will be activated (default off).<br/>Possible values: <code>on</code>/<code>off</code></td></tr>
+    </table>
+    Formatting the URL according to the above will return an HTTP <i>302</i> redirect to <code><span class="app-base-uri">http://...</span>any23/<em>format</em></code>.<br/>
+    <p>The response is the input document converted to the desired output format.</p>
+
+    <h3>Direct POST API</h3>
+    <p>HTTP POSTing a document body to
+      <code><span class="app-base-uri">http://.../</span><em>format</em></code> will convert
+      the document to the specified output format. <br/>
+      The media type of the input
+      has to be specified in the <code>Content-Type</code> HTTP header.
+      Depending on the servlet container, a <code>Content-Length</code> header specifying
+      the length of the input document in bytes might also be required.<br/>
+      Typical media types for supported input formats are:
+    </p>
+    <table class="table">
+      <tr><th>Input format</th><th>Media type</th></tr>
+      <tr><th>HTML</th><td><code>text/html</code></td></tr>
+      <tr><th>RDF/XML</th><td><code>application/rdf+xml</code></td></tr>
+      <tr><th>Turtle</th><td><code>text/turtle</code></td></tr>
+      <tr><th>N-Triples</th><td><code>text/nt</code></td></tr>
+      <tr><th>N-Quads</th><td><code>text/nq</code></td></tr>
+      <tr><th>TriX</th><td><code>application/trix</code></td></tr>
+    </table>
+    <p>Example POST request:</p>
+    <pre>POST <span id="app-path">/</span>rdfxml HTTP/1.0
+Host: <span id="app-host">example.com</span>
+Content-Type: text/turtle
+Content-Length: 174
+
+@prefix foaf: &lt;http://xmlns.com/foaf/0.1/&gt; .
+
+[] a foaf:Person;
+    foaf:name "John X. Foobar";
+    foaf:mbox_sha1sum "cef817456278b70cee8e5a1611539ef9d928810e";
+    .</pre>
+
+    <h3>Form-style POST API</h3>
+    <p>A document body can also be converted by HTTP POSTing form data to
+      <code><span class="app-base-uri">http://.../</span></code>. <br/>
+      The <code>Content-Type</code> HTTP header must be set to
+      <code>application/x-www-form-urlencoded</code>. The following
+      parameters are supported:
+    </p>
+    <table class="table">
+      <tr><th>type</th><td>Media type of the input, see the table above. If not present, auto-detection will be attempted.</td></tr>
+      <tr><th>body</th><td>Document body to be converted.</td></tr>
+      <tr><th>format</th><td>Desired output format; defaults to <code>best</code>.</td></tr>
+      <tr><th>validation-mode</th><td>The validation level to be applied on the input. Possible values:<br/>
+        <code>none</code> (no validation applied);<br/>
+        <code>validate</code>(apply validation and produce validation report if <code>annotate</code> flag is enabled);<br/>
+        <code>validate+fix</code>(apply validation, try to fix detection issues and produce validation report if <code>annotate</code> flag is enabled).</td>
+      </tr>
+      <tr><th>annotate</th><td>If specified the output RDF will contain extractor specific scope comments.<br/>Possible values: <code>on</code>/<code>off</code></td></tr>
+      <tr><th>report</th><td>If specified will produce a full XML report containing extraction and validation issues other than produced metadata.<br/>Possible values: <code>on</code>/<code>off</code></td></tr>
+      <tr><th>openie</th><td>If specified the <a href="https://github.com/allenai/openie-standalone" target="_blank">
+      Open Information Extraction (Open IE) system</a> will be activated (default off).<br/>Possible values: <code>on</code>/<code>off</code></td></tr>
+    </table>
+
+    <h3>Output formats</h3>
+    <p>Supported output format identifiers are:</p>
+    <ul>
+      <li><code>best</code> for content negotiation according to the client's <code>Accept</code> HTTP header</li>
+      <li><code>turtle</code>, <code>ttl</code>, <code>n3</code> for
+        <a href="https://www.w3.org/TR/turtle/" target="_blank">Turtle</a>/<a href="https://www.w3.org/TeamSubmission/n3/" target="_blank">N3</a></li>
+      <li><code>ntriples</code>, <code>nt</code> for
+        <a href="https://www.w3.org/TR/n-triples/" target="_blank">N-Triples</a></li>
+      <li><code>nquads</code>, <code>nq</code> for
+        <a href="https://www.w3.org/TR/n-quads/" target="_blank">N-Quads</a></li>
+      <li><code>trix</code> for
+        <a href="http://www.w3.org/2004/03/trix/" target="_blank">TriX</a></li>
+      <li><code>rdfxml</code>, <code>rdf</code>, <code>xml</code> for
+        <a href="http://www.w3.org/TR/rdf-syntax-grammar/" target="_blank">RDF/XML</a></li>
+      <li><code>json</code> for <a href="http://json.org/" target="_blank">JSON</a></li>
+      <li><code>jsonld</code> for <a href="https://json-ld.org/" target="_blank">JSON-LD</a></li>
+    </ul>
+
+    <h3>Error reporting</h3>
+    <p>Processing errors are indicated via
+      HTTP status codes and brief <code>text/plain</code> error messages.
+      The following status codes can be returned:</p>
+    <table class="table">
+      <thead>
+        <tr><th>Code</th><th>Reason</th></tr>
+      </thead>
+      <tbody>
+        <tr><th>200 OK</th><td>Success</td></tr>
+        <tr><th>400 Bad Request</th><td>Missing or malformed input parameter</td></tr>
+        <tr><th>404 Not Found</th><td>Malformed request IRI</td></tr>
+        <tr><th>406 Not Acceptable</th><td>None of the media types specified in the <code>Accept</code> header are supported</td></tr>
+        <tr><th>415 Unsupported Media Type</th><td>Document body with unsupported media type was POSTed</td></tr>
+        <tr><th>501 Not Implemented</th><td>Extraction from input was successful, but yielded zero triples</td></tr>
+        <tr><th>502 Bad Gateway</th><td>Input document from a remote server could not be fetched or parsed</td></tr>
+      </tbody>
+    </table>
+    <h3>Report Format</h3>
+    <p>The XML report format is subjected to changes. The current content is described in section
+       <a href="http://any23.apache.org/service.html" target="_blank">Any23 Service</a>.
+    </p>
+    <hr />
+    <p><b>Apache Any23 v.${project.version} (${implementation.build.tstamp})</b></p>
+    <p><a href="http://any23.apache.org/" target="_blank">Any23 project homepage</a> | Hosted at <a href="http://apache.org/" target="_blank">Apache Software Foundation</a></p>
+
+    <div id="sPopup-openie" class="modal hide fade">
+      <div class="modal-header">
+        <button type="button" class="close">×</button>
+        <h3>Open Information Extraction</h3>
+      </div>
+      <div class="modal-body">
+        <p>
+        If the <i>OpenIE</i> checkbox is selected, the <b>Any23</b> service will activate the
+        <a href="https://github.com/allenai/openie-standalone" target="_blank">Open Information Extraction (Open IE) system</a>, 
+        enhancing extraction results.</p>
+        <p>The Open IE system runs over sentences and creates extractions that represent relations in text, in the case 
+        of Any23, this results in triples. The confidence of relationships extracted from text are based on a 
+        configurable threshold established in 
+        <code>https://github.com/apache/any23/blob/master/api/src/main/resources/default-configuration.properties</code>.
+        </p>
+      </div>
+      <div class="modal-footer">
+        <a href="#" class="btn">Close</a>
+      </div>
+    </div>
+
+    <div id="sPopup-fix" class="modal hide fade">
+      <div class="modal-header">
+        <button type="button" class="close" >×</button>
+        <h3>Validation</h3>
+      </div>
+      <div class="modal-body">
+        <p> 
+          The <b>Any23</b> service tries to fix some common issues before performing a metadata 
+          extraction. The fixing is performed according a set of fully customizable rules.
+        </p>
+        <p>
+          The following <i>Validation</i> options are available.
+        </p>
+        <ul>
+          <li><b>none</b>: no validation will be performed;</li>
+          <li><b>validate</b>: common errors within the document will be detected and reported. When selected this option the
+              <b>Report</b> flag will be activated to visualize the validation outcome;</li>
+          <li><b>validate+fix</b>: the common issues will be detected and a fix will be applied when available.</li>
+        </ul>
+        <p>
+          Please refer to the <a href="http://any23.apache.org/dev-validation-fix.html" target="_blank">Developer Guide</a>
+          for any further detail.
+        </p>
+      </div>
+      <div class="modal-footer">
+        <a href="#" class="btn" >Close</a>
+      </div>
+    </div>
+
+    <div id="sPopup-report" class="modal hide fade">
+      <div class="modal-header">
+        <button type="button" class="close">×</button>
+        <h3>Report</h3>
+      </div>
+      <div class="modal-body">
+        <p>
+        If the <i>Report</i> checkbox is selected, the <b>Any23</b> service returns an <b>XML</b> output containing,
+        other then the <b>extracted RDF statements</b>, other information as the list of the <b>activated extractors</b>
+        and the <b>detected errors</b>.
+        </p>
+        <p>
+        If the <b>validation</b> or <b>validation and fix</b> has been activated then the report contains also a list
+        of the applied fixes.
+        </p>
+      </div>
+      <div class="modal-footer">
+        <a href="#" class="btn">Close</a>
+      </div>
+    </div>
+
+    <div id="sPopup-annotate" class="modal hide fade">
+      <div class="modal-header">
+        <button type="button" class="close">×</button>
+        <h3>Annotate</h3>
+      </div>
+      <div class="modal-body">
+        <p>
+        If the <i>Annotate</i> checkbox is selected, the <b>Any23</b> service returns an output expressed in the
+        selected <b>RDF</b> format containing also specific format <b>comments</b> describing the activated extractor
+        scopes for every produced statement.
+        </p>
+      </div>
+      <div class="modal-footer">
+        <a href="#" class="btn">Close</a>
+      </div>
+    </div>
+
+  </div>
+
+  <footer class="footer">
+  <div class="container-fluid">
+  Copyright &copy; ${project.inceptionYear}-2018 The <a href="http://www.apache.org/">Apache Software Foundation</a>. All Rights Reserved.<br/> Apache Any23, Apache, the Apache feather logo, and the Apache Any23 project logos are trademarks of The Apache Software Foundation. All other marks mentioned may be trademarks or registered trademarks of their respective owners.
+  </div>
+  </footer>
+
+  <!-- Google Analytics Tracker code. By default configured to report to the Any23 community group.
+  To change this default behavior please specify your custom ID in parent POM (form.tracker.id property)
+  or delete this script block to disable. -->
+  <script>
+    (function(i,s,o,g,r,a,m){i['GoogleAnalyticsObject']=r;i[r]=i[r]||function(){
+    (i[r].q=i[r].q||[]).push(arguments)},i[r].l=1*new Date();a=s.createElement(o),
+    m=s.getElementsByTagName(o)[0];a.async=1;a.src=g;m.parentNode.insertBefore(a,m)
+    })(window,document,'script','//www.google-analytics.com/analytics.js','ga');
+    ga('create', '${form.tracker.id}', 'auto');
+    ga('send', 'pageview');
+  </script>
+
+  </body>
+</html>
diff --git a/src/main/webapp/WEB-INF/web.xml b/src/main/webapp/WEB-INF/web.xml
new file mode 100644
index 0000000..bf0cdc4
--- /dev/null
+++ b/src/main/webapp/WEB-INF/web.xml
@@ -0,0 +1,43 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE web-app PUBLIC
+ "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
+ "http://java.sun.com/dtd/web-app_2_3.dtd" >
+<!--
+  Licensed to the Apache Software Foundation (ASF) under one or more
+  contributor license agreements.  See the NOTICE file distributed with
+  this work for additional information regarding copyright ownership.
+  The ASF licenses this file to You under the Apache License, Version 2.0
+  (the "License"); you may not use this file except in compliance with
+  the License.  You may obtain a copy of the License at
+
+   http://www.apache.org/licenses/LICENSE-2.0
+
+  Unless required by applicable law or agreed to in writing, software
+  distributed under the License is distributed on an "AS IS" BASIS,
+  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+  See the License for the specific language governing permissions and
+  limitations under the License.
+-->
+<web-app>
+
+  <display-name>Apache Any23 (Anything to Triples)</display-name>
+
+  <servlet>
+    <servlet-name>any23</servlet-name>
+    <servlet-class>org.apache.any23.servlet.Servlet</servlet-class>
+  </servlet>
+  <servlet>
+    <servlet-name>redirect</servlet-name>
+    <servlet-class>org.apache.any23.servlet.RedirectServlet</servlet-class>
+  </servlet>
+
+  <servlet-mapping>
+    <servlet-name>any23</servlet-name>
+    <url-pattern>/any23/*</url-pattern>
+  </servlet-mapping>
+  <servlet-mapping>
+    <servlet-name>redirect</servlet-name>
+    <url-pattern>/*</url-pattern>
+  </servlet-mapping>
+
+</web-app>
diff --git a/src/main/webapp/resources/css/bootstrap.min.css b/src/main/webapp/resources/css/bootstrap.min.css
new file mode 100644
index 0000000..b74b454
--- /dev/null
+++ b/src/main/webapp/resources/css/bootstrap.min.css
@@ -0,0 +1,9 @@
+/*!
+ * Bootstrap v2.0.4
+ *
+ * Copyright 2012 Twitter, Inc
+ * Licensed under the Apache License v2.0
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Designed and built with all the love in the world @twitter by @mdo and @fat.
+ */article,aside,details,figcaption,figure,footer,header,hgroup,nav,section{display:block}audio,canvas,video{display:inline-block;*display:inline;*zoom:1}audio:not([controls]){display:none}html{font-size:100%;-webkit-text-size-adjust:100%;-ms-text-size-adjust:100%}a:focus{outline:thin dotted #333;outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}a:hover,a:active{outline:0}sub,sup{position:relative;font-size:75%;line-height:0;vertical-align:baseline}sup{top:-0.5em}sub{bottom:- [...]
diff --git a/src/main/webapp/resources/images/logo-any23-214x97.png b/src/main/webapp/resources/images/logo-any23-214x97.png
new file mode 100644
index 0000000..9d84c2a
Binary files /dev/null and b/src/main/webapp/resources/images/logo-any23-214x97.png differ
diff --git a/src/main/webapp/resources/images/logo-apache-90x30.png b/src/main/webapp/resources/images/logo-apache-90x30.png
new file mode 100644
index 0000000..c44eb11
Binary files /dev/null and b/src/main/webapp/resources/images/logo-apache-90x30.png differ
diff --git a/src/main/webapp/resources/js/bootstrap-modal.js b/src/main/webapp/resources/js/bootstrap-modal.js
new file mode 100644
index 0000000..11b951e
--- /dev/null
+++ b/src/main/webapp/resources/js/bootstrap-modal.js
@@ -0,0 +1,222 @@
+/* =========================================================
+ * bootstrap-modal.js v2.0.4
+ * http://twitter.github.com/bootstrap/javascript.html#modals
+ * =========================================================
+ * Copyright 2012 Twitter, Inc.
+ *
+ * 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.
+ * ========================================================= */
+
+!function ($) {
+
+  "use strict";
+
+ /* MODAL CLASS DEFINITION
+  * ====================== */
+
+  var Modal = function (content, options) {
+    this.options = options
+    this.$element = $(content)
+      .delegate('[data-dismiss="modal"]', 'click.dismiss.modal', $.proxy(this.hide, this))
+  }
+
+  Modal.prototype = {
+
+      constructor: Modal
+
+    , toggle: function () {
+        return this[!this.isShown ? 'show' : 'hide']()
+      }
+
+    , show: function () {
+        var that = this
+          , e = $.Event('show')
+
+        this.$element.trigger(e)
+
+        if (this.isShown || e.isDefaultPrevented())
+          return
+
+        $('body').addClass('modal-open')
+
+        this.isShown = true
+
+        escape.call(this)
+        backdrop.call(this, function () {
+          var transition = $.support.transition && that.$element.hasClass('fade')
+
+          if (!that.$element.parent().length) {
+            that.$element.appendTo(document.body) //don't move modals dom position
+          }
+
+          that.$element
+            .show()
+
+          if (transition) {
+            that.$element[0].offsetWidth // force reflow
+          }
+
+          that.$element.addClass('in')
+
+          transition ?
+            that.$element.one($.support.transition.end, function () { that.$element.trigger('shown') }) :
+            that.$element.trigger('shown')
+
+        })
+      }
+
+    , hide: function (e) {
+        e && e.preventDefault()
+
+        var that = this
+
+        e = $.Event('hide')
+
+        this.$element.trigger(e)
+
+        if (!this.isShown || e.isDefaultPrevented())
+          return
+
+        this.isShown = false
+
+        $('body').removeClass('modal-open')
+
+        escape.call(this)
+
+        this.$element.removeClass('in')
+
+        $.support.transition && this.$element.hasClass('fade') ?
+          hideWithTransition.call(this) :
+          hideModal.call(this)
+      }
+
+  }
+
+
+ /* MODAL PRIVATE METHODS
+  * ===================== */
+
+  function hideWithTransition() {
+    var that = this
+      , timeout = setTimeout(function () {
+          that.$element.off($.support.transition.end)
+          hideModal.call(that)
+        }, 500)
+
+    this.$element.one($.support.transition.end, function () {
+      clearTimeout(timeout)
+      hideModal.call(that)
+    })
+  }
+
+  function hideModal(that) {
+    this.$element
+      .hide()
+      .trigger('hidden')
+
+    backdrop.call(this)
+  }
+
+  function backdrop(callback) {
+    var that = this
+      , animate = this.$element.hasClass('fade') ? 'fade' : ''
+
+    if (this.isShown && this.options.backdrop) {
+      var doAnimate = $.support.transition && animate
+
+      this.$backdrop = $('<div class="modal-backdrop ' + animate + '" />')
+        .appendTo(document.body)
+
+      if (this.options.backdrop != 'static') {
+        this.$backdrop.click($.proxy(this.hide, this))
+      }
+
+      if (doAnimate)
+        this.$backdrop[0].offsetWidth // force reflow
+
+      this.$backdrop.addClass('in')
+
+      doAnimate ?
+        this.$backdrop.one($.support.transition.end, callback) :
+        callback()
+
+    } else if (!this.isShown && this.$backdrop) {
+      this.$backdrop.removeClass('in')
+
+      $.support.transition && this.$element.hasClass('fade')?
+        this.$backdrop.one($.support.transition.end, $.proxy(removeBackdrop, this)) :
+        removeBackdrop.call(this)
+
+    } else if (callback) {
+      callback()
+    }
+  }
+
+  function removeBackdrop() {
+    this.$backdrop.remove()
+    this.$backdrop = null
+  }
+
+  function escape() {
+    var that = this
+    if (this.isShown && this.options.keyboard) {
+      $(document).on('keyup.dismiss.modal', function ( e ) {
+        e.which == 27 && that.hide()
+      })
+    } else if (!this.isShown) {
+      $(document).off('keyup.dismiss.modal')
+    }
+  }
+
+
+ /* MODAL PLUGIN DEFINITION
+  * ======================= */
+
+  $.fn.modal = function (option) {
+    return this.each(function () {
+      var $this = $(this)
+        , data = $this.data('modal')
+        , options = $.extend({}, $.fn.modal.defaults, $this.data(), typeof option == 'object' && option)
+      if (!data)
+        $this.data('modal', (data = new Modal(this, options)))
+      if (typeof option == 'string')
+        data[option]()
+      else if (options.show)
+        data.show()
+    })
+  }
+
+  $.fn.modal.defaults = {
+      backdrop: true
+    , keyboard: true
+    , show: true
+  }
+
+  $.fn.modal.Constructor = Modal
+
+
+ /* MODAL DATA-API
+  * ============== */
+
+  $(function () {
+    $('body').on('click.modal.data-api', '[data-toggle="modal"]', function ( e ) {
+      var $this = $(this), href
+        , $target = $($this.attr('data-target') || (href = $this.attr('href')) && href.replace(/.*(?=#[^\s]+$)/, '')) //strip for ie7
+        , option = $target.data('modal') ? 'toggle' : $.extend({}, $target.data(), $this.data())
+
+      e.preventDefault()
+      $target.modal(option)
+    })
+  })
+
+}(window.jQuery);
\ No newline at end of file
diff --git a/src/main/webapp/resources/js/jquery-1.7.2.min.js b/src/main/webapp/resources/js/jquery-1.7.2.min.js
new file mode 100644
index 0000000..16ad06c
--- /dev/null
+++ b/src/main/webapp/resources/js/jquery-1.7.2.min.js
@@ -0,0 +1,4 @@
+/*! jQuery v1.7.2 jquery.com | jquery.org/license */
+(function(a,b){function cy(a){return f.isWindow(a)?a:a.nodeType===9?a.defaultView||a.parentWindow:!1}function cu(a){if(!cj[a]){var b=c.body,d=f("<"+a+">").appendTo(b),e=d.css("display");d.remove();if(e==="none"||e===""){ck||(ck=c.createElement("iframe"),ck.frameBorder=ck.width=ck.height=0),b.appendChild(ck);if(!cl||!ck.createElement)cl=(ck.contentWindow||ck.contentDocument).document,cl.write((f.support.boxModel?"<!doctype html>":"")+"<html><body>"),cl.close();d=cl.createElement(a),cl.bod [...]
+a){var b=F.exec(a);b&&(b[1]=(b[1]||"").toLowerCase(),b[3]=b[3]&&new RegExp("(?:^|\\s)"+b[3]+"(?:\\s|$)"));return b},H=function(a,b){var c=a.attributes||{};return(!b[1]||a.nodeName.toLowerCase()===b[1])&&(!b[2]||(c.id||{}).value===b[2])&&(!b[3]||b[3].test((c["class"]||{}).value))},I=function(a){return f.event.special.hover?a:a.replace(B,"mouseenter$1 mouseleave$1")};f.event={add:function(a,c,d,e,g){var h,i,j,k,l,m,n,o,p,q,r,s;if(!(a.nodeType===3||a.nodeType===8||!c||!d||!(h=f._data(a)))){ [...]
+.clean(arguments);a.push.apply(a,this.toArray());return this.pushStack(a,"before",arguments)}},after:function(){if(this[0]&&this[0].parentNode)return this.domManip(arguments,!1,function(a){this.parentNode.insertBefore(a,this.nextSibling)});if(arguments.length){var a=this.pushStack(this,"after",arguments);a.push.apply(a,f.clean(arguments));return a}},remove:function(a,b){for(var c=0,d;(d=this[c])!=null;c++)if(!a||f.filter(a,[d]).length)!b&&d.nodeType===1&&(f.cleanData(d.getElementsByTagNa [...]
\ No newline at end of file
diff --git a/src/test/java/org/apache/any23/servlet/ServletTest.java b/src/test/java/org/apache/any23/servlet/ServletTest.java
new file mode 100644
index 0000000..a09982a
--- /dev/null
+++ b/src/test/java/org/apache/any23/servlet/ServletTest.java
@@ -0,0 +1,525 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *  http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.any23.servlet;
+
+import java.io.File;
+import java.io.IOException;
+import java.net.URISyntaxException;
+import java.net.URLEncoder;
+import org.apache.any23.http.HTTPClient;
+import org.apache.any23.source.DocumentSource;
+import org.apache.any23.source.FileDocumentSource;
+import org.apache.any23.source.StringDocumentSource;
+import org.apache.any23.util.StringUtils;
+import org.junit.After;
+import org.junit.Assert;
+import org.junit.Before;
+import org.junit.Test;
+import org.eclipse.jetty.http.HttpTester;
+import org.eclipse.jetty.servlet.ServletTester;
+
+/**
+ * Test case for {@link Servlet} class.
+ */
+// TODO: some test verifications are not strict enough.
+//       The assertContainsTag() doesn't verify the entire output content.
+public class ServletTest {
+
+    private static String content;
+    private static String acceptHeader;
+    private static String requestedIRI;
+
+    private ServletTester tester;
+
+    @Before
+    public void setUp() throws Exception {
+        tester = new ServletTester();
+        tester.setContextPath("/");
+        tester.addServlet(TestableServlet.class, "/*");
+        tester.start();
+        content = "test";
+        acceptHeader = null;
+        requestedIRI = null;
+    }
+
+    @After
+    public void tearDown() throws Exception {
+        tester.stop();
+        tester = null;
+    }
+
+    @Test
+    public void testGETOnlyFormat() throws Exception {
+        HttpTester.Response response = doGetRequest("/xml");
+        Assert.assertEquals(404, response.getStatus());
+        assertContains("Missing IRI", response.getContent());
+    }
+
+    @Test
+    public void testGETWrongFormat() throws Exception {
+        HttpTester.Response response = doGetRequest("/dummy/foo.com");
+        Assert.assertEquals(400, response.getStatus());
+        assertContains("Invalid format", response.getContent());
+    }
+
+    @Test
+    public void testGETInvalidIRI() throws Exception {
+        HttpTester.Response response = doGetRequest("/xml/mailto:richard@cyganiak.de");
+        Assert.assertEquals(400, response.getStatus());
+        assertContains("Invalid input IRI", response.getContent());
+    }
+
+    @Test
+    public void testGETWorks() throws Exception {
+        content = "<html><body><div class=\"vcard fn\">Joe</div></body></html>";
+        HttpTester.Response response = doGetRequest("/nt/foo.com/bar.html");
+        Assert.assertEquals(200, response.getStatus());
+        Assert.assertEquals("http://foo.com/bar.html", requestedIRI);
+        String res = response.getContent();
+        assertContains(
+                "<http://www.w3.org/1999/02/22-rdf-syntax-ns#type> <http://www.w3.org/2006/vcard/ns#VCard>",
+                res
+        );
+    }
+
+    @Test
+    public void testGETAddsHTTPScheme() throws Exception {
+        content = "<html><body><div class=\"vcard fn\">Joe</div></body></html>";
+        HttpTester.Response response = doGetRequest("/nt/foo.com");
+        Assert.assertEquals(200, response.getStatus());
+        Assert.assertEquals("http://foo.com", requestedIRI);
+    }
+
+    @Test
+    public void testGETIncludesQueryString() throws Exception {
+        content = "<html><body><div class=\"vcard fn\">Joe</div></body></html>";
+        HttpTester.Response response = doGetRequest("/nt/http://foo.com?id=1");
+        Assert.assertEquals(200, response.getStatus());
+        Assert.assertEquals("http://foo.com?id=1", requestedIRI);
+    }
+
+    @Test
+    public void testGETwithIRIinParam() throws Exception {
+        content = "<html><body><div class=\"vcard fn\">Joe</div></body></html>";
+        HttpTester.Response response = doGetRequest("/nt?uri=http://foo.com?id=1");
+        Assert.assertEquals(200, response.getStatus());
+        Assert.assertEquals("http://foo.com?id=1", requestedIRI);
+    }
+
+    @Test
+    public void testGETwithFormatAndIRIinParam() throws Exception {
+        content = "<html><body><div class=\"vcard fn\">Joe</div></body></html>";
+        HttpTester.Response response = doGetRequest("/?format=nt&uri=http://foo.com?id=1");
+        Assert.assertEquals(200, response.getStatus());
+        Assert.assertEquals("http://foo.com?id=1", requestedIRI);
+    }
+
+    @Test
+    public void testGETwithURLDecoding() throws Exception {
+        content = "<html><body><div class=\"vcard fn\">Joe</div></body></html>";
+        HttpTester.Response response = doGetRequest("/nt/http%3A%2F%2Ffoo.com");
+        Assert.assertEquals(200, response.getStatus());
+        Assert.assertEquals("http://foo.com", requestedIRI);
+    }
+
+    @Test
+    public void testGETwithURLDecodingInParam() throws Exception {
+        content = "<html><body><div class=\"vcard fn\">Joe</div></body></html>";
+        HttpTester.Response response = doGetRequest("/nt?uri=http%3A%2F%2Ffoo.com");
+        Assert.assertEquals(200, response.getStatus());
+        Assert.assertEquals("http://foo.com", requestedIRI);
+    }
+
+    @Test
+    public void testPOSTNothing() throws Exception {
+        HttpTester.Response response = doPostRequest("/", "", null);
+        Assert.assertEquals(400, response.getStatus());
+        assertContains("Invalid POST request", response.getContent());
+    }
+
+    @Test
+    public void testPOSTWorks() throws Exception {
+        content = "<html><body><div class=\"vcard fn\">Joe</div></body></html>";
+        HttpTester.Response response = doPostRequest("/", "format=nt&uri=http://foo.com", "application/x-www-form-urlencoded");
+        Assert.assertEquals(200, response.getStatus());
+        Assert.assertEquals("http://foo.com", requestedIRI);
+        String res = response.getContent();
+        assertContains("<http://www.w3.org/1999/02/22-rdf-syntax-ns#type> <http://www.w3.org/2006/vcard/ns#VCard>", res);
+    }
+
+    @Test
+    public void testPOSTWorksWithParametersOnContentType() throws Exception {
+        content = "<html><body><div class=\"vcard fn\">Joe</div></body></html>";
+        HttpTester.Response response = doPostRequest(
+                "/",
+                "format=nt&uri=http://foo.com",
+                "application/x-www-form-urlencoded;charset=UTF-8"
+        );
+        Assert.assertEquals(200, response.getStatus());
+        Assert.assertEquals("http://foo.com", requestedIRI);
+        String res = response.getContent();
+        assertContains(
+                "<http://www.w3.org/1999/02/22-rdf-syntax-ns#type> <http://www.w3.org/2006/vcard/ns#VCard>",
+                res
+        );
+    }
+
+    @Test
+    public void testPOSTBodyWorks() throws Exception {
+        String body = "<html><body><div class=\"vcard fn\">Joe</div></body></html>";
+        HttpTester.Response response = doPostRequest("/nt", body, "text/html");
+        Assert.assertEquals(200, response.getStatus());
+        String res = response.getContent();
+        assertContains(
+                "<http://www.w3.org/1999/02/22-rdf-syntax-ns#type> <http://www.w3.org/2006/vcard/ns#VCard>",
+                res
+        );
+        Assert.assertNull(requestedIRI);
+    }
+
+    @Test
+    public void testPOSTBodyInParamWorks() throws Exception {
+        String body = URLEncoder.encode("<html><body><div class=\"vcard fn\">Joe</div></body></html>", "utf-8");
+        HttpTester.Response response = doPostRequest("/", "format=nt&body=" + body,
+                "application/x-www-form-urlencoded");
+        Assert.assertEquals(200, response.getStatus());
+        String res = response.getContent();
+        assertContains(
+                "<http://www.w3.org/1999/02/22-rdf-syntax-ns#type> <http://www.w3.org/2006/vcard/ns#VCard>",
+                res
+        );
+        Assert.assertNull(requestedIRI);
+    }
+
+    @Test
+    public void testPOSTonlyIRI() throws Exception {
+        content = "<html><body><div class=\"vcard fn\">Joe</div></body></html>";
+        HttpTester.Response response = doPostRequest("/", "uri=http://foo.com", "application/x-www-form-urlencoded");
+        Assert.assertEquals(200, response.getStatus());
+        String res = response.getContent();
+        assertContains("a vcard:VCard", res);
+    }
+
+    @Test
+    public void testPOSTonlyFormat() throws Exception {
+        HttpTester.Response response = doPostRequest("/", "format=rdf", "application/x-www-form-urlencoded");
+        Assert.assertEquals(400, response.getStatus());
+        assertContains("uri", response.getContent());
+    }
+
+    /**
+     *
+     * @throws Exception if there is an error asserting test data
+     */
+    @Test
+    public void testGETwithURLEncoding() throws Exception {
+        content = null;
+        HttpTester.Response response = doGetRequest("/best/http://dbpedia.org/resource/Knud_M%C3%B6ller");
+        Assert.assertEquals(200, response.getStatus());
+    }
+
+    /**
+     *
+     * @throws Exception if there is an error asserting test data
+     */
+    @Test
+    public void testGETwithURLEncodingWithQuery() throws Exception {
+        content = null;
+        HttpTester.Response response = doGetRequest("/best/https://en.wikipedia.org/wiki/Knud_M%C3%B6ller?oldid=717712065");
+        Assert.assertEquals(200, response.getStatus());
+    }
+
+    /**
+     * This test has been disabled in order to avoid external resources
+     * dependencies
+     *
+     * @throws Exception if there is an error asserting test data
+     */
+    @Test
+    public void testGETwithURLEncodingWithFragment() throws Exception {
+        content = null;
+        HttpTester.Response response = doGetRequest("/best/http://dbpedia.org/resource/Knud_M%C3%B6ller#title");
+        Assert.assertEquals(200, response.getStatus());
+    }
+
+    @Test
+    public void testCorrectBaseIRI() throws Exception {
+        content = "@prefix foaf: <http://xmlns.com/foaf/0.1/> . <> a foaf:Document .";
+        HttpTester.Response response = doGetRequest("/nt/foo.com/test.n3");
+        Assert.assertEquals(200, response.getStatus());
+        assertContains("<http://foo.com/test.n3>", response.getContent());
+    }
+
+    @Test
+    public void testDefaultBaseIRIinPOST() throws Exception {
+        String body = "@prefix foaf: <http://xmlns.com/foaf/0.1/> . <> a foaf:Document .";
+        HttpTester.Response response = doPostRequest("/nt", body, "text/rdf+n3;charset=utf-8");
+        Assert.assertEquals(200, response.getStatus());
+        assertContains("<" + Servlet.DEFAULT_BASE_IRI + ">", response.getContent());
+    }
+
+    @Test
+    public void testPOSTwithoutContentType() throws Exception {
+        String body = "@prefix foaf: <http://xmlns.com/foaf/0.1/> . <http://example.com/asdf> a foaf:Document .";
+        HttpTester.Response response = doPostRequest("/nt", body, null);
+        Assert.assertEquals(400, response.getStatus());
+        assertContains("Content-Type", response.getContent());
+    }
+
+    @Test
+    public void testPOSTwithContentTypeParam() throws Exception {
+        String body = URLEncoder.encode("<http://foo.bar> <http://foo.bar> <http://foo.bar> .", "utf-8");
+        HttpTester.Response response = doPostRequest("/", "format=nt&body=" + body + "&type=application/x-foobar",
+                "application/x-www-form-urlencoded");
+        Assert.assertEquals(415, response.getStatus());
+    }
+
+    @Test
+    public void testPOSTbodyMissingFormat() throws Exception {
+        HttpTester.Response response = doPostRequest(
+                "/",
+                "<html><body><div class=\"vcard fn\">Joe</div></body></html>", "text/html"
+        );
+        Assert.assertEquals(200, response.getStatus());
+        String res = response.getContent();
+        assertContains("a vcard:VCard", res);
+    }
+
+    @Test
+    public void testContentNegotiationDefaultsToTurtle() throws Exception {
+        content = "<html><body><div class=\"vcard fn\">Joe</div></body></html>";
+        HttpTester.Response response = doGetRequest("/best/http://foo.com");
+        Assert.assertEquals(200, response.getStatus());
+        Assert.assertEquals("http://foo.com", requestedIRI);
+        assertContains("a vcard:VCard", response.getContent());
+    }
+
+    @Test
+    public void testContentNegotiationForWildcardReturnsTurtle() throws Exception {
+        content = "<html><body><div class=\"vcard fn\">Joe</div></body></html>";
+        acceptHeader = "*/*";
+        HttpTester.Response response = doGetRequest("/best/http://foo.com");
+        Assert.assertEquals(200, response.getStatus());
+        Assert.assertEquals("http://foo.com", requestedIRI);
+        assertContains("a vcard:VCard", response.getContent());
+    }
+
+    @Test
+    public void testContentNegotiationForUnacceptableFormatReturns406() throws Exception {
+        content = "<html><body><div class=\"vcard fn\">Joe</div></body></html>";
+        acceptHeader = "image/jpeg";
+        HttpTester.Response response = doGetRequest("/best/http://foo.com");
+        Assert.assertEquals(406, response.getStatus());
+        Assert.assertNull(requestedIRI);
+    }
+
+    @Test
+    public void testContentNegotiationForTurtle() throws Exception {
+        content = "<html><body><div class=\"vcard fn\">Joe</div></body></html>";
+        acceptHeader = "text/turtle";
+        HttpTester.Response response = doGetRequest("/best/http://foo.com");
+        Assert.assertEquals(200, response.getStatus());
+        Assert.assertEquals("http://foo.com", requestedIRI);
+        assertContains("a vcard:VCard", response.getContent());
+    }
+
+    @Test
+    public void testContentNegotiationForTurtleAlias() throws Exception {
+        content = "<html><body><div class=\"vcard fn\">Joe</div></body></html>";
+        acceptHeader = "application/x-turtle";
+        HttpTester.Response response = doGetRequest("/best/http://foo.com");
+        Assert.assertEquals(200, response.getStatus());
+        Assert.assertEquals("http://foo.com", requestedIRI);
+        assertContains("a vcard:VCard", response.getContent());
+    }
+
+    @Test
+    public void testContentNegotiationForRDFXML() throws Exception {
+        content = "<html><body><div class=\"vcard fn\">Joe</div></body></html>";
+        acceptHeader = "application/rdf+xml";
+        HttpTester.Response response = doGetRequest("/best/http://foo.com");
+        Assert.assertEquals(200, response.getStatus());
+        Assert.assertEquals("http://foo.com", requestedIRI);
+        assertContains("<rdf1:RDF", response.getContent());
+    }
+
+    @Test
+    public void testContentNegotiationForNTriples() throws Exception {
+        content = "<html><body><div class=\"vcard fn\">Joe</div></body></html>";
+        acceptHeader = "text/plain";
+        HttpTester.Response response = doGetRequest("/best/http://foo.com");
+        Assert.assertEquals(200, response.getStatus());
+        Assert.assertEquals("http://foo.com", requestedIRI);
+        assertContains("<http://www.w3.org/1999/02/22-rdf-syntax-ns#type>", response.getContent());
+    }
+
+    @Test
+    public void testResponseWithReport() throws Exception {
+        content = new FileDocumentSource(
+                new File("src/test/resources/org/apache/any23/servlet/missing-og-namespace.html")
+        ).readStream();
+        acceptHeader = "text/plain";
+        HttpTester.Response response = doGetRequest("/best/http://foo.com?validation-mode=validate-fix&report=on");
+        Assert.assertEquals(200, response.getStatus());
+        final String content = response.getContent();
+        assertContainsTag("response", content);
+        assertContainsTag("extractors", content);
+        assertContainsTag("report", content);
+        assertContainsTag("message", true, 1, content);
+        assertContainsTag("error", true, 1, content);
+        assertContainsTag("error", true, 1, content);
+        assertContainsTag("validationReport", content);
+        assertContainsTag("errors", content);
+        assertContainsTag("issues", content);
+        assertContainsTag("ruleActivations", content);
+        assertContainsTag("data", content);
+    }
+
+    @Test
+    public void testJSONResponseFormat() throws Exception {
+        String body = "<http://sub/1> <http://pred/1> \"123\"^^<http://datatype> <http://graph/1>.";
+        HttpTester.Response response = doPostRequest("/json", body, "application/n-quads");
+        Assert.assertEquals(200, response.getStatus());
+        final String EXPECTED_JSON
+            = "[ {\n"
+            + "    \"type\" : \"uri\",\n"
+            + "    \"value\" : \"http://sub/1\"\n"
+            + "  }, \"http://pred/1\", {\n"
+            + "    \"type\" : \"literal\",\n"
+            + "    \"value\" : \"123\",\n"
+            + "    \"lang\" : null,\n"
+            + "    \"datatype\" : \"http://datatype\"\n"
+            + "  }, \"http://graph/1\" ]";
+        assertContains(EXPECTED_JSON, response.getContent());
+    }
+
+    @Test
+    public void testJSONLDResponseFormat() throws Exception {
+        String body = "<http://sub/1> <http://pred/1> \"123\"^^<http://datatype> <http://graph/1>.";
+        HttpTester.Response response = doPostRequest("/jsonld", body, "application/n-quads");
+        Assert.assertEquals(200, response.getStatus());
+        final String EXPECTED_JSON =
+                "[ {\n" +
+                "  \"@graph\" : [ {\n" +
+                "    \"@id\" : \"http://sub/1\",\n" +
+                "    \"http://pred/1\" : [ {\n" +
+                "      \"@type\" : \"http://datatype\",\n" +
+                "      \"@value\" : \"123\"\n" +
+                "    } ]\n" +
+                "  } ],\n" +
+                "  \"@id\" : \"http://graph/1\"\n" +
+                "} ]";
+        assertContains(EXPECTED_JSON, response.getContent());
+    }
+
+    @Test
+    public void testTriXResponseFormat() throws Exception {
+        String body = "<http://sub/1> <http://pred/1> \"123\"^^<http://datatype> <http://graph/1>.";
+        HttpTester.Response response = doPostRequest("/trix", body, "application/n-quads");
+        Assert.assertEquals(200, response.getStatus());
+        final String content = response.getContent();
+        assertContainsTag("graph", false, 1, content);
+        assertContainsTag("uri", false, 3, content);
+        assertContainsTag("triple", false, 1, content);
+    }
+
+    private HttpTester.Response doGetRequest(String path) throws Exception {
+        return doRequest(path, "GET");
+    }
+
+    private HttpTester.Response doPostRequest(String path, String content, String contentType) throws Exception {
+        HttpTester.Request request = HttpTester.newRequest();
+
+        request.setMethod("POST");
+        request.setVersion("HTTP/1.0");
+        request.setHeader("Host", "tester");
+        request.setContent(content);
+        if (contentType != null) {
+            request.setHeader("Content-Type", contentType);
+        }
+        request.setURI(path);
+        return HttpTester.parseResponse(tester.getResponses(request.generate()));
+    }
+
+    private HttpTester.Response doRequest(String path, String method) throws Exception {
+        HttpTester.Request request = HttpTester.newRequest();
+
+        request.setMethod(method);
+        request.setVersion("HTTP/1.0");
+        request.setHeader("Host", "tester");
+        if (acceptHeader != null) {
+            request.setHeader("Accept", acceptHeader);
+        }
+
+        request.setURI(path);
+        return HttpTester.parseResponse(tester.getResponses(request.generate()));
+    }
+
+    private void assertContains(String expected, String container) {
+        if (expected.length() == 0) {
+            throw new IllegalArgumentException("expected string must contains at lease one char.");
+        }
+        if (container.contains(expected)) {
+            return;
+        }
+        Assert.fail("expected '" + expected + "' to be contained in '" + container + "'");
+    }
+
+    private void assertContainsTag(String tag, boolean inline, int occurrences, String container) {
+        if (inline) {
+            Assert.assertEquals(
+                    String.format("Cannot find inline tag %s %d times", tag, occurrences),
+                    occurrences,
+                    StringUtils.countOccurrences(container, "<" + tag + "/>")
+            );
+        } else {
+            Assert.assertEquals(
+                    String.format("Cannot find open tag %s %d times", tag, occurrences),
+                    occurrences,
+                    StringUtils.countOccurrences(container, "<" + tag + ">")
+                    + StringUtils.countOccurrences(container, "<" + tag + " ")
+            );
+            Assert.assertEquals(
+                    String.format("Cannot find close tag %s %d times", tag, occurrences),
+                    occurrences,
+                    StringUtils.countOccurrences(container, "</" + tag + ">")
+            );
+        }
+    }
+
+    private void assertContainsTag(String tag, String container) {
+        assertContainsTag(tag, false, 1, container);
+    }
+
+    /**
+     * Test purpose servlet implementation.
+     */
+    public static class TestableServlet extends Servlet {
+
+        @Override
+        protected DocumentSource createHTTPDocumentSource(HTTPClient httpClient, String uri)
+                throws IOException, URISyntaxException {
+            requestedIRI = uri;
+            if (content != null) {
+                return new StringDocumentSource(content, uri);
+            } else {
+                return super.createHTTPDocumentSource(httpClient, uri);
+            }
+        }
+
+    }
+}
diff --git a/src/test/resources/log4j.properties b/src/test/resources/log4j.properties
new file mode 100644
index 0000000..1a9ad34
--- /dev/null
+++ b/src/test/resources/log4j.properties
@@ -0,0 +1,34 @@
+# Licensed to the Apache Software Foundation (ASF) under one or more
+# contributor license agreements.  See the NOTICE file distributed with
+# this work for additional information regarding copyright ownership.
+# The ASF licenses this file to You under the Apache License, Version 2.0
+# (the "License"); you may not use this file except in compliance with
+# the License.  You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+log4j.rootCategory=INFO, O  
+      
+# Stdout  
+log4j.appender.O=org.apache.log4j.ConsoleAppender  
+      
+# File  
+#log4j.appender.R=org.apache.log4j.RollingFileAppender  
+#log4j.appender.R.File=log4j.log  
+      
+# Control the maximum log file size  
+#log4j.appender.R.MaxFileSize=100KB  
+      
+# Archive log files (one backup file here)  
+log4j.appender.R.MaxBackupIndex=1  
+      
+log4j.appender.R.layout=org.apache.log4j.PatternLayout  
+log4j.appender.O.layout=org.apache.log4j.PatternLayout  
+      
+log4j.appender.R.layout.ConversionPattern=[%d{ISO8601}]%5p%6.6r[%t]%x - %C.%M(%F:%L) - %m%n  
+log4j.appender.O.layout.ConversionPattern=[%d{ISO8601}]%5p%6.6r[%t]%x - %C.%M(%F:%L) - %m%n  
diff --git a/src/test/resources/org/apache/any23/servlet/missing-og-namespace.html b/src/test/resources/org/apache/any23/servlet/missing-og-namespace.html
new file mode 100644
index 0000000..5d18bcd
--- /dev/null
+++ b/src/test/resources/org/apache/any23/servlet/missing-og-namespace.html
@@ -0,0 +1,30 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
+    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
+<head>
+    <title>Pictures at an Exhibition: The G� - Evgeny Kissin - Spotify</title>
+    <meta name="title" content="Pictures at an Exhibition: The G� - Evgeny Kissin" />
+    <meta name="medium" content="audio" />
+    <meta name="description" content="This is a link to Pictures at an Exhibition: The G� - Evgeny Kissin. Don't have Spotify? Sign-up for unlimited music with Spotify Premium at Spotify.com." />
+    <meta property="og:image" content="http://open.spotify.com/thumb/72b4f7bbf6e4971e4ad5e39f082320c3e512fd55" />
+    <meta property="og:title" content="Pictures at an Exhibition: The G� - Evgeny Kissin" />
+    <meta property="og:type" content="song" />
+    <meta property="og:site_name" content="Spotify" />
+    <meta property="og:url" content="http://open.spotify.com/track/3buSw8cWZThAO864onWXwp" />
+    <meta property="fb:app_id" content="174829003346" />
+    <link rel="shortcut icon" href="/favicon.ico" type="image/vnd.microsoft.icon" />
+    <link rel="audio_src" href="spotify:track:3buSw8cWZThAO864onWXwp" />
+    <link rel="image_src" href="http://open.spotify.com/thumb/72b4f7bbf6e4971e4ad5e39f082320c3e512fd55" />
+    <link rel="stylesheet" media="screen" type="text/css" href="/design/style.css"/>
+
+    <script type="text/javascript">
+    function toggle_more() {
+      document.getElementById('more-artists').style.display = 'block';
+      document.getElementById('more').innerHTML = ',';
+      document.getElementById('more').style.margin = '0';
+    };
+    </script>
+</head>
+  <body>
+  </body>
+</html>
\ No newline at end of file