You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@struts.apache.org by lu...@apache.org on 2021/12/19 12:28:24 UTC

[struts-site] branch master updated (527bd01 -> 3bc71dc)

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

lukaszlenart pushed a change to branch master
in repository https://gitbox.apache.org/repos/asf/struts-site.git.


    from 527bd01  Adds announcement about Log4j 2.12.2/2.16.0
     new bb503dd  Fixes typo
     new 3bc71dc  Cleans up links

The 2 revisions listed above as "new" are entirely new to this
repository and will be described in separate emails.  The revisions
listed as "add" were already present in the repository and have only
been added to this reference.


Summary of changes:
 source/announce-2014.md                            |  14 +-
 source/announce-2015.md                            |   8 +-
 source/announce-2016.md                            |  42 +++---
 source/announce-2017.md                            |  38 ++---
 source/builds.md                                   |  10 +-
 source/bylaws.md                                   |  12 +-
 source/contributors/building-normal-release.md     |   8 +-
 source/contributors/building-struts-master.md      |   8 +-
 source/contributors/editing-the-documentation.md   |   6 +-
 source/contributors/index.md                       |   8 +-
 source/contributors/obtaining-an-idea-license.md   |   2 +-
 source/contributors/one-time-steps.md              |   6 +-
 source/core-developers/action-chaining.md          |  14 +-
 source/core-developers/action-configuration.md     |   2 +-
 source/core-developers/action-mapper.md            |  60 ++++----
 source/core-developers/ajax.md                     |  10 +-
 .../annotation-parameter-filter-interceptor.md     |   4 +-
 source/core-developers/annotations.md              |  64 ++++----
 source/core-developers/application-servers.md      |  12 +-
 .../{att1846_nutshell.GIF => att1846_nutshell.gif} | Bin
 source/core-developers/chaining-interceptor.md     |  14 +-
 source/core-developers/configuration-elements.md   |  24 +--
 source/core-developers/configuration-files.md      |  14 +-
 .../configuration-provider-and-configuration.md    |  23 ++-
 source/core-developers/constant-configuration.md   |  16 +-
 source/core-developers/conversion-annotation.md    |   2 +-
 .../conversion-error-interceptor.md                |   2 +-
 .../core-developers/custom-validator-annotation.md |   2 +-
 source/core-developers/debugging.md                |   4 +-
 source/core-developers/default-properties.md       |   2 +-
 source/core-developers/dependency-injection.md     |   2 +-
 source/core-developers/development-mode.md         |   8 +-
 source/core-developers/dispatcher-listener.md      |   2 +-
 source/core-developers/dispatcher.md               |   2 +-
 source/core-developers/file-upload-interceptor.md  |   2 +-
 source/core-developers/file-upload.md              |   2 +-
 .../formatting-dates-and-numbers.md                |   4 +-
 source/core-developers/freemarker-result.md        |   2 +-
 source/core-developers/index.md                    |  82 +++++------
 .../core-developers/interceptor-configuration.md   |   4 +-
 source/core-developers/interceptors.md             |  76 +++++-----
 source/core-developers/localization.md             |   8 +-
 source/core-developers/logging.md                  |   2 +-
 source/core-developers/model-driven.md             |   4 +-
 source/core-developers/nutshell.md                 |   6 +-
 source/core-developers/object-factory.md           |   8 +-
 source/core-developers/package-configuration.md    |   2 +-
 source/core-developers/parameters-interceptor.md   |   4 +-
 source/core-developers/performance-tuning.md       |   2 +-
 source/core-developers/prepare-interceptor.md      |   2 +-
 source/core-developers/redirect-action-result.md   |   2 +-
 source/core-developers/result-configuration.md     |   6 +-
 source/core-developers/result-types.md             |  28 ++--
 source/core-developers/static-content.md           |   2 +-
 source/core-developers/stream-result.md            |   2 +-
 source/core-developers/struts-default-xml.md       |   2 +-
 .../core-developers/token-session-interceptor.md   |   2 +-
 source/core-developers/type-conversion.md          |  14 +-
 source/core-developers/validation.md               |   2 +-
 source/core-developers/velocity-properties.md      |   2 +-
 source/core-developers/web-xml.md                  |   4 +-
 source/core-developers/weblogic.md                 |  65 ++++-----
 source/core-developers/wildcard-mappings.md        |   2 +-
 source/core-developers/writing-interceptors.md     |   2 +-
 source/dev-mail.md                                 |   4 +-
 source/getting-started/annotations.md              |   8 +-
 source/getting-started/coding-actions.md           |  59 +++++---
 source/getting-started/control-tags.md             |  51 +++++--
 source/getting-started/debugging-struts.md         |   8 +-
 source/getting-started/exception-handling.md       |  66 ++++++---
 source/getting-started/exclude-parameters.md       |  10 +-
 source/getting-started/form-tags.md                |  12 +-
 .../getting-started/form-validation-using-xml.md   |  70 ++++++---
 source/getting-started/form-validation.md          |  14 +-
 .../getting-started/hello-world-using-struts2.md   |  10 +-
 .../how-to-create-a-struts2-web-application.md     |  10 +-
 source/getting-started/http-session.md             |   8 +-
 source/getting-started/index.md                    |  48 +++---
 source/getting-started/introducing-interceptors.md |  16 +-
 source/getting-started/message-resource-files.md   |  14 +-
 source/getting-started/preperable-interface.md     |  10 +-
 source/getting-started/processing-forms.md         |  14 +-
 source/getting-started/spring.md                   |   6 +-
 source/getting-started/themes.md                   |  12 +-
 source/getting-started/unit-testing.md             |   8 +-
 source/getting-started/using-tags.md               |  18 +--
 .../getting-started/wildcard-method-selection.md   |  42 ++++--
 source/helping.md                                  |  14 +-
 source/kickstart.md                                |  22 +--
 source/mail.md                                     |   4 +-
 source/maven-archetypes/index.md                   | 162 ++++++++-------------
 source/maven-archetypes/struts2-archetype-blank.md |  12 +-
 .../struts2/interceptor/FileUploadInterceptor.html |   2 +-
 source/plugins/cdi/index.md                        |  85 ++++++++---
 source/plugins/codebehind/index.md                 |  56 +++++--
 source/plugins/convention/index.md                 |   2 +-
 source/plugins/index.md                            |   6 +-
 source/plugins/jfreechart/index.md                 |  28 +++-
 source/plugins/osgi/index.md                       |  70 ++++++---
 source/plugins/oval/index.md                       |   6 +-
 source/plugins/plexus/index.md                     |   4 +-
 source/plugins/plugins.md                          |  45 ++++--
 source/plugins/portlet/index.md                    |   6 +-
 .../plugins/portlet/struts-2-portlet-tutorial.md   |   6 +-
 source/plugins/rest/index.md                       |   8 +-
 source/plugins/spring/index.md                     |   8 +-
 source/plugins/struts-1/index.md                   |   2 +-
 source/plugins/tiles-3/index.md                    |   2 +-
 source/plugins/tiles/index.md                      |   2 +-
 source/primer.md                                   |  30 ++--
 source/release-guidelines.md                       |  12 +-
 source/security.md                                 |   2 +-
 source/security/index.md                           |  18 +--
 source/struts1eol-announcement.md                  |   2 +-
 source/submitting-patches.md                       |   4 +-
 source/tag-developers/ajax-a-template.md           |   4 +-
 source/tag-developers/ajax-div-template.md         |  18 +--
 source/tag-developers/ajax-event-system.md         |   4 +-
 source/tag-developers/ajax-head-template.md        |   8 +-
 source/tag-developers/ajax-tags.md                 |  28 ++--
 source/tag-developers/ajax-theme.md                |  32 ++--
 source/tag-developers/alt-syntax.md                |   4 +-
 source/tag-developers/css-xhtml-theme.md           |  30 ++--
 source/tag-developers/extending-themes.md          |  18 +--
 source/tag-developers/freemarker.md                |  22 +--
 source/tag-developers/jsp.md                       |   4 +-
 source/tag-developers/ognl-basics.md               |   2 +-
 source/tag-developers/ognl.md                      |   2 +-
 source/tag-developers/selecting-themes.md          |   4 +-
 source/tag-developers/simple-theme.md              |  12 +-
 source/tag-developers/struts-tags.md               |   4 +-
 source/tag-developers/tag-reference.md             |  72 ++++-----
 source/tag-developers/template-loading.md          |  12 +-
 source/tag-developers/text-tag.md                  |   6 +-
 source/tag-developers/themes-and-templates.md      |  24 +--
 source/tag-developers/ui-tags.md                   |  14 +-
 source/tag-developers/xhtml-theme.md               |  34 ++---
 source/updating-website.md                         |   3 +-
 source/youatstruts.md                              |  14 +-
 139 files changed, 1250 insertions(+), 1053 deletions(-)
 rename source/core-developers/attachments/{att1846_nutshell.GIF => att1846_nutshell.gif} (100%)

[struts-site] 02/02: Cleans up links

Posted by lu...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

lukaszlenart pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/struts-site.git

commit 3bc71dc5a768ce97a4e7a46275758e28e85570ba
Author: Lukasz Lenart <lu...@apache.org>
AuthorDate: Sun Dec 19 13:28:19 2021 +0100

    Cleans up links
---
 source/announce-2014.md                            |  14 +-
 source/announce-2015.md                            |   8 +-
 source/announce-2016.md                            |  42 +++---
 source/announce-2017.md                            |  38 ++---
 source/builds.md                                   |  10 +-
 source/bylaws.md                                   |  12 +-
 source/contributors/building-normal-release.md     |   8 +-
 source/contributors/building-struts-master.md      |   8 +-
 source/contributors/editing-the-documentation.md   |   6 +-
 source/contributors/index.md                       |   8 +-
 source/contributors/obtaining-an-idea-license.md   |   2 +-
 source/contributors/one-time-steps.md              |   6 +-
 source/core-developers/action-chaining.md          |  14 +-
 source/core-developers/action-configuration.md     |   2 +-
 source/core-developers/action-mapper.md            |  60 ++++----
 source/core-developers/ajax.md                     |  10 +-
 .../annotation-parameter-filter-interceptor.md     |   4 +-
 source/core-developers/annotations.md              |  64 ++++----
 source/core-developers/application-servers.md      |  12 +-
 .../{att1846_nutshell.GIF => att1846_nutshell.gif} | Bin
 source/core-developers/chaining-interceptor.md     |  14 +-
 source/core-developers/configuration-elements.md   |  24 +--
 source/core-developers/configuration-files.md      |  14 +-
 .../configuration-provider-and-configuration.md    |  23 ++-
 source/core-developers/constant-configuration.md   |  16 +-
 source/core-developers/conversion-annotation.md    |   2 +-
 .../conversion-error-interceptor.md                |   2 +-
 .../core-developers/custom-validator-annotation.md |   2 +-
 source/core-developers/debugging.md                |   4 +-
 source/core-developers/default-properties.md       |   2 +-
 source/core-developers/dependency-injection.md     |   2 +-
 source/core-developers/development-mode.md         |   8 +-
 source/core-developers/dispatcher-listener.md      |   2 +-
 source/core-developers/dispatcher.md               |   2 +-
 source/core-developers/file-upload-interceptor.md  |   2 +-
 source/core-developers/file-upload.md              |   2 +-
 .../formatting-dates-and-numbers.md                |   4 +-
 source/core-developers/freemarker-result.md        |   2 +-
 source/core-developers/index.md                    |  82 +++++------
 .../core-developers/interceptor-configuration.md   |   4 +-
 source/core-developers/interceptors.md             |  76 +++++-----
 source/core-developers/localization.md             |   8 +-
 source/core-developers/logging.md                  |   2 +-
 source/core-developers/model-driven.md             |   4 +-
 source/core-developers/nutshell.md                 |   6 +-
 source/core-developers/object-factory.md           |   8 +-
 source/core-developers/package-configuration.md    |   2 +-
 source/core-developers/parameters-interceptor.md   |   4 +-
 source/core-developers/performance-tuning.md       |   2 +-
 source/core-developers/prepare-interceptor.md      |   2 +-
 source/core-developers/redirect-action-result.md   |   2 +-
 source/core-developers/result-configuration.md     |   6 +-
 source/core-developers/result-types.md             |  28 ++--
 source/core-developers/static-content.md           |   2 +-
 source/core-developers/stream-result.md            |   2 +-
 source/core-developers/struts-default-xml.md       |   2 +-
 .../core-developers/token-session-interceptor.md   |   2 +-
 source/core-developers/type-conversion.md          |  14 +-
 source/core-developers/validation.md               |   2 +-
 source/core-developers/velocity-properties.md      |   2 +-
 source/core-developers/web-xml.md                  |   4 +-
 source/core-developers/weblogic.md                 |  65 ++++-----
 source/core-developers/wildcard-mappings.md        |   2 +-
 source/core-developers/writing-interceptors.md     |   2 +-
 source/dev-mail.md                                 |   4 +-
 source/getting-started/annotations.md              |   8 +-
 source/getting-started/coding-actions.md           |  59 +++++---
 source/getting-started/control-tags.md             |  51 +++++--
 source/getting-started/debugging-struts.md         |   8 +-
 source/getting-started/exception-handling.md       |  66 ++++++---
 source/getting-started/exclude-parameters.md       |  10 +-
 source/getting-started/form-tags.md                |  12 +-
 .../getting-started/form-validation-using-xml.md   |  70 ++++++---
 source/getting-started/form-validation.md          |  14 +-
 .../getting-started/hello-world-using-struts2.md   |  10 +-
 .../how-to-create-a-struts2-web-application.md     |  10 +-
 source/getting-started/http-session.md             |   8 +-
 source/getting-started/index.md                    |  48 +++---
 source/getting-started/introducing-interceptors.md |  16 +-
 source/getting-started/message-resource-files.md   |  14 +-
 source/getting-started/preperable-interface.md     |  10 +-
 source/getting-started/processing-forms.md         |  14 +-
 source/getting-started/spring.md                   |   6 +-
 source/getting-started/themes.md                   |  12 +-
 source/getting-started/unit-testing.md             |   8 +-
 source/getting-started/using-tags.md               |  18 +--
 .../getting-started/wildcard-method-selection.md   |  42 ++++--
 source/helping.md                                  |  14 +-
 source/kickstart.md                                |  22 +--
 source/mail.md                                     |   4 +-
 source/maven-archetypes/index.md                   | 162 ++++++++-------------
 source/maven-archetypes/struts2-archetype-blank.md |  12 +-
 .../struts2/interceptor/FileUploadInterceptor.html |   2 +-
 source/plugins/cdi/index.md                        |  85 ++++++++---
 source/plugins/codebehind/index.md                 |  56 +++++--
 source/plugins/convention/index.md                 |   2 +-
 source/plugins/jfreechart/index.md                 |  28 +++-
 source/plugins/osgi/index.md                       |  70 ++++++---
 source/plugins/oval/index.md                       |   6 +-
 source/plugins/plexus/index.md                     |   4 +-
 source/plugins/plugins.md                          |  45 ++++--
 source/plugins/portlet/index.md                    |   6 +-
 .../plugins/portlet/struts-2-portlet-tutorial.md   |   6 +-
 source/plugins/rest/index.md                       |   8 +-
 source/plugins/spring/index.md                     |   8 +-
 source/plugins/struts-1/index.md                   |   2 +-
 source/plugins/tiles-3/index.md                    |   2 +-
 source/plugins/tiles/index.md                      |   2 +-
 source/primer.md                                   |  30 ++--
 source/release-guidelines.md                       |  12 +-
 source/security.md                                 |   2 +-
 source/security/index.md                           |  18 +--
 source/struts1eol-announcement.md                  |   2 +-
 source/submitting-patches.md                       |   4 +-
 source/tag-developers/ajax-a-template.md           |   4 +-
 source/tag-developers/ajax-div-template.md         |  18 +--
 source/tag-developers/ajax-event-system.md         |   4 +-
 source/tag-developers/ajax-head-template.md        |   8 +-
 source/tag-developers/ajax-tags.md                 |  28 ++--
 source/tag-developers/ajax-theme.md                |  32 ++--
 source/tag-developers/alt-syntax.md                |   4 +-
 source/tag-developers/css-xhtml-theme.md           |  30 ++--
 source/tag-developers/extending-themes.md          |  18 +--
 source/tag-developers/freemarker.md                |  22 +--
 source/tag-developers/jsp.md                       |   4 +-
 source/tag-developers/ognl-basics.md               |   2 +-
 source/tag-developers/ognl.md                      |   2 +-
 source/tag-developers/selecting-themes.md          |   4 +-
 source/tag-developers/simple-theme.md              |  12 +-
 source/tag-developers/struts-tags.md               |   4 +-
 source/tag-developers/tag-reference.md             |  72 ++++-----
 source/tag-developers/template-loading.md          |  12 +-
 source/tag-developers/text-tag.md                  |   6 +-
 source/tag-developers/themes-and-templates.md      |  24 +--
 source/tag-developers/ui-tags.md                   |  14 +-
 source/tag-developers/xhtml-theme.md               |  34 ++---
 source/updating-website.md                         |   3 +-
 source/youatstruts.md                              |  14 +-
 138 files changed, 1247 insertions(+), 1050 deletions(-)

diff --git a/source/announce-2014.md b/source/announce-2014.md
index c1d5b35..e7bf42e 100644
--- a/source/announce-2014.md
+++ b/source/announce-2014.md
@@ -19,7 +19,7 @@ to maintaining applications over time.
 
 One medium security issue was solved with this release:
 
-  - [S2-023](http://struts.apache.org/docs/s2-023.html)
+  - [S2-023](http://struts.apache.org/docs/s2-023)
     Generated value of token can be predictable
 
 Besides that, this release contains several fixes and improvements just to mention few of them:
@@ -45,7 +45,7 @@ Besides that, this release contains several fixes and improvements just to menti
   - `struts_dojo.js` was fixed
   - interface `org/apache/struts2/views/TagLibrary` was restored and marked as `@Depreacted`
 
-and many other small improvements, please careful read the [version notes](http://struts.apache.org/docs/version-notes-2320.html).
+and many other small improvements, please careful read the [version notes](http://struts.apache.org/docs/version-notes-2320).
 
 **All developers are strongly advised to perform this action.**
 
@@ -66,7 +66,7 @@ to maintaining applications over time.
 
 One medium security issue was solved with this release:
 
-  - [S2-022](http://struts.apache.org/docs/s2-022.html)
+  - [S2-022](http://struts.apache.org/docs/s2-022)
     Extends excluded params in CookieInterceptor to avoid manipulation of Struts' internals
 
 All developers are strongly advised to perform this action.
@@ -82,9 +82,9 @@ to maintaining applications over time.
 
 Two security issues were solved with this release:
 
-  - [S2-021](http://struts.apache.org/docs/s2-021.html)
+  - [S2-021](http://struts.apache.org/docs/s2-021)
     Improves excluded params to avoid ClassLoader manipulation via ParametersInterceptor
-  - [S2-021](http://struts.apache.org/docs/s2-021.html)
+  - [S2-021](http://struts.apache.org/docs/s2-021)
     Adds excluded params to CookieInterceptor to avoid ClassLoader manipulation when the interceptors is configured
     to accept all cookie names (wildcard matching via "*")
 
@@ -146,9 +146,9 @@ to maintaining applications over time.
 
 Two security issues were solved with this release:
 
-  - [S2-020](http://struts.apache.org/docs/s2-020.html) ClassLoader manipulation
+  - [S2-020](http://struts.apache.org/docs/s2-020) ClassLoader manipulation
     via request parameters
-  - [S2-020](http://struts.apache.org/docs/s2-020.html) Commons FileUpload library was upgraded
+  - [S2-020](http://struts.apache.org/docs/s2-020) Commons FileUpload library was upgraded
     to version 1.3.1 to prevent DoS attacks
 
 All developers are strongly advised to perform this action.
diff --git a/source/announce-2015.md b/source/announce-2015.md
index 039d265..89b227e 100644
--- a/source/announce-2015.md
+++ b/source/announce-2015.md
@@ -41,7 +41,7 @@ to maintaining applications over time.
 
 One medium security issue was solved with this release:
 
-  - [S2-026](/docs/s2-026.html)
+  - [S2-026](/docs/s2-026)
     Special `top` object can be used to access Struts' internals
 
 **All developers are strongly advised to perform this action.**
@@ -55,11 +55,11 @@ please post your comments to the user list, and, if appropriate, file a tracking
 #### 26 August 2015 - Security Bulletin S2-025 {#a20150826}
 
 The Apache Struts group is pleased to announce that a new security bulletin was published - 
-[S2-025](/docs/s2-025.html)
+[S2-025](/docs/s2-025)
 
 Thanks to Taki Uchiyama from JPCERT/CC who reported two potential XSS vulnerabilities available 
 in older versions of The Apache Struts 2. Please read the mentioned security bulletin for more details
-and also reading our [Security guideline](/docs/security.html) will help you secure your application 
+and also reading our [Security guideline](/docs/security) will help you secure your application 
 
 #### 31 July 2015 - Struts 2.5-BETA1 (BETA) {#a20150731}
 
@@ -138,7 +138,7 @@ to maintaining applications over time.
 
 One medium security issue was solved with this release:
 
-  - [S2-024](/docs/s2-024.html)
+  - [S2-024](/docs/s2-024)
     Wrong `excludeParams` overrides those defined in `DefaultExcludedPatternsChecker`
 
 **All developers are strongly advised to perform this action.**
diff --git a/source/announce-2016.md b/source/announce-2016.md
index 13f2920..b599999 100644
--- a/source/announce-2016.md
+++ b/source/announce-2016.md
@@ -20,7 +20,7 @@ to maintaining applications over time.
 
 This release addresses one potential security vulnerability:
 
-- Possible DoS attack when using URLValidator - [S2-044](/docs/s2-044.html)
+- Possible DoS attack when using URLValidator - [S2-044](/docs/s2-044)
 
 Also this release contains several breaking changes and improvements just to mention few of them:
 
@@ -121,8 +121,8 @@ to maintaining applications over time.
 
 This release addresses two potential security vulnerabilities:
 
-- Possible path traversal in the Convention plugin [S2-042](/docs/s2-042.html)
-- Using the Config Browser plugin in production [S2-043](/docs/s2-043.html)
+- Possible path traversal in the Convention plugin [S2-042](/docs/s2-042)
+- Using the Config Browser plugin in production [S2-043](/docs/s2-043)
 
 Also this release contains several breaking changes and improvements just to mention few of them:
 
@@ -209,7 +209,7 @@ to maintaining applications over time.
 
 This release addresses one potential security vulnerability:
 
-  - [S2-041](/docs/s2-041.html)
+  - [S2-041](/docs/s2-041)
     Possible DoS attack when using URLValidator
 
 Also all security patches applied to version Struts 2.3.29 were also applied to this version (just in case).
@@ -247,26 +247,26 @@ to maintaining applications over time.
 
 This release addresses these potential security vulnerabilities:
 
-  - [S2-035](/docs/s2-035.html)
+  - [S2-035](/docs/s2-035)
     Action name clean up is error prone
 
-  - [S2-036](/docs/s2-036.html)
+  - [S2-036](/docs/s2-036)
     Forced double OGNL evaluation, when evaluated on raw user input in tag attributes,
     may lead to remote code execution (similar to S2-029)
 
-  - [S2-037](/docs/s2-037.html)
+  - [S2-037](/docs/s2-037)
     Remote Code Execution can be performed when using REST Plugin.
 
-  - [S2-038](/docs/s2-038.html)
+  - [S2-038](/docs/s2-038)
     It is possible to bypass token validation and perform a CSRF attack
 
-  - [S2-039](/docs/s2-039.html)
+  - [S2-039](/docs/s2-039)
     Getter as action method leads to security bypass
 
-  - [S2-040](/docs/s2-040.html)
+  - [S2-040](/docs/s2-040)
     Input validation bypass using existing default action method.
 
-  - [S2-041](/docs/s2-041.html)
+  - [S2-041](/docs/s2-041)
     Possible DoS attack when using URLValidator
 
 This release contains several breaking changes and improvements just to mention few of them:
@@ -296,10 +296,10 @@ You can download this version from our [download](download.cgi#struts-ga) page.
 Two potential security vulnerabilities were reported which were already addressed in the latest Apache Struts 2 versions.
 Those reports just added other vectors of attack.
 
- - [S2-033](/docs/s2-033.html)
+ - [S2-033](/docs/s2-033)
    Remote Code Execution can be performed when using REST Plugin with ! operator when Dynamic Method Invocation is enabled
 
- - [S2-034](/docs/s2-034.html)
+ - [S2-034](/docs/s2-034)
    OGNL cache poisoning can lead to DoS vulnerability
 
 Please read carefully the Security Bulletins and take suggested actions. The simplest way to avoid those vulnerabilities
@@ -361,10 +361,10 @@ to maintaining applications over time.
 
 This release addresses two potential security vulnerabilities:
 
-  - [S2-031](/docs/s2-031.html)
+  - [S2-031](/docs/s2-031)
     Possible RCE vulnerability in `XSLTResult` was fixed.
 
-  - [S2-032](/docs/s2-032.html)
+  - [S2-032](/docs/s2-032)
     Prevents execution of chained expressions based on new `isSequence` flag introduce in appropriated OGNL versions.
 
 **All developers are strongly advised to perform this action.**
@@ -388,13 +388,13 @@ to maintaining applications over time.
 
 These releases address three potential security vulnerabilities:
 
-  - [S2-029](/docs/s2-029.html)
+  - [S2-029](/docs/s2-029)
     Forced double OGNL evaluation, when evaluated on raw user input in tag attributes, may lead to remote code execution.
 
-  - [S2-031](/docs/s2-031.html)
+  - [S2-031](/docs/s2-031)
     Possible RCE vulnerability in `XSLTResult` was fixed.
 
-  - [S2-032](/docs/s2-032.html)
+  - [S2-032](/docs/s2-032)
     Prevents execution of chained expressions based on new `isSequence` flag introduce in appropriated OGNL versions.
 
 **All developers are strongly advised to perform this action.**
@@ -418,13 +418,13 @@ to maintaining applications over time.
 
 This release addresses three potential security vulnerabilities:
 
-  - [S2-028](/docs/s2-028.html)
+  - [S2-028](/docs/s2-028)
     Possible XSS vulnerability in pages not using UTF-8 was fixed.
 
-  - [S2-029](/docs/s2-029.html)
+  - [S2-029](/docs/s2-029)
     Forced double OGNL evaluation, when evaluated on raw user input in tag attributes, may lead to remote code execution.
 
-  - [S2-030](/docs/s2-030.html)
+  - [S2-030](/docs/s2-030)
     I18NInterceptor narrows selected locale to those available in JVM to reduce possibility of another XSS vulnerability.
 
 **All developers are strongly advised to perform this action.**
diff --git a/source/announce-2017.md b/source/announce-2017.md
index 371530c..882ee49 100644
--- a/source/announce-2017.md
+++ b/source/announce-2017.md
@@ -102,13 +102,13 @@ release. The GA designation is our highest quality grade.
 
 This release addresses two potential security vulnerabilities:
 
- - [S2-050](/docs/s2-050.html)
+ - [S2-050](/docs/s2-050)
     A regular expression Denial of Service when using URLValidator (similar to S2-044 & S2-047)
- - [S2-051](/docs/s2-051.html)
+ - [S2-051](/docs/s2-051)
    A remote attacker may create a DoS attack by sending crafted xml request when using the Struts REST plugin
- - [S2-052](/docs/s2-052.html)
+ - [S2-052](/docs/s2-052)
    Possible Remote Code Execution attack when using the Struts REST plugin with XStream handler to handle XML payloads
- - [S2-053](/docs/s2-053.html)
+ - [S2-053](/docs/s2-053)
    A possible Remote Code Execution attack when using an unintentional expression in Freemarker tag instead of string literals
    
 Also this version resolves the following issues:    
@@ -144,11 +144,11 @@ to maintaining applications over time.
 
 This release contains fixes for the following potential security vulnerabilities:
 
- - [S2-050](/docs/s2-050.html)
+ - [S2-050](/docs/s2-050)
     A regular expression Denial of Service when using URLValidator (similar to S2-044 & S2-047)
- - [S2-051](/docs/s2-051.html)
+ - [S2-051](/docs/s2-051)
    A remote attacker may create a DoS attack by sending crafted xml request when using the Struts REST plugin
- - [S2-052](/docs/s2-052.html)
+ - [S2-052](/docs/s2-052)
    Possible Remote Code Execution attack when using the Struts REST plugin with XStream handler to handle XML payloads
 
 Except the above this release also contains several improvements just to mention few of them:
@@ -179,7 +179,7 @@ Except the above this release also contains several improvements just to mention
  - Upgrade xstream to the latest version
  - Upgrade to struts-master 11
 
-> Please read the [Version Notes](/docs/version-notes-2513.html) to find more details about performed bug fixes and improvements.
+> Please read the [Version Notes](/docs/version-notes-2513) to find more details about performed bug fixes and improvements.
 
 **All developers are strongly advised to perform this action.**
 
@@ -193,7 +193,7 @@ You can download this version from our [download](download.cgi#struts-ga) page.
 
 #### 09 August 2017 - S2-049 Security Bulletin update {#a20170809}
 
-This is an update of the recently announced Security Bulletin - [S2-049](/docs/s2-049.html).
+This is an update of the recently announced Security Bulletin - [S2-049](/docs/s2-049).
 
 The bulletin was extended with an additional information when the potential vulnerability
 can be present in your application. Please re-read the mentioned bulletin and apply required
@@ -208,9 +208,9 @@ release. The GA designation is our highest quality grade.
 
 This release addresses two potential security vulnerabilities:
 
- - [S2-049](/docs/s2-049.html)
+ - [S2-049](/docs/s2-049)
    A DoS attack is available for Spring secured actions
- - [S2-048](/docs/s2-048.html)
+ - [S2-048](/docs/s2-048)
    Possible RCE in the Struts Showcase app in the Struts 1 plugin example in Struts 2.3.x series
    
 Also this version resolves the following issues:    
@@ -244,9 +244,9 @@ to maintaining applications over time.
 
 This release contains fixes for the following potential security vulnerabilities:
 
- - [S2-047](/docs/s2-047.html)
+ - [S2-047](/docs/s2-047)
    Possible DoS attack when using URLValidator
- - [S2-049](/docs/s2-049.html)
+ - [S2-049](/docs/s2-049)
    A DoS attack is available for Spring secured actions
 
 Except the above this release also contains several improvements just to mention few of them:
@@ -294,7 +294,7 @@ Except the above this release also contains several improvements just to mention
  - Upgrade to commons-lang 3.6
  - Update commons-fileupload
 
-> Please read the [Version Notes](/docs/version-notes-2512.html) to find more details about performed bug fixes and improvements.
+> Please read the [Version Notes](/docs/version-notes-2512) to find more details about performed bug fixes and improvements.
 
 **All developers are strongly advised to perform this action.**
 
@@ -312,7 +312,7 @@ A potential security vulnerability was reported in the Struts 1 plugin used in t
 It is possible to perform a Remote Code Execution attack if given construction exists in the vulnerable
 application. Please read the security bulletin for more details and inspect your application.
 
- - [S2-048](/docs/s2-048.html)
+ - [S2-048](/docs/s2-048)
    Possible RCE in the Struts Showcase app in the Struts 1 plugin example in Struts 2.3.x series
 
 NOTE: Please notice that this vulnerability does not affect applications using Struts 2.5.x series 
@@ -328,7 +328,7 @@ release. The GA designation is our highest quality grade.
 These releases address one critical security vulnerability:
 
 - Possible Remote Code Execution when performing file upload based on Jakarta Multipart parser
-  [S2-045](/docs/s2-045.html), [S2-046](/docs/s2-046.html)
+  [S2-045](/docs/s2-045), [S2-046](/docs/s2-046)
 
 Those plugins were released to allow users running older versions of the Apache Struts secure their applications
 in an easy way. You don't have to migrate to the latest version (which is still preferable) but by applying one of those 
@@ -352,7 +352,7 @@ release. The GA designation is our highest quality grade.
 These releases address one critical security vulnerability:
 
 - Possible Remote Code Execution when performing file upload based on Jakarta Multipart parser
-  [S2-045](/docs/s2-045.html), [S2-046](/docs/s2-046.html)
+  [S2-045](/docs/s2-045), [S2-046](/docs/s2-046)
 
 Those plugins were released to allow users running older versions of the Apache Struts secure their applications in easy way.
 You don't have to migrate to the latest version (which is still preferable) but by applying one of those plugins, 
@@ -375,7 +375,7 @@ release. The GA designation is our highest quality grade.
 
 This release addresses one potential security vulnerability:
 
-- Possible Remote Code Execution when performing file upload based on Jakarta Multipart parser - [S2-045](/docs/s2-045.html)
+- Possible Remote Code Execution when performing file upload based on Jakarta Multipart parser - [S2-045](/docs/s2-045)
 
 Apache Struts 2 is an elegant, extensible framework for creating enterprise-ready Java web applications.
 The framework is designed to streamline the full development cycle, from building, to deploying,
@@ -398,7 +398,7 @@ release. The GA designation is our highest quality grade.
 
 This release addresses one potential security vulnerability:
 
-- Possible Remote Code Execution when performing file upload based on Jakarta Multipart parser - [S2-045](/docs/s2-045.html)
+- Possible Remote Code Execution when performing file upload based on Jakarta Multipart parser - [S2-045](/docs/s2-045)
 
 Apache Struts 2 is an elegant, extensible framework for creating enterprise-ready Java web applications.
 The framework is designed to streamline the full development cycle, from building, to deploying,
diff --git a/source/builds.md b/source/builds.md
index da64450..d14e779 100644
--- a/source/builds.md
+++ b/source/builds.md
@@ -59,8 +59,8 @@ or
 Maven will automatically download any dependencies as needed.
 
 For more about using Maven to build Struts 2, see
-[Building the framework from source](/docs/building-the-framework-from-source.html) in the
-[Struts 2 Contributors Guide.](/docs/contributors-guide.html)
+[Building the framework from source](/docs/building-the-framework-from-source) in the
+[Struts 2 Contributors Guide.](/docs/contributors-guide)
 
 For more about using Maven to build Struts 1, see our [Maven wiki page.](http://wiki.apache.org/struts/StrutsMaintenanceMaven)
 
@@ -72,7 +72,7 @@ As part of our continuous integration practice, we also make available each morn
 *Again: Use at your own risk!*
 
 If you do **not** plan to contribute to the development of the framework, then you probably want to download a
-[release](releases.html)
+[release](releases)
 
 NOTE: The Struts 2 nightly build is not fully operational. We suggest that contributors checkout
 the [source code](#SourceCode) instead.
@@ -123,7 +123,7 @@ A test build is made available so that it can be reviewed for quality by the Apa
 When a build is judged "ready for prime time", it is promoted to "General Availability" status and may be
 made the "Best Available" release. If the group feels that a build requires more testing, then it may be marked
 as "Beta" release. When a test build is upgraded to "Beta" or "GA" by a vote of the project members,
-we make the distribution available as a formal [release](releases.html).
+we make the distribution available as a formal [release](releases).
 
 ## Maven Snapshots
 
@@ -157,4 +157,4 @@ Unless required by applicable law or agreed to in writing, software distributed
 "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.  See the License for the
 specific language governing permissions and limitations under the License.
 
-Next: [Release Guidelines](release-guidelines.html)
+Next: [Release Guidelines](release-guidelines)
diff --git a/source/bylaws.md b/source/bylaws.md
index bb855bc..3416046 100644
--- a/source/bylaws.md
+++ b/source/bylaws.md
@@ -13,10 +13,10 @@ title: Project Management Committee Charter
 
 Struts is a Project of the [Apache Software Foundation](https://www.apache.org/foundation) (ASF), formed by a resolution
 of the [ASF Board of Directors](https://www.apache.org/foundation/board/). As an ASF Project, Struts is subject to the
-[ASF Bylaws](https://www.apache.org/foundation/bylaws.html) and the direction of the ASF Board.
+[ASF Bylaws](https://www.apache.org/foundation/bylaws) and the direction of the ASF Board.
 
 The Project Charter incorporates by reference the current version
-of [How the ASF works](https://www.apache.org/foundation/how-it-works.html), with the additional guidelines
+of [How the ASF works](https://www.apache.org/foundation/how-it-works), with the additional guidelines
 and clarifications found herein.
 
 ## Roles and Responsibilities
@@ -57,7 +57,7 @@ of the Project.
 The Vice President is appointed by the ASF Board. The Vice President is assisted by the Project Management Committee
 (PMC) and also serves as the PMC chair. The PMC may nominate new members. Nominees may then be approved
 with a 3/4 majority vote of the PMC. Membership can be revoked by a unanimous vote of all the active PMC members
-other than the member in question. The list of active PMC members can be found on our [Volunteers page](volunteers.html).
+other than the member in question. The list of active PMC members can be found on our [Volunteers page](volunteers).
 
 ### PMC Duties
 
@@ -89,7 +89,7 @@ by the Project Management Committee.
 
 ### Voting
 
-Any subscriber to the list may [vote](https://www.apache.org/foundation/voting.html) on any issue or action item.
+Any subscriber to the list may [vote](https://www.apache.org/foundation/voting) on any issue or action item.
 Votes from Developers and Committers are especially welcome. However, the only binding votes are those cast by a PMC
 Member.
 
@@ -193,7 +193,7 @@ Distributions may be reclassified or withdrawn by majority vote, but the release
 
 ## Sandbox
 
-Pursuant to the ["Rules for Revolutionaries"](http://incubator.apache.org/learn/rules-for-revolutionaries.html),
+Pursuant to the ["Rules for Revolutionaries"](http://incubator.apache.org/learn/rules-for-revolutionaries),
 any committer may submit experimental material to the Sandbox area of the repository at his or her own discretion.
 
 Material must be moved from the sandbox to the main repository before it can be released. If a sandbox whiteboard 
@@ -202,4 +202,4 @@ becomes dormant for six or more months, it may be moved to the archive section o
 Experimental material that is outside the scope of the Struts project may also be  submitted to the
 [Apache Labs](http://labs.apache.org/)
 
-Next: [Volunteers](volunteers.html)
+Next: [Volunteers](volunteers)
diff --git a/source/contributors/building-normal-release.md b/source/contributors/building-normal-release.md
index c154b18..cb2c58c 100644
--- a/source/contributors/building-normal-release.md
+++ b/source/contributors/building-normal-release.md
@@ -39,7 +39,7 @@ Tag the release by using the "release:prepare" goal of Maven:
 mvn release:prepare -DautoVersionSubmodules=true
 ```
 
-For a [dry run](http://maven.apache.org/plugins/maven-release-plugin/usage.html), add `-DdryRun=true`. If you do a dry 
+For a [dry run](http://maven.apache.org/plugins/maven-release-plugin/usage), add `-DdryRun=true`. If you do a dry 
 run, use `mvn release:clean` to clean up after you have looked at the output.
 
 When prompted for the SCM tag name, follow this pattern: `STRUTS_2_5_[PATCH_VERSION]`
@@ -47,7 +47,7 @@ When prompted for the SCM tag name, follow this pattern: `STRUTS_2_5_[PATCH_VERS
 > If you get an error message, try to re-run `mvn release:prepare -DautoVersionSubmodules=true` command again,
 > -Dresume flag is set to true by default and the plugin will resume the release process from where it failed before.
 
-Follow the link to get [more information](http://maven.apache.org/plugins/maven-release-plugin/examples/prepare-release.html)
+Follow the link to get [more information](http://maven.apache.org/plugins/maven-release-plugin/examples/prepare-release)
 about performed operation by release plugin.
 
 ## Perform the release
@@ -56,7 +56,7 @@ about performed operation by release plugin.
 mvn release:perform -DretryFailedDeploymentCount=10
 ```
 
-Follow the link to get [more information](http://maven.apache.org/plugins/maven-release-plugin/examples/perform-release.html)
+Follow the link to get [more information](http://maven.apache.org/plugins/maven-release-plugin/examples/perform-release)
 about performed operation by release plugin. After this step the artifacts will be hosted by [Nexus](http://repository.apache.org/).
  
 The `-DretryFailedDeploymentCount=10` is needed when there are problems with network connection (used just in case).
@@ -175,7 +175,7 @@ svn mv https://dist.apache.org/repos/dist/dev/struts/$VERSION/ https://dist.apac
 ## Promote release
 
 Log in again to [Nexus](http://repository.apache.org/) and **release** the repository, it will be automatically 
-replicated across Maven Repositories. See [Releasing a Maven-based project](http://maven.apache.org/developers/release/apache-release.html)
+replicated across Maven Repositories. See [Releasing a Maven-based project](http://maven.apache.org/developers/release/apache-release)
 for further details.
 
 ## Clean up old releases
diff --git a/source/contributors/building-struts-master.md b/source/contributors/building-struts-master.md
index fcf4548..57227e1 100644
--- a/source/contributors/building-struts-master.md
+++ b/source/contributors/building-struts-master.md
@@ -33,7 +33,7 @@ Tag the release by using the "release:prepare" goal of Maven:
 mvn release:prepare -DautoVersionSubmodules=true
 ```
 
-For a [dry run](http://maven.apache.org/plugins/maven-release-plugin/usage.html), add `-DdryRun=true`. If you do a dry run,
+For a [dry run](http://maven.apache.org/plugins/maven-release-plugin/usage), add `-DdryRun=true`. If you do a dry run,
 use `mvn release:clean` to clean up after you have looked at the output. 
 
 When prompted for the SCM tag name, follow this pattern: `STRUTS_MASTER_[PATCH_VERSION]`
@@ -44,7 +44,7 @@ If for some reason, the release plugin might fail to tag the release, if it fail
 mvn release:prepare -Dresume 
 ```
 
-This step will ([more information](http://maven.apache.org/plugins/maven-release-plugin/examples/prepare-release.html)):
+This step will ([more information](http://maven.apache.org/plugins/maven-release-plugin/examples/prepare-release)):
 
 - Check that there are no uncommitted changes in the sources
 - Check that there are no SNAPSHOT dependencies
@@ -62,7 +62,7 @@ This step will ([more information](http://maven.apache.org/plugins/maven-release
 mvn release:perform
 ```
 
-This step will ([more information](http://maven.apache.org/plugins/maven-release-plugin/examples/perform-release.html)):
+This step will ([more information](http://maven.apache.org/plugins/maven-release-plugin/examples/perform-release)):
 
 - Checkout from an SCM URL with optional tag
 - Run the predefined Maven goals to release the project (by default, deploy site-deploy)
@@ -96,7 +96,7 @@ If the vote result is for an ASF release (i.e. not test build), update site, ann
 
 Log in again to [Nexus](http://repository.apache.org/) and **release** the repository, it will be automatically replicated across Maven Repositories
 
-See [Releasing a Maven-based project](http://maven.apache.org/developers/release/apache-release.html) for further details.
+See [Releasing a Maven-based project](http://maven.apache.org/developers/release/apache-release) for further details.
 
 ### Wait for rsync
 
diff --git a/source/contributors/editing-the-documentation.md b/source/contributors/editing-the-documentation.md
index 0120d17..699de0b 100644
--- a/source/contributors/editing-the-documentation.md
+++ b/source/contributors/editing-the-documentation.md
@@ -19,7 +19,7 @@ in the upper left corner labeled `Edit on GitHub` which helps you create changes
 The Struts 2 Documentation space is bundled with the Struts distribution, and, eventually, the content may be checked 
 into an ASF repository. Accordingly, all volunteers working to this space must have a CLA on file. 
 
-The project also hosts a second Confluence space, the [Struts 2 wiki](http://cwiki.apache.org/S2WIKI/home.html), 
+The project also hosts a second Confluence space, the [Struts 2 wiki](http://cwiki.apache.org/S2WIKI/home), 
 which can be edited by anyone who creates an account. 
 
 See also: [How to Help FAQ](../helping).
@@ -30,7 +30,7 @@ Since projects like Struts wear our code "on our sleeve", there's always a discu
 represent the latest documentation or the documentation for the "best available" release. Over the years, we've done it 
 one way and the another, and now we do it both ways  :-) 
 
-- [http://cwiki.apache.org/WW/home.html](http://cwiki.apache.org/WW/home.html)
+- [http://cwiki.apache.org/WW/home.html](http://cwiki.apache.org/WW/home)
 
 When we vote a test build to a release (of any flavor: alpha, beta, GA), we archive the HTML version of the documentation 
 for future reference. When a release is designated GA, we update the appropriate links on the main site to point 
@@ -41,7 +41,7 @@ we actually have distribution rights.
 
 To cover all the bases, we also maintain a "community wiki", that is not bundled with the distribution. 
 
-- [http://cwiki.apache.org/S2WIKI/home.html](http://cwiki.apache.org/S2WIKI/home.html)
+- [http://cwiki.apache.org/S2WIKI/home.html](http://cwiki.apache.org/S2WIKI/home)
 
 It's open to anyone who signs up for an account on Confluence. Sometimes, we do move documentation from the community wiki 
 to the documentation wiki, if the author can a CLA. 
diff --git a/source/contributors/index.md b/source/contributors/index.md
index a8c1e75..b914fd0 100644
--- a/source/contributors/index.md
+++ b/source/contributors/index.md
@@ -12,7 +12,7 @@ title: Contributors Guide
 - [Creating and Signing a Distribution](creating-and-signing-a-distribution) 
 - [Precise Error Reporting](precise-error-reporting)
 - [Obtaining an IDEA license](obtaining-an-idea-license)
-- [How to Write Doc Comments for the Javadoc Tool](https://www.oracle.com/technical-resources/articles/java/javadoc-tool.html) (Oracle)
+- [How to Write Doc Comments for the Javadoc Tool](https://www.oracle.com/technical-resources/articles/java/javadoc-tool) (Oracle)
 
 ## Documentation
 
@@ -21,8 +21,8 @@ title: Contributors Guide
 
 ## Licensing and Copyright
 
-- [Third Party Licensing Policy RFC](http://people.apache.org/~cliffs/3party.html)
-- [ASF Source Header and Copyright Notice Policy](http://www.apache.org/legal/src-headers.html)
+- [Third Party Licensing Policy RFC](http://people.apache.org/~cliffs/3party)
+- [ASF Source Header and Copyright Notice Policy](http://www.apache.org/legal/src-headers)
 - [Author Tags](http://tinyurl.com/mw7t6)
 
 ## Quick Links
@@ -33,4 +33,4 @@ title: Contributors Guide
 - [Release Guidelines](../../releases)
 - [Javadocs](http://people.apache.org/~mrdon/action2-api/)
 - [Source code repository](https://svn.apache.org/repos/asf/struts/action2)
-- [Our WebWork roots](http://today.java.net/pub/a//today/2005/02/25/opensymphony.html)
+- [Our WebWork roots](http://today.java.net/pub/a//today/2005/02/25/opensymphony)
diff --git a/source/contributors/obtaining-an-idea-license.md b/source/contributors/obtaining-an-idea-license.md
index 539e661..d9aea0c 100644
--- a/source/contributors/obtaining-an-idea-license.md
+++ b/source/contributors/obtaining-an-idea-license.md
@@ -23,7 +23,7 @@ and welcome contributions to a project. For more, see:
 
 - [http://apache.org/foundation/faq.html#joining](http://apache.org/foundation/faq.html#joining)
 - [http://apache.org/foundation/how-it-works.html#meritocracy](http://apache.org/foundation/how-it-works.html#meritocracy)
-- [http://struts.apache.org/helping.html](http://struts.apache.org/helping.html)
+- [http://struts.apache.org/helping.html](http://struts.apache.org/helping)
 
 The reason JetBrains (among others) give committers licenses is because we have earned them by helping to create open 
 source products, many of which JetBrains uses internally.
diff --git a/source/contributors/one-time-steps.md b/source/contributors/one-time-steps.md
index ce06b4c..3ddeca7 100644
--- a/source/contributors/one-time-steps.md
+++ b/source/contributors/one-time-steps.md
@@ -65,7 +65,7 @@ svn commit KEYS -m "Add public key"
 
 Create a `settings.xml` under `~/.m2` and follow below instructions:
 - create profile - [Releasing a Maven-based](http://maven.apache.org/developers/release/apache-release.html\#Prerequisites)
-- enable Apache servers [Committer Settings](http://maven.apache.org/developers/committer-settings.html)
+- enable Apache servers [Committer Settings](http://maven.apache.org/developers/committer-settings)
 
 ```xml
 <settings xmlns="http://maven.apache.org/POM/4.0.0"
@@ -115,9 +115,9 @@ MAVEN_OPTS=-Xmx1024m
 
 - Apache Struts [Release Guidelines](http://struts.apache.org/releases.html\#Releases)
 - [Struts Maintenance Guide for Maven ](http://wiki.apache.org/struts/StrutsMaintenanceMaven)
-- [Signing Releases](http://apache.org/dev/release-signing.html)
+- [Signing Releases](http://apache.org/dev/release-signing)
 - [Wendy's notes on Release Signing](http://wiki.wsmoak.net/cgi-bin/wiki.pl?ReleaseSigning)
-- Apache [Mirroring Guidelines](http://apache.org/dev/mirrors.html)
+- Apache [Mirroring Guidelines](http://apache.org/dev/mirrors)
 
 ## Retagging
 
diff --git a/source/core-developers/action-chaining.md b/source/core-developers/action-chaining.md
index 94bdbf8..32fc5e1 100644
--- a/source/core-developers/action-chaining.md
+++ b/source/core-developers/action-chaining.md
@@ -9,14 +9,14 @@ parent:
 # Action Chaining
 
 The framework provides the ability to chain multiple actions into a defined sequence or workflow. This feature works 
-by applying a [Chain Result](chain-result.html) to a given Action, and intercepting its target Action's invocation 
-with a [Chaining Interceptor](chaining-interceptor.html).
+by applying a [Chain Result](chain-result) to a given Action, and intercepting its target Action's invocation 
+with a [Chaining Interceptor](chaining-interceptor).
 
 > As a rule, Action Chaining is not recommended. First explore other options, such as the `Redirect After Post` technique.
 
 ## Chain Result
 
-The [Chain Result](chain-result.html) is a result type that invokes an Action with its own Interceptor Stack and Result. 
+The [Chain Result](chain-result) is a result type that invokes an Action with its own Interceptor Stack and Result. 
 This Interceptor allows an Action to forward requests to a target Action, while propagating the state of the source Action. 
 Below is an example of how to define this sequence.
 
@@ -44,13 +44,13 @@ Below is an example of how to define this sequence.
 ```
 
 Another action mapping in the same namespace (or the default "" namespace) can be executed after this action mapping 
-(see [Configuration Files](configuration-files.html)). An optional "namespace" parameter may also be added to specify 
+(see [Configuration Files](configuration-files)). An optional "namespace" parameter may also be added to specify 
 an action in a different namespace.
 
 ## Chaining Interceptor
 
 If you need to copy the properties from your previous Actions in the chain to the current action, you should apply 
-the [Chaining Interceptor](chaining-interceptor.html). The Interceptor will copy the original parameters from the request, 
+the [Chaining Interceptor](chaining-interceptor). The Interceptor will copy the original parameters from the request, 
 and the ValueStack is passed in to the target Action. The source Action is remembered by the ValueStack, allowing 
 the target Action to access the properties of the preceding Action(s) using the ValueStack, and also makes these 
 properties available to the final result of the chain, such as the JSP or Velocity page.
@@ -58,12 +58,12 @@ properties available to the final result of the chain, such as the JSP or Veloci
 One common use of Action chaining is to provide lookup lists (like for a dropdown list of states). Since these Actions 
 get put on the ValueStack, their properties will be available in the view. This functionality can also be done using 
 the ActionTag to execute an Action from the display page. You may also use 
-the [Redirect Action Result](redirect-action-result.html) to accomplish this.
+the [Redirect Action Result](redirect-action-result) to accomplish this.
 
 ## Use with care
 
 Experience shows that chaining should be used with care. If chaining is overused, an application can turn into 
-"spaghetti code". Actions should be treated as a [Transaction Script](http://martinfowler.com/eaaCatalog/transactionScript.html), 
+"spaghetti code". Actions should be treated as a [Transaction Script](http://martinfowler.com/eaaCatalog/transactionScript), 
 rather than as methods in a [Business Facade](http://msdn2.microsoft.com/en\-us/library/aa291571(VS.71).aspx). Be sure 
 to ask yourself why you need to chain from one Action to another. Is a navigational issue, or could the logic in Action2 
 be pushed back to a support class or business facade so that Action1 can call it too?
diff --git a/source/core-developers/action-configuration.md b/source/core-developers/action-configuration.md
index ebc7210..a8fb3f5 100644
--- a/source/core-developers/action-configuration.md
+++ b/source/core-developers/action-configuration.md
@@ -348,7 +348,7 @@ as a default.
 
 To specify a different class as the default Action class, set the `default-class-ref` package attribute.
 
-> For more about using wildcards, see [Wildcard Mappings](wildcard-mappings.html).
+> For more about using wildcards, see [Wildcard Mappings](wildcard-mappings).
 
 ## Post-Back Default
 
diff --git a/source/core-developers/action-mapper.md b/source/core-developers/action-mapper.md
index b0b26fb..bfd802d 100644
--- a/source/core-developers/action-mapper.md
+++ b/source/core-developers/action-mapper.md
@@ -16,32 +16,32 @@ parent:
 
 The ActionMapper interface provides a mapping between HTTP requests and action invocation requests and vice-versa.
 
-When given an HttpServletRequest, the ActionMapper may return null if no action invocation request matches or it may 
+When given an HttpServletRequest, the ActionMapper may return null if no action invocation request matches or it may 
 return an `ActionMapping` that describes an action invocation for the framework to try.
 
-The ActionMapper is not required to guarantee that the `ActionMapping` returned be a real action or otherwise ensure 
-a valid request. Accordingly, most ActionMappers do not need to consult the Struts configuration just to determine if 
+The ActionMapper is not required to guarantee that the `ActionMapping` returned be a real action or otherwise ensure 
+a valid request. Accordingly, most ActionMappers do not need to consult the Struts configuration just to determine if 
 a request should be mapped.
 
-Just as requests can be mapped from HTTP to an action invocation, the opposite is true as well. However, because HTTP 
-requests (when shown in HTTP responses) must be in String form, a String is returned rather than an actual request object.
+Just as requests can be mapped from HTTP to an action invocation, the opposite is true as well. However, because HTTP 
+requests (when shown in HTTP responses) must be in String form, a String is returned rather than an actual request object.
 
 ## DefaultActionMapper
 
-Default action mapper implementation, using the standard `*.[ext]` (where ext usually **action**) pattern. The extension 
-is looked up from the Struts configuration key `struts.action.extension`.
+Default action mapper implementation, using the standard `*.[ext]` (where ext usually **action**) pattern. The extension 
+is looked up from the Struts configuration key `struts.action.extension`.
 
-To help with dealing with buttons and other related requirements, this mapper (and other `ActionMapper`s, we hope) has 
-the ability to name a button with some predefined prefix and have that button name alter the execution behaviour. 
+To help with dealing with buttons and other related requirements, this mapper (and other `ActionMapper`s, we hope) has 
+the ability to name a button with some predefined prefix and have that button name alter the execution behaviour. 
 
 The four prefixes are:
 
-- Method prefix - `method:default`
-- Action prefix - `action:dashboard`
+- Method prefix - `method:default`
+- Action prefix - `action:dashboard`
 
-In addition to these four prefixes, this mapper also understands the action naming pattern of `foo!bar` in either 
-the extension form (eg: `foo!bar.action`) or in the prefix form (eg: `action:foo!bar`). This syntax tells this mapper 
-to map to the action named `foo` and the method `bar`.
+In addition to these four prefixes, this mapper also understands the action naming pattern of `foo!bar` in either 
+the extension form (eg: `foo!bar.action`) or in the prefix form (eg: `action:foo!bar`). This syntax tells this mapper 
+to map to the action named `foo` and the method `bar`.
 
 > NOTE: By default support for the `action:` prefix has been disabled since Struts 2.3.15.3, please use the below 
 > constant to enable it:
@@ -58,10 +58,10 @@ to map to the action named `foo` and the method `bar`.
 
 ### Method prefix
 
-With method-prefix, instead of calling baz action's `execute()` method (by default if it isn't overridden in `struts.xml`
-to be something else), the baz action's `anotherMethod()` will be called. A very elegant way determine which button is 
-clicked. Alternatively, one would have submit button set a particular value on the action when clicked, and the `execute()`
-method decides on what to do with the setted value depending on which button is clicked.
+With method-prefix, instead of calling baz action's `execute()` method (by default if it isn't overridden in `struts.xml`
+to be something else), the baz action's `anotherMethod()` will be called. A very elegant way determine which button is 
+clicked. Alternatively, one would have submit button set a particular value on the action when clicked, and the `execute()`
+method decides on what to do with the setted value depending on which button is clicked.
 
 ```xml
 <s:form action="baz">
@@ -73,8 +73,8 @@ method decides on what to do with the setted value depending on which button is
 
 ### Action prefix
 
-With action-prefix, instead of executing baz action's `execute()` method (by default if it isn't overridden in `struts.xml` 
-to be something else), the anotherAction action's `execute()` method (assuming again if it isn't overridden with something 
+With action-prefix, instead of executing baz action's `execute()` method (by default if it isn't overridden in `struts.xml` 
+to be something else), the anotherAction action's `execute()` method (assuming again if it isn't overridden with something 
 else in `struts.xml`) will be executed.
 
 ```xml
@@ -87,19 +87,19 @@ else in `struts.xml`) will be executed.
 
 ### Allowed action name RegEx
 
-By default the mapper will check if extracted action name matches provided RegEx, i.e. `[a-zA-Z0-9._!/-]*`. You redefine 
-this RegEx by defining a constant in `struts.xml` named `struts.allowed.action.names`. If action name doesn't match 
-the RegEx a default action name will be returned which is defined as `index`. You can also redefine this by specifying 
-constant `struts.default.action.name` in `struts.xml`.
+By default the mapper will check if extracted action name matches provided RegEx, i.e. `[a-zA-Z0-9._!/-]*`. You redefine 
+this RegEx by defining a constant in `struts.xml` named `struts.allowed.action.names`. If action name doesn't match 
+the RegEx a default action name will be returned which is defined as `index`. You can also redefine this by specifying 
+constant `struts.default.action.name` in `struts.xml`.
 
 ### Allowed method name RegEx
 
 The same logic as above is used for extracted methods, the default RegEx (`[a-zA-Z_]*[0-9]*`) is used to check if method 
-is allowed, you can change this by setting constant `struts.allowed.method.names` in `struts.xml`. If method doesn't match 
-the RegEx a default method is returned, i.e. `execute`. This can be changed by defining constant `struts.default.method.name`
-in `struts.xml`.
+is allowed, you can change this by setting constant `struts.allowed.method.names` in `struts.xml`. If method doesn't match 
+the RegEx a default method is returned, i.e. `execute`. This can be changed by defining constant `struts.default.method.name`
+in `struts.xml`.
 
-Please note that this functionality only works when [Dynamic Method Invocation](action-configuration.html#dynamic-method-invocation)
+Please note that this functionality only works when [Dynamic Method Invocation](action-configuration.html#dynamic-method-invocation)
 is enabled.
 
 ## Custom ActionMapper
@@ -121,7 +121,7 @@ would be similar to a request to **/getPerson.action?personID=1** using the Defa
 A composite action mapper that is capable of delegating to a series of  if the former failed to obtained a valid 
 `ActionMapping` or uri.
 
-It is configured through [struts.xml](struts-xml.html). For example, with the following entries in `struts.xml`
+It is configured through [struts.xml](struts-xml). For example, with the following entries in `struts.xml`
 
 ```xml
 <constant name="struts.mapper.class" value="composite" />
@@ -222,4 +222,4 @@ public class MyCustomActionMapper implements ActionMapper {
 }
 ```
 
-> See also: [RestfulActionMapper](restful-action-mapper.html)
+> See also: [RestfulActionMapper](restful-action-mapper)
diff --git a/source/core-developers/ajax.md b/source/core-developers/ajax.md
index 9deceba..a5c7504 100644
--- a/source/core-developers/ajax.md
+++ b/source/core-developers/ajax.md
@@ -68,7 +68,7 @@ public class TextResult extends ActionSupport  {
 </action>
 ```
 
-> Struts 2 can also return a JSON (JavaScript Object Notation) response, using a [plugin](http://cwiki.apache.org/S2PLUGINS/json-plugin.html).
+> Struts 2 can also return a JSON (JavaScript Object Notation) response, using a [plugin](http://cwiki.apache.org/S2PLUGINS/json-plugin).
 
 On the client side, there are two basic strategies, which can be mixed and matched.
 
@@ -78,13 +78,13 @@ includes several _Ajax JSP tags_ , and many third-party libraries are available,
 
 - [Ajax Tags](http://ajaxtags.sourceforge.net/)
 - [AjaxParts Taglib](http://javawebparts.sourceforge.net/)
-- [ColdTags Suite](http://servletsuite.blogspot.com/2006/06/coldtags-suite-ajax-edition.html)
+- [ColdTags Suite](http://servletsuite.blogspot.com/2006/06/coldtags-suite-ajax-edition)
 - [Prize Tags](http://www.jenkov.com/prizetags/introduction.tmpl)
 - [JSON-taglib](http://json-taglib.sourceforge.net/)
 
 Alternatively, you can use a plain-old Ajax widget on a plain-old HTML page, using libraries like 
 [Dojo](http://dojotoolkit.org/), [JQuery](http://jquery.com/), or [YUI](http://developer.yahoo.com/yui/), 
-and the StreamResult or the [JSON Plugin](http://cwiki.apache.org/S2PLUGINS/json-plugin.html). 
+and the StreamResult or the [JSON Plugin](http://cwiki.apache.org/S2PLUGINS/json-plugin). 
 Here, the sky's the limit, but you actually have to learn something about JavaScript as a language.
 
 ## Ajax Plugins
@@ -111,7 +111,7 @@ While Struts works fine with Ajax out-of-the-box, for added value, several Ajax-
   the GWT RPC mechanism.
 - **JSON** - The _JSON Plugin_  serializes Actions properties into JSON, making it easy to respond to JavaScript requests.
 
-See the [Struts Plugin Repository](http://cwiki.apache.org/S2PLUGINS/home.html) for a complete list of Struts 2 plugins.
+See the [Struts Plugin Repository](http://cwiki.apache.org/S2PLUGINS/home) for a complete list of Struts 2 plugins.
 
 ## Ajax Results with JSP
 
@@ -138,4 +138,4 @@ Here's an example:
 ```
 
 In the code example, we use `System.out.println` to return a JSON data stream as the response. For more about this 
-technique, see the article [Using Dojo and JSON to Build Ajax Applications](http://today.java.net/pub/a/today/2006/04/27/building-ajax-with-dojo-and-json.html).
+technique, see the article [Using Dojo and JSON to Build Ajax Applications](http://today.java.net/pub/a/today/2006/04/27/building-ajax-with-dojo-and-json).
diff --git a/source/core-developers/annotation-parameter-filter-interceptor.md b/source/core-developers/annotation-parameter-filter-interceptor.md
index 2376cb9..4b2476a 100644
--- a/source/core-developers/annotation-parameter-filter-interceptor.md
+++ b/source/core-developers/annotation-parameter-filter-interceptor.md
@@ -8,9 +8,9 @@ parent:
 
 # Annotation Parameter Filter Interceptor
 
-Annotation based version of [Parameter Filter Interceptor](parameter-filter-interceptor.html).
+Annotation based version of [Parameter Filter Interceptor](parameter-filter-interceptor).
 
-This interceptor must be placed in the stack before the [Parameters Interceptor](parameters-interceptor.html). 
+This interceptor must be placed in the stack before the [Parameters Interceptor](parameters-interceptor). 
 When a parameter matches a field that is marked {@link Blocked} then it is removed from the parameter map.
 
 If an action class is marked with `BlockByDefault` then all parameters are removed unless a field on the Action exists 
diff --git a/source/core-developers/annotations.md b/source/core-developers/annotations.md
index ba55111..09aabeb 100644
--- a/source/core-developers/annotations.md
+++ b/source/core-developers/annotations.md
@@ -32,7 +32,7 @@ on how to set up classpath scanning to allow the use of Action annotations.
 |[InterceptorRef Annotation](../plugins/convention/#interceptorref-annotation) |Interceptor, or interceptor stack to be applied to at action|
 |[Results Annotation](../plugins/convention/#result-annotation) |Group of `@Result` annotations|
 |[Result Annotation](../plugins/convention/#result-annotation)|Defines a result for an action|
-|[Namespace Annotation](namespace-annotation.html)|Set the path of the action URL (used to overwrite the default)|
+|[Namespace Annotation](namespace-annotation)|Set the path of the action URL (used to overwrite the default)|
 |[ResultPath Annotation](../plugins/convention/#resultpath-annotation) |Set where the results are located (used to overwrite the default)|
 |[ParentPackage Annotation](..//plugins/convention/#parentpackage-annotation)|Set the parent package of the actions (used to overwrite the default)|
 |[ExceptionMappings](../plugins/convention/#exceptionmapping-annotation) |Group of `@ExceptionMapping` annotations|
@@ -42,41 +42,41 @@ on how to set up classpath scanning to allow the use of Action annotations.
 
 |Annotation|Description|
 |----------|-----------|
-|[InputConfig Annotation](input-config-annotation.html)|Defines what method to execute, or result to be returned if there are validation errors|
+|[InputConfig Annotation](input-config-annotation)|Defines what method to execute, or result to be returned if there are validation errors|
 
 ## Interceptor Annotations
 
-To use these annotations, you have to specify the [AnnotationWorkflowInterceptor](annotation-workflow-interceptor.html) 
+To use these annotations, you have to specify the [AnnotationWorkflowInterceptor](annotation-workflow-interceptor) 
 to your interceptor stack.
 
 |Annotation|Description|
 |----------|-----------|
-|[After Annotation](after-annotation.html)|Marks a action method that needs to be executed after the result.|
-|[Before Annotation](before-annotation.html)|Marks a action method that needs to be executed before the main action method.|
-|[BeforeResult Annotation](before-result-annotation.html)|Marks a action method that needs to be executed before the result.|
+|[After Annotation](after-annotation)|Marks a action method that needs to be executed after the result.|
+|[Before Annotation](before-annotation)|Marks a action method that needs to be executed before the main action method.|
+|[BeforeResult Annotation](before-result-annotation)|Marks a action method that needs to be executed before the result.|
 
 ## Validation Annotations
 
-To use annotation-based validation, annotate the class or interface with [Validation Annotation](validation-annotation.html).
+To use annotation-based validation, annotate the class or interface with [Validation Annotation](validation-annotation).
 
 |Annotation|Description|
 |----------|-----------|
-|[ConversionErrorFieldValidator Annotation](conversion-error-field-validator-annotation.html)|Checks if there are any conversion errors for a field.|
-|[DateRangeFieldValidator Annotation](date-range-field-validator-annotation.html)|Checks that a date field has a value within a specified range.|
-|[DoubleRangeFieldValidator Annotation](double-range-field-validator-annotation.html)|Checks that a double field has a value within a specified range.|
-|[EmailValidator Annotation](email-validator-annotation.html)|Checks that a field is a valid e-mail address.|
-|[ExpressionValidator Annotation](expression-validator-annotation.html)|Validates an expression.|
-|[FieldExpressionValidator Annotation](field-expression-validator-annotation.html)|Uses an OGNL expression to perform its validator.|
-|[IntRangeFieldValidator Annotation](int-range-field-validator-annotation.html)|Checks that a numeric field has a value within a specified range.|
-|[RegexFieldValidator Annotation](regex-field-validator-annotation.html)|Validates a regular expression for a field.|
-|[RequiredFieldValidator Annotation](required-field-validator-annotation.html)|Checks that a field is non-null.|
-|[RequiredStringValidator Annotation](required-string-validator-annotation.html)|Checks that a String field is not empty.|
-|[StringLengthFieldValidator Annotation](string-length-field-validator-annotation.html)|Checks that a String field is of the right length.|
-|[UrlValidator Annotation](url-validator-annotation.html)|Checks that a field is a valid URL.|
-|[Validation Annotation](validation-annotation.html)|Marker annotation for validation at Type level.|
-|[Validations Annotation](validations-annotation.html)|Used to group validation annotations.|
-|[VisitorFieldValidator Annotation](visitor-field-validator-annotation.html)|Invokes the validation for a property's object type.|
-|[CustomValidator Annotation](custom-validator-annotation.html)|Use this annotation for your custom validator types.|
+|[ConversionErrorFieldValidator Annotation](conversion-error-field-validator-annotation)|Checks if there are any conversion errors for a field.|
+|[DateRangeFieldValidator Annotation](date-range-field-validator-annotation)|Checks that a date field has a value within a specified range.|
+|[DoubleRangeFieldValidator Annotation](double-range-field-validator-annotation)|Checks that a double field has a value within a specified range.|
+|[EmailValidator Annotation](email-validator-annotation)|Checks that a field is a valid e-mail address.|
+|[ExpressionValidator Annotation](expression-validator-annotation)|Validates an expression.|
+|[FieldExpressionValidator Annotation](field-expression-validator-annotation)|Uses an OGNL expression to perform its validator.|
+|[IntRangeFieldValidator Annotation](int-range-field-validator-annotation)|Checks that a numeric field has a value within a specified range.|
+|[RegexFieldValidator Annotation](regex-field-validator-annotation)|Validates a regular expression for a field.|
+|[RequiredFieldValidator Annotation](required-field-validator-annotation)|Checks that a field is non-null.|
+|[RequiredStringValidator Annotation](required-string-validator-annotation)|Checks that a String field is not empty.|
+|[StringLengthFieldValidator Annotation](string-length-field-validator-annotation)|Checks that a String field is of the right length.|
+|[UrlValidator Annotation](url-validator-annotation)|Checks that a field is a valid URL.|
+|[Validation Annotation](validation-annotation)|Marker annotation for validation at Type level.|
+|[Validations Annotation](validations-annotation)|Used to group validation annotations.|
+|[VisitorFieldValidator Annotation](visitor-field-validator-annotation)|Invokes the validation for a property's object type.|
+|[CustomValidator Annotation](custom-validator-annotation)|Use this annotation for your custom validator types.|
 
 ### Resources
 
@@ -87,19 +87,19 @@ To use annotation-based validation, annotate the class or interface with [Valida
 By default, type conversion for Maps and Collections using generics is directly supported.
 
 In short, instead of specifying the types found in collections and maps as documented 
-in [Type Conversion](type-conversion.html), **the collection's generic type is used**. By using annotations, 
+in [Type Conversion](type-conversion), **the collection's generic type is used**. By using annotations, 
 an application should be able to avoid using any `ClassName-conversion.properties` files.
 
-To use annotation-based type conversion, annotate the class or interface with the [Conversion Annotation](conversion-annotation.html).
+To use annotation-based type conversion, annotate the class or interface with the [Conversion Annotation](conversion-annotation).
 
 |Annotation|Description|
 |----------|-----------|
-|[Conversion Annotation](conversion-annotation.html)|Marker annotation for type conversions at Type level.|
-|[CreateIfNull Annotation](create-if-null-annotation.html)|For Collection and Map types: Create the types within the Collection or Map, if null.|
-|[Element Annotation](element-annotation.html)|For Generic types: Specify the element type for Collection types and Map values.|
-|[Key Annotation](key-annotation.html)|For Generic types: Specify the key type for Map keys.|
-|[KeyProperty Annotation](key-property-annotation.html)|For Generic types: Specify the key property name value.|
-|[TypeConversion Annotation](type-conversion-annotation.html)|Used for class and application wide conversion rules.|
+|[Conversion Annotation](conversion-annotation)|Marker annotation for type conversions at Type level.|
+|[CreateIfNull Annotation](create-if-null-annotation)|For Collection and Map types: Create the types within the Collection or Map, if null.|
+|[Element Annotation](element-annotation)|For Generic types: Specify the element type for Collection types and Map values.|
+|[Key Annotation](key-annotation)|For Generic types: Specify the key type for Map keys.|
+|[KeyProperty Annotation](key-property-annotation)|For Generic types: Specify the key property name value.|
+|[TypeConversion Annotation](type-conversion-annotation)|Used for class and application wide conversion rules.|
 
 ## Tiles Annotations
 
@@ -115,4 +115,4 @@ Instead tiles definitions can be created by annotating actions.
 |TilesAddAttribute|Represents a `<add-attribute>` element in tiles.xml|
 |TilesAddListAttribute|Represents a `<add-list-attribute>` element in tiles.xml|
 
- 
\ No newline at end of file
+ 
diff --git a/source/core-developers/application-servers.md b/source/core-developers/application-servers.md
index 5971586..4ac9acf 100644
--- a/source/core-developers/application-servers.md
+++ b/source/core-developers/application-servers.md
@@ -13,10 +13,10 @@ be some extra steps to obtain full functionality.
 - OC4J
 - Orion
 - Resin
-- [SunOne 7.0](sunone-7-0.html)
-- [JBoss 5](jboss-5.html)
-- [WebLogic](weblogic.html)
-- [WebLogic 6.1](weblogic-6-1.html)
-- [WebSphere](websphere.html)
-- [Glassfish 2.x](glassfish-2-x.html)
+- [SunOne 7.0](sunone-7-0)
+- [JBoss 5](jboss-5)
+- [WebLogic](weblogic)
+- [WebLogic 6.1](weblogic-6-1)
+- [WebSphere](websphere)
+- [Glassfish 2.x](glassfish-2-x)
 - Wildfly 10.x
diff --git a/source/core-developers/attachments/att1846_nutshell.GIF b/source/core-developers/attachments/att1846_nutshell.gif
similarity index 100%
rename from source/core-developers/attachments/att1846_nutshell.GIF
rename to source/core-developers/attachments/att1846_nutshell.gif
diff --git a/source/core-developers/chaining-interceptor.md b/source/core-developers/chaining-interceptor.md
index 0906cd8..ba7e35a 100644
--- a/source/core-developers/chaining-interceptor.md
+++ b/source/core-developers/chaining-interceptor.md
@@ -10,11 +10,11 @@ parent:
 
 ## Description
 
-An interceptor that copies all the properties of every object in the value stack to the currently executing object, 
-except for any object that implements [Unchainable](/maven/struts2-core/apidocs/com/opensymphony/xwork2/Unchainable.html). 
-A collection of optional `includes` and `excludes` may be provided to control how and which parameters are copied. 
-Only `includes` or `excludes` may be specified. Specifying both results in undefined behavior. See the JavaDocs 
-for [ReflectionProvider#copy(Object, Object, java.util.Map, java.util.Collection, java.util.Collection)](/maven/struts2-core/apidocs/com/opensymphony/xwork2/util/reflection/ReflectionProvider.html#copy(java.lang.Object, java.lang.Object, java.util.Map, java.util.Collection, java.util.Collection))
+An interceptor that copies all the properties of every object in the value stack to the currently executing object,
+except for any object that implements [Unchainable](/maven/struts2-core/apidocs/com/opensymphony/xwork2/Unchainable). 
+A collection of optional `includes` and `excludes` may be provided to control how and which parameters are copied. 
+Only `includes` or `excludes` may be specified. Specifying both results in undefined behavior. See the JavaDocs 
+for [ReflectionProvider#copy(Object, Object, java.util.Map, java.util.Collection, java.util.Collection)](/maven/struts2-core/apidocs/com/opensymphony/xwork2/util/reflection/ReflectionProvider.html#copy(java.lang.Object, java.lang.Object, java.util.Map, java.util.Collection, java.util.Collection))
 for more information.
 
 > It is important to remember that this interceptor does nothing if there are no objects already on the stack. 
@@ -39,8 +39,8 @@ the below three constants in struts.properties or struts.xml:
 
 ## Parameters
 
- - `excludes` (optional) - the list of parameter names to exclude from copying (all others will be included)
- - `includes` (optional) - the list of parameter names to include when copying (all others will be excluded)
+ - `excludes` (optional) - the list of parameter names to exclude from copying (all others will be included)
+ - `includes` (optional) - the list of parameter names to include when copying (all others will be excluded)
 
 ## Extending the Interceptor
 
diff --git a/source/core-developers/configuration-elements.md b/source/core-developers/configuration-elements.md
index f040c47..413ffd3 100644
--- a/source/core-developers/configuration-elements.md
+++ b/source/core-developers/configuration-elements.md
@@ -17,24 +17,24 @@ At runtime, there is a single configuration for an application. Prior to runtime
 one or more XML documents, including the default `struts.xml` document. There are several elements that can be configured, 
 including packages, namespaces, includes, actions, results, interceptors, and exceptions.
 
-> See [struts.xml](struts-xml.html) for a working example.
+> See [struts.xml](struts-xml) for a working example.
 
 ## Administrative Elements
 
-- [Bean Configuration](bean-configuration.html)
-- [Constant Configuration](constant-configuration.html)
-- [Package Configuration](package-configuration.html)
-- [Namespace Configuration](namespace-configuration.html)
-- [Include Configuration](include-configuration.html)
+- [Bean Configuration](bean-configuration)
+- [Constant Configuration](constant-configuration)
+- [Package Configuration](package-configuration)
+- [Namespace Configuration](namespace-configuration)
+- [Include Configuration](include-configuration)
 
 ## Request Handling Elements
 
-- [Interceptor Configuration](include-configuration.html)
-- [Action Configuration](action-configuration.html)
-  - [Wildcard Mappings](wildcard-mappings.html)
-- [Result Configuration](result-configuration.html)
-- [Unknown Handlers](unknown-handlers.html)
+- [Interceptor Configuration](include-configuration)
+- [Action Configuration](action-configuration)
+  - [Wildcard Mappings](wildcard-mappings)
+- [Result Configuration](result-configuration)
+- [Unknown Handlers](unknown-handlers)
 
 ## Error Handling
 
-- [Exception Configuration](exceptio-configuration.html)
+- [Exception Configuration](exceptio-configuration)
diff --git a/source/core-developers/configuration-files.md b/source/core-developers/configuration-files.md
index 5ff67bc..7e795a2 100644
--- a/source/core-developers/configuration-files.md
+++ b/source/core-developers/configuration-files.md
@@ -12,18 +12,18 @@ it is possible to build an entire Struts application without writing a single co
 
 The table lists the files that you can use to configure the framework for your application. Some configuration files 
 can be reloaded dynamically. Dynamic reloading makes interactive development possible. 
-See [Reloading configuration](reloading-configuration.html) for more.
+See [Reloading configuration](reloading-configuration) for more.
 
 | File | Optional | Location (relative to webapp) | Purpose |
 |------|----------|-------------------------------|---------|
-|[web.xml](web-xml.html)| no | /WEB-INF/ | Web deployment descriptor to include all necessary framework components |
-|[struts.xml](struts-xml.html)| yes | /WEB-INF/classes/ | Main configuration, contains result/view types, action mappings, interceptors, and so forth \
+|[web.xml](web-xml)| no | /WEB-INF/ | Web deployment descriptor to include all necessary framework components |
+|[struts.xml](struts-xml)| yes | /WEB-INF/classes/ | Main configuration, contains result/view types, action mappings, interceptors, and so forth \
 |
-|[default.properties](default-properties.html)| yes | /WEB-INF/classes/ | Framework properties |
-|[struts-default.xml](struts-default-xml.html)| yes | /WEB-INF/lib/struts2-core.jar | Default configuration provided by Struts |
-|[struts-default.vm](struts-default-vm.html)| yes | /WEB-INF/classes/ | Default macros referenced by velocity.properties|
+|[default.properties](default-properties)| yes | /WEB-INF/classes/ | Framework properties |
+|[struts-default.xml](struts-default-xml)| yes | /WEB-INF/lib/struts2-core.jar | Default configuration provided by Struts |
+|[struts-default.vm](struts-default-vm)| yes | /WEB-INF/classes/ | Default macros referenced by velocity.properties|
 | struts-plugin.xml | yes | At the root of a plugin JAR| Optional configuration files for [Plugins](../plugins-developer-guide/)  in the same format as struts.xml. |
-|[velocity.properties](velocity-properties.html)| yes | /WEB-INF/classes/ | Override the default _Velocity_  configuration |
+|[velocity.properties](velocity-properties)| yes | /WEB-INF/classes/ | Override the default _Velocity_  configuration |
 
 ## Static Content
 
diff --git a/source/core-developers/configuration-provider-and-configuration.md b/source/core-developers/configuration-provider-and-configuration.md
index 59569ce..428a3ce 100644
--- a/source/core-developers/configuration-provider-and-configuration.md
+++ b/source/core-developers/configuration-provider-and-configuration.md
@@ -5,12 +5,12 @@ title: Configuration Provider & Configuration
 
 # Configuration Provider & Configuration
 
-The ConfigurationProvider interface describes the framework's configuration\. By default, the framework loads its configurations via an XML document by using the `StrutsXmlConfigurationProvider`\. The provider can be configured through a Dispatcher's [DispatcherListener](dispatcher-listener.html)\.
+The ConfigurationProvider interface describes the framework's configuration. By default, the framework loads its 
+configurations via an XML document by using the `StrutsXmlConfigurationProvider`. The provider can be configured 
+through a Dispatcher's [DispatcherListener](dispatcher-listener).
 
 ## Example
 
-
-
 ```java
  static {
    Dispatcher.addDispatcherListener(new DispatcherListener() {
@@ -22,19 +22,16 @@ The ConfigurationProvider interface describes the framework's configuration\. By
      ....
    });
  }
-
 ```
 
 ## Configuration provider
 
+`ConfigurationProvider` is the basic piece of configuration used to tie all the options together in `ConfigurationManager`. 
+There is few different implementations that are already used internally by the Apache Struts:
 
-`ConfigurationProvider` is the basic piece of configuration used to tie all the options together in `ConfigurationManager`\. There is few different implementations that are already used internally by the Apache Struts:
-
-+ `XmlConfigurationProvider` \- proprietary XWork implementation which are using `xwork.xml` file as source of configuration 
-
-+ `StrutsXmlConfigurationProvider` \- primary configuration provider, represents `struts.xml` and `struts-plugin.xml` files
-
-+ `PropertiesConfigurationProvider` \- used to load `struts.properties`
-+ `ServletContextAwareConfigurationProvider` \- marking interface allowing to inject `ServletContext` into provider
+- `XmlConfigurationProvider` - proprietary XWork implementation which are using `xwork.xml` file as source of configuration
+- `StrutsXmlConfigurationProvider` - primary configuration provider, represents `struts.xml` and `struts-plugin.xml` files
+- `PropertiesConfigurationProvider` - used to load `struts.properties`
+-`ServletContextAwareConfigurationProvider` - marking interface allowing to inject `ServletContext` into provider
 
-To inject your custom configuration provider use `configProviders` `<init-param/>` in [web.xml](web-xml.html)
+To inject your custom configuration provider use `configProviders` `<init-param/>` in [web.xml](web-xml)
diff --git a/source/core-developers/constant-configuration.md b/source/core-developers/constant-configuration.md
index ab2a6d5..01d655f 100644
--- a/source/core-developers/constant-configuration.md
+++ b/source/core-developers/constant-configuration.md
@@ -8,16 +8,16 @@ title: Constant Configuration
 Constants provide a simple way to customize a Struts application by defining key settings that modify framework and 
 plugin behavior. There are two key roles for constants. First, they are used to override settings like the maximum file 
 upload size or whether the Struts framework should be in "devMode" or not, and so on. Second, they specify which 
-[Bean](bean-configuration.html) implementation, among multiple implementations of a given type, should be chosen.
+[Bean](bean-configuration) implementation, among multiple implementations of a given type, should be chosen.
 
 Constants can be declared in multiple files. By default, constants are searched for in the following order, allowing 
 for subsequent files to override previous ones:
 
-1. [struts-default.xml](struts-default-xml.html)
+1. [struts-default.xml](struts-default-xml)
 2. struts-plugin.xml
-3. [struts.xml](struts-xml.html)
-4. [struts.properties](struts-properties.html)
-5. [web.xml](web-xml.html)
+3. [struts.xml](struts-xml)
+4. [default.properties](default-properties)
+5. [web.xml](web-xml)
 
 > The `struts.properties` file is provided for backward-compatibility with WebWork.
 
@@ -30,9 +30,9 @@ In the various XML variants, the constant element has two required attributes: `
 |name|**yes**|the name of the constant|
 |value|**yes**|the value of the constant|
 
-In the [struts.properties](struts-properties.html) file, each entry is treated as a constant.
+In the [default.properties](default-properties) file, each entry is treated as a constant.
 
-In the [web.xml](web-xml.html) file, any FilterDispatcher initialization parameters are loaded as constants.
+In the [web.xml](web-xml) file, any FilterDispatcher initialization parameters are loaded as constants.
 
 ### Value substitution
 
@@ -88,4 +88,4 @@ struts.devMode = true
     ...
 
 </web-app>
-```
\ No newline at end of file
+```
diff --git a/source/core-developers/conversion-annotation.md b/source/core-developers/conversion-annotation.md
index 3d02faa..3bb57ce 100644
--- a/source/core-developers/conversion-annotation.md
+++ b/source/core-developers/conversion-annotation.md
@@ -60,4 +60,4 @@ The `Conversion` annotation must be applied at Type level.
  }
 ```
 
-Check also [TypeConversion Annotation](type-conversion-annotation.html) for more examples!
+Check also [TypeConversion Annotation](type-conversion-annotation) for more examples!
diff --git a/source/core-developers/conversion-error-interceptor.md b/source/core-developers/conversion-error-interceptor.md
index 6136512..f90e38d 100644
--- a/source/core-developers/conversion-error-interceptor.md
+++ b/source/core-developers/conversion-error-interceptor.md
@@ -17,7 +17,7 @@ This is important because if the value "abc" is submitted and can't be converted
 string ("abc") again rather than the int value (likely 0, which would make very little sense to the user).
  
 > Note: Since 2.5.2, this interceptor extends `MethodFilterInterceptor`, therefore being able to deal with `excludeMethods` 
-> / `includeMethods` parameters. See [Workflow Interceptor](default-workflow-interceptor.html) for documentation and 
+> / `includeMethods` parameters. See [Workflow Interceptor](default-workflow-interceptor) for documentation and 
 > examples on how to use this feature.
 
 This interceptor extends `ConversionErrorInterceptor` but only adds conversion errors from the ActionContext to the field 
diff --git a/source/core-developers/custom-validator-annotation.md b/source/core-developers/custom-validator-annotation.md
index 1463378..490b35f 100644
--- a/source/core-developers/custom-validator-annotation.md
+++ b/source/core-developers/custom-validator-annotation.md
@@ -70,4 +70,4 @@ The annotation must be applied at method or type level.
 
 ## Adding Parameters
 
-Use the [ValidationParameter annotation](validation-parameter-annotation.html) to add custom parameter values.
+Use the [ValidationParameter annotation](validation-parameter-annotation) to add custom parameter values.
diff --git a/source/core-developers/debugging.md b/source/core-developers/debugging.md
index 8f028a4..7d863c9 100644
--- a/source/core-developers/debugging.md
+++ b/source/core-developers/debugging.md
@@ -8,13 +8,13 @@ title: Debugging
 Modern IDEs provide excellent support for debugging. In addition, the framework provides support for inspecting
 framework-specific objects at runtime.
 
-The [Debugging Interceptor](debugging-interceptor.html) provides three debugging modes to provide insight into the data 
+The [Debugging Interceptor](debugging-interceptor) provides three debugging modes to provide insight into the data 
 behind the page. The `xml` mode formats relevant framework objects as an XML document. The `console` mode provides 
 a OGNL command line that accepts entry of runtime expressions, and the `browser` mode adds an interactive page that 
 display objects from the Value Stack.
 
 To use the debugging, first be sure that `struts.devMode` is set to `true` is enabled through 
-the [struts.properties](struts-properties.html) file or `struts.xml` file, like:
+the [default.properties](default-properties) file or `struts.xml` file, like:
 
 ```xml
 <constant name="struts.devMode" value="true" />
diff --git a/source/core-developers/default-properties.md b/source/core-developers/default-properties.md
index 65329be..c63a817 100644
--- a/source/core-developers/default-properties.md
+++ b/source/core-developers/default-properties.md
@@ -5,7 +5,7 @@ title: default.properties
 
 # default.properties
 
-> All properties can also be set using [Constant Configuration](constant-configuration.html) in an XML configuration file.
+> All properties can also be set using [Constant Configuration](constant-configuration) in an XML configuration file.
 
 The framework uses a number of properties that can be changed to fit your needs\. To change any of these properties, 
 specify the property key and value in an `default.properties` file. The properties file can be locate anywhere 
diff --git a/source/core-developers/dependency-injection.md b/source/core-developers/dependency-injection.md
index 6873cad..3c44816 100644
--- a/source/core-developers/dependency-injection.md
+++ b/source/core-developers/dependency-injection.md
@@ -8,7 +8,7 @@ title: Dependency Injection
 Dependency injection removes the responsibility for object creation and object linking from the objects themselves 
 to a factory.  The factory is often provided by an Inversion of Control (IoC) container. For an overview 
 of Inversion of Control containers and the Dependency Injection pattern, please see 
-[Martin Fowler's article](http://www.martinfowler.com/articles/injection.html).
+[Martin Fowler's article](http://www.martinfowler.com/articles/injection).
 
 
 Internally, the framework uses its own dependency injection container that is very similar to Google Guice.  Both were 
diff --git a/source/core-developers/development-mode.md b/source/core-developers/development-mode.md
index 9184943..0afbd9d 100644
--- a/source/core-developers/development-mode.md
+++ b/source/core-developers/development-mode.md
@@ -7,20 +7,20 @@ title: Development Mode
 
 Please turn this option off before deploying application to a production environment - it can expose sensitive data of your application!
 
-Struts 2 has a setting (which can be set to `true` or `false` in [struts.properties](struts-properties.html)) 
+Struts 2 has a setting (which can be set to `true` or `false` in [default.properties](default-properties)) 
 called devMode (= development mode). When this setting is enabled, Struts 2 will provide additional logging and debug 
 information, which can significantly speed up development.
 
 You can also set this constant in your struts.xml file: `<constant name="struts.devMode" value="true" />`.
 
-This is the preferred method. See [Constant Configuration](constant-configuration.html) for more information.
+This is the preferred method. See [Constant Configuration](constant-configuration) for more information.
 
 ## What does it do?
 
 - When enabled, Struts 2 will reload your **resource bundles on every request** (meaning you can change your .properties 
   files, save them, and see the changes reflected on the next request). 
   **Note**: this option can also be set standalone via `struts.i18n.reload = true`
-- It will also **reload your xml configuration files** ([struts.xml](struts-xml.html)), your **validation files**, 
+- It will also **reload your xml configuration files** ([struts.xml](struts-xml)), your **validation files**, 
   and so on, on every request. This is useful for testing or fine-tuning your configuration without having to redeploy 
   your application every time.
   **Note**: this option can also be set standalone via `struts.configuration.xml.reload = true`
@@ -34,7 +34,7 @@ This is the preferred method. See [Constant Configuration](constant-configuratio
 
 ## Don't forget...
 
-By default, the development mode is disabled, because it has a significant impact on [performance](performance-tuning.html), 
+By default, the development mode is disabled, because it has a significant impact on [performance](performance-tuning), 
 since the entire configuration will be reloaded on every request.
 
 ## Page rendering is slow
diff --git a/source/core-developers/dispatcher-listener.md b/source/core-developers/dispatcher-listener.md
index c8cf537..ddc9a60 100644
--- a/source/core-developers/dispatcher-listener.md
+++ b/source/core-developers/dispatcher-listener.md
@@ -6,7 +6,7 @@ title: DispatcherListener
 # DispatcherListener
 
 Use a `DispatcherListener` object to execute code when a Dispatcher is initialized or destroyed. A `DispatcherListener` 
-is an easy way to associate customizable components like a [ConfigurationManager](configuration-provider-and-configuration.html) 
+is an easy way to associate customizable components like a [ConfigurationManager](configuration-provider-and-configuration) 
 with a Dispatcher.
 
 ## Example
diff --git a/source/core-developers/dispatcher.md b/source/core-developers/dispatcher.md
index 961c789..46fb226 100644
--- a/source/core-developers/dispatcher.md
+++ b/source/core-developers/dispatcher.md
@@ -6,7 +6,7 @@ title: Dispatcher
 # Dispatcher
 
 Dispatcher is the main point of control which dispatch request execution to given actions. It is used 
-by [filters](web-xml.html) / servlet / listener / portlet to set up and run Struts environment.
+by [filters](web-xml) / servlet / listener / portlet to set up and run Struts environment.
 
 ## Error handling
 
diff --git a/source/core-developers/file-upload-interceptor.md b/source/core-developers/file-upload-interceptor.md
index d6b2ef6..0825bbb 100644
--- a/source/core-developers/file-upload-interceptor.md
+++ b/source/core-developers/file-upload-interceptor.md
@@ -8,7 +8,7 @@ parent:
 
 # File Upload Interceptor
 
-See [this page](file-upload.html) for more examples and advanced configuration.
+See [this page](file-upload) for more examples and advanced configuration.
 
 Interceptor that is based off of `MultiPartRequestWrapper`, which is automatically applied for any request that includes 
 a file. It adds the following parameters, where `<file name>` is the name given to the file uploaded by the HTML form:
diff --git a/source/core-developers/file-upload.md b/source/core-developers/file-upload.md
index fddca06..2da95d9 100644
--- a/source/core-developers/file-upload.md
+++ b/source/core-developers/file-upload.md
@@ -403,7 +403,7 @@ The request must use the `POST` method and match the RegEx, by default the RegE
 ^multipart\\/form-data(; boundary=[a-zA-Z0-9]{1,70})?
 ```
 
-Please read [RFC1341](https://www.w3.org/Protocols/rfc1341/7\_2\_Multipart.html) the **Multipart section** for more details, existing 
+Please read [RFC1341](https://www.w3.org/Protocols/rfc1341/7\_2\_Multipart) the **Multipart section** for more details, existing 
 Struts `Multipart` parsers support only `multipart/form-data` content type. This option is available since Struts 2.3.11.
 
 ### Disabling file upload support
diff --git a/source/core-developers/formatting-dates-and-numbers.md b/source/core-developers/formatting-dates-and-numbers.md
index 23f3f6f..4a22095 100644
--- a/source/core-developers/formatting-dates-and-numbers.md
+++ b/source/core-developers/formatting-dates-and-numbers.md
@@ -10,7 +10,7 @@ title: Formatting Dates and Numbers
 Struts2 supports localization (l10n) aware formatting of dates, times and numbers very easily, utilizing Java's 
 built-in date formatting features.
 
-As seen in the [Localization](localization.html) chapter, it is quite easy to define hierarchical resource bundles 
+As seen in the [Localization](localization) chapter, it is quite easy to define hierarchical resource bundles 
 with Struts2, giving the developer the opportunity to define locale dependent message formats. This is the entry point 
 to define the needed date, time and number formats. Your default properties could contain the following generic formats:
 
@@ -33,7 +33,7 @@ In parallel, you could add the following to your de_DE bundle:
 format.date = {0,date,dd.MM.yyyy}
 ```
 
-Read more on how to define message formats in Sun's Java API docs for [MessageFormat](http://java.sun.com/j2se/1.5.0/docs/api/java/text/MessageFormat.html).
+Read more on how to define message formats in Sun's Java API docs for [MessageFormat](http://java.sun.com/j2se/1.5.0/docs/api/java/text/MessageFormat).
 
 Now that we have our formats set up, it is quite easy to use them in our views.
 
diff --git a/source/core-developers/freemarker-result.md b/source/core-developers/freemarker-result.md
index 5e8808d..7d429f7 100644
--- a/source/core-developers/freemarker-result.md
+++ b/source/core-developers/freemarker-result.md
@@ -14,7 +14,7 @@ so that the template location can be either
 - relative to the web root folder, e.g.: `/WEB-INF/views/home.ftl`
 - a classpath resource, e.g.: `/com/company/web/views/home.ftl`
 
-Also see [Freemarker Support](freemarker-support.html).
+Also see [Freemarker Support](freemarker-support).
 
 ## Parameters
 
diff --git a/source/core-developers/index.md b/source/core-developers/index.md
index fdd2b0c..250a69f 100644
--- a/source/core-developers/index.md
+++ b/source/core-developers/index.md
@@ -5,64 +5,64 @@ title: Core Developers Guide
 
 # Core Developers Guide
 
-Struts 2 processes requests using three core types: [interceptors](interceptor-configuration.html), [actions](action-configuration.html), and [results](result-configuration.html). 
-Each may be configured via XML or annotations.
+Struts 2 processes requests using three core types: [interceptors](interceptor-configuration), [actions](action-configuration)
+and [results](result-configuration). Each may be configured via XML or annotations.
 
 ## Developing Applications with Struts 2
 
-- [Nutshell](nutshell.html)
-- [AJAX](ajax.html)
-- [Dependency Injection](dependency-injection.html)
-- [Debugging](debugging.html)
-- [Development Mode](development-mode.html)
+- [Nutshell](nutshell)
+- [AJAX](ajax)
+- [Dependency Injection](dependency-injection)
+- [Debugging](debugging)
+- [Development Mode](development-mode)
 
 ## Configuration
 
 - [Configuration by Convention](../plugins/convention/)
-- [Annotations](annotations.html)
-- [Configuration Elements](configuration-elements.html)
-  - [Actions](action-configuration.html), [Wildcard Mappings](wildcard-mappings.html), [Beans](bean-configuration.html), [Constants](constant-configuration.html)
-  - [Exceptions](exception-configuration.html), [Includes](include-configuration.html), [Interceptors](interceptor-configuration.html)
-  - [Namespaces](namespace-configuration.html), [Packages](package-configuration.html), [Results](result-configuration.html)
-  - [Unknown Handlers](unknown-handlers.html), [Dispatcher](dispatcher.html)
-- [Configuration Files](configuration-files.html)
-  - [web.xml](web-xml.html)
-  - [struts.xml](struts-xml.html)
-  - [default.properties](default-properties.html)
-  - [struts-default.xml](struts-default-xml.html)
-  - [velocity.properties](velocity-properties.html)
-  - [struts-default.vm](struts-default-vm.html)
-- [Application Servers](application-servers.html)
-- [Performance Tuning](performance-tuning.html)
+- [Annotations](annotations)
+- [Configuration Elements](configuration-elements)
+  - [Actions](action-configuration), [Wildcard Mappings](wildcard-mappings), [Beans](bean-configuration), [Constants](constant-configuration)
+  - [Exceptions](exception-configuration), [Includes](include-configuration), [Interceptors](interceptor-configuration)
+  - [Namespaces](namespace-configuration), [Packages](package-configuration), [Results](result-configuration)
+  - [Unknown Handlers](unknown-handlers), [Dispatcher](dispatcher)
+- [Configuration Files](configuration-files)
+  - [web.xml](web-xml)
+  - [struts.xml](struts-xml)
+  - [default.properties](default-properties)
+  - [struts-default.xml](struts-default-xml)
+  - [velocity.properties](velocity-properties)
+  - [struts-default.vm](struts-default-vm)
+- [Application Servers](application-servers)
+- [Performance Tuning](performance-tuning)
 - [Security](../security/)
 - [Testing Actions](../plugins/junit/)
   - [(arsenalist)](https://depressedprogrammer.wordpress.com/2007/06/18/unit-testing-struts-2-actions-spring-junit/)
-  - [(rosa)](http://fassisrosa.blogspot.com/2006/11/unit-testing-struts-20\.html)
-- [Interceptors](interceptors.html)
-  - [Writing Interceptors](writing-interceptors.html)
-  - [Excluding Parameters](parameters-interceptor.html)
+  - [(rosa)](http://fassisrosa.blogspot.com/2006/11/unit-testing-struts-20\)
+- [Interceptors](interceptors)
+  - [Writing Interceptors](writing-interceptors)
+  - [Excluding Parameters](parameters-interceptor)
 - Actions
-  - [Model Driven](model-driven.html)
-  - [Action Chaining](action-chaining.html)
-  - [ActionEventListener](action-event-listener.html)
+  - [Model Driven](model-driven)
+  - [Action Chaining](action-chaining)
+  - [ActionEventListener](action-event-listener)
 - Results
-  - [Result Types](result-types.html)
-  - [DispatcherListener](dispatcher-listener.html)
-  - [PreResultListener](pre-result-listener.html)
-- [Validation](validation.html)
-- [Localization](localization.html)
-  - [Formatting Dates and Numbers](formatting-dates-and-numbers.html)
-- [Type Conversion](type-conversion.html)
-- [Static Content](static-content.html)
+  - [Result Types](result-types)
+  - [DispatcherListener](dispatcher-listener)
+  - [PreResultListener](pre-result-listener)
+- [Validation](validation)
+- [Localization](localization)
+  - [Formatting Dates and Numbers](formatting-dates-and-numbers)
+- [Type Conversion](type-conversion)
+- [Static Content](static-content)
 - Portlets
   - [Tutorial] - export https://cwiki.apache.org/confluence/display/WW/Struts+2+Portlet+Tutorial
   - [Configuration/Documentation] - export https://cwiki.apache.org/confluence/display/WW/Portlet+Plugin
-- [Logging](logging.html)
-- [Accessing application, session, request objects](accessing-application-session-request-objects.html)
+- [Logging](logging)
+- [Accessing application, session, request objects](accessing-application-session-request-objects)
 - [Big Picture](big-picture)
     - [ObjectFactory](object-factory)
-    - [Action Mapper](action-mapper.html)
-    - [Action Proxy & ActionProxy Factory](action-proxy-and-actionproxy-factory.html)
+    - [Action Mapper](action-mapper)
+    - [Action Proxy & ActionProxy Factory](action-proxy-and-actionproxy-factory)
     - [Configuration Provider & Configuration](configuration-provider-and-configuration)
 - [FAQs](../faq/)
   - [Struts 2 Maven Archetypes](../maven-archetypes/)
diff --git a/source/core-developers/interceptor-configuration.md b/source/core-developers/interceptor-configuration.md
index e6a120b..5d9fcb4 100644
--- a/source/core-developers/interceptor-configuration.md
+++ b/source/core-developers/interceptor-configuration.md
@@ -50,7 +50,7 @@ but any action may also define its own local stack.
 </action>
 ```
 
-The default configuration - [struts-default.xml](struts-default-xml.html); sets up a default Interceptor Stack that 
+The default configuration - [struts-default.xml](struts-default-xml); sets up a default Interceptor Stack that 
 will work well for most applications.
 
-> For more, see [Interceptors](interceptors.html).
+> For more, see [Interceptors](interceptors).
diff --git a/source/core-developers/interceptors.md b/source/core-developers/interceptors.md
index 48278e2..36ec685 100644
--- a/source/core-developers/interceptors.md
+++ b/source/core-developers/interceptors.md
@@ -105,49 +105,49 @@ interceptors and stacks are available "out of the box".
 ## Framework Interceptors
 
 Interceptor classes are also defined using a key-value pair specified in the Struts configuration file. The names 
-specified below come specified in [struts-default.xml](struts-default-xml.html). If you extend the `struts-default` 
+specified below come specified in [struts-default.xml](struts-default-xml). If you extend the `struts-default` 
 package, then you can use the names below. Otherwise, they must be defined in your package with a name-class pair 
 specified in the `<interceptors/>` tag.
 
 |Interceptor|Name|Description|
 |-----------|----|-----------|
-|[Alias Interceptor](alias-interceptor.html)|alias|Converts similar parameters that may be named differently between requests.|
-|[Annotation Parameter Filter Interceptor](annotation-parameter-filter-interceptor.html)|annotationParameterFilter|Annotation based version of [Parameter Filter Interceptor](parameter-filter-interceptor.html).|
-|[Annotation Workflow Interceptor](annotation-workflow-interceptor.html)|annotationWorkflow|Invokes any annotated methods on the action.|
-|[Chaining Interceptor](chaining-interceptor.html)|chain|Makes the previous Action's properties available to the current Action. Commonly used together with <result type="chain"> (in the previous Action).|
-|[Checckbox Interceptor](checkbox-interceptor.html)|checkbox|Adds automatic checkbox handling code that detect an unchecked checkbox and add it as a parameter with a default (usually 'false') value. Uses a specially named hidden field to detect unsubmitted checkboxes. The default unchecked value is overridable for non-boolean value'd checkboxes.|
-|[COEP Interceptor](coep-interceptor.html)|coep|Implements the Cross-Origin Embedder Policy on incoming requests used to protect a document from loading any non-same-origin resources which don't explicitly grant the document permission to be loaded.|
-|[Conversion Error Interceptor](conversion-error-interceptor.html)|conversionError|Adds conversion errors from the ActionContext to the Action's field errors|
-|[Cookie Interceptor](cookie-interceptor.html)|cookie|Inject cookie with a certain configurable name / value into action. (Since 2.0.7.)|
-|[Cookie Provider Interceptor](cookie-provider-interceptor.html)|cookieProvider|Transfer cookies from action to response (Since 2.3.15.)|
-|[COOP Interceptor](coop-interceptor.html)|coop|Implements the Cross-Origin Opener Policy on incoming requests used to isolate resources against side-channel attacks and information leaks.|
-|[Create Session Interceptor](create-session-interceptor.html)|createSession|Create an HttpSession automatically, useful with certain Interceptors that require a HttpSession to work properly (like the TokenInterceptor)|
-|[Clear Session Interceptor](clear-session-interceptor.html)|clearSession|This interceptor clears the HttpSession.|
-|[Debugging Interceptor](debugging-interceptor.html)|debugging|Provides several different debugging screens to provide insight into the data behind the page.|
-|[Default Workflow Interceptor](default-workflow-interceptor.html)|workflow|Calls the validate method in your Action class. If Action errors are created then it returns the INPUT view.|
-|[Exception Interceptor](exception-interceptor.html)|exception|Maps exceptions to a result.|
-|[Execute and Wait Interceptor](execute-and-wait-interceptor.html)|execAndWait|Executes the Action in the background and then sends the user off to an intermediate waiting page.|
-|[Fetch Metadata Interceptor](fetch-metadata-interceptor.html)|fetchMetadata|Implements the Resource Isolation Policies on incoming requests used to protect against CSRF, XSSI, and cross-origin information leaks.|
-|[File Upload Interceptor](file-upload-interceptor.html)|fileUpload|An Interceptor that adds easy access to file upload support.|
-|[I18n Interceptor](i18n-interceptor.html)|i18n|Remembers the locale selected for a user's session.|
-|[Logging Interceptor](logging-interceptor.html)|logger|Outputs the name of the Action.|
-|[Message Store Interceptor](message-store-interceptor.html)|store|Store and retrieve action messages / errors / field errors for action that implements ValidationAware interface into session.|
+|[Alias Interceptor](alias-interceptor)|alias|Converts similar parameters that may be named differently between requests.|
+|[Annotation Parameter Filter Interceptor](annotation-parameter-filter-interceptor)|annotationParameterFilter|Annotation based version of [Parameter Filter Interceptor](parameter-filter-interceptor).|
+|[Annotation Workflow Interceptor](annotation-workflow-interceptor)|annotationWorkflow|Invokes any annotated methods on the action.|
+|[Chaining Interceptor](chaining-interceptor)|chain|Makes the previous Action's properties available to the current Action. Commonly used together with <result type="chain"> (in the previous Action).|
+|[Checckbox Interceptor](checkbox-interceptor)|checkbox|Adds automatic checkbox handling code that detect an unchecked checkbox and add it as a parameter with a default (usually 'false') value. Uses a specially named hidden field to detect unsubmitted checkboxes. The default unchecked value is overridable for non-boolean value'd checkboxes.|
+|[COEP Interceptor](coep-interceptor)|coep|Implements the Cross-Origin Embedder Policy on incoming requests used to protect a document from loading any non-same-origin resources which don't explicitly grant the document permission to be loaded.|
+|[Conversion Error Interceptor](conversion-error-interceptor)|conversionError|Adds conversion errors from the ActionContext to the Action's field errors|
+|[Cookie Interceptor](cookie-interceptor)|cookie|Inject cookie with a certain configurable name / value into action. (Since 2.0.7.)|
+|[Cookie Provider Interceptor](cookie-provider-interceptor)|cookieProvider|Transfer cookies from action to response (Since 2.3.15.)|
+|[COOP Interceptor](coop-interceptor)|coop|Implements the Cross-Origin Opener Policy on incoming requests used to isolate resources against side-channel attacks and information leaks.|
+|[Create Session Interceptor](create-session-interceptor)|createSession|Create an HttpSession automatically, useful with certain Interceptors that require a HttpSession to work properly (like the TokenInterceptor)|
+|[Clear Session Interceptor](clear-session-interceptor)|clearSession|This interceptor clears the HttpSession.|
+|[Debugging Interceptor](debugging-interceptor)|debugging|Provides several different debugging screens to provide insight into the data behind the page.|
+|[Default Workflow Interceptor](default-workflow-interceptor)|workflow|Calls the validate method in your Action class. If Action errors are created then it returns the INPUT view.|
+|[Exception Interceptor](exception-interceptor)|exception|Maps exceptions to a result.|
+|[Execute and Wait Interceptor](execute-and-wait-interceptor)|execAndWait|Executes the Action in the background and then sends the user off to an intermediate waiting page.|
+|[Fetch Metadata Interceptor](fetch-metadata-interceptor)|fetchMetadata|Implements the Resource Isolation Policies on incoming requests used to protect against CSRF, XSSI, and cross-origin information leaks.|
+|[File Upload Interceptor](file-upload-interceptor)|fileUpload|An Interceptor that adds easy access to file upload support.|
+|[I18n Interceptor](i18n-interceptor)|i18n|Remembers the locale selected for a user's session.|
+|[Logging Interceptor](logging-interceptor)|logger|Outputs the name of the Action.|
+|[Message Store Interceptor](message-store-interceptor)|store|Store and retrieve action messages / errors / field errors for action that implements ValidationAware interface into session.|
 |[Model Driven Interceptor](model-driven-interceptor.htm)|modelDriven|If the Action implements ModelDriven, pushes the getModel Result onto the Value Stack.|
-|[Multiselect Interceptor](multiselect-interceptor.html)|multiselect|Like the checkbox interceptor detects that no value was selected for a field with multiple values (like a select) and adds an empty parameter|
-|[NoOp Interceptor](no-op-interceptor.html)|noop|Does nothing, just passes invocation further, used in empty stack|
-|[Parameter Filter Interceptor](parameter-filter-interceptor.html)|parameterFilter|Removes parameters from the list of those available to Actions|
-|[Parameters Interceptor](parameters-interceptor.html)|params|Sets the request parameters onto the Action.|
-|[Parameter Remover Interceptor](parameter-remover-interceptor.html)|paramRemover|Removes a parameter from parameters map.|
-|[Prepare Interceptor](prepare-interceptor.html)|prepare|If the Action implements Preparable, calls its prepare method.|
-|[Roles Interceptor](roles-interceptor.html)|roles|Action will only be executed if the user has the correct JAAS role.|
-|[Scope Interceptor](scope-interceptor.html)|scope|Simple mechanism for storing Action state in the session or application scope.|
-|[Scoped Model Driven Interceptor](scoped-model-driven-interceptor.html)|scopedModelDriven|If the Action implements ScopedModelDriven, the interceptor retrieves and stores the model from a scope and sets it on the action calling setModel.|
-|[Servlet Config Interceptor](servlet-config-interceptor.html)|servletConfig|Provide access to Maps representing HttpServletRequest and HttpServletResponse.|
-|[Static Parameters Interceptor](static-parameters-interceptor.html)|staticParams|Sets the struts.xml defined parameters onto the action. These are the <param> tags that are direct children of the <action> tag.|
-|[Timer Interceptor](timer-interceptor.html)|timer|Outputs how long the Action takes to execute (including nested Interceptors and View)|
-|[Token Interceptor](token-interceptor.html)|token|Checks for valid token presence in Action, prevents duplicate form submission.|
-|[Token Session Interceptor](token-session-interceptor.html)|tokenSession|Same as Token Interceptor, but stores the submitted data in session when handed an invalid token|
-|[Validation Interceptor](validation-interceptor.html)|validation|Performs validation using the validators defined in _action_ -validation.xml|
+|[Multiselect Interceptor](multiselect-interceptor)|multiselect|Like the checkbox interceptor detects that no value was selected for a field with multiple values (like a select) and adds an empty parameter|
+|[NoOp Interceptor](no-op-interceptor)|noop|Does nothing, just passes invocation further, used in empty stack|
+|[Parameter Filter Interceptor](parameter-filter-interceptor)|parameterFilter|Removes parameters from the list of those available to Actions|
+|[Parameters Interceptor](parameters-interceptor)|params|Sets the request parameters onto the Action.|
+|[Parameter Remover Interceptor](parameter-remover-interceptor)|paramRemover|Removes a parameter from parameters map.|
+|[Prepare Interceptor](prepare-interceptor)|prepare|If the Action implements Preparable, calls its prepare method.|
+|[Roles Interceptor](roles-interceptor)|roles|Action will only be executed if the user has the correct JAAS role.|
+|[Scope Interceptor](scope-interceptor)|scope|Simple mechanism for storing Action state in the session or application scope.|
+|[Scoped Model Driven Interceptor](scoped-model-driven-interceptor)|scopedModelDriven|If the Action implements ScopedModelDriven, the interceptor retrieves and stores the model from a scope and sets it on the action calling setModel.|
+|[Servlet Config Interceptor](servlet-config-interceptor)|servletConfig|Provide access to Maps representing HttpServletRequest and HttpServletResponse.|
+|[Static Parameters Interceptor](static-parameters-interceptor)|staticParams|Sets the struts.xml defined parameters onto the action. These are the <param> tags that are direct children of the <action> tag.|
+|[Timer Interceptor](timer-interceptor)|timer|Outputs how long the Action takes to execute (including nested Interceptors and View)|
+|[Token Interceptor](token-interceptor)|token|Checks for valid token presence in Action, prevents duplicate form submission.|
+|[Token Session Interceptor](token-session-interceptor)|tokenSession|Same as Token Interceptor, but stores the submitted data in session when handed an invalid token|
+|[Validation Interceptor](validation-interceptor)|validation|Performs validation using the validators defined in _action_ -validation.xml|
 
 Since 2.0.7, Interceptors and Results with hyphenated names were converted to camelCase. (The former model-driven is 
 now modelDriven.) The original hyphenated names are retained as "aliases" until Struts 2.1.0. For clarity, 
@@ -304,7 +304,7 @@ public class MockLazyInterceptor extends AbstractInterceptor implements WithLazy
 ```
 
 Please be aware that order of interceptors can matter when want to access parameters passed via request as those 
-parameters are set by [Parameters Interceptor](parameters-interceptor.html).
+parameters are set by [Parameters Interceptor](parameters-interceptor).
 
 ## Order of Interceptor Execution
 
diff --git a/source/core-developers/localization.md b/source/core-developers/localization.md
index 769423b..86f4a76 100644
--- a/source/core-developers/localization.md
+++ b/source/core-developers/localization.md
@@ -14,8 +14,8 @@ title: Localization
 The framework supports internationalization (i18n) in the following places:
 
 1. the _UI Tags_
-2. Messages and Errors from the [ValidationAware](http://struts.apache.org/struts2-core/apidocs/index.html?com/opensymphony/xwork2/ValidationAware.html)
-3. Within action classes that extend [ActionSupport](http://struts.apache.org/struts2-core/apidocs/index.html?com/opensymphony/xwork2/ActionSupport.html) through the `getText()` method
+2. Messages and Errors from the [ValidationAware](http://struts.apache.org/struts2-core/apidocs/index.html?com/opensymphony/xwork2/ValidationAware)
+3. Within action classes that extend [ActionSupport](http://struts.apache.org/struts2-core/apidocs/index.html?com/opensymphony/xwork2/ActionSupport) through the `getText()` method
 
 ## Resource Bundle Search Order
 
@@ -117,7 +117,7 @@ The key attribute of most UI tags can be used to retrieve a message from a resou
 ## I18n Interceptor
 
 Essentially, the i18n Interceptor pushes a locale into the ActionContext map upon every request. The framework
-components that support localization all utilize the ActionContext locale. See [I18n Interceptor](i18n-interceptor.html) f
+components that support localization all utilize the ActionContext locale. See [I18n Interceptor](i18n-interceptor) f
 or details.
 
 ## Global Resources (struts.custom.i18n.resources) in struts.properties
@@ -126,7 +126,7 @@ A global resource bundle could be specified programmatically, as well as the loc
 
 ## Formatting Dates and Numbers
 
-See [Formatting Dates and Numbers](formatting-dates-and-numbers.html) for more details and examples.
+See [Formatting Dates and Numbers](formatting-dates-and-numbers) for more details and examples.
 
 ## Comparison with Struts 1
 
diff --git a/source/core-developers/logging.md b/source/core-developers/logging.md
index 326fe75..7317d96 100644
--- a/source/core-developers/logging.md
+++ b/source/core-developers/logging.md
@@ -105,7 +105,7 @@ public class JdkLogger implements Logger {
 }
 ```
 
-Check [the source code](http://struts.apache.org/struts-core/apidocs/com/opensymphony/xwork2/util/logging/package-summary.html)
+Check [the source code](http://struts.apache.org/struts-core/apidocs/com/opensymphony/xwork2/util/logging/package-summary)
 to see more details.
 
 ## Defining which factory to use
diff --git a/source/core-developers/model-driven.md b/source/core-developers/model-driven.md
index 7a97e4f..55e7937 100644
--- a/source/core-developers/model-driven.md
+++ b/source/core-developers/model-driven.md
@@ -7,11 +7,11 @@ title: Model Driven
 
 Struts 2 does not have "forms" like Struts 1 did\. In Struts 2 request parameters are bound directly to fields in the actions class, and this class is placed on top of the stack when the action is executed\.
 
-If an action class implements the interface `com.opensymphony.xwork2.ModelDriven` then it needs to return an object from the `getModel()` method\. Struts will then populate the fields of this object with the request parameters, and this object will be placed on top of the stack once the action is executed\. Validation will also be performed on this model object, instead of the action\. Please read about [VisitorFieldValidator Annotation](visitor-field-validator-annotation.html) which can [...]
+If an action class implements the interface `com.opensymphony.xwork2.ModelDriven` then it needs to return an object from the `getModel()` method\. Struts will then populate the fields of this object with the request parameters, and this object will be placed on top of the stack once the action is executed\. Validation will also be performed on this model object, instead of the action\. Please read about [VisitorFieldValidator Annotation](visitor-field-validator-annotation) which can help [...]
 
 ## Interceptor
 
-To use `ModelDriven` actions, make sure that the [Model Driven Interceptor](model-driven-interceptor.html) is applied to your action\. This interceptor is part of the default interceptor stack `defaultStack` so it is applied to all actions by default\.
+To use `ModelDriven` actions, make sure that the [Model Driven Interceptor](model-driven-interceptor) is applied to your action\. This interceptor is part of the default interceptor stack `defaultStack` so it is applied to all actions by default\.
 
 ## Example
 
diff --git a/source/core-developers/nutshell.md b/source/core-developers/nutshell.md
index a70022a..737a743 100644
--- a/source/core-developers/nutshell.md
+++ b/source/core-developers/nutshell.md
@@ -7,7 +7,7 @@ title: Nutshell
 
 The framework documentation is written for active web developers and assumes a working knowledge about how 
 Java web applications are built. For more about the underlying nuts and bolts, see 
-the [Key Technologies Primer](../primer.html).
+the [Key Technologies Primer](../primer).
 
 ## Apache Struts 2 Architecture in a Nutshell
 
@@ -128,7 +128,7 @@ then you might consider a "Model 1" solution that uses only server pages.
 
 But, if you are writing a more complicated application, with dozens of pages, that need to be maintained over time, 
 then Struts can help. For more about whether Model 1 or MVC/Model 2 is right for you, 
-see [Understanding JavaServer Pages Model 2 architecture](http://www.javaworld.com/javaworld/jw-12-1999/jw-12-ssj-jspmvc.html). 
+see [Understanding JavaServer Pages Model 2 architecture](http://www.javaworld.com/javaworld/jw-12-1999/jw-12-ssj-jspmvc). 
 
 ## Platform Requirements
 
@@ -138,4 +138,4 @@ Struts 2 requires
 - JSP API 2.0
 - Java 7
 
-For a full list of requirements, including dependencies used by optional plugins, see [Project Dependencies](../maven/dependencies.html).
+For a full list of requirements, including dependencies used by optional plugins, see [Project Dependencies](../maven/dependencies).
diff --git a/source/core-developers/object-factory.md b/source/core-developers/object-factory.md
index 9aefb3e..84c0961 100644
--- a/source/core-developers/object-factory.md
+++ b/source/core-developers/object-factory.md
@@ -36,13 +36,13 @@ public class MyObjectFactory extends ObjectFactory {
 
 ### Define dedicated factory
 
-If you want to just extend one part of ObjectFactory, ie\. to change how [Result Types](result-types.html) are build, you can implement `ResultFactory` interface and register it with dedicated name, see _Extension Points_  for more details\. Original ObjectFactory will use these dedicated factories to do the work\. It's already done this way \- the original functionality of ObjectFactory was extracted to separated classes which implements the interfaces below\. Check the source of Object [...]
+If you want to just extend one part of ObjectFactory, ie\. to change how [Result Types](result-types) are build, you can implement `ResultFactory` interface and register it with dedicated name, see _Extension Points_  for more details\. Original ObjectFactory will use these dedicated factories to do the work\. It's already done this way \- the original functionality of ObjectFactory was extracted to separated classes which implements the interfaces below\. Check the source of ObjectFacto [...]
 
 List of Factory interfaces:
 
-+ `ResultFactory` \- dedicated interfaces used by  to create [Result Types](result-types.html)
++ `ResultFactory` \- dedicated interfaces used by  to create [Result Types](result-types)
 
-  + `StrutsResultFactory` it's internal implementation which checks if Result implements `ParamNameAwareResult` interface to restrict names of parameters set on the instance of Result, see [Result Types](result-types.html) for more info\.
+  + `StrutsResultFactory` it's internal implementation which checks if Result implements `ParamNameAwareResult` interface to restrict names of parameters set on the instance of Result, see [Result Types](result-types) for more info\.
 
 + `ActionFactory` \- dedicated interface used by  to actions
 
@@ -52,4 +52,4 @@ List of Factory interfaces:
 
 + `ConverterFactory` \- dedicated interface used by  to create instances of _TypeConverter_ 
 
-+ `UnknownHandlerFactory` \- dedicated interfaces used by  to create instances of [Unknown Handlers](unknown-handlers.html) (as from version 2\.3\.18)
++ `UnknownHandlerFactory` \- dedicated interfaces used by  to create instances of [Unknown Handlers](unknown-handlers) (as from version 2\.3\.18)
diff --git a/source/core-developers/package-configuration.md b/source/core-developers/package-configuration.md
index 8d4719a..611664f 100644
--- a/source/core-developers/package-configuration.md
+++ b/source/core-developers/package-configuration.md
@@ -24,7 +24,7 @@ The optional `abstract` attribute creates a base package that can omit the actio
 |-----------|----------|-------------|
 | name |**yes**| key to for other packages to reference |
 | extends | no | inherits package behavior of the package it extends |
-| namespace | no | see [Namespace Configuration](namespace-configuration.html)|
+| namespace | no | see [Namespace Configuration](namespace-configuration)|
 | abstract | no | declares package to be abstract (no action configurations required in package) |
 
 ### Simple usage
diff --git a/source/core-developers/parameters-interceptor.md b/source/core-developers/parameters-interceptor.md
index 24995cd..0aa7cee 100644
--- a/source/core-developers/parameters-interceptor.md
+++ b/source/core-developers/parameters-interceptor.md
@@ -26,7 +26,7 @@ order is to enable a "factory" pattern. For example, let's assume that one has a
 property is set before any model properties are set, it's possible to choose model implementation during 
 `action.setModelClass()` call. Similarly it's possible to use `action.setPrimaryKey()` property set call to actually 
 load the model class from persistent storage. Without any assumption on parameter order you have to use patterns 
-like [Preparable Interface](prepare-interceptor.html).
+like [Preparable Interface](prepare-interceptor).
 
 Because parameter names are effectively OGNL statements, it is important that security be taken in to account. This 
 interceptor will not apply any values in the parameters map if the expression contains an assignment (=), multiple 
@@ -51,7 +51,7 @@ If you are looking for detailed logging information about your parameters, turn
 interceptor. A detailed log of all the parameter keys and values will be reported.
 
 Since XWork 2.0.2, this interceptor extends `MethodFilterInterceptor`, therefore being able to deal with 
-excludeMethods/includeMethods parameters. See [Default Workflow Interceptor](default-workflow-interceptor.html) 
+excludeMethods/includeMethods parameters. See [Default Workflow Interceptor](default-workflow-interceptor) 
 for documentation and examples on how to use this feature.
 
 For more information on ways to restrict the parameter names allowed, see the `ParameterNameAware` javadocs.
diff --git a/source/core-developers/performance-tuning.md b/source/core-developers/performance-tuning.md
index 84016c0..46165ee 100644
--- a/source/core-developers/performance-tuning.md
+++ b/source/core-developers/performance-tuning.md
@@ -15,7 +15,7 @@ The following are some tips and tricks to squeeze the most performance out of St
 
 ## Turn off logging and devMode
 
-The [devMode](development-mode.html) allows reloading of configuration and validation related files, but because they 
+The [devMode](development-mode) allows reloading of configuration and validation related files, but because they 
 happen on each request, this setting will totally kill your performance.
 When using logging, make sure to turn off logging (esp. Freemarker generates a LOT of logging), and check if a level is 
 enabled before printing it, or you will get the cost of the String parsing/concatenation anyways.
diff --git a/source/core-developers/prepare-interceptor.md b/source/core-developers/prepare-interceptor.md
index 8bb6b34..c2e97c9 100644
--- a/source/core-developers/prepare-interceptor.md
+++ b/source/core-developers/prepare-interceptor.md
@@ -18,7 +18,7 @@ the `id` property and then when the second params interceptor is called the para
 on the actual object loaded from the database. See the example for more info.
 
 > Note: Since XWork 2.0.2, this interceptor extends `MethodFilterInterceptor`, therefore being able to deal with 
-> `excludeMethods` / `includeMethods` parameters. See [Workflow Interceptor](default-workflow-interceptor.html)
+> `excludeMethods` / `includeMethods` parameters. See [Workflow Interceptor](default-workflow-interceptor)
 > for documentation and examples on how to use this feature.
  
 > Update: Added logic to execute a `prepare<MethodName>` and conditionally the a general `prepare()` Method, depending 
diff --git a/source/core-developers/redirect-action-result.md b/source/core-developers/redirect-action-result.md
index e766abe..de9e27c 100644
--- a/source/core-developers/redirect-action-result.md
+++ b/source/core-developers/redirect-action-result.md
@@ -16,7 +16,7 @@ are redirecting to another action, you use this result rather than the standard
 
 See examples below for an example of how request parameters could be passed in.
 
-See [ActionMapper](action-mapper.html) for more details
+See [ActionMapper](action-mapper) for more details
 
 ## Parameters
 
diff --git a/source/core-developers/result-configuration.md b/source/core-developers/result-configuration.md
index f06e26a..b0360ab 100644
--- a/source/core-developers/result-configuration.md
+++ b/source/core-developers/result-configuration.md
@@ -33,7 +33,7 @@ Of course, applications can define other result tokens to match specific cases.
 
 The result element has two jobs. First, it provides a logical name. An `Action` can pass back a token like `success` 
 or `error` without knowing any other implementation details. Second, the result element provides a result type. Most 
-results simply forward to a server page or template, but other [Result Types](result-types.html) can be used to do more 
+results simply forward to a server page or template, but other [Result Types](result-types) can be used to do more 
 interesting things.
 
 __Intelligent Defaults__
@@ -143,7 +143,7 @@ look for a local result nested in the action. If a local match is not found, the
 </global-results>
 ```
 
-> For more about results, see [Result Types](result-types.html).
+> For more about results, see [Result Types](result-types).
 
 ## Dynamic Results
 
@@ -178,7 +178,7 @@ If a `FragmentAction` method returns `next` the actual _value_ of that result wi
 `nextAction` property. So `nextAction` may be computed based on whatever state information necessary then passed 
 at runtime to `next`'s `redirectAction`.
 
-See [Parameters in configuration results](../faq/parameters-in-configuration-results.html) for an expanded discussion. 
+See [Parameters in configuration results](../faq/parameters-in-configuration-results) for an expanded discussion. 
 
 ## Returning Result Objects
 
diff --git a/source/core-developers/result-types.md b/source/core-developers/result-types.md
index 36a5dc0..c85a6d0 100644
--- a/source/core-developers/result-types.md
+++ b/source/core-developers/result-types.md
@@ -14,25 +14,25 @@ manages the view.
 The framework provides several implementations of the `com.opensymphony.xwork2.Result` interface, ready to use in your 
 own applications.
 
-|[Chain Result](chain-result.html)|Used for [Action Chaining](action-chaining.html)|
-|[Dispatcher Result](dispatcher-result.html)|Used for web resource integration, including _JSP_  integration|
-|[FreeMarker Result](freemarker-result.html)|Used for _FreeMarker_  integration|
-|[HttpHeader Result](httpheader-result.html)|Used to control special HTTP behaviors|
-|[Redirect Result](redirect-result.html)|Used to redirect to another URL (web resource)|
-|[Redirect Action Result](redirect-action-result.html)|Used to redirect to another action mapping|
-|[Stream Result](stream-result.html)|Used to stream an InputStream back to the browser (usually for file downloads)|
-|[Velocity Result](velocity-result.html)|Used for _Velocity_  integration|
-|[XSL Result](xsl-result.html)|Used for XML/XSLT integration|
+|[Chain Result](chain-result)|Used for [Action Chaining](action-chaining)|
+|[Dispatcher Result](dispatcher-result)|Used for web resource integration, including _JSP_  integration|
+|[FreeMarker Result](freemarker-result)|Used for _FreeMarker_  integration|
+|[HttpHeader Result](httpheader-result)|Used to control special HTTP behaviors|
+|[Redirect Result](redirect-result)|Used to redirect to another URL (web resource)|
+|[Redirect Action Result](redirect-action-result)|Used to redirect to another action mapping|
+|[Stream Result](stream-result)|Used to stream an InputStream back to the browser (usually for file downloads)|
+|[Velocity Result](velocity-result)|Used for _Velocity_  integration|
+|[XSL Result](xsl-result)|Used for XML/XSLT integration|
 |[Plain Result](plain-result)|A plain result which all you to write directly to a HttpResponse using a simplified API (since Struts 2.6)|
-|[PlainText Result](plaintext-result.html)|Used to display the raw content of a particular file/page (i.e jsp, HTML)|
+|[PlainText Result](plaintext-result)|Used to display the raw content of a particular file/page (i.e jsp, HTML)|
 |[Tiles Result](../plugins/tiles/)|Used to provide Tiles integration|
 |[Tiles 3 Result](../plugins/tiles-3/)|Used to provide Tiles 3 integration|
-|[Postback Result](postback-result.html)|Used to postback request parameters as a form to the specified destination|
+|[Postback Result](postback-result)|Used to postback request parameters as a form to the specified destination|
 |[JSON Result](../plugins/json/) |Used to serialize actions into JSON|
 
 ## Optional
 
-|[JasperReports Plugin](../plugins/jasperreports/)|Used for [JasperReports Tutorial](../getting-started/jasper-reports-tutorial.html) integration|Optional, third-party plugin|
+|[JasperReports Plugin](../plugins/jasperreports/)|Used for [JasperReports Tutorial](../getting-started/jasper-reports-tutorial) integration|Optional, third-party plugin|
 
 Additional Result Types can be created and plugged into an application by implementing the `com.opensymphony.xwork2.Result`
 interface. Custom Result Types might include generating an email or JMS message, generating images, and so forth.
@@ -61,13 +61,13 @@ to set the same parameter as a specifically-named parameter.
 
 ## Registering Result Types
 
-All Result Types are plugged in via the [Result Configuration](result-configuration.html).
+All Result Types are plugged in via the [Result Configuration](result-configuration).
 
 ## Extending
 
 You can always extend defined result types and implement whatever logic you need. To simplify process of that, you can 
 define your custom `ResultFactory` and use it with connection with custom interface which your Result implements. 
-Check [Define dedicated factory](object-factory.html) to see how to do it.
+Check [Define dedicated factory](object-factory) to see how to do it.
 
 Struts 2 provides one such extension for you: 
 
diff --git a/source/core-developers/static-content.md b/source/core-developers/static-content.md
index 650bda0..b36cfa5 100644
--- a/source/core-developers/static-content.md
+++ b/source/core-developers/static-content.md
@@ -65,4 +65,4 @@ These regular expression will be evaluated against the request's URI (`HttpServl
 of them matches, then Struts will not handle the request.
 
 To evaluate each pattern Pattern class from JDK will be used, you can find more about what kind of pattern you can use 
-in the [Pattern class JavaDoc](http://docs.oracle.com/javase/1.5.0/docs/api/java/util/regex/Pattern.html).
+in the [Pattern class JavaDoc](http://docs.oracle.com/javase/1.5.0/docs/api/java/util/regex/Pattern).
diff --git a/source/core-developers/stream-result.md b/source/core-developers/stream-result.md
index 424c1fd..303137a 100644
--- a/source/core-developers/stream-result.md
+++ b/source/core-developers/stream-result.md
@@ -10,7 +10,7 @@ parent:
 
 A custom Result type for sending raw data (via an InputStream) directly to the HttpServletResponse. Very useful for 
 allowing users to download content. If you are running your app server under HTTPS and having issues with PDF's or other 
-file streams you should take a look at [HTTPS and IE Issues](https-and-ie-issues.html)
+file streams you should take a look at [HTTPS and IE Issues](https-and-ie-issues)
 
 ## Parameters
 
diff --git a/source/core-developers/struts-default-xml.md b/source/core-developers/struts-default-xml.md
index 22ab774..dce6ccf 100644
--- a/source/core-developers/struts-default-xml.md
+++ b/source/core-developers/struts-default-xml.md
@@ -10,7 +10,7 @@ automatically included into `struts.xml` file to provide the standard configurat
 to copy them.
 
 > To exclude the `struts-default.xml` or to provide your own version, see the `struts.configuration.files`
-> setting in [struts.properties](struts-properties.html).
+> setting in [default.properties](default-properties).
 
 The content of `struts-default.xml` is here:
 
diff --git a/source/core-developers/token-session-interceptor.md b/source/core-developers/token-session-interceptor.md
index 0f7c06d..f514dc6 100644
--- a/source/core-developers/token-session-interceptor.md
+++ b/source/core-developers/token-session-interceptor.md
@@ -8,7 +8,7 @@ parent:
 
 # Token Session Interceptor
 
-This interceptor builds off of the [Token Interceptor](token-interceptor.html), providing advanced logic for handling 
+This interceptor builds off of the [Token Interceptor](token-interceptor), providing advanced logic for handling 
 invalid tokens. Unlike the normal token interceptor, this interceptor will attempt to provide intelligent fail-over 
 in the event of multiple requests using the same session. That is, it will block subsequent requests until the first 
 request is complete, and then instead of returning the <i>invalid.token</i> code, it will attempt to display the same 
diff --git a/source/core-developers/type-conversion.md b/source/core-developers/type-conversion.md
index f7ba87f..ea4b938 100644
--- a/source/core-developers/type-conversion.md
+++ b/source/core-developers/type-conversion.md
@@ -10,7 +10,7 @@ title: Type Conversion
 {:toc}
 
 Routine type conversion in the framework is transparent. Generally, all you need to do is ensure that HTML inputs have 
-names that can be used in [OGNL](ognl.html) expressions. (HTML inputs are form elements and other GET/POST parameters.)
+names that can be used in [OGNL](../tag-developers/ognl) expressions. (HTML inputs are form elements and other GET/POST parameters.)
 
 ## Built in Type Conversion Support
 
@@ -46,7 +46,7 @@ Here are some tips for leveraging the framework's type conversion capabilities:
   constructor can be used to create target objects before type conversion.
 - For lists and maps, use index notation, such as `people[0].name`  or `friends['patrick'].name`. Often these HTML form 
   elements are being rendered inside a loop. For [JSP Tags](../tags-guide/), use the iterator tag's status attribute. 
-  For [FreeMarker Tags](freemarker-support.html), use the special property `${foo_index}[]`.
+  For [FreeMarker Tags](freemarker-support), use the special property `${foo_index}[]`.
 - For multiple select boxes, it isn't possible to use index notation to name each individual item. Instead, name your 
   element `people.name` and the framework will understand that it should create a new Person object for each selected 
   item and set its name accordingly.
@@ -86,7 +86,7 @@ point = com.acme.PointConverter
 person.phoneNumber = com.acme.PhoneNumberConverter
 ```
 
-Type conversion can also be specified via [Annotations](annotations.html) within the action.
+Type conversion can also be specified via [Annotations](annotations) within the action.
 
 ## Applying a Type Converter to a bean or model
 
@@ -218,7 +218,7 @@ From WebWork 2.1.x, the `Collection_xxx` format is still supported and honored,
 removed eventually.
 
 Additionally, you can create your own custom `ObjectTypeDeterminer` by implementing the `ObjectTypeDeterminer` interface. 
-There is also an optional `ObjectTypeDeterminer` that utilizes Java 5 generics. See the [Annotations](annotations.html) 
+There is also an optional `ObjectTypeDeterminer` that utilizes Java 5 generics. See the [Annotations](annotations) 
 page for more information.
 
 ### Indexing a collection by a property of that collection
@@ -405,10 +405,10 @@ can be reported accordingly.
 
 There are two ways the error reporting can occur:
 
-1. Globally, using the [Conversion Error Interceptor](conversion-error-interceptor.html)
-2. On a per-field basis, using the [conversion validator](conversion-validator.html)
+1. Globally, using the [Conversion Error Interceptor](conversion-error-interceptor)
+2. On a per-field basis, using the [conversion validator](conversion-validator)
 
-By default, the conversion interceptor is included in [struts-default.xml](struts-default-xml.html) in the default stack. 
+By default, the conversion interceptor is included in [struts-default.xml](struts-default-xml) in the default stack. 
 To keep conversion errors from reporting globally, change the interceptor stack, and add additional validation rules.
 
 ## Common Problems
diff --git a/source/core-developers/validation.md b/source/core-developers/validation.md
index 4d98dfd..7e18143 100644
--- a/source/core-developers/validation.md
+++ b/source/core-developers/validation.md
@@ -517,4 +517,4 @@ If you want to write custom validator use on of these classes as a starting poin
 
 ## Resources
 
-[WebWork Validation](http://today.java.net/pub/a/today/2006/01/19/webwork-validation.html)
+[WebWork Validation](http://today.java.net/pub/a/today/2006/01/19/webwork-validation)
diff --git a/source/core-developers/velocity-properties.md b/source/core-developers/velocity-properties.md
index 3ef4d7b..223fd60 100644
--- a/source/core-developers/velocity-properties.md
+++ b/source/core-developers/velocity-properties.md
@@ -14,4 +14,4 @@ If a `velocity.properties` is provided on the classpath (e.g., `/WEB-INF/classes
 velocimacro.library = action-default.vm, tigris-macros.vm, myapp.vm
 ```
 
-> See [struts-default.vm](struts-default-vm.html) and the [Velocity](velocity.html) documentation for more information.
+> See [struts-default.vm](struts-default-vm) and the [Velocity](velocity) documentation for more information.
diff --git a/source/core-developers/web-xml.md b/source/core-developers/web-xml.md
index bb2d69c..b94ec1b 100644
--- a/source/core-developers/web-xml.md
+++ b/source/core-developers/web-xml.md
@@ -72,7 +72,7 @@ versions, you need to use
     ...
 ```
 
-See [SiteMesh Plugin](../plugins/sitemesh-plugin.html) for an example on when to use seperate Filters for prepare 
+See [SiteMesh Plugin](../plugins/sitemesh-plugin) for an example on when to use seperate Filters for prepare 
 and execution phase
 
 ## Exclude specific URLs
@@ -164,4 +164,4 @@ It is possible to use your custom `ConfigurationProvider` to programmatically c
 </filter>
 ```
 
-See [Configuration Provider & Configuration](configuration-provider-and-configuration.html) for more details.
+See [Configuration Provider & Configuration](configuration-provider-and-configuration) for more details.
diff --git a/source/core-developers/weblogic.md b/source/core-developers/weblogic.md
index 6559da6..fba1d23 100644
--- a/source/core-developers/weblogic.md
+++ b/source/core-developers/weblogic.md
@@ -6,39 +6,30 @@ title: WebLogic
 # WebLogic
 
 
-When deploying to WebLogic, some developers report problems with the framework locating resources, especially with Velocity\. For more about WebLogic and Velocity, see the [Velocity website](http://wiki\.apache\.org/jakarta\-velocity/VelocityAndWeblogic)^[http://wiki\.apache\.org/jakarta\-velocity/VelocityAndWeblogic]\.
+When deploying to WebLogic, some developers report problems with the framework locating resources, especially with Velocity. 
+For more about WebLogic and Velocity, see the [Velocity website](http://wiki.apache.org/jakarta-velocity/VelocityAndWeblogic).
 
-| 
 
-To deploy to WebLogic, the common approach is to create and deploy an unexpanded WAR to the WebLogic deployment directory\. With WL 8\.x, the deployment directory is typically at \<bea\_home\>/user\_projects/domains/mydomain/\.
+To deploy to WebLogic, the common approach is to create and deploy an unexpanded WAR to the WebLogic deployment directory. 
+With WL 8.x, the deployment directory is typically at `<bea_home>/user_projects/domains/mydomain/`.
 
-> 
+## Adding a struts-velocity.properties Configuration File
 
-## Adding an struts\-velocity\.properties Configuration File
+In the `struts.properties` file (usually kept in the `WEB-INF/classes` directory), add an entry that specifies 
+a Velocity configuration file.
 
-+ In the `struts.properties` file (usually kept in the `WEB-INF/classes` directory), add an entry that specifies a Velocity configuation file\.
-	
-
-  + 
-
-**struts\.properties**
-
-
-~~~~~~~
+**struts.properties**
 
+```
 struts.velocity.configfile = struts-velocity.properties
+```
 
-~~~~~~~
-
-+ Create the corresponding Velocity properties file ("struts\-velocity\.properties"), preferably in the same location as the `struts.properties` file\.
-
-+ Copy into the Velocity properties file the contents of the `velocity.properties` file that is the the SAF `velocity-dep.jar`\.
-
-+ In your new `struts-velocity.properties` file, find he section titled  `T E M P L A T E  L O A D E R S`, and change this section as so:
-
+- Create the corresponding Velocity properties file ("struts-velocity.properties"), preferably in the same location 
+  as the `struts.properties` file.
+- Copy into the Velocity properties file the contents of the `velocity.properties` file that is the the SAF `velocity-dep.jar`.
+- In your new `struts-velocity.properties` file, find he section titled  `T E M P L A T E  L O A D E R S`, and change this section as so:
 
-
-~~~~~~~
+```
 
 ===========================================
 resource.loader = class
@@ -53,34 +44,30 @@ class.resource.loader.class = org.apache.velocity.runtime.resource.loader.Classp
 class.resource.loader.cache = true
 ===========================================
 
-~~~~~~~
+```
 
-+ Redeploy a fresh WAR to WebLogic\.
+- Redeploy a fresh WAR to WebLogic.
 
 ## NPE when using Struts 2 Jasper Reports plugin
 
-When using mentioned plugin in Weblogic 11g you can get NullPointerException within Struts 2\. To solve the problem you must enable the "Archived Real Path" global property in Weblogic admin console \> configuration \> Web Applications\. It's because JasperReportsResult determines the report directory base on servletContext\.getRealPath(finalLocation)\.
+When using mentioned plugin in Weblogic 11g you can get NullPointerException within Struts 2. To solve the problem you 
+must enable the "Archived Real Path" global property in Weblogic admin console > configuration > Web Applications. 
+It's because JasperReportsResult determines the report directory base on servletContext.getRealPath(finalLocation).
 
 ## Convention based application doesn't work
 
 When you deployed an application that base on the Convention Plugin and you get an error messages that says:
 
-
-~~~~~~~
-
+```
 There is no Action mapped for namespace / and action name xxxxxx
+```
 
-~~~~~~~
-
-create struts\.properties file in WEB\-INF/classes folder (in the expanded application's folder or in the source code) with below statements:
-
-
-~~~~~~~
+create struts.properties file in WEB-INF/classes folder (in the expanded application's folder or in the source code) with below statements:
 
+```
 #struts convention property modifications for Weblogic
 struts.convention.action.includeJars=.*?/yourwebapp.*?jar(!/)?
 struts.convention.action.fileProtocols=jar,zip
+```
 
-~~~~~~~
-
-Thanks to Amit who the first published solution on his [blog](http://tech\-architecture\.blogspot\.com/2009/02/getting\-struts\-21\-to\-work\-in\-weblogic\.html)^[http://tech\-architecture\.blogspot\.com/2009/02/getting\-struts\-21\-to\-work\-in\-weblogic\.html]
+Thanks to Amit who the first published solution on his [blog](http://tech-architecture.blogspot.com/2009/02/getting-struts-21-to-work-in-weblogic\).
diff --git a/source/core-developers/wildcard-mappings.md b/source/core-developers/wildcard-mappings.md
index a34c058..c697fcb 100644
--- a/source/core-developers/wildcard-mappings.md
+++ b/source/core-developers/wildcard-mappings.md
@@ -78,7 +78,7 @@ Also, the action mapping and action result properties will accept wildcard-match
 </action>
 ```
 
-> See also [Wildcard Method](../getting-started/wildcard-method-selection.html)
+> See also [Wildcard Method](../getting-started/wildcard-method-selection)
 
 ## Parameters in namespaces
 
diff --git a/source/core-developers/writing-interceptors.md b/source/core-developers/writing-interceptors.md
index e96843e..01f15ea 100644
--- a/source/core-developers/writing-interceptors.md
+++ b/source/core-developers/writing-interceptors.md
@@ -5,7 +5,7 @@ title: Writing Interceptors
 
 # Writing Interceptors
 
-See the [Interceptors](interceptors.html) page for an overview of how interceptors work.
+See the [Interceptors](interceptors) page for an overview of how interceptors work.
 
 ## Interceptor interface
 
diff --git a/source/dev-mail.md b/source/dev-mail.md
index 68be6c6..fcfc1ef 100644
--- a/source/dev-mail.md
+++ b/source/dev-mail.md
@@ -7,9 +7,9 @@ title: Dev Mailing List
 
 The following mailing lists are meant for people who want to contribute to Struts itself. Patches, Documentation
 improvements and discussion on future Struts are welcome. **For questions on using Struts, please subscribe to the
-[user list](mail.html)**.
+[user list](mail)**.
 
-Please make sure you have read the guidelines on [this page](mail.html)
+Please make sure you have read the guidelines on [this page](mail)
 
 <table>
     <tr>
diff --git a/source/getting-started/annotations.md b/source/getting-started/annotations.md
index fa74e75..e410851 100644
--- a/source/getting-started/annotations.md
+++ b/source/getting-started/annotations.md
@@ -22,9 +22,9 @@ to the browser (`register.jsp`). Struts 2 provides an alternative to using XML t
 standard naming conventions and annotations for your action names, `ActionSupport` classes, and results.
 
 This tutorial assumes you understand how to apply annotations to Java classes and methods. If you're not familiar with 
-annotations, consult the [Java online tutorial](http://download.oracle.com/javase/tutorial/java/javaOO/annotations.html).
+annotations, consult the [Java online tutorial](http://download.oracle.com/javase/tutorial/java/javaOO/annotations).
 
-The [Struts 2 user mailing list](http://struts.apache.org/mail.html) is an excellent place to get help. If you are having 
+The [Struts 2 user mailing list](http://struts.apache.org/mail) is an excellent place to get help. If you are having 
 a problem getting the tutorial example applications to work search the Struts 2 mailing list. If you don't find an answer 
 to your problem, post a question on the mailing list.
 
@@ -69,7 +69,7 @@ in this location). If the execute method returns "input" or "error" then the vie
 
 ## Struts 2 Configuration Plugin
 
-In a [previous tutorial](debugging-struts.html) we reviewed how to use the Struts 2 Configuration plugin to view the details 
+In a [previous tutorial](debugging-struts) we reviewed how to use the Struts 2 Configuration plugin to view the details 
 of how Struts 2 has configured your application. When using the Convention plugin, it's very handy to also use 
 the Configuration plugin during development. On the example application's home page is a link to the application's configuration. 
 Click on that link and then the hello link on the left menu (under Actions in default). You'll see the configuration 
@@ -139,4 +139,4 @@ an XML file to configure your Struts 2 application. The Struts 2 Convention plug
 to the same method, map results to different view pages, map errors to view pages, and much more. Be sure to read through 
 the [Convention Plugin](../plugins/convention/) documentation for alternative ways to configure your Struts 2 application.
 
-|Return to [Spring and Struts 2](spring.html)|or|onward to [Introducing Interceptors](introducing-interceptors.html)|
+|Return to [Spring and Struts 2](spring)|or|onward to [Introducing Interceptors](introducing-interceptors)|
diff --git a/source/getting-started/coding-actions.md b/source/getting-started/coding-actions.md
index b10616f..d6355d0 100644
--- a/source/getting-started/coding-actions.md
+++ b/source/getting-started/coding-actions.md
@@ -12,7 +12,7 @@ parent:
 * Will be replaced with the ToC, excluding a header
 {:toc}
 
-This tutorial assumes you've completed the [Using Struts 2 Tags](using-tags.html) tutorial and have a working **using-tags** 
+This tutorial assumes you've completed the [Using Struts 2 Tags](using-tags) tutorial and have a working **using-tags** 
 project. The example code for this tutorial, **coding-actions**, is available for checkout from the Struts 2 GitHub repository 
 [struts-examples](https://github.com/apache/struts-examples).
 
@@ -24,7 +24,8 @@ Coding a Struts 2 Action involves several parts:
 2. Mapping a result to a view
 3. Writing the controller logic in the Action class
 
-In the previous tutorials we covered how to configure Struts to map a URL such as `hello.action` to an Action class such as `HelloWorldAction` (specifically the execute method).
+In the previous tutorials we covered how to configure Struts to map a URL such as `hello.action` to an Action class 
+such as `HelloWorldAction` (specifically the execute method).
 
 **Action Mapping**
 
@@ -34,17 +35,23 @@ In the previous tutorials we covered how to configure Struts to map a URL such a
 </action>
 ```
 
-The Action mapping above also specified that if the `execute` method of class `HelloWorldAction` returns `success` then the view `HelloWorld.jsp` will be returned to the browser.
+The Action mapping above also specified that if the `execute` method of class `HelloWorldAction` returns `success` 
+then the view `HelloWorld.jsp` will be returned to the browser.
 
 This tutorial will introduce you to the basics of writing the controller logic in the Action class.
 
 ## Struts 2 Action Classes
 
-Action classes act as the controller in the MVC pattern. Action classes respond to a user action, execute business logic (or call upon other classes to do that), and then return a result that tells Struts what view to render.
+Action classes act as the controller in the MVC pattern. Action classes respond to a user action, execute business 
+logic (or call upon other classes to do that), and then return a result that tells Struts what view to render.
 
-Struts 2 Action classes usually extend the `ActionSupport` class, which is provided by the Struts 2 framework. Class `ActionSupport` provides default implementations for the most common actions (e.g. execute, input) and also implements several useful Struts 2 interfaces. When your Action class extends class `ActionSupport` your class can either override the default implementations or inherit them.
+Struts 2 Action classes usually extend the `ActionSupport` class, which is provided by the Struts 2 framework. 
+Class `ActionSupport` provides default implementations for the most common actions (e.g. execute, input) and also 
+implements several useful Struts 2 interfaces. When your Action class extends class `ActionSupport` your class can either 
+override the default implementations or inherit them.
 
-If you examine class HelloWorldAction from tutorial [Using Struts 2 Tags](using-tags.html) you'll see that it extends the class `ActionSupport` and then overrides method `execute`.
+If you examine class HelloWorldAction from tutorial [Using Struts 2 Tags](using-tags) you'll see that it extends 
+the class `ActionSupport` and then overrides method `execute`.
 
 The method `execute` is where we placed what we want this controller to do in response to the `hello.action`.
 
@@ -59,13 +66,16 @@ public String execute() throws Exception {
     return SUCCESS;
 }
 ```
-> Note that method execute declares it throws an Exception. We'll cover in a later tutorial how to configure Struts to handle any Exceptions thrown from the Action classes methods.
+> Note that method execute declares it throws an Exception. We'll cover in a later tutorial how to configure Struts 
+> to handle any Exceptions thrown from the Action classes methods.
 
 ## Processing Form Input In The Action Class
 
-One of the most common responsibilities of the Action class is to process user input on a form and then make the result of the processing available to the view page. To illustrate this responsibility, let's say that on our view page, `HelloWorld.jsp`, we want to display a personal hello, such as "Hello Struts User Bruce."
+One of the most common responsibilities of the Action class is to process user input on a form and then make 
+the result of the processing available to the view page. To illustrate this responsibility, let's say that 
+on our view page, `HelloWorld.jsp`, we want to display a personal hello, such as "Hello Struts User Bruce."
 
-In the [Using Struts 2 Tags](using-tags.html) example application we added a Struts 2 form to `index.jsp`.
+In the [Using Struts 2 Tags](using-tags) example application we added a Struts 2 form to `index.jsp`.
 
 **Struts 2 Form Tags**
 
@@ -76,9 +86,13 @@ In the [Using Struts 2 Tags](using-tags.html) example application we added a Str
 </s:form>
 ```
 
-Make a note of the value of the name attribute for the Struts 2 textfield tag, which is userName. When the user clicks on the submit button for the above form, the action hello will be executed (`hello.action`). The form field values will be posted to the Struts 2 Action class (`HelloWorldAction`). The Action class may automatically receive those form field values provided it has a public set method that matches the form field name value.
+Make a note of the value of the name attribute for the Struts 2 textfield tag, which is userName. When the user 
+clicks on the submit button for the above form, the action hello will be executed (`hello.action`). The form field 
+values will be posted to the Struts 2 Action class (`HelloWorldAction`). The Action class may automatically receive 
+those form field values provided it has a public set method that matches the form field name value.
 
-So for the HelloWorldAction class to automatically receive the userName value it must have a public method setUserName (note the JavaBean convention discussed in tutorial [Hello World](hello-world-using-struts2.html)).
+So for the HelloWorldAction class to automatically receive the userName value it must have a public method setUserName 
+(note the JavaBean convention discussed in tutorial [Hello World](hello-world-using-struts2)).
 
 For the example application associated with this tutorial, add the following Java code to class `HelloWorldAction`.
 
@@ -96,7 +110,9 @@ public void setUserName(String userName) {
 }
 ```
 
-To personalize the MessageStore message (recall that class MessageStore is storing the message to display) add the following Java code to the HelloWorldAction's execute method after the statement that instantiates the MessageStore object.
+To personalize the MessageStore message (recall that class MessageStore is storing the message to display) 
+add the following Java code to the HelloWorldAction's execute method after the statement that instantiates 
+the MessageStore object.
 
 **Add userName value to message**
 
@@ -106,22 +122,29 @@ if (userName != null) {
 }
 ```
 
-Now build and run (`mvn jetty:run`) the application. Enter your name in the form and click the submit button. You should see the following page.
+Now build and run (`mvn jetty:run`) the application. Enter your name in the form and click the submit button. 
+You should see the following page.
 
 ![coding_actions_form_submit_result.png](attachments/coding_actions_form_submit_result.png)
 
-When the form is submitted, Struts will call any set methods of the HelloWorldAction class that match the form field names. So in this example method `setUserName` was called and passed the value the user entered in the `userName` form field.
+When the form is submitted, Struts will call any set methods of the HelloWorldAction class that match the form field 
+names. So in this example method `setUserName` was called and passed the value the user entered in the `userName` form field.
 
-On the `index.jsp` we also have a Struts 2 action link (see tutorial [Using Struts 2 Tags](using-tags.html)) that includes a query string parameter: `userName=Bruce+Phillips`. If you click on that link you should see the following result:
+On the `index.jsp` we also have a Struts 2 action link (see tutorial [Using Struts 2 Tags](using-tags)) that includes 
+a query string parameter: `userName=Bruce+Phillips`. If you click on that link you should see the following result:
 
 ![coding_actions_link_with_param_result.png](attachments/coding_actions_link_with_param_result.png)
 
 Since the query string parameter is `userName`, Struts passed the value of that parameter to the `setUserName` method.
 
-On the view page, `HelloWorld.jsp`, you can also access the `userName` value by using the Struts 2 property tag (see tutorial [Using Struts 2 Tags](using-tags.html)). Try showing just the `userName` value on the view page.
+On the view page, `HelloWorld.jsp`, you can also access the `userName` value by using the Struts 2 property tag 
+(see tutorial [Using Struts 2 Tags](using-tags)). Try showing just the `userName` value on the view page.
 
 ## Summary
 
-This tutorial introduced you to how to code the Action class so it can process user input on a form or values in a query string parameter. If the form had numerous fields, it would be cumbersome to have a set method that matches up with each form field. So our next tutorial will cover how to integrate a model class, form fields in the view and form processing in the Action class.
+This tutorial introduced you to how to code the Action class so it can process user input on a form or values in 
+a query string parameter. If the form had numerous fields, it would be cumbersome to have a set method that matches 
+up with each form field. So our next tutorial will cover how to integrate a model class, form fields in the view 
+and form processing in the Action class.
 
-|Return to [Using Struts 2 Tags](using-tags.html)|or|onward to [Processing Forms](processing-forms.html)|
+|Return to [Using Struts 2 Tags](using-tags)|or|onward to [Processing Forms](processing-forms)|
diff --git a/source/getting-started/control-tags.md b/source/getting-started/control-tags.md
index d05d02e..ea000cb 100644
--- a/source/getting-started/control-tags.md
+++ b/source/getting-started/control-tags.md
@@ -16,9 +16,13 @@ The example code for this tutorial, **control-tags**, is available at [struts-ex
 
 ## Introduction
 
-Struts 2 has several control tags that can be used in the view. This tutorial will discuss and show examples of how to use the Struts 2 if and iterator tags. For more information about these and other control tags visit [tags reference](http://cwiki.apache.org/confluence/display/WW/Generic+Tag+Reference).
+Struts 2 has several control tags that can be used in the view. This tutorial will discuss and show examples of how to 
+use the Struts 2 if and iterator tags. For more information about these and other control tags visit 
+[tags reference](../tag-developers/tag-reference).
 
-The [Struts 2 user mailing list](http://struts.apache.org/mail.html) is an excellent place to get help. If you are having a problem getting the tutorial example applications to work search the Struts 2 mailing list. If you don't find an answer to your problem, post a question on the mailing list.
+The [Struts 2 user mailing list](http://struts.apache.org/mail) is an excellent place to get help. If you are having 
+a problem getting the tutorial example applications to work search the Struts 2 mailing list. If you don't find 
+an answer to your problem, post a question on the mailing list.
 
 ## Struts 2 if Tag
 
@@ -35,11 +39,17 @@ In the example application's thankyou.jsp is this markup.
 </s:else>
 ```
 
-The Struts if tag has a test attribute. The value of the test attribute must evaluate to true or false. If true the statements between the opening and closing s:if tags will be executed. If false, the statements between the opening and closing s:else tags will be executed. Note that s:else tags come after the closing s:if tag and that the s:else tags are not required.
+The Struts if tag has a test attribute. The value of the test attribute must evaluate to true or false. If true 
+the statements between the opening and closing s:if tags will be executed. If false, the statements between the opening 
+and closing s:else tags will be executed. Note that s:else tags come after the closing s:if tag and that the s:else 
+tags are not required.
 
-In the above example the Struts framework will call method getPersonBean exposed by the Action class (EditAction.java). Using the Person object returned by that method, the framework will then call method isOver21 of class Person. That method returns a boolean that will be used to determine if the test is true or false.
+In the above example the Struts framework will call method getPersonBean exposed by the Action class (EditAction.java). 
+Using the Person object returned by that method, the framework will then call method isOver21 of class Person. 
+That method returns a boolean that will be used to determine if the test is true or false.
 
-The value of the test attribute must be an expression that evaluates to true or false, but doesn't need to be a method call that returns a boolean. For example this s:if tag that is in thankyou.jsp has a more complicated expression.
+The value of the test attribute must be an expression that evaluates to true or false, but doesn't need to be a method 
+call that returns a boolean. For example this s:if tag that is in thankyou.jsp has a more complicated expression.
 
 ```html
 <s:if test="personBean.carModels.length > 1">
@@ -50,11 +60,15 @@ The value of the test attribute must be an expression that evaluates to true or
 </s:else>
 ```
 
-The purpose of the above markup is to use either "Car model" or "Car models" depending on how many car models the user selected on the edit page. So the value for the test attribute of this iterator tag gets the length of the carModels String array and compares that to 1. If it's greater than 1, the correct grammar is "Car models" else the correct grammar is "Car model".
+The purpose of the above markup is to use either "Car model" or "Car models" depending on how many car models the user 
+selected on the edit page. So the value for the test attribute of this iterator tag gets the length of the carModels 
+String array and compares that to 1. If it's greater than 1, the correct grammar is "Car models" else the correct 
+grammar is "Car model".
 
 ## Struts iterator Tag
 
-The Struts iterator tag is used to generate a loop that iterates over each item in a collection. In the thankyou.jsp is this markup.
+The Struts iterator tag is used to generate a loop that iterates over each item in a collection. In the thankyou.jsp 
+is this markup.
 
 ```html
 <table style="margin-left:15px">
@@ -64,13 +78,19 @@ The Struts iterator tag is used to generate a loop that iterates over each item
 </table>
 ```
 
-The goal of this code is to create an HTML table with a row that display a car model selected by the user on the edit page. The car models the user selects on the edit page are stored in the carModels field (a String array) of the personBean object (of class Person).
+The goal of this code is to create an HTML table with a row that display a car model selected by the user on the edit 
+page. The car models the user selects on the edit page are stored in the carModels field (a String array) 
+of the personBean object (of class Person).
 
 The iterator tag has a value attribute that must evaluate to a collection (Array, List, Map).
 
-The `s:property` tag nested inside the iterator tag is used to display the specific value of the collection each time the iterator loops over an element of the collection. Since the collection is an Array of String objects, the `s:property` tag doesn't need to specify a value attribute. By default the `s:property` tag will display the single String for that element of the collection.
+The `s:property` tag nested inside the iterator tag is used to display the specific value of the collection each time 
+the iterator loops over an element of the collection. Since the collection is an Array of String objects, the `s:property` 
+tag doesn't need to specify a value attribute. By default the `s:property` tag will display the single String for that 
+element of the collection.
 
-If the collection contains objects that have multiple fields, then you should use the value attribute of the s:property tag to determine what field to display. For example:
+If the collection contains objects that have multiple fields, then you should use the value attribute of the s:property 
+tag to determine what field to display. For example:
 
 ```html
 <table style="margin-left:15px">
@@ -80,10 +100,15 @@ If the collection contains objects that have multiple fields, then you should us
 </table>
 ```
 
-The value of the iterator tag is states, which causes the Struts 2 framework to call the getStates method of the Action class (`EditAction.java`). The getStates method returns a List of State objects. The State class has two fields stateAbbr and stateName, both having the appropriate get method. The iterator will loop over each State object stored in the collection. Each time through the loop, the Struts 2 framework will have a reference to the current State object and will call getState [...]
+The value of the iterator tag is states, which causes the Struts 2 framework to call the getStates method of the Action 
+class (`EditAction.java`). The getStates method returns a List of State objects. The State class has two fields stateAbbr
+and stateName, both having the appropriate get method. The iterator will loop over each State object stored in the collection. 
+Each time through the loop, the Struts 2 framework will have a reference to the current State object and will call 
+getStateAbbr and getStateName methods for that current State object.
 
 ## Additional Iterator Attributes
 
-The Struts 2 iterator tag has additional attributes you can use to control the begin and end values for specifying that the iterator tag should only loop over a part of the collection. See the [iterator tag reference](https://cwiki.apache.org/confluence/display/WW/iterator) for more information.
+The Struts 2 iterator tag has additional attributes you can use to control the begin and end values for specifying 
+that the iterator tag should only loop over a part of the collection. See the [iterator tag reference](../tag-developers/iterator-tag) for more information.
 
-|Return to [Form validation using XML](form-validation-using-xml.html)|or|onward to [Wildcard method selection](wildcard-method-selection.html)|
+|Return to [Form validation using XML](form-validation-using-xml)|or|onward to [Wildcard method selection](wildcard-method-selection)|
diff --git a/source/getting-started/debugging-struts.md b/source/getting-started/debugging-struts.md
index 95b9661..6754e13 100644
--- a/source/getting-started/debugging-struts.md
+++ b/source/getting-started/debugging-struts.md
@@ -21,7 +21,7 @@ This tutorial will cover two tools you can use to see how Struts 2 views your we
 configuration plugin and the other is the debugging interceptor. This article also discusses how to set the log level 
 to see more or fewer log messages.
 
-The Struts 2 [user mailing list](http://struts.apache.org/mail.html) is an excellent place to get help. If you are having 
+The Struts 2 [user mailing list](http://struts.apache.org/mail) is an excellent place to get help. If you are having 
 a problem getting the tutorial example applications to work search the Struts 2 mailing list. If you don't find an answer 
 to your problem, post a question on the mailing list.
 
@@ -65,7 +65,7 @@ string appended to the action URL with a name of debug and a value of xml, conso
 
 If the `DebuggingInterceptor` finds that query string then it will halt further execution of the action and instead return 
 to the browser debugging information. The format of the returned information depends on the value of the debug query parameter. 
-See [DebuggingInterceptor](../core-developers/debugging-interceptor.html) for more detail.
+See [DebuggingInterceptor](../core-developers/debugging-interceptor) for more detail.
 
 In the example application on the index.jsp is a link for displaying debugging information. This link includes the query 
 string `debug=browser`. If you click on this link you'll see a table with columns that can be expanded and collapsed. 
@@ -83,7 +83,7 @@ download and from the Maven repository.
 The Struts 2 framework will write to a log a great deal of information if you've configured the log properties to log at 
 the debug level. In the example application, view `log4j2.xml`. The two major packages involved in the Struts 2 framework, 
 `com.opensymphony` and `org.apache.struts2`, are configured to write debug and above log messages. When you run the application 
-view the standard out for your Servlet container to see all the information written to the log. Please check [Logging](../core-developers/logging.html)
+view the standard out for your Servlet container to see all the information written to the log. Please check [Logging](../core-developers/logging)
 page for other options.
 
 ## Summary
@@ -95,4 +95,4 @@ Prior to creating your war file for deployment to production you should change `
 links. You may also want to adjust the level of logging in your log properties file to a higher level (info or warn) to reduce 
 the number of log messages.
 
-|Return to [Exception handling](exception-handling.html)|or|onward to [Form tags](form-tags.html)|
+|Return to [Exception handling](exception-handling)|or|onward to [Form tags](form-tags)|
diff --git a/source/getting-started/exception-handling.md b/source/getting-started/exception-handling.md
index 0d272d9..a8b680d 100644
--- a/source/getting-started/exception-handling.md
+++ b/source/getting-started/exception-handling.md
@@ -16,15 +16,22 @@ The code for this tutorial, **exception-handling**, is available for checkout at
 
 ## Introduction
 
-In this tutorial we'll explore how to enable the Struts 2 framework to handle any uncaught exceptions generated by a web application. Struts 2 provides robust exception handling, including the ability to automatically log any uncaught exceptions and redirect the user to an error web page.
+In this tutorial we'll explore how to enable the Struts 2 framework to handle any uncaught exceptions generated 
+by a web application. Struts 2 provides robust exception handling, including the ability to automatically log any 
+uncaught exceptions and redirect the user to an error web page.
 
-The [Struts 2 user mailing list](http://struts.apache.org/mail.html) is an excellent place to get help. If you are having a problem getting the tutorial example applications to work search the Struts 2 mailing list. If you don't find an answer to your problem, post a question on the mailing list.
+The [Struts 2 user mailing list](http://struts.apache.org/mail) is an excellent place to get help. If you are having 
+a problem getting the tutorial example applications to work search the Struts 2 mailing list. If you don't find 
+an answer to your problem, post a question on the mailing list.
 
 ## Global Exception Handling
 
-Using the Struts 2 framework you can specify in the struts.xml how the framework should handle uncaught exceptions. The handling logic can apply to all actions (global exception handling) or to a specific action. Let's first discuss how to enable global exception handling.
+Using the Struts 2 framework you can specify in the struts.xml how the framework should handle uncaught exceptions. 
+The handling logic can apply to all actions (global exception handling) or to a specific action. Let's first discuss
+how to enable global exception handling.
 
-To enable global exception handling you need to add two nodes to `struts.xml`: `global-exception-mapping` and `global-results`. For example examine the `struts.xml` from the exception-handling project.
+To enable global exception handling you need to add two nodes to `struts.xml`: `global-exception-mapping` 
+and `global-results`. For example examine the `struts.xml` from the exception-handling project.
 
 ```xml
 <global-results>
@@ -38,13 +45,18 @@ To enable global exception handling you need to add two nodes to `struts.xml`: `
 </global-exception-mappings>
 ```
 
-The global exception mapping node tells the Struts 2 framework what to do if an uncaught exception of the type specified (or a child of that type) is thrown by the the application. For example if a SecurityBreachException is thrown but not caught, the Struts 2 Action class will return a result of "securityerror". All other uncaught exceptions will cause the Struts 2 Action class to return a result of "error".
+The global exception mapping node tells the Struts 2 framework what to do if an uncaught exception of the type specified 
+(or a child of that type) is thrown by the the application. For example if a SecurityBreachException is thrown but 
+not caught, the Struts 2 Action class will return a result of "securityerror". All other uncaught exceptions will cause 
+the Struts 2 Action class to return a result of "error".
 
-The global results mapping node relates the result value to a specific view page. For example the result "securityerror" will cause the framework to redirect the user's browser to the securityerror.jsp view page.
+The global results mapping node relates the result value to a specific view page. For example the result "securityerror"
+will cause the framework to redirect the user's browser to the securityerror.jsp view page.
 
 ## Exception Handling Per Action
 
-If you need to handle an exception in a specific way for a certain action you can use the exception-mapping node within the action node.
+If you need to handle an exception in a specific way for a certain action you can use the exception-mapping node within 
+the action node.
 
 ```xml
 <action name="actionspecificexception" class="org.apache.struts.register.action.Register" method="throwSecurityException">
@@ -54,15 +66,22 @@ If you need to handle an exception in a specific way for a certain action you ca
 </action>
 ```
 
-The above action node from the example application's struts.xml file specifies that if the method `throwSecurityException` throws an uncaught exception of type `SecurityBreachException` the Struts 2 framework should return a result of login. The login result will cause the user's browser to be redirected to login.jsp.
+The above action node from the example application's struts.xml file specifies that if the method `throwSecurityException`
+throws an uncaught exception of type `SecurityBreachException` the Struts 2 framework should return a result of login. 
+The login result will cause the user's browser to be redirected to login.jsp.
 
 You can see that an action-specific exception mapping will take precedence if the same exception is also mapped globally.
 
 ## Logging Exceptions
 
-You can configure the Struts 2 framework to log any uncaught exceptions. To enable logging of the exceptions being handled by the Struts 2 framework you must specify some parameter values in struts.xml. If you examine the [ExceptionMappingInterceptor class API](https://struts.apache.org/maven/struts2-core/apidocs/com/opensymphony/xwork2/interceptor/ExceptionMappingInterceptor.html) there are three parameter values you can set to enable logging (logEnabled), the log level to use (logLevel [...]
+You can configure the Struts 2 framework to log any uncaught exceptions. To enable logging of the exceptions being 
+handled by the Struts 2 framework you must specify some parameter values in struts.xml. If you examine 
+the [ExceptionMappingInterceptor class API](https://struts.apache.org/maven/struts2-core/apidocs/com/opensymphony/xwork2/interceptor/ExceptionMappingInterceptor) 
+there are three parameter values you can set to enable logging (logEnabled), the log level to use (logLevel), 
+and the log category (logCategory) to specify in the log message.
 
-To set these parameter values for all actions that use a specific stack of interceptors in a package include the following in struts.xml just after the opening package node.
+To set these parameter values for all actions that use a specific stack of interceptors in a package include
+the following in struts.xml just after the opening package node.
 
 ```xml
 <interceptors>
@@ -77,17 +96,25 @@ To set these parameter values for all actions that use a specific stack of inter
 <default-interceptor-ref name="appDefaultStack" />
 ```
 
-The above interceptors node configures a new stack of Struts 2 interceptors named `appDefaultStack`. This stack of interceptors is based upon the defaultStack of interceptors (which are the Struts 2 interceptors that execute by default whenever an Action class method is called by the Struts 2 framework).
+The above interceptors node configures a new stack of Struts 2 interceptors named `appDefaultStack`. This stack 
+of interceptors is based upon the defaultStack of interceptors (which are the Struts 2 interceptors that execute 
+by default whenever an Action class method is called by the Struts 2 framework).
 
-The ExceptionMappingInterceptor is one of the Struts 2 interceptors that is part of the default stack. In the definition of the struts defaultStack, the ExceptionMappingInterceptor is given the name of exception. By specifying a param node with the name of exception.logEnabled and a value of true, I'm setting the logEnabled parameter of the ExceptionMappingInterceptor class to true.
+The ExceptionMappingInterceptor is one of the Struts 2 interceptors that is part of the default stack. In the definition 
+of the struts defaultStack, the ExceptionMappingInterceptor is given the name of exception. By specifying a param node 
+with the name of exception.logEnabled and a value of true, I'm setting the logEnabled parameter of the ExceptionMappingInterceptor class to true.
 
-Now when the application throws an uncaught exception, the Struts 2 framework will handle it and will also write an entry to the log that includes the stack trace. In the example above, I've set the level to log these exceptions to be ERROR.
+Now when the application throws an uncaught exception, the Struts 2 framework will handle it and will also write
+an entry to the log that includes the stack trace. In the example above, I've set the level to log these exceptions 
+to be ERROR.
 
-In the example applications, the logging is just to the Servlet container's console (see the `log4j2.xml` file for the log settings).
+In the example applications, the logging is just to the Servlet container's console (see the `log4j2.xml` file for 
+the log settings).
 
 ## Display Exception Information In Browser
 
-You can display information about the exception in the browser if you want by using s:property tags with a value of exception and exceptionStack. For example in error.jsp is this markup.
+You can display information about the exception in the browser if you want by using s:property tags with a value 
+of exception and exceptionStack. For example in error.jsp is this markup.
 
 ```html
 <h4>The application has malfunctioned.</h4>
@@ -99,10 +126,13 @@ You can display information about the exception in the browser if you want by us
 <h4>Exception Details: <s:property value="exceptionStack" /></h4> 
 ```
 
-When the exception interceptor is triggered it adds to the fields available for display the exception message and the exception's stack trace.
+When the exception interceptor is triggered it adds to the fields available for display the exception message 
+and the exception's stack trace.
 
 ## Summary
 
-Struts 2 provides an easy to use configuration for handling uncaught exceptions and redirecting users to appropriate view pages. You can configure exception handling to be global for all actions or to just for a specific action. You can also enable the Struts 2 framework to log the uncaught exceptions.
+Struts 2 provides an easy to use configuration for handling uncaught exceptions and redirecting users to appropriate 
+view pages. You can configure exception handling to be global for all actions or to just for a specific action. 
+You can also enable the Struts 2 framework to log the uncaught exceptions.
 
-|Return to [Message resource files](message-resource-files.html)|or|onward to [Debugging Struts](debugging-struts.html)|
+|Return to [Message resource files](message-resource-files)|or|onward to [Debugging Struts](debugging-struts)|
diff --git a/source/getting-started/exclude-parameters.md b/source/getting-started/exclude-parameters.md
index 1e54fee..0e07718 100644
--- a/source/getting-started/exclude-parameters.md
+++ b/source/getting-started/exclude-parameters.md
@@ -16,14 +16,14 @@ The example code for this tutorial, **exclude-parameters**, is available at [str
 
 ## Introduction
 
-When [Struts development mode is set to true](../core-developers/struts-xml.html) (also see [Debugging Struts](debugging-struts.html)) 
+When [Struts development mode is set to true](../core-developers/struts-xml) (also see [Debugging Struts](debugging-struts)) 
 the framework writes many informative messages to the log file. These messages include ones that indicate whether 
 or not a specific parameter will be handled by the parameter interceptor and made available to the Action class. 
 These log messages can be helpful in clearly identifying parameters that you do not want the parameter interceptor 
 to process for security or other reasons. This article discusses how to exclude parameters from being handled by 
 the parameter interceptor.
 
-The [Struts 2 user mailing list](http://struts.apache.org/mail.html) is an excellent place to get help. If you are having 
+The [Struts 2 user mailing list](http://struts.apache.org/mail) is an excellent place to get help. If you are having 
 a problem getting the tutorial example applications to work search the Struts 2 mailing list. If you don't find an answer 
 to your problem, post a question on the mailing list.
 
@@ -71,7 +71,7 @@ Unexpected Exception caught setting 'submit' on 'class org.apache.struts.edit.ac
 
 ## Excluding Request Parameters From Struts 2 Processing
 
-If you're not familiar with setting up a custom interceptor stack for your Struts 2 application review [Introducing Interceptors](introducing-interceptors.html).
+If you're not familiar with setting up a custom interceptor stack for your Struts 2 application review [Introducing Interceptors](introducing-interceptors).
 
 To exclude specific parameters from being processed by the Struts 2 framework you need to add those parameter names 
 to the list of excluded parameters. One way to do this is by adding those parameter names to the collection of `excludedParams` 
@@ -98,7 +98,7 @@ The value of node `<param name="params.excludeParams">` is a comma-delimited lis
 Strings that identify request parameters that should NOT be processed by the Parameters interceptor. To exclude 
 the `submit` parameter (which is the name of the submit button in the form code above), I just added `submit` to the list.
 
-See the [Basic Stack of Interceptors described here](../core-developers/struts-default-xml.html) to view the initial 
+See the [Basic Stack of Interceptors described here](../core-developers/struts-default-xml) to view the initial 
 set of parameter names/regular expressions to exclude. Be sure to copy over the list of parameters already being excluded 
 and then add your own parameters to the end separated by commas.
 
@@ -118,4 +118,4 @@ if there are any parameters that the framework should not process. For those par
 not process add the parameter name (or a regular expression that can be used to identify multiple parameter names) 
 to the comma-delimited list that is the value for the `<param name="params.excludeParams">` node.
 
-|Return to [Preparable Interface](preperable-interface.html)|or|back to [Getting started](index.html)|
+|Return to [Preparable Interface](preperable-interface)|or|back to [Getting started](index)|
diff --git a/source/getting-started/form-tags.md b/source/getting-started/form-tags.md
index 1de6f34..f3d398b 100644
--- a/source/getting-started/form-tags.md
+++ b/source/getting-started/form-tags.md
@@ -17,12 +17,12 @@ The example code for this tutorial, **form-tags**, can be checked out from [stru
 ## Introduction
 
 In this tutorial we'll explore some of the other Struts 2 form controls. In our previous tutorials that explained how 
-to use Struts 2 forms ([Processing forms](processing-forms.html), [Form validation](form-validation.html), 
-and [Message resource files](message-resource-files.html) ) we covered how to use the Struts 2 head, form, textfield 
+to use Struts 2 forms ([Processing forms](processing-forms), [Form validation](form-validation), 
+and [Message resource files](message-resource-files) ) we covered how to use the Struts 2 head, form, textfield 
 controls and the key attribute. This tutorial will explore using the Struts 2 select, radio, checkbox, and checkboxlist 
 form controls.
 
-The [Struts 2 user mailing list](http://struts.apache.org/mail.html) is an excellent place to get help. If you are 
+The [Struts 2 user mailing list](http://struts.apache.org/mail) is an excellent place to get help. If you are 
 having a problem getting the tutorial example applications to work search the Struts 2 mailing list. If you don't find 
 an answer to your problem, post a question on the mailing list.
 
@@ -54,10 +54,10 @@ to provide the list of options for the select box.
 <s:select key="personBean.sport" list="sports" />
 ```
 
-In these form tags, we are using the key attribute as discussed in the [Message resource files](message-resource-files.html)
+In these form tags, we are using the key attribute as discussed in the [Message resource files](message-resource-files)
 tutorial. The key attribute is used by the Struts 2 framework to determine values for the other attributes (e.g. label 
 and value). We are also using a property file associated with the EditAction class to provide the label values based on 
-the key attribute value (see the [Message Resource Files](message-resource-files.html) tutorial for information on using 
+the key attribute value (see the [Message Resource Files](message-resource-files) tutorial for information on using 
 Struts 2 property files).
 
 > Note that there are many attributes for the Struts 2 form tags, most of which mirror the HTML attributes associated 
@@ -275,5 +275,5 @@ the checkbox will be checked.
 There are several other Struts 2 form controls you should explore. If you need more information about the Struts 2 form 
 tags consult the Struts 2 documentation at [http://struts.apache.org](http://struts.apache.org).
 
-|Return to [Debugging Struts](debugging-struts.html)|or|onward to [Form validation using XML](form-validation-using-xml.html)|
+|Return to [Debugging Struts](debugging-struts)|or|onward to [Form validation using XML](form-validation-using-xml)|
 
diff --git a/source/getting-started/form-validation-using-xml.md b/source/getting-started/form-validation-using-xml.md
index 74d0c89..8ecd0e9 100644
--- a/source/getting-started/form-validation-using-xml.md
+++ b/source/getting-started/form-validation-using-xml.md
@@ -16,13 +16,19 @@ The example code for this tutorial, **form-xml-validation**, is available for ch
 
 ## Introduction
 
-In this tutorial we'll cover how to validate a user's input in form fields using Struts 2's XML validation methodology. In the [Form Validation](form-validation.html) tutorial we discussed validating a user's input using the validate method in the Action class. Using a separate XML validation file gives you the ability to use validators built-in to the Struts 2 framework.
+In this tutorial we'll cover how to validate a user's input in form fields using Struts 2's XML validation methodology.
+In the [Form Validation](form-validation) tutorial we discussed validating a user's input using the validate method 
+in the Action class. Using a separate XML validation file gives you the ability to use validators built-in 
+to the Struts 2 framework.
 
-The [Struts 2 user mailing list](http://struts.apache.org/mail.html) is an excellent place to get help. If you are having a problem getting the tutorial example applications to work search the Struts 2 mailing list. If you don't find an answer to your problem, post a question on the mailing list.
+The [Struts 2 user mailing list](http://struts.apache.org/mail) is an excellent place to get help. If you are having 
+a problem getting the tutorial example applications to work search the Struts 2 mailing list. If you don't find an answer 
+to your problem, post a question on the mailing list.
 
 ## Example Application
 
-The example application that supports this tutorial shows how to use Struts 2's XML validation methodology. The information that can be edited is encapsulated in an object of class Person.
+The example application that supports this tutorial shows how to use Struts 2's XML validation methodology. 
+The information that can be edited is encapsulated in an object of class Person.
 
 To enable the user to edit his information that is stored in the Person object, we have this form:
 
@@ -32,11 +38,16 @@ When the user submits the form, we want to validate his entries into the form fi
 
 ## Validation Using XML
 
-To validate a user's form field entries you can use a separate XML file that contains your validation rules. The XML file that contains the validation rules must be named as ActionClassName-validation.xml. In the example application, the XML validation file is named EditAction-validation.xml (see src/main/resources/org/apache/struts/edit/action).
+To validate a user's form field entries you can use a separate XML file that contains your validation rules.
+The XML file that contains the validation rules must be named as ActionClassName-validation.xml. In the example 
+application, the XML validation file is named EditAction-validation.xml (see src/main/resources/org/apache/struts/edit/action).
 
-Struts 2 provides several different validators that you can use in the XML validation file. See [Validation](../core-developers/validation.html) for a list of validators you can employ.
+Struts 2 provides several different validators that you can use in the XML validation file. See [Validation](../core-developers/validation) 
+for a list of validators you can employ.
 
-In the above form, we want to ensure the user enters a first name. To have the Struts 2 framework enforce that rule we can use the Struts 2 [requiredstring validator](../core-developers/requiredstring-validator.html). This validator checks that the user has entered a string value in the form field.
+In the above form, we want to ensure the user enters a first name. To have the Struts 2 framework enforce that rule 
+we can use the Struts 2 [requiredstring validator](../core-developers/requiredstring-validator). This validator checks 
+that the user has entered a string value in the form field.
 
 ## XML Validator Format
 
@@ -55,17 +66,24 @@ In the XML validation file (for this example that is EditAction-validation.xml),
 </validators>
 ```
 
-Within the validators node you can have 1 or more validator nodes. The type attribute specifies which validator you want the Struts 2 framework to use (see [Validation](../core-developers/validation.html) ). The param name="fieldname" node is used to tell the framework which form field entry to apply the rule to. See edit.jsp for the form fields and their name value (review [Struts 2 Form Tags](form-tags.html) if you're not familiar with how to use Struts 2 form tags). The message node i [...]
+Within the validators node you can have 1 or more validator nodes. The type attribute specifies which validator you 
+want the Struts 2 framework to use (see [Validation](../core-developers/validation) ). The param name="fieldname" node 
+is used to tell the framework which form field entry to apply the rule to. See edit.jsp for the form fields and their 
+name value (review [Struts 2 Form Tags](form-tags) if you're not familiar with how to use Struts 2 form tags). T
+he message node is used to tell the framework what message to display if the validation fails.
 
-| There are alternate ways to write the XML that goes in the validation XML file. See [Validation](../core-developers/validation.html) in the Struts 2 documentation for a full discussion.
+| There are alternate ways to write the XML that goes in the validation XML file. See [Validation](../core-developers/validation) 
+in the Struts 2 documentation for a full discussion.
 
-For example if the user doesn't enter a value in the first name form field and clicks on the Save Changes button, he will see the following.
+For example if the user doesn't enter a value in the first name form field and clicks on the Save Changes button, h
+e will see the following.
 
 ![form-validation-2.png](attachments/att20873264_form-validation-2.png)
 
 ## Validating An Email Address
 
-You can use the Struts 2 [email validator](../core-developers/email-validator.html) to validate the user's input in the email field. Here is the validator node that is in the `EditAction-validation.xml` file.
+You can use the Struts 2 [email validator](../core-developers/email-validator) to validate the user's input in the email 
+field. Here is the validator node that is in the `EditAction-validation.xml` file.
 
 **Email Validator**
 
@@ -84,7 +102,9 @@ Note that in the example, we are requiring the user to enter an email address an
 
 ## Validating A User's Input Using A Regular Expression
 
-The Struts 2 framework provides a powerful way to validate a user's form field input by using the [regex validator](../core-developers/regex-validator.html) . In the example application, we want to ensure the user enters the phone number in the format 999-999-9999. We can use a regular expression and the [regex validator](../core-developers/regex-validator.html) to enforce this rule.
+The Struts 2 framework provides a powerful way to validate a user's form field input by using the [regex validator](../core-developers/regex-validator).
+In the example application, we want to ensure the user enters the phone number in the format 999-999-9999. We can use
+a regular expression and the [regex validator](../core-developers/regex-validator) to enforce this rule.
 
 **REGEX Validator**
 
@@ -100,11 +120,14 @@ The Struts 2 framework provides a powerful way to validate a user's form field i
 </validator>
 ```
 
-The `param name="regex"` node is used to specify the regular expression that will be applied to the user's input. Note how the regular expression is contained within a CDATA section.
+The `param name="regex"` node is used to specify the regular expression that will be applied to the user's input. 
+Note how the regular expression is contained within a CDATA section.
 
 ## Validating A User's Input Using An OGNL Expression
 
-In the example application, we want to ensure the user checks at least one of the car model check boxes. To enforce this rule we can use the [fieldexpression validator](../core-developers/fieldexpression-validator.html) . Here's the XML for that validator node.
+In the example application, we want to ensure the user checks at least one of the car model check boxes. To enforce 
+this rule we can use the [fieldexpression validator](../core-developers/fieldexpression-validator). 
+Here's the XML for that validator node.
 
 **FieldExpression Validator**
 
@@ -116,18 +139,27 @@ In the example application, we want to ensure the user checks at least one of th
 </validator>
 ```
 
-The param name="expression" node contains an OGNL expression that evaluates to true or false. We haven't previously discussed OGNL, which stands for Object-Graph Navigation Language (see [https://github.com/jkuhnert/ognl](https://github.com/jkuhnert/ognl) and [OGNL](../tag-developers/ognl.html) ). OGNL expressions can be evaluated by the Struts 2 framework as Java statements.
+The param name="expression" node contains an OGNL expression that evaluates to true or false. We haven't previously 
+discussed OGNL, which stands for Object-Graph Navigation Language (see [https://github.com/jkuhnert/ognl](https://github.com/jkuhnert/ognl) 
+and [OGNL](../tag-developers/ognl) ). OGNL expressions can be evaluated by the Struts 2 framework as Java statements.
 
-In the above XML the value of the param name="expression" node, personBean.carModels.length \> 0, will be evaluated by the framework as a Java statement. The part personBean.carModels tells the framework to call the getCarModels method of class Person. That method returns an Array. Since class Array has a length attribute, the framework will get the value of the length attribute of the Array returned by the getCarModels method.
+In the above XML the value of the param name="expression" node, personBean.carModels.length > 0, will be evaluated 
+by the framework as a Java statement. The part personBean.carModels tells the framework to call the getCarModels 
+method of class Person. That method returns an Array. Since class Array has a length attribute, the framework will get 
+the value of the length attribute of the Array returned by the getCarModels method.
 
-If the user did not check any of the check boxes, the Array returned by the getCarModels method will have a length value of 0. Since the complete OGNL expression will only evaluate to true if the length value is greater than 0, the validation fails. The user will see this.
+If the user did not check any of the check boxes, the Array returned by the getCarModels method will have a length 
+value of 0. Since the complete OGNL expression will only evaluate to true if the length value is greater than 0, 
+the validation fails. The user will see this.
 
 ![form-validation-3.png](attachments/att20873265_form-validation-3.png)
 
-The fieldexpression validator is useful when doing conditional validation of a user's input. If the OGNL expression doesn't evaluate to true then the user's input won't be allowed.
+The fieldexpression validator is useful when doing conditional validation of a user's input. If the OGNL expression 
+doesn't evaluate to true then the user's input won't be allowed.
 
 ## Summary
 
-The Struts 2 framework provides easy-to-use validation methodologies. You can add a validate method to the Action class or have a separate XML file with validation rules or you can use a combination of both methodologies.
+The Struts 2 framework provides easy-to-use validation methodologies. You can add a validate method to the Action class 
+or have a separate XML file with validation rules or you can use a combination of both methodologies.
 
-|Return to [Form tags](form-tags.html)|or|onward to [Control tags](control-tags.html)|
+|Return to [Form tags](form-tags)|or|onward to [Control tags](control-tags)|
diff --git a/source/getting-started/form-validation.md b/source/getting-started/form-validation.md
index 5df0f6e..f601a8d 100644
--- a/source/getting-started/form-validation.md
+++ b/source/getting-started/form-validation.md
@@ -12,7 +12,7 @@ parent:
 * Will be replaced with the ToC, excluding a header
 {:toc}
 
-This tutorial assumes you've completed the [Processing Forms](processing-forms.html) tutorial and have a working 
+This tutorial assumes you've completed the [Processing Forms](processing-forms) tutorial and have a working 
 **form-processing** project. The example code for this tutorial, **form-validation**, is available for checkout from 
 the Struts 2 GitHub repository [struts-examples](https://github.com/apache/struts-examples).
 
@@ -21,21 +21,21 @@ the Struts 2 GitHub repository [struts-examples](https://github.com/apache/strut
 In this tutorial we'll explore using Struts 2 to validate the user's input on a form. There are two ways you can use Struts 2 
 to do form validation. This tutorial will cover the more basic method, where the validation is included in the Struts 2 Action class.
 
-The [Struts 2 user mailing list](http://struts.apache.org/mail.html) is an excellent place to get help. If you are having 
+The [Struts 2 user mailing list](http://struts.apache.org/mail) is an excellent place to get help. If you are having 
 a problem getting the tutorial example applications to work search the Struts 2 mailing list. If you don't find an answer 
 to your problem, post a question on the mailing list.
 
 ## Add validate Method
 
 To enable the Struts 2 Action class to validate a user's input on a Struts 2 form, you must define a validate method 
-in your Action class. Using the example from [Processing Forms](processing-forms.html) tutorial, let's say that we have 
+in your Action class. Using the example from [Processing Forms](processing-forms) tutorial, let's say that we have 
 these business rules:
 
 1. User must provide a first name
 2. User must provide an email address
 3. User younger than 18 cannot register
 
-If you recall from the [Processing Forms](processing-forms.html) tutorial the user's input into the form fields is placed 
+If you recall from the [Processing Forms](processing-forms) tutorial the user's input into the form fields is placed 
 by Struts 2 into the Java model class `personBean`. So a user's input into the `firstName` field would end up as the value 
 for `personBean`'s `firstName` instance field (via the `personBean.setFirstName` method).
 
@@ -97,7 +97,7 @@ addFieldError("personBean.firstName", "First name is required.")
 
 will cause the message _First name is required_ to be displayed above the `firstName` field on the form.
 
-If you have made the above changes to the [Processing Forms](processing-forms.html) tutorial or you have downloaded 
+If you have made the above changes to the [Processing Forms](processing-forms) tutorial or you have downloaded 
 from [form-validation](https://github.com/apache/struts-examples/tree/master/form-validation) 
 run the application (see the README.txt in the project root folder). Click on the Please register link. On the registration 
 form, just click the submit button and you should see:
@@ -117,10 +117,10 @@ to `register.jsp` before the closing HTML `</head>` tag. Go through the same ste
 
 This tutorial covered validating a user's form input by adding a validate method to an Action class. There is another 
 more sophisticated way to validate user input using XML. If you want to learn more about using XML for validation 
-in Struts 2 see [Validation](../core-developers/validation.html) .
+in Struts 2 see [Validation](../core-developers/validation) .
 
 ## Up Next
 
 In our next tutorial we'll cover how to use message resource files to separate out the text from the view page.
 
-|Return to [Processing Forms](processing-forms.html)|or|onward to [Message resource files](message-resource-files.html)|
+|Return to [Processing Forms](processing-forms)|or|onward to [Message resource files](message-resource-files)|
diff --git a/source/getting-started/hello-world-using-struts2.md b/source/getting-started/hello-world-using-struts2.md
index 0a751b4..173e968 100644
--- a/source/getting-started/hello-world-using-struts2.md
+++ b/source/getting-started/hello-world-using-struts2.md
@@ -20,7 +20,7 @@ selects a resource to render the response. The resource is generally a server pa
 an Excel spreadsheet, or a Java applet window.
 
 Suppose you want to create a simple "Hello World" example that displays a welcome message. After setting up an empty 
-basic Struts 2 web application (see [How To Create A Struts 2 Web Application](how-to-create-a-struts2-web-application.html)), 
+basic Struts 2 web application (see [How To Create A Struts 2 Web Application](how-to-create-a-struts2-web-application)), 
 to create a "Hello World" example, you need to do four things:
 
 1. Create a class to store the welcome message (the model)
@@ -34,7 +34,7 @@ and the Controller. Separating concerns makes it easier to manage applications a
 Let's look at an example model class, Action, server page, and mapping. If you like, fire up your Java IDE, and enter 
 the code as we go.
 
-> This tutorial assumes you've completed the [How To Create A Struts 2 Web Application](how-to-create-a-struts2-web-application.html) 
+> This tutorial assumes you've completed the [How To Create A Struts 2 Web Application](how-to-create-a-struts2-web-application) 
 > tutorial and have a working basic Struts project. The example code for this tutorial, helloworld, is available for checkout 
 > from the Struts 2 GitHub repository at [struts-examples](https://github.com/apache/struts-examples). The example projects 
 > use Maven to manage the artifact dependencies and to build the .war files.
@@ -48,7 +48,7 @@ Let's modify the basic-struts project to add the following:
 - an Action class to act as the controller
 - a configuration that ties everything together
 
-> The [Struts 2 user mailing list](http://struts.apache.org/mail.html) is an excellent place to get help. If you are 
+> The [Struts 2 user mailing list](http://struts.apache.org/mail) is an excellent place to get help. If you are 
 > having a problem getting this application to work search the Struts 2 mailing list. If you don't find an answer 
 > to your problem, post a question on the mailing list.
 
@@ -234,7 +234,7 @@ Click on the Hello World link and you should get the HelloWorld.jsp page:
 Your browser sends to the web server a request for the URL [http://localhost:8080/helloworld/hello.action](http://localhost:8080/helloworld/hello.action).
 
 1. The container receives from the web server a request for the resource `hello.action`. According to the settings loaded 
-  from the [web.xml](../core-developers/web-xml.html), the container finds that all requests are being routed to 
+  from the [web.xml](../core-developers/web-xml), the container finds that all requests are being routed to 
   `org.apache.struts2.dispatcher.filter.StrutsPrepareAndExecuteFilter`, including the `*.action` requests. 
   The `StrutsPrepareAndExecuteFilter` is the entry point into the framework.
 2. The framework looks for an action mapping named "hello", and it finds that this mapping corresponds to the class 
@@ -256,4 +256,4 @@ a page (as in this example), another action, or some other web resource (image,
 When a server page is rendered, most often it will include dynamic data provided by the Action. To make it easy to display 
 dynamic data, the framework provides a set of tags that can be used along with HTML markup to create a server page.
 
-|Return to [How to create a Struts 2 web application](how-to-create-a-struts2-web-application.html)|or|onward to [Using Struts 2 Tags](using-tags.html)|
+|Return to [How to create a Struts 2 web application](how-to-create-a-struts2-web-application)|or|onward to [Using Struts 2 Tags](using-tags)|
diff --git a/source/getting-started/how-to-create-a-struts2-web-application.md b/source/getting-started/how-to-create-a-struts2-web-application.md
index 99e455d..5dc98e6 100644
--- a/source/getting-started/how-to-create-a-struts2-web-application.md
+++ b/source/getting-started/how-to-create-a-struts2-web-application.md
@@ -24,7 +24,7 @@ of many J2EE technologies, including:
  - Web Containers (such as Tomcat)
  - XML
 
-> For more about supporting technologies, see the [Key Technologies Primer](../primer.html). 
+> For more about supporting technologies, see the [Key Technologies Primer](../primer). 
 
 ## Java Requirements
 
@@ -177,7 +177,7 @@ You'll need to add a dependency node for log4j2 to the pom:
 </dependency>
 ```
 
-Using both `log4j-core` and `log4j-api` allows to use [the latest version of Log4j2](//logging.apache.org/log4j/2.x/maven-artifacts.html) without a clash with version provided by the framework. 
+Using both `log4j-core` and `log4j-api` allows to use [the latest version of Log4j2](//logging.apache.org/log4j/2.x/maven-artifacts) without a clash with version provided by the framework. 
 
 Optionally, if using maven bom "bill of materials" in `dependencyManagement` section for both Struts and log4j2,
 `pom.xml` will look like. Note that this way you can omit `version` line for every used module,
@@ -258,7 +258,7 @@ mapping to `web.xml`. Below is how the `web.xml` may look after adding the filte
 </web-app>
 ```
 
-For more information about configuring the deployment descriptor for Struts 2 see [Core Developers Guide / web.xml page](/core-developers/web-xml.html). Note the url-pattern node 
+For more information about configuring the deployment descriptor for Struts 2 see [Core Developers Guide / web.xml page](/core-developers/web-xml). Note the url-pattern node 
 value is `/*` meaning the Struts 2 filter will be applied to all URLs for this web application.
 
 ### Step 6 - Create struts.xml
@@ -317,8 +317,8 @@ messages written to the console and you should find several that discuss `index.
 
 ## Getting Help
 
-The [Struts 2 user mailing list](/mail.html) is an excellent place to get help.  If you are having a problem getting 
+The [Struts 2 user mailing list](/mail) is an excellent place to get help.  If you are having a problem getting 
 this Basic Struts 2 application to work search the Struts 2 mailing list. If you don't find an answer to your problem, 
 post a question on the mailing list.  
 
-|Return to [Getting started](index.html)|or|onward to [Hello World using Struts 2](hello-world-using-struts2.html)|
+|Return to [Getting started](index)|or|onward to [Hello World using Struts 2](hello-world-using-struts2)|
diff --git a/source/getting-started/http-session.md b/source/getting-started/http-session.md
index cee9c14..021b824 100644
--- a/source/getting-started/http-session.md
+++ b/source/getting-started/http-session.md
@@ -17,10 +17,10 @@ The example code for this tutorial, **http-session**, is available at [struts-ex
 ## Introduction
 
 Your Struts 2 application may need to access the HTTP session object. Struts 2 provides an interface, 
-[SessionAware]({{ site.apidocs }}/org/apache/struts2/interceptor/SessionAware.html), that your Action class 
+[SessionAware]({{ site.apidocs }}/org/apache/struts2/interceptor/SessionAware), that your Action class 
 should implement to obtain a reference to the HTTP session object.
 
-The [Struts 2 user mailing list](http://struts.apache.org/mail.html) is an excellent place to get help. If you are 
+The [Struts 2 user mailing list](http://struts.apache.org/mail) is an excellent place to get help. If you are 
 having a problem getting the tutorial example applications to work search the Struts 2 mailing list. If you don't find 
 an answer to your problem, post a question on the mailing list.
 
@@ -90,7 +90,7 @@ practices in the Action class that implements the SessionAware interface.
 
 1. Do not have a public `Map<String, Object> getSession` method in the Action class. You only need a public void 
   `setSession` method to implement the `SessionAware` interface.
-2. Also have the Action class implement the [ParameterNameAware interface]({{ site.apidocs }}/com/opensymphony/xwork2/interceptor/ParameterNameAware.html) 
+2. Also have the Action class implement the [ParameterNameAware interface]({{ site.apidocs }}/com/opensymphony/xwork2/interceptor/ParameterNameAware) 
   and override its acceptableParameterName method:
 
 **HelloWorldAction.java acceptableParameterName Method**
@@ -150,4 +150,4 @@ the `acceptableParameterName` method to mitigate a potential security vulnerabil
 that implement `SessionAware` then consider modifying the params interceptor's `excludeParams` value as part of your 
 Struts 2 package setup.
 
-|Return to [Unit Testing](unit-testing.html)|or|onward to [Preparable Interface](preperable-interface.html)|
+|Return to [Unit Testing](unit-testing)|or|onward to [Preparable Interface](preperable-interface)|
diff --git a/source/getting-started/index.md b/source/getting-started/index.md
index 8343a93..3fa6095 100644
--- a/source/getting-started/index.md
+++ b/source/getting-started/index.md
@@ -8,61 +8,61 @@ title: Getting started
 
 The framework documentation is written for active web developers and assumes a working knowledge 
 about how Java web applications are built. For more about the underlying nuts and bolts, see 
-the [Key Technologies Primer](/primer.html).
+the [Key Technologies Primer](/primer).
 
 Follow along with these tutorials to get started using Struts 2. The example code for the tutorials 
 available for checkout from the Struts 2 GitHub repository at [struts-examples](https://github.com/apache/struts-examples).
 The example projects use Maven to manage the artifact dependencies and to build the .war files.
 
 
-> The [Struts 2 user mailing list](/mail.html) is an excellent place to get help. If you are having a problem getting 
+> The [Struts 2 user mailing list](/mail) is an excellent place to get help. If you are having a problem getting 
 > the tutorial example applications to work search the Struts 2 mailing list. If you don't find an answer to your problem, 
 > post a question on the mailing list.
 
 ## Examples
 
-[How to create a Struts 2 web application](how-to-create-a-struts2-web-application.html)
+[How to create a Struts 2 web application](how-to-create-a-struts2-web-application)
 
-[Hello World Using Struts 2](hello-world-using-struts2.html)
+[Hello World Using Struts 2](hello-world-using-struts2)
 
-[Using Tags](using-tags.html)
+[Using Tags](using-tags)
 
-[Coding Actions](coding-actions.html) 
+[Coding Actions](coding-actions) 
 
-[Processing Forms](processing-forms.html) 
+[Processing Forms](processing-forms) 
 
-[Form Validation](form-validation.html) 
+[Form Validation](form-validation) 
 
-[Message Resource Files](message-resource-files.html) 
+[Message Resource Files](message-resource-files) 
 
-[Exception Handling](exception-handling.html)
+[Exception Handling](exception-handling)
 
-[Debugging Struts](debugging-struts.html)
+[Debugging Struts](debugging-struts)
 
-[Form Tags](form-tags.html)
+[Form Tags](form-tags)
 
-[Form Validation Using XML](form-validation-using-xml.html)
+[Form Validation Using XML](form-validation-using-xml)
 
-[Control Tags](control-tags.html)
+[Control Tags](control-tags)
 
-[Wildcard Method Selection](wildcard-method-selection.html)
+[Wildcard Method Selection](wildcard-method-selection)
 
-[Themes](themes.html)
+[Themes](themes)
 
-[Spring and Struts 2](spring.html)
+[Spring and Struts 2](spring)
 
-[Annotations](annotations.html)
+[Annotations](annotations)
 
-[Introducing Interceptors](introducing-interceptors.html)
+[Introducing Interceptors](introducing-interceptors)
 
-[Unit Testing](unit-testing.html)
+[Unit Testing](unit-testing)
 
-[HTTP Session](http-session.html)
+[HTTP Session](http-session)
 
-[Preparable Interface](preperable-interface.html)
+[Preparable Interface](preperable-interface)
 
-[Exclude Parameters](exclude-parameters.html)
+[Exclude Parameters](exclude-parameters)
 
 ## Extra tutorials
 
-[JasperReports Tutorial](jasper-reports-tutorial.html)
+[JasperReports Tutorial](jasper-reports-tutorial)
diff --git a/source/getting-started/introducing-interceptors.md b/source/getting-started/introducing-interceptors.md
index 3fb3fa1..d442389 100644
--- a/source/getting-started/introducing-interceptors.md
+++ b/source/getting-started/introducing-interceptors.md
@@ -37,7 +37,7 @@ The above list of tasks are not complete - several other tasks are done before a
 The benefit of using Struts 2 is all this work happens automatically. You can focus on the logic of the controller 
 (the Struts 2 ActionSupport class), the Service layer, the data access layer, your domain models, etc.
 
-The [Struts 2 user mailing list](http://struts.apache.org/mail.html) is an excellent place to get help. If you are 
+The [Struts 2 user mailing list](http://struts.apache.org/mail) is an excellent place to get help. If you are 
 having a problem getting the tutorial example applications to work search the Struts 2 mailing list. If you don't find 
 an answer to your problem, post a question on the mailing list.
 
@@ -51,13 +51,13 @@ a value of "struts-default." The value "struts-default" identifies to the framew
 that will be executed before and after the Actions in that package.
 
 If you want to learn more about the inner workings of interceptors, what interceptors belong to the struts default stack, 
-and what are all the interceptors included with Struts 2, visit [Understanding Interceptors](../core-developers/interceptors.html) .
+and what are all the interceptors included with Struts 2, visit [Understanding Interceptors](../core-developers/interceptors) .
 
 Sometime the Struts 2 default stack of interceptors are not exactly what you need for a particular action. You may want 
 to use interceptors that are not part of the Struts 2 default stack. For an individual Action or for the entire 
 package of Actions, you can specify a different stack of interceptors that the Action or package should use. Below is 
-how you would specify that the register Action should use both the [logger](../core-developers/logging-interceptor.html) 
-and [timer](../core-developers/timer-interceptor.html) interceptors in addition to the interceptors provided by the default stack.
+how you would specify that the register Action should use both the [logger](../core-developers/logging-interceptor) 
+and [timer](../core-developers/timer-interceptor) interceptors in addition to the interceptors provided by the default stack.
 
 **Specify Specific Interceptors For An Action**
 
@@ -83,14 +83,14 @@ Action we are instructing the framework to use the `timer`, `logger`, and `defau
 are all the interceptors normally executed for an Action.
 
 How did I know to use the value of timer for the name attribute and even that there is a timer interceptor? 
-On the [Interceptors](../core-developers/interceptors.html) web page in the Struts 2 documentation are a list of interceptors 
+On the [Interceptors](../core-developers/interceptors) web page in the Struts 2 documentation are a list of interceptors 
 that come with the Struts 2 framework and what the name value is for each interceptor.
 
 How did I know that the timer interceptor isn't part of the defaultStack of interceptors already? Again on the Interceptors 
 documentation web page is a list of which interceptors belong to the `defaultStack`.
 
 Note the param nodes. These nodes are used to provide a value to the setLogEnabled and setLogLevel methods 
-of the [Exception Interceptor](../core-developers/exception-interceptor.html). Providing the values of true and ERROR 
+of the [Exception Interceptor](../core-developers/exception-interceptor). Providing the values of true and ERROR 
 will cause the Struts 2 framework to log any exceptions not caught by the application's code and to log those exceptions 
 at the ERROR level.
 
@@ -143,7 +143,7 @@ the `logger` and `timer` interceptors would have executed.
 ## Create Your Own Interceptor
 
 In addition to specifying your own stack of interceptors, you can also write your own new interceptor and add it to 
-the stack that is executed. The Struts [Writing Interceptors](../core-developers/writing-interceptors.html) guide explains 
+the stack that is executed. The Struts [Writing Interceptors](../core-developers/writing-interceptors) guide explains 
 how to do this. For example, you could create your own interceptor to handle authentication and authorization.
 
 ## Summary
@@ -151,4 +151,4 @@ how to do this. For example, you could create your own interceptor to handle aut
 Interceptors provide the Struts 2 framework with both power and flexibility. Developers may add additional interceptors 
 (either ones provided by Struts 2 or ones they create) to the stack of interceptors executed when an Action class is called.
 
-|Return to [Annotations](annotations.html)|or|onward to [Unit Testing](unit-testing.html)|
+|Return to [Annotations](annotations)|or|onward to [Unit Testing](unit-testing)|
diff --git a/source/getting-started/message-resource-files.md b/source/getting-started/message-resource-files.md
index 5861f5d..b81a7c1 100644
--- a/source/getting-started/message-resource-files.md
+++ b/source/getting-started/message-resource-files.md
@@ -12,7 +12,7 @@ parent:
 * Will be replaced with the ToC, excluding a header
 {:toc}
 
-This tutorial assumes you've completed the [Form Validation](form-validation.html) tutorial and have a working 
+This tutorial assumes you've completed the [Form Validation](form-validation) tutorial and have a working 
 **form-validation** project. The example code for this tutorial, **message-resource**, is available for checkout from the 
 Struts 2 GitHub repository at [struts-examples](https://github.com/apache/struts-examples).
 
@@ -22,7 +22,7 @@ In this tutorial we'll explore using Struts 2 message resource capabilities (als
 resources provide a simple way to put text in a view page that is the same throughout your application, to create form 
 field labels, and to change text to a specific language based on the user's locale (i18n).
 
-The [Struts 2 user mailing list](http://struts.apache.org/mail.html) is an excellent place to get help. If you are having 
+The [Struts 2 user mailing list](http://struts.apache.org/mail) is an excellent place to get help. If you are having 
 a problem getting the tutorial example applications to work search the Struts 2 mailing list. If you don't find an answer 
 to your problem, post a question on the mailing list.
 
@@ -33,7 +33,7 @@ a properties file with the same name as the Action class and having the .propert
 go in the same package as the Action class. For our tutorial example, let's say we want to place the form field labels 
 into a separate file where we can easily change them and also provide the capability to display the labels in other languages.
 
-If you're doing this tutorial after completing [Form Validation](form-validation.html) then you can make these changes 
+If you're doing this tutorial after completing [Form Validation](form-validation) then you can make these changes 
 to that tutorial's example application.
 
 Put the text below in a file named Register.properties in the `org.apache.struts.register.action` package 
@@ -55,11 +55,11 @@ the key name.
 
 ## Struts 2 Key Attribute
 
-The Struts 2 key attribute can be used in the [textfield](../tag-developers/textfield-tag.html) tag to instruct 
+The Struts 2 key attribute can be used in the [textfield](../tag-developers/textfield-tag) tag to instruct 
 the framework what value to use for the textfield's name and label attributes. Instead of providing those attributes 
 and their values directly, you can just use the key attribute.
 
-If you open register.jsp from the [Form Validation](form-validation.html) tutorial you'll see this Struts 2 textfield tag:
+If you open register.jsp from the [Form Validation](form-validation) tutorial you'll see this Struts 2 textfield tag:
 
 **textfield tag**
 
@@ -81,7 +81,7 @@ to find a key in a properties file with the same value. So in our example, Strut
 for a key with a value of `personBean.firstName`. The value of that key (`First name`) will be used as the label attribute's value.
 
 To enable the key attribute to find the properties file, the display of the view page must be the result of executing 
-a Struts 2 Action class. Right now if you examine index.jsp from the [Form Validation](form-validation.html) tutorial 
+a Struts 2 Action class. Right now if you examine index.jsp from the [Form Validation](form-validation) tutorial 
 the link to the `register.jsp` page is a standard URL.
 
 **link to register.jsp**
@@ -293,4 +293,4 @@ We've covered how to use message resources (resource bundles) in Struts 2 and al
 internationalization (i18n) in this tutorial. To fully understand these concepts and learn more about Struts 2 consult 
 the main Struts 2 documentation available at [http://struts.apache.org](http://struts.apache.org).
 
-|Return to [Form validation](form-validation.html)|or|onward to [Exception handling](exception-handling.html)|
+|Return to [Form validation](form-validation)|or|onward to [Exception handling](exception-handling)|
diff --git a/source/getting-started/preperable-interface.md b/source/getting-started/preperable-interface.md
index 4649d37..2755c79 100644
--- a/source/getting-started/preperable-interface.md
+++ b/source/getting-started/preperable-interface.md
@@ -26,15 +26,15 @@ look-up that that is accomplished in the Action class's input method. Since the
 re-executed when validation fails, the view page may no longer have access to the correct information to create the form 
 or other display information.
 
-The [Struts 2 user mailing list](http://struts.apache.org/mail.html) is an excellent place to get help. If you are having 
+The [Struts 2 user mailing list](http://struts.apache.org/mail) is an excellent place to get help. If you are having 
 a problem getting the tutorial example applications to work search the Struts 2 mailing list. If you don't find an answer 
 to your problem, post a question on the mailing list.
 
 ## Preparable Interface
 
-Struts 2 provides the [Preparable interface](../maven/struts2-core/apidocs/com/opensymphony/xwork2/Preparable.html)
+Struts 2 provides the [Preparable interface](../maven/struts2-core/apidocs/com/opensymphony/xwork2/Preparable)
 to overcome this problem. An Action class that implements this interface must override the prepare method. The `prepare` 
-method will always be called by the Struts 2 framework's [prepare interceptor](../core-developers/prepare-interceptor.html) 
+method will always be called by the Struts 2 framework's [prepare interceptor](../core-developers/prepare-interceptor) 
 whenever any method is called for the Action class and also when validation fails before the view is rendered.
 
 In the `prepare` method you should put any statements that must be executed no matter what other Action class method will 
@@ -42,7 +42,7 @@ be called and also statements that should be executed if validation fails. Usual
 the value for Action class instance fields that will be used to populate form controls and get the values that will be 
 used to set the initial form field values.
 
-In addition to automatically running the prepare method the [prepare interceptor](../core-developers/prepare-interceptor.html) 
+In addition to automatically running the prepare method the [prepare interceptor](../core-developers/prepare-interceptor) 
 will also call a method named `prepare<ActionMethodName>`. For example, define a prepare method and a `prepareInput` method 
 in the Action class that implements `Preparable`. When the Struts 2 framework calls the input method, the prepare interceptor 
 will call the prepareInput and the prepare methods before calling the input method.
@@ -72,4 +72,4 @@ the `Preparable` interface and the prepare method.
 When your application requires specific statements to be executed no matter which method of the Action class is called 
 or when validation fails, you should implement the Preparable interface and override the prepare method.
 
-|Return to [HTTP Session](http-session.html)|or|onward to [Exclude Parameters](exclude-parameters.html)|
+|Return to [HTTP Session](http-session)|or|onward to [Exclude Parameters](exclude-parameters)|
diff --git a/source/getting-started/processing-forms.md b/source/getting-started/processing-forms.md
index 36fcb3c..1579d69 100644
--- a/source/getting-started/processing-forms.md
+++ b/source/getting-started/processing-forms.md
@@ -12,7 +12,7 @@ parent:
 * Will be replaced with the ToC, excluding a header
 {:toc}
 
-This tutorial assumes you've completed the [Coding Struts 2 Actions](coding-actions.html) tutorial and have a working 
+This tutorial assumes you've completed the [Coding Struts 2 Actions](coding-actions) tutorial and have a working 
 **coding-actions** project. The example code for this tutorial, **form-processing**, is available for checkout from 
 the Struts 2 GitHub repository [struts-examples](https://github.com/apache/struts-examples).
 
@@ -21,10 +21,10 @@ the Struts 2 GitHub repository [struts-examples](https://github.com/apache/strut
 In this tutorial we'll explore using Struts 2 to do more involved processing of a form submission. We'll cover how to 
 use a Java model class to store the form input and how to create the Struts 2 form to match up with that model class.
 
-The code provided in this tutorial may be added to the [Coding Struts 2 Actions](coding-actions.html) example or you 
+The code provided in this tutorial may be added to the [Coding Struts 2 Actions](coding-actions) example or you 
 can download this complete example from the github respository - [https://github.com/apache/struts-examples](https://github.com/apache/struts-examples).
 
-The [Struts 2 user mailing list](http://struts.apache.org/mail.html) is an excellent place to get help. If you are 
+The [Struts 2 user mailing list](http://struts.apache.org/mail) is an excellent place to get help. If you are 
 having a problem getting the tutorial example applications to work search the Struts 2 mailing list. If you don't find 
 an answer to your problem, post a question on the mailing list.
 
@@ -35,7 +35,7 @@ business rules state the user must provide his/her first name, last name, email
 
 To encapsulate this data, we'll use a simple Java class that follows the basic Java Bean specifications (public set/get 
 methods for each instance field). If you're following along add this class to the package `org.apache.struts.register.model` 
-in the [Coding Struts 2 Actions](coding-actions.html) example.
+in the [Coding Struts 2 Actions](coding-actions) example.
 
 **Person.java**
 
@@ -142,7 +142,7 @@ value ("25") the user entered for the age form field to 25 when calling the `set
 
 When the user clicks on the submit button of the above form, the action "register" and the form data will be sent to 
 the Struts 2 framework. We need an Action class to process this form. If you recall from the tutorial 
-[Coding Struts 2 Actions](coding-actions.html) our Action class should extend the Struts 2 ActionSupport class.
+[Coding Struts 2 Actions](coding-actions) our Action class should extend the Struts 2 ActionSupport class.
 
 Here is the Action class used for this example. Place it in package org.apache.struts.register.action.
 
@@ -226,7 +226,7 @@ registration. Add the `thankyou.jsp` below to `src/main/webapp`.
 </html>
 ```
 
-If you don't recall how the Struts 2 property and url tags work consult the [Using Struts 2 Tags](using-tags.html) tutorial.
+If you don't recall how the Struts 2 property and url tags work consult the [Using Struts 2 Tags](using-tags) tutorial.
 
 ## Create action mapping in struts.xml
 
@@ -273,4 +273,4 @@ Fill out the form and click the submit button. You should then see the `thankyou
 
 ![thanyoujsp.png](attachments/att14975000_thanyoujsp.png)
 
-|Return to [Coding Struts 2 Actions](coding-actions.html)|or|onward to [Form validation](form-validation.html)|
+|Return to [Coding Struts 2 Actions](coding-actions)|or|onward to [Form validation](form-validation)|
diff --git a/source/getting-started/spring.md b/source/getting-started/spring.md
index 77d7b7b..df67d53 100644
--- a/source/getting-started/spring.md
+++ b/source/getting-started/spring.md
@@ -25,11 +25,11 @@ and Spring together to manage the dependencies between your ActionSupport classe
 > This tutorial assumes you understand how to use the Spring framework to manage dependencies between classes. You can 
 > learn more about Spring by reading the documentation at [https://spring.io/docs](https://spring.io/docs)
 
-The [Struts 2 user mailing list](http://struts.apache.org/mail.html) is an excellent place to get help. If you are having 
+The [Struts 2 user mailing list](http://struts.apache.org/mail) is an excellent place to get help. If you are having 
 a problem getting the tutorial example applications to work search the Struts 2 mailing list. If you don't find an answer 
 to your problem, post a question on the mailing list.
 
-If you examine the example application for the [Struts 2 Themes](themes.html) tutorial you'll see this code in the 
+If you examine the example application for the [Struts 2 Themes](themes) tutorial you'll see this code in the 
 `EditAction` class
 
 **EditAction Class Hard-Coded Dependency**
@@ -174,4 +174,4 @@ In this tutorial we reviewed how to use the Struts 2 Spring plugin to integrate
 Spring plugin you can have Spring manage the dependencies of your ActionSupport classes. Of course you can also take 
 advantage of the many other benefits (AOP, Spring JDBC) that the Spring framework provides.
 
-|Return to [Themes](themes.html)|or|onward to [Annotations](annotations.html)|
+|Return to [Themes](themes)|or|onward to [Annotations](annotations)|
diff --git a/source/getting-started/themes.md b/source/getting-started/themes.md
index 4d17759..6f97385 100644
--- a/source/getting-started/themes.md
+++ b/source/getting-started/themes.md
@@ -21,7 +21,7 @@ the appearance and controls the layout of the select control. The style and layo
 is set for the tag. Struts 2 comes with three built-in themes: `simple`, `xhtml`, and `css_xhtml`. If you don’t specify 
 a theme, then Struts 2 will use the `xhtml` theme by default.
 
-The [Struts 2 user mailing list](http://struts.apache.org/mail.html) is an excellent place to get help. If you are having 
+The [Struts 2 user mailing list](http://struts.apache.org/mail) is an excellent place to get help. If you are having 
 a problem getting the tutorial example applications to work search the Struts 2 mailing list. If you don't find an answer 
 to your problem, post a question on the mailing list.
 
@@ -60,9 +60,9 @@ select tag the default `xhmtl` theme was used.
 
 The Struts 2 tags have a theme attribute you can use to specify which Struts 2 theme should be used when creating the HTML 
 for that tag. The values for the theme attribute are `simple`, `xhtml`, `css_xhtml`, and `ajax`. To learn more about these themes 
-visit [Themes and Templates Documentation](../tag-developers/themes-and-templates.html). This tutorial will review 
+visit [Themes and Templates Documentation](../tag-developers/themes-and-templates). This tutorial will review 
 the `xhtml`, `css_xhtml`, and the `simple` themes. The `ajax` theme is a special theme used for ajax operations 
-(see [Ajax Theme in the documentation](../tag-developers/ajax-theme.html)).
+(see [Ajax Theme in the documentation](../tag-developers/ajax-theme)).
 
 You can specify the theme on a per Struts 2 tag basis or you can use one of the following methods to specify what theme 
 Struts 2 should use:
@@ -75,7 +75,7 @@ Struts 2 should use:
 6. The application-scoped attribute named `theme`
 7. The `struts.ui.theme` constant in `struts.xml` (defaults to `xhtml`)
 
-Consult [Selecting Themes](../tag-developers/selecting-themes.html) for how to set the theme using the above approaches.
+Consult [Selecting Themes](../tag-developers/selecting-themes) for how to set the theme using the above approaches.
 
 In the example application, examine `edit.jsp`. The theme attribute of the form tag is set to `xhtml`. Run the application 
 (see the readme.txt file) and view the source for edit.jsp after it is rendered in your browser. You should see the form 
@@ -196,6 +196,6 @@ if you include your own theme folder (e.g. KUTheme) under webapp/template (or We
 and specify that folder name (e.g. KUTheme) as the value for the theme attribute, then the Struts 2 framework will look 
 in that theme folder for the tag's template.
 
-To learn more about how to use the Struts 2 themes and how you can override them, visit [Themes and Templates Documentation](../tag-developers/themes-and-templates.html) .
+To learn more about how to use the Struts 2 themes and how you can override them, visit [Themes and Templates Documentation](../tag-developers/themes-and-templates) .
 
-|Return to [Wildcard method selection](wildcard-method-selection.html)|or|onward to [Spring and Struts 2](spring.html)|
+|Return to [Wildcard method selection](wildcard-method-selection)|or|onward to [Spring and Struts 2](spring)|
diff --git a/source/getting-started/unit-testing.md b/source/getting-started/unit-testing.md
index 4b07788..7f4541f 100644
--- a/source/getting-started/unit-testing.md
+++ b/source/getting-started/unit-testing.md
@@ -20,7 +20,7 @@ Struts 2 supports running unit tests of methods in the Struts Action class with
 The JUnit plugin allows you to test methods of an Action class from within the Struts 2 framework. The Struts Servlet 
 -filter and interceptors fire just as if your application was running on a Servlet container.
 
-The [Struts 2 user mailing list](http://struts.apache.org/mail.html) is an excellent place to get help. If you are having 
+The [Struts 2 user mailing list](http://struts.apache.org/mail) is an excellent place to get help. If you are having 
 a problem getting the tutorial example applications to work search the Struts 2 mailing list. If you don't find an answer 
 to your problem, post a question on the mailing list.
 
@@ -42,8 +42,8 @@ class extend StrutsTestCase (see RegisterTest class in the example application).
 
 Note that the Struts 2 JUnit plugin can be used to design unit tests of other Action class methods such as the input method 
 and also to test methods of a custom interceptor you add to the interceptor stack. Also in this example, the test is 
-for validation performed in the [validate method](form-validation.html) . But the same type of test would work if the validation 
-was done using [XML file validation](form-validation-using-xml.html).
+for validation performed in the [validate method](form-validation) . But the same type of test would work if the validation 
+was done using [XML file validation](form-validation-using-xml).
 
 To test the validate method we want Struts to call the Struts action that will cause the Action class's validate and execute 
 methods to be run. In the example application this action is register.
@@ -154,4 +154,4 @@ with the Struts 2 framework. If your Struts 2 application uses Spring to inject
 the Struts 2 JUnit Plugin has a StrutsSpringTestCase that your test class should extend. Please read [Testing Actions](../plugins/junit/) 
 to learn more.
 
-|Return to [Introducing Interceptors](introducing-interceptors.html)|or|onward to [HTTP Session](http-session.html)|
+|Return to [Introducing Interceptors](introducing-interceptors)|or|onward to [HTTP Session](http-session)|
diff --git a/source/getting-started/using-tags.md b/source/getting-started/using-tags.md
index 88b6966..5fe0411 100644
--- a/source/getting-started/using-tags.md
+++ b/source/getting-started/using-tags.md
@@ -12,12 +12,12 @@ parent:
 * Will be replaced with the ToC, excluding a header
 {:toc}
 
-This tutorial assumes you've completed the [Hello World](hello-world-using-struts2.html) tutorial and have a working 
+This tutorial assumes you've completed the [Hello World](hello-world-using-struts2) tutorial and have a working 
 **helloworld** project. The example code for this tutorial, **using-tags**, is available for checkout from the Struts 2 GitHub 
 repository at [struts-examples](https://github.com/apache/struts-examples). The example projects use Maven to manage 
 the artifact dependencies and to build the .war files.
 
-In the [Hello World](hello-world-using-struts2.html) lesson, we added a Struts 2 url tag to the `index.jsp` to create 
+In the [Hello World](hello-world-using-struts2) lesson, we added a Struts 2 url tag to the `index.jsp` to create 
 a hyperlink to the `hello.action`. This tutorial will explore the url and other Struts 2 tags further.
 
 Web applications differ from conventional websites in that web applications can create a dynamic response. To make it 
@@ -35,9 +35,9 @@ One use of the Struts 2 Tags is to create links to other web resources, especial
 While HTML provides a simple a tag for creating hyperlinks, the HTML tag often requires us to include redundant information. 
 Also the HTML tag cannot easily access dynamic data provided by the framework.
 
-A very common use case in web applications is linking to other pages. In the [Hello World](hello-world-using-struts2.html) 
+A very common use case in web applications is linking to other pages. In the [Hello World](hello-world-using-struts2) 
 tutorial we added a link to `hello.action` inside the `index.jsp` using the Struts 2 url tag. Please refer 
-to the [url documentation](../tag-developers/url-tag.html) for more information about the url tag.
+to the [url documentation](../tag-developers/url-tag) for more information about the url tag.
 
 **index.jsp**
 
@@ -108,7 +108,7 @@ In the next tutorial we'll cover how Struts can access the query string paramete
 ## Struts 2 Form Tag
 
 Most applications will use several data entry forms. The Struts 2 tags make creating input forms easy. 
-Consult the [Form Tags Reference](../tag-developers/form-tags.html) for all the details about the Struts 2 form tags.
+Consult the [Form Tags Reference](../tag-developers/form-tags) for all the details about the Struts 2 form tags.
 
 Each of the Struts 2 form tags has numerous attributes to mimic the normal HTML form tag attributes.
 
@@ -163,7 +163,7 @@ In the next tutorial we'll cover how to use Struts 2 to process this form submis
 
 ## Struts 2 property tag
 
-In the [Hello World](hello-world-using-struts2.html) tutorial's example application on JSP `HelloWorld.jsp` was this code:
+In the [Hello World](hello-world-using-struts2) tutorial's example application on JSP `HelloWorld.jsp` was this code:
 
 **Struts Property Tag**
 
@@ -174,7 +174,7 @@ In the [Hello World](hello-world-using-struts2.html) tutorial's example applicat
 The most common use of the property tag is to "get" the value returned by calling a public get method (of the Action class) 
 and then to include that value in the HTML returned to the browser.
 
-As discussed in the [Hello World](hello-world-using-struts2.html) tutorial, the value of `messageStore.message` instructs 
+As discussed in the [Hello World](hello-world-using-struts2) tutorial, the value of `messageStore.message` instructs 
 Struts 2 to first call method `getMessageStore` of the Action class. That method call returns a `MessageStore` object. 
 The `.message` part instructs Struts 2 to call the `getMessage` method of the `MessageStore` object. The `getMessage` 
 method returns a String which will be included in the HTML returned to the browser.
@@ -246,6 +246,6 @@ method of class `MessageStore`. The string returned by that `toString` method wi
 ![using_tags_hello.png](attachments/using_tags_hello.png)
 
 We covered a lot in this tutorial, but we've really only scratched the surface of how to use the Struts 2 tags. 
-Consult the [Struts 2 Tag Reference](../tag-developers/tag-reference.html) for much more information about all the Struts 2 tags.
+Consult the [Struts 2 Tag Reference](../tag-developers/tag-reference) for much more information about all the Struts 2 tags.
 
-|Return to [Hello World using Struts 2](hello-world-using-struts2.html)|or|onward to [Coding Struts 2 Actions](coding-actions.html)|
+|Return to [Hello World using Struts 2](hello-world-using-struts2)|or|onward to [Coding Struts 2 Actions](coding-actions)|
diff --git a/source/getting-started/wildcard-method-selection.md b/source/getting-started/wildcard-method-selection.md
index 7d483c3..1a01f29 100644
--- a/source/getting-started/wildcard-method-selection.md
+++ b/source/getting-started/wildcard-method-selection.md
@@ -16,19 +16,28 @@ The example code for this tutorial, **wildcard-method-selection**, is available
 
 ## Introduction
 
-In this tutorial we'll cover how to configure an action node in the struts.xml configuration file so that one action node can be used to relate several different Action URLs to specific methods of the Action class. This will reduce the number of action nodes we must write in the struts.xml configuration file.
+In this tutorial we'll cover how to configure an action node in the struts.xml configuration file so that one action 
+node can be used to relate several different Action URLs to specific methods of the Action class. This will reduce 
+the number of action nodes we must write in the struts.xml configuration file.
 
-The [Struts 2 user mailing list](http://struts.apache.org/mail.html) is an excellent place to get help. If you are having a problem getting the tutorial example applications to work search the Struts 2 mailing list. If you don't find an answer to your problem, post a question on the mailing list.
+The [Struts 2 user mailing list](http://struts.apache.org/mail) is an excellent place to get help. If you are having 
+a problem getting the tutorial example applications to work search the Struts 2 mailing list. If you don't find an answer 
+to your problem, post a question on the mailing list.
 
 ## Example Application
 
 ![Screen shot 2010-05-30 at 8.51.40 AM.png](attachments/att21921805_Screen shot 2010-05-30 at 8.51.40 AM.png)
 
-The example application that supports this tutorial shows how to use Struts 2's wildcard method selection methodology. The example application is just a simple one that lists some people and lets you edit them, delete them, and add a new person to the list. Everything that the application needs to do with a `Person` (the model class) is controlled by the Struts 2 `ActionSupport` class `PersonAction`. The `PersonAction` class has several different methods (e.g. create, edit, delete) that  [...]
+The example application that supports this tutorial shows how to use Struts 2's wildcard method selection methodology. 
+The example application is just a simple one that lists some people and lets you edit them, delete them, and add 
+a new person to the list. Everything that the application needs to do with a `Person` (the model class) is controlled 
+by the Struts 2 `ActionSupport` class `PersonAction`. The `PersonAction` class has several different methods 
+(e.g. create, edit, delete) that are called depending on what the user wants to do.
 
 ## Wildcard Method Selection
 
-Without using the wildcard method selection technique, I'd have to write an action mapping node in the Struts 2 configuration file for each separate action I'd want to call. For example:
+Without using the wildcard method selection technique, I'd have to write an action mapping node in the Struts 2 
+configuration file for each separate action I'd want to call. For example:
 
 **Struts.xml Action Configuration**
 
@@ -44,9 +53,13 @@ Without using the wildcard method selection technique, I'd have to write an acti
 </action>
 ```
 
-So even for this simple application, I'd have to write four separate action mapping nodes (create, edit, delete, saveOrUpdate) in the configuration file. So you can easily see that a more complex application can have dozens of action mapping nodes.
+So even for this simple application, I'd have to write four separate action mapping nodes (create, edit, delete, 
+saveOrUpdate) in the configuration file. So you can easily see that a more complex application can have dozens of action 
+mapping nodes.
 
-To implement the wildcard method selection technique to enable the Struts 2 framework to dynamically select the correct method to call at runtime you just need to use the wildcard character, *, in your name value and an attribute value place holder ( `{1}` ) for the method value. For example:
+To implement the wildcard method selection technique to enable the Struts 2 framework to dynamically select the correct 
+method to call at runtime you just need to use the wildcard character, *, in your name value and an attribute value 
+placeholder ( `{1}` ) for the method value. For example:
 
 **Struts.xml Action Configuration Using Wildcard Method Selection**
 
@@ -57,7 +70,9 @@ To implement the wildcard method selection technique to enable the Struts 2 fram
 </action>
 ```
 
-The `*` is the wildcard character. Any action name values that end in "Person" will be handled by this action mapping. Whatever value is before "Person" will be the value used for the method attribute (the `{1}` place holder will be replaced with that value). For example this URL:
+The `*` is the wildcard character. Any action name values that end in "Person" will be handled by this action mapping. 
+Whatever value is before "Person" will be the value used for the method attribute (the `{1}` plac holder will be replaced
+with that value). For example this URL:
 
 [http://localhost:8080/wildcard-method-selection/createPerson.action](http://localhost:8080/wildcard-method-selection/createPerson.action)
 
@@ -75,12 +90,17 @@ If there is no value in front of Person, then the Struts 2 framework will call t
 
 ## Dynamic Method Invocation
 
-The wildcard method selection technique explained above should not be confused with the "Dynamic Method Invocation" technique. The Struts 2 documentation explains this technique (which uses the bang, `!`, operator in the action name) and recommends against using the "Dynamic Method Invocation" technique due to security and other reasons related to how this technique is implemented internally.
+The wildcard method selection technique explained above should not be confused with the "Dynamic Method Invocation" 
+technique. The Struts 2 documentation explains this technique (which uses the bang, `!`, operator in the action name) 
+and recommends against using the "Dynamic Method Invocation" technique due to security and other reasons related to how 
+this technique is implemented internally.
 
-The Struts 2 documentation also recommends turning off the option to use the dynamic method invocation by setting `struts.enable.DynamicMethodInvocation` to `FALSE` in the Struts configuration.
+The Struts 2 documentation also recommends turning off the option to use the dynamic method invocation by setting 
+`struts.enable.DynamicMethodInvocation` to `FALSE` in the Struts configuration.
 
 ## Summary
 
-By using the wildcard method selection technique explained above, you can significantly reduce the number of action mapping nodes you need to write and manage in the Struts 2 XML configuration file.
+By using the wildcard method selection technique explained above, you can significantly reduce the number of action 
+mapping nodes you need to write and manage in the Struts 2 XML configuration file.
 
-|Return to [Form validation using XML](form-validation-using-xml.html)|or|onward to [Themes](themes.html)|
+|Return to [Form validation using XML](form-validation-using-xml)|or|onward to [Themes](themes)|
diff --git a/source/helping.md b/source/helping.md
index 0a67e1f..334e66e 100644
--- a/source/helping.md
+++ b/source/helping.md
@@ -25,7 +25,7 @@ title: Helping
   If an Apache Struts product doesn't do what *you* want, it's up to **you** to step up and propose the patch.
   If an Apache Struts product doesn't ship as often as you would like, it's up to you to step up with
   the tests and fixes that get a release out the door.
-  [(Like Craig McClanahan did for Tomcat)](http://jakarta.apache.org/site/contributing.html).
+  [(Like Craig McClanahan did for Tomcat)](http://jakarta.apache.org/site/contributing).
 
   If Struts does do what you want, help others become involved by turning your war stories into FAQs
   and how-tos that we can make part of the [documentation](#documentation).
@@ -48,7 +48,7 @@ title: Helping
   the official Java coding conventions plus the rule to favor spaces over tabs for indenting. See more
   details at [Struts 2 Coding Conventions (Wiki)](https://cwiki.apache.org/confluence/display/S2WIKI/Struts+2+Coding+Conventions)
 
-  To create a patch, you first have to [checkout](git-for-struts.html) a copy of the source code
+  To create a patch, you first have to [checkout](git-for-struts) a copy of the source code
   or documentation from the main repository. You can then change your copy, and create the patch using a simple
   [Git](http://git-scm.com/) command, like this:
 
@@ -62,7 +62,7 @@ title: Helping
   losing things, and helps to ensure that your patch will be attended.
 
 
-  The [NetBeans community](http://www.netbeans.org/community/contribute/patches.html) also has a helpful section on the
+  The [NetBeans community](http://www.netbeans.org/community/contribute/patches) also has a helpful section on the
   subject of creating patches.
 
   - ### How can I report defects or suggest features? {#issues}
@@ -72,7 +72,7 @@ title: Helping
   Please select the appropriate Apache Struts product from the list, and then select the component to which
   you feel this report relates. You will automatically be notified by email as the status of your defect or
   enhancement report changes. Please be sure to read
-  [How to Report Bugs Effectively](http://www.chiark.greenend.org.uk/~sgtatham/bugs.html)
+  [How to Report Bugs Effectively](http://www.chiark.greenend.org.uk/~sgtatham/bugs)
   before posting a report.
 
   If you can't write a [patch](#patches) to address your issue, a unit test that demonstrates the problem is also welcome.
@@ -120,7 +120,7 @@ title: Helping
 
   Other ways to help out with the documentation is to just leave a comment on a page that needs fixing.
   If you have a cwiki Confluence account, you can also create pages on the
-  [Struts 2 Wiki](http://cwiki.apache.org/S2WIKI/home.html) without filing a CLA.
+  [Struts 2 Wiki](http://cwiki.apache.org/S2WIKI/home) without filing a CLA.
 
   If you are submitting new material, it is important to decide exactly where you would put this
   in relation to the rest of the documentation.
@@ -217,6 +217,6 @@ title: Helping
   or discretely decline.
   If the candidate is able to accept, the PMC will announce the new member on the dev list.
 
-  For more about decision-making, see [How the ASF Works](https://www.apache.org/foundation/how-it-works.html)
-  and the [Apache Struts Charter](bylaws.html). For more about project infrastructure,
+  For more about decision-making, see [How the ASF Works](https://www.apache.org/foundation/how-it-works)
+  and the [Apache Struts Charter](bylaws). For more about project infrastructure,
   see "Project Maintenance and Resources" in the [Struts 1 wiki](http://wiki.apache.org/struts/).
diff --git a/source/kickstart.md b/source/kickstart.md
index 4fba7c3..844c697 100644
--- a/source/kickstart.md
+++ b/source/kickstart.md
@@ -13,17 +13,17 @@ title: Kickstart FAQ
 
 ### I'm new to Apache Struts. How do I get started?
 
-The best place to start is with the "best available" [release](releases.html).
+The best place to start is with the "best available" [release](releases).
 If you are new to Java or web development, as well as Apache Struts, be sure to review the
-[Key Technologies Primer](primer.html).
+[Key Technologies Primer](primer).
 
 The main Struts web site includes documentation for the latest "General Availability" release
 in each major release series. The development section of the site inclues draft documentation
 for upcoming releases. If you are just getting started, focus on the latest General
-Availability release, Documentation for past [releases](releases.html) is also available.
+Availability release, Documentation for past [releases](releases) is also available.
 
 If you have questions, you can search the [User Mailing List archives](mail.html#archives),
-or [post your own question to the list](mail.html). (Plain old Google usually works too!)
+or [post your own question to the list](mail). (Plain old Google usually works too!)
 
 ### Looking at the releases page, some versions seem to be missing. What happened to them?
 {:#releases}
@@ -72,14 +72,14 @@ Required if you've used the source code to create your own server that you are r
 
 ### Are there ISPs that will host my Java web application?
 
-For a listing of some Java and Struts ISPs, visit the [Struts Community Resources](http://struts.sf.net/community/index.html)
+For a listing of some Java and Struts ISPs, visit the [Struts Community Resources](http://struts.sf.net/community/index)
 area on SourceForge.
 
 ### Is there a particularly good IDE to use?
 
 The frameworks should work well with any development environment that you would like to use, as well as with any
 programmers editor. The members of the Apache Struts development group each use their own tools such as
-[Emacs](http://www.gnu.org/software/emacs/emacs.html), [IntelliJ IDEA](http://www.jetbrains.com/idea/),
+[Emacs](http://www.gnu.org/software/emacs/emacs), [IntelliJ IDEA](http://www.jetbrains.com/idea/),
 [Eclipse](http://www.eclipse.org/), and [NetBeans](http://www.netbeans.org/).
 
 For more, see the [IDE discussion page](http://wiki.apache.org/struts/StrutsMyFavoriteIDE) in the Struts wiki.
@@ -92,10 +92,10 @@ Each release of Struts comes with a User Guide or set of Tutorials to introduce
 and its underlying technologies. Various components also have their own in-depth Developers Guide, to cover
 more advanced topics. Comprehensive Javadocs are provided for each release, along with the **full source code**.
 
-The [Struts user mailing list](mail.html) is also very active, and welcomes posts from new users. Before
+The [Struts user mailing list](mail) is also very active, and welcomes posts from new users. Before
 posting a new question, be sure to consult the **[MAILING LIST ARCHIVE](mail.html#Archives)**
-and the very excellent [How To Ask Questions The Smart Way](http://www.catb.org/~esr/faqs/smart-questions.html)
-by Eric Raymond. Please do be sure to [turn off HTML](http://expita.com/nomime.html) in your
+and the very excellent [How To Ask Questions The Smart Way](http://www.catb.org/~esr/faqs/smart-questions)
+by Eric Raymond. Please do be sure to [turn off HTML](http://expita.com/nomime) in your
 email client before posting.
 
 ### Is commercial support available?
@@ -108,7 +108,7 @@ including Apache Struts. However, third parties may offer different degrees of s
 First, it's important to remember that Apache Struts is an all-volunteer project. We don't charge anyone
 anything to use Apache Struts products. Committers and other developers work on Apache Struts products because
 they need to use it with their own applications. If others can use it too, that's "icing on the cake".
-If you [submit a patch](helping.html) for a feature that a Committer finds useful, then that
+If you [submit a patch](helping) for a feature that a Committer finds useful, then that
 Committer may choose to volunteer his or her time to apply the patch.
 If you just submit an idea without a patch, it is much less likely to be added (since first someone else has to
 volunteer their time to write the patch).
@@ -120,7 +120,7 @@ Worst case, you can apply the patch to your copy of the framework and still use
 
 ### Is there a press kit for Apache Struts?
 
-Except for our [announcements page](announce.html), there is not a formal press or media kit for Apache Struts.
+Except for our [announcements page](announce), there is not a formal press or media kit for Apache Struts.
 Queries from the press (and ONLY queries from the press, NOT support questions or anything else!)
 should go to our media relations address: [press@apache.org](mailto:press@apache.org).
 
diff --git a/source/mail.md b/source/mail.md
index f32a110..d76a739 100644
--- a/source/mail.md
+++ b/source/mail.md
@@ -30,7 +30,7 @@ You can use a web interface as well if you want to post a question [https://list
 You can read the [ASF Mail](http://mail-archives.apache.org/mod_mbox/struts-user) or the [Mark Mail](http://markmail.org/list/org.apache.struts.users)
 Archives if you are looking for older discussions. There are many other archives out there as well.
 
-If you want to **discuss patches or contribute to Struts** you should subscribe to the [developers list](dev-mail.html).
+If you want to **discuss patches or contribute to Struts** you should subscribe to the [developers list](dev-mail).
 {:.alert .alert-success}
 
 ## Guidelines
@@ -104,5 +104,5 @@ is to withhold from the troll what he or she wants most: A response.
 Every volunteer project obtains its strength from the people involved in it. You are welcome to join any of our mailing 
 lists. You can choose to lurk, or actively participate; it's up to you. The level of community responsiveness to specific 
 questions is generally directly proportional to the amount of effort you spend formulating your question. Eric Raymond 
-and Rick Moen have even written an essay entitled [Asking Smart Questions](http://www.catb.org/~esr/faqs/smart-questions.html)
+and Rick Moen have even written an essay entitled [Asking Smart Questions](http://www.catb.org/~esr/faqs/smart-questions)
 precisely on this topic. Please read the essay, follow its advice, and then post your smart questions to the appropriate list.
diff --git a/source/maven-archetypes/index.md b/source/maven-archetypes/index.md
index 293af61..141d3b9 100644
--- a/source/maven-archetypes/index.md
+++ b/source/maven-archetypes/index.md
@@ -17,7 +17,6 @@ Struts 2 provides several [Maven](http://maven.apache.org/) archetypes that crea
 
 A recommended way to start with Struts2 archetypes is to use `archetype:generate` goal with `filter` parameter.
 
-
 ```
 mvn archetype:generate -Dfilter=org.apache:struts
 ```
@@ -28,35 +27,29 @@ mvn archetype:generate -Dfilter=org.apache:struts
 
 #### Features
 
-+ Convention-based validation
-
-+ Example actions
-
-+ Package-level resource bundle
-
-+ Unit-testing
-
-+ Google AppEgine aware
-
-
+- Convention-based validation
+- Example actions
+- Package-level resource bundle
+- Unit-testing
+- Google AppEgine aware
 
 ```
 mvn archetype:generate -B -DgroupId=com.mycompany.mysystem \
-							-DartifactId=myWebApp \
-							-DarchetypeGroupId=org.apache.struts \
-							-DarchetypeArtifactId=struts2-archetype-convention
+                          -DartifactId=myWebApp \
+                          -DarchetypeGroupId=org.apache.struts \
+                          -DarchetypeArtifactId=struts2-archetype-convention
 ```
 
 ### The Blank Archetype (struts2-archetype-blank)
 
-See the [Struts 2 Blank Archetype](struts2-archetype-blank.html) page for more information, including some basic Maven information, how to build and run the app, and basic application information.
-
+See the [Struts 2 Blank Archetype](struts2-archetype-blank) page for more information, including some basic Maven 
+information, how to build and run the app, and basic application information.
 
 ```
 mvn archetype:generate -B -DgroupId=com.mycompany.mysystem \
-							-DartifactId=myWebApp \
-							-DarchetypeGroupId=org.apache.struts \
-							-DarchetypeArtifactId=struts2-archetype-blank
+                          -DartifactId=myWebApp \
+                          -DarchetypeGroupId=org.apache.struts \
+                          -DarchetypeArtifactId=struts2-archetype-blank
 ```
 
 ### The Starter Archetype (struts2-archetype-starter)
@@ -65,44 +58,33 @@ The Starter archetype creates a more featured application using several common t
 
 #### Features
 
-+ Sitemesh integration
-
-+ Action example (instantiated both through Spring and Struts)
-
-+ Spring integration
-
-+ Validation example (action and action-alias level)
-
-+ Conversion example (global and action level)
-
-+ Resource bundle (both global, action and package level)
-
-
+-Sitemesh integration
+- Action example (instantiated both through Spring and Struts)
+- Spring integration
+- Validation example (action and action-alias level)
+- Conversion example (global and action level)
+- Resource bundle (both global, action and package level)
 
 ```
 mvn archetype:generate -B -DgroupId=com.mycompany.mysystem \
-							-DartifactId=myWebApp \
-							-DarchetypeGroupId=org.apache.struts \
-							-DarchetypeArtifactId=struts2-archetype-starter
+                          -DartifactId=myWebApp \
+                          -DarchetypeGroupId=org.apache.struts \
+                          -DarchetypeArtifactId=struts2-archetype-starter
 ```
 
 ### The AngularJS Archetype (struts2-archetype-angularjs)
 
 #### Features
 
-+ Convention-based Action Configuration
-
-+ Example actions with JSON Result
-
-+ Example for AngularJS and Struts2 Integration
-
-
+- Convention-based Action Configuration
+- Example actions with JSON Result
+- Example for AngularJS and Struts2 Integration
 
 ```
 mvn archetype:generate -B -DgroupId=com.mycompany.mysystem \
-							-DartifactId=myWebApp \
-							-DarchetypeGroupId=org.apache.struts \
-							-DarchetypeArtifactId=struts2-archetype-angularjs
+                          -DartifactId=myWebApp \
+                          -DarchetypeGroupId=org.apache.struts \
+                          -DarchetypeArtifactId=struts2-archetype-angularjs
 ```
 
 ### The Portlet Blank Archetype (struts2-archetype-portlet)
@@ -111,21 +93,17 @@ The Portlet blank archetype creates a minimally populated JSR 168 portlet.
 
 #### Features
 
-+ View, Edit, and Help mode examples
-
-+ Simple form for preferences in Edit mode
-
-+ Can be deployed as a servlet or portlet application
-
-+ Can use Maven Jetty plugin to deploy with the pluto-embedded profile (usage 'mvn jetty:run -Ppluto-embedded', then access http://localhost:8080/\<artifactId\>/pluto/index.jsp)
-
-
+- View, Edit, and Help mode examples
+- Simple form for preferences in Edit mode
+- Can be deployed as a servlet or portlet application
+- Can use Maven Jetty plugin to deploy with the pluto-embedded profile (usage 'mvn jetty:run -Ppluto-embedded', 
+-then access http://localhost:8080/\<artifactId\>/pluto/index.jsp)
 
 ```
 mvn archetype:generate -B -DgroupId=com.mycompany.mysystem \
-							-DartifactId=myWebApp \
-							-DarchetypeGroupId=org.apache.struts \
-							-DarchetypeArtifactId=struts2-archetype-portlet
+                          -DartifactId=myWebApp \
+                          -DarchetypeGroupId=org.apache.struts \
+                          -DarchetypeArtifactId=struts2-archetype-portlet
 ```
 
 ### The Portlet Database Archetype (struts2-archetype-dbportlet)
@@ -134,55 +112,43 @@ The Portlet database archetype creates a simple JSR 168 portlet that displays th
 
 #### Features
 
-+ Uses Spring and Hsql to show a real database query
-
-+ Builtin caching of query results
-
-+ View, Edit, and Help mode examples
-
-+ Simple form for preferences in Edit mode
-
-+ Can be deployed as a servlet or portlet application
-
-+ Can use Maven Jetty plugin to deploy as a servlet webapp
-
-
+- Uses Spring and Hsql to show a real database query
+- Builtin caching of query results
+- View, Edit, and Help mode examples
+- Simple form for preferences in Edit mode
+- Can be deployed as a servlet or portlet application
+- Can use Maven Jetty plugin to deploy as a servlet webapp
 
 ```
 mvn archetype:generate -B -DgroupId=com.mycompany.mysystem \
-							-DartifactId=myWebApp \
-							-DarchetypeGroupId=org.apache.struts \
-							-DarchetypeArtifactId=struts2-archetype-dbportlet
+                          -DartifactId=myWebApp \
+                          -DarchetypeGroupId=org.apache.struts \
+                          -DarchetypeArtifactId=struts2-archetype-dbportlet
 ```
 
 ### The Plugin Archetype (struts2-archetype-plugin)
 
 #### Features
 
-+ Example new result type
-
-+ Example XML-based configuration
-
-
+- Example new result type
+- Example XML-based configuration
 
 ```
 mvn archetype:generate -B -DgroupId=com.mycompany.mysystem \
-							-DartifactId=myPlugin \
-							-DarchetypeGroupId=org.apache.struts \
-							-DarchetypeArtifactId=struts2-archetype-plugin
+                          -DartifactId=myPlugin \
+                          -DarchetypeGroupId=org.apache.struts \
+                          -DarchetypeArtifactId=struts2-archetype-plugin
 ```
 
 ## Creating an Application Using a Maven Archetype
 
-Run the following command from your new project's parent directory. The project will be created in a sub-directory named after the  `artifactId` parameter.
+Run the following command from your new project's parent directory. The project will be created in a sub-directory 
+named after the  `artifactId` parameter.
 
 The first two parameters,  `groupId` and  `artifactId`, should be set according to your needs:
-
-+  `groupId`  This should be the root package of your application, e.g., com.mycompany.myapp. 
-
-+  `artifactId`  Names the project directory that will be created in the current directory.
-
-
+ 
+- `groupId`  This should be the root package of your application, e.g., com.mycompany.myapp.
+- `artifactId`  Names the project directory that will be created in the current directory.
 
 ```
 mvn archetype:generate -B \
@@ -247,53 +213,41 @@ The  `-B` option runs  `archetype:generate` in batch mode; it avoids a prompt to
 
 ## Command Quick Reference
 
-These commands are used from the directory created by the archetype plugin (the project's sub-directory that was created in the previous step).
+These commands are used from the directory created by the archetype plugin (the project's sub-directory that was created 
+in the previous step).
 
 + To install
 
-
-
 ```
    mvn install
 ```
-
-
++ 
 + To run test cases
 
-
-
 ```
    mvn test
 ```
 
 + To clean up (removes generated artifacts)
 
-
-
 ```
    mvn clean
 ```
 
 + To package (creates a WAR file)
 
-
-
 ```
    mvn package
 ```
 
 + To grab necessary JAR files etc.
 
-
-
 ```
    mvn initialize
 ```
 
 + To run it with Jetty
 
-
-
 ```
    mvn jetty:run
 ```
diff --git a/source/maven-archetypes/struts2-archetype-blank.md b/source/maven-archetypes/struts2-archetype-blank.md
index 623ac1b..fbf4c6f 100644
--- a/source/maven-archetypes/struts2-archetype-blank.md
+++ b/source/maven-archetypes/struts2-archetype-blank.md
@@ -93,7 +93,7 @@ mvn archetype:generate -B \
 
 ## Project Structure
 
-The source code structure follows the normal [Maven directory structure](http://maven.apache.org/guides/introduction/introduction-to-the-standard-directory-layout.html). The blank-archetype does not include all of the directories listed in the Maven structure reference page.
+The source code structure follows the normal [Maven directory structure](http://maven.apache.org/guides/introduction/introduction-to-the-standard-directory-layout). The blank-archetype does not include all of the directories listed in the Maven structure reference page.
 
 Our project's structure looks like this:
 
@@ -173,7 +173,7 @@ will create a WAR file in the `target` directory.
 
 ### Running
 
-We can run blank-archetype using the [Jetty](https://www.eclipse.org/jetty/) server via the [Maven Jetty Plugin](https://www.eclipse.org/jetty/documentation/current/jetty-maven-plugin.html) by executing the Jetty plugin's  `run` command:
+We can run blank-archetype using the [Jetty](https://www.eclipse.org/jetty/) server via the [Maven Jetty Plugin](https://www.eclipse.org/jetty/documentation/current/jetty-maven-plugin) by executing the Jetty plugin's  `run` command:
 
 
 ```
@@ -196,7 +196,7 @@ The application consists of a few test actions demonstrating simple validation a
 
 The default Struts 2 configuration file is contained in  `src/main/resources/struts.xml`. It includes an additional configuration file,  `src/main/resources/example.xml`. The application's mappings are contained in the  `example.xml` file. The  `struts.xml` file sets some constants.
 
-See the [struts.xml page](/core-developers/struts-xml.html) for more information about the  `struts.xml` file. For more information regarding what's contained in typical  `struts.xml` files start at the [Configuration Elements page](/core-developers/configuration-elements.html), which contains links to a bunch of information. See the [Configuration Files](/core-developers/configuration-files.html) page for more information regarding additional Struts 2 configuration files, including link [...]
+See the [struts.xml page](/core-developers/struts-xml) for more information about the  `struts.xml` file. For more information regarding what's contained in typical  `struts.xml` files start at the [Configuration Elements page](/core-developers/configuration-elements), which contains links to a bunch of information. See the [Configuration Files](/core-developers/configuration-files) page for more information regarding additional Struts 2 configuration files, including links to the files  [...]
 
 ### Welcome.action
 
@@ -209,11 +209,11 @@ The mapping for this action is handled by a "catch-all" mapping in  `example.xml
 </action>
 ```
 
-This mapping is the last mapping contained in  `example.xml` -- anything not handled by mappings appearing before it in  `example.xml` will be caught by this mapping. This mapping will look for JSP files in  `src/main/webapp/example/*.jsp`. Since there's a  `Welcome.jsp` in that directory, we're all set. See the [Wildcard Mappings page](/core-developers/wildcard-mappings.html) for more information on how Struts 2 can use wildcard mappings.
+This mapping is the last mapping contained in  `example.xml` -- anything not handled by mappings appearing before it in  `example.xml` will be caught by this mapping. This mapping will look for JSP files in  `src/main/webapp/example/*.jsp`. Since there's a  `Welcome.jsp` in that directory, we're all set. See the [Wildcard Mappings page](/core-developers/wildcard-mappings) for more information on how Struts 2 can use wildcard mappings.
 
 ### HelloWorld.action
 
-The mapping executes the HelloWorld action, contained in  `src/main/java/tutorial/example/HelloWorld.action`. This action retrieves a message from a package-level properties file, contained in  `src/main/resources/tutorial/package.properties`. See the [Localization page](/core-developers/localization.html) for more information about how Struts 2 handles message resources (it's pretty cool).
+The mapping executes the HelloWorld action, contained in  `src/main/java/tutorial/example/HelloWorld.action`. This action retrieves a message from a package-level properties file, contained in  `src/main/resources/tutorial/package.properties`. See the [Localization page](/core-developers/localization) for more information about how Struts 2 handles message resources (it's pretty cool).
 
 ### Login.action
 
@@ -229,4 +229,4 @@ This is another wildcard mapping:
 
 In the application the Login action is reached via a link, but not directly to  `/tutorial/example/Login.action`. The link is actually  `/tutorial/example/Login_input.action`. Reaching the Login action this way bypasses validation: if we hit the Login action directly we'll get a validation error.
 
-The validation configuration is contained in `/src/main/resources/tutorial/example/Login-validation.xml`. It checks for the presence of the  `username` and  `password` properties (form values). It uses messages stored in the  `package.properties` file (in the same directory). See the [Validation page](/core-developers/validation.html) for more information regarding Struts 2 validation.
+The validation configuration is contained in `/src/main/resources/tutorial/example/Login-validation.xml`. It checks for the presence of the  `username` and  `password` properties (form values). It uses messages stored in the  `package.properties` file (in the same directory). See the [Validation page](/core-developers/validation) for more information regarding Struts 2 validation.
diff --git a/source/maven/struts2-core/apidocs/org/apache/struts2/interceptor/FileUploadInterceptor.html b/source/maven/struts2-core/apidocs/org/apache/struts2/interceptor/FileUploadInterceptor.html
index 846b0a8..d0ab470 100644
--- a/source/maven/struts2-core/apidocs/org/apache/struts2/interceptor/FileUploadInterceptor.html
+++ b/source/maven/struts2-core/apidocs/org/apache/struts2/interceptor/FileUploadInterceptor.html
@@ -177,7 +177,7 @@ extends <a href="../../../../com/opensymphony/xwork2/interceptor/AbstractInterce
  <li>allowedTypes (optional) - a comma separated list of content types (ie: text/html) that the interceptor will allow
  a file reference to be set on the action. If none is specified allow all types to be uploaded.</li>
 
- <li>allowedExtensions (optional) - a comma separated list of file extensions (ie: .html) that the interceptor will allow
+ <li>allowedExtensions (optional) - a comma separated list of file extensions (ie: ) that the interceptor will allow
  a file reference to be set on the action. If none is specified allow all extensions to be uploaded.</li>
  </ul>
 
diff --git a/source/plugins/cdi/index.md b/source/plugins/cdi/index.md
index 016ccc5..9b20701 100644
--- a/source/plugins/cdi/index.md
+++ b/source/plugins/cdi/index.md
@@ -11,27 +11,43 @@ title: CDI Plugin
 
 ## Overview
 
-CDI - short for Contexts and Dependency Injection - is the new standard for Java EE (though not limited to it) dependency injection frameworks. It was introduced as [JSR 299](http://jcp.org/en/jsr/summary?id=299), being a part of the [Java EE 6](http://jcp.org/en/jsr/detail?id=316) umbrella specification. It is also important to note that it builds on top of JSR 330 (Dependency Injection for Java SE), often referenced as [@Inject](http://jcp.org/en/jsr/summary?id=330).
-
-It can be used as standalone solution packed with your web applications to run in lightweight servlet containers such as Apache Tomcat or Jetty, utilizing standalone CDI implementations such as [JBoss Weld](http://seamframework.org/Weld) (the JSR 299 reference implementation) or [Apache OpenWebBeans](http://openwebbeans.apache.org/). On the other hand, each JEE 6 compliant application server such as [Glassfish](http://glassfish.java.net/), [JBoss AS](http://www.jboss.org/jbossas) or [Apa [...]
-
-With the Struts 2 CDI plugin, your application is open to be embedded into this modern, comprehensive and type safe framework and take full use of it.
+CDI - short for Contexts and Dependency Injection - is the new standard for Java EE (though not limited to it) 
+dependency injection frameworks. It was introduced as [JSR 299](http://jcp.org/en/jsr/summary?id=299), being 
+a part of the [Java EE 6](http://jcp.org/en/jsr/detail?id=316) umbrella specification. It is also important to note 
+that it builds on top of JSR 330 (Dependency Injection for Java SE), often referenced as [@Inject](http://jcp.org/en/jsr/summary?id=330).
+
+It can be used as standalone solution packed with your web applications to run in lightweight servlet containers such 
+as Apache Tomcat or Jetty, utilizing standalone CDI implementations such as [JBoss Weld](http://seamframework.org/Weld) 
+(the JSR 299 reference implementation) or [Apache OpenWebBeans](http://openwebbeans.apache.org/). On the other hand, 
+each JEE 6 compliant application server such as [Glassfish](http://glassfish.java.net/), [JBoss AS](http://www.jboss.org/jbossas) 
+or [Apache TomEE](http://openejb.apache.org/apache-tomee) is required to have a CDI container on board, making it easy 
+for developers to pack lightweight web or enterprise archives while being able to use a compelling dependency injection 
+feature set.
+
+With the Struts 2 CDI plugin, your application is open to be embedded into this modern, comprehensive and type safe 
+framework and take full use of it.
 
 ## Setup
 
-As with all Struts 2 plugins, usage of the CDI plugin is as easy as delivering the right jars with your web application. The plugin then registers itself as the standard ObjectFactory for your Struts 2 application.
+As with all Struts 2 plugins, usage of the CDI plugin is as easy as delivering the right jars with your web application.
+The plugin then registers itself as the standard ObjectFactory for your Struts 2 application.
 
 > Don't mess up Object Factory Providers
 
-Struts 2 delivers integration into all relevant dependency injection containers via plugins, such as the [Spring Plugin](../spring) or the externally provided [Guice Struts 2 Plugin](http://code.google.com/p/google-guice/wiki/Struts2Integration). Be aware that the central feature of all those, as well as the CDI plugin, is to register itself as Struts 2 Object factory. Usually you will want to use **exactly one of those plugins** in your application, since there will only be **one Object [...]
+Struts 2 delivers integration into all relevant dependency injection containers via plugins, such as the [Spring Plugin](../spring) 
+or the externally provided [Guice Struts 2 Plugin](http://code.google.com/p/google-guice/wiki/Struts2Integration). 
+Be aware that the central feature of all those, as well as the CDI plugin, is to register itself as Struts 2 Object 
+factory. Usually you will want to use **exactly one of those plugins** in your application, since there will only 
+be **one ObjectFactory** implementation for Struts 2 to chose. If you pack more than one of those plugins, the factory 
+to be chosen will be undetermined. One will win in the end, but who knows which ...
 
 ### Maven Setup
 
-The most easy and recommended way use is to simply add a maven dependency for it, along with a dependency to the CDI API for development time usage:
+The most easy and recommended way use is to simply add a maven dependency for it, along with a dependency to the CDI API
+for development time usage:
 
 **pom.xml**
 
-
 ```xml
 
 <dependencies>
@@ -52,7 +68,9 @@ The most easy and recommended way use is to simply add a maven dependency for it
 
 ```
 
-whereas `${struts2.version}` should be set either as a property in your pom (recommended) or substituted by a concrete version information, such as 2.3.2 by the time of writing of this document. If you want to use CDI without an application server providing it, you may also want to add a dependency to a CDI implementation of your choice, for example Weld:
+whereas `${struts2.version}` should be set either as a property in your pom (recommended) or substituted by a concrete 
+version information, such as 2.3.2 by the time of writing of this document. If you want to use CDI without an application 
+server providing it, you may also want to add a dependency to a CDI implementation of your choice, for example Weld:
 
 **pom.xml with CDI implementation**
 
@@ -89,13 +107,20 @@ whereas `${struts2.version}` should be set either as a property in your pom (rec
 
 ### Manual Integration
 
-Ensure that the struts2-cdi-plugin jar matching your used Struts 2 framework version - it is part of the [Struts 2 distribution](/download.cgi) - is packed within the application archive that will be delivered. If a CDI implementation is provided within your container, no other dependencies are needed. If the latter is not the case, you may want to install a CDI container into your container (as commmon installation or packed with your app) according to the installation instructions of t [...]
+Ensure that the struts2-cdi-plugin jar matching your used Struts 2 framework version - it is part of the [Struts 2 distribution](../download.cgi) - 
+is packed within the application archive that will be delivered. If a CDI implementation is provided within your container, 
+no other dependencies are needed. If the latter is not the case, you may want to install a CDI container into your container 
+(as commmon installation or packed with your app) according to the installation instructions of the CDI provider of choice.
 
-For IDE integration, be sure to add both the struts2-cdi-plugin-VERSION.jar as well as the cdi-api.jar to your project setup. Remember, the API jar should not be delivered with your application archive since you will have the API provided by the CDI container your application will be running with.
+For IDE integration, be sure to add both the struts2-cdi-plugin-VERSION.jar as well as the cdi-api.jar to your project setup. 
+Remember, the API jar should not be delivered with your application archive since you will have the API provided
+by the CDI container your application will be running with.
 
 ### Configuration
 
-Not much to see here. The CDI specification requires the CDI container to be exposed via JNDI context, and the CDI plugin will pick it up just there. Nevertheless, since there are different JNDI namespaces in use, the plugin will try to automatically find the right one among known references, that is
+Not much to see here. The CDI specification requires the CDI container to be exposed via JNDI context, and the CDI plugin
+will pick it up just there. Nevertheless, since there are different JNDI namespaces in use, the plugin will try 
+to automatically find the right one among known references, that is
 
 + java:comp/BeanManager as the CDI docs point out
 
@@ -103,7 +128,8 @@ Not much to see here. The CDI specification requires the CDI container to be exp
 
 + java:comp/env/BeanManager for containers limited to that namespace, such as tomcat
 
-If your container of choice uses other naming references, the plugin has a single configuration option to point to the right name. Just add a constant like this to your struts.xml to be on the happy path again:
+If your container of choice uses other naming references, the plugin has a single configuration option to point to 
+the right name. Just add a constant like this to your struts.xml to be on the happy path again:
 
 **struts.xml**
 
@@ -116,11 +142,16 @@ If your container of choice uses other naming references, the plugin has a singl
 
 ## Usage
 
-CDI has an extremely rich feature set, and this section is not intended as a replacement for the CDI reference documentation or the excellent documentation found on the [JBoss Weld](http://seamframework.org/Weld) homepage. The whole Struts 2 CDI integration works just as you would think it works, using JSR-299 and JSR-330 Annotations in your Struts 2 actions or interceptors. Be aware of the following, though:
+CDI has an extremely rich feature set, and this section is not intended as a replacement for the CDI reference 
+documentation or the excellent documentation found on the [JBoss Weld](http://seamframework.org/Weld) homepage. 
+The whole Struts 2 CDI integration works just as you would think it works, using JSR-299 and JSR-330 Annotations 
+in your Struts 2 actions or interceptors. Be aware of the following, though:
 
 > Remember to provide beans.xml
 
-CDI is designed to act in a type safe and modern way, thus using annotations for all aspects of the framework. Nevertheless, you are allowed to eternalize configuration into a XML file called beans.xml to be placed in your WEB-INF directory. Even if you don't intend to use such external configuration, it is an **inevitable requirement to provide at least an empty beans.xml in WEB-INF !**
+CDI is designed to act in a type safe and modern way, thus using annotations for all aspects of the framework. 
+Nevertheless, you are allowed to eternalize configuration into a XML file called beans.xml to be placed in your WEB-INF 
+directory. Even if you don't intend to use such external configuration, it is an **inevitable requirement to provide at least an empty beans.xml in WEB-INF !**
 
 ### Example Usage
 
@@ -170,15 +201,25 @@ public class NumberGuess extends ActionSupport {
 
 ```
 
-See the @Inject annotation from javax.inject.Inject? While you could use all the other nice stuff, we usually would - following the separation of concerns principle - use @Inject most of the time only in our actions, keeping the more fancy stuff in the business layer as shown below. Using @Inject brings us to the most common pitfall when using Struts 2 together with JSR-330 / CDI:
+See the @Inject annotation from javax.inject.Inject? While you could use all the other nice stuff, we usually would -
+following the separation of concerns principle - use @Inject most of the time only in our actions, keeping the more 
+fancy stuff in the business layer as shown below. Using @Inject brings us to the most common pitfall when using 
+Struts 2 together with JSR-330 / CDI:
 
 > Use the right @Inject
 
-Struts 2 and it's core component XWork use it's own internal dependency injection container. Interestingly, you could name it JSR-330's grandma, since it is an early pre-release version of [Google Guice](http://code.google.com/p/google-guice/) once developed by [Crazybob Lee](http://blog.crazybob.org/) - the same Bob Lee that, together with SpringSource's Rod Johnson, lead the JSR-330 specification.
+Struts 2 and it's core component XWork use it's own internal dependency injection container. Interestingly, you could 
+name it JSR-330's grandma, since it is an early pre-release version of [Google Guice](http://code.google.com/p/google-guice/)
+once developed by [Crazybob Lee](http://blog.crazybob.org/) - the same Bob Lee that, together with SpringSource's Rod Johnson,
+lead the JSR-330 specification.
 
-That said, you will find the @Inject annotation both as com.opensymphony.xwork2.inject.Inject and javax.inject.Inject. **Don't mix up those two - javax.inject.Inject is the one you want to use with your Struts 2 CDI plugin and CDI integration in general!** While you could use Struts' internal annotation as well, the effect may be strange to undefined - so check your imports!
+That said, you will find the @Inject annotation both as com.opensymphony.xwork2.inject.Inject and javax.inject.Inject.
+**Don't mix up those two - javax.inject.Inject is the one you want to use with your Struts 2 CDI plugin and CDI 
+integration in general!** While you could use Struts' internal annotation as well, the effect may be strange 
+to undefined - so check your imports!
 
-Now that you are aware of that, here is the rest of the inevitable NumberGuess CDI example in Struts 2 flavour. Add a JSP view similar to this:
+Now that you are aware of that, here is the rest of the inevitable NumberGuess CDI example in Struts 2 flavour. 
+Add a JSP view similar to this:
 
 
 ```jsp
@@ -401,6 +442,8 @@ public class Generator implements Serializable {
 
 ```
 
-If you understand that code at a glance, you are either already an CDI expert or profit from the readable, natural language oriented way the CDI stack works. If neither of this is the case, now it's time to check the CDI and Weld documentation. Remember, this is a trivial example - there is much more to know about CDI.
+If you understand that code at a glance, you are either already an CDI expert or profit from the readable, natural
+language oriented way the CDI stack works. If neither of this is the case, now it's time to check the CDI and Weld 
+documentation. Remember, this is a trivial example - there is much more to know about CDI.
 
 Ready you are now - use the Force!
diff --git a/source/plugins/codebehind/index.md b/source/plugins/codebehind/index.md
index 1ff9a0c..b8fcac6 100644
--- a/source/plugins/codebehind/index.md
+++ b/source/plugins/codebehind/index.md
@@ -7,22 +7,30 @@ title: Codebehind Plugin
 
 > Deprecated Plugin
 
-Since 2.1 this plugin has been deprecated in favor of the [Convention Plugin](../convention). See [this page](../convention/converting.html) for details on how to port your application to the Convention plugin.
+Since 2.1 this plugin has been deprecated in favor of the [Convention Plugin](../convention). See [this page](../convention/converting) 
+for details on how to port your application to the Convention plugin.
 
 The Codebehind Plugin reduces mundane configuration by adding "Page Controller" conventions.
 
 
 There are two common situations where the plugin applies convention over configuration:
 
-1. **Default mappings** - (or "pages with no mappings") These are cases where the page is mostly static and doesn't require an Action class to execute logic.  Common examples are index pages and those that heavily use JSP tags or JSF components.
+1. **Default mappings** - (or "pages with no mappings") These are cases where the page is mostly static and doesn't 
+2. require an Action class to execute logic.  Common examples are index pages and those that heavily use JSP tags 
+3. or JSF components.
 
-2. **Default results** - The purpose of most Actions is to execute code to prepare the data for a specific page. The name of this page is often the same as the Action itself.
+4. **Default results** - The purpose of most Actions is to execute code to prepare the data for a specific page.
+5. The name of this page is often the same as the Action itself.
 
-To improve the first case, the plugin will detect the presence of a page with no corresponding Struts mapping and automatically substitute a mapping that uses the default Action class for the package, which is usually ActionSupport, a NO-OP Action.  
+To improve the first case, the plugin will detect the presence of a page with no corresponding Struts mapping 
+and automatically substitute a mapping that uses the default Action class for the package, which is usually 
+ActionSupport, a NO-OP Action.  
 
-For the problem of default results, the plugin will make it unnecessary to define those results by detecting the presence of a page for that Action and creating the appropriate configuration on-the-fly. 
+For the problem of default results, the plugin will make it unnecessary to define those results by detecting 
+the presence of a page for that Action and creating the appropriate configuration on-the-fly. 
 
-In these two ways, the plugin encourages a page-based development style, handling the linking of Struts actions with pages and pages with Results in a common way.
+In these two ways, the plugin encourages a page-based development style, handling the linking of Struts actions 
+with pages and pages with Results in a common way.
 
 > To see the plugin in action, review the "Person Manager" example in the Showcase application.
 
@@ -34,30 +42,47 @@ In these two ways, the plugin encourages a page-based development style, handlin
 
 ## Usage
 
-To use this plugin, simply copy its jar into your application.  The plugin can be used to find default mappings and results.
+To use this plugin, simply copy its jar into your application.  The plugin can be used to find default mappings 
+and results.
 
 ### Default Mappings
 
-To better facilitate a code-behind development approach, the plugin will detect the case where the request has no defined Struts action mapping, yet there exists a corresponding page.  It will then create a dummy action mapping referencing the default Action class (usually ActionSupport), allowing the page to be displayed normally.  Additionally, the default interceptor stack for the configured package will be applied, bringing the workflow benefits of interceptor stacks to simple pages.
+To better facilitate a code-behind development approach, the plugin will detect the case where the request has 
+no defined Struts action mapping, yet there exists a corresponding page.  It will then create a dummy action mapping referencing the default Action class (usually ActionSupport), allowing the page to be displayed normally.  Additionally, the default interceptor stack for the configured package will be applied, bringing the workflow benefits of interceptor stacks to simple pages.
 
-When no explicitly configured Action can be found for a request, the plugin searches the web application for a likely page. Specifically, the following pattern is used to locate a page:`/NAMESPACE/ACTION.(jsp|vm|ftl)`For example, if the request is for `http://www.company.com/myapp/member/login.action`, the plugin will look for the following pages, in this order: 
+When no explicitly configured Action can be found for a request, the plugin searches the web application for 
+a likely page. Specifically, the following pattern is used to locate a page:`/NAMESPACE/ACTION.(jsp|vm|ftl)`
+For example, if the request is for `http://www.company.com/myapp/member/login.action`, the plugin will look for 
+the following pages, in this order: 
 
 1. `/member/login.jsp`
 2. `/member/login.vm`
 3. `/member/login.ftl`
 
-If any of those pages are found, the plugin will construct an ActionConfig object on the fly, using the ActionSupport class for the Action and a single Result that points to the discovered page.  The ActionConfig will be put in the configured package, meaning that it will inherit the default Interceptor stack for that package.  The default package is `codebehind-default`, however, it can be configured in any _configuration file_  via the `struts.codebehind.defaultPackage` constant.
+If any of those pages are found, the plugin will construct an ActionConfig object on the fly, using the ActionSupport 
+class for the Action and a single Result that points to the discovered page.  The ActionConfig will be put in the configured
+package, meaning that it will inherit the default Interceptor stack for that package.  The default package 
+is `codebehind-default`, however, it can be configured in any _configuration file_  via the `struts.codebehind.defaultPackage`
+constant.
 
 ### Default Results
 
-In many applications, a majority of Results could have the same root name as the action mapping.  To reduce this unnecessary configuration, the Struts plugin will try to guess the appropriate Result, if none is explicitly configured.  This technique works for any result code, including `success`. When combined with the _Zero Configuration_  style, the amount of configuration in an application dwindles to next to nothing.
+In many applications, a majority of Results could have the same root name as the action mapping.  To reduce this 
+unnecessary configuration, the Struts plugin will try to guess the appropriate Result, if none is explicitly configured.
+This technique works for any result code, including `success`. When combined with the _Zero Configuration_  style,
+the amount of configuration in an application dwindles to next to nothing.
 
-When no explicitly configured Result is found for an Action's result code, the plugin, again, searches the web application for a matching page. Specifically, the following patterns, in the following order, are used to locate a page:
+When no explicitly configured Result is found for an Action's result code, the plugin, again, searches the web 
+application for a matching page. Specifically, the following patterns, in the following order, are used to locate 
+a page:
 
 1. `/NAMESPACE/ACTION-RESULT_CODE.(jsp|vm|ftl)`
 2. `/NAMESPACE/ACTION.(jsp|vm|ftl)`
 
-These two patterns are searched for each of the three default page extensions: jsp, vm, and ftl.  For example, if the request is for `http://www.company.com/myapp/member/login.action`, so that the action name is `login` and the namespace is `member`, and the Action class returned a code of `success`, the plugin will look for the following pages, in this order: 
+These two patterns are searched for each of the three default page extensions: jsp, vm, and ftl.  For example, 
+if the request is for `http://www.company.com/myapp/member/login.action`, so that the action name is `login` 
+and the namespace is `member`, and the Action class returned a code of `success`, the plugin will look for 
+the following pages, in this order: 
 
 1. `/member/login-success.jsp`
 2. `/member/login.jsp`
@@ -70,7 +95,7 @@ If any of those pages are found, the appropriate Result will be constructed and
 
 ### Settings
 
-The following settings can be customized.  See the [developer guide](/core-developers/configuration-files.html).
+The following settings can be customized.  See the [developer guide](/core-developers/configuration-files).
 
 |Setting|Description|Default|Possible Values|
 |-------|-----------|-------|---------------|
@@ -79,4 +104,5 @@ The following settings can be customized.  See the [developer guide](/core-devel
 
 ### Installation
 
-This plugin can be installed by copying the plugin jar into your application's `/WEB-INF/lib` directory.  No other files need to be copied or created.
+This plugin can be installed by copying the plugin jar into your application's `/WEB-INF/lib` directory.  
+No other files need to be copied or created.
diff --git a/source/plugins/convention/index.md b/source/plugins/convention/index.md
index 1437e66..c2bae4e 100644
--- a/source/plugins/convention/index.md
+++ b/source/plugins/convention/index.md
@@ -47,7 +47,7 @@ version 2.1.6.
 
 ## Converting a Codebehind based application to Convention
 
-See [this page](converting.html) for the required changes and tips.
+See [this page](converting) for the required changes and tips.
 
 If you are using REST with the Convention plugin, make sure you set these constants in `struts.xml`:
 
diff --git a/source/plugins/jfreechart/index.md b/source/plugins/jfreechart/index.md
index c3d7d7b..b2d992a 100644
--- a/source/plugins/jfreechart/index.md
+++ b/source/plugins/jfreechart/index.md
@@ -5,11 +5,15 @@ title: JFreeChart Plugin
 
 # JFreeChart Plugin
 
-[JFreeChart](http://www.jfree.org/jfreechart/) is a free 100% Java (LGPL) chart library that makes it easy for developers to display professional quality charts in their applications.
+[JFreeChart](http://www.jfree.org/jfreechart/) is a free 100% Java (LGPL) chart library that makes it easy for 
+developers to display professional quality charts in their applications.
 
 The JFreeChart plugin allows Actions to easily return generated charts and graphs.
 
-Instead of streaming a generated chart directly to the HTTP response, this plugin provides a ChartResult, which handles the generation for you.  This allows you to generate the chart in one class, and render it out in another class, effectively decoupling the view from the Actions. You can easily render it out to a file or some view other than a web HTTP response if you wish.
+Instead of streaming a generated chart directly to the HTTP response, this plugin provides a ChartResult, which 
+handles the generation for you.  This allows you to generate the chart in one class, and render it out in another 
+class, effectively decoupling the view from the Actions. You can easily render it out to a file or some view other 
+than a web HTTP response if you wish.
 
 ## Features
 
@@ -19,17 +23,22 @@ Instead of streaming a generated chart directly to the HTTP response, this plugi
 
 ### Future Work
 
-Currently the "chart" property is hardcoded. There should be a better way of transferring data from the Action to the Result, via some externally defined variable or something.
+Currently the "chart" property is hardcoded. There should be a better way of transferring data from the Action to 
+the Result, via some externally defined variable or something.
 
-As mentioned by John Patterson (mailing list), the Action is still dependant on a JFreeChart Chart class. This can be improved. The seperation between Action and View can be made cleaner. A chart-agonistic List or Array can be used as the data, and the configuration of the chart details (font, axis, etc...) be done via the result properties in the xwork.xml.
+As mentioned by John Patterson (mailing list), the Action is still dependant on a JFreeChart Chart class. This can 
+be improved. The seperation between Action and View can be made cleaner. A chart-agonistic List or Array can be used
+as the data, and the configuration of the chart details (font, axis, etc...) be done via the result properties 
+in the xwork.xml.
 
 But hey, the above works for now. Any suggestions are welcome.
 
-You can also create charts via the CeWolf library directly.  See [CeWolf charts using Velocity templates](cewolf-charts-using-velocity-templates.html).
+You can also create charts via the CeWolf library directly.  See [CeWolf charts using Velocity templates](cewolf-charts-using-velocity-templates).
 
 ## Usage
 
-To use the plugin, have your Struts configuration package extend the `jfreechart-default` package, which provides the `chart` result type.  Next, use it as a result in an action:
+To use the plugin, have your Struts configuration package extend the `jfreechart-default` package, which provides
+the `chart` result type.  Next, use it as a result in an action:
 
 **Chart example in struts.xml**
 
@@ -42,7 +51,8 @@ To use the plugin, have your Struts configuration package extend the `jfreechart
 </action>
 ```
 
-In your Action class, provide a `getChart()` method that returns the chart to be rendered.  This method will be called by the chart result.
+In your Action class, provide a `getChart()` method that returns the chart to be rendered.  This method will be 
+called by the chart result.
 
 ### Example
 
@@ -93,4 +103,6 @@ This plugin doesn't provides any global settings.
 
 ### Installation
 
-This plugin can be installed by copying the plugin jar into your application's `/WEB-INF/lib` directory.  The JFreeChart library will need to be downloaded separately, as its LGPL license doesn't allow it to be distributed with Struts.
+This plugin can be installed by copying the plugin jar into your application's `/WEB-INF/lib` directory.  
+he JFreeChart library will need to be downloaded separately, as its LGPL license doesn't allow it to be distributed 
+with Struts.
diff --git a/source/plugins/osgi/index.md b/source/plugins/osgi/index.md
index 88a9d7f..da87456 100644
--- a/source/plugins/osgi/index.md
+++ b/source/plugins/osgi/index.md
@@ -11,7 +11,10 @@ title: OSGi Plugin
 
 This plugin is only experimental and can change in the future.
 
-This plugin provides support for starting an instance of Apache Felix inside a web application, and scanning installed bundles for Struts configuration. An admin bundle is also provided. It can be used with Glassfish 3 as well (Glassfish 3 based on Apache Felix as well), but in such a way `struts.osgi.host` must be defined.
+This plugin provides support for starting an instance of Apache Felix inside a web application, 
+and scanning installed bundles for Struts configuration. An admin bundle is also provided. It can be used 
+with Glassfish 3 as well (Glassfish 3 based on Apache Felix as well), but in such a way `struts.osgi.host` 
+must be defined.
 
 ## Features
 
@@ -31,11 +34,18 @@ This plugin provides support for starting an instance of Apache Felix inside a w
 
 + Probably can't access application classes from bundles, including Spring classes
 
-+ _constant_  declarations in the bundled XML config files are ignored, these constants need to be set in the application XML config files (struts.xml)
++ _constant_  declarations in the bundled XML config files are ignored, these constants need to be set
++ in the application XML config files (struts.xml)
 
 ## About Run levels
 
-There are two ways of organizing bundles. If third party bundles will not be used, then the application bundles can just be placed under `/WEB-INF/classes/bundles`. Bundles in this dir will be started in run level 2, the Apache Felix framework's bundles will be loaded in run level 1. If third parties bundles will be used, or you need to start bundles on different run level, create sub dirs under `/WEB-INF/classes/bundles` with numeric names (starting from "2" because "1" is reserved for  [...]
+There are two ways of organizing bundles. If third party bundles will not be used, then the application 
+bundles can just be placed under `/WEB-INF/classes/bundles`. Bundles in this dir will be started in run level 2, 
+the Apache Felix framework's bundles will be loaded in run level 1. If third parties bundles will be used, 
+or you need to start bundles on different run level, create sub dirs under `/WEB-INF/classes/bundles` with numeric 
+names (starting from "2" because "1" is reserved for Felix), which correspond to the run level number. For example 
+bundles under `/WEB-INF/classes/bundles/2` will be started in run level 2, and bundles under `/WEB-INF/classes/bundles/3` 
+will be started in run level 3.
 
 ## Simple Usage
 
@@ -49,11 +59,13 @@ Bundle-SymbolicName: foo.actions
 Import-Package: com.opensymphony.xwork2
 ```
 
-Now the jar is ready to be deployed.  Drop the jar into the `/WEB-INF/classes/bundles` directory and it will automatically be installed when the application starts up.
+Now the jar is ready to be deployed.  Drop the jar into the `/WEB-INF/classes/bundles` directory and it will
+automatically be installed when the application starts up.
 
 ## Using Spring
 
-By default Spring OSGi loads its xml config files asynchronously, which causes the OSGi plugin to fail while starting. To fix this add this line to MANIFEST.MF:
+By default Spring OSGi loads its xml config files asynchronously, which causes the OSGi plugin to fail while starting. 
+To fix this add this line to MANIFEST.MF:
 
 ```text
 Spring-Context:*;create-asynchronously:=false
@@ -65,17 +77,19 @@ Or if using The Apache Felix maven plugin (see below for details):
 <Spring-Context>*;create-asynchronously:=false</Spring-Context>
 ``` 
 
-Please note that you **do not** need to have the Struts Spring plugin in your application, in order to use Spring with the OSGi plugin.
+Please note that you **do not** need to have the Struts Spring plugin in your application, in order to use Spring 
+with the OSGi plugin.
 
 If you want to use the Spring as the object factory for your actions, then follow these steps:
 
 1. Place your Spring xml files under `/META-INF/spring` in the **bundle** jar file
 
-2. Place your Spring xml files under `/spring` (they must be in the classpath, if you are using maven, put thme under /src/resources/spring) in the **application**
+2. Place your Spring xml files under `/spring` (they must be in the classpath, if you are using maven, put them
+3. under /src/resources/spring) in the **application**
 
-3. Copy all the bundle jar files into `/WEB-INF/classes/bundles` in your **application**
+4. Copy all the bundle jar files into `/WEB-INF/classes/bundles` in your **application**
 
-4. Make sure that the following properties are set in struts.xml or struts.properties in your **application**:
+5. Make sure that the following properties are set in struts.xml or struts.properties in your **application**:
 
 ```xml
 <struts>
@@ -211,7 +225,10 @@ If you are going to use Velocity results, then add Velocity and Common Digester
 
 ## Using The Convention Plugin
 
-The Convention plugin will discover actions in bundles in the same way that it discovers them in normal applications. The Convention plugin expects result templates to be (by default) stored under _/WEB-INF/content_ . When packaging actions inside bundles, there won't be a _WEB-INF_  folder, so you must let Convention know where the templates are located. There are two ways of doing so(assuming the templates are under _/content_ ):
+The Convention plugin will discover actions in bundles in the same way that it discovers them in normal applications. 
+The Convention plugin expects result templates to be (by default) stored under _/WEB-INF/content_ . When packaging 
+actions inside bundles, there won't be a _WEB-INF_  folder, so you must let Convention know where the templates are
+located. There are two ways of doing so(assuming the templates are under _/content_ ):
 
 1. Set the templates location constant in struts.xml (in the application struts.xml, not a bundled struts.xml)
 
@@ -233,7 +250,13 @@ public class HelloWorldAction extends ActionSupport {
 
 ## The OSGi interceptor
 
-The OSGi plugins defines the `osgi` interceptor and `osgiStack`(`defaultStack` plus the `osgi` interceptor) in the package `osgi-default`. This interceptor will check the action and if it implements `org.apache.struts2.osgi.interceptor.BundleContextAware`, it will invoke setBundleContext(BundleContext bundleContext) on the action, passing the BundleContext of the OSGi container. The interceptor also checks if the class implements `org.apache.struts2.osgi.interceptor.ServiceAware<T>`, if  [...]
+The OSGi plugins defines the `osgi` interceptor and `osgiStack`(`defaultStack` plus the `osgi` interceptor) 
+in the package `osgi-default`. This interceptor will check the action and if it implements `org.apache.struts2.osgi.interceptor.BundleContextAware`, 
+it will invoke setBundleContext(BundleContext bundleContext) on the action, passing the BundleContext of the OSGi container. 
+The interceptor also checks if the class implements `org.apache.struts2.osgi.interceptor.ServiceAware<T>`, if it does, 
+setServices(List\<T\> services) will be called, where T is the type of a service published in the OSGi container. 
+For example, lets assume an installed bundle publishes a service with the interface `BookPriceLookup`, to get all 
+the instances of this service, an action would look like:
 
 ```java
 public class BookPriceAction extends ActionSupport implements ServiceAware<BookPriceLookup> {
@@ -245,7 +268,9 @@ public class BookPriceAction extends ActionSupport implements ServiceAware<BookP
 }
 ```
 
-Keep in mind that the interceptor is not defined in the default struts package, so when using Convention, you need to specify the parent package as "osgi-default", either using annotations (@ParentPackage), or XML(**this XML fragment must be in the struts XML config file in the application, not the bundle's**, this is a current limitation of the OSGi plugin):
+Keep in mind that the interceptor is not defined in the default struts package, so when using Convention, you need 
+to specify the parent package as "osgi-default", either using annotations (@ParentPackage), or XML(**this XML fragment 
+must be in the struts XML config file in the application, not the bundle's**, this is a current limitation of the OSGi plugin):
 
 ```xml
 <constant name="struts.convention.default.parent.package" value="osgi-default" />
@@ -253,21 +278,29 @@ Keep in mind that the interceptor is not defined in the default struts package,
 
 ## Admin bundle
 
-An admin bundle is distributed with struts, which provides a simple interface to list the installed bundles. Using this interface the bundles can be stopped, started and updated (reloaded from the file system). This interface also provides information on the installed bundles, like OSGi metadata, and a list of packages and actions loaded from each bundle. An interactive AJAX shell is also available, which is just a web interface to the Apache Felix Shell. To use this bundle, just copy th [...]
+An admin bundle is distributed with struts, which provides a simple interface to list the installed bundles. 
+Using this interface the bundles can be stopped, started and updated (reloaded from the file system). 
+This interface also provides information on the installed bundles, like OSGi metadata, and a list of packages 
+and actions loaded from each bundle. An interactive AJAX shell is also available, which is just a web interface
+to the Apache Felix Shell. To use this bundle, just copy the jar file to /bundles (same place where the application 
+bundles are installed) and open http://localhost:PORT/CONTEXT/osgi/admin/ (replace _PORT_  and _context_ )
 
 ## About stopping/starting bundles
 
-When a bundle is started, the OSGi plugin will check for the header `Struts2-Enabled` in it. If it is set to "true", the bundle will be scanned for XML config and Convention config. When a bundle is stopped, any actions that were loaded from it will be removed from the runtime configuration.
+When a bundle is started, the OSGi plugin will check for the header `Struts2-Enabled` in it. If it is set to "true",
+the bundle will be scanned for XML config and Convention config. When a bundle is stopped, any actions that were 
+loaded from it will be removed from the runtime configuration.
 
 ## Settings
 
-The following settings can be customized.  See the [developer guide](/core-developers/configuration-files.html).
+The following settings can be customized.  See the [developer guide](/core-developers/configuration-files).
 
 | Setting | Description | Default | Possible Values |
 |---------|-------------|---------|-----------------|
 |struts.objectFactory.delegate| The alias of the ObjectFactory to wrap |struts| Any configured alias |
 
-The following setting must be set as context parameters in _web.xml_ , because they are used by the StrutsOsgiListener, for example:
+The following setting must be set as context parameters in _web.xml_ , because they are used by the StrutsOsgiListener, 
+for example:
 
 ```xml
 <context-param>
@@ -276,7 +309,8 @@ The following setting must be set as context parameters in _web.xml_ , because t
 </context-param>
 ```
 
-If you are running your application on Glassfish 3 (which already contains Apache Felix) you must specify `struts.osgi.host`, like below:
+If you are running your application on Glassfish 3 (which already contains Apache Felix) you must specify `struts.osgi.host`,
+like below:
 
 ```xml
 <context-param>
@@ -293,7 +327,7 @@ If you are running your application on Glassfish 3 (which already contains Apach
 
 ## Building bundles with Maven
 
-Jar files can be turned into bundles using the [Maven Bundle Plugin](http://cwiki.apache.org/FELIX/bundle-plugin-for-maven-bnd.html) like:
+Jar files can be turned into bundles using the [Maven Bundle Plugin](http://cwiki.apache.org/FELIX/bundle-plugin-for-maven-bnd) like:
 
 **Maven Bundle Plugin Example**
 
diff --git a/source/plugins/oval/index.md b/source/plugins/oval/index.md
index 4e96ecc..984495a 100644
--- a/source/plugins/oval/index.md
+++ b/source/plugins/oval/index.md
@@ -147,7 +147,7 @@ When that action is validated, the field errors would be:
 
 + "title value is too long, allowed length is 3"
 
-The current OVal "context" object is pushed into the stack for each validator, so it can be accessed from the property file to build the error message. See the [OVal javadoc](http://oval.sourceforge.net/api/net/sf/oval/context/FieldContext.html) for more properties available in the FieldContext class.
+The current OVal "context" object is pushed into the stack for each validator, so it can be accessed from the property file to build the error message. See the [OVal javadoc](http://oval.sourceforge.net/api/net/sf/oval/context/FieldContext) for more properties available in the FieldContext class.
 
 ## The OVal Validation Interceptor
 
@@ -189,8 +189,8 @@ Add a _constant_  element to your struts config file to change the value of a co
 
 ## Resources
 
-+ [OVal User Guide](http://oval.sourceforge.net/userguide.html)
++ [OVal User Guide](http://oval.sourceforge.net/userguide)
 
-+ [OVal Javadoc](http://oval.sourceforge.net/userguide.html)
++ [OVal Javadoc](http://oval.sourceforge.net/userguide)
 
 + [OVal Tutorials](http://oval.sourceforge.net/userguide.html#d0e1138)
diff --git a/source/plugins/plexus/index.md b/source/plugins/plexus/index.md
index 7ebb701..c59fdda 100644
--- a/source/plugins/plexus/index.md
+++ b/source/plugins/plexus/index.md
@@ -11,7 +11,7 @@ While [Plexus](http://plexus.codehaus.org/) is similar to other inversion-of-con
 
 The Plexus plugin enables Struts Actions, Interceptors, and Results to be created and injected by [Plexus](http://plexus.codehaus.org/).
 
-This plugin provides an [ObjectFactory](/core-developers/object-factory.html) implementation that tries to create Struts Action, Interceptor, and Result classes as Plexus objects.
+This plugin provides an [ObjectFactory](/core-developers/object-factory) implementation that tries to create Struts Action, Interceptor, and Result classes as Plexus objects.
 
 ## Features
 
@@ -33,7 +33,7 @@ To use the plugin, when configuring Struts Actions, Interceptors, or Results in
 
 ### Settings
 
-The following settings can be customized.  See the [developer guide](/core-developers/configuration-files.html).
+The following settings can be customized.  See the [developer guide](/core-developers/configuration-files).
 
 |Setting|Description|Default|Possible Values|
 |-------|-----------|-------|---------------|
diff --git a/source/plugins/plugins.md b/source/plugins/plugins.md
index 07cc369..50b7b54 100644
--- a/source/plugins/plugins.md
+++ b/source/plugins/plugins.md
@@ -12,7 +12,10 @@ parent:
 * Will be replaced with the ToC, excluding a header
 {:toc}
 
-Struts 2 plugins contain classes and configuration that extend, replace, or add to existing Struts framework functionality. A plugin can be installed by adding its JAR file to the application's class path, in addition to the JAR files to fulfill whatever dependencies the plugin itself may have. To configure the plugin, the JAR should contain a `struts-plugin.xml` file, which follows the same format as an ordinary `struts.xml` file.
+Struts 2 plugins contain classes and configuration that extend, replace, or add to existing Struts framework functionality. 
+A plugin can be installed by adding its JAR file to the application's class path, in addition to the JAR files to fulfill
+whatever dependencies the plugin itself may have. To configure the plugin, the JAR should contain a `struts-plugin.xml` 
+file, which follows the same format as an ordinary `struts.xml` file.
 
 Since a plugin can contain the `struts-plugin.xml` file, it has the ability to:
 
@@ -22,23 +25,28 @@ Since a plugin can contain the `struts-plugin.xml` file, it has the ability to:
 
 + Introduce new extension point implementation classes
 
-Many popular but optional features of the framework are distributed as plugins. An application can retain all the plugins provided with the distribution, or just include the ones it uses. Plugins can be used to organize application code or to distribute code to third-parties.
+Many popular but optional features of the framework are distributed as plugins. An application can retain all the plugins 
+provided with the distribution, or just include the ones it uses. Plugins can be used to organize application code 
+or to distribute code to third-parties.
 
-Packages defined in a plugin can have parent packages that are defined in another plugin. Plugins may define configuration elements with classes not contained in the plugin. Any classes not included in the plugin's JAR must be on the application's classpath at runtime. As from Struts 2.3.5
+Packages defined in a plugin can have parent packages that are defined in another plugin. Plugins may define 
+configuration elements with classes not contained in the plugin. Any classes not included in the plugin's JAR must be 
+on the application's classpath at runtime. As from Struts 2.3.5
 
-The framework loads its default configuration first, then any plugin configuration files found in others JARs on the classpath, and finally the "bootstrap" `struts.xml`.
+The framework loads its default configuration first, then any plugin configuration files found in others JARs
+on the classpath, and finally the "bootstrap" `struts.xml`.
 
 1. `struts-default.xml` (bundled in the Core JAR)
-
 2. `struts-plugin.xml` (as many as can be found in other JARs)
-
 3. `struts.xml` (provided by your application)
 
-Since the `struts.xml` file is always loaded last, it can make use of any resources provided by the plugins bundled with the distribution, or any other plugins available to an application.
+Since the `struts.xml` file is always loaded last, it can make use of any resources provided by the plugins bundled
+with the distribution, or any other plugins available to an application.
 
 ## Static resources
 
-To include static resources in your plugins add them under "/static" in your jar. And include them in your page using "/struts" as the path, like in the following example:
+To include static resources in your plugins add them under "/static" in your jar. And include them in your page using 
+"/struts" as the path, like in the following example:
 
 ```ftl
 <!-- Assuming /static/main.css is inside a plugin jar, to add it to the page: -->
@@ -47,11 +55,12 @@ To include static resources in your plugins add them under "/static" in your jar
 <link rel="stylesheet" type="text/css" href="%{#css}" />
 ```
 
-Read also [StaticContentLoader JavaDoc](https://struts.apache.org/maven/struts2-core/apidocs/org/apache/struts2/dispatcher/StaticContentLoader.html).
+Read also [StaticContentLoader JavaDoc](https://struts.apache.org/maven/struts2-core/apidocs/org/apache/struts2/dispatcher/StaticContentLoader).
 
 ## Extension Points
 
-Extension points allow a plugin to override a key class in the Struts framework with an alternate implementation. For example, a plugin could provide a new class to create Action classes or map requests to Actions.
+Extension points allow a plugin to override a key class in the Struts framework with an alternate implementation. 
+For example, a plugin could provide a new class to create Action classes or map requests to Actions.
 
 The following extension points are available in Struts 2:
 
@@ -104,7 +113,8 @@ Let's look at two similar but different plugins bundled with the core distributi
 
 ### Sitemesh plugin
 
-[SiteMesh](http://opensymphony.com/sitemesh/) is a popular alternative to Tiles. SiteMesh provides a common look-and-feel to an application's pages by automatically wrapping a plain page with common elements like headers and menubars.
+[SiteMesh](http://opensymphony.com/sitemesh/) is a popular alternative to Tiles. SiteMesh provides a common look-and-feel
+to an application's pages by automatically wrapping a plain page with common elements like headers and menubars.
 
 The `sitemesh-plugin.jar` contains several classes, a standard JAR manifest, and a plugin configuration file.
 
@@ -121,7 +131,8 @@ The `sitemesh-plugin.jar` contains several classes, a standard JAR manifest, and
  + struts-plugin.xml
 ````
 
-While the SiteMesh Plugin doesn't provide any new results, interceptors, or actions, or even extend any Struts integration points, it does need to know what settings have been enabled in the Struts framework. Therefore, its `struts-plugin.xml` looks like this:
+While the SiteMesh Plugin doesn't provide any new results, interceptors, or actions, or even extend any Struts integration 
+points, it does need to know what settings have been enabled in the Struts framework. Therefore, its `struts-plugin.xml` looks like this:
 
 {% comment %}start snippet lang=xml|https://gitbox.apache.org/repos/asf?p=struts.git;a=blob_plain;f=plugins/sitemesh/src/main/resources/struts-plugin.xml;hb=HEAD  {% endcomment %}
 
@@ -162,11 +173,14 @@ While the SiteMesh Plugin doesn't provide any new results, interceptors, or acti
 
 {% comment %}end snippet lang=xml|https://gitbox.apache.org/repos/asf?p=struts.git;a=blob_plain;f=plugins/sitemesh/src/main/resources/struts-plugin.xml;hb=HEAD  {% endcomment %}
 
-The two bean elements, with the "static" flag enabled, tell Struts to inject the current settings and framework objects into static property setters on startup. This allows, for example, the FreeMarkerPageFilter class to get an instance of the Struts FreemarkerManager and the current encoding setting.
+The two bean elements, with the "static" flag enabled, tell Struts to inject the current settings and framework objects 
+into static property setters on startup. This allows, for example, the FreeMarkerPageFilter class to get an instance 
+of the Struts FreemarkerManager and the current encoding setting.
 
 ### Tiles plugin
 
-[Tiles](http://struts.apache.org/struts-sandbox/tiles/index.html) is a popular alternative to SiteMesh. Tiles provides a common look-and-feel to an application's pages by breaking the page down into common fragments or "tiles".
+[Tiles](http://struts.apache.org/struts-sandbox/tiles/index) is a popular alternative to SiteMesh. Tiles provides 
+a common look-and-feel to an application's pages by breaking the page down into common fragments or "tiles".
 
 The `tiles-plugin.jar` contains several classes, a standard JAR manifest, and a configuration file.
 
@@ -189,4 +203,5 @@ Since the Tiles Plugin does need to register configuration elements, a result cl
 
 ## Plugin Registry
 
-> For a list of bundled plugins, see the [Plugin Reference Documentation](plugin-developers.html). For more about bundled and third-party plugins, visit the [Apache Struts Plugin Registry](http://cwiki.apache.org/S2PLUGINS/home.html).
+> For a list of bundled plugins, see the [Plugin Reference Documentation](index). For more about bundled and third-party 
+> plugins, visit the [Apache Struts Plugin Registry](http://cwiki.apache.org/S2PLUGINS/home).
diff --git a/source/plugins/portlet/index.md b/source/plugins/portlet/index.md
index d1b919c..5b20078 100644
--- a/source/plugins/portlet/index.md
+++ b/source/plugins/portlet/index.md
@@ -154,6 +154,6 @@ Basically the Struts2 Portlet Plugin doesn't support different auth level in th
 
 ### Other resources
 
-+ [Struts 2 Portlet Tutorial](struts-2-portlet-tutorial.html)
-+ [JSR168 Specification](http://jcp.org/aboutJava/communityprocess/final/jsr168/index.html)
-+ [JSR286 Specification](http://jcp.org/aboutJava/communityprocess/final/jsr286/index.html)
++ [Struts 2 Portlet Tutorial](struts-2-portlet-tutorial)
++ [JSR168 Specification](http://jcp.org/aboutJava/communityprocess/final/jsr168/index)
++ [JSR286 Specification](http://jcp.org/aboutJava/communityprocess/final/jsr286/index)
diff --git a/source/plugins/portlet/struts-2-portlet-tutorial.md b/source/plugins/portlet/struts-2-portlet-tutorial.md
index 8b8520a..ff1cf2f 100644
--- a/source/plugins/portlet/struts-2-portlet-tutorial.md
+++ b/source/plugins/portlet/struts-2-portlet-tutorial.md
@@ -635,7 +635,7 @@ Instead of using the Maven 2 Jetty plugin to run the tutorial, you can check out
 ### Links
 
 + _S2PLUGINS:Source code for the tutorial_ 
-+ [JSR168 Specification](http://jcp.org/aboutJava/communityprocess/final/jsr168/index.html)
-+ [Struts 2 Portlet Configuration options](http://struts.apache.org/2.x/docs/portlet-configuration.html)
++ [JSR168 Specification](http://jcp.org/aboutJava/communityprocess/final/jsr168/index)
++ [Struts 2 Portlet Configuration options](http://struts.apache.org/2.x/docs/portlet-configuration)
 + [Author's blog about portlet related development](http://portletwork.blogspot.com)
-+ [Old tutorial for WebWork 2](http://struts.apache.org/2.x/docs/portlet-tutorial-webwork-22.html)
++ [Old tutorial for WebWork 2](http://struts.apache.org/2.x/docs/portlet-tutorial-webwork-22)
diff --git a/source/plugins/rest/index.md b/source/plugins/rest/index.md
index 734e68b..92b4f5e 100644
--- a/source/plugins/rest/index.md
+++ b/source/plugins/rest/index.md
@@ -34,8 +34,8 @@ a complete WAR file, that demonstrates a simple REST web program.
 
 The main functionality of the REST plugin lies in the interpretation of incoming request URL's according the RESTful 
 rules. In the Struts 2 framework, this `mapping` of request URL's to Actions is handled by in implementation of 
-the [ActionMapper](/maven/struts2-core/apidocs/org/apache/struts2/dispatcher/mapper/ActionMapper.html) interface. 
-Out of the box, Struts 2 uses the [DefaultActionMapper](/maven/struts2-core/apidocs/org/apache/struts2/dispatcher/mapper/DefaultActionMapper.html) 
+the [ActionMapper](/maven/struts2-core/apidocs/org/apache/struts2/dispatcher/mapper/ActionMapper) interface. 
+Out of the box, Struts 2 uses the [DefaultActionMapper](/maven/struts2-core/apidocs/org/apache/struts2/dispatcher/mapper/DefaultActionMapper) 
 to map URL's to Actions via the logic you are probably already familiar with.
 
 ### Actions or Controllers ?
@@ -44,7 +44,7 @@ Most Struts 2 developers are familiar with the Action. They are the things that
 In the context of the REST plugin, just to keep you on your toes, we'll adopt the RESTful lingo and refer to our 
 Actions as **Controllers**. Don't be confused; it's just a name!
 
-The REST plugin provides an alternative implementation, [RestActionMapper](/maven/struts2-plugins/struts2-rest-plugin/apidocs/org/apache/struts2/rest/RestActionMapper.html), 
+The REST plugin provides an alternative implementation, [RestActionMapper](/maven/struts2-plugins/struts2-rest-plugin/apidocs/org/apache/struts2/rest/RestActionMapper), 
 that provides the RESTful logic that maps a URL to a give action class ( aka `controller` in RESTful terms ) and, 
 more specifically, to the invocation of a method on that controller class. The following section, which comes from 
 the Javadoc for the class, details this logic.
@@ -291,7 +291,7 @@ look like this:
 
 ### Settings
 
-The following settings can be customized. See the [developer guide](/core-developers/configuration-files.html).
+The following settings can be customized. See the [developer guide](/core-developers/configuration-files).
 For more configuration options see the [Convention Plugin Documentation](../convention)
 
 |Setting|Description|Default|Possible Values|
diff --git a/source/plugins/spring/index.md b/source/plugins/spring/index.md
index 4c4ad51..2a68eff 100644
--- a/source/plugins/spring/index.md
+++ b/source/plugins/spring/index.md
@@ -13,7 +13,7 @@ title: Spring Plugin
 
 [Spring](http://www.springframework.org) is a lightweight container, providing centralized, automated configuration and wiring of your application objects, using a technique called "Dependency Injection".
 
-The Spring Plugin works by overriding the Struts [ObjectFactory](/core-developers/object-factory.html) to enhance the creation of core framework objects. When an object is to be created, it uses the `class` attribute in the Struts configuration to correspond to the `id` attribute in the Spring configuration. If not found, the class will try to be created as usual, then be autowired by Spring. In the case of Actions, Spring 2's [bean scope feature](http://www.springframework.org/docs/refe [...]
+The Spring Plugin works by overriding the Struts [ObjectFactory](/core-developers/object-factory) to enhance the creation of core framework objects. When an object is to be created, it uses the `class` attribute in the Struts configuration to correspond to the `id` attribute in the Spring configuration. If not found, the class will try to be created as usual, then be autowired by Spring. In the case of Actions, Spring 2's [bean scope feature](http://www.springframework.org/docs/reference [...]
 
 > Remember: 
 > 
@@ -31,7 +31,7 @@ __Features__
 
 To enable Spring integration, simply include struts2-spring-plugin-x-x-x.jar in your application.
 
-If you are using more than one object factory, (for example, by including both the Spring and Plexus plugins in your application,) you will need to set the struts.objectFactory property in [default.properties](/core-developers/default-properties.html)  or in one of several XML files via [Constant Configuration](/core-developers/constant-configuration.html):
+If you are using more than one object factory, (for example, by including both the Spring and Plexus plugins in your application,) you will need to set the struts.objectFactory property in [default.properties](/core-developers/default-properties)  or in one of several XML files via [Constant Configuration](/core-developers/constant-configuration):
 
 **struts.properties**
 
@@ -167,7 +167,7 @@ A typical spring configuration for bar could look as following.
 
 ```
 
-To use session-scoped components with Spring and Struts, see the [Spring Session Components Workarounds](spring-session-components-workarounds.html) analysis.
... 1277 lines suppressed ...

[struts-site] 01/02: Fixes typo

Posted by lu...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

lukaszlenart pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/struts-site.git

commit bb503dd1a045d7ff806f9290a943d3ce4387f7dd
Author: Lukasz Lenart <lu...@apache.org>
AuthorDate: Sun Dec 19 12:52:18 2021 +0100

    Fixes typo
---
 source/plugins/index.md | 6 +++---
 1 file changed, 3 insertions(+), 3 deletions(-)

diff --git a/source/plugins/index.md b/source/plugins/index.md
index 77e0412..bf0b8fc 100644
--- a/source/plugins/index.md
+++ b/source/plugins/index.md
@@ -14,8 +14,8 @@ Several plugins are bundled with the framework, and others are available from th
 
 ## Bundled Plugins
 
-|Name| Versions | Note             |
-|---|------|------------------|
+|Name| Versions | Note|
+|---|------|-----|
 |[Bean Validation Plugin](bean-validation)| 2.5+ |
 |[CDI (JSR 299) Plugin](cdi)| 2.3.1+ |
 |[Codebehind Plugin](codebehind)| < 2.5 | removed since 2.5, use [Convention Plugin](convention) |
@@ -30,7 +30,7 @@ Several plugins are bundled with the framework, and others are available from th
 |[JSF Plugin](jsf)| < 2.5 | removed since 2.5 |
 |[JSON Plugin](json)| 2.1.7+ ||
 |[JUnit Plugin](junit)|||
-|[OVal Plugin](oval)| 2.1.7+ | deprecated since 2.6, use [Bean Validation Plugin](bean-validarion) |
+|[OVal Plugin](oval)| 2.1.7+ | deprecated since 2.6, use [Bean Validation Plugin](bean-validation) |
 |[OSGi Plugin](osgi)| 2.1.7+ | deprecated since 2.6|
 |[Plexus Plugin](plexus)|| deprecated since 2.6 |
 |[Portlet Plugin](portlet)|| deprecated since 2.6 |